diff --git a/.gitignore b/.gitignore index b21233a6..e20975e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,50 +1,54 @@ -# Compiled source # -################### -*.com -*.class -*.dll -*.exe -*.o -*.so -*.pyc - -# Packages # -############ -# it's better to unpack these files and commit the raw source -# git has its own built in compression methods -*.7z -*.dmg -*.gz -*.iso -*.rar -#*.tar -*.zip - -# Logs and databases # -###################### -*.log -*.sqlite - -# OS generated files # -###################### -.DS_Store -ehthumbs.db -Icon -Thumbs.db -.tmtags -.idea -tags -vendor.tags -tmtagsHistory -*.sublime-project -*.sublime-workspace -.bundle - -# MIOS # -###################### -*.swp -__pycache__ -servidor/venv -venv -src/pv.egg-info -.env +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so +*.pyc + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.rar +#*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sqlite + +# OS generated files # +###################### +.DS_Store +ehthumbs.db +Icon +Thumbs.db +.tmtags +.idea +tags +vendor.tags +tmtagsHistory +*.sublime-project +*.sublime-workspace +.bundle + +# MIOS # +###################### +*.swp +__pycache__ +servidor/venv +venv +src/pv.egg-info +.env +.vscode +theframework/translated +theframework/tests/debug +/nbproject/ \ No newline at end of file diff --git a/README.md b/README.md index 097669f4..3e83a1b7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,41 @@ -# prj_python37 +# prj_python37 +- multi-project of mini pocs in python ## Pruebas de concepto de python siguiendo diversos tutoriales. +### [Parte 9 - POO y UML]() +- [Youtube - Introducción a POO con ejemplos en Python - Programación Orientada a Objetos by Programación desde cero](https://youtu.be/iliKayKaGtc) +- ![](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/1072x476/30b2ee7c97ab29ec9e9a38d7816901c5/image.png) +- **Dependencia**: (A necesita un... B) + - Indica una relación en la que las dos clases son independientes, tienen existencia por si mismas pero en algún momento la claseA necesita un obj de la claseB. + - La clase Venta necesita un objeto un objeto de la clase FormaPago. +- **Agregación**: (A tiene un... B) + - Las clases son independientes entre si. Una de las clases está formada por objetos de la otra. + - La clase Triangulo está formada por objetos de la clase Linea *no me queda claro, como puede existir un triángunlo sin lineas* + - La relación siempre es unidireccional. Un objeto triangulo tiene n objetos linea +- **Asociación**: (A usa un... B) + - Es bidireccional + - Un autor escribe un libro, un libro tiene un autor + - Un alumno tiene varios profesores, un profesor tiene varios alumnos +- **Composición**: (se compone de...) + - Un objeto no puede existir sin el objeto contenedor. + - Una habitación no puede exisitr sin una casa +- Otros puntos: + - Interfaces son iteradores + - Superclase y Subclase + - @property + - @atributo.setter + - punteros con "copy" + - __atributo oculto + +### [Parte 8 - Corey Schafer - 9 - Import modules](https://github.com/eacevedof/prj_python37/tree/master/corey_schafer/py_tutorials#youtube-playlist---python-tutorials) +### [Parte 7 - pycmd](https://github.com/eacevedof/prj_python37/tree/master/pycmd) +### [Parte 6 - Selenium - Python](https://github.com/eacevedof/prj_python37/tree/master/selenium) +- [Playlist](https://www.youtube.com/watch?v=N-rdcdWmYck&list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP&index=2) +### [Parte 5 - Django Rest Framework PIPENV (Fazt y otros)](https://github.com/eacevedof/prj_python37/tree/master/apirest) +- [pipenv - FAZT](https://www.youtube.com/watch?v=-XIsKyNWILo) +- [Despliegue en Pythonanywhere](https://github.com/eacevedof/prj_python37/blob/master/apirest/PYTHONANYWHERE.md) +- [Despliegue en Heroku](https://github.com/eacevedof/prj_python37/blob/master/apirest/HEROKU.md) + ### [Parte 4 - App Platzi Django (platzigram)](https://github.com/eacevedof/prj_python37/tree/master/platzigram) - [Curso Platzi](https://platzi.com/clases/django/) - Instalación de django por consola diff --git a/apirest/.gitignore b/apirest/.gitignore new file mode 100644 index 00000000..d9856428 --- /dev/null +++ b/apirest/.gitignore @@ -0,0 +1,56 @@ +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so +*.pot +*.pyc + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.rar +#*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sqlite + +# OS generated files # +###################### +.DS_Store +ehthumbs.db +Icon +Thumbs.db +.tmtags +.idea +tags +vendor.tags +tmtagsHistory +*.sublime-project +*.sublime-workspace +.bundle + +# MIOS # +###################### +*.swp +__pycache__ +staticfiles +servidor/venv +venv +src/pv.egg-info +.env +.vscode +theframework/translated +theframework/tests/debug +/nbproject/ \ No newline at end of file diff --git a/apirest/HEROKU.md b/apirest/HEROKU.md new file mode 100644 index 00000000..afa87c63 --- /dev/null +++ b/apirest/HEROKU.md @@ -0,0 +1,90 @@ +## [Youtube Python Django Tutorial: Deploying Your Application (Option #2) - Deploy using Heroku](https://youtu.be/6DI_7Zja8Zc?t=744) +> By Corey Schafer - Publicado el 19 feb. 2019 + +#### commands: +- `heroku login` +- `heroku create prj-apirest --buildpack heroku/python` + - `heroku apps:delete --app tfw-firstapp` +- `heroku open -a ` + - [https://prj-apirest.herokuapp.com/](https://prj-apirest.herokuapp.com/) + +- `heroku git:remote -a prj-apirest` +- `git push heroku master` + - **error:** + ```sh + remote: Compressing source files... done. + remote: Building source: + remote: + remote: -----> App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz + remote: More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure + remote: + remote: ! Push failed + remote: Verifying deploy... + remote: + remote: ! Push rejected to prj-apirest. + remote: + To https://git.heroku.com/prj-apirest.git + ! [remote rejected] master -> master (pre-receive hook declined) + error: failed to push some refs to 'https://git.heroku.com/prj-apirest.git' + ``` +- `git subtree push --prefix apirest heroku master` + - Despues del error anterior pruebo este comando + - Define un subdirectorio como un subrepo + - **error** + ```sh + remote: Compressing source files... done. + remote: Building source: + remote: + remote: -----> Python app detected + remote: ! No 'Pipfile.lock' found! We recommend you commit this into your repository. + remote: -----> Installing python-3.6.8 + remote: -----> Installing pip + remote: -----> Installing dependencies with Pipenv 2018.5.18… + remote: Installing dependencies from Pipfile… + remote: An error occurred while installing https://download.lfd.uci.edu/pythonlibs/u2hcgva4/mysqlclient-1.4.2-cp37-cp37m-win32.whl#egg=mysqlclient! Will try again. + remote: An error occurred while installing django! Will try again. + remote: Installing initially–failed dependencies… + remote: + remote: mysqlclient-1.4.2-cp37-cp37m-win32.whl is not a supported wheel on this platform. + remote: You are using pip version 9.0.2, however version 19.1 is available. + remote: You should consider upgrading via the 'pip install --upgrade pip' command. + remote: + remote: ! Push rejected, failed to compile Python app. + remote: + remote: ! Push failed + remote: Verifying deploy... + remote: + remote: ! Push rejected to prj-apirest. + remote: + To https://git.heroku.com/prj-apirest.git + ! [remote rejected] b0a7ae04754f32c80f3ea3954fede5abbb5e223a -> master (pre-receive hook declined) + error: failed to push some refs to 'https://git.heroku.com/prj-apirest.git' + ``` + - **más errores:** + - Este ocurre porque no es capaz de ejecutar **settings/prod.py** una vez hecho el push + ``` + remote: File "/app/.heroku/python/lib/python3.6/site-packages/django/conf/__init__.py", line 66, in _setup + remote: self._wrapped = Settings(settings_module) + remote: File "/app/.heroku/python/lib/python3.6/site-packages/django/conf/__init__.py", line 176, in __init__ + remote: raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") + remote: django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty. + remote: + remote: ! Error while running '$ python manage.py collectstatic --noinput'. + remote: See traceback above for details. + remote: + remote: You may need to update application code to resolve this error. + remote: Or, you can disable collectstatic for this application: + remote: + remote: $ heroku config:set DISABLE_COLLECTSTATIC=1 + ``` +- Sigue dando errores y al parecer hay que instalar otros programas **unicorn** y **whitenoise** tampoco es compatible con la distribución (dirtree) que tengo. +- Más info: [https://developer.mozilla.org/es/docs/Learn/Server-side/Django/Deployment](https://developer.mozilla.org/es/docs/Learn/Server-side/Django/Deployment) +- Lo dejo a medias... :s. Tiene que haber otra forma más sencilla de desplegar **Django** +- He instalado unicorn y whitenoise y lo he configurado +- He corregido algunos errores de staticfiles +- He corregido la importación en **wsgi.py** +- Funciona, pero, va con **Postgress** y no se como lanzar la migración :) sorpresas ~~! + + + + diff --git a/apirest/PYTHONANYWHERE.md b/apirest/PYTHONANYWHERE.md new file mode 100644 index 00000000..29b14334 --- /dev/null +++ b/apirest/PYTHONANYWHERE.md @@ -0,0 +1,153 @@ +# so +```js +() 17:39 ~ $ cat /etc/os-release +NAME="Ubuntu" +VERSION="16.04.5 LTS (Xenial Xerus)" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 16.04.5 LTS" +VERSION_ID="16.04" +HOME_URL="http://www.ubuntu.com/" +SUPPORT_URL="http://help.ubuntu.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +VERSION_CODENAME=xenial +UBUNTU_CODENAME=xenial +``` + +# Pasos +## [Youtube Video tutorial by Pretty Printed](https://youtu.be/Y4c4ickks2A) + +- Conectate por consola `https://www.pythonanywhere.com/user//consoles/` +- `git clone ` +#### my-repo structure: +```js +/ + / //django-admin startproject + / + __init__.py + settings.py + urls.py + wsgi.py + static/ + manage.py +``` +- ejecutar `mkvirtualenv --python=/usr/bin/python3.7 ` + ```js + 17:33 ~ $ mkvirtualenv --python=/usr/bin/python3.7 + Running virtualenv with interpreter /usr/bin/python3.7 + Using base prefix '/usr' + /usr/local/lib/python2.7/dist-packages/virtualenv.py:1041: DeprecationWarning: + the imp module is deprecated in favour of importlib; + see the module's documentation for alternative uses + import imp + New python executable in /home//.virtualenvs//bin/python3.7 + Also creating executable in /home//.virtualenvs//bin/python + Installing setuptools, pip, wheel...done. + virtualenvwrapper.user_scripts creating /home//.virtualenvs//bin/predeactivate + virtualenvwrapper.user_scripts creating /home//.virtualenvs//bin/postdeactivate + virtualenvwrapper.user_scripts creating /home//.virtualenvs//bin/preactivate + virtualenvwrapper.user_scripts creating /home//.virtualenvs//bin/postactivate + virtualenvwrapper.user_scripts creating /home//.virtualenvs//bin/get_env_details + ``` + - **`the imp module is deprecated in favour of importlib;`** + - No encontré nada para esta advertencia + +#### Los paquetes que necesito: +- pip install django +- pip install django-debug-toolbar +- pip install djangorestframework +- pip install django-rest-swagger +- pip install mysqlclient +```js +(venv1) 18:11 ~ $ pip freeze +-f /usr/share/pip-wheels +certifi==2019.3.9 +chardet==3.0.4 +coreapi==2.3.3 +coreschema==0.0.4 +Django==2.2.1 +django-debug-toolbar==1.11 +django-rest-swagger==2.2.0 +djangorestframework==3.9.3 +Glances==3.1.0 +idna==2.8 +itypes==1.1.0 +Jinja2==2.10.1 +MarkupSafe==1.1.1 +mysqlclient==1.4.2.post1 +openapi-codec==1.3.2 +psutil==5.6.2 +pytz==2019.1 +requests==2.21.0 +simplejson==3.16.0 +sqlparse==0.3.0 +uritemplate==3.0.0 +urllib3==1.24.3 +``` +- Vamos a: `https://www.pythonanywhere.com/user//webapps/#tab_id__pythonanywhere_com` +- En virtualenv configuramos la ruta: + - `/home//.virtualenvs/` +- Editar: + - `https://www.pythonanywhere.com/user//files/var/www/_pythonanywhere_com_wsgi.py?edit` + - Quitamos todo lo que no sea parte del framework que estamos usando, en este caso Django. + - configuramos la variable **path**: + - `/home///` + - configuramos **DJANGO_SETTINGS_MODULE** + - `.settings` + - guardamos y cerramos + ```py + import os + import sys + + path = '/home///' + if path not in sys.path: + sys.path.append(path) + + os.environ['DJANGO_SETTINGS_MODULE'] = '.settings' + from django.core.wsgi import get_wsgi_application + application = get_wsgi_application() + ``` +- Vamos a: **settings.py** + - `ALLOWED_HOSTS = [".pythonanywhere.com"]` + - configuramos **static** + - Hay que configurar la variable **STATIC_ROOT** + - `STATIC_ROOT = '/home////static/'` + - hay que ejecutar en prod: **`python manage.py collectstatic`** + - [explicación de este comando](https://stackoverflow.com/questions/34586114/whats-the-point-of-djangos-collectstatic) + - ![resultado](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/413x480/38e032a8615fb8ce9727a915d42f3384/image.png) + - Vamos a: `https://www.pythonanywhere.com/user//webapps/#tab_id__pythonanywhere_com` + - Sección: **Static files:** + - `url: /static/` + - `directory: /home////static/` + - **Reload!...** + - Funciona!! ^^ + +## Mysql +- [Cómo hacer un restore](https://help.pythonanywhere.com/pages/MySQLBackupRestore/) +- `mysql -u yourusername -h yourusername.mysql.pythonanywhere-services.com 'yourusername$dbname' < db-backup.sql` + - Esto no funciona :S + - Esto sí: + ```js + USE $; + SOURCE /home//prj_python37/apirest/db/_2.0.3.sql; + ``` + +## Errores: +- Si ejecuto: `python manage.py runserver` + ```js + File "", line 677, in _load_unlocked + File "", line 728, in exec_module + File "", line 219, in _call_with_frames_removed + File "/home/////settings.py", line 1, in + from .config.dev import * + File "/home/////config/dev.py", line 1, in + from .base import * + File "/home/////config/base.py", line 15, in + import django_heroku + ModuleNotFoundError: No module named 'django_heroku' + ``` + - Quito las dependencias de heroku y parece que esto tira :) + + + + diff --git a/apirest/Pipfile b/apirest/Pipfile new file mode 100644 index 00000000..bed188ea --- /dev/null +++ b/apirest/Pipfile @@ -0,0 +1,16 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +mysqlclient = "*" +Django = "*" +django-debug-toolbar = "*" +djangorestframework = "*" +django-rest-swagger = "*" + +[requires] +python_version = "3.7" diff --git a/apirest/Procfile b/apirest/Procfile new file mode 100644 index 00000000..83099077 --- /dev/null +++ b/apirest/Procfile @@ -0,0 +1 @@ +web: gunicorn learnlang.wsgi --log-file - diff --git a/apirest/README.md b/apirest/README.md new file mode 100644 index 00000000..41280684 --- /dev/null +++ b/apirest/README.md @@ -0,0 +1,545 @@ +# Probando el pip install pipenv + +## [Despliegue en Heroku](https://github.com/eacevedof/prj_python37/blob/master/apirest/HEROKU.md) + +## [Fazt](https://youtu.be/-XIsKyNWILo) + +- `pip install pipenv` instala el módulo del entorno virutal +- `pipenv shell` carga el entorno + - crea un nuevo entorno virtual +- `pipenv install django` +- `pipenv install djangorestframework` + - se ha creado un archivo Pipfile.lock +- `$ pipenv --venv` nos dice la ruta donde se instala el entorno virtual `.virtualenvs\apirest-wO8eG7Mj` +- Si queremos instalar un módolo con el típico **pip install** lo hariamos con **pipenv install** +- `pipenv lock -r` muestra todo lo que está instalado en mi entorno virtual +- `pipenv install --verbose -r requirements.txt` instala lo que está definido en el fichero +- `pipenv exit` salgo del entorno virtual +- `pipenv --rm` elimino mi entorno virtual + +```ssh +$ pip freeze +Django==2.2 +djangorestframework==3.9.2 +pytz==2019.1 +sqlparse==0.3.0 +``` + +- `django-admin startproject learnlang .` Crea el proyecto +- `django-admin startapp theapp` Crea la app theapp +- [creating-a-rest-apiwebservice by Fernando Rodrigues](http://fernandorodrigues.pro/creating-a-rest-apiwebservice-with-django-rest-framework-and-mysql-using-python-3/) +- `pip3 install mysqlclient` instala el driver + - Da error (que sorpresa! ¬¬) + - Intento [pip install mysqlclient-1.3.7-cp35-cp35m-win32.whl](https://www.pythoniza.me/instalando-mysqlclient-en-windows/) + - error + - [Drivers](https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient) + - Intento `pip3 install https://download.lfd.uci.edu/pythonlibs/u2hcgva4/mysqlclient-1.4.2-cp37-cp37m-win32.whl` + - ok +- `pipenv install mysqlclient` + - Da error (lloro en silencio ~~!) + - Supuestamente porque hay que hacerlo con el fichero requirements.txt ^^ [más info al final](https://pypi.org/project/mysqlclient/) + ``` + NOTE: Wheels for Windows may be not released with source package. + You should pin version in your requirements.txt to avoid trying to install newest source package. + ``` +- `pipenv install -r requirements.txt` Lo he ejecutado así y parece que va + ```js + mysqlclient==1.4.2 + django + djangorestframework + ``` +- `python manage.py inspectdb` + - Da error ( :) ) + - `ModuleNotFoundError: No module named 'MySQLdb'` + - Lo que parece es que django usa Mysqldb ^^ [está obsoleto?](http://fernandorodrigues.pro/creating-a-rest-apiwebservice-with-django-rest-framework-and-mysql-using-python-3/) +- Al final la instalación hay que hacerla así: + - `pipenv install --skip-lock -r requirements.txt` + - `pipenv install --skip-lock django-debug-toolbar` + - esto no generará el fichero Pipfile.lock (no se pa q sirve tampoco) + - **requirements.txt** + ```js + https://download.lfd.uci.edu/pythonlibs/u2hcgva4/mysqlclient-1.4.2-cp37-cp37m-win32.whl + django + djangorestframework + ``` +- `python manage.py inspectdb` devuelve como quedarían los modelos [más info](https://books.agiliq.com/projects/django-orm-cookbook/en/latest/existing_database.html) +- `python manage.py inspectdb > models.py` + ```js + - Create model AppArray + - Create model AppExam + - Create model AppExamsSentences + - Create model AppExamsUsers + - Create model AppExamsUsersEvalh + - Create model AppExamsUsersEvall + - Create model AppSentence + - Create model AppSentenceImages + - Create model AppSentencesUsers + - Create model AppSentenceTags + - Create model AppSentenceTimes + - Create model AppSentenceTr + - Create model AppTag + - Create model BaseLanguage + - Create model BaseLanguageLang + - Create model BaseUser + - Create model BaseUserArray + - Create model Template + - Create model TemplateArray + - Create model VersionDb + ``` +- `py manage.py makemigrations theapp` genera el fichero **theapp\migrations\0001_initial.py** + - Es una clase tipo `class Migration(migrations.Migration):` con todos los modelos +- `py manage.py migrate` crea todas las tablas necesarias para el framework **auth y django** + ```js + System check identified some issues: + + WARNINGS: + ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' + HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation + upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. + See: https://docs.djangoproject.com/en/2.2/ref/databases/#mysql-sql-mode + + Operations to perform: + Apply all migrations: admin, auth, contenttypes, sessions, theapp + Running migrations: + Applying contenttypes.0001_initial... OK + Applying auth.0001_initial... OK + Applying admin.0001_initial... OK + Applying admin.0002_logentry_remove_auto_add... OK + Applying admin.0003_logentry_add_action_flag_choices... OK + Applying contenttypes.0002_remove_content_type_name... OK + Applying auth.0002_alter_permission_name_max_length... OK + Applying auth.0003_alter_user_email_max_length... OK + Applying auth.0004_alter_user_username_opts... OK + Applying auth.0005_alter_user_last_login_null... OK + Applying auth.0006_require_contenttypes_0002... OK + Applying auth.0007_alter_validators_add_error_messages... OK + Applying auth.0008_alter_user_username_max_length... OK + Applying auth.0009_alter_user_last_name_max_length... OK + Applying auth.0010_alter_group_name_max_length... OK + Applying auth.0011_update_proxy_permissions... OK + Applying sessions.0001_initial... OK + Applying theapp.0001_initial... OK + ``` +- registro los modelos en `\learnlang\theapp\admin.py` +- en `\apirest\learnlang\settings.py` registro **rest_framework** como aplicación en **INSTALLED_APPS** +- creo fichero `theapp\serializers.py` donde irán los traductores de objetos a json +- configurando `theapp/views.py` son las que gestionan el CRUD +- configuro las rutas: `learnlang/urls.py` + ```py + from django.conf import settings + from django.conf.urls import url, include + ``` + - **url(r'^api/', include('learnlang.theapp.urls')),** hace include de las rutas del módulo +- creo fichero de rutas de aplicación `learnlang\theapp\urls.py` +- ejecuto `py manage.py runserver` + - ...y ...voila!! funciona!! ^^ no quepo de alegría + - [`http://127.0.0.1:8000/api/`](http://127.0.0.1:8000/api/) + +## Definiendo vistas customizadas +- Nos permiten tener un mayor control del CRUD +- `from rest_framework.views import APIView, Response` +- Se define la vista en **theapp/views.py** +- Se define la ruta en **theapp/urls.py** +```py +urlpatterns = [ + url(r'customview', CustomView.as_view()), +] + +urlpatterns += router.urls +``` +- [`http://127.0.0.1:8000/api/customview`](http://127.0.0.1:8000/api/customview) +- La duda, de donde sale el método **as_view()** ?? + +## Instalando Swagger (documentación) +- `pipenv install --skip-lock django-rest-swagger` +- registro swagger en settings.py +- creo ruta de documentación en `theapp/urls.py` + - `from rest_framework_swagger.views import get_swagger_view` + - `schema_view = get_swagger_view(title='Pastebin API')` + - `url(r'^docs/', schema_view)` + - Funciona! [http://127.0.0.1:8000/api/docs/](http://127.0.0.1:8000/api/docs/) + +# Customizando modelos +- Inserto mi módulo de utilidades + - Creo carpeta y ficheros + - lo registro en settings.py **INSTALLED_APPS** + +- Para cambiar el comportamiento del modelo en el formulario del administrador hay que tocar el archivo **admin.py** + - En este fichero se registran todos los modelos, pero no solo eso, tambien se excluyen y se reescriben. + - si tengo un modelo por defecto, lo importo aqui y creo uno customizado para el administrador + - algo como: `class AppArrayAdmin(admin.ModelAdmin):` + - En el registro hago el mapeo `admin.site.register(AppArray,AppArrayAdmin)` + +- Para customizar la visualización del crud de un modelo en el admin hay que configurar las siguientes tuplas en admin.py + - list_display = (...campos...) + - list_filter = (...campos...) + - search_fields = (...campos...) + +- He creado un modelo abstracto `class AbstractSysfields(models.Model):` + - Todos los modelos deberán implementar esta clase + - Esta, tiene definidos todos los campos de sistema + +- [PDF - doccumentacion de django 2.2](https://buildmedia.readthedocs.org/media/pdf/django/2.2.x/django.pdf) +- [Doc Django - sobreescribir metodos save y delete](https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model) + +## [Python Valencia - Cómo hacer API Rest con Django](https://youtu.be/RoxEX9DFF7s) +#### [Repo Github](https://github.com/pythonvlc/intro-django-rest-framework) +- [Objeto Request](https://youtu.be/RoxEX9DFF7s?t=489) + - **.data** - POST o FILES + - **.query_params** - GET + - **.user** - Django User (django.contrib.auth.models.User) + - **.method** - "GET", "POST", "PUT" ... + +- [Serializadores](https://youtu.be/RoxEX9DFF7s?t=575) + - Se puede definir una serie de tipos Field (char,boolean, requerido, valor por defecto, etc) + - **.is_valid()** - Valida los datos pasados. Estos son, los bindeados entre request y el serializador + - **.save()** - Crea o Actualiza el objeto asociado + - **ModelSerializer** - Igual que un ModelForm (que es un model form??? ^^) + - **HyperlinkedModelSerializer** - Añade la url al detalle del recurso + - **nota:** No es lo mismo un **serializer** que un **modelserializer** + +- [Ejemplo](https://youtu.be/RoxEX9DFF7s?t=666) +```py +# Este es un SERIALIZER +class EventSerializer(serializers.Serializer): + description = serializers.CharField(max_length=100) + start = serializers.DateTimeField() + finish = serializers.DateTimeField() + + # en data le llega los datos del request + # se pueden definir validadores a nivel global (este de aqui) o de campo + # para una validación por campo se haría: validate_description + def validate(self, data): + """ + Check that the start is before the stop. + """ + if data["start"] > data["finish"]: + # esto lanzará un error 400 al cliente + raise serializers.ValidationError("finish must occur after start") + return data + +# Este es un MODELSERIALIZER +# https://youtu.be/RoxEX9DFF7s?t=727 +class AccountSerializer(serializers.ModelSerializer): + # Hace uso de una subclase Meta a la que se le inyecta un Modelo + # en este ejemplo Account + class Meta: + model = Account + # los campos que se desea mostrar + fields = ("id","account_name","users","created") + # campos que el cliente no puede tocar + read_only_fields = ("account_name") + +``` +- [Views](https://youtu.be/RoxEX9DFF7s?t=767) + - Django nos provee de muchos tipos de clases de tipo Vista. [Más info en cdrf.co](http://www.cdrf.co/) + - APIView + - ViewSet + - ModelViewSet + - ListCreateAPIView + - RetrieveDestroyAPIView + - Mixins + - etc +- con APIView y ViewSet el control es mayor sobre el tratamiento de los datos +- [Ejemplos vistas](https://youtu.be/RoxEX9DFF7s?t=886) +```py +class UserViewSet(viewsets.ViewSet): + """ + A simple ViewSet for listin or retrieving users. + """ + def list(self,request): + # select * from auth_user + objqueryset = User.Objects.all() + # many=True devuelve muchos usuarios en el json + objserializer = UserSerializer(objqueryset, many=True) + # por defecto la respuesta siempre es 200 + return Response(objserializer.data) + + def retrieve(self, request, pk=None): + # devuelve todos los usuarios + queryset = User.objects.all() + # de esos usuarios obten el que tenga la pk que se ha pasado por la url + user = get_object_or_404(queryset, pk=pk) + serializer = UserSerializer(user) + return Response(serializer.data) + + +class UserList(generics.ListCreateAPIView): + oqueryset = User.objects.all() + objserializer_class = UserSerializer + permission_classes = (IsAdminUser,) + # pagina de 100 en 100 + paginate_by = 100 +``` +- Todas las vistas al final tienen que devolver un **Response** + +- [Response](https://youtu.be/RoxEX9DFF7s?t=975) + - **.data** - Los datos serializados para la respuesta + - **.status** - Código de estado de la respuesta + +- [Routers](https://youtu.be/RoxEX9DFF7s?t=1002) + - Conjuntamente con los ViewSets definidos previamente +```py +router = routers.SimpleRouter() +# user como se llama el endpoint +# UserViewSet generará todas las variantes de los verbos +router.register(r'user', UserViewSet) +router.register(r'accounts', AccountViewSet) + +urlpatterns = [ + # tambien podemos tener urls típicas de django + url(r'^forgot-password/$', ForgotPasswordFormView.as_view()) +] + +# se fusionan las urls de django con las del router +urlpatterns += router.urls +``` +- [Registrar modelo](https://youtu.be/RoxEX9DFF7s?t=1332) +- Otra forma de registrar un modelo es con: +```py +# admin.py +@admin.register(MiModelo) +class MiModeloAdmin(admin.ModelAdmin): + pass +``` +- [archivos resources y serializers](https://youtu.be/RoxEX9DFF7s?t=1381) + - Se crea carpeta **api** + - dentro, dos ficheros: serializers y resources + - resources: los viewsets, que para mi son los miapp.views +- [Serializador de tipo ModelSerializer](https://youtu.be/RoxEX9DFF7s?t=1410) +- [learnlang.urls configurando versiones de api](https://youtu.be/RoxEX9DFF7s?t=1480) +- [configuración del owner](https://youtu.be/RoxEX9DFF7s?t=1748) + - En el viewset se sobreescribe el método **perfom_create** + - Si revisamos lo que implementa el ModelViewSet, veremos que son 6 mixins que tienen que ver con las operaciones CRUD + - El que nos interesa es el CreateModelMixin, que tiene el método + - [video override](https://youtu.be/RoxEX9DFF7s?t=1789) + ```py + def perform_create(self, serializer): + serializer.save() + + # override + def perform_create(self, serializer): + serializer.save(owner=self.request.user) + ``` +- [HyperlinkedModelSerializer](https://youtu.be/RoxEX9DFF7s?t=2055) + - Esto hará que las foreign keys del modelo puedan servir un link con el endpoint del recurso foreing + - Nos provee un campo **url** que añadido al atributo (tupla) fields autogenera el endpoint + ```py + class TodoSerializer(serializers.ModelSerializer): + # ahora sería + class TodoSerializer(serializers.HyperlinkedModelSerializer): + model = Todo + fields = ("Text","due_date","url") + ``` +- [Permissions](https://youtu.be/RoxEX9DFF7s?t=2265) + - Permiso de acceso a los endpoints como a los objetos + - Creamos un fichero **api\permissions.py** en el creamos clases con nombres de permisos. + - Ejemplo + - + - + - En los resources (mis views.py) importamos los permisos + - En el atributo ModelViewSet.permission_classes (una tupla) asignamos (IsAuthenticated, IsOwnerOrDeny) + - En [settings.py](https://youtu.be/RoxEX9DFF7s?t=2286) hay un atributo: + - `REST_FRAMEWORK["DEFAULT_PERMISSION_CLASSES"]="rest_framework.permissions.IsAuthenticated"` + - Indica que, con que estes autenticado ya tienes acceso a todo + - Forma de renderizar los datos [DEFAULT_RENDERER_CLASSES](https://youtu.be/RoxEX9DFF7s?t=2324) + ```py + # permissions.py + from rest_framework.permissions import BasePermission + + class IsOwnerOrDeny(BasePermission): + def has_object_permission(self, request, view, obj): + return request.user == obj.owner + + # resources.py + from rest_framework.permissions import IsAuthenticated + from .serializers import TodoSerializer #HyperlinkedModelSerializer + from .permissions import IsOwnerOrDeny + + class TodoViewSet(viewsets.ModelViewSet): + queryset = Todo.objects.all() + serializer_class = TodoSerializer + permission_classes = (IsAuthenticated, IsOwnerOrDeny) + + def perform_create(self, serializer): + serializer.save(owner=self.request.user) + + ``` +- [Filtrar el los recursos por el usuario en sesion](https://youtu.be/RoxEX9DFF7s?t=2617) + ```py + class TodoViewSet(viewsets.ModelViewSet): + queryset = Todo.objects.all() + serializer_class = TodoSerializer + permission_classes = (IsAuthenticated, IsOwnerOrDeny) + + # https://youtu.be/RoxEX9DFF7s?t=2633 + def get_queryset(self): + # self.request.user habria que hacerlo en un "Manager de Django" + return self.queryset.filter(owner=self.request.user) + + def perform_create(self, serializer): + serializer.save(owner=self.request.user) + ``` +- [Marcar la tarea como hecha, un endpoit que se sale del patrón](https://youtu.be/RoxEX9DFF7s?t=2762) + ```py + # models.py + class Todo(models.Model): + owner = ... + .. + done = models.BooleanField(Blank=True, null=False, default=False) + def mark_as_done(self): + self.done = True + self.save() + + def __str__(self)... + + # resources.py + # se crea otra clase + # Los viewset no proveen de metodos: list ni retrieve (detail) + class TodoDoneViewSet(viewsets.ViewSet): + # el método lo generamos aqui y lo registramos más abajo + def done(self, request, *args, **kwargs): + pk = kwargs.get("pk",0) + todo = get_object_or_404(Todo, pk=pk) + todo.mark_as_done() + return Response(status=status.HTTP_204_NO_CONTENT) + + # registra el viewset con el verbo:viewset.metodo + donerouter = TodoDoneViewSet.as_view({"patch":"done"}) + + # en theapp/urls.py + router = SimpleRouter() + router.register(r'todos', viewset=TodoViewSet) + + # como no es un endpoint al uso, no se puede usar el SimpleRouter() + # hay que incluirlo en una url separada + urlpatterns = patterns( + "", + url(r"",include(router.urls)), + url(r"^todos/(?P[^/.]+)/done/$",donerouter, name="todo-done") + ) + ``` + [configurando el enrutador con done](https://youtu.be/RoxEX9DFF7s?t=2883) + + +> **Default Router** This router is similar to SimpleRouter, but additionally includes a default API root view, that returns a response containing hyperlinks to all the list views. It also generates routes for optional .json style format suffixes. + +[Paginación](https://youtu.be/RoxEX9DFF7s?t=3340) +- En la respuesta GET aparece: + - count: los items que hay + - next: la url de la sig página + - previous: la url de la previa + - results: array de resultado + +[Tests](https://youtu.be/RoxEX9DFF7s?t=3448) +- Django ofrece la clase APITestCase y metodos para hacer pruebas sobre la API + ```py + from rest_framework.test import APITestCase + class TestApi(APITestCase): + .... + ``` + +[Tipos de autenticaciones](https://youtu.be/RoxEX9DFF7s?t=3668) + - BasicAuthentication para uso con curl + - CustomAuthentication, la del ejemplo + - [TokenAuthentication](https://youtu.be/RoxEX9DFF7s?t=3692) + - Hay que crear la url de identificacion + +[Throttling](https://youtu.be/RoxEX9DFF7s?t=3918) + - Limite de peticiones por segundo + +[Filtrados](https://youtu.be/RoxEX9DFF7s?t=3928) + - Se pueden usar los filtros del django admin + +[Excepciones](https://youtu.be/RoxEX9DFF7s?t=3977) + - Se puede devolver distintos tipos de excepciones + +[Estructura del proyecto](https://youtu.be/RoxEX9DFF7s?t=4099) + +[Un api root](https://youtu.be/RoxEX9DFF7s?t=4133) + - Listado de todas las acciones que puede hacer un usuario + +[response.py](https://youtu.be/RoxEX9DFF7s?t=4145) + - [Ejemplo AcceptJobViewSet(ViewSet)](https://youtu.be/RoxEX9DFF7s?t=4187) + +```js + settings.py + models.py + utils\utils.py + admin.py + settings.py + models.py + utils\utils.py + admin.py + main-urls.py + app urls.py + views.py + serializers.py +``` + +- [Django - Entender Managers y Querysets](https://www.youtube.com/watch?v=rjUmA_pkGtw) +- [Django doc - model](https://docs.djangoproject.com/en/2.2/_modules/django/db/models/base/#Model) +- [Django doc - override serializers](https://www.django-rest-framework.org/api-guide/serializers) +- [Django doc - serializers.py source code](https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py) +- [Rest fw cdrf.co ModelSerializer methods](http://www.cdrf.co/3.1/rest_framework.serializers/ModelSerializer.html) + +- [Django doc - override ViewSet actions](https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions) +- [Django doc - viewsets.py source code](https://github.com/encode/django-rest-framework/blob/master/rest_framework/viewsets.py) +- [Rest fw cdrf.co ModelViewSet methods](http://www.cdrf.co/3.1/rest_framework.viewsets/ModelViewSet.html) + +# [Refactorizando el proyecto - su estructura](https://www.revsys.com/tidbits/recommended-django-project-layout/) +- Usando los settings en distintos entornos: +```sh +export DJANGO_SETTINGS_MODULE=“foo.settings.jenkins” +or +./manage.py migrate —settings=foo.settings.production +or using gunicorn: +gunicorn -w 4 -b 127.0.0.1:8001 —settings=foo.settings.dev +``` +- Ejecutar **runserver**: + - `py manage.py runserver --settings=learnlang.settings.dev` + +# [Video - Django admin](https://www.youtube.com/watch?v=XphJRQ3AzMU) +## Kenneth Love Django Admin Basics and Beyond PyCon 2017 +- otra forma de registrar un modelo `admin.site.register(models.MiModelo)` + - en **admin.py** se suele hacer eso, pero tambien serviria: + - `@admin.register(AppArray)` + - [Video](https://youtu.be/XphJRQ3AzMU?t=586) +- [ordering](https://youtu.be/XphJRQ3AzMU?t=1365) +- [@property](https://youtu.be/XphJRQ3AzMU?t=1439) + - Campo virtual o compuesto que realmente es una función + - [en admin](https://youtu.be/XphJRQ3AzMU?t=1611) +- [editable fields](https://youtu.be/XphJRQ3AzMU?t=1865) +- [list_filter](https://youtu.be/XphJRQ3AzMU?t=2189) + - [date_field filter](https://youtu.be/XphJRQ3AzMU?t=2445) +- [Custom filters](https://youtu.be/XphJRQ3AzMU?t=2725) + - Se extiende de `admin.SimpleListFilter` + - Se define: title y parameter_name (lo que aparecerá en la sección de filtros) + - se define los métodos **lookups(self, request, model_admin)** y **queryset(self, request, queryset)** + - Una vez configurada la clase filtro, se inyecta en **list_filter** como si fuera un campo más. +- [Search field search_fields](https://youtu.be/XphJRQ3AzMU?t=2890) +- [actions](https://youtu.be/XphJRQ3AzMU?t=3274) + - Crear nueva accion en el desplegable + - se define una función (fuera de la clase modelo) + - a esta función se le agrega la propiedad short_description (texto del desplegable) + - esta función se incluye dentro del array de actions + - tambien se puede hacer con un método y este deberia pasarse entre comillas en el array actions (sin self) +- [Date date_hierarchy](https://youtu.be/XphJRQ3AzMU?t=3617) + - crea una lista de filtros por defecto con fecha (debajo del desplegable) +- [Detail View](https://youtu.be/XphJRQ3AzMU?t=3808) + - Es el formulario de creación o edición + - atributo **fields** + - atributo [**fieldsets**](https://youtu.be/XphJRQ3AzMU?t=4112) +- [Custom form](https://youtu.be/XphJRQ3AzMU?t=4383) + + +> Nota importante +```py +No se porque estas 2 trazas me fastidian el guardado +pr(obj,"AppModelAdmin.save_model.obj") +pr(self.objuser,"TheappModelAdmin.self.objuser") +``` + +## Refactor + +- Al hacer la generación de modelos. Hay que tener cuidado con los modelos Auth, estos hay que excluirlos de models.py porque dan conflicto con los de autocarga propios de Django. diff --git a/apirest/api/__init__.py b/apirest/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/api/resources.py b/apirest/api/resources.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/api/serializers.py b/apirest/api/serializers.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/db/db_learnlang_1.0.0.sql b/apirest/db/db_learnlang_1.0.0.sql new file mode 100644 index 00000000..40cac8e7 --- /dev/null +++ b/apirest/db/db_learnlang_1.0.0.sql @@ -0,0 +1,702 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_times` */ + +DROP TABLE IF EXISTS `app_sentence_times`; + +CREATE TABLE `app_sentence_times` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(50) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `first_name` varchar(100) DEFAULT NULL, + `last_name` varchar(100) DEFAULT NULL, + `email` varchar(50) DEFAULT NULL, + `bo_login` varchar(100) DEFAULT NULL, + `bo_password` varchar(250) DEFAULT NULL, + `md_login` varchar(100) DEFAULT NULL, + `md_password` varchar(250) DEFAULT NULL, + `language` varchar(50) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `id_start_module` int(11) DEFAULT NULL, + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL, + `code_type` varchar(25) DEFAULT NULL, + `bo_tokenreset` varchar(250) DEFAULT NULL, + `md_tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/db/db_learnlang_2.0.0.sql b/apirest/db/db_learnlang_2.0.0.sql new file mode 100644 index 00000000..c059a902 --- /dev/null +++ b/apirest/db/db_learnlang_2.0.0.sql @@ -0,0 +1,848 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_times` */ + +DROP TABLE IF EXISTS `app_sentence_times`; + +CREATE TABLE `app_sentence_times` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(50) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Table structure for table `auth_group` */ + +DROP TABLE IF EXISTS `auth_group`; + +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `auth_group_permissions` */ + +DROP TABLE IF EXISTS `auth_group_permissions`; + +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `auth_permission` */ + +DROP TABLE IF EXISTS `auth_permission`; + +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8; + +/*Table structure for table `auth_user` */ + +DROP TABLE IF EXISTS `auth_user`; + +CREATE TABLE `auth_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `auth_user_groups` */ + +DROP TABLE IF EXISTS `auth_user_groups`; + +CREATE TABLE `auth_user_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `auth_user_user_permissions` */ + +DROP TABLE IF EXISTS `auth_user_user_permissions`; + +CREATE TABLE `auth_user_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `first_name` varchar(100) DEFAULT NULL, + `last_name` varchar(100) DEFAULT NULL, + `email` varchar(50) DEFAULT NULL, + `bo_login` varchar(100) DEFAULT NULL, + `bo_password` varchar(250) DEFAULT NULL, + `md_login` varchar(100) DEFAULT NULL, + `md_password` varchar(250) DEFAULT NULL, + `language` varchar(50) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `id_start_module` int(11) DEFAULT NULL, + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL, + `code_type` varchar(25) DEFAULT NULL, + `bo_tokenreset` varchar(250) DEFAULT NULL, + `md_tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `django_admin_log` */ + +DROP TABLE IF EXISTS `django_admin_log`; + +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `django_content_type` */ + +DROP TABLE IF EXISTS `django_content_type`; + +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; + +/*Table structure for table `django_migrations` */ + +DROP TABLE IF EXISTS `django_migrations`; + +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; + +/*Table structure for table `django_session` */ + +DROP TABLE IF EXISTS `django_session`; + +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/db/db_learnlang_2.0.1.sql b/apirest/db/db_learnlang_2.0.1.sql new file mode 100644 index 00000000..93aab432 --- /dev/null +++ b/apirest/db/db_learnlang_2.0.1.sql @@ -0,0 +1,927 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template` */ + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template_array` */ + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +/*Data for the table `app_array` */ + +insert into `app_array`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`type`,`module`,`id_tosave`,`description`,`order_by`,`code_cache`) values ('0','1','1','20190428124444',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,1,NULL,NULL,NULL,NULL,'uuuu',-2,'fff51b86-69a1-11e9-9889-74e5f9c5ea17'),('0','3','1','20190428125301','3','1','20190428130310',NULL,NULL,NULL,'u',NULL,'1',NULL,2,NULL,'new-type','unmodulo',NULL,'description2',100,'caf13110-69a3-11e9-8022-74e5f9c5ea17'); + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exam` */ + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_sentences` */ + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users` */ + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evalh` */ + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evall` */ + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence` */ + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_images` */ + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tags` */ + +/*Table structure for table `app_sentence_times` */ + +DROP TABLE IF EXISTS `app_sentence_times`; + +CREATE TABLE `app_sentence_times` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_times` */ + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tr` */ + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentences_users` */ + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(50) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Data for the table `app_tag` */ + +insert into `app_tag`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`id_type`,`description`,`slug`,`order_by`) values (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,1,1,'a','a',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,2,1,'about-us','about-us',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,3,1,'advertencia','advertencia',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,4,1,'b','b',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,5,1,'blog','blog',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,6,1,'c','c',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,7,1,'ceveza','cerveza',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,8,1,'cms','cms',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,9,1,'contacta','contacta',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,10,1,'contents','contents',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,11,1,'design','design',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,12,1,'giusi','giusi',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,13,1,'image','image',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,14,1,'la guinda','la-guinda',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,15,1,'mexico','mexico',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,16,1,'miguel angel','miguel-angel',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,17,1,'optimus prime','',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,18,1,'papiam','papiam',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,19,1,'personal','personal',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,20,1,'portafolio','portafolio',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,21,1,'primer atticulo','primer-atticulo',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,22,1,'prueba de cms','prueba-de-cms',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,23,1,'services','services',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,24,1,'servicos','servicos',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,25,1,'shop','shop',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,26,1,'tpv.pedidos minimos','tpv-pedidos-minimos',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,27,1,'transformers','transformers',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,28,1,'video','video',100),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,29,1,'wordpress','wordpress',100); + +/*Table structure for table `auth_group` */ + +DROP TABLE IF EXISTS `auth_group`; + +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group` */ + +/*Table structure for table `auth_group_permissions` */ + +DROP TABLE IF EXISTS `auth_group_permissions`; + +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group_permissions` */ + +/*Table structure for table `auth_permission` */ + +DROP TABLE IF EXISTS `auth_permission`; + +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_permission` */ + +insert into `auth_permission`(`id`,`name`,`content_type_id`,`codename`) values (1,'Can add log entry',1,'add_logentry'),(2,'Can change log entry',1,'change_logentry'),(3,'Can delete log entry',1,'delete_logentry'),(4,'Can view log entry',1,'view_logentry'),(5,'Can add permission',2,'add_permission'),(6,'Can change permission',2,'change_permission'),(7,'Can delete permission',2,'delete_permission'),(8,'Can view permission',2,'view_permission'),(9,'Can add group',3,'add_group'),(10,'Can change group',3,'change_group'),(11,'Can delete group',3,'delete_group'),(12,'Can view group',3,'view_group'),(13,'Can add user',4,'add_user'),(14,'Can change user',4,'change_user'),(15,'Can delete user',4,'delete_user'),(16,'Can view user',4,'view_user'),(17,'Can add content type',5,'add_contenttype'),(18,'Can change content type',5,'change_contenttype'),(19,'Can delete content type',5,'delete_contenttype'),(20,'Can view content type',5,'view_contenttype'),(21,'Can add session',6,'add_session'),(22,'Can change session',6,'change_session'),(23,'Can delete session',6,'delete_session'),(24,'Can view session',6,'view_session'),(25,'Can add app array',7,'add_apparray'),(26,'Can change app array',7,'change_apparray'),(27,'Can delete app array',7,'delete_apparray'),(28,'Can view app array',7,'view_apparray'),(29,'Can add app exam',8,'add_appexam'),(30,'Can change app exam',8,'change_appexam'),(31,'Can delete app exam',8,'delete_appexam'),(32,'Can view app exam',8,'view_appexam'),(33,'Can add app exams sentences',9,'add_appexamssentences'),(34,'Can change app exams sentences',9,'change_appexamssentences'),(35,'Can delete app exams sentences',9,'delete_appexamssentences'),(36,'Can view app exams sentences',9,'view_appexamssentences'),(37,'Can add app exams users',10,'add_appexamsusers'),(38,'Can change app exams users',10,'change_appexamsusers'),(39,'Can delete app exams users',10,'delete_appexamsusers'),(40,'Can view app exams users',10,'view_appexamsusers'),(41,'Can add app exams users evalh',11,'add_appexamsusersevalh'),(42,'Can change app exams users evalh',11,'change_appexamsusersevalh'),(43,'Can delete app exams users evalh',11,'delete_appexamsusersevalh'),(44,'Can view app exams users evalh',11,'view_appexamsusersevalh'),(45,'Can add app exams users evall',12,'add_appexamsusersevall'),(46,'Can change app exams users evall',12,'change_appexamsusersevall'),(47,'Can delete app exams users evall',12,'delete_appexamsusersevall'),(48,'Can view app exams users evall',12,'view_appexamsusersevall'),(49,'Can add app sentence',13,'add_appsentence'),(50,'Can change app sentence',13,'change_appsentence'),(51,'Can delete app sentence',13,'delete_appsentence'),(52,'Can view app sentence',13,'view_appsentence'),(53,'Can add app sentence images',14,'add_appsentenceimages'),(54,'Can change app sentence images',14,'change_appsentenceimages'),(55,'Can delete app sentence images',14,'delete_appsentenceimages'),(56,'Can view app sentence images',14,'view_appsentenceimages'),(57,'Can add app sentences users',15,'add_appsentencesusers'),(58,'Can change app sentences users',15,'change_appsentencesusers'),(59,'Can delete app sentences users',15,'delete_appsentencesusers'),(60,'Can view app sentences users',15,'view_appsentencesusers'),(61,'Can add app sentence tags',16,'add_appsentencetags'),(62,'Can change app sentence tags',16,'change_appsentencetags'),(63,'Can delete app sentence tags',16,'delete_appsentencetags'),(64,'Can view app sentence tags',16,'view_appsentencetags'),(65,'Can add app sentence times',17,'add_appsentencetimes'),(66,'Can change app sentence times',17,'change_appsentencetimes'),(67,'Can delete app sentence times',17,'delete_appsentencetimes'),(68,'Can view app sentence times',17,'view_appsentencetimes'),(69,'Can add app sentence tr',18,'add_appsentencetr'),(70,'Can change app sentence tr',18,'change_appsentencetr'),(71,'Can delete app sentence tr',18,'delete_appsentencetr'),(72,'Can view app sentence tr',18,'view_appsentencetr'),(73,'Can add app tag',19,'add_apptag'),(74,'Can change app tag',19,'change_apptag'),(75,'Can delete app tag',19,'delete_apptag'),(76,'Can view app tag',19,'view_apptag'),(77,'Can add base language',20,'add_baselanguage'),(78,'Can change base language',20,'change_baselanguage'),(79,'Can delete base language',20,'delete_baselanguage'),(80,'Can view base language',20,'view_baselanguage'),(81,'Can add base language lang',21,'add_baselanguagelang'),(82,'Can change base language lang',21,'change_baselanguagelang'),(83,'Can delete base language lang',21,'delete_baselanguagelang'),(84,'Can view base language lang',21,'view_baselanguagelang'),(85,'Can add base user',22,'add_baseuser'),(86,'Can change base user',22,'change_baseuser'),(87,'Can delete base user',22,'delete_baseuser'),(88,'Can view base user',22,'view_baseuser'),(89,'Can add base user array',23,'add_baseuserarray'),(90,'Can change base user array',23,'change_baseuserarray'),(91,'Can delete base user array',23,'delete_baseuserarray'),(92,'Can view base user array',23,'view_baseuserarray'),(93,'Can add template',24,'add_template'),(94,'Can change template',24,'change_template'),(95,'Can delete template',24,'delete_template'),(96,'Can view template',24,'view_template'),(97,'Can add template array',25,'add_templatearray'),(98,'Can change template array',25,'change_templatearray'),(99,'Can delete template array',25,'delete_templatearray'),(100,'Can view template array',25,'view_templatearray'),(101,'Can add version db',26,'add_versiondb'),(102,'Can change version db',26,'change_versiondb'),(103,'Can delete version db',26,'delete_versiondb'),(104,'Can view version db',26,'view_versiondb'); + +/*Table structure for table `auth_user` */ + +DROP TABLE IF EXISTS `auth_user`; + +CREATE TABLE `auth_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user` */ + +insert into `auth_user`(`id`,`password`,`last_login`,`is_superuser`,`username`,`first_name`,`last_name`,`email`,`is_staff`,`is_active`,`date_joined`) values (1,'pbkdf2_sha256$150000$kK228PsfZrvK$R4AJZ8eYfZaR6A/DInDuenmo60ruKhUh/PT4FqXo5Tw=','2019-04-22 19:51:46.576346',1,'sa','','','sa@theframework.es',1,1,'2019-04-20 22:13:58.619448'); + +/*Table structure for table `auth_user_groups` */ + +DROP TABLE IF EXISTS `auth_user_groups`; + +CREATE TABLE `auth_user_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_groups` */ + +/*Table structure for table `auth_user_user_permissions` */ + +DROP TABLE IF EXISTS `auth_user_user_permissions`; + +CREATE TABLE `auth_user_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_user_permissions` */ + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `base_language` */ + +insert into `base_language`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`id_tosave`,`description`,`code_iso`,`order_by`) values (NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,1,'english','english','ENGLISH','en',100),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,2,'spanish','spanish','SPANISH','es',100),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,3,'dutch','dutch','DUTCH','nl',100),(NULL,'1','1','20140825073501','3','1','20170114120045',NULL,NULL,NULL,NULL,'0','1',NULL,4,'papiaments','papiaments','PAPIAMENTS','pap',100); + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_language_lang` */ + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `first_name` varchar(100) DEFAULT NULL, + `last_name` varchar(100) DEFAULT NULL, + `nickname` varchar(25) DEFAULT NULL, + `email` varchar(50) DEFAULT NULL, + `country` varchar(20) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL COMMENT 'su idioma de preferencia', + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL COMMENT 'user,maintenaince,system', + `tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user_array` */ + +/*Table structure for table `django_admin_log` */ + +DROP TABLE IF EXISTS `django_admin_log`; + +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; + +/*Data for the table `django_admin_log` */ + +insert into `django_admin_log`(`id`,`action_time`,`object_id`,`object_repr`,`action_flag`,`change_message`,`content_type_id`,`user_id`) values (1,'2019-04-21 12:16:56.931203','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(2,'2019-04-21 13:31:10.864223','4','AppArray object (4)',1,'[{\"added\": {}}]',7,1),(3,'2019-04-21 13:31:35.941650','4','AppArray object (4)',2,'[]',7,1),(4,'2019-04-21 14:27:29.654207','5','AppArray object (5)',1,'[{\"added\": {}}]',7,1),(5,'2019-04-21 14:35:55.294048','3','AppArray object (3)',3,'',7,1),(6,'2019-04-21 15:38:46.951009','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(7,'2019-04-21 15:39:55.336796','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(8,'2019-04-21 15:40:25.602301','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(9,'2019-04-21 15:40:48.714448','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(10,'2019-04-21 15:40:51.198738','15','AppArray object (15)',1,'[{\"added\": {}}]',7,1),(11,'2019-04-21 15:42:33.196306','16','AppArray object (16)',1,'[{\"added\": {}}]',7,1),(12,'2019-04-21 15:43:10.163156','17','AppArray object (17)',1,'[{\"added\": {}}]',7,1),(13,'2019-04-21 15:43:12.816046','18','AppArray object (18)',1,'[{\"added\": {}}]',7,1); + +/*Table structure for table `django_content_type` */ + +DROP TABLE IF EXISTS `django_content_type`; + +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; + +/*Data for the table `django_content_type` */ + +insert into `django_content_type`(`id`,`app_label`,`model`) values (1,'admin','logentry'),(3,'auth','group'),(2,'auth','permission'),(4,'auth','user'),(5,'contenttypes','contenttype'),(6,'sessions','session'),(7,'theapp','apparray'),(8,'theapp','appexam'),(9,'theapp','appexamssentences'),(10,'theapp','appexamsusers'),(11,'theapp','appexamsusersevalh'),(12,'theapp','appexamsusersevall'),(13,'theapp','appsentence'),(14,'theapp','appsentenceimages'),(15,'theapp','appsentencesusers'),(16,'theapp','appsentencetags'),(17,'theapp','appsentencetimes'),(18,'theapp','appsentencetr'),(19,'theapp','apptag'),(20,'theapp','baselanguage'),(21,'theapp','baselanguagelang'),(22,'theapp','baseuser'),(23,'theapp','baseuserarray'),(24,'theapp','template'),(25,'theapp','templatearray'),(26,'theapp','versiondb'); + +/*Table structure for table `django_migrations` */ + +DROP TABLE IF EXISTS `django_migrations`; + +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; + +/*Data for the table `django_migrations` */ + +insert into `django_migrations`(`id`,`app`,`name`,`applied`) values (1,'contenttypes','0001_initial','2019-04-20 20:37:05.587588'),(2,'auth','0001_initial','2019-04-20 20:37:05.756875'),(3,'admin','0001_initial','2019-04-20 20:37:06.204744'),(4,'admin','0002_logentry_remove_auto_add','2019-04-20 20:37:06.305296'),(5,'admin','0003_logentry_add_action_flag_choices','2019-04-20 20:37:06.320956'),(6,'contenttypes','0002_remove_content_type_name','2019-04-20 20:37:06.421538'),(7,'auth','0002_alter_permission_name_max_length','2019-04-20 20:37:06.474895'),(8,'auth','0003_alter_user_email_max_length','2019-04-20 20:37:06.543529'),(9,'auth','0004_alter_user_username_opts','2019-04-20 20:37:06.543529'),(10,'auth','0005_alter_user_last_login_null','2019-04-20 20:37:06.590489'),(11,'auth','0006_require_contenttypes_0002','2019-04-20 20:37:06.590489'),(12,'auth','0007_alter_validators_add_error_messages','2019-04-20 20:37:06.606053'),(13,'auth','0008_alter_user_username_max_length','2019-04-20 20:37:06.643853'),(14,'auth','0009_alter_user_last_name_max_length','2019-04-20 20:37:06.728465'),(15,'auth','0010_alter_group_name_max_length','2019-04-20 20:37:06.806829'),(16,'auth','0011_update_proxy_permissions','2019-04-20 20:37:06.806829'),(17,'sessions','0001_initial','2019-04-20 20:37:06.828507'),(18,'theapp','0001_initial','2019-04-20 20:37:06.875415'); + +/*Table structure for table `django_session` */ + +DROP TABLE IF EXISTS `django_session`; + +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `django_session` */ + +insert into `django_session`(`session_key`,`session_data`,`expire_date`) values ('2jghde97bd66bm2y8jhnpz3rnuflgovs','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-06 19:51:46.589978'),('ucu7f6e98otkflunmx78gu0wmfdvl3v8','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-05 12:08:18.407290'); + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/*Data for the table `version_db` */ + +insert into `version_db`(`id`,`date`,`version`,`description`) values (1,'20190420162500','1.0.0','definicion'); + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/db/db_learnlang_2.0.2.sql b/apirest/db/db_learnlang_2.0.2.sql new file mode 100644 index 00000000..28afc8b8 --- /dev/null +++ b/apirest/db/db_learnlang_2.0.2.sql @@ -0,0 +1,924 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template` */ + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template_array` */ + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `app_array` */ + +insert into `app_array`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`type`,`module`,`id_tosave`,`description`,`order_by`,`code_cache`) values ('0','4','1','20190428145155',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,1,NULL,'9','unmodulo',NULL,'bgt',100,'66be8122-69b4-11e9-acc9-74e5f9c5ea17'),('0','1','1','20190428145212',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,2,NULL,'generic','d',NULL,'10',3,'713e0392-69b4-11e9-8c10-74e5f9c5ea17'),('0','2','1','20190428154035',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,3,NULL,'generic','',NULL,'-',100,'33b59fd0-69bb-11e9-9688-74e5f9c5ea17'),('0','2','1','20190428154039',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,4,NULL,'generic','',NULL,'-',100,'3606dbb6-69bb-11e9-8aad-74e5f9c5ea17'); + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exam` */ + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_sentences` */ + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users` */ + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evalh` */ + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evall` */ + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence` */ + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_images` */ + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tags` */ + +/*Table structure for table `app_sentence_times` */ + +DROP TABLE IF EXISTS `app_sentence_times`; + +CREATE TABLE `app_sentence_times` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_times` */ + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tr` */ + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentences_users` */ + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(50) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Data for the table `app_tag` */ + +insert into `app_tag`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`id_type`,`description`,`slug`,`order_by`,`code_cache`) values (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,1,1,'a','a',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,2,1,'about-us','about-us',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,3,1,'advertencia','advertencia',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,4,1,'b','b',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,5,1,'blog','blog',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,6,1,'c','c',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,7,1,'ceveza','cerveza',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,8,1,'cms','cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,9,1,'contacta','contacta',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,10,1,'contents','contents',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,11,1,'design','design',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,12,1,'giusi','giusi',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,13,1,'image','image',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,14,1,'la guinda','la-guinda',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,15,1,'mexico','mexico',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,16,1,'miguel angel','miguel-angel',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,17,1,'optimus prime','',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,18,1,'papiam','papiam',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,19,1,'personal','personal',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,20,1,'portafolio','portafolio',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,21,1,'primer atticulo','primer-atticulo',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,22,1,'prueba de cms','prueba-de-cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,23,1,'services','services',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,24,1,'servicos','servicos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,25,1,'shop','shop',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,26,1,'tpv.pedidos minimos','tpv-pedidos-minimos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,27,1,'transformers','transformers',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,28,1,'video','video',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,29,1,'wordpress','wordpress',100,NULL); + +/*Table structure for table `auth_group` */ + +DROP TABLE IF EXISTS `auth_group`; + +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group` */ + +/*Table structure for table `auth_group_permissions` */ + +DROP TABLE IF EXISTS `auth_group_permissions`; + +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group_permissions` */ + +/*Table structure for table `auth_permission` */ + +DROP TABLE IF EXISTS `auth_permission`; + +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_permission` */ + +insert into `auth_permission`(`id`,`name`,`content_type_id`,`codename`) values (1,'Can add log entry',1,'add_logentry'),(2,'Can change log entry',1,'change_logentry'),(3,'Can delete log entry',1,'delete_logentry'),(4,'Can view log entry',1,'view_logentry'),(5,'Can add permission',2,'add_permission'),(6,'Can change permission',2,'change_permission'),(7,'Can delete permission',2,'delete_permission'),(8,'Can view permission',2,'view_permission'),(9,'Can add group',3,'add_group'),(10,'Can change group',3,'change_group'),(11,'Can delete group',3,'delete_group'),(12,'Can view group',3,'view_group'),(13,'Can add user',4,'add_user'),(14,'Can change user',4,'change_user'),(15,'Can delete user',4,'delete_user'),(16,'Can view user',4,'view_user'),(17,'Can add content type',5,'add_contenttype'),(18,'Can change content type',5,'change_contenttype'),(19,'Can delete content type',5,'delete_contenttype'),(20,'Can view content type',5,'view_contenttype'),(21,'Can add session',6,'add_session'),(22,'Can change session',6,'change_session'),(23,'Can delete session',6,'delete_session'),(24,'Can view session',6,'view_session'),(25,'Can add app array',7,'add_apparray'),(26,'Can change app array',7,'change_apparray'),(27,'Can delete app array',7,'delete_apparray'),(28,'Can view app array',7,'view_apparray'),(29,'Can add app exam',8,'add_appexam'),(30,'Can change app exam',8,'change_appexam'),(31,'Can delete app exam',8,'delete_appexam'),(32,'Can view app exam',8,'view_appexam'),(33,'Can add app exams sentences',9,'add_appexamssentences'),(34,'Can change app exams sentences',9,'change_appexamssentences'),(35,'Can delete app exams sentences',9,'delete_appexamssentences'),(36,'Can view app exams sentences',9,'view_appexamssentences'),(37,'Can add app exams users',10,'add_appexamsusers'),(38,'Can change app exams users',10,'change_appexamsusers'),(39,'Can delete app exams users',10,'delete_appexamsusers'),(40,'Can view app exams users',10,'view_appexamsusers'),(41,'Can add app exams users evalh',11,'add_appexamsusersevalh'),(42,'Can change app exams users evalh',11,'change_appexamsusersevalh'),(43,'Can delete app exams users evalh',11,'delete_appexamsusersevalh'),(44,'Can view app exams users evalh',11,'view_appexamsusersevalh'),(45,'Can add app exams users evall',12,'add_appexamsusersevall'),(46,'Can change app exams users evall',12,'change_appexamsusersevall'),(47,'Can delete app exams users evall',12,'delete_appexamsusersevall'),(48,'Can view app exams users evall',12,'view_appexamsusersevall'),(49,'Can add app sentence',13,'add_appsentence'),(50,'Can change app sentence',13,'change_appsentence'),(51,'Can delete app sentence',13,'delete_appsentence'),(52,'Can view app sentence',13,'view_appsentence'),(53,'Can add app sentence images',14,'add_appsentenceimages'),(54,'Can change app sentence images',14,'change_appsentenceimages'),(55,'Can delete app sentence images',14,'delete_appsentenceimages'),(56,'Can view app sentence images',14,'view_appsentenceimages'),(57,'Can add app sentences users',15,'add_appsentencesusers'),(58,'Can change app sentences users',15,'change_appsentencesusers'),(59,'Can delete app sentences users',15,'delete_appsentencesusers'),(60,'Can view app sentences users',15,'view_appsentencesusers'),(61,'Can add app sentence tags',16,'add_appsentencetags'),(62,'Can change app sentence tags',16,'change_appsentencetags'),(63,'Can delete app sentence tags',16,'delete_appsentencetags'),(64,'Can view app sentence tags',16,'view_appsentencetags'),(65,'Can add app sentence times',17,'add_appsentencetimes'),(66,'Can change app sentence times',17,'change_appsentencetimes'),(67,'Can delete app sentence times',17,'delete_appsentencetimes'),(68,'Can view app sentence times',17,'view_appsentencetimes'),(69,'Can add app sentence tr',18,'add_appsentencetr'),(70,'Can change app sentence tr',18,'change_appsentencetr'),(71,'Can delete app sentence tr',18,'delete_appsentencetr'),(72,'Can view app sentence tr',18,'view_appsentencetr'),(73,'Can add app tag',19,'add_apptag'),(74,'Can change app tag',19,'change_apptag'),(75,'Can delete app tag',19,'delete_apptag'),(76,'Can view app tag',19,'view_apptag'),(77,'Can add base language',20,'add_baselanguage'),(78,'Can change base language',20,'change_baselanguage'),(79,'Can delete base language',20,'delete_baselanguage'),(80,'Can view base language',20,'view_baselanguage'),(81,'Can add base language lang',21,'add_baselanguagelang'),(82,'Can change base language lang',21,'change_baselanguagelang'),(83,'Can delete base language lang',21,'delete_baselanguagelang'),(84,'Can view base language lang',21,'view_baselanguagelang'),(85,'Can add base user',22,'add_baseuser'),(86,'Can change base user',22,'change_baseuser'),(87,'Can delete base user',22,'delete_baseuser'),(88,'Can view base user',22,'view_baseuser'),(89,'Can add base user array',23,'add_baseuserarray'),(90,'Can change base user array',23,'change_baseuserarray'),(91,'Can delete base user array',23,'delete_baseuserarray'),(92,'Can view base user array',23,'view_baseuserarray'),(93,'Can add template',24,'add_template'),(94,'Can change template',24,'change_template'),(95,'Can delete template',24,'delete_template'),(96,'Can view template',24,'view_template'),(97,'Can add template array',25,'add_templatearray'),(98,'Can change template array',25,'change_templatearray'),(99,'Can delete template array',25,'delete_templatearray'),(100,'Can view template array',25,'view_templatearray'),(101,'Can add version db',26,'add_versiondb'),(102,'Can change version db',26,'change_versiondb'),(103,'Can delete version db',26,'delete_versiondb'),(104,'Can view version db',26,'view_versiondb'); + +/*Table structure for table `auth_user` */ + +DROP TABLE IF EXISTS `auth_user`; + +CREATE TABLE `auth_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user` */ + +insert into `auth_user`(`id`,`password`,`last_login`,`is_superuser`,`username`,`first_name`,`last_name`,`email`,`is_staff`,`is_active`,`date_joined`) values (1,'pbkdf2_sha256$150000$kK228PsfZrvK$R4AJZ8eYfZaR6A/DInDuenmo60ruKhUh/PT4FqXo5Tw=','2019-04-22 19:51:46.576346',1,'sa','','','sa@theframework.es',1,1,'2019-04-20 22:13:58.619448'); + +/*Table structure for table `auth_user_groups` */ + +DROP TABLE IF EXISTS `auth_user_groups`; + +CREATE TABLE `auth_user_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_groups` */ + +/*Table structure for table `auth_user_user_permissions` */ + +DROP TABLE IF EXISTS `auth_user_user_permissions`; + +CREATE TABLE `auth_user_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_user_permissions` */ + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `base_language` */ + +insert into `base_language`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`id_tosave`,`description`,`code_iso`,`order_by`,`code_cache`) values (NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,1,'english','english','ENGLISH','en',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,2,'spanish','spanish','SPANISH','es',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,3,'dutch','dutch','DUTCH','nl',100,NULL),(NULL,'1','1','20140825073501','3','1','20170114120045',NULL,NULL,NULL,NULL,'0','1',NULL,4,'papiaments','papiaments','PAPIAMENTS','pap',100,NULL); + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_language_lang` */ + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_country` int(11) DEFAULT NULL COMMENT 'app_array.type=country', + `id_language` int(11) DEFAULT NULL COMMENT 'su idioma de preferencia', + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL COMMENT 'app_array.type=profile: user,maintenaince,system', + `tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user` */ + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user_array` */ + +/*Table structure for table `django_admin_log` */ + +DROP TABLE IF EXISTS `django_admin_log`; + +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; + +/*Data for the table `django_admin_log` */ + +insert into `django_admin_log`(`id`,`action_time`,`object_id`,`object_repr`,`action_flag`,`change_message`,`content_type_id`,`user_id`) values (1,'2019-04-21 12:16:56.931203','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(2,'2019-04-21 13:31:10.864223','4','AppArray object (4)',1,'[{\"added\": {}}]',7,1),(3,'2019-04-21 13:31:35.941650','4','AppArray object (4)',2,'[]',7,1),(4,'2019-04-21 14:27:29.654207','5','AppArray object (5)',1,'[{\"added\": {}}]',7,1),(5,'2019-04-21 14:35:55.294048','3','AppArray object (3)',3,'',7,1),(6,'2019-04-21 15:38:46.951009','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(7,'2019-04-21 15:39:55.336796','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(8,'2019-04-21 15:40:25.602301','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(9,'2019-04-21 15:40:48.714448','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(10,'2019-04-21 15:40:51.198738','15','AppArray object (15)',1,'[{\"added\": {}}]',7,1),(11,'2019-04-21 15:42:33.196306','16','AppArray object (16)',1,'[{\"added\": {}}]',7,1),(12,'2019-04-21 15:43:10.163156','17','AppArray object (17)',1,'[{\"added\": {}}]',7,1),(13,'2019-04-21 15:43:12.816046','18','AppArray object (18)',1,'[{\"added\": {}}]',7,1),(14,'2019-04-28 11:37:32.258253','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1); + +/*Table structure for table `django_content_type` */ + +DROP TABLE IF EXISTS `django_content_type`; + +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; + +/*Data for the table `django_content_type` */ + +insert into `django_content_type`(`id`,`app_label`,`model`) values (1,'admin','logentry'),(3,'auth','group'),(2,'auth','permission'),(4,'auth','user'),(5,'contenttypes','contenttype'),(6,'sessions','session'),(7,'theapp','apparray'),(8,'theapp','appexam'),(9,'theapp','appexamssentences'),(10,'theapp','appexamsusers'),(11,'theapp','appexamsusersevalh'),(12,'theapp','appexamsusersevall'),(13,'theapp','appsentence'),(14,'theapp','appsentenceimages'),(15,'theapp','appsentencesusers'),(16,'theapp','appsentencetags'),(17,'theapp','appsentencetimes'),(18,'theapp','appsentencetr'),(19,'theapp','apptag'),(20,'theapp','baselanguage'),(21,'theapp','baselanguagelang'),(22,'theapp','baseuser'),(23,'theapp','baseuserarray'),(24,'theapp','template'),(25,'theapp','templatearray'),(26,'theapp','versiondb'); + +/*Table structure for table `django_migrations` */ + +DROP TABLE IF EXISTS `django_migrations`; + +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; + +/*Data for the table `django_migrations` */ + +insert into `django_migrations`(`id`,`app`,`name`,`applied`) values (1,'contenttypes','0001_initial','2019-04-20 20:37:05.587588'),(2,'auth','0001_initial','2019-04-20 20:37:05.756875'),(3,'admin','0001_initial','2019-04-20 20:37:06.204744'),(4,'admin','0002_logentry_remove_auto_add','2019-04-20 20:37:06.305296'),(5,'admin','0003_logentry_add_action_flag_choices','2019-04-20 20:37:06.320956'),(6,'contenttypes','0002_remove_content_type_name','2019-04-20 20:37:06.421538'),(7,'auth','0002_alter_permission_name_max_length','2019-04-20 20:37:06.474895'),(8,'auth','0003_alter_user_email_max_length','2019-04-20 20:37:06.543529'),(9,'auth','0004_alter_user_username_opts','2019-04-20 20:37:06.543529'),(10,'auth','0005_alter_user_last_login_null','2019-04-20 20:37:06.590489'),(11,'auth','0006_require_contenttypes_0002','2019-04-20 20:37:06.590489'),(12,'auth','0007_alter_validators_add_error_messages','2019-04-20 20:37:06.606053'),(13,'auth','0008_alter_user_username_max_length','2019-04-20 20:37:06.643853'),(14,'auth','0009_alter_user_last_name_max_length','2019-04-20 20:37:06.728465'),(15,'auth','0010_alter_group_name_max_length','2019-04-20 20:37:06.806829'),(16,'auth','0011_update_proxy_permissions','2019-04-20 20:37:06.806829'),(17,'sessions','0001_initial','2019-04-20 20:37:06.828507'),(18,'theapp','0001_initial','2019-04-20 20:37:06.875415'); + +/*Table structure for table `django_session` */ + +DROP TABLE IF EXISTS `django_session`; + +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `django_session` */ + +insert into `django_session`(`session_key`,`session_data`,`expire_date`) values ('2jghde97bd66bm2y8jhnpz3rnuflgovs','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-06 19:51:46.589978'),('ucu7f6e98otkflunmx78gu0wmfdvl3v8','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-05 12:08:18.407290'); + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/*Data for the table `version_db` */ + +insert into `version_db`(`id`,`date`,`version`,`description`) values (1,'20190420162500','1.0.0','definicion'); + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/db/db_learnlang_2.0.3.sql b/apirest/db/db_learnlang_2.0.3.sql new file mode 100644 index 00000000..23119877 --- /dev/null +++ b/apirest/db/db_learnlang_2.0.3.sql @@ -0,0 +1,928 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template` */ + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template_array` */ + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8; + +/*Data for the table `app_array` */ + +insert into `app_array`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`type`,`module`,`id_tosave`,`description`,`order_by`,`code_cache`) values (NULL,'1','3','20190503172713','3','3','20190503202200',NULL,NULL,NULL,'u',NULL,'1',NULL,1,NULL,'generic','global',NULL,'pepito perz',100,'ed4e1ad0-6db7-11e9-ba75-74e5f9c5ea17'),(NULL,'2','3','20190503194455','3','3','20190503202200',NULL,NULL,NULL,'u',NULL,'1',NULL,2,NULL,'generic','global',NULL,'pepito',100,'297648ba-6dcb-11e9-95fe-74e5f9c5ea17'),(NULL,'1','3','20190503195952','1','3','20190503200805',NULL,NULL,NULL,'u',NULL,'1',NULL,3,NULL,'generic','global',NULL,'oioipioip',100,'401d7cac-6dcd-11e9-84c2-74e5f9c5ea17'),(NULL,'3','3','20190503200128','3','3','20190503200817','2','3','20190503225933','u',NULL,'0',NULL,4,NULL,'tipo','global',NULL,'nuevo activo',100,'79b8f1a4-6dcd-11e9-a26b-74e5f9c5ea17'),(NULL,'4','3','20190503202004','3','3','20190503220539',NULL,NULL,NULL,'u',NULL,'1',NULL,6,NULL,'generic','global',NULL,'nnnnn',100,'12f11de6-6dd0-11e9-9b72-74e5f9c5ea17'),(NULL,'4','3','20190503202318',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,8,NULL,'generic','global',NULL,'desactivado?',100,'86882f6c-6dd0-11e9-960c-74e5f9c5ea17'),(NULL,'1','3','20190503202346',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,9,NULL,'generic','global',NULL,'tampoco desactivado',100,'9726a8f6-6dd0-11e9-8383-74e5f9c5ea17'),(NULL,'2','3','20190503202511',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,10,NULL,'generic','global',NULL,'picklist value',100,'c9d5e926-6dd0-11e9-b4ca-74e5f9c5ea17'),(NULL,'2','3','20190503202536',NULL,NULL,NULL,'4','3','20190503225759','i',NULL,'1',NULL,11,NULL,'generic','global',NULL,'borrame softly',100,'d85dbaca-6dd0-11e9-bec9-74e5f9c5ea17'),(NULL,'2','3','20190503202806',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,12,NULL,'generic','global',NULL,'con error?',100,'31d62b62-6dd1-11e9-9917-74e5f9c5ea17'),(NULL,'1','3','20190503202858',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,13,NULL,'generic','global',NULL,'10',100,'50ff7488-6dd1-11e9-afe2-74e5f9c5ea17'),(NULL,'1','3','20190503203117',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,14,NULL,'generic','global',NULL,'54546546',100,'a404ce0a-6dd1-11e9-956f-74e5f9c5ea17'),(NULL,'1','3','20190503203143','2','3','20190503214147',NULL,NULL,NULL,'u',NULL,'1',NULL,15,NULL,'generic','global',NULL,'65454646',100,'b322149a-6dd1-11e9-9ae5-74e5f9c5ea17'),(NULL,'4','3','20190503203251','2','3','20190503215508',NULL,NULL,NULL,'u',NULL,'1',NULL,16,NULL,'generic','global',NULL,'1111444',100,'dc0e1528-6dd1-11e9-b95d-74e5f9c5ea17'),(NULL,'4','3','20190503203413','2','3','20190503204105',NULL,NULL,NULL,'u',NULL,'1',NULL,17,NULL,'generic','global',NULL,'87878979',100,'0c6fb838-6dd2-11e9-bce9-74e5f9c5ea17'),(NULL,'4','3','20190503214927',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,18,NULL,'generic','global',NULL,'555',100,'8f4d747a-6ddc-11e9-b5f4-74e5f9c5ea17'),(NULL,'4','3','20190503215635',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,19,NULL,'generic','global',NULL,'4444',100,'8e4b70f4-6ddd-11e9-a631-74e5f9c5ea17'),(NULL,'1','3','20190503215731',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,20,NULL,'generic','global',NULL,'ññññ',100,'af8d140a-6ddd-11e9-ab74-74e5f9c5ea17'),(NULL,'4','3','20190503225309',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,21,NULL,'generic','global',NULL,'uuuu',100,'754fa7ca-6de5-11e9-9412-74e5f9c5ea17'); + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `url_video` varchar(1000) DEFAULT NULL COMMENT 'video de la lección, lo ideal es hacer una tabla de lecciones por ahora lo dejo así', + `url_document` varchar(1000) DEFAULT NULL COMMENT 'link de zip o ppt de la lección', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exam` */ + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_sentences` */ + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users` */ + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evalh` */ + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evall` */ + +/*Table structure for table `app_exams_users_schedule` */ + +DROP TABLE IF EXISTS `app_exams_users_schedule`; + +CREATE TABLE `app_exams_users_schedule` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exams_users` int(11) NOT NULL COMMENT 'app_exams_users.id', + `id_level` int(11) DEFAULT NULL COMMENT 'app_array.type=10 niveles de memorizacion', + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `date_next` varchar(14) DEFAULT NULL COMMENT 'la fecha de la próxima vez', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_schedule` */ + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence` */ + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_images` */ + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tags` */ + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tr` */ + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentences_users` */ + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(50) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Data for the table `app_tag` */ + +insert into `app_tag`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`id_type`,`description`,`slug`,`order_by`,`code_cache`) values (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,1,1,'a','a',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,2,1,'about-us','about-us',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,3,1,'advertencia','advertencia',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,4,1,'b','b',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,5,1,'blog','blog',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,6,1,'c','c',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,7,1,'ceveza','cerveza',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,8,1,'cms','cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,9,1,'contacta','contacta',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,10,1,'contents','contents',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,11,1,'design','design',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,12,1,'giusi','giusi',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,13,1,'image','image',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,14,1,'la guinda','la-guinda',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,15,1,'mexico','mexico',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,16,1,'miguel angel','miguel-angel',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,17,1,'optimus prime','',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,18,1,'papiam','papiam',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,19,1,'personal','personal',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,20,1,'portafolio','portafolio',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,21,1,'primer atticulo','primer-atticulo',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,22,1,'prueba de cms','prueba-de-cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,23,1,'services','services',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,24,1,'servicos','servicos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,25,1,'shop','shop',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,26,1,'tpv.pedidos minimos','tpv-pedidos-minimos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,27,1,'transformers','transformers',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,28,1,'video','video',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,29,1,'wordpress','wordpress',100,NULL); + +/*Table structure for table `auth_group` */ + +DROP TABLE IF EXISTS `auth_group`; + +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group` */ + +/*Table structure for table `auth_group_permissions` */ + +DROP TABLE IF EXISTS `auth_group_permissions`; + +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group_permissions` */ + +/*Table structure for table `auth_permission` */ + +DROP TABLE IF EXISTS `auth_permission`; + +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_permission` */ + +insert into `auth_permission`(`id`,`name`,`content_type_id`,`codename`) values (1,'Can add log entry',1,'add_logentry'),(2,'Can change log entry',1,'change_logentry'),(3,'Can delete log entry',1,'delete_logentry'),(4,'Can view log entry',1,'view_logentry'),(5,'Can add permission',2,'add_permission'),(6,'Can change permission',2,'change_permission'),(7,'Can delete permission',2,'delete_permission'),(8,'Can view permission',2,'view_permission'),(9,'Can add group',3,'add_group'),(10,'Can change group',3,'change_group'),(11,'Can delete group',3,'delete_group'),(12,'Can view group',3,'view_group'),(13,'Can add user',4,'add_user'),(14,'Can change user',4,'change_user'),(15,'Can delete user',4,'delete_user'),(16,'Can view user',4,'view_user'),(17,'Can add content type',5,'add_contenttype'),(18,'Can change content type',5,'change_contenttype'),(19,'Can delete content type',5,'delete_contenttype'),(20,'Can view content type',5,'view_contenttype'),(21,'Can add session',6,'add_session'),(22,'Can change session',6,'change_session'),(23,'Can delete session',6,'delete_session'),(24,'Can view session',6,'view_session'),(25,'Can add app array',7,'add_apparray'),(26,'Can change app array',7,'change_apparray'),(27,'Can delete app array',7,'delete_apparray'),(28,'Can view app array',7,'view_apparray'),(29,'Can add app exam',8,'add_appexam'),(30,'Can change app exam',8,'change_appexam'),(31,'Can delete app exam',8,'delete_appexam'),(32,'Can view app exam',8,'view_appexam'),(33,'Can add app exams sentences',9,'add_appexamssentences'),(34,'Can change app exams sentences',9,'change_appexamssentences'),(35,'Can delete app exams sentences',9,'delete_appexamssentences'),(36,'Can view app exams sentences',9,'view_appexamssentences'),(37,'Can add app exams users',10,'add_appexamsusers'),(38,'Can change app exams users',10,'change_appexamsusers'),(39,'Can delete app exams users',10,'delete_appexamsusers'),(40,'Can view app exams users',10,'view_appexamsusers'),(41,'Can add app exams users evalh',11,'add_appexamsusersevalh'),(42,'Can change app exams users evalh',11,'change_appexamsusersevalh'),(43,'Can delete app exams users evalh',11,'delete_appexamsusersevalh'),(44,'Can view app exams users evalh',11,'view_appexamsusersevalh'),(45,'Can add app exams users evall',12,'add_appexamsusersevall'),(46,'Can change app exams users evall',12,'change_appexamsusersevall'),(47,'Can delete app exams users evall',12,'delete_appexamsusersevall'),(48,'Can view app exams users evall',12,'view_appexamsusersevall'),(49,'Can add app sentence',13,'add_appsentence'),(50,'Can change app sentence',13,'change_appsentence'),(51,'Can delete app sentence',13,'delete_appsentence'),(52,'Can view app sentence',13,'view_appsentence'),(53,'Can add app sentence images',14,'add_appsentenceimages'),(54,'Can change app sentence images',14,'change_appsentenceimages'),(55,'Can delete app sentence images',14,'delete_appsentenceimages'),(56,'Can view app sentence images',14,'view_appsentenceimages'),(57,'Can add app sentences users',15,'add_appsentencesusers'),(58,'Can change app sentences users',15,'change_appsentencesusers'),(59,'Can delete app sentences users',15,'delete_appsentencesusers'),(60,'Can view app sentences users',15,'view_appsentencesusers'),(61,'Can add app sentence tags',16,'add_appsentencetags'),(62,'Can change app sentence tags',16,'change_appsentencetags'),(63,'Can delete app sentence tags',16,'delete_appsentencetags'),(64,'Can view app sentence tags',16,'view_appsentencetags'),(65,'Can add app sentence times',17,'add_appsentencetimes'),(66,'Can change app sentence times',17,'change_appsentencetimes'),(67,'Can delete app sentence times',17,'delete_appsentencetimes'),(68,'Can view app sentence times',17,'view_appsentencetimes'),(69,'Can add app sentence tr',18,'add_appsentencetr'),(70,'Can change app sentence tr',18,'change_appsentencetr'),(71,'Can delete app sentence tr',18,'delete_appsentencetr'),(72,'Can view app sentence tr',18,'view_appsentencetr'),(73,'Can add app tag',19,'add_apptag'),(74,'Can change app tag',19,'change_apptag'),(75,'Can delete app tag',19,'delete_apptag'),(76,'Can view app tag',19,'view_apptag'),(77,'Can add base language',20,'add_baselanguage'),(78,'Can change base language',20,'change_baselanguage'),(79,'Can delete base language',20,'delete_baselanguage'),(80,'Can view base language',20,'view_baselanguage'),(81,'Can add base language lang',21,'add_baselanguagelang'),(82,'Can change base language lang',21,'change_baselanguagelang'),(83,'Can delete base language lang',21,'delete_baselanguagelang'),(84,'Can view base language lang',21,'view_baselanguagelang'),(85,'Can add base user',22,'add_baseuser'),(86,'Can change base user',22,'change_baseuser'),(87,'Can delete base user',22,'delete_baseuser'),(88,'Can view base user',22,'view_baseuser'),(89,'Can add base user array',23,'add_baseuserarray'),(90,'Can change base user array',23,'change_baseuserarray'),(91,'Can delete base user array',23,'delete_baseuserarray'),(92,'Can view base user array',23,'view_baseuserarray'),(93,'Can add template',24,'add_template'),(94,'Can change template',24,'change_template'),(95,'Can delete template',24,'delete_template'),(96,'Can view template',24,'view_template'),(97,'Can add template array',25,'add_templatearray'),(98,'Can change template array',25,'change_templatearray'),(99,'Can delete template array',25,'delete_templatearray'),(100,'Can view template array',25,'view_templatearray'),(101,'Can add version db',26,'add_versiondb'),(102,'Can change version db',26,'change_versiondb'),(103,'Can delete version db',26,'delete_versiondb'),(104,'Can view version db',26,'view_versiondb'); + +/*Table structure for table `auth_user` */ + +DROP TABLE IF EXISTS `auth_user`; + +CREATE TABLE `auth_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user` */ + +insert into `auth_user`(`id`,`password`,`last_login`,`is_superuser`,`username`,`first_name`,`last_name`,`email`,`is_staff`,`is_active`,`date_joined`) values (1,'pbkdf2_sha256$150000$kK228PsfZrvK$R4AJZ8eYfZaR6A/DInDuenmo60ruKhUh/PT4FqXo5Tw=','2019-05-05 10:52:42.735207',1,'sa','','','sa@theframework.es',1,1,'2019-04-20 22:13:58.619448'),(2,'pbkdf2_sha256$150000$aWLw4dA2SH9V$g3nWr7rsH3Oo7IpqZWiA0wUmLoVrp/xfWyXBTF0VbsE=',NULL,1,'sa2','','','sa2@tfw.es',1,1,'2019-04-28 13:59:16.096768'),(3,'pbkdf2_sha256$150000$U394Fhz3vsWm$hirfJR89ZoMW0DzTTLu0YGA5gko9TSbuhd4oFjcvErA=','2019-04-28 18:57:09.310258',1,'sa3','','','sa3@tfw.es',1,1,'2019-04-28 14:21:05.951416'); + +/*Table structure for table `auth_user_groups` */ + +DROP TABLE IF EXISTS `auth_user_groups`; + +CREATE TABLE `auth_user_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_groups` */ + +/*Table structure for table `auth_user_user_permissions` */ + +DROP TABLE IF EXISTS `auth_user_user_permissions`; + +CREATE TABLE `auth_user_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_user_permissions` */ + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `base_language` */ + +insert into `base_language`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`id_tosave`,`description`,`code_iso`,`order_by`,`code_cache`) values (NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,1,'english','english','ENGLISH','en',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,2,'spanish','spanish','SPANISH','es',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,3,'dutch','dutch','DUTCH','nl',100,NULL),(NULL,'1','1','20140825073501','3','1','20170114120045',NULL,NULL,NULL,NULL,'0','1',NULL,4,'papiaments','papiaments','PAPIAMENTS','pap',100,NULL); + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_language_lang` */ + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_country` int(11) DEFAULT NULL COMMENT 'app_array.type=country', + `id_language` int(11) DEFAULT NULL COMMENT 'su idioma de preferencia', + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL COMMENT 'app_array.type=profile: user,maintenaince,system', + `tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user` */ + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user_array` */ + +/*Table structure for table `django_admin_log` */ + +DROP TABLE IF EXISTS `django_admin_log`; + +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8; + +/*Data for the table `django_admin_log` */ + +insert into `django_admin_log`(`id`,`action_time`,`object_id`,`object_repr`,`action_flag`,`change_message`,`content_type_id`,`user_id`) values (1,'2019-04-21 12:16:56.931203','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(2,'2019-04-21 13:31:10.864223','4','AppArray object (4)',1,'[{\"added\": {}}]',7,1),(3,'2019-04-21 13:31:35.941650','4','AppArray object (4)',2,'[]',7,1),(4,'2019-04-21 14:27:29.654207','5','AppArray object (5)',1,'[{\"added\": {}}]',7,1),(5,'2019-04-21 14:35:55.294048','3','AppArray object (3)',3,'',7,1),(6,'2019-04-21 15:38:46.951009','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(7,'2019-04-21 15:39:55.336796','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(8,'2019-04-21 15:40:25.602301','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(9,'2019-04-21 15:40:48.714448','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(10,'2019-04-21 15:40:51.198738','15','AppArray object (15)',1,'[{\"added\": {}}]',7,1),(11,'2019-04-21 15:42:33.196306','16','AppArray object (16)',1,'[{\"added\": {}}]',7,1),(12,'2019-04-21 15:43:10.163156','17','AppArray object (17)',1,'[{\"added\": {}}]',7,1),(13,'2019-04-21 15:43:12.816046','18','AppArray object (18)',1,'[{\"added\": {}}]',7,1),(14,'2019-04-28 11:37:32.258253','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(15,'2019-04-28 14:24:01.239546','5','AppArray object (5)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(16,'2019-04-28 14:30:02.797792','6','AppArray object (6)',1,'[{\"added\": {}}]',7,1),(17,'2019-04-28 16:15:08.088934','7','AppArray object (7)',1,'[{\"added\": {}}]',7,1),(18,'2019-04-28 16:26:36.431281','5','AppArray object (5)',2,'[]',7,1),(19,'2019-04-28 16:31:58.243713','5','AppArray object (5)',2,'[]',7,1),(20,'2019-04-28 16:52:10.273238','4','AppArray object (4)',2,'[]',7,1),(21,'2019-04-28 16:55:16.859724','8','AppArray object (8)',1,'[{\"added\": {}}]',7,1),(22,'2019-04-28 16:57:38.619870','9','AppArray object (9)',1,'[{\"added\": {}}]',7,1),(23,'2019-04-28 16:57:45.512806','10','AppArray object (10)',1,'[{\"added\": {}}]',7,1),(24,'2019-04-28 16:58:06.995590','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(25,'2019-04-28 16:59:12.286986','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(26,'2019-04-28 17:00:15.749673','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(27,'2019-04-28 17:01:11.313475','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(28,'2019-04-28 17:01:38.048276','14','AppArray object (14)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(29,'2019-04-28 17:02:21.882240','11','AppArray object (11)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(30,'2019-04-28 17:04:11.232210','7','AppArray object (7)',2,'[{\"changed\": {\"fields\": [\"type\", \"description\"]}}]',7,1),(31,'2019-04-28 17:06:32.629583','1','AppArray object (1)',1,'[{\"added\": {}}]',7,1),(32,'2019-05-02 17:18:33.933193','1','bbb (1)',2,'[]',7,3),(33,'2019-05-02 17:18:38.657851','1','lkjkkjkl (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(34,'2019-05-02 17:18:43.113577','2','55kklñlkkñ (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(35,'2019-05-02 17:19:17.333303','1','jkdfsjal (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(36,'2019-05-02 17:19:23.580416','2','55kklñlkkñ (2)',2,'[{\"changed\": {\"fields\": [\"order_by\"]}}]',7,3),(37,'2019-05-02 17:19:49.061715','1','jkdfsjal11 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(38,'2019-05-02 17:20:13.963053','1','jkdfsjal11222 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(39,'2019-05-02 17:20:29.840820','2','5555 (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(40,'2019-05-02 17:20:34.063966','3','7878 (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(41,'2019-05-02 17:22:22.240330','1','jjdkjksfl (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(42,'2019-05-02 17:22:22.259279','2','jkjkljdfkl (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(43,'2019-05-02 17:22:22.278265','3','kjlkjkl (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(44,'2019-05-02 17:22:36.682385','1','jjdkjksfl (1)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(45,'2019-05-02 17:24:09.995123','1','jjhhhh (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(46,'2019-05-02 17:24:14.666728','1','jjjjjjjjjj (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(47,'2019-05-02 17:25:11.217589','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(48,'2019-05-02 17:25:11.329023','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(49,'2019-05-02 17:26:29.765337','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(50,'2019-05-02 17:28:34.766625','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(51,'2019-05-02 17:30:09.787638','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(52,'2019-05-02 17:30:15.113888','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(53,'2019-05-02 17:30:15.221771','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(54,'2019-05-02 17:30:30.155829','2','dsafjshdj (2)',2,'[]',7,3),(55,'2019-05-02 17:32:35.634688','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(56,'2019-05-02 18:07:31.550083','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[]',7,3),(57,'2019-05-02 18:07:47.872632','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(58,'2019-05-02 18:07:48.007211','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(59,'2019-05-02 18:07:48.129009','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(60,'2019-05-03 14:54:23.529177','1','some desc (1)',1,'[{\"added\": {}}]',7,3),(61,'2019-05-03 15:14:51.325762','1','1122333 (1)',1,'[{\"added\": {}}]',7,3),(62,'2019-05-03 15:27:13.938244','1','pepito perz (1)',1,'[{\"added\": {}}]',7,3),(63,'2019-05-03 15:48:32.135213','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(64,'2019-05-03 16:18:25.775684','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(65,'2019-05-03 16:22:10.052354','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(66,'2019-05-03 16:24:20.707739','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(67,'2019-05-03 16:25:06.441247','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(68,'2019-05-03 17:31:22.732908','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(69,'2019-05-03 17:42:07.066420','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(70,'2019-05-03 17:43:20.170744','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(71,'2019-05-03 17:44:55.301706','2','pepito (2)',1,'[{\"added\": {}}]',7,3),(72,'2019-05-03 17:45:46.094141','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(73,'2019-05-03 17:55:32.069018','1','pepito perz (1)',2,'[]',7,3),(74,'2019-05-03 17:58:52.893484','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(75,'2019-05-03 17:59:52.303767','3','oioipioip (3)',1,'[{\"added\": {}}]',7,3),(76,'2019-05-03 18:01:28.950737','4','nuevo activo (4)',1,'[{\"added\": {}}]',7,3),(77,'2019-05-03 18:03:13.653743','5','0000 (5)',1,'[{\"added\": {}}]',7,3),(78,'2019-05-03 18:04:33.122026','5','0000 (5)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(79,'2019-05-03 18:04:47.075173','5','00klklkñkñ (5)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(80,'2019-05-03 18:07:08.783708','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(81,'2019-05-03 18:07:18.567473','2','pepito (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(82,'2019-05-03 18:07:18.589330','3','oioipioip (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(83,'2019-05-03 18:08:05.281229','3','oioipioip (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(84,'2019-05-03 18:08:17.966874','4','nuevo activo (4)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(85,'2019-05-03 18:15:56.631821','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(86,'2019-05-03 18:16:33.999408','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(87,'2019-05-03 18:20:05.003733','6','bgt (6)',1,'[{\"added\": {}}]',7,3),(88,'2019-05-03 18:20:58.602777','7','no enabled (7)',1,'[{\"added\": {}}]',7,3),(89,'2019-05-03 18:21:13.488068','7','no enabled (7)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(90,'2019-05-03 18:22:00.491402','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(91,'2019-05-03 18:22:00.526301','2','pepito (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(92,'2019-05-03 18:22:20.780705','5','00klklkñkñ (5)',3,'',7,3),(93,'2019-05-03 18:22:20.790729','7','no enabled (7)',3,'',7,3),(94,'2019-05-03 18:23:18.931762','8','desactivado? (8)',1,'[{\"added\": {}}]',7,3),(95,'2019-05-03 18:23:46.811923','9','tampoco desactivado (9)',1,'[{\"added\": {}}]',7,3),(96,'2019-05-03 18:25:11.846528','10','picklist value (10)',1,'[{\"added\": {}}]',7,3),(97,'2019-05-03 18:25:36.225434','11','borrame softly (11)',1,'[{\"added\": {}}]',7,3),(98,'2019-05-03 18:28:06.335256','12','con error? (12)',1,'[{\"added\": {}}]',7,3),(99,'2019-05-03 18:28:58.621206','13','10 (13)',1,'[{\"added\": {}}]',7,3),(100,'2019-05-03 18:31:17.901121','14','54546546 (14)',1,'[{\"added\": {}}]',7,3),(101,'2019-05-03 18:31:43.256137','15','65454646 (15)',1,'[{\"added\": {}}]',7,3),(102,'2019-05-03 18:32:12.135608','15','65454646 (15)',2,'[]',7,3),(103,'2019-05-03 18:32:51.915322','16','1111 (16)',1,'[{\"added\": {}}]',7,3),(104,'2019-05-03 18:34:13.098801','17','87878979 (17)',1,'[{\"added\": {}}]',7,3),(105,'2019-05-03 18:39:34.673573','17','87878979 (17)',2,'[]',7,3),(106,'2019-05-03 18:41:05.368401','17','87878979 (17)',2,'[]',7,3),(107,'2019-05-03 19:41:47.701128','15','65454646 (15)',2,'[]',7,3),(108,'2019-05-03 19:49:27.617126','18','555 (18)',1,'[{\"added\": {}}]',7,3),(109,'2019-05-03 19:55:08.100168','16','1111444 (16)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(110,'2019-05-03 19:56:35.413963','19','4444 (19)',1,'[{\"added\": {}}]',7,3),(111,'2019-05-03 19:57:31.208897','20','ññññ (20)',1,'[{\"added\": {}}]',7,3),(112,'2019-05-03 20:05:39.584030','6','nnnnn (6)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(113,'2019-05-03 20:53:09.472375','21','uuuu (21)',1,'[{\"added\": {}}]',7,3); + +/*Table structure for table `django_content_type` */ + +DROP TABLE IF EXISTS `django_content_type`; + +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; + +/*Data for the table `django_content_type` */ + +insert into `django_content_type`(`id`,`app_label`,`model`) values (1,'admin','logentry'),(3,'auth','group'),(2,'auth','permission'),(4,'auth','user'),(5,'contenttypes','contenttype'),(6,'sessions','session'),(7,'theapp','apparray'),(8,'theapp','appexam'),(9,'theapp','appexamssentences'),(10,'theapp','appexamsusers'),(11,'theapp','appexamsusersevalh'),(12,'theapp','appexamsusersevall'),(13,'theapp','appsentence'),(14,'theapp','appsentenceimages'),(15,'theapp','appsentencesusers'),(16,'theapp','appsentencetags'),(17,'theapp','appsentencetimes'),(18,'theapp','appsentencetr'),(19,'theapp','apptag'),(20,'theapp','baselanguage'),(21,'theapp','baselanguagelang'),(22,'theapp','baseuser'),(23,'theapp','baseuserarray'),(24,'theapp','template'),(25,'theapp','templatearray'),(26,'theapp','versiondb'); + +/*Table structure for table `django_migrations` */ + +DROP TABLE IF EXISTS `django_migrations`; + +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; + +/*Data for the table `django_migrations` */ + +insert into `django_migrations`(`id`,`app`,`name`,`applied`) values (1,'contenttypes','0001_initial','2019-04-20 20:37:05.587588'),(2,'auth','0001_initial','2019-04-20 20:37:05.756875'),(3,'admin','0001_initial','2019-04-20 20:37:06.204744'),(4,'admin','0002_logentry_remove_auto_add','2019-04-20 20:37:06.305296'),(5,'admin','0003_logentry_add_action_flag_choices','2019-04-20 20:37:06.320956'),(6,'contenttypes','0002_remove_content_type_name','2019-04-20 20:37:06.421538'),(7,'auth','0002_alter_permission_name_max_length','2019-04-20 20:37:06.474895'),(8,'auth','0003_alter_user_email_max_length','2019-04-20 20:37:06.543529'),(9,'auth','0004_alter_user_username_opts','2019-04-20 20:37:06.543529'),(10,'auth','0005_alter_user_last_login_null','2019-04-20 20:37:06.590489'),(11,'auth','0006_require_contenttypes_0002','2019-04-20 20:37:06.590489'),(12,'auth','0007_alter_validators_add_error_messages','2019-04-20 20:37:06.606053'),(13,'auth','0008_alter_user_username_max_length','2019-04-20 20:37:06.643853'),(14,'auth','0009_alter_user_last_name_max_length','2019-04-20 20:37:06.728465'),(15,'auth','0010_alter_group_name_max_length','2019-04-20 20:37:06.806829'),(16,'auth','0011_update_proxy_permissions','2019-04-20 20:37:06.806829'),(17,'sessions','0001_initial','2019-04-20 20:37:06.828507'),(18,'theapp','0001_initial','2019-04-20 20:37:06.875415'); + +/*Table structure for table `django_session` */ + +DROP TABLE IF EXISTS `django_session`; + +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `django_session` */ + +insert into `django_session`(`session_key`,`session_data`,`expire_date`) values ('5bfn7ub2qj8vxxvrehz235q0zx4i8di8','ZWYwZjgxNDNmNDcyZGM5NzcwMTM3OWRiYjAxMTgyNjk0YjI0ODNkNDp7Il9hdXRoX3VzZXJfaWQiOiIzIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI1MDFmOWI3YmYxN2M2OGExMTBhODQxMWU2NmU2MzgxNjM5NWRkMjg4In0=','2019-05-12 18:57:09.333293'),('ucu7f6e98otkflunmx78gu0wmfdvl3v8','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-05 12:08:18.407290'),('viu61onusln6rlgow3esgj3q1j93qanu','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-19 10:52:42.782353'); + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; + +/*Data for the table `version_db` */ + +insert into `version_db`(`id`,`date`,`version`,`description`) values (1,'20190420162500','1.0.0','definicion'),(2,'20190409211700','1.0.1','cambio estructura de tablas'); + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/db/db_learnlang_2.0.4.sql b/apirest/db/db_learnlang_2.0.4.sql new file mode 100644 index 00000000..0474abcb --- /dev/null +++ b/apirest/db/db_learnlang_2.0.4.sql @@ -0,0 +1,929 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template` */ + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template_array` */ + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8; + +/*Data for the table `app_array` */ + +insert into `app_array`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`type`,`module`,`id_tosave`,`description`,`order_by`,`code_cache`) values (NULL,'1','3','20190503172713','3','3','20190503202200',NULL,NULL,NULL,'u',NULL,'1',NULL,1,NULL,'generic','global',NULL,'pepito perz',100,'ed4e1ad0-6db7-11e9-ba75-74e5f9c5ea17'),(NULL,'2','3','20190503194455','3','3','20190503202200',NULL,NULL,NULL,'u',NULL,'1',NULL,2,NULL,'generic','global',NULL,'pepito',100,'297648ba-6dcb-11e9-95fe-74e5f9c5ea17'),(NULL,'1','3','20190503195952','1','3','20190503200805',NULL,NULL,NULL,'u',NULL,'1',NULL,3,NULL,'generic','global',NULL,'oioipioip',100,'401d7cac-6dcd-11e9-84c2-74e5f9c5ea17'),(NULL,'3','3','20190503200128','3','3','20190503200817','2','3','20190503225933','u',NULL,'0',NULL,4,NULL,'tipo','global',NULL,'nuevo activo',100,'79b8f1a4-6dcd-11e9-a26b-74e5f9c5ea17'),(NULL,'4','3','20190503202004','3','3','20190503220539',NULL,NULL,NULL,'u',NULL,'1',NULL,6,NULL,'generic','global',NULL,'nnnnn',100,'12f11de6-6dd0-11e9-9b72-74e5f9c5ea17'),(NULL,'4','3','20190503202318',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,8,NULL,'generic','global',NULL,'desactivado?',100,'86882f6c-6dd0-11e9-960c-74e5f9c5ea17'),(NULL,'1','3','20190503202346',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,9,NULL,'generic','global',NULL,'tampoco desactivado',100,'9726a8f6-6dd0-11e9-8383-74e5f9c5ea17'),(NULL,'2','3','20190503202511',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,10,NULL,'generic','global',NULL,'picklist value',100,'c9d5e926-6dd0-11e9-b4ca-74e5f9c5ea17'),(NULL,'2','3','20190503202536',NULL,NULL,NULL,'4','3','20190503225759','i',NULL,'1',NULL,11,NULL,'generic','global',NULL,'borrame softly',100,'d85dbaca-6dd0-11e9-bec9-74e5f9c5ea17'),(NULL,'2','3','20190503202806',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,12,NULL,'generic','global',NULL,'con error?',100,'31d62b62-6dd1-11e9-9917-74e5f9c5ea17'),(NULL,'1','3','20190503202858',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,13,NULL,'generic','global',NULL,'10',100,'50ff7488-6dd1-11e9-afe2-74e5f9c5ea17'),(NULL,'1','3','20190503203117',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,14,NULL,'generic','global',NULL,'54546546',100,'a404ce0a-6dd1-11e9-956f-74e5f9c5ea17'),(NULL,'1','3','20190503203143','2','3','20190503214147',NULL,NULL,NULL,'u',NULL,'1',NULL,15,NULL,'generic','global',NULL,'65454646',100,'b322149a-6dd1-11e9-9ae5-74e5f9c5ea17'),(NULL,'4','3','20190503203251','2','3','20190503215508',NULL,NULL,NULL,'u',NULL,'1',NULL,16,NULL,'generic','global',NULL,'1111444',100,'dc0e1528-6dd1-11e9-b95d-74e5f9c5ea17'),(NULL,'4','3','20190503203413','2','3','20190503204105',NULL,NULL,NULL,'u',NULL,'1',NULL,17,NULL,'generic','global',NULL,'87878979',100,'0c6fb838-6dd2-11e9-bce9-74e5f9c5ea17'),(NULL,'4','3','20190503214927',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,18,NULL,'generic','global',NULL,'555',100,'8f4d747a-6ddc-11e9-b5f4-74e5f9c5ea17'),(NULL,'4','3','20190503215635',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,19,NULL,'generic','global',NULL,'4444',100,'8e4b70f4-6ddd-11e9-a631-74e5f9c5ea17'),(NULL,'1','3','20190503215731',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,20,NULL,'generic','global',NULL,'ññññ',100,'af8d140a-6ddd-11e9-ab74-74e5f9c5ea17'),(NULL,'4','3','20190503225309',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,21,NULL,'generic','global',NULL,'uuuu',100,'754fa7ca-6de5-11e9-9412-74e5f9c5ea17'); + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `url_video` varchar(1000) DEFAULT NULL COMMENT 'video de la lección, lo ideal es hacer una tabla de lecciones por ahora lo dejo así', + `url_document` varchar(1000) DEFAULT NULL COMMENT 'link de zip o ppt de la lección', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exam` */ + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_sentences` */ + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users` */ + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evalh` */ + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evall` */ + +/*Table structure for table `app_exams_users_schedule` */ + +DROP TABLE IF EXISTS `app_exams_users_schedule`; + +CREATE TABLE `app_exams_users_schedule` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exams_users` int(11) NOT NULL COMMENT 'app_exams_users.id', + `id_level` int(11) DEFAULT NULL COMMENT 'app_array.type=10 niveles de memorizacion', + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `date_next` varchar(14) DEFAULT NULL COMMENT 'la fecha de la próxima vez', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_schedule` */ + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence` */ + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_images` */ + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tags` */ + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tr` */ + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentences_users` */ + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(50) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Data for the table `app_tag` */ + +insert into `app_tag`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`id_type`,`description`,`slug`,`order_by`,`code_cache`) values (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,1,1,'a','a',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,2,1,'about-us','about-us',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,3,1,'advertencia','advertencia',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,4,1,'b','b',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,5,1,'blog','blog',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,6,1,'c','c',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,7,1,'ceveza','cerveza',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,8,1,'cms','cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,9,1,'contacta','contacta',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,10,1,'contents','contents',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,11,1,'design','design',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,12,1,'giusi','giusi',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,13,1,'image','image',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,14,1,'la guinda','la-guinda',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,15,1,'mexico','mexico',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,16,1,'miguel angel','miguel-angel',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,17,1,'optimus prime','',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,18,1,'papiam','papiam',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,19,1,'personal','personal',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,20,1,'portafolio','portafolio',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,21,1,'primer atticulo','primer-atticulo',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,22,1,'prueba de cms','prueba-de-cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,23,1,'services','services',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,24,1,'servicos','servicos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,25,1,'shop','shop',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,26,1,'tpv.pedidos minimos','tpv-pedidos-minimos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,27,1,'transformers','transformers',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,28,1,'video','video',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,29,1,'wordpress','wordpress',100,NULL); + +/*Table structure for table `auth_group` */ + +DROP TABLE IF EXISTS `auth_group`; + +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group` */ + +/*Table structure for table `auth_group_permissions` */ + +DROP TABLE IF EXISTS `auth_group_permissions`; + +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group_permissions` */ + +/*Table structure for table `auth_permission` */ + +DROP TABLE IF EXISTS `auth_permission`; + +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_permission` */ + +insert into `auth_permission`(`id`,`name`,`content_type_id`,`codename`) values (1,'Can add log entry',1,'add_logentry'),(2,'Can change log entry',1,'change_logentry'),(3,'Can delete log entry',1,'delete_logentry'),(4,'Can view log entry',1,'view_logentry'),(5,'Can add permission',2,'add_permission'),(6,'Can change permission',2,'change_permission'),(7,'Can delete permission',2,'delete_permission'),(8,'Can view permission',2,'view_permission'),(9,'Can add group',3,'add_group'),(10,'Can change group',3,'change_group'),(11,'Can delete group',3,'delete_group'),(12,'Can view group',3,'view_group'),(13,'Can add user',4,'add_user'),(14,'Can change user',4,'change_user'),(15,'Can delete user',4,'delete_user'),(16,'Can view user',4,'view_user'),(17,'Can add content type',5,'add_contenttype'),(18,'Can change content type',5,'change_contenttype'),(19,'Can delete content type',5,'delete_contenttype'),(20,'Can view content type',5,'view_contenttype'),(21,'Can add session',6,'add_session'),(22,'Can change session',6,'change_session'),(23,'Can delete session',6,'delete_session'),(24,'Can view session',6,'view_session'),(25,'Can add app array',7,'add_apparray'),(26,'Can change app array',7,'change_apparray'),(27,'Can delete app array',7,'delete_apparray'),(28,'Can view app array',7,'view_apparray'),(29,'Can add app exam',8,'add_appexam'),(30,'Can change app exam',8,'change_appexam'),(31,'Can delete app exam',8,'delete_appexam'),(32,'Can view app exam',8,'view_appexam'),(33,'Can add app exams sentences',9,'add_appexamssentences'),(34,'Can change app exams sentences',9,'change_appexamssentences'),(35,'Can delete app exams sentences',9,'delete_appexamssentences'),(36,'Can view app exams sentences',9,'view_appexamssentences'),(37,'Can add app exams users',10,'add_appexamsusers'),(38,'Can change app exams users',10,'change_appexamsusers'),(39,'Can delete app exams users',10,'delete_appexamsusers'),(40,'Can view app exams users',10,'view_appexamsusers'),(41,'Can add app exams users evalh',11,'add_appexamsusersevalh'),(42,'Can change app exams users evalh',11,'change_appexamsusersevalh'),(43,'Can delete app exams users evalh',11,'delete_appexamsusersevalh'),(44,'Can view app exams users evalh',11,'view_appexamsusersevalh'),(45,'Can add app exams users evall',12,'add_appexamsusersevall'),(46,'Can change app exams users evall',12,'change_appexamsusersevall'),(47,'Can delete app exams users evall',12,'delete_appexamsusersevall'),(48,'Can view app exams users evall',12,'view_appexamsusersevall'),(49,'Can add app sentence',13,'add_appsentence'),(50,'Can change app sentence',13,'change_appsentence'),(51,'Can delete app sentence',13,'delete_appsentence'),(52,'Can view app sentence',13,'view_appsentence'),(53,'Can add app sentence images',14,'add_appsentenceimages'),(54,'Can change app sentence images',14,'change_appsentenceimages'),(55,'Can delete app sentence images',14,'delete_appsentenceimages'),(56,'Can view app sentence images',14,'view_appsentenceimages'),(57,'Can add app sentences users',15,'add_appsentencesusers'),(58,'Can change app sentences users',15,'change_appsentencesusers'),(59,'Can delete app sentences users',15,'delete_appsentencesusers'),(60,'Can view app sentences users',15,'view_appsentencesusers'),(61,'Can add app sentence tags',16,'add_appsentencetags'),(62,'Can change app sentence tags',16,'change_appsentencetags'),(63,'Can delete app sentence tags',16,'delete_appsentencetags'),(64,'Can view app sentence tags',16,'view_appsentencetags'),(65,'Can add app sentence times',17,'add_appsentencetimes'),(66,'Can change app sentence times',17,'change_appsentencetimes'),(67,'Can delete app sentence times',17,'delete_appsentencetimes'),(68,'Can view app sentence times',17,'view_appsentencetimes'),(69,'Can add app sentence tr',18,'add_appsentencetr'),(70,'Can change app sentence tr',18,'change_appsentencetr'),(71,'Can delete app sentence tr',18,'delete_appsentencetr'),(72,'Can view app sentence tr',18,'view_appsentencetr'),(73,'Can add app tag',19,'add_apptag'),(74,'Can change app tag',19,'change_apptag'),(75,'Can delete app tag',19,'delete_apptag'),(76,'Can view app tag',19,'view_apptag'),(77,'Can add base language',20,'add_baselanguage'),(78,'Can change base language',20,'change_baselanguage'),(79,'Can delete base language',20,'delete_baselanguage'),(80,'Can view base language',20,'view_baselanguage'),(81,'Can add base language lang',21,'add_baselanguagelang'),(82,'Can change base language lang',21,'change_baselanguagelang'),(83,'Can delete base language lang',21,'delete_baselanguagelang'),(84,'Can view base language lang',21,'view_baselanguagelang'),(85,'Can add base user',22,'add_baseuser'),(86,'Can change base user',22,'change_baseuser'),(87,'Can delete base user',22,'delete_baseuser'),(88,'Can view base user',22,'view_baseuser'),(89,'Can add base user array',23,'add_baseuserarray'),(90,'Can change base user array',23,'change_baseuserarray'),(91,'Can delete base user array',23,'delete_baseuserarray'),(92,'Can view base user array',23,'view_baseuserarray'),(93,'Can add template',24,'add_template'),(94,'Can change template',24,'change_template'),(95,'Can delete template',24,'delete_template'),(96,'Can view template',24,'view_template'),(97,'Can add template array',25,'add_templatearray'),(98,'Can change template array',25,'change_templatearray'),(99,'Can delete template array',25,'delete_templatearray'),(100,'Can view template array',25,'view_templatearray'),(101,'Can add version db',26,'add_versiondb'),(102,'Can change version db',26,'change_versiondb'),(103,'Can delete version db',26,'delete_versiondb'),(104,'Can view version db',26,'view_versiondb'); + +/*Table structure for table `auth_user` */ + +DROP TABLE IF EXISTS `auth_user`; + +CREATE TABLE `auth_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user` */ + +insert into `auth_user`(`id`,`password`,`last_login`,`is_superuser`,`username`,`first_name`,`last_name`,`email`,`is_staff`,`is_active`,`date_joined`) values (1,'pbkdf2_sha256$150000$kK228PsfZrvK$R4AJZ8eYfZaR6A/DInDuenmo60ruKhUh/PT4FqXo5Tw=','2019-05-05 10:52:42.735207',1,'sa','','','sa@theframework.es',1,1,'2019-04-20 22:13:58.619448'),(2,'pbkdf2_sha256$150000$aWLw4dA2SH9V$g3nWr7rsH3Oo7IpqZWiA0wUmLoVrp/xfWyXBTF0VbsE=',NULL,1,'sa2','','','sa2@tfw.es',1,1,'2019-04-28 13:59:16.096768'),(3,'pbkdf2_sha256$150000$U394Fhz3vsWm$hirfJR89ZoMW0DzTTLu0YGA5gko9TSbuhd4oFjcvErA=','2019-04-28 18:57:09.310258',1,'sa3','','','sa3@tfw.es',1,1,'2019-04-28 14:21:05.951416'); + +/*Table structure for table `auth_user_groups` */ + +DROP TABLE IF EXISTS `auth_user_groups`; + +CREATE TABLE `auth_user_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_groups` */ + +/*Table structure for table `auth_user_user_permissions` */ + +DROP TABLE IF EXISTS `auth_user_user_permissions`; + +CREATE TABLE `auth_user_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_user_permissions` */ + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `base_language` */ + +insert into `base_language`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`id_tosave`,`description`,`code_iso`,`order_by`,`code_cache`) values (NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,1,'english','english','ENGLISH','en',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,2,'spanish','spanish','SPANISH','es',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,3,'dutch','dutch','DUTCH','nl',100,NULL),(NULL,'1','1','20140825073501','3','1','20170114120045',NULL,NULL,NULL,NULL,'0','1',NULL,4,'papiaments','papiaments','PAPIAMENTS','pap',100,NULL); + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_language_lang` */ + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `id_country` int(11) DEFAULT NULL COMMENT 'app_array.type=country', + `id_language` int(11) DEFAULT NULL COMMENT 'su idioma de preferencia', + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL COMMENT 'app_array.type=profile: user,maintenaince,system', + `tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + `date_validated` varchar(14) DEFAULT NULL COMMENT 'cuando valido su cuenta por email', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user` */ + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user_array` */ + +/*Table structure for table `django_admin_log` */ + +DROP TABLE IF EXISTS `django_admin_log`; + +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8; + +/*Data for the table `django_admin_log` */ + +insert into `django_admin_log`(`id`,`action_time`,`object_id`,`object_repr`,`action_flag`,`change_message`,`content_type_id`,`user_id`) values (1,'2019-04-21 12:16:56.931203','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(2,'2019-04-21 13:31:10.864223','4','AppArray object (4)',1,'[{\"added\": {}}]',7,1),(3,'2019-04-21 13:31:35.941650','4','AppArray object (4)',2,'[]',7,1),(4,'2019-04-21 14:27:29.654207','5','AppArray object (5)',1,'[{\"added\": {}}]',7,1),(5,'2019-04-21 14:35:55.294048','3','AppArray object (3)',3,'',7,1),(6,'2019-04-21 15:38:46.951009','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(7,'2019-04-21 15:39:55.336796','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(8,'2019-04-21 15:40:25.602301','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(9,'2019-04-21 15:40:48.714448','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(10,'2019-04-21 15:40:51.198738','15','AppArray object (15)',1,'[{\"added\": {}}]',7,1),(11,'2019-04-21 15:42:33.196306','16','AppArray object (16)',1,'[{\"added\": {}}]',7,1),(12,'2019-04-21 15:43:10.163156','17','AppArray object (17)',1,'[{\"added\": {}}]',7,1),(13,'2019-04-21 15:43:12.816046','18','AppArray object (18)',1,'[{\"added\": {}}]',7,1),(14,'2019-04-28 11:37:32.258253','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(15,'2019-04-28 14:24:01.239546','5','AppArray object (5)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(16,'2019-04-28 14:30:02.797792','6','AppArray object (6)',1,'[{\"added\": {}}]',7,1),(17,'2019-04-28 16:15:08.088934','7','AppArray object (7)',1,'[{\"added\": {}}]',7,1),(18,'2019-04-28 16:26:36.431281','5','AppArray object (5)',2,'[]',7,1),(19,'2019-04-28 16:31:58.243713','5','AppArray object (5)',2,'[]',7,1),(20,'2019-04-28 16:52:10.273238','4','AppArray object (4)',2,'[]',7,1),(21,'2019-04-28 16:55:16.859724','8','AppArray object (8)',1,'[{\"added\": {}}]',7,1),(22,'2019-04-28 16:57:38.619870','9','AppArray object (9)',1,'[{\"added\": {}}]',7,1),(23,'2019-04-28 16:57:45.512806','10','AppArray object (10)',1,'[{\"added\": {}}]',7,1),(24,'2019-04-28 16:58:06.995590','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(25,'2019-04-28 16:59:12.286986','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(26,'2019-04-28 17:00:15.749673','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(27,'2019-04-28 17:01:11.313475','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(28,'2019-04-28 17:01:38.048276','14','AppArray object (14)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(29,'2019-04-28 17:02:21.882240','11','AppArray object (11)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(30,'2019-04-28 17:04:11.232210','7','AppArray object (7)',2,'[{\"changed\": {\"fields\": [\"type\", \"description\"]}}]',7,1),(31,'2019-04-28 17:06:32.629583','1','AppArray object (1)',1,'[{\"added\": {}}]',7,1),(32,'2019-05-02 17:18:33.933193','1','bbb (1)',2,'[]',7,3),(33,'2019-05-02 17:18:38.657851','1','lkjkkjkl (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(34,'2019-05-02 17:18:43.113577','2','55kklñlkkñ (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(35,'2019-05-02 17:19:17.333303','1','jkdfsjal (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(36,'2019-05-02 17:19:23.580416','2','55kklñlkkñ (2)',2,'[{\"changed\": {\"fields\": [\"order_by\"]}}]',7,3),(37,'2019-05-02 17:19:49.061715','1','jkdfsjal11 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(38,'2019-05-02 17:20:13.963053','1','jkdfsjal11222 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(39,'2019-05-02 17:20:29.840820','2','5555 (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(40,'2019-05-02 17:20:34.063966','3','7878 (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(41,'2019-05-02 17:22:22.240330','1','jjdkjksfl (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(42,'2019-05-02 17:22:22.259279','2','jkjkljdfkl (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(43,'2019-05-02 17:22:22.278265','3','kjlkjkl (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(44,'2019-05-02 17:22:36.682385','1','jjdkjksfl (1)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(45,'2019-05-02 17:24:09.995123','1','jjhhhh (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(46,'2019-05-02 17:24:14.666728','1','jjjjjjjjjj (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(47,'2019-05-02 17:25:11.217589','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(48,'2019-05-02 17:25:11.329023','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(49,'2019-05-02 17:26:29.765337','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(50,'2019-05-02 17:28:34.766625','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(51,'2019-05-02 17:30:09.787638','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(52,'2019-05-02 17:30:15.113888','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(53,'2019-05-02 17:30:15.221771','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(54,'2019-05-02 17:30:30.155829','2','dsafjshdj (2)',2,'[]',7,3),(55,'2019-05-02 17:32:35.634688','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(56,'2019-05-02 18:07:31.550083','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[]',7,3),(57,'2019-05-02 18:07:47.872632','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(58,'2019-05-02 18:07:48.007211','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(59,'2019-05-02 18:07:48.129009','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(60,'2019-05-03 14:54:23.529177','1','some desc (1)',1,'[{\"added\": {}}]',7,3),(61,'2019-05-03 15:14:51.325762','1','1122333 (1)',1,'[{\"added\": {}}]',7,3),(62,'2019-05-03 15:27:13.938244','1','pepito perz (1)',1,'[{\"added\": {}}]',7,3),(63,'2019-05-03 15:48:32.135213','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(64,'2019-05-03 16:18:25.775684','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(65,'2019-05-03 16:22:10.052354','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(66,'2019-05-03 16:24:20.707739','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(67,'2019-05-03 16:25:06.441247','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(68,'2019-05-03 17:31:22.732908','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(69,'2019-05-03 17:42:07.066420','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(70,'2019-05-03 17:43:20.170744','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(71,'2019-05-03 17:44:55.301706','2','pepito (2)',1,'[{\"added\": {}}]',7,3),(72,'2019-05-03 17:45:46.094141','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(73,'2019-05-03 17:55:32.069018','1','pepito perz (1)',2,'[]',7,3),(74,'2019-05-03 17:58:52.893484','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(75,'2019-05-03 17:59:52.303767','3','oioipioip (3)',1,'[{\"added\": {}}]',7,3),(76,'2019-05-03 18:01:28.950737','4','nuevo activo (4)',1,'[{\"added\": {}}]',7,3),(77,'2019-05-03 18:03:13.653743','5','0000 (5)',1,'[{\"added\": {}}]',7,3),(78,'2019-05-03 18:04:33.122026','5','0000 (5)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(79,'2019-05-03 18:04:47.075173','5','00klklkñkñ (5)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(80,'2019-05-03 18:07:08.783708','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(81,'2019-05-03 18:07:18.567473','2','pepito (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(82,'2019-05-03 18:07:18.589330','3','oioipioip (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(83,'2019-05-03 18:08:05.281229','3','oioipioip (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(84,'2019-05-03 18:08:17.966874','4','nuevo activo (4)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(85,'2019-05-03 18:15:56.631821','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(86,'2019-05-03 18:16:33.999408','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(87,'2019-05-03 18:20:05.003733','6','bgt (6)',1,'[{\"added\": {}}]',7,3),(88,'2019-05-03 18:20:58.602777','7','no enabled (7)',1,'[{\"added\": {}}]',7,3),(89,'2019-05-03 18:21:13.488068','7','no enabled (7)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(90,'2019-05-03 18:22:00.491402','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(91,'2019-05-03 18:22:00.526301','2','pepito (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(92,'2019-05-03 18:22:20.780705','5','00klklkñkñ (5)',3,'',7,3),(93,'2019-05-03 18:22:20.790729','7','no enabled (7)',3,'',7,3),(94,'2019-05-03 18:23:18.931762','8','desactivado? (8)',1,'[{\"added\": {}}]',7,3),(95,'2019-05-03 18:23:46.811923','9','tampoco desactivado (9)',1,'[{\"added\": {}}]',7,3),(96,'2019-05-03 18:25:11.846528','10','picklist value (10)',1,'[{\"added\": {}}]',7,3),(97,'2019-05-03 18:25:36.225434','11','borrame softly (11)',1,'[{\"added\": {}}]',7,3),(98,'2019-05-03 18:28:06.335256','12','con error? (12)',1,'[{\"added\": {}}]',7,3),(99,'2019-05-03 18:28:58.621206','13','10 (13)',1,'[{\"added\": {}}]',7,3),(100,'2019-05-03 18:31:17.901121','14','54546546 (14)',1,'[{\"added\": {}}]',7,3),(101,'2019-05-03 18:31:43.256137','15','65454646 (15)',1,'[{\"added\": {}}]',7,3),(102,'2019-05-03 18:32:12.135608','15','65454646 (15)',2,'[]',7,3),(103,'2019-05-03 18:32:51.915322','16','1111 (16)',1,'[{\"added\": {}}]',7,3),(104,'2019-05-03 18:34:13.098801','17','87878979 (17)',1,'[{\"added\": {}}]',7,3),(105,'2019-05-03 18:39:34.673573','17','87878979 (17)',2,'[]',7,3),(106,'2019-05-03 18:41:05.368401','17','87878979 (17)',2,'[]',7,3),(107,'2019-05-03 19:41:47.701128','15','65454646 (15)',2,'[]',7,3),(108,'2019-05-03 19:49:27.617126','18','555 (18)',1,'[{\"added\": {}}]',7,3),(109,'2019-05-03 19:55:08.100168','16','1111444 (16)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(110,'2019-05-03 19:56:35.413963','19','4444 (19)',1,'[{\"added\": {}}]',7,3),(111,'2019-05-03 19:57:31.208897','20','ññññ (20)',1,'[{\"added\": {}}]',7,3),(112,'2019-05-03 20:05:39.584030','6','nnnnn (6)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(113,'2019-05-03 20:53:09.472375','21','uuuu (21)',1,'[{\"added\": {}}]',7,3); + +/*Table structure for table `django_content_type` */ + +DROP TABLE IF EXISTS `django_content_type`; + +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; + +/*Data for the table `django_content_type` */ + +insert into `django_content_type`(`id`,`app_label`,`model`) values (1,'admin','logentry'),(3,'auth','group'),(2,'auth','permission'),(4,'auth','user'),(5,'contenttypes','contenttype'),(6,'sessions','session'),(7,'theapp','apparray'),(8,'theapp','appexam'),(9,'theapp','appexamssentences'),(10,'theapp','appexamsusers'),(11,'theapp','appexamsusersevalh'),(12,'theapp','appexamsusersevall'),(13,'theapp','appsentence'),(14,'theapp','appsentenceimages'),(15,'theapp','appsentencesusers'),(16,'theapp','appsentencetags'),(17,'theapp','appsentencetimes'),(18,'theapp','appsentencetr'),(19,'theapp','apptag'),(20,'theapp','baselanguage'),(21,'theapp','baselanguagelang'),(22,'theapp','baseuser'),(23,'theapp','baseuserarray'),(24,'theapp','template'),(25,'theapp','templatearray'),(26,'theapp','versiondb'); + +/*Table structure for table `django_migrations` */ + +DROP TABLE IF EXISTS `django_migrations`; + +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; + +/*Data for the table `django_migrations` */ + +insert into `django_migrations`(`id`,`app`,`name`,`applied`) values (1,'contenttypes','0001_initial','2019-04-20 20:37:05.587588'),(2,'auth','0001_initial','2019-04-20 20:37:05.756875'),(3,'admin','0001_initial','2019-04-20 20:37:06.204744'),(4,'admin','0002_logentry_remove_auto_add','2019-04-20 20:37:06.305296'),(5,'admin','0003_logentry_add_action_flag_choices','2019-04-20 20:37:06.320956'),(6,'contenttypes','0002_remove_content_type_name','2019-04-20 20:37:06.421538'),(7,'auth','0002_alter_permission_name_max_length','2019-04-20 20:37:06.474895'),(8,'auth','0003_alter_user_email_max_length','2019-04-20 20:37:06.543529'),(9,'auth','0004_alter_user_username_opts','2019-04-20 20:37:06.543529'),(10,'auth','0005_alter_user_last_login_null','2019-04-20 20:37:06.590489'),(11,'auth','0006_require_contenttypes_0002','2019-04-20 20:37:06.590489'),(12,'auth','0007_alter_validators_add_error_messages','2019-04-20 20:37:06.606053'),(13,'auth','0008_alter_user_username_max_length','2019-04-20 20:37:06.643853'),(14,'auth','0009_alter_user_last_name_max_length','2019-04-20 20:37:06.728465'),(15,'auth','0010_alter_group_name_max_length','2019-04-20 20:37:06.806829'),(16,'auth','0011_update_proxy_permissions','2019-04-20 20:37:06.806829'),(17,'sessions','0001_initial','2019-04-20 20:37:06.828507'),(18,'theapp','0001_initial','2019-04-20 20:37:06.875415'); + +/*Table structure for table `django_session` */ + +DROP TABLE IF EXISTS `django_session`; + +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `django_session` */ + +insert into `django_session`(`session_key`,`session_data`,`expire_date`) values ('5bfn7ub2qj8vxxvrehz235q0zx4i8di8','ZWYwZjgxNDNmNDcyZGM5NzcwMTM3OWRiYjAxMTgyNjk0YjI0ODNkNDp7Il9hdXRoX3VzZXJfaWQiOiIzIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI1MDFmOWI3YmYxN2M2OGExMTBhODQxMWU2NmU2MzgxNjM5NWRkMjg4In0=','2019-05-12 18:57:09.333293'),('ucu7f6e98otkflunmx78gu0wmfdvl3v8','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-05 12:08:18.407290'),('viu61onusln6rlgow3esgj3q1j93qanu','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-19 10:52:42.782353'); + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +/*Data for the table `version_db` */ + +insert into `version_db`(`id`,`date`,`version`,`description`) values (1,'20190420162500','1.0.0','definicion'),(2,'20190409211700','2.0.3','cambio estructura de tablas'),(3,'20190511202600','2.0.4','creo campo date_validated'); + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/db/db_learnlang_2.0.5.sql b/apirest/db/db_learnlang_2.0.5.sql new file mode 100644 index 00000000..b4be05e5 --- /dev/null +++ b/apirest/db/db_learnlang_2.0.5.sql @@ -0,0 +1,929 @@ +/* +SQLyog Ultimate v9.02 +MySQL - 5.5.5-10.1.35-MariaDB : Database - db_learnlang +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_learnlang` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `db_learnlang`; + +/*Table structure for table `_template` */ + +DROP TABLE IF EXISTS `_template`; + +CREATE TABLE `_template` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template` */ + +/*Table structure for table `_template_array` */ + +DROP TABLE IF EXISTS `_template_array`; + +CREATE TABLE `_template_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `_template_array` */ + +/*Table structure for table `app_array` */ + +DROP TABLE IF EXISTS `app_array`; + +CREATE TABLE `app_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT NULL, + `is_enabled` varchar(3) DEFAULT NULL, + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `module` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8; + +/*Data for the table `app_array` */ + +insert into `app_array`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`type`,`module`,`id_tosave`,`description`,`order_by`,`code_cache`) values (NULL,'4','3','20190503202004','4','3','20190518132708',NULL,NULL,NULL,'u',NULL,'1',NULL,6,NULL,'uuu','global',NULL,'nnnnn',100,'12f11de6-6dd0-11e9-9b72-74e5f9c5ea17'),(NULL,'4','3','20190503202318','4','3','20190518133231',NULL,NULL,NULL,'u',NULL,'1',NULL,8,NULL,'generic','global',NULL,'aaa',100,'86882f6c-6dd0-11e9-960c-74e5f9c5ea17'),(NULL,'1','3','20190503202346',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,9,NULL,'generic','global',NULL,'tampoco desactivado',100,'9726a8f6-6dd0-11e9-8383-74e5f9c5ea17'),(NULL,'2','3','20190503202511',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,10,NULL,'generic','global',NULL,'picklist value',100,'c9d5e926-6dd0-11e9-b4ca-74e5f9c5ea17'),(NULL,'2','3','20190503202536',NULL,NULL,NULL,'4','3','20190503225759','i',NULL,'1',NULL,11,NULL,'generic','global',NULL,'borrame softly',100,'d85dbaca-6dd0-11e9-bec9-74e5f9c5ea17'),(NULL,'2','3','20190503202806',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,12,NULL,'generic','global',NULL,'con error?',100,'31d62b62-6dd1-11e9-9917-74e5f9c5ea17'),(NULL,'1','3','20190503202858','3','3','20190518133238',NULL,NULL,NULL,'u',NULL,'1',NULL,13,NULL,'generic','global',NULL,'aaa',100,'50ff7488-6dd1-11e9-afe2-74e5f9c5ea17'),(NULL,'1','3','20190503203117',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,14,NULL,'generic','global',NULL,'54546546',100,'a404ce0a-6dd1-11e9-956f-74e5f9c5ea17'),(NULL,'1','3','20190503203143','2','3','20190503214147',NULL,NULL,NULL,'u',NULL,'1',NULL,15,NULL,'generic','global',NULL,'65454646',100,'b322149a-6dd1-11e9-9ae5-74e5f9c5ea17'),(NULL,'4','3','20190503203251','2','3','20190503215508',NULL,NULL,NULL,'u',NULL,'1',NULL,16,NULL,'generic','global',NULL,'1111444',100,'dc0e1528-6dd1-11e9-b95d-74e5f9c5ea17'),(NULL,'4','3','20190503203413','2','3','20190503204105',NULL,NULL,NULL,'u',NULL,'1',NULL,17,NULL,'generic','global',NULL,'87878979',100,'0c6fb838-6dd2-11e9-bce9-74e5f9c5ea17'),(NULL,'4','3','20190503214927',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,18,NULL,'generic','global',NULL,'555',100,'8f4d747a-6ddc-11e9-b5f4-74e5f9c5ea17'),(NULL,'4','3','20190503215635',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,19,NULL,'generic','global',NULL,'4444',100,'8e4b70f4-6ddd-11e9-a631-74e5f9c5ea17'),(NULL,'1','3','20190503215731',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,20,NULL,'generic','global',NULL,'ññññ',100,'af8d140a-6ddd-11e9-ab74-74e5f9c5ea17'),(NULL,'4','3','20190503225309',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,21,NULL,'generic','global',NULL,'uuuu',100,'754fa7ca-6de5-11e9-9412-74e5f9c5ea17'),(NULL,'2','3','20190518125611',NULL,NULL,NULL,NULL,NULL,NULL,'i',NULL,'1',NULL,22,NULL,'generic','global',NULL,'bbb',100,'8c85e79e-795b-11e9-8bf4-74e5f9c5ea17'),(NULL,'4','3','20190518132918','1','3','20190518133242',NULL,NULL,NULL,'u',NULL,'1',NULL,23,NULL,'generic','global',NULL,'aaa',100,'2cb0d3b6-7960-11e9-b36d-74e5f9c5ea17'); + +/*Table structure for table `app_exam` */ + +DROP TABLE IF EXISTS `app_exam`; + +CREATE TABLE `app_exam` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `is_shareable` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT 'solo esta disponible para el creador', + `url_video` varchar(1000) DEFAULT NULL COMMENT 'video de la lección, lo ideal es hacer una tabla de lecciones por ahora lo dejo así', + `url_document` varchar(1000) DEFAULT NULL COMMENT 'link de zip o ppt de la lección', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exam` */ + +/*Table structure for table `app_exams_sentences` */ + +DROP TABLE IF EXISTS `app_exams_sentences`; + +CREATE TABLE `app_exams_sentences` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_sentences` */ + +/*Table structure for table `app_exams_users` */ + +DROP TABLE IF EXISTS `app_exams_users`; + +CREATE TABLE `app_exams_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_exam` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users` */ + +/*Table structure for table `app_exams_users_evalh` */ + +DROP TABLE IF EXISTS `app_exams_users_evalh`; + +CREATE TABLE `app_exams_users_evalh` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exam_user` int(11) NOT NULL, + `eval_date` varchar(14) DEFAULT NULL COMMENT 'fecha de la evaluacion', + `is_finished` tinyint(4) DEFAULT '0', + `is_timeup` tinyint(4) DEFAULT '0', + `rate_percent` decimal(8,3) DEFAULT NULL COMMENT 'el porcentaje 10/20', + `id_type` int(11) DEFAULT NULL COMMENT 'si es tipo prueba o cuenta para nota', + `owner_notes` varchar(250) DEFAULT NULL COMMENT 'notas del profesor', + `pupil_notes` varchar(250) DEFAULT NULL COMMENT 'notas del examinado', + `owner_rate` decimal(8,3) DEFAULT NULL COMMENT 'la nota final que pone el profesor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evalh` */ + +/*Table structure for table `app_exams_users_evall` */ + +DROP TABLE IF EXISTS `app_exams_users_evall`; + +CREATE TABLE `app_exams_users_evall` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_evalh` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `id_langfrom` int(11) DEFAULT NULL COMMENT 'la frase en el idioma explicito', + `id_langto` int(11) DEFAULT NULL COMMENT 'la frase en el idioma a evaluar', + `is_write` tinyint(4) DEFAULT NULL COMMENT 'se evalua la escritura', + `is_listen` tinyint(4) DEFAULT NULL COMMENT 'auditiva', + `is_image` tinyint(4) DEFAULT NULL COMMENT 'visual', + `is_spoken` tinyint(4) DEFAULT NULL COMMENT 'hablada - TO-DO machine learning', + `i_result` tinyint(4) DEFAULT NULL COMMENT '0:fail,1:ok,null:not done', + `i_time` int(11) DEFAULT NULL COMMENT 'tiempo en contestar, serviara para sugerir practicar', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_evall` */ + +/*Table structure for table `app_exams_users_schedule` */ + +DROP TABLE IF EXISTS `app_exams_users_schedule`; + +CREATE TABLE `app_exams_users_schedule` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_exams_users` int(11) NOT NULL COMMENT 'app_exams_users.id', + `id_level` int(11) DEFAULT NULL COMMENT 'app_array.type=10 niveles de memorizacion', + `date_checked` varchar(14) DEFAULT NULL COMMENT 'la última vez que se interactuó con el ', + `date_next` varchar(14) DEFAULT NULL COMMENT 'la fecha de la próxima vez', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_exams_users_schedule` */ + +/*Table structure for table `app_sentence` */ + +DROP TABLE IF EXISTS `app_sentence`; + +CREATE TABLE `app_sentence` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `text_orig` varchar(500) DEFAULT NULL COMMENT 'texto original', + `path_audio` varchar(500) DEFAULT NULL COMMENT 'ruta del audio asociado', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para el audio que no esta en el servidor', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `is_notificable` tinyint(4) DEFAULT NULL COMMENT 'indica si se tomará en cuenta para examen', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence` */ + +/*Table structure for table `app_sentence_images` */ + +DROP TABLE IF EXISTS `app_sentence_images`; + +CREATE TABLE `app_sentence_images` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `id_sentence` int(11) NOT NULL COMMENT 'base_language.id', + `path_local` varchar(500) DEFAULT NULL COMMENT 'si se ha guardado en el servidor', + `url_resource` varchar(500) DEFAULT NULL COMMENT 'url para evitar de guardar en el servidor', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_images` */ + +/*Table structure for table `app_sentence_tags` */ + +DROP TABLE IF EXISTS `app_sentence_tags`; + +CREATE TABLE `app_sentence_tags` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_sentence` int(11) NOT NULL, + `id_tag` int(11) NOT NULL, + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tags` */ + +/*Table structure for table `app_sentence_tr` */ + +DROP TABLE IF EXISTS `app_sentence_tr`; + +CREATE TABLE `app_sentence_tr` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `text_tr` varchar(500) DEFAULT NULL COMMENT 'texto traducido', + `id_language` int(11) DEFAULT NULL COMMENT 'base_language.id', + `id_sentence` int(11) DEFAULT NULL COMMENT 'app_sentence.id', + `code_cache` varchar(500) DEFAULT NULL COMMENT 'codigo hash en nosql', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentence_tr` */ + +/*Table structure for table `app_sentences_users` */ + +DROP TABLE IF EXISTS `app_sentences_users`; + +CREATE TABLE `app_sentences_users` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_user` int(11) NOT NULL, + `id_sentence` int(11) NOT NULL, + `is_notificable` tinyint(4) DEFAULT '0' COMMENT 'si se notificara para examen', + `is_owner` tinyint(4) DEFAULT '1' COMMENT 'si es propietario del texto', + `is_read` tinyint(4) DEFAULT '1' COMMENT 'si puede leer', + `is_write` tinyint(4) DEFAULT '1' COMMENT 'si puede cambiarlo', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `app_sentences_users` */ + +/*Table structure for table `app_tag` */ + +DROP TABLE IF EXISTS `app_tag`; + +CREATE TABLE `app_tag` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT NULL, + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_type` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `slug` varchar(100) DEFAULT NULL COMMENT 'la descripcion en slug', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; + +/*Data for the table `app_tag` */ + +insert into `app_tag`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`id_type`,`description`,`slug`,`order_by`,`code_cache`) values (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,1,1,'a','a',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,2,1,'about-us','about-us',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,3,1,'advertencia','advertencia',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,4,1,'b','b',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,5,1,'blog','blog',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,6,1,'c','c',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,7,1,'ceveza','cerveza',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,8,1,'cms','cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,9,1,'contacta','contacta',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,10,1,'contents','contents',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,11,1,'design','design',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,12,1,'giusi','giusi',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,13,1,'image','image',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,14,1,'la guinda','la-guinda',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,15,1,'mexico','mexico',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,16,1,'miguel angel','miguel-angel',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,17,1,'optimus prime','',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,18,1,'papiam','papiam',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,19,1,'personal','personal',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,20,1,'portafolio','portafolio',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,21,1,'primer atticulo','primer-atticulo',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,22,1,'prueba de cms','prueba-de-cms',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,23,1,'services','services',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,24,1,'servicos','servicos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,25,1,'shop','shop',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,26,1,'tpv.pedidos minimos','tpv-pedidos-minimos',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,27,1,'transformers','transformers',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,28,1,'video','video',100,NULL),(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'0','1',NULL,29,1,'wordpress','wordpress',100,NULL); + +/*Table structure for table `auth_group` */ + +DROP TABLE IF EXISTS `auth_group`; + +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group` */ + +/*Table structure for table `auth_group_permissions` */ + +DROP TABLE IF EXISTS `auth_group_permissions`; + +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_group_permissions` */ + +/*Table structure for table `auth_permission` */ + +DROP TABLE IF EXISTS `auth_permission`; + +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_permission` */ + +insert into `auth_permission`(`id`,`name`,`content_type_id`,`codename`) values (1,'Can add log entry',1,'add_logentry'),(2,'Can change log entry',1,'change_logentry'),(3,'Can delete log entry',1,'delete_logentry'),(4,'Can view log entry',1,'view_logentry'),(5,'Can add permission',2,'add_permission'),(6,'Can change permission',2,'change_permission'),(7,'Can delete permission',2,'delete_permission'),(8,'Can view permission',2,'view_permission'),(9,'Can add group',3,'add_group'),(10,'Can change group',3,'change_group'),(11,'Can delete group',3,'delete_group'),(12,'Can view group',3,'view_group'),(13,'Can add user',4,'add_user'),(14,'Can change user',4,'change_user'),(15,'Can delete user',4,'delete_user'),(16,'Can view user',4,'view_user'),(17,'Can add content type',5,'add_contenttype'),(18,'Can change content type',5,'change_contenttype'),(19,'Can delete content type',5,'delete_contenttype'),(20,'Can view content type',5,'view_contenttype'),(21,'Can add session',6,'add_session'),(22,'Can change session',6,'change_session'),(23,'Can delete session',6,'delete_session'),(24,'Can view session',6,'view_session'),(25,'Can add app array',7,'add_apparray'),(26,'Can change app array',7,'change_apparray'),(27,'Can delete app array',7,'delete_apparray'),(28,'Can view app array',7,'view_apparray'),(29,'Can add app exam',8,'add_appexam'),(30,'Can change app exam',8,'change_appexam'),(31,'Can delete app exam',8,'delete_appexam'),(32,'Can view app exam',8,'view_appexam'),(33,'Can add app exams sentences',9,'add_appexamssentences'),(34,'Can change app exams sentences',9,'change_appexamssentences'),(35,'Can delete app exams sentences',9,'delete_appexamssentences'),(36,'Can view app exams sentences',9,'view_appexamssentences'),(37,'Can add app exams users',10,'add_appexamsusers'),(38,'Can change app exams users',10,'change_appexamsusers'),(39,'Can delete app exams users',10,'delete_appexamsusers'),(40,'Can view app exams users',10,'view_appexamsusers'),(41,'Can add app exams users evalh',11,'add_appexamsusersevalh'),(42,'Can change app exams users evalh',11,'change_appexamsusersevalh'),(43,'Can delete app exams users evalh',11,'delete_appexamsusersevalh'),(44,'Can view app exams users evalh',11,'view_appexamsusersevalh'),(45,'Can add app exams users evall',12,'add_appexamsusersevall'),(46,'Can change app exams users evall',12,'change_appexamsusersevall'),(47,'Can delete app exams users evall',12,'delete_appexamsusersevall'),(48,'Can view app exams users evall',12,'view_appexamsusersevall'),(49,'Can add app sentence',13,'add_appsentence'),(50,'Can change app sentence',13,'change_appsentence'),(51,'Can delete app sentence',13,'delete_appsentence'),(52,'Can view app sentence',13,'view_appsentence'),(53,'Can add app sentence images',14,'add_appsentenceimages'),(54,'Can change app sentence images',14,'change_appsentenceimages'),(55,'Can delete app sentence images',14,'delete_appsentenceimages'),(56,'Can view app sentence images',14,'view_appsentenceimages'),(57,'Can add app sentences users',15,'add_appsentencesusers'),(58,'Can change app sentences users',15,'change_appsentencesusers'),(59,'Can delete app sentences users',15,'delete_appsentencesusers'),(60,'Can view app sentences users',15,'view_appsentencesusers'),(61,'Can add app sentence tags',16,'add_appsentencetags'),(62,'Can change app sentence tags',16,'change_appsentencetags'),(63,'Can delete app sentence tags',16,'delete_appsentencetags'),(64,'Can view app sentence tags',16,'view_appsentencetags'),(65,'Can add app sentence times',17,'add_appsentencetimes'),(66,'Can change app sentence times',17,'change_appsentencetimes'),(67,'Can delete app sentence times',17,'delete_appsentencetimes'),(68,'Can view app sentence times',17,'view_appsentencetimes'),(69,'Can add app sentence tr',18,'add_appsentencetr'),(70,'Can change app sentence tr',18,'change_appsentencetr'),(71,'Can delete app sentence tr',18,'delete_appsentencetr'),(72,'Can view app sentence tr',18,'view_appsentencetr'),(73,'Can add app tag',19,'add_apptag'),(74,'Can change app tag',19,'change_apptag'),(75,'Can delete app tag',19,'delete_apptag'),(76,'Can view app tag',19,'view_apptag'),(77,'Can add base language',20,'add_baselanguage'),(78,'Can change base language',20,'change_baselanguage'),(79,'Can delete base language',20,'delete_baselanguage'),(80,'Can view base language',20,'view_baselanguage'),(81,'Can add base language lang',21,'add_baselanguagelang'),(82,'Can change base language lang',21,'change_baselanguagelang'),(83,'Can delete base language lang',21,'delete_baselanguagelang'),(84,'Can view base language lang',21,'view_baselanguagelang'),(85,'Can add base user',22,'add_baseuser'),(86,'Can change base user',22,'change_baseuser'),(87,'Can delete base user',22,'delete_baseuser'),(88,'Can view base user',22,'view_baseuser'),(89,'Can add base user array',23,'add_baseuserarray'),(90,'Can change base user array',23,'change_baseuserarray'),(91,'Can delete base user array',23,'delete_baseuserarray'),(92,'Can view base user array',23,'view_baseuserarray'),(93,'Can add template',24,'add_template'),(94,'Can change template',24,'change_template'),(95,'Can delete template',24,'delete_template'),(96,'Can view template',24,'view_template'),(97,'Can add template array',25,'add_templatearray'),(98,'Can change template array',25,'change_templatearray'),(99,'Can delete template array',25,'delete_templatearray'),(100,'Can view template array',25,'view_templatearray'),(101,'Can add version db',26,'add_versiondb'),(102,'Can change version db',26,'change_versiondb'),(103,'Can delete version db',26,'delete_versiondb'),(104,'Can view version db',26,'view_versiondb'); + +/*Table structure for table `auth_user` */ + +DROP TABLE IF EXISTS `auth_user`; + +CREATE TABLE `auth_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user` */ + +insert into `auth_user`(`id`,`password`,`last_login`,`is_superuser`,`username`,`first_name`,`last_name`,`email`,`is_staff`,`is_active`,`date_joined`) values (1,'pbkdf2_sha256$150000$kK228PsfZrvK$R4AJZ8eYfZaR6A/DInDuenmo60ruKhUh/PT4FqXo5Tw=','2019-05-05 10:52:42.735207',1,'sa','','','sa@theframework.es',1,1,'2019-04-20 22:13:58.619448'),(2,'pbkdf2_sha256$150000$aWLw4dA2SH9V$g3nWr7rsH3Oo7IpqZWiA0wUmLoVrp/xfWyXBTF0VbsE=',NULL,1,'sa2','','','sa2@tfw.es',1,1,'2019-04-28 13:59:16.096768'),(3,'pbkdf2_sha256$150000$U394Fhz3vsWm$hirfJR89ZoMW0DzTTLu0YGA5gko9TSbuhd4oFjcvErA=','2019-05-18 09:44:48.875899',1,'sa3','','','sa3@tfw.es',1,1,'2019-04-28 14:21:05.951416'); + +/*Table structure for table `auth_user_groups` */ + +DROP TABLE IF EXISTS `auth_user_groups`; + +CREATE TABLE `auth_user_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_groups` */ + +/*Table structure for table `auth_user_user_permissions` */ + +DROP TABLE IF EXISTS `auth_user_user_permissions`; + +CREATE TABLE `auth_user_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `auth_user_user_permissions` */ + +/*Table structure for table `base_language` */ + +DROP TABLE IF EXISTS `base_language`; + +CREATE TABLE `base_language` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `code_iso` varchar(10) DEFAULT '-' COMMENT 'https://www.iso.org/iso-639-language-codes.html', + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `base_language` */ + +insert into `base_language`(`processflag`,`insert_platform`,`insert_user`,`insert_date`,`update_platform`,`update_user`,`update_date`,`delete_platform`,`delete_user`,`delete_date`,`cru_csvnote`,`is_erpsent`,`is_enabled`,`i`,`id`,`code_erp`,`id_tosave`,`description`,`code_iso`,`order_by`,`code_cache`) values (NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,1,'english','english','ENGLISH','en',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,2,'spanish','spanish','SPANISH','es',100,NULL),(NULL,'1','1','20140825073501','1','1','20140825073501',NULL,NULL,NULL,NULL,'0','1',NULL,3,'dutch','dutch','DUTCH','nl',100,NULL),(NULL,'1','1','20140825073501','3','1','20170114120045',NULL,NULL,NULL,NULL,'0','1',NULL,4,'papiaments','papiaments','PAPIAMENTS','pap',100,NULL); + +/*Table structure for table `base_language_lang` */ + +DROP TABLE IF EXISTS `base_language_lang`; + +CREATE TABLE `base_language_lang` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `id_source` int(11) DEFAULT NULL, + `id_language` int(11) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_language_lang` */ + +/*Table structure for table `base_user` */ + +DROP TABLE IF EXISTS `base_user`; + +CREATE TABLE `base_user` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `id_country` int(11) DEFAULT NULL COMMENT 'app_array.type=country', + `id_language` int(11) DEFAULT NULL COMMENT 'su idioma de preferencia', + `path_picture` varchar(100) DEFAULT NULL, + `id_profile` int(11) DEFAULT NULL COMMENT 'app_array.type=profile: user,maintenaince,system', + `tokenreset` varchar(250) DEFAULT NULL, + `log_attempts` int(5) DEFAULT '0', + `rating` int(11) DEFAULT NULL COMMENT 'la puntuacion', + `date_validated` varchar(14) DEFAULT NULL COMMENT 'cuando valido su cuenta por email', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user` */ + +/*Table structure for table `base_user_array` */ + +DROP TABLE IF EXISTS `base_user_array`; + +CREATE TABLE `base_user_array` ( + `processflag` varchar(5) DEFAULT NULL, + `insert_platform` varchar(3) DEFAULT '1', + `insert_user` varchar(15) DEFAULT NULL, + `insert_date` varchar(14) DEFAULT NULL, + `update_platform` varchar(3) DEFAULT NULL, + `update_user` varchar(15) DEFAULT NULL, + `update_date` varchar(14) DEFAULT NULL, + `delete_platform` varchar(3) DEFAULT NULL, + `delete_user` varchar(15) DEFAULT NULL, + `delete_date` varchar(14) DEFAULT NULL, + `cru_csvnote` varchar(500) DEFAULT NULL, + `is_erpsent` varchar(3) DEFAULT '0', + `is_enabled` varchar(3) DEFAULT '1', + `i` int(11) DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `code_erp` varchar(25) DEFAULT NULL, + `type` varchar(15) DEFAULT NULL, + `id_tosave` varchar(25) DEFAULT NULL, + `description` varchar(250) DEFAULT NULL, + `order_by` int(5) NOT NULL DEFAULT '100', + `code_cache` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `base_user_array` */ + +/*Table structure for table `django_admin_log` */ + +DROP TABLE IF EXISTS `django_admin_log`; + +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8; + +/*Data for the table `django_admin_log` */ + +insert into `django_admin_log`(`id`,`action_time`,`object_id`,`object_repr`,`action_flag`,`change_message`,`content_type_id`,`user_id`) values (1,'2019-04-21 12:16:56.931203','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(2,'2019-04-21 13:31:10.864223','4','AppArray object (4)',1,'[{\"added\": {}}]',7,1),(3,'2019-04-21 13:31:35.941650','4','AppArray object (4)',2,'[]',7,1),(4,'2019-04-21 14:27:29.654207','5','AppArray object (5)',1,'[{\"added\": {}}]',7,1),(5,'2019-04-21 14:35:55.294048','3','AppArray object (3)',3,'',7,1),(6,'2019-04-21 15:38:46.951009','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(7,'2019-04-21 15:39:55.336796','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(8,'2019-04-21 15:40:25.602301','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(9,'2019-04-21 15:40:48.714448','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(10,'2019-04-21 15:40:51.198738','15','AppArray object (15)',1,'[{\"added\": {}}]',7,1),(11,'2019-04-21 15:42:33.196306','16','AppArray object (16)',1,'[{\"added\": {}}]',7,1),(12,'2019-04-21 15:43:10.163156','17','AppArray object (17)',1,'[{\"added\": {}}]',7,1),(13,'2019-04-21 15:43:12.816046','18','AppArray object (18)',1,'[{\"added\": {}}]',7,1),(14,'2019-04-28 11:37:32.258253','3','AppArray object (3)',1,'[{\"added\": {}}]',7,1),(15,'2019-04-28 14:24:01.239546','5','AppArray object (5)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(16,'2019-04-28 14:30:02.797792','6','AppArray object (6)',1,'[{\"added\": {}}]',7,1),(17,'2019-04-28 16:15:08.088934','7','AppArray object (7)',1,'[{\"added\": {}}]',7,1),(18,'2019-04-28 16:26:36.431281','5','AppArray object (5)',2,'[]',7,1),(19,'2019-04-28 16:31:58.243713','5','AppArray object (5)',2,'[]',7,1),(20,'2019-04-28 16:52:10.273238','4','AppArray object (4)',2,'[]',7,1),(21,'2019-04-28 16:55:16.859724','8','AppArray object (8)',1,'[{\"added\": {}}]',7,1),(22,'2019-04-28 16:57:38.619870','9','AppArray object (9)',1,'[{\"added\": {}}]',7,1),(23,'2019-04-28 16:57:45.512806','10','AppArray object (10)',1,'[{\"added\": {}}]',7,1),(24,'2019-04-28 16:58:06.995590','11','AppArray object (11)',1,'[{\"added\": {}}]',7,1),(25,'2019-04-28 16:59:12.286986','12','AppArray object (12)',1,'[{\"added\": {}}]',7,1),(26,'2019-04-28 17:00:15.749673','13','AppArray object (13)',1,'[{\"added\": {}}]',7,1),(27,'2019-04-28 17:01:11.313475','14','AppArray object (14)',1,'[{\"added\": {}}]',7,1),(28,'2019-04-28 17:01:38.048276','14','AppArray object (14)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(29,'2019-04-28 17:02:21.882240','11','AppArray object (11)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,1),(30,'2019-04-28 17:04:11.232210','7','AppArray object (7)',2,'[{\"changed\": {\"fields\": [\"type\", \"description\"]}}]',7,1),(31,'2019-04-28 17:06:32.629583','1','AppArray object (1)',1,'[{\"added\": {}}]',7,1),(32,'2019-05-02 17:18:33.933193','1','bbb (1)',2,'[]',7,3),(33,'2019-05-02 17:18:38.657851','1','lkjkkjkl (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(34,'2019-05-02 17:18:43.113577','2','55kklñlkkñ (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(35,'2019-05-02 17:19:17.333303','1','jkdfsjal (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(36,'2019-05-02 17:19:23.580416','2','55kklñlkkñ (2)',2,'[{\"changed\": {\"fields\": [\"order_by\"]}}]',7,3),(37,'2019-05-02 17:19:49.061715','1','jkdfsjal11 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(38,'2019-05-02 17:20:13.963053','1','jkdfsjal11222 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(39,'2019-05-02 17:20:29.840820','2','5555 (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(40,'2019-05-02 17:20:34.063966','3','7878 (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(41,'2019-05-02 17:22:22.240330','1','jjdkjksfl (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(42,'2019-05-02 17:22:22.259279','2','jkjkljdfkl (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(43,'2019-05-02 17:22:22.278265','3','kjlkjkl (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(44,'2019-05-02 17:22:36.682385','1','jjdkjksfl (1)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(45,'2019-05-02 17:24:09.995123','1','jjhhhh (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(46,'2019-05-02 17:24:14.666728','1','jjjjjjjjjj (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(47,'2019-05-02 17:25:11.217589','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(48,'2019-05-02 17:25:11.329023','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(49,'2019-05-02 17:26:29.765337','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(50,'2019-05-02 17:28:34.766625','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(51,'2019-05-02 17:30:09.787638','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(52,'2019-05-02 17:30:15.113888','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(53,'2019-05-02 17:30:15.221771','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(54,'2019-05-02 17:30:30.155829','2','dsafjshdj (2)',2,'[]',7,3),(55,'2019-05-02 17:32:35.634688','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(56,'2019-05-02 18:07:31.550083','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[]',7,3),(57,'2019-05-02 18:07:47.872632','1','jjjjjjjjjjjjjj787897 (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(58,'2019-05-02 18:07:48.007211','2','dsafjshdj (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(59,'2019-05-02 18:07:48.129009','3','kjklkjljkkjjkkjllkjñjkñkj (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(60,'2019-05-03 14:54:23.529177','1','some desc (1)',1,'[{\"added\": {}}]',7,3),(61,'2019-05-03 15:14:51.325762','1','1122333 (1)',1,'[{\"added\": {}}]',7,3),(62,'2019-05-03 15:27:13.938244','1','pepito perz (1)',1,'[{\"added\": {}}]',7,3),(63,'2019-05-03 15:48:32.135213','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(64,'2019-05-03 16:18:25.775684','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(65,'2019-05-03 16:22:10.052354','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(66,'2019-05-03 16:24:20.707739','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(67,'2019-05-03 16:25:06.441247','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(68,'2019-05-03 17:31:22.732908','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(69,'2019-05-03 17:42:07.066420','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(70,'2019-05-03 17:43:20.170744','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(71,'2019-05-03 17:44:55.301706','2','pepito (2)',1,'[{\"added\": {}}]',7,3),(72,'2019-05-03 17:45:46.094141','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(73,'2019-05-03 17:55:32.069018','1','pepito perz (1)',2,'[]',7,3),(74,'2019-05-03 17:58:52.893484','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(75,'2019-05-03 17:59:52.303767','3','oioipioip (3)',1,'[{\"added\": {}}]',7,3),(76,'2019-05-03 18:01:28.950737','4','nuevo activo (4)',1,'[{\"added\": {}}]',7,3),(77,'2019-05-03 18:03:13.653743','5','0000 (5)',1,'[{\"added\": {}}]',7,3),(78,'2019-05-03 18:04:33.122026','5','0000 (5)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(79,'2019-05-03 18:04:47.075173','5','00klklkñkñ (5)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(80,'2019-05-03 18:07:08.783708','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(81,'2019-05-03 18:07:18.567473','2','pepito (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(82,'2019-05-03 18:07:18.589330','3','oioipioip (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(83,'2019-05-03 18:08:05.281229','3','oioipioip (3)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(84,'2019-05-03 18:08:17.966874','4','nuevo activo (4)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(85,'2019-05-03 18:15:56.631821','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(86,'2019-05-03 18:16:33.999408','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(87,'2019-05-03 18:20:05.003733','6','bgt (6)',1,'[{\"added\": {}}]',7,3),(88,'2019-05-03 18:20:58.602777','7','no enabled (7)',1,'[{\"added\": {}}]',7,3),(89,'2019-05-03 18:21:13.488068','7','no enabled (7)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(90,'2019-05-03 18:22:00.491402','1','pepito perz (1)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(91,'2019-05-03 18:22:00.526301','2','pepito (2)',2,'[{\"changed\": {\"fields\": [\"is_enabled\"]}}]',7,3),(92,'2019-05-03 18:22:20.780705','5','00klklkñkñ (5)',3,'',7,3),(93,'2019-05-03 18:22:20.790729','7','no enabled (7)',3,'',7,3),(94,'2019-05-03 18:23:18.931762','8','desactivado? (8)',1,'[{\"added\": {}}]',7,3),(95,'2019-05-03 18:23:46.811923','9','tampoco desactivado (9)',1,'[{\"added\": {}}]',7,3),(96,'2019-05-03 18:25:11.846528','10','picklist value (10)',1,'[{\"added\": {}}]',7,3),(97,'2019-05-03 18:25:36.225434','11','borrame softly (11)',1,'[{\"added\": {}}]',7,3),(98,'2019-05-03 18:28:06.335256','12','con error? (12)',1,'[{\"added\": {}}]',7,3),(99,'2019-05-03 18:28:58.621206','13','10 (13)',1,'[{\"added\": {}}]',7,3),(100,'2019-05-03 18:31:17.901121','14','54546546 (14)',1,'[{\"added\": {}}]',7,3),(101,'2019-05-03 18:31:43.256137','15','65454646 (15)',1,'[{\"added\": {}}]',7,3),(102,'2019-05-03 18:32:12.135608','15','65454646 (15)',2,'[]',7,3),(103,'2019-05-03 18:32:51.915322','16','1111 (16)',1,'[{\"added\": {}}]',7,3),(104,'2019-05-03 18:34:13.098801','17','87878979 (17)',1,'[{\"added\": {}}]',7,3),(105,'2019-05-03 18:39:34.673573','17','87878979 (17)',2,'[]',7,3),(106,'2019-05-03 18:41:05.368401','17','87878979 (17)',2,'[]',7,3),(107,'2019-05-03 19:41:47.701128','15','65454646 (15)',2,'[]',7,3),(108,'2019-05-03 19:49:27.617126','18','555 (18)',1,'[{\"added\": {}}]',7,3),(109,'2019-05-03 19:55:08.100168','16','1111444 (16)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(110,'2019-05-03 19:56:35.413963','19','4444 (19)',1,'[{\"added\": {}}]',7,3),(111,'2019-05-03 19:57:31.208897','20','ññññ (20)',1,'[{\"added\": {}}]',7,3),(112,'2019-05-03 20:05:39.584030','6','nnnnn (6)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(113,'2019-05-03 20:53:09.472375','21','uuuu (21)',1,'[{\"added\": {}}]',7,3),(114,'2019-05-18 10:56:11.820112','22','bbb (22)',1,'[{\"added\": {}}]',7,3),(115,'2019-05-18 10:57:36.317332','1','pepito perz (1)',3,'',7,3),(116,'2019-05-18 10:57:36.336312','2','pepito (2)',3,'',7,3),(117,'2019-05-18 10:57:36.348244','3','oioipioip (3)',3,'',7,3),(118,'2019-05-18 10:57:36.360214','4','nuevo activo (4)',3,'',7,3),(119,'2019-05-18 11:27:08.350810','6','nnnnn (6)',2,'[{\"changed\": {\"fields\": [\"type\"]}}]',7,3),(120,'2019-05-18 11:29:18.521788','23','xxx (23)',1,'[{\"added\": {}}]',7,3),(121,'2019-05-18 11:31:26.339876','8','xxx (8)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(122,'2019-05-18 11:32:18.079380','13','xxx (13)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(123,'2019-05-18 11:32:31.595097','8','aaa (8)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(124,'2019-05-18 11:32:38.626371','13','aaa (13)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(125,'2019-05-18 11:32:42.687367','23','aaa (23)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',7,3),(126,'2019-05-18 11:37:31.542443','4','VersionDb object (4)',1,'[{\"added\": {}}]',26,3),(127,'2019-05-18 11:42:46.474694','4','VersionDb object (4)',2,'[{\"changed\": {\"fields\": [\"description\"]}}]',26,3); + +/*Table structure for table `django_content_type` */ + +DROP TABLE IF EXISTS `django_content_type`; + +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; + +/*Data for the table `django_content_type` */ + +insert into `django_content_type`(`id`,`app_label`,`model`) values (1,'admin','logentry'),(3,'auth','group'),(2,'auth','permission'),(4,'auth','user'),(5,'contenttypes','contenttype'),(6,'sessions','session'),(7,'theapp','apparray'),(8,'theapp','appexam'),(9,'theapp','appexamssentences'),(10,'theapp','appexamsusers'),(11,'theapp','appexamsusersevalh'),(12,'theapp','appexamsusersevall'),(13,'theapp','appsentence'),(14,'theapp','appsentenceimages'),(15,'theapp','appsentencesusers'),(16,'theapp','appsentencetags'),(17,'theapp','appsentencetimes'),(18,'theapp','appsentencetr'),(19,'theapp','apptag'),(20,'theapp','baselanguage'),(21,'theapp','baselanguagelang'),(22,'theapp','baseuser'),(23,'theapp','baseuserarray'),(24,'theapp','template'),(25,'theapp','templatearray'),(26,'theapp','versiondb'); + +/*Table structure for table `django_migrations` */ + +DROP TABLE IF EXISTS `django_migrations`; + +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; + +/*Data for the table `django_migrations` */ + +insert into `django_migrations`(`id`,`app`,`name`,`applied`) values (1,'contenttypes','0001_initial','2019-04-20 20:37:05.587588'),(2,'auth','0001_initial','2019-04-20 20:37:05.756875'),(3,'admin','0001_initial','2019-04-20 20:37:06.204744'),(4,'admin','0002_logentry_remove_auto_add','2019-04-20 20:37:06.305296'),(5,'admin','0003_logentry_add_action_flag_choices','2019-04-20 20:37:06.320956'),(6,'contenttypes','0002_remove_content_type_name','2019-04-20 20:37:06.421538'),(7,'auth','0002_alter_permission_name_max_length','2019-04-20 20:37:06.474895'),(8,'auth','0003_alter_user_email_max_length','2019-04-20 20:37:06.543529'),(9,'auth','0004_alter_user_username_opts','2019-04-20 20:37:06.543529'),(10,'auth','0005_alter_user_last_login_null','2019-04-20 20:37:06.590489'),(11,'auth','0006_require_contenttypes_0002','2019-04-20 20:37:06.590489'),(12,'auth','0007_alter_validators_add_error_messages','2019-04-20 20:37:06.606053'),(13,'auth','0008_alter_user_username_max_length','2019-04-20 20:37:06.643853'),(14,'auth','0009_alter_user_last_name_max_length','2019-04-20 20:37:06.728465'),(15,'auth','0010_alter_group_name_max_length','2019-04-20 20:37:06.806829'),(16,'auth','0011_update_proxy_permissions','2019-04-20 20:37:06.806829'),(17,'sessions','0001_initial','2019-04-20 20:37:06.828507'),(18,'theapp','0001_initial','2019-04-20 20:37:06.875415'); + +/*Table structure for table `django_session` */ + +DROP TABLE IF EXISTS `django_session`; + +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/*Data for the table `django_session` */ + +insert into `django_session`(`session_key`,`session_data`,`expire_date`) values ('5bfn7ub2qj8vxxvrehz235q0zx4i8di8','ZWYwZjgxNDNmNDcyZGM5NzcwMTM3OWRiYjAxMTgyNjk0YjI0ODNkNDp7Il9hdXRoX3VzZXJfaWQiOiIzIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI1MDFmOWI3YmYxN2M2OGExMTBhODQxMWU2NmU2MzgxNjM5NWRkMjg4In0=','2019-05-12 18:57:09.333293'),('fj1uque9h0bc7da1nx4u3lwgqmokefvf','ZWYwZjgxNDNmNDcyZGM5NzcwMTM3OWRiYjAxMTgyNjk0YjI0ODNkNDp7Il9hdXRoX3VzZXJfaWQiOiIzIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI1MDFmOWI3YmYxN2M2OGExMTBhODQxMWU2NmU2MzgxNjM5NWRkMjg4In0=','2019-06-01 09:44:48.891854'),('ucu7f6e98otkflunmx78gu0wmfdvl3v8','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-05 12:08:18.407290'),('viu61onusln6rlgow3esgj3q1j93qanu','ZGI3OGJjNGE2OWE4ZWE3MWIzY2U4YzFlNzY5YmQ0MTEwZjBjMWY3Nzp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJlYzk2YTUzYWJiNmFjOGRhYzhmMTVlMjUzYTVjZGExNGVlY2ExYzljIn0=','2019-05-19 10:52:42.782353'); + +/*Table structure for table `version_db` */ + +DROP TABLE IF EXISTS `version_db`; + +CREATE TABLE `version_db` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `date` char(14) DEFAULT NULL COMMENT 'mysql no permite funciones evaluadas por defcto se debe crear un trigger REPLACE(REPLACE(REPLACE(NOW(),''-'',''''),'':'',''''),'' '','''') mssql+1', + `version` varchar(15) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Data for the table `version_db` */ + +insert into `version_db`(`id`,`date`,`version`,`description`) values (1,'20190420162500','1.0.0','definicion'),(2,'20190409211700','2.0.3','cambio estructura de tablas'),(3,'20190511202600','2.0.4','creo campo date_validated'),(4,'201905181336','2.0.5','fix longitud description a 250'); + +/* Procedure structure for procedure `prc_clone_row` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_clone_row` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_clone_row`( + sTableName VARCHAR(25) + ,sId VARCHAR(5) + ) +BEGIN + SET @sSQL := CONCAT('SELECT (MAX(id)+1) AS idnew FROM ',sTableName,' INTO @sIdNew'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + IF (@sIdNew IS NOT NULL) THEN + SET @sSQL := CONCAT('CREATE TEMPORARY TABLE tempo_table SELECT * FROM ',sTableName,' WHERE id = ',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('UPDATE tempo_table SET id=',@sIdNew,' WHERE id=',sId,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + + SET @sSQL := CONCAT('INSERT INTO ',sTableName,' SELECT * FROM tempo_table WHERE id=',@sIdNew,'; '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + SET @sSQL := CONCAT('SELECT * FROM ',sTableName,' ORDER BY id DESC;'); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; + ELSE + SELECT CONCAT('TABLE ',sTableName,' IS EMPTY!!!') AS msg; + END IF; + +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_get_version` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_get_version` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_get_version`() +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @iTables :=( + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE (TABLE_SCHEMA = @sDB) + AND (TABLE_NAME = 'version_db') + ); + IF (@iTables=1) THEN + SELECT * FROM version_db ORDER BY id DESC LIMIT 1; + ELSEIF (@iTables=0) THEN + SELECT 'no version table' AS ver_schema; + END IF; +END */$$ +DELIMITER ; + +/* Procedure structure for procedure `prc_table` */ + +/*!50003 DROP PROCEDURE IF EXISTS `prc_table` */; + +DELIMITER $$ + +/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_table`( + sTableName VARCHAR(25) + ,sFieldName VARCHAR(50) + ) +BEGIN + SET @sDB := (SELECT DATABASE()); + SET @sSQL = ' + SELECT table_name AS tablename + ,LOWER(column_name) AS fieldname + ,CASE COALESCE(pks.cn,\'\') + WHEN \'\' THEN \'\' + ELSE \'Y\' + END AS ispk + ,LOWER(DATA_TYPE) AS fieldtype + ,CASE LOWER(DATA_TYPE) + WHEN \'datetime\' THEN 19 + ELSE character_maximum_length + END AS fieldlen + -- ,\'\' AS selectall + FROM information_schema.columns + LEFT JOIN + ( + SELECT DISTINCT table_name AS tn,column_name AS cn + FROM information_schema.key_column_usage + WHERE table_schema = schema() -- only look in the current db + AND constraint_name = \'PRIMARY\' -- always PRIMARY for PRIMARY KEY constraints + ) AS pks + ON pks.tn = table_name AND pks.cn=column_name + WHERE 1=1 '; + -- incluyo la bd + SET @sSQL := CONCAT(@sSQL,'AND table_schema=\'',@sDB,'\''); + -- tabla + IF(sTableName IS NOT NULL AND sTableName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND table_name LIKE \'%',sTableName,'%\' '); + END IF; + IF(sFieldName IS NOT NULL AND sFieldName!='')THEN + SET @sSQL := CONCAT(@sSQL,'AND LOWER(column_name) LIKE \'%',sFieldName,'%\' '); + END IF; + SET @sSQL := CONCAT(@sSQL,'ORDER BY tablename,ORDINAL_POSITION, fieldname ASC '); + PREPARE sExecute FROM @sSQL; + EXECUTE sExecute; +END */$$ +DELIMITER ; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/apirest/learnlang/__init__.py b/apirest/learnlang/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/learnlang/config/__init__.py b/apirest/learnlang/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/learnlang/config/base.py b/apirest/learnlang/config/base.py new file mode 100644 index 00000000..f523da16 --- /dev/null +++ b/apirest/learnlang/config/base.py @@ -0,0 +1,132 @@ +""" +Django settings for learnlang project. +Generated by 'django-admin startproject' using Django 2.2. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.2/ref/settings/ +""" + +import os +from vendor.theframework.builtins_ext import * +s("settings.base.py") + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = ')!#hwhl(%)^c!9o@tpcl$ubsy5j5w^dp+#vjg5t-xa$@k2-xpi' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ENV = "dev" + +ALLOWED_HOSTS = ["eduardoaf.pythonanywhere.com","127.0.0.1"] + +# Application definition +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'vendor.theframework', + 'theapp', + 'rest_framework_swagger', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'learnlang.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'learnlang.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases + +DATABASES = { + "default": { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'db_learnlang', + 'USER': 'root', + 'PASSWORD': '', + 'HOST': '127.0.0.1', + 'PORT': '3306', + }, +} + + +# Password validation +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True +# USE_TZ = False + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.2/howto/static-files/ + +PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) +# print(PROJECT_ROOT) #= \apirest\learnlang +STATIC_URL = '/static/' + diff --git a/apirest/learnlang/config/dev.py b/apirest/learnlang/config/dev.py new file mode 100644 index 00000000..3d50d75f --- /dev/null +++ b/apirest/learnlang/config/dev.py @@ -0,0 +1,30 @@ +from .base import * +s("settings.dev.py") + +if ENV=="dev" and DEBUG: + + def custom_show_toolbar(request): + """ Only show the debug toolbar to users with the superuser flag. """ + #return request.user.is_superuser + if request.is_ajax(): + return False + return True + + INSTALLED_APPS += [ + 'debug_toolbar', + ] + + MIDDLEWARE += ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', + ) + + INTERNAL_IPS = ('127.0.0.1', ) + + DEBUG_TOOLBAR_CONFIG = { + 'INTERCEPT_REDIRECTS': False, + # 'SHOW_TOOLBAR_CALLBACK': 'core.settings.custom_show_toolbar', + 'HIDE_DJANGO_SQL': True, + 'TAG': 'body', + 'SHOW_TEMPLATE_CONTEXT': True, + 'ENABLE_STACKTRACES': True, + } diff --git a/apirest/learnlang/config/prod.py b/apirest/learnlang/config/prod.py new file mode 100644 index 00000000..ee8fa286 --- /dev/null +++ b/apirest/learnlang/config/prod.py @@ -0,0 +1,15 @@ +from .base import * + +if ENV=="prod": + STATIC_ROOT = '/home/eduardoaf/prj_python37/apirest/static/' + + DATABASES = { + "default": { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'dbname', + 'USER': 'dbuser', + 'PASSWORD': 'dbpwd', + 'HOST': 'dbhost', + 'PORT': '3306', + }, + } \ No newline at end of file diff --git a/apirest/learnlang/settings.py b/apirest/learnlang/settings.py new file mode 100644 index 00000000..5a79e9d6 --- /dev/null +++ b/apirest/learnlang/settings.py @@ -0,0 +1,4 @@ +# from .config.base import * +# .config.base se importa dentro de dev y prod para rescribirlo +from .config.dev import * +from .config.prod import * \ No newline at end of file diff --git a/apirest/learnlang/urls.py b/apirest/learnlang/urls.py new file mode 100644 index 00000000..938f563c --- /dev/null +++ b/apirest/learnlang/urls.py @@ -0,0 +1,40 @@ +s("main-urls.py") +# main url +# learnlang/urls.py +"""learnlang URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +from django.conf import settings +from django.conf.urls import url, include + +urlpatterns = [ + # include de las rutas de la app + url(r'^api/v1/', include('theapp.urls')), + # se podría dar este caso para la sig version de la api + # url(r'^api/v2/', include('learnlang.theapp.urls2')), + url(r'^api-auth/', include("rest_framework.urls", namespace="rest_framework")), + url(r'^admin/', admin.site.urls), + +] + + +if settings.DEBUG: + import debug_toolbar + urlpatterns += [ + url(r'^bug/', include(debug_toolbar.urls)), + ] diff --git a/apirest/learnlang/wsgi.py b/apirest/learnlang/wsgi.py new file mode 100644 index 00000000..888577f4 --- /dev/null +++ b/apirest/learnlang/wsgi.py @@ -0,0 +1,17 @@ +""" +WSGI config for learnlang project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ +""" + +import os +from vendor.theframework.builtins_ext import * +from django.core.wsgi import get_wsgi_application +s("wsgi.py") +# sirve archivos estaticos + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learnlang.settings') +application = get_wsgi_application() diff --git a/apirest/manage.py b/apirest/manage.py new file mode 100644 index 00000000..416181ec --- /dev/null +++ b/apirest/manage.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learnlang.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/apirest/requirements.txt b/apirest/requirements.txt new file mode 100644 index 00000000..c27cf342 --- /dev/null +++ b/apirest/requirements.txt @@ -0,0 +1,13 @@ +mysqlclient==1.4.2 +Django==2.2.1 +django-debug-toolbar==1.11 +djangorestframework==3.9.3 +django-rest-swagger==2.2.0 + +# dj-database-url==0.5.0 +# django-heroku==0.3.1 +# gunicorn==19.9.0 +# psycopg2==2.8.2 +# whitenoise==4.1.2 + + diff --git a/apirest/runtime.txt b/apirest/runtime.txt new file mode 100644 index 00000000..9fbd3bf0 --- /dev/null +++ b/apirest/runtime.txt @@ -0,0 +1 @@ +python-3.6.8 diff --git a/apirest/static/css/git b/apirest/static/css/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/static/img/git b/apirest/static/img/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/static/js/git b/apirest/static/js/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/templates/admin/apparray/git b/apirest/templates/admin/apparray/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/__init__.py b/apirest/theapp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/admin/__init__.py b/apirest/theapp/admin/__init__.py new file mode 100644 index 00000000..f443cbce --- /dev/null +++ b/apirest/theapp/admin/__init__.py @@ -0,0 +1,2 @@ +s("theapp.admin.__init__.py") +from .sections.register import * \ No newline at end of file diff --git a/apirest/theapp/admin/sections/__init__.py b/apirest/theapp/admin/sections/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/admin/sections/admin_apparray.py b/apirest/theapp/admin/sections/admin_apparray.py new file mode 100644 index 00000000..f00720d4 --- /dev/null +++ b/apirest/theapp/admin/sections/admin_apparray.py @@ -0,0 +1,72 @@ +s("theapp.admin.sections.admin_apparray") +from .admin_theapp import TheappModelAdmin +from vendor.theframework import utils as u +from .admin_form import * + +class AppArrayAdmin(TheappModelAdmin): + + #no se mostrarán en el form de detalle + exclude = ( + "processflag", + "insert_platform","insert_user","insert_date", + "update_platform","update_user","update_date", + "delete_platform","delete_user","delete_date", + "cru_csvnote","is_erpsent","i","code_erp", + "module","id_tosave","code_cache" + ) + + # caja de texto + search_fields = ( + "id","description","type","module","insert_date" + ) + + # links de filtrado + list_display = ( + "desc_id","type","id","description","order_by","is_enabled","insert_user","insert_date", + "code_cache", + ) + + list_editable = ("order_by","is_enabled",) + + # readonly_fields = ("is_enabled", ) + + ordering = ("id",) + + list_filter = ( + "type","module","is_enabled","insert_date" + ) + + # desplegable con acciones + actions = ["soft_delete"] + + def soft_delete(modeladmin,request,queryset): + queryset.update( + delete_user = request.user.id, + delete_date = u.get_now(), + delete_platform = u.get_platform()) + + soft_delete.short_description = "Soft delete" + + # crea una lista de filtros por defecto con fecha (debajo del desplegable) + date_hierarchy = "insert_date" + + """ + fields = ( + ("type"), + ("description"), + ("order_by"), + ("is_enabled"), + ) + """ + + form = ArrayForm + save_as = True # boton de duplicado + save_on_top = True # botones arriba + +""" + def get_readonly_fields(self, request, obj=None): + if obj: # obj is not None, so this is an edit + return ("is_enabled",) # Return a list or tuple of readonly fields' names + else: # This is an addition + return [] +""" \ No newline at end of file diff --git a/apirest/theapp/admin/sections/admin_form.py b/apirest/theapp/admin/sections/admin_form.py new file mode 100644 index 00000000..e519090f --- /dev/null +++ b/apirest/theapp/admin/sections/admin_form.py @@ -0,0 +1,7 @@ +from django import forms +from ...models.models import * + +class ArrayForm(forms.ModelForm): + class Meta: + fields = ("id","description","module","order_by","is_enabled") + model = AppArray \ No newline at end of file diff --git a/apirest/theapp/admin/sections/admin_theapp.py b/apirest/theapp/admin/sections/admin_theapp.py new file mode 100644 index 00000000..359b25e2 --- /dev/null +++ b/apirest/theapp/admin/sections/admin_theapp.py @@ -0,0 +1,52 @@ +s("theapp.admin.sections.admin_theapp") +from django.contrib import admin +from vendor.theframework import utils as u + +from ...models.models import * + + +class TheappModelAdmin(admin.ModelAdmin): + objuser = None + + def __load_sysfields(self, objmodel, t="i"): + strplatform = u.get_platform() + strnow = u.get_now() + # bug(self.objuser,"objuser en load") + user = "anonym" if not self.objuser else str(self.objuser.id) + + if t=="i": + objmodel.insert_platform = strplatform + objmodel.insert_user = user + objmodel.insert_date = strnow + objmodel.is_enabled = "1" + objmodel.code_cache = u.get_uuid() + elif t=="u": + objmodel.update_platform = strplatform + objmodel.update_user = user + objmodel.update_date = strnow + elif t=="d": + objmodel.delete_platform = strplatform + objmodel.delete_user = user + objmodel.delete_date = strnow + + objmodel.cru_csvnote = t + objmodel.is_erpsent = None + + + def save_model(self, request, obj, form, change): + sc("TheappModelAdmin.save_model executed...") + # necesito el usuario para cargar sysfields + self.objuser = request.user + # No se porque estas 2 trazas me fastidian el guardado + pr(obj,"AppModelAdmin.save_model.obj") + pr(self.objuser,"TheappModelAdmin.self.objuser") + pr(request,"AppModelAdmin.save_model.request") + pr(form,"AppModelAdmin.save_model.form") + pr(change,"AppModelAdmin.save_model.change") # true + + # indica si es insert o update + t = "u" if change else "i" + self.__load_sysfields(obj,t) + # obj.update_user = request.user.id + pr(obj,"AppModelAdmin.save_model.obj justo antes de guardar") + super().save_model(request, obj, form, change) \ No newline at end of file diff --git a/apirest/theapp/admin/sections/register.py b/apirest/theapp/admin/sections/register.py new file mode 100644 index 00000000..c0c8e101 --- /dev/null +++ b/apirest/theapp/admin/sections/register.py @@ -0,0 +1,22 @@ +s("theapp.admin.sections.register.py") +from django.contrib import admin +from .admin_theapp import * +from .admin_apparray import * + +admin.site.register(AppArray,AppArrayAdmin) +admin.site.register(AppExam) +admin.site.register(AppExamsSentences) +admin.site.register(AppExamsUsers) +admin.site.register(AppExamsUsersEvalh) +admin.site.register(AppExamsUsersEvall) +admin.site.register(AppSentence) +admin.site.register(AppSentenceImages) +admin.site.register(AppSentencesUsers) +admin.site.register(AppSentenceTags) +admin.site.register(AppSentenceTr) +admin.site.register(AppTag) +admin.site.register(BaseLanguage) +admin.site.register(BaseLanguageLang) +admin.site.register(BaseUser) +admin.site.register(BaseUserArray) +admin.site.register(VersionDb) diff --git a/apirest/theapp/apps.py b/apirest/theapp/apps.py new file mode 100644 index 00000000..ac4f70d1 --- /dev/null +++ b/apirest/theapp/apps.py @@ -0,0 +1,6 @@ +s("theapp.apps.py") +from django.apps import AppConfig + + +class TheappConfig(AppConfig): + name = 'Learn Language API' diff --git a/apirest/theapp/migrations/0001_initial.py b/apirest/theapp/migrations/0001_initial.py new file mode 100644 index 00000000..66852b1a --- /dev/null +++ b/apirest/theapp/migrations/0001_initial.py @@ -0,0 +1,605 @@ +# Generated by Django 2.2 on 2019-04-20 20:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AppArray', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('type', models.CharField(blank=True, max_length=15, null=True)), + ('module', models.CharField(blank=True, max_length=25, null=True)), + ('id_tosave', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=250, null=True)), + ('order_by', models.IntegerField()), + ], + options={ + 'db_table': 'app_array', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppExam', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=200, null=True)), + ('is_notificable', models.IntegerField(blank=True, null=True)), + ('is_shareable', models.PositiveIntegerField()), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_exam', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppExamsSentences', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_sentence', models.IntegerField()), + ('id_exam', models.IntegerField()), + ('is_notificable', models.IntegerField(blank=True, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_exams_sentences', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppExamsUsers', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_user', models.IntegerField()), + ('id_exam', models.IntegerField()), + ('is_notificable', models.IntegerField(blank=True, null=True)), + ('is_owner', models.IntegerField(blank=True, null=True)), + ('is_read', models.IntegerField(blank=True, null=True)), + ('is_write', models.IntegerField(blank=True, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_exams_users', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppExamsUsersEvalh', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_exam_user', models.IntegerField()), + ('eval_date', models.CharField(blank=True, max_length=14, null=True)), + ('is_finished', models.IntegerField(blank=True, null=True)), + ('is_timeup', models.IntegerField(blank=True, null=True)), + ('rate_percent', models.DecimalField(blank=True, decimal_places=3, max_digits=8, null=True)), + ('id_type', models.IntegerField(blank=True, null=True)), + ('owner_notes', models.CharField(blank=True, max_length=250, null=True)), + ('pupil_notes', models.CharField(blank=True, max_length=250, null=True)), + ('owner_rate', models.DecimalField(blank=True, decimal_places=3, max_digits=8, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_exams_users_evalh', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppExamsUsersEvall', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_evalh', models.IntegerField()), + ('id_sentence', models.IntegerField()), + ('id_langfrom', models.IntegerField(blank=True, null=True)), + ('id_langto', models.IntegerField(blank=True, null=True)), + ('is_write', models.IntegerField(blank=True, null=True)), + ('is_listen', models.IntegerField(blank=True, null=True)), + ('is_image', models.IntegerField(blank=True, null=True)), + ('is_spoken', models.IntegerField(blank=True, null=True)), + ('i_result', models.IntegerField(blank=True, null=True)), + ('i_time', models.IntegerField(blank=True, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_exams_users_evall', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppSentence', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=200, null=True)), + ('text_orig', models.CharField(blank=True, max_length=500, null=True)), + ('path_audio', models.CharField(blank=True, max_length=500, null=True)), + ('url_resource', models.CharField(blank=True, max_length=500, null=True)), + ('id_language', models.IntegerField(blank=True, null=True)), + ('is_notificable', models.IntegerField(blank=True, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_sentence', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppSentenceImages', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=200, null=True)), + ('id_sentence', models.IntegerField()), + ('path_local', models.CharField(blank=True, max_length=500, null=True)), + ('url_resource', models.CharField(blank=True, max_length=500, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_sentence_images', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppSentencesUsers', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_user', models.IntegerField()), + ('id_sentence', models.IntegerField()), + ('is_notificable', models.IntegerField(blank=True, null=True)), + ('is_owner', models.IntegerField(blank=True, null=True)), + ('is_read', models.IntegerField(blank=True, null=True)), + ('is_write', models.IntegerField(blank=True, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_sentences_users', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppSentenceTags', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_sentence', models.IntegerField()), + ('id_tag', models.IntegerField()), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_sentence_tags', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppSentenceTimes', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_sentence', models.IntegerField()), + ('date_checked', models.CharField(blank=True, max_length=14, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_sentence_times', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppSentenceTr', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=200, null=True)), + ('text_tr', models.CharField(blank=True, max_length=500, null=True)), + ('id_language', models.IntegerField(blank=True, null=True)), + ('id_sentence', models.IntegerField(blank=True, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'app_sentence_tr', + 'managed': False, + }, + ), + migrations.CreateModel( + name='AppTag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_type', models.IntegerField(blank=True, null=True)), + ('description', models.CharField(blank=True, max_length=50, null=True)), + ('slug', models.CharField(blank=True, max_length=100, null=True)), + ('order_by', models.IntegerField()), + ], + options={ + 'db_table': 'app_tag', + 'managed': False, + }, + ), + migrations.CreateModel( + name='BaseLanguage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('id_tosave', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=250, null=True)), + ('code_iso', models.CharField(blank=True, max_length=10, null=True)), + ('order_by', models.IntegerField()), + ], + options={ + 'db_table': 'base_language', + 'managed': False, + }, + ), + migrations.CreateModel( + name='BaseLanguageLang', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('id_source', models.IntegerField(blank=True, null=True)), + ('id_language', models.IntegerField(blank=True, null=True)), + ('description', models.CharField(blank=True, max_length=250, null=True)), + ('order_by', models.IntegerField()), + ], + options={ + 'db_table': 'base_language_lang', + 'managed': False, + }, + ), + migrations.CreateModel( + name='BaseUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=200, null=True)), + ('first_name', models.CharField(blank=True, max_length=100, null=True)), + ('last_name', models.CharField(blank=True, max_length=100, null=True)), + ('email', models.CharField(blank=True, max_length=50, null=True)), + ('bo_login', models.CharField(blank=True, max_length=100, null=True)), + ('bo_password', models.CharField(blank=True, max_length=250, null=True)), + ('md_login', models.CharField(blank=True, max_length=100, null=True)), + ('md_password', models.CharField(blank=True, max_length=250, null=True)), + ('language', models.CharField(blank=True, max_length=50, null=True)), + ('id_language', models.IntegerField(blank=True, null=True)), + ('id_start_module', models.IntegerField(blank=True, null=True)), + ('path_picture', models.CharField(blank=True, max_length=100, null=True)), + ('id_profile', models.IntegerField(blank=True, null=True)), + ('code_type', models.CharField(blank=True, max_length=25, null=True)), + ('bo_tokenreset', models.CharField(blank=True, max_length=250, null=True)), + ('md_tokenreset', models.CharField(blank=True, max_length=250, null=True)), + ('log_attempts', models.IntegerField(blank=True, null=True)), + ('rating', models.IntegerField(blank=True, null=True)), + ], + options={ + 'db_table': 'base_user', + 'managed': False, + }, + ), + migrations.CreateModel( + name='BaseUserArray', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('type', models.CharField(blank=True, max_length=15, null=True)), + ('id_tosave', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=250, null=True)), + ('order_by', models.IntegerField()), + ], + options={ + 'db_table': 'base_user_array', + 'managed': False, + }, + ), + migrations.CreateModel( + name='Template', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=200, null=True)), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': '_template', + 'managed': False, + }, + ), + migrations.CreateModel( + name='TemplateArray', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('processflag', models.CharField(blank=True, max_length=5, null=True)), + ('insert_platform', models.CharField(blank=True, max_length=3, null=True)), + ('insert_user', models.CharField(blank=True, max_length=15, null=True)), + ('insert_date', models.CharField(blank=True, max_length=14, null=True)), + ('update_platform', models.CharField(blank=True, max_length=3, null=True)), + ('update_user', models.CharField(blank=True, max_length=15, null=True)), + ('update_date', models.CharField(blank=True, max_length=14, null=True)), + ('delete_platform', models.CharField(blank=True, max_length=3, null=True)), + ('delete_user', models.CharField(blank=True, max_length=15, null=True)), + ('delete_date', models.CharField(blank=True, max_length=14, null=True)), + ('cru_csvnote', models.CharField(blank=True, max_length=500, null=True)), + ('is_erpsent', models.CharField(blank=True, max_length=3, null=True)), + ('is_enabled', models.CharField(blank=True, max_length=3, null=True)), + ('i', models.IntegerField(blank=True, null=True)), + ('code_erp', models.CharField(blank=True, max_length=25, null=True)), + ('type', models.CharField(blank=True, max_length=15, null=True)), + ('id_tosave', models.CharField(blank=True, max_length=25, null=True)), + ('description', models.CharField(blank=True, max_length=250, null=True)), + ('order_by', models.IntegerField()), + ('code_cache', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': '_template_array', + 'managed': False, + }, + ), + migrations.CreateModel( + name='VersionDb', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.CharField(blank=True, max_length=14, null=True)), + ('version', models.CharField(blank=True, max_length=15, null=True)), + ('description', models.CharField(blank=True, max_length=500, null=True)), + ], + options={ + 'db_table': 'version_db', + 'managed': False, + }, + ), + ] diff --git a/apirest/theapp/migrations/__init__.py b/apirest/theapp/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/models/__init__.py b/apirest/theapp/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/models/fields.py b/apirest/theapp/models/fields.py new file mode 100644 index 00000000..9ec11fb2 --- /dev/null +++ b/apirest/theapp/models/fields.py @@ -0,0 +1,302 @@ +s("theapp.models.fields.py") +import re + +from django.core.exceptions import ValidationError +from django.db import models +from django.utils.translation import gettext_lazy as _ +from vendor.theframework import utils as u + +from datetime import datetime + + +# metodos que se pueden sobrescribir +# https://stackoverflow.com/questions/41206176/overriding-methods-for-defining-custom-model-field-in-django +class TheappDatetime(models.DateTimeField): + + """ + on save: + AppModelAdmin.save_model + TheappDatetime. + pre_save + get_db_prep_save + get_prep_value + -- read + select_format + from_db_value + to_python + """ + + def get_internal_type(self): + # sin este método da un error: 'str' object has no attribute 'tzinfo' + # pr("get_internal_type","CharField") + return "CharField" + + # este creo que no se usa para nada + def value_to_string(self, obj): + value = self.value_from_object(obj) + bug(value,"TheappDatetime.value_to_string.value X") + return value + + # métodos de lectura del registro + # def select_format(self, compiler, sql, params): + """ + Custom format for select clauses. For example, GIS columns need to be + selected as AsText(table.col) on MySQL as the table.col data can't be + used by Django. + """ + # bug(sql,"sql") + # bug(params,"params") + # return sql, params + + def from_db_value(self, value, expression, connection, context): + # pr(value,"TheappDatetime.from_db_value.value") + # pr(value,"TheappDatetime.from_db_value.value calling self.to_python") + # se recupera el valor de la bd, pero con esto no es suficiente, hay que pasarlo + # al formato que entiende django como booleano (True,False) + return self.to_python(value) + + def to_python(self, value): + + if isinstance(value,str): + value = u.get_objdatetime(value) + # bug(value,"to_python.u.get_datetime.value object") + else: + value = u.get_strdatetime(value) + # bug(value,"to_python.u.get_datetime.value string") + + return value + + # métodos al guardar, no afecta en nada + def pre_save(self, model_instance, add): + #bug(model_instance,"TheappDatetime.pre_save.model_instance ") + # bug(add,"TheappDatetime.pre_save.add") + # bug(self.attname,"TheappDatetime.pre_save.self.attname") + getat = getattr(model_instance, self.attname) + bug(getat,"TheappDatetime.pre_save.getattr") + return getat + + def get_db_prep_save(self, value, connection, prepared=False): + # bug(value,"TheappDatetime.get_db_prep_save.value W") + if value is not None: + value = u.get_objdatetime(value) + return self.get_db_prep_value(value, connection, prepared) + + def get_db_prep_value(self, value, connection, prepared=False): + # Casts dates into the format expected by the backend + if not prepared: + # bug(value,"TheappDatetime.get_db_prep_value.value not prepared") + value = self.get_prep_value(value) + # bug(value,"TheappDatetime.get_db_prep_value.get_prep_value.value not prepared") + + # value = connection.ops.adapt_datefield_value(value) + # bug(value,"TheappDatetime.get_db_prep_value.get_prep_value.value after adapt_datefield_value") + return value + + def get_db_prep_value_(self, value, connection, prepared=False): + # bug(value,"TheappDatetime.get_db_prep_value.value Y") + # Converting query values to database values + if value==None: + return None + value = u.get_objdatetime(value) + return value + + def get_prep_value(self, value): + # bug(value,"TheappDatetime.get_prep_value.value") + if value is not None: + value = u.get_strdatetime(value) + return value + + +class TheappBooleanField(models.BooleanField): +# class TheappBooleanField(models.CharField): + description = "Custom boolean" + + def __init__(self, *args, **kwargs): + kwargs['max_length'] = 1 + super(TheappBooleanField, self).__init__(*args, **kwargs) + + def deconstruct(self): + # pr("deconstruct","TheappBooleanField") + name, path, args, kwargs = super().deconstruct() + #pr(name,"deconstruct.name") + #pr(path,"deconstruct.path") + #pr(args,"deconstruct.args") + #pr(kwargs,"deconstruct.kwargs") + return name, path, args, kwargs + + # def db_type(self, connection): + # pr("db_type","TheappBooleanField") + # return "boolean" + + # from_db_value when the data is loaded from the database + def from_db_value(self, value, expression, connection, context): + # pr("from_db_value","TheappBooleanField") + # pr(value,"TheappBooleanField.from_db_value.value calling self.to_python") + # se recupera el valor de la bd, pero con esto no es suficiente, hay que pasarlo + # al formato que entiende django como booleano (True,False) + return self.to_python(value) + + # to_python() is called by deserialization and during the clean() method used from forms. + # lo que se mostrará en el formulario + def to_python(self, value): + """ + Convert the input value into the expected Python data type, raising + django.core.exceptions.ValidationError if the data can't be converted. + Return the converted value. Subclasses should override this. + """ + #pr(value,"TheappBooleanField.to_python.value - value to form") + if value is None: + #sc("to_python: return None") + return None # muestra unknown + elif value in (1,"1",'Y', 'y',True): + #sc("to_python: return True") + return True + elif value in (0,"0",'N', 'n', False): + #sc("to_python: return False") + return False + else: + raise ValueError + + # get_prep_value() Converting Python objects to query values + """ + def get_prep_value(self, value): + # Perform preliminary non-db specific value checks and conversions + pr(value,"TheappBooleanField.get_prep_value.value - py obj to query value") + if value is None: + return None + elif value in (1,"1",'Y', 'y',True): + return True + else: + return False + """ + + # get_db_prep_value() Converting query values to database values + # lo que se guardará en la bd + """ + def get_db_prep_value(self, value, *args, **kwargs): + pr("get_db_prep_value","TheappBooleanField") + pr(value,"TheappBooleanField.get_db_prep_value.value query val to db val") + if value is None: + return value + + newvalue = value + # newvalue = int(round(value * 33)) + # newvalue = False + pr(newvalue,"TheappBooleanField.get_db_prep_value.new-value") + return newvalue + + def formfield(self, **kwargs): + pr("formfield","TheappBooleanField") + pr(kwargs,"TheappBooleanField.formfield.kwargs") + from django.forms import FloatField + defaults = {'form_class': FloatField} + defaults.update(kwargs) + return super(TheappBooleanField, self).formfield(**defaults) + """ + + + +class TheappBooleanFieldTest(models.BooleanField): + + # debe devolver la tupla name, path, args, kwargs + def deconstruct(self): + pr("deconstruct","TheappBooleanField 2") + name, path, args, kwargs = super().deconstruct() + return name, path, args, kwargs + + # from_db_value when the data is loaded from the database + def from_db_value(self, value, expression, connection, context): + pr("from_db_value","TheappBooleanField 3") + if value is None: + return value + return int(0) # return 0/1 + + # to_python() is called by deserialization and during the clean() method used from forms. + def to_python(self, value): + pr("to_python","TheappBooleanField 4") + if value in ('Y', '1', True): + return "1" + if value in ('N', '0', False): + return "0" + + raise ValueError("valueerror: {}".format(value)) + + # get_prep_value() Converting Python objects to query values + def get_prep_value(self, value): + pr("get_prep_value","TheappBooleanField 5") + if value: + return '1' + else: + return '0' + + # get_db_prep_value() Converting query values to database values +""" + def get_db_prep_value(self, value, connection, prepared=False): + pr("get_db_prep_value","TheappBooleanField 6") + value = super().get_db_prep_value(value, connection, prepared) + if value is not None: + return connection.Database.Binary(value) + return value +""" + +def parse_hand(hand_string): + """Takes a string of cards and splits into a full hand.""" + p1 = re.compile('.{26}') + p2 = re.compile('..') + args = [p2.findall(x) for x in p1.findall(hand_string)] + if len(args) != 4: + raise ValidationError(_("Invalid input for a Hand instance")) + return Hand(*args) + +class HandField(models.Field): + + description = _("String (up to %(max_length)s)") + + def __init__(self, *args, **kwargs): + kwargs['max_length'] = 104 + super().__init__(*args, **kwargs) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + # Only include kwarg if it's not the default + # if self.separator != ",": + # kwargs['separator'] = self.separator + return name, path, args, kwargs + + # from_db_value when the data is loaded from the database + def from_db_value(self, value, expression, connection): + if value is None: + return value + return parse_hand(value) + + # to_python() is called by deserialization and during the clean() method used from forms. + def to_python(self, value): + if isinstance(value, Hand): + return value + + if value is None: + return value + + return parse_hand(value) + + # get_prep_value() Converting Python objects to query values + def get_prep_value(self, value): + return ''.join([''.join(l) for l in (value.north, + value.east, value.south, value.west)]) + + # get_db_prep_value() Converting query values to database values + def get_db_prep_value(self, value, connection, prepared=False): + value = super().get_db_prep_value(value, connection, prepared) + if value is not None: + return connection.Database.Binary(value) + return value + + # your database storage is similar in type to some other field, so you can use that other field’s logic to create the right column. + def get_internal_type(self): + return 'CharField' + + # To customize how the values are serialized by a serializer, you can override value_to_string(). + def value_to_string(self, obj): + value = self.value_from_object(obj) + return self.get_prep_value(value) + diff --git a/apirest/theapp/models/managers.py b/apirest/theapp/models/managers.py new file mode 100644 index 00000000..2f743763 --- /dev/null +++ b/apirest/theapp/models/managers.py @@ -0,0 +1,38 @@ +s("theapp.managers.py") +from django.db import models + +""" +https://youtu.be/rjUmA_pkGtw?t=382 +Los managers añaden funcionalidad a la propiedad objects, agrega metodos + +objects = MiManager() + +otra forma de hacer esto es con los models.QuerySet + +objects = MiQuerySet.as_manager() + +[queryset](https://youtu.be/rjUmA_pkGtw?t=596) + +class PostQuerySet(models.QuerySet): + def smaller_than(self, size): + return self.filter(comments__lt=size) + + def greater_than(self, size): + return self.filter(comments_gt=size) + + def get_matts_posts(self,username): + retun self.filter(author__username=username) + +class PostManager(models.Manager): + + def smaller_than(self, size): + return self.filter(comments__lt=size) + + def get_queryset(self): + return PostQuerySet(self.model, using=self._db) <--- ^^ + + def get_users_posts(self,username) + # en get_queryset() se devuelve una instancia del queryset de este modelo + # el QuerySet es una interfaz para lanzar consultas + return self.get_queryset().get_users_posts(username) +""" \ No newline at end of file diff --git a/apirest/theapp/models/models.py b/apirest/theapp/models/models.py new file mode 100644 index 00000000..b107b7c7 --- /dev/null +++ b/apirest/theapp/models/models.py @@ -0,0 +1,530 @@ +s("theapp.models.models.py") +# theapp/models.py +# This is an auto-generated Django model module. +# You'll have to do the following manually to clean this up: +# * Rearrange models' order +# * Make sure each model has one field with primary_key=True +# * Make sure each ForeignKey has `on_delete` set to the desired behavior. +# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table +# Feel free to rename the models, but don't rename db_table values or field names. +from django.db import models +# from .managers import * +from datetime import datetime +from .fields import * +from vendor.theframework import utils as u + +class TheappModel(models.Model): + + objuser = None + + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True, editable=False) + insert_user = models.CharField(max_length=15, blank=True, null=True, editable=False) + insert_date = models.CharField(max_length=14, blank=True, null=True, editable=False) + # insert_date = TheappDatetime(null=True, blank=True) + # insert_date = models.DateTimeField(null=True, blank=True) + # insert_date = UnixTimestampField() + insert_date = TheappDatetime() + update_platform = models.CharField(max_length=3, blank=True, null=True, editable=False) + update_user = models.CharField(max_length=15, blank=True, null=True, editable=False) + update_date = models.CharField(max_length=14, blank=True, null=True, editable=False) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + # is_enabled = models.CharField(max_length=3, blank=True, null=True) + # is_enabled = models.BooleanField(default="1") + is_enabled = TheappBooleanField(default="1") + i = models.IntegerField(blank=True, null=True) + + class Meta: + abstract = True + +# @admin.register(AppArray) +class AppArray(TheappModel): + + id = models.AutoField(primary_key=True) + type = models.CharField(max_length=15, blank=False, null=False, default="generic") + description = models.CharField(max_length=250, blank=False, null=False) + order_by = models.IntegerField(default=100, blank=False) + code_cache = models.CharField(max_length=250, blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + module = models.CharField(max_length=25, blank=True, null=True, default="global") + id_tosave = models.CharField(max_length=25, blank=True, null=True) + + class Meta: + managed = False # indica si se borrara la tabla al ejecutar las migraciones + unique_together = ('description', 'type',) + db_table = 'app_array' + + def __str__(self): + # no todos los modelos comparten description :S + return f'{self.description} ({self.id})' + + # con property se emula un campo que se puede instanciar en admin.py + @property + def desc_id(self): + # split explota description por " " y almacena todos los elementos en *first (es una lista) + # y el último lo guarda en last + *first, last = self.description.split() + first = " ".join(first) + return f'{last}, {first} ({self.id})' + + # https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model + # como sobreescribir para añadir operaciones extras + + +class AppExam(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + is_notificable = models.IntegerField(blank=True, null=True) + is_shareable = models.PositiveIntegerField() + url_video = models.CharField(max_length=1000, blank=True, null=True) + url_document = models.CharField(max_length=1000, blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_exam' + + +class AppExamsSentences(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_sentence = models.IntegerField() + id_exam = models.IntegerField() + is_notificable = models.IntegerField(blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_exams_sentences' + + +class AppExamsUsers(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_user = models.IntegerField() + id_exam = models.IntegerField() + is_notificable = models.IntegerField(blank=True, null=True) + is_owner = models.IntegerField(blank=True, null=True) + is_read = models.IntegerField(blank=True, null=True) + is_write = models.IntegerField(blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_exams_users' + + +class AppExamsUsersEvalh(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_exam_user = models.IntegerField() + eval_date = models.CharField(max_length=14, blank=True, null=True) + is_finished = models.IntegerField(blank=True, null=True) + is_timeup = models.IntegerField(blank=True, null=True) + rate_percent = models.DecimalField(max_digits=8, decimal_places=3, blank=True, null=True) + id_type = models.IntegerField(blank=True, null=True) + owner_notes = models.CharField(max_length=250, blank=True, null=True) + pupil_notes = models.CharField(max_length=250, blank=True, null=True) + owner_rate = models.DecimalField(max_digits=8, decimal_places=3, blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_exams_users_evalh' + + +class AppExamsUsersEvall(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_evalh = models.IntegerField() + id_sentence = models.IntegerField() + id_langfrom = models.IntegerField(blank=True, null=True) + id_langto = models.IntegerField(blank=True, null=True) + is_write = models.IntegerField(blank=True, null=True) + is_listen = models.IntegerField(blank=True, null=True) + is_image = models.IntegerField(blank=True, null=True) + is_spoken = models.IntegerField(blank=True, null=True) + i_result = models.IntegerField(blank=True, null=True) + i_time = models.IntegerField(blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_exams_users_evall' + + +class AppExamsUsersSchedule(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_exams_users = models.IntegerField() + id_level = models.IntegerField(blank=True, null=True) + date_checked = models.CharField(max_length=14, blank=True, null=True) + date_next = models.CharField(max_length=14, blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_exams_users_schedule' + + +class AppSentence(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + text_orig = models.CharField(max_length=500, blank=True, null=True) + path_audio = models.CharField(max_length=500, blank=True, null=True) + url_resource = models.CharField(max_length=500, blank=True, null=True) + id_language = models.IntegerField(blank=True, null=True) + is_notificable = models.IntegerField(blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_sentence' + + +class AppSentenceImages(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + id_sentence = models.IntegerField() + path_local = models.CharField(max_length=500, blank=True, null=True) + url_resource = models.CharField(max_length=500, blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_sentence_images' + + +class AppSentenceTags(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_sentence = models.IntegerField() + id_tag = models.IntegerField() + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_sentence_tags' + + +class AppSentenceTr(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + text_tr = models.CharField(max_length=500, blank=True, null=True) + id_language = models.IntegerField(blank=True, null=True) + id_sentence = models.IntegerField(blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_sentence_tr' + + +class AppSentencesUsers(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_user = models.IntegerField() + id_sentence = models.IntegerField() + is_notificable = models.IntegerField(blank=True, null=True) + is_owner = models.IntegerField(blank=True, null=True) + is_read = models.IntegerField(blank=True, null=True) + is_write = models.IntegerField(blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_sentences_users' + + +class AppTag(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_type = models.IntegerField(blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + slug = models.CharField(max_length=100, blank=True, null=True) + order_by = models.IntegerField() + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'app_tag' + + + + +class BaseLanguage(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + id_tosave = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + code_iso = models.CharField(max_length=10, blank=True, null=True) + order_by = models.IntegerField() + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'base_language' + + +class BaseLanguageLang(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + id_source = models.IntegerField(blank=True, null=True) + id_language = models.IntegerField(blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + order_by = models.IntegerField() + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'base_language_lang' + + +class BaseUser(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + id_country = models.IntegerField(blank=True, null=True) + id_language = models.IntegerField(blank=True, null=True) + path_picture = models.CharField(max_length=100, blank=True, null=True) + id_profile = models.IntegerField(blank=True, null=True) + tokenreset = models.CharField(max_length=250, blank=True, null=True) + log_attempts = models.IntegerField(blank=True, null=True) + rating = models.IntegerField(blank=True, null=True) + date_validated = models.CharField(max_length=14, blank=True, null=True) + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'base_user' + + +class BaseUserArray(models.Model): + processflag = models.CharField(max_length=5, blank=True, null=True) + insert_platform = models.CharField(max_length=3, blank=True, null=True) + insert_user = models.CharField(max_length=15, blank=True, null=True) + insert_date = models.CharField(max_length=14, blank=True, null=True) + update_platform = models.CharField(max_length=3, blank=True, null=True) + update_user = models.CharField(max_length=15, blank=True, null=True) + update_date = models.CharField(max_length=14, blank=True, null=True) + delete_platform = models.CharField(max_length=3, blank=True, null=True) + delete_user = models.CharField(max_length=15, blank=True, null=True) + delete_date = models.CharField(max_length=14, blank=True, null=True) + cru_csvnote = models.CharField(max_length=500, blank=True, null=True) + is_erpsent = models.CharField(max_length=3, blank=True, null=True) + is_enabled = models.CharField(max_length=3, blank=True, null=True) + i = models.IntegerField(blank=True, null=True) + code_erp = models.CharField(max_length=25, blank=True, null=True) + type = models.CharField(max_length=15, blank=True, null=True) + id_tosave = models.CharField(max_length=25, blank=True, null=True) + description = models.CharField(max_length=250, blank=True, null=True) + order_by = models.IntegerField() + code_cache = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'base_user_array' + + +class VersionDb(models.Model): + date = models.CharField(max_length=14, blank=True, null=True) + version = models.CharField(max_length=15, blank=True, null=True) + description = models.CharField(max_length=500, blank=True, null=True) + + class Meta: + managed = False + db_table = 'version_db' diff --git a/apirest/theapp/serializers.py b/apirest/theapp/serializers.py new file mode 100644 index 00000000..1f8ed649 --- /dev/null +++ b/apirest/theapp/serializers.py @@ -0,0 +1,155 @@ +s("theapp.serializers.py") +# theapp/serializers.py + +""" +https://youtu.be/RoxEX9DFF7s?t=578 +Los serializadores. Son como los formularios de Django + +""" +from rest_framework import serializers +from .models.models import * +from vendor.theframework import utils as u + +class TheappSerializer(serializers.ModelSerializer): + objuser = None + + def __init__(self, *args, **kwargs): + self.objuser = kwargs["context"]["request"].user + pr(self.objuser.id,"TheappSerializer.self.objuser") + # pr(self.context,"TheappSerializer.self.context") + return super().__init__(*args, **kwargs) + + def create(self, validated_data): + pr(self.context,"TheappSerializer.create") + pr(validated_data,"create.validated_data") + self.__load_sysfields(validated_data) + return super().create(validated_data) + # return self.Meta.model.objects.create(**validated_data) + + def update(self, instance, validated_data): + pr(self.context,"TheappSerializer.update") + pr(validated_data,"update.validated_data") + self.__load_sysfields(validated_data,"u") + return super().update(instance, validated_data) + + + def __load_sysfields(self,validated_data, t="i"): + strplatform = u.get_platform() + strnow = u.get_now() + + validated_data["processflag"] = 0 + if t=="i": + validated_data["insert_platform"] = strplatform + validated_data["insert_user"] = self.objuser.id + validated_data["insert_date"] = strnow + validated_data["is_enabled"] = 1 + validated_data["code_cache"] = u.get_uuid() + elif t=="u": + validated_data["update_platform"] = strplatform + validated_data["update_user"] = self.objuser.id + validated_data["update_date"] = strnow + elif t=="d": + validated_data["delete_platform"] = strplatform + validated_data["delete_user"] = self.objuser.id + validated_data["delete_date"] = strnow + + validated_data["cru_csvnote"] = t + validated_data["is_erpsent"] = None + + + + +# override serializers: +# https://www.django-rest-framework.org/api-guide/serializers/ +# source code: +# https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py +class AppArraySerializer(TheappSerializer): + + class Meta: + model = AppArray + # __all__ muestra y acepta todos los campos de la petición + # fields = ("id","code_erp","type","module","id_tosave","description", "order_by") + fields = ("id","type","description","module","order_by") + + +class AppExamSerializer(serializers.ModelSerializer): + class Meta: + model = AppExam + fields = '__all__' + +class AppExamsSentencesSerializer(serializers.ModelSerializer): + class Meta: + model = AppExamsSentences + fields = '__all__' + +class AppExamsUsersSerializer(serializers.ModelSerializer): + class Meta: + model = AppExamsUsers + fields = '__all__' + +class AppExamsUsersEvalhSerializer(serializers.ModelSerializer): + class Meta: + model = AppExamsUsersEvalh + fields = '__all__' + +class AppExamsUsersEvallSerializer(serializers.ModelSerializer): + class Meta: + model = AppExamsUsersEvall + fields = '__all__' + +class AppSentenceSerializer(serializers.ModelSerializer): + class Meta: + model = AppSentence + fields = '__all__' + +class AppSentenceImagesSerializer(serializers.ModelSerializer): + class Meta: + model = AppSentenceImages + fields = '__all__' + +class AppSentencesUsersSerializer(serializers.ModelSerializer): + class Meta: + model = AppSentencesUsers + fields = '__all__' + +class AppSentenceTagsSerializer(serializers.ModelSerializer): + class Meta: + model = AppSentenceTags + fields = '__all__' + + + +class AppSentenceTrSerializer(serializers.ModelSerializer): + class Meta: + model = AppSentenceTr + fields = '__all__' + +class AppTagSerializer(serializers.ModelSerializer): + class Meta: + model = AppTag + fields = '__all__' + +class BaseLanguageSerializer(serializers.ModelSerializer): + class Meta: + model = BaseLanguage + fields = '__all__' + +class BaseLanguageLangSerializer(serializers.ModelSerializer): + class Meta: + model = BaseLanguageLang + fields = '__all__' + +class BaseUserSerializer(serializers.ModelSerializer): + class Meta: + model = BaseUser + fields = '__all__' + +class BaseUserArraySerializer(serializers.ModelSerializer): + class Meta: + model = BaseUserArray + fields = '__all__' + +class VersionDbSerializer(serializers.ModelSerializer): + class Meta: + model = VersionDb + fields = '__all__' diff --git a/apirest/theapp/static/css/git b/apirest/theapp/static/css/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/static/img/git b/apirest/theapp/static/img/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/static/js/git b/apirest/theapp/static/js/git new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/templates/theapp/base.html b/apirest/theapp/templates/theapp/base.html new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/templates/theapp/detail.html b/apirest/theapp/templates/theapp/detail.html new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/templates/theapp/list.html b/apirest/theapp/templates/theapp/list.html new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/tests/__int__.py b/apirest/theapp/tests/__int__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/theapp/tests/test_datetime.py b/apirest/theapp/tests/test_datetime.py new file mode 100644 index 00000000..8c6a2754 --- /dev/null +++ b/apirest/theapp/tests/test_datetime.py @@ -0,0 +1,52 @@ +# theapp/tests/test_datetime.py +import os +from datetime import datetime +from pytz import timezone + +from django.test import TestCase + +class DatetimeTest(TestCase): + # https://www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/ + + strdate = "20190102153348" + + def tes_strdate(self): + strdate = self.strdate + sc("test_strdate:") + pr(strdate,"strdate") + objdatetime = datetime.strptime(strdate,'%Y%m%d%H%M%S')#.strftime('%m/%d/%Y') + prtype(objdatetime) # datetime.datetime + # print(dir(objdatetime)) + bug(objdatetime,"objdatetime") + # pr(type(objdatetime),"type") + # print(objdatetime) + strdatetime = datetime.strptime(strdate,'%Y%m%d%H%M%S').strftime('%Y-%m-%d %H:%M:%S') + pr(strdatetime) + # self.assertEqual(1,True) + + def tes_tzinfo(self): + sc("test_tzinfo:") + obj = datetime.tzinfo + pr(obj,"datetime.tzinfo") + strdate = self.strdate + objdatetime = datetime.strptime(strdate,'%Y%m%d%H%M%S') + objdatetimeutc = timezone('UTC').localize(objdatetime) + bug(objdatetimeutc,"objdatetimeutc") + + def tes_tzinfo2(self): + # https://stackoverflow.com/questions/79797/how-to-convert-local-time-string-to-utc + # import pytz, datetime + local = pytz.timezone ("America/Los_Angeles") + naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S") + local_dt = local.localize(naive, is_dst=None) + utc_dt = local_dt.astimezone(pytz.utc) + utc_dt.strftime ("%Y-%m-%d %H:%M:%S") + + def test_isoformat(self): + isoformat = datetime.today().isoformat() + bug(isoformat,"datetime.today().isoformat()") + +""" +py manage.py test theapp.tests.test_datetime +""" + diff --git a/apirest/theapp/tests/test_managers.py b/apirest/theapp/tests/test_managers.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apirest/theapp/tests/test_managers.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apirest/theapp/tests/test_models.py b/apirest/theapp/tests/test_models.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apirest/theapp/tests/test_models.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apirest/theapp/tests/test_theframework.py b/apirest/theapp/tests/test_theframework.py new file mode 100644 index 00000000..0698dd73 --- /dev/null +++ b/apirest/theapp/tests/test_theframework.py @@ -0,0 +1,43 @@ +import os +from django.test import TestCase + +# https://docs.djangoproject.com/en/2.2/topics/testing/overview/ +# from theframework.components import * +# import components +from components.component_log import ComponentLog + +class ComponentLogTest(TestCase): + + def get_currpath(self): + strdirpath = os.getcwd() + return strdirpath + + def is_file(self,pathfile): + return os.path.exists(pathfile) + + def get_pathlog(self): + from datetime import datetime + strfilename = "app_"+(datetime.now()).strftime("%Y%m%d")+".log" + pathfolder = self.get_currpath() + pathfile = os.path.join( + pathfolder, + "debug", + strfilename) + return pathfile + + + def test_logdebug(self): + pr("test_logdebug") + o = ComponentLog() + o.save("texto de 11111") + o.save("texto de prueba2 con titulo","Linea 2") + pathlogfile = self.get_pathlog() + pr("is_file:"+pathlogfile) + isFile = self.is_file(pathlogfile) + pr("result: "+str(isFile)) + self.assertEqual(isFile,True) + + +""" +Probar este test: py manage.py test ./theapp/tests +""" diff --git a/apirest/theapp/tests/tests_views.py b/apirest/theapp/tests/tests_views.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apirest/theapp/tests/tests_views.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apirest/theapp/urls.py b/apirest/theapp/urls.py new file mode 100644 index 00000000..f3debc4e --- /dev/null +++ b/apirest/theapp/urls.py @@ -0,0 +1,41 @@ +s("theapp.urls.py") +# app-url +# learnlang\theapp\urls.py +# rerouting all requests that have api in the url to the apps.core.urls +from django.conf.urls import url +from rest_framework import routers +from theapp.views import * +from rest_framework_swagger.views import get_swagger_view + +router = routers.DefaultRouter() + +router.register(r'apparray', AppArrayViewSet) +router.register(r'appexam', AppExamViewSet) +router.register(r'appexamssentences', AppExamsSentencesViewSet) +router.register(r'appexamsusers', AppExamsUsersViewSet) +router.register(r'appexamsusersevalh', AppExamsUsersEvalhViewSet) +router.register(r'appexamsusersevall', AppExamsUsersEvallViewSet) +router.register(r'appsentence', AppSentenceViewSet) +router.register(r'appsentenceimages', AppSentenceImagesViewSet) +router.register(r'appsentencesusers', AppSentencesUsersViewSet) +router.register(r'appsentencetags', AppSentenceTagsViewSet) +# router.register(r'appsentencetimes', AppSentenceTimesViewSet) +router.register(r'appsentencetr', AppSentenceTrViewSet) +router.register(r'apptag', AppTagViewSet) +router.register(r'baselanguage', BaseLanguageViewSet) +router.register(r'baselanguagelang', BaseLanguageLangViewSet) +router.register(r'baseuser', BaseUserViewSet) +router.register(r'baseuserarray', BaseUserArrayViewSet) +# router.register(r'template', TemplateViewSet) +# router.register(r'templatearray', TemplateArrayViewSet) +router.register(r'versiondb', VersionDbViewSet) + +#rutas para vistas personalizadas +schema_view = get_swagger_view(title='Pastebin API') + +urlpatterns = [ + url(r'customview', CustomView.as_view()), + url(r'^docs/', schema_view) +] + +urlpatterns += router.urls \ No newline at end of file diff --git a/apirest/theapp/views.py b/apirest/theapp/views.py new file mode 100644 index 00000000..4b53572b --- /dev/null +++ b/apirest/theapp/views.py @@ -0,0 +1,112 @@ +s("theapp.views.py") +# theapp/views.py +from django.shortcuts import render + +from rest_framework import viewsets +from .models.models import * +from .serializers import * +from vendor.theframework import utils as u + +class AppViewSet(viewsets.ModelViewSet): + + def destroy(self, request, *args, **kwargs): + """ + Realiza soft-delete + """ + objmodel = self.get_object() + pr(objmodel,"AppViewSet.destroy.objmodel") + objmodel.delete_date = u.get_now() + objmodel.delete_user = request.user.id + objmodel.delete_platform = u.get_platform() + objmodel.save() + return Response(data='delete success') + + + +class AppArrayViewSet(AppViewSet): + # queryset = AppArray.objects.all() + queryset = AppArray.objects.filter(delete_date=None) + serializer_class = AppArraySerializer + + def __init__(self, *args, **kwargs): + # pr(dir(self),"AppArrayViewSet.__init__.self.request") + pr(args,"AppArrayViewSet.__init__.self.args") + pr(kwargs,"AppArrayViewSet.__init__.self.kwargs") + return super().__init__(*args, **kwargs) + + # https://www.django-rest-framework.org/api-guide/viewsets/ + # https://stackoverflow.com/questions/30650008/django-rest-framework-override-create-in-modelserializer-passing-an-extra-par + +class AppExamViewSet(viewsets.ModelViewSet): + queryset = AppExam.objects.all() + serializer_class = AppExamSerializer + +class AppExamsSentencesViewSet(viewsets.ModelViewSet): + queryset = AppExamsSentences.objects.all() + serializer_class = AppExamsSentencesSerializer + +class AppExamsUsersViewSet(viewsets.ModelViewSet): + queryset = AppExamsUsers.objects.all() + serializer_class = AppExamsUsersSerializer + +class AppExamsUsersEvalhViewSet(viewsets.ModelViewSet): + queryset = AppExamsUsersEvalh.objects.all() + serializer_class = AppExamsUsersEvalhSerializer + +class AppExamsUsersEvallViewSet(viewsets.ModelViewSet): + queryset = AppExamsUsersEvall.objects.all() + serializer_class = AppExamsUsersEvallSerializer + +class AppSentenceViewSet(viewsets.ModelViewSet): + queryset = AppSentence.objects.all() + serializer_class = AppSentenceSerializer + +class AppSentenceImagesViewSet(viewsets.ModelViewSet): + queryset = AppSentenceImages.objects.all() + serializer_class = AppSentenceImagesSerializer + +class AppSentencesUsersViewSet(viewsets.ModelViewSet): + queryset = AppSentencesUsers.objects.all() + serializer_class = AppSentencesUsersSerializer + +class AppSentenceTagsViewSet(viewsets.ModelViewSet): + queryset = AppSentenceTags.objects.all() + serializer_class = AppSentenceTagsSerializer + +class AppSentenceTrViewSet(viewsets.ModelViewSet): + queryset = AppSentenceTr.objects.all() + serializer_class = AppSentenceTrSerializer + +class AppTagViewSet(viewsets.ModelViewSet): + queryset = AppTag.objects.all() + serializer_class = AppTagSerializer + +class BaseLanguageViewSet(viewsets.ModelViewSet): + queryset = BaseLanguage.objects.all() + serializer_class = BaseLanguageSerializer + +class BaseLanguageLangViewSet(viewsets.ModelViewSet): + queryset = BaseLanguageLang.objects.all() + serializer_class = BaseLanguageLangSerializer + +class BaseUserViewSet(viewsets.ModelViewSet): + queryset = BaseUser.objects.all() + serializer_class = BaseUserSerializer + +class BaseUserArrayViewSet(viewsets.ModelViewSet): + queryset = BaseUserArray.objects.all() + serializer_class = BaseUserArraySerializer + +class VersionDbViewSet(viewsets.ModelViewSet): + queryset = VersionDb.objects.all() + serializer_class = VersionDbSerializer + + +from rest_framework.views import APIView, Response + +class CustomView(APIView): + def get(self, request, format=None): + return Response("Some Get Response") + + def post(self, request, format=None): + return Response("Some Post Response") \ No newline at end of file diff --git a/apirest/vendor/__init__.py b/apirest/vendor/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/vendor/theframework/__init__.py b/apirest/vendor/theframework/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apirest/vendor/theframework/builtins_ext.py b/apirest/vendor/theframework/builtins_ext.py new file mode 100644 index 00000000..00523560 --- /dev/null +++ b/apirest/vendor/theframework/builtins_ext.py @@ -0,0 +1,200 @@ +# builtins_ext.py 1.0.0 +import builtins +from pprint import pprint + +""" +http://ozzmaker.com/add-colour-to-text-in-python/ +The above ANSI escape code will set the text colour to bright green. The format is; +\033[ Escape code, this is always the same +1 = Style, 1 for normal. +32 = Text colour, 32 for bright green. +40m = Background colour, 40 is for black. +""" +pythontypes = { + "boolean": ("bool"), + "numeric": ("int","float"), + "string": ("str"), + "structure": ("array","dict","list","tuple","set"), # file + "function": ("function"), + "primitives": ("bool","int","float","str") + # import types + # types.GeneratorType +} + +class CheckType(): + + @staticmethod + def is_bool(mxvar): + return isinstance(mxvar, bool) + + @staticmethod + def is_float(mxvar): + return isinstance(mxvar, float) + + @staticmethod + def is_int(mxvar): + return isinstance(mxvar, int) + + @staticmethod + def is_float(mxvar): + return isinstance(mxvar, float) + + @staticmethod + def is_string(mxvar): + return isinstance(mxvar, str) + + @staticmethod + def is_list(mxvar): + return isinstance(mxvar, list) + @staticmethod + def is_dict(mxvar): + return isinstance(mxvar, dict) + + @staticmethod + def is_tuple(mxvar): + return isinstance(mxvar, tuple) + + @staticmethod + def has_dict(mxvar): + return hasattr(mxvar, '__dict__') + + @staticmethod + def is_primitive(mxvar): + return (CheckType.is_bool(mxvar) or CheckType.is_int(mxvar) + or CheckType.is_float(mxvar) or CheckType.is_string(mxvar) + ) + + @staticmethod + def is_structure(mxvar): + return (CheckType.is_list(mxvar) or CheckType.is_dict(mxvar) + or CheckType.is_tuple(mxvar) + ) + + +def is_primitive(mxvar): + return CheckType.is_primitive(mxvar) + +def is_structure(mxvar): + return CheckType.is_structure(mxvar) + +def has_dict(mxvar): + return CheckType.has_dict(mxvar) + +def get_strcolored(strval,colcode): + strreturn = "\033[{}m{}\033[00m".format(colcode,strval) + return strreturn + +def get_dictcolored(dictvar): + lstret = [] + for k,v in dictvar.__dict__.items(): + strkey = " .%s" % k + strval = "%s" % v + lstret.append(get_strkvcolored(strkey, strval)) + + return "\n".join(lstret) + +def printcol(primval,colcode="5;30;47"): + if is_primitive(primval): + primval = str(primval) + strval = get_strcolored(primval,colcode) + print(strval) + +def get_strkvcolored(strkey,strval): + strreturn = "" + # strkey = "\033[0;95m{}\033[00m" .format(strkey) + strkey = get_strcolored(strkey,"0;95") + strval = get_strcolored(strval,"1;96") + strreturn = strkey + " = "+ strval + return strreturn + +def get_strobject(obj): + # strobj = ["obj"] + strobj = [] + for strattr in dir(obj): + strkey = " .%s" % (strattr) + strval = "%s" % getattr(obj, strattr) + strobj.append(get_strkvcolored(strkey, strval)) + + return "\n".join(strobj) + +def print_format_table(): + """ + https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-terminal-in-python + prints table of formatted text format options + """ + for style in range(8): + for fg in range(30,38): + s1 = '' + for bg in range(40,48): + format = ';'.join([str(style), str(fg), str(bg)]) + s1 += '\x1b[%sm %s \x1b[0m' % (format, format) + print(s1) + print('\n') + +# print_format_table() + +def prtype(mxvar): + print(type(mxvar)) + +def s(strtext): + if is_primitive(strtext): + strtext = str(strtext) + printcol(strtext,"94") + +def sc(strtext,colcode="7;34;47"): + if is_primitive(strtext): + strtext = str(strtext) + printcol(strtext,colcode) + +def pr(mxvar, strtitle="", isjustdic=1): + # https://github.com/shiena/ansicolor/blob/master/README.md + if strtitle: + printcol(strtitle,"6;30;43") + + if has_dict(mxvar): + print(get_dictcolored(mxvar)) + + if is_primitive(mxvar): + printcol(mxvar) + return + + if is_structure(mxvar): + pprint(mxvar) + return + + if isjustdic: + return + + printcol("type:"+str(type(mxvar)),"6;30;43") + # ya lo devuelve con colores + mxvar = get_strobject(mxvar) + print(mxvar) + + +def bug(mxvar,strtitle=""): + # https://github.com/shiena/ansicolor/blob/master/README.md + if strtitle: + printcol(strtitle,"6;30;42") + + if has_dict(mxvar): + print(get_dictcolored(mxvar)) + + if is_primitive(mxvar): + printcol(mxvar) + return + + if is_structure(mxvar): + pprint(mxvar) + return + + # ya lo devuelve con colores + mxvar = get_strobject(mxvar) + print(mxvar) + + +builtins.s = s +builtins.sc = sc +builtins.pr = pr +builtins.prtype = prtype +builtins.bug = bug + diff --git a/apirest/vendor/theframework/utils.py b/apirest/vendor/theframework/utils.py new file mode 100644 index 00000000..93fd5ba4 --- /dev/null +++ b/apirest/vendor/theframework/utils.py @@ -0,0 +1,69 @@ +s("theframework.utils.py") +# utils\utils.py +import random +from datetime import datetime +from pytz import timezone +import uuid + +def get_now(): + strnow = datetime.now() + strtoday = "{}{:02d}{:02d}{:02d}{:02d}{:02d}".format( + strnow.year, strnow.month, strnow.day, + strnow.hour, strnow.minute, strnow.second + ) + + return strtoday + +def get_uuid(): + return str(uuid.uuid1()) + # return str(uuid.uuid4()) este se repite + +def get_objdatetime(strdatetime): + # strdatetime = "20190102153348" + strdatetime = str(strdatetime) + strdatetime = strdatetime.replace(" ","").replace("-","").replace(":","") + if len(strdatetime)<14: + strdatetime += "0000" + objdatetimeutc = datetime.strptime(strdatetime,'%Y%m%d%H%M%S')#.strftime('%m/%d/%Y') + + # esta me parece bien para el listado pero no va bien para el form de modif ya que necesito un obj fecha + # objdatetimeutc = timezone('UTC').localize(objdatetime).strftime('%Y-%m-%d %H:%M:%S') #en django: 2019-05-03 20:20:04 + + # objdatetimeutc = timezone('UTC').localize(objdatetime) #mostraria en django: May 3, 2019, 8:20 p.m. + return objdatetimeutc + +def get_strdatetime(objdatetime): + #sc(str(type(objdatetime))) + #bug(objdatetime,"objdatetime") + # en los filtros viene como string: 2019-05-19 00:00:00+00:00 + if isinstance(objdatetime,str): + strdatetime = objdatetime.replace(" ","").replace("-","").replace(":","") + strdatetime = strdatetime[0:14] + sc(objdatetime+" -> "+strdatetime) + else: + strdatetime = objdatetime.strftime('%Y%m%d%H%M%S') + return strdatetime + + +def get_platform(): + """ + de base_array: + 1 by user on db + 2 dts + 3 backoffice + 4 mobile + """ + return str(random.randint(1,4)) + + +def get_session_user(isint=1): + if not isint: + return str(random.randint(1,10)) + return random.randint(1,10) + + +def get_cruhist(): + lstactions = ["created","modified","deleted"] + i = random.randint(0,len(lstactions)-1) + return lstactions[i] + diff --git a/apis/Pipfile b/apis/Pipfile new file mode 100644 index 00000000..1191d165 --- /dev/null +++ b/apis/Pipfile @@ -0,0 +1,13 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +requests = "*" +dotenv = "*" + +[requires] +python_version = "3.7" diff --git a/apis/Pipfile.lock b/apis/Pipfile.lock new file mode 100644 index 00000000..717a8049 --- /dev/null +++ b/apis/Pipfile.lock @@ -0,0 +1,57 @@ +{ + "_meta": { + "hash": { + "sha256": "bb57e0d7853b45999e47c163c46b95bc2fde31c527d8d7b5b5539dc979444a6d" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "certifi": { + "hashes": [ + "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", + "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" + ], + "version": "==2019.9.11" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, + "requests": { + "hashes": [ + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + ], + "index": "pypi", + "version": "==2.22.0" + }, + "urllib3": { + "hashes": [ + "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", + "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + ], + "version": "==1.25.6" + } + }, + "develop": {} +} diff --git a/apis/__init__.py b/apis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apis/apis.egg-info/PKG-INFO b/apis/apis.egg-info/PKG-INFO new file mode 100644 index 00000000..663910df --- /dev/null +++ b/apis/apis.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: apis +Version: 1.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/apis/apis.egg-info/SOURCES.txt b/apis/apis.egg-info/SOURCES.txt new file mode 100644 index 00000000..56be93b5 --- /dev/null +++ b/apis/apis.egg-info/SOURCES.txt @@ -0,0 +1,12 @@ +setup.py +apis.egg-info/PKG-INFO +apis.egg-info/SOURCES.txt +apis.egg-info/dependency_links.txt +apis.egg-info/top_level.txt +components/__init__.py +components/component_file.py +components/component_log.py +components/component_request.py +components/t.py +uploadco/__init__.py +uploadco/main.py \ No newline at end of file diff --git a/apis/apis.egg-info/dependency_links.txt b/apis/apis.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/apis/apis.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/apis/apis.egg-info/top_level.txt b/apis/apis.egg-info/top_level.txt new file mode 100644 index 00000000..0d9d8253 --- /dev/null +++ b/apis/apis.egg-info/top_level.txt @@ -0,0 +1,2 @@ +components +uploadco diff --git a/apis/components/__init__.py b/apis/components/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apis/components/component_dirs.py b/apis/components/component_dirs.py new file mode 100644 index 00000000..40c4e41c --- /dev/null +++ b/apis/components/component_dirs.py @@ -0,0 +1,41 @@ +# component_dirs.py +import os +import sys +import glob +from pprint import pprint + +class ComponentDirs: + + def __init__(self,pathdir=None): + self.pathdir = pathdir + if pathdir is None: + self.pathdir = os.path.dirname(__file__) + # __init__ + + def _get_list_files(path): + # returns a list of names (with extension, without full path) of all files + # in folder path + files = [] + for name in os.listdir(path): + if os.path.isfile(os.path.join(path, name)): + files.append(name) + return files + # list_files + + def is_file(self,path): + return os.path.isfile(path) + + def is_dir(self,path): + return os.path.isdir(path) + + def get_folder_content(self): + print(glob.glob(self.pathdir)) + for itemcontent in os.scandir(self.pathdir): + pprint(itemcontent) + # get_folder_content + +if __name__ == "__main__": + pass + + + \ No newline at end of file diff --git a/apis/components/component_file.py b/apis/components/component_file.py new file mode 100644 index 00000000..2a18a1fd --- /dev/null +++ b/apis/components/component_file.py @@ -0,0 +1,25 @@ +# print("components/component_file.py") +from contextlib import contextmanager + +@contextmanager +def fopen(pathfile, opt="r"): + f = open(pathfile, opt) + try: + yield f + finally: + f.close() +#fopen + +def fwrite(pathfile, strcontent): + with fopen(pathfile,"a") as f: + f.write(strcontent) +#fwrite + +def foverwrite(pathfile, strcontent): + with fopen(pathfile,"w") as f: + f.write(strcontent) +#foverwrite + +def get_content(pathfile): + return open(pathfile,'r').read() +# get_content \ No newline at end of file diff --git a/apis/components/component_log.py b/apis/components/component_log.py new file mode 100644 index 00000000..b5d02557 --- /dev/null +++ b/apis/components/component_log.py @@ -0,0 +1,54 @@ +# component_log.py +import os.path +from time import gmtime, strftime +from .component_file import fwrite + +global pathdirlogs + +pathdirlogs = os.path.dirname(os.path.abspath(__file__)) +pathdirlogs = os.path.realpath(pathdirlogs+"/../../../logs") + +def lg(mxvalue,strtitle="",strtype="debug"): + global pathdirlogs + + strtoday = strftime("%Y%m%d", gmtime()) + strnow = "- "+strftime("%Y-%m-%d %H:%M:%S", gmtime())+":" + + strcontent = "\n"+strnow + if(strtitle): + strcontent += "\n" + strtitle + + strcontent += "\n" + + if(not isinstance(mxvalue, str)): + strcontent += repr(mxvalue) + else: + strcontent += mxvalue + + logname = "pycmd_"+strtoday +".log" + pathfile = os.path.realpath(pathdirlogs +"/"+strtype+"/"+logname) + print(pathfile) + fwrite(pathfile, strcontent) +#lg + +def lgd(mxvalue,strtitle="",print=0): + if(print): + sc(strtitle,"2;37;42") + sc(mxvalue,"2;37;42") + lg(mxvalue, strtitle, strtype="debug") +#lgd + +def lgerr(mxvalue,strtitle="",print=0): + if(print): + sc(strtitle,"7;33;41") + sc(mxvalue,"7;33;41") + lg(mxvalue, strtitle, strtype="errors") +#lgerr + +def lgsql(mxvalue,strtitle="",print=0): + if(print): + sc(strtitle,"5;37;46") + sc(mxvalue,"5;37;46") + lg(mxvalue, strtitle, strtype="sql") +#lgsql + diff --git a/apis/components/component_request.py b/apis/components/component_request.py new file mode 100644 index 00000000..545312b8 --- /dev/null +++ b/apis/components/component_request.py @@ -0,0 +1,81 @@ + +import requests +import json +from pprint import pprint +import hashlib + +class ComponentRequest: + + # https://api.openload.co/1/account/info?login={login}&key={key} + # https://api.openload.co/1/file/listfolder?login={login}&key={key}&folder={folder} + def __init__(self,login,key): + self.login = login + self.key = key + + def _get_content(self,strurl): + objresp = requests.get(strurl) + dictjson = json.loads(objresp.content) + return dictjson + + def get_folder_list(self): + print("\nget_list_folder:") + strurl = "https://api.openload.co/1/file/listfolder?login={login}&key={key}" + strurl = strurl.format(login=self.login,key=self.key) + + dictjson = self._get_content(strurl) + print(dictjson) + return dictjson + #get_folder_list + + def get_folder_content(self,ifolder): + print("\nget_folder_content:") + strurl = "https://api.openload.co/1/file/listfolder?login={}&key={}&folder={}" + strurl = strurl.format(self.login,self.key,ifolder) + dictjson = self._get_content(strurl) + return dictjson + #get_folder_content + + def get_account_info(self): + print("\nget_account_info:") + strurl = "https://api.openload.co/1/account/info?login={login}&key={key}" + strurl = strurl.format(login=self.login,key=self.key) + dictjson = self._get_content(strurl) + return dictjson + # get_account_info + + def upload(self,pathlocal,ifolder): + print("\nupload:") + BLOCKSIZE = 65536 + objsha1 = hashlib.sha1() + with open(pathlocal, 'rb') as afile: + objbuf = afile.read(BLOCKSIZE) + while len(objbuf) > 0: + objsha1.update(objbuf) + objbuf = afile.read(BLOCKSIZE) + + strsha1 = objsha1.hexdigest() + + strurl = "https://api.openload.co/1/file/ul?login={login}&key={key}&sha1={sha1}&folder=8306116" + strurl = strurl.format(login=self.login, key=self.key, sha1=strsha1) + + dictjson = self._get_content(strurl) + strurlup = dictjson["result"]["url"] + # print(strurlup) + objresp = requests.post(url=strurlup, headers={}, files={"file1":open(pathlocal,"rb"),}) + dictjson = json.loads(objresp.text) + return dictjson + # upload + + def get_file_info(self,ifile): + strurl = "https://api.openload.co/1/file/info?file={file}&login={login}&key={key}" + strurl = strurl.format(ifile,self.login,self.key) + + # get_file_info + + + + + +if __name__=="__main__": + o = ComponentRequest() + o.run() diff --git a/apis/components/component_sqlite3.py b/apis/components/component_sqlite3.py new file mode 100644 index 00000000..3b80fbf2 --- /dev/null +++ b/apis/components/component_sqlite3.py @@ -0,0 +1,39 @@ +import os +import sqlite3 +from sqlite3 import Error + +def get_connection(db_file=None): + """ create a database connection to a SQLite database """ + if db_file is None: + strthispath = os.path.join(os.path.dirname(__file__), '..')+"\openloadco\db_openloadco.db" + db_file = os.path.realpath(strthispath) + + conn = None + try: + conn = sqlite3.connect(db_file) + print(sqlite3.version) + return conn + except Error as e: + print("error") + print(e) + + +def insert_loc_folder(tplparams): + """ + no funciona ^^ que sorpresa! + """ + sql = ''' INSERT INTO loc_folder(fullpath,status) + VALUES(?,?) ''' + conn = get_connection() + cur = conn.cursor() + cur.execute(sql,tplparams) + conn.commit() + conn.close() + return cur.lastrowid + +if __name__ == '__main__': + strthispath = os.path.join(os.path.dirname(__file__), '..')+"\openloadco\db_openloadco.db" + strthispath = os.path.realpath(strthispath) + #print(strthispath) + strid = insert_loc_folder(("xx","yy",)) + print(strid) \ No newline at end of file diff --git a/apis/components/t.py b/apis/components/t.py new file mode 100644 index 00000000..6321daae --- /dev/null +++ b/apis/components/t.py @@ -0,0 +1,4 @@ +print("t.py") + +def go(strin): + print(strin) \ No newline at end of file diff --git a/apis/main.py b/apis/main.py new file mode 100644 index 00000000..886904e5 --- /dev/null +++ b/apis/main.py @@ -0,0 +1,4 @@ +from components.t import go + +if __name__ == "__main__": + go("eaf") \ No newline at end of file diff --git a/apis/openloadco/README.md b/apis/openloadco/README.md new file mode 100644 index 00000000..ddb02e56 --- /dev/null +++ b/apis/openloadco/README.md @@ -0,0 +1,8 @@ +## [openload.co/api](https://openload.co/api) + +### Notas: +- Hay que ejecutar `pipenv shell` +- Ejecutar: `pip install -e .` +- Dentro del entorno virtual ya se puede trabajar como app aislada +- Usando requirements: https://medium.com/python-pandemonium/better-python-dependency-and-package-management-b5d8ea29dff1 +- Hay que instalar usando `pipenv install ` \ No newline at end of file diff --git a/apis/openloadco/__init__.py b/apis/openloadco/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/apis/openloadco/__init__.py @@ -0,0 +1 @@ + diff --git a/apis/openloadco/config/.env_example b/apis/openloadco/config/.env_example new file mode 100644 index 00000000..06a81afd --- /dev/null +++ b/apis/openloadco/config/.env_example @@ -0,0 +1,2 @@ +API_USERNAME: some-username +API_PASSWORD: some-password \ No newline at end of file diff --git a/apis/openloadco/db_openloadco.db b/apis/openloadco/db_openloadco.db new file mode 100644 index 00000000..4eeafe36 Binary files /dev/null and b/apis/openloadco/db_openloadco.db differ diff --git a/apis/openloadco/main.py b/apis/openloadco/main.py new file mode 100644 index 00000000..b43c0004 --- /dev/null +++ b/apis/openloadco/main.py @@ -0,0 +1,54 @@ +import os +import sys +import time + +from pprint import pprint +from components.component_file import * +from components.component_request import ComponentRequest +from components.component_dirs import ComponentDirs +from dotenv import load_dotenv + +def die(variable=None): + if variable is not None: + pprint(variable) + sys.exit() +# die + +if __name__=="__main__": + pathenvfile = os.path.dirname(os.path.abspath(__file__))+"/config/.env" + pathenvfile = os.path.realpath(pathenvfile) + # print(pathenvfile) + load_dotenv(pathenvfile) + + login = os.getenv("API_USERNAME") + key = os.getenv("API_PASSWORD") + + objdir = ComponentDirs() + objdir.get_folder_content() + die() + + objreq = ComponentRequest(login,key) + objdict = objreq.get_folder_list() + folders = objdict["result"]["folders"] + pprint(folders) + + for dic in folders: + foldername = dic["name"] + print(foldername) + + if dic["name"].find(".")==True: + continue + + folderid = dic["id"] + dicfolder = objreq.get_folder_content(folderid) + if dic["name"] == "gstring": + pprint(dicfolder) + sys.exit() + + + objreq.upload( + "C:\\Users\\ioedu\\Desktop\\temp.html", + "8306116", + ) + objreq.get_account_info() + #print(objreq) \ No newline at end of file diff --git a/apis/requirements.txt b/apis/requirements.txt new file mode 100644 index 00000000..25b26e7e --- /dev/null +++ b/apis/requirements.txt @@ -0,0 +1,7 @@ +-e git+https://github.com/eacevedof/prj_python37.git@29fcd14a97de9018bd8f611fa3b2228a9217d45e#egg=apis&subdirectory=apis +certifi==2019.9.11 +chardet==3.0.4 +idna==2.8 +python-dotenv==0.10.3 +requests==2.22.0 +urllib3==1.25.6 diff --git a/apis/setup.py b/apis/setup.py new file mode 100644 index 00000000..b54a7d40 --- /dev/null +++ b/apis/setup.py @@ -0,0 +1,2 @@ +from setuptools import setup, find_packages +setup(name='apis', version='1.0', packages=find_packages()) \ No newline at end of file diff --git a/computed-vision/README.md b/computed-vision/README.md new file mode 100644 index 00000000..5df0e56d --- /dev/null +++ b/computed-vision/README.md @@ -0,0 +1,17 @@ +### recursos +- [APRENDE A DETECTAR OBJETOS DESDE CERO](https://www.youtube.com/watch?v=zpRl8rEvjbo&list=PLnKxR99sdlEiRC4sBFwSJ-8SiDW4Gx6y6) +- 1 [Crea tu propio Dataset Personalizado Python Yolov5](https://youtu.be/zpRl8rEvjbo?si=zLf0Eso3jyQFIH5q) + - [makesense.ai crear etiquetas](https://makesense.ai) + + +### errores: +- macos 11 +``` +2024-04-21 12:17:11.824120: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. +To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. +Traceback (most recent call last): +``` + +### camara arduino: +- https://www.amazon.es/SingTown-OpenMV-Genuine-5MP-Definition-Processing/dp/B09WYQMDX2 +- https://openmv.io/products/openmv-cam-rt \ No newline at end of file diff --git a/computed-vision/__init__.py b/computed-vision/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/computed-vision/cars_detector/.gitignore b/computed-vision/cars_detector/.gitignore new file mode 100644 index 00000000..03be4989 --- /dev/null +++ b/computed-vision/cars_detector/.gitignore @@ -0,0 +1,2 @@ +data/images/*.* +data/labels/*.* \ No newline at end of file diff --git a/computed-vision/cars_detector/__init__.py b/computed-vision/cars_detector/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/computed-vision/cars_detector/data/images/train/-images-auto-custom-15417-original-2024-acura-integra-type-s-angular-front-1.jpg b/computed-vision/cars_detector/data/images/train/-images-auto-custom-15417-original-2024-acura-integra-type-s-angular-front-1.jpg new file mode 100644 index 00000000..a784cda7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/-images-auto-custom-15417-original-2024-acura-integra-type-s-angular-front-1.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/001-2024-hyundai-sonata-n-line-front-three-quarter-motion-lead.jpg b/computed-vision/cars_detector/data/images/train/001-2024-hyundai-sonata-n-line-front-three-quarter-motion-lead.jpg new file mode 100644 index 00000000..b9b80d2e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/001-2024-hyundai-sonata-n-line-front-three-quarter-motion-lead.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/0x0.jpg b/computed-vision/cars_detector/data/images/train/0x0.jpg new file mode 100644 index 00000000..00f71c66 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/0x0.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/100-best-luxury-cars.jpg b/computed-vision/cars_detector/data/images/train/100-best-luxury-cars.jpg new file mode 100644 index 00000000..6a99324b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/100-best-luxury-cars.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/1066461b5705cbd2a4a074dfa7df12e9.jpg b/computed-vision/cars_detector/data/images/train/1066461b5705cbd2a4a074dfa7df12e9.jpg new file mode 100644 index 00000000..501534dc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/1066461b5705cbd2a4a074dfa7df12e9.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/1200px-2019_Toyota_Corolla_Icon_Tech_VVT-i_Hybrid_1.8.jpg b/computed-vision/cars_detector/data/images/train/1200px-2019_Toyota_Corolla_Icon_Tech_VVT-i_Hybrid_1.8.jpg new file mode 100644 index 00000000..a4ee9fcf Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/1200px-2019_Toyota_Corolla_Icon_Tech_VVT-i_Hybrid_1.8.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/180320-flying-car-aeromobil50-se-143p.jpg b/computed-vision/cars_detector/data/images/train/180320-flying-car-aeromobil50-se-143p.jpg new file mode 100644 index 00000000..237358ab Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/180320-flying-car-aeromobil50-se-143p.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/1af0ca3f-5236-47a5-a487-32b49ec94f27.png b/computed-vision/cars_detector/data/images/train/1af0ca3f-5236-47a5-a487-32b49ec94f27.png new file mode 100644 index 00000000..9d6ca2fb Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/1af0ca3f-5236-47a5-a487-32b49ec94f27.png differ diff --git a/computed-vision/cars_detector/data/images/train/2019-honda-civic-sedan-1558453497.jpg b/computed-vision/cars_detector/data/images/train/2019-honda-civic-sedan-1558453497.jpg new file mode 100644 index 00000000..c6d3af38 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2019-honda-civic-sedan-1558453497.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2021-best-cars-ford-mustang-hero-mobile.jpg b/computed-vision/cars_detector/data/images/train/2021-best-cars-ford-mustang-hero-mobile.jpg new file mode 100644 index 00000000..375ae312 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2021-best-cars-ford-mustang-hero-mobile.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2023-EQE350-SEDAN-AVP-DR.png b/computed-vision/cars_detector/data/images/train/2023-EQE350-SEDAN-AVP-DR.png new file mode 100644 index 00000000..cad48ae7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2023-EQE350-SEDAN-AVP-DR.png differ diff --git a/computed-vision/cars_detector/data/images/train/2023-chevrolet-corvette-z06-13.jpg b/computed-vision/cars_detector/data/images/train/2023-chevrolet-corvette-z06-13.jpg new file mode 100644 index 00000000..62b3a000 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2023-chevrolet-corvette-z06-13.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2023-chevrolet-corvette-z06-14.jpg b/computed-vision/cars_detector/data/images/train/2023-chevrolet-corvette-z06-14.jpg new file mode 100644 index 00000000..79eed392 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2023-chevrolet-corvette-z06-14.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2023-lucid-air-1.jpg b/computed-vision/cars_detector/data/images/train/2023-lucid-air-1.jpg new file mode 100644 index 00000000..0747ccf2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2023-lucid-air-1.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2023_Hyundai_Ioniq_6_Review_Lead_In.jpeg b/computed-vision/cars_detector/data/images/train/2023_Hyundai_Ioniq_6_Review_Lead_In.jpeg new file mode 100644 index 00000000..fef1883d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2023_Hyundai_Ioniq_6_Review_Lead_In.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/2024-lucid-air-sapphire-117-64cd3bf322c9a.jpg b/computed-vision/cars_detector/data/images/train/2024-lucid-air-sapphire-117-64cd3bf322c9a.jpg new file mode 100644 index 00000000..03984aa0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2024-lucid-air-sapphire-117-64cd3bf322c9a.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2025-chevrolet-corvette-suv-102-6452e1aa3b345.jpg b/computed-vision/cars_detector/data/images/train/2025-chevrolet-corvette-suv-102-6452e1aa3b345.jpg new file mode 100644 index 00000000..ead61a8b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2025-chevrolet-corvette-suv-102-6452e1aa3b345.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/2204-new-models-guide.jpg b/computed-vision/cars_detector/data/images/train/2204-new-models-guide.jpg new file mode 100644 index 00000000..3d1828a2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/2204-new-models-guide.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/24-jan-do-promotile-ma-644x454.jpg b/computed-vision/cars_detector/data/images/train/24-jan-do-promotile-ma-644x454.jpg new file mode 100644 index 00000000..6c292abb Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/24-jan-do-promotile-ma-644x454.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/24-mar-do-promotile-eq-644x454.jpg b/computed-vision/cars_detector/data/images/train/24-mar-do-promotile-eq-644x454.jpg new file mode 100644 index 00000000..2ad1ad5c Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/24-mar-do-promotile-eq-644x454.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/30-1.jpg b/computed-vision/cars_detector/data/images/train/30-1.jpg new file mode 100644 index 00000000..a4b954af Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/30-1.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/360_F_213750591_6bVeg9sH1cD7wEvYhb2OUyHOesJzPtAL.jpg b/computed-vision/cars_detector/data/images/train/360_F_213750591_6bVeg9sH1cD7wEvYhb2OUyHOesJzPtAL.jpg new file mode 100644 index 00000000..362321ac Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/360_F_213750591_6bVeg9sH1cD7wEvYhb2OUyHOesJzPtAL.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/360_F_216604243_4yvQhIudgknAWu04Ob7aSOu6BdIfhBNb.jpg b/computed-vision/cars_detector/data/images/train/360_F_216604243_4yvQhIudgknAWu04Ob7aSOu6BdIfhBNb.jpg new file mode 100644 index 00000000..dcdd7f69 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/360_F_216604243_4yvQhIudgknAWu04Ob7aSOu6BdIfhBNb.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/640px-2017_Toyota_Camry_28ASV70R29_SX_sedan_282018-11-0229_01.jpg b/computed-vision/cars_detector/data/images/train/640px-2017_Toyota_Camry_28ASV70R29_SX_sedan_282018-11-0229_01.jpg new file mode 100644 index 00000000..c53a4ae9 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/640px-2017_Toyota_Camry_28ASV70R29_SX_sedan_282018-11-0229_01.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/658e5b5ebba32-xiaomi-su7-ev-to-take-on-tesla-293837105-16x9.jpg b/computed-vision/cars_detector/data/images/train/658e5b5ebba32-xiaomi-su7-ev-to-take-on-tesla-293837105-16x9.jpg new file mode 100644 index 00000000..530f4b47 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/658e5b5ebba32-xiaomi-su7-ev-to-take-on-tesla-293837105-16x9.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/884b28bd-d67f-4c90-a7e5-a066090db8f7.png b/computed-vision/cars_detector/data/images/train/884b28bd-d67f-4c90-a7e5-a066090db8f7.png new file mode 100644 index 00000000..872fc77d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/884b28bd-d67f-4c90-a7e5-a066090db8f7.png differ diff --git a/computed-vision/cars_detector/data/images/train/9.20DeLorean-Alpha-5205BDeLorean5D.jpg b/computed-vision/cars_detector/data/images/train/9.20DeLorean-Alpha-5205BDeLorean5D.jpg new file mode 100644 index 00000000..189709dd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/9.20DeLorean-Alpha-5205BDeLorean5D.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/960x0.jpg b/computed-vision/cars_detector/data/images/train/960x0.jpg new file mode 100644 index 00000000..a3d4c316 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/960x0.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/Audi-RS-Q3-ABT-8-2.png b/computed-vision/cars_detector/data/images/train/Audi-RS-Q3-ABT-8-2.png new file mode 100644 index 00000000..3d7b8a58 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/Audi-RS-Q3-ABT-8-2.png differ diff --git a/computed-vision/cars_detector/data/images/train/Average20Weight20Of20A20Car.jpg b/computed-vision/cars_detector/data/images/train/Average20Weight20Of20A20Car.jpg new file mode 100644 index 00000000..971ab130 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/Average20Weight20Of20A20Car.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/Buying-Selling-Trading-In-Cars.jpg b/computed-vision/cars_detector/data/images/train/Buying-Selling-Trading-In-Cars.jpg new file mode 100644 index 00000000..7f8994f9 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/Buying-Selling-Trading-In-Cars.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/Hyundai-Venue-2022-1160x653.jpg b/computed-vision/cars_detector/data/images/train/Hyundai-Venue-2022-1160x653.jpg new file mode 100644 index 00000000..bd6228ee Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/Hyundai-Venue-2022-1160x653.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/astondbx_adc_redherodynamic_1080x1920_72dpi.jpg b/computed-vision/cars_detector/data/images/train/astondbx_adc_redherodynamic_1080x1920_72dpi.jpg new file mode 100644 index 00000000..a6907a97 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/astondbx_adc_redherodynamic_1080x1920_72dpi.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/bd784bbb8df3189579511325ba82f0b3.jpg b/computed-vision/cars_detector/data/images/train/bd784bbb8df3189579511325ba82f0b3.jpg new file mode 100644 index 00000000..2247d39b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/bd784bbb8df3189579511325ba82f0b3.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/bmw-vision-neue-klasse-concept-car5-64ecd9b81229e.jpg b/computed-vision/cars_detector/data/images/train/bmw-vision-neue-klasse-concept-car5-64ecd9b81229e.jpg new file mode 100644 index 00000000..a3862665 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/bmw-vision-neue-klasse-concept-car5-64ecd9b81229e.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/bmwi4_029.jpg b/computed-vision/cars_detector/data/images/train/bmwi4_029.jpg new file mode 100644 index 00000000..132628d5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/bmwi4_029.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/car-5548242_1280.jpg b/computed-vision/cars_detector/data/images/train/car-5548242_1280.jpg new file mode 100644 index 00000000..d934caef Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/car-5548242_1280.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/cars-sale-stock-row-car-600nw-636632101.jpg b/computed-vision/cars_detector/data/images/train/cars-sale-stock-row-car-600nw-636632101.jpg new file mode 100644 index 00000000..ca06113b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/cars-sale-stock-row-car-600nw-636632101.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/cdb010124tenbest-trucks-104-6569f09cb4352.jpg b/computed-vision/cars_detector/data/images/train/cdb010124tenbest-trucks-104-6569f09cb4352.jpg new file mode 100644 index 00000000..8441f284 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/cdb010124tenbest-trucks-104-6569f09cb4352.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/coche-lujoso-estacionado-carretera-faro-iluminado-al-atardecer_181624-60607.jpg b/computed-vision/cars_detector/data/images/train/coche-lujoso-estacionado-carretera-faro-iluminado-al-atardecer_181624-60607.jpg new file mode 100644 index 00000000..1bea3cf7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/coche-lujoso-estacionado-carretera-faro-iluminado-al-atardecer_181624-60607.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/conduccion-automoviles-deportivos-carretera-asfaltada-noche-ia-generativa_188544-8052.jpg b/computed-vision/cars_detector/data/images/train/conduccion-automoviles-deportivos-carretera-asfaltada-noche-ia-generativa_188544-8052.jpg new file mode 100644 index 00000000..9543f51f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/conduccion-automoviles-deportivos-carretera-asfaltada-noche-ia-generativa_188544-8052.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/dw-burnett-pcoty22-8260-1671143390.jpg b/computed-vision/cars_detector/data/images/train/dw-burnett-pcoty22-8260-1671143390.jpg new file mode 100644 index 00000000..be8b4200 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/dw-burnett-pcoty22-8260-1671143390.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/dwburnett-demon-garlits-1352-1517591562.jpg b/computed-vision/cars_detector/data/images/train/dwburnett-demon-garlits-1352-1517591562.jpg new file mode 100644 index 00000000..d918e421 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/dwburnett-demon-garlits-1352-1517591562.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/f7cfeada56951abeb13ebedece73f3f8.jpg b/computed-vision/cars_detector/data/images/train/f7cfeada56951abeb13ebedece73f3f8.jpg new file mode 100644 index 00000000..54a5dfab Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/f7cfeada56951abeb13ebedece73f3f8.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/feature6-1366x768.jpg b/computed-vision/cars_detector/data/images/train/feature6-1366x768.jpg new file mode 100644 index 00000000..6e276c70 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/feature6-1366x768.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/front-left-side-47.jpg b/computed-vision/cars_detector/data/images/train/front-left-side-47.jpg new file mode 100644 index 00000000..98c7643a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/front-left-side-47.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/front-left-side-472.jpg b/computed-vision/cars_detector/data/images/train/front-left-side-472.jpg new file mode 100644 index 00000000..97491d1d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/front-left-side-472.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/front-left-side-473.jpg b/computed-vision/cars_detector/data/images/train/front-left-side-473.jpg new file mode 100644 index 00000000..1ea80581 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/front-left-side-473.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/front-left-side-474.jpg b/computed-vision/cars_detector/data/images/train/front-left-side-474.jpg new file mode 100644 index 00000000..5935d8f1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/front-left-side-474.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/fronx-exterior-right-front-three-quarter-109.jpeg b/computed-vision/cars_detector/data/images/train/fronx-exterior-right-front-three-quarter-109.jpeg new file mode 100644 index 00000000..0b210d41 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/fronx-exterior-right-front-three-quarter-109.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/home-hero-tiago-01.jpg b/computed-vision/cars_detector/data/images/train/home-hero-tiago-01.jpg new file mode 100644 index 00000000..017405b2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/home-hero-tiago-01.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/honda-prelude-concept-front-three-quarters-653927960f1f4.jpg b/computed-vision/cars_detector/data/images/train/honda-prelude-concept-front-three-quarters-653927960f1f4.jpg new file mode 100644 index 00000000..c09686bf Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/honda-prelude-concept-front-three-quarters-653927960f1f4.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/how-to-create-a-car-NewBlogCover.png b/computed-vision/cars_detector/data/images/train/how-to-create-a-car-NewBlogCover.png new file mode 100644 index 00000000..6b9a15b6 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/how-to-create-a-car-NewBlogCover.png differ diff --git a/computed-vision/cars_detector/data/images/train/i20_Modelpc.png b/computed-vision/cars_detector/data/images/train/i20_Modelpc.png new file mode 100644 index 00000000..fc192bc8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/i20_Modelpc.png differ diff --git a/computed-vision/cars_detector/data/images/train/image.jpeg b/computed-vision/cars_detector/data/images/train/image.jpeg new file mode 100644 index 00000000..39edbd4e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image10.jpeg b/computed-vision/cars_detector/data/images/train/image10.jpeg new file mode 100644 index 00000000..d92175b5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image10.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image11.jpeg b/computed-vision/cars_detector/data/images/train/image11.jpeg new file mode 100644 index 00000000..09201f5e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image11.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image12.jpeg b/computed-vision/cars_detector/data/images/train/image12.jpeg new file mode 100644 index 00000000..a65dc612 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image12.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image14.jpeg b/computed-vision/cars_detector/data/images/train/image14.jpeg new file mode 100644 index 00000000..d1726ecd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image14.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image15.jpeg b/computed-vision/cars_detector/data/images/train/image15.jpeg new file mode 100644 index 00000000..75fc8b71 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image15.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image16.jpeg b/computed-vision/cars_detector/data/images/train/image16.jpeg new file mode 100644 index 00000000..bee1ad72 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image16.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image18.jpeg b/computed-vision/cars_detector/data/images/train/image18.jpeg new file mode 100644 index 00000000..26b6481e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image18.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image19.jpeg b/computed-vision/cars_detector/data/images/train/image19.jpeg new file mode 100644 index 00000000..2b7b3bf6 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image19.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image2.jpeg b/computed-vision/cars_detector/data/images/train/image2.jpeg new file mode 100644 index 00000000..39edbd4e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image2.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image21.jpeg b/computed-vision/cars_detector/data/images/train/image21.jpeg new file mode 100644 index 00000000..4edc2959 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image21.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image22.jpeg b/computed-vision/cars_detector/data/images/train/image22.jpeg new file mode 100644 index 00000000..abc39953 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image22.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image23.jpeg b/computed-vision/cars_detector/data/images/train/image23.jpeg new file mode 100644 index 00000000..5b35ede7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image23.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image25.jpeg b/computed-vision/cars_detector/data/images/train/image25.jpeg new file mode 100644 index 00000000..656d1e76 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image25.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image26.jpeg b/computed-vision/cars_detector/data/images/train/image26.jpeg new file mode 100644 index 00000000..a25e5307 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image26.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image28.jpeg b/computed-vision/cars_detector/data/images/train/image28.jpeg new file mode 100644 index 00000000..1eb8defd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image28.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image3.jpeg b/computed-vision/cars_detector/data/images/train/image3.jpeg new file mode 100644 index 00000000..96c656d0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image3.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image30.png b/computed-vision/cars_detector/data/images/train/image30.png new file mode 100644 index 00000000..c96f1f51 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image30.png differ diff --git a/computed-vision/cars_detector/data/images/train/image5.jpeg b/computed-vision/cars_detector/data/images/train/image5.jpeg new file mode 100644 index 00000000..63d13c45 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image5.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image6.jpeg b/computed-vision/cars_detector/data/images/train/image6.jpeg new file mode 100644 index 00000000..e4db6549 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image6.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image8.jpeg b/computed-vision/cars_detector/data/images/train/image8.jpeg new file mode 100644 index 00000000..d1f40ebc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image8.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/image9.jpeg b/computed-vision/cars_detector/data/images/train/image9.jpeg new file mode 100644 index 00000000..d1f40ebc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/image9.jpeg differ diff --git a/computed-vision/cars_detector/data/images/train/images.jpg b/computed-vision/cars_detector/data/images/train/images.jpg new file mode 100644 index 00000000..929782be Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images10.jpg b/computed-vision/cars_detector/data/images/train/images10.jpg new file mode 100644 index 00000000..f85d551f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images10.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images100.jpg b/computed-vision/cars_detector/data/images/train/images100.jpg new file mode 100644 index 00000000..ccf9103d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images100.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images101.jpg b/computed-vision/cars_detector/data/images/train/images101.jpg new file mode 100644 index 00000000..71974872 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images101.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images102.jpg b/computed-vision/cars_detector/data/images/train/images102.jpg new file mode 100644 index 00000000..55666d7a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images102.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images103.jpg b/computed-vision/cars_detector/data/images/train/images103.jpg new file mode 100644 index 00000000..6bf1c82e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images103.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images104.jpg b/computed-vision/cars_detector/data/images/train/images104.jpg new file mode 100644 index 00000000..1eb0dca0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images104.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images105.jpg b/computed-vision/cars_detector/data/images/train/images105.jpg new file mode 100644 index 00000000..23766f6e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images105.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images106.jpg b/computed-vision/cars_detector/data/images/train/images106.jpg new file mode 100644 index 00000000..3d53d5c4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images106.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images107.jpg b/computed-vision/cars_detector/data/images/train/images107.jpg new file mode 100644 index 00000000..fe388288 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images107.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images108.jpg b/computed-vision/cars_detector/data/images/train/images108.jpg new file mode 100644 index 00000000..302eb0dd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images108.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images109.jpg b/computed-vision/cars_detector/data/images/train/images109.jpg new file mode 100644 index 00000000..58cda6e9 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images109.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images11.jpg b/computed-vision/cars_detector/data/images/train/images11.jpg new file mode 100644 index 00000000..d5b81ecd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images11.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images110.jpg b/computed-vision/cars_detector/data/images/train/images110.jpg new file mode 100644 index 00000000..8761a4ec Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images110.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images111.jpg b/computed-vision/cars_detector/data/images/train/images111.jpg new file mode 100644 index 00000000..04c1b3fc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images111.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images112.jpg b/computed-vision/cars_detector/data/images/train/images112.jpg new file mode 100644 index 00000000..0ad4abfe Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images112.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images113.jpg b/computed-vision/cars_detector/data/images/train/images113.jpg new file mode 100644 index 00000000..4aa575cc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images113.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images114.jpg b/computed-vision/cars_detector/data/images/train/images114.jpg new file mode 100644 index 00000000..92245d0c Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images114.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images115.jpg b/computed-vision/cars_detector/data/images/train/images115.jpg new file mode 100644 index 00000000..3fe18034 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images115.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images116.jpg b/computed-vision/cars_detector/data/images/train/images116.jpg new file mode 100644 index 00000000..5b7c3123 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images116.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images117.jpg b/computed-vision/cars_detector/data/images/train/images117.jpg new file mode 100644 index 00000000..7068c526 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images117.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images118.jpg b/computed-vision/cars_detector/data/images/train/images118.jpg new file mode 100644 index 00000000..51103bab Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images118.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images119.jpg b/computed-vision/cars_detector/data/images/train/images119.jpg new file mode 100644 index 00000000..bbea305a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images119.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images12.jpg b/computed-vision/cars_detector/data/images/train/images12.jpg new file mode 100644 index 00000000..4c0687d1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images12.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images120.jpg b/computed-vision/cars_detector/data/images/train/images120.jpg new file mode 100644 index 00000000..f4f0bf93 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images120.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images121.jpg b/computed-vision/cars_detector/data/images/train/images121.jpg new file mode 100644 index 00000000..f9237974 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images121.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images122.jpg b/computed-vision/cars_detector/data/images/train/images122.jpg new file mode 100644 index 00000000..780da3cd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images122.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images123.jpg b/computed-vision/cars_detector/data/images/train/images123.jpg new file mode 100644 index 00000000..a76b3093 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images123.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images124.jpg b/computed-vision/cars_detector/data/images/train/images124.jpg new file mode 100644 index 00000000..05e12775 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images124.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images125.jpg b/computed-vision/cars_detector/data/images/train/images125.jpg new file mode 100644 index 00000000..ff8c3d26 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images125.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images126.jpg b/computed-vision/cars_detector/data/images/train/images126.jpg new file mode 100644 index 00000000..ec34fa17 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images126.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images127.jpg b/computed-vision/cars_detector/data/images/train/images127.jpg new file mode 100644 index 00000000..f5abace7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images127.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images128.jpg b/computed-vision/cars_detector/data/images/train/images128.jpg new file mode 100644 index 00000000..c0eba99a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images128.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images129.jpg b/computed-vision/cars_detector/data/images/train/images129.jpg new file mode 100644 index 00000000..d451f244 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images129.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images13.jpg b/computed-vision/cars_detector/data/images/train/images13.jpg new file mode 100644 index 00000000..d3ffb7d0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images13.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images130.jpg b/computed-vision/cars_detector/data/images/train/images130.jpg new file mode 100644 index 00000000..a9a425b9 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images130.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images131.jpg b/computed-vision/cars_detector/data/images/train/images131.jpg new file mode 100644 index 00000000..1fb7f063 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images131.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images132.jpg b/computed-vision/cars_detector/data/images/train/images132.jpg new file mode 100644 index 00000000..a547142a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images132.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images133.jpg b/computed-vision/cars_detector/data/images/train/images133.jpg new file mode 100644 index 00000000..1581b63d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images133.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images134.jpg b/computed-vision/cars_detector/data/images/train/images134.jpg new file mode 100644 index 00000000..4faa8279 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images134.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images135.jpg b/computed-vision/cars_detector/data/images/train/images135.jpg new file mode 100644 index 00000000..51611ce6 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images135.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images136.jpg b/computed-vision/cars_detector/data/images/train/images136.jpg new file mode 100644 index 00000000..6bcf3786 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images136.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images137.jpg b/computed-vision/cars_detector/data/images/train/images137.jpg new file mode 100644 index 00000000..cfbcbdf4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images137.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images138.jpg b/computed-vision/cars_detector/data/images/train/images138.jpg new file mode 100644 index 00000000..d2f59855 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images138.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images139.jpg b/computed-vision/cars_detector/data/images/train/images139.jpg new file mode 100644 index 00000000..c4e8c4fc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images139.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images14.jpg b/computed-vision/cars_detector/data/images/train/images14.jpg new file mode 100644 index 00000000..5c4a83c4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images14.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images140.jpg b/computed-vision/cars_detector/data/images/train/images140.jpg new file mode 100644 index 00000000..e3f322aa Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images140.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images141.jpg b/computed-vision/cars_detector/data/images/train/images141.jpg new file mode 100644 index 00000000..01759042 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images141.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images142.jpg b/computed-vision/cars_detector/data/images/train/images142.jpg new file mode 100644 index 00000000..7b31df5f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images142.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images143.jpg b/computed-vision/cars_detector/data/images/train/images143.jpg new file mode 100644 index 00000000..c081539f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images143.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images144.jpg b/computed-vision/cars_detector/data/images/train/images144.jpg new file mode 100644 index 00000000..f3dcf8aa Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images144.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images145.jpg b/computed-vision/cars_detector/data/images/train/images145.jpg new file mode 100644 index 00000000..4b9ca1e1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images145.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images146.jpg b/computed-vision/cars_detector/data/images/train/images146.jpg new file mode 100644 index 00000000..02c8e584 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images146.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images147.jpg b/computed-vision/cars_detector/data/images/train/images147.jpg new file mode 100644 index 00000000..8a69250d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images147.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images148.jpg b/computed-vision/cars_detector/data/images/train/images148.jpg new file mode 100644 index 00000000..b464fae4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images148.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images149.jpg b/computed-vision/cars_detector/data/images/train/images149.jpg new file mode 100644 index 00000000..13f2a602 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images149.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images15.jpg b/computed-vision/cars_detector/data/images/train/images15.jpg new file mode 100644 index 00000000..26c8449d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images15.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images150.jpg b/computed-vision/cars_detector/data/images/train/images150.jpg new file mode 100644 index 00000000..b731143a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images150.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images151.jpg b/computed-vision/cars_detector/data/images/train/images151.jpg new file mode 100644 index 00000000..6c4c01ea Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images151.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images152.jpg b/computed-vision/cars_detector/data/images/train/images152.jpg new file mode 100644 index 00000000..20261887 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images152.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images153.jpg b/computed-vision/cars_detector/data/images/train/images153.jpg new file mode 100644 index 00000000..f5b28cb6 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images153.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images154.jpg b/computed-vision/cars_detector/data/images/train/images154.jpg new file mode 100644 index 00000000..53e81afe Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images154.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images155.jpg b/computed-vision/cars_detector/data/images/train/images155.jpg new file mode 100644 index 00000000..2fe672c0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images155.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images156.jpg b/computed-vision/cars_detector/data/images/train/images156.jpg new file mode 100644 index 00000000..7f7b9f52 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images156.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images157.jpg b/computed-vision/cars_detector/data/images/train/images157.jpg new file mode 100644 index 00000000..c07e2a51 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images157.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images158.jpg b/computed-vision/cars_detector/data/images/train/images158.jpg new file mode 100644 index 00000000..dc99d0ae Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images158.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images159.jpg b/computed-vision/cars_detector/data/images/train/images159.jpg new file mode 100644 index 00000000..a39c25bf Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images159.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images16.jpg b/computed-vision/cars_detector/data/images/train/images16.jpg new file mode 100644 index 00000000..429fc1cc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images16.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images160.jpg b/computed-vision/cars_detector/data/images/train/images160.jpg new file mode 100644 index 00000000..e982f4f4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images160.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images161.jpg b/computed-vision/cars_detector/data/images/train/images161.jpg new file mode 100644 index 00000000..9d528e34 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images161.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images162.jpg b/computed-vision/cars_detector/data/images/train/images162.jpg new file mode 100644 index 00000000..2edbc6dd Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images162.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images163.jpg b/computed-vision/cars_detector/data/images/train/images163.jpg new file mode 100644 index 00000000..18024e18 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images163.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images164.jpg b/computed-vision/cars_detector/data/images/train/images164.jpg new file mode 100644 index 00000000..e27fd2cb Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images164.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images165.jpg b/computed-vision/cars_detector/data/images/train/images165.jpg new file mode 100644 index 00000000..71fbcfd5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images165.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images166.jpg b/computed-vision/cars_detector/data/images/train/images166.jpg new file mode 100644 index 00000000..7ea48117 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images166.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images167.jpg b/computed-vision/cars_detector/data/images/train/images167.jpg new file mode 100644 index 00000000..d440a03b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images167.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images168.jpg b/computed-vision/cars_detector/data/images/train/images168.jpg new file mode 100644 index 00000000..26f799f8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images168.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images169.jpg b/computed-vision/cars_detector/data/images/train/images169.jpg new file mode 100644 index 00000000..e417e6f3 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images169.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images17.jpg b/computed-vision/cars_detector/data/images/train/images17.jpg new file mode 100644 index 00000000..9a527bbe Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images17.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images170.jpg b/computed-vision/cars_detector/data/images/train/images170.jpg new file mode 100644 index 00000000..98ce7b56 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images170.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images171.jpg b/computed-vision/cars_detector/data/images/train/images171.jpg new file mode 100644 index 00000000..8b6aab17 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images171.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images172.jpg b/computed-vision/cars_detector/data/images/train/images172.jpg new file mode 100644 index 00000000..c42f6032 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images172.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images173.jpg b/computed-vision/cars_detector/data/images/train/images173.jpg new file mode 100644 index 00000000..fd612e4a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images173.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images174.jpg b/computed-vision/cars_detector/data/images/train/images174.jpg new file mode 100644 index 00000000..e19020a2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images174.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images175.jpg b/computed-vision/cars_detector/data/images/train/images175.jpg new file mode 100644 index 00000000..a59a1548 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images175.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images176.jpg b/computed-vision/cars_detector/data/images/train/images176.jpg new file mode 100644 index 00000000..09a41d3d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images176.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images177.jpg b/computed-vision/cars_detector/data/images/train/images177.jpg new file mode 100644 index 00000000..e39df75f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images177.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images179.jpg b/computed-vision/cars_detector/data/images/train/images179.jpg new file mode 100644 index 00000000..e5098920 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images179.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images18.jpg b/computed-vision/cars_detector/data/images/train/images18.jpg new file mode 100644 index 00000000..f0dd0e7a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images18.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images180.jpg b/computed-vision/cars_detector/data/images/train/images180.jpg new file mode 100644 index 00000000..79a71e3e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images180.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images181.jpg b/computed-vision/cars_detector/data/images/train/images181.jpg new file mode 100644 index 00000000..06440c04 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images181.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images182.jpg b/computed-vision/cars_detector/data/images/train/images182.jpg new file mode 100644 index 00000000..047da6f6 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images182.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images183.jpg b/computed-vision/cars_detector/data/images/train/images183.jpg new file mode 100644 index 00000000..514d6857 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images183.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images185.jpg b/computed-vision/cars_detector/data/images/train/images185.jpg new file mode 100644 index 00000000..c4779928 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images185.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images186.jpg b/computed-vision/cars_detector/data/images/train/images186.jpg new file mode 100644 index 00000000..8cb2c937 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images186.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images187.jpg b/computed-vision/cars_detector/data/images/train/images187.jpg new file mode 100644 index 00000000..75b5a184 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images187.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images188.jpg b/computed-vision/cars_detector/data/images/train/images188.jpg new file mode 100644 index 00000000..6f030496 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images188.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images189.jpg b/computed-vision/cars_detector/data/images/train/images189.jpg new file mode 100644 index 00000000..d0c527e7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images189.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images19.jpg b/computed-vision/cars_detector/data/images/train/images19.jpg new file mode 100644 index 00000000..ffccae45 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images19.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images190.jpg b/computed-vision/cars_detector/data/images/train/images190.jpg new file mode 100644 index 00000000..d630f2ed Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images190.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images191.jpg b/computed-vision/cars_detector/data/images/train/images191.jpg new file mode 100644 index 00000000..91f54805 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images191.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images192.jpg b/computed-vision/cars_detector/data/images/train/images192.jpg new file mode 100644 index 00000000..4502d31c Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images192.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images193.jpg b/computed-vision/cars_detector/data/images/train/images193.jpg new file mode 100644 index 00000000..91fd0050 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images193.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images194.jpg b/computed-vision/cars_detector/data/images/train/images194.jpg new file mode 100644 index 00000000..28905201 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images194.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images195.jpg b/computed-vision/cars_detector/data/images/train/images195.jpg new file mode 100644 index 00000000..a3104d59 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images195.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images196.jpg b/computed-vision/cars_detector/data/images/train/images196.jpg new file mode 100644 index 00000000..2a750c47 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images196.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images197.jpg b/computed-vision/cars_detector/data/images/train/images197.jpg new file mode 100644 index 00000000..27dfcc21 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images197.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images198.jpg b/computed-vision/cars_detector/data/images/train/images198.jpg new file mode 100644 index 00000000..df0c05d4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images198.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images199.jpg b/computed-vision/cars_detector/data/images/train/images199.jpg new file mode 100644 index 00000000..05fc9bf5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images199.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images2.jpg b/computed-vision/cars_detector/data/images/train/images2.jpg new file mode 100644 index 00000000..37afdda8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images2.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images20.jpg b/computed-vision/cars_detector/data/images/train/images20.jpg new file mode 100644 index 00000000..b8e09ea8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images20.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images200.jpg b/computed-vision/cars_detector/data/images/train/images200.jpg new file mode 100644 index 00000000..cf98abcb Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images200.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images202.jpg b/computed-vision/cars_detector/data/images/train/images202.jpg new file mode 100644 index 00000000..cab60013 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images202.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images203.jpg b/computed-vision/cars_detector/data/images/train/images203.jpg new file mode 100644 index 00000000..6fe95524 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images203.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images204.jpg b/computed-vision/cars_detector/data/images/train/images204.jpg new file mode 100644 index 00000000..2bb19353 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images204.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images205.jpg b/computed-vision/cars_detector/data/images/train/images205.jpg new file mode 100644 index 00000000..38d983f1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images205.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images206.jpg b/computed-vision/cars_detector/data/images/train/images206.jpg new file mode 100644 index 00000000..58cb431f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images206.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images207.jpg b/computed-vision/cars_detector/data/images/train/images207.jpg new file mode 100644 index 00000000..a8d95d2e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images207.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images208.jpg b/computed-vision/cars_detector/data/images/train/images208.jpg new file mode 100644 index 00000000..26e4f04f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images208.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images209.jpg b/computed-vision/cars_detector/data/images/train/images209.jpg new file mode 100644 index 00000000..e4ce4b3d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images209.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images21.jpg b/computed-vision/cars_detector/data/images/train/images21.jpg new file mode 100644 index 00000000..61270c87 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images21.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images22.jpg b/computed-vision/cars_detector/data/images/train/images22.jpg new file mode 100644 index 00000000..382e532a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images22.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images23.jpg b/computed-vision/cars_detector/data/images/train/images23.jpg new file mode 100644 index 00000000..8825ecf7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images23.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images24.jpg b/computed-vision/cars_detector/data/images/train/images24.jpg new file mode 100644 index 00000000..3a6746d2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images24.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images25.jpg b/computed-vision/cars_detector/data/images/train/images25.jpg new file mode 100644 index 00000000..e453d4c1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images25.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images26.jpg b/computed-vision/cars_detector/data/images/train/images26.jpg new file mode 100644 index 00000000..9c69d365 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images26.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images27.jpg b/computed-vision/cars_detector/data/images/train/images27.jpg new file mode 100644 index 00000000..790a3563 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images27.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images28.jpg b/computed-vision/cars_detector/data/images/train/images28.jpg new file mode 100644 index 00000000..ce1b5ca5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images28.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images29.jpg b/computed-vision/cars_detector/data/images/train/images29.jpg new file mode 100644 index 00000000..8ace027a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images29.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images3.jpg b/computed-vision/cars_detector/data/images/train/images3.jpg new file mode 100644 index 00000000..f8c741cb Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images3.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images30.jpg b/computed-vision/cars_detector/data/images/train/images30.jpg new file mode 100644 index 00000000..0e5efce4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images30.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images31.jpg b/computed-vision/cars_detector/data/images/train/images31.jpg new file mode 100644 index 00000000..5b507f53 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images31.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images32.jpg b/computed-vision/cars_detector/data/images/train/images32.jpg new file mode 100644 index 00000000..9e3ecd07 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images32.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images33.jpg b/computed-vision/cars_detector/data/images/train/images33.jpg new file mode 100644 index 00000000..0e3868f5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images33.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images34.jpg b/computed-vision/cars_detector/data/images/train/images34.jpg new file mode 100644 index 00000000..3f2897a7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images34.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images35.jpg b/computed-vision/cars_detector/data/images/train/images35.jpg new file mode 100644 index 00000000..203f99c8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images35.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images36.jpg b/computed-vision/cars_detector/data/images/train/images36.jpg new file mode 100644 index 00000000..a99e7e33 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images36.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images37.jpg b/computed-vision/cars_detector/data/images/train/images37.jpg new file mode 100644 index 00000000..7f6fe1aa Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images37.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images38.jpg b/computed-vision/cars_detector/data/images/train/images38.jpg new file mode 100644 index 00000000..e7d8daf1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images38.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images39.jpg b/computed-vision/cars_detector/data/images/train/images39.jpg new file mode 100644 index 00000000..28556a85 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images39.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images4.jpg b/computed-vision/cars_detector/data/images/train/images4.jpg new file mode 100644 index 00000000..f5727440 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images4.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images40.jpg b/computed-vision/cars_detector/data/images/train/images40.jpg new file mode 100644 index 00000000..8f248ef5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images40.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images41.jpg b/computed-vision/cars_detector/data/images/train/images41.jpg new file mode 100644 index 00000000..6a42ab2b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images41.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images42.jpg b/computed-vision/cars_detector/data/images/train/images42.jpg new file mode 100644 index 00000000..2eefd4b8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images42.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images43.jpg b/computed-vision/cars_detector/data/images/train/images43.jpg new file mode 100644 index 00000000..9075746d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images43.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images44.jpg b/computed-vision/cars_detector/data/images/train/images44.jpg new file mode 100644 index 00000000..3d00ba7b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images44.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images45.jpg b/computed-vision/cars_detector/data/images/train/images45.jpg new file mode 100644 index 00000000..ecc305c2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images45.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images46.jpg b/computed-vision/cars_detector/data/images/train/images46.jpg new file mode 100644 index 00000000..02da1ab0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images46.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images47.jpg b/computed-vision/cars_detector/data/images/train/images47.jpg new file mode 100644 index 00000000..2a13cf8c Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images47.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images48.jpg b/computed-vision/cars_detector/data/images/train/images48.jpg new file mode 100644 index 00000000..22075920 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images48.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images49.jpg b/computed-vision/cars_detector/data/images/train/images49.jpg new file mode 100644 index 00000000..ab5a3e72 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images49.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images5.jpg b/computed-vision/cars_detector/data/images/train/images5.jpg new file mode 100644 index 00000000..c624bdc1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images5.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images50.jpg b/computed-vision/cars_detector/data/images/train/images50.jpg new file mode 100644 index 00000000..c40cf286 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images50.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images51.jpg b/computed-vision/cars_detector/data/images/train/images51.jpg new file mode 100644 index 00000000..cf481460 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images51.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images52.jpg b/computed-vision/cars_detector/data/images/train/images52.jpg new file mode 100644 index 00000000..17b9d3a1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images52.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images53.jpg b/computed-vision/cars_detector/data/images/train/images53.jpg new file mode 100644 index 00000000..407ab77f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images53.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images54.jpg b/computed-vision/cars_detector/data/images/train/images54.jpg new file mode 100644 index 00000000..7b60bfa1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images54.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images55.jpg b/computed-vision/cars_detector/data/images/train/images55.jpg new file mode 100644 index 00000000..dd91a94e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images55.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images56.jpg b/computed-vision/cars_detector/data/images/train/images56.jpg new file mode 100644 index 00000000..3ca6c77e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images56.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images57.jpg b/computed-vision/cars_detector/data/images/train/images57.jpg new file mode 100644 index 00000000..a803acb7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images57.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images58.jpg b/computed-vision/cars_detector/data/images/train/images58.jpg new file mode 100644 index 00000000..2ef45d83 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images58.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images59.jpg b/computed-vision/cars_detector/data/images/train/images59.jpg new file mode 100644 index 00000000..e17e01d5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images59.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images6.jpg b/computed-vision/cars_detector/data/images/train/images6.jpg new file mode 100644 index 00000000..862d83b5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images6.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images60.jpg b/computed-vision/cars_detector/data/images/train/images60.jpg new file mode 100644 index 00000000..4f7da8e3 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images60.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images61.jpg b/computed-vision/cars_detector/data/images/train/images61.jpg new file mode 100644 index 00000000..2407a97d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images61.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images62.jpg b/computed-vision/cars_detector/data/images/train/images62.jpg new file mode 100644 index 00000000..2c5caac2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images62.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images63.jpg b/computed-vision/cars_detector/data/images/train/images63.jpg new file mode 100644 index 00000000..e7585005 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images63.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images64.jpg b/computed-vision/cars_detector/data/images/train/images64.jpg new file mode 100644 index 00000000..ed7e9695 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images64.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images65.jpg b/computed-vision/cars_detector/data/images/train/images65.jpg new file mode 100644 index 00000000..e714a4c8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images65.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images66.jpg b/computed-vision/cars_detector/data/images/train/images66.jpg new file mode 100644 index 00000000..c9c11a77 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images66.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images67.jpg b/computed-vision/cars_detector/data/images/train/images67.jpg new file mode 100644 index 00000000..8e85e014 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images67.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images68.jpg b/computed-vision/cars_detector/data/images/train/images68.jpg new file mode 100644 index 00000000..65bd81a5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images68.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images69.jpg b/computed-vision/cars_detector/data/images/train/images69.jpg new file mode 100644 index 00000000..fa73ce3f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images69.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images7.jpg b/computed-vision/cars_detector/data/images/train/images7.jpg new file mode 100644 index 00000000..5fb76d8b Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images7.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images70.jpg b/computed-vision/cars_detector/data/images/train/images70.jpg new file mode 100644 index 00000000..8c7b6771 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images70.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images71.jpg b/computed-vision/cars_detector/data/images/train/images71.jpg new file mode 100644 index 00000000..d6f61201 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images71.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images72.jpg b/computed-vision/cars_detector/data/images/train/images72.jpg new file mode 100644 index 00000000..2442b16f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images72.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images73.jpg b/computed-vision/cars_detector/data/images/train/images73.jpg new file mode 100644 index 00000000..05567604 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images73.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images74.jpg b/computed-vision/cars_detector/data/images/train/images74.jpg new file mode 100644 index 00000000..b10aa357 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images74.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images75.jpg b/computed-vision/cars_detector/data/images/train/images75.jpg new file mode 100644 index 00000000..12166517 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images75.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images76.jpg b/computed-vision/cars_detector/data/images/train/images76.jpg new file mode 100644 index 00000000..5b997782 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images76.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images77.jpg b/computed-vision/cars_detector/data/images/train/images77.jpg new file mode 100644 index 00000000..0609ef11 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images77.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images78.jpg b/computed-vision/cars_detector/data/images/train/images78.jpg new file mode 100644 index 00000000..6a690af7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images78.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images79.jpg b/computed-vision/cars_detector/data/images/train/images79.jpg new file mode 100644 index 00000000..e3ec0a44 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images79.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images8.jpg b/computed-vision/cars_detector/data/images/train/images8.jpg new file mode 100644 index 00000000..85197490 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images8.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images80.jpg b/computed-vision/cars_detector/data/images/train/images80.jpg new file mode 100644 index 00000000..3ebccfa1 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images80.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images81.jpg b/computed-vision/cars_detector/data/images/train/images81.jpg new file mode 100644 index 00000000..aa14aef9 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images81.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images82.jpg b/computed-vision/cars_detector/data/images/train/images82.jpg new file mode 100644 index 00000000..6a825577 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images82.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images83.jpg b/computed-vision/cars_detector/data/images/train/images83.jpg new file mode 100644 index 00000000..95a2c7fe Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images83.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images84.jpg b/computed-vision/cars_detector/data/images/train/images84.jpg new file mode 100644 index 00000000..eff89f6a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images84.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images85.jpg b/computed-vision/cars_detector/data/images/train/images85.jpg new file mode 100644 index 00000000..e98fa2de Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images85.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images86.jpg b/computed-vision/cars_detector/data/images/train/images86.jpg new file mode 100644 index 00000000..54b74200 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images86.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images87.jpg b/computed-vision/cars_detector/data/images/train/images87.jpg new file mode 100644 index 00000000..99f39a03 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images87.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images88.jpg b/computed-vision/cars_detector/data/images/train/images88.jpg new file mode 100644 index 00000000..3db4bfe3 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images88.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images89.jpg b/computed-vision/cars_detector/data/images/train/images89.jpg new file mode 100644 index 00000000..3d5e863d Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images89.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images9.jpg b/computed-vision/cars_detector/data/images/train/images9.jpg new file mode 100644 index 00000000..c22125f8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images9.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images90.jpg b/computed-vision/cars_detector/data/images/train/images90.jpg new file mode 100644 index 00000000..4a468812 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images90.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images91.jpg b/computed-vision/cars_detector/data/images/train/images91.jpg new file mode 100644 index 00000000..89f1ea9e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images91.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images92.jpg b/computed-vision/cars_detector/data/images/train/images92.jpg new file mode 100644 index 00000000..68b8154e Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images92.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images93.jpg b/computed-vision/cars_detector/data/images/train/images93.jpg new file mode 100644 index 00000000..27f269d4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images93.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images94.jpg b/computed-vision/cars_detector/data/images/train/images94.jpg new file mode 100644 index 00000000..633cbb1f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images94.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images95.jpg b/computed-vision/cars_detector/data/images/train/images95.jpg new file mode 100644 index 00000000..7e64964a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images95.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images96.jpg b/computed-vision/cars_detector/data/images/train/images96.jpg new file mode 100644 index 00000000..d064990a Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images96.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images97.jpg b/computed-vision/cars_detector/data/images/train/images97.jpg new file mode 100644 index 00000000..9073c9e8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images97.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images98.jpg b/computed-vision/cars_detector/data/images/train/images98.jpg new file mode 100644 index 00000000..5b94958f Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images98.jpg differ diff --git a/computed-vision/cars_detector/data/images/train/images99.jpg b/computed-vision/cars_detector/data/images/train/images99.jpg new file mode 100644 index 00000000..aa0fabbc Binary files /dev/null and b/computed-vision/cars_detector/data/images/train/images99.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/RR_50_Most_Expensive_Cars_You_Can_Buy_Right_Now_lead.jpg b/computed-vision/cars_detector/data/images/validate/RR_50_Most_Expensive_Cars_You_Can_Buy_Right_Now_lead.jpg new file mode 100644 index 00000000..878c6901 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/RR_50_Most_Expensive_Cars_You_Can_Buy_Right_Now_lead.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/Transpo_G70_TA-518126.jpg b/computed-vision/cars_detector/data/images/validate/Transpo_G70_TA-518126.jpg new file mode 100644 index 00000000..55a00abf Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/Transpo_G70_TA-518126.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images210.jpg b/computed-vision/cars_detector/data/images/validate/images210.jpg new file mode 100644 index 00000000..87b088cc Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images210.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images211.jpg b/computed-vision/cars_detector/data/images/validate/images211.jpg new file mode 100644 index 00000000..a9f71426 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images211.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images212.jpg b/computed-vision/cars_detector/data/images/validate/images212.jpg new file mode 100644 index 00000000..4aa1a6e7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images212.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images213.jpg b/computed-vision/cars_detector/data/images/validate/images213.jpg new file mode 100644 index 00000000..a17f72da Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images213.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images214.jpg b/computed-vision/cars_detector/data/images/validate/images214.jpg new file mode 100644 index 00000000..951f51d0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images214.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images215.jpg b/computed-vision/cars_detector/data/images/validate/images215.jpg new file mode 100644 index 00000000..e65acf15 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images215.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images216.jpg b/computed-vision/cars_detector/data/images/validate/images216.jpg new file mode 100644 index 00000000..a79c9f65 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images216.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images217.jpg b/computed-vision/cars_detector/data/images/validate/images217.jpg new file mode 100644 index 00000000..951ac583 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images217.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images218.jpg b/computed-vision/cars_detector/data/images/validate/images218.jpg new file mode 100644 index 00000000..ce76bf00 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images218.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images219.jpg b/computed-vision/cars_detector/data/images/validate/images219.jpg new file mode 100644 index 00000000..a807196a Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images219.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images220.jpg b/computed-vision/cars_detector/data/images/validate/images220.jpg new file mode 100644 index 00000000..b8a9b05c Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images220.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images221.jpg b/computed-vision/cars_detector/data/images/validate/images221.jpg new file mode 100644 index 00000000..c57c2839 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images221.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images222.jpg b/computed-vision/cars_detector/data/images/validate/images222.jpg new file mode 100644 index 00000000..56ecf06e Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images222.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images223.jpg b/computed-vision/cars_detector/data/images/validate/images223.jpg new file mode 100644 index 00000000..a5b0ba40 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images223.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images224.jpg b/computed-vision/cars_detector/data/images/validate/images224.jpg new file mode 100644 index 00000000..0390cdcd Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images224.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images225.jpg b/computed-vision/cars_detector/data/images/validate/images225.jpg new file mode 100644 index 00000000..046d83d6 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images225.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images226.jpg b/computed-vision/cars_detector/data/images/validate/images226.jpg new file mode 100644 index 00000000..1c728745 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images226.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images227.jpg b/computed-vision/cars_detector/data/images/validate/images227.jpg new file mode 100644 index 00000000..43e253fc Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images227.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images228.jpg b/computed-vision/cars_detector/data/images/validate/images228.jpg new file mode 100644 index 00000000..041337ce Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images228.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images229.jpg b/computed-vision/cars_detector/data/images/validate/images229.jpg new file mode 100644 index 00000000..3f54e31d Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images229.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images230.jpg b/computed-vision/cars_detector/data/images/validate/images230.jpg new file mode 100644 index 00000000..d803bc86 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images230.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images231.jpg b/computed-vision/cars_detector/data/images/validate/images231.jpg new file mode 100644 index 00000000..054ed333 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images231.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images232.jpg b/computed-vision/cars_detector/data/images/validate/images232.jpg new file mode 100644 index 00000000..a1814790 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images232.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images233.jpg b/computed-vision/cars_detector/data/images/validate/images233.jpg new file mode 100644 index 00000000..de536ab2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images233.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images234.jpg b/computed-vision/cars_detector/data/images/validate/images234.jpg new file mode 100644 index 00000000..f9c338c8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images234.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images235.jpg b/computed-vision/cars_detector/data/images/validate/images235.jpg new file mode 100644 index 00000000..0bb49004 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images235.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images236.jpg b/computed-vision/cars_detector/data/images/validate/images236.jpg new file mode 100644 index 00000000..c3706c10 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images236.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images237.jpg b/computed-vision/cars_detector/data/images/validate/images237.jpg new file mode 100644 index 00000000..663e7318 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images237.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images238.jpg b/computed-vision/cars_detector/data/images/validate/images238.jpg new file mode 100644 index 00000000..d49a414a Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images238.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images239.jpg b/computed-vision/cars_detector/data/images/validate/images239.jpg new file mode 100644 index 00000000..19cc7074 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images239.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images240.jpg b/computed-vision/cars_detector/data/images/validate/images240.jpg new file mode 100644 index 00000000..e9eb5470 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images240.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images241.jpg b/computed-vision/cars_detector/data/images/validate/images241.jpg new file mode 100644 index 00000000..4436097e Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images241.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images242.jpg b/computed-vision/cars_detector/data/images/validate/images242.jpg new file mode 100644 index 00000000..72f8405d Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images242.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images243.jpg b/computed-vision/cars_detector/data/images/validate/images243.jpg new file mode 100644 index 00000000..8d6a58b5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images243.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images244.jpg b/computed-vision/cars_detector/data/images/validate/images244.jpg new file mode 100644 index 00000000..f43154e4 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images244.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images245.jpg b/computed-vision/cars_detector/data/images/validate/images245.jpg new file mode 100644 index 00000000..368eda43 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images245.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images246.jpg b/computed-vision/cars_detector/data/images/validate/images246.jpg new file mode 100644 index 00000000..1ecfa741 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images246.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images247.jpg b/computed-vision/cars_detector/data/images/validate/images247.jpg new file mode 100644 index 00000000..931207ed Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images247.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images248.jpg b/computed-vision/cars_detector/data/images/validate/images248.jpg new file mode 100644 index 00000000..a89d63d7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images248.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images249.jpg b/computed-vision/cars_detector/data/images/validate/images249.jpg new file mode 100644 index 00000000..df53f5ba Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images249.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images250.jpg b/computed-vision/cars_detector/data/images/validate/images250.jpg new file mode 100644 index 00000000..039c5172 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images250.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images251.jpg b/computed-vision/cars_detector/data/images/validate/images251.jpg new file mode 100644 index 00000000..e4afeb10 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images251.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images252.jpg b/computed-vision/cars_detector/data/images/validate/images252.jpg new file mode 100644 index 00000000..0e4a7b49 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images252.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images253.jpg b/computed-vision/cars_detector/data/images/validate/images253.jpg new file mode 100644 index 00000000..fc52fc61 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images253.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images254.jpg b/computed-vision/cars_detector/data/images/validate/images254.jpg new file mode 100644 index 00000000..3f291d17 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images254.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images255.jpg b/computed-vision/cars_detector/data/images/validate/images255.jpg new file mode 100644 index 00000000..58acc50c Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images255.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images256.jpg b/computed-vision/cars_detector/data/images/validate/images256.jpg new file mode 100644 index 00000000..5e875d7c Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images256.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images257.jpg b/computed-vision/cars_detector/data/images/validate/images257.jpg new file mode 100644 index 00000000..13d9ca84 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images257.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images258.jpg b/computed-vision/cars_detector/data/images/validate/images258.jpg new file mode 100644 index 00000000..08d0c961 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images258.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images259.jpg b/computed-vision/cars_detector/data/images/validate/images259.jpg new file mode 100644 index 00000000..dd094755 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images259.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images260.jpg b/computed-vision/cars_detector/data/images/validate/images260.jpg new file mode 100644 index 00000000..2674b63b Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images260.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images261.jpg b/computed-vision/cars_detector/data/images/validate/images261.jpg new file mode 100644 index 00000000..1c86f02c Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images261.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images262.jpg b/computed-vision/cars_detector/data/images/validate/images262.jpg new file mode 100644 index 00000000..4be4e4ba Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images262.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images263.jpg b/computed-vision/cars_detector/data/images/validate/images263.jpg new file mode 100644 index 00000000..86fef2b2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images263.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images264.jpg b/computed-vision/cars_detector/data/images/validate/images264.jpg new file mode 100644 index 00000000..313e7975 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images264.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images265.jpg b/computed-vision/cars_detector/data/images/validate/images265.jpg new file mode 100644 index 00000000..3b3210f0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images265.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images266.jpg b/computed-vision/cars_detector/data/images/validate/images266.jpg new file mode 100644 index 00000000..f1664f78 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images266.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images267.jpg b/computed-vision/cars_detector/data/images/validate/images267.jpg new file mode 100644 index 00000000..f6f0a0ab Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images267.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images268.jpg b/computed-vision/cars_detector/data/images/validate/images268.jpg new file mode 100644 index 00000000..6255eab5 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images268.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images269.jpg b/computed-vision/cars_detector/data/images/validate/images269.jpg new file mode 100644 index 00000000..a3716e47 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images269.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images270.jpg b/computed-vision/cars_detector/data/images/validate/images270.jpg new file mode 100644 index 00000000..5fadcab0 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images270.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images271.jpg b/computed-vision/cars_detector/data/images/validate/images271.jpg new file mode 100644 index 00000000..8becc56f Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images271.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images272.jpg b/computed-vision/cars_detector/data/images/validate/images272.jpg new file mode 100644 index 00000000..0c0b9568 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images272.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images273.jpg b/computed-vision/cars_detector/data/images/validate/images273.jpg new file mode 100644 index 00000000..649e5475 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images273.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images274.jpg b/computed-vision/cars_detector/data/images/validate/images274.jpg new file mode 100644 index 00000000..eedb05a8 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images274.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images275.jpg b/computed-vision/cars_detector/data/images/validate/images275.jpg new file mode 100644 index 00000000..08cb0c3d Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images275.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images276.jpg b/computed-vision/cars_detector/data/images/validate/images276.jpg new file mode 100644 index 00000000..86d3fcbd Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images276.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images277.jpg b/computed-vision/cars_detector/data/images/validate/images277.jpg new file mode 100644 index 00000000..bef9dcf2 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images277.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images278.jpg b/computed-vision/cars_detector/data/images/validate/images278.jpg new file mode 100644 index 00000000..31202981 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images278.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/images279.jpg b/computed-vision/cars_detector/data/images/validate/images279.jpg new file mode 100644 index 00000000..bf9654cc Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/images279.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/ioniq5n.jpeg b/computed-vision/cars_detector/data/images/validate/ioniq5n.jpeg new file mode 100644 index 00000000..8ccb1996 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/ioniq5n.jpeg differ diff --git a/computed-vision/cars_detector/data/images/validate/large-51532-2023elantra.jpg b/computed-vision/cars_detector/data/images/validate/large-51532-2023elantra.jpg new file mode 100644 index 00000000..72bfd23a Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/large-51532-2023elantra.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/lucid-air-slide-1-desktop.webp b/computed-vision/cars_detector/data/images/validate/lucid-air-slide-1-desktop.webp new file mode 100644 index 00000000..17a54556 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/lucid-air-slide-1-desktop.webp differ diff --git a/computed-vision/cars_detector/data/images/validate/lucid-air-stealth-slide-2-desktop.webp b/computed-vision/cars_detector/data/images/validate/lucid-air-stealth-slide-2-desktop.webp new file mode 100644 index 00000000..76539e52 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/lucid-air-stealth-slide-2-desktop.webp differ diff --git a/computed-vision/cars_detector/data/images/validate/mini-cooper-auto-model-vehicle.jpg b/computed-vision/cars_detector/data/images/validate/mini-cooper-auto-model-vehicle.jpg new file mode 100644 index 00000000..b75e5be7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/mini-cooper-auto-model-vehicle.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/modern-sports-car-speeds-through-dark-curve-generative-ai_188544-9136.jpg b/computed-vision/cars_detector/data/images/validate/modern-sports-car-speeds-through-dark-curve-generative-ai_188544-9136.jpg new file mode 100644 index 00000000..0d43abcb Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/modern-sports-car-speeds-through-dark-curve-generative-ai_188544-9136.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/most-expensive-cars-in-the-world.jpg b/computed-vision/cars_detector/data/images/validate/most-expensive-cars-in-the-world.jpg new file mode 100644 index 00000000..55eb2733 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/most-expensive-cars-in-the-world.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/muscle-car-azul-negro-matricula-que-dice-trans-frente_1340-23399.jpg b/computed-vision/cars_detector/data/images/validate/muscle-car-azul-negro-matricula-que-dice-trans-frente_1340-23399.jpg new file mode 100644 index 00000000..a99c4a68 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/muscle-car-azul-negro-matricula-que-dice-trans-frente_1340-23399.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/my24-dodge-bhp-hero-02-desktop-v2.jpg b/computed-vision/cars_detector/data/images/validate/my24-dodge-bhp-hero-02-desktop-v2.jpg new file mode 100644 index 00000000..b9d3292d Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/my24-dodge-bhp-hero-02-desktop-v2.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/my24-xc40-recharge-single.png b/computed-vision/cars_detector/data/images/validate/my24-xc40-recharge-single.png new file mode 100644 index 00000000..74c7f242 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/my24-xc40-recharge-single.png differ diff --git a/computed-vision/cars_detector/data/images/validate/pexels-photo-170811.jpeg b/computed-vision/cars_detector/data/images/validate/pexels-photo-170811.jpeg new file mode 100644 index 00000000..c9e33752 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/pexels-photo-170811.jpeg differ diff --git a/computed-vision/cars_detector/data/images/validate/pexels-photo-210019.jpeg b/computed-vision/cars_detector/data/images/validate/pexels-photo-210019.jpeg new file mode 100644 index 00000000..ad149cb7 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/pexels-photo-210019.jpeg differ diff --git a/computed-vision/cars_detector/data/images/validate/pexels-photo-3729464.jpeg b/computed-vision/cars_detector/data/images/validate/pexels-photo-3729464.jpeg new file mode 100644 index 00000000..3c8de35a Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/pexels-photo-3729464.jpeg differ diff --git a/computed-vision/cars_detector/data/images/validate/pexels-photo-733745.jpeg b/computed-vision/cars_detector/data/images/validate/pexels-photo-733745.jpeg new file mode 100644 index 00000000..66b75d47 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/pexels-photo-733745.jpeg differ diff --git a/computed-vision/cars_detector/data/images/validate/red-car-260nw-197514563.jpg b/computed-vision/cars_detector/data/images/validate/red-car-260nw-197514563.jpg new file mode 100644 index 00000000..ad673efb Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/red-car-260nw-197514563.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/revuelto_m.png b/computed-vision/cars_detector/data/images/validate/revuelto_m.png new file mode 100644 index 00000000..8358776e Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/revuelto_m.png differ diff --git a/computed-vision/cars_detector/data/images/validate/rimac-nevera-worth-2-1-mn-is-worlds-fastest-electric-car-with-256mph-top-speed.jpg b/computed-vision/cars_detector/data/images/validate/rimac-nevera-worth-2-1-mn-is-worlds-fastest-electric-car-with-256mph-top-speed.jpg new file mode 100644 index 00000000..69338719 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/rimac-nevera-worth-2-1-mn-is-worlds-fastest-electric-car-with-256mph-top-speed.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/rimac-nevera.jpg b/computed-vision/cars_detector/data/images/validate/rimac-nevera.jpg new file mode 100644 index 00000000..e7637dfe Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/rimac-nevera.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/rolls_royce_phantom_top_10.jpg b/computed-vision/cars_detector/data/images/validate/rolls_royce_phantom_top_10.jpg new file mode 100644 index 00000000..1d942b0c Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/rolls_royce_phantom_top_10.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/scorpio-n-exterior-right-front-three-quarter-75.jpeg b/computed-vision/cars_detector/data/images/validate/scorpio-n-exterior-right-front-three-quarter-75.jpeg new file mode 100644 index 00000000..f00732db Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/scorpio-n-exterior-right-front-three-quarter-75.jpeg differ diff --git a/computed-vision/cars_detector/data/images/validate/sedan-car-concept-illustration_114360-13223.jpg b/computed-vision/cars_detector/data/images/validate/sedan-car-concept-illustration_114360-13223.jpg new file mode 100644 index 00000000..f5ae68bf Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/sedan-car-concept-illustration_114360-13223.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/should_i_buy_an_electric_car.jpg b/computed-vision/cars_detector/data/images/validate/should_i_buy_an_electric_car.jpg new file mode 100644 index 00000000..93bd1faf Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/should_i_buy_an_electric_car.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/splashpage.jpg b/computed-vision/cars_detector/data/images/validate/splashpage.jpg new file mode 100644 index 00000000..efa2cd04 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/splashpage.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/splashpage3.jpg b/computed-vision/cars_detector/data/images/validate/splashpage3.jpg new file mode 100644 index 00000000..e0ef4971 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/splashpage3.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/sports-car-7881150_1280.jpg b/computed-vision/cars_detector/data/images/validate/sports-car-7881150_1280.jpg new file mode 100644 index 00000000..94d38efb Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/sports-car-7881150_1280.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/stock-photo-red-car-197514563.jpg b/computed-vision/cars_detector/data/images/validate/stock-photo-red-car-197514563.jpg new file mode 100644 index 00000000..0664d8dc Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/stock-photo-red-car-197514563.jpg differ diff --git a/computed-vision/cars_detector/data/images/validate/toyota-mirai-at-fueling-station-1664139139.png b/computed-vision/cars_detector/data/images/validate/toyota-mirai-at-fueling-station-1664139139.png new file mode 100644 index 00000000..13bf4d8e Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/toyota-mirai-at-fueling-station-1664139139.png differ diff --git a/computed-vision/cars_detector/data/images/validate/untitled-9.jpg b/computed-vision/cars_detector/data/images/validate/untitled-9.jpg new file mode 100644 index 00000000..a7f56189 Binary files /dev/null and b/computed-vision/cars_detector/data/images/validate/untitled-9.jpg differ diff --git a/computed-vision/cars_detector/data/labels/train/-images-auto-custom-15417-original-2024-acura-integra-type-s-angular-front-1.txt b/computed-vision/cars_detector/data/labels/train/-images-auto-custom-15417-original-2024-acura-integra-type-s-angular-front-1.txt new file mode 100644 index 00000000..edc337d5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/-images-auto-custom-15417-original-2024-acura-integra-type-s-angular-front-1.txt @@ -0,0 +1 @@ +0 0.489583 0.620276 0.803728 0.431676 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/001-2024-hyundai-sonata-n-line-front-three-quarter-motion-lead.txt b/computed-vision/cars_detector/data/labels/train/001-2024-hyundai-sonata-n-line-front-three-quarter-motion-lead.txt new file mode 100644 index 00000000..37c27655 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/001-2024-hyundai-sonata-n-line-front-three-quarter-motion-lead.txt @@ -0,0 +1 @@ +0 0.496162 0.485380 0.816886 0.602339 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/0x0.txt b/computed-vision/cars_detector/data/labels/train/0x0.txt new file mode 100644 index 00000000..1b2da936 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/0x0.txt @@ -0,0 +1 @@ +0 0.566338 0.572368 0.652412 0.355263 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/100-best-luxury-cars.txt b/computed-vision/cars_detector/data/labels/train/100-best-luxury-cars.txt new file mode 100644 index 00000000..99d31a39 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/100-best-luxury-cars.txt @@ -0,0 +1 @@ +0 0.638706 0.550501 0.610746 0.495077 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/1066461b5705cbd2a4a074dfa7df12e9.txt b/computed-vision/cars_detector/data/labels/train/1066461b5705cbd2a4a074dfa7df12e9.txt new file mode 100644 index 00000000..2072d6f2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/1066461b5705cbd2a4a074dfa7df12e9.txt @@ -0,0 +1 @@ +0 0.548810 0.492857 0.388095 0.163492 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/1200px-2019_Toyota_Corolla_Icon_Tech_VVT-i_Hybrid_1.8.txt b/computed-vision/cars_detector/data/labels/train/1200px-2019_Toyota_Corolla_Icon_Tech_VVT-i_Hybrid_1.8.txt new file mode 100644 index 00000000..d091b511 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/1200px-2019_Toyota_Corolla_Icon_Tech_VVT-i_Hybrid_1.8.txt @@ -0,0 +1 @@ +0 0.501096 0.514574 0.936404 0.916056 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/180320-flying-car-aeromobil50-se-143p.txt b/computed-vision/cars_detector/data/labels/train/180320-flying-car-aeromobil50-se-143p.txt new file mode 100644 index 00000000..de8c46c2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/180320-flying-car-aeromobil50-se-143p.txt @@ -0,0 +1 @@ +0 0.455592 0.476073 0.577851 0.255776 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/1af0ca3f-5236-47a5-a487-32b49ec94f27.txt b/computed-vision/cars_detector/data/labels/train/1af0ca3f-5236-47a5-a487-32b49ec94f27.txt new file mode 100644 index 00000000..bb761348 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/1af0ca3f-5236-47a5-a487-32b49ec94f27.txt @@ -0,0 +1 @@ +0 0.497807 0.494185 0.953947 0.506712 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2019-honda-civic-sedan-1558453497.txt b/computed-vision/cars_detector/data/labels/train/2019-honda-civic-sedan-1558453497.txt new file mode 100644 index 00000000..0b6dfe6a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2019-honda-civic-sedan-1558453497.txt @@ -0,0 +1 @@ +0 0.506579 0.501794 0.822368 0.717540 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2021-best-cars-ford-mustang-hero-mobile.txt b/computed-vision/cars_detector/data/labels/train/2021-best-cars-ford-mustang-hero-mobile.txt new file mode 100644 index 00000000..3e2dd735 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2021-best-cars-ford-mustang-hero-mobile.txt @@ -0,0 +1 @@ +0 0.476425 0.420078 0.680921 0.678363 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2023-EQE350-SEDAN-AVP-DR.txt b/computed-vision/cars_detector/data/labels/train/2023-EQE350-SEDAN-AVP-DR.txt new file mode 100644 index 00000000..0e75f2f2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2023-EQE350-SEDAN-AVP-DR.txt @@ -0,0 +1 @@ +0 0.504934 0.537829 0.742325 0.635068 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2023-chevrolet-corvette-z06-13.txt b/computed-vision/cars_detector/data/labels/train/2023-chevrolet-corvette-z06-13.txt new file mode 100644 index 00000000..ee7f5f44 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2023-chevrolet-corvette-z06-13.txt @@ -0,0 +1 @@ +0 0.487390 0.514803 0.648026 0.305921 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2023-chevrolet-corvette-z06-14.txt b/computed-vision/cars_detector/data/labels/train/2023-chevrolet-corvette-z06-14.txt new file mode 100644 index 00000000..f5eba481 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2023-chevrolet-corvette-z06-14.txt @@ -0,0 +1 @@ +0 0.560307 0.532895 0.725877 0.457237 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2023-lucid-air-1.txt b/computed-vision/cars_detector/data/labels/train/2023-lucid-air-1.txt new file mode 100644 index 00000000..93cd5cdf --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2023-lucid-air-1.txt @@ -0,0 +1 @@ +0 0.451206 0.522599 0.705044 0.577541 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2023_Hyundai_Ioniq_6_Review_Lead_In.txt b/computed-vision/cars_detector/data/labels/train/2023_Hyundai_Ioniq_6_Review_Lead_In.txt new file mode 100644 index 00000000..b645fddf --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2023_Hyundai_Ioniq_6_Review_Lead_In.txt @@ -0,0 +1 @@ +0 0.447917 0.586241 0.658991 0.468165 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2024-lucid-air-sapphire-117-64cd3bf322c9a.txt b/computed-vision/cars_detector/data/labels/train/2024-lucid-air-sapphire-117-64cd3bf322c9a.txt new file mode 100644 index 00000000..3ea85dc4 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2024-lucid-air-sapphire-117-64cd3bf322c9a.txt @@ -0,0 +1 @@ +0 0.455592 0.496712 0.676535 0.503066 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2025-chevrolet-corvette-suv-102-6452e1aa3b345.txt b/computed-vision/cars_detector/data/labels/train/2025-chevrolet-corvette-suv-102-6452e1aa3b345.txt new file mode 100644 index 00000000..d4f6e7ba --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2025-chevrolet-corvette-suv-102-6452e1aa3b345.txt @@ -0,0 +1 @@ +0 0.486294 0.510718 0.683114 0.637238 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/2204-new-models-guide.txt b/computed-vision/cars_detector/data/labels/train/2204-new-models-guide.txt new file mode 100644 index 00000000..c809b330 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/2204-new-models-guide.txt @@ -0,0 +1 @@ +0 0.490132 0.666667 0.807018 0.489279 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/24-jan-do-promotile-ma-644x454.txt b/computed-vision/cars_detector/data/labels/train/24-jan-do-promotile-ma-644x454.txt new file mode 100644 index 00000000..84bd15c2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/24-jan-do-promotile-ma-644x454.txt @@ -0,0 +1 @@ +0 0.502238 0.565079 0.841487 0.514286 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/24-mar-do-promotile-eq-644x454.txt b/computed-vision/cars_detector/data/labels/train/24-mar-do-promotile-eq-644x454.txt new file mode 100644 index 00000000..8ab269df --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/24-mar-do-promotile-eq-644x454.txt @@ -0,0 +1 @@ +0 0.500000 0.576984 0.801203 0.579365 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/360_F_213750591_6bVeg9sH1cD7wEvYhb2OUyHOesJzPtAL.txt b/computed-vision/cars_detector/data/labels/train/360_F_213750591_6bVeg9sH1cD7wEvYhb2OUyHOesJzPtAL.txt new file mode 100644 index 00000000..30fbce6a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/360_F_213750591_6bVeg9sH1cD7wEvYhb2OUyHOesJzPtAL.txt @@ -0,0 +1 @@ +0 0.507767 0.544444 0.712344 0.457143 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/640px-2017_Toyota_Camry_28ASV70R29_SX_sedan_282018-11-0229_01.txt b/computed-vision/cars_detector/data/labels/train/640px-2017_Toyota_Camry_28ASV70R29_SX_sedan_282018-11-0229_01.txt new file mode 100644 index 00000000..154f1781 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/640px-2017_Toyota_Camry_28ASV70R29_SX_sedan_282018-11-0229_01.txt @@ -0,0 +1 @@ +0 0.494518 0.509687 0.936404 0.845980 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/658e5b5ebba32-xiaomi-su7-ev-to-take-on-tesla-293837105-16x9.txt b/computed-vision/cars_detector/data/labels/train/658e5b5ebba32-xiaomi-su7-ev-to-take-on-tesla-293837105-16x9.txt new file mode 100644 index 00000000..8a6ff96c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/658e5b5ebba32-xiaomi-su7-ev-to-take-on-tesla-293837105-16x9.txt @@ -0,0 +1 @@ +0 0.514803 0.568226 0.816886 0.580897 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/884b28bd-d67f-4c90-a7e5-a066090db8f7.txt b/computed-vision/cars_detector/data/labels/train/884b28bd-d67f-4c90-a7e5-a066090db8f7.txt new file mode 100644 index 00000000..b071a54a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/884b28bd-d67f-4c90-a7e5-a066090db8f7.txt @@ -0,0 +1 @@ +0 0.500548 0.490863 0.957237 0.493421 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/9.20DeLorean-Alpha-5205BDeLorean5D.txt b/computed-vision/cars_detector/data/labels/train/9.20DeLorean-Alpha-5205BDeLorean5D.txt new file mode 100644 index 00000000..24e20bf7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/9.20DeLorean-Alpha-5205BDeLorean5D.txt @@ -0,0 +1 @@ +0 0.500548 0.547758 0.593202 0.805068 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/960x0.txt b/computed-vision/cars_detector/data/labels/train/960x0.txt new file mode 100644 index 00000000..9aebf3ff --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/960x0.txt @@ -0,0 +1 @@ +0 0.493421 0.596167 0.815789 0.501383 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/Audi-RS-Q3-ABT-8-2.txt b/computed-vision/cars_detector/data/labels/train/Audi-RS-Q3-ABT-8-2.txt new file mode 100644 index 00000000..c89eb532 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/Audi-RS-Q3-ABT-8-2.txt @@ -0,0 +1 @@ +0 0.498355 0.490253 0.917763 0.807018 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/Average20Weight20Of20A20Car.txt b/computed-vision/cars_detector/data/labels/train/Average20Weight20Of20A20Car.txt new file mode 100644 index 00000000..17f439e4 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/Average20Weight20Of20A20Car.txt @@ -0,0 +1 @@ +0 0.546053 0.527149 0.853070 0.689414 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/Buying-Selling-Trading-In-Cars.txt b/computed-vision/cars_detector/data/labels/train/Buying-Selling-Trading-In-Cars.txt new file mode 100644 index 00000000..7f0c72f3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/Buying-Selling-Trading-In-Cars.txt @@ -0,0 +1,2 @@ +0 0.321272 0.031189 0.092105 0.001949 +0 0.663925 0.472710 0.672149 0.881092 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/Hyundai-Venue-2022-1160x653.txt b/computed-vision/cars_detector/data/labels/train/Hyundai-Venue-2022-1160x653.txt new file mode 100644 index 00000000..7c25ad60 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/Hyundai-Venue-2022-1160x653.txt @@ -0,0 +1 @@ +0 0.494518 0.474678 0.752193 0.821982 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/astondbx_adc_redherodynamic_1080x1920_72dpi.txt b/computed-vision/cars_detector/data/labels/train/astondbx_adc_redherodynamic_1080x1920_72dpi.txt new file mode 100644 index 00000000..13225921 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/astondbx_adc_redherodynamic_1080x1920_72dpi.txt @@ -0,0 +1 @@ +0 0.509877 0.569048 0.928395 0.268254 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/bd784bbb8df3189579511325ba82f0b3.txt b/computed-vision/cars_detector/data/labels/train/bd784bbb8df3189579511325ba82f0b3.txt new file mode 100644 index 00000000..f0aff843 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/bd784bbb8df3189579511325ba82f0b3.txt @@ -0,0 +1 @@ +0 0.494358 0.510317 0.930901 0.249206 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/bmw-vision-neue-klasse-concept-car5-64ecd9b81229e.txt b/computed-vision/cars_detector/data/labels/train/bmw-vision-neue-klasse-concept-car5-64ecd9b81229e.txt new file mode 100644 index 00000000..b5868599 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/bmw-vision-neue-klasse-concept-car5-64ecd9b81229e.txt @@ -0,0 +1 @@ +0 0.476425 0.458055 0.948465 0.912920 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/bmwi4_029.txt b/computed-vision/cars_detector/data/labels/train/bmwi4_029.txt new file mode 100644 index 00000000..0ecffe13 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/bmwi4_029.txt @@ -0,0 +1 @@ +0 0.457785 0.397083 0.805921 0.561516 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/car-5548242_1280.txt b/computed-vision/cars_detector/data/labels/train/car-5548242_1280.txt new file mode 100644 index 00000000..c3dc2286 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/car-5548242_1280.txt @@ -0,0 +1 @@ +0 0.518640 0.757502 0.486842 0.317558 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/cars-sale-stock-row-car-600nw-636632101.txt b/computed-vision/cars_detector/data/labels/train/cars-sale-stock-row-car-600nw-636632101.txt new file mode 100644 index 00000000..44dca81c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/cars-sale-stock-row-car-600nw-636632101.txt @@ -0,0 +1 @@ +0 0.520751 0.480159 0.954561 0.649206 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/cdb010124tenbest-trucks-104-6569f09cb4352.txt b/computed-vision/cars_detector/data/labels/train/cdb010124tenbest-trucks-104-6569f09cb4352.txt new file mode 100644 index 00000000..7f3b9d40 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/cdb010124tenbest-trucks-104-6569f09cb4352.txt @@ -0,0 +1 @@ +0 0.502741 0.645833 0.544956 0.361842 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/coche-lujoso-estacionado-carretera-faro-iluminado-al-atardecer_181624-60607.txt b/computed-vision/cars_detector/data/labels/train/coche-lujoso-estacionado-carretera-faro-iluminado-al-atardecer_181624-60607.txt new file mode 100644 index 00000000..eceab987 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/coche-lujoso-estacionado-carretera-faro-iluminado-al-atardecer_181624-60607.txt @@ -0,0 +1 @@ +0 0.310307 0.549382 0.618421 0.892160 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/conduccion-automoviles-deportivos-carretera-asfaltada-noche-ia-generativa_188544-8052.txt b/computed-vision/cars_detector/data/labels/train/conduccion-automoviles-deportivos-carretera-asfaltada-noche-ia-generativa_188544-8052.txt new file mode 100644 index 00000000..4590b99b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/conduccion-automoviles-deportivos-carretera-asfaltada-noche-ia-generativa_188544-8052.txt @@ -0,0 +1 @@ +0 0.442434 0.660490 0.518640 0.314396 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/dw-burnett-pcoty22-8260-1671143390.txt b/computed-vision/cars_detector/data/labels/train/dw-burnett-pcoty22-8260-1671143390.txt new file mode 100644 index 00000000..b2923010 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/dw-burnett-pcoty22-8260-1671143390.txt @@ -0,0 +1 @@ +0 0.529605 0.535357 0.603070 0.455535 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/dwburnett-demon-garlits-1352-1517591562.txt b/computed-vision/cars_detector/data/labels/train/dwburnett-demon-garlits-1352-1517591562.txt new file mode 100644 index 00000000..c4e2e344 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/dwburnett-demon-garlits-1352-1517591562.txt @@ -0,0 +1 @@ +0 0.422697 0.504386 0.604167 0.548246 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/f7cfeada56951abeb13ebedece73f3f8.txt b/computed-vision/cars_detector/data/labels/train/f7cfeada56951abeb13ebedece73f3f8.txt new file mode 100644 index 00000000..1e3c1ead --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/f7cfeada56951abeb13ebedece73f3f8.txt @@ -0,0 +1 @@ +0 0.503333 0.590476 0.908889 0.276190 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/feature6-1366x768.txt b/computed-vision/cars_detector/data/labels/train/feature6-1366x768.txt new file mode 100644 index 00000000..5411bc09 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/feature6-1366x768.txt @@ -0,0 +1 @@ +0 0.543860 0.740741 0.868421 0.504873 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/front-left-side-47.txt b/computed-vision/cars_detector/data/labels/train/front-left-side-47.txt new file mode 100644 index 00000000..b1deb7b9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/front-left-side-47.txt @@ -0,0 +1 @@ +0 0.504934 0.501645 0.650219 0.674342 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/front-left-side-472.txt b/computed-vision/cars_detector/data/labels/train/front-left-side-472.txt new file mode 100644 index 00000000..3bada357 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/front-left-side-472.txt @@ -0,0 +1 @@ +0 0.506031 0.501645 0.634868 0.546053 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/front-left-side-473.txt b/computed-vision/cars_detector/data/labels/train/front-left-side-473.txt new file mode 100644 index 00000000..b01d0907 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/front-left-side-473.txt @@ -0,0 +1 @@ +0 0.507127 0.519737 0.683114 0.569079 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/front-left-side-474.txt b/computed-vision/cars_detector/data/labels/train/front-left-side-474.txt new file mode 100644 index 00000000..a337f6c3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/front-left-side-474.txt @@ -0,0 +1 @@ +0 0.500548 0.514803 0.634868 0.552632 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/fronx-exterior-right-front-three-quarter-109.txt b/computed-vision/cars_detector/data/labels/train/fronx-exterior-right-front-three-quarter-109.txt new file mode 100644 index 00000000..a2cd1cad --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/fronx-exterior-right-front-three-quarter-109.txt @@ -0,0 +1 @@ +0 0.467654 0.490248 0.617325 0.667067 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/home-hero-tiago-01.txt b/computed-vision/cars_detector/data/labels/train/home-hero-tiago-01.txt new file mode 100644 index 00000000..b467a3d3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/home-hero-tiago-01.txt @@ -0,0 +1 @@ +0 0.498355 0.523757 0.406798 0.559211 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/honda-prelude-concept-front-three-quarters-653927960f1f4.txt b/computed-vision/cars_detector/data/labels/train/honda-prelude-concept-front-three-quarters-653927960f1f4.txt new file mode 100644 index 00000000..d8dfd09c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/honda-prelude-concept-front-three-quarters-653927960f1f4.txt @@ -0,0 +1 @@ +0 0.495614 0.628227 0.728070 0.535923 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/how-to-create-a-car-NewBlogCover.txt b/computed-vision/cars_detector/data/labels/train/how-to-create-a-car-NewBlogCover.txt new file mode 100644 index 00000000..b78eca46 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/how-to-create-a-car-NewBlogCover.txt @@ -0,0 +1 @@ +0 0.503289 0.491228 0.653509 0.407407 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/i20_Modelpc.txt b/computed-vision/cars_detector/data/labels/train/i20_Modelpc.txt new file mode 100644 index 00000000..127b90c9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/i20_Modelpc.txt @@ -0,0 +1 @@ +0 0.493969 0.544603 0.680921 0.731490 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image.txt b/computed-vision/cars_detector/data/labels/train/image.txt new file mode 100644 index 00000000..fe9c7035 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image.txt @@ -0,0 +1 @@ +0 0.524123 0.569510 0.839912 0.601112 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image10.txt b/computed-vision/cars_detector/data/labels/train/image10.txt new file mode 100644 index 00000000..ed77ba1c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image10.txt @@ -0,0 +1 @@ +0 0.509320 0.503596 0.834430 0.733684 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image11.txt b/computed-vision/cars_detector/data/labels/train/image11.txt new file mode 100644 index 00000000..3fdcaf91 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image11.txt @@ -0,0 +1 @@ +0 0.534539 0.552867 0.810307 0.540414 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image12.txt b/computed-vision/cars_detector/data/labels/train/image12.txt new file mode 100644 index 00000000..1381d641 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image12.txt @@ -0,0 +1 @@ +0 0.504934 0.495039 0.862939 0.674720 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image14.txt b/computed-vision/cars_detector/data/labels/train/image14.txt new file mode 100644 index 00000000..2771e855 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image14.txt @@ -0,0 +1 @@ +0 0.532346 0.528835 0.597588 0.423467 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image15.txt b/computed-vision/cars_detector/data/labels/train/image15.txt new file mode 100644 index 00000000..822848d0 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image15.txt @@ -0,0 +1 @@ +0 0.653509 0.678925 0.640351 0.458553 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image16.txt b/computed-vision/cars_detector/data/labels/train/image16.txt new file mode 100644 index 00000000..aaa7cbc0 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image16.txt @@ -0,0 +1 @@ +0 0.495412 0.395238 0.848197 0.507937 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image18.txt b/computed-vision/cars_detector/data/labels/train/image18.txt new file mode 100644 index 00000000..4a4eb9ee --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image18.txt @@ -0,0 +1 @@ +0 0.500548 0.510733 0.608553 0.684974 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image19.txt b/computed-vision/cars_detector/data/labels/train/image19.txt new file mode 100644 index 00000000..5b906836 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image19.txt @@ -0,0 +1 @@ +0 0.497259 0.507946 0.994518 0.792334 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image2.txt b/computed-vision/cars_detector/data/labels/train/image2.txt new file mode 100644 index 00000000..7531ed63 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image2.txt @@ -0,0 +1 @@ +0 0.516447 0.565594 0.813596 0.593280 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image21.txt b/computed-vision/cars_detector/data/labels/train/image21.txt new file mode 100644 index 00000000..0fabb9d8 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image21.txt @@ -0,0 +1 @@ +0 0.509320 0.663126 0.922149 0.566820 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image22.txt b/computed-vision/cars_detector/data/labels/train/image22.txt new file mode 100644 index 00000000..bd3e3adc --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image22.txt @@ -0,0 +1 @@ +0 0.544956 0.744753 0.875000 0.509085 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image25.txt b/computed-vision/cars_detector/data/labels/train/image25.txt new file mode 100644 index 00000000..b5148bd3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image25.txt @@ -0,0 +1 @@ +0 0.509868 0.507832 0.855263 0.798872 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image26.txt b/computed-vision/cars_detector/data/labels/train/image26.txt new file mode 100644 index 00000000..a6980c51 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image26.txt @@ -0,0 +1 @@ +0 0.505482 0.507299 0.945175 0.907128 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image28.txt b/computed-vision/cars_detector/data/labels/train/image28.txt new file mode 100644 index 00000000..482643d9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image28.txt @@ -0,0 +1 @@ +0 0.476425 0.443773 0.816886 0.674720 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image3.txt b/computed-vision/cars_detector/data/labels/train/image3.txt new file mode 100644 index 00000000..58497964 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image3.txt @@ -0,0 +1 @@ +0 0.540570 0.636365 0.750000 0.588941 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image5.txt b/computed-vision/cars_detector/data/labels/train/image5.txt new file mode 100644 index 00000000..03d92614 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image5.txt @@ -0,0 +1 @@ +0 0.311404 0.540369 0.622807 0.914492 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image6.txt b/computed-vision/cars_detector/data/labels/train/image6.txt new file mode 100644 index 00000000..2b232fa5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image6.txt @@ -0,0 +1 @@ +0 0.487390 0.587613 0.716009 0.586473 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/image8.txt b/computed-vision/cars_detector/data/labels/train/image8.txt new file mode 100644 index 00000000..0b61285a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/image8.txt @@ -0,0 +1 @@ +0 0.472588 0.487273 0.614035 0.655937 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images.txt b/computed-vision/cars_detector/data/labels/train/images.txt new file mode 100644 index 00000000..40b4a94f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images.txt @@ -0,0 +1 @@ +0 0.546601 0.536250 0.856360 0.698639 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images100.txt b/computed-vision/cars_detector/data/labels/train/images100.txt new file mode 100644 index 00000000..f16b7312 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images100.txt @@ -0,0 +1 @@ +0 0.492325 0.505395 0.747807 0.650965 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images101.txt b/computed-vision/cars_detector/data/labels/train/images101.txt new file mode 100644 index 00000000..781a08cd --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images101.txt @@ -0,0 +1 @@ +0 0.558114 0.750455 0.620614 0.283410 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images102.txt b/computed-vision/cars_detector/data/labels/train/images102.txt new file mode 100644 index 00000000..87da4ee9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images102.txt @@ -0,0 +1 @@ +0 0.497807 0.598342 0.730263 0.400518 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images103.txt b/computed-vision/cars_detector/data/labels/train/images103.txt new file mode 100644 index 00000000..6a5896dc --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images103.txt @@ -0,0 +1 @@ +0 0.506579 0.404996 0.515351 0.369462 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images104.txt b/computed-vision/cars_detector/data/labels/train/images104.txt new file mode 100644 index 00000000..dce16199 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images104.txt @@ -0,0 +1 @@ +0 0.513078 0.542857 0.889330 0.479365 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images105.txt b/computed-vision/cars_detector/data/labels/train/images105.txt new file mode 100644 index 00000000..9465d162 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images105.txt @@ -0,0 +1 @@ +0 0.504471 0.576190 0.802473 0.590476 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images106.txt b/computed-vision/cars_detector/data/labels/train/images106.txt new file mode 100644 index 00000000..07b09e55 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images106.txt @@ -0,0 +1 @@ +0 0.512061 0.550909 0.583333 0.422932 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images107.txt b/computed-vision/cars_detector/data/labels/train/images107.txt new file mode 100644 index 00000000..c98932f2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images107.txt @@ -0,0 +1 @@ +0 0.492857 0.647619 0.839683 0.409524 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images108.txt b/computed-vision/cars_detector/data/labels/train/images108.txt new file mode 100644 index 00000000..d9b7c97a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images108.txt @@ -0,0 +1 @@ +0 0.514299 0.532231 0.593959 0.482645 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images109.txt b/computed-vision/cars_detector/data/labels/train/images109.txt new file mode 100644 index 00000000..83b17d6f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images109.txt @@ -0,0 +1 @@ +0 0.480751 0.621488 0.489467 0.353719 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images11.txt b/computed-vision/cars_detector/data/labels/train/images11.txt new file mode 100644 index 00000000..406623a6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images11.txt @@ -0,0 +1 @@ +0 0.497259 0.485364 0.751096 0.843045 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images110.txt b/computed-vision/cars_detector/data/labels/train/images110.txt new file mode 100644 index 00000000..df12145e --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images110.txt @@ -0,0 +1 @@ +0 0.520833 0.498508 0.703947 0.787539 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images111.txt b/computed-vision/cars_detector/data/labels/train/images111.txt new file mode 100644 index 00000000..c42fd27d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images111.txt @@ -0,0 +1 @@ +0 0.486801 0.613223 0.857941 0.485950 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images112.txt b/computed-vision/cars_detector/data/labels/train/images112.txt new file mode 100644 index 00000000..4e67fdf7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images112.txt @@ -0,0 +1 @@ +0 0.503714 0.492562 0.963222 0.618182 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images114.txt b/computed-vision/cars_detector/data/labels/train/images114.txt new file mode 100644 index 00000000..4ab16d92 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images114.txt @@ -0,0 +1 @@ +0 0.510449 0.500826 0.694053 0.423140 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images115.txt b/computed-vision/cars_detector/data/labels/train/images115.txt new file mode 100644 index 00000000..43573783 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images115.txt @@ -0,0 +1 @@ +0 0.498355 0.605137 0.720395 0.402189 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images116.txt b/computed-vision/cars_detector/data/labels/train/images116.txt new file mode 100644 index 00000000..245c765a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images116.txt @@ -0,0 +1 @@ +0 0.509349 0.553719 0.683053 0.555372 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images117.txt b/computed-vision/cars_detector/data/labels/train/images117.txt new file mode 100644 index 00000000..3092bb6a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images117.txt @@ -0,0 +1 @@ +0 0.490073 0.407438 0.806091 0.401653 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images118.txt b/computed-vision/cars_detector/data/labels/train/images118.txt new file mode 100644 index 00000000..4f123d24 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images118.txt @@ -0,0 +1 @@ +0 0.547934 0.490083 0.595041 0.252893 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images12.txt b/computed-vision/cars_detector/data/labels/train/images12.txt new file mode 100644 index 00000000..6ec2c8a7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images12.txt @@ -0,0 +1 @@ +0 0.502193 0.517892 0.747807 0.757797 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images120.txt b/computed-vision/cars_detector/data/labels/train/images120.txt new file mode 100644 index 00000000..18118728 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images120.txt @@ -0,0 +1 @@ +0 0.542149 0.483471 0.600000 0.272727 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images121.txt b/computed-vision/cars_detector/data/labels/train/images121.txt new file mode 100644 index 00000000..4c26b0bb --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images121.txt @@ -0,0 +1 @@ +0 0.504386 0.522844 0.407895 0.588450 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images122.txt b/computed-vision/cars_detector/data/labels/train/images122.txt new file mode 100644 index 00000000..793ba50b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images122.txt @@ -0,0 +1 @@ +0 0.501096 0.531328 0.978070 0.565868 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images123.txt b/computed-vision/cars_detector/data/labels/train/images123.txt new file mode 100644 index 00000000..49b994c5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images123.txt @@ -0,0 +1 @@ +0 0.506050 0.496694 0.863441 0.504132 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images124.txt b/computed-vision/cars_detector/data/labels/train/images124.txt new file mode 100644 index 00000000..f3764ab2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images124.txt @@ -0,0 +1 @@ +0 0.508224 0.525454 0.799342 0.742090 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images125.txt b/computed-vision/cars_detector/data/labels/train/images125.txt new file mode 100644 index 00000000..25d0106c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images125.txt @@ -0,0 +1 @@ +0 0.677632 0.497063 0.640351 0.771460 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images126.txt b/computed-vision/cars_detector/data/labels/train/images126.txt new file mode 100644 index 00000000..e554ec2b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images126.txt @@ -0,0 +1 @@ +0 0.502200 0.487603 0.754548 0.538843 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images127.txt b/computed-vision/cars_detector/data/labels/train/images127.txt new file mode 100644 index 00000000..802ff291 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images127.txt @@ -0,0 +1 @@ +0 0.458882 0.543102 0.821272 0.521053 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images128.txt b/computed-vision/cars_detector/data/labels/train/images128.txt new file mode 100644 index 00000000..e38e0dab --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images128.txt @@ -0,0 +1 @@ +0 0.486251 0.564463 0.625857 0.454545 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images129.txt b/computed-vision/cars_detector/data/labels/train/images129.txt new file mode 100644 index 00000000..553466fe --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images129.txt @@ -0,0 +1 @@ +0 0.490132 0.484166 0.550439 0.490856 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images13.txt b/computed-vision/cars_detector/data/labels/train/images13.txt new file mode 100644 index 00000000..cfb67a10 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images13.txt @@ -0,0 +1 @@ +0 0.493969 0.591048 0.867325 0.536497 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images130.txt b/computed-vision/cars_detector/data/labels/train/images130.txt new file mode 100644 index 00000000..01356ec0 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images130.txt @@ -0,0 +1 @@ +0 0.544408 0.642294 0.711623 0.590917 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images131.txt b/computed-vision/cars_detector/data/labels/train/images131.txt new file mode 100644 index 00000000..0a66910a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images131.txt @@ -0,0 +1 @@ +0 0.504934 0.541343 0.900219 0.762367 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images132.txt b/computed-vision/cars_detector/data/labels/train/images132.txt new file mode 100644 index 00000000..10fd1437 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images132.txt @@ -0,0 +1 @@ +0 0.418860 0.546053 0.625000 0.503168 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images133.txt b/computed-vision/cars_detector/data/labels/train/images133.txt new file mode 100644 index 00000000..186f18dc --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images133.txt @@ -0,0 +1 @@ +0 0.490724 0.488430 0.600617 0.616529 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images135.txt b/computed-vision/cars_detector/data/labels/train/images135.txt new file mode 100644 index 00000000..fbe76cda --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images135.txt @@ -0,0 +1 @@ +0 0.504386 0.628236 0.732456 0.743527 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images136.txt b/computed-vision/cars_detector/data/labels/train/images136.txt new file mode 100644 index 00000000..2bbb593b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images136.txt @@ -0,0 +1 @@ +0 0.547297 0.601653 0.767748 0.390083 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images138.txt b/computed-vision/cars_detector/data/labels/train/images138.txt new file mode 100644 index 00000000..ade941f7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images138.txt @@ -0,0 +1 @@ +0 0.490909 0.554545 0.960331 0.801653 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images139.txt b/computed-vision/cars_detector/data/labels/train/images139.txt new file mode 100644 index 00000000..34915336 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images139.txt @@ -0,0 +1 @@ +0 0.501645 0.628799 0.930921 0.665459 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images14.txt b/computed-vision/cars_detector/data/labels/train/images14.txt new file mode 100644 index 00000000..dde4532c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images14.txt @@ -0,0 +1 @@ +0 0.521666 0.571901 0.682179 0.730579 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images140.txt b/computed-vision/cars_detector/data/labels/train/images140.txt new file mode 100644 index 00000000..be787b20 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images140.txt @@ -0,0 +1 @@ +0 0.499174 0.657025 0.993388 0.371901 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images141.txt b/computed-vision/cars_detector/data/labels/train/images141.txt new file mode 100644 index 00000000..03802980 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images141.txt @@ -0,0 +1 @@ +0 0.523026 0.500979 0.664474 0.775376 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images142.txt b/computed-vision/cars_detector/data/labels/train/images142.txt new file mode 100644 index 00000000..ec2adc7b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images142.txt @@ -0,0 +1 @@ +0 0.501645 0.537935 0.764254 0.675934 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images143.txt b/computed-vision/cars_detector/data/labels/train/images143.txt new file mode 100644 index 00000000..9b44152d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images143.txt @@ -0,0 +1 @@ +0 0.496162 0.562657 0.615132 0.832159 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images144.txt b/computed-vision/cars_detector/data/labels/train/images144.txt new file mode 100644 index 00000000..2093f098 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images144.txt @@ -0,0 +1 @@ +0 0.475440 0.504132 0.950880 0.542149 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images145.txt b/computed-vision/cars_detector/data/labels/train/images145.txt new file mode 100644 index 00000000..03869d29 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images145.txt @@ -0,0 +1 @@ +0 0.566338 0.650265 0.542763 0.485922 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images146.txt b/computed-vision/cars_detector/data/labels/train/images146.txt new file mode 100644 index 00000000..cd1c623a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images146.txt @@ -0,0 +1 @@ +0 0.494518 0.511601 0.857456 0.791738 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images147.txt b/computed-vision/cars_detector/data/labels/train/images147.txt new file mode 100644 index 00000000..546850c7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images147.txt @@ -0,0 +1 @@ +0 0.500548 0.515612 0.632675 0.774743 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images148.txt b/computed-vision/cars_detector/data/labels/train/images148.txt new file mode 100644 index 00000000..81b2fbd0 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images148.txt @@ -0,0 +1,3 @@ +0 0.264254 0.508341 0.260965 0.281522 +0 0.476974 0.504171 0.111842 0.193938 +0 0.707237 0.530238 0.328947 0.354510 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images149.txt b/computed-vision/cars_detector/data/labels/train/images149.txt new file mode 100644 index 00000000..c034db52 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images149.txt @@ -0,0 +1 @@ +0 0.497807 0.663956 0.574561 0.627407 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images15.txt b/computed-vision/cars_detector/data/labels/train/images15.txt new file mode 100644 index 00000000..eb677402 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images15.txt @@ -0,0 +1 @@ +0 0.493400 0.642975 0.904138 0.446281 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images150.txt b/computed-vision/cars_detector/data/labels/train/images150.txt new file mode 100644 index 00000000..724703ef --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images150.txt @@ -0,0 +1 @@ +0 0.509868 0.477483 0.723684 0.653979 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images152.txt b/computed-vision/cars_detector/data/labels/train/images152.txt new file mode 100644 index 00000000..2c2ce9e7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images152.txt @@ -0,0 +1,2 @@ +0 0.262061 0.486320 0.280702 0.373101 +0 0.787281 0.370658 0.423246 0.654171 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images153.txt b/computed-vision/cars_detector/data/labels/train/images153.txt new file mode 100644 index 00000000..91e06617 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images153.txt @@ -0,0 +1 @@ +0 0.445554 0.662810 0.504866 0.320661 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images154.txt b/computed-vision/cars_detector/data/labels/train/images154.txt new file mode 100644 index 00000000..b9041782 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images154.txt @@ -0,0 +1 @@ +0 0.555546 0.615702 0.419071 0.302479 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images155.txt b/computed-vision/cars_detector/data/labels/train/images155.txt new file mode 100644 index 00000000..12924f4c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images155.txt @@ -0,0 +1,2 @@ +0 0.133166 0.596694 0.266332 0.161983 +0 0.509051 0.544628 0.465690 0.249587 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images159.txt b/computed-vision/cars_detector/data/labels/train/images159.txt new file mode 100644 index 00000000..62e58540 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images159.txt @@ -0,0 +1 @@ +0 0.541322 0.482645 0.588430 0.290909 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images16.txt b/computed-vision/cars_detector/data/labels/train/images16.txt new file mode 100644 index 00000000..7d13ac32 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images16.txt @@ -0,0 +1 @@ +0 0.498904 0.553728 0.910088 0.657895 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images160.txt b/computed-vision/cars_detector/data/labels/train/images160.txt new file mode 100644 index 00000000..322bfc84 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images160.txt @@ -0,0 +1 @@ +0 0.545504 0.570489 0.731360 0.534539 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images161.txt b/computed-vision/cars_detector/data/labels/train/images161.txt new file mode 100644 index 00000000..d238f4af --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images161.txt @@ -0,0 +1 @@ +0 0.504386 0.544701 0.826754 0.598989 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images162.txt b/computed-vision/cars_detector/data/labels/train/images162.txt new file mode 100644 index 00000000..7982467c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images162.txt @@ -0,0 +1 @@ +0 0.466452 0.512397 0.735850 0.657851 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images163.txt b/computed-vision/cars_detector/data/labels/train/images163.txt new file mode 100644 index 00000000..fde03bf3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images163.txt @@ -0,0 +1 @@ +0 0.549587 0.486777 0.624793 0.272727 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images164.txt b/computed-vision/cars_detector/data/labels/train/images164.txt new file mode 100644 index 00000000..7c6fee4a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images164.txt @@ -0,0 +1,2 @@ +0 0.084626 0.657851 0.129998 0.095868 +0 0.709235 0.688430 0.259996 0.114050 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images165.txt b/computed-vision/cars_detector/data/labels/train/images165.txt new file mode 100644 index 00000000..b8cd07ee --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images165.txt @@ -0,0 +1 @@ +0 0.495868 0.556198 0.606612 0.242975 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images166.txt b/computed-vision/cars_detector/data/labels/train/images166.txt new file mode 100644 index 00000000..7b64b19f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images166.txt @@ -0,0 +1,6 @@ +0 0.159539 0.268185 0.283991 0.310937 +0 0.473136 0.280678 0.292763 0.341475 +0 0.807018 0.280678 0.313596 0.374790 +0 0.132675 0.719322 0.195175 0.358133 +0 0.400768 0.722098 0.213816 0.385895 +0 0.763706 0.726262 0.415570 0.366461 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images168.txt b/computed-vision/cars_detector/data/labels/train/images168.txt new file mode 100644 index 00000000..4ceb597c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images168.txt @@ -0,0 +1 @@ +0 0.575523 0.544628 0.324375 0.295868 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images169.txt b/computed-vision/cars_detector/data/labels/train/images169.txt new file mode 100644 index 00000000..8f7a7013 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images169.txt @@ -0,0 +1 @@ +0 0.495600 0.565289 0.879940 0.489256 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images17.txt b/computed-vision/cars_detector/data/labels/train/images17.txt new file mode 100644 index 00000000..03c608a3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images17.txt @@ -0,0 +1 @@ +0 0.497807 0.492517 0.962719 0.508820 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images170.txt b/computed-vision/cars_detector/data/labels/train/images170.txt new file mode 100644 index 00000000..7d5cd301 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images170.txt @@ -0,0 +1 @@ +0 0.340461 0.475414 0.678728 0.903307 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images171.txt b/computed-vision/cars_detector/data/labels/train/images171.txt new file mode 100644 index 00000000..1899799d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images171.txt @@ -0,0 +1 @@ +0 0.438596 0.538054 0.666667 0.725956 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images173.txt b/computed-vision/cars_detector/data/labels/train/images173.txt new file mode 100644 index 00000000..c7b96f8c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images173.txt @@ -0,0 +1 @@ +0 0.449403 0.685950 0.455369 0.287603 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images174.txt b/computed-vision/cars_detector/data/labels/train/images174.txt new file mode 100644 index 00000000..d512c57d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images174.txt @@ -0,0 +1 @@ +0 0.509320 0.550909 0.792763 0.734258 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images175.txt b/computed-vision/cars_detector/data/labels/train/images175.txt new file mode 100644 index 00000000..f93bbd21 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images175.txt @@ -0,0 +1 @@ +0 0.478618 0.590069 0.937500 0.734258 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images176.txt b/computed-vision/cars_detector/data/labels/train/images176.txt new file mode 100644 index 00000000..7e084cf6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images176.txt @@ -0,0 +1 @@ +0 0.504655 0.566116 0.847271 0.514050 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images177.txt b/computed-vision/cars_detector/data/labels/train/images177.txt new file mode 100644 index 00000000..1d3ad583 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images177.txt @@ -0,0 +1 @@ +0 0.502741 0.564615 0.737939 0.742090 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images179.txt b/computed-vision/cars_detector/data/labels/train/images179.txt new file mode 100644 index 00000000..99de9a34 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images179.txt @@ -0,0 +1 @@ +0 0.500548 0.485315 0.893640 0.603070 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images18.txt b/computed-vision/cars_detector/data/labels/train/images18.txt new file mode 100644 index 00000000..679715ae --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images18.txt @@ -0,0 +1 @@ +0 0.496586 0.233058 0.876249 0.132231 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images180.txt b/computed-vision/cars_detector/data/labels/train/images180.txt new file mode 100644 index 00000000..362be43c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images180.txt @@ -0,0 +1 @@ +0 0.733004 0.597925 0.428728 0.548836 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images181.txt b/computed-vision/cars_detector/data/labels/train/images181.txt new file mode 100644 index 00000000..aca4e796 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images181.txt @@ -0,0 +1 @@ +0 0.598684 0.393425 0.802632 0.786850 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images182.txt b/computed-vision/cars_detector/data/labels/train/images182.txt new file mode 100644 index 00000000..6fc5ff1a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images182.txt @@ -0,0 +1 @@ +0 0.496188 0.602479 0.907240 0.345455 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images183.txt b/computed-vision/cars_detector/data/labels/train/images183.txt new file mode 100644 index 00000000..16c11856 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images183.txt @@ -0,0 +1 @@ +0 0.497259 0.622376 0.819079 0.493421 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images185.txt b/computed-vision/cars_detector/data/labels/train/images185.txt new file mode 100644 index 00000000..08b80f2b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images185.txt @@ -0,0 +1 @@ +0 0.503850 0.535537 0.960234 0.538843 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images186.txt b/computed-vision/cars_detector/data/labels/train/images186.txt new file mode 100644 index 00000000..dcb713d2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images186.txt @@ -0,0 +1 @@ +0 0.501096 0.492517 0.960526 0.515471 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images187.txt b/computed-vision/cars_detector/data/labels/train/images187.txt new file mode 100644 index 00000000..0ab0ca7b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images187.txt @@ -0,0 +1 @@ +0 0.502963 0.504132 0.963480 0.535537 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images188.txt b/computed-vision/cars_detector/data/labels/train/images188.txt new file mode 100644 index 00000000..393f5ea4 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images188.txt @@ -0,0 +1 @@ +0 0.472039 0.446154 0.558114 0.634398 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images189.txt b/computed-vision/cars_detector/data/labels/train/images189.txt new file mode 100644 index 00000000..28e93653 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images189.txt @@ -0,0 +1 @@ +0 0.523026 0.510769 0.787281 0.802788 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images19.txt b/computed-vision/cars_detector/data/labels/train/images19.txt new file mode 100644 index 00000000..1ff0d9fb --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images19.txt @@ -0,0 +1 @@ +0 0.490714 0.444628 0.659893 0.353719 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images190.txt b/computed-vision/cars_detector/data/labels/train/images190.txt new file mode 100644 index 00000000..30f1a8ac --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images190.txt @@ -0,0 +1 @@ +0 0.515410 0.486777 0.969180 0.652893 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images191.txt b/computed-vision/cars_detector/data/labels/train/images191.txt new file mode 100644 index 00000000..0a086603 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images191.txt @@ -0,0 +1,2 @@ +0 0.496690 0.241322 0.959913 0.317355 +0 0.501103 0.671074 0.933433 0.393388 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images192.txt b/computed-vision/cars_detector/data/labels/train/images192.txt new file mode 100644 index 00000000..eb0ffab1 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images192.txt @@ -0,0 +1 @@ +0 0.501717 0.535537 0.928418 0.561983 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images193.txt b/computed-vision/cars_detector/data/labels/train/images193.txt new file mode 100644 index 00000000..7acb6195 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images193.txt @@ -0,0 +1 @@ +0 0.493565 0.502479 0.916130 0.763636 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images194.txt b/computed-vision/cars_detector/data/labels/train/images194.txt new file mode 100644 index 00000000..97fd5f5e --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images194.txt @@ -0,0 +1 @@ +0 0.303984 0.577686 0.602610 0.814876 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images195.txt b/computed-vision/cars_detector/data/labels/train/images195.txt new file mode 100644 index 00000000..4b90f944 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images195.txt @@ -0,0 +1 @@ +0 0.496711 0.523418 0.833333 0.489825 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images196.txt b/computed-vision/cars_detector/data/labels/train/images196.txt new file mode 100644 index 00000000..0ad6c9ae --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images196.txt @@ -0,0 +1 @@ +0 0.500000 0.490083 0.910280 0.778512 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images197.txt b/computed-vision/cars_detector/data/labels/train/images197.txt new file mode 100644 index 00000000..99c2c3a6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images197.txt @@ -0,0 +1 @@ +0 0.498900 0.541322 0.800745 0.590083 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images198.txt b/computed-vision/cars_detector/data/labels/train/images198.txt new file mode 100644 index 00000000..42391a46 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images198.txt @@ -0,0 +1 @@ +0 0.512381 0.577686 0.973126 0.378512 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images199.txt b/computed-vision/cars_detector/data/labels/train/images199.txt new file mode 100644 index 00000000..93434887 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images199.txt @@ -0,0 +1 @@ +0 0.496711 0.490210 0.929825 0.804746 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images2.txt b/computed-vision/cars_detector/data/labels/train/images2.txt new file mode 100644 index 00000000..ad0fc1de --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images2.txt @@ -0,0 +1 @@ +0 0.503289 0.516714 0.824561 0.654475 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images20.txt b/computed-vision/cars_detector/data/labels/train/images20.txt new file mode 100644 index 00000000..a6048cc8 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images20.txt @@ -0,0 +1 @@ +0 0.503838 0.508955 0.746711 0.875000 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images202.txt b/computed-vision/cars_detector/data/labels/train/images202.txt new file mode 100644 index 00000000..4f656ee7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images202.txt @@ -0,0 +1 @@ +0 0.498143 0.504959 0.538562 0.421488 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images203.txt b/computed-vision/cars_detector/data/labels/train/images203.txt new file mode 100644 index 00000000..605fcefb --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images203.txt @@ -0,0 +1 @@ +0 0.610746 0.671731 0.434211 0.470310 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images204.txt b/computed-vision/cars_detector/data/labels/train/images204.txt new file mode 100644 index 00000000..bdd108d8 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images204.txt @@ -0,0 +1 @@ +0 0.497259 0.491893 0.779605 0.764121 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images205.txt b/computed-vision/cars_detector/data/labels/train/images205.txt new file mode 100644 index 00000000..b8038af3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images205.txt @@ -0,0 +1 @@ +0 0.495041 0.576033 0.872727 0.414876 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images206.txt b/computed-vision/cars_detector/data/labels/train/images206.txt new file mode 100644 index 00000000..1d1f151a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images206.txt @@ -0,0 +1 @@ +0 0.506031 0.506853 0.867325 0.290570 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images207.txt b/computed-vision/cars_detector/data/labels/train/images207.txt new file mode 100644 index 00000000..f1376df1 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images207.txt @@ -0,0 +1 @@ +0 0.500548 0.514685 0.757675 0.779292 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images208.txt b/computed-vision/cars_detector/data/labels/train/images208.txt new file mode 100644 index 00000000..d7ccfdc5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images208.txt @@ -0,0 +1 @@ +0 0.475329 0.515623 0.773026 0.716839 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images209.txt b/computed-vision/cars_detector/data/labels/train/images209.txt new file mode 100644 index 00000000..1bf57642 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images209.txt @@ -0,0 +1 @@ +0 0.500000 0.479509 0.833333 0.636187 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images21.txt b/computed-vision/cars_detector/data/labels/train/images21.txt new file mode 100644 index 00000000..0ee97728 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images21.txt @@ -0,0 +1 @@ +0 0.278509 0.404555 0.392544 0.645842 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images22.txt b/computed-vision/cars_detector/data/labels/train/images22.txt new file mode 100644 index 00000000..8eb130fd --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images22.txt @@ -0,0 +1 @@ +0 0.504427 0.561983 0.929752 0.251240 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images23.txt b/computed-vision/cars_detector/data/labels/train/images23.txt new file mode 100644 index 00000000..848d2050 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images23.txt @@ -0,0 +1,2 @@ +0 0.317434 0.467693 0.419956 0.454261 +0 0.712171 0.514685 0.312500 0.419016 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images24.txt b/computed-vision/cars_detector/data/labels/train/images24.txt new file mode 100644 index 00000000..26335b7c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images24.txt @@ -0,0 +1 @@ +0 0.445554 0.574380 0.663255 0.497521 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images25.txt b/computed-vision/cars_detector/data/labels/train/images25.txt new file mode 100644 index 00000000..84f7fc70 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images25.txt @@ -0,0 +1 @@ +0 0.502706 0.398347 0.868608 0.509091 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images26.txt b/computed-vision/cars_detector/data/labels/train/images26.txt new file mode 100644 index 00000000..64d9476d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images26.txt @@ -0,0 +1 @@ +0 0.514254 0.529370 0.872807 0.495379 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images27.txt b/computed-vision/cars_detector/data/labels/train/images27.txt new file mode 100644 index 00000000..cfb8151d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images27.txt @@ -0,0 +1 @@ +0 0.578399 0.524047 0.547149 0.658012 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images28.txt b/computed-vision/cars_detector/data/labels/train/images28.txt new file mode 100644 index 00000000..97bffd30 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images28.txt @@ -0,0 +1 @@ +0 0.487939 0.517243 0.739035 0.767898 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images29.txt b/computed-vision/cars_detector/data/labels/train/images29.txt new file mode 100644 index 00000000..cee97c07 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images29.txt @@ -0,0 +1 @@ +0 0.517482 0.453719 0.941452 0.808264 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images3.txt b/computed-vision/cars_detector/data/labels/train/images3.txt new file mode 100644 index 00000000..9fbd727a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images3.txt @@ -0,0 +1 @@ +0 0.615132 0.474311 0.337719 0.815049 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images30.txt b/computed-vision/cars_detector/data/labels/train/images30.txt new file mode 100644 index 00000000..b3f1a0bf --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images30.txt @@ -0,0 +1 @@ +0 0.498354 0.476033 0.914924 0.542149 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images31.txt b/computed-vision/cars_detector/data/labels/train/images31.txt new file mode 100644 index 00000000..1bf75104 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images31.txt @@ -0,0 +1 @@ +0 0.513199 0.600000 0.827144 0.545455 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images32.txt b/computed-vision/cars_detector/data/labels/train/images32.txt new file mode 100644 index 00000000..70f405f4 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images32.txt @@ -0,0 +1 @@ +0 0.713268 0.522386 0.527412 0.664120 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images33.txt b/computed-vision/cars_detector/data/labels/train/images33.txt new file mode 100644 index 00000000..31304c89 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images33.txt @@ -0,0 +1 @@ +0 0.503095 0.667769 0.981793 0.261157 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images34.txt b/computed-vision/cars_detector/data/labels/train/images34.txt new file mode 100644 index 00000000..045e36ee --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images34.txt @@ -0,0 +1 @@ +0 0.678180 0.522186 0.582237 0.611871 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images35.txt b/computed-vision/cars_detector/data/labels/train/images35.txt new file mode 100644 index 00000000..e03e8331 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images35.txt @@ -0,0 +1 @@ +0 0.494518 0.474546 0.850877 0.812578 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images36.txt b/computed-vision/cars_detector/data/labels/train/images36.txt new file mode 100644 index 00000000..0518cb68 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images36.txt @@ -0,0 +1 @@ +0 0.507150 0.511570 0.687453 0.494215 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images37.txt b/computed-vision/cars_detector/data/labels/train/images37.txt new file mode 100644 index 00000000..d9e27803 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images37.txt @@ -0,0 +1 @@ +0 0.506050 0.496694 0.643456 0.560331 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images38.txt b/computed-vision/cars_detector/data/labels/train/images38.txt new file mode 100644 index 00000000..18e1ecb5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images38.txt @@ -0,0 +1 @@ +0 0.558678 0.502479 0.871074 0.995041 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images39.txt b/computed-vision/cars_detector/data/labels/train/images39.txt new file mode 100644 index 00000000..3b92ee2c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images39.txt @@ -0,0 +1 @@ +0 0.509349 0.515702 0.709452 0.413223 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images4.txt b/computed-vision/cars_detector/data/labels/train/images4.txt new file mode 100644 index 00000000..ff245440 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images4.txt @@ -0,0 +1 @@ +0 0.503306 0.619008 0.783471 0.269421 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images40.txt b/computed-vision/cars_detector/data/labels/train/images40.txt new file mode 100644 index 00000000..b4df47dc --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images40.txt @@ -0,0 +1 @@ +0 0.516499 0.486777 0.666554 0.676033 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images41.txt b/computed-vision/cars_detector/data/labels/train/images41.txt new file mode 100644 index 00000000..dc94eb0b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images41.txt @@ -0,0 +1 @@ +0 0.492325 0.664474 0.817982 0.526707 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images42.txt b/computed-vision/cars_detector/data/labels/train/images42.txt new file mode 100644 index 00000000..daf5767e --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images42.txt @@ -0,0 +1 @@ +0 0.498347 0.582645 0.928926 0.454545 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images43.txt b/computed-vision/cars_detector/data/labels/train/images43.txt new file mode 100644 index 00000000..61c5ef9f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images43.txt @@ -0,0 +1 @@ +0 0.516447 0.497793 0.802632 0.823160 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images44.txt b/computed-vision/cars_detector/data/labels/train/images44.txt new file mode 100644 index 00000000..ca2a2e8b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images44.txt @@ -0,0 +1 @@ +0 0.494518 0.550101 0.776316 0.535172 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images45.txt b/computed-vision/cars_detector/data/labels/train/images45.txt new file mode 100644 index 00000000..5a58f91d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images45.txt @@ -0,0 +1 @@ +0 0.546601 0.530349 0.722588 0.728383 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images46.txt b/computed-vision/cars_detector/data/labels/train/images46.txt new file mode 100644 index 00000000..c1cf0c33 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images46.txt @@ -0,0 +1 @@ +0 0.510449 0.520661 0.711651 0.578512 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images47.txt b/computed-vision/cars_detector/data/labels/train/images47.txt new file mode 100644 index 00000000..24a5c38d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images47.txt @@ -0,0 +1 @@ +0 0.500619 0.542149 0.976840 0.552066 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images48.txt b/computed-vision/cars_detector/data/labels/train/images48.txt new file mode 100644 index 00000000..1dd42067 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images48.txt @@ -0,0 +1 @@ +0 0.502200 0.542149 0.985533 0.806612 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images49.txt b/computed-vision/cars_detector/data/labels/train/images49.txt new file mode 100644 index 00000000..61de799f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images49.txt @@ -0,0 +1 @@ +0 0.515399 0.559504 0.635757 0.464463 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images5.txt b/computed-vision/cars_detector/data/labels/train/images5.txt new file mode 100644 index 00000000..017b6c0c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images5.txt @@ -0,0 +1 @@ +0 0.516996 0.491189 0.862939 0.845865 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images50.txt b/computed-vision/cars_detector/data/labels/train/images50.txt new file mode 100644 index 00000000..abda1e04 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images50.txt @@ -0,0 +1 @@ +0 0.440789 0.450957 0.456140 0.759000 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images51.txt b/computed-vision/cars_detector/data/labels/train/images51.txt new file mode 100644 index 00000000..643b12bf --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images51.txt @@ -0,0 +1 @@ +0 0.405702 0.603618 0.609649 0.593647 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images52.txt b/computed-vision/cars_detector/data/labels/train/images52.txt new file mode 100644 index 00000000..c29b32fa --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images52.txt @@ -0,0 +1 @@ +0 0.359101 0.585174 0.696272 0.712719 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images53.txt b/computed-vision/cars_detector/data/labels/train/images53.txt new file mode 100644 index 00000000..aac35be8 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images53.txt @@ -0,0 +1 @@ +0 0.544547 0.538843 0.694053 0.684298 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images54.txt b/computed-vision/cars_detector/data/labels/train/images54.txt new file mode 100644 index 00000000..429c1cff --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images54.txt @@ -0,0 +1 @@ +0 0.629386 0.583950 0.471491 0.671601 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images55.txt b/computed-vision/cars_detector/data/labels/train/images55.txt new file mode 100644 index 00000000..dc7c0f21 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images55.txt @@ -0,0 +1 @@ +0 0.507127 0.584195 0.851974 0.620692 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images56.txt b/computed-vision/cars_detector/data/labels/train/images56.txt new file mode 100644 index 00000000..ffe03e48 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images56.txt @@ -0,0 +1 @@ +0 0.489583 0.582906 0.862939 0.667920 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images57.txt b/computed-vision/cars_detector/data/labels/train/images57.txt new file mode 100644 index 00000000..c3c740ef --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images57.txt @@ -0,0 +1 @@ +0 0.501650 0.482645 0.656655 0.519008 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images59.txt b/computed-vision/cars_detector/data/labels/train/images59.txt new file mode 100644 index 00000000..4b7b2d0a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images59.txt @@ -0,0 +1 @@ +0 0.603618 0.606712 0.786184 0.783208 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images6.txt b/computed-vision/cars_detector/data/labels/train/images6.txt new file mode 100644 index 00000000..108993c3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images6.txt @@ -0,0 +1 @@ +0 0.491776 0.519862 0.759868 0.602473 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images61.txt b/computed-vision/cars_detector/data/labels/train/images61.txt new file mode 100644 index 00000000..2fc6ec8b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images61.txt @@ -0,0 +1 @@ +0 0.514849 0.559504 0.614858 0.391736 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images62.txt b/computed-vision/cars_detector/data/labels/train/images62.txt new file mode 100644 index 00000000..e96217b9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images62.txt @@ -0,0 +1 @@ +0 0.504934 0.529272 0.740132 0.731810 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images63.txt b/computed-vision/cars_detector/data/labels/train/images63.txt new file mode 100644 index 00000000..18ff6f05 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images63.txt @@ -0,0 +1 @@ +0 0.494292 0.656198 0.983464 0.618182 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images64.txt b/computed-vision/cars_detector/data/labels/train/images64.txt new file mode 100644 index 00000000..daa758be --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images64.txt @@ -0,0 +1 @@ +0 0.522478 0.485046 0.871711 0.791704 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images65.txt b/computed-vision/cars_detector/data/labels/train/images65.txt new file mode 100644 index 00000000..c80a55e9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images65.txt @@ -0,0 +1 @@ +0 0.524761 0.574380 0.730464 0.381818 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images66.txt b/computed-vision/cars_detector/data/labels/train/images66.txt new file mode 100644 index 00000000..b6f93dbe --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images66.txt @@ -0,0 +1 @@ +0 0.534648 0.475207 0.883240 0.480992 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images69.txt b/computed-vision/cars_detector/data/labels/train/images69.txt new file mode 100644 index 00000000..0aaa21c1 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images69.txt @@ -0,0 +1 @@ +0 0.496162 0.546992 0.641447 0.867403 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images7.txt b/computed-vision/cars_detector/data/labels/train/images7.txt new file mode 100644 index 00000000..195bc1b8 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images7.txt @@ -0,0 +1 @@ +0 0.497807 0.472714 0.763158 0.545729 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images70.txt b/computed-vision/cars_detector/data/labels/train/images70.txt new file mode 100644 index 00000000..c318c565 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images70.txt @@ -0,0 +1 @@ +0 0.468202 0.479167 0.504386 0.504386 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images71.txt b/computed-vision/cars_detector/data/labels/train/images71.txt new file mode 100644 index 00000000..0cde38a9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images71.txt @@ -0,0 +1 @@ +0 0.451206 0.480982 0.612939 0.284441 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images72.txt b/computed-vision/cars_detector/data/labels/train/images72.txt new file mode 100644 index 00000000..99ea471b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images72.txt @@ -0,0 +1 @@ +0 0.499452 0.501669 0.865132 0.969593 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images74.txt b/computed-vision/cars_detector/data/labels/train/images74.txt new file mode 100644 index 00000000..ded3c4d2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images74.txt @@ -0,0 +1 @@ +0 0.531250 0.546992 0.737939 0.667685 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images75.txt b/computed-vision/cars_detector/data/labels/train/images75.txt new file mode 100644 index 00000000..b643f868 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images75.txt @@ -0,0 +1 @@ +0 0.475329 0.565375 0.689693 0.433232 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images76.txt b/computed-vision/cars_detector/data/labels/train/images76.txt new file mode 100644 index 00000000..da8d3f54 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images76.txt @@ -0,0 +1 @@ +0 0.498355 0.552449 0.748904 0.772661 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images77.txt b/computed-vision/cars_detector/data/labels/train/images77.txt new file mode 100644 index 00000000..c69a4735 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images77.txt @@ -0,0 +1 @@ +0 0.524671 0.450116 0.856360 0.686741 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images78.txt b/computed-vision/cars_detector/data/labels/train/images78.txt new file mode 100644 index 00000000..cb9ea70c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images78.txt @@ -0,0 +1 @@ +0 0.496162 0.503326 0.959430 0.543739 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images79.txt b/computed-vision/cars_detector/data/labels/train/images79.txt new file mode 100644 index 00000000..f1fcb5f4 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images79.txt @@ -0,0 +1 @@ +0 0.481908 0.415805 0.705044 0.722509 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images8.txt b/computed-vision/cars_detector/data/labels/train/images8.txt new file mode 100644 index 00000000..44caac0f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images8.txt @@ -0,0 +1 @@ +0 0.535636 0.515060 0.788377 0.730924 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images80.txt b/computed-vision/cars_detector/data/labels/train/images80.txt new file mode 100644 index 00000000..a2358ced --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images80.txt @@ -0,0 +1 @@ +0 0.502741 0.562683 0.417763 0.434942 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images81.txt b/computed-vision/cars_detector/data/labels/train/images81.txt new file mode 100644 index 00000000..776e4894 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images81.txt @@ -0,0 +1 @@ +0 0.501096 0.587357 0.846491 0.623078 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images82.txt b/computed-vision/cars_detector/data/labels/train/images82.txt new file mode 100644 index 00000000..81fc5bef --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images82.txt @@ -0,0 +1 @@ +0 0.483471 0.496694 0.909091 0.715702 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images83.txt b/computed-vision/cars_detector/data/labels/train/images83.txt new file mode 100644 index 00000000..d2642571 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images83.txt @@ -0,0 +1 @@ +0 0.507438 0.289256 0.814876 0.337190 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images84.txt b/computed-vision/cars_detector/data/labels/train/images84.txt new file mode 100644 index 00000000..99f4893b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images84.txt @@ -0,0 +1 @@ +0 0.728618 0.502749 0.481360 0.821936 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images85.txt b/computed-vision/cars_detector/data/labels/train/images85.txt new file mode 100644 index 00000000..4e619531 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images85.txt @@ -0,0 +1 @@ +0 0.518640 0.522517 0.826754 0.794956 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images86.txt b/computed-vision/cars_detector/data/labels/train/images86.txt new file mode 100644 index 00000000..c345ac36 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images86.txt @@ -0,0 +1 @@ +0 0.502963 0.511570 0.937408 0.563636 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images87.txt b/computed-vision/cars_detector/data/labels/train/images87.txt new file mode 100644 index 00000000..ceae3ba9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images87.txt @@ -0,0 +1 @@ +0 0.531818 0.639669 0.936364 0.621488 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images88.txt b/computed-vision/cars_detector/data/labels/train/images88.txt new file mode 100644 index 00000000..e26fb185 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images88.txt @@ -0,0 +1 @@ +0 0.639803 0.550439 0.628289 0.525884 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images89.txt b/computed-vision/cars_detector/data/labels/train/images89.txt new file mode 100644 index 00000000..98d87373 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images89.txt @@ -0,0 +1 @@ +0 0.515476 0.527273 0.944650 0.690909 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images9.txt b/computed-vision/cars_detector/data/labels/train/images9.txt new file mode 100644 index 00000000..b3abc5cf --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images9.txt @@ -0,0 +1 @@ +0 0.454496 0.500834 0.742325 0.600781 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images91.txt b/computed-vision/cars_detector/data/labels/train/images91.txt new file mode 100644 index 00000000..55241a69 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images91.txt @@ -0,0 +1 @@ +0 0.498355 0.509676 0.884868 0.865596 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images92.txt b/computed-vision/cars_detector/data/labels/train/images92.txt new file mode 100644 index 00000000..17c4fe88 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images92.txt @@ -0,0 +1 @@ +0 0.552066 0.453719 0.649587 0.342149 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images93.txt b/computed-vision/cars_detector/data/labels/train/images93.txt new file mode 100644 index 00000000..76f60ea6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images93.txt @@ -0,0 +1 @@ +0 0.488487 0.610143 0.713816 0.525683 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images94.txt b/computed-vision/cars_detector/data/labels/train/images94.txt new file mode 100644 index 00000000..65457a4d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images94.txt @@ -0,0 +1 @@ +0 0.513749 0.621488 0.850242 0.449587 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images96.txt b/computed-vision/cars_detector/data/labels/train/images96.txt new file mode 100644 index 00000000..7937c711 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images96.txt @@ -0,0 +1 @@ +0 0.364035 0.496711 0.723684 0.993421 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images97.txt b/computed-vision/cars_detector/data/labels/train/images97.txt new file mode 100644 index 00000000..569692af --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images97.txt @@ -0,0 +1 @@ +0 0.465657 0.483471 0.817374 0.656198 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images98.txt b/computed-vision/cars_detector/data/labels/train/images98.txt new file mode 100644 index 00000000..c4626242 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images98.txt @@ -0,0 +1 @@ +0 0.491201 0.515702 0.296980 0.271074 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/train/images99.txt b/computed-vision/cars_detector/data/labels/train/images99.txt new file mode 100644 index 00000000..1d6991ab --- /dev/null +++ b/computed-vision/cars_detector/data/labels/train/images99.txt @@ -0,0 +1 @@ +0 0.633224 0.583330 0.411184 0.302670 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/RR_50_Most_Expensive_Cars_You_Can_Buy_Right_Now_lead.txt b/computed-vision/cars_detector/data/labels/validate/RR_50_Most_Expensive_Cars_You_Can_Buy_Right_Now_lead.txt new file mode 100644 index 00000000..da76102b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/RR_50_Most_Expensive_Cars_You_Can_Buy_Right_Now_lead.txt @@ -0,0 +1,3 @@ +0 0.500548 0.227603 0.827851 0.455206 +0 0.307566 0.736632 0.549342 0.445997 +0 0.803180 0.712287 0.356360 0.494687 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/Transpo_G70_TA-518126.txt b/computed-vision/cars_detector/data/labels/validate/Transpo_G70_TA-518126.txt new file mode 100644 index 00000000..10a81c5d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/Transpo_G70_TA-518126.txt @@ -0,0 +1 @@ +0 0.496825 0.577778 0.930159 0.422222 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images210.txt b/computed-vision/cars_detector/data/labels/validate/images210.txt new file mode 100644 index 00000000..2499fabd --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images210.txt @@ -0,0 +1 @@ +0 0.462810 0.603306 0.900826 0.664463 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images213.txt b/computed-vision/cars_detector/data/labels/validate/images213.txt new file mode 100644 index 00000000..c56612ac --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images213.txt @@ -0,0 +1,4 @@ +0 0.243969 0.242520 0.382675 0.446429 +0 0.753289 0.246436 0.333333 0.466009 +0 0.243969 0.753564 0.378289 0.391604 +0 0.752741 0.751606 0.422149 0.426848 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images214.txt b/computed-vision/cars_detector/data/labels/validate/images214.txt new file mode 100644 index 00000000..648708a5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images214.txt @@ -0,0 +1 @@ +0 0.372807 0.518569 0.745614 0.949348 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images215.txt b/computed-vision/cars_detector/data/labels/validate/images215.txt new file mode 100644 index 00000000..484bdd23 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images215.txt @@ -0,0 +1 @@ +0 0.507150 0.504959 0.663255 0.507438 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images216.txt b/computed-vision/cars_detector/data/labels/validate/images216.txt new file mode 100644 index 00000000..1abe5934 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images216.txt @@ -0,0 +1 @@ +0 0.555062 0.543802 0.872934 0.337190 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images217.txt b/computed-vision/cars_detector/data/labels/validate/images217.txt new file mode 100644 index 00000000..730318fa --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images217.txt @@ -0,0 +1 @@ +0 0.506377 0.522314 0.685260 0.466116 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images218.txt b/computed-vision/cars_detector/data/labels/validate/images218.txt new file mode 100644 index 00000000..09c79691 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images218.txt @@ -0,0 +1 @@ +0 0.496711 0.521695 0.657895 0.328761 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images219.txt b/computed-vision/cars_detector/data/labels/validate/images219.txt new file mode 100644 index 00000000..797c927d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images219.txt @@ -0,0 +1 @@ +0 0.680373 0.457227 0.448465 0.493382 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images220.txt b/computed-vision/cars_detector/data/labels/validate/images220.txt new file mode 100644 index 00000000..3176bbd3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images220.txt @@ -0,0 +1,3 @@ +0 0.498524 0.162810 0.935655 0.299174 +0 0.500000 0.503306 0.956316 0.292562 +0 0.492621 0.843802 0.912043 0.285950 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images221.txt b/computed-vision/cars_detector/data/labels/validate/images221.txt new file mode 100644 index 00000000..5655d087 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images221.txt @@ -0,0 +1 @@ +0 0.498904 0.480420 0.997807 0.879151 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images222.txt b/computed-vision/cars_detector/data/labels/validate/images222.txt new file mode 100644 index 00000000..0f51725d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images222.txt @@ -0,0 +1 @@ +0 0.497259 0.504418 0.902412 0.871815 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images223.txt b/computed-vision/cars_detector/data/labels/validate/images223.txt new file mode 100644 index 00000000..2f12f858 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images223.txt @@ -0,0 +1,4 @@ +0 0.207875 0.294215 0.261906 0.310744 +0 0.659395 0.291736 0.468112 0.305785 +0 0.210837 0.692562 0.255980 0.320661 +0 0.661765 0.700000 0.501294 0.309091 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images224.txt b/computed-vision/cars_detector/data/labels/validate/images224.txt new file mode 100644 index 00000000..cf4bd93f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images224.txt @@ -0,0 +1 @@ +0 0.503850 0.523140 0.876640 0.395041 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images225.txt b/computed-vision/cars_detector/data/labels/validate/images225.txt new file mode 100644 index 00000000..b8d8b79e --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images225.txt @@ -0,0 +1 @@ +0 0.541247 0.585124 0.826044 0.568595 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images226.txt b/computed-vision/cars_detector/data/labels/validate/images226.txt new file mode 100644 index 00000000..fc0778a5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images226.txt @@ -0,0 +1 @@ +0 0.493421 0.598606 0.760965 0.400226 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images227.txt b/computed-vision/cars_detector/data/labels/validate/images227.txt new file mode 100644 index 00000000..499c2cba --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images227.txt @@ -0,0 +1 @@ +0 0.507438 0.252893 0.666116 0.343802 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images228.txt b/computed-vision/cars_detector/data/labels/validate/images228.txt new file mode 100644 index 00000000..49f928ef --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images228.txt @@ -0,0 +1 @@ +0 0.479715 0.512685 0.757675 0.710344 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images229.txt b/computed-vision/cars_detector/data/labels/validate/images229.txt new file mode 100644 index 00000000..7432b79c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images229.txt @@ -0,0 +1 @@ +0 0.500548 0.455018 0.836623 0.530409 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images230.txt b/computed-vision/cars_detector/data/labels/validate/images230.txt new file mode 100644 index 00000000..1467a3df --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images230.txt @@ -0,0 +1,2 @@ +0 0.499452 0.228742 0.834430 0.454698 +0 0.308114 0.735155 0.559211 0.456649 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images231.txt b/computed-vision/cars_detector/data/labels/validate/images231.txt new file mode 100644 index 00000000..b15b5123 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images231.txt @@ -0,0 +1 @@ +0 0.496162 0.499021 0.845395 0.665727 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images232.txt b/computed-vision/cars_detector/data/labels/validate/images232.txt new file mode 100644 index 00000000..cdbdf53f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images232.txt @@ -0,0 +1 @@ +0 0.490101 0.619835 0.822744 0.446281 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images233.txt b/computed-vision/cars_detector/data/labels/validate/images233.txt new file mode 100644 index 00000000..d0c88621 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images233.txt @@ -0,0 +1 @@ +0 0.491776 0.645872 0.869518 0.426848 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images234.txt b/computed-vision/cars_detector/data/labels/validate/images234.txt new file mode 100644 index 00000000..7b47fe3a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images234.txt @@ -0,0 +1 @@ +0 0.546281 0.488430 0.604959 0.269421 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images235.txt b/computed-vision/cars_detector/data/labels/validate/images235.txt new file mode 100644 index 00000000..e3a07d37 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images235.txt @@ -0,0 +1 @@ +0 0.495600 0.495868 0.554362 0.624793 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images236.txt b/computed-vision/cars_detector/data/labels/validate/images236.txt new file mode 100644 index 00000000..a81d520c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images236.txt @@ -0,0 +1 @@ +0 0.518699 0.769421 0.499366 0.319008 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images237.txt b/computed-vision/cars_detector/data/labels/validate/images237.txt new file mode 100644 index 00000000..2f8eb66e --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images237.txt @@ -0,0 +1 @@ +0 0.493421 0.534306 0.690789 0.775606 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images238.txt b/computed-vision/cars_detector/data/labels/validate/images238.txt new file mode 100644 index 00000000..b9b7b3cc --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images238.txt @@ -0,0 +1 @@ +0 0.502193 0.504277 0.986842 0.904585 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images240.txt b/computed-vision/cars_detector/data/labels/validate/images240.txt new file mode 100644 index 00000000..00e65945 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images240.txt @@ -0,0 +1 @@ +0 0.509286 0.497521 0.860461 0.836364 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images241.txt b/computed-vision/cars_detector/data/labels/validate/images241.txt new file mode 100644 index 00000000..8d9ef526 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images241.txt @@ -0,0 +1 @@ +0 0.506600 0.490083 0.657755 0.613223 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images243.txt b/computed-vision/cars_detector/data/labels/validate/images243.txt new file mode 100644 index 00000000..b6b5d7d9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images243.txt @@ -0,0 +1 @@ +0 0.558114 0.500000 0.679825 0.634235 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images244.txt b/computed-vision/cars_detector/data/labels/validate/images244.txt new file mode 100644 index 00000000..1aeb620c --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images244.txt @@ -0,0 +1 @@ +0 0.504680 0.494215 0.917300 0.856198 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images245.txt b/computed-vision/cars_detector/data/labels/validate/images245.txt new file mode 100644 index 00000000..24f85265 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images245.txt @@ -0,0 +1 @@ +0 0.514254 0.494518 0.831140 0.903509 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images246.txt b/computed-vision/cars_detector/data/labels/validate/images246.txt new file mode 100644 index 00000000..c25c2def --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images246.txt @@ -0,0 +1 @@ +0 0.555373 0.514685 0.731360 0.724467 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images247.txt b/computed-vision/cars_detector/data/labels/validate/images247.txt new file mode 100644 index 00000000..e5be5c12 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images247.txt @@ -0,0 +1 @@ +0 0.803728 0.457039 0.392544 0.782633 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images249.txt b/computed-vision/cars_detector/data/labels/validate/images249.txt new file mode 100644 index 00000000..974eb207 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images249.txt @@ -0,0 +1 @@ +0 0.476974 0.571230 0.793860 0.647896 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images250.txt b/computed-vision/cars_detector/data/labels/validate/images250.txt new file mode 100644 index 00000000..8b278e70 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images250.txt @@ -0,0 +1 @@ +0 0.510965 0.495525 0.923246 0.900897 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images251.txt b/computed-vision/cars_detector/data/labels/validate/images251.txt new file mode 100644 index 00000000..eb7eccf1 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images251.txt @@ -0,0 +1 @@ +0 0.505690 0.257025 0.666860 0.256198 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images252.txt b/computed-vision/cars_detector/data/labels/validate/images252.txt new file mode 100644 index 00000000..24ff0b25 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images252.txt @@ -0,0 +1,3 @@ +0 0.501476 0.180165 0.923849 0.247934 +0 0.497048 0.515702 0.920897 0.231405 +0 0.494097 0.834711 0.938607 0.317355 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images253.txt b/computed-vision/cars_detector/data/labels/validate/images253.txt new file mode 100644 index 00000000..c515af67 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images253.txt @@ -0,0 +1 @@ +0 0.495066 0.544629 0.689693 0.575967 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images254.txt b/computed-vision/cars_detector/data/labels/validate/images254.txt new file mode 100644 index 00000000..094ec2ab --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images254.txt @@ -0,0 +1 @@ +0 0.441704 0.604959 0.574161 0.373554 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images255.txt b/computed-vision/cars_detector/data/labels/validate/images255.txt new file mode 100644 index 00000000..ffb2bab6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images255.txt @@ -0,0 +1 @@ +0 0.498355 0.559720 0.915570 0.838033 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images256.txt b/computed-vision/cars_detector/data/labels/validate/images256.txt new file mode 100644 index 00000000..41f9af98 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images256.txt @@ -0,0 +1 @@ +0 0.675205 0.500000 0.649590 1.000000 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images257.txt b/computed-vision/cars_detector/data/labels/validate/images257.txt new file mode 100644 index 00000000..903334de --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images257.txt @@ -0,0 +1 @@ +0 0.483602 0.486777 0.843500 0.785124 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images258.txt b/computed-vision/cars_detector/data/labels/validate/images258.txt new file mode 100644 index 00000000..973c647d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images258.txt @@ -0,0 +1 @@ +0 0.426855 0.579339 0.665455 0.566942 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images259.txt b/computed-vision/cars_detector/data/labels/validate/images259.txt new file mode 100644 index 00000000..12a00d44 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images259.txt @@ -0,0 +1 @@ +0 0.512707 0.553719 0.737006 0.499174 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images260.txt b/computed-vision/cars_detector/data/labels/validate/images260.txt new file mode 100644 index 00000000..f379a000 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images260.txt @@ -0,0 +1 @@ +0 0.504934 0.505874 0.341009 0.283913 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images261.txt b/computed-vision/cars_detector/data/labels/validate/images261.txt new file mode 100644 index 00000000..13737116 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images261.txt @@ -0,0 +1 @@ +0 0.495667 0.524793 0.803510 0.586777 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images262.txt b/computed-vision/cars_detector/data/labels/validate/images262.txt new file mode 100644 index 00000000..ae0ff351 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images262.txt @@ -0,0 +1 @@ +0 0.375000 0.498331 0.478070 0.465605 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images263.txt b/computed-vision/cars_detector/data/labels/validate/images263.txt new file mode 100644 index 00000000..294c1535 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images263.txt @@ -0,0 +1 @@ +0 0.462239 0.490909 0.749035 0.446281 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images264.txt b/computed-vision/cars_detector/data/labels/validate/images264.txt new file mode 100644 index 00000000..f61d01c6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images264.txt @@ -0,0 +1 @@ +0 0.506942 0.604132 0.911736 0.319008 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images265.txt b/computed-vision/cars_detector/data/labels/validate/images265.txt new file mode 100644 index 00000000..ecbd59ee --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images265.txt @@ -0,0 +1 @@ +0 0.513706 0.597180 0.849781 0.662869 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images266.txt b/computed-vision/cars_detector/data/labels/validate/images266.txt new file mode 100644 index 00000000..ad9fac7d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images266.txt @@ -0,0 +1 @@ +0 0.499452 0.404057 0.687500 0.503211 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images267.txt b/computed-vision/cars_detector/data/labels/validate/images267.txt new file mode 100644 index 00000000..6360fac6 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images267.txt @@ -0,0 +1 @@ +0 0.495048 0.523967 0.987983 0.618182 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images268.txt b/computed-vision/cars_detector/data/labels/validate/images268.txt new file mode 100644 index 00000000..01067dc4 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images268.txt @@ -0,0 +1 @@ +0 0.498355 0.467594 0.933114 0.929713 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images269.txt b/computed-vision/cars_detector/data/labels/validate/images269.txt new file mode 100644 index 00000000..c0511ad8 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images269.txt @@ -0,0 +1 @@ +0 0.498355 0.465198 0.915570 0.814939 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images270.txt b/computed-vision/cars_detector/data/labels/validate/images270.txt new file mode 100644 index 00000000..21b62c21 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images270.txt @@ -0,0 +1 @@ +0 0.502193 0.437816 0.912281 0.664120 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images271.txt b/computed-vision/cars_detector/data/labels/validate/images271.txt new file mode 100644 index 00000000..429bb1e2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images271.txt @@ -0,0 +1 @@ +0 0.494518 0.492194 0.861842 0.478116 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images272.txt b/computed-vision/cars_detector/data/labels/validate/images272.txt new file mode 100644 index 00000000..23b6eb8a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images272.txt @@ -0,0 +1 @@ +0 0.496188 0.637190 0.911052 0.259504 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images273.txt b/computed-vision/cars_detector/data/labels/validate/images273.txt new file mode 100644 index 00000000..102d28d5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images273.txt @@ -0,0 +1 @@ +0 0.507428 0.495868 0.896366 0.638017 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images274.txt b/computed-vision/cars_detector/data/labels/validate/images274.txt new file mode 100644 index 00000000..2e8eb07e --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images274.txt @@ -0,0 +1 @@ +0 0.451067 0.319008 0.671412 0.234711 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images275.txt b/computed-vision/cars_detector/data/labels/validate/images275.txt new file mode 100644 index 00000000..6c03d6d1 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images275.txt @@ -0,0 +1 @@ +0 0.427632 0.500000 0.625000 0.812850 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images276.txt b/computed-vision/cars_detector/data/labels/validate/images276.txt new file mode 100644 index 00000000..f896d0c7 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images276.txt @@ -0,0 +1 @@ +0 0.505658 0.460331 0.864820 0.378512 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images277.txt b/computed-vision/cars_detector/data/labels/validate/images277.txt new file mode 100644 index 00000000..1a394c78 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images277.txt @@ -0,0 +1 @@ +0 0.508772 0.656250 0.982456 0.687135 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images278.txt b/computed-vision/cars_detector/data/labels/validate/images278.txt new file mode 100644 index 00000000..6a8abfa9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images278.txt @@ -0,0 +1 @@ +0 0.502193 0.505854 0.662281 0.880123 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/images279.txt b/computed-vision/cars_detector/data/labels/validate/images279.txt new file mode 100644 index 00000000..02ebeb10 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/images279.txt @@ -0,0 +1 @@ +0 0.465902 0.395041 0.827144 0.578512 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/ioniq5n.txt b/computed-vision/cars_detector/data/labels/validate/ioniq5n.txt new file mode 100644 index 00000000..de1287d3 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/ioniq5n.txt @@ -0,0 +1 @@ +0 0.491228 0.501949 0.633772 0.715360 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/large-51532-2023elantra.txt b/computed-vision/cars_detector/data/labels/validate/large-51532-2023elantra.txt new file mode 100644 index 00000000..051d5122 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/large-51532-2023elantra.txt @@ -0,0 +1 @@ +0 0.487879 0.611570 0.718457 0.499174 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/lucid-air-slide-1-desktop.txt b/computed-vision/cars_detector/data/labels/validate/lucid-air-slide-1-desktop.txt new file mode 100644 index 00000000..14cd496d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/lucid-air-slide-1-desktop.txt @@ -0,0 +1 @@ +0 0.509868 0.407018 0.513158 0.366667 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/lucid-air-stealth-slide-2-desktop.txt b/computed-vision/cars_detector/data/labels/validate/lucid-air-stealth-slide-2-desktop.txt new file mode 100644 index 00000000..974787b9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/lucid-air-stealth-slide-2-desktop.txt @@ -0,0 +1 @@ +0 0.496162 0.471930 0.549342 0.507018 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/mini-cooper-auto-model-vehicle.txt b/computed-vision/cars_detector/data/labels/validate/mini-cooper-auto-model-vehicle.txt new file mode 100644 index 00000000..1412f150 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/mini-cooper-auto-model-vehicle.txt @@ -0,0 +1 @@ +0 0.654057 0.678648 0.654605 0.474000 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/modern-sports-car-speeds-through-dark-curve-generative-ai_188544-9136.txt b/computed-vision/cars_detector/data/labels/validate/modern-sports-car-speeds-through-dark-curve-generative-ai_188544-9136.txt new file mode 100644 index 00000000..a8738c1f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/modern-sports-car-speeds-through-dark-curve-generative-ai_188544-9136.txt @@ -0,0 +1 @@ +0 0.473136 0.533553 0.805921 0.552191 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/most-expensive-cars-in-the-world.txt b/computed-vision/cars_detector/data/labels/validate/most-expensive-cars-in-the-world.txt new file mode 100644 index 00000000..e1d0a0d9 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/most-expensive-cars-in-the-world.txt @@ -0,0 +1 @@ +0 0.498355 0.623782 0.843202 0.522417 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/muscle-car-azul-negro-matricula-que-dice-trans-frente_1340-23399.txt b/computed-vision/cars_detector/data/labels/validate/muscle-car-azul-negro-matricula-que-dice-trans-frente_1340-23399.txt new file mode 100644 index 00000000..57846889 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/muscle-car-azul-negro-matricula-que-dice-trans-frente_1340-23399.txt @@ -0,0 +1 @@ +0 0.493394 0.551240 0.827988 0.603306 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/my24-dodge-bhp-hero-02-desktop-v2.txt b/computed-vision/cars_detector/data/labels/validate/my24-dodge-bhp-hero-02-desktop-v2.txt new file mode 100644 index 00000000..0afff0e5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/my24-dodge-bhp-hero-02-desktop-v2.txt @@ -0,0 +1 @@ +0 0.714912 0.522291 0.528509 0.626625 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/my24-xc40-recharge-single.txt b/computed-vision/cars_detector/data/labels/validate/my24-xc40-recharge-single.txt new file mode 100644 index 00000000..e909e283 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/my24-xc40-recharge-single.txt @@ -0,0 +1 @@ +0 0.501240 0.537190 0.992228 0.519008 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/pexels-photo-170811.txt b/computed-vision/cars_detector/data/labels/validate/pexels-photo-170811.txt new file mode 100644 index 00000000..92e5e0d2 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/pexels-photo-170811.txt @@ -0,0 +1 @@ +0 0.502741 0.504879 0.884868 0.827409 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/pexels-photo-210019.txt b/computed-vision/cars_detector/data/labels/validate/pexels-photo-210019.txt new file mode 100644 index 00000000..ec5b254a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/pexels-photo-210019.txt @@ -0,0 +1 @@ +0 0.549031 0.540496 0.684225 0.704132 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/pexels-photo-3729464.txt b/computed-vision/cars_detector/data/labels/validate/pexels-photo-3729464.txt new file mode 100644 index 00000000..7b9c8d97 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/pexels-photo-3729464.txt @@ -0,0 +1 @@ +0 0.510453 0.635537 0.916560 0.609917 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/pexels-photo-733745.txt b/computed-vision/cars_detector/data/labels/validate/pexels-photo-733745.txt new file mode 100644 index 00000000..eda0af6b --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/pexels-photo-733745.txt @@ -0,0 +1 @@ +0 0.446556 0.695041 0.457300 0.335537 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/red-car-260nw-197514563.txt b/computed-vision/cars_detector/data/labels/validate/red-car-260nw-197514563.txt new file mode 100644 index 00000000..368db149 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/red-car-260nw-197514563.txt @@ -0,0 +1 @@ +0 0.483084 0.387603 0.883669 0.570248 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/revuelto_m.txt b/computed-vision/cars_detector/data/labels/validate/revuelto_m.txt new file mode 100644 index 00000000..e9c898a5 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/revuelto_m.txt @@ -0,0 +1 @@ +0 0.558114 0.621382 0.769737 0.639474 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/rimac-nevera-worth-2-1-mn-is-worlds-fastest-electric-car-with-256mph-top-speed.txt b/computed-vision/cars_detector/data/labels/validate/rimac-nevera-worth-2-1-mn-is-worlds-fastest-electric-car-with-256mph-top-speed.txt new file mode 100644 index 00000000..78a3c54f --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/rimac-nevera-worth-2-1-mn-is-worlds-fastest-electric-car-with-256mph-top-speed.txt @@ -0,0 +1 @@ +0 0.478512 0.560331 0.634711 0.294215 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/rimac-nevera.txt b/computed-vision/cars_detector/data/labels/validate/rimac-nevera.txt new file mode 100644 index 00000000..1ab2bf99 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/rimac-nevera.txt @@ -0,0 +1 @@ +0 0.496711 0.576998 0.835526 0.631579 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/rolls_royce_phantom_top_10.txt b/computed-vision/cars_detector/data/labels/validate/rolls_royce_phantom_top_10.txt new file mode 100644 index 00000000..1c0a8afb --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/rolls_royce_phantom_top_10.txt @@ -0,0 +1 @@ +0 0.483553 0.463573 0.853070 0.720262 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/scorpio-n-exterior-right-front-three-quarter-75.txt b/computed-vision/cars_detector/data/labels/validate/scorpio-n-exterior-right-front-three-quarter-75.txt new file mode 100644 index 00000000..b95a6df1 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/scorpio-n-exterior-right-front-three-quarter-75.txt @@ -0,0 +1 @@ +0 0.515899 0.498050 0.698465 0.770443 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/sedan-car-concept-illustration_114360-13223.txt b/computed-vision/cars_detector/data/labels/validate/sedan-car-concept-illustration_114360-13223.txt new file mode 100644 index 00000000..cb2d2a38 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/sedan-car-concept-illustration_114360-13223.txt @@ -0,0 +1 @@ +0 0.485686 0.635537 0.924881 0.467769 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/should_i_buy_an_electric_car.txt b/computed-vision/cars_detector/data/labels/validate/should_i_buy_an_electric_car.txt new file mode 100644 index 00000000..be214c3d --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/should_i_buy_an_electric_car.txt @@ -0,0 +1 @@ +0 0.485675 0.552893 0.630303 0.480992 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/splashpage.txt b/computed-vision/cars_detector/data/labels/validate/splashpage.txt new file mode 100644 index 00000000..000fb106 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/splashpage.txt @@ -0,0 +1 @@ +0 0.541322 0.485950 0.604959 0.304132 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/splashpage3.txt b/computed-vision/cars_detector/data/labels/validate/splashpage3.txt new file mode 100644 index 00000000..95bc8a9a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/splashpage3.txt @@ -0,0 +1 @@ +0 0.557851 0.490083 0.641322 0.305785 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/sports-car-7881150_1280.txt b/computed-vision/cars_detector/data/labels/validate/sports-car-7881150_1280.txt new file mode 100644 index 00000000..24580353 --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/sports-car-7881150_1280.txt @@ -0,0 +1 @@ +0 0.500548 0.496101 0.882675 0.625731 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/stock-photo-red-car-197514563.txt b/computed-vision/cars_detector/data/labels/validate/stock-photo-red-car-197514563.txt new file mode 100644 index 00000000..1bbfb0bf --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/stock-photo-red-car-197514563.txt @@ -0,0 +1 @@ +0 0.493851 0.398347 0.878590 0.515702 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/toyota-mirai-at-fueling-station-1664139139.txt b/computed-vision/cars_detector/data/labels/validate/toyota-mirai-at-fueling-station-1664139139.txt new file mode 100644 index 00000000..a7480a3a --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/toyota-mirai-at-fueling-station-1664139139.txt @@ -0,0 +1 @@ +0 0.504934 0.647434 0.608553 0.632737 \ No newline at end of file diff --git a/computed-vision/cars_detector/data/labels/validate/untitled-9.txt b/computed-vision/cars_detector/data/labels/validate/untitled-9.txt new file mode 100644 index 00000000..54c48cbe --- /dev/null +++ b/computed-vision/cars_detector/data/labels/validate/untitled-9.txt @@ -0,0 +1 @@ +0 0.503289 0.531189 0.975877 0.563353 \ No newline at end of file diff --git a/computed-vision/football/__init__.py b/computed-vision/football/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/computed-vision/football/main.py b/computed-vision/football/main.py new file mode 100644 index 00000000..fe35aa43 --- /dev/null +++ b/computed-vision/football/main.py @@ -0,0 +1,84 @@ +import cv2 +import numpy as np +import tensorflow as tf + +# Load pre-trained object detection model (for example, using TensorFlow Object Detection API) +# Replace this with the path to your pre-trained model +model_path = 'path_to_your_pretrained_model/frozen_inference_graph.pb' +detection_graph = tf.Graph() +with detection_graph.as_default(): + od_graph_def = tf.compat.v1.GraphDef() + with tf.compat.v2.io.gfile.GFile(model_path, 'rb') as fid: + serialized_graph = fid.read() + od_graph_def.ParseFromString(serialized_graph) + tf.import_graph_def(od_graph_def, name='') + +# Define the labels for detected objects (e.g., 'person', 'ball') +# Replace this with your specific labels +labels = {1: 'person', 2: 'ball'} + + +# Function to perform object detection on a single frame +def detect_objects(image_np, sess, detection_graph): + # Expand dimensions since the model expects images to have shape: [1, None, None, 3] + image_np_expanded = np.expand_dims(image_np, axis=0) + image_tensor = detection_graph.get_tensor_by_name('image_tensor:0') + # Each box represents a part of the image where a particular object was detected + boxes = detection_graph.get_tensor_by_name('detection_boxes:0') + # Each score represents the level of confidence for each of the objects + # Score is shown on the result image, together with the class label + scores = detection_graph.get_tensor_by_name('detection_scores:0') + classes = detection_graph.get_tensor_by_name('detection_classes:0') + num_detections = detection_graph.get_tensor_by_name('num_detections:0') + + # Actual detection + (boxes, scores, classes, num_detections) = sess.run( + [boxes, scores, classes, num_detections], + feed_dict={image_tensor: image_np_expanded}) + + # Visualization of the results of a detection + # Draw bounding boxes and labels on the original image + for i in range(int(num_detections[0])): + class_id = int(classes[0][i]) + if class_id in labels: + label = labels[class_id] + score = float(scores[0][i]) + if score > 0.5: # Adjust this threshold as needed + box = boxes[0][i] + ymin, xmin, ymax, xmax = box + im_height, im_width, _ = image_np.shape + (left, right, top, bottom) = (xmin * im_width, xmax * im_width, + ymin * im_height, ymax * im_height) + # Draw bounding box + cv2.rectangle(image_np, (int(left), int(top)), (int(right), int(bottom)), (0, 255, 0), 2) + # Add label and confidence score + cv2.putText(image_np, '{}: {:.2f}'.format(label, score), + (int(left), int(top - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) + + return image_np + + +# Function to process a video +def process_video(video_path): + with detection_graph.as_default(): + with tf.compat.v1.Session(graph=detection_graph) as sess: + # Open video file + cap = cv2.VideoCapture(video_path) + while cap.isOpened(): + ret, image_np = cap.read() + if not ret: + break + # Perform object detection on each frame + processed_image = detect_objects(image_np, sess, detection_graph) + # Display the resulting frame + cv2.imshow('Object Detection', processed_image) + if cv2.waitKey(1) & 0xFF == ord('q'): + break + # Release video capture object + cap.release() + cv2.destroyAllWindows() + + +# Example usage: Process a football video +video_path = 'path_to_your_football_video.mp4' +process_video(video_path) diff --git a/computed-vision/requirements.txt b/computed-vision/requirements.txt new file mode 100644 index 00000000..9741ed9b --- /dev/null +++ b/computed-vision/requirements.txt @@ -0,0 +1,3 @@ +opencv-python==4.8.1.78 +numpy +tensorflow==2.16.1 \ No newline at end of file diff --git a/corey_schafer/py_tutorials/README.md b/corey_schafer/py_tutorials/README.md new file mode 100644 index 00000000..45800675 --- /dev/null +++ b/corey_schafer/py_tutorials/README.md @@ -0,0 +1,166 @@ +## [Youtube Playlist - Python Tutorials](https://www.youtube.com/playlist?list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU) + +### [Python Tutorial for Beginners 9: Import Modules and Exploring The Standard Library](https://youtu.be/jGu9vvEUk5k) +- Importación de módulos en python + - Estructura + ```py + cap_09/ + my_module.py + intro.py + ``` +- Formas de importar un módulo +- `import my_module` + - Se importaría todo y habria que instanciar su contenido con `my_module.` +- `from my_module import ` +```py +# intro.py +print("intro.py") +# import my_module +from my_module import find_index, test + +courses = ["History","Math", "Physics", "CompSci"] + +search = "Math" +# index = my_module.find_index(courses,search) +index = find_index(courses,search) +print(f"Indes of {search} is: {index}, test var: {test}") + +$ py intro.py +intro.py +my_module.py +Indes of Math is: 1, test var: Test String +``` +- **Como indicarle a Python donde está el módulo?** [6:27](https://youtu.be/CqvZ3vGoGs0?list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU&t=380) + - Cuando se importa python comprueba multiples lugares + - Hay una lista que se llama **sys.path** + ```py + # test_sys.py + print("test_sys.py") + + import sys + print(sys.path) + + # resultado: + [ + 'E:\\projects\\prj_python37\\corey_schafer\\py_tutorials\\cap_09', + 'E:\\programas\\python\\anaconda3\\python37.zip', + 'E:\\programas\\python\\anaconda3\\DLLs', + 'E:\\programas\\python\\anaconda3\\lib', + 'E:\\programas\\python\\anaconda3', + 'C:\\Users\\\\AppData\\Roaming\\Python\\Python37\\site-packages', + 'E:\\programas\\python\\anaconda3\\lib\\site-packages', + 'E:\\programas\\python\\anaconda3\\lib\\site-packages\\win32', + 'E:\\programas\\python\\anaconda3\\lib\\site-packages\\win32\\lib', + 'E:\\programas\\python\\anaconda3\\lib\\site-packages\\Pythonwin' + ] + ``` + - Que pasaria si muevo mi módulo a una ruta que no está en **sys.path** + - Tendriamos que agregar a la lista anterior la ruta donde se encuentra + ```py + # agregando ruta a includepath :) + import sys + sys.append("") + ``` + - Si bien funciona ahora la importación, no es la mejor solución + - Que pasaría si deseamos hacer estas rutas compatibles entre windows y mac? + - Tendriamos que definir una variable de entorno: **PYTHONPATH** [10:20](https://youtu.be/CqvZ3vGoGs0?list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU) + - *imprimir variables de entorno: win:SET, unix: env* + ```s + # file: /Users//.bash_profile + # mac + export PYTHONPATH="/Users//desktop/my-modules" + ``` + - ![](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/910x446/9c1e79c745f968bef240c20278126df0/image.png) + - Despues de guardar reiniciamos el terminal. + - En windows: + - ![](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/840x485/c2c8df61f64c113ba5744adae75764bf/image.png) + - `setx PYTHONPATH "" /M` *No lo he probado, /M usa la ruta de usuario* + - [Más info en stackoverflow](https://stackoverflow.com/questions/9546324/adding-directory-to-path-environment-variable-in-windows) +- Comprobando rutas +```py +# intro.py +print("intro.py") +import os +courses = ["History","Math", "Physics", "CompSci"] + +print(os.getcwd()) # E:\projects\prj_python37\corey_schafer\py_tutorials\cap_09 +print(os.__file__) # E:\programas\python\anaconda3\lib\os.py +``` +- **pruebas** +```s +cap_09 +│ __init__.py +│ +├───pkgmain +│ intro.py +│ my_module.py +│ __init__.py +│ +└───pkgtest + generic.py + __init__.py +``` +- He intentado hacer el import entre hermanos, es decir importar generic en intro.py pero no existe esa visibilidad por defecto. Con el hack funciona pero hay una mejor solución que es usar [**setup.py**](https://stackoverflow.com/questions/6323860/sibling-package-imports) +```py +# intro.py +print("pkgmain/intro.py") +# import os + +# courses = ["History","Math", "Physics", "CompSci"] + +# print(os.getcwd()) # E:\projects\prj_python37\corey_schafer\py_tutorials\cap_09 +# print(os.__file__) # E:\programas\python\anaconda3\lib\os.py + +# from modtest.generic import argskwargs,syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 10, in + from modtest.generic import argskwargs,syspath +ModuleNotFoundError: No module named 'modtest' +''' +# from generic import argskwargs,syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 19, in + from generic import argskwargs,syspath +ModuleNotFoundError: No module named 'generic' +''' +# from pkgtest.generic import argskwargs,syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 28, in + from pkgtest.generic import argskwargs,syspath +ModuleNotFoundError: No module named 'pkgtest' +''' +# from ..pkgtest.generic import syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 37, in + from ..pkgtest.generic import syspath +ValueError: attempted relative import beyond top-level package +''' + +# Esto es un hack, la solución ortodoxa es trabajar con setup.py +# eso se describe aqui: https://stackoverflow.com/questions/6323860/sibling-package-imports +import sys, os +sys.path.insert(0, os.path.abspath('..')) + +from pkgtest.generic import syspath +``` +- En pantalla +```s +..._09/pkgmain (master) +$ py intro.py +pkgmain/intro.py +pkgtest.__init__.py +pkgtest.generic.py + +``` \ No newline at end of file diff --git a/corey_schafer/py_tutorials/cap_09/__init__.py b/corey_schafer/py_tutorials/cap_09/__init__.py new file mode 100644 index 00000000..e8b6badd --- /dev/null +++ b/corey_schafer/py_tutorials/cap_09/__init__.py @@ -0,0 +1,5 @@ +# cap_09.__init__.py + +# no entra por aqui +print("cap_09.__init__.py") +# import sys; sys.path.append(".") \ No newline at end of file diff --git a/corey_schafer/py_tutorials/cap_09/pkgmain/__init__.py b/corey_schafer/py_tutorials/cap_09/pkgmain/__init__.py new file mode 100644 index 00000000..794bb6c7 --- /dev/null +++ b/corey_schafer/py_tutorials/cap_09/pkgmain/__init__.py @@ -0,0 +1,7 @@ +# pkgmain.__init__.py + +# no tira!!! +# print("pkgmain.__init__.py") +# import sys, os +# sys.path.insert(0, os.path.abspath('..')) + diff --git a/corey_schafer/py_tutorials/cap_09/pkgmain/intro.py b/corey_schafer/py_tutorials/cap_09/pkgmain/intro.py new file mode 100644 index 00000000..ae3ce9da --- /dev/null +++ b/corey_schafer/py_tutorials/cap_09/pkgmain/intro.py @@ -0,0 +1,52 @@ +# intro.py +print("pkgmain/intro.py") +# import os + +# courses = ["History","Math", "Physics", "CompSci"] + +# print(os.getcwd()) # E:\projects\prj_python37\corey_schafer\py_tutorials\cap_09 +# print(os.__file__) # E:\programas\python\anaconda3\lib\os.py + +# from modtest.generic import argskwargs,syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 10, in + from modtest.generic import argskwargs,syspath +ModuleNotFoundError: No module named 'modtest' +''' +# from generic import argskwargs,syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 19, in + from generic import argskwargs,syspath +ModuleNotFoundError: No module named 'generic' +''' +# from pkgtest.generic import argskwargs,syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 28, in + from pkgtest.generic import argskwargs,syspath +ModuleNotFoundError: No module named 'pkgtest' +''' +# from ..pkgtest.generic import syspath +''' +$ py intro.py +pkgmain/intro.py +Traceback (most recent call last): + File "intro.py", line 37, in + from ..pkgtest.generic import syspath +ValueError: attempted relative import beyond top-level package +''' + +# Esto es un hack, la solución ortodoxa es trabajar con setup.py +# eso se describe aqui: https://stackoverflow.com/questions/6323860/sibling-package-imports +import sys, os +sys.path.insert(0, os.path.abspath('..')) + +from pkgtest.generic import syspath \ No newline at end of file diff --git a/corey_schafer/py_tutorials/cap_09/pkgmain/my_module.py b/corey_schafer/py_tutorials/cap_09/pkgmain/my_module.py new file mode 100644 index 00000000..e9e48b70 --- /dev/null +++ b/corey_schafer/py_tutorials/cap_09/pkgmain/my_module.py @@ -0,0 +1,12 @@ +# my_module.py +print("modmain/my_module.py") + +test = "Test String" + +def find_index(to_search, target): + '''find the index of a value in a sequence''' + for i, value in enumerate(to_search): + if value == target: + return i + + return -1 \ No newline at end of file diff --git a/corey_schafer/py_tutorials/cap_09/pkgtest/__init__.py b/corey_schafer/py_tutorials/cap_09/pkgtest/__init__.py new file mode 100644 index 00000000..15a47eba --- /dev/null +++ b/corey_schafer/py_tutorials/cap_09/pkgtest/__init__.py @@ -0,0 +1,6 @@ +# pkgtest.__init__.py + +# no tira!! +print("pkgtest.__init__.py") +# import sys, os +# sys.path.insert(0, os.path.abspath('..')) \ No newline at end of file diff --git a/corey_schafer/py_tutorials/cap_09/pkgtest/generic.py b/corey_schafer/py_tutorials/cap_09/pkgtest/generic.py new file mode 100644 index 00000000..f548e60e --- /dev/null +++ b/corey_schafer/py_tutorials/cap_09/pkgtest/generic.py @@ -0,0 +1,14 @@ +# generic.py +print("pkgtest.generic.py") + +import sys +from pprint import pprint + +def argskwargs(*args,**kwargs): + print("args:\n") + print(args) + print("kwargs:\n") + print(kwargs) + +def syspath(): + print(sys.path) \ No newline at end of file diff --git a/cubes/README.md b/cubes/README.md new file mode 100644 index 00000000..1f39f4fb --- /dev/null +++ b/cubes/README.md @@ -0,0 +1,5 @@ +# Servicios en Python + + + + diff --git a/cubes/cubes/__init__.py b/cubes/cubes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/etl_template/data/source.txt b/etl_template/data/source.txt new file mode 100644 index 00000000..67d21357 --- /dev/null +++ b/etl_template/data/source.txt @@ -0,0 +1,9 @@ +id;value +01;aaaa +02;bbbb +03;cccc +04;dddd +10;eeee +11;ffff +20;gggg +21;hhhh diff --git a/etl_template/data/target.json b/etl_template/data/target.json new file mode 100644 index 00000000..c37473cd --- /dev/null +++ b/etl_template/data/target.json @@ -0,0 +1,42 @@ +[ + { + "id": "id", + "value": "value" + }, + { + "id": "01", + "value": "aaaa" + }, + { + "id": "02", + "value": "bbbb" + }, + { + "id": "03", + "value": "cccc" + }, + { + "id": "04", + "value": "dddd" + }, + { + "id": "10", + "value": "eeee" + }, + { + "id": "11", + "value": "ffff" + }, + { + "id": "20", + "value": "gggg" + }, + { + "id": "21", + "value": "hhhh" + }, + { + "id": "", + "value": "" + } +] \ No newline at end of file diff --git a/etl_template/etl.py b/etl_template/etl.py new file mode 100644 index 00000000..ae5787d6 --- /dev/null +++ b/etl_template/etl.py @@ -0,0 +1,79 @@ +from os.path import exists, realpath +from os import unlink +import json +from pprint import pprint + +# un archivo CSV cuyo separador es ; +PATH_SOURCE_FILE = "./data/source.txt" +# archivo destino +PATH_TARGET_FILE = "./data/target.json" + + +def get_file_content(path: str) -> str: + if not exists(path): + return "" + with open(path) as f: + return f.read() + + +def file_put_contents(path: str, data: str) -> None: + with open(path, "a") as f: + f.write(data) + + +def extract(path: str) -> str: + content = get_file_content(path) + if not content: + return "" + content = content.strip(" ") + pprint(content) + return content + + +def load(data: str, path: str) -> None: + if exists(path): + unlink(path) + print(data) + file_put_contents(path, data) + + +def handle_exception(ex: Exception) -> None: + print("ERROR:") + if hasattr(ex, "message"): + print(ex.message) + else: + print(repr(ex)) + + +def transform(data: str) -> str: + if not data: + return "" + + lines = data.split("\n") + pprint(lines) + content = [] + for line in lines: + values = line.split(";") + content.append({ + "id": values[0] if 0 < len(values) else "", + "value": values[1] if 1 < len(values) else "" + }) + return json.dumps(content, sort_keys=True, indent=2) + + +def main(): + print("process start") + try: + print("- Extracting (1/3)...\n") + data = extract(PATH_SOURCE_FILE) + print("\n- Transforming (2/3)...\n") + data = transform(data) + print("\n- Loading (3/3)...\n") + load(data, PATH_TARGET_FILE) + target_path = realpath(PATH_TARGET_FILE) + print(f"\nETL finished!\nrun command:\n\ncat {target_path}\n") + except Exception as ex: + handle_exception(ex) + + +main() diff --git a/img_code_reader/__init__.py b/img_code_reader/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/img_code_reader/bar_code_reader.py b/img_code_reader/bar_code_reader.py new file mode 100644 index 00000000..265d1e69 --- /dev/null +++ b/img_code_reader/bar_code_reader.py @@ -0,0 +1,83 @@ +# https://www.computalabel.com/aboutpharmacodes.htm +# https://stackoverflow.com/questions/51164713/how-to-get-pixel-coordinates-if-i-know-colorrgb +# https://pharmaguddu.com/pharmacode-calculate-pharmacode-value/ +import sys + +import cv2 +import os +from pyzbar.pyzbar import decode + +path_img = os.getenv("HOME") +path_img = f"{path_img}/Downloads/laetus-bar-code/laetus-324.jpg" + +lines = [] + + +def get_reverse(): + width = lines[0] + if width != "small": + return lines + return lines.reverse() + + +def get_value(width, position): + small = position + 1 + if width == "small": + return small + return small * 2 + + +def get_sum(): + total = 0 + lines = get_reverse() + for idx, line in enumerate(lines): + width = lines[idx] + total += get_value(width, idx) + return total + + +# Make one method to decode the barcode +def BarcodeReader(image): + # read the image in numpy array using cv2 + + imgs = cv2.imread(image) + for ar1 in imgs: + for ar2 in ar1: + print(ar2[0]) + # print(imgs) + sys.exit() + # Decode the barcode image + detectedBarcodes = decode(img) + + # If not detected then print the message + if not detectedBarcodes: + print("Barcode Not Detected or your barcode is blank/corrupted!") + else: + + # Traverse through all the detected barcodes in image + for barcode in detectedBarcodes: + + # Locate the barcode position in image + (x, y, w, h) = barcode.rect + + # Put the rectangle in image using + # cv2 to highlight the barcode + cv2.rectangle(img, (x - 10, y - 10), + (x + w + 10, y + h + 10), + (255, 0, 0), 2) + + if barcode.data != "": + # Print the barcode data + print(barcode.data) + print(barcode.type) + + # Display the image + cv2.imshow("Image", img) + cv2.waitKey(0) + cv2.destroyAllWindows() + + +if __name__ == "__main__": + # Take the image from user + image = path_img + BarcodeReader(image) diff --git a/img_code_reader/readme.md b/img_code_reader/readme.md new file mode 100644 index 00000000..2f382a11 --- /dev/null +++ b/img_code_reader/readme.md @@ -0,0 +1 @@ +brew install zbar \ No newline at end of file diff --git a/img_code_reader/requirements.txt b/img_code_reader/requirements.txt new file mode 100644 index 00000000..ccdc5b48 --- /dev/null +++ b/img_code_reader/requirements.txt @@ -0,0 +1,2 @@ +opencv-python +pyzbar diff --git a/integrator/.gitignore b/integrator/.gitignore new file mode 100644 index 00000000..3bc012c7 --- /dev/null +++ b/integrator/.gitignore @@ -0,0 +1,5 @@ +/mysql/credentials.json +/integrator.egg-info +/config/* +!/config/contexts +!/config/mapping \ No newline at end of file diff --git a/integrator/Pipfile b/integrator/Pipfile new file mode 100644 index 00000000..97624513 --- /dev/null +++ b/integrator/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +integrator = {editable = true,path = "."} + +[requires] +python_version = "3.8" diff --git a/integrator/Pipfile.lock b/integrator/Pipfile.lock new file mode 100644 index 00000000..85bb437c --- /dev/null +++ b/integrator/Pipfile.lock @@ -0,0 +1,25 @@ +{ + "_meta": { + "hash": { + "sha256": "3e396251969509c2556a40be7e0e17f3d036f045a235d2e1b3a211dbba83db9b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "integrator": { + "editable": true, + "path": "." + } + }, + "develop": {} +} diff --git a/integrator/README.md b/integrator/README.md new file mode 100644 index 00000000..2681caab --- /dev/null +++ b/integrator/README.md @@ -0,0 +1,100 @@ +### to-do +- debo probar si puedo mover datos entre dos bases de datos en un mismo servidor sin necesidad de pasar por el integrador. + - Algo así: + ```sql + insert into db1.table_a (f1,f2,f3) + select fa as f1, fb as f2, fc as f3 + from db2.table_o + where fa>10 + ``` +- en el mapper hay que formar una condición concreta dentro de un obj json debería haber una propiedad de consulta libre. + - Ejemplo: + ```json + "source":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_tinymarket" + }, + "table":"imp_product", + "sql": "SELECT fa as f1, count(fb) as f2 FROM table_orig WHERE 1 AND GROUP BY fa" + } + ``` + - La consulta anterior acabaría dentro de una subquery tipo `SELECT * FROM (sql) as imp_product` +### Integraciones +- Mysql - Googlesheets + - [documentacion](https://developers.google.com/sheets/api/quickstart/python) +- Instalación mysql + - `python -m pip install mysql-connector` +- Instalación paquetes google sheets + ``` + pip install gspread + pip install oauth2client + ``` +- para conseguir la visualizacion entre módulos lo he hecho con: + - `pipenv install -e .` modo edicion + - https://realpython.com/pipenv-guide/ + - Esto tampoco soluciona importación entre hermanos :S ya no se que hacer ^^ + - En etls no puedo importar goggleserv +- Para obtener las credenciales hay que hacerlo desde la consola de google +- Se crea un proyecto +- Se habilitan los servicios +- Se genera la credencial del tipo: **Cuentas de servicio** +- Con la cuenta creada, al compartir la hoja de cálculo se ingresa la misma. + - será del tipo: `@.iam.gserviceaccount.com"` +- estos datos se descargan en un fichero ".json" que es el que se usa en python para la conexión + +### La aplicacion: +- consta de entradas que son los archivos de configuración: + - **config/contexts, credentials y mapping** el principal es **mapping** + - **mapping** + - Es un fichero con una lista de movimientos `(origen -> destino)` + - En estos archivos se configuran los distintos movimientos. El origen, el destino y el mapeo de campos. + - Tanto origen como destino pueden tener varios tipos: + - database, api, json, xml, csv, fixed, xls + - Por ahora se contempla la bd mysql + - El mapping es el dato de entrada que lleva configurado unos contextos + - Los **contextos** son repositorios de ubicaciones de fuentes o destinos de datos. Rutas de ficheros y/o configuraciones de acceso en caso de bases de datos y apis +- Una vez configurado un mapping p.e **mapping/elchalan.json** hay que crear una instancia de la clase Etl. +```py +# ejeacución py main.py + +# integrator/etls/elchalan.py +from core.etl import Etl + +# le indico que use el mappping: elchalan.json y que use la configuracion: transfer-products +etl1 = Etl("elchalan.json","transfer-products") +etl1.add_query("UPDATE imp_product SET description_full=NULL WHERE description_full='NULL'") +etl1.add_query("UPDATE imp_product SET description_full=NULL WHERE trim(description_full)=''") + +# transfer lanza la ejecución. Para este caso se moveran datos de un archivo products.json a una tabla imp_products +# posteriormente se aplicará las queries de UPDATE al estar los datos en imp_products +etl1.transfer() + +# despues que tenemos los datos en la tabla de importación hay que pasarlos a la tabla maestra +# le indicamos que use el mismo archivo y que ejecute el movimiento con id: transfer-imp-to-app +etl1 = Etl("elchalan.json","transfer-imp-to-app") +etl1.transfer() +``` +- **configuración** +- En config/contexts/mysql.json se agregan las bds origen y/o destino +- En config/mapping/ se crea un json de mapeo de campos origen y destino **eduardoaf.json** +- En etls se crea un namespace (carpeta) **eduardoaf** con su __init__.py + - En la carpeta anterior hay que crear un módulo eduardoaf.py (puede ser otro nombre) donde se llama a la clase core: **from core.etl import Etl** con el nombre de fichero del mapping.json y el id a ejecutar +- En main.py se importa **eduardoaf.py** `from etls.eduardoaf.eduardoaf import etl1` hay que comentar lo que no queremos que se ejecute +- lanzamos: **py main.py** + +#### **ERROR:** No se inserta en destino y no lanza ningún error +- Parece que esto tiene que ver con el driver. Como que ha cambiado porque ahora hay que ejecutar **commit()** para que se ejecuten las consultas. +- El test no va fino. Parece que el driver, que lleva implicito un socket hay que probarlo con un mock sino da error de socket. +- El campo **datetime.datetime(...)** no da error al hacer el insert. Pensaba que este podía ser el problema. +``` +ResourceWarning: unclosed + + + +fn_method(self, *args, **kwargs) +ResourceWarning: Enable tracemalloc to get the object allocation traceback +``` diff --git a/integrator/config/contexts/api.json b/integrator/config/contexts/api.json new file mode 100644 index 00000000..80d09c49 --- /dev/null +++ b/integrator/config/contexts/api.json @@ -0,0 +1,8 @@ +[ + { + "id":"api1", + "alias":"json.theframework.es products", + "description":"json.theframework.es products", + "path":"http://json.theframework.es/index.php?getfile=app_product.json" + } +] \ No newline at end of file diff --git a/integrator/config/contexts/files.json b/integrator/config/contexts/files.json new file mode 100644 index 00000000..ea6023f1 --- /dev/null +++ b/integrator/config/contexts/files.json @@ -0,0 +1,9 @@ +[ + { + "id":"json1", + "alias":"products json", + "description":"Archivo auxiliar para evitar llamar a la API de gdocs", + "type":"json", + "path":"%in%/products.json" + } + ] \ No newline at end of file diff --git a/integrator/config/contexts/folders.json b/integrator/config/contexts/folders.json new file mode 100644 index 00000000..b732d6ec --- /dev/null +++ b/integrator/config/contexts/folders.json @@ -0,0 +1,9 @@ +[ + { + "id":"ech-prod-pictures", + "alias":"elchalan products", + "description":"Products images", + "type":"folder", + "path":"/Users/ioedu/projects/prj_tinymarket/backend_web/public/pictures/products" + } +] \ No newline at end of file diff --git a/integrator/config/contexts/gsheets.json b/integrator/config/contexts/gsheets.json new file mode 100644 index 00000000..844ec3c1 --- /dev/null +++ b/integrator/config/contexts/gsheets.json @@ -0,0 +1,9 @@ +[ + { + "id":"temp-chalan", + "type": "google-sheets", + "spread_id": "temp_xls", + "worksheet_num": 0, + "credentials": "gsheets.json" + } +] \ No newline at end of file diff --git a/integrator/config/contexts/mysql.json b/integrator/config/contexts/mysql.json new file mode 100644 index 00000000..49cdd7b7 --- /dev/null +++ b/integrator/config/contexts/mysql.json @@ -0,0 +1,57 @@ +[ + { + "id":"mysql1", + "alias":"Docker mysql", + "description":"Docker mysql", + "type":"mysql", + "server":"127.0.0.1", + "port":"3306", + "schemas":[ + { + "database":"db_tinymarket", + "user":"root", + "password":"1234" + }, + { + "database":"db_two", + "user":"root", + "password":"1234" + }, + { + "database":"db_eduardoaf", + "user":"root", + "password":"1234" + }, + { + "database":"db_eduardoaf_old", + "user":"root", + "password":"1234" + }, + { + "database": "sf5-expenses-api_api", + "user":"root", + "password":"1234" + } + ] + }, + { + "id":"c2", + "alias":"Otro cont", + "description":"No dock mysql", + "type":"mysql", + "server":"127.0.0.1", + "port":"3350", + "schemas":[ + { + "database":"db_xxx", + "user":"root", + "password":"1234" + }, + { + "database":"db_yyy", + "user":"root", + "password":"1234" + } + ] + } +] \ No newline at end of file diff --git a/integrator/config/mapping/eduardoaf.json b/integrator/config/mapping/eduardoaf.json new file mode 100644 index 00000000..93d88e6d --- /dev/null +++ b/integrator/config/mapping/eduardoaf.json @@ -0,0 +1,40 @@ +[ + { + "id":"transfer-old-current", + "source":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_eduardoaf_old" + }, + "table":"wp_posts", + "conditions": [ + "post_type='post'","id!=1025" + ] + }, + "destiny":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_eduardoaf" + }, + "tables":[ + { + "name": "imp_post", + "fields":{ + "id":"code_erp", + "post_date":"publish_date", + "post_modified":"last_update", + "post_title":"title", + "post_content":"content", + "post_excerpt":"excerpt", + "post_status":"id_status", + "post_name":"slug" + } + } + ] + } + } +] \ No newline at end of file diff --git a/integrator/config/mapping/elchalan.json b/integrator/config/mapping/elchalan.json new file mode 100644 index 00000000..cf41e8f3 --- /dev/null +++ b/integrator/config/mapping/elchalan.json @@ -0,0 +1,142 @@ +[ + { + "id":"gsheet-to-imp-products", + + "source":{ + "format": "api", + "context":{ + "file": "gsheets.json", + "id": "temp-chalan" + } + }, + + "destiny":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_tinymarket" + }, + "tables":[ + { + "name": "imp_product", + "fields":{ + "syscode":"code", + "description1":"description", + "description2":"description_full", + "price1":"price", + "price2":"price2", + "display":"display" + } + } + ] + } + }, + + { + "id":"json-to-imp-products", + + "source":{ + "format": "json", + "context":{ + "file": "files.json", + "id": "json1" + } + }, + + "destiny":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_tinymarket" + }, + "tables":[ + { + "name": "imp_product", + "fields":{ + "syscode":"code", + "description1":"description", + "description2":"description_full", + "price1":"price", + "price2":"price2", + "display":"display" + } + } + ] + } + }, + + { + "id":"transfer-imp-to-app", + "source":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_tinymarket" + }, + "table":"imp_product", + "conditions": [ + "coalesce(error,'') != '1'" + ] + }, + "destiny":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_tinymarket" + }, + "tables":[ + { + "name": "app_product", + "fields":{ + "code":"code_erp", + "description":"description", + "description_full":"description_full", + "price":"price_sale", + "price2":"price_sale1", + "display":"display", + "url_image":"url_image" + }, + "constants":{ + "id_user":1, + "insert_user":"etl", + "update_user":"etl" + } + } + ] + } + }, + + { + "id":"products-pictures-to-db", + "source":{ + "format": "folder", + "context":{ + "file": "folders.json", + "id": "ech-prod-pictures" + } + }, + + "destiny":{ + "format": "database", + "context":{ + "file": "mysql.json", + "id": "mysql1", + "database": "db_tinymarket" + }, + "tables":[ + { + "name": "imp_product", + "fields":{ + "%code%.jpg|%code%.png":"url_image" + } + } + ] + } + + } + +] \ No newline at end of file diff --git a/integrator/core/__init__.py b/integrator/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/core.py b/integrator/core/core.py new file mode 100644 index 00000000..e1bb69e8 --- /dev/null +++ b/integrator/core/core.py @@ -0,0 +1,82 @@ +import sys + +def is_instring(search,string): + return string.find(search) != -1 + +def get_replace(tag,repl,string): + if(strstr(tag,strstr)): + return string.replace(tag,repl) + +def get_path(extra,path,tag): + newpath = path + if is_instring(tag, extra): + # print(f"is_string {tag}, {extra}") + newpath = extra.replace(tag, path) + else: + newpath = path +"/"+ extra + return newpath + +def get_row_by_keyval(rows,key,val): + # print(f"k:{key}, v:{val}");print(rows); sys.exit() + for row in rows: + for k in row: + # print(k); print(row[k]); + if(k==key and row[k] == val): + return row + return None + +class Core: + REPLACES = { + "%in%": "./data/in", + "%contexts%": "./config/contexts", + "%mapping%": "./config/mapping", + "%credentials%": "./config/credentials", + } + + @staticmethod + def get_path_in(extra=None): + tag = "%in%" + path = Core.REPLACES[tag] + if extra is not None: + path = get_path(extra, path, tag) + return path + + @staticmethod + def get_path_context(extra=None): + tag = "%contexts%" + path = Core.REPLACES[tag] + if extra is not None: + path = get_path(extra, path, tag) + return path + + @staticmethod + def get_path_credential(extra=None): + tag = "%credentials%" + path = Core.REPLACES[tag] + if extra is not None: + path = get_path(extra, path, tag) + return path + + @staticmethod + def get_path_mapping(extra=None): + tag = "%mapping%" + path = Core.REPLACES[tag] + if extra is not None: + path = get_path(extra, path, tag) + return path + + @staticmethod + def get_dbconfig(dicctx, strdatabase): + # print(dicctx); sys.exit() + dbconfig = get_row_by_keyval(dicctx["schemas"],"database",strdatabase) + # print(dbconfig); sys.exit() + config = { + "host": dicctx["server"], + "port": dicctx["port"], + + "user": dbconfig["user"], + "passwd": dbconfig["password"], + "database": strdatabase + } + return config + diff --git a/integrator/core/etl.py b/integrator/core/etl.py new file mode 100644 index 00000000..40cf02e4 --- /dev/null +++ b/integrator/core/etl.py @@ -0,0 +1,71 @@ +import sys +from pprint import pprint + +from core.models.mapping import Mapping +from core.transfers.json_db import JsonDb +from core.transfers.db_db import Dbdb +from core.transfers.api_db import Apidb +from core.transfers.folder_db import FolderDb + +def pr(text="",exit=0): + print(f"etl.py: {text}") + if exit==1: + sys.exit() + +class Etl: + + objsource = None + objdestiny = None + + queries = [] + + def __init__(self, mappingfile, mappingid): + objmapping = Mapping(mappingfile, mappingid) + self.objsource = objmapping.get_source() + self.objdestiny = objmapping.get_destiny() + #pr(f"mappingfile:{mappingfile}, mappingid:{mappingid}") + #pr(self.objsource) + + def _transf_json_db(self): + jsondb = JsonDb(self.objsource, self.objdestiny) + jsondb.queries = self.queries + jsondb.transfer() + + def _transf_db_db(self): + dbdb = Dbdb(self.objsource, self.objdestiny) + dbdb.queries = self.queries + dbdb.transfer() + + def _transf_api_db(self): + apidb = Apidb(self.objsource, self.objdestiny) + apidb.queries = self.queries + apidb.transfer() + + def _transf_folder_db(self): + dbdb = FolderDb(self.objsource, self.objdestiny) + dbdb.queries = self.queries + dbdb.transfer() + + def _transf_api_json(): + # to-do + pass + + def _transf_db_json(): + # tod-do + pass + + + def transfer(self): + if self.objsource.is_file() and self.objdestiny.is_db(): + self._transf_json_db() + elif self.objsource.is_db() and self.objdestiny.is_db(): + self._transf_db_db() + elif self.objsource.is_api() and self.objdestiny.is_db(): + self._transf_api_db() + elif self.objsource.is_folder() and self.objdestiny.is_db(): + self._transf_folder_db() + else: + print("transfer type not found!") + + def add_query(self, sql): + self.queries.append(sql) \ No newline at end of file diff --git a/integrator/core/helpers/__init__.py b/integrator/core/helpers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/helpers/googleserv/__init__.py b/integrator/core/helpers/googleserv/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/helpers/googleserv/sheets.py b/integrator/core/helpers/googleserv/sheets.py new file mode 100644 index 00000000..3d16beca --- /dev/null +++ b/integrator/core/helpers/googleserv/sheets.py @@ -0,0 +1,28 @@ +import sys +import gspread +from core.core import Core as core +from oauth2client.service_account import ServiceAccountCredentials + +class Sheets: + + spread_id = "" + worksheet_num = 0 + credentialfile = "" + + def __init__(self, spread_id, worksheet_num=0): + self.spread_id = spread_id + #debe ser entero no string sino da error de indice + self.worksheet_num = worksheet_num + + def get_data(self): + scopes = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] + pathjson = core.get_path_credential(self.credentialfile) + credentials = ServiceAccountCredentials.from_json_keyfile_name(pathjson, scopes) + sheet = gspread.authorize(credentials) + wks = sheet.open(self.spread_id) + rows = wks.get_worksheet(self.worksheet_num).get_all_records() + # print(rows);sys.exit() + return rows + + def set_credential(self,strvalue): + self.credentialfile = strvalue \ No newline at end of file diff --git a/integrator/core/helpers/json.py b/integrator/core/helpers/json.py new file mode 100644 index 00000000..8a04dd5b --- /dev/null +++ b/integrator/core/helpers/json.py @@ -0,0 +1,35 @@ +import sys +import json + +class Json: + + def __init__(self, pathfile=""): + self.pathfile = pathfile + self.data = [] + + def load_data(self): + # print(self.pathfile) + # sys.exit() + with open(self.pathfile) as jfile: + self.data = json.load(jfile) + + def get_loaded(self): + self.load_data() + return self.data + + def set_pathfile(self,pathfile): + self.pathfile = pathfile + + def get_dictbykey(self,k,v): + for objdict in self.data: + for key in objdict: + if(key == k and objdict[key]==v): + return objdict + return None + + def get_data(self): + return self.data + + def reset(self): + self.pathfile = "" + self.data = [] \ No newline at end of file diff --git a/integrator/core/helpers/mysqlserv/__init__.py b/integrator/core/helpers/mysqlserv/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/helpers/mysqlserv/mysql.py b/integrator/core/helpers/mysqlserv/mysql.py new file mode 100644 index 00000000..c90abc66 --- /dev/null +++ b/integrator/core/helpers/mysqlserv/mysql.py @@ -0,0 +1,117 @@ +import sys +import mysql.connector +from mysql.connector import errorcode + +class Mysql: + + dicconfig = {} + conx = None + + def __init__(self, dicconfig): + self.dicconfig = dicconfig + # print(self.dicconfig); sys.exit() + + def _get_cursor(self): + # https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html + # ** transforma un diccionario en kwargs + # print(self.dicconfig); sys.exit() + try: + if self.conx is None or not self.conx.is_connected(): + # print("\n\n refreshing conx in get_cursor \n\n");print(self.dicconfig); + self.conx = mysql.connector.connect(**self.dicconfig) + + objcursor = self.conx.cursor(dictionary=True) + #print(objcursor); sys.exit() + return objcursor + except mysql.connector.Error as err: + if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: + print("Something is wrong with your user name or password") + elif err.errno == errorcode.ER_BAD_DB_ERROR: + print(f"Database does not exist {self.dicconfig.database}") + else: + print(err) + + # get from db + def execute(self, sql): + # https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html + if len(self.dicconfig) == 0: + return -1 + try: + objcursor = self._get_cursor() + r = objcursor.execute(sql) + return r + except mysql.connector.Error as error: + print("3 Failed execute to get record from mysql table: {}".format(error)) + return -1 + # finally: + # self.close() + + def query(self, sql): + if len(self.dicconfig) == 0: + return -1 + try: + # print(self.dicconfig); sys.exit() + objcursor = self._get_cursor() + objcursor.execute(sql) + r = objcursor.fetchall() + return r + + except mysql.connector.Error as error: + print("\n - 1 Failed query to get record from mysql table: {}".format(error)) + return -1 + #finally: + # if(self.conx.is_connected()): + # objcursor.close() + #print("mysql connection is closed") + + + def insert_tpl(self, sql, tplval): + # https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-transaction.html + #print(self.dicconfig);print("\n\nmysql.insert_tpl:\n\n");print(tplval);sys.exit(); + if len(self.dicconfig) == 0: + return -1 + try: + objcursor = self._get_cursor() + objcursor.execute(sql, tplval) + # print("\n- insert-sql:\n"); print(sql); + # print("- tplval:\n"); print(tplval); + #sys.exit() + # print(f"insert_topl ok. Lastrowid: {objcursor.lastrowid}") + # self.conx.commit() + return objcursor.lastrowid + + except mysql.connector.Error as error: + print("\n- 2 Failed insert_tpl: \n{}".format(error)) + return -1 + + def insert(self, dicqb): + # print("mysql.insert:");print(self.dicconfig);print(dicqb);print("\n\n");sys.exit(); + sql = dicqb["query"] + tplvals = dicqb["tuple"] + return self.insert_tpl(sql, tplvals) + + + def execute_bulk(self, arsql): + if len(self.dicconfig) == 0: + return -1 + + try: + objcursor = self._get_cursor() + for sql in arsql: + objcursor.execute(sql) + #arresult.append(r) + return 1 + except mysql.connector.Error as error: + print("4 Failed in execute_bulk. Error {}".format(error)) + return -1 + + def commit(self): + if(self.conx.is_connected()): + self.conx.commit() + return self + + def close(self): + if(self.conx.is_connected()): + objcursor = self._get_cursor() + objcursor.close() + return self \ No newline at end of file diff --git a/integrator/core/helpers/mysqlserv/querybuilder.py b/integrator/core/helpers/mysqlserv/querybuilder.py new file mode 100644 index 00000000..11c39871 --- /dev/null +++ b/integrator/core/helpers/mysqlserv/querybuilder.py @@ -0,0 +1,50 @@ +import sys + +def get_vals_tags(values): + lstvals = [] + for val in values: + lstvals.append("%s") + return ", ".join(lstvals) + +def get_vals_tuple(values): + tplvalues = tuple() + for val in values: + tplvalues = tplvalues + (val,) + return tplvalues + +class QueryBuilder: + + @staticmethod + def get_insert_dict(table, fields, values): + strfields = ", ".join(fields) + strvalues = get_vals_tags(values) + tplvalues = get_vals_tuple(values) + + sql = f"INSERT INTO {table} ({strfields}) VALUES ( {strvalues} )" + return { + "query": sql, + "tuple": tplvalues + } + + @staticmethod + def get_select(table, fields, conds=[]): + strfields = ", ".join(fields) + sql = f"SELECT {strfields} FROM {table} WHERE 1" + if conds: + strconds = " AND ".join(conds) + sql += " AND " + strconds + return sql + + @staticmethod + def get_update(table, dicfval, conds=[]): + arfields = [] + for field in dicfval: + val = dicfval[field] + arfields.append(f"{field}='{val}'") + strfields = ", ".join(arfields) + + sql = f"UPDATE {table} SET {strfields} WHERE 1 " + if conds: + strconds = " AND ".join(conds) + sql += " AND " + strconds + return sql \ No newline at end of file diff --git a/integrator/core/models/__init__.py b/integrator/core/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/models/base.py b/integrator/core/models/base.py new file mode 100644 index 00000000..2aea6c1d --- /dev/null +++ b/integrator/core/models/base.py @@ -0,0 +1,49 @@ +import sys +from pprint import pprint +from core.helpers.json import Json +from core.core import get_row_by_keyval + +class Base: + + pathfile = "" + id = "" + + data = [] + dataid = [] + + def __init__(self, pathfile, id=""): + self.pathfile = pathfile + self.id = id + + self._load_data() + self._load_byid() + self.data = [] + + def _id_exists(self): + return self.id != "" + + def _load_data(self): + #print(f"base. _load_data"); sys.exit() + json = Json(self.pathfile) + self.data = json.get_loaded() + # pprint(self.data); sys.exit() + + def _load_byid(self): + if self._id_exists(): + self.dataid = get_row_by_keyval(self.data, "id", self.id) + #pprint(self.dataid); sys.exit() + + def get_data(self): + if self._id_exists(): + return self.dataid + return self.data + + def get(self,key=""): + if self._id_exists(): + if key in self.dataid: + return self.dataid[key] + return None + else: + if key in self.data: + return self.data[key] + return None \ No newline at end of file diff --git a/integrator/core/models/context.py b/integrator/core/models/context.py new file mode 100644 index 00000000..b8a75071 --- /dev/null +++ b/integrator/core/models/context.py @@ -0,0 +1,94 @@ +import sys +import os +from core.core import Core as core, get_row_by_keyval +from core.models.base import Base +from core.helpers.json import Json +from core.helpers.googleserv.sheets import Sheets + +class Context(Base): + + format = "" + database = "" + + def __init__(self, pathfile, id, format): + pathcontext = core.get_path_context(pathfile) + #print(f"pathcontext: {pathcontext}"); sys.exit() + super().__init__(pathcontext, id) + #print("contructor"); sys.exit() + self.format = format + + def _is_file(self): + formats = ["json","csv","xls","xml","fixed"] + return self.format in formats + + def _is_db(self): + return self.format == "database" + + def _is_api(self): + return self.format == "api" + + def _is_folder(self): + return self.format == "folder" + + def _get_files(self,pathdir): + dir = [] + isdir = os.path.isdir(pathdir) + if not isdir: + return dir + + obj = os.scandir(pathdir) + for entry in obj : + # if entry.is_dir() or entry.is_file(): + if entry.is_file(): + #print(entry.name) + dir.append(entry.name) + obj.close() + return dir + + + def get_content(self): + # carga los datos del fichero o api en un array y lo devuelve + # en el caso de carpeta deberia devolver un scandir + if self._is_file(): + pathconf = core.get_path_in(self.get("path")) + ojson = Json(pathconf) + return ojson.get_loaded() + elif self._is_api(): + # print("\nis_api():");print(self.dataid);sys.exit() + if self.get("type") == "google-sheets": + gsheets = Sheets(self.get("spread_id"),self.get("worksheet_num")) + gsheets.set_credential(self.get("credentials")) + return gsheets.get_data() + elif self._is_folder(): + return { + "pathfolder": self.get("path"), + "files": self._get_files(self.get("path")) + } + + return {"msg":"this context is not a file"} + + + def get_dbconfig(self): + if self._is_db(): + schemas = self.get("schemas") + # print("get_data\n") + # print(self.get_data()) + dbconfig = get_row_by_keyval(schemas, "database", self.database) + # print(dbconfig); sys.exit() + config = { + "host": self.get("server"), + "port": self.get("port"), + + "user": dbconfig["user"], + "passwd": dbconfig["password"], + "database": dbconfig["database"], + } + return config + + return {"msg":f"This contextsis not a database! {self.format}"} + + # def set_format(self,strval): + # self.format = strval + + def set_database(self, strval): + self.database = strval \ No newline at end of file diff --git a/integrator/core/models/credential.py b/integrator/core/models/credential.py new file mode 100644 index 00000000..9cd6cb73 --- /dev/null +++ b/integrator/core/models/credential.py @@ -0,0 +1,9 @@ +from core.core import Core as core +from core.models.base import Base + +class Credential(Base): + + def __init__(self, pathfile): + pathcredential = core.get_path_credential(pathfile) + super().__init__(pathcredential, id) + diff --git a/integrator/core/models/destiny.py b/integrator/core/models/destiny.py new file mode 100644 index 00000000..75be39b6 --- /dev/null +++ b/integrator/core/models/destiny.py @@ -0,0 +1,9 @@ +from core.models.pointcfg import Pointcfg + +class Destiny(Pointcfg): + + def __init__(self, dicconfig): + super().__init__(dicconfig) + + def get_tables(self): + return self.get("tables") \ No newline at end of file diff --git a/integrator/core/models/mapping.py b/integrator/core/models/mapping.py new file mode 100644 index 00000000..e5145233 --- /dev/null +++ b/integrator/core/models/mapping.py @@ -0,0 +1,23 @@ +import sys +from core.core import Core as core +from core.models.base import Base +from core.models.source import Source +from core.models.destiny import Destiny + +class Mapping(Base): + + def __init__(self, pathfile, id): + pathmapping = core.get_path_mapping(pathfile) + super().__init__(pathmapping, id) + + def get_source(self): + dicconfig = self.get("source") + # print(dicconfig) + objsource = Source(dicconfig) + return objsource + + def get_destiny(self): + dicconfig = self.get("destiny") + # print(dicconfig); sys.exit() + objdestiny = Destiny(dicconfig) + return objdestiny diff --git a/integrator/core/models/pointcfg.py b/integrator/core/models/pointcfg.py new file mode 100644 index 00000000..4beb3fa0 --- /dev/null +++ b/integrator/core/models/pointcfg.py @@ -0,0 +1,52 @@ +import sys +from core.core import Core as core +from core.core import get_row_by_keyval +from core.models.context import Context +from pprint import pprint + +class Pointcfg: + + dicconfig = {} + + def __init__(self, dicconfig): + self.dicconfig = dicconfig + + + def get(self, key=""): + if key in self.dicconfig: + return self.dicconfig[key] + return None + + def get_format(self): + return self.get("format") + + def get_table(self): + return self.get("table") + + def get_context(self): + pathfile = self.dicconfig["context"]["file"] + id = self.dicconfig["context"]["id"] + format = self.dicconfig["format"] + #print(f"get_context_format: {format}");sys.exit() + ctx = Context(pathfile, id, format) + # pprint(ctx); sys.exit() + if self.is_db(): + # print(self.dicconfig); sys.exit() + ctx.set_database(self.dicconfig["context"]["database"]) + + return ctx + + def get_data(self): + return self.dicconfig + + def is_db(self): + return self.dicconfig["format"] == "database" + + def is_file(self): + return self.dicconfig["format"] in ["json","xml","csv","fixed","xls"] + + def is_folder(self): + return self.dicconfig["format"] == "folder" + + def is_api(self): + return self.dicconfig["format"] == "api" \ No newline at end of file diff --git a/integrator/core/models/source.py b/integrator/core/models/source.py new file mode 100644 index 00000000..d5803788 --- /dev/null +++ b/integrator/core/models/source.py @@ -0,0 +1,9 @@ +from core.models.pointcfg import Pointcfg + +class Source(Pointcfg): + + def __init__(self, dicconfig): + super().__init__(dicconfig) + + def get_conditions(self): + return self.get("conditions") \ No newline at end of file diff --git a/integrator/core/tools/__int__.py b/integrator/core/tools/__int__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/tools/tools.py b/integrator/core/tools/tools.py new file mode 100644 index 00000000..19c98d83 --- /dev/null +++ b/integrator/core/tools/tools.py @@ -0,0 +1,182 @@ +# tools.tools.py +# source: https://github.com/eacevedof/prj_bash/blob/master/py/tools/tools.py +import sys +import os +import json +from pprint import pprint +from datetime import datetime + +def printx(mxvar): + if isinstance(mxvar,list): + for i, item in enumerate(mxvar): + print(i," => ",item) + else: + print(mxvar) + +def pr(var,title=""): + if title!="": + print(title) + printx(var) + +def ppr(var,title=""): + if title!="": + print(title) + pprint(var) + +def pd(var,title=""): + if title!="": + print(title) + printx(var) + sys.exit() + +def prn(var, title=""): + if title: + print(f"\n - {title}:\n") + pprint(var) + +def die(): + sys.exit() + +def file_get_contents(filename): + try: + with open(filename) as f: + return f.read() + except IOError: + return f"no file found: {filename}" + +def file_put_contents(filename,strdata=""): + try: + with open(filename, 'w') as f: + f.write(strdata) + except IOError: + return f"no file found: {filename}" + +def get_datetime(): + from datetime import datetime + now = datetime.now() + now.strftime("%Y-%m-%d %H:%M:%S") + # pr(now) + now = str(now).replace("-","").replace(":","").replace(" ","") + now = now[:-7] + return now + +def copyf(path1,path2): + from os import path + from shutil import copyfile + + if not path.exists(path1): + return 0 + + if not path.exists(path2): + copyfile(path1, path2) + return 1 + + return 0 + +def is_file(pathfile): + from os import path + return path.exists(pathfile) + +def is_dir(pathdir): + return os.path.isdir(pathdir) + +def die(text=""): + import sys + if text!="" :print(text) + sys.exit() + +def get_dir(path): + realpath = os.path.dirname(os.path.realpath(path)) + return realpath + +def get_basename(path,ext=1): + import ntpath + basename = ntpath.basename(path) + #print(basename); die("basename") + if ext==1: + return basename + parts = basename.split(".") + del parts[-1] + basename = ".".join(parts) + return basename + +def get_currdir(): + return os.getcwd() + +def get_realpath(path): + return os.path.realpath(path) + +def get_path_config_json(): + pathdir = get_dir(__file__) + pathjson = pathdir+"/../config/projects.local.json" + pathconfig = get_realpath(pathjson) + return pathconfig + +def get_now(): + now = datetime.now() + hhmmss = now.strftime("%H:%M:%S") + return hhmmss + +def scandir(pathfoler): + # pr(f"pathfolder: {pathfoler}") + # return [f for f in os.listdir(pathfoler) if os.path.isfile(f)] + + f = [] + for entry in os.scandir(pathfoler): + #print(entry) + #if entry.is_file(): + if entry.name != ".DS_Store": + f.append(entry.name) + return f + + +def get_dicconfig(project): + pathconfig = get_path_config_json() + jsonhlp = Json(pathconfig) + jsonhlp.load_data() + dicproject = jsonhlp.get_dictbykey("id",project) + return dicproject + +def is_iterable(mxvar): + from collections.abc import Iterable + return isinstance(mxvar, Iterable) + + +class Json: + + def __init__(self, pathfile=""): + self.pathfile = pathfile + self.data = [] + + def load_data(self): + # print(self.pathfile) + # sys.exit() + with open(self.pathfile) as jfile: + self.data = json.load(jfile) + + def get_loaded(self): + self.load_data() + return self.data + + def set_pathfile(self,pathfile): + self.pathfile = pathfile + + def get_dictbykey(self,k,v): + for objdict in self.data: + for key in objdict: + if(key == k and objdict[key]==v): + return objdict + return None + + def get_data(self): + return self.data + + def reset(self): + self.pathfile = "" + self.data = [] + +def sh(strcmd): + try: + os.system(strcmd) + except Exception as error: + print(f"tools.sh: error: {error}") \ No newline at end of file diff --git a/integrator/core/transfers/__init__.py b/integrator/core/transfers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/core/transfers/api_db.py b/integrator/core/transfers/api_db.py new file mode 100644 index 00000000..c997c6b4 --- /dev/null +++ b/integrator/core/transfers/api_db.py @@ -0,0 +1,86 @@ +import sys +import json +from pprint import pprint +from core.helpers.mysqlserv.querybuilder import QueryBuilder as qb +from core.helpers.mysqlserv.mysql import Mysql +from core.tools.tools import file_put_contents + +class Apidb: + objsource = None + objdestiny = None + + queries = [] + + def __init__(self, objsource, objdestiny): + self.objsource = objsource + self.objdestiny = objdestiny + + self._printattribs() + + def _printattribs(self): + #print("\nobjsource"); pprint(self.objsource.get_data()) + #print("\nobjsource.context"); pprint(self.objsource.get_context().get_content()) + #print("\nobjdestiny"); pprint(self.objdestiny.get_data()); sys.exit() + pass + + def _get_source_data(self): + return self.objsource.get_context().get_content() + + # guarda en fichero el json devuelto por la api de gdcos + def _file_debug(self,idie=1): + rows = self._get_source_data() + strjson = json.dumps(rows) + print(strjson) + file_put_contents("./temp000.json",strjson) + if idie==1: + sys.exit() + + + def _insert_by_rows(self,mysql,tabledest,mapfields,fromfields): + # self._file_debug() + for row in self._get_source_data(): + insert = {"keys":[],"values":[]} + for field in row: + if field in fromfields: + insert["keys"].append(mapfields[field]) + insert["values"].append(row[field]) + # print(insert) + qbsql = qb.get_insert_dict(tabledest, insert["keys"], insert["values"]) + # print(qbsql);print("\n") + mysql.insert(qbsql) + + def _truncate_table(self,mysql, table): + sql = f"TRUNCATE TABLE {table}" + mysql.execute(sql) + + def _insert_by_table(self, mysql): + for tablecfg in self.objdestiny.get_tables(): + #pprint(tablecfg);sys.exit() + tabledest = tablecfg["name"] + mapfields = tablecfg["fields"] + fromfields = list(mapfields.keys()) + self._truncate_table(mysql, tabledest) + self._insert_by_rows(mysql, tabledest, mapfields, fromfields) + + def _run_queries(self, mysql): + for sql in self.queries: + mysql.execute(sql) + + def transfer(self): + print("starting transfer....") + + source = self.objsource + destiny = self.objdestiny + + destmysql = Mysql(destiny.get_context().get_dbconfig()) + print("...inserting into tables") + self._insert_by_table(destmysql) + print("...running extra queries") + self._run_queries(destmysql) + print("proces finished!") + + + def add_query(self, sql): + self.queries.append(sql) + + \ No newline at end of file diff --git a/integrator/core/transfers/db_db.py b/integrator/core/transfers/db_db.py new file mode 100644 index 00000000..99660284 --- /dev/null +++ b/integrator/core/transfers/db_db.py @@ -0,0 +1,99 @@ +import sys +from pprint import pprint +from core.tools.tools import is_iterable +from core.helpers.mysqlserv.querybuilder import QueryBuilder as qb +from core.helpers.mysqlserv.mysql import Mysql + +class Dbdb: + objsource = None + objdestiny = None + + queries = [] + + def __init__(self, objsource, objdestiny): + self.objsource = objsource + self.objdestiny = objdestiny + + self._printattribs() + + def _printattribs(self): + #print("\nobjsource"); pprint(self.objsource.get_data()) + #print("\nobjdestiny"); pprint(self.objdestiny.get_data()); sys.exit() + pass + + def _get_source_data(self, srcmysql, fromfields): + srctable = self.objsource.get_table() + conditions = self.objsource.get_conditions() if self.objsource.get_conditions() is not None else [] + + # print(srctable); sys.exit() + sql = qb.get_select(srctable, fromfields, conditions) + #print(sql); sys.exit() + rows = srcmysql.query(sql) + #pprint(rows); sys.exit() + return rows + + def _insert_by_rows(self,srcmysql,destmysql,tabledest,mapfields,fromfields,constants): + for row in self._get_source_data(srcmysql, fromfields): + insert = {"keys":[],"values":[]} + for field in row: + if field in fromfields: + insert["keys"].append(mapfields[field]) + insert["values"].append(row[field]) + # print(insert) + + if is_iterable(constants): + for field in constants: + insert["keys"].append(field) + insert["values"].append(constants[field]) + + # print(insert);sys.exit(); + qbsql = qb.get_insert_dict(tabledest, insert["keys"], insert["values"]) + id = destmysql.insert(qbsql) + print(f"\noquery:\n{qbsql} \nid:{id}\n"); + #destmysql.commit().close() + + def _truncate_table(self,mysql, table): + sql = f"TRUNCATE TABLE {table}" + mysql.execute(sql) + # mysql.commit().close() + + def _insert_by_table(self, srcmysql, destmysql): + for tablecfg in self.objdestiny.get_tables(): + # print(tablecfg);sys.exit() + tabledest = tablecfg.get("name") + mapfields = tablecfg.get("fields") + # constants = tablecfg["constants"] + constants = tablecfg.get("constants") + # print(constants); sys.exit() + fromfields = list(mapfields.keys()) + self._truncate_table(destmysql, tabledest) + self._insert_by_rows(srcmysql, destmysql, tabledest, mapfields, fromfields, constants) + + def _run_queries(self, destmysql): + for sql in self.queries: + destmysql.execute(sql) + # destmysql.commit().close() + + def transfer(self): + print("starting transfer....") + + source = self.objsource + destiny = self.objdestiny + + srcmysql = Mysql(source.get_context().get_dbconfig()) + destmysql = Mysql(destiny.get_context().get_dbconfig()) + print("...inserting into tables"); # sys.exit() + + self._insert_by_table(srcmysql, destmysql) + #sys.exit() + print("...running extra queries") + self._run_queries(destmysql) + print("proces finished!") + srcmysql.commit().close() + destmysql.commit().close() + + + def add_query(self, sql): + self.queries.append(sql) + + \ No newline at end of file diff --git a/integrator/core/transfers/folder_db.py b/integrator/core/transfers/folder_db.py new file mode 100644 index 00000000..1f65f67d --- /dev/null +++ b/integrator/core/transfers/folder_db.py @@ -0,0 +1,131 @@ +import sys +import os +from pprint import pprint +from core.helpers.mysqlserv.querybuilder import QueryBuilder as qb +from core.helpers.mysqlserv.mysql import Mysql +import re + + +def pr(text="",exit=0): + print(f"folder_db.py: {text}") + if exit==1: + sys.exit() + +class FolderDb: + objsource = None + objdestiny = None + + queries = [] + + def __init__(self, objsource, objdestiny): + self.objsource = objsource + self.objdestiny = objdestiny + + self._printattribs() + + def _printattribs(self): + #print("\nobjsource"); pprint(self.objsource.get_data()) + #print("\nobjdestiny"); pprint(self.objdestiny.get_data()); sys.exit() + pass + + # devuelve el listado de archivos en la carpeta + def _get_source_data(self): + return self.objsource.get_context().get_content() + + def _get_tables(self): + return self.objdestiny.get_data()["tables"] + + def _get_fields_from_pattern(self,paatern): + arfields = paatern.split("|") + + arfound = [] + for pat in arfields: + f = re.search('%(.+?)%',pat) + if f: + strf = f.group(1) + if strf not in arfound: + arfound.append(strf) + + return arfound + + # arfiles son los posibles archivos y las condiciones and para el update + def _update(self, arfiles, table, upfield): + omysql = Mysql(self.objdestiny.get_context().get_dbconfig()) + + folderfiles = self._get_source_data() + + arsql = [] + for folfile in folderfiles["files"]: + for maybefile in arfiles: + #pr(maybefile,1) + armaybes = maybefile["maybe"] + strcond = maybefile["conds"] + for maybef in armaybes: + if folfile == maybef: + sql = qb.get_update(table, {upfield:folfile}, [strcond]) + arsql.append(sql) + + #pr(arsql,1) + r = omysql.execute_bulk(arsql) + # pr(r,1) + + def _get_sqlselect(self,tablename, arfields): + sql = qb.get_select(tablename, arfields) + return sql + + def _get_data(self,sql): + omysql = Mysql(self.objdestiny.get_context().get_dbconfig()) + data = omysql.query(sql) + return data + + def _get_pat_replaced(self, fpattern, arfields, ardata): + archanged=[] + + for row in ardata: + repl = fpattern + conds = [] + for field in arfields: + strfv = row[field] + repl = repl.replace(f"%{field}%",strfv) + conds.append(f"{field}='{strfv}'") + + # aqui repl seria algo como: 'PR0172.jpg|PR0172.png', + armaybes = repl.split("|") + archanged.append({"maybe":armaybes,"conds":" AND ".join(conds)}) + + return archanged + + def _process(self): + artables = self._get_tables() + for dictable in artables: + strtable = dictable["name"] + dicfields = dictable["fields"] + + for fpattern in dicfields: + strupfield = dicfields[fpattern] + arfields = self._get_fields_from_pattern(fpattern) + sql = self._get_sqlselect(strtable, arfields) + # obtengo todos los registros con los campos implicados en el patrón + ardata = self._get_data(sql) + #pr(ardata,1) + arfiles = self._get_pat_replaced(fpattern, arfields, ardata) + # pr(arfiles,1) + self._update(arfiles, strtable, strupfield) + + + def transfer(self): + print("folder_db.py: starting transfer....") + self._process() + print("folder_db.py: ...running extra queries") + self._run_queries() + print("folder_db.py: proces finished!") + + + def add_query(self, sql): + self.queries.append(sql) + + def _run_queries(self): + omysql = Mysql(self.objdestiny.get_context().get_dbconfig()) + omysql.execute_bulk(self.queries) + + \ No newline at end of file diff --git a/integrator/core/transfers/json_db.py b/integrator/core/transfers/json_db.py new file mode 100644 index 00000000..0ec54a51 --- /dev/null +++ b/integrator/core/transfers/json_db.py @@ -0,0 +1,72 @@ +import sys +from pprint import pprint +from core.helpers.mysqlserv.querybuilder import QueryBuilder as qb +from core.helpers.mysqlserv.mysql import Mysql + +class JsonDb: + objsource = None + objdestiny = None + + queries = [] + + def __init__(self, objsource, objdestiny): + self.objsource = objsource + self.objdestiny = objdestiny + + self._printattribs() + + def _printattribs(self): + # print("\nobjsource"); pprint(self.objsource.get_data()) + # print("\nobjdestiny"); pprint(self.objdestiny.get_data()); sys.exit() + pass + + def _get_source_data(self): + return self.objsource.get_context().get_content() + + def _insert_by_rows(self,mysql,tabledest,mapfields,fromfields): + for row in self._get_source_data(): + insert = {"keys":[],"values":[]} + for field in row: + if field in fromfields: + insert["keys"].append(mapfields[field]) + insert["values"].append(row[field]) + # print(insert) + qbsql = qb.get_insert_dict(tabledest, insert["keys"], insert["values"]) + # print(qbsql);print("\n") + mysql.insert(qbsql) + + def _truncate_table(self,mysql, table): + sql = f"TRUNCATE TABLE {table}" + mysql.execute(sql) + + def _insert_by_table(self, mysql): + for tablecfg in self.objdestiny.get_tables(): + #pprint(tablecfg);sys.exit() + tabledest = tablecfg["name"] + mapfields = tablecfg["fields"] + fromfields = list(mapfields.keys()) + self._truncate_table(mysql, tabledest) + self._insert_by_rows(mysql, tabledest, mapfields, fromfields) + + def _run_queries(self, mysql): + for sql in self.queries: + mysql.execute(sql) + + def transfer(self): + print("starting transfer....") + + source = self.objsource + destiny = self.objdestiny + + destmysql = Mysql(destiny.get_context().get_dbconfig()) + print("...inserting into tables") + self._insert_by_table(destmysql) + print("...running extra queries") + self._run_queries(destmysql) + print("proces finished!") + + + def add_query(self, sql): + self.queries.append(sql) + + \ No newline at end of file diff --git a/integrator/data/in/products.json b/integrator/data/in/products.json new file mode 100644 index 00000000..ad1f3315 --- /dev/null +++ b/integrator/data/in/products.json @@ -0,0 +1 @@ +[{"display": 1, "syscode": 51, "description1": "Aeropuerto carne", "description2": "Peruvian style fried rice of strip loin with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 28.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 533, "description1": "Aeropuerto de Camarones", "description2": "Peruvian style fried rice of chicken with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 31.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 219, "description1": "Aeropuerto de Mariscos", "description2": "Peruvian style fried rice of seafood with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 31.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 383, "description1": "Aeropuerto de Vegetales", "description2": "Peruvian style fried rice of vegetables with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 19.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 655, "description1": "Aeropuerto ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 220, "description1": "Aeropuerto Mixto Pollo Carne y Mariscos", "description2": "Peruvian style fried rice of strip loin, chicken and seafood with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 52, "description1": "Aeropuerto Pescado", "description2": "Peruvian style fried rice of groupe with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 26.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 67, "description1": "Aeropuerto Pollo", "description2": "Peruvian style fried rice of chicken with bean sprouts, chinese noodles, fried eggs, soy sauce, ginger, garlic, spring onions and served with wanton crackers covered with our homemade tamarind sauce", "price1": 26.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 425, "description1": "Agua en Botella", "description2": "", "price1": 4.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 11, "syscode": 583, "description1": "Aguadito de Pollo G", "description2": "", "price1": 17.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 582, "description1": "Aguadito de Pollo P", "description2": "", "price1": 11.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 176, "description1": "Aji de Gallina", "description2": "Aji de gallina is a delicious Peruvian classic bright yellow from the famous non-spicy aji amarillo peppers, and rich from the unusual cream sauce. traditionally served over rice with boiled yellow potatoes and black olives.", "price1": 21.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 295, "description1": "Aji de Gallina ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 94, "description1": "Amstel Bright", "description2": "", "price1": 7.0, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 1, "syscode": 262, "description1": "Anticuchos", "description2": "", "price1": 24.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 18, "description1": "Anticuchos Personal", "description2": "Grilled to perfection heart of beef skewers, accompanied with thinly sliced boiled potatoes, covered with our homemade \"Huancaina\" sauce (1 person)", "price1": 11.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 12, "description1": "Arroz Blanco", "description2": "White Rice", "price1": 5.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 199, "description1": "Arroz con Camarones", "description2": "Rich in flavor shrimps & rice stewed in bell peppers, red onions, non-spicy \"Panca\" chilli, non-spicy yellow chilli, carrots, white whine, garlic and fresh cilantro. Served with lemon wedges on the side.", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 157, "description1": "Arroz con Leche", "description2": "rice pudding peruvian style", "price1": 7.5, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 77, "description1": "Arroz con Mariscos", "description2": "Rich in flavor seafood & rice stewed in bell peppers, red onions, non-spicy \"Panca\" chilli, non-spicy yellow chilli, carrots, white whine, garlic and fresh cilantro. Served with lemon wedges on the side.", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 672, "description1": "Arroz con Mariscos Especial", "description2": "Rich in flavor seafood & rice stewed in bell peppers, red onions, non-spicy \"Panca\" chilli, non-spicy yellow chilli, carrots, white whine, garlic and fresh cilantro. Served with lemon wedges on the side.", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 82, "description1": "Arroz con Pato", "description2": "Duck Breast or Leg stewed with rice and cilantro base, spinach, carrots, green peas, and garlic. served with peruvian style \"Creole Sarsa\" a flavorful mini salad made with red onions, cilantro, lime juice and salt.", "price1": 30.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 85, "description1": "Arroz con Pollo", "description2": "Chicken Breast or Leg stewed with rice and cilantro base, spinach, carrots, green peas, and garlic. served with peruvian style \"Creole Sarsa\" a flavorful mini salad made with red onions, cilantro, lime juice and salt.", "price1": 23.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 291, "description1": "Arroz con Pollo ESP", "description2": "Chicken Breast or Leg stewed with rice and cilantro base, spinach, carrots, green peas, and garlic. served with peruvian style \"Creole Sarsa\" a flavorful mini salad made with red onions, cilantro, lime juice and salt.", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 277, "description1": "Arroz Frito", "description2": "Chinese - Peruvian fried rice", "price1": 7.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 275, "description1": "Arroz Verde", "description2": "Arroz con Pollo Green Rice", "price1": 7.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 249, "description1": "Asado con Pure", "description2": "", "price1": 22.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 288, "description1": "Asado con Pure ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 653, "description1": "Bistec Plancha ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 5, "description1": "Pisco Sour", "description2": "", "price1": 13.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 6, "description1": "Maracuya Sour", "description2": "", "price1": 15.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 1, "syscode": 247, "description1": "Bistec a la Chorrillana", "description2": "", "price1": 24.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 426, "description1": "Bistec a lo Pobre", "description2": "", "price1": 29.5, "price2": 0, "category1": "Carnes", "category2": "Postres", "tags": ""}, {"display": 11, "syscode": 654, "description1": "Bistec Chorrillana", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 47, "description1": "Bisteck a la Plancha", "description2": "", "price1": 25.0, "price2": 0, "category1": "Carnes", "category2": "Postres", "tags": ""}, {"display": 1, "syscode": 83, "description1": "Cabrito a la Norte\u00f1a", "description2": "", "price1": 27.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 585, "description1": "Caldo de Gallina GR", "description2": "", "price1": 19.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 584, "description1": "Caldo de Gallina PE", "description2": "", "price1": 13.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 50, "description1": "Camaron al Ajo", "description2": "Sauteed Jumbo shrimps with Garlic sauce on top acompanied with white rice and french fries", "price1": 33.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 230, "description1": "Camaron Frito", "description2": "Fried Jumbo Shrimps acompanied with homemade Tartar sauce and french fries", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 15, "description1": "Cancha", "description2": "Fried peruvian corn", "price1": 6.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 371, "description1": "Carapulcra ", "description2": "", "price1": 29.0, "price2": 0, "category1": "MENU DOMINGO", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 300, "description1": "Carapulcra ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 298, "description1": "Cau Cau", "description2": "", "price1": 20.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 297, "description1": "Cau Cau ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 21, "description1": "Causa con Camarones a la Parrilla", "description2": "Grilled Shrimps served with our signature \"Huacatay Chimichurri\" sauce acompanied with our \"Causa Limena\" or Peruvian mashed potatoes mixed with the native non-spicy yellow chill", "price1": 20.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 311, "description1": "Causa Rellena ", "description2": "", "price1": 15.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 421, "description1": "Cebiche Catch of the Day", "description2": "The world'know Peruvian ceviche itself! Catch of the day fish marinated to perfection in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro", "price1": 29.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 195, "description1": "Cebiche de Camaron", "description2": "Shrimps Ceviche marinated to perfection in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 33, "description1": "Ceviche Camar/Pesc P", "description2": "Shrimps and grouper Ceviche marinated to perfection in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro", "price1": 18.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 26, "description1": "Ceviche de Pescado", "description2": "The world'know Peruvian ceviche itself! Grouper marinated to perfection in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro", "price1": 22.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 25, "description1": "Ceviche de Pescado Pequeno", "description2": "The world'know Peruvian ceviche itself! Grouper marinated to perfection in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro (small)", "price1": 16.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 27, "description1": "Ceviche Mixto", "description2": "This one is a must! Mixed seafood and grouper \"Ceviche\" exquisitley marinated in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 29, "description1": "Ceviche Mixto PQ", "description2": "This one is a must! Mixed seafood and grouper \"Ceviche\" exquisitley marinated in lime juice, red onions, garlic, white pepper, salt and freshly chopped cilantro (small)", "price1": 20.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 369, "description1": "Chalan Chifa", "description2": "", "price1": 35.0, "price2": 0, "category1": "Chalan Vario", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 367, "description1": "Chalan Criollo", "description2": "", "price1": 32.0, "price2": 0, "category1": "Chalan Vario", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 260, "description1": "Chalan Criollo 3 en 1", "description2": "", "price1": 24.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 556, "description1": "Chalan Duo Marino 2", "description2": "", "price1": 33.0, "price2": 0, "category1": "Chalan Vario", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 442, "description1": "Chalan Entrada 4 en 1", "description2": "", "price1": 28.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 368, "description1": "Chalan Mariscos", "description2": "", "price1": 35.0, "price2": 0, "category1": "Chalan Vario", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 86, "description1": "Tallarin Verde con Bisteck", "description2": "", "price1": 24.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 667, "description1": "Chancho al Cilindro", "description2": "", "price1": 22.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 89, "description1": "Ron", "description2": "", "price1": 7.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 90, "description1": "Vodka", "description2": "", "price1": 8.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 11, "syscode": 370, "description1": "Chanfainita", "description2": "", "price1": 29.0, "price2": 0, "category1": "MENU DOMINGO", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 253, "description1": "Chanfainita con Mot", "description2": "", "price1": 21.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 287, "description1": "Chanfainita ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 95, "description1": "Cristal", "description2": "", "price1": 12.0, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 0, "syscode": 96, "description1": "Cusque\u00f1a", "description2": "", "price1": 12.0, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 0, "syscode": 97, "description1": "Pilsen", "description2": "", "price1": 12.0, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 0, "syscode": 102, "description1": "Black label", "description2": "", "price1": 8.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 103, "description1": "Old par", "description2": "", "price1": 9.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 104, "description1": "Red label", "description2": "", "price1": 8.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 1, "syscode": 305, "description1": "Chaufa de Carne", "description2": "Peruvian style fried rice of strip loin. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 22.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 632, "description1": "Chaufa de Carne ESP", "description2": "Peruvian style fried rice of strip loin. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 306, "description1": "Chaufa de Carne y Pollo", "description2": "Peruvian style fried rice of strip loin and chicken. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 22.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 76, "description1": "Chaufa de Mariscos", "description2": "Peruvian style fried rice of seafood. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 32.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 111, "description1": "Chardonay Botella", "description2": "", "price1": 40.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 112, "description1": "Merlot Botella", "description2": "", "price1": 40.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 11, "syscode": 634, "description1": "Chaufa de Mariscos Especial", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 75, "description1": "Chaufa de Pescado", "description2": "Peruvian style fried rice of grouper. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 26.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 125, "description1": "Chuleta Chorrillan", "description2": "", "price1": 21.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 633, "description1": "Chaufa de Pescado Especial", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 117, "description1": "Chaufa de pollo", "description2": "Peruvian style fried rice of Chicken. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 22.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 134, "description1": "Sopa Minuta Pollo P", "description2": "", "price1": 11.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 135, "description1": "Sopa Minuta Pollo G", "description2": "", "price1": 16.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 145, "description1": "Patazaca Grande", "description2": "", "price1": 20.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 146, "description1": "Patazca Pequena", "description2": "", "price1": 14.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 148, "description1": "Sancochado PQ", "description2": "", "price1": 11.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 149, "description1": "Sancochado Gr.", "description2": "", "price1": 17.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 631, "description1": "Chaufa de Pollo ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 221, "description1": "Chaufa Mixto Pollo Carne y Mariscos", "description2": "Peruvian style fried rice of strip loin, chiken and Seafood. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 30.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 160, "description1": "Cheesecake Maracuya", "description2": "", "price1": 11.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 2, "description1": "Chicha morada", "description2": "Peruvian Purple Corn Limonade", "price1": 5.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 9, "description1": "Chicha Morada Jarra", "description2": "Peruvian Purple Corn Limonade Pitcher", "price1": 18.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 163, "description1": "Brownie con Helado", "description2": "", "price1": 13.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 165, "description1": "Helado de Vainilla", "description2": "", "price1": 7.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 166, "description1": "Helado Napolitano", "description2": "", "price1": 7.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 19, "description1": "Chicharron Calamar P", "description2": "Crispy fried calamari served with our peruvian \"creole sarsa\" a flavorful mini salad made with red onions, tomatoes, cilantro, lime juice and salt a side portion of our homemade tartar sauce", "price1": 18.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 229, "description1": "Chicharron de Calamar", "description2": "Crispy fried calamari served with our peruvian \"creole sarsa\" a flavorful mini salad made with red onions, tomatoes, cilantro, lime juice and salt a side portion of our homemade tartar sauce", "price1": 27.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 172, "description1": "Chicharron de Pollo", "description2": "Home made chicken nuggets served with French Fries on the side and homemade Tatar sauce", "price1": 21.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 274, "description1": "Chifles", "description2": "", "price1": 4.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 92, "description1": "Chill", "description2": "", "price1": 5.5, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 1, "syscode": 537, "description1": "Chimichurri", "description2": "", "price1": 3.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 32, "description1": "Choros a La Chalaca", "description2": "Mussels exquisitly marinated in fresh lime juice, red onions, tomatoes, and finished with freshly chopped cilantro", "price1": 21.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 657, "description1": "Chuleta Chorrillan", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 656, "description1": "Chuleta Frita ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 587, "description1": "Chupe de Camarones Grande", "description2": "Traditional Southern Peruvian Shrimp chowder. Cooked with our native non-spicy \"panca\" chilli and rice, eggs milk, fresh white cheese finished with oregano.", "price1": 32.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 586, "description1": "Chupe de Camarones Pequeno", "description2": "Traditional Southern Peruvian Shrimp chowder. Cooked with our native non-spicy \"panca\" chilli and rice, eggs milk, fresh white cheese finished with oregano.", "price1": 21.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 589, "description1": "Chupe de Mariscos Grande", "description2": "", "price1": 30.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 588, "description1": "Chupe de Mariscos Pequeno", "description2": "", "price1": 20.75, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 591, "description1": "Chupe de Pescado Grande", "description2": "", "price1": 21.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 590, "description1": "Chupe de Pescado Pequeno", "description2": "", "price1": 15.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 48, "description1": "Churrasco", "description2": "", "price1": 30.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 256, "description1": "Churrasco a lo Pobre", "description2": "", "price1": 33.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 186, "description1": "Arroz c/ Pollo c/ P", "description2": "", "price1": 28.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 187, "description1": "Arroz c/ Pato c/ P.", "description2": "", "price1": 33.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 105, "description1": "Coca cola", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 159, "description1": "Combinado", "description2": "", "price1": 8.5, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 194, "description1": "Cebiche de Camaron y Pescado", "description2": "", "price1": 31.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 579, "description1": "Crema de Verduras G", "description2": "", "price1": 16.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 578, "description1": "Crema de Verduras P", "description2": "", "price1": 9.75, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 308, "description1": "Crema Huancaina", "description2": "", "price1": 4.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 108, "description1": "Diet coke", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 534, "description1": "Ensalada Cesar con Pechuga", "description2": "Chicken breast and the classic caesar salad based on romaine lettuce, croutons, Gouda cheese finished with chopped parsley", "price1": 18.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 23, "description1": "Ensalada Cesar de Camarones", "description2": "Shrimp and the classic Caesar Salad based on romain lettuce, croutons, Gouda Cheese finished with chopped parsley", "price1": 20.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 204, "description1": "Tacu Pesca a lo Mac", "description2": "", "price1": 42.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 17, "description1": "Ensalada Fresca", "description2": "Fresh vegetable salad", "price1": 11.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 179, "description1": "Escabeche de Pollo", "description2": "a Peruvian pickled chicken dish with spicy, smoky, and earthy aji panca, red onion, celery, chicken stock, and wine vinegar. served with egg and peruvian black olive", "price1": 20.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 412, "description1": "Escabeche de Pollo Especial", "description2": "a Peruvian pickled chicken dish with spicy, smoky, and earthy aji panca, red onion, celery, chicken stock, and wine vinegar. served with egg and peruvian black olive", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 651, "description1": "Escabeche Pesc ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 259, "description1": "Estofado de Carne", "description2": "", "price1": 21.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 650, "description1": "Estofado de Carne E", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 183, "description1": "Estofado de Pato", "description2": "", "price1": 30.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 214, "description1": "Sudado Pescado Rued", "description2": "", "price1": 22.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 178, "description1": "Estofado de Pollo", "description2": "", "price1": 20.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 296, "description1": "Estofado de Pollo E", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 560, "description1": "Fetuccini Alfredo", "description2": "", "price1": 23.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 45, "description1": "Fetuccini Alfredo ", "description2": "Fetuccini pasta covered with our homemade alfredo sauce and ham finished with freshly chopped parsley", "price1": 18.0, "price2": 0, "category1": "Kids Menu", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 636, "description1": "Fetuccini Camaron E", "description2": "Fetuccini pasta with shrimps covered with our homemade alfredo sauce and ham finished with freshly chopped parsley", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 637, "description1": "Fetuccini Mariscos", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 222, "description1": "Chaufa de Camaron", "description2": "Peruvian style fried rice of Shrimps. Woked with eggs, soy sauce, ginger, spring onions, garlic and finished with wanton crackers covered with our homemade Tamarind sauce.", "price1": 31.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 635, "description1": "Fetuccini Pollo ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 641, "description1": "Filet a la Meniere", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 668, "description1": "Filet Frito al Ajo", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 227, "description1": "Pescado Entero Mach", "description2": "", "price1": 48.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 228, "description1": "Pes Entero Chorrill", "description2": "", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 49, "description1": "Filet Pescado al Ajo", "description2": "", "price1": 26.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 642, "description1": "Filet Salsa Macho E", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 210, "description1": "Filete a la Chorrillana", "description2": "", "price1": 24.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 205, "description1": "Filete a la Meniere", "description2": "", "price1": 24.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 235, "description1": "Saltado Pescado Pob", "description2": "", "price1": 29.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 236, "description1": "Pescado en Rueda Fr", "description2": "", "price1": 21.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 640, "description1": "Filete Chorrillana", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 238, "description1": "Palta Rellena", "description2": "", "price1": 14.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 239, "description1": "Carapulcra de Cerdo", "description2": "", "price1": 21.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 200, "description1": "Filete de Pescado a la Plancha", "description2": "", "price1": 24.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 209, "description1": "Filete de Pescado Frito", "description2": "", "price1": 23.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 243, "description1": "Tacu Lomo a lo Pobr", "description2": "", "price1": 32.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 244, "description1": "Tacu Lomito a lo Po", "description2": "", "price1": 35.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 246, "description1": "Aeropuerto Carne/Po", "description2": "", "price1": 28.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 638, "description1": "Filete Pesc Frito E", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 639, "description1": "Filete Pesc Macho E", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 440, "description1": "Fruit Punch", "description2": "", "price1": 6.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 107, "description1": "Fuze Tea", "description2": "", "price1": 3.75, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 93, "description1": "Heineken", "description2": "", "price1": 6.75, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 11, "syscode": 576, "description1": "Hervido de Carne GR", "description2": "", "price1": 16.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 577, "description1": "Hervido de Carne PE", "description2": "", "price1": 11.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 1, "description1": "Inca Kola", "description2": "Peruvian Soft Drink", "price1": 5.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 207, "description1": "Jalea de Calamares", "description2": "", "price1": 30.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 206, "description1": "Jalea de Camarones", "description2": "Fried Jumbo Shrimps served with french fries and the Peruvian Style \"creole Sarsa\" a flavorful mini sald made with red onions, tomatoes, cilantro, lime juice and salt. Topped with \"cancha\" or toasted peruvian maize grains and fresh Tartar sauce on the side.", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 79, "description1": "Jalea de Pescado", "description2": "", "price1": 24.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 118, "description1": "Jalea de Pescado ES", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 80, "description1": "Jalea Mixta", "description2": "", "price1": 34.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 4, "description1": "Jugo de maracuya", "description2": "Passion Fruit juice", "price1": 6.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 31, "description1": "Leche de Tigre", "description2": "A true Peruvian Classic! Smaller concentrated portion of the traditional peruvian \"ceviche\" with grouper, covered with a generous portion of pure ceviche juice and served with red onions. Cancha or toasted peruvian maize grains and chopped cilantro", "price1": 17.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 3, "description1": "Limonada", "description2": "fresh lime juice", "price1": 5.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 264, "description1": "Cafe Regular", "description2": "", "price1": 3.75, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 265, "description1": "Cafe Espresso", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 266, "description1": "Capuchino", "description2": "", "price1": 4.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 267, "description1": "Te Verde", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 268, "description1": "Te Regular", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 269, "description1": "Te Manzanilla", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 10, "description1": "Limonada Jarra", "description2": "Fresh Lima Juice Pitcher", "price1": 17.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 271, "description1": "Descorche", "description2": "", "price1": 15.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 58, "description1": "LOMITO a lo Pobre", "description2": "", "price1": 34.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 54, "description1": "LOMITO Saltado", "description2": "Tenderloin sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 31.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 627, "description1": "Lomo Saltado ESP", "description2": "Beef Striploin sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 276, "description1": "Arroz Amarillo", "description2": "", "price1": 7.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 55, "description1": "Lomo saltado", "description2": "Beef Striploin sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 26.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 57, "description1": "Lomo Saltado Pobre", "description2": "\"Alo pobre Style\" (fried egg and plantain) beef striploin sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 30.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 11, "description1": "Maracuya Jarra", "description2": "Passion Fruit Juice Pitcher", "price1": 21.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 158, "description1": "Mazamorra Morada", "description2": "", "price1": 7.5, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 171, "description1": "Milanesa de Pollo", "description2": "", "price1": 23.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 661, "description1": "Milanesa Pollo ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 284, "description1": "Huevo Frito", "description2": "", "price1": 3.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 250, "description1": "Mondonguito a la Italiana", "description2": "", "price1": 20.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 299, "description1": "Mondonguito Italia", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 373, "description1": "Olluquito ", "description2": "", "price1": 29.0, "price2": 0, "category1": "MENU DOMINGO", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 254, "description1": "Olluquito con Carne", "description2": "", "price1": 20.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 643, "description1": "Olluquito de Carne", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 261, "description1": "Pachamanca a la Olla", "description2": "", "price1": 26.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 22, "description1": "Papa a la Huancaina", "description2": " Tiny Siliced boiled poteatoes generously covered with our homemade creamy \"Huancaina\" sauce, accompanied with lettuce and topped with black olives and slices of hard-boiled egg", "price1": 18.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 279, "description1": "Papas al Vapor", "description2": "", "price1": 4.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 16, "description1": "Papas Fritas", "description2": "French fries", "price1": 6.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 592, "description1": "Parihuela Mariscos Grande", "description2": "", "price1": 31.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 593, "description1": "Parihuela Mariscos Pequena", "description2": "", "price1": 20.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 255, "description1": "Parrillada Peruana", "description2": "", "price1": 27.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 529, "description1": "Patacones", "description2": "", "price1": 7.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 302, "description1": "Cebiche Pescado c/", "description2": "", "price1": 27.5, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 303, "description1": "Cebiche Mixto c/ P.", "description2": "", "price1": 36.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 304, "description1": "Arroz a la Cubana", "description2": "", "price1": 12.5, "price2": 0, "category1": "Kids Menu", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 530, "description1": "Patacones con Queso", "description2": "", "price1": 9.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 173, "description1": "Pechuga a la Plancha", "description2": "Grilled Chicken breast served with french fries, white rice and lettuce salad, tomatoes and home made vinagrette", "price1": 21.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 175, "description1": "Pechuga a lo Pobre", "description2": "Grilled Chicken breast served with french fries, white rice, fried plantains, fried egg, and lettuce salad, tomatoes and home made vinagrette. ", "price1": 25.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 658, "description1": "Pechuga Plancha ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 78, "description1": "Pescado a lo Macho", "description2": "", "price1": 38.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 318, "description1": "Chaufa Marisco MO", "description2": "", "price1": 50.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 319, "description1": "Arroz con Pato MO", "description2": "", "price1": 50.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 320, "description1": "Aeropuerto Carne MO", "description2": "", "price1": 50.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 321, "description1": "Lomo Saltado MO", "description2": "", "price1": 50.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 322, "description1": "Saltado Pollo MO", "description2": "", "price1": 50.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 323, "description1": "Pescado a lo Macho", "description2": "", "price1": 50.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 324, "description1": "Quesillo MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 325, "description1": "Arroz con Leche MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 326, "description1": "Mazamorra Morada MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 334, "description1": "Patazca MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 335, "description1": "Caldo Gallina MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 336, "description1": "Parihuela Mariscos", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 337, "description1": "Papa Huancaina MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 338, "description1": "Cebiche Mixto MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 339, "description1": "Chicharron Calamar", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR1", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 340, "description1": "Parihuela Pescado M", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 341, "description1": "Caldo Gallina MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 342, "description1": "Cebiche Pescado MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 343, "description1": "Causa Pollo MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 344, "description1": "Choros Chalaca MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 345, "description1": "Jalea Pescado MP", "description2": "", "price1": 45.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 346, "description1": "Cabrito Nortena MP", "description2": "", "price1": 45.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 347, "description1": "Pachamanca Olla MP", "description2": "", "price1": 45.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 348, "description1": "Lomo Saltado MP", "description2": "", "price1": 45.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 349, "description1": "Saltado Pollo MP", "description2": "", "price1": 45.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 350, "description1": "Aeropuerto Carne MP", "description2": "", "price1": 45.0, "price2": 0, "category1": "NO USAR", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 351, "description1": "Quesillo MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 352, "description1": "Mazamorra Morada MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 353, "description1": "Arroz con Leche MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 357, "description1": "Anticucho /Chicha", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 358, "description1": "Anticucho/cerveza", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 359, "description1": "Cebiche Mini/ Chich", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 360, "description1": "Cebiche Mini/ Cerve", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 361, "description1": "Chich Calamar/ Chic", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 362, "description1": "Chich Calamar/ Cerv", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 363, "description1": "Choros Chalaca /Chi", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 364, "description1": "Choros Chalaca/ Cer", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 365, "description1": "Jalea Mini/ Chicha", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 366, "description1": "Jalea Mini/ Cerveza", "description2": "", "price1": 10.0, "price2": 0, "category1": "PIQUEOS 10", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 664, "description1": "Pescado Ent Chor ES", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 662, "description1": "Pescado Ent Frito E", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 225, "description1": "Pescado Entero Frito", "description2": "", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 226, "description1": "Pescado Entero Sudado", "description2": "", "price1": 33.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 292, "description1": "Pescado Rueda ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 673, "description1": "Picante d Mariscos Especial", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 211, "description1": "Picante de Camarones", "description2": "Stewed Jumbo Shrimps in traditional non-spicy \"Panca\" sauce, acompanied with white rice, egg and peruvian black olive.", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 374, "description1": "Papa y Causa Doming", "description2": "", "price1": 29.0, "price2": 0, "category1": "MENU DOMINGO", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 375, "description1": "Cambio x otro Arroz", "description2": "", "price1": 3.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 377, "description1": "Sangria Roja Copa", "description2": "", "price1": 11.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 378, "description1": "Sangria Roja Jarra", "description2": "", "price1": 38.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 381, "description1": "Pollada", "description2": "", "price1": 22.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 258, "description1": "Picante de Carne", "description2": "", "price1": 20.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 294, "description1": "Picante de Carne ES", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 233, "description1": "Picante de Mariscos", "description2": "", "price1": 29.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 388, "description1": "Parihuela Mar MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 389, "description1": "Aguadito Pollo Mo", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 390, "description1": "Cebiche Mixt Mo", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 391, "description1": "Causa de Pollo Mo", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 392, "description1": "Seco de Pato Mo", "description2": "", "price1": 45.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 393, "description1": "Salt de Pollo MO", "description2": "", "price1": 45.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 394, "description1": "Lomo Saltad Mo", "description2": "", "price1": 45.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 395, "description1": "Pescado Mach MO", "description2": "", "price1": 45.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 396, "description1": "Trucha Plancha MO", "description2": "", "price1": 45.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 397, "description1": "Quesill Mo", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 398, "description1": "Mazamorra Mor MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 399, "description1": "Arroz con Lech MO", "description2": "", "price1": 0.0, "price2": 0, "category1": "Dia Padre Or", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 400, "description1": "Parihuela Pescad MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 401, "description1": "Cebiche Pesc Mp", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 402, "description1": "Papa Huanca MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 403, "description1": "Jalea Pesca MP", "description2": "", "price1": 40.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 404, "description1": "Cabrito Norte MP", "description2": "", "price1": 40.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 405, "description1": "PArrillada Peruana", "description2": "", "price1": 40.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 406, "description1": "Saltado Poll MP", "description2": "", "price1": 40.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 407, "description1": "QuesilloMP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 408, "description1": "Mazamorra Mora MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 409, "description1": "Arroz c/ Leche MP", "description2": "", "price1": 0.0, "price2": 0, "category1": "NO USAR2", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 167, "description1": "Picarones", "description2": "", "price1": 10.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 14, "description1": "Platano Frito", "description2": "Fried Plantain", "price1": 6.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 417, "description1": "Tres Leches", "description2": "", "price1": 9.5, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 372, "description1": "Pollada ", "description2": "", "price1": 29.0, "price2": 0, "category1": "MENU DOMINGO", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 659, "description1": "Pollo Chorrillana", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 170, "description1": "Pollo a la Chorrillana", "description2": "Grilled chicken breast topped with Onion tomatoe and non-spicy Panca chilli sauce ", "price1": 21.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 428, "description1": "Chivas Regal", "description2": "", "price1": 9.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 429, "description1": "Cebiche Pesc Entrad", "description2": "", "price1": 40.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 430, "description1": "Sopa del dia", "description2": "", "price1": 40.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 431, "description1": "Wantanes Fritos", "description2": "", "price1": 40.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 432, "description1": "Lomo Saltado Nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 433, "description1": "Arroz c Mar nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 434, "description1": "Saltado Poll Nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 435, "description1": "Arroz c Leche nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 436, "description1": "Quesillo nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 437, "description1": "Helados nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 438, "description1": "Filet ajo Nav", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Navidad", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 180, "description1": "Pollo a la Olla", "description2": "", "price1": 20.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 649, "description1": "Pollo a la Olla ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 666, "description1": "Pollo al Cilindro", "description2": "", "price1": 20.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 444, "description1": "Ceviche", "description2": "", "price1": 0.0, "price2": 0, "category1": "Entrada V", "category2": "San Valentin", "tags": ""}, {"display": 0, "syscode": 445, "description1": "Papa Huanc", "description2": "", "price1": 0.0, "price2": 0, "category1": "Entrad", "category2": "San Valentin", "tags": ""}, {"display": 0, "syscode": 446, "description1": "Wantan", "description2": "", "price1": 0.0, "price2": 0, "category1": "Entrada V", "category2": "San Valentin", "tags": ""}, {"display": 0, "syscode": 447, "description1": "Saltado de Pollo V", "description2": "", "price1": 40.0, "price2": 0, "category1": "San Valentin", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 448, "description1": "Jalea de pescado V", "description2": "", "price1": 40.0, "price2": 0, "category1": "San Valentin", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 449, "description1": "Picante de Mariscos", "description2": "", "price1": 40.0, "price2": 0, "category1": "San Valentin", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 450, "description1": "Lomo Saltado V", "description2": "", "price1": 40.0, "price2": 0, "category1": "San Valentin", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 451, "description1": "Vino Copa V", "description2": "", "price1": 0.0, "price2": 0, "category1": "San Valentin", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 455, "description1": "Papa Huanc", "description2": "", "price1": 0.0, "price2": 0, "category1": "Madres", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 456, "description1": "Ceviche-Madres", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Mad", "category2": "Sopas", "tags": ""}, {"display": 0, "syscode": 457, "description1": "Wantan", "description2": "", "price1": 0.0, "price2": 0, "category1": "Madres", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 458, "description1": "Parihuela Maris-Mad", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Mad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 460, "description1": "Cabrito Norte\u00f1a-Mad", "description2": "", "price1": 55.0, "price2": 0, "category1": "Especial Mad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 461, "description1": "Chanfainita", "description2": "", "price1": 55.0, "price2": 0, "category1": "Madres", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 462, "description1": "Arroz Pollo/Pato-Ma", "description2": "", "price1": 55.0, "price2": 0, "category1": "Especial Mad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 464, "description1": "Cau Cau", "description2": "", "price1": 55.0, "price2": 0, "category1": "Madres", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 465, "description1": "Lomo Saltado", "description2": "", "price1": 55.0, "price2": 0, "category1": "Madr", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 466, "description1": "Arroz Mariscos", "description2": "", "price1": 55.0, "price2": 0, "category1": "Ma", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 468, "description1": "Vino", "description2": "", "price1": 0.0, "price2": 0, "category1": "Madres", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 469, "description1": "Quesillo", "description2": "", "price1": 0.0, "price2": 0, "category1": "Madres", "category2": "Especial Mad", "tags": ""}, {"display": 0, "syscode": 470, "description1": "CEVICHE FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 471, "description1": "PAPA A LA HUANCAINA", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 472, "description1": "AGUADITO DE POLLO F", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 473, "description1": "CHANFAINITA FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 474, "description1": "CAU-CAU FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 475, "description1": "ARROZ CON POLLO FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 476, "description1": "CARAPULCRA FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 477, "description1": "LOMO SALTADO FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 478, "description1": "TALLARIN VERDE FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 479, "description1": "AJI DE GALLINA FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 480, "description1": "JALEA DE PESCADO FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 481, "description1": "SUDADO DE PESCADO F", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 482, "description1": "MAZAMORRA MORADA FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial FP", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 483, "description1": "ARROZ CON LECHE FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial FP", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 484, "description1": "ARROZ CON MARISCOS", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 485, "description1": "SECO DE POLLO FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 486, "description1": "SECO DE CARNE FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 487, "description1": "PICANTE DE CARNE FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 488, "description1": "PICANTE DE MARISCOS", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 489, "description1": "CHAUFA DE POLLO FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 490, "description1": "CHAUFA DE CARNE FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 491, "description1": "SALTADO DE POLLO FP", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 492, "description1": "SALTADO DE PESCADO", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 493, "description1": "CHAUFA DE PESCADO F", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 494, "description1": "ESCABECHE DE POLLO", "description2": "", "price1": 18.5, "price2": 0, "category1": "Especial FP", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 497, "description1": "Almuerzo", "description2": "", "price1": 0.0, "price2": 0, "category1": "Comida", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 499, "description1": "Lunch Team", "description2": "", "price1": 0.0, "price2": 0, "category1": "Team El Chal", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 501, "description1": "Chardonnay Peru Cop", "description2": "", "price1": 10.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 502, "description1": "Syrah Peru Copa", "description2": "", "price1": 10.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 504, "description1": "Magdalena Peru Copa", "description2": "", "price1": 10.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 505, "description1": "Cabernet S Copa", "description2": "", "price1": 8.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 506, "description1": "Merlot Copa V", "description2": "", "price1": 9.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 507, "description1": "Chardonnay Copa V", "description2": "", "price1": 9.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 508, "description1": "White Zinfandel Cop", "description2": "", "price1": 8.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 509, "description1": "Syrah Botella", "description2": "", "price1": 50.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 510, "description1": "Chardonnay P Botell", "description2": "", "price1": 50.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 511, "description1": "Magdalena Botella", "description2": "", "price1": 50.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 512, "description1": "Shot Pisco", "description2": "", "price1": 10.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 513, "description1": "Cranberry", "description2": "", "price1": 4.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 514, "description1": "Pionono", "description2": "", "price1": 4.5, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 515, "description1": "Cheesecake de Pi\u00f1a", "description2": "", "price1": 10.5, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 519, "description1": "Fetuccin Alfredo Ca", "description2": "", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 523, "description1": "Picuda", "description2": "", "price1": 33.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 524, "description1": "Filete Mero a lo Ma", "description2": "", "price1": 42.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 525, "description1": "Mulato", "description2": "", "price1": 33.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 526, "description1": "Tamarindo", "description2": "", "price1": 3.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 527, "description1": "Aguacate", "description2": "", "price1": 6.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 528, "description1": "Salsa de Saltado", "description2": "", "price1": 4.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 177, "description1": "Pollo al Horno", "description2": "", "price1": 21.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 289, "description1": "Pollo al Horno ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 531, "description1": "Vinagreta", "description2": "", "price1": 3.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 532, "description1": "Zumo de Limon", "description2": "", "price1": 3.75, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 184, "description1": "Pollo al Siyao", "description2": "Chinese peruvian stew chicken ", "price1": 18.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 169, "description1": "Pollo Frito", "description2": "Classic Home made Fried Chicken served with white rice, french frice and fresh salad", "price1": 21.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 535, "description1": "Espresso c/ Leche", "description2": "", "price1": 3.75, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 536, "description1": "Cafe Regular c/ Lec", "description2": "", "price1": 4.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 70, "description1": "Pollo Saltado Pobre", "description2": "\"Alo pobre Style\" (fried egg and plantain) chicken sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 24.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 538, "description1": "Jampouw/Mero del di", "description2": "", "price1": 34.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 539, "description1": "Picante PEQ", "description2": "", "price1": 1.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 540, "description1": "Picante GR", "description2": "", "price1": 3.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 541, "description1": "Balashi", "description2": "", "price1": 4.75, "price2": 0, "category1": "Bebidas", "category2": "Cervezas", "tags": ""}, {"display": 0, "syscode": 543, "description1": "Pasco Special V", "description2": "", "price1": 40.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 544, "description1": "Pasco Special F", "description2": "", "price1": 40.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 547, "description1": "Inca Kola V", "description2": "", "price1": 0.0, "price2": 0, "category1": "San Valentin", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 548, "description1": "Alfajores 4 en 1", "description2": "", "price1": 5.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 552, "description1": "Sopa deldia tama\u00f1o", "description2": "", "price1": 6.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 273, "description1": "Porcion Frejol", "description2": "", "price1": 5.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 554, "description1": "Una bola de Vainill", "description2": "", "price1": 4.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 555, "description1": "Una bola de Napolit", "description2": "", "price1": 4.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 280, "description1": "Pure de Papa", "description2": "", "price1": 6.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 0, "syscode": 557, "description1": "Pink Moscato", "description2": "", "price1": 8.5, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 0, "syscode": 558, "description1": "Arroz con Leche-Mad", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Mad", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 559, "description1": "Jalea d Pescado-Mad", "description2": "", "price1": 55.0, "price2": 0, "category1": "Especial Mad", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 156, "description1": "Quesillo", "description2": "", "price1": 10.0, "price2": 0, "category1": "Postres", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 561, "description1": "Taza de Agua Calien", "description2": "", "price1": 2.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 562, "description1": "Fruit Punch Jarra", "description2": "", "price1": 21.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 563, "description1": "Te de Jengibre", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 0, "syscode": 565, "description1": "parihuela pes DP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 566, "description1": "cebiche de pescado", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 567, "description1": "papa a la huanca DP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 568, "description1": "Jalea Pes DP", "description2": "", "price1": 45.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 569, "description1": "Cabrito DP", "description2": "", "price1": 45.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 570, "description1": "Parrillada DP", "description2": "", "price1": 45.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 571, "description1": "Saltado Pollo DP", "description2": "", "price1": 45.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 572, "description1": "Quesillo DP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 573, "description1": "Mazamorra DP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 574, "description1": "Arroz con Lech DP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Especial Pad", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 44, "description1": "Salchipapas", "description2": "Thiny sliced chicken sausages topped with ketchup and mustard served with french fries on the side and a lettuce salad, tomatoes and homemade vinagrette", "price1": 15.0, "price2": 0, "category1": "Kids Menu", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 191, "description1": "Salchipollo", "description2": "Thiny sliced chicken sausages and chicken chicharron pieces topped with ketchup and mustard served with french fries on the side and a lettuce salad, tomatoes and homemade vinagrette", "price1": 18.0, "price2": 0, "category1": "Kids Menu", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 281, "description1": "Salsa Criolla Roja", "description2": "", "price1": 4.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 386, "description1": "Salsa de Ajo", "description2": "", "price1": 4.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 629, "description1": "Saltado Vegetales Especial", "description2": "Vegetables sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 630, "description1": "Saltado de Mariscos Especial", "description2": "Seafood sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 660, "description1": "Saltado de Pescado Especial", "description2": "Fish sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 626, "description1": "Saltado de Pollo Especial", "description2": "Chicken sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 215, "description1": "Saltado de Calamares", "description2": "Squid sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 29.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 439, "description1": "Saltado de Camaron", "description2": "Shrimp sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 28.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 197, "description1": "Saltado de Camarones", "description2": "Shrimp sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 198, "description1": "Saltado de Mariscos", "description2": "Seafood sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 30.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 71, "description1": "Saltado de Pescado", "description2": "Fish sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 26.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 69, "description1": "Saltado de Pollo", "description2": "Chicken sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 21.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 382, "description1": "Saltado de Vegetales", "description2": "Vegetables sauteed in soy sauce with red onions, tomatoes, garlic, cumin served with rice and frecnh fries on the side and finished with freshly chopped cilantro", "price1": 19.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 282, "description1": "Sarsa Cebolla", "description2": "red onion, tomatoe and cilantro marinated in lemon juice", "price1": 4.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 11, "syscode": 257, "description1": "Seco a la Huachana", "description2": "", "price1": 23.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 553, "description1": "Seco d Pollo ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 251, "description1": "Seco de Carne", "description2": "", "price1": 26.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 594, "description1": "Sopa de Carne PEQ", "description2": "", "price1": 11.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 595, "description1": "Sopa de Carne GRD", "description2": "", "price1": 16.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 416, "description1": "Seco de Carne ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 575, "description1": "Seco de Carnero", "description2": "", "price1": 32.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 598, "description1": "Chicharron Calamar", "description2": "", "price1": 45.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 599, "description1": "Ceviche Esp", "description2": "", "price1": 25.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 600, "description1": "Lomo Salt Esp", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 601, "description1": "Chicharron Pollo es", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 602, "description1": "Jalea de Pescado Es", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 603, "description1": "Quesillo espe", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 604, "description1": "Papa Huancaina FP", "description2": "", "price1": 30.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 605, "description1": "Cebiche de Pescado", "description2": "", "price1": 30.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 606, "description1": "Aguadito Pollo FP", "description2": "", "price1": 30.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 607, "description1": "Arroz Pollo FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 608, "description1": "Cau Cau FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 609, "description1": "Asado con Pure FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 610, "description1": "Seco Pollo FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 611, "description1": "Jalea Pescado FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 612, "description1": "Lomo Saltad FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 613, "description1": "Aji Gallina FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 614, "description1": "Combinado FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Postres", "tags": ""}, {"display": 0, "syscode": 615, "description1": "Anticucho FP", "description2": "", "price1": 0.0, "price2": 0, "category1": "Fiestas Patr", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 616, "description1": "Parihuela de Pes PQ", "description2": "", "price1": 16.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 617, "description1": "Parihuela de Pes GR", "description2": "", "price1": 20.5, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 620, "description1": "Milanesa a lo Pobre", "description2": "", "price1": 27.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 81, "description1": "Seco de Pato", "description2": "", "price1": 30.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 623, "description1": "Extra", "description2": "", "price1": 3.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 84, "description1": "Seco de Pollo", "description2": "", "price1": 22.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 625, "description1": "Botella de Pisco", "description2": "", "price1": 60.0, "price2": 0, "category1": "Bebidas", "category2": "Licores", "tags": ""}, {"display": 11, "syscode": 286, "description1": "Seco Huachana ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 270, "description1": "Soda Water", "description2": "", "price1": 3.25, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 126, "description1": "Sopa a la Minuta Carne Grande", "description2": "chopped beef, aromatics, and spaghetti in a clear broth with the addition of milk and some beaten egg. It\u2019s like a combination of egg drop soup, chowder, and beef and noodle soup.", "price1": 17.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 127, "description1": "Sopa a la Minuta Carne Pequena", "description2": "chopped beef, aromatics, and spaghetti in a clear broth with the addition of milk and some beaten egg. It\u2019s like a combination of egg drop soup, chowder, and beef and noodle soup.", "price1": 12.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 597, "description1": "Sopa de Pollo Grande", "description2": "Homemade chicken soup", "price1": 16.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 596, "description1": "Sopa de Pollo Pequena", "description2": "Homemade chicken soup", "price1": 9.75, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 581, "description1": "Sopa Wantan GR", "description2": "Peruvian style Wanton Soup", "price1": 16.0, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 580, "description1": "Sopa Wantan PQ", "description2": "Peruvian style Wanton Soup", "price1": 9.75, "price2": 0, "category1": "Sopas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 106, "description1": "Sprite", "description2": "", "price1": 3.5, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 1, "syscode": 212, "description1": "Sudado de Filete de Pescado", "description2": "", "price1": 25.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 652, "description1": "Sudado Filet ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 232, "description1": "Sudado Mixto", "description2": "", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 663, "description1": "Sudado Pesc Ent ESP", "description2": "", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 223, "description1": "Tacu con Picante de Camaron", "description2": "A creamy Shrimp stewed based on our non-spicy \"Panca\" chilli, non-spicy yellow chilli, white wine, milk, garlic and acompanied with withe rice and finished with freshly chopped parsley. Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection. ", "price1": 34.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 203, "description1": "Tacu Pescado a la Plancha", "description2": "Fish Filet Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection.", "price1": 27.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 65, "description1": "Tacu Tacu con Lomito Saltado", "description2": "Our tenderloin \"Lomo Saltado\" accompanied with a generous portion of \"Tacu\" or peruvian rice and beans toasted to perfection.", "price1": 33.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 309, "description1": "Tacu Tacu c/ Bistec", "description2": "Rib eye Steak Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection.", "price1": 24.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 665, "description1": "Tacu Tacu c/ Filet a la plancha Especial", "description2": "Fish Filet Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection.", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 248, "description1": "Tacu Tacu con Churrasco", "description2": "Grilled to perfection Beefsteak Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection.", "price1": 30.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 174, "description1": "Tacu Tacu con Pechuga a la Plancha", "description2": "Grilled chicken breast Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection.", "price1": 23.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 87, "description1": "Tacu Tacu con Picante de Mariscos", "description2": "A creamy Seafood stewed based on our non-spicy \"Panca\" chilli, non-spicy yellow chilli, white wine, milk, garlic and acompanied with withe rice and finished with freshly chopped parsley. Acompanied with a generous portion of \"tacu\" a peruvian style rice & beans toasted to perfection. ", "price1": 33.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 185, "description1": "Tacu Tacu con Saltado Pollo", "description2": "Our \"Saltado de Pollo\" accompanied with a generous portion of \"Tacu\" or peruvian rice and beans toasted to perfection.", "price1": 23.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 621, "description1": "Tacu Tacu con Sarsa Cebolla", "description2": "Peruvian style rice and beans toasted to perfection acompanied of Sarsa de Cebolla", "price1": 14.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 64, "description1": "Tacu Tacu Lomo Saltado", "description2": "Our \"Lomo Saltado\" accompanied with a generous portion of \"Tacu\" or peruvian rice and beans toasted to perfection.", "price1": 29.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 670, "description1": "Tallarin Rojo Pollo Especial", "description2": "Peruvian Style chicken ", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 645, "description1": "Tallarin Saltado de Carne Especial", "description2": "Sauteed Beef StripLoin in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 646, "description1": "Tallarin Saltado de Mariscos Especial", "description2": "Sauteed Seafood in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 644, "description1": "Tallarin Saltado de Pollo Especial", "description2": "Sauteed Chicken in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 59, "description1": "Tallarin Saltado de Carne", "description2": "Sauteed beef striploin in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 25.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 217, "description1": "Tallarin Saltado de Camarones", "description2": "Sauteed Jumbo Shrimps in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 32.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 241, "description1": "Tallarin Saltado de Carne y Pollo", "description2": "Sauteed beef striploin and chicken in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 24.5, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 242, "description1": "Tallarin Saltado de Lomito", "description2": "Sauteed Tenderloin in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 30.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 216, "description1": "Tallarin Saltado de Mariscos", "description2": "Sauteed Seafood in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro", "price1": 30.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 73, "description1": "Tallarin Saltado de Pollo", "description2": "Sauteed Chicken in soy sauce together with red onions, bell peppers, tomatoes, garlic, cumin, black peppers, mixed with linguini and topped with freshly chopped cilantro.", "price1": 22.5, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 647, "description1": "Tallarin Verde con Bistec Especial", "description2": "Peruvian-style spaghetti pesto Creamier and milder than the Italian version, this pesto pasta is often served in typical Peruvian style with beefsteak", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 648, "description1": "Tallarin Verde con Pechuga de Pollo Especial", "description2": "Peruvian-style spaghetti pesto Creamier and milder than the Italian version, this pesto pasta is often served in typical Peruvian style with grilled chicken breast", "price1": 15.9, "price2": 0, "category1": "Especiales", "category2": "Comidas", "tags": ""}, {"display": 11, "syscode": 252, "description1": "Tallarin Verde con Churrasco", "description2": "Peruvian-style spaghetti pesto Creamier and milder than the Italian version, this pesto pasta is often served in typical Peruvian style with grilled Beefsteak", "price1": 29.0, "price2": 0, "category1": "Carnes", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 189, "description1": "Tallarin Verde con pechuga de Pollo", "description2": "Peruvian-style spaghetti pesto Creamier and milder than the Italian version, this pesto pasta is often served in typical Peruvian style with grilled chicken breast", "price1": 22.0, "price2": 0, "category1": "Aves", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 168, "description1": "Tartara", "description2": "", "price1": 3.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 624, "description1": "Te Regular Frio", "description2": "", "price1": 4.0, "price2": 0, "category1": "Bebidas", "category2": "Bebidas", "tags": ""}, {"display": 11, "syscode": 30, "description1": "Tiradito de pescado", "description2": "Grouper strip \"ceviche\" mixed with non-spicy yellow chilli sauce, non-spicy \"rocoto\" chilli, celery, ginger, milk cream, lime juice, accompanied with boiled cassava and finished with freshly chopped parsley", "price1": 30.0, "price2": 0, "category1": "Pescado/Mari", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 20, "description1": "Wantanes Rellenos", "description2": "Peruvian Fried wontons filled with chicken and served with our homemade tamarind sauce", "price1": 12.0, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 0, "syscode": 669, "description1": "Copa de Vino Esp", "description2": "", "price1": 0.0, "price2": 0, "category1": "Menu Jacky", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 237, "description1": "Yuca a la Huancaina", "description2": "", "price1": 18.5, "price2": 0, "category1": "Entradas", "category2": "Comidas", "tags": ""}, {"display": 1, "syscode": 13, "description1": "Yuca Frita", "description2": "Fried Yucca", "price1": 7.0, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}, {"display": 1, "syscode": 278, "description1": "Yuca Hervida", "description2": "", "price1": 6.5, "price2": 0, "category1": "Acompa\u00f1antes", "category2": "Extras", "tags": ""}] \ No newline at end of file diff --git a/integrator/data/out/.gitignore b/integrator/data/out/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/integrator/etls/__init__.py b/integrator/etls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/etls/eduardoaf/__init__.py b/integrator/etls/eduardoaf/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/etls/eduardoaf/eduardoaf.py b/integrator/etls/eduardoaf/eduardoaf.py new file mode 100644 index 00000000..b8fad308 --- /dev/null +++ b/integrator/etls/eduardoaf/eduardoaf.py @@ -0,0 +1,12 @@ +# integrator/etls/eduardoaf/eduardoaf.py +import sys +from core.etl import Etl + +# ============================================= +# OLD a IMP +# ============================================= +etl1 = Etl("eduardoaf.json","transfer-old-current") + + +etl1.transfer() + diff --git a/integrator/etls/elchalan/__init__.py b/integrator/etls/elchalan/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/integrator/etls/elchalan/elchalan.py b/integrator/etls/elchalan/elchalan.py new file mode 100644 index 00000000..2e463cc1 --- /dev/null +++ b/integrator/etls/elchalan/elchalan.py @@ -0,0 +1,44 @@ +import sys +from core.etl import Etl + +# 1: vuelca datos desde archivo, 2: usa gdocs +option = 1 + +# ============================================= +# SOURCE a IMP TABLE +# ============================================= +if option==1: + # lee config/mapping/ + etl1 = Etl("elchalan.json","json-to-imp-products") + etl1.add_query("UPDATE imp_product SET description_full=NULL WHERE description_full='NULL'") + etl1.add_query("UPDATE imp_product SET description_full=NULL WHERE trim(description_full)=''") + # etl1.add_query("UPDATE imp_product SET error=1") + #etl1.transfer() + +# hace petición a API google sheet +if option==2: + etl1 = Etl("elchalan.json","gsheet-to-imp-products") + +etl1.transfer() + +# ============================================= +# imagenes +# ============================================= +etl1 = Etl("elchalan.json","products-pictures-to-db") +#etl1.transfer() + +# ============================================= +# IMP a APP +# ============================================= +etl1 = Etl("elchalan.json","transfer-imp-to-app") +etl1.add_query("UPDATE app_product SET code_cache=uuid() WHERE code_cache IS NULL") +etl1.add_query(""" +UPDATE app_product +SET code_cache = CONCAT(code_cache,'-',LPAD(id,8,0)) +WHERE 1 +AND LENGTH(code_cache)=36 +""") +etl1.add_query("UPDATE app_product SET description_full = description WHERE description_full IS NULL OR description_full='null'") +etl1.add_query("UPDATE app_product SET description = LOWER(description), description_full = LOWER(description_full)") +etl1.transfer() + diff --git a/integrator/main.py b/integrator/main.py new file mode 100644 index 00000000..ad3a46fe --- /dev/null +++ b/integrator/main.py @@ -0,0 +1,6 @@ +print("main.py") +# from etls.elchalan.elchalan import etl1 +from etls.eduardoaf.eduardoaf import etl1 + +#objetl.transfer() +#objetl2.transfer() \ No newline at end of file diff --git a/integrator/setup.py b/integrator/setup.py new file mode 100644 index 00000000..babf3410 --- /dev/null +++ b/integrator/setup.py @@ -0,0 +1,2 @@ +from setuptools import setup, find_packages +setup(name='integrator', version='1.0', packages=find_packages()) \ No newline at end of file diff --git a/integrator/tests/bootstrap.py b/integrator/tests/bootstrap.py new file mode 100644 index 00000000..a4243ce5 --- /dev/null +++ b/integrator/tests/bootstrap.py @@ -0,0 +1,21 @@ +print("bootstrap.py hack core loader") +# agrega el dicrectorio tests a la ruta de sistema de modo que este pueda ver los otros módulos + +# hack para importar +#if __name__ == "__main__" and __package__ is None: +import sys +from sys import path +from os.path import dirname as dir + +# print(path[0]); sys.exit() +path.append(dir(path[0])) +# __package__ = "core" + +import warnings + +def decorator_warnings(fn_method): + def fn_final(self, *args, **kwargs): + #with warnings.catch_warnings(): + #warnings.simplefilter("ignore") + fn_method(self, *args, **kwargs) + return fn_final \ No newline at end of file diff --git a/integrator/tests/testmysql.py b/integrator/tests/testmysql.py new file mode 100644 index 00000000..f1132530 --- /dev/null +++ b/integrator/tests/testmysql.py @@ -0,0 +1,61 @@ +import unittest + +#import datetime +from bootstrap import decorator_warnings +from core.helpers.mysqlserv.mysql import Mysql +from core.tools.tools import prn + +class MysqlTest(unittest.TestCase): + + _dbconf = {'host': 'localhost', 'port': '3306', 'user': 'root', 'password': '1234', 'database': 'db_eduardoaf'} + + @decorator_warnings + def test_truncate(self): + diccfg = self._dbconf + omysql = Mysql(diccfg) + + sql = "TRUNCATE TABLE imp_post" + + prn(sql,"test_truncate") + omysql.execute(sql) + omysql.commit().close() + + + @decorator_warnings + def test_insert(self): + diccfg = self._dbconf + omysql = Mysql(diccfg) + + sql = "INSERT INTO imp_post (publish_date, last_update, title, content, excerpt, id_status, slug) VALUES ( %s, %s, %s, %s, %s, %s, %s )" + prn(sql,"test_insert") + + lastid = omysql.insert_tpl(sql, + ( + "pd", + "lu", + 'a','b','c','d','e', + ) + ) + omysql.commit().close() + self.assertGreater(lastid, 0, "assert insert") + + + @decorator_warnings + def test_select(self): + diccfg = self._dbconf + omysql = Mysql(diccfg) + + sql = "SELECT * FROM imp_post WHERE title='a'" + prn(sql,"test_select") + + r = omysql.query(sql) + prn(r, "result") + omysql.close() + + ilen = 0 if r is None else len(r) + self.assertGreater(ilen, 0, "assert select") + + +if __name__ == "__main__": + # o = MysqlTest();o.test_truncate();o.test_insert();o.test_select() + unittest.main() \ No newline at end of file diff --git a/json-tools/extact-keys.py b/json-tools/extact-keys.py new file mode 100644 index 00000000..9128c66a --- /dev/null +++ b/json-tools/extact-keys.py @@ -0,0 +1,28 @@ +import json + +path_json = "/Users/eduardoacevedo/projects/temper/json/a.json" + +def file_get_contents(filename): + with open(filename, 'r') as f: + # Cargar el contenido del archivo en una variable de Python + datos = json.load(f) + return datos + +data = file_get_contents(path_json) + +# Extraer las claves +keys = set() +for value in data.values(): + if not hasattr(value, "keys"): + continue + + keys |= set(value.keys()) + + ks = value.keys() + for k in ks: + if not hasattr(value[k], "keys"): + continue + keys |= set(value[k].keys()) + +for k in keys: + print(k) diff --git a/lambdas/README.md b/lambdas/README.md new file mode 100644 index 00000000..445c1534 --- /dev/null +++ b/lambdas/README.md @@ -0,0 +1,9 @@ +- Comandos +``` +sam build MyFunctionB --template "$HOME/projects/prj_python37/lambdas/lambda-b/template.yaml" --build-dir "$HOME/projects/lambda-builds/prj-python/l-b" --use-container --debug +sam local invoke MyFunctionB --template "$HOME/projects/lambda-builds/prj-python/l-b/template.yaml" --event "$HOME/projects/prj_python37/lambdas/lambda-b/input.json" --debug +sam local start-lambda -p 3050 --template "$HOME/projects/lambda-builds/prj-python/l-b/template.yaml" --debug + +sam build MyFunctionA --template "$HOME/projects/prj_python37/lambdas/lambda-a/template.yaml" --build-dir "$HOME/projects/lambda-builds/prj-python/l-a" --use-container --debug +sam local invoke MyFunctionA --template "$HOME/projects/lambda-builds/prj-python/l-a/template.yaml" --event "$HOME/projects/prj_python37/lambdas/lambda-a/input.json" --debug +``` diff --git a/lambdas/hello-world/.gitignore b/lambdas/hello-world/.gitignore new file mode 100644 index 00000000..4808264d --- /dev/null +++ b/lambdas/hello-world/.gitignore @@ -0,0 +1,244 @@ + +# Created by https://www.gitignore.io/api/osx,linux,python,windows,pycharm,visualstudiocode + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### OSX ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Ruby plugin and RubyMine +/.rakeTasks + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +.pytest_cache/ +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule.* + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Build folder + +*/build/* + +# End of https://www.gitignore.io/api/osx,linux,python,windows,pycharm,visualstudiocode \ No newline at end of file diff --git a/lambdas/hello-world/README.md b/lambdas/hello-world/README.md new file mode 100644 index 00000000..6e6318a6 --- /dev/null +++ b/lambdas/hello-world/README.md @@ -0,0 +1,119 @@ +# test1 + +This project contains source code and supporting files for a serverless application that you can deploy with the SAM CLI. It includes the following files and folders. + +- hello_world - Code for the application's Lambda function. +- events - Invocation events that you can use to invoke the function. +- tests - Unit tests for the application code. +- template.yaml - A template that defines the application's AWS resources. + +The application uses several AWS resources, including Lambda functions and an API Gateway API. These resources are defined in the `template.yaml` file in this project. You can update the template to add AWS resources through the same deployment process that updates your application code. + +If you prefer to use an integrated development environment (IDE) to build and test your application, you can use the AWS Toolkit. +The AWS Toolkit is an open source plug-in for popular IDEs that uses the SAM CLI to build and deploy serverless applications on AWS. The AWS Toolkit also adds a simplified step-through debugging experience for Lambda function code. See the following links to get started. + +* [PyCharm](https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/welcome.html) +* [IntelliJ](https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/welcome.html) +* [VS Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html) +* [Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) + +## Deploy the sample application + +The Serverless Application Model Command Line Interface (SAM CLI) is an extension of the AWS CLI that adds functionality for building and testing Lambda applications. It uses Docker to run your functions in an Amazon Linux environment that matches Lambda. It can also emulate your application's build environment and API. + +To use the SAM CLI, you need the following tools. + +* SAM CLI - [Install the SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) +* [Python 3 installed](https://www.python.org/downloads/) +* Docker - [Install Docker community edition](https://hub.docker.com/search/?type=edition&offering=community) + +To build and deploy your application for the first time, run the following in your shell: + +```bash +sam build --use-container +sam deploy --guided +``` + +The first command will build the source of your application. The second command will package and deploy your application to AWS, with a series of prompts: + +* **Stack Name**: The name of the stack to deploy to CloudFormation. This should be unique to your account and region, and a good starting point would be something matching your project name. +* **AWS Region**: The AWS region you want to deploy your app to. +* **Confirm changes before deploy**: If set to yes, any change sets will be shown to you before execution for manual review. If set to no, the AWS SAM CLI will automatically deploy application changes. +* **Allow SAM CLI IAM role creation**: Many AWS SAM templates, including this example, create AWS IAM roles required for the AWS Lambda function(s) included to access AWS services. By default, these are scoped down to minimum required permissions. To deploy an AWS CloudFormation stack which creates or modified IAM roles, the `CAPABILITY_IAM` value for `capabilities` must be provided. If permission isn't provided through this prompt, to deploy this example you must explicitly pass `--capabilities CAPABILITY_IAM` to the `sam deploy` command. +* **Save arguments to samconfig.toml**: If set to yes, your choices will be saved to a configuration file inside the project, so that in the future you can just re-run `sam deploy` without parameters to deploy changes to your application. + +You can find your API Gateway Endpoint URL in the output values displayed after deployment. + +## Use the SAM CLI to build and test locally + +Build your application with the `sam build --use-container` command. + +```bash +test1$ sam build --use-container +``` + +The SAM CLI installs dependencies defined in `hello_world/requirements.txt`, creates a deployment package, and saves it in the `.aws-sam/build` folder. + +Test a single function by invoking it directly with a test event. An event is a JSON document that represents the input that the function receives from the event source. Test events are included in the `events` folder in this project. + +Run functions locally and invoke them with the `sam local invoke` command. + +```bash +test1$ sam local invoke HelloWorldFunction --event events/event.json +``` + +The SAM CLI can also emulate your application's API. Use the `sam local start-api` to run the API locally on port 3000. + +```bash +test1$ sam local start-api +test1$ curl http://localhost:3000/ +``` + +The SAM CLI reads the application template to determine the API's routes and the functions that they invoke. The `Events` property on each function's definition includes the route and method for each path. + +```yaml + Events: + HelloWorld: + Type: Api + Properties: + Path: /hello + Method: get +``` + +## Add a resource to your application +The application template uses AWS Serverless Application Model (AWS SAM) to define application resources. AWS SAM is an extension of AWS CloudFormation with a simpler syntax for configuring common serverless application resources such as functions, triggers, and APIs. For resources not included in [the SAM specification](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md), you can use standard [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html) resource types. + +## Fetch, tail, and filter Lambda function logs + +To simplify troubleshooting, SAM CLI has a command called `sam logs`. `sam logs` lets you fetch logs generated by your deployed Lambda function from the command line. In addition to printing the logs on the terminal, this command has several nifty features to help you quickly find the bug. + +`NOTE`: This command works for all AWS Lambda functions; not just the ones you deploy using SAM. + +```bash +test1$ sam logs -n HelloWorldFunction --stack-name test1 --tail +``` + +You can find more information and examples about filtering Lambda function logs in the [SAM CLI Documentation](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html). + +## Unit tests + +Tests are defined in the `tests` folder in this project. Use PIP to install the [pytest](https://docs.pytest.org/en/latest/) and run unit tests. + +```bash +test1$ pip install pytest pytest-mock --user +test1$ python -m pytest tests/ -v +``` + +## Cleanup + +To delete the sample application that you created, use the AWS CLI. Assuming you used your project name for the stack name, you can run the following: + +```bash +aws cloudformation delete-stack --stack-name test1 +``` + +## Resources + +See the [AWS SAM developer guide](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) for an introduction to SAM specification, the SAM CLI, and serverless application concepts. + +Next, you can use AWS Serverless Application Repository to deploy ready to use Apps that go beyond hello world samples and learn how authors developed their applications: [AWS Serverless Application Repository main page](https://aws.amazon.com/serverless/serverlessrepo/) diff --git a/lambdas/hello-world/__init__.py b/lambdas/hello-world/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lambdas/hello-world/events/event.json b/lambdas/hello-world/events/event.json new file mode 100644 index 00000000..070ad8e0 --- /dev/null +++ b/lambdas/hello-world/events/event.json @@ -0,0 +1,62 @@ +{ + "body": "{\"message\": \"hello world\"}", + "resource": "/{proxy+}", + "path": "/path/to/resource", + "httpMethod": "POST", + "isBase64Encoded": false, + "queryStringParameters": { + "foo": "bar" + }, + "pathParameters": { + "proxy": "/path/to/resource" + }, + "stageVariables": { + "baz": "qux" + }, + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-Mobile-Viewer": "false", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Viewer-Country": "US", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/prod/path/to/resource", + "resourcePath": "/{proxy+}", + "httpMethod": "POST", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} diff --git a/lambdas/hello-world/hello_world/__init__.py b/lambdas/hello-world/hello_world/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lambdas/hello-world/hello_world/app.py b/lambdas/hello-world/hello_world/app.py new file mode 100644 index 00000000..09306203 --- /dev/null +++ b/lambdas/hello-world/hello_world/app.py @@ -0,0 +1,42 @@ +import json + +# import requests + + +def lambda_handler(event, context): + """Sample pure Lambda function + + Parameters + ---------- + event: dict, required + API Gateway Lambda Proxy Input Format + + Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format + + context: object, required + Lambda Context runtime methods and attributes + + Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html + + Returns + ------ + API Gateway Lambda Proxy Output Format: dict + + Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html + """ + + # try: + # ip = requests.get("http://checkip.amazonaws.com/") + # except requests.RequestException as e: + # # Send some context about this error to Lambda Logs + # print(e) + + # raise e + + return { + "statusCode": 200, + "body": json.dumps({ + "message": "hello world", + # "location": ip.text.replace("\n", "") + }), + } diff --git a/lambdas/hello-world/hello_world/requirements.txt b/lambdas/hello-world/hello_world/requirements.txt new file mode 100644 index 00000000..663bd1f6 --- /dev/null +++ b/lambdas/hello-world/hello_world/requirements.txt @@ -0,0 +1 @@ +requests \ No newline at end of file diff --git a/lambdas/hello-world/template.yaml b/lambdas/hello-world/template.yaml new file mode 100644 index 00000000..35af4def --- /dev/null +++ b/lambdas/hello-world/template.yaml @@ -0,0 +1,39 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: > + test1 + + Sample SAM Template for test1 + +# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst +Globals: + Function: + Timeout: 3 + +Resources: + HelloWorldFunction: + Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction + Properties: + CodeUri: hello_world/ + Handler: app.lambda_handler + Runtime: python3.7 + Events: + HelloWorld: + Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api + Properties: + Path: /hello + Method: get + +Outputs: + # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function + # Find out more about other implicit resources you can reference within SAM + # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api + HelloWorldApi: + Description: "API Gateway endpoint URL for Prod stage for Hello World function" + Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" + HelloWorldFunction: + Description: "Hello World Lambda Function ARN" + Value: !GetAtt HelloWorldFunction.Arn + HelloWorldFunctionIamRole: + Description: "Implicit IAM Role created for Hello World function" + Value: !GetAtt HelloWorldFunctionRole.Arn diff --git a/lambdas/hello-world/tests/__init__.py b/lambdas/hello-world/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lambdas/hello-world/tests/unit/__init__.py b/lambdas/hello-world/tests/unit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lambdas/hello-world/tests/unit/test_handler.py b/lambdas/hello-world/tests/unit/test_handler.py new file mode 100644 index 00000000..09588d37 --- /dev/null +++ b/lambdas/hello-world/tests/unit/test_handler.py @@ -0,0 +1,73 @@ +import json + +import pytest + +from hello_world import app + + +@pytest.fixture() +def apigw_event(): + """ Generates API GW Event""" + + return { + "body": '{ "test": "body"}', + "resource": "/{proxy+}", + "requestContext": { + "resourceId": "123456", + "apiId": "1234567890", + "resourcePath": "/{proxy+}", + "httpMethod": "POST", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "accountId": "123456789012", + "identity": { + "apiKey": "", + "userArn": "", + "cognitoAuthenticationType": "", + "caller": "", + "userAgent": "Custom User Agent String", + "user": "", + "cognitoIdentityPoolId": "", + "cognitoIdentityId": "", + "cognitoAuthenticationProvider": "", + "sourceIp": "127.0.0.1", + "accountId": "", + }, + "stage": "prod", + }, + "queryStringParameters": {"foo": "bar"}, + "headers": { + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "Accept-Language": "en-US,en;q=0.8", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Mobile-Viewer": "false", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "CloudFront-Viewer-Country": "US", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Upgrade-Insecure-Requests": "1", + "X-Forwarded-Port": "443", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "X-Forwarded-Proto": "https", + "X-Amz-Cf-Id": "aaaaaaaaaae3VYQb9jd-nvCd-de396Uhbp027Y2JvkCPNLmGJHqlaA==", + "CloudFront-Is-Tablet-Viewer": "false", + "Cache-Control": "max-age=0", + "User-Agent": "Custom User Agent String", + "CloudFront-Forwarded-Proto": "https", + "Accept-Encoding": "gzip, deflate, sdch", + }, + "pathParameters": {"proxy": "/examplepath"}, + "httpMethod": "POST", + "stageVariables": {"baz": "qux"}, + "path": "/examplepath", + } + + +def test_lambda_handler(apigw_event, mocker): + + ret = app.lambda_handler(apigw_event, "") + data = json.loads(ret["body"]) + + assert ret["statusCode"] == 200 + assert "message" in ret["body"] + assert data["message"] == "hello world" + # assert "location" in data.dict_keys() diff --git a/lambdas/lambda-a/function/__init__.py b/lambdas/lambda-a/function/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lambdas/lambda-a/function/index.py b/lambdas/lambda-a/function/index.py new file mode 100644 index 00000000..05759882 --- /dev/null +++ b/lambdas/lambda-a/function/index.py @@ -0,0 +1,57 @@ +from pprint import pprint +from datetime import datetime +import json +import boto3 +from botocore.config import Config + + +def get_boto_client(): + config_lambda = Config(retries={'total_max_attempts': 1}, read_timeout=1200) + return boto3.client( + 'lambda', + config=config_lambda, + # en mac + endpoint_url='http://host.docker.internal:3050', + # en windows + # endpoint_url='http://localhost:3050', + use_ssl=False, + verify=False, + ) + + +def fn_a(event, context): + pprint("fn_a ini") + now = datetime.utcnow().strftime("%Y-%m-%d-%H:%M:%S") + eventjson = json.dumps(event) + + try: + response = get_boto_client().invoke( + FunctionName="MyFunctionB", + InvocationType='RequestResponse', + #LogType='Tail', # no va en local + Payload=json.dumps({"from": "This is some payload for Lambda B"}) + ) + except Exception as ex: + ex = str(ex) + return { + "error": f"Error invoking Lambda B: {ex}" + } + + if response['StatusCode'] == 200: + payload = json.loads(response['Payload'].read()) + pprint(payload) + if "error" in payload: + return { + "error": f"Error response from Lambda B: {payload['error']}" + } + return { + "event": f"input event:\n {eventjson}", + "success": f"This is a response succes from Lambda A {now}", + "from-lambda-b": f"{payload['success']}" + } + else: + return { + "error": f"Error in response from Lambda B status: {response['StatusCode']}" + } + + diff --git a/lambdas/lambda-a/function/requirements.txt b/lambdas/lambda-a/function/requirements.txt new file mode 100644 index 00000000..1dd3d3cb --- /dev/null +++ b/lambdas/lambda-a/function/requirements.txt @@ -0,0 +1,2 @@ +requests +boto3==1.17.19 diff --git a/lambdas/lambda-a/input.json b/lambdas/lambda-a/input.json new file mode 100644 index 00000000..92aaf8e1 --- /dev/null +++ b/lambdas/lambda-a/input.json @@ -0,0 +1,3 @@ +{ + "input_for_a": "value for A" +} diff --git a/lambdas/lambda-a/template.yaml b/lambdas/lambda-a/template.yaml new file mode 100644 index 00000000..21f0027a --- /dev/null +++ b/lambdas/lambda-a/template.yaml @@ -0,0 +1,15 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Lambda A Template + +Globals: + Function: + Timeout: 600 + +Resources: + MyFunctionA: + Type: AWS::Serverless::Function + Properties: + CodeUri: function/ + Handler: index.fn_a + Runtime: python3.8 diff --git a/lambdas/lambda-b/function/__init__.py b/lambdas/lambda-b/function/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lambdas/lambda-b/function/index.py b/lambdas/lambda-b/function/index.py new file mode 100644 index 00000000..080859f9 --- /dev/null +++ b/lambdas/lambda-b/function/index.py @@ -0,0 +1,13 @@ +from pprint import pprint +from datetime import datetime +import json + + +def fn_b(event, context): + pprint("fn_b ini") + now = datetime.utcnow().strftime("%Y-%m-%d-%H:%M:%S") + eventjson = json.dumps(event) + return { + "event": f"input event:\n {eventjson}", + "success": f"This is a successfully response from Lambda B {now}", + } diff --git a/lambdas/lambda-b/function/requirements.txt b/lambdas/lambda-b/function/requirements.txt new file mode 100644 index 00000000..663bd1f6 --- /dev/null +++ b/lambdas/lambda-b/function/requirements.txt @@ -0,0 +1 @@ +requests \ No newline at end of file diff --git a/lambdas/lambda-b/input.json b/lambdas/lambda-b/input.json new file mode 100644 index 00000000..0c2af700 --- /dev/null +++ b/lambdas/lambda-b/input.json @@ -0,0 +1,3 @@ +{ + "input_for_b": "value for B" +} diff --git a/lambdas/lambda-b/template.yaml b/lambdas/lambda-b/template.yaml new file mode 100644 index 00000000..8d4215d2 --- /dev/null +++ b/lambdas/lambda-b/template.yaml @@ -0,0 +1,15 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Lambda B invokable + +Globals: + Function: + Timeout: 600 + +Resources: + MyFunctionB: + Type: AWS::Serverless::Function + Properties: + CodeUri: function/ + Handler: index.fn_b + Runtime: python3.8 diff --git a/lambdas/makefile b/lambdas/makefile new file mode 100644 index 00000000..84cdd2a7 --- /dev/null +++ b/lambdas/makefile @@ -0,0 +1,24 @@ +# lambdas launcher +start-api: + sam local start-api + +hw: + cd hello-world; sam local invoke HelloWorldFunction -e events/event.json + +a-build: + sam build MyFunctionA --template $(HOME)/projects/prj_python37/lambdas/lambda-a/template.yaml --build-dir $(HOME)/projects/lambda-builds/prj-python/l-a --use-container --debug + +a-invoke: + sam local invoke MyFunctionA --template $(HOME)/projects/lambda-builds/prj-python/l-a/template.yaml --event $(HOME)/projects/prj_python37/lambdas/lambda-a/input.json --debug + +a-start: + sam local start-lambda -p 3050 --template $(HOME)/projects/lambda-builds/prj-python/l-a/template.yaml --debug + +b-build: + sam build MyFunctionB --template $(HOME)/projects/prj_python37/lambdas/lambda-b/template.yaml --build-dir $(HOME)/projects/lambda-builds/prj-python/l-b --use-container --debug + +b-invoke: + sam local invoke MyFunctionB --template $(HOME)/projects/lambda-builds/prj-python/l-b/template.yaml --event $(HOME)/projects/prj_python37/lambdas/lambda-b/input.json --debug + +b-start: + sam local start-lambda -p 3050 --template $(HOME)/projects/lambda-builds/prj-python/l-b/template.yaml --debug diff --git a/lh_monitor/.gitignore b/lh_monitor/.gitignore new file mode 100644 index 00000000..2f9da1cb --- /dev/null +++ b/lh_monitor/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +venv +.idea +lh_monitor/config/config.py \ No newline at end of file diff --git a/lh_monitor/README.md b/lh_monitor/README.md new file mode 100644 index 00000000..28210cfb --- /dev/null +++ b/lh_monitor/README.md @@ -0,0 +1,3 @@ +- para que pycharm detecte la jerarquia de modulos se debe abrir la carpeta raiz como proyecto +- compilar: +- https://youtube.com/shorts/7vuukix1ebE?si=d9KaibIIB5zf0uMq \ No newline at end of file diff --git a/lh_monitor/docker-alpine/Dockerfile b/lh_monitor/docker-alpine/Dockerfile new file mode 100644 index 00000000..41e9e8d5 --- /dev/null +++ b/lh_monitor/docker-alpine/Dockerfile @@ -0,0 +1,160 @@ +# https://hub.docker.com/_/python +# https://github.com/docker-library/python/tree/bf5951cfa2b2f6c3dabf428549c9dca658ecee81/3.12/alpine3.19 +# 3.12/alpine3.19 +# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" +# +# PLEASE DO NOT EDIT IT DIRECTLY. +# + +FROM alpine:3.19 + +# ensure local python is preferred over distribution python +ENV PATH /usr/local/bin:$PATH + +# cannot remove LANG even though https://bugs.python.org/issue19846 is fixed +# last attempted removal of LANG broke many users: +# https://github.com/docker-library/python/pull/570 +ENV LANG C.UTF-8 + +# runtime dependencies +RUN set -eux; \ + apk add --no-cache \ + ca-certificates \ + tzdata \ + ; + +ENV GPG_KEY 7169605F62C751356D054A26A821E680E5FA6305 +ENV PYTHON_VERSION 3.12.3 + +RUN set -eux; \ + \ + apk add --no-cache --virtual .build-deps \ + gnupg \ + tar \ + xz \ + \ + bluez-dev \ + bzip2-dev \ + dpkg-dev dpkg \ + expat-dev \ + findutils \ + gcc \ + gdbm-dev \ + libc-dev \ + libffi-dev \ + libnsl-dev \ + libtirpc-dev \ + linux-headers \ + make \ + ncurses-dev \ + openssl-dev \ + pax-utils \ + readline-dev \ + sqlite-dev \ + tcl-dev \ + tk \ + tk-dev \ + util-linux-dev \ + xz-dev \ + zlib-dev \ + ; \ + \ + wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; \ + wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; \ + GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \ + gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; \ + gpg --batch --verify python.tar.xz.asc python.tar.xz; \ + gpgconf --kill all; \ + rm -rf "$GNUPGHOME" python.tar.xz.asc; \ + mkdir -p /usr/src/python; \ + tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; \ + rm python.tar.xz; \ + \ + cd /usr/src/python; \ + gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \ + ./configure \ + --build="$gnuArch" \ + --enable-loadable-sqlite-extensions \ + --enable-optimizations \ + --enable-option-checking=fatal \ + --enable-shared \ + --with-lto \ + --with-system-expat \ + --without-ensurepip \ + ; \ + nproc="$(nproc)"; \ +# set thread stack size to 1MB so we don't segfault before we hit sys.getrecursionlimit() +# https://github.com/alpinelinux/aports/commit/2026e1259422d4e0cf92391ca2d3844356c649d0 + EXTRA_CFLAGS="-DTHREAD_STACK_SIZE=0x100000"; \ + LDFLAGS="${LDFLAGS:--Wl},--strip-all"; \ + make -j "$nproc" \ + "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \ + "LDFLAGS=${LDFLAGS:-}" \ + "PROFILE_TASK=${PROFILE_TASK:-}" \ + ; \ +# https://github.com/docker-library/python/issues/784 +# prevent accidental usage of a system installed libpython of the same version + rm python; \ + make -j "$nproc" \ + "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \ + "LDFLAGS=${LDFLAGS:--Wl},-rpath='\$\$ORIGIN/../lib'" \ + "PROFILE_TASK=${PROFILE_TASK:-}" \ + python \ + ; \ + make install; \ + \ + cd /; \ + rm -rf /usr/src/python; \ + \ + find /usr/local -depth \ + \( \ + \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) \ + -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \ + \) -exec rm -rf '{}' + \ + ; \ + \ + find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec scanelf --needed --nobanner --format '%n#p' '{}' ';' \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ + | xargs -rt apk add --no-network --virtual .python-rundeps \ + ; \ + apk del --no-network .build-deps; \ + \ + python3 --version + +# make some useful symlinks that are expected to exist ("/usr/local/bin/python" and friends) +RUN set -eux; \ + for src in idle3 pydoc3 python3 python3-config; do \ + dst="$(echo "$src" | tr -d 3)"; \ + [ -s "/usr/local/bin/$src" ]; \ + [ ! -e "/usr/local/bin/$dst" ]; \ + ln -svT "$src" "/usr/local/bin/$dst"; \ + done + +# if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value ''" +ENV PYTHON_PIP_VERSION 24.0 +# https://github.com/pypa/get-pip +ENV PYTHON_GET_PIP_URL https://github.com/pypa/get-pip/raw/dbf0c85f76fb6e1ab42aa672ffca6f0a675d9ee4/public/get-pip.py +ENV PYTHON_GET_PIP_SHA256 dfe9fd5c28dc98b5ac17979a953ea550cec37ae1b47a5116007395bfacff2ab9 + +RUN set -eux; \ + \ + wget -O get-pip.py "$PYTHON_GET_PIP_URL"; \ + echo "$PYTHON_GET_PIP_SHA256 *get-pip.py" | sha256sum -c -; \ + \ + export PYTHONDONTWRITEBYTECODE=1; \ + \ + python get-pip.py \ + --disable-pip-version-check \ + --no-cache-dir \ + --no-compile \ + "pip==$PYTHON_PIP_VERSION" \ + ; \ + rm -f get-pip.py; \ + \ + pip --version + +# RUN mkdir lh_monitor + +CMD ["python3"] \ No newline at end of file diff --git a/lh_monitor/docker-compose.yml b/lh_monitor/docker-compose.yml new file mode 100644 index 00000000..673185ca --- /dev/null +++ b/lh_monitor/docker-compose.yml @@ -0,0 +1,9 @@ +version: "3.3" + +services: + service-py: + build: docker-alpine/ + container_name: cont-python-3x + hostname: host-python-3x + volumes: + - ./lh_monitor:/lh_monitor \ No newline at end of file diff --git a/lh_monitor/lh_monitor/__init__.py b/lh_monitor/lh_monitor/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/app_versions/__init__.py b/lh_monitor/lh_monitor/app_versions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/app_versions/application/__init__.py b/lh_monitor/lh_monitor/app_versions/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/app_versions/application/services/__init__.py b/lh_monitor/lh_monitor/app_versions/application/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/app_versions/application/services/get_versions_service.py b/lh_monitor/lh_monitor/app_versions/application/services/get_versions_service.py new file mode 100644 index 00000000..20b0a424 --- /dev/null +++ b/lh_monitor/lh_monitor/app_versions/application/services/get_versions_service.py @@ -0,0 +1,32 @@ +from lh_monitor.config.config import * +from lh_monitor.shared.infrastructure.http.requests.get_request import http_get +from lh_monitor.app_versions.application.versions_dto import VersionsDto + + +def _get_login() -> str: + return "" + + +def get_versions() -> VersionsDto: + try: + _get_login() + + url_health = (config.get(ConfigKeysEnum.ENVIRONMENTS.value, {}) + .get(ConfigEnvsEnum.PROD_MT.value, {}) + .get(ConfigUrlsEnum.URL_HEALTH.value, "")) + + # '{"code":200,"message":"OK","data":{"version":"RELEASE 4.0.2"}}' + response = http_get(url_health) + #response = http_get("https://eduardoafx.com") + code = response.get("code", "") + if code != 200: + version = "error -> " + response.get("message", "") + " | " + response.get("data", "") + return VersionsDto(version) + + data = response.get("data", {}) + version = data.get("version", "") + return VersionsDto(version) + + except Exception as e: + version = "error -> " + str(e) + return VersionsDto(version) diff --git a/lh_monitor/lh_monitor/app_versions/application/versions_dto.py b/lh_monitor/lh_monitor/app_versions/application/versions_dto.py new file mode 100644 index 00000000..02e6f017 --- /dev/null +++ b/lh_monitor/lh_monitor/app_versions/application/versions_dto.py @@ -0,0 +1,12 @@ +class VersionsDto: + def __init__(self, version: str): + self._version = version + + @property + def version(self): + return self._version + + def to_dict(self) -> dict: + return { + "version": self._version, + } \ No newline at end of file diff --git a/lh_monitor/lh_monitor/app_versions/domain/__init__.py b/lh_monitor/lh_monitor/app_versions/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/app_versions/infrastructure/__init__.py b/lh_monitor/lh_monitor/app_versions/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/config/__init__.py b/lh_monitor/lh_monitor/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/config/config.example.py b/lh_monitor/lh_monitor/config/config.example.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/main.py b/lh_monitor/lh_monitor/main.py new file mode 100644 index 00000000..fbf4bc8a --- /dev/null +++ b/lh_monitor/lh_monitor/main.py @@ -0,0 +1,146 @@ +""" +Demonstrates a Rich "application" using the Layout and Live classes. +https://rich.readthedocs.io/en/latest/tables.html?highlight=column#column-options +https://github.com/Textualize/rich/blob/master/examples/fullscreen.py +https://github.com/Textualize/rich/tree/master +""" +import sys; sys.path.append("..") + +from datetime import datetime + +from rich import box +from rich.align import Align +from rich.console import Group +from rich.layout import Layout +from rich.panel import Panel +from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn +from rich.table import Table + +from lh_monitor.app_versions.application.services.get_versions_service import get_versions + +#console = Console() + +#console.print("hello", style="bold red") + +vers = get_versions() + +def get_dashboard_layout() -> Layout: + """Define the layout.""" + dash_layout = Layout(name="root") + + dash_layout.split( + Layout(name="header", size=3), + Layout(name="body", ratio=1), + Layout(name="footer", size=7), + ) + + dash_layout["body"].split_row( + Layout(name="left-column"), + Layout(name="right-column", ratio=2, minimum_size=60), + ) + + + + # espacio de la izquierda se divide en dos + dash_layout["left-column"].split( + Layout(name="box1"), + Layout(name="box2") + ) + return dash_layout + + +class Header: + """Display header with clock.""" + + def __rich__(self) -> Panel: + header_table = Table.grid(expand=True) + header_table.add_column(justify="center", ratio=1) + header_table.add_column(justify="right") + header_table.add_row( + "[b]WinView[/b] monitoring system", + datetime.now().ctime().replace(":", "[blink]:[/]"), + ) + return Panel(header_table, style="black on yellow") + +def get_panel_sponsor() -> Panel: + """Some example content.""" + table_sponsor = Table.grid(padding=1) + table_sponsor.add_column(style="bold red", justify="right") + table_sponsor.add_column(no_wrap=True) + table_sponsor.add_row( + "Twitter", + "[u blue link=https://twitter.com/textualize]https://twitter.com/textualize", + ) + table_sponsor.add_row( + "CEO", + "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", + ) + table_sponsor.add_row( + "Textualize", "[u blue link=https://www.textualize.io]https://www.textualize.io" + ) + + panel_sponsor = Panel( + Align.center( + Group("\n", Align.center(table_sponsor)), + vertical="middle", + ), + box=box.ROUNDED, + padding=(1, 2), + title="[b red]Thanks for trying out Rich!", + border_style="bright_blue", + ) + return panel_sponsor + + +job_progress = Progress( + "{task.description}", + SpinnerColumn(), + BarColumn(), + TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), +) +job_progress.add_task("[green]Cooking") +job_progress.add_task("[magenta]Baking", total=200) +job_progress.add_task("[cyan]Mixing", total=400) + +overall_progress = Progress() +total_tasks = sum(task.total for task in job_progress.tasks) +overall_task = overall_progress.add_task("All Jobs", total=int(total_tasks)) + +progress_table = Table.grid(expand=True) +progress_table.add_row( + Panel( + overall_progress, + title="Overall Progress", + border_style="green", + padding=(2, 2), + ), + Panel( + job_progress, + title="[b]Jobs", + border_style="red", + padding=(1, 2) + ), +) + + +dashboard_layout = get_dashboard_layout() + +dashboard_layout["header"].update(Header()) +dashboard_layout["right-column"].update(get_panel_sponsor()) +#layout["box2"].update(Panel(make_syntax(), border_style="green")) +dashboard_layout["box1"].update(Panel(dashboard_layout.tree, border_style="red")) +dashboard_layout["footer"].update(progress_table) + + +from time import sleep +from rich.live import Live + +with Live(dashboard_layout, refresh_per_second=10, screen=True): + while not overall_progress.finished: + sleep(0.1) + for job in job_progress.tasks: + if not job.finished: + job_progress.advance(job.id) + + completed = sum(task.completed for task in job_progress.tasks) + overall_progress.update(overall_task, completed=completed) \ No newline at end of file diff --git a/lh_monitor/lh_monitor/shared/__init__.py b/lh_monitor/lh_monitor/shared/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/domain/__init__.py b/lh_monitor/lh_monitor/shared/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/__init__.py b/lh_monitor/lh_monitor/shared/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/dashboard.py b/lh_monitor/lh_monitor/shared/infrastructure/dashboard.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/http/__init__.py b/lh_monitor/lh_monitor/shared/infrastructure/http/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/http/requests/__init__.py b/lh_monitor/lh_monitor/shared/infrastructure/http/requests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/http/requests/get_request.py b/lh_monitor/lh_monitor/shared/infrastructure/http/requests/get_request.py new file mode 100644 index 00000000..34f421da --- /dev/null +++ b/lh_monitor/lh_monitor/shared/infrastructure/http/requests/get_request.py @@ -0,0 +1,14 @@ +import requests +import json + + +def http_get(url: str) -> dict: + response = requests.get(url) + return __get_text_as_dict(response.text) + + +def __get_text_as_dict(text: str) -> dict: + try: + return json.loads(text) + except Exception as e: + return {"error": str(e)} diff --git a/lh_monitor/lh_monitor/shared/infrastructure/shell/__init__.py b/lh_monitor/lh_monitor/shared/infrastructure/shell/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/shell/shell_exec.py b/lh_monitor/lh_monitor/shared/infrastructure/shell/shell_exec.py new file mode 100644 index 00000000..87d1c452 --- /dev/null +++ b/lh_monitor/lh_monitor/shared/infrastructure/shell/shell_exec.py @@ -0,0 +1,71 @@ +import subprocess + + +class ShellExecException(Exception): + @staticmethod + def fail_if_empty_commands(): + raise ShellExecException("No commands to execute") + + +class ShellExec: + def __init__(self): + self.commands = [] + self.one_line_command = "" + self.output = [] + self.result_code = 0 # ok + + @classmethod + def get_instance(cls): + return cls() + + def add_command(self, command): + self.commands.append(command) + return self + + def exec(self): + self._load_one_line_command() + if not self.one_line_command: + ShellExecException.fail_if_empty_commands() + + try: + process = subprocess.run( + self.one_line_command, + shell=True, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True + ) + self.output = process.stdout.splitlines() + except subprocess.CalledProcessError as ex: + self.result_code = 1 + self.output = ex.stderr.splitlines() + return self + + def _load_one_line_command(self): + if self.one_line_command: + return + + one_line_command = " ".join(self.commands) + self.one_line_command = one_line_command.strip() + + def get_output(self): + return self.output + + def is_error(self): + return bool(self.result_code) + + def print_debug_command(self): + self._load_one_line_command() + print(self.one_line_command) + + def get_command(self): + self._load_one_line_command() + return self.one_line_command + + def reset(self): + self.commands = [] + self.one_line_command = "" + self.output = [] + self.result_code = 0 + return self diff --git a/lh_monitor/lh_monitor/shared/infrastructure/views/__init__.py b/lh_monitor/lh_monitor/shared/infrastructure/views/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/lh_monitor/shared/infrastructure/views/view_dashboard.py b/lh_monitor/lh_monitor/shared/infrastructure/views/view_dashboard.py new file mode 100644 index 00000000..e69de29b diff --git a/lh_monitor/makefile b/lh_monitor/makefile new file mode 100644 index 00000000..d97e6bea --- /dev/null +++ b/lh_monitor/makefile @@ -0,0 +1,26 @@ +#!/bin/bash +TODAY := $(shell date +'%Y-%m-%d') +NOW := $(shell date +'%Y-%m-%d %H:%M:%S') + +help: ## Show this help message + @echo "usage: make [target]" + @echo + @echo "targets:" + @egrep "^(.+)\:\ ##\ (.+)" ${MAKEFILE_LIST} | column -t -c 2 -s ":#" + +gitpush: ## git push m=any message + clear; + git add .; git commit -m "$(m)"; git push; + +rebuild-all: ## rebuild all services containers in docker-compose + docker-compose -f docker-compose.yml down + docker-compose -f docker-compose.yml up -d --build --remove-orphans + docker ps + +lh-monitor: ## Run dashboard + clear; + @echo $(NOW) + + @export PYTHONPATH="${HOME}/projects/prj_python37/lh_monitor/lh_monitor" + @cd ${HOME}/projects/prj_python37/lh_monitor/lh_monitor; \ + ${HOME}/projects/prj_python37/lh_monitor/venv/bin/python -m main \ No newline at end of file diff --git a/lh_monitor/requirements.txt b/lh_monitor/requirements.txt new file mode 100644 index 00000000..1a71de93 --- /dev/null +++ b/lh_monitor/requirements.txt @@ -0,0 +1,2 @@ +rich==13.7.1 +requests==2.32.0 \ No newline at end of file diff --git a/machine_learning/.gitignore b/machine_learning/.gitignore new file mode 100644 index 00000000..706fd07f --- /dev/null +++ b/machine_learning/.gitignore @@ -0,0 +1,2 @@ +.idea +.vscode diff --git a/machine_learning/.ipynb_checkpoints/introduccion-a-numpy-checkpoint.ipynb b/machine_learning/.ipynb_checkpoints/introduccion-a-numpy-checkpoint.ipynb new file mode 100644 index 00000000..26b718a5 --- /dev/null +++ b/machine_learning/.ipynb_checkpoints/introduccion-a-numpy-checkpoint.ipynb @@ -0,0 +1,659 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introducción a NumPy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Numpy](https://numpy.org) es una librería fundamental para la computación científica con Python.\n", + "* Proporciona arrays N-dimensionales\n", + "* Implementa funciones matemáticas sofisticadas\n", + "* Proporciona herramientas para integrar C/C++ y Fortran\n", + "* Proporciona mecanismos para facilitar la realización de tareas relacionadas con álgebra lineal o números aleatorios" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Arrays" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Un **array** es una estructura de datos que consiste en una colección de elementos (valores o variables), cada uno identificado por al menos un índice o clave. Un array se almacena de modo que la posición de cada elemento se pueda calcular a partir de su tupla de índice mediante una fórmula matemática. El tipo más simple de array es un array lineal, también llamado array unidimensional." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "En numpy:\n", + "* Cada dimensión se denomina **axis**\n", + "* El número de dimensiones se denomina **rank**\n", + "* La lista de dimensiones con su correspondiente longitud se denomina **shape**\n", + "* El número total de elementos (multiplicación de la longitud de las dimensiones) se denomina **size**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos 0\n", + "a = np.zeros((2, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_**a**_ es un array:\n", + "* Con dos **axis**, el primero de longitud 2 y el segundo de longitud 4\n", + "* Con un **rank** igual a 2\n", + "* Con un **shape** igual (2, 4)\n", + "* Con un **size** igual a 8" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.ndim" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creación de Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos 0\n", + "np.zeros((2, 3, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos 1\n", + "np.ones((2, 3, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos el valor indicado como segundo parámetro de la función\n", + "np.full((2, 3, 4), 8)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# El resultado de np.empty no es predecible \n", + "# Inicializa los valores del array con lo que haya en memoria en ese momento\n", + "np.empty((2, 3, 9))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicializacion del array utilizando un array de Python\n", + "b = np.array([[1, 2, 3], [4, 5, 6]])\n", + "b" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "b.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación del array utilizando una función basada en rangos\n", + "# (minimo, maximo, número elementos del array)\n", + "print(np.linspace(0, 6, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicialización del array con valores aleatorios\n", + "np.random.rand(2, 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicialización del array con valores aleatorios conforme a una distribución normal\n", + "np.random.randn(2, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "\n", + "c = np.random.randn(1000000)\n", + "\n", + "plt.hist(c, bins=200)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicialización del Array utilizando una función personalizada\n", + "\n", + "def func(x, y):\n", + " return x + 2 * y\n", + "\n", + "np.fromfunction(func, (3, 5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Acceso a los elementos de un array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Array unidimensional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array unidimensional\n", + "array_uni = np.array([1, 3, 5, 7, 9, 11])\n", + "print(\"Shape:\", array_uni.shape)\n", + "print(\"Array_uni:\", array_uni)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al quinto elemento del Array\n", + "array_uni[4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al tercer y cuarto elemento del Array\n", + "array_uni[2:4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo a los elementos 0, 3 y 5 del Array\n", + "array_uni[0::3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Array multidimensional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array multidimensional\n", + "array_multi = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])\n", + "print(\"Shape:\", array_multi.shape)\n", + "print(\"Array_multi:\\n\", array_multi)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al cuarto elemento del Array\n", + "array_multi[0, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo a la segunda fila del Array\n", + "array_multi[1, :]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al tercer elemento de las dos primeras filas del Array\n", + "array_multi[0:2, 2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modificación de un Array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array unidimensional inicializado con el rango de elementos 0-27\n", + "array1 = np.arange(28)\n", + "print(\"Shape:\", array1.shape)\n", + "print(\"Array 1:\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cambiar las dimensiones del Array y sus longitudes\n", + "array1.shape = (7, 4)\n", + "print(\"Shape:\", array1.shape)\n", + "print(\"Array 1:\\n\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# El ejemplo anterior devuelve un nuevo Array que apunta a los mismos datos. \n", + "# Importante: Modificaciones en un Array, modificaran el otro Array\n", + "array2 = array1.reshape(4, 7)\n", + "print(\"Shape:\", array2.shape)\n", + "print(\"Array 2:\\n\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Modificación del nuevo Array devuelto\n", + "array2[0, 3] = 20\n", + "print(\"Array 2:\\n\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Array 1:\\n\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Desenvuelve el Array, devolviendo un nuevo Array de una sola dimension\n", + "# Importante: El nuevo array apunta a los mismos datos\n", + "print(\"Array 1:\", array1.ravel())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operaciones aritméticas con Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de dos Arrays unidimensionales\n", + "array1 = np.arange(2, 18, 2)\n", + "array2 = np.arange(8)\n", + "print(\"Array 1:\", array1)\n", + "print(\"Array 2:\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma\n", + "print(array1 + array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Resta\n", + "print(array1 - array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Multiplicacion\n", + "# Importante: No es una multiplicación de matrices\n", + "print(array1 * array2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Broadcasting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Si se aplican operaciones aritméticas sobre Arrays que no tienen la misma forma (shape) Numpy aplica un propiedad que se denomina Broadcasting." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de dos Arrays unidimensionales\n", + "array1 = np.arange(5)\n", + "array2 = np.array([3])\n", + "print(\"Shape Array 1:\", array1.shape)\n", + "print(\"Array 1:\", array1)\n", + "print()\n", + "print(\"Shape Array 2:\", array2.shape)\n", + "print(\"Array 2:\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma de ambos Arrays\n", + "array1 + array2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de dos Arrays multidimensional y unidimensional\n", + "array1 = np.arange(6)\n", + "array1.shape = (2, 3)\n", + "array2 = np.arange(6, 18, 4)\n", + "print(\"Shape Array 1:\", array1.shape)\n", + "print(\"Array 1:\\n\", array1)\n", + "print()\n", + "print(\"Shape Array 2:\", array2.shape)\n", + "print(\"Array 2:\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma de ambos Arrays\n", + "array1 + array2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Funciones estadísticas sobre Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array unidimensional\n", + "array1 = np.arange(1, 20, 2)\n", + "print(\"Array 1:\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Media de los elementos del Array\n", + "array1.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma de los elementos del Array\n", + "array1.sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Funciones universales eficientes proporcionadas por numpy: **ufunc**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cuadrado de los elementos del Array\n", + "np.square(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Raiz cuadrada de los elementos del Array\n", + "np.sqrt(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Exponencial de los elementos del Array\n", + "np.exp(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# log de los elementos del Array\n", + "np.log(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/machine_learning/introduccion-a-numpy.ipynb b/machine_learning/introduccion-a-numpy.ipynb new file mode 100644 index 00000000..ca396339 --- /dev/null +++ b/machine_learning/introduccion-a-numpy.ipynb @@ -0,0 +1,671 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introducción a NumPy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Numpy](https://numpy.org) es una librería fundamental para la computación científica con Python.\n", + "* Proporciona arrays N-dimensionales\n", + "* Implementa funciones matemáticas sofisticadas\n", + "* Proporciona herramientas para integrar C/C++ y Fortran\n", + "* Proporciona mecanismos para facilitar la realización de tareas relacionadas con álgebra lineal o números aleatorios" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Arrays" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Un **array** es una estructura de datos que consiste en una colección de elementos (valores o variables), cada uno identificado por al menos un índice o clave. Un array se almacena de modo que la posición de cada elemento se pueda calcular a partir de su tupla de índice mediante una fórmula matemática. El tipo más simple de array es un array lineal, también llamado array unidimensional." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "En numpy:\n", + "* Cada dimensión se denomina **axis**\n", + "* El número de dimensiones se denomina **rank**\n", + "* La lista de dimensiones con su correspondiente longitud se denomina **shape**\n", + "* El número total de elementos (multiplicación de la longitud de las dimensiones) se denomina **size**" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos 0\n", + "a = np.zeros((2, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_**a**_ es un array:\n", + "* Con dos **axis**, el primero de longitud 2 y el segundo de longitud 4\n", + "* Con un **rank** igual a 2\n", + "* Con un **shape** igual (2, 4)\n", + "* Con un **size** igual a 8" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.ndim" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a.size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creación de Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos 0\n", + "np.zeros((2, 3, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos 1\n", + "np.ones((2, 3, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Array cuyos valores son todos el valor indicado como segundo parámetro de la función\n", + "np.full((2, 3, 4), 8)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# El resultado de np.empty no es predecible \n", + "# Inicializa los valores del array con lo que haya en memoria en ese momento\n", + "np.empty((2, 3, 9))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicializacion del array utilizando un array de Python\n", + "b = np.array([[1, 2, 3], [4, 5, 6]])\n", + "b" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "b.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación del array utilizando una función basada en rangos\n", + "# (minimo, maximo, número elementos del array)\n", + "print(np.linspace(0, 6, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicialización del array con valores aleatorios\n", + "np.random.rand(2, 3, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicialización del array con valores aleatorios conforme a una distribución normal\n", + "np.random.randn(2, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "\n", + "c = np.random.randn(1000000)\n", + "\n", + "plt.hist(c, bins=200)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Inicialización del Array utilizando una función personalizada\n", + "\n", + "def func(x, y):\n", + " return x + 2 * y\n", + "\n", + "np.fromfunction(func, (3, 5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Acceso a los elementos de un array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Array unidimensional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array unidimensional\n", + "array_uni = np.array([1, 3, 5, 7, 9, 11])\n", + "print(\"Shape:\", array_uni.shape)\n", + "print(\"Array_uni:\", array_uni)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al quinto elemento del Array\n", + "array_uni[4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al tercer y cuarto elemento del Array\n", + "array_uni[2:4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo a los elementos 0, 3 y 5 del Array\n", + "array_uni[0::3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Array multidimensional" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array multidimensional\n", + "array_multi = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])\n", + "print(\"Shape:\", array_multi.shape)\n", + "print(\"Array_multi:\\n\", array_multi)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al cuarto elemento del Array\n", + "array_multi[0, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo a la segunda fila del Array\n", + "array_multi[1, :]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Accediendo al tercer elemento de las dos primeras filas del Array\n", + "array_multi[0:2, 2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modificación de un Array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array unidimensional inicializado con el rango de elementos 0-27\n", + "array1 = np.arange(28)\n", + "print(\"Shape:\", array1.shape)\n", + "print(\"Array 1:\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cambiar las dimensiones del Array y sus longitudes\n", + "array1.shape = (7, 4)\n", + "print(\"Shape:\", array1.shape)\n", + "print(\"Array 1:\\n\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# El ejemplo anterior devuelve un nuevo Array que apunta a los mismos datos. \n", + "# Importante: Modificaciones en un Array, modificaran el otro Array\n", + "array2 = array1.reshape(4, 7)\n", + "print(\"Shape:\", array2.shape)\n", + "print(\"Array 2:\\n\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Modificación del nuevo Array devuelto\n", + "array2[0, 3] = 20\n", + "print(\"Array 2:\\n\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Array 1:\\n\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Desenvuelve el Array, devolviendo un nuevo Array de una sola dimension\n", + "# Importante: El nuevo array apunta a los mismos datos\n", + "print(\"Array 1:\", array1.ravel())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operaciones aritméticas con Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de dos Arrays unidimensionales\n", + "array1 = np.arange(2, 18, 2)\n", + "array2 = np.arange(8)\n", + "print(\"Array 1:\", array1)\n", + "print(\"Array 2:\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma\n", + "print(array1 + array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Resta\n", + "print(array1 - array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Multiplicacion\n", + "# Importante: No es una multiplicación de matrices\n", + "print(array1 * array2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Broadcasting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Si se aplican operaciones aritméticas sobre Arrays que no tienen la misma forma (shape) Numpy aplica un propiedad que se denomina Broadcasting." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de dos Arrays unidimensionales\n", + "array1 = np.arange(5)\n", + "array2 = np.array([3])\n", + "print(\"Shape Array 1:\", array1.shape)\n", + "print(\"Array 1:\", array1)\n", + "print()\n", + "print(\"Shape Array 2:\", array2.shape)\n", + "print(\"Array 2:\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma de ambos Arrays\n", + "array1 + array2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de dos Arrays multidimensional y unidimensional\n", + "array1 = np.arange(6)\n", + "array1.shape = (2, 3)\n", + "array2 = np.arange(6, 18, 4)\n", + "print(\"Shape Array 1:\", array1.shape)\n", + "print(\"Array 1:\\n\", array1)\n", + "print()\n", + "print(\"Shape Array 2:\", array2.shape)\n", + "print(\"Array 2:\", array2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma de ambos Arrays\n", + "array1 + array2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Funciones estadísticas sobre Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Creación de un Array unidimensional\n", + "array1 = np.arange(1, 20, 2)\n", + "print(\"Array 1:\", array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Media de los elementos del Array\n", + "array1.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Suma de los elementos del Array\n", + "array1.sum()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Funciones universales eficientes proporcionadas por numpy: **ufunc**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Cuadrado de los elementos del Array\n", + "np.square(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Raiz cuadrada de los elementos del Array\n", + "np.sqrt(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Exponencial de los elementos del Array\n", + "np.exp(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# log de los elementos del Array\n", + "np.log(array1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/machine_learning/readme.md b/machine_learning/readme.md new file mode 100644 index 00000000..f9f91188 --- /dev/null +++ b/machine_learning/readme.md @@ -0,0 +1,47 @@ +[Curso Udemy](https://www.udemy.com/course/deep-learning-desde-cero-en-python/learn/lecture/23711342#overview) + +- IA + - Machine Learning + - Deep learning + +#### Deep learning +- Basado en algoritmos de redes neuronales profundas +- Pe: + - Clasificación de imagenes + - Reconocimiento de texto + - Conducción autonoma + - etc +- Redes neuronales densamente conectadas +- Instalación de anaconda +- **anaconda** + - Es como un concentrador visual de herramientas para machine learning + - anaconda incluye muchos paquetes y bibliotecas populares utilizadas en ciencia de datos, como NumPy, Pandas, Matplotlib, Jupyter, y muchos otros. + - [Instaladores](https://www.anaconda.com/download) + - v2.5.1 + - $HOME/projects/py-anaconda/anaconda3 (entorno por defecto) + - creo entorno virtual: **udemy-machine-learning** + - Atajos teclado en Jupiter notebook + - a añade celda en linea anterior + - b celda debajo + - dd borra celda + - j abajo + - k arriba +- Google colaboratory (es como el jupiter notebook pero online) + - https://colab.research.google.com/ +**NumPy** + - Aporta: + - Arreglos (Arrays) + - Operaciones Matriciales: suma y mult de matrices + - Funciones Matemáticas: sin, exp + - Índices y Rebanadas (Slicing) + - Funciones Estadísticas + - import numpy as np + ```numpy + # array de 2 filas y 4 columnas + a = np.zeros((2, 4)) + ``` + - En numpy los arrays nos ofrecen métodos que no se encuentran en las listas + - a.shape + - a.ndim + - a.size + - \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 00000000..55148a07 --- /dev/null +++ b/makefile @@ -0,0 +1,14 @@ +#!/bin/bash +TODAY := $(shell date +'%Y-%m-%d') + +help: ## Show this help message + @echo "usage: make [target]" + @echo + @echo "targets:" + @egrep "^(.+)\:\ ##\ (.+)" ${MAKEFILE_LIST} | column -t -c 2 -s ":#" + +gitpush: ## git push m=any message + clear; + git add .; git commit -m "$(m)"; git push; + + diff --git a/mis_tests/email/example-1.txt b/mis_tests/email/example-1.txt new file mode 100644 index 00000000..b8b5604b --- /dev/null +++ b/mis_tests/email/example-1.txt @@ -0,0 +1,10 @@ +ONE + +At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque +corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui +officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. +Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere +possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis +aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum +hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus +asperiores repellat diff --git a/mis_tests/email/example-2.txt b/mis_tests/email/example-2.txt new file mode 100644 index 00000000..81fa93e3 --- /dev/null +++ b/mis_tests/email/example-2.txt @@ -0,0 +1,6 @@ +TWO + +But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give +you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master- +builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because +those who do not know how to pursue pleasure rationally encounter consequence diff --git a/mis_tests/email/main.py b/mis_tests/email/main.py new file mode 100644 index 00000000..192420ac --- /dev/null +++ b/mis_tests/email/main.py @@ -0,0 +1,170 @@ +from typing import List + +""" +Los datos de acceso a la cuenta de gmail que se usará para enviar el email +""" +def get_gmail_login() -> dict: + return { + "user": "some-from@gmail.com", + "pwd": ":)Abcd1234" + } + + +""" +Lista de destinatarios +""" +def get_cc_recipients() -> List[str]: + return [ + "to-email-1@gmail.com", + "to-email-2@yahoo.es", + ] + + +""" +Lista de destinatarios ocultos +""" +def get_bcc_recipients() -> List[str]: + return [ + "to-email-bcc@hotmail.com" + ] + + +""" +Ruta de los archivos a adjuntar +""" +def get_attachments() -> List[str]: + return [ + "./example-1.txt", + "./example-2.txt" + ] + + +def get_html_template() -> str: + html= """ + + + + + +
+ + + + +
+ +

Example H1

+

+ Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical + Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at + Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a + Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the + undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" + (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, + very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", + comes from a line in section 1.10.32. +

+
+
+ + + """ + return html + +""" +Crea la conexión con gmail +""" +def get_smtpssl_object(): + import smtplib + login = get_gmail_login() + server_ssl = smtplib.SMTP_SSL("smtp.gmail.com", 465) + server_ssl.ehlo() + server_ssl.login(login["user"], login["pwd"]) + return server_ssl + + +def send_email() -> None: + from pathlib import Path + from email.mime.multipart import MIMEMultipart + from email.mime.text import MIMEText + from email.mime.base import MIMEBase + from email import encoders + + # MIME: Multipurpose Internet Mail Extensions. Mp3, Mid, mpeg, mov, nws etc + # mixed permite el envío de html y plain + mime_obj = MIMEMultipart("mixed") + + subject = "This is an email subject from Python (example 1)" + mime_obj["Subject"] = subject + + #mime_obj["From"] = "loquesea@mimail.com" no tiene ningún efecto + + # esto podría ir en blanco y llegaría pero el cliente de correo no mostraría nada en destinatarios + # el o los receptores es decir irian como Bcc + mime_obj["To"] = ", ".join(get_cc_recipients()) + + plain_text = "This is a plain text example" + mime_plain = MIMEText(plain_text, "plain") + + html = get_html_template() + mime_html = MIMEText(html, "html") + + mime_obj.attach(mime_html) + mime_obj.attach(mime_plain) + + smtp_obj = get_smtpssl_object() + smtp_obj.set_debuglevel(1) + + # tratando los adjuntos (examples.txt) + for path in get_attachments(): + part = MIMEBase('application', "octet-stream") + with open(path, 'rb') as file: + part.set_payload(file.read()) + + encoders.encode_base64(part) + filename = Path(path).name + part.add_header('Content-Disposition',f'attachment; filename="{filename}"') + mime_obj.attach(part) + + smtp_obj.sendmail( + #si esto se deja en blanco también se envía. No da error pero llega a SPAM. + #No es necesario que coincida con el email de la cuenta de gmail + "anyaccount@somedomain.local", + get_cc_recipients()+get_bcc_recipients(), + mime_obj.as_string() + ) + smtp_obj.close() + + +if __name__ == "__main__": + send_email() + diff --git a/mis_tests/misc/__init__.py b/mis_tests/misc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mis_tests/misc/argskwargs.py b/mis_tests/misc/argskwargs.py new file mode 100644 index 00000000..c0616afa --- /dev/null +++ b/mis_tests/misc/argskwargs.py @@ -0,0 +1,35 @@ +# argskwargs +from pprint import pprint + +def fn_args(*args): + print("args:") + pprint(args) + +def fn_kwargs(**kwargs): + print("kwargs:") + pprint(kwargs) + + +def fn_argskwargs(*args,**kwargs): + print("fn_argskwargs.args:") + pprint(args) + print("fn_argskwargs.kwargs:") + pprint(kwargs) + +def pr(): + print("="*50) + +if __name__== "__main__": + fn_args(1,2.3,"a",{},[]) + # fn_kwargs({"a1":1,"a2":2.3,"a3":"a","a4":{},"a5":[]}) #TypeError: fn_kwargs() takes 0 positional arguments but 1 was given + fn_kwargs(a1=1,a2=2.3,a3="a",a4={},a5=[]) + # fn_args(a1=1,a2=2.3,a3="a",a4={},a5=[]) # got an unexpected keyword argument 'a1' + fn_argskwargs(1,2.3,"a",{},[]) + pr() + fn_argskwargs(a1=1,a2=2.3,a3="a",a4={},a5=[]) + pr() + objdic = {"a1":1,"a2":2.3,"a3":"a","a4":{},"a5":[]} + fn_argskwargs(objdic) # entra por args + pr() + # fn_argskwargs(a1=1,a2=2.3,a3="a",a4={},a5=[],1,2.3,"a",{},[]) #SyntaxError: positional argument follows keyword argument + fn_argskwargs(1,2.3,"a",{},[],a1=1,a2=2.3,a3="a",a4={},a5=[]) diff --git a/mis_tests/misc/data-model.py b/mis_tests/misc/data-model.py new file mode 100644 index 00000000..8bbdf94e --- /dev/null +++ b/mis_tests/misc/data-model.py @@ -0,0 +1,13 @@ +# https://youtu.be/cKPlPJyQrt4 +class Polynomial: + def __init__(self,*coeffs): + self.coeffs = coeffs + + def __repr__(self): + return "Polynomial(*{!r})".format(self.coeffs) + + def __add__(self, other): + return Polynomial(*(x + y for x,y in zip(self.coeffs, other.coeffs))) + +p1 = Polynomial(1,2,3) +p2 = Polynomial(3,4,3) \ No newline at end of file diff --git a/mis_tests/misc/get_pip.py b/mis_tests/misc/get_pip.py new file mode 100644 index 00000000..70e6ac63 --- /dev/null +++ b/mis_tests/misc/get_pip.py @@ -0,0 +1,21492 @@ +#!/usr/bin/env python +# +# Hi There! +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base85 encoding of a zip file, this zip file contains +# an entire copy of pip (version 19.1). +# +# Pip is a thing that installs packages, pip itself is a package that someone +# might want to install, especially if they're looking to run this get-pip.py +# script. Pip has a lot of code to deal with the security of installing +# packages, various edge cases on various platforms, and other such sort of +# "tribal knowledge" that has been encoded in its code base. Because of this +# we basically include an entire copy of pip inside this blob. We do this +# because the alternatives are attempt to implement a "minipip" that probably +# doesn't do things correctly and has weird edge cases, or compress pip itself +# down into a single file. +# +# If you're wondering how this is created, it is using an invoke task located +# in tasks/generate.py called "installer". It can be invoked by using +# ``invoke generate.installer``. + +import os.path +import pkgutil +import shutil +import sys +import struct +import tempfile + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + iterbytes = iter +else: + def iterbytes(buf): + return (ord(byte) for byte in buf) + +try: + from base64 import b85decode +except ImportError: + _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") + + def b85decode(b): + _b85dec = [None] * 256 + for i, c in enumerate(iterbytes(_b85alphabet)): + _b85dec[c] = i + + padding = (-len(b)) % 5 + b = b + b'~' * padding + out = [] + packI = struct.Struct('!I').pack + for i in range(0, len(b), 5): + chunk = b[i:i + 5] + acc = 0 + try: + for c in iterbytes(chunk): + acc = acc * 85 + _b85dec[c] + except TypeError: + for j, c in enumerate(iterbytes(chunk)): + if _b85dec[c] is None: + raise ValueError( + 'bad base85 character at position %d' % (i + j) + ) + raise + try: + out.append(packI(acc)) + except struct.error: + raise ValueError('base85 overflow in hunk starting at byte %d' + % i) + + result = b''.join(out) + if padding: + result = result[:-padding] + return result + + +def bootstrap(tmpdir=None): + # Import pip so we can use it to install pip and maybe setuptools too + import pip._internal + from pip._internal.commands.install import InstallCommand + from pip._internal.req.constructors import install_req_from_line + + # Wrapper to provide default certificate with the lowest priority + class CertInstallCommand(InstallCommand): + def parse_args(self, args): + # If cert isn't specified in config or environment, we provide our + # own certificate through defaults. + # This allows user to specify custom cert anywhere one likes: + # config, environment variable or argv. + if not self.parser.get_default_values().cert: + self.parser.defaults["cert"] = cert_path # calculated below + return super(CertInstallCommand, self).parse_args(args) + + pip._internal.commands_dict["install"] = CertInstallCommand + + implicit_pip = True + implicit_setuptools = True + implicit_wheel = True + + # Check if the user has requested us not to install setuptools + if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"): + args = [x for x in sys.argv[1:] if x != "--no-setuptools"] + implicit_setuptools = False + else: + args = sys.argv[1:] + + # Check if the user has requested us not to install wheel + if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"): + args = [x for x in args if x != "--no-wheel"] + implicit_wheel = False + + # We only want to implicitly install setuptools and wheel if they don't + # already exist on the target platform. + if implicit_setuptools: + try: + import setuptools # noqa + implicit_setuptools = False + except ImportError: + pass + if implicit_wheel: + try: + import wheel # noqa + implicit_wheel = False + except ImportError: + pass + + # We want to support people passing things like 'pip<8' to get-pip.py which + # will let them install a specific version. However because of the dreaded + # DoubleRequirement error if any of the args look like they might be a + # specific for one of our packages, then we'll turn off the implicit + # install of them. + for arg in args: + try: + req = install_req_from_line(arg) + except Exception: + continue + + if implicit_pip and req.name == "pip": + implicit_pip = False + elif implicit_setuptools and req.name == "setuptools": + implicit_setuptools = False + elif implicit_wheel and req.name == "wheel": + implicit_wheel = False + + # Add any implicit installations to the end of our args + if implicit_pip: + args += ["pip"] + if implicit_setuptools: + args += ["setuptools"] + if implicit_wheel: + args += ["wheel"] + + # Add our default arguments + args = ["install", "--upgrade", "--force-reinstall"] + args + + delete_tmpdir = False + try: + # Create a temporary directory to act as a working directory if we were + # not given one. + if tmpdir is None: + tmpdir = tempfile.mkdtemp() + delete_tmpdir = True + + # We need to extract the SSL certificates from requests so that they + # can be passed to --cert + cert_path = os.path.join(tmpdir, "cacert.pem") + with open(cert_path, "wb") as cert: + cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) + + # Execute the included pip and use it to install the latest pip and + # setuptools from PyPI + sys.exit(pip._internal.main(args)) + finally: + # Remove our temporary directory + if delete_tmpdir and tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +def main(): + tmpdir = None + try: + # Create a temporary working directory + tmpdir = tempfile.mkdtemp() + + # Unpack the zipfile into the temporary directory + pip_zip = os.path.join(tmpdir, "pip.zip") + with open(pip_zip, "wb") as fp: + fp.write(b85decode(DATA.replace(b"\n", b""))) + + # Add the zipfile to sys.path so that we can import it + sys.path.insert(0, pip_zip) + + # Run the bootstrap + bootstrap(tmpdir=tmpdir) + finally: + # Clean up our temporary working directory + if tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +DATA = b""" +P)h>@6aWAK2mmD%m`<4gN^}MtBUtcb8d5e!POD!tS%+HIDSFlx3GPKk +)RN?{vP)h>@6aWAK2mmD%m`-N@Pvb`c003_S000jF003}la4%n9ZDDC{Utcb8d0kO4Zo@DP-1Q0q8SE +6P(>Xwfj$MoHf@(`KQCU(&8g71HO0ki&o<#cYNZz>|C(zo>JZGyl;FMx!FrO6t%vRrOrPh9=?L}8oY6 +ou)77Hd@$a4r7F5rryfn~JTAHWO)@Mv!(a4fto86JiEF(QHSJ}y)-GntEpbmcJyNSL0Vx@Gi7c>xAuL +EgIxovfWq|0NvR`+SC`IVq5DSMEVyuc5y>N3AD=LF+DESFFQK3yL&bIL-tGT-b6~%(tWCE +QA8qFLP)h +>@6aWAK2mmD%m`<{zTe%hm001@%000>P003}la4%nJZggdGZeeUMUtei%X>?y-E^v93R&8(FHW2=X;*U%xw2l%3W6Py<0o>h8I>=Z-x4>3Qeu^QF|!Q +E#E$`?b;8%9;(7<*M_Y#j*ssX^r(Dmd>coV;T2Z)}Jd=35ADU(@5Q2r#EE2I)jML=NjONY)o=yYXtEu$-H-Gm-+BOZ^V00~A@_@kKt#R;YX;F~+>#O^V-@pfx`4TJ9IRvvJI8Va8$ENdb=f@y)O)kTy&U +t8+keW`k*)triwXqw@TIWQ=kz7M~CAHT>NbjTlEYY)AN#)U|Z9b9>#fqZ|RKjCp?0)`@@)+QZGV(<*pWow<6RAI8<%7GiZm__ +Ldg`4O+Qpu7fWi`gXwe$yB+-oXAT^C-o>eO(u)G`>R`0FaN!ISX|%Tmbd@B{p;!heuwGfY&xCN-zpmA-{5oleV1B&e-FWh`ubGg0izE% +KZO)wlw#YA$T!=C?FodnQsl@e#K*pC0%ZPUoT5Xu16`yZo4?Mm2gR8?r;Ukv%TPaPRYIpgHc4htJxYu +31A&PNe&h4w2e)^%_UDMfHx;k#%rzESxFX0 +R}T+&50~)Fjo=x}j=wK!TtU+k9kx$}@KO4FHcr{QMdYUqkGc4oVwSXF^3yn{;cse6L;km*aWLjY?u`B +1>(cZ-(H2Eg3N2sONIU#CQ@u5ZKCbfq;O15N=grLo&d;ADssDON)B))X1`r}2Jv~}VIMtf&o5~8eW>) +o|`KIcquJn2mN`9rQZ=1QY-O00;mj6qrs-OWq+R2><}#8~^|s0001RX>c!JX +>N37a&BR4FJg6RY-C?$Zgwtkd7T+uZ`(NX-M@mHK1jk!!gU{w^8(#8-4@qNf;PQHVHkoU(GEAVs3R#m +z9RqqW=K&YB{}V`Uu;qH#rdA`#l^*MEvrg$RUeq(^`6#>w33!&%LQSQSGi)mCS@yFy(6+@QjvSafXBt +f#l>R5_6-+`RD8F?v+j{g`%9kspNc-IqsW`ZR`5M3cvaB?$xG4!+=!A2TE1n4GBC)mRjiUJkSTb*Wjh +PIqbh4o>Vel;#qJIGJW#G4{cL^jb5Gf{qaP +bJ2{7ltA&thiTmQ^&%NG|a>t9YSx=P+iqqN2{L)Ld!LWMQ$3ys9$U-Zz4SH1a%>qWdN*nXrg=@cb4eE +)*B17tl@(8n8q9_t)F6+2#AI%YS8`zFc2_xc>b-X3H!VZ)lxKpi@%;cHhpBSuO~CG%cUwUE5SNCZM^P +d;t3SJwDzvsG+=y$wx5sfa}Y_>XJTLLbrMGnD6L2JOnAw?WiCt>whU&{G&b#v#iedV326BSQJ$*CCP3 +D-Lj|ULUStV7L3Mfrm`%QwA#i5T_rMiz|SkZ1YMF)DiM+7S8~m3+P_7V6fuB1e)%sXRc!-r-sP1X;oP +%YTW~eFXV^pFC#Y3GK)+n3cm=XrnIj6MNYHS}p0Y+?C5S!5LoVd%TX3IC8Z5O?F~CC%J15UQMzjuOAy +}hiuyO8u%@y1k>4ReX01TYqQXC~G>VZ0F5QHKZC(T0=$;s{M_5>*e;#{D6Rwp9c25m^ow8v{&K>^e1q +L1egr3PoC1>3S>rL`CnbLo{f(?9|se}KfDXwOjqRrhkNEWM?tS#3BtMZ-y8weAoG#i4P23@5fMHoa%+ +B<$qikl+6aI_rE9^6aIcxq>v6*CpBKHADdZ?lLr_YwF~0Fb}Jxf{bEPHF$a>Euk~MKj-ylTt4el(8|v +~A>_t#b)k7CAkam01~D!4ZNg|V0x;I0s4S-xgno2{7!$D#<`9Aet(pGGSsjk}mi0tgmf4mhCOyv@QPfvQt>_eA0?703f|_rP6D1N!Ocn9Kw`v-2!0BW5R)9t= +|MJlMex_Wz>O{XXrL2(aS-b`elYMQJ3GmYgjKpOBRsqLIjJnN;Ne!vxk76@28w7{%c5>WJWlH +x}Qgmfr52$^nE7|5IXR3R?St9NT0w1Z$$f5 +N*$*im8@KaxYz1&RTA8UTBP02<`s={ajqr(_UfzN$&o%Sd3yqrMe2j8Z7S>iX^$5`CqwQ_z>8FoBesb +<+sV#Ke4=kCz!qe90RD=eDP(v;?$p4YRS^-Gui1a%h8bW1bW(@|n>(JN^}VR{97X^hQ@05cBwnL=+=# +ssX0oe=a*rYJHx<8`l0lEn77Pm?-JcHO_*AlZ-SRW>i5^(g2mD8vokeQd@b_Q0tX#}OK(TP&PVog6P; +xeqb1qOSZxW2>rZL@2iU(@vyIJo$kF#9@;2v3@Vn>|OJNy?@snVAt|e!M}ZT_a4jr?bo~aH`muUUp`- +b`uySUYBf;$1bPqT5KUw*;Gu~)GTS^b|$7G*~s!U_GS +Qcl+`vR_F%qBjetusFfk=S`$Iee9qVpMg4e+;&^fBT&<^cq-!q<^@r*td88%Pm*8%57eRS{m4B8pSAm +aw8I^8Pi0Pt*)f^zoILHT;`4AS99?MKrHbF|p-ChXZwy>2=b`1tD%cY}GxG9K<AD>ZFVp6F_Tx}_y>SOQVcg1L8{1nA{@yu{@9|!|3}S5cRw*8w-`_S3dBzsLcgunx@kv&<&BR(Nw)2i!uo5_6uh8)BCFt#eS)UW6pRI@#4)htTEHT3k*4F| +FAouPcT&|vl+C_90U#K$I#uV;AAR8Sa;3mOKQ)_Cwzqz7@(jhT8i7+M+Os^5 +ZTjVUa6j@+;Z-F9N@&2ZL=O3rAo6LB3R45XM~Kt|e3(=i~4JnJ^j^$gbQ@CDB+3Ub?mB0|&% +-IbhlOHq8$`FDuqEi^x=132U060enqnG11okVU%nptw#zcRuu_3HIScjn77`g0~kCb0!wb>G9^4A=ao +nJje22g7Rj4W!S6H+p%I=vF`nk6z`XRmPYW@B5qF2Bi6cF>3<$S9@-sz?r7i2b!(QhNCUQew8)3I<|G +vAuMtxDgJBmVGr#fg46O!2ri&i`#(@i0|XQR000O8B@~!Wn_6G(90>pb=p6t6761SMaA|NaUukZ1WpZ +v|Y%gPBV`ybAaCya8ZI9bF68^rwf^a^pba0ejkjn=HF3_f%Hn?Pa$fgL2#X_JZ+EyZyI#OE44f@~jnW +0`N*-p|nhx)@}MRDF|o|(~XHhU(strD-KmK(KGy1tmrW)~O5t}?b3%35u@hplwmvRHMGrP*u>z3Co}y +SP|evlCTOCF#A=xv@zlv-gs2B~4wFPPBJ3sf{i&Sr)&kRLh+TNef*ot7VzwX0J;l^Ny;L^){_d+Su~c +^_|I8>5{V0?>mZ@`2W;ZRwl{J4lKL7>O&=U-Z*8?Q`Bl#rFmgHnm2g`=i49nq^_|MP4 +5?5C?||4v{3a((^c`o~k0`>j%CNAg17!&muRI(uG}id;4q{D@GkPq18E2>h7uSo+UZT^IELbM>Jkes1he*3XQtt$}390AX&>Lr5x5YjV~@PvQj!HIL{)pdIxXCUOi;mcU +s7mtF6qC6@2fZsI0j!a^;XFl$v?#-~uOWV?{1&={2QLBkPzK{T7w9a_7k?ObhV_^wt<;=UUYGpI;?Yf +;F3!X5Ov^+#$T4L^iUy)v-2^y({XT5&c$$maODTk-x1%=K27f6)elr>{Xt61>8dHw?(#X^>HM9jcB`p +gK%5Zl(}&5N5GDL(IqQzxD-fZap_EBGld7MnB3^{(8&|XrbfBA3xfAxuGS(&;EOsNnYz3U#@ +;x(`vD2`5~`SRMz4R^hPAC*rpE~EO9E7OqS#sxJ8wY+~3;ahTU0s~U=04}E;-@%zkNxns0l)+IHPG~? +AWhM*lUx#lNqayExCbFu~Vx!q|#?Fs!$IRygx4SqVDNTM}irIsfuxA;EF}l(j+9^i?7dSQ?T(^~vA3v +dZT$ZKqE-zf@Z-^8Q;8;o<@N+6_Y*8Nw+)?K>;Ut1h?Edw1E>`d_^OuBh7QF{=Ygs~py285%{s~ie+c +*JWbe^w@6Y&!&=bp&8W31Q8DxE=y593b0hmX;x2+{*a!%c22WGs1mPx6BEy&66qI;RM6E{?# +SV+&IN7QXd9hKhj^Z;}uko@~bZBkPASLj!vamyQ#!?%RIMdv|Ocih|aj6{9?@3=uT%Yi^(d0a$bj@mX +6Z}Y6!0q|XU}&Gy-s0QEmK(GP>?P-@- +}FGCAq(8BmK)ENY%C>{@kup=535S7)WhZuWwBh=>9d(yc-jKdNiNgvm4>y+ETPyHP1B`uE!<7niVo^W +U`Ct4YeVdkf{o@?ah_7C}SWH7MC##ScJ2L7a9WpkNjV9b^Y_z^_#iqpWgiN;`Q%i(y>LOQ&~7QB>1siU)Xw)& +SA5B?S;v{Y7dN+H1qkMm=8^iV2h!C)NMx!qL0)sc2&vioyyrq9X7RUf2CRss-ic;5$@7X1`}kcK82*9 +y$d0AbKjizq^@o0a1fvp=A`_uTFOD;==3l&vb;Y%Z#JwwHujGsH@(B%aB|{o4y7L{hr2ugEg(4#n4T7G4-3+x`A?N`r4sYW6%Bb`^1;659gMKsrE8tRv)CWQ1q|14)$28C`)1kBhXH6Sca6>ujIgg=u&;l-TP1 +#QSgPwbOR~qx4Mw4b3NIaWuf%Y)y`nKIVkspc|2M`fvLF};57QC1r{D5ASFs@jYN???8fR~<^ZgwjiA ++pBnG)(9Sp4=g9wF=nsFxg6M@7p15sJCIc`fsBWag}TmkvwWaFI*RL^PAGV_;eXgBK@Qo?Ed7lRa0Oq +mz~-~^G)(ik|gvJCPG`fQuF0D#?l9lXX#lRb_m1OGLM2E*22!mpG(ZLbuLRSrzelcSF +zls^7D2!n9@9fb3P4e?(bc!=K@80lO0aY~&=+HOE(v^%|Vdc+GV;)avEO;n0ayM8fn9xseTzaKDiJhf +q!_S~>k|07&q{%;L!7+h&M4kjD#Md;FQb$aBPe%k${DqM}zsfT_(@Js)#FB-(eqnqvgbLunUF-t0#LN +{vkq8<2HKmt^y&wVP7;$!j$;(N|yhMRtY!pwZY=Bpn`n{6MdI{PxQgMYe(HX5mr^5@4CWma)E74;=RW{-kU^pzFuXY%3m +@Y%ll`DXgLKFW^hKW{I`U$!H_eZHJ2GWj6~;UQ}{i_b7fylvqE>^t?uYoBh^6P^SGQ&Ug1=|4USO_gs +M48cA>7`?T!I!Xpc`J=RZAvhk)jax +JZZM0lj_`L7FC#_9G?Z`u~WBo#Mu`aBu|F$XaYs_!mH}G(N8%Nn=NcVBzXzo34+k_80zvnYWgDLITog +qi)6&Q4O_ZW%yntxp-0&jeg5?{YPLmf1~ek_@IV>W +aCyyIdvDt~693NQke{e28$?n5 +b8h=QVP{l+0I|V7sD9St?XgNg%UgyS1o*^|dgp**(IFr^Fm9xvW@%OE0TpGYW!WG?JULsA`rK3C~3PZ +M6cD_G_U=Bb>oXSw``l$kU>Vl>8KJiaVj08KqY(d8I_Ip +lCCHW2R=t3&^ekpeE_a%INODf^nguUOEnV`Aj5&e0`cUliuq*ONZbR2bmW{=qQ8W>pfJf-=sWuC$$vs +4)1_W(p%SFixu7|}Gw7Og~mLGQviMzfD&7&UstF5kXCo3b~2emc6-%ayZIuWX +iu_JiMNUXkRD=p+ONjmwnHl{7Bi+F+$5AE9j3**IiBBf%T=^-=n3T>+&uFu}h0#I%R#LV-EeL$nSE=3}jGNEy=F5Z6s>|z#Zch+OU==PwQ4f +|21+Ip|g-=EC_bX=F({G+VuEzcJ0%+Zxc{_OJOEC5Zm({Lhr*wy(}{QT|Z%kx+9%kzsfJ3RjQ>>W)3g +eBh1aCeE12;CrRH9{#R8HnD8x3IYR72w`z01V~_a3C1(MyIYoBkiGARdEN~R*Yjz0vBI`J)tk~BmoOW +Pykw*5PtC^gNa>4>HS(NrkR65cLGcg?5U;x?CKnJ$ZJ-ETPPOT0EN*7%^?8S*&FzPcZ$|kbx{e@y$+A +PuqbPI#e$Z|Hcvt6Fo6i!aA;QxTxNL&ex%qE+>Hb0!V>`nLx|G2^i2UP;Rj0&S+h&nrO`CefxzbOfIE +q!nBZ!U($tE;r8dkE9grl^GqhRCYp(YX#E@A903{PJe~SwAf&38yf~?~hf_}D~z~~}F2|<8@NEf4L&n +}BxH~`Ri=}l1pa3ijgv*NI3klL1jGM=RY_QDe5s9DhfJw7pLNTzYKCOGJvJT*e^oM^|6vl(B7e=;{u*lnpmJ|VLppb@LF-?C1~ha&A}}_j9Cr1xas?q-#DJR=kuey|17Jm=kAp +teA}a%Lli!PkWANW$a2F-3E1uk%>#wPk7F_DHw?~s%PuYAy#$>*u*$&C5nfs;H4Q +5!R7oA+qDUrgUIq9ZQi^ZbDmMJ3+a`pMkAHWrTBz_Qj270w}fItSk*@;K +tW9ARToS#f)3y-VXKp9xpX>PA_sD_{c!986vC3{qdp)xG@RuC6e?vA6L$**mjYl3LL305(zy_P=b91 +y8n*_yL(sZoU3C#$r-fQ>C>Cu=C>S!XeK?-~t=+UP1lc*n`cH)PgVe}W8eu~=w^7F>Y)c&1SbckUr0r +M5ie(bA{S^Ep(kqP_h5|?ja@;&AC!@l%A$GquJh32cG=OSvSMV)~m@z2;FgLVIo0G$)-1S}w$f9gGq; +jyEpG1S~9am$^?;P0aDetw|52@}@C=V_RNJx@3ZVjTe6O?hUjwn=L6cfF-0}>$}4`Rz3GQCDLLy6n4V +6*^C0l(&VqRj-{jA@CnYr;xf93M0PkqbX&hU1o9{7H1SW(vJt!GJvp>I>sVM8^%AP1(N +Uvm|krEULd>@$Xs8O+nPH+VEK4)hs%`?1>W<^-C{xer|nvON%i?XI~qHoUrxfoB`PLQf%%O>Of5t2*X +jT}%3a1pYij0yUspm}L2wIQ~d)`~NfHcLE!VBwS?N$k}uh-Jwm!qKb{E*9g!v_7Z9=(KYX{GHv8QM+e +9%v0>r#n%E8s)ruHQvBLw~?#&-$%W$Bl#+sP#5gj=I*L^}m%#vs=OS-#AYfYL$cf--Db`-@oWxekaF# +}_WNT`1N6B>qXz}3R)*FL@IVIOc3Y)*+!jpGyfJ_Qp=uIr+t(2YZnk!%x!j=1n=u*AL<+Q-*H54Hxx@ +(_IS_5!xoU;E*eEk40ZC|xp0i*$FG2^`AiGMznLMC>XPT%o?H#|y^D+0Awp1wB&Eeo~R$kFHMa1%&## +^!=I}e@(VkC8$0*-GG#lVk6Z9s0JOoC5tb5-CB-hzAVDv$4cr9u3(Q96qm~ZmwUv{h#5! +#D=-RVUwneHM@7Dpo0fi9sHo)iI)cyCQ`S^FWGRs^N|9U333kC4Rku7CR`Gxds2M_!Oi%Wzl6N3YRu$ +VCD|_=}+d&$Z<-=7emjg9J-=B^I94I5Ga4S{-Amqxxo9S@d=amMsSHN1Jxf(}U|PD|oMbq^-Mhmc~+nonTd)iCI6&_pJNji&3Mb-<8T@`l&+jF^&t=*b6b$G28ro4%>AWt?O$ +~FoBV!&7M(;itmdZmS0MckW*cQ5?ubyCWcm2ZtTS>rpE$1IMpKQV2@6jis}mMBjlIWeY@^Y{Io|I-{l +p0$&FrMI=AcUMQ${1aV;2XU-fW8!+C_C0t8ZeYMSfD#VIEM +dgjSw}H`|&e@Vyqzp`Iqyv_bYezMmkPu8XWaor|2IFA5#mVNpqjzT9S51m*dl +Mza=1I9P`IAzXPoz>?p`LvE-9P^Rkn(2es?IP%0{5!OX8{5kmv~{voa=r5!jd%y0D}0ej-TD(qi-(Z? +Gb(bp@M`chb@DiLTU*NIHk}UUr(ouec86;phh?fo?0X +E6O)D6KBniOx7Hj~{nn3zj7DNI3KX{ePo7b-Cw2r$@&<=8}pl2;#eb|I2dxM8foUKHT9WL0oz77gGh$ +B9b00*q}zV2_ch9Oj`m5#o{oP;M%zXO +I@sXZb?@d=*Mr-eD>Y>^sXmj`-~jIELc*b5!}Xi9i;F3HW83IW4*@7_Yn{-;Qp;^ll-wH@gILYhw!w! +QaE_yg>T57C$0)&_!jn#QdZI529V)XAA14@VXfK+~ooUY5WUmX`pXgmH;kt0V;reO`?H2Myb6@zt$(c +*j-i^t?IKqKj#$$K2QdFmS$+2S~*eY)Wp>_?5$~d;YAkw?EK(>Z&eYbW6iX%E%rt`BK4IPafV8IuxzI +UXrP`h{GQHQ3h1bG;{(I=9**tvrasz_fhnm^!Xwx`CW%mGpN>`q_t1QYD}U;#$t!@+yDpX%-n +s={#FFJvucRY3!PmbK4af=Xpa|r +`Wy@UvY6sk*dNdKevjoVF7O>Z;`rvFM;x9B+zCUm(7ZYWsxZfX;ylq;<)ua$UhmnCnKQ**iL_6OVy~cQ2EEPSl7#CKKZ)SJf5c0g`Ac}QHi{ +MN`letwJfLCGk9&9zJl+kbzSxhU}g}fjDiLKU8hybS&OURh5P6nXm<-ntDA&9&>;Ii8JU_sJzK< +33+f-~EDBwoL{I6V}9`Qg>Ow3-B!MFQQza5L)M +Lq>0DS*a*w~LLqg_W8YWi3UskklKyHH+M!(#06~4JdZw=J|28tgC44MOkg-C9?pPeUf|N7?b>Fe|JS5_E6C$D#2023DJGL|2wvTAZ*2-Evzsun-wYLzz +A#aO_iH|Y{~IW%cAzXbw2B@JNQ);WkH;6w@kt +Qz%qcny8?hW1^8*y28fwPHB*PJV1a;1(4OO$#*M8*QH#(2meEbGv}=&+}SNo3h^Q=(ef6#rol|Z~qGN +==9`I$-DQjU!T4HetXY#ZhAe36qPAeI#Tf0JkZi*Pfwd7#up{2U1ESme0^U>ek%QLD+{?VUwrT`EZ)?ueUce5N!F~kQyQPOWS=0{F#{lw5(EP{@>hQ^vdEPA6lNfqFsWw&m1a{$*Tq#h>Pk!^w?|!#;a+aLF{_*VHo +7X>}!S&)5zJakH>cOG-G(gng!vNNBFct%CQos|^JI2IFlFv?d4yp~%joN5;Fy<$wbu{uCgHBpX6b(d0 +9Mc!V!XVHF6?XF>YD_-wvC5m#6ffK3TwOBcD{*uL{Qs7q4i7DqZJi7Opx^fC5fs?g_Zk}n)y5kbIsv- +^$ZBJ$i);q&6be@O=SD86BXD85^m^i7ryHQz3-0pp>nqz6Y!dl}a2`akK|F|mD)S-=#<~QajXsWOCw# +6&G`Y_V|vAwFGBuebiNbx<$YW2Uc+-I=qJKXj^gqPU?v~s2u?C!czw;-yb0cf7}$HB-UvMnY9en +(S#i%nl?Z4_Vty19wKiUK1vT-s&2nq;Z?cql$zKD`ReEAew)MVd06V1bW$Hn +{{g0Sm>1fB3uB1j|w1RoV#sf0&THLxOaTw5YQ#!kx8;!zoVkH~UV(EI>L<4RD;6HsHx&6@v(FLyM-~*uR9^n8MOm_s +B-2zOq_6V1QX|)c4*p?QE_LbT_%L=SZwM_hd3*TeyHYGovzQZ^GgMpc>s|HLgW!gjQUe_LGYTFJ*mNU +BjJ)f5>dC3{v4pV1dukLPFakNAp?{9-eiDR^fF~-YRXKW3 +P!M<7HhqBN1#H8pas$=zlDi;CE^;c>&Jlbh$>`9n2mD>koa7m#Q372oT>HFXAR$u0ynoQiI`Ffb}W`i +xq|f=E$*CNl3CEgp(mtRDe$o$g;B*?|B@O6Y(x;0G4-5X;QS>sm4BJ&uI(HnS|&?MuWF!Zf5-aA&;HX^+2w>{r79ekp;*6_Q!#Qk{n`AO%w=7g)y;u9Vad>+JX|3<;6NBEDEm)P< +M|B18ps!|cX1^%j1Sc$S$N6}!6a^`R_LMOIvl54q9M@U00boq%53s!X^KzBug$;j4CM*v7m6r +lcBS|0Nnd&jmjZhiB))dY~cE$a-m;iu0IEXIh?z8Twa%$ +1Mhlwu_s$6Ef~LyTg?8LpWZGsgHXeTbkje$j%5XL61qJZ92bW@!Awrqn?#c*xPd*mls-KO7(-#xRq>- +QOE2j2NkyzlCE<9vOfcx8H=Vo6^2P1y!ywu)pzfv~cvSdS;E07o0a^aC!LjO8itY17kybAC_ +VTGe9;4~noPZ-+LAR-niNDeeU>1=>OS_nuO+zr4&9(95xr~PV(86o?OIXKoqq`fq9HIZ4Sk2f@lU}GD +c3KX)8xNkTZlyKXJTYf9Toh9}$`yQ4KvC^zUhcg-t)#M;+*()cM0L#@bT-fF?1NS264u7;(a}OL>-#H +@>3ZUVABN6Mb!d@@Fu-pb(h#s(VV-AgMYkyWj>yQ&JnF~C6CdN5l`@y)?g)Sq-181Beg&cQ$g?!g|>z%&|+dHUQxf +&Sh&TD3rTC+}QCEAdn{7GHgJeVf*E6-ebj<7wRzqy$DQ(+LWV0KqZtYM>JcWm<7y*4wloVe`}4qZ*zF +B1M3vb-A7|h~DY6S*J@2%x4gMhSqemRtcUUiC-Pzz=y46(34ZuUWhYdODC6;rPM)8P!}!&0|t^pZ*F5 +?u%PVXfj~m#a}N~m)EO|hw$gap!jL0ug}l9k`|aB!;m$4dqFRIP^4r3PWDu4ElrqI(HsgHdz%jyS`QjNtkYZL`QV|94HEDG$602E-A-9gwfj=y3*-{w!+=H)kvAYLi +li)B0!NEegMJ%Bc$Od_K+{l1Qyd(}B10+ZNuo}-7$hNDl +GxBq4j4SsVPJNQ=s7G?~i4~C$L`pP7nM$XAV{zgcCVVQw!|^^2&&Jw+{#t4YqYd^~CD^zx&UKzkUQ0`+c6}<}V>Sm$kmUrqHg~;T&%S@VaW6uW`=F*0bn5%o#!n{!$(^t0hfTPbvq`sU!9ZWE9K@Cv%`hybt3ET +841O}uO|?eBpLCnG``hD%nsI%DMA`KnQ9?O5M=pOXo@1<&9=rKo9$b-xz+8kU)e;=NL3aWRn +P!+)b<~%M6n*Nj>fnS?*uQ|W28RJgUBLU3!8p!S%BVJV0_5Z +0DR$kG8lE+PM4*UMuMRzrw2VomoI{-4Q;Mq7bs=-=y^JmHt{X8pIS#u$AYroz*a>+3LDtGD^Ni*X|%4 +qkp&-QQ{ELwIoaqVF%Y0)m2LPcbLhW9>Dens)w%*f6U>Pf$0)Wi+Pw +p%O#vR54Di&NObs3RadSZS0mek*6ZH)f!@l-l;i2kAsra@2%{#+^VCxY&co!|BLT7s&uQd|X%zvRqLnfrCYUEfIlF= +I3BRY8B&#)JAPP&5G7Dwv!m`)K}e|cM&Yi5EK>iQ4X@SL!S0r2VH115xqQoVyZnfo}G>QX%b|yc+1vY +4=it?WWCBM{;3Ec&6}ensfQr3Ko6jBDab)o>#Q7$O}WPH#EuU>8Y;2>Qp}d=JRWqVR7mLXeUES25N|v +3!HysgAO6?Vr^#`)?DlbN77@O}jf~NfyY?`#=dJW352-_C%>3xqMJ>wpG9z&UOT1rJ0oS$g=?zM-BO?s(WM2?Y+ +`6kKC)2Pz)w>;!kDv}UzZkwmvoxXT98bi+msR`WWk#uXvG@FEV}wPU3B&Ti@tr)IpO!;a^3aR{(tFPO +Rp_Tw8%k^O0UEr@;>{nAG&V|J9L^;&^4!13FGLokLS?~Tg226utqOncyjvgB6%`Tz(Z-WraZwdO8@31II$_5AmKi>cSn;tw{6P^7*@jVp%XzloLr +mH6r&%GrjHqVj}1eszn0+B(lDlm;vFo>M$qXe?m~8U$O7g79VQEwU@oerT!CBY0b9UZI>e#Cx?bA2hX +aD4qSmf6M`}&kq)VN3i&mrQPS#_Jb}o>FvT)5Fh8^F6g;F)#uLSi-!y32Ezhm*6gRfcU@Tm}{(^6{ul +tj}?riF5@(F^c@;pzS##2X4}w&jNlZ_dF2r)>3lUFpIeI-0*t!T$9}g%`jKvQC#RU?2+}9#|NGiT_v@ +gxSCFja(}Np-NbVA*|QD6e;o@3cVJznisi=dkAnq*0o8M?tljjk5}o>FsbveyS<+spd<2|XWxqbJHeb +R%XRhwRDc3%14)g(->(qM)>&8w^!Yz%a9gol_I0AN^lC1X)u!+{)Z2;xkVRdmV$Q4Y+z +h;7Oku^-dt6UE^ENCRO_t7oYy3H(35CkXAgL=Sc}CLEb +~k@Q!M@BfVqk}S2*xMb7j+ht%AHsmw84s_aJiuxs{j>x(ANO8IzK`di5-l6%b*8xz$x8y?`Zr`MGw!-a$`(ioVien2MKf?*LrD#29!0OF5bw +IlNQKAImf+m4`Isx;gcug{kvD-zAF#ft;8*+D8IlI1_;!#CbeLAgKJ)2bI~GI4dSR+OGA6#2L{7=%U* +N{)@M@fCLAe15&+S_phssYKIGBX=G?lCNw6@dWC&7R5T_2>O!b1(4FFv0IAF9*Cg2*Nd0*_CMMaZU6N +6T!*f`n6s@WHxkH99AE7C8FzoRYorbWt&mf6&E_}3!er_WDp$`f`OZ6y$zgc?6>5pp$wHf(o!L&s!Yf +M>~*7CNiZ8l)xV`M0bcZSVO>kh;A&Hq&1Nia*a)g@v8rsd)Qr&vS;lW}=zo>p;g?2qyM2)8)QWd2c +=@T72H~-|urfE?wl{LZP+m-j#VRuETTvVvX=~q~ycV(i=-^)h3P5NM#>Y5O<-{a0lbxrOiKH-2oaWIO +2vB^B7ErL&CQ+=UCWGY|B1~QhF=+gwMZ7Om+mx*}|4lx66g%mrqT!*5W&Zy9OfH$$<(oqUJu%!jup{8 +|SnbIh&YA{(`1${M9d89LA)M5!&Ud5TNr;Hs1!!i-_td&V64PELw&0)9V$qMbi2~iVk{|(r?XfB_vZ+IWF17Mb1*k2aKH>8ii@K`l=_sZ$v +M9*tj!avsu~^C>nE{UW9V-(5+-pASk(!ON$=<|EbP-=)Yib^(u!XTz>_iq0UwR{KXxG=X3Z3TUzd&S$Adw7>kRYTiWa;ySS+!Op^7 +@>;FDr(vcraYBwn2T<%iQluwIaOjD$)_VI;Sh|x^rw(Wo>@2pBW{oU8vSSn%#voNde0Ojzv(~bzSrIvo=}L8PJ1d@1VT}Zay%${j5!7of +FF4x#+$mJpX9cjLdiY-v?(=_;mGBRQKf(nx;x&OA> +Y7_NIPAu=X6E4gOlLDYQyyiZnxpj#e;+I7(|ifMI|{eO!+)7tUpvBx9R{P4_wAgQO>WkE!eW>629Mi* +|zkgyNeN0Gg&jb=mQB3fh%i_foujaUy~d7BqsK +O1%f`Z|>V{`HBTUjGd+s6z!xOV&0*LY3j=_&hUN96BXji~e9Mkf3Ll_O3c$Rdb(hzMa7dE#hs<>bk<8-ca;%f=+2 +B?LARs-r!mhEYf-zH^UfJ0D#hWnhQ_5KcS!MK=sBNx9MnT_{@@}Ets8v^zV +b{m6S#-bcLg>)A@k?K5%)FA5ui$Ug!acqOqX^tc59)fR8*bm=%HG1Hjk}>1>84MmO>m-ggj<# +2@S>J7=$7yzw0SMR{u(00wg=Dj6#tCim_W%;^sz`sP4hYsr`-)+5Fgm_`_soM=8Lg +jb_Gq0=!mO{LGDQZP=}6Tw!oplvBsLpc#&?pmq7K5TwwqN83 +P@vn>!T1}^skd4cm7T>Y?GueJa%)AgHLvrQLP8f;`Y45jCRmI~jhG=asrPUkvxlYEtOI$hV=BisUj=P +%MMLyO3yL!X+9_E?JOu+tV08JYTYjJKfrX+u@MV5%%;`FssVRySpC +neniMp$a)=BR>C^$^}t>Y7IVeCe0|w&8FuU??yN*o(aD!EwWPut@KkK!@ac1C&kcjFxPlqD$rEC(z*`Iv_G&MN#W@$7bE)l{d6?Sf_{0DTgNgf` +sJX&RJTuiNyy%n}i-K9@jsa3)COK?G0~|*%#BDrwk;-yEAszdPV=O`_u-1NbS3r58ZUfUmZSdAXwXgm +NBp}JPV@F{&v^Q_?F0Fa8Db)ve=`bXJf0Uinw=*+b;2pd?R>g+1ZZ2Rr>MBx4?qqj(*b&|Fi*$H|<0N +gCOqS$4W$x)o7p(IK5j}qhOd_Nf0}LGhFW`sb0G^0Pvp9&@{>05d5LJR159$u8ovrr}s +{5P`RiZUmU}hJa;lZKEAL5Za8+YVBTA-AYI4Ht@o8?%#Z-eJw`|{vLA?3MmBD7)(2p=_97TiMOw@b|I +%_wc%itJ3e;j!k#aW4Sf&5`ktn>7iXhrSqLRI;O%5hW4=K+>c9(o#>7=Zip?Dks@-Hs#!3;VMb36dJ#eXLFPdW_GC>_d20@}7kFVWIDa&{vH- +EN1yJJOcJKF73f-WtR4T{wqg9f)5`tb*@pxdWp~3!_XbRvm-79Y>k1bVY>D2A +-n$m*jt&O((YCxW{No=2i2ErucJtpww6sMuJdptAY@+?Ab~7MH`2IAFiVwYQxr3^{&>WtFft}rxCxVE +rxjQ)887^|O4Ui$+fxMymhLT+7%IW^SKfVLnl=0OPR^emt<$f=?Q#S%m1+Obc@8(BsxGE+(3ml1$ +s;nGX8cL39C52D<2ztp*_`R#$N)5*)F`8XUj~&=~CoSPjE|zUW0sB;kkv0=hi!nw@2V-qZew|pW^7vs +zOHS$8y|8z%7U6=3lrbn#q3w1jFdD`$>T>`qNSEF9+aDm>@}!wZ3Sa@-bQGOWue^gvMU^IR?8t +Fqvo2YB*}lmu&FWR+Q1rgXtT{>1R7QkR^+0?m0Bxwepd--ktnEzG1*OnHiZKa^&}#(a59;CXMoAn_Qr +{2HiY#pN-@jsSf*Kf46bguJ*magDtc!=%mu^u23=BBcp$fV)PW<4n23L5*rK#@0l6-7aTCj!*U*z>a4 +Xam|0-1aG~P(_DLL{5v@4fh08)*k%1vc=b&`T@70&uynG*sm!RjDixRc=_qE-zZ+@CXV +QI}+eBketNTBb6r%3VGMjIc|It{(6|F8=t6^kF(s$pjQy}q2m8aR!)sFaf&x1v$dt*4mgqJU_MZg81w +F#f9hV_OVhSzHMq1vx1jY@aXqpcH#i(iY)IxI^mQ#}!TQsE5{KgbuiJZq$erTT+ +SFOrwE>8OT)Ew6i6U0d1dUuSLoGc2vZ%DRt*bzkc$w2k~;cHQ(T@Po}Sz1qJ-wG}PA% +Wo*Pf%$$AtG+?+;Mzt`_<)^gCx4Seb}vaZ&KQXR&?mZUoY?TA1MnZoAAUuH6R_-dHbg@)Vmo|MLTDIq +!gA*JVHSV_*pdUX8)aC2MITv8<(Ynz04{xCPgT;nz~*Xq5Z5^(sY+QLBC`v3ao`6rJhRZmHd2o2tF7a +0s(G$EMoZUXYed%4|aw@{>|^DPYi#e6%{S+%>7~g7Q0W;cdLz4mueH?tZRML;vcnA^7EVu@@}R@N*~p +t0R&Dec}pG=CpFUTRNEj14N@n=}7-?@0aUdS7tD|D?y&n)bt0e^`{mnPJQNkB!O~?0Umjy+;;Abuy+z +*wcqyp-n4Bqt#dj!adPJISX&=&XSK88i5s#o$?I$A~lNTyidze7S64{t(juAtsRE&qnlc+bk)Uh+7uPXI`>X%qOtkav +RnN9v(QF|MwA=LKZI$qfD!y($g~D9ZHJ8PbezjeYoTk0pePxVR6*UUvG=+3d|lwkTx4zt9MrNzbk2@E +0Enx0Le4E!!BFCVTIYD@Fa=r>m-mIufFF^!Kv!CrJ6+swa$yd=%=l71Otf`1zWKH^Tl~8tVcFP6w89o +5#re0S)_OpL*S;YZvXS1Wfff9Ssy6)*eM@#%h}x4BAnLu_W4s7SZ_MBPb-e+Lc<^+)<=-3X3uYO<3Z# +$!#kO(>hyEt=s=BuPY-=}Dyc^ft8P~B!oPFgeN)1d8@}_>&(ZWsCm)#_DQ@apPCb=-!HPP#;Y!;q%Ht_o4_?|*PB;2Cn=qBKa~U=R(S_q2mm)}%V +Bj*&Y+i?-TiA1RNJ_u*2)-VP(sZM=S4H<_cG3ZJKO3-p4a-Bb0E2A57A$d(?7wc7UkAv}tiK0gY@E5y +5O-(!^=9+kiR$(|wg+eLxh%cTsQ1d+>(9>X!gASq51LIo?~X1^=gX0}UJrkk$ZQV#1JZw%!@516MOo> +(IhTG%w=ymATIbt|mt`eq>*dnKoH{p;Feu8Opt~D550)>K!oUUoR8nCG=d%n&0o&WFKNpm^Yg4X=<|h +c0`^C%_1g~efB`9s#Pj|*UdS_@JD&D^>Kt`hEGqc=$n+=xe>Lf8_oNEj)FY)3V{K?ifg~7q&}=u3R*=oF@*oXjD +?P9Q=G6>Ml@4b?7!_r|qg@7@9FtG9&V0#roLDz3(r_>01tKM0y^V66M%6zcF@Xufm%05lLxX4L_1J~3 +*KX(~b##Dubqy4NBLg2J57T+BeQt&y^>lU=wL0{}hqC_gp}+PZyq=~I1JV!!{_!vml&vGML?x`eJ7^s +78DE~ec|4@w)i&QWGY0jBHuuY1WuTAe;GH7~_i2Y+;VIsh4z{b$I>Bj5042cp*LZDw(;CqpY|)MPzdE +va2DDKzM?`iS_7_R~8yW74067A!dQ{4jbJk;+BIj-?uw60ZOy5=DXYYF9)Sx1aE11}<4U4>tSsI>Vvx +u?9;XPRaHfwOp0Ya}=(^m{g2JBc{!(`ibLn2_H>g&yeC;;wQyyOjkXM7o?tZ01%WHY}8fe2XQ(5a05o +d|8z%;+b%ZGD~Ml41ADcN&o}qSLpG-I(?LQy#riYNpiLtS8bwW=)Mq(&-g>5~ ++$(yuPCU{hk?8vR>>Y#eF&ho3$)*W;mRA<{5G{8eM*gRbFaqoT!{iM7b$!wcgmO6uFG=1-3^{{v&wV8=EBir +?)<86ic|nk`~!j4j1di4{o^r4RY?%u5_y2$-*hWyk{G+u2)TigpK2>aLB5{(aJlTo +mfGKNVQQ>+lrUUm7f$QSaY5hN+!FYTqOs*+}2)hl*p_rMU|hH_B4^D5)WRIuq$W}*)6ma(u-y>x|ZLy +LnaqC%cOZq?Sn4LN~X#@2rOA57472YOUa9kmNwZ*Gg0z* +VpmUUjcdN~W$8?-$toe^B?9hQ>?h+-vz0S^LdUh~)pz#Y*ZF^n>6VNTwO +RYZQ}fNkJ;^joq5lwY7=ZK(un+$a(xAfxxt@b8${(vJ}n-EstvzCbkO!v)m!WS1TPO9d>}s)}mqy{W~ +#9?N${iD_#nR%nV`~dqJiOkyz!-7?sBoqJUDUl2kULyQtKI=KWKDp{nOT+<0l7!GW?B`g$ +Q(L7{*%_DyuF2-XJxe&9)<9!NocK6bUs*=wjDO`m@S5P2|Om%#ZiW*iLb|zRzANCK#O9U~|)s&6k921 +V7cc^fh_y;JHa&e)(r+Amt-W}fgwCgR>($X^rtC88$yO*7=&vy8#h@0DRu<+Esip2;C~PH=N^!^ +fIf;AonYB3=8}QFo`Q;%;321Ohh)!Amy&o}%W25#%BS*H0fGsD5kaUCa9_ExUK}Z*pu!I>@GY9b=!ew +&M>|g^qYFt=Le=qwg{8oiPIZZVjVX=pQ75)X!IUjB7huh6t$BG^7^Ae)pq7C2`Dof|i2~#NSfu|qp8V +(E@gx!8`PW|`_9%wz`rgbfm2#?j!8bjZkz3xNcEZ3XTx68mJE)z4Z~=E6OGlVDSl>6D^^LFnl4Q|@1+ +isudK#Wi!U5tZYqcB +{@MB@kT%3O;47LskuvO;}WooBnjl2Nr~S}Au7HD +|Mi_E4O=#&Ny@{fhF}Ikq61ZFGeDy+>b^fWyM{jYq!I6u?44*jo*wCGW@2qi5S|5%>!N$VF17~x`p8i +ipm>60cY4X32^}VNo6~v+kar!+ey_08`;9uNli|3f5n{4%GHg_f1Dm- +*fCWLJscKfp3nVN``BSB1qbx5h|-(C&wjW5ko#V<|7esfr?N!IyRdr!CHZpv{=K8QE5EmD46bB*Dh~E +&QnmGy>RouylOuIq6aKvcFcmorxTmcpVm*SZjJdEdbq_|odH{f%T=sb6e&~(xCjC9LNf@j%X&o +2qC(XkmY{FDCFtg8xuHYrPAq1GCtT8f4d~%u(CBKLxNw}EQQt*apI9<@J|2`?AZ@%kpR4-(M+g4h|;$jMC;HP^om}1v#cx_7l|uAa4Qs-tS#L&2+mfjsE2#Uf=&oAXpdVN@h +WN`>;5`Z&cTdck67>1cinyZaDDmyQoK9A`0@Pp<$Lk!t+;*rLA*KtaB(g0PEdT}_p7_NZ}|D{^4}kC? +k?Y4-hO!B->IvcpDrU2YA0`KmD8DT((z8cpEH4Gfxy8J>I>UbgGjt3Ox$AOGdM$L)FiYe5`*MOiosx3 +6^iS>`qF9u%H%GD8dv)|oFFZW9x1YjS-YiX9l7ToFSB7N9abbdW=bT}HSn_BWE?FBWa5j=RxQ&e=Lhk +;j@cXa1wz&eLk?7P_gozz{d#4*;ZbWk6X%PljS4KuxAU%YIdK7Vyu=5q5lVggYp8O*^t;DveiwD;-9G +m~&-^rG`kA!!MQk%TO*?D4Epq?mutRRXH?8u1ID4IaDClxQeF02TthaEa)hAyfZV~VE`AOgM%X*^Q$Z +x*?0USS0)N}tl>IPuJKfn3*yYHX-=b*6Hh>q|fg{$ZOIo!UJ-`VYmHM6kAgdb>6r+wCS1@lo|eZip6O +jPV^7e_N^@eil*2C&Q_&!?VS#XJbbz9&smugkekhoopa`S{QQLg>b;q$@JlB@iJb`QCW)Yh&kc_0{oY +?0r10V~Rcp&iU*1lxNSHIN|fp=7M?B&ZeF#(4egJ7YIG#xZ~&b-bDH|K?X__Qp;e_#LJ$-tm*W4EbWi +`YvT_o4fhD+&eT@;(D4;CA6L^rM$6j~FwjHbq-SB{mU^%M73li@A=-mIVZmy*=Ihbyh^hA(ohKO>jj+j +xffh8i5Jcm+zcHD{xktP$bn+BbZonOM=@oDp*l*HQeveN$GUx=x;4n?JprMvd}toz{s6ZwfZrf9bwtO +Yn~W@4oVE=*%1VtK`k@&C6L*l* +{~6-i$`02bXoVPUiE=ZM&`W`8+Aso2qV;?4qew+cuxe-wz(>^TkzRz7}m>w^g-j%!5^RbybvC=FfGp& +fDE4x4&2R+oo!YPn)d0HV^9Dd~0@%%xO`rR{5eWs-mu&)9Ov%O;$H~k~Q*WuD|vHm}RH=r$xRA@b}HTcW+MWx~gZ%+q|uJ`u+6u6@Tl)BE+ +TZ>SNxd+j>RF>di$S&-w5Bch@O;0Q8B!twl-nRc5PnS>2YaDqGrBJU^Ykdv!`w+{~%_ECC_S+e-eRfA +F1&D*~*Kl*xmHKL16de=jI~zN+(VxqDeQZAK)xoF!iosno^A7X4mV?bp?|q^B>-kF=4?AFlI!^>wkzv +7a*r_P%Vk8vxJc*V%(42IU>Bt#|dtrXu1K_f%*I7GXRApOND+A?ge)>Wl?&;0E +z;pt8*wc1ZlsBg7EBYR5y2&^HA%erV +5;l@9I`{J9I-=EA+{`b3+*QYPPdrgFO`u@$E@7}&U`6_t&!#5`^>x0?7A-w!n%k +;g&M^}v%s2_ita_|vah)%2_)rvtg863GUI$0L)1SDk*ZJGOzWM9?#WyD}{xX02{`KpZum2qDc?-fcU6 +@LV$6rP|AMv^vLI>fm=+C@%KZny0^y2dl9DA00$LB7iGy1&T&4_-Qc1A~qp3RaMp!W;3I?Y@BL+qej= +yAg5B~4oze7kM&<=bq7(YV3X&Ea0GbpBsilj~`ZcQs7Z^mv;$8{!#xr}ZA9f5T7SWmiL8Xo${%e=GaF +CMq84)a8Y5ip?pV5v+r|oaPG>B)=tZ%^jmy?y!Tm#?%cNn<(&~ZQCYhY(`4K4_?dIt4@S7xK?^ra$oCtBTYB% +p&&V(`Ua=pWuIoe~A5jboBJ_>9g)nmn4JCaIdQ}*B>4xO><4MGRaoA*{;!rq}qvo3#Z824z=xwPv{4q +qJY~KA9}*6GJ}-3yD);uoK>3nd`iuh`DHSvty^5rKQ5YiLmX|LPlyptk91Zt#)JrHnjCx?k|sAH?etY +u-6SO5lJ8%fCIW*FSeXz}Chyf2m)X{|CwR(3lB(-E%s{cgM?&lk)Qnv%D`}aUk%kT&P2QZf?-$ +LfNHJ+lU}Xf%$o-h=JdZ5zqH$^AB(81=Nz;_hdfhg+bh0MWbea%7qsa$SBFwWhKpj6m8ap^5U$9mk_< +{EXD>Qf)#b~}NZt{6nFRqJ^dr^NuO1!~?;4&fUzz1IuO`Bca;4Ivb)>kG9vx7WUfrvDq8t{Ord1x_qk +uB%>CkX3^ul8kA&V7>;$%*0+c)pNeKk2T`kz8!e9?9n?R-9I^3~-m +fgS}#0$8$E#C%D1fj6>`MCO8wN!|q0gj60J3LTjm5%g(l2ir4@13_I+$kNUBul*oE#{_Ax71t +>dE~4h*);fPU5X8x~*YEeTXH1!oBjP?HjKS!Y*JridY@$ttU9RS+$yfy9Iyq2quG$wmidT;wD$NHbU$CH +w+P!95}_T0^#SV9?@Onmk{$TOx;DLUI8%yCPCJgw6v~NIWM687)NHWJ;1AM2Cq;q7it%O_Mtr@tXA6g +pc!Wo?Pj4bSp7hWcC%r{%z58gnMzPR?#EcC|w>K`V^WFWinmn7u&1J_|JI@%Rwmb5p??@YnsQ6pFA*p +J0Ui_%^xZfj(-Z&2PXSXJ32}{K0gbZJWPI|eXq)Ko7`q4v&@SXSsS#Iaw16ITx6_vl2MX@*>(CKHl#z +Y^1~TX&?4KyceW*gP&dg{UXo!8qR2mO;O?aLx7S(Q0npwO#U*4+!S?(2e}|GvY>KT$I-~T@<+fyBDUG +lt>bvarzs`5#kGu*RJLsN4)`RCIo3DNeJEUOLxBI#RTAf=!GtYOkR~C|Cj%6~pV?{!k4~eRaif9@OOu!)JFSf(~Ym*MLEjd}9eQvphUg2(@$10I$>yR$cPGTtRH!LijY>ysKXk0|&&N0>RX7tvtEGUS-$1Q* +E&pO^I1HbP_vfm1_!wnow^yTLGvT$}U@eB*$HZ9}!#8rgte8vJoue@x*8vM6JtJ&I$);dJZ`xEEewIn +eQ(sZxl$@fL!b^?Bx?blvQ}e$j1VY**dq4ttY@Z1wW)|DlUz)vj<(xhJFk6T*4cG0%dsSq!T|q4rGp< +0&IlsYRUV3nYW8;R#F}{NAzEEkTf?1dmG7kkTuH+`^p#)G?6Ao;;}2HGwD~{!Yga?T?fFz!$?xN(miT0#Zmg`7GJ2Ifm!E4xhdcA +aI5oeduNSCk!Pv@E_iNr6;4<0Su}R30530;H~SQx&2ui0)t2g^E=((A*d-bNPS7P~k7ZGA9Nd$H^FDj +#;0paEs7hr$s}9O~P9>z}c;uBl)E}A)CAG=$9b)ECm*v$BXIlOG}Fwfo65STxWsfY50n#@U8G0u +9kPq9&>ffPK8$Ze(VZhRj2e640R%vO${5_`SPnRO+Y3=}8Uarg<}k$Tn?ESD=ff~{J&x?&I&adN(~f| +VuPQL~;-=ym;HiU1|)${sAnRKp!h9$h%Sx!;B<6!eYuV?M(HSv4F*MdN{xCcb!nn$oc)T4ggt5b8Szo +}~(0pwWCj7MTPTm>r$7tez8(i|nj}^xKqXwXMlCH3pu)l8}JGLmNa2@PgP2B9qAK+~7s5Ljmbwlq4R} +2K*VBx-4bdxVTtf;0qiY#3;$OFG_WfThqpUI9#PJz>=#CXrihc@xJh!mc=E_mvtvZnlW`W9T4nY<=w! +&ncaa~Hbt&8nmt@ixj#$doY^W$ss`ERb`9M;--qlA+`i)(wPcDVlfWJub2aZ;GtQNTAS{D=J@HjMdk9 +n9YU8}5hDC&m-b1!i#a4-hPX&!7LgiR!X%ZR3+z?KKZmM$L$y1Ixn_+CIZt&Km*N!nyijMIQB({UjSv +)iJ^M-g2+$U-Bvh^f+0EiYgX3w&aZ3=-YlfR5%1)tu6BRsypyx2BA4O(sLf}R~rZtr_~dlQkKj=U5_p +{;5@Y|ZhdUCLi4_4xlx{jD1o +^vuCxy@P#9IN4DQdWW%RNltnj;fb--asfMq8K8P15W3L?bYs#Jr5$2QpjSrXU%zVb;bi1jW{zAeNrw(CS4e8wne7WJ^+iGwrYDNZcgC-oG +(diaPnk&&hn$Jx3GS7(C6ypF_&{+Bg^@IPqyiT5;Vu30P+KC;Dv#s#k=R5aoV^R5QrvZlTgk_h2yreX)njZV)i?W_8U +>^P>*j~QaGj;0_%wEg>3f>DE}#k@yYyMuu#bdaVr6)waU4U +Hw6b%cMtLxtYhxA!3q-#PrT!-$6^W;?sO^xvLn-OJ{}TLK*d4UF9Do$zjh56{+nv_DI93A_BU5>@~OQr7)0!#G)~EnfaBDcRM`7%w!^Y$s +(k&)NMSD!84+s&#n;9hb0~L%5pZ$~$1xPQ#M9bpqZgul*XU0juBDF!#7EO3M+Xm1L=JLNFw{4xZp)du +Oj_170$(p?5+wxkn5I2Q2rZc`4042g7IGhIwUJq`mv=0V{UZ`Ibehx8U2#qaI}qoN|Jf7dX-vpeLQpa +5NwG5{3Xq1F-^B}vr*qRbH?o%nq?=A$dC{3;E|V^|?9J5*od32dd#svOWCy#Ag~=@exs*_hZ!Z<-0LDtO +i?MDTqBLRoCrnL@KfN>uFS7tOmjrVd)bOA&y|CJ%ghob<>Ce5s;#)!GW6DQ-YbVL8Wb!(Sq)sLQDT&= +Nc>{b{-w@-CP|=WEZsg;<_wI#}waLRo#F}Oz4aOIfHhEbS!h<&@kijnggfAs_Mcx*ifAyA=mHV}o6 +T{0q-Vt$vNcegQtrVH|92QRw0DqPQP$4y=MH!zcBAeeQO#qt(52U&KVSi&sFcf5=vR#(LWuEFbrGa7eV|C7PIv7K#w@4t{-HkVWKhxPV(_x@`^`uB7jGmV8r-r96}8r)p^VPbtjgK +NW-O`rJJ3J<_l6T5%0nFQg0q~%3@pj|6t_s*#3W-MCdTJUI#$sUvTSQt(M}|XSe4p>D-v%!~XpWfmm5 +m=C|e?;_;v#YcP-ppS{663@nt*_l)Q1JD^9A5FdP|4?Nb#_W_=WlKa!BVbby>jCJw=n}8xg^29)h0LRAw*H)olAzXP%3LBZ$I&z2~r(h8<_s4@^ +8*`Y@a41yFFa({<{`tx*lk|PsLXveH@37=R%IoU(C>%|GwENNIt$z&$*BP$;&N_4KWZNHiWI7mFAk!x +dcP8M2gY{Ll=ByeUu*@Om`I_%0>yo7b$bh9bhf(nvN7Tz{I48;JoSWoSlkjRjk~Rw6QnEaQA29-c0-; +R;J(R;~g9o_zAi8w`?#LGP*UBqYi-0xcgjHm)+5@8`|0!HnRFS6DMW1(wBvF;u^ShXg2orwN#i6vfsR +UhsEC3P?i-1PPv5lJw;Uxt)8w@wS|MP7+7{cBqQ4m`Zim6~%tj=sb8=<;l6mat;{2AIa{TDuj$UP3_Z +a1#VBEzmAaMnhGV!}z=#U1;hFQK{}{N+!;L$^4&B;|q+^}AQ6NnXPCS?Znt56|De27wayB^)erbsMT> +=)ofTC~{7uAs~()>s^u-6FKS~3B!ABm78>NotZmO-w^Duw+Mse@Wtg|aOWTkmVT*=_tcc~0TwKwUCKG +)x7PTKIQgTIz_Y7ut^S?FT&pWTQaxhe)|vqk-VRSsUxn!#2w+=R%k7HOqSZ^Q*T8#VS(ix~Z`4N+J{Q +F5Z$cN3aAUA6yP*9ZACkKEmlc;wf@ltPwNNy%>$LOiH`EEmQ&P$F!Nap~pBT0getk{smAW)Qa#Ee?DE +aBe?)c_%3`^|5T#e&C%jZ5w6tGjFO3obCLo8 +BW%dX&$M*j5aI;|UofsX!E(Y7X1s&ZVfpuvkX5Vt5Qyc?wry<6j7ccs8+cLGp#r)nsL<8sNi`sx@y$9 +VN0|2`ypR1tP12~V&DxS-=@m)nhGTy<-kPk#MXUSu;mH|?zuSbpai1k(xrRP%_`Laqk)r|9f*MKzE{4KUQ1;A$>945UAuc&|!UUoBa~x4&CsS^#ze +Jrvn41ux4zH~{oAD;z&;~5YfR&@W!Cu%x66R~{VTDpwO?$_5%*Ro-8IpOBq;3G@G(IXR9+&&~$9(n@s +{=Q*7x>&){Npov0}PITdh+uaqPe&tqcC5_90WlxNo&qLW8JcJ#$x}P&wTm|V%#{w0E+f)MTfb32A$qp +EqYJqaQvtVF`}8=S_UZ-rnpCqDY?#phoD)QgFK8BLo7yU_gC{U`3`PLB*j4aWcc0v32 +5Y{f9e0gm*iMO0ap2R3YYAo9_$FjC)dKv#NQz0maxB5&G@?hdX>txiLS^$!GT5vf-2^G&w!Kk**%0}v8=D6H18kaS7hhc!rO*=iedzGo~H3W+ELCE05n +V7Rt0cai2|ojQ21uCsc%sBnQ0FC;dToJR!MHJleu$J-=xSEYAv^3XTf_-do*T+v1@K)R;VeUC&Uz9kwsJf0KnqT*`_@nh;H +C9JT>Bi$^Nz=*&SKdPy_gHUDRD9Vg&Ma8Cnh(PrY=dtKJ^Kr=0LR@`rLzmi#4fN99x@Yio`JP8RL}NCfmUX76Oenz_hVQ@2O8OA)q0JZV!LX~8m6?= +S~)WpnamAvhut6pYte($N=&by4D*)zEWVuHajY+Fv+==!F7<#HNETDtsVvpi*zfma-~Q2Jmw009kvJ! +B#}keVnF<;ZmunrUY02hJ|5n0GfczalyecR+6R9N +wfu^h#|<3r+nG2DiLpA2U2(g*_eO}+~lYz+R2?An>k_BXb03qPI9=Y>QG4P%^vOHzM3O$oAK}Cp!f(r +da~%p-f8;~p`Sf>ENAXu@>K`!t=$drFFBHT1Sto{6}Dj~fh*ceqV>F4xMfR*nw;LwHJBIHVVggv!E6+ +{@CAqyn;FN3?!Y8g95ZD>osxRO;O82jH}?S7sKuD!?Hah{zb+QndhLPHL^9^ffC*R%;YB#+b*v%MgKR +U{oemiG?sD-_+jTC4<>ePTP@SaB#a2-d<)hP^QDF-G?Q>BKl+AIc1)}fUxM*woe9p&xZXr85AZW6wLCzFg@!cPJD4WmmbV{lTP~ +}^c*FpNCB_-)zL(>^O!RL0XC3|p=rJa>37CFxp)KL%SGmjjF;#<_kcI}OYo9irlT_XP=)wx+jR3YDEx +x6_s}$DC+}md+(GVbS8EO8hjfPDKDx!PEBXg<`PfP*|fwY)&E@bg{6GA8n`jE96zwOY8mhyi}A*LoZN +T|uZV%Jf0_ohC6Wut^ub%+!V~Zu+KMo11qhNZwNe5a7Bm>FwIvlkC#6G%;7jn~el)(qr8%SrVPgV9E +f<0XtY(K*Rgf=k)Ay~*_FhBLp=fbqsyqaryM(SGj2OwF6p>>hIiobgGXUZu(Txy$kO)?(Ljnz!fYQ*S +250?v~2PLlQc9f^^UxVA7tH1yy7e4GqS#;a;#%>Qr}=}CU +(g?D)=X^8yx_V699H!B{LHXc8_yjdF3QO60_@ +or=u&d~A3lh?h-45m6i$; +OM@~HHt}@gG0MVB&2Tg7BK3eHtj2$bR1l)clOf*T&}5eLi`{VHq1brA8x<#AST?;lbRwxL=cFhWI){k +v$bS_Db-u~j9U6?LdHA@^kYs6-6@*JqzV__EQrC+sFD7*g*t4Vg|K>GD3_Gl95c8COZZQE@I-mpXmlq +N+@trO(G!hbz&rkcR4KVV5?kfwZ^%EeyV-(?16`?z2?)eFE@7N<1W!a2@4xvZ6xoSHL68O;CBMOgKc3 +L=#&69^sY{;;&uZl1%!Pbu-;Mh5%X?E48M|%>;$jg-7f0gECtuXG>v|{$y +pzb{^;!Y?o>&L}A)2Pyayg0kGVx)@)p76j6x!G?V(;=FdoE&evBk8TU|zv5J8TN~)VG;!c7_T`wUm;d +xY?R+cKKt$2-_k#QcyjQ+&i*w0w{frLv-rJ~ygHe71H|NR%zEZr&)CYvf6z#hO?e}MT~fD +_gPE_aPY~DCv&25|=mM|eLD^D7iRY_gU6dI!(&d&9nqP*^p96tvFv=WX*vUEb9i5*=Z+hP_oGoqwhvI +bRNNOl6ku%O|qI2_ly?E#mmJ+6V_gW0b>?Y3bi7XNkoVATUDf*v#C ++a8Ety-}Roi!Oo89zp0QnfiQcXWv2XFMo)V`Lc?={BDQ}&nYl?j>+`PkbH`Q6(E5_xlGw3=Y=9bEhNo +M@3+o@4BFsy*`UWbp5E>)TgWFoZ|VAN2|-c$bggy$9Vp6W$`Dc=lJS*dAP|P}480JT`cXu5LD;#e~k4 +E>icLXZ(WKMVR;f_$|YRpIY1Ill!TE$_>Ps--QG6>F-I8GO^$ELyT21t#=7c5I>e!Gk!r%pY`}Ea%VW +qNlEPV{hK%6y?uA`RrD3bcT6M7*mQ1NS7O{=tBJ05q&6?j;x0A+j&+PA!G7e<3r7N)n@WDwE6{(O{P4 +}m$t$mqb^vTGGKF%xi7dcLUEH;re(fveZ;35^{^U +3HwxQ%8#;1gEA=QYLa-Q%Od;IWeW1Nn4&mt6=PQ_Wr>MG&wL35tmR6}nV)=Y>c#F_VIA_gNE;w#7$Ra +$8p@9H>`Ie5*gffq+5PC&RlJ7+WE~$86x@B8|K%rTdbUf59@{3ujHd;3_w7mq3~jC%D{W|9TCa*pOW_ +cE2aj*tzYBb8k1MmYX8Cx-l>9;1IHz*7G&5OMLeGCr^T^93$~O-^I9obI0MjFD4zsvL5fxyr`0d%hL>_92ndclV%0*Qp!secGr6(xND<*Kl39StOSk9Qa6* +bRAd~_aq@3Ro;;axYYAhEa3dvt44iVnW3>rBHPM11I#XLF#dCyfzh_8v8(f#@%TFe~XqjUJx)Fdm|=^ ++?lwE8{d-w>sUlE`P;LJbiUULvvw6&^_dk2PdDxyTxmIBR#6ezfD +Ta-cyT=Vl(~$r=H17vdJby5hGXn@W|P@D%|$v&jnQ;SwCEdrUxzE1P$Zx!Yi3&Wl_xQ=MA16vf5{u9i +88v4)gyt(GZok}|KEqLX#ia?&*(nMKh|7zi@Ai9B%$kRhh#NUNND`Q?|sDLB5Ys`>mPs}G*0PsX-IFM +ty54yc)H^0_|md5gF +1uO2)t3~L5I;!+7p0mw7rte)fqVPl}|XX#VFTL*pe+VcKEHH8sWw17}7rZ4hURdR*F@C7n~__qg#-`{ +Zj*=H(wtS|oBlSJH=9Zr|BR1-|&$iAaGs*HBQnfD+XdqSvSX(}(w!LB*EW?3z^5~OACc5DrLSEvE_r#x3Zn`O`nPdA)mR-1O%uzx33mSs5t +O`P@{^&)1uF$HXIZdnxPZ)O0C_&h@&vnw)~*Kz%ON&&j8$?xtR5-SIB_hh#xWO$w<61krbkL$ED5Z&p +I(F{q-~7VvExDrgHhf(&J0sx9m(?yI%lIWm-Qu4JuTMAcK3P*N-TfmjBJz@*TMejsV7TABehy=r*rS9 +y!PG0qh8ps4#xYyayE0Q(gwVV~eT!yBzU2$(IJdoVcaMtJ$6A|=4{sTqJjaP4#`w2E8v+H?<$sgpxZc +?E(VOu%{BTWkv$uDxtE8$eqB{B97CgcIDg*+U&w +j93a&A&YC`J?HHyC5)9g&}i!H}yCG_zgdF`XH6AZ?sZb*gCL0l&qJfbi8u?@Yjc-3d2t?$)x9ePby)> +cKA9MW{MZe5$gsGq)~)AwYmM$~WGYpGKY#d2^UId0o5XvUx;bul+PQ&>6}c8oXR9T;cU!Di^f!tcH<^ +JbB4=*XLgQ*q{+CR}wXdM_pMNiJQ{Abpl}{AtGyHgS_vlbngoU&@QK$MO&fX~yT}`E>Nwf>wf;1Z5it +aeiTZ)`*@gCaCz#9y~a5R)qm38ZjqETli`@rha>Oe-@gZ*31<5lGj7$ChhI@isY$!udvp!l2iBoRfHl +jPNmL?TZ=1QY-O00;mj6qrsQRMS^(3IG5U8vpc!JX>N +37a&BR4FKlmPVRUJ4ZgVbhdA(R|ZyUK0{;pra${$urrB&0SS3reZ7>RQ=F0q3+K`wBO#cG$5cwQ~HB- +gSUGppsZ+YNV!xF}ioFzt);D6UjmUJlRvSALsM_xpwsyI=llcr3Ic%Va +CRkcsUaIvDB +f2lkzYVpGutlOuSZ^n~Ar;W+pBw@`tn-jYdb}q^b(#Jp_}C%$zn#+R>-W(+|n36YP|{KKme!8_Q#|A< +5EgD-*m=#;{~Og{ar3Z%;p-Chtx@{D773PA@M{zCXpfD2o0$`nXkAtW_Ze{=*$InG5#D)q$W8PQwLr( +nAWjmBQ-UWbjoSbXB`iZ)!XmU6dKkB1vg>lWth3t+Py8yRM7k(6}=;;b}oyrgMl?@Pw5d<+6|t6DD<8 +V4XPVS{S+0w?Q;1JB>%se)RtAeKNG}&Dq=2^OJXM9(0;}VRKqI&jW~u*xk7Zz~pi*_69DW_-V;5H8;S +Jc9^uYr~Vilf1Frnregj#ajr|rUnn5y|7Q}#AQ5n0r0^mG!X?mT8#+}65@;5MC$tZN8vmqK+37M9Pn$ +et5qpK@x{~Fj5jGRiKAKWwHs)2{BKoyMF#|Dq)K{hfD^r&xyf~@L9BXcsadleA@^*3`BF1N>buqB+gG +9C}#Ya;E3Lq~d_)d^Xj-lWLsp!Pc#GACRQfNSG_R30lSYIAwY*U*$XC}xrFw@AiNGc=O>MojgHkxi<9 ++L%DVnytyir*cJjdY!y@hY`4$QjRiGoO$->J6~Q0j|!Hq}0i#(5tlgbx^62fPo-^R3%DHIyt%HblrrS +9lFwyceI@{MjOjsS?G<*NLHs9kzvrhwpoSe*>KGGfG9%#wnh5Q--gRuPn#;aQ|oB#>xj@oAZ8lTffShEI8EzBU= +xHiI@gcy3LNno3kI^oi4?Vlobh~6U_EGpIfQ-Vxkr4xH?Zpf9|q(xDR#4byKMs9&4Fd;qWomRj=-YGX}N7$P`L +a?`l>p+T(A@5{Xv$Il~PCtMp|@~)Q61b?my4Au7jcZ)=h`8>YfCdJFL7GW5zbTsb`_yx1uFZ+<&RL9X4%8 +8Q00vsJ$gWG2(=&CCiV@HYiY{}=bvRT+_7tLx*&m6Yqjt`E(T#U8gY0vuh^|+Y~%O5F+1piV+u4_j+TM}nBNti5Iy>~_pTM7b7*n3S;-v$qeLHdwOOGO1$2F3;ZfIyZ^M=_pFbQ6N9SYYohuU|`2m6(B|J>SPKizI +08tO;ndAi@L3uwW2)InO8u(xnlJ!Y;r6I(EdV`?5}!f5UM@7!ddiFc1R8EOAMr@3un3x>Vv@Ct{Xn(K_$c;-TaI_jgeq#O5Qn>CJa+*Hsmv3$C +i^kzmJ#VYCNBV^AmjYY`qy@e|vUF9%ja +&O;|%5rSh2V~Nl;7{y~ZnTguX1u%IqKY%g0Z$}2si=E0*?jIe(070Fd%#;v>3+W)t26 +m7H#7b|5vxl_TolkO9)B{xcJeUin+O$R8Ln9p*LRvM$l9pC(aokO)x#R_o+3wMRW>cv2pCd1`TFaFB* +jx0fZ2epWi>@LVJi`xF)2DDWkd%H>?H*Wh(TC3&mRo%)Fg#~{roMUZ}KLnw&^4a3c9UNZtmLc<*_B_p{6ac&I^eI~{n`Cq>^q5JjQIQF!ZCpRG-de +=CV%mx%c&;$@YcV4gJwnu30L%Nahz#{x}n8D~Bdl306J%w+Sjqr{C@i%%3-<|-F0KbuRt=GT2?e&_B; +}xc$zO=V23MD!mQxc&S!{-n@N6qmOjTW|&nOZA~kCGgw1|wLbQQGRd$lF}?Lf%Sq;GXP7D}*oF=x%bN +Vi^;ucIk~|rk%-LQZ(pWavP136FM9^xgdZFCq|~R;6`o+1p11>sb8eUK0VkMq?bt7PBsqt5UIb?&Au+ +tP3}`PXHbo{Hgw&^Dsm$rMSIjo>};Ueh02uUCiGtje@YCnW6R2KG`aN(lwNpKLsc66W;q60MLnA%Is= +~&ykQB|lP)1lmk+M&hfdIBOaX*gDO>u(d3g?CSiA9UVMlXXz +^ArJTuFmK*kgFA9G&8tu&Ubj5;TUX@iYf`G|YmgXhnvm%YFQUvOHXGh84*hi{GSDw5l$|OZ*F~9o%zWMK?4Wu?4v)2 +-d|>(w-E)H=;VaNP;0n^>F5r2%3{X6$pfwVejD?#!uK#o#xW7crH{5UlY9|tN5~5OOaLaQS{)`pFyU4 +9LVJ;9dW|MDgZmx+kTvFznlUfG305eP)+wcc4(_(QKimYT8m*;t&=8P8%c7g3KilP#1ce?-ls77iG%f +}z?=(n#UAFY#@t{8jlU6qt_C4N$i#$8h0rirk)i0XkQM!ZDk9xKI;vmJpLPO3TsMh&xHk1`uq +hqh8`4q}#A(?czB8=Ts){if1l4n$1+LF?T#3+hQ;a1_WWj3`s=!HH0FM`M!VCkq)ZO#xaTI7r{z|VW3 +J@6@tlxMIy{eh!}p#rC=+Wq)O5~f%dGuFOFUGx(vjzEX%Ao+1p!ysZ}!!8hc>8d=J9so0nCcW0;6QcgTQT*&xbXDboOsfZ +@QW<`Qkwrpud%-3sM_~dQ@wOgpyEW1th<$zyZKPBR{U@j!d9 +Geou14|xU23S%q%9Eki)Qo9E0_1G*;;~SmNuJOVH^DJ-F17aV47!E#y_40aSwi4wsjYt5IfYc1CLVJF +H`SQC9hJ+Sqy(p(dhzO#tt}@8XdCov)RZ@r&UA{^nE=r=THvL;3_rpk?cK|gm03?_gtk^Io37oX-OXX +cZ60>UIj?M@j(jaj|<~%8!ni`K?ZGf+YAs1j3Y{fTh)U($5Gn%1GhiRUJ5=I`Y3AEI0MCP`F5b<|ftF +M*YscKWf4%!IFI +5kKh=0pMj?@;DdsFohb$84p8~+A=*MBW2z +be`-K7=o(!ImSGZWW9|Yfh+IG+84 +B0&(a{2D+}xSyI|J!dVW65DFLP5vOC6>HSp<2NV8jm&4`x8qV6dvwhn1eeQVRKRGLwVp(etAhhsQ_Ht +>|a!-p7`tX_eQFE|v1kS%3AuO^ +!h0nwbSZSBFV8ODe}WKn_2%;DAJ5-@2tK@g_xk(;f~=P^T$(Ly4P|ET6fCSDDJ3NUhfA3V-%3kFug3z9l*V9ci>WF!w?95*SK4BSSWW#J#e3SgrhO9o^-kYYk?w}1Pp{&!4KR8)st25O>AB#}tMjdp;dim{u&*Q_4xtsoME5m>X${1JlLWrqh0?iq8-@^q2&6>~KN+9PMjN3`Y*; +vS#i42BiUw2C9@6f9&ifj}0=v@c*V$o0%3V)ay~z?2VG3eV7jEL~{XXh!5Q>feqVYK0CGz}ku@8(KRJ +LOo84#RDN|mtA6qL;QF|EOk5}wF$7g$8cA>=dzrgI#j4u+Jg34^nUI2BHwcesm4ammI7*KES5812FyZ +WL}(act2C-&(VxWV@l><2yA3kvHjn*5*|df=?ginbiH*lzLa8HXRVnDYWhURFTFYggR*NMoQ??XU4(1 +C@PDt#`M4YahsRJ*HHoG(ctb1B^2GQv9J$r@$s?ZM){AYe^La}X*=r8%Lus90nt_!8=v+;mo9PCf`|8 +E;xZKETe|0VM{ZkxyS;LqB}^uTVRRi>x;swiANoS-p76WBYpLgOC#GSgF>2oE)2oW(RsfeNF_P>2xz) +J}*cjH?L4>jET}>HA~UyV5LV?uEP+3A2eJV>DR|L1YQFbCr{ca9kUL%vvel)H!co{`7%@^LcJfEw<1<6TxSCT#sX!qg$&Zst;B)BY*UZ4MB=aI7nzA +jazD)%dw8{X`9Aox`;Qu3i5m-^7k1eN)gg|RW0YSEWEPC<6}%gVa~87}&~)G5XA^djlsR}_2ttJ7!Eo +ZY7asK%9v^|QpoCF@L93~n8!NH1W&57{vwdzGhI(NcJqL0I^F+rmLjye5aBnqdvqRZ8LZOOmc>&?B5&nDT?nP +YDT}rXviCa1Rl!s)A$}0wW^7g$K9lxDH}e1sw#K(n>CtwB{aM1TqsCd2j{`ByE*rBqO3d4WTTzu;HOc +Oxo}V1@Ja4!2>^_Q_Zlz#AX!>RNNhmqU2vdKI%9N){I{EJ#W-AiZG3e(^DgPVYyAVc=1CzSVe+hVkeQ_V-{Kpa>LBsi$b;LH}E{7hL1zO?#QfbZ +-J#bTY^Qxj34>ry5fGL(;MinceFez#Yvwj#*vRBzmf?8(SkecmmZyOlz8Aj8?ao0U~;4FH@~$Z{6X+5 +W3FhH`Xx)QmsyZt%G1ZFw&X$Avv}S5&WoR?qh;WBDdXv4k)lS5I5yRqh4BlqdLXktIswiYQ@e@|A|v2 +5>q{o&4|EEk!YDc?~dbuHZ*5HKuZyT%|`W6`4=Ly-5}0&Jm`8x5QYNoNkNrQ=H +;i=Wq1^LMOHC3TkW#C4>851YUb$OFKFxW$O9Eib$>4 +AkldiEGTET%iMj`xty7BAZSN}d;)*$mdwgi!seKn<>978~7(2#uRXlCHvkAIp1uVet8izj8Gz@poD~j +v=ll>dS3KtEQL)-{zM-4cqvJ_tpqhvPt%9uUr#8E%pZk@IGfY|9~HQdYRQREr`GvD^u0Uowky!*5%tW +?n!V}eWY7^9n2CbB1>Pm==mNvMjo?d)!i;EmLpF;i=0fc7KrRKFe+A~U~~WKQYI2PY{dx}jT7jg9Q_u +`Lia1n-Juw+=$;`2^d%2~}4(A#QH|b)qVx7BuuI#8c~SHlOags%EfPQO7$j`n(#l7!IPpM@>{t3aQ675`;2lv<$LVqp#gVQ;s@clx(f|I67SeYi8 +BZ@Cl%g4iM0|(xPN7Se=gw6;L6Hc2KF|C1xE+#TuD9gV84%2{hgXh>2drefE3`Ih>cGc#tA}=%J?tlD +d)(X=-JcIWxOjuh+gh-KEJ@ByRUIkrntg*#|=QcJbwqHP54B651~ZPmt9~L(xR-Gf<5iWq6jrr+8{?B +1HX@LPSSrb=c`8pY{$nU6*~tz`c*Dj*D&6*h*|KP&{=0^O!B~5zcskdxM}IxcdIobq#B@ai&jWbQNeA)+&Ae#^6*YaK)b)#D%XK>MGMHlFdjAFj5$vL8!(*E +xOnLffqF{|0l!K}xX;a{WODZ;6Oqi##X=kpdCpTR`qJ8j4T$(W}mh7e(JM<5_24dm;%{iRnx#{7)^R+ +LCSuXgOzW8d{9zxAev1OH&8!SUi{x*9LCWeQ^Kdgcgs$kSp!FKWgfG-Kigy&K~{}H921SHMWvF0_ltB +a21+(X@fVPqR^7?w#Wt59`Kn=+hNlKl3V3P-aF|JA|2DhU-ZS#!HXIN8~`Z#E~yn_ +MTSS{&)XtD?K+a)-um5EaSxm3%^!nghyKZkWdqn3*o}>96aE8GO9KQH0000803{TdPC*9bFG&ml03<2 +^02%-Q0B~t=FJEbHbY*gGVQepOd2n)XYGq?|E^v9(T5XTpxDo#DU%@&bYy-BC9$GXo;47||v==nZEiN +ezK@cdkOs|=hMOCDBBLw;Hof*D}l;qvLHvLfJaIqzFI2_JA^UQFMjXJYDKencAM4mHwu2o|g-)mL2M& +$PQZ04Rz<-aNIzv)iTW=E7$%R0+%MRib(7gTpfoy#@T@^d^$Rz@@xFEjDE5Veu2(tgIvN*i9593Q@D8 +r4iqYmF>*X1ZEd*M8zZ-d(-RfBfmikAKg9`RD7`FJJ!+)ILr;-p&|&NNOtKhpJn%=dv(s_DX8_|Iefv +2mRl+btz^v@k-Qx{QaMvbHmxrK7X%GW2fM^4IQQhLRXcqs6W$%>&SG=Jq(J@X +rp*InJHPogk+&CO}4L6sUF<_Fmf^#;+TH~dR4Z~|CE=?uSRpOmbU`D?Za(lhjk#cJjxUUlZAs_)PVWr +;4RPpT~stWt*U1#2r=sDq%vaGJQUt9Rd_0b;xd^WUYr*fnnsU|8Ew*;rnu7$xR;VYPho`boTE +2o(|37q7N)ChivjD*{ug)bS$d(V4xDeEKFJ#h4VKBs?w0ildDCv>4%YA1#oW>%wZ%^Q9ujkfIVN!WcE +#SDJGJk9RJPMPmpSsrq`=Q+FOWh@wC{t#X%ar2mcZXDa%IuE3f!jtnpB_s@xI!%{W +W@QCl(!eq-uL-{DOw8}u5Jr87|4){VjM!{Oky;MNE_V9-Kn4OZuu?7Y#Y8yflybNICYoAe;DAfRN@LM +ICU^1J5imib+?Gx$8Nj6tQ_8qp5cMMzlmLZ;UCuAnn;9}wVvPVFL+#D{L|gzZJaTP@g^uUS0&jS%eW# +T5fsC7rCvN^#4lHv5&G;5hh +H1Y30uN?6Az6v*k=yq7^i?N;2fFV@Ci=RS2%KRC-jLt4!q6fad3}bRx~LvIvhY$XzC?^VO|rToLUcu*;PD{Ps!;0IJ`qz +He@APmJutlj5Vy$v(}#OzV9jSh^>%KPwH+OQGmYyWEseF+VeQza75c{I1h11sZ0{v6a^3S6aF}MvStt +_h`{L95vO4SFikXsdes8M`xbFf1X%=($_}6i$I0|CnZhSkO~^pv8e0f`K`Y0~T!iM4AabGmgwTMj?#9 +!5CrjtU^M=AhXk-IE1G|h4VU;nP!@OzEf*OIG);+pnFnk~`48SE5hgsGi$+8nVM~x3wm~QbJYHH7WC1r?BJ#!5e7zY4cHdRcEg$7Cy2ZOF8^rz6_33xt)361l$zRUZVA_xE1B*;Hx+uQz +sq_)ytXPxqfN1w?F&)Z{-0--%1WDIuVg!U}z&Lu3&da9ObnGGlF%tJb +)lqE#k@Cz#%y)fd58eLRqd{+C+o!ijezSG{j70ZP6X%whbkHhNbi>^W-7HJF+6?>K?rMp2jh@zRT&s^ +!Ou!tdt)-hW3$vJeL}5f!i44TEsiIQ{>HWAuwZy_#R>hEG^zwK)VUGrwY;0;(az>$b0gGvs6%NaY3cX +&O7$DaiAi~VGV=gTwU!#dw!XG|G%7{=M88>iz6Pk0G_^lotio-!RC`J)_+nyo!aliXvXR{`;BcO#C4t +j-0vM!xbe}6V$HRf5LI2|UYGoew7cll(`7k+?(xSdpZUfSHQ`D~Kc+BzxN(P+FOQhY5D$?0+^OaU5E- +knK&(`pcvvT(D8Q)j3B$>OqZ@K3!!dOry%k5u##I3t-y!Q{S`A6;Dddpp^IwK+F(O;IY}lm(?}7ct9g +RtJpFWwX{#5X^Z_%d;!XD^XLBeu*)1S4$4%U<)zo`e>R(&_%A!RHHXKy5&;(c5l%{U=!qM?fu0q>_G+ +H>X!K~o{UW}RvwbULWTwH|U6bYLJ1Q^L^A0XQ$2JroTSQ->YCgD_l{nyDe&4o`6qhQq$!6d>K#_VXhX +7)m_b2l@}jx=XEq15qH}R8aN$Ft-)PwIa7lLf%FcSXMOVLYnmbiO`n$t&PZCzyBDQP^DJ;MqDYbdC?I +^W40l0h~-;FPB`q?Hu%iRu&fxj1DJzD1GBr7(*12!Uno%#GkaW{^a*<*(_(Zop;0aa*N~bMSK=TYnMiZamRzsE6U{V5c9{aXf%>}?56elkRA?#- +7lwNHjBQ!*udFPjP=#cBLp~hF#X33JK^%Eoq66(aIz@^wzE`)t7J34XZd}pGM>qn(h4Dmi;?jEW{Do-&yE3m>I@d3N+re()MqBmF5j@;ndd1aHJpl_F-rfhR}9GC!+dgv?pWL#7)FX)!oU9Nx}I$=n=Wee=*5q@qP^62QLv@zDJs2UqGk(gy@;8#K%dLM9eR< +4^bo22~#OhBa|fXo$is>n~2Gr7ARg0N4UC!CsDLSvDy0Cpld-lt(lzGE`#mDrJVeFy)6T!TxOin2LU* +j@un0c5EzKp3@D$l`-@fxrODhW@s;n&UuXTnZb&68+e%R;cqCEWZhPohHPmbFh%??wXk3P1zG0zL%vm +9jfUaDY1`H36LZ9i2#Nc^(z6J!tR9zR@}f!cziB-qY&wCYAGJ#jXE$CXTaiHLD!(zV3F4nf!FIx5OAW +Kd@awiQdy& +c=++pAV|7RoCl*)On-&HDrpLjE`fb=xJnEa@*K+@J+Hp@lgZBGG3F*^C??<7s+O +S{$oA&$os6gT?WeJXN5#ReqEJ2Jv(0c_Ww;3_tum`@OF#ONj|Iuf76JSr%UUKQ}-~u2IHvqGs4ZYnyq +REe)-M#PeyZN!qZRqOvopRfFo+9$fcldjEON(u98Sh{|vIpIz`y2H4wB{2zlWqDiVwLpk(=I~)7h_W6 +K`&DmTZJj)4&&k8mHLV!y>q+7Iw${@6aWAK2mmD%m`*6173nh(000;}000;O003}la4%nJZggdGZeeUMa%F +RGY<6WXaCx0uZI9!&5&rI9!TONeMs1}5S`=7dTU_sQ&7sNWkX)JsmxDq}w5_Zx>O^VxjH3U&Gec5*5w +*J)Be<+3ayXpVXNL50xqK;F(UhVoF6=v@WIgniY!-{RC&5bhsvBRis$p%_vP!X5bO+g;Maj5g2U*whU +R^B~@Qn4c-PPhw)G+hIP<7%gnjT&<`0$L$roO;Gf~i&%jN?q80`yqh$=^iLZ(-h%cV#VppD~yUT-=GSt4d&H*zbZJJH9j8Q!t< +s%5G+Ps5;ey0EVXAviqu0OSZlTwgj#K441GkSbX0JUiK$O!#9iNa=BPk=T>$-tL5=nHOIxFlV{j#U4s +aKWyQ?tR5*(iWT`HHKjmDhViYdy72fBALY8~6Wdb(SiM*`3c?vBrZn?i~aT3LCPQ;Au +sJtan%oFJ^tw-UTpWpnPzxe9Q7yr(``{Cy1_07M)Kn{t=+K-58Na0&jG_OH{+G1W-=u2M%Q(N}E=-s@ +Kn^N94wdAFx^QLOQ2hYPuFf#)ch`KQfvlER8ednBKjsR-u?PX^>pY_Td}zkM@tq0O>=z=2K?yAs{2yMA! +hy&I#ya#Ar*6@x>_8g^F%a|SV%N?rYYX}#H(?yzmG|NZ5fb+N-=%<|-Ezy881#45VTT-x5})*Pr(kV$ +xa{!d@_(8VL_3y)V5>gQoraXC58LsZQ6xkn_6(gsT+M1sPbO>jMn@)2N+t92$4tx;KliBHoYd`&wXXN +hss8;q1wspjmt4n}anc?__&BIKHWH(bmtr0nTDgGz;J7Fr&5Z^dDR8hMJ4+M{5fnVT=+GWJUJ7dm7jG +Oq3S`oX_OD<3?fM3xz*Le*Rm;%00e4y)C?0N+KA1 +>B<}Pk-W&gm}Y_)t&H&8KpHC0kos@J-InRC#Eo8fm4^-suhFXHVQY>^z|hRdG-t+`1Zc}yc5^(A4Ta# +14oY^B4q3_KLLoKDDj{HgmWhvyPha9QbTCfsE_bTINVw{jI)161Ey|@W2aA((_CD>o_KL`Lgc${S`0E +mDfs~hMdW{<4%L2W#_2DS*b&$ih?T)5qOJcjj>L}#Ro68b*T(79!zAxOR~nbRcQN1C%9{bu15c`s`BL%XOot0-bc +G>vXmBo;Ofb>JjS?-=W^dvzBR7hY9k*2sGR*cD_Uo^RK&I&C*IzTYpKqH&us4@CuNin71Yj6i_>~=Oi +P_nAbe4TlUKJ#0> +5=9$;C(3aI&^QRhCO%ndBYeLKOw+;o^Q$ubW>+n<6d=#uMrUQp}a@fx7vdgE+(^GNi5n5k&E?1I +rCSY#)Iw=^P`rdCClfEScQtN?tLJmCU%hlF@xy5=@%7yP7_lEjUqtjCViYFU_2aP6mS1n0Rs}x1x00|VxhCtUVt#b{RBY^a>o*^91)B1sO`DJTB2b{iNdq9 +UoUeQD}MLh1#!#)@1|v=!_H(Cf?5qQ)%6`bjd->~eUSBNG23|cO{lTHyMzxC3}@nF4-soU8HXR898Ko +RAuz|zMTu-PnHxUQs&t#fh8jGZvIY;)p+FGu@8qo~s*JZ7X4f#mGe9t1Z%jy@dSm`;uNbRTZb6p8#V$ +#w67y7_l$^sd;xGs3uBVk@#H#3ru3@iu?U}TwAEc^$C{9{@j54$_S%?A?buBgW|*;lu +%r2Kqyt^l~Id)ur2=Po=Wy&g`cAeB1-%Gtn0rd)_!pq0p3b3YZCHqoB&gCAn^x^?<8X4UK2Fj8A*Tcxu21bB7wWTU+Lg^#h$Ys +axe_!3RXiw+@CH~rEp~pdy58$noh?vn;YVqJDCt}f{HLSnN0h2b;!j>(7ResBi1GkY7qtBR-drGWj$( +Jgfle`Nv4x1+B|8&F%+j#|7`g3xqV8eoZ=h9&x-34Dd*N(XVr%CDz%a6#FY=fb(o|BN~~U~q^;_zzv$ +MsC7m($3dSIo-4U`4akHzf?uCv%fxC1<_)b6`;OyUz^)UKQACs|Xut5nXy~0AUDbbPcp`<}NlN=eD6S +DaPRO=Tx_&>i&j8wX{g1AO#l!U4eoE}b>#;%}fXuo@yH*VTbGuflIFtj^>g(X*4+B>6$SHwfu!Pq=h57^~Y{k-nvWbNExXF8r(Pk;q0Uv7@T^f@Lt%I^ZB(P5e&kl#WDi4BwKOmY{^nQp-~$67E;21$CIMyQ^ +l=EBTH7<6o;-SMtMSRr+`SNuGa4}4G`btnu_Md@s#-o`Q-YM>CsfV~in?Rwh-h|IP$H*V#y97F6W%Bs +i4TQV1fohtK3Zl?rJobaFz+te1f37Eb01H?8U6?8BHpar5L2qq8`QL7IgTGW={T)|k?QZ(f#Z5k+)?HoH@fI156wbvF}(Pk +57FYiMb1nCb8vo_YM!cysvoiNZ%zw8^XhMlPNH3mjXiSxoQa99`NW3?1STtB;DR)m7iaaRH15o4>8$0 +9yeg$TqZJ+ht|>)Fm|A4WC3H<=&ZgDW05-fhYJ&6+z5qvKH1opGv +m^w9wA^M~)g_9nHrM=XC@!R;-R5q%=FV~M_#%`UFWp0V|_Fa9z?q))=aAD)DDpYBdtc==hDSZ~CASH@=D`Z3Z&&|~;O^~`e_+8QfzHB`TQS&r)yTe}fF%$fHejGk?5 +$U0e1dn#20Y8|FB@Uki~smZ`2F2~o_}0lR<#516$l(6B(PQknXP_J}BGIv +myKKFVoZ%V!QQ*RHiZ&<86{NfHs-u#&2OZJDlV?EFx|xDqU+lABCdIb2M$-D5o2(M!Kh4~yi)<$rPVJ0`z?&ztxqEI?xlGf$_KWFA{FumIiv +5rXfA+I9VHwp+)WYA8u+O^XbR+h&+OD$SBwhhXv6YCcS_<)#b44h~xi_Y5%6D_u04A1XR%APRNom+Td +c*PSClDHwqRtP;4TpcXdjPYg6kBiq?^SXF^HUU!zUdZ;m4d)?{06z}t#^eLzAaIn? +)LxCXwFx2%WLB`!yTt>{B$d*^T^lbg>5SBs2WQ!106?NH67Wf|~9C;~^o~*E!YX4`ZG3n9Ch2k78 +^CiO1yS%1*@D{@u!)evsvz#6SIV=~F7i7f@{X!f*KN>yfl-aQdDapbw;537%YG`LzqP4gGXwa$VSDRC +kDM&di%*hB=si&%ufdlq*01yInwMUxC$j7uG_o?475h>Cq*xMw-L!>hPL-v$YioVgip?a7CFq%yctV@UE^jjsUz{ +2|BuS(l$D>Wb`^%H-wMeMK%ma-UVl{lgDcc>?M^$O?OzPXQz{1x4YWruRV8inj+^4?kCOimqF+;ZA$4 +*Z0mk2F^5rcbpodeaBHOi6E@TJJ%9I{+`A^78=)8nPG4b-sx!N!M`Cg&MyoIW4^T@31QY-O00;mj6qr +th=FjKEF8~1Lpa1|C0001RX>c!JX>N37a&BR4FL!8VWo#~RdBuJCbK6GJ=uHzqb8 +ID1t*^4|#9OjHEJ%V9Rv^IOkj!NLzrVib!a>W~-FmFDMFKNDJv}`=-90@$qtWQrNweJ+Wv$jlsnWcv< +19<_a~0<+wP@08g+Jy|uU7Fm`o>$J!#`)IRGvjlK3PpT{Z^&+k=vUH(;X2tnAAg6y8Rk)4o3;nZ9^tbAwsZ#?FI#`? +UJJaxWT;>3*;yx_mD*5Isjek>SRlH83#W!Ci`Lb9gTqxPZX$EbURZ{Arujtn;F0f6vVRV(`tHQkBUY< +u~QWZ_POsY<)aFtdy^f0WJWxA~^UF(E?K94T}bf*pv1mGTGH%*;ooELezjI;FjB+BDW(ydvgA505%2@ +sB7x|pYVos@Z;8QhcYR}a3fpLcvBd9vRg(|PWJ_$ID+jj}e2$qLV +|;Z~mPI**M_16J)vw5kKLVp*$ENCSUNI9V{APM<($`K_EaRSLULC)Ro*q3rdUF&#fBgDyN3WwFkDndA +c>Mfms&GJvtWmYRNT98L$QxjatO{Y`Tx!_Q;Co+Df))zz>cVNhO7c2_r^8h?X|?nbfA;dH=;`q<$4`% +5Phq^XEUKEtwk&|PDtxfTX}F52dQ~*_R3$(qn3k)woKkh3xe-jc4NUeZF3+J>nZ&DTdC}yT)j(evn<} +ZBZCw;V8Ilr)k&fQHef8$$%V#Ii$hIB$pO2pWEq +eX-#f#$?KMmJxQeCUqCV5l=oE)cWy6ypU$P_|Yev3?b{5(yUK-6czAXD{{*f$1FKS_RTKu7>nK99Fpa +jM=l+YEjmzl5*J2PpkG-@#8nE?#5_!JF9T`logYV1YOr;1a{VukEu|b<=aGhW{dw>$;{)tQ!Dm&+1p{ +_5`>KIy+PYS=oq{ABn}D6nR}1K%7^+X8ed{${_$SIweoja9buIUXw2E9n4>GnX;FT2Iw+|>8s(8jCg` +ihKgHJXF5(#-o)p(T+x)Qo}B#hy0}(z9_7=j1|b!O;n}TQw|+T#eRBNrMfBw5^H-1G9RKj_2#N*wr|R +AW-l7D6bz`oVvG6>ppV6}*B6%G}SZtN7RSr}{aT-+Ra;mlyX3i33V43S>4~98&%fRn#7B7=Pzps+*RE +_VBHPAA_8cEtcP~P&A^n?#tAq-SaiPoak74M +5s_8Zu&&LxPg$7n~D03HHsO_%4DDnp?t*Qoe2!|B{227(82>mB^5YuyDq(p|FWFQbK0{trBRTLMo-f> +5%MFS7|0lo!^37S)Qm6Rw5VAiaQ(|c#?uj-*CXPyB?{`hD?p}1t80r7Wc%7HeCq+5*X2`r*X8^$KgPh}-pk|zDY4iz%qjS_Y--dCLXjKz6qW|;Bz&!L&4cG4N`uK{uo +s96iXjdB4w4Js!788ukK$^XrXwFn$)e1mf**mUCQweo^Ek!9eRGx +dX-&pj#%P7>+>+EcL&^qgQ{$euISiUVr~Syz^)h%D`KkvyVn_*l31E5hs4q;*c;pNGZ +5gkPV$W+l5v};(tM9|QT1^srf%)p7|&G*)XK>-57w~Uv-`64<%ifGti+7=Dy-sc6b&4m&Sd=Wyr#Jb2 +<0AWtQjBYTRL5D_>@BldgfWfc@VizzR(lTgu1V5nDEpbV9haseg0Rpg8g)VSe^d``^@VqPlVR}%pRKAS#b@jm|2YbIR*O1b>?b>Y% +oi!nGC|As$mdE{SDz~fWuirFlWKMk3hvOcU$Oq4f=~%yh8$;6*IdqqINb_{_is_Kv9rs!X_VJBs=gOt +p4~og@3oC**6y{D8`jq!E6N4yo{SFQM;l+rvt1=RRs%LMIHr|-PD7KyP&R1FpEHOfMH0N7XojS#9)-y +7jcaozXML$DHt*QgII#_C#zo_zc{8fqzVCrM8!24k+r%=&_)0Ng}|dB10612X-^hRp_JTO&}^MlTU@} +9%}X#u5XVh?Nz3)dwj{8)y_W822t}Ib){+aBs2Dg%yHgytaaquS_QYb!06Vb^=^O2!HbQ)F}M#;9Uip4*ZC0g((tr^vd*$VX1CQA<2O->Hc7FAa;g#+97 +D>kdHke8%TNXlcSnTAQbry3M!RgpdlyeXCtF$5e^f!Q9#i=wIZ$V4zRBhZw=wEa1dXKlHpogpZF&U}^ +9H5{KNV0Le4ZmeNAc1pWH(e@`Xl`Cw9hKjvbs7SNNHoWC5oRxj9u_j#+K%+bX^JfS)yTl3@uktztX@- +i1zmAH?l=>YB$(jjw|0i7IOiPO$u>l#uB;Kw`UTF^keB&X*O35l(?8q%PcirP)Bd+5nt7$;1q@MJdLG +b*{EaWTDrbyj}vF@OZ4wJl=X7m~Wzfc$ix~3H{Tt5;uRhLH}`9KA~E2p-(voKz*0tcR%Fux|anvBsA5 +Ay_O2M#0mM4W8>_9$q>$9M3)<{d{VkqulXWBSaOh3Ot3egPeslp&1BJyk1 +e|kM11Ri0+-FKWafDf`T4zs`H5KBxEByn+7_g+tJ;y?NziHp=BjnRP?|IN;`kifo!FrbOPN^J_u5k@3 +%}WG(Mvm3kZPyVlsLHGcZL3 +5`-GgJirJ97p+vdR|VsUIx#3BYbaxp7~$IAY*9hM*$v3bk~LMRN6%(?F~cV_rqfJsTS-4An$wX<44vB +i(IKGM4^4v+HLoS?ZX^@kXN?bT5SwvVEZ2pfUiD~s +zYkiTu^LvOI0wtV%hh|siazv(l@5#{p~1ggSDPzcA`QDxRw!iS9sQAdtqU_+>YtQf0@vl=ZkC4Lijkd +yzJrpB@;ffu$#zCs%Y$^!`j7_>#O{Ptk^Pt>cUSL)%n-%xG*{?&tTW!102&H)uwp?D+Q5o_@jRuwzbX +wbE$Ic2pOkRj`BfeJC|rwQ&(#FhL)^@;UWQIr@snqND4;cH6=AZuZqvusBVpyI{8iXzW;*b3@oNFXo< +6_bT*bDX}k+SRf<1J)c+1NzC8x)$-0wZr490xa8Dy@B~b+v!XM)HHx3npDU)D9>0=SBrRgiE +DPgLIpFK&7{~xU2m(yyLZn)0cjTKe!IKfZR5M!bbFU~ChmUy-8bL4Gg_8FnXXfHne66SyjiSbWQ0RSa +|C@E!3S2$KG6P6aXpzh{*YyL6=8kayf6y@OXVV4nfFsG3XCK$YppmzbnR)cI<41aaaKEpK+|TGJ;`y% +y?6e4o}~-c8f@LVyww&}VHn;}C>_E|6>lu&hw8BcQ=IoO<8pZcl1hsUHaH4hm|2tGIoca&TE3a1K@$~ +84Qh3+7eO2^l6Sc`3U(Ed1q+8$eedoR5t(S?Gn93(t7D9%OSD*k_+(QKtN~=;5(J_a35T!I26v6S?PD1k^0^2KQv-jiGF~Ex`VeDpON=;x +>aDYI9TDrJ{j|vW!`?;R{N?$oSz=8(zn&(Jp +KJif_2d(c1ZFdQJ=L>oGF5#$pDirxocUA}=JDzJY^ug%{O3DK{EFI50`^)&-sOm#hRnvi8{kcU2K1Zr +v>l0IecYXjz^CP$oW#ycvyX5AYvCNN9Oq@%=Yp>4PnX*6WK(61KI*>KI3{Wkl0?9Ce9u*pAvX;70#)Y +p!>2JM`%AnDT1zHmTQG;@Et!M(285qTHN8V?^_Vv=pT0cAz%yX5^c)c9(8w~0FM0KBwxL(_Sy5cFJ^~ +!UVk8xpUknTWDqUjl)iOgzImu1!tYmMs;|EZl@D|$>CWmm?HS@Xpy^CNK){x@Zo!T+Yr7x +>@Q4wC*d^`OWI@gMtYVlceXrWk%?4%4P1VtYE4D&w;rTcoEnV8^9p`C1oJqO))rzCp*eaTf6-c695Vc +63cxKaq}~neaZU{%MUH($+=yMhk(=925a06INzGt-U&z_ptn=@RI}0P#>i&KGM+>^5LayS->5q4nN2a%{kSIz_p$)Pfn-j-;mV7K~_At7Orf2iya6XOhc5m^eEsY->82bX6{qnp +5LKrl6U0oob2gZ@hqz?^8Uh0nL+NhVJGH=s%(%xq)unvJn`rLe(y95!DJocZENdRz$06D^bSt6 +?9r#FSjAxGAkB~#E!{|R1gq)=o+75lnn@3Uc`9V>4!r;8<9)kCv3=VHU;~Hk-5iU5oXOQ857~GgG@Z* +Fs+&eO0ua;0p7d6j~yXSmw}xDziUo|*4<{YWGM? +sddb0U4{LVIM4p#d`AWyV^~QKuqL-=dUw+K@|p&;2L}2S*jKw`m1vP<==P|~CP&@BYHN2SVd@@89G7D +QHz@prt7E_@jwX6NLKBg*mI#wgQT4$i-zSVu!!AYkdc>fIozwO*sYbwY=wZRA{{-EI)kRz;T}g2u!3- +)$!t+pq=yw<$Q&kyyWs2tfLg5Z5A7%hpO$kca;$a_8SjQ(fr-4J4Hk)`mM)$9Y_kjUllBw1MsM>871q +I2aHHVNA;o3b7)!Q6T>uBW`hpPt~w1Q4BBs-QY)*jhK>83&&kQ~3!u}E#k;Ms>gXxPV%+7B^Im)o4ZP +>IhnI!OQIhSCl7s;#W}Sp1q$Y|}CrDs$0FXNX76Vab30#PCB_su@mxlKHU*u3tpJ?>+}T+r>U +$xH&_w?{UlxTA&fd1mgDCm*FAX=mwY;fi(dou9#94XHoUAGG^5y +ch_$*y$43rB-Q})M-8(Q(G(chu)23Dh8N#wDaj!Dlv0DMRQ+hy&*2tm)WXy(DmkoaFLAPc(j%On^uDx +my2nLvhC8%ywHEIypXb&&qdq+73GXz?Q2pcp9@dqI^>7~Xouzyp^CR?T4@ClmI6tagUTtPZ8kDajUfo +T>maoXB}f=BP7mwy}R-OUJwpDk|h(1EGS+dS?y!3$Gs&K +zDfo4LBp>AlEYl)=uw6tqbAE#2L^u97hEd>WLE4pPN{q0!^@N8(wCYg>7IeBO0aECP%lcJ~fg +HBz_HFKeQ>B%}~bJy=y&UMwZMrnXU^4y2m|g9bE4FTAn-P>;Qc$*Dx@wIh86v}0_7s&5NK;(Q5O(Ygo +f=+zYdVek%3_@h@6MG%5$iJkB_>u_-e@qyb(sEn~|_N1q4FjE}4j*)f@3~0D*^HAKk1drjL)5FM*uBuORZ0#*p8HGmv;zwOb#7~YBNh}A-*ZC&uv+7HlULOpq=NyD8de8`@_mWr) +P6(OFAduaLNI0#=*@G$x3KHMbnvWB0uhbAn0BiZX0sFEefw_yBm+lNmy@Bh`s=@XOnu0NC$f7f>+$Qb +NBZ`yHC1)4(nm&5`LsozvoBxGuZD#{~N~-|B>;-l?%J!9P1C*O{AULnoMUVg64>|AJi7z2v*bg4w`%Mv&B~-!UBzV@=MwH`f?Y+$s>L9QGh>Pzfby($EEu3ovM5$ +NQpBo0+!txRXqJ~r9Tw#|qc7hIJ>q +jQe&AvZB7zrupXMj&W((qL=SJzXW&eTIKu|!{z>e=y8 +EZ9J-llcu?W{W*|5XNyMU&#BT7J8(4(+w*4SYfIh+~3xF};BwoZ14p3p=|7on-+EN+MDw%&aEjlR#+W +3nnKa(C1PWf9V>6sjj{Lk4?PpU(giHIn>p4fl`iT{b|8{}=7!OdiP8fEl?)7WptwNL +TbPn~wBfg*mT1+ok#6M)wXty(ohyJ=*C^V=X&yzgykZo0T%KQXEJ +>LFtrtN#4urwp1FK#?`qz8Z*(Q(vXUw4vPNj)~l6-){ydB`cP3XV~?%!x(uuYa}oN?41dXMNpjZuGaX +w0%9N5*l#Qg#m+h!NHaA8V)6TzZ*6p9&wF2`X%B&D)sMp2jBV*$`lO$d$GP@GYvp=r$q|uSN!sk$*yJ +hAX;2E{|Fnnm=Dfl&2Nxcl!4-JXqs(s=LICueUv7+sNfo1o3jfoFE}8&jtWeE?L +BeOAsMD{8U=EmmKy()Bt)r@)t*!04&c2hZE5z{n}K0I+2Nf(L1C2v(v=L<&HqCY4hcIRr%uWua^O;1`b1ld8_(~skexgkqC8%{fa!%4sD*o6`yO~kuMs=-wZ=$ap*}m?c$~fwd$~q7BdA#xDrMgXh;-Da1nF +55Mug@k6qz&L}BV36_r#|TEjBLt_{XCz!^pX;WUbK^^boXy*PRM`Uo>ky?piN_~na}fBZwqDI*i~b-) +@mauvrx6CCZHYtm#!HY02kf2hqVBNURj189a`PBMMNv2C93Y?Y#Hi6Ryn#iU;s~fD@7P4`3=Hsi)am?4AD^;E+*${K +V0p#lDag)q+#Pjbdj-u9fo4$S7ANaI_&=@Du1A;stKN~iE@pJTPJJ;~BRdGALF8_um3O-uqu%ReqB%X +he>Qbcp8RQ?Z_?JofwpeYjxGuumSl;T(`1l30u%?K<8su@k>CKGvVggCy+#;%r*kosh=1^Y6}%7MuO^ +RJ$Ge&U!>j}R=@w}-YESk56vw)tg>`#c`?vYQo2`2}qo?)%Jd1d}?&TE^4Q +3jT2%qF27eFw3zhYKmMlz6kII7j~Ue+@HcB>N@Y*0r2^!C_SC&UckbALv$&}@c5O;R0?8r(bV(miS=B +>=kEA&52-b>ce|PRGuGUtV!ny(9Q?3e-|#&xjAA;!DoH2^i&TJUU$FcP5%Vx_mdw}8EDc^JN5p+bQ0r3awQTlKuFKD@8{$$g2d_=y5g(G1g2_CieWUIX2YxR3Ll(F&yw3%?Y*u3gKnK40+6vRvp-s+vpM* +{{Gzupjoaicza>{WpH8^P0CF9L&^%2mdykjt!7>wy>HX(a*h?zgF+^mO#O!7i!Qw+zGNykwxWmxm26xHfTXR02^EI|ylyhxUpm{u8Rmo8FhU>69isp?DLHONOcQJi~HiM +a~*Kq@|4T%mgkSK|tKVrgB3d|+5(lC>C6xa$=xc5*hmOxCn_XN}po#j|L0kI^->iT{baehEfu5t#S_q +!IEoZSSR6%4wLe!AL>!>wT~8hxaFcA?1!Tpx~KpcY&pFPwUJ?7sV#c3#0o=YXtCq_&@+khosCQKzJYr +@BI^2tv&_Mu`g5g99v*6z)?En{G5eI2t{c?IOjbOi1(mO=5j@f7q@>{^4PSqk{|NX^u1$(iWg-Y@CI8 +>eCdu^-XkR1?X+@b+^*Pnj14!osG{@VygeqF{croR490HLhRwY*AapmYF+Bfllz=;0gK)c=Xsxr&H{| +2dBk%8pjSBLA&<+?MF@w1*X(M2+)4?O{Qk_g%U85)w4Y#jn&bhNa2b9OhmTCDMHb#lU(%9|c*k4fh;O +d>JyTxY(nUowED>4K){egRM^vi&HA6{Q%|8mlLPAIRZ +BhPhy&s#!${6m}9po^t-6a`h1t@*r7C;Y0FkkN~VanC$y8PRv2fyfCR^2zZ(m6@#MQ+6!gHfSCMigCj +ecG)`ghD9uUgS~5QQtl*Ey?@iai*L`qJIfsMsVYarnEud~wf-@nV-o6y0P}8fDj+W{)_#IfldEqW;r` +}q?0QzNlQBgXR}H`zMI*^WIhu{sii5NnYXF6Fn}c(l`oT@YZ0>)3uhplvD&t}e@Ae{10B9OursrM|^t +N4v=7^3$?be~!%9#x`T}W_mrH{$dIfpFia!N!Q`{%7th +Ty|g?WXE?C#gt_CLJ4OX9`iz@zL+L9`?#q`Dg`%ta%Y#fe>vlBNj;t#HxMtudDpgQCD-#z*)=00C{`X +JKY`g0%IL3zD(o;?~YL7LuVIx%#@4Tlr_-eTiv4M)td+^?L$#MAK*>cobD@{?ubC95 +LS-w`G;)K<@p^Wa)puld?sPBa)tD^zOc2DJRi_>9v-G10hB*a!)C6^Y`pQCG*m)_tD1KIl@$dobA-Ar +{zWzG{v<>+^?WF}i0X0dFEsyX!*e%PVZK{@2ZAczw>4J6Pp^wh~(=WrRuN&matWfCq3y^eK0G9s;`D( +ZbvNRuay$B}O +9kg8kBHi&5~f?F^+Ja=Jl=5TVUuIX8L3@uTY_qvGaB4JKr^`wKoNk%=O52y`dQEgsgzJp#;`o!9-I4y +R~ZMXi+TqDi{_?@jmQPf-0COdaQr<@R!%-j44W +uVIz2FHX0gJJ!pur3j9wE+d9h!FaY$I`t~kt7d~J+>VH}8>CXm#s&n=j#N9#2U^=BBb7U1rx?&#B_AKw0S1K6jWTNX^7MZpUVC<@nSefKW)qVF8bdf&O>#xF|k +L!nP1^*;aOqm!?%%^%MFhC*23NrdO5gv^rjc)8IRJT@ ++ja?gg#H4~G^QLj5*TX#AWSpO{r^n2Z5B&Z(rAO;B>;iaUbadF%Z +s9*MS?8niO8X0dhu>k^8< +D@h5x;IhcNA8;}`!h3oH%;P)MGY;ePL0;>lK5fC#8Il%U|Pdgc3S+LXT<`nw?9!cFQR3Z#5t$z>M_gu +yak=Sh?H9>v%pCWJxrzD*;?0nM7n+$GyBznlnfPST`7No{=-DZXu0^T-P|{ogR@PS5-bK3Os +9!hg_HMbne=j`3HA{iMY_5uXgL9XxfI|LwJcZC8!q_97P<9@_3%E79Ey5N8@TTI;9*ZRw@<-HI}847t +P(^pd7mh-9mGhRoVwwZs6kjDLOqyVhlJC~3IwNq*Iie&M9gG_Hm|7|xQe5-c9HiPW(K_kSFc+OLzoL2 +(=X?D3&~dY2OimoNwBaveHF0BJerQ$Vagbi{0v?br9e?Z&PwSpMma8V6;r;Z^7!L*EaA)grHgRgUyDp +`aZghVDYhIf(~|+v=VJZg0RKmm9i2#zN`OGo|tMmKJyLEch+}FY3kpxY0otgQ;z?KZ}NI?~YGu%4>vY +@HKPbS<da680JcjJ~ +_~AdmRsrAAQ}v7HB+cXv1&WiW6vEs?KRj_zL!DYiIbGy2H82dltEV!N^j^6^bYaRySU+di<@{jloOCx +3a!SVk~EI)0cv1BSs7u+~J^PJiwh9>(F)Bje)D2E4l$1X9Un{I+Qe%w3f=`(IMNvGsE#EH%$7!zPJJb(4Gj))}Y+NOD +=uTTTa{ReTE`bdjf@a?44XdeYQ747(`ldY*OHHrCJQKs(FfekRrMtCnplCMI?=;>x2FY2p?Uy(^Bx_9%U` +|&tXV_-_{U#I=a|0Aj6YSA~9oXw0+&)6Yb+ox-<#Al`Oza;TT41M(fLFAJPg359;rybPGyWZ+D802kzoSma&Snd#5-SbiOug^0_MM(Z@7A!GyNQy|h|JZgFSuO +(I`f<8)zHO}Jf~>psA?9%OMz`=s+QNQxvL0$rWGmUGMB$Ti9fA>OEq+jq}4?*qDemL3Znmj48TvH9Ke +ru(>j^E202CysZaXMJMic1Meki;>Ac9mN(}^C$q|Fru<5fsaj6;0n69;3CcsLotzPY(;!nI87sMjxfTK!QK9oKcgs&#QMDZn&g5T +ctQURDH;S>%=Sc-t5&~mR$c`#b+<9_cz_1@Iz}dxWO8K#%JnYjn#`r%dPEt`8e*R$uS7~5EGyBy$+(0 +vFS-CcCNM8k9^`19N&@$bc2WI8^pss~Or2e%s1`#hPCFP@gM!T#8swC=g)k$w9#!h06g}LiQ^`j5 +;3}bI{=)ZJm{OiplZ#vO77Q6O_{#?hF`7UQV&*FQlL$2y4`j)I=bUB^Fmi|<6LUpjSpNPrwXUA{T7P; +o_a4fI0UI12Cfcl-Ew|?&vrFdlD=|*oZHflmAmG|CgJ}}p6QO6vBtt1h~E`~b2uH;ikaX3)N6&;D^^^ +-*pLgu_1f(o4r?^^dz>4LS{vS&JjmLKbWoFVn0IzE@b1SB$=orM99Bb|w`YLF&oP9IO +D;Uof!SRD@3xFryC$#BotGzk{EP3jY9y5nXH(-Xfd_ye$&W-HyW;CWqLi$luv2d^JgB8`bBwjzc#g?0 +cz>>99oVmFu3RK4|1ILf`d1J;r=3>fgOfw +2qF=9+jPYQj#n6lxgn``$-4<^(HRBjDtYBZumE_HDMV_hnJce~{ru2cv%e=VG_oE=mGK=!kXMKRWha +FqIFn7WfbPk>U#P_0Fq-LM|(w}|Qc)MNcoJJIntYd!nqc5S$&u}H9b*(Oo(Aro!jH54r6bMzw ++AeiI%$L(NT_e2+|zM3SqZcK{4c0XJ9COdn)vX-C&q*f_PMs^KVvY4SF7PA(a~-}j^NIL$o#uf+BGM< +Md7oKI&|FLU454d_N%;Ng?i1OO@>T5gQ)c2a}X6@k2yo~r?Hf_hp{}+@vSkRHZ0bjmCffG*FHLqn}|< +IxlP^re^5&U1QY-O00;mj6qruVcj`1~0001l0000T0001RX>c!JX>N37a&BR4FJo+JFJE72ZfSI1UoL +QYC5$l+10f6qdtR|3MIMxVzz61Hov{)4iu^uEX=g^0bAH{&pmNd4C~iSwVkbxy-Y{f5*XF&GRj3$4EO +<65jLAyDb?eG0=bX|5?~g1r(SK(lZhQ4bbzU$JNFP1}>pr^ITY04)P)h>@6aWAK2mmD%m`?EJz?)hJ0 +06@m001KZ003}la4%nJZggdGZeeUMV{B0e;tvUD+nb7B&GEe6TCK-<0YtSMXevp0~Y}2!kf2@ +P)YXp&DT$N(JGZq#Z;Uu-_BRP1PFlN@tM#^l!{h~o(cH$YnH7L6rftzC6`9e6?tpa(ql;*MLySSdb}2 +bi!sqCn&`JZsA&4K+^bI(Dx6FJ4pQqOFd_NMXduncdDSmkCi^ESD-Yz1{jDqcd>ojk(9@{<}}x#I_2KW%M?d(?Kkt=1W;=qne1ibE>~#zJ(K5o(QQB9IVI(7;|`(NR@YDWbn1^ghjOq4tE8QH);5M234luJC1PD3O +&@`_6KZYpd83LzBRzkR4J}$f@zwqz>3RAG!+TDOMQyY0>Sp>D{ +;6+ppJmciHdPUv9@SfVmmuhUR}zkyX6jW^gCTYx4qfRw(^u938h+*~rFL;Y>@{h1kl(^YIn#MzF&Y-a +=C$=o90ugu>P}zhShaC!)9H;;CR&@leq-l0jKxC)CN&ZavW=N`OqYW5*yd`z@reDUaUcFzG4E^YW9>n360J`v +i&cKsT!~<<%X7^#je$K%_H7L@BV>Z;0T+pE_Vn%*W{Q9=T$*}fKQ|*S&%*r5~v?2>T!SxM245kPP)Ir +aWk{oud+(9e%Z_6~bZsiDjpuV?ykL$HB=kHdycTcabrsvh)8}xdCO9m4RX?9bLr?iq`gMnMO?tg6$<1 +EI#3CxCku4zf7gf4C3myxa^=I5A3kdaQ68`}!rHZmysj;qcyH5o1vbEDWr&9od`?;0xD+b=W%A#7m^j +4&IPTl%^A7chDK=)8UJJ?+%Z@K`5XnGBJSTB5Lqs6X!WHpCLZrJ#&Mz3<2Uf!Fo4`Tq^c9gmWUX*@YG +!wcE4V9z1}~`w5OgI;eTxAMh-L`bu7+L!b9T9l8X_J&2yA5z<$=qvfNSZ;qk!Gv_rZ&qKh%>5e_7A$U +*T;SAl#hiA=qtIL(_9f~g&v|q@J=M{3vYsKo8hMR)UJ0*}x6W8Xv8S;vAD6~K5iO`5qzCq{F)IC)Y27 +!1K^(h|Z7`${P#1Z0)2PA|Z{{i^uyg&9`Il3m(uH<<$as=st_GP>eEzd6Pu9QAsY9xruAk#6J)R~#1C +$gNN+qME|bbq3?4SN)wE3DoUOcz|m7?bC}5RNCB1C!M3YFeo$YRKY}cp6r&d2MP&2O7%cfp%Yn*1_Zf +TaFe_Y#fJz(N1gsv4j#97TyP7ubPTNVM=a7KoE>K`ZyIj<*LoSKh5-f`~8B;6qmF~;MmiAH!=@8uHMY +zLE?Yh>2n`92A{=rI@qHmwBiL00!T%PorJ~6SG3h7_kIMbpz1K)>y_b4F41wD879jo^>K +MZ%P~j&;;vWaP5Qh1s8$t73fJq&6o3_};$<-!S-8C1YzvWUP1LWougJO8&(1>J3Oo6%d<^ribWDMO7`6w9J_Fxtv{Io?p($#pT)i#re%u^7>}+_B1(NTqgF( +)y>Jt+0_;BUjDp1|7B^{HS+t#<@L?0w`a@u$@2U&2eN<66mH2ah?qcLC +F*EF+MGjry1CPWFESro9x91aVR?9zo`cf73S>ze1;DHmp0)43`506r`?FEaM25gHDgZrB@K6d~xmOsO +Zfs0(1VNovGM?zm7j%~^35LKf^_XqHlmI#s3UZQTl-091m=3Cp;mtDMb-k8<#x1N%WH8jk18G0@hB*f +key#|jm+Q}D=K#u=*wGn;hiZi!`w(X87!l-HvC$cihKfuFxMkL;mIrs^tjPJ58vj?2{7&xWa_66Iz_3 +Ur8^|C=QhRofW^m5iqF5TeX|DKev?TI2^bWEg;8nGQuxN4!ezm_UO~(k%n0KZvUKRcEX3e!KWBIr-`A +jPxG3|_IWQPP}qV4{bkEoeu68 +9z@5#&**K)j)>y8X8jX?!4KN{d@?l~fb8S$>PU)>)i;|?EJBa7g(P*SIfOF`mT>Z{cH8u +J`Ai!Ui1ta7cYK9#*8ud5BSfE)7k}5nG>=V)Pd?rQzdxE){7kg)lVgGmV*O+01E5{Q^T~5bp34b&P9kUR(R60eP +*2ky+S+9Xza;G0+jpOLi{;uzG@OS +Rn7zXG5X?*M$6Mt=U}X5Ng}spoo58LM{GtWsw8U5rTtAdPLF# +kjF($z+vwO~qcCguZaB^m~Yh;}x_z651YL*lrAw#9~#j3^yX;UWnMhzy|Aapm&ggWk-v{ru%8J(~9#x)zz0Mo0hx6r0 +=FfW1-e9f`m3G&iV$zhiGq|2~{5Ae12C_|j=Gg1l%7G~(+=45DD?irA6z8*SH3*ehc=zw%whBMBfB`Z +I17L*;SDPwi9q1c)Yj?#h_nU@ +tmvuP=+>`ci3yjtzbLKi@zii#Kmq-ZKFQure!(cWhg>{Nx)H8r38VA#C%P`PL)2Sl|GzIo9g|R2^RZ_ +sYPsk&a5%=qFI4zkaZ3uXLl@5ih8%wm4?@o_)gT2pZnZ=Q-dQ<%e)lxjt%Gq9}KMw+34o1frW)&L +Xd%YRml<;C*emFk5C3A4}uV>_&sqbBFmo^Lo0`l_v_$9gLd5* +eA=NJ#^K|K!!58h;{>25~FH66v@#p46w;RghC!>hQ`C^#xJMUswQ(G-OppBQ@Mkkcr~q;*xDX_b@bH}tpu4KAa&SMbmYLkJ`Uhc$(L@+hdjqVo(=7 +&u^U}FcEi{8`RVyFxrUuXs{wr*>IZg*;|O#M9E`OkOlmrnA3FHvbI)Pd5WfYJ)}MeHRD#gJasldqU)w +Uz4Don?evK^-v~VRTVh!E3Y&tEX%VVj>uMksBhZK8Zrk}ZdOKFApFu7P62~glgLRujVD9HAFNS-fhPbblW9lfQqMz ++l(|~AU@XHBQ0#Yb(*1L3;UmKY2dXM?Ag)C6B{8Gw@UR)f6+HJz_0JWGqzHg|{hEc!*s9({lQTCDCzx +k&YJ+YwnIUzZdgj-n?uMO?yoW~n{T)Ps5qfA&-WkGA|0gyW+)ej(;7L+Wo=d~-vx<3W5Z;eKulJZQ2x +dY%Q`NQ)!ZWmM;DNag(}GP=daxxGgc;EzwSrs*l_oyKgi@41u|SIVrT8dg4_e=;!M0KKW1L$sOBONju +|m}Hg93EPieba>9F!tnN&UBWAbfiE`sT->uQhjTvANa*bwvXfPuB9!Y`-e0$QC%!7Imc_F@^Jr3De-E +7#H#!)8t;)=abKC9#980L?02lg?k!9?>?^qfGmPp%;yCw<-LFX5iAO!k1o;ju-LHi9Quem(~j=*$Pp7nQ%Gc7;+0x5xb4AC-z$SaBHt +4FsqMs72ls3uuu0W58|VS6E~)yZKE0znN8WwM3Fv<4F70g5jM@E>XRvZ`8V){m^S-abkKLGb2Q}EYv; +Kr=SWXOAu$*;L54VG#!4X6jyy4d~>u2O@TPs~oYc<;&$6cA#J*~RfBQ1P19n50vt#@-b)w%C-*HkVC9 +vkF;U|qn|9fLYOYezU`RpWtoZ&&diE$aQAwWE{X)mlh5-UsWdnYZF7H8YsUi8TH;Akw)>eDJf@m*QPP +90mW@{82*9F%Jn1hw2AE`aa5Aaa2GdkE7q?rD$UANqzKY*5BTnK0&{s5m_9^!)ro(-DdB$Ea-Tuu6eGvp+=p4Ne>w3qYsrFHJRQEh}rSHpIPr^ +|Jrfhw6#*231tzU7#&RqJQj|h0ptjYv0=m2H-VnR5UIX2;F)iTuCaAr+)?kv^{Hh(Z8TC1El*4eR;dF +OkuZ*Y5xxx_mcH~@&$C`$;|(=}eGb=IPm*3{QDJV1@1h4>P5G&&EzDKgY4Jf4xI?WXK?w>v(!kU(G!C +>&~}q+->#FTZOr+NB}*0WCg|S)Z!S|5lUDY{9-}^Ow}>kix1REdKu~ITRSWe*SqP!y|!U;PgQv2ecao +e(>ZzW9)D^dbaiAg#~+ILppYL)TA7YDP77^t8_*bbVVI1e$hhcN?#>*`m9Hi$oxP;@@9FuRM$DMQ;j$ +N*n64rs!S1@7+-HC)VG+;uVERiKL={zVWsLp2g+4Sz421_#edv5V$U&q0)gwnUvKBWYxzHWLI}2IB3bc*ihXw@?P~Y6fd2qcO9KQH0000803{TdPU +1+jZM_))00mtD03QGV0B~t=FJEbHbY*gGVQepBY-ulJZDen7bZKvHb1ras-8^e=%Cf?!ZDWu<1K +D4Vp%Ya#QQSX4z@)`P+AQi-xk^CT@ZC6=mEBCSPJh?$zFxw3tVJW*pYZ5#2IylDO+(!6eD-lVcoqFJi +dV38G5nPuxpe1LA1l68@bsY>$&yqApy^q4kFArt&@8p^U%`79KP%;A4ktpz}B)L^QbN2PL6%Bog%B+9 +hZ-^D`Zs*;(7*F2^P;G8$A%5nTLO|M=SZ8popW>Cr+v1h=MxGexFkwDM1ZdBet^DJ|agCFxE%Zf+98V +E5{b-Ku-!5{!K&Z}Z2;&|RRZKdK^q^q*18X>23k+qGA`S)O;pEv5Md8}kMu!w)wX*YWw;`P+;5_2u_GZEcyrOIa_K#r5X)`osG-@!PYTw--0NJ2mSPWmk84_w&`yF--6LKjP~j-oL ++m|7Lg3HZ{GzJ-d!?f4+iY2I+hYjFW+Ye+0-M?kop6J_pH^(+t$^b(%DWkHCD}sV@NB;tC&CWAUTRT2 +*(geO!|)ji__gaXp`>3m3*x+h +7vKz5oj59JgXKpgA%&I34(F)($*(Yk#5IhIPErC0D>oIsPy=#n~{evG!UmE{Pj0(aUy>GEz}}9bZ6-_ +HVPii!E6je5k|ihX+DIPQC((fGaQY$xi?P&!h~JPdrMa`$V2)Z>kgWtFHktti5Q|7+<}D{qkMcEZ(-O +-Ouq5--Q$P?yOnn|q86f<{-TnG8qnZEOeO+sX1fB9(U7&A!MJR`|jLJ2*MaMsZ8yE0KYsv`_O +Rmhz6M??mQxoeW3(=M{^nY$YZw}ns=|FGChz|IBQMV;XG)M#xNVZvnO?m{ceSJ#j{s0(O;IunF`L9n6 +7@iw4Vxb!3|1ckQoiy9vm28@7=)o8Z&{5(AHOIaP_by-_>Q=#61k6tNiD9>S^wCU0=Ih}~f@U%@V+K2 +NP%;k8&Yx1^*)}Ffi15qMKE{6`O9~oJl!+E}tC$!9j67|@XeO={7^gIGl+9{NBP$@_>31@#cWMfTJsaBb9Y +#Q?@~HhY1B2%{m0$7I5dP{cXn1s2SFb +?6f)1~mqWLFu~NP^5C*ETPGR0+$JXXY;+D@#Y&jO*bEcf6vqkf?W#Q_&wNE`b#3Xj*C2713F&tH3Srg +qp|okJOOH+guk(r)-;uw!pL30xkCN=;VZVcXw^8V%28xlN;?SW*qC@=B?Vr+MmftEU!olBNe9fqQ +86pwjU$XTsp3&c`51h2&k#DxY)iWT6XG^Dy{t3*-zDuo4(T_WL=NnNTWou`S`GgvOvsAOvrG61H5ELs +p52(7Ho#1I))BREzGNP>Znj78Zh3bbh1Nm3kd2dm*rSRar|Np&WZyqLiBG%Kd$%QOU(h6zi?DT$kH(}QJ*MZma2$5{p`h +5*tT0$I|7a+0Gf8byI?&oqBLy|?f8G0v4-?gs|3I`M`)#5h9h90Df<)>7!ac1&9Z%gj_*X*8y;%`*k- ++h7xvHsr|Ghg6Et7^%>2i)Q>q_iymRf_~vWA1qZ?#-QPP1=lZO%h6kTU<%M#NQ6b43`(Gxw$q-)2lx6kQ`BLWty?u8MBj@sdVYJ2I8B +Pan@Yg*KMr6ZhZ#C2N_XaAW&H!0e@>0$c0E6H!t2L*fw_fWJ=**1|~k^-k^v$TQtoTS36*OcNl;D3o$ +>MPNt5M4&$5!1^HaH<&?hQ0GcD@o0~shPgdWkqlU>wyX_4}rnlBF!~8MnbhW*^l>+mM_@0&ll&}PTU> +4Vn#%wtEaR%&c=YmQjE3-%YQPK)Y8MzeR8bibk>Arh%EavWT*@DLl!47Oo|G)RTlY-^09^Z>FgR4P-A +g%ef{B@L7iV;-d>)ceGjqAVgc=3I28WZqbNMy5S3N2KoNrU*MQP%Vm)!hSU6`KF +z>C4{gpZ!n_2m_I-kfR&e?>zaihcrU7vMWX85hkQ%)48pwPXiobT<{#$2#HpUfy72!uQ)B~T0&-Ay^C +(sZ$alpAj3tYa^m&rWMl=%hWC%<%@UiW(i>t}F4rvU_~%fQv_D|moYmcrOiPST^`K!0#WN13KH2eIAn +d0qo6AbzUvX>CUx9HT|Q`$o%s_^1015P+xkVaa`3_eIt|VOfQEv4>e0dbU&xo)kPHgb=ulr?~G91{lWy3suieSKlTYcYU5UJ1O>wn67iM@RlO?V>a>W +aJ-l7q*Y1FE0+z>V}N@I0~?HGjX$0!Z9E%pl^M#J2S4Y(erd*~@iSgXXNi{FgtGKa-ypE6&#qzP|uB? +64Ci{xJMln~9$$-;18snOaVGu`?=En^*DVPILqkA-^LuX|^L8?kL8?*U&ClyE^AV&RL4`(i@fJ)-Qu< +5N_@-@rOz?v#N7k6y!QY!8P0?2?lbrx!Yb$WJ=+|H63K$0hAM;wEKQDLGp+{LbJ{COqJT2MoJ>3)8_v +$9cQOap6DXyzaspWiiE%NBo%LhYUZu@R??J&a>W5YWKnl?*<~QsIRrK@oS#8+%oa{q`$fhhV|$%ZIb0 +!4AT)MYT(=BC@t~tbR?5|+`|~k(UeTo*ko=7iK-5%B{uQI%6ZV2Av;CH+B2!viDk6g)xg60OibH+mZ{ +@xNRp)>!tpT(Q_C%QcMuM!0H!;SozTtA_ktk{gp9cWm>tA#0uwkHcnt^vDA6oAO^OD`HLYcpJ|I2r6( +!&3y#ooI&(*~{!CAZGXhl1*aa(2kDV4IRrPdQ@%|FX^nes1(b{1lv(LY>&-y&=n=J#1+VHFLeHoPQr>r+DvDSwj{#Xao}HDUrQfqXW}()_+=3Su@8Z2FNQ1xXEphzZ1VeQG$Fvyyk%Y=}}f%5 +$Z~N}MmLEJT-c&@ePjplYRY3b|M|tBg$L80A3M8PPI?X|_d_WR)yo)m=w|V6xT{Na%&2PF}vGk+9k+1 +cB;Qx}Ogh0S$@_qcII=6Zt!~030yz)D=Hu4M<9jxyxk%3*Kik2gF;0nIM>;$C$t!qYgHB6EJUrO+Ex~ +Kiu5DKYMo(9HZs$WOdJ_RyYvtuJFKPp&k^{qi7dPkv3vh0EI9)zLXD2Jje{pWS_1`%zQ20-rio_^oiz +dcRXL96Bg(W)`mbk!~AZEMzQLPba-wCFljBbdxN60NRepn&JMzeoXy{myqd0~aI;4%K!b_^O$yQ_o*U +OcpL&&-B}QNyk9xpUH16)qQG4!Zj>n+qhrF>Yk~`}e~KU97>nu)pYu#QZE@Q=1?N-r#nr=oJKT{aIw +{BzpBd{%{d;$!J%+l(?RYA*SMOU|XgKe`6|>qu#r!=}dVnwWN=YN;+GJLMvgkv8P*!qU-y5w4t6}MMb +1hUbV>ISUn|K3sdSeUL$OVi|pK-XBh06r=Gbn1aTVtKO~7e{cVKuNYcs1Arst_${nRJ^k=lsW(Q7PLN +L~`ln)#pn;;5nM5YkSJE4+!bh;tmW6mH1z?dzel|RNtwx_Ul1-fQJFCieFJ!gMrOZ#94xs<+afDA6(b5CAOaF5=eA2J@m$cOEs_?=84z5aMN`o1)fl-HsGz?H4>Kr()v8X +>IESj=SXWTpM4`r)`G)T@;bl96=N +sk6yIuD)IlK>^fyQe~k2c>iUPsuddhnzbd~y^!|MLy)pudO?r7Ff~GafFL2|NF585*C!~F7yM)%3Djn +D`)6M)nGyh>1l=d6<6Q&%Z1|Km0fwG~CVY{L`rrRq6=o>G=CrlFD3P4wHHK*TIn^P9GUc-_UrhC+;?Z +7YJJVX$$#Lg#+2WNvg+ulB#L^?t0QO7M7G?RIyzkEY^5GoDlnlxOoH!MHC5e-ZP%0%=^5Lanlbg;Ea1 +ib^3`b$qQ0@G@!q6LJ&Uxp*I60;Z}8^MSqOVUKIH;+`Qhnjf{=AOsUU?YK}dgyrl^{8L{O%E%xy70z6 +Ryh1p$pgaSH}-Sn+g@4W*wOKi6b^qLul(QNKx{??D@$B<{j$c-1iyPg(D;RE8SWJ(BR@N3vxkZmBk== +F3G^gHxd63J)V?W9}qmd8eQvRhy69ffm>+I)xN%+WLLFWwd{si$1)JZEnLg1>ezs5cl^X~Yy{QIsd +}Sq$*FD>p1K0z>;+h<2(AdCD6$!R_CjY-0I`7ZkMP+KngZ*$6NrQqCOr-m8c{n;n|KvPws)^mws#=Z6 +ZW8Mt_xsr+N|mbPRwK@F%$9%a~4OHxR}MBMJG0asJjB*zWOzphpVbcu-r>>D@@irq%$?6)CwZUwUmYo +M##8qobrQMoYx(Ei$0iiA!Bj~j*H6+I-$aN$ZFA2!7%9&xE!<$eC))71EXV|5Fm{8-Y}4clyJ#8?!Um +)L1Pl8wGQzxtxk1V6zkg2Ag&f~i$?__WNJnli<0)c5ZF!(G7dyMKVGGag~GZ}GCNb;Yt~Si=J%?E6$lppsk;Ng~v|9!`1PmOG@>cuGxHUtnOd&1=d&@k0U+F`vw>ykc&bfF$kla{a+<&kB74m@nw` +hG5kMCo9T#)RB&kQV`lG!)l&#=sUmB7bHYRwZd21S93ZM|uMQiv{{j+FPw9uWvG}>Z(Q&Dn<)yphpYJ +ktMC{HfM@_{RK~LfDCcoi07o)T8P`K)prmKL6!5d=D)itUcNjufk03d(%@BI +okmj6#!%*bN(TNq-(Lp(pc^)THL-QG|X+8 +=UPC^~jRPxDX%+8Pr(AUA?yFB~?G-vqkP4{=Q}f`RUi5EtpAo+K3l20D;~Wl{`s1ej8+8ypkt^4%jq% +QM~TQQAq)i>gn8Zp8>Jp8_gty=>M=ZJgBxHe07)0cl1D-Z+8aBa2*ts@YB%7|fP+=9rQ0V9hNC2Zp!9 +I%8Ten`4`jw=TXn;)nk}EjH&XTbRWkkZO<6d%PiR4kLC;n;!!@n$iV<-ot%1wHw>BrCtAHgQQ-vDMYr +hefvAflr^7Q56ioDZipGGK4EP7EmI4btUdnV1^Re-v-_|XtwN_Ox@$9yl-U6`~&zK0=EkoAgEQrgrlI&xC`j4P{R3}whHu +dStwys`Mty35VBbU`_d`V*ksGUg#MvSZWN-Acu`(RrY{1u2%?jG0E2G +8M<>wl{iv+)BZ}ZRUU=cz3dRa^QpconoMCg&ex=lLb!(XqR5iO(bdLM9ap}>q82#k2t)H&3@-%kB4f@ +&2ayy>|$9RI7E(V-)EzEnN!INrl2A42TW_OD$o^k>;rYBXC%H|8%SQpJixmLs0cG5$y7DqJX74}|CN^e1?@jMWx +yRK)WP3bav&YGBz)e9yLhFlg^KZB#Xqsa3@ZkyG}o+IVEIMssz7Fo;$)UC6xOZl^U1n$9-nbmG&866= +;#g`HOgMlb#_xuR3ap*u!x*{%P{8l!!*7@vWvmDy#>zw`WvvG-}clwW@RuP1Vv%oOlF6rXK}q?tW36k{?LRKM! +oueoy;8WF-7dsm=TtC}?KGfu*MR_`8vXr&Dmf)C((Gb}G@Lj_0gYpDsO6e&I?HkChO2ixD5LPA%ueGO!j +UnqqqqFV9!bRO9$eGI8uAJLh*gk-lb3w*z%^oy~y)dCOlo*c_Knx6QDsFBHN(!M07Xb(d|-Qs=~X +Sse8P6w^8>_-&Wy0@NdtfJ6XD)S+VGTn7bvsY{}Ew9hz=2=pN|f``v>b=ij>q-obDOkaN(=DWp`D`>Q +)l?ABW9jT>(o^wg;y*cEm8o$wYPe)4hfTPGU+jkD&c?+$kRhii{ux;;SZ(#Shm+GEhnC1-bX@G#>415 +ir?1QY-O00;mj6qrtQDQyFr1ONcK3jhEh0001RX>c!JX>N37a&BR4FJo+JFKuCIZeMU=a&u*JE^v8`R +&8(FHW2=p- +W&q5oiTE<3M!DMTNZh2iCY8f;SO{qGIn&uhBVu&8}(+Kc)soJBg{&a@#ojivRUCHSXzlkI7Yir(!x_h +m3!!0_?qwK7I)iii!v-BQzSt$=The}vxWFu>?SrGZ%9#>il^Nf4(a1g`cLV(M`{*~5BpR?$#tWD8Ka| +jj`r_-u>UfVu))Gn|8$H(^{+2xy8mv7l$AFi*ju7Ag-9nWlU+*zI1rH7lot3?j)q_I&HF~;kfF}Q$je +9(eh!3Y#=XiJYNbreXa_$u=GH47+GUXGs}5N{qoWghWxq{=ZYt7TI`ez(5I6#>xyJ#An()+FO*YOqRe3rdTsR$> ++)DL_fjdcJt%T$BR7Buz3zLm1u?LH3X_5Deh5E4dyYCP|@%^;aklrt@eV_hOnDS+z=w;Axn!z*bP>ywViYNR+}Hv~+pQ8EqmgbiE+3bU4M#js`wS +cJM7eR_h;rHrN%{6q&=P%tfI$z%-wD-z~tm@QGuW3_zOg`{E2k9VK1 +=0fB-O&hn92IJ}Kr$-47BUT9-@L&Rgd({>8|>kFZDk`=Z!dmIa!4fJ`j{WRuGc-Dmfo(euW +pp8O|lEt0r5Vur6csTn}=bP3#t4c=O>=?$pf~?LuY8dtF`NV=+b)aN8YXRb~|wv7-2IK2+@SGC1zdRY +iUKg`(<7)fe4lZzB$RKe| +uSGkFGZKEEO(zT`JB@NaKLXthQ$*kcQ8Xo^1@>T`NfZ(u<&^m}`opKvluXqNGjhzyr&Ahy_+;qUn9A` +@-x3jyZXsTom`Ep>>_!V}It7_xdOrp4I)PM?H2iTd;8FF^2;SP!mouBi)?8xk=O1Qi0&DOrg&wo%I>C +Xa%DLgamv~q8_N0_!6`jsd#qDOd*e@VzUrviMH95M1iE%>jwGXJHv-WO4`R=jUch8;c(vb8#>G7@^4fzB3jKwLs}{olSDDywaevlv6G@E +dA{p(Ct02oUbjMOLbpm(oo2axUM$>tCH8yX?END!H4Oc;Iw}8EvwMA%w6!OcT(j5SYTpZ4Qw_XQZ}IFyQ!+Tbj9#xc3j!Z->}%5EZqDS(iUF@XCbt5@-~i-g=jriV@5Bt_!R#;D4 +q}2gT<3YJShZV|AE?|b_~(b)BYtxS;pfcqY=z>+igl+n*)l>azHeAbj$9vlZkag=PE;BAsgT@6WzWkp +zfNj;pCi}Yb4_l*W6NVWqXsw*v#LI0 +EE4Rxo237=Tb+RG&Hp}OC+Q&6X$X{NlpA+~3e}eNK*cKkRCiNYayINoNOwbpsy)?WAaWEA8_s>=|N+7 +yxdJfbSk^wwhK~fX3^QFZdNN7`%nrR9rscg}++2FR?5pM{A0#q^Fo~nbZC2L5FW{=-iYr?YqhNQ{)4n +;dZx5|OOBYsYyjX%q*DFD%K#8T9Kd0#S93!6P+zmz!)p +b)ljLjj1(|Qi3k9lx!LF*H+%#H>iU +{akAwAIo>=CLRyo?=)UZx7_wlv4u?jxa|)RZ^LD2DM<(JiacDsQmXHKj@-5>_ep$fmc09Pz$0qD0L|D +T=;I9#Bv0B%D^>-OxuIU6bgDL8$&^mVt7B-e1 +Vfl2#h2b)eyD7iqg@Uy7@thj}#347A=5v5#>hPf^jDwuD98jH$Z~O49(6*%0sJ82~r`uP*Ps+%?R!Fq +++Pw%wh1jrU*x~G3sC1?tAzn0Jcw=^Fs;#)T(RVYh1k10@($?sn;{a~Iv?UABfNqL7u{&9fX2!A>}9Q4CtS~>xs)&dJg*nJB*fz=(})@#7A(1LuO#U=C0Y^&73Jp~o4RUb!8i5gldoS?d1j{^kXFdc5!TCYCvh`e(kI)!mF9$?fZgujkRao#czc?w@Phj20# +O*z4-4R-Qm{P)3P%sEa#2X%}?xpBj$DNn=k4+n3%@1ZT6fR=9|AM;-Kt4+L9Hz&96v@JFXU_1ohL&Y~ +_B@L3Z5-07tQBF&n;~#$%BW(Nrs%~i+tt6eQnWyS>aF9rVHo8Qe#SDf4Sr#$t_R>i_=c4Ld{0f^ +74xl^fLaRuV`4^LjJnGNu(rCR07fB}YNLXhd;5WH!}Z;u!CPXOgPvG@d4@A75r154ni?zj{Uj*-wH0ef<~g?E2!DmK=_fga3jUz)H4lPf!4a&_1mYba{`rSi&yDwO)# +}fY&sm*;14t78jAJ78i(dqIvG)qGxilT#BU6QghgJBc}2!59U6@W_&4b%yP8amuh;h>F|2tt;CwaYx> +lXJ~#HO|+w*iEKNDYTNpyn;H`HI5qr%-Mh&$Q3@DZZlwa1PhXv%pQ%sdAYB|mR1lXy?+55Z6J_0%V07 ++BcB9-4Qx-YO2E0$#7e%~!Ku*QZ9WGvRt(y}LEn(`2Buw84NO#HRf**J9#ss_!8@}rAl6)&wbKZIpAo +)qObf1CeIh0tR73%d5j!EgnL**^8Vy?Aw%ezZxA<9pK=u>oqbCqDCKyLtC(53TZPy5rE!VT`0v#vsSC +bWle7xz{B91T1!{m%9#63%gtd?*(xmb;@;0UK~nA#@nh6_G++wT;ul8!r3fh +&gV~=}!rTq;Xu#2{={cWMuL?gLIrjKI^^*#EtVyfcz|4=zE2^sI);x%ndKnxJui1iJ_vwOV=?n@>bwm +=*L=D48|!|;8b@2`U=AhH7=kGQ?w%9Vnfpo3$aPb6q}`54Y#n?6R)9e)g6{~ynkyecJC!7c;(HqAZsD +NocxzVwKR3o!NDmGM8-K@k(ubz0j@a%w9L>uI;tGTN)}m+5_IZUyvuy5R!(X_a(Ln&}bn!L;Q84xt*w)Vn{PLHctL$ +2-H8w4Prhs1ybgnFcn?q>+dK+poe0DQv-ULfEYF)Q3fL^dt~PEQbRIvC(*zTgbEd9+W~Gyza0S*~Tr@ +UqoD?GSh1VgNTywuXJgAb#e4@F-8PK9Ww{L{}{O63kHwBsAvfS!1Awhf^Fn1c}W*O`=BaO +whGke?%*!AuEoYo<6?~G6Zi^pc*bL^YByF_1!pKv-FX>6SIS$_I5>z0;(IClXIL~ZplUVXJ~H+ddEd4GIpF@BVt05_`BE9x)cbU3~BFM +3xg5F9FMATAFELcS6MgD>2$Q4i$%rcVg;gBWAawh%b#~nC=%ZUzrlfC}_6I?6r7mdeH!Q|6j4EA~#*l +B;eL66dGk2ZG23${{c`-0|XQR000O8B@~!W+pKr?eEbYEXCaCwbYO>f&U488kT2)<4ArI+p|WI1GSY0=e;@VbuLYQW +a3qTFnS3Ob#bS{>(&CNoffQ00$^;X8LOCZ5YtU5JRFpbdpkJkAP4c{IO{*Z!39B2a456=D^437^_lfs +Ibe1z=KncpT$YU1`2g9U@@J(mgc&Gp1MaA~5qGO7IaSlrp2)Ew6RSYVE2AI2ib}V_Bk5npp +OTD4*An=BI+EhHH_=boEker0rd6d@g?8f-E2PR-<}^H?jJrS39HVSuM>igV;wWtDz3=Wse#^O5-w-iE +7g#PxCgW4V~zRbQk9^{nrt1_SjLsJO=iIxr&>Fo9Qb~nxCdgRSKS`35P?0^DT(@|l80e)tf^z+ +&T1b6`@hW{`z)MXu)(A?nj8(H=SVdamNlqy-EvBP0dj&fJ?4CgD3GGwVB{NWK3^lj3u@m%il*wumbm| +CzYdA|a!e-98Onnemg;BhD!Kv0xmq5@{o@~BkdB#7BSq{}>HRDwEDOg-D-e#Z{p{ZS>xa=)Vu|mxr!(r*ZwCAhi}!2^?-sHBuuD5PcrTza@6aWAK2mmD%m`;7SnRnv>005Q+0018 +V003}la4%nJZggdGZeeUMV{dJ3VQyq|FJowBV{0yOd972yYTPgoz3VH6g|IdllU@rwzL1L$Q4v;hgBx`bbo$}{J_0z4xj4aqB7n#rPTYYlA +q=3$Tw#v)FGMM&H=7wzI_EL?H`RL!s-vL{LN+AuR8-|MZV|J{`}k7_v@6aWAK2mmD%m`?f@3If#w0040d001Na003}la4%nJZggdGZeeUMV{dJ3VQyq| +FJo_QaBO9CX>V>WaCxm(+iu%95PjEI47?5`W-Vd!YQPU^>IH&r*M^hDqG$p_ktl~--AYnP?ZE%OLsGJ +CZhArWB8oF}X6DRr#6%PsP?}V#5{y#dSy>1L;e#yFN-=7`9jD%xJJ~E1`=XvjSUOIkF-l$rl;?_xJWP +Wq<-tQJ8I6i83-h?ay|SODOe)1w8Dv~Wjq;W$T8d)pIBza*mh@`%e*JEFd%gM_7BHDioZmD8oO$w*r7 +4kszRHv-UgRKEC=^N}!AnKtE1C?W(O^ysPj9X^*X!FGbo1f>J}##6=+2E(s2_@mw8inrQSx$J=|{tEm +g{#P79LDJ^GW|*ZQkB2CexSp>*M+TVFGt|J=?)!w6C=KV%o01VYI$p)60KuR}Fp3#RW_+fIu7Y;kc^v +Vc-`Kvm~ri1^%DIT#-m!79x!uk}|U_?MEafRUR3OAwrjP*b7xMEMWSjLj`#CkxY56>r9 +}7J2J5y=AB|73)Q0r%T>s82|fqkAAlaM9OOg6CV1Wy%#If^p2Au!%a}umUZ*KI +Gj3*d9+pn0O}`Bopkc6V*64juWM!lzNQSMXLvzSHH=;QNIM7H6;_!Oh8q@1A|Jk7?PshZtEX370$zq; +p}l+k!$v4g(hOBMI-draIH1p<^_&;!9G_U-%l)mLZn+!F~`X9ykk4@oGVH_$&{FRHw5d#jACs~fn}_;^0oIC-#l)gv24QY2=3%kgA^$)Y>4&4zCJ@i +im(#CEcCe=w?b#MU9eO+czeB01_l7q?^ybfO9KQH0000803{TdP8q- +EpY8|%08}3U04D$d0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WV{dL|X=inEVRUJ4ZZ2?ny%}9^qe$}IzoL +)P$gsj_viEe>a?)dN0T4wiZ!IDcD +uaXO>+6S;`)iV>zY*=<$N;Pvg$zUypEE*Y$z+!BFc(9TBn>QS#>z1<%TGQt3PJLEjm@H^ThV2|Bof)=BU#M*QbEZvHCev*{ +wfhI{XnM|@G<=j@1vW>6q!F)pC@;vYNv`lxDpzH-fWA2J-4Ud-Iqlo~=YuT=q+4;PGTjac%lUw*D&7P +7pYw{ztX%N3+M97N}s5HWBn&sP^Zi0>w-Q+-M0lxywrXY~=64(@QU`34vdYF?>R3aVIq6Ho}ud*DqOr +G*)Pf$G_JV*GYg2$CuAa(0)DIo6gc8O+(bh9O8RZ>!I$!ykg%0jp+b)sfxGjto0GD>QoL^mNxiSnvm0 +VTYt$^$JMr}UfvWeB+~!L8u0(lu_N726a01{UEF`3x)UDd!Y+EDCa{HlTLx?EAE?X$j;6ep87XvM+aB +KX>FdbepzC6KUU(qN5VPC8v_xsd(3NbgEbYY3%pt!({afQk_*IEdTx>Jm&()YBrPRCcnu0tWKLfEa1P +%1!V9H+w^WQuE2=x2X0{D9X-`f6TF4MV9zM`+rmoWfnG@h86an+4H;6h?Ln0Hy|BLM)wZ`NR@TeikVUvK^JW4m>0Ra6D0IwA2pLs(MvnP!~RaTc6kdg;EeGl2Ypo~Kjez92busnKmNgAIMQJ=W2LJx +DEhN_^LLjg!+?i~O^HPmp}RbmMnK=2-dD+syg08Z3E4JrO4R+)Y6Rrij3q|n?R@{%e~>6TP_MRj0y#{ +25SgLnr9(`uPpTgxUmqS(g!-X9dYA!rCCVdB5M23Q54Ms6#1h`b1IX)|^(FC<>{XO)9(pvk5iU+)$K! +3lT3i_xZKr5s#(5!LRomcT9i(>~Akj*#V|Cj_q7*fFF~XAE?>AQC9_+t{K#?J4$hsySBU7ndE~Gfo5@ +X2YI`dP~7I!P|jNVYOtVITJBGR#E4!B`8^XLF_A0!8|MBPNDRfP`gB^-0|U*7UfXZO=8eg6MDwNG*UW +!iyhvPTaXeWy`)dJqR+QJRy$=YBIi|sNhns@i1dpDlnxDbr`EW8GV;giT_Xhd1Cw{D58;PkO4XP{gH9 +RjqhdmjS5-OF4tvJt8e}C=9(*eUt*+(|{~x=kw|dU+yWW8d4$@@rcSf>&ht@h$Jiws4G1>f0{ZE@SOoy&Y9TCq> +3!4KqTSH}TXbOsOaNfN_L#X176?gSWp9xe60{2i2`VeR~;`7ojAGg}I>8H_r7ZNK*Gq88mq!A!uY?2}e=q}M6a=a@a#Szi_ +`v-ja8`)C+*ZE#p2zPQY|@i7M9}T$1^zKM&V7RP3bTT~}=(`;1LL5!E%TYKEuEGKqQyQ=^8i|1=Y2dzw +8aSy~kSN)3CGmvK*LU|j<|-F%V%PBnU$O1P&^-Ig6)JZkQa#qpWocOLTcI3WcC4|RcUv0-%2^ZrSTnu_DVL;6TTa7L|JX;;a^L6-0KP!Ze18lbB!Qf;xx;3hHC%2-2$kCDH`q +_ov_;5%>}#~H>a*sU$;x0+_C9LIJjiCTSmja;V}z7lm#yq8xs)1Y31!J&m#YZ-PQjQpTeRB+C|z<*%3 +6Q>KL9&q*RaX~f!4LdqwTbx##ef_`DU>Um8wk@ENGMwxC*;X4dBBI`6mk&hIoCb}-cPqUx4kSlj1#12 +%b{6^@;+a`!93b~4o*#ES+8dEC1x>*K(3j))y=IS}aj=tGw>wu451b@emg1{(2NQ!_bE7^e%Bix;Dub +!Zl}rtr7_*YfsK6@bFGsGEX1BrZKFpKn@E&#+&={)T-c6=kUTLg{0Wo=$|GyGbSZ5vh4OyF-pB+%S{{ +>J>0|XQR000O8B@~!W>aZw&{RRL4-x&Y^A^-pYaA|NaUukZ1WpZv|Y%gPPZEaz0WOFZMZ+C8NZ((FEa +Cx0r-H+Qg41dpGA*3kc6p6Pz3JUzYv#Bju0Cv7DY4;4ZO6QWQUa +B$aD*WSr-ck>;$F9OjTB@(o7J +>J7IvQ>Ub1o)^Ys>-)pJi2&H}Btc18#1zI@SaiyUW8Up;En-v`rpy7Lf;|tgcV*2A&i}VR}fbqUr2{W +TTpFREDW017AvM_Nj3ovJ6;n-X90O=F2ggtO|DsS-~rAa$3C=EF_lX}BSrH`VJ|ALb;&5xT_#L>yP$L +9}t#?&f(UMwgE@cc;^4DlZ9C-*Mmyc9{P+7WtkUWmo`lu9=-+=*sVMrDtUaoP +D*~la{!v+AM%6k6CUkm`&qU_v(3VUTMln-YWH`gJ_AsQHGxyR{5Kl%pgpx+6ycwkQQ2fAw2t*;tYYlEi6_Z=ByuW|c5duWsOk-ZI?@*R6<{jz +nI-}dxz98XBv>VdH4*#Ae++vn8y{(E>q-*)Q%_9RaSW!$P}OHL0thU)|ga5Y~7<>7JE+^V8W#{9Mt==0(1;#5&{dxA-Ct~A|bwU&cWN4RrT|-azia{o=*cH@tfGJlNy +CS4KGqM?~hdMEg1NN2rp)Q8MZrHBIX5|2Er%q59PoB!%`(X>tQk6m1&*8eTRLrq*+H*Y8xzmW8`0(g? +H)r8cyBm0FxaNd}*&cf~JOTVj$e*f&LH6`T*tPPRG?pVOS}ju-rtPv9B3>PE4S9kSS4`~*#<8LA=!#- +JV)a1;`G+$=6r%F>zf2E5qC81^XhO4vY=dy`ABqXX+IK^{WD*Z>#sow7O2Vi%WLpoO+Rh3Ju++v!rLwGdQCHb%U>UVy>!BboLsEfp>B +5A@E0TCUaz-Q4_1)-f&3G7}gf4OH8M}@?%X`fCzWA}#YqKI{C8975>!tM;rE$8D0vTI|#qG`xL9pIAW +-Q^&AxKY}y-o+fgk{*b;H(7Ylo-rNLXj+PPVQtP;@~{pq_i75$q)@>AtX%-YPFBq$DHASn&M=QdJrNu +nNnwJ!_KNk(4;A^oD@ZrE5o*bu)GlacsULx`ivYiCRk>~hp%%YFecYMncxs3KML^i{Fg2|k{gyM! +Z0i5{JykSq6^U1QqnW0(SroDCV7NbqPNd+Ou;)#Z3B^-~##-}v?u4>NmNnD`m_5*M{MlZ}g-pJBgrzD&9ww?Zy?LF7%>X8JTnchGdh+ +BB>Y+H)fjM}8OBl}!*QGZ4KJgUxII4v~(BR(G_|H0_<`#N!Mp=6@OE*j2@-}*`bb`AKdM +Hd5w>;snZk#C$Dkj;1}T|d5>f5vDvvWj5`7Nf0J{tT03ZMW0B~t=FJEbHbY*gGVQ +epBZ*6U1Ze(*WW^!d^dSxzfd8JoPkJ~m7z3W#H1_H@jS?Sq;PMd5|v_OisX%A^Y(9%d|O_3}~t=BE`- +#a8FTe1}-yAfc^9L@*do8gddjOqxbP49XGloH-)WgKBUt3>aB#&MDia(l8#(s&!qbwRmwU?dYo#i~7w +#((Ys#J!g+stR80m<3v?u4A$ut?uJ+$)r;?2wODDbj+chbViBM?jcC;qj1SuX)w%jCDDTc`1icdI9f9 +49mjaMK+W8!ZCx$+j_N~;6uf!+2mR%zAATbx`7cG=G$*MA*K4Pguzpl?>kQu^hkkVQl%$`MB&h_mmOO +;e1LSOYueS-oXSG^|_q*Qd9>YuPm=I7C&8h=y!J>#5_^0OvI*`tiNKBCgv$Ga6Km@J=Ezy9H3Q6CfH; +|S){s_b(ESyxP22;#JOV$BGOCv*Rko6Y5qHxq9#Nn$=g30LJTETOOZWbokcI%3 +ZC5d^=quX0+Rs7ta5TITSxdcG+57Eaz|-qK{PqJW2UwEx;q>PisLe|F0xr7a^elv#o2ypnOrPUsi?Y| +B63@>I{ZKiva^PN(v9(%-)ts0(|o25+!Ro-uzGOa<@H`Wd7g)2XNoXb0K?2(x=ZMc9dn>`3 +!uHIW94)<%wyibK6v{(|?NkIoBY*8GnW{$$M@>@7)Vtq@}f($!NwnT-*7v%RnwN^tpsLk?@AgdLy_zT+|AQk +P0kPQ7a;q8_H%8eKZiK&22Mz2_+jWIkU*c!o;^z@lJ}@oRg!<^l~_*hGR4*{>+)2Q&+d1a(>}KW0$SHe|%kN4fh +QiZ)N4=LY56t;)RXY+~ijQCaLjBFN5dF-RCmTo49B7^ls%#Z9C)CyD55IGY6LfxNtX^9gZG0hO2qy=E +_zZx>SfuetboU!3DzPh89@6aWAK2mmD%m`?eE!dct`005B&0015U003}la4%nJZggdGZeeU +MV{dJ3VQyq|FKA(NXfAMheN;_voG=i*^DC@KD!$(RHaR&s*yHPFKuOcVE{MArv6CUf8Vh&yGz +oP1K{zS@w_+V>5Lu;W1V;20AoaqlQxdkLJ#Y)G(c{QfyPWcVUcTmH9e3WMQww%+x!&(@_y2P6PDo2bekbsUtFO2FPxsgC=IZXIB6s)u+bTI=2qxcoDqgUb=eS$t%bJa;kG|j=7DFi +GqJF<*9tet5mtvITZ<&IIErL +h|(@vcdO*iPn`^2Q5KuAz!`&sp#@{g72W_&FqP)Rap$B)y`(^owj-+32AkB)m*_<%^R-9noi6f?-F;W +{m8j@a}6MIC3zekSae!ndNwPMpU`@TAMNj#ENUpi->d9P* +NIyWGbU+Zd-_hCEg9RGbc8sTD_Jkn3zf7Aao2mM=u3ermacA_C_~sa|n+fZucWMVb8tP)h>@6aWAK2m +mD%m`;IRL>biq002S+0015U003}la4%nJZggdGZeeUMV{dJ3VQyq|FKA_Ka4v9pbyH1m+b|5h`&SSd0 +y{uv>^v;H1O>Wtwo_0DicQ;EZAl}grvCSnKjg+is*6F9@A2u8uE=yCMCF|)6arLd4LOh(Hm!FkrZ`Ee +q0TCs3#A>BmTg|ND!)iZQJAiix{TQ46n+L_C!Oa2Dv=}P^yhedI-MRt@V!9ml+k?0|3qXcNs^+K%=T{8pk)d;+=uM18sS3A;8l7O(sa8^)5+@6vqy +B?@IA0(Q^y4d1xGL9xHlqko3{3#HSi+^BGz1aK36Wb#j6rg?TX7X#DQ0H}hV!?Vf!{S4HNq7^V<3#CE +%0gN@JpBYK2CY9k}&M5UUp{5sp_MtHV%|t+p%V;J%+V8JhUi_JiBCt>9`JvbL#c0HrIt7He24LuwB}} +tWZJM*lgW@=F6qE7c!JX>N37a&BR4FJo_QZDD +R?b1!Lbb97;BY%Xwl%{={&+cvVl?_a^^Ah6upYIAsp2Lx4tbhAYR^zIhf&Gm=vLML0at&1!#pq@o~EqW?dzsx*;3SH*YZ^UzPeJ+dDB$2{!!MOO +;K(1&w9_BtgRdKTj+0M+qFe`wZ^gPeY?*Z!SzUYA8v2o-`w4$zuf$KdnNnqi+!9v@hYzy-EIGIlQvw` +U9;lC?p9PSZ>p?}SJ`T7u>Q8?yu8LI-mYb#JFa#)P*l{F2y~2>nc(TF-tDp~*HG{Ir>wovRF4w +}I|Jie7JjSoS?KY1YTcspmBfK36q1lse-O94E`|I@a~Rv&reL3S@&{J^kIo-CT_r?)GyI9?Ye7YEVuo +y)9!)^5}KxjF{BE5yoG3|q6>53jaM9u-2YM +Kx5?SK=K|((iGgoZ%{SBTQ>(E*fXv{XF-yB!VIs_asaCnZ9-xo{#SYyrD>Jzz!J@_uC8*vW`#%zQ9rk +6_L^ojnM~;Kdk(g%V$iGI0#f*g$)Wckwrm5!5zGL`4rtpPBrg0YN+m3N!K(UG_L}|tpWnZdyr#v;-cc +`FU_EFfN%%P{1;4top4>MbR})#{i=a3RikSj0PZ=B_IHEku)HhM{#GYTu#J<6(XhiJvN?qKF}{t7P-07cDSXYMEfqd|H+O3IDX)rtUUd*48WoV~s1$f>i7y;k4UY@Ypm4_<b)T63u4kf`L0Hz*j0Rg91Mi_M%H5z#YWi=XU3L(Pqn%pBllja??dSox{J27Ff +*TyVD9Tdz(yU6M8;_<{fXdr>se)<0g=Q)|GAY*Sg|v%a)h>WTZE+a$yDk0Em8!+0+4$bpCYEIKjxnHv +3!vH14(F8J8ItA^sV>c(O2PPQF{$X!#MZ7o8gE1B79VMYrEHS&G +(hWP1B2Ba+f$Y%ly(NY)L~0xZy^$TrML58o#U^7JPBi;tc7NDIXi%01_CMcIv{-&O$6fE`o7>yBZ|>i +`{QY+|4*cgs^_z?)Viw(TZqt?5tIlwp$ibP%AMS46r$4>9yYXVfZtD&w0_zO}k=f*;6~3tIuOWgp`u0 +8MSS=t8=_X+k;fYJ_0jrXg6uNy-PpTbD0>Z-1|YT|1#*q+wTf1GwF0MG{Satm5VH@Fn$QCMk(O@` +X!vqx@43uS56~TBVjAou)pA-_j +2KDm((W>^*M8qzt`Z*@lL@qR+#%Brchp^YfAnxiH${ov!SZhB}=&- +*<$C1lB8~nRaBji3XJz}Dl1il@B9#v7Wnq)tKnhWpmpZHH+{onDWh1(9XU|n-+tu$2hLi^k +HsJYMGg&NF^==PA&%~<%lU@TR9zB})fwdLKJeSY8xRy}buT_a43cV;5b7(o9_*hskoD=x0=S+*7(hKG +#sedcY+Uoyc63Wn531rmbb(V_Pc9E0e;TyoBLm!sej4L&C% +DtGiOR7ry*3A%vq+RmreZ<=5Fuj=gW9tn~ExH4i_wS++Z(P(#lu**Jjg(uxKb+>o5$g!-5f%*)S^yNCH)AYtGK&u_iGjCdV!0+c4b+b#rG&5#>z +O(5nmFiS<&l%<|tz@U2M08GwHBg@{MQ~n&7CM$s&5p +pS`D4}iYa-i>)VKSh4$&c#K#-n)Fw=Cd_F{*&25?b3pf4{J%FU1sRU%(Q_YQD-|b!xpM0eNVBFAsM9P +#$vOB#=&8ud+%BJa@L_+

|XoD4)na*Q5bHcgDw5pJP44n!fBV;Ns3)-9hD1^ORgYn|4PM(<-d$shs +yq@EU8{1`A#Zd)OVb7^xi(lBf%r^04teyB7i~qz9=>-}&YWN{~$0d&unFy;oaz5AzgToo!#u_wS5sAG +#=1gv($~3xMp)n0}J$p+}CRnr<=HnKA`nAyw?9B3ZAN%<(SBNU-;kt$|A%z|7hCZ2$9<{!C;YWsE^}Y +kc$J4<~{S))BL`Gg#ASO+=sUh@F(~OVxLUY>+dApBQ4L_=gw{fMS3wXmbF#3}8%L;AM5mIH;U?i!2hX +Ha})n%Q@QO3uH_D9bB0suSu?{_cjVHk9f-%Z>VWS)l+Sj#i9muf(2fz=@kmq~2$YgkrV#)K`gd<4#=mHz1m0efwM+5U2SR?0F(T5if0UW?bKpe?n)EKrP+u}zP=rr- +qAV49+HNcbtU3XPyjn2&N%`Na}F)EEk-yfDQFupu^(Rqr5F;(>F=gzpwI^0mW95U1dhrI?|Ca9VScj$ZSlA +TPT9+r+0TjBJyiY`!aykDV;5pZ}QhdJV5W`MopU)W9y23UZz)Dt+uU3YYsb~8Um(b0ThC8}j){&s7uG +>Dy*X6X~{*;RKrD2c7d~|T&IZHYMb5KrVS5NI{=?1(u*e=65f +#Y5pjeUWLF4clB5$TsiGk%lzTsLU$RZ`2j@gDys+c3T5a6cH&f1-;)l(35Wn2deoheTi0kF&N#Znm(S +O>x7V&H}a=*nPG)f5bK;9@<$y(f%B^7@_o-K{UMQtdwx{{It`ciJ9B%Ppt1pF@z%qB6B^a^!UUG3c2) +c!lny68X6%8$0+iG@{N9pz==pG6aMX3lVHLZ{1MO#Ye$%}sr0=FHn^u7kT7-XY@w*ubu_)}R-pa@FM! +wu!!N~j-v1nrrg_m{ktEL+Gt1n)x@~{J;drL>8DD~{g&q=l6TtXo4YujPeoWY_z>3=emGVNRJOoVf_? +^Z|Ra00OxqOR*JN(>V%W#Q7QJf_7k)mRbyh)L{i924gOutcL*%wbPZ>F*&m0>*&~OOe=}gzqTT>>lRG=i$3&O*6o(kZs$wBW}=0v;(xq^Vhf|d23aNpL2>X?9cRmSlskdn5#RI +(wN<;w@P@f@(j^ASH#t22fq$LyA +BNmSh%zJg^3VV}I5t?%lefemqqIoLLy2~KY>!BTb6mnp6h|5mka!o4J8Ud`UkE+fV)L-|lZ-<2~kvUNa`Z$6|T6F +V(3q9n&!VZZt`qfkqP5D{1JRXSlhkvE7OGISz}f4>suI!}qSYg}ANj!98XdELhmLY6`M5fyzEGZ7+q6 +6Y#r!ebML*V1ZILn~J%f;M^kl;g#nw(pok?=2`OkS`1VK;x|L2N_APIeNCorGhqi{#9OS0KGYq)5p0` +*>6SeW#{)%$MTNO#(8FcPFO&liFb_=MClq?WT`&o3y}ro05Oh3P8Nv{V3Qr$KLCJg^dps(tg2|Xb&V^ +2C`)o`9RMV3bAdr(o};V{!AHT7LfrJwa`)nTtgTabNd(4ydpo+=u}SE;P+TgXhkZ`6H{*B +)JBD=dA%{sO}l>IDgsEPNLqXZm)xuUGba-JM>uMrQ5Sn-7@_DAI>Qj^#>oT)n2ktNv6a#49`cZYSc#QGf^FTjN@=)FjW2UV`^FPYwqu0rx&W|0gtW<3`kAdbMC>*V)pV$gQ5Y6TS< +ue(y+*)(suKoxndda~%1e)U{8z5xRiMSq&%;*!Nb!-`|gK_Wh;H|%1dMPK5ZH`muUcRdqGGu3T8q#Q5 +9nW7&_0;2ziyae+PmH6o`gf(st@2i8JIN2(SQQW05-0x91{Bw)Kc^DaqA=z^_LB4pb(vZNote>$E+3o +pgISJ#NX||#a@dZ?G5`*O3HyKV;F#+|P#dsBOAI;deQc3<7P)h>@6aWAK2mmD%m`;UvZu{B_006cp00 +15U003}la4%nJZggdGZeeUMV{dJ3VQyq|FKlUZbS`jt&07C&+cp;e-G2q)ppevalyBvD6FN!(%o`@P365^2d!(rv&QZETZ#kMH~Ykn&cFh7`rN*S%y#L3q;%sR`XEQTLh^ +_WNSt#y>03`p>o4?RdLeEVjs_<6U0dv9=P@Gg16uGMB?(-iSM<{Hia!D{9g1n9?CD-fAXWTIXfW{nE0 +jM5noE)scnyhALK+qG@Pbd8)Ve>l_JtD4At=u=oclg`A_{ZN(n^;-6@FOLy!Y4$iLbHLq3Pa8-JebV1 +-%ait5c3RZDVH#J+49fN^ZXab7EwbahJ0k+P!EX>Ul8Xg8iAl2d-pXPAgBeSUqNNS^JX +rbERK74I&Pa+-$w&?KK*w7`NeR9>2VSgIT +=P3d6vz*gLV`8(Xj>E%bV!gqF(bVKo-pKB5b~mvVn?oAfL!|t)q@^#kJLwm&l4+X#kP%CFdep!QXSy>xzQ +4l2tTMOQcyRN()G5Eqivb0FU?nyIO2$4ZD;~K_pj#v_hNoB}v4~iE +7u^`}4W{%Es+S^`jIxVT1EtF*(sq>2)$Q@%#Puv90$Q|6Q*K4T7Qp2E%R7p=2?1=5xGx-pM~a&eG+3Q ++YAO*tujigQ`lf`&I0Y)uL-ytH~Xc3aesH{;~HgS7bTk$R#uxBG3j~=xT~68@~gCW#r3eX}=Y+q56~o +X1$CtSIp9S+bm1KDov}F@pO43I7BZ5x|_#j+DgX0nA}Gw6GrA>(&fLwilv5JU_KD+_JlToQ!a^PM^Yz +1wj!48tVx#uh;XmvR~rs84?O$dp3ASP_h>`lP#oc4RW{XX2zOHjuw7%$SF8i%#@dp@jM&bqIFs~WuP% +Tx4Ctqo<}K#Mtj-pZu;K_Co9#c?y@En*S3aU5 +{8s?439CmN}J+ofLf+D;})09LySvkpQnsD4%no5lrWZ3Z;(sc(n=y%AP~!U6lnmZ`1R-Dx8sutwHb(^ +f}@EcD<|>3a_vL1}Jbuo`k%W43P*Ot!@|++Ck&*B*#fDAg{QxJ=7gh@>y<@!C|b8PZzO?k$q9~_ExRE +smGz%$)ghMK%Y1c>ss6w@V9^-;#$ba7{=n|5U2>^iyNWzxGWlt37qZL?tM}i&>^yK56zDlI)tF%}PHw-_q2;W4yFV(9!VpNqlJ1aZg(!C;Ehp~2Ge)a;lA_MM6H$GQ8JbDW1DsRP#YxiZJvuRJNVS#5jFP*SnX +@pgBV4wF8T-DdxE`Q>3^Zz1HR;YJ8BwDsY73X#d|jt=G>{DhlDp6@!E>ZrR=jlTJs0LcKhLI1W82gsHJ&kj^=b8xCQL10$n{8&heP9oqNT?sj +MB@IBZVO#?%QEf#oW<#zvVRR4tKA2-CyBLzo6KJGHeHx^6gkkC4!KEPck5!WJS_h|IsO +Yb|p@ax;#R@}GK3k$?L&^s!Q@rAltK`e-hCsPwz5D?jf3wQ-%CICuPN$_<>er9;(O#*l|yKo}b)$q+I +K7PY{n`rSYzv;_~JkaGX>2t0E@OQnKuw!?$?kOBpMq>?3ieYj>w!usp#a@qmOm~T=(^#chgC8&iJpC` +x9WL! +@FJ8pP0gAdN;Lhu1Z2HWf8uT)O6GZ)VN25b)+bl%v_}%Af=XH&WO`hwCMCXgJc+sHQ78s#9AFEiv*a9 +Pwi<`~<`rScID#0e**~yX&yauc)yBR|t=d0F3?pn!KKmW7nUsXQs;+YQ27;Ncuu$%hl8it4C{@A#pM3 +82CJ#7LDV{H6zrlJkfqnG_1K@obAzOyC48?<&5{U$I@hQyG@tK`QyfC#9oS+D&XSJoX{@GJtHlHgASa +}uuYm3ihp5PGc0fO+$};OHET_nWdMj@O+(z>z~H5e55qBMZ+8VAhFg3xhWlXl!a=jg`eB)d$4q~vf(O +S6{zC=;PBoq5i2?;1dbwV&$dW8A2x@4Tx^nPvNs{w~yd)1!vMdW^!E}JGWwK#pdEB?K79Xji=LYp)%- +63o^3FWW-8KTwmITV|Ke_&~-}u=Ztvhvjaj^r))o=1rG#A~zqZb|TF1S)XQy1U9`R?_Z`Hc5S0D;fHd +Hv>Z-+uGmo4*<+R2i3}ZOq1K8>^4E`_-#!P`9BEDK2`*jFJziq9Is#y(Pqj8w{R*dL~E@&O{bqm9zx2 +87denkt}$$pBkbSGRz#jfd16i+5*j!`$773HN{7`gY&NJetG@5N8TBRLWzwK(G4O3llCN;dsa2Ro+4{ +_lt6iN+Tl$_>V(R?F6NkFm$)EuF)&x_Z+DZn<}U!>iuTUutG`Xe00$W%QSlZ--ypQ_72eSplFj~+5)n +U4mwnsf=B_R7~)A7Ctwr(_{MG-h-*5eTZy$LDji|}o>q<{AmMT*%uk~?>`<` +w*GPi|otw-6;uwl0&Rwt)f5oNQgD%h`X@rkPn%|yhM-=TU@lHst$vTF1Gm8gXo7J)Pk#^RT^AYNHkK) +pBol*5v^hSJq%m&KD6SJ{_EV3{*(EEASH=S}g>3>j50|XQR000O8B@~!W4*|qV32Fx`- +~|FB(KZ*EQb{VdSMsLG<&ENy;ICU(3i +*K01;?x#8^_o~@m?S>)yrpj7oOpTW3sj8APPiOR6E%<(4{s8HFi=KtMgnE<0y9=CK!QOhL&#|*%Qab+4eJjM#R<4o0LR +*8Y(nFlT}cDo#2_5S&o!5Lp2Ra~Eo2RGiSs#ILDt}c>og4&D^@W%qjIg_>+ES~-EWqxfVLh9Y@4Uxj7n&3Ucjr+OW+esc@V?r)PzhB_a-6Q^(;6xvt^n-Q#lLnKVFZNR%WJDfuT`lMU|jd}ye|E?jCyf^V1S}1aAU!owI^!+p0N$c39`DCd0w#MbC6eIau92hGFo5D}^V)Zg!4p^%hf7*hCvKQ4}RXyE|qCA_7lk(zuHc@XZBnV1*m3aPY)$%D^CC|bQ& +=cN2ZrU(jt%&8i5{@W*+2A4$4))!sUsht*{gWToJlCuce30cx&VHuK7@@HL~?=kCBU>8TsTSso8a8YR +~RZ~5FOhCgo7lG><$9Z#GX&!=6eA(zTirerktQNQ0OJ2MR6dsnSwN6+YXhGzZlt3I6;2Sz_iI9_dz?* +jwVsMl%^voxL^q^4C_EqfO+s9Gz`wr6roG#J{UG785K|$Skg1!uRH5@VPV4yW`A%Qo1lKc+L8l<%ZBH +NPF8n?#LPO{TLIUeSpoYq=$tQ1QMdr+DOlRqpC@)u!^7()m#FaopkI2^__#>GuXsG$28Mk*BIEV|gqH +UGp)dB;|AH=seb2^ai}sMvs)7zMv?HCghR+Ey(e#aGgMqO11`3y>ForOz3YsxbI`(}k!xpiN!&fcoGY +8@t;qcqm4X8fmir-$$>&<)PgFQ+Zj(&yYnHDvJEsX5xI+jRH69spKdMj)$#e_aeusCS#vlXo$q0Rb!e +h7+;B1Au=`yw;4rTcK%_mM;UfQ8PryzozVc3!xlVvakg{Yr#1}DtV8RTCYDxn3?kWE;gb`I;Z +N}!?p2QE^k?Q9w~b6UFBq-0mhCn(^M%=N?nex$KG4FWG#z=cU^GLEqCu+cs9gF0-lV*OphM?+@;720j +mKy7+tC#U4s;eqIZydkg7$FY7w@X~6|RC5LJL_khmaqU+gX|{y9t8aoIp-V8m)uZpIhr!<>fJg}7?~H +_F&t8(BqbT{OatPK5Z0Jv?X9_qtRRK9Y0y55b{U`puDtK9kLj37U;n8K +Obaa3@UQK{$@Xe7q$&Hv!gexDb#+Bp8R{0_D5ybV|#npUqf#U|kTH4kzb44fjg5y62u7vr-Yr(L%Dc39w&%HbDmT6lO +FsZtkm_SXR_5LvvP5uK=O9KQH0000803{TdPN9$nMRNxL0D%|)03HAU0B~t=FJEbHbY*gGVQepBZ*6U +1Ze(*Wb7*gOE^v9xSl@5sHWGfC6_z&f4`X_DUp +`!?7m$dVvCw@I6poPXS{8yBTLh5*LICaQznmf)wGO1sjBE&k?Q9lFzZFN+sSfgA1f7XQGqyeStK=Ylx +VDqTOsl=$8!+X^0rd|%0<87&Her7`#F2~{rdXm;UNex3gGCL9qKU=XTf)d+YCb`^!lnU0B2NkG`gJqUGe4e}D +~E!q9;^#VMu3(3otVP4o?@Epw5`V((!G#2~_6_^mxN~b_OELjQ0-qlUDW9zC$+th~r!cP3oWJIY-NE&>n!>Lh$Z?w>);W77%kVlKA8P+7`0O(P|W?VSC{o1KD>9}h1kmfD6IGT_8}&Q +Lr~dbEohU?7uZ$2)k#3g_NS;7Yp+r{3@kRjoqRqK_>&HG*z=SG22JU +MS(e+KZxI>2S7?=51FLtdI(rv2~(JyJB*g;Mv{=Hwojw_fVhC1c0Jxjf?57sk%CPKlg(W4}ovG(!|{4 +f6g$5PSoX=l~qftOV50LN|G1elyF9(kWSH(eJKQ-N(Q8QmbqZuTCBMUZs4av`(0&?fC5$Oli0ubs}n> +y+$@Zz`TZ*KN2o#^1UpG(%QUmof@93OU{8I|~$^;~#r#X8T%~PdBzigi4<=cLk#lF +4-82Jmv`{mTNp)?YM-B!z@~P8Cu`lSSw@C5U!~>HRtbmtQMn@NtjfK1^4Mb;geLYwJ=5Dm{hg}aby8tuI +YA?STys)PRLg3da1cyu7%yY)CEuqP^m9(k%g)9%ORL=`v%;q1&*17Ows67{y9MWNhqj)o@`Mdvy97(C +lt=K2H0{a(7;CIeje!31}l8Pc!W+K8Z<|i!p0Bd(Zst*p?PLAad?EdEZ^Zf_K;3n*foIOE>;tiGB1a% +TCdmEGo1`EiuJy)rfh(fI}JlP2U3Rx0~2n4M|4@&9H039J~IO;^dB2jR|w^29`$j>ROW9J+pV64Z@POqzhdkQ|IdhWAitnM4a_S?_6d1+MMfN}ecj{@PKV!9gk +#Gfdcn!%qRCra9twa6!mJCl7wh60k?9ZlqQqT9K5Ui%_;r}FsU;g#$;_lP!=kHJ9fDD4mdx)}yLRmuy ++R4DX?=QuEtjAMhs_fd63-MZT7v3`V?$g8L)yI!F_or6Uu?0i=;y7jES+v;@#S*M+bu=O1d10B>kP9w +w68F>yei)qlf&J1}d9}oW1#9HE%Jx0Qo<9rI4QS+7^b7&W)2~Q_eU<+_RDBp0Q!_uVoYB!S%n?cOdt~ +D@h*QI>b$PBVO4&_ImOh0FwW+^ +4Ct837BZ$8Zft5=8JKb|Zg>vv+lXQY8<<2@np$*uUn27wkp0duYaLL5-Il`-VbB$ar?`F=pvRMTU3cKv{5mu8<+dF%)Rnp41RGmYvW!|`+N^Ij<-G4VMcEy +x8TSo$(lk~^S{UjDrnGIIlb3S>zmK(;DkR9Gy{}N8Ug0c6HEeWy|;lb!9ATMfoaDQ +lD7orE(*%6xwK63MKzSu0?}$sMH><7K)WhvZHXwOVcz$S0nmM|F{LgKTB-AGC4%q=YmME4 +S^Q(vZ-pg~B|M_BJXU4mn)UvOGt701Cwg;fQBS8?=E2y{Lp2A=V0s#) +haRgz!*HMUJjW0ZiW55Y{iHm92-X6>W=l9?tQ$5ln>_RHi)~*n-5+qfkIHk(5Mn=O{&zk7@u9RK^oLo +1UN-_%!hF85m>l=sa5ZG;g?=PXvs1T}PF*w-CWbIg`Ew71ne{rIw!a)S;?#_#o`b(e1K@Yn=k(Tddc(I=^<1vyBZZDe6mptXo0ROo8lBKEcdt+z3pCbhX`489z|^z3P@%%uvTUF2me +I$lX&Gsv^+WjlWKGwmAM<5`*}YqBr-w!z&O#2M=Vq-MM@EG6V<%O`9Xc1N82}lD4TJ1yks1}wac}rN` +~v>|XQ2|ZjR%`59{fJ7${Y4Vu|3q&buU0aCvuvqh87N1#SkSM1!1ORzCvaziL8Tf7R;@q+Dz|xwNum4 +LiR#Q(8DVE(7Pi6W2p0nU%L*dxGeR?qTHq=!Ujj{)W>UZKQi{d;!x~jxM$n+{3n0m`fd)%i#C33XQPp +Xbhv&O*=8*H-E=fKXbFcI1hn927t)iVeK+GfEW(F02Iqjz5pK<=U~V5aeK_iq`aVnGftGdYqo9Zv?6Z-eB*uAek&Zi2-TrWH#%a{;jQpz+Vy=c*(BetgXqZqFb=1qOj +9<83)-V`18@C<^f&knAHVT%uOiy+(v=zuufo!&+3sIZO9KQH0000803{TdPFx5_P=^Nq0RI~R03QGV0 +B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WcW7m0Y%Xwlof+GX+cx&yU%_=zSkB6t^kK2VAj(6#4NzcF1iJzH +5Cj4(9og*AqDoSB{P#V)NTw{x9>>6VB=X#EJcs^)Y~E~0DJs_No=KAOYu;E(?j&_gdfq#`!$dr7NaAcxWKX;5*|6$TD#|ViQB(;RHRzgc9L}AWv}i=S14HFNb!zcMU4v9aVYcL`@o@EfKVfIJAtTa*neSwLY1 +Es5)sD0gZhotWlbBo{^6z;X#;f&=k#`5(Qw$TWZdfl_=FS*=yaZ=cgyThHj)4LYb|Mi6>~DIMtx^lhY ++I7osZAU8{xQ>O=lEd*?K9bR75!J?Iuzq*LJZ+g42J!ijL9K;WB(Mq#WI>w5!fVJxBEWLj7oVm>w%JF +=>y+(GrmHg2;I#_JdmE63d~b;^*)2iFqvV=KjueDQ_gD|sLIlc*L-Rx^+vNS0+Y7#lf4!q8wGZXtZx0 +P;DOir~hd811B!{5}E~C92w^v{dhJ;k@^eYG^+Vz=Lg6hmnrag647I?M&zlKZ)yX<*+KKv39eD>7qy! +@H!=LsN7*_y?OI;@@eD9W7$f=G&9l1>vcAuhlq;-5o>aRIw%y(z-RsY6e6RQeL!`SVbez3=Cn%jdt+7 +FV0~GoBY+BnId@S}Om`2MEk`QzRSdDF9oM-~S=mY4A8+r0w|TN0*%M2bAny_MLu!_!O~9UzsR-tEIU? +geOXMI;44#C1G1*=9g)v*MFMQWG?Q%KcvPKkJ)}YIi^{a72!_SXn;W34U?3H*|p4-^e-nh-E+bn>`R& +%b4Z`0DO<}2Eo0=d*trr3aq=9V+4%ws+GSuZ6Fgt1#n;Z_BY7K4uv +#PczCYZNfs!?i!%4`yVM+5Uu&YH6`yVz|$Ev5;)-8;CsO%aM9Xk0=qM19ZP;b_axJJ?KeG>DZbcBG?g +OCrqPAK_yBkyYD<*tkwEt;QtYYPgBk@P3I^Z$qdGu2&=>HOik%c)J9a>rhL(bb8Qatz{5a1jkWoE@eI +$b4dd%=`8c4T(1g$s6`qJ*muJN6Ympe7bg9>_`uukrwd?|bf?u)xify9GMEQsxyvEY}nRdDqy`Df1(r +%6nv;(~CYQIo*E7T|egOE(r}6>Pg*vii+bKGRHCNWlL6M`e1Ybd~)nSd&~h1Tiv|_3I)gz)<7H5=^#{ +0ya>lCCzZ^H~*6fOkk#<#^1sA5CQIq>Amy2cLok1CWQuX5Q^F5*2Yqs#IxgMi0wy^!fhr)KzIsclX+d +R7-%zbBsj*AaIBQ;C5pmX15ID5Tlu!D+@fgwG=$C$Y7P}NS|111k-;y9>|kPrJ6 +{d5~pt-DxVVUU#om+^%$2s%W-IIpBEDjK|g@L)2RRW4r3})faS|p9-uZ>hO7Ot3xwllMFaV +2J4s)#Hc5_c+TSG2t1vh_zf2@14R6Tm@-n~5(|LqSoEk2u< +MO*`U>?*@aUnv_W*G41vBMT?zzY}WQLj4pe4Goz`aFRk(eg0q9`T{SadSR&kMoY}9iI0O^Rl@x%zZT8 +2tpgB`Q2y@LNpJa=Ml`5f`775468|`?-~KOJ4q`j%!s04cg~kuY!sSb)#r_Aqn0-`6|yw>>(A_ato-N +@Uhxf{kL=wgbTxxq)4JNeOU`QnRsI>f*c;$BJP~Z*=NF2DsP4GM4UYrnWoagGW2=4K_E*NqRb8A3_aF +StpSxR$f}FPf8R>6^=kuYjwL?0PSB2*20^%y|`#A?s^)FxNNsLFYfyQ|G9+AF<$gg{fxe79`OidZ@&= +qL9)7Gi->LYA4vS&xiJ2NPxud5Alp|Gdq&?IBo*5n^Kc^f~Btyq-d%oYB~GOvR9EI%S)H-oyM!efT?H +|8$DVx!rd-0t_D_|H0Vp(m|iPE69q^TjAP*}(wDWS?nJnEl~k!sUhmul#DkyS6a5+33;N)b<_+q5lR@ +O9KQH0000803{TdPJ78H{yP8w06zc#03ZMW0B~t=FJEbHbY*gGVQepLZ)9a`b1z?CX>MtBUtcb8c~eq +Sa#SctOwLYBPgN+%NGwrE&d)1J%*-oR$jwhl%_)Wm7Nr&xr52~=l_&slW=Uphu^yL_k`fmHP)h>@6aW +AK2mmD%m`>FkRK%14000#P001EX003}la4%nJZggdGZeeUMZEs{{Y;!MTVQyq;WMOn=E^v8`QqfAoFc +f{yS6u5$3o#!soS;KgbVCFMpF(JFM_ihOBol}D@1|YTtyp1sXfH|5x#ygl+L;Edw2XhEu8d<=lpC>@d +d)u3d1*Ar#u^vE3g;1o-xs_;C8Qo0qz>q`P;48d@~klxDxctwxVsS^tA%MI0WRg2)c<3{&PE9dyL^9s +=ZpK>#Up=tU9BEgcZA4#VtYm)uKHw8yp{CUI~hX_`gpFwRL$Rlc&u%s(0tbs@UGH{-IR5bbaHQOE^v9RRo`pdFc5zCUvan(ahPY=YanA#)^&_!V`Gd`icsxKqfL=KNp6~ +k{O{8bN0F1Xg)uz@S$Fs8?$dXdxspq0SzD2N6pd6>OY7hCj)}XfGmL9s%T_7_H5F2@nsWAtM9?K>**u +0aVNeOmLr7)Tt&QJBe!lv8Mb0nZpMN6Xe#~YcXCJbR%}*RpGO){|4iUbzhDi%w!gn+!Tqya7!fvxHt2 +xygE~Hvgb1sEZk{9y!7uIGR;PO1bMBbu;xm2*E!q?_LY=jQCtro0a0EJLGx?15DfeCFW=h##`q|9#`o +CC2nGebzBkn^plbUHe9*u_T&S7epq$NkV{2$FoI#NnSvn=}hl2{#H&r$oRaq+zvX7^c(U7f(_!fiHmxX?B4 +A=HQlMC~Q@aavYv-w#8;!!e%?ptDu@DIz{+g#ja>VY;TO0 +lY`GHVZc;s0NP(wX}zJ7McN^?W@tm;n;$m%uW^UR*+IWc7w=?f4bwwCcnu;i{vHbT6U_&e49? +W;U$jW!{!=t8GvJ@qkx$x4EfWjv7MjC3_gdLNuT_W6c6G4HMf4~&HWR&KYchDi-}8 +8a_|%>lT!TFOa>~QGdBoLzl8&>#P)h>@6aWAK2mmD%m`+CGD;LTE001Ne0012T003}la4%nJZggdGZe +eUMZEs{{Y;!MZZe(S6E^v8;Q%!H9Fc7`-D@N%7kWzAwl-_$;MXTPC14D6ZY|AsG;oo-*35DIXwGf!`n +>QbC+yvKw*S;vvXloY=(wCxhXQZMJ#^@91&bz?iRUiaKFqzBoKS`3xC?Ytj>Rr9!v#s%xxzig~obMBm +wb^X`q7O)DnLyo;FhW7u8hmhPT_XW1(ilKh6$&Lgkc_<3;&)?8#!Zb4l%=+s%Q7Q0%{C^rg+?1JiCqx +>vUZ))_L@Xo55R-RJ!HgT3-Ze0@d^Goi!+3Jk0D#uB0%BKi#c5W1(t)@BRIt9YqLc*u9{BfW<@Z0qdA +jJe#NZ)NSZA*Osu0N?#spnq2M-4CqVj77Jl&h2d8)}E{jgQw3wDIa>mIx29I6y +HHxVr2|P=y5ncFPQw)EP{_#SFK3nMKo|0@WL3ZGO-2XXw3i?qp&eXZ&{m>3Myq6bW=R)g=%Kz7CR|RM +si*C9l50ecdU!4Sv6)Fow)sGOvVY3?|c}L`(Xc5^-YE}yUoLuQLe^V-(h_>Myj-B_O##aqB4aGue%b%du$p1dIO?*Uj)#jjB!>hb$fpHNE!1QY-O00;mj6qru*Rsgq=1polA5&!@k0001 +RX>c!JX>N37a&BR4FKusRWo&aVY-w(5E^v9hSZ#0HHW2>qUvWs0O4<}HNta$z&;b0vXFZ{}W9^EF +yuWzwpT0aheeGXf&t|V?zfUG?IWYXp1Y)dqExgSX<7nQ6t2~RT3)d;WH_}}UEDh;hrTX&f&G`jcA@!3 +WMk?T(rMLD_I8NbyZ*T9CW`atZDhZ@WWC$^;70w7;kl+?g!Yl2_k|5DnOyT4M=u;0cu`AJZ96sZQ0$oS{oU+o*`AX0(K(KaVsW^cmPv3AZNW#*lDh#;Pdi^VU4h%pEv*4%%F8Or +xuw5l!Qz900xq6;Z?_c`gEqeV~~QL2Xp@elr1+9(18rx*a^E7mU3 +qaVIdat(9Bd2Troe@UwsUk=;K5DBUE=!$*3#0P^5~@f@6oDn9aj08>1`MCW9$2_IyMQN8PdvDan1qCE +U_l#cSZpx=+R#A->!5(uu|pKXTI7mqiyDxQyognim8+M9kjemM&}8ZKyv&~CasFyL6?2jPQ{tz +xUw5Zg^Se{W~>xOlWVaKbxsT0sG-AwHYwc~c?um??D_@?`(+E_jBwA&QRuI$nlU5IliqAs5z!w4;~dl +m6)Upf}-4;rZTb<{)Fta}i~8ca}?ixjMV3AV`#y4{!Bu|2i}jB&N)(}RFZR_1IAq5w4xK#2xKCk+DE- +uro|g8WJ64Tpq??Osd%mdf7hN}nsq6O;xTf;S*X9K?0 +*WPqnRi_4Tfg6m0VBUmY)-v1r&T<^R$`!u)+FfVq$DAu_>$%1ca*2@|1s7}!Hyzj)fCPkjfU8N$>)7k +!>)Iv!lF%=V_&#ti$;7S_$9$8!{!+Bg3^o`2(5Y%W(`Z^Yp5=}{l9~%Q4Y1kFQ=@8y_KPHcG^rF-|NNZv^R|2-@Su>-4Ko*6oQQ +Sx;}0_FoM$j*b;A!`DWd+9$79N>CLqo__-Pwtqdl8yn)djz!sdxeLTiFuKO^Z_J45L;ta1NY>5ZK2l# +8>QeRNK*e5KdQfEr(dzrbDN_{28TM=5$Neq=2u&KB5@S=p*paqFzbKGLfCflm3zDE{FJu2>L+jxVF*) +25}e-&v}0)L#o1KbmcPLwwYao|^oPeJ|T2|iBR#a3*gX1~$5Kb-aur(cZ7!7BWX#IkiWDo3wGPAC5YP +)h>@6aWAK2mmD%m`(ry0006200000001Na003}la4%nJZggdGZeeUMZ*XODVRUJ4ZgVeRUukY>bYEXC +aCrj&P)h>@6aWAK2mmD%m`;CD^JYs1008w9001EX003}la4%nJZggdGZeeUMZ*XODVRUJ4ZgVeVXk}w +-E^v9ZSpRO@HW2>bPeHgCA{DA1AVUTWX}c9|)1vJL6j>n9(#hs5i7H7o^NPOv?nqIjBs*OP%s`NsL@-a +u*ku7;I6(}`}Ae@0-bHVzTRH@y+{C{yrOwxU2|{)U_YPDmbhxdJVFRlq3s4nFllK?ALM%aw*_N=X%~6 +|Di)@_HjXQ1+gB(<$h<0*}$~1LSC#HA?Yq4HMm!Ewx>E>*$3tcwIueMIU +DDVpx9)hNI6e?(E^$LTj?<%E7y%XpP&wmTgrd!s0|Y7Nd}|iB7WhcG$dIK%PDx9q=N1C=TyH_q7?Vh% +{z%Of+hGSCk6rlgu5FvD=H!pfvg#|GrQzZs;I%@T!E06$-e4d`R0|BSR^efu_mh$A^2ab~?QrLV|IIO +NQ&{qm(`QX|OtkCSzMEYj-~^19$^8!Dz-=jZUytBc?t>(n;J502?nlXnYD4CkNrN-bR!d=_?HzO=Vb; +%pRCNY6FdxMbbO#+0_;M^7V2grC()V*0sbclFPO}t}oehUTY-cS|3D*Uz7B!V?pE~68h>El|)K61Y_k +~E=XnXhju-b@N>V?hXRRMi_(^mBo-n0Cl*e-l8!P)9RtA3(px%uhlo>FIJkipnKgFfnUSOc8vZJvJ5w +ADs(}Mzmv5?#VTt9tb$H$J^F*b#GiF$eU!1t0kc4SP` +!(T0@JHDc1Jdz^W>-Gi@BdnPV2qw>oOO+Rw}ro%8elyE=%lAGZyC(%Ua^%Sxjp3urX$p50156OhOy9J;EMUVL92#-kh6G+`Ql=21{~0Oavk +tq#?!_+p)@zB9WaBh{e@@HOkICn#4xU+=hBkx`!Z5e!%3IUH>-5xEqss3U;=-P_Lg9mv9Ya@M@OiBVm +QP(B65IGq`7UwbGmoQ|x@K+)>`nkjS`(s{;-=NIim_((fc#5Zb_JUiaAIlJpe1lQ@s&1H9p7nIx|EAb +7e2TZU@pF6>MSE-2AFdnPA`a*W0=3b-%T)3D4vj-H`w>kbN03A{O3#IgG%W2MJ2RsrU?27N{TPL~&-G +dsTch~qpEGdlLw6m-~`GL-TK=Q^A&V!@0Z;CO|1OJnG{MT-payXREQ0U|YVqZlm7V#rCK7#ex*_jO{V +Uz|4vJMArp<-0TUQq&j5vFSNxx>an4YRjKc&yH-Tc(-TwzUGH!!FYu;Jp03yZ)XBQ>;yiGCXIDAWxY2 +X=XN*BqpqS?ir^5yz&kx7Y6)XiuZPNV^~FthHH*%$HPgJ{+H~|q8Z*Yow^_mLE$OTbiKh|Oa${)E&8v)z}<+o!J;si492_!=omf04 +-*JG^4tTBDn2@KDp-=)X63k$ +gTzaw8~Zg>z=z)iSjo~;{Q8fRf2h0OS+@SW7e`F$;M##w-<=~fN_nO{Od%iSoL3d*_87~hvhN)mMRo3 +6Q1(C0X4L0S&Sh>M`?fVFy<>wn87~(yTa4Rb650jI>K{-`0|XQR000O8B@~!WlCbOpBnkikKO_JEA^- +pYaA|NaUukZ1WpZv|Y%gzcWpZJ3X>V?GFJ^LOWqM^UaCya9>u=k-760zPf=v)e!fXNCM+3eXmYZ(H+T +0>-cX8(#0xi)AZzNGAsU&XE|9$6>dXTbYJG&nyw2mH!hv)G-50X163X&wdTGx^#3E@R0q$YH$L|$u_* +yq`-d7p|rXQ}3*RPC!=+~4!^zI_zk2gzo$9kQ=@6(>)u%!F+DEB5*vQDo`$RG&YMHWb+#UN`bIA%;>W@?^b|a;bu1LJpOqMi{*-OeQqf|TgZ#26WMM2AKPTrMD(>$k +0V0nzNknC%m0s}4UR14WL3TFf^ZdrhgUlSahu#9WE&Ds3$Q_f2^pG8xX7&@M_c7p3)K76>j{hZw0jEy +jcj0>((U!aUDop9yIanIm|m4#&qewTb(8>37}V|nX+1s-d;fB5a=Z^`vPZm$2C+qX+A#KwS!rd@cy%iPZiHN-8`!cl_1c-o7=xD?Li16bJ0celvWY13{p1ML$P(9 +z$#ZGdBd@>@_v~eo7^Sd*2WgCImaX2>T)Cvk&QLs~(-VV(Np?LjELX@Ed7ZH?dZxLftgA5UzjV;GGDb +EI+OJ_8#}Qfl)M3BZq;~+g+j)STx_0bRP@O&i1*&2Z2jSOSY}ujJqm~SkS5ZM)347WoR*cH@!Lr%GL^ +vZPENA+j-=4EPBf(-vu2ev-46U2{sLih{^8H7zF9xo~`dcZ!vC>6+H!J2Mob^bC3LUWZxARW8bFRi!u +N&0kw!4dZn`pUTdh8(Zzyb%l#wPKjMj`%0-56V##w(f6*=Bwb;ACn$ZImvv79s2fHJfoh7=#_fyc2^KDJ);JJ_*ciBe?Xd0Y(G3NBL0T70P1g@ +plT4I>Mhp??bV`;1do4huw!9DXwPm9ojM>nyWXlLExQ1*3&nbjEgSvns;9LqsYbJ!GgK#bCTyse64mU +?uMX-pgIZ=W4en{7+Cd?gup*~4><-!<2q18;b`-!2b +SfPv?f{sk#_SG)YU%s*x81%aY!9T2|``X8ucC7pn-GP-18@d0-zMDwfIMO#-J1UYZI7vlXvQVP8^xj4?vG&U$_nnRCZJ0)m*o=v;fxN4%WbuX`U&%OHjS|Gj78c=T`!;wpNf4}- +@_Py9GwvbwwcJj;Jd%UGjf@dcz0rb#uHBD4BO*{qvCS7&DZnL-7eoq77k}$|{Op?wc-5PC{*9@*bZ8j%zXdusUCq +Rpr58RXFCo_?cfusEXNKKmZQjEQRnGIU${~=-9h5)n*{pF)SU39va$yiQ~v6vkAN)?@z(XW6)LbsyU{ +z|b~M@h_@W=Wk5mP7=UCDdIQ0+@4lxZX4YS;ESGw*z*i9$Aq_{rU>mDk%EAS?1xYj=#iQGYS6-)v2Ne +y$z-mXgKUA@)P;;Fax7D(c?nTchGncIYDE$lyO7Ou}fmgp4q?}>}t9@<7RtvunTUeFD`7-ycR`O>vp#YH* +1Ks071OXNq=OKio*CKGKR&bq1oX$w!zlmyPd769>enxR}H)xK|;Gj+-&!*Hw}t#%hC9AMTCkmuH#b3B +BhFj?F+h9_}4Iw+W{>MM@}Z5((Z@>Zt*an5SrZz{Z`avX3wE;=u?`Ym0@Zi!~Oqc3xx#|jd>k*GtFFe +n?bIA*y0-5sB)d^WXL9DGq$YtjcDrGZw_4D2}3^1+C`hSq_?+g&DU7fI6=wOGh@ +%~U|ZD+(QWk}xcPNnI?GPqe;k-fnu&c29pu?o!}f4##D{;tq>Tysv)APid!v0?0Ljk8FoV!3aB=w+G9J+cTipiDLaH$sh!en9MaewRNQ#SadeaVrtNoo9v%I|P<~C4v)+7 +OWs}!`oYE0SShx+AApGreF1Y)r%d7fP*oOAcwl_Y-nL|F-M^WI{ICi-Is6sTGV-X4q~lg68gXxQ#uCy +2}bW}$tt0^7INPwVPTG-=G}`~FQpqCSmWQkA!l+8HdeaPLg3(dmgZEc!wM9NEe3p3Qm}d^kn6cl5@<{ +E-Mr~pCMw*@tM6T1H5=Iz2gdDraeEwY_PR~+HAjOjFPz*i`&Pv3{LKfOaPYXrd))zI)ye7;ICgGtt@- +|H%u_J^AhOO9eQ{26WfSC>wg+9rfsx%rIc7!>XS!z@0q+=ar!(*{)V?GFK}{YaA9&~E^v9xTYGQgHWL5epMvmWVHt3g+XBTM +0_3jkcDD`M-3@lr_KKoVX^W28$dXQ!;&ng$%?uwRCCW+KUU5bru|y7s^Z3n!^n5 +IT`Q}SZL5aKQnkD&I6j!o=kwW2?(3>)SyA2I%JSBJt<-F`ZK^%1Wu0dCqRer!eplb!W%~0@9pF-@WHF{UN%*^7iAlplvjtcsCaJYBr^sdsj^%)S=SUR{Cg`4;lA8&l> +WObYreTNe>X+eR$0y4-D_sNk;c}mMn8n +Oa@PMg1%2vXpgnG=9?d{f6QKf{p#g6+57L_zP)<;6*jML#H98f+E+&5Rq^xkica!IDAqWR?>IP&Oa!v}-Umek)$%!)9v6(3r1f{Xu|Q!2cd#vTc +CAaBk;uccb6TW~ezBacSK*y%p`Z^eoA;lJ7;9EoZY?F1BpX??lGe3aPdk0z(3eEVVqJp)kb-OU9B|va +^4JL#Xz1GuLts=<%A9m$0@X@{E_vu0YVks`annNa@V_#HK29Ne*|xUdeU`yu%y;&-l6!2qo+Qj{&(fy +r9Rg7(kB#2UA-q@@##C??jKY!%m2T6|%geK^%;)JUdOz@N&_Jwrk1@_BjKdHt5)DgkjL>d&Bvfk|iXsXxkL`~9&>$g-9>Ndf_`WErgEBifV+X}4s4CyzQq^R-(~U?G^i;pL(Qg*6Dz#gXkmtc9M5o9OD>hUYj;iDi0X(OXf9hJ(sE7!R5$XsRpETD +cd%P%RJuHxeMzERR-%Vl!LB-NLpR&$Ti0g4G%dl;!kLbwzHc@Ay3}E40P0QHit`*m7PWwN{{yb8saIf +(OoWyO!etMO_d=wDMlS<{`e|NCXeX7I}rDfhkSEW>*#fHkJlLUZ6nI(><4@wFL+Prxc!sEDKOMJSZU?dzzbDbU09++JCIGtW=#H0_LfMm0%QnnLV*PVA+8|#0c(t^czME +102Z{7eCelA+OsekSBiAEbNk@y3N*bJEzfz&djOef$!%E%C@{!8^=n8>Gf+Oh+lExWfjxE~25K!z4#Kjid3CXC+ge?mpWlKLcWcaP&+B8&&jGj2AwPxM +;rzvm7oWI!HOSbLwT^X9l(i9^lLHul-s#fwMbdNz;eT652#iJw_B*(ChPV?x0bLD5N=4Ssqu;@{t5}M5XLxlkeRUh +CZaR7U;3t8qb;NNtPI|#`5))$lI0{%&Vg_xI&M7QjD_q1d-pRF6L(kI&k8hBH1%*$0 +TykT#Mo$i#%#CK@F^DHhe4TOh*)EWFdW9j4%B?`Y4VMiNJ-15?oEN`vLLr +#Xidu14um}d>UV^lZVW`z?BWw8S?zU`%BlMf6QgfUzwSw1l55k`(5Yj`Kb2*wXta#Qf*!20nMc)$pNL +%0c9p1_XCP9gv@8N*V47fzV6Hb9D0My-R{RqMEW?_S%a|?QNJJ2qVm%j+maWTOA`D-^yo4?9HVz$4x)Jxflc +}Tzu1k|kM#4?417K#Wdk-<)7}%m{+RRj4d)@+Cs0_dk+r3HOth=%s`KxNkz997asDEiS7*us$cf#Zq& +8T7Nonj69^6{2RppM=xHUHE{b{vDC+Y^xN361Pamc=S7)K#gJs6i_BYV7{A+LQu)Q--}#AqE^79Z3{foXVXUnPP +)|fg;+_CdlATO#0|oLHGU6b3Xctw@t6VJMv06c`VxQp?&g*EHJFR)j*!%eY7I;7dD%(~G)Ee{=YFFL) +U>JgYgwY9*g$-crrB;EzC~vM*ie{PW$~7`!oRXQyd((7bdK4b%*^kL_H{ir*Wy#_t`9Ec$61xEQ6gj +t76Bgs-@llOF`e7IrZg@qGDtaQq*UjNddNiM-|@fiU;Lyb4c7AuaK$im8ZBt;JIZ9{ +n^rXZHpV4&U)(^PGOn=u{s+=4>%D{&FG;BO95yhcO;>D)h!q*-2F{8-irWKO)s<95zx^>y{G)(VYT&+ +8pgPS~vTm5&W*J!Mm`+*<()Hux(e;`pWmP_(`^c1a~jkOk+=^X5+ +EgK6#(0+m2yv2;7ZopXY!<%S75SPG|Bn@!g!-L$1sOaO(tWxT~hV%>q&sfT~^Xy%%hiS^r2i&xOu7+P +o69}Oj8Mz$Q#grtKrYI|VKs}XR;WV=wn#{m%sIKm`>-B#2TWTxO5(7_{+Qo(FfU84L*Q#r#17?m1WyK +6||vWV=@zrL0Z-s#gOeYkg^({Otqz>2aFz%$-A!9Cz*w~&C*tdXuhX89#NMf>HCP8r7%`;}S+;nWpdP +}d=?0qtWUhVVXm)ocRuO>+ZeQ=^9g!}f5YZ{;A?v%Dj<@`)x1qV|~;hfq?NYmC(2xizN!`SY@pogoS`ui}VYnX^tzBlkt_ +#Sf&=erL>bxVQ1K0*^mEvGAOT*H(>aa`bcU0b1?Q49BT#?`9t08V9!Vn%J;H$1^aV&}h4{gPuE2UdS< +0y?E(#~c7Zm`hX>fmlSxZ^$u54(AT7ZmU+#Th2+p&(l8#aa%MR$S~h3CP0?6P4Th2o5k5-DJ* +0VQCj?6;q?fk6pkHDb$kJKK#Q)FvF~4gVBfv}7ADa}Bw7IHnGSS1O3*{ch&4#jHz-r0P=+# +7XgiH+*(a>OmuRdiLZH7|Oj5$a29~WwEA_RYtw%-2GVHxZ2-)jlIGe6sL#A^E?zHU+Enntt6Kn_Bf#n +3ZY413CcdYP^K>_fj&v|w8mV#bcMaUo#j05+u-$>6C&+6RG>I6+I5`yqErP*W*d~_+&yS%N*>QgRvz5 +C&{PTbFqEGoBzBj`?5BX4ENi_E36_6;nruXM-Pea7sS?=S)63OhjhR#8)Rbh`twi6f{?P%==1=+Mq$uOVl$!t3a1!8Oi^mb|v=#+@ogA<>f8kU<@_)4mI*qzY|=yx})H_i%>ziccx +=P$qU-079RJ(l(}C)L|Lg0_SOiRm<}j(hXk$5wJFD{a!Lq(gfLVUWK?5O4mvfXo#sUn2qF}J*HD?KxFGcU)@8~k|1u)E2vBSO3{IRz+$6Z-mZ-`V>Gql0U}&?Bn&_yiHa4#;q@K +}~ntV}oMSj5JCgv(5NcVC2L5)$IPD_pArgNj+?ry3D4e?RR`D;+Urig?DUYpC@P(Kk>HQfOG%;v1XMv +fT=J!h*{?ZnL)SwaZHahSN!z(NW9py+8dT5@e}Lt)GETq)HyzN(=J`BO}qW2{$G5K-<`f3wXYv2mQ3y +7F5Z28b8}4PT-=Q_vWIHi;D<+G(i6W%3g(!f5`;&ADgEF3>C)sXX?Us~+)NrCY7b+-zNHg8%ZLU3H} +u;lmi`7P4pOG3opUz?2wp&WmLJUz3gWr8O++o=@}`v#`P+#+7;hWsW295Z7pBAyTB9UTVR-B2%&zQ-ieXPIc)2XjeV_4ccfge(T&T-0hqd^^Z`2wQJLleu;+gWWLY)94Kg2zoQ2J@9R`Q +q6U5%uHc2Lm{904xZZ7WC5O_P32f2RZB2sKU_prrRNd)em?aj1>IzH%CTJmr6tB+vSETJ{+*mu&@irF +|#&fzl$0nKGeL~j)CJ|wf(f+?9-5-IvN1~1$sxMl~ZDv~CfwOy@JPxItsRc0Qen>TJj>7)$WS!}se?9 +J3R{HAFD!i)m1Pn1Sf7Uz26Trl8gaV)-WSHuT8gpymH%qC#MBRcBEpOL;2X!^L|2)s7&KmHyQ8>r`P! +9jD%?hJ7aM<>qV}lu{gR?$w=BE1{Zp8mhhyBaPynx=~eE>7~6B9a1801;r4tvc9%cjE+|Z!`2*}2M|5rTv2eQ3n}9oe!esB9l27Tg3`J;~vYU!&l!LG{L4|rSf-Wy%%aUtU +_wLuPT=qyu!F&?R@eC4wd)l-eFYq??c--mCufO{k#uJP7~ +*9RL6TaA|NaUukZ1WpZv|Y%g+UaW7wAX>MtBUtcb8d97AaZ<{a>e)q4iQcZ=5@dF}d(o}U@wXT}F?V+ +kF%YlP<1)JI?ZT|hv7zhNCRoeVQeE#n4yYJ4BOskSImesb_z!()}rL?7dZB$WPV17?XYcEuu3z-v=Il +oxLGZWHSUKE|@wcp;sb1gKKAngEaz;?I+;0FvbnJAzGRa_fjdJi=oScxje#1^#VMO<4^n7F0ZxeA#go +}u-)i``WNk8k(i@7d*-tIMzK?$_<@_3dXYJDV{t3B}b!9Y^>mcM-i2#zyo9at4_IA&j9MsO*Y9G=7V5 +<%@_erkX7xkDUtO@U7%57h90-6s_cu5GMg>%+zWT=U{IdTfms)B{n!DgrtzsX^5c7XjRwHh|)7xA1s@ +a9;PH88;>rMs;p4b9J(2+JuWZQn)k3(5Dt)?T6^>b*ZD9OO6%;Rx^><%b?Fj?6cURGy5LLt&YVYMhlrlXzm<@|19mue6F@ViDQ=n)`{a+|-ZAv#U +WDBYE>RHf3AQ0RHOHZrBL-OF02wDrW`#(sVJ`d_db0GsqED(ub>S6z;v3Z@wh=8JQS*C?f0J{?3BNmv{;fH%!Wz8~E;nn2NLs+6IVd&$`mE6{< +G-k(oroI0v=9dFbNKBbXA@T$u4lL1Eyi&WS2ZVgIMf|Elm_7tihOs(Ac?CPO;-P+MRY+{c{j9W$!d2? +Xs6Q3L)(8ouesA5cpJ1QY-O00;mj6qrt??u(Tt4FCX#EC2u@0001RX>c!JX>N37a&BR4FLGsZFJo_Rb +98cbV{~tFb1ras?HX%un$tyO(piCZh2eEnr)VK6n|;^`Ru+P@oltP4S-ayc{1I9ps=X)}XM6qwV9j@j`jN@aGJgY>7W!{=dv1g3Dd=|H)la-C3y-)3^KQP3e*Fje9b& +?Qxrdh~+_{R4lxA&^xZQ_);mU7OcVR%%|3uLs^3&YhI;=e6B0W3x_S9G5D1_<0{{kPa@ltl~~||gQ^f +~yUSW>Zr~4IF<@$1<=y5(TLO9eQs-_TNY!HE>q=xrIVlaZuRS(4(vY2g_w +Kvw_Ny;%|C+u3_U+rdw||-1`IL8Zhs!Ala6i$p@lU(~kJ?P2zahII3?U`PVDR_4J}%gw%N&gV@1%4NH +u8;t+Yg5Zjp*AN9xezz>CuG*|)Eoy}-pX +1SXWp>=O{XRD;96!K+&osk`+2nvcC(jaq3FfS@XmT6_r(=}vTe-$Jmg7w3nazCGyFwwkoURUH>VRf66%~30-BXL%Xy8@*S0dLDv(Yz##M +TThAHWW{p;URigg@sJG%K=apbPc~0!LlP;ogC$oVc#0`mt)*K7Q^`WeaG#R4_SyjA*l5JNYXxS@#;(1f?TMKSWVK2{byH*Y6GRl)KPmo8eG{?EA%=l#m^ccsSC<;0;{iC47h2>RZ0W +HxgXk)v2m^!xWRLum-3F-OT&8#OP(l9$Gz;v?z*8tFK<~t%fXR8qTzw1j;Orl_-w@TI<3wu#l}?QgKt +UeU(1LBt7XI$G@CQ4-pA-;#8SD!(NUuV=e9AM-*&rVjv2LI{jDg(+dzIY(YUO0!Ndlz+y1`;ATZ4w7& +511vPv`=rknM%mU;!xlH$d6-wWDJR5|K3o4pfFu99Z8&$T1`blQQn@X({>D6{rOAdSsehvtrFAwYPee +jL~7H?BkYgvPBWSsL_BUD~=PMKH=Y1aQ=o*G@|(}84zMAM2mJZEP6;3U~5=gRsy20EeVbwYDkqKHZmV +7SB}t|WD*(cOt88u +3tyLc}HZm0=lcXiB^7tvZGwjT8uNOpSDalc*@cjJRpWMZtwVb5knaGVH3z`9^Rx1m}1>gormyiis6cK +{DE73ywL%i5OSg1DPY(6o#{>66}D@M_$-jVSK59>ZTEJs2wwLG(VE<>1`8&!h)Cz0h+~$GiQ=5EpVJg +6>)T}Ac$0ai|5-a@!W3QV{Ly}bAz3hzRJxgWqR5ZYRR;+X(85!Z9Km<=4+IO4vmTpSPqFp0d!KsLOzG +)d?S}1)Im&jft}8%hNc5TM@l2Qa&!7`{?adR^CweeVYfaXN1o!gDRo86FWpeyu8g`63px~Yxzld)oAf5*bJ +>4hhpWq;Y1+FikfzT7{?f$6d8s4}^BogSCdsyEGylamsvdiV +rJRxz%iJLW^h#i=`V$aS$CtlD@(>U%}RjdDpk}i}$9dv77CGjb +N=GSGGbmDtDhqn`yOGJ_0k0jm2nD95l+qIVj`^}T#XZ-6o_8tgQFXM3hW&I@58htYcu={u~;4Jr0@Qw +FArgRvURJY2D@QjY*TronmPuFdjTB<#zh~Y4eG-+_rOCS%04G$yq=WW4aq1bpTY&VN3pU!3FG%dy1dcv%25BpU7S+$E9~l%HG< ++NFNOb4Qq$0#wIr$VMccF>r(Y-W7xL%CgM*3o5UY#84L4YsgC3@m~*=s?S!;!egDiA#=H~LSwFIZm`G +O)b!8|0CLG~(mim@yBol3MG@kz9@4u9k%_Jp$#NZ}a=EXA>Fc`oA()lVP>ZNkQz5?r}mpW)VPr~%y5b +$+itgtE7klQf!EDdWB`Go>=7pR(8MGxsi`UT_;g2rm-<|GRvZhf9!3{`Xhg$2J4zA$;3I2aKR21Kia& +YdRZt0FMTYf5bf}S-BJzuZv)qtqf>D|^y6}Zx_dUjRg+5B$T?QE@0dIW +i-VnSzCik-WU|>E$PKP({+O3en&uxYRET7yJd9y8>X99fVc*ct&vjeZYHjGq+WgNTRj;rN~+29oUMu0 +$F94(^}Sr`f?A{)w&*T-0n8KDWOdER{hFnr-SU~lPE!kK9h-9~)PSkRygKa#=#^@sU@@S$@JP>0|@JE +5L#RUc~W`T^4mcjnZq%9H)LpVOO8G^9VX# +r&LhanR+SY;r%bZw%tqbgT-xkC%hg=Z$Urg9ue2_n>N>fj{GyNf54!?%O2%;b&@;i(#8o_;$nW=xxJ& +%yt@T?Zt+?sFShLLQrp4Os;3Jc@b1Ph5@S$+8ty3)MFms>@t2?D=EDEpZ;P00(<;0rT +ZqqWm#Tv)E@7X=Jizp%Y5~e??qhRJx^+;?CHju)`yKfetJwB2d0;U%w&wS!Q?+sO9KQH0000803{TdPPfS(c6$&20FpHT0384T0B~t=FJ +EbHbY*gGVQepQWpOWZWpQ6-X>4UKaCy}m?|0j_@w@&Cyf}FhTbYiNc3HGKeQD}!-WuDB-L#$U(l7~Go +GFq8NZVSP|9y7{fCNa&NxXiU-`*kuxWnOo-vNE_;KAsv_^nQ*Sc<$-Y@TLjH3T +DWW1%rxD3|B20s0UL+m*7AL-11k76N)z$vUnI*kep(2Ty~2@o%hNm&w|4m_m2mlCcplEs)8>!!Y>|rz%TmaggY9Ob03jT*M|g4aa`Ru0 +H=jpmUk0Zi0_4}xkB5f`Z;yAsj}8ux_YU@tP;w;n*1Z^;<{)S_?annu+?{ac-kZ#eh}5(qn`zHpsrz(*|ivk?Q8g@hru0T7dqcg@f&qXPPI)QYeaAYoP$SUTc`Qc45P?cf=A6q_ituPgCQqEkV{=cV1%};=o)KMMi6GFp5MJSk~fgBaOye +120Qae!cySKn5TX{n;qcLDtSrKotVE`JxRQ{m7>`fHdws$|U$wm +o+Y%u?Ie)u_0jGjt5#DqbW04H+ZscBHohIx+TY_v_GefCounxoGmb6R*}f-C2Rq~sgwnngPNF4rdE&4 +a`c}F5&^)4faDfG(4V$=X0EiO6pWWJ6I#m8CzPZ+RC@@u1x-B`4gI<2v$4h=bn2?o$5A;Bs{J{2{bBn +vXt@roptL-14m$I;(q0GVY*e{}yB*i33xl=po!p|ETw9esDzmhjnp$#7zVF|Km5%zJZtl`4gbO2g=I&mkbGJ*38t9X%4%mjX!+7RvWE{(8foZuJm{}WFLOw!!H +kyLYVTaEuF?{W{8HRH>l~}-pX#;*HpAC-WXpj57Dfo|aHArQnKZbaAd8Ceu~ft}r)D;_b>jbjqVfkMA +wwWK3(+U`Goel*^gkskTEbv|7$>rhL80jWq6@v4qhC>VhFJ=WrQldWZjn>L-j#8%ZK*^#N}13yGS#`s +Flgy(f^{(4=5_aj)|dHhtzh&Kny2Sw}flQ9wOm8#qBjJxE<(KY&Qb<64 +rJpaN+Ln&LXt3D2rUQC~u4T1z-&Og%F^2^|MLyJD&?u`MH#KuZKvl9rPNCOD*psn6I`nSs0y(!S%hY2 +QFb*8~L3B+AmI&+QvQrzOo5Ua%K$NJnkBloDan;;CkhUe18=aiq~}6Rk<4hMi^GY(v~3dr5c&a|1 +Dd?OiQf$XMENDJDCd#|LKznMA +Bg0vO5wY9zd?5hUIKZWxZiX2IqjO%Lt=dlx?wJwkDwIkpMi;P-f>iinn)@HiI8=WRh9D+c!wS-!wjh$`418T;P6odbf$lymXW{;ev?|3sFqZpjxM_|AhZ_4qy6xU6^H%yjj(l +Oa->H=n~Rjn{nRb(7VZ-f%sp=gPx0Vr!?L=45S7QC7D(^a=`w-E7FWE(x&{B&E#a-DQs1&)G&?P-7N8 +aFS|Cv{s*76{X3yL^Ye|KO$8*sodJsG;tTPd*&Wf*@&O6eVd~MG<*EZ{!5mo%zrma`Y0-;4WYTrzJOd +1>u*9tz+n@*P0r`uULkw6aVZ+{5$qXi*GcXrnQ3>Q=_d%gKW>Om*y&N_zeL-<;btVCC572912ob%Rd@*>Bv?R3 +P1lDiwfL*}QT$JD~{CZ*pY ++Y$ow-W^v~eAK_TpZn`QI-`kIEp3cM;u%~q!uk3LP$nYEjsjAH +GukHP_H=Nx6|VUSOMD#uE^-TU}cfGH@U-Vszi*>jC62lRJC``$%8K*Oc`AWGx(`5F7dO;Z@sMo(?48S +Y7VrQsbi%dVo+*I4>4^0{T<=~??l>bTKuSiIpwl8rKbE%-^GTE{bYJ6HynaFEY^>p=rE=ols6Z1;XVO)VQYkm&OYUpK&2&U1CJNSeeSu>mO9bm7vN34`7PMF&hU>vEF){whGZeCo? +@xwIYrn+x3*^FKH;GMzz8!eKOvJde{Q_6ENdz1PSYoY>K#Hl$P-MM%270D9XuWudNJ+)HaA1AdENPwr +kz5k+t^p`Yh}8rgK5B`#K);-`Z;i)5Sqf+NP1?#&o}Hxa~8z$%H4M^CByag6jsYNv`!!H0St=EG0ATw +-Ub`E-4#%dq`Hs-aNG3kld6x7HHB+$}}^OYQ4q?p(zKxTiM=4b6{%ffMdjjKX14u@D38p1MJM2*p1|+ +l@ONONNWuzxPijWKFJGh1I&;TA>xS=*?h{D>e6cx88OpKHf*b)sO`HoXBiv@BHJAF66rz-Hj{u6dnS8 +1c-hn|Zf5L}I?W#`>YwOa4cxwM2GC{e`genqX7vW!KRAZCjBO;Aq>AeoQ5)^(0` +xSk$UpglV^@1k|3I{6mf63#bk_6uQL`kd?nSfD)&}v?akib0h6+ABExxnhj!XNJi`{(bz0Q=8i7r;3S +fqtn`dM8-oRdc1>kIt0T9UqH%ed?zY?T(h*9TmO%@}SHdx=!mNEqgy^5S3m)l*<#SKl7x9vRpX@kyZT +`ZeIiAVun7!P}Ts(o+!<}Y00n?Bc-IT$`=nYFDHp9Lxi+^XRng&_Svj1fFC5E6aaLtqXMUKo6jXD#+D +hC}_m?TifrZQt1a(^bcS7{K)#&u-(=&o}_;3d|5aj(-J&8v@Gw%@_8`#hG=tb{Gy`$95h2H6_YvgsCFn?%?ct2BK6ta +V_&sKm@XjDT4?N!=<;hB2jrz@Eqc)mD2@r$uT8+a1k{ZnM-Om|5_7>tk2Jlvt85vrZ4L;Sj7u--jT%c6&w(J^w^L5JEIaHmO0xGWSb92Xe +Y;S-miNNL@-RqIH3}bg*Sr1%iH@(X9?gR02OiOeSVbu-Zg+nxkRFW`khh)<*;9t)J$q&yl(&Xcc@i7Q$@dvKQx(q2L{*kMV*_$f$*+H}~GFdixSyZ| +=W@Ck(VBY*^M8Dl8yUT*{&@!$Mwefxtn8II;EoPtTt}-+un=`SUH^;|SUhA8}m +YqlE{$u_7yI!MtXfW72krDkj1hBY$vQJG75dBcb()56=rcW%6UJC|;GA-{%WYoVjuT5q<c!JX>N37a&BR4FLGsZFLGsZUukZ +0bYX04E^vA6J!_NO#*yFkD{xe)0G3F|a>eo0CbUo1BUVMPlC1c0iV6maAs1N?VDQ*o#^wKh-97IIK(6 +DvFL$WYY8RO4nd#~2>F3P0ZT3-?ZHInnS(ZiR{?N32l&`y{8hV!Tzwg}>@2h6FE9;&7v+3k--R01imH +O-08NY6tdRwYG|11yNvSRnP*m6;JJyz^e{3%=CT;}zTWo^?y%T(@A9@6ZZ)kV|FLWiqe*0Qb{+70U#Q +CHr2MbksRxyrG_Y0LgGlr7t{y6+@}_xjybRqCJWT3$DGxyh^YpDe5MJ)5d|&DySPYFYO${LeeoIOJ`| +qP*k3WY?nr*x{?kU#B;1emFoGS^XWo{=R9hp5|4>S`(RN-LtmN70z!i8LI-{)AdkRMaJrDS@KQu_V69 +Pd|qFdZBsk=Qx)0mh8=q7ujK3u2S6l1;M*=(1i7h`MH3*9Q^FYh32tB~!Tkp8gsyE +!MXzUIIevK7+U8RrY1Kv8O5{d~muc%60(+d__pf*e$GgSgdOx_~F1m!dj}bZde2MU?F!40s(yCP~}Ie +wID75&1PK*9EmR$T=Meu(BZo1*&csq1c}%6E?Qx +>o@nH1z^@ +M3t&n{>R379&<;n)_VqHZp-z6LmjE6_L%O#Hs!W7_K6Sj +4f387wfA{@WmJ7lf8M)y4><>Gqm>j9QdkzR=v|W0Mww-ED7L9!(aDX#*npE}jl6TtCw(@X(f{w+0ftI +@cGtifyF@DJFM$K@^JBCIEX&0m!L9<$LG48p-A8I?7m +98_8Cd$P%ECs#I$~U*Dn#F(fFu?HRDae`I29pRS-oj$76Ju8ba_^kJub4<3&4z7d<~3EmBNj66dvxh8 +sKmMuE|zEw8JPgL2#o0IRzRZK~UoI&}bEeuPc-w>Ov=q=|MGIlo^GIT!>>Fn392F&gY0HjMmjm!kl23 +xEAQHpY9jCg;L!rnd|S873#SY%L*S^C`r?F9xcC#uv6+QEKb(aIsmlLrwAqPj))ytXF@b;5YrrY(|=e +5jWQ1K0q?aYS@^2|a0|&{Qz7|>o~*4wwAjbG>8YQ3gbJ2Xa0RMLio!%%153bP68QpD9r|0Bp3gOQ0rR +IITL`4ja+$zK`RhHqL}ri$lrsJ@N6IBsF%QU(5VPX{6yz1VXZNFb&)-E~eev(n$M>&HR%DeTm@5)^69 +Hy!_f3?b-c!~erGrP#iFMuNc0Wm4bjHkty?rfGrbto +L2Gq<x+wC&kwMgz2q;-lX-;aK{gnnH%RngH-WaG+| +3?jbC;)r^z6QYs(ILN$eSza8Y{5mfyB;O0WqaAFj9S96Xwm!Nm!069!(jBxORKQ%j=%xgufc_0oTVv- +h43HNdH{o?Ns_XZZp%jz1AWM);E_F|5T1fO(`V4@vWbfn(q_x!ydcUMHv$@g2#}0Z3!bS%r8R27BHEU +423t3$XB=E^?sJm>2sxY9DShHrVjy5nsuxF*wQ;;h*O^d)pO*x1N1*WD*oxzj^gY|5V=1eMsJ(^DyQ( +R5-5G66blNZhe@VC$g|HS|Yq9)>npypeY-MV3e3gC9AeNAo_9_#|@(~vaaVWMc8DN)~!K-*3t3B25aL +-7S#;bA0i1biV8pe&-+cA?gGRKf{D`$x{k?s@>&=axXOX0xE>2S#RiQk_(t|2N;<|@F^)tk2^>-ZWk9 +2zJ4;bk&Gc}m7o){vVe$1q1{=Y;ECXl46*y^;O3_T^(5^ODiJIMbnRY$9JUz@aQct2d3lV_V#15CoY%Xh_fz4kFpJ +9L=QBj4*`DjBWFw>SqRF68Gt`6jJ}~0d~)_=dDBkOz`dqpq*|wpiuz2Z@>eFD!7=eNXXe%`OerrdcL2 +bts6xT8oIMwv|@+*iTcCTuYpiNy~ffZjfd17G?vOQs7we#bi_dv0{b?RU+30WSq+6@yB@Fma23Vegz} +(^qX(nr#zaA}rEn6FM_SH1fiy=dyok1B)?9!vxNCvSEhLA` +xRW9@5X&ICAkzo`>Dw-5v)OZFy9V6nT-(Ks99Yb@8Guzv?z|ACdL(N4lxoiYrs)L~tr4SHvFmYT16ag +am)OQfJ{E*RT$uQAZ|L!+P0>)Tl;mhM`*Q1G1S@dcSkcsRA4$f|#SpR=05;er#}D+U7GS6h3^T88@?% +HaVNVK9RUH>xlPJpV7Q`#)m}m}$TvG$wE-yh9%}vesC1H+7`!<=aJJwzUXXj%c5J219L|Z}x!i@H1C! +{6K&0h>Hs&ISQOctWoqPG!XTv&X057DCsTgSevK@I>}2W_z=X%xmDh_+nlZ?tb;`lky#cVgKrY9@DF>Y?e-f~;|wzlnO(*@=rxC?cfA*gC5lVeV@|4_ +e_Ks$Y23D-7HmE2lK3M@JLbI6GDCh6FEkjz3&l9lCUl%pdE;oveOnGj@;NVrlB-t~ekaQXg#E;w}7EQOiCE`g{$PFlMtp+>5nii?vr +3St9=U^?q+)fV%g>|LDte5|&7H-4FVz6 +JzbFR*9iz!h|UJ5Vu`sLQ7@^`5HnUQGKwy1fP9kfHi|`$_4D%oZIHQEEp#ZG{B;<3swebE)3O%yysh% +w0PRJ(JY5fIT{kzI*uHUEs{B%09r`mc;Rzh!%!O*R0Xo3nZzRt6GAFGpZpwC>+uEe#V>QOo@IP?yE-L +?i_VZjH$q{sJJ1f133JiEw3-pQS2b+r%U#nHa??kiEY|@kV4^8waf8B*lFbG(La^mP<0kRQsj_5sP8($s|tgS=t6F=3R7aKi}jO4M3IxSoMbG +OWF_Mt)!h|P6h!^0Ggu8K8^OpSA@pyGXL_+-w|0t83hdZVspcBLS0+{S(lqjX+x-oV#i=)4QxPw@SD6 +XBBJuV+BF^80u4wc5x;#;0*IQU9gPTB={2i0UT9v73A;e+>)s);3ykw1e85!GCru1davw&vB6sVhO=z +KcOP{ +R6@sL~`%Euv4K=PAZ9)`k8wcew*!H;Dn#UMFye2Kt7F4%Y4l_?$!9_xV)AKGz +LU6l&MQ{&1Y*wm9ITp&fB#%h0v0%1(T95-29-K=$VEOl_i}BYubXQYj#t2KD?~z%EW3rR +%A=C*_!L>XOT+ABz8K{vqnu=@G2!Ee*gzz?gZ9RT*Elf`slpNG;n5p<-bjE{u@>%#EtRGuHIaO58y*1 +wq83Mq$*=?$LU6quE}~^`+5EJ<@tnXlJ~(&dF&V$N@0evK*Sjc~g!zeMqYP`u9zwAJ!^>apYQVj!+nC +`ft24SdzJZFk3RSXZHy-G~^6`3XaSVrBm@plN(dH${zg_~1Z$yZnD4Lh1eh!^G$Nm5ekAYeM6OCc;xV +iN_#JH>n7JJ|vSDMvBLw+~enFS*Twm{BW(WeKU^h{#A08Yg`5zF)TorT@LIid5#MBg+dBkq85#8Mo$1 +!!SS=KL&TFl#s!!U0Zpp}U2Kj$nN}X3vZfc*=RZ9W0_a#)2gFUeJhd&+p079ue2NLC9nA!-JSQhC8DhR8XwE#U6u@Fb5TScrE3EGE+A=93~24Hp@O7%cbXFWes5lftv5+)m +6VmYTm3JqZ}tV?7)a2Z{6+^prG`=3*rff>HJhThnH$i8v4Pw%EaDkD43JlGri +P?~Qj$j|B%ZK75L(eVvBFO1YJNb|a9e_iT%8azPFWi4NWk7@DHKDOnFEFeA_T9lsl=Lq(Uceq1jStEo +dYeek2m>|4;{3cmak{zMP$*rEbG562*>NL)@?P8$JJN-!+itLW9ck4CTBOnQeN`J1MHfuSB}tcxHlk-_~`;LiplM^2M?dUn +G@SK65Q#hZGIwfU0_CEVQD#OhtZ?5BF*5rbxlN3ggsD^H0ad8!n1K;6?7KuOk5rX!r!n0b4wBE10n0rq6eb@>_Mh77MEMV?QdaGOg{G8uub+Z^ +XmB|RRD*M+u*@E^fefGK;Q4+sT8)GkqDIF@-&THR9>i+3}KfEPEP2hsSl4WtFBNwU?6x1&kx8BN3uBHHSE*U83JO7Rv` +S3%B!c>S~skf29|Bxd`I2}7(pD52S17apWk=Wu4Sq?vp0>@Qc$Tt%n`4pl4c4EZ_w3MIXnZKizuc))5 +9^Io0|K(V}IGyU*hpNKpa`7T+P6%FypB%H%(#tf6CkR-Cw^XbXjgV-WvD6_3XAM@0+u;86B3trm&?z6 +A5lKAVAQ{BHsqR2l7egMvoOw#LibhWE%Eho|Umt +8U3iaH6W=Whelz6+qI*-=Mo%4#g1o3!HzFdKMej(XPF?RP&SB>#|NWML5iU`nQ}8!dAqRe=SI?lYFY* +~4$e$r=)+#tlJ}c3K3Gf-IPXs +xtroV;YvOfwTI>M!=JN9384lbV`J|cz7q*T_u9lXMZIQWlP)B7#q_QBakd6Na6 +Zyoz-;2nsINY!ssRM*&$HY$$5$8M)))n_MF-0`9hw~7g)v30V!{_nw`;YS=K46470XP(W^e2aUu27xP +3qB})=kbbyWxSmSFz>F5FtYBchnW4%*OQ_yAqiZd@?*b=&w*9+qT+SW1w31`G;TCkiHJ%X5c +W+CD1Rp`z0XU73plr$vBGj(Kx*%!GA(00-gjR~Zz^+;a?+$Ak0>&*dQl*SR)CXIqq2*&k&P8=cw$n^4 +iP4xx~N&~}b!=`k>2r$xPYGzwfy;vfYv8k<=bWS87FGR#fv>!(oQuV8b=9A;*V?m@@0MOtQwh1El2HC +Wr#`Ab0Vr#_n+kL$oEe$TD$dfQL1!xs;_xr(TAm{ovx*b0=vMn>4b&(nY7Udqh*^SVkYjw4;=HaM6{= +a5Zdn^2%s1q|5FKtRSrDA4A@ZrNtwT4@w7H|P&1kbY*NG!ME8oq+cc0M3@nx>=%GbGg~>X2z*{GJ=G+ +tSd#IV)-pLPqO)uOaQP#4+D=YNu|6ef)r#-D%wMpSEEMZj^xufo<~`7M4hxQFXqrxNXawa +zSXW)&aE&S@zRnZVVE3DJsqy8C$>PRvv=SYeuo@Igc<-?i3aEc +69sbW!nNp&MLg$Rs-s2g4vJ5*Q#)`|17On4muSmI;dKr*#YsbPKV-OS0+TUJf5Dk@8Th#9K1*xz7)y1o5Y#a{?kvJVIOQPd{P(pMFAxxVAz_E11+~*WmPH^NPi|1io=4wAk0@bfW1}o +|?j)aZ%sX@}ikR70Y1 +gsmoyNW>Th_|D_JE5|GQ=(Hls2ntm08u9?6-HkJw9fd{=^}(AqQ+IZ1z;BJ;~jc_HWE+cc{uf8G&Pyh +Jix6*LW=HYl+aH(8`-XC(z$+lEUnS!PV+9o`WJsGY1N^YQY3}eMHQ@gu=lI8Q0XLm~N4B+EVDQwLF6u +H+n5ZSf#A}8q{h`hM`PiOTIuLc27L~-46?zC{jGy9}mYzW!DX`Ej)hw_3zF?ydr5g-O62T@G%L~uJzU +oI$WtyFM=pt$zQxcCS1kbh%53eGI8M7d1vB`8iNBWoxB~%Np|@Ziw|+|#3y}X5V3U$ghzq~N(GHuqh5 +mey*iZU0p4sg^k$H>Y;4q=<-e7;)cjWFw+}`_2OTr2`=pN0P`M0dkV>%6frA}&;>VeT36EXH#bNsCx< +Si{3@Xy3-_aDR&~t5&;C385El2l9>}hB;uKQDo|E8V7@$lx(l>->F<0O*u18>cgc=K3ss<(A>WP>>lC +0X9-s2EJP_YWS?qq(4Sa4Fjj?`ko=h&_)P{kBCe?$xS5?CaW%s-e)zGp?C +))rbu?md5yg?+c-P=L7inFqCv^&7A=LLbU2i_W~lkrs(sQVjL%uIJmC-ld>qfkXgTs|jD9`WXJ +S5|N7Sn@RfLBX3$jE53=vJi4qZG6*`3D)2ENQzQBo8i +0Q3<_B5}tvbc1iWuR=A{8WUVQqPSyD(f51F!CV{HElt&F(2GWz_^nhI)0Xcx)vw&F|eDMN4BONNS7#` +uc8>$=h$7JANaZWbR&bXkb#;hZ>Tt@trB{(h#qUyY9Blr^-+NqZxR8_I^sZlvpWG5jX+RY-D=!FE0)OFXI2KRl$RM#2*xMulQE&NTRc +U69EuM?%-a`>fZ;p-SOY*tMky)!q5-RIDq4zBLZb1U&ad@qKZwkebR~jy4o7oXavR%|jV(~9yFmmu$O +jD3#hY;3y-do1?yQ?m=I8`?Rv?vUjFot2W1E-3S@)h;N1dtPRVi@+hoNq6h888RN}UI&BjnBd?i8qZZ +L>f0oxCrgm8s<*X3!DMRG<5?h8liqJK|42nP~dyCwcz00sKAVr#4aCd&PRD!3vno&|{bj_cBq69&Pgg +ZK0FhWBncLOe+TjY*NM77#8&buW05!5)T`a>Kx{L}-5?cwdS +w-?dN`WhV|J34JZT-l^=KDoj)bKpDvZ5#p!e?Blg(T<-aOLRsQM@jjAdHMm`l?RFHElA+^F2^6<#Tv) +W9dZ_>P^>B&lZ&^FJm{7Wx)iV)t3B0-PSx?g*D5620~Pe57`IFtEl!>CWP)=~d1BoGHgW8*b7yrxuJ} +RRlR)=qP@xoLi8+~MVTs<%OO)%9^_(udhTrn}8n4Wa18L!wSLZ28h_-me;9=BIpDesIB +>n$vh%6&5mz%BfNlbSoQ))YMn~JwMiMV32I9NS8s$Z{3ZCfGI?$&A))ysd3Tc+#Ej|G@Fp!|i7=H)Qa +B#yx9GMlgic%lOr|@)nHGn|jK#;a^ke1ofLL=f77V`iWx!nLXj^$%({n(^q*MkKOIESBOnM@$+ZVAO9FV{ylDvUo>BT_0?GY^rkH_u%S&jumxqmy9FrIJ=2~Q&+*~BfQ9V7G0s<|!}LG--s*6auw{kz9aN(v +Vs~IMbr{N|;a0nVc%qGCOH@vI`k3-VV6248F;gI~z^xc`$3`zQk`n1R4!WciPNol?QN_%|D)c!q4m!p +TmZ5&${gfB^*u-g{YjgStnm|z5s5c@ofd(xF2;=# +iA29D=wLup5_j#@g!5d%)(@jxb`tMD!Bo +2D&hbRGho9EyPu4()H~Qq&QNKvqhHDk9ysyjt4d_Kp-Mv6;6!b+L+ZR~Nna8IQ|*on9>>lLr}`U~2vE +yB%6mJU_l%y~2-g+gBWp>m4-#K&KCvIN=Vrik)(7%jfLFD!d7J=xuY8b#dzU)FlO8_HaYV +iK%RRJFP2w!B^4$fdnDvbvd*?mgE{TMmXA#5W_Zsf5N8swkKr>JIb|RNVaPBa^Z}U2DLYWd#~RQ>@$b +{XC+t8pYHcp_ddK)6#4;lTPSKr@rC51LR +#}T5`Szy>z3tLcR=ttCNq5Er|O_Iyf@XzPt_bulePNnEvtY1X)_2=)m-{4ki8lPY|ZD8Dhzl2VReoqh6+HMV;VX9{h(Z(^C~JuZAu!`5J}l +o>Om8x9Zg*8qeI7kAECJ?*V0!{ECcVBwVg?1f3FQMJ-~mVo6m3GKQXW2Qt}8M<-s`EaJb_v2hMRjts> +_d_A`_Ey6O3y>?v5K;&z8e1Tw2mDhS2#UyjkKz7+ttBuA{ +Sbj8Brdc(j~gq@JuWGUSImt`hV4E4CCm_fi@~tK$;Xs(iWk;FNNd#V;_ +|u8Kk{&zzT}8(OH~O*fyt3>9+#_x>ADO9KQH0000803{TdPT5?&l|Tsq0JI(e +02}}S0B~t=FJEbHbY*gGVQepQWpOWZWpQ6~WpplZd9_(zkK?uxfA^6n@x)v*tI2b{?GhoNbQV1iag)7O=}>}g*u+JX@uNbU9}D5?s_ +)s?pJ!hSM`3jBeFtQ6%>uqwe9KNm=X+>->L#>c+p9nvRu^-m|9jDd@kS=P~6nEkyRz><||{giIKI9s% ++K??)K6w+Yz5G6Z`_t|1&F$Y}l#d61swerGF3|j4gm^s@_+bvA95O!@H +^@(JD@er;%Hs7KHe6Pzc;B8X7>Gmh20qar-eAX!{PY$+waUN|EuYP1@W>ft(rVfEL6Kx7`Hw@NP7Ug`A$|AZ7B{=e9UcoBCVjz*;{t=-n6i +C4x!Hr@(8R&veg<5rvEGP#aH51*Kk=hpU+H5w#CXG1mo|e +`6lU$2efBxg2qU<}XQ9yVjTpV`>62%|PJpa6wCr%l?6S7j$u2GPzIA~Yx&3Pqj_3OW5w&K70kh-mjW0 +{Y&_}R2RqlNtAhQ_jqBAoUlqD21nIVpnUiuwN} +FVOj`wN|xu0d3m1oIGBnGYLahP=|#bn=T%t-RgwfLn_jLuSf-`v;PMDM_XH?%#f4iaB>oTx!nHWIRin@gqC-ZXeaOxL&Oi@9% +99$FSQ1Gp9sy^cwkn0j2j)>BZ>URwNcO0j17_0+Xf`R%0l!MsAFZ?Cgay$E-8NR0z}(;Z_-wHQdVWEj +Z4+8rVY4XDXjyOct!}{a=1jq%p;FLEBS(=lB)P)`jHpB5!oUluc)+zaMr;QLTdP2Z**I$B1YI*lmyHx +Tx4;DeJqUy>l68bY1E?RA(KSc+D9uMO))VHyU@b7iluOMZUc}iJvZkP;p=cv03JLWSwF~5oGYQucpi8 +p9aAO)m(w&#a#A2fEh{ZsT_Ll-@1n~ibg@M6TbD;@Fnf^ED=f*D@hEjh(xN+Iv`9zeO^*zd_IHW@DYi ++CN^*7Yl20F&k&zhoRh4>mYid5X+12Xrz)+4&8Lr|D&Zb4#z`a$%RKX1(mR6ldKUKfd#H!pYTBs +3mg?m##)J;0|$zfW`CV)M?!a??QZ;!Vvc*)hcEx&`u-s2;UvJpm}a{Zk0RCX0cNhe(|8zVpyf+dWdB$ +=Ay?B&C!p-o}f^>Gm)2Shvh`;yCLzyixl?wefj1cc|=H$n?(*4gsG33K@e}>i-a|tk>i`0vThg+!|fc +laoe3_LPWACRAC%Y=2KHJi6{T_Wp;U-j53WQ%5j-&1*e(E*|)Hl>K%gHnZW+Urzd2CGsZESi$#=+)2c +UYvSj6F)qCPtW5tNA;-mwG&wfxXxyCXRLsZJHTq-1AtWDY0-Jw|v`2vijJGvDkb6m4T9*@OePj&Sf?o~Ehwx+At=+ +@yDf#%yT|JBBbG3Ie-ch}Kku)+dSGHjwac3>}!5l`Pt6QQBfgH8+Ge3?wet#IlPh-xZqVO3f +EwqW7_{K@c9eOZkhGpf>N5uDV<^p(LkAit!;P@fM#$SN@BJ>SbvdhS +;jIwSr*o5t`yZa<1{W(Zgm@$6{83Yf#obG>NIz8c|(9_SxqxrYG-G<04_UZv@+MkG|pVP2V7B=Nn-Ym +>&KH-D=mSAJyo9*brbPP)MXPRqkeIW|8;hQKMD{xY%v4bb_otLFQ!t4s*q^i9` +Q)VUq*b8vVTrv*x=jvl8PHRcvCIlgqS53X2Nd5SUSz(pwmtIfY+y;PkM}_R^qY1ljIMfwB|*DOJC6Yd +Rkw7)*zKEm{~d)~zofj1*5;{#Uq?;55A%31sMKI{WS3hEqurfzPtX{vVpGioho*%YC>o`UG0(W8ATmw +J`N@@;G{BfAY>QWge-ifFZRpv+^pZP0&%aI)F(~4~PxJa(OtEOLJoeoQHMs>zsP9tJXlm~<(u)k2ol- +pDWQ=TZ3Ujmm6&Ld4j>(JjMU8WFrvYJ^^z=@7)^-DP7a)&=J1go=mT;r!n=z#LwU)IJe83%F*S9Ru&; +d$f-5@&(XOl!|R^ng$Xxi$${26|B+pZF}?S3>0zJsQ5Tdsa@-Dv7Eqg_?lIU*XRk-U8&-nyFgT^qCt@ +~Z4M;r)roFn;=5l@3%~uNeH^gMzP76d>pF@LW6UU&GK)n}yc4;&;q554 +TkA^3*nRJF-iP3Wz_rCod{C^`ngXbB<`x!r(-|F56?)T+s!E&r=Tre6Et!sL8#`5&Er$YPwTJhy5hIrv>K=3<)XNvXU6djBcSIk&ns1z_3!2T +)4`1QY-O00;mj6qrts?Le0Q0{{Ry3;+Ni0001RX>c!JX>N37a&BR4FLGsZFLGsZUvzR|V{2t{E^v9ZR +!wi?HW0n*SFl(Fk^zN>MNa`-bk}v;U{fb`)5F3r1lk(gT+5`Eq!RnzcZRk;7%7`>feJ8SQk*w4Z{7^G +G5Wx=Y*V?)K$bCiD7A4+tgJ372ibWYMVI}xRt}D?kgIwJj8VE??1bHQ-W7Vgm1iGo*77M43WlvyrK9l;~6e~|{(PMgy=%uXeGsEz*k{O~!O{63w0%I1I1X1BB7F!Ig7_D#g_@u-LZw() +Aj8dhSxf5hG3OvlSDMj$Y(l--w3Y78c2e}PL`XcUHP;4A%b!#YtE4c2)%hp!bTdjREL132g$FyTU~eQ +kV)|D%Xl2E)cR-Fyq~&hI5zro;iuI*OubT?lJg#}Vba$3uGc1z8^5MBZ}_8`OhT(q&mHL@u)Gw;&d#f^`Nc87P*nfI8;W0 +q=19*ucEM!vb|LKI7XhY-8s9CuRa)G8xRhXp)IcNaqlJbEButz +V?Akehs>$uJcKW!b=jk=%~U3?T4rpGn-&E+yMe4=jd+l3~ftJRR7?jSjzAIhI|{z@;c3lOR*QJZbvRE +bkY8uNsvjE2DwEDZ*aYhBAF4QJHexSrD7?!^1|KPCjiD^q08((QERvW*d2Dh4WljYB6Hjrb0Zx!i(vo +nE=r20Mfz;$O5>Nvopt;;$3G$n#6wD8r$!`(o;oClIXUs4HDmGrPU_-YBUTLk4FvaDTnCAI9fEC ++pgL>(=Z{*kO{8oIWqZT~`wtx32xI&Eg3;!56O>_6YvD{ley#zXzej_Hri@|2~}mq`LaUbwO+`L!I>+ +N0LVQg$JaCyaCZI9cwmi|7!LUj<>N^MQk0vEek%x;Uk><0HXEs}P##dM&^7Clx+mQ+z1$D5n~zUP +IcNQ#>Av<2255|2b4l84WE<)OE2y^qp#+jo5{(ljdeP2F};ww86-cOvD#&(75Ijl9)gw|%wg>bjKrL0 +Mm47uB`?vo#_Meuo*-H2C334>{7K7S#&}_ktr^`Tt?#hIxUOpCWWQ +!mXUcu#Hza8XJzrfLcMK8mF462Cu`)|i(=C)qt`Gv|4rXuZp-K&z_ +?}f1ECB#_fEi{KlKf?B4Y6{mIdL&!LA#%E_|x!6Xj+ +_Xj0(Nnp|X-d{3+Q93+hN1s+ooalepVjs`M0<~KFpwuGhE(ZC<$D)*Cs!_u;7as+&5T4dDLA)ow)kU>XjU6`gR%08Pb~SA8zP` +ndmzv0xp0Cmh!`NP@Bx@SL$-<2OWi$t6Cg$-&dnEg;Dz-v)R#%t+<6#*8M2ah3ZPFYM7Co1Z4<@B3wY +1}YR}JvKDt_<9Vq5tb)-p<<)qh+jNiqoOB?$8s^Zr|7i;_c|H4+KZ3mim^@g!@nL76>ya&xdCWCkS70 +RPZ{&Jd=p6oBUo_^(^ULr>5QZZpI`fOQW#J=#_i8ak6s@OQRYO(<~A=G +nEb8c@R?$SWh6<QHpMy6;v1mdj0 +jb!HLdo?UGyv;HY`-z0hkR0WvW2zs*$F)zUy<~b3=p74GXWmS$}YHWlLCBik=mMGz&jT7-Bj1JpMY>% +T3j4Y_WtToCo)#e@iB{liP;R~n#Vl-W#O +I=Wp0TbsgwZL>wq*PB+VpT)_+lH4QeZXrEfbdO-N2zwqBzKQ8o($*!L?_t4E>n=&7gYiNQ&jc)HQ4u> +*~~Vr65tNVtUcPD5Za7$4N8Dq^m-eeXXp6*98pW%^@Fa4Z;17z`v_A3K(1?;%+P%ql_CSq+TH{Nuk9 +F+Gzogxq8@4%vnR7SHr%kgUBW=&_WC=lERL_D3tUa(^v4yLuC$C{@us0;UQtn7YjH)!>P?DckQJqrZS +n&q!CRCmOeJM^`;X#NJ60J%Q$Y+}U_^$}raOpVDgi1OK)4plzt5HO`)OB5>buX5z>H1V=YxhUKmi_hf +^i0ag5L^AmjWzHwGl4XRo^@kx1v?58FW4Xa-yTrC69!3raQYO1(mh4%MM~oz6TcceDs4USE9sz +ZLp&bZviMX@7A!3UPeHQ%$)MLt4|87O3+sb|ogPziw9g>zqDAjE_co@KzLss4}H{8Wp<0O3p23#zL-N +g3Gfp9){)&jiDN%1hrcr+Hx>E4mH_l$(&Y{?r%aeWRg5(KUA`Ga +llms{`4Yi^7UaxP +DvafN{62BdG1vt&dzXrA3lo|OY6hA9lfOr4{Y8w-2n~?(=K{O({C3sNei6WF;fSa~GTcR8kEa9edK7o=fS0O6ab5z-vIW&eym87dB&c +mtOaMmk|YP`}TP-Lghl4if>xv?(({;kz!AJCXZYkVU=z4OFz^2`IYnY(GFn5mDV>hKP<z=AN0Y +)T2Am@KTUI-OlcKfI$u%E|HFac_z$znB@BnZ+j#=Hc{m9AV>vuFw*yHUoFGv#W`7F3rIUsjt5TDx^b) +v0tO7&vJ`?AUR@S{%;E~f=e>}sJ>7D^oi6cY#6+kDue_DOs#YXQ*M^g<&kN%gFqIhQ06Iqv)Vh(%+gg +(*2dCv^MaHk(Tu*hFjQSsj9}_f^fwtPjPn|6VAPHCR3Y*2;uwG;Gek<~;k|3e$FO$%Zvg!07zzB{A}8 +CsEie?Ujt~JC9Y#5{=c6&FxcmU&nH%AmpDH}`HpJTraVb3jsV56o^TZn4rPdwL)7Rg>7u^3u8t;iFbjLnk4u>*n&Z$9_|DyiZ!?@Y*Qx$7UpFG$2vW +meEJK!8lDKJZ)^%bj|mOL!5)4fna}>x%}czJr*zWYEx?vCQZa(=#f8>-8E^F0iebO<;@3LA*AR;GQbA +>GdYtiIx{c1XL^s*&jJ85psXH7dXSe^*~;$V8d5%y?|-ASUMtWJ*wAvtwM7YdY3Tpsogs)varmR5FYz +|tm_v8%ppwM7u^HANj~w}BXXT{&1ik(c~d$}`7Ru<+E_+w1fiEvNp!mFXp#ieMRE~`9e`w0imd9Jktr +WMyE}c+VdZUImg{VD^RTu53~r?eEIqXF2+5CD-wbP}IlJrBr7xH-Sj@g>s(`=8^4E&}_s4R!jGi=>93 +oY{v&-S=X=;d|)#TcnBp2)cdNF@1nljtq(2u1ab-wfl35K9v1Uezi`U9=|3d^nnkk%hjj#S4zRJkha4 +wCmt3k~adqfv&rh)K2yY_piX%3#f;E?Q7EHK;1utm%n3T%Wzv#e2`VpZMr2TP3aP@wedkL2%g}2Wif# +^fX*!*^{pw@Y%wGO>6?-2S&aohq^XtM&oR{br6^pRe|{LJ*d+?1QyfrE?4b^)-C%^R|r;YfGjUAKE#br|1yy{QD`g4PyLYPmUdo=QW+R`AhawzT78y;EEl2M4yQ;#7I`Q`-xa>!E +Co^$VvN51jQegWBeoH~xHI=fxHb^s5XFZ4GqVLm};u#vWB6QI}uZ9tSQDGef7X%h`YS&O4CKiMkDo4m +uLL+>=&KZZ?Z_4W=7LZZR4k96Nd3qY49?4){ao-JTVuIAL6{cm)94upt8#bpJWf@3Iy=u +p!b2ReQL#sXERWg=#p7*jlJMG1BeGr;#DYl6S=J$Iu*r7U(nxoOj@lpRwO*i=3a`W1Z +)HhMK#RIgtVx`De?00k@yE!6NxnWC-Ufv7x>ZlA=+N*QmAwDXETt1~j2`UI8pVcm94lD*2F)D!8*?b$ +$Y15e~quY_Q4T>Ms#Bl=Ml%EMj@#2DD#bM&a(nMdr +nWz+=b{z8>i!#pkT=>Xb_D+x-QprDb$0+I1}j{~6*u>Pf3u*mn!xa+G0;mOgwKMBu}R2oD1yH6$Cp1^ +7L}N+NvtU{4FW0B%wD#%^Lxm)aQOWA73C3347s`!jo6y*)qJAuAZ<{B&N7UO*#jS+nr%~mt`cX+J`oQ(&z*)jjw&Z|F`&*sbVBrKgnTQ=N1 +@Z%9I6tOl8BS{7#3{W4yXu~_0_Xc9pg#uT=TV>biVr=aLXF{eBN*%8GcCm6g +eOZyl8p^s!#3$^tGpP{QYx4Umz6q4p4iAX9AR;doAiMBzMD(ZXUcua}WsH8GkUnUZk{g`?Q;qcl!H+2 +F?)YoF&Z55JV;PO&l=2xFC3G=T(rTn}Dq5o)uZc{2)~{rN)X6{Oh0rU`}8xvwidC`eJx*N$lK-QprH( +*X5*U8{J1l!?;iBvW%&p-O0CrscT60zU>c^Y;WoRU0v1+T`QO=Eztzg$19=1B&-q)n_PXbUGg!VmO1- +NCCqsR#dsGGL9)xPj(NynL~75^STA*y(|wda;nOK#6!5c#d3H|TcXi?W) +Q?F>Z%5oRCrGg#7rOdI@=%EcQGQxH6RKV&*B+ku@Q5m^&G1I@-< +|ASZ)i*XIRR$B3>tk4yRw<&oE!w)mToWbQMnq_WH{uw6!zs`)(vJ{1lBT*J-4QUEm*&{0foA}|PtA}n +{$wr((;XS&;!JjVS*&OAcq+k9hy*CdPLugOO$Nij&wtS-WO(X@(T%>F(SfIvwRr@SK;VbMjR)_?sXQm +~aIP*6jm!{OjafITz99^aoXf)ZG^a1fCg?Z+^f`e)sTgpcY*8vY@4|P&qEE7avD +eF5)(7BeaNOVJx&9=@cCUMHbquaWxu(gMwgGH!C|)RSoJng8+)|?v#je{9x7Eu3gC3kaUOH718|Z&Mw +igw5~2pIG|FqRc2psq8PL$=sCZZPkg7=5qDB|l)I^tf6`2kQrJHplVttDlJ+P`dcvu^BzWtCAYwLU_B +U2qN+V{rHE{Ch{w4Mv}oy3pt_CC@Y<3U95q|_s$3fi}LiA(W!gn4AR3shHfDDg6ZDaAl~yUV1x;kO7T +>?Q&N(=^pL8b>z<$9hPA!UJ)NkFOa{1()N(7ZUl&k;XR=H9wZ#62d`r_-TmQ<3RjT^y>BheE;$pAB1P +%OUO=D|A4xsW3)9G)f=xOreK(Nu9AnBe24t`8)qZS>^Oi~*W8;5tnAuh)SMzjZdttqH@gzx1fhLqi(d>_QV&r +Ap0)1+XtIMblhyTe+pP7;aGRaMF+R#{6#h>p%c-M*Jkuco +^$H7(_JusLjqk)yv0h&KYa59tgIY_L(b{|0xa_Y=Q9v@qF#`3Ee@K!9|CXd~n%A^$d`$8_Mi^xMqG +}a9Bm*6{-(+NQ%6WJJevO0 ++&xR&r1;DS2cV_*LiR|v`Yt84bUv#oR6Tj|cf2O_F;IBT}pAf|F`YEV*>_>%u@##+uLC)7Y>*nL_R=> +2B`g^P&xW7y_*fy`99UV~30p4F;T(@=KT+F?;b2nS8Zw7j;Fk>}}EXT7-FvhC#Md&BZSUGV~LhLX6x- +UkHww~R&AgkTPVyqT_*+QtG!7E&)oX(ioJwLC7bztM;8LwHOd~qm3aVi)Cm4<tHm-swRn>=+#osA8c}Q+lZfIkj364=Zy1#U^!;XXv7TDe#i+*{zQq +gqBxM4V2>eT~$wGc2nz+bK(^YJ&Jy)qW2&#^+As7;!tL9!BLUw`h3^w3;z}YJbaNQ-RVfw&%t0-S>0k +q17Av1{Nh`Y0@1t{=9fY(Qd}Tpoo%A3U+K&PR}kvFB-KhvoC}U|aDNO!&&P(JQn_TkY$%eKpSQ)WX3p +hTUU09ON&kayht=O=G5_^fJk~s)$3b-1$qmXVn!hV`1BpCF+y<_-WGix;mP=h7^&Oysx)C0eQ15_-%z +EG3D!!NU&S`8nmADW>n_Ec{G>WGeMDsjLL_7r*U8dCJv9E!AZ@UmW;vJTgAz`d}EphY9=w;tnn742B% +zJ5eTAvFSXZKh0-fG%60+bc`5Ra|3;#S6A9-w|#p!%iO1l**{h5hGVj)TU4Z4;M +S}5Vdg{+eZu=U9>_^=j{IgP)h>@6aWAK2mmD%m`(ry00062000000018V003}la4%nJZggdGZeeUMb# +!TLb1z?CX>MtBUtcb8c>@4YO9KQH0000803{TdPUCiy>L?2U0JbCm03HAU0B~t=FJEbHbY*gGVQepTb +ZKmJFJW+SWNC79E^vA6T5WIIN*4Z}UolHo0xDwKq_0tv6-&|j*eV+5o43$b{@6%Xn<|$vWDc8*Kdl9l>tR`%1Or(#S&5<FGHN(=4mRX`1iblqWMl32JdlaolrhVg+`L1Kh!Kkx0O-z% +NH({sINXGbz}+y@c*Dt5G-Wg@P>95$E{Gvk_hB#L8YXhaogJJq_)iaFj48gk5fD(wSP}#byc;t}ff)-Dd!QrXL1H{c@)^iyLlwhwNI579q{od^p|eM# +@Ks6mR~QUIIrxF8;hN!}z$1?bq$yV*JfmVMKz=Na7h)&eyXqa=_y25O$U)5Gd9#g^bn|U1in^fYbTRx +kl(Td+40lL)K8)3VIeX6_c0378eKF}yLS;-f&1)a`Z^10xe~Z?k52t;Ye#Q;&UnsD;zmV1^E38XbVJ3 +xqS79)RdLE60M!%U1>FdkhS(o|B(>6v>QUQu&S{MU4)@-CmS~~oDyVp6pa4)XftqZqxeSOyY)cU>%)! +bpU0`bomp`no49FmYwg$J?X6D%Ic0rSBHN@NXXr$JybRe|u?V9vf%Md3IssPA=$fvcK?8JjZjDoRY2G +Zd)RL`=sb7VJq9`XYWpmXBbuholT2IjjexNRF8CNfZd3C)jbE{-yed3 +By)YzZz_p;|w0K5q>jZGg!FNumVg!?M%^eBjPG#s0RRDpjRn{0#sn_=kO76xG)kI@PujghA&H#Yf43Z +jHI~o#cU=gXjAOm?15DocK@NGew0()boAb1?B5Ao87iH2+m0eK7HK^`@#T7-a!im`eOM|4|AgP;JK5~ +NG8Pa7V3qJ}mV5VoENtPmKA0ls&Qa>;m_S8}}N`_vh*jtN&#QM-g3b4;W(o5KF9l3{933RI1(0xS@S0 +DOQDI8ne2I67e`C#>T07|g5uP^R;?P^&CMR^@TGe$a)?axH$e6ruJ+_)x0=9=h!ov>x}v)#Z7mv1Ggj +(4{K;<5t^7l-F&sp=Iz>Tcjxkv6FWk99`4i8f>6c@JE{50vi7hYv-3J?zlm&E9K=v94G6R43433^Hc-XfO-Drtl_2A$4Cda=@KXoyvc@F3C6AY +Eae_v+=#=da(??t0F%r*((xXm(nXhIXRo+Do)XRD;w>trMi0tIVVnrbmfM@s+RmR$degdKA*PHH>A`3 +(yGYu$TeggIMAkCqkpbp&V@?K4o(p;uuXm2J;J4h*1lOfop6v<LYjs`Nw45BKV%C54VOF@YPRG#F31tz52C}T +xfw`=LrqfKZl10&7#`bvAt`Plo +`#|$mV>eS}M`%3Y{s`B#@e|wmimDtVipa3ijjOhzcx(9rxj+?th1*PzZ_~g;)#vh9H;{m68?NcIBsu% +35jvCn}qWil%*(F0<}k_{2sIf}QEf&YFI*0kyBX?>g^yYeCDF?$CWwu-UQ|$$IZkG>Em5ABVjnxE0)A +g*WRjZr4_Y{K#f(KgAePEWucecxlplvG48feXs%t7O<_D_LB%C;*173@mEQ +_e$x8uSczceuiR&*5Sz^;x=Vk`o0=Trqv*^es8V%o@#GKrykbcaT)vxSl%(7299Dr!C90J&c +@RB1z?SBQ%~|1u~s7(Lz11+i7$JVYWhIJ06P-HrZLna9|R&jKZ8MQMV75v_GJfr+4VHAeRX+x)h!+e7 +6nncpRliwEbnidA*yO2s(QR#X7#aJt*&Y-A4nM>5P?$nbd3>iF1MLKD#6Mo@WV->Wino_MO2>pZSkobtz{#>6;IxHFy(Viu|$mo0=D*pIX2j +-2!fSlI`+W3M&YWi;(cIml=j)d!Gbkq9XC7v)$q`A-=#Wr@rufY)&N4{dCk+(58Pd@p|UlSU14xG%sdj_5{$V`0>>Z63mJTyWe=^*^}RE%)~A3mOcaoe{yH|O0??rrb2aXpD4rD0_CEmNc@N5Y9^z7;3a~qU&82Il8fkTlyI&^v;-V0 +;Xa19Iou4Z?81t%Nn2Jk7i!C{IK`|M0jLuhh7?c4Mimjd-Ks(M(4WBwqZ8IQ&TX_yBjOXnM-{l%7Okc +_m$=?4HBe*i#q5Ts4P{*mL2Kk+IqEr_}g7dU>q$jv+J%m26GRI6j42k`kS7)c}@ +WqQVm@W&$jcIAX0AhNd_3P5;To9-`+&v4ata38$1#F%%8<2}0h7wbOq~Wdx0vsY}6#c^nBT;2HY#HF= +5`ZtJ?$HkkN^}Ddu@EDRWY(s9<(F3ruEWji$M*J_CnCc-B+z|OtRi +&FFK(hX{^Jp@U9*DH0{o_YtfXOUn;0NOIDW?&_Cd?gD!($%E?d)!c>b +WIukl;~2qXxY$QjDB_p!*BZ*9RWIFi+nUiRY?ys>j=Ph7lZrMZQTm`+#NF1xIw=P!>=(_nOlOkgO{DB +D0=y>_QV;xGT&?m-6zZHo(K`W-_oM>2#KlbTN9D7Q%3Vq{{$ms*viB0oc+)j}PY3bIhdB$Q-`S|%!AN +omE^QWI=7P~|n)1u&r`q7N&V%UZAOZ2tvNO9KQH0000803{TdPKS?;>_H3w0B0cp0384T0B~t=FJEbH +bY*gGVQepTbZKmJFJo_QaA9;VaCzNX>u=n+5&yn_1tBAl1gvGpNiL}i7f2K5>Nd9yVh6sf&rrA$wac? +s6iCVI?c@IT&J0OCc5Pp-=%?-nTjFD0ocYZR6$HUW(-sA5mb_uPEDE6wla+fERl`1Qnx(4P9ZX178OE +!e)g^BVrB{<&nnufc+u&3Z1i_@xYQ@sDXq#4xG-YyCE8Q?YH>zwKk=pkuFu0RQa58Z#GL?(W__tDJyc +GT0Vj-)Ae^uQwvjo;<_qH(;D?lylB)t<=u5@DLy_cd9_f6VtYB5|Ut48RGmkE+G2}}bkzvG9WKK+!w` +^)LOzonnQ%w}h^??K?=f#Kr`gC9{HQ@CvFQcT$;u%1jBy|D}3q^xe|~ +jAGkhfqSrTR31)j5#;5(_2{}4lRaN43m|4t2rm%JB1X>tS7qbmyy!aJW%VD(2Di_)|L@@X2Ai-9vIF6 +h8T3&s9)!lD;b_A<7oH&hhJUFuf!E@+Pxlpv?}r%Y>8T#y>o>P$>TX~fteSM_Aq?{+rgVXf+9cl-(ed +)rv35L+&|$8seMt5kzJ0d_d0()3CGGgXPnLzdWGEG>1r<0;#|a<-lG?ADarEVTfr%R~y$1n>mJgYBtc +V8cCj)&V7Zk-Q|VRAnyobcZBZ1+de&ePEW}3Z|{;EYKQ&vW%FctGLBi0*zma6~Z%U$ke)Gp6n8Mmf&E +xu~|ybz{sZMh|*JLltufs08>>A0|X=iTIB{=dWpQeo-%Pmst|o$Hn1Y)qIk??X;DQ&>$pE|&DZIC(+I +>2oJ!RE7m+pB@`k8O%s!e|3qg~n;g~J(5fCqqdkEP*#p}Zxc5=dwdR|r)m%)zMg5L>Hk!4G+dDdX6+e +iI@2;>IEs&*x`%ovF`A~F(M={%apB<n3~Yw1D(iu{H>jUzDt(Hu(AH`)Bt7d&V-_n2k4f8WIJY3 +KK0BcrZE@7%)*se8&f!tsVY6;lOYjc1`?y-Q2T)_`%a2qiU4%hQ~ezZ2U)7F}D9FoBBxbAoy$z!x`2M +)dIYc7uL&F+te)_wSt3f=e1TDW)M4?*gyxz=f=PxfddPMOfj^HLp=F`kDu +?6HZm*=7w-@iu&ZcPd^-^X_(9(2=^5ycw{u_(E(9&nRM8T6q(U>UScvHzyC*-Wi5n_+;vBkjCrADM&g3NFj(mJ9I8Tg~mlGa7gwcr}HojV7CSb)OrnHk{2&|>{){CgCcIv+iG1S(> +0{~!1*gaL+#%Q!Ve{xDP^Id1y%lLW>6?6&J}9|HnLThTP10|4~kKBfE%l&axDA`QOavKpjQ%(PJSfkL +6_In71JaYi;UO7T(3TMTBht=kR$EH&gWG%|3r{*)8U6tcp>QIwinS&#B^BWlPf*6%2eYRu9$65Y{4*s +V1lYmSC8Y9)XGbVCkqDVJM@;Ks36>k^$@wP+FuJ`Tkfp#la0FRc{`B9t+5E=$>Ld|43ct_Tn)HUw}9y +d}Z5uOlG-p+BS?oTk=xP?MtFfmXSOQ#T8Pq!< +2^5zrPy>1)JiI9ZHtrT7Mgj2AD_jPZV0PQv3P%vIYN4QhqGLx2FdVg&E4xGojWt +DKsLdQ8oI$bpnLa-2vnyd+T>OeCYbP4}cRrc6tCjn-C>bY{ZzYiWPZK_i?EhF$cgm~Nx-Sx<0rf^Q>O +!1JKR2>fc=?EXTYeUe0G=V(ORXF(HRfo6*;uvZiOmKNatp=DrI$RdNG$xQ=8+1g9TtnJ5MsT +I;b}_KY;K)sN1qU_`{1=d$}}OYska&s~3l_4-a2h`k&B(IpH!Z+A1S}L$FY*8t=tgGNiu~gS5+F{_WY +1U6JrtYB8o3K^<0!JIGFeB9Jf^it#nyIBkwKmw;^S{KBSub_FSll*U8kUOOs-=+q#QYr*qmWGgtmB{u +{*3eGM(PiN;J&Od%UzX}J(S0FGblR%|g(NRqC?L7Vb{(ScFC-yJ<=6CidikBRCe0FyMKGH-*9z#Edqd +f+hBrBB>IA;qRbaOmuXB}smfxlk8{Y>{|tdUU40oW5pv%9vegyuFASv((<+>k)n`am%+=+KAJFF+1dE +|CT;H}tulF*V}-JtlCrvbk(csp+d%_UmZ#*cxOEVzF(GKFE8vblCo^sqn73#%xO|cw~OY=ju+3LvOfy +jOOGF&&ZK*wC89N--3eF$kc}nwxB5ch*Ug;X0PniS0(-$YU{db#WSc)1eDwELh1C!%hTD#+4(H +J`10Yy*^j3elMV$Rz9@@^mjza&2Z;2h_7ZrGNY&H&FL+(sIlN3DyU`nh!H{kg-#Dxj_cgdVb_`DWS0Q#ZQJT)knt)+#I8T;K`gZ7A2+l#yH>@aF9Te4iXSQF?J8p@tOCU%vkC&4`~BQ# +cQ%SlO1`qY6#Zy^BE?jly3K!kFarL`Jg*2SdCW@bQn=&yR10{^iHPfP26!yX6bfb@BG<)#B)iZ){Xjj +w(xAcS7~cv1+gw;jk7R9!l~(dz%Gu4ibcJo5;h2S!@RmkRThG5h`c26~HwY_8u1tY$y+*%&dSEe%nZ} +eI>S0y*YY){1w6hSQL`(Z7IotFI%?7z;~f~nf){z{4gnAiVt;Gkexudcy@y#TLwh@Fx|TkypmK^`Sow?g2>(2v5- +1%#5L{E{BMi$U@A99tx|2C|8oZ>hJ7_d}&E&k_Gr&xKWess)FA9$y%&>_~o}u3t?jpxF>9Op6dhGV$> +gR)q#HI%O6VEQ;bA$gap~2-R4jz5$#-n(rP;-n=EFlZ@URC=^4K&^Pz7Y;;@tw)&p}N&x|KSI)Ybf>b ++NinduQ7wZwXlUB!d!!^S#&>Tn-~jY4V_@sV6%nru$DP!bsziAo-Ku3ESqRExEQX6_q(>4WL{L~^T~r +kIOC86&J4)|dd52+ImWg9|D$P8FR8MoOuq*ZxcEEPd*ec9bPv`sv>Ca`s-}EwlK3n0*tAWFJF^*nLbG +#8TVWQVFFv~!68^&FGJLoJC&?1h3{;wWVUo+U^LJKL2!!WHFJ8X-?)9+Y@xSqiyVX0Te}JdE25~M%U! +q3J7NijX>*16g#^1itjb}aHl4V9`bx1d=qoL=!Lr0@;E0|C-{S8MvYA~=JAQR?MJZdy{Ew?MCZy|=io +&Mt6O1$$tP) +O9KQH0000803{TdP8gjcxV!`a00;~K03rYY0B~t=FJEbHbY*gGVQepTbZKmJFJxtKa%E#-bZKvHE^v9 +BR%>e;M-=_8UvW`BR3hpc`q5MYbXjNDEC0UCVc1Yn4v=_F +w>S3>H`iB>x1a9vkAJ+&G5YQHFIv)cuyRRLY%R2Kj_y_S_9*k`q|mJWohQ2uHsU~Ttb#;B=Wb*6t(bt +mGqogo#mwX-Gs50i^tp@WuRp(`4=E6I3pFYmO-)LDjJYo@?Ki5}&|Yax8&Q{#2Ybk@QIc{1GbpvrBS&jvV-olKTFhlvSXm|ghd4Kzo@V>7bf@zd0 +NIO(cPh9+1b#sM|E>HS3Ch{0YUiOw-lFG;-K^EOOX%60kincE?etCRSSDB+1gB5o2GR8KlS}=K4wL_F6k{kNxa#jJ}*7BH6y2#s*i!d#M|wC@z+s4au*{d1k#1b&(D$f5?)0iRn?JNBP +wU2%hGNy{s7y^}>~A+q-GMIbaG3pJ1ZKT#vMpvL0xXwdQ(3zPITD641qLI&T*@snD^^yxJXW_>>1u9Z +(lFA5Df^@dri$++B9)2Yk7e230@e703i#5~>~iw`Pa-qUvK?co53rptROl$LR>HpZZI&Hv-rSs(KC&d +J&c9QO+7J +}9M2-1l9AYm`!X?HONeJDPQ!}&PHClg|E#RM88j+K?LWqjDOfC%o8GC0h;u +*Q;!d0MBsiTpkH4-U{uc7>L8&UFbka4#h)KTu~c9-wo2vusz|bAv~Njkd=hekV6_-}(8^_s_HCnL7-Z +YVoY)PU__^^T~fuO9KQH0000803{TdPK4(bCouv50KxtfEww4oxXkR6D6`e`AU`!TAwkHf|HBmoDSV-#z@K9F@=?DKf#;$H}?qLdXb0us=N3@wfK3rc8AgEn2ybSo@*!lUz9 +yq_~CDN;T2Msgq=N2D0)yIuTduTlBCEhcRNBtRzTYTW!j0wQ0w+ttZRdM4~ob4Ri)~_UCY`&b`ekYgH +yEz$WFv|6|k_yAj1eAm9jwjRP*?tM*;qzOReB}XWjIFT%Q9GTI3Q`iTg%iB()FEfsWa2RV);7nVot&J +^HkiMHfaVmeGrpsRHnc^>fYUT<#$fK$4%X=C0o(=w%T^6*;#>=*GC^?&Z-+5@L01_pknXMza7dg*4ob +cv=nBh_gDzpUa~oZbNlZIhlswbhL6-w$>9yRq_4q}D=_`z^6UNy$={6zV;O~H623>8+28=Bv@gxKrtm{C2CQQqqN4@LUEwo{W-DYCRdBP0kaTP9Y0U0 +}$mJJ~TVBC``TyJ@`)@oek683(0RRBr0{{Ra0001RX>c!JX>N37a&BR4FLiWjY;!MWX>4V4d2@7SZ7y( +mZBtEe+b|5h`&V%7p$U*0I~T|<#fA+7)8q+^I>KOwdS|^Ld*kXT)`hyEqh>(KKcMUqU>9v$RaJ`}G(9%|<{*t8d6l;7rwVl4gG>WH!72!^;q +eRXiCj7P(ZPt&l7A5B%^QM&(M%vTGlKL8*mc;5)kCcZ)M?NL7?>IiVUtpPVH@$mIrtlcfC(WUQ4dwNR +!~uytF^3L#8aIiwgXS8axfyiBBi_2?obQe74>N`N@NeeIbxNA1LK>e7+?#($YYL;y>$qwZ}_x5XIx0M +Rx!GE_-=!QYm-jv9-edKnw_b%(~+&1y>jm-Xd*Luff$hM8{kY|#IM${-NNTv>Y4s^z{VPw&n{jb1@c!Q}LS?4}RM8WT_j_Q;swA$=jlmSD8fQxtgo4xKZHdVv<6min@}Wwg}X>q(p4S|I +Sf!9n2V^(!;+$BgCvz8M#Akx&jVRn@qgBvjOrx4_hM)1*Pn@;2%J&+g^tMduQI8ja0-!&^8b^Kj^hdU +M39cCY0p*UN05AI@pG^CSKbP)h>@6aWAK2mmD%m`+u-GhA*3007bq000~S003}la4%nJZggdGZeeUMb +#!TLb1!FXX<}n8aCxm(ZExE)5dQ98aZpxR!fds1SFFvJ4qKXa#j>nOTNFiC2()~b*hr*CQg!`hzkLrW +$!~En44V-+7IpXB@wwNf(KTh+vURQDEF)Pr+Bgz(tE<*=);*6#{dw-z4cp<#@bGITjFPIbqtVg>HnK@ +GsT><6sj%w;S*5z5q@u+)PSGR>$a(QG#V{OrUjnUFSgtrZj8RN7H%y)!{HjYhqJj- +T}6+0|9-g%cWBsMeI@+tQ-a4XgP2&DB*hA)yu|EV+{V7d=odR3i!|E7o>G(TgQ5WyMO=uy4sLPrQ-}n +kM+o3n~Fu1&JlR#j6dPRMZ$<7*R(ly)GfK5^Gv9oKjS=3pkZjw`^#k!_!KeTXGtP3*-jr*7azsQsyNE +j&y50ZqC+vt0H%8xN0CL4f6f#%=>N|ku#m&r71`{v+e@rKZR$Tr93I!Pkxq?48(!FIMljFGO!JcA}+dw%x~f3*m5=#eEQcyY=6C-?|9ID7}=fq!LDt?FMyt-y^|ud(c +VkCdFqDrn3j9-=wFfQIaC|Ohq|;_~`NDj;0!kWH_z8C$Wj*A6|YR0`~O%gXxnGUnhU0;mBWVIEp5_DV +6M|alOseVOpjBM;u*#ZaDWr+VA@-=}MY~!azYQ2d2FBG#H#j8?^mTM1^)|bk9a~kM^?erd3YX{I)Zm9 +CnSLMP+%nHe%#kT&IQ6Z4*bqc9bM^etwX@KJWIN+1K;ldcCLT2YKF4%%k-c|Em%?UL6N*=;&bHg4`X) +h}$lNAA5+y*+263AIm@Vp{5cJnO~;^iZ9W&5(cwv=-8e!Oisp;LS?YB5);19{*z6`q;%;E1qoHJgAPU +!j1CsUgg+adK!fP7uh5HKsnsm~mZmw4`(0-c{tolcNB53ERK +I_yS2fY7L_7*Z&584=r6-G_J{r?e#Uc&edGDni=QqC^*@`Qo+jZ(Pz`$t{#peuT&pk$CY%0;R#>x8w( +D>Gy27PsF~Nlsp5O!KJINK+tAZ7GV`aYf%PBohPt#dw*o>I^DdNpquKXh7>j^uPv=y4M-(%>NUxopBw +%ek+1#sYO5?Z<6hy1kbOb_c2(EKuG(@=0*a*wU0VVQkD4A_1#jiT3P9Xdbq%^*)X5U|&;y19C@Stpza +>PJcFx-q0T?J?=s4>$w{!&KqAaqB_4t3VW!u$`?+>)W=WrSQA_;8nMw9IR-^D}5;Ged#Y1bsV9SM^UH +6DDWc^0SRJzh{@=0P)h>@6aWAK2mmD%m`=L!_;@%40074g0012T003}la4%nJZggdGZeeUMb#!TLb1! +INb7*CAE^v9hS8Z?GHW2=AVzEv(4KHE&1H>ZmA1kMZRh1P;@omy+`BpMHi +uDsGN$(73*(N>COnr*6L>z=;g_a&-nuDrc^f0dq`ou2%WUVNO*&S!6slhwfXlwq^fzJy>8J+D>fC-A3 +o`1?0i2)jRjH-VYCkm!U04MQBl8_O5Q_wt^g`~B5RK7(*@Ic?SOo!Vi|*_0UM6H+_*jkEL)!qu0e=ow +sYB$AhzJVz9A3E_lZ8!#*I_%S#5#V2sG5ye{KmU6J$$U@#q%LmY9UgBvKMy~?(WPH~Bf*}GsQ;aamD% +@U(Y`YV738=0_Cohy%exF3YAAfpxaejH4o*jQUgCiKZjd=0urx633iCj7Y)7V1bFc>$v!=*Mm1ijd^> +cc}uZ#e2e6ib-Tkzu|$pQEgk%33r=?EA3UOCBqN +!Op!^pE8ECy>j-)dVl5Qr4GY^AW>*}pjafpInY9l7yOb-e460B*O=BnZYElb7njr(@``~#-kuIkYQ(# +{^Z$og?>gHw)hra?{XpcAY>6wYwyA#_Gl}Oo{hXiAsA2I4Q +eDqlC+71Blz-_5~pSjqm`g?a@2cK%LUVz)&$n&qvj>N3{leL^7Ufxr5k4BgaiZoq48c&5+aQ}>_di95 +fuwf2~_K(RBA*mg%?TGzFr80R&)y}Sz3^N{MI?zC1`DsT;k=vI2g;oQgQ{TqOIz2kIatw^mx1PZ#2TM +TUj@#r%u$Qkh{43Fz#Ipy#eA+6r`cj!zI$o%kg6+mJNT@9^%o*f%hhk-C0JJdKt~XMCNINYVU%q&0P87(&Ew7RKl?}0(z)p^E +X2^pOj5014bW))1&y}*0#-(7xx#vj-hi(@}qs&)Ahb#4T)w#oso%0E!xH}hz;jWpcaRxCv9zs2JP7;F +XZ1Rmx|0I16Q|dL(Yi6~o$GiDFcyB%j8s64DFFu3!#Hpz)ti&y~ci9$D1h>X9(b9A%-~j7@m!VJ}B=8 +pnGK%j=l6mR(JPAyAZd6)Bm@?~s6`VneKvLlkUxnU@y$hTr_l2**Nh+gnx`0YQ-`>l%v3@<_|-kpF$} +-4~DK$@bb}r~^b4@7=ri{dHQ^d_$6C)i!NSlZ3EM#p{NoOTmk_p^5rFndtW!FB|&M6l`hU(7Gu7@)n!`5ZNmx?XM9 +toje-5NxOjj0>3TnSPOF+`X~TGF_Pn2eyqdo|y;)pdBpv4yzT+!?Pjw}EI3I;x0jF?q}f$;M%Z1+YdUex8Oo7Ze +HOeWad_{7$TG5)8QnkDmBuh(x+faq1Su-&utjvm59(uhK4c$me38)zmIkd-ypSk=1;VN>> +vE+nY@DeFS(Ilct8w&3%OL4)ovxmj0D4}G5ayf;QgRUK0~27BCHc5(*1* +6q$_&Lx(mZEKT+6 +wJwzPR|;={c!WU={g=)%nN8$GJhYZkkHWj*gb?oro(*cFgO$BPK*k-~8>bZ;qb>`1YH>y!lpH@(MjyV +aLCmu1LZ}qDV}T#6((N2)2_*-A+MnS=4ROGQXx&>L=$J=mw1uHRj00Nck;U(t>YeqbKuMQ;2#c=?)@H +ki}(Z%*68tz_AQ^sE|-T#Y%=#qQ9Z|qDbzhg`gebkEz9+yM!GL7VT3CL1G>J=@@{g{1iS +;AI+7vS~N=+pe%rs%yZcdH|>EhHBKSXcBOpvX~mK6oazZJ?_U^{_qQ9;6JI2eXT3yEeWHNTU{5NZPz0 +pJmYZdii=z%$EXL(|VHdvf2a69QyP2%F~dZ^vk%9B9R$I4PW^J(ylAOcN=EJK7}9VyLB{B@U};)6`*y +X-WKW?C6?>rl*tKQN8fjoPNHF +7deh4HPwI@hGB-rxYvxmHc86xDG%hq*U}eDvIVLy^!EXS)T%=@GHKXK3#?*yWSwH%RIJ2=e8P-U9yVl~LXFKZObjp;oPPl(zfckw +(%oicMq>E$X5~INV@b@ft}d_qadFeBniENvXus|wc0=o;SCtrOWkM?=eWL9$5=HgLwf-YTBx@I& +9?wNwf$;*-Rue)U(K)QH_7Swxu!^?(D-fodxyK&uQb1wo#T&c3Sv`W?=29dOTPCqI4oNRX$3npf)t@s +D56mLTN6Uo={@awcx@Wyd&lCt%k#^tYf#YbC}u(3R8pD?TdY9ko_x +XL!VcMH@pJqj8NS7mQC`#fm14Y}oDH&JHv>W5-tGw$RP +!4o@9*A8ptTw#J<)V|>;kBxAI>^3_c(bxB?OeXnBC*yG?zI$s7!#(8a*br_HKVA93|+}5a0?Vo95F3c +I=@?`lBU_AkaTsdoPag1G@vSyorJ>^BqfF~cR?iW$XSZjLKu0)glS?x(3UFIpnY9jF9>A#%@Y)H5!3R +X)x5;S9tJn_s}Dd4wC4e$2%dX1^mx)zloY!&t^VC}$BKTsyxNF6P`^Je`F8eVj?$`Y_5+#9q>O=nYN* +woq#|k`SR?J%I^^#s3d0z-BVU~j&yg2s2~2$%c{G5VG);M#|EBy-n5v1Pd8jhqOafp&+*ow@R +gJwT?`lX;p~v>axh?)E5zpj4&JI)>*m-RMBROa(=J_$C?^#m^xjcFwh2eMle9(QVb`Tc|#I#P*9G>Ej +OBk~UQ%>Hy$GG=+1IqiM>}O{gMsuJ(eWz>zI4i{0aAJD3JkIHJO2qO8~>5ZlWtLObh~B@ZB|5-pnWp4Lk)ShMR2; +3-snw3ZV-KtQ`O=sRAn*d17=acPhfb|}4`UEcr79jdZay?;%AX`y3KgP*RKnBoN#iW{#|Q3UsC(b9p) +p$?;%zOhl1hnOy8*=2xK*NhN&EJv7z-Z*ug +}j(1m!o5j1+bF<0qW-QR+;_On(MZQbQcC)0|VVKdZ7Kw3BH(v%d=S^VDO_wE5E@W~>NdgGvf)_N<$Gv +RJf(r3cUO*I(Jg`&L=wuUkCns~#T;w-27p(_*KTH#2NkCuEsIW>z6PCBXT5-cY9rxyL6v{!1V1Tgm4` +4Cz>)I8lA7yZq)BB^cEsDU8(1~hbmQa)~3#>7B))1EzXZV6>lOalkwj7o8Xz?0nQOF>e11@z-pzi3=S +=h2pYew~DiFq$c9$BXy`C(4KRhBX}hWJ@kqedY5(Cam?@y0h-m)#Jkpf<5L6uR~naL9kUzE5TEU`7J^ +(9DjGy0$8q_MjkhkD&0Kg8C}|*Eve%b~-uo}@d5$>D +r#~+}AS5D7%8yNeA1&{SBech@8Q+u%?Hj{xEYJ#j$F*$Uk27yL^VFSZ&92w-wRulOH1T4Z-5D)++dyl +@j8nx14l?ys`Cfl?wu@fFaNT@J+O4j{4BbbhHNHYdB!>LdY@@xNV0C}mYK_p4TU9mqxq`f)XO9)n206 +F>zPmBwXlVhayJW?K$mnXyjakPGQHE)LD9_6d)?;|XDM(SfobpkSc5bEJ~B!b5Usju(wF2=d{`acjN0 +sFUYGuiMzOPD5Bj74bzhnEFw`m#P6uggdY>x0O7Yog_6pJnLE4z}4MZwzI_trPlhO}O`=?E=NE&)TP+ +h~Y(J)P&m5X7;#648rZBa(Kuct1yAUiZkRrqSMNWK7$IoRcs3knUfKzz%F9D& +R=x79y=*lwoYwM{%_$Rdd=V)tB+WBKF-PQ_0Zr5=U20jYhhfS_xTzg`&CzUW^CiMbCdr9P)h>@6aWAK2mmD%m`;^ti* +HFL006Rn000{R003}la4%nJZggdGZeeUMb#!TLb1!Xab7L-WdF?%GciT3W-~B7F_GU>XG99NglU+~MC +QY1<&!%yX?M$Y1vkXN-62}y&@?lx+_P_6a03bk8vOAAG`(b_BSSEpsi;Iio6pU3RTi!aoX)fx`N>&T_40A7X@$BjG^TVgl509UZ6-`qF# +6RoB2C13O^P-eUPwI``nAU_u(8Dfh5zthFzlAuU?k5UfzZ=k6_jv#Pv%&YlvbdFoI%&RY>M<-uChx+Z +nxY;C%AJCy%z*6->7ufdNCbWy(%<)Y54fKK(&RL%1x7uwmn;R2FY_o1?94HRsC$bE0)3R=&Oy;*hofLNADvEESxva*xHOdg5jYZok%!_cI71J +mi6SQ@Sof4Tz__d768|Z_4I^G)%;emj&It`oVA4W2|7KIm>g*hs>as2Y&e{2%%qlt9* +t9^1{ei4LE>1jY{5hwE26~FCW(9;3XE2p$il5%56)^30Q5`SF;zJJ2#^PnZ!AC0u23 +1)?)bb6L`xQHz7kuZ~2}XuXCJ%XHcxN}XtQVQL_stK_EaJd(-wR;Hg6Yr +CaLPeF{TW97%MXK%?tbPr`gf*&!z<_GG6EPsoW1V>0ZxHt9ppxPS1&IH$D1pla|0aU_Lm+z(2913d?G +rteIhy|JrT}KM|(pY1mJssT{wGtU?Q+wRT2fri6%o{{1nmSLAXyQ9R&AS$%-=qLRyreGV=t9oHldcL* +UA?)JD>6l#=j3t}(bAi1R$#2#_}7{ia@k5%DxXcF)pc-X-wVO +ON%JraRvX+Rhp{*6U?xGP=3@U*B@Rgq?u$og(t|xGO_$UF +LMVX}(ApRfR;v;!#xw)zEG*Ak@e2K=UMCMpS9_kv7uzp9HBO#2Q^yl6A|;_1_;VE +#v-_GamwOeVj7`gBAq!Ft<=1s^N3J(P%8HF*=kRJ-d#rroqCGMC-hR|>WRbN+Hvi)Or>-c1+;H(Y=Ln +aNUbgMnB6tjXiCK#o9*GX@OQ4Tvle!9w3L~Y}j9mn-Xl08oDBMfzbEVHh}$tt}Ab5_!y!YDE^K7+2ArfyEuLMy5+$G92@ +woMy5hoN8~8j;vrrD1fMCcfqc9;yE+|NP{8abf)`~9Iy}k*t`kv<;I1T4hu*KiW;RAE{$N8(^0fP5uf +O|jiDFxwgHn?0@N42Vq>U4V#%#l&$)v_cbJdU&lxfgdGE5P{ +>4>ECC7Nga>$a_2C+W2Fm#ez<_}1U|Fty}*5|Nh9yTb*peTKn&B|qE?Qk#c`{DT!_#KCgTgkb>H&#f{@`8QK@Tr$L~?bYy;;mPL-M=zH(U7z7*OGJN^!iu?)Tc_4t$_ +3}rK^@?FHZQpG?uquJ{1JnM#Xv!9X{|L4_5&%JgL4g|^m&eej!=Y)w>q;Xq)QodseZo0 +SnER?=gqjP=v#dXjb4CfT1E*8!)r}3T=YASY}^qAbJsqrzDcAa`P0hjU@=7}S}lStK2N^B1-0z1#TG5!7pnlwNn+eEQ@p!3B*978;; +|*yF~=@kF!&bF!>RZL`&xqI<G*( +%U&^;mFl?$LKlxzUFe9Vl0R%qy}ahb%pQ`nwQ0~w4tzEUsLu_{_3U_n&Pv{fANEW)rsya0R8So?9YT! +M$TD&;J_gXK3t5wwt5|1ixgn}!?X{;z5bcMr2;m(jV`pq)XRUFxUKKO! +qyqQ?(PYS(oJ}fmEFp)+AQ&0s+wSj-7zQ2Jg48URKOx)T7woy>q^8?UgT+v$8+duADYpVvB_KzN*V`y +4nVbw+w)6nG1y*pQ11D)TCIWz%37~}V25WreL0|Udx*N4A5`NXcPd5h2W>yyLZIgt +T_j8R>55a$;eEORc`JA(pttXxw<0~j$CILcTtTuLX2OK|c;0!9I-IV&7@wgd_j^NWP=57_C#ZY8Rp1u2!ftJI_wBtEJdW8UoJ +S`O3rM3?eIzAr8zl}MGSrFNSEq%*EB$=Z_Qz-V3=|BQwR7;Cp$|3SF{L4udB-yQO2_+HEbTg$#?IvSV +G^}JWkc{aMX+nnIKH(nhyJAJj@NH=v{{05`fCL@cvA53qcEZNOOn_lRLtOl;OI$mV;6YU8(1+bk+jyi +z)rqm75mi*0^sQbN6}q-4J5tntnXRKuWd_>15*_iah~>;O)HyXgXO|p#h(aC{X8vguaYzB^CF+cdacmf+{=~N5K&Z>51WOmE|dFb8F{b +5hKw?#mD(ZSz8lNxx8q=wOyac8Y9$PiFn3N6GOn_SN4A*J*T`2N&wOj8Q9Z%+a5C&CM$;~{qR95b^M6 +VT9y4@`GO1l)v?#F}~K)5Z+(l#1-Vq2oaJr@Bd36DNu6z8+~FXH6o_GFA^9$+TzmXh!$5nQ!;?DOZA=$}6$^AT(M>W~NQ9XgWK!qduA^|aek^?Je&pDh=*v~3dN`7oteW|K0W@UP}owe$6^O-mc4c7$?`giq{z +LRB0-pzteeAM`lHV8i{+8Q(Ot9Q0r=g{VTOj-jr9Y7I>a;#(l(_>&hoY9$d=Jfm;1*&5K|dPc +o+|x%uO8SY*I=_U2awzbeNIO7+r#`)lBV7a$Ck4hWIeZGi?$s%!$mDJ|IdyzCVt9FR$SLFxgX{wNLIK +&x>TiQ$q1WQ9JNhiyv!b}cj%omH5Gqme2IzfoOfKxf7X*&{HoRamg&mS46e_ClnuO%r5JY3N()0oW>} +N(Fk`y-!0up~I!F)}?vjNZWuT53!J;SL-WyOb*vjTiS*UrO9RhUNo$wZkR;3h(|p#*=wBNYgEfTtvR( +lL5lE3$Wf`H)@;3FB9|5PDEr|6@S1ZHKc9#(kI?E1GnxVyVipo`;NQzCF>in@6tUyxVTxZZ@lzwp689 +l;wc9uFQQRryCOeR&sI+PUBD$!>}x$iUYgaMtK08z%(^JI$!_cHs(gkSjTUa#aWL6z($?}Q@M7S{=)T>_PMZd6@$U$GNl`@ +3GW{LSG?OB*!0BtDKdwu&Vzs2}59Zg{92~AmO4k90%HLwyvm}eUkS)`7{ojis*K{tQnKTaS3A1LhFO9 +$4;U`yl~*rBz|w};%f0Oi_*`tz@}OtBP#uNEsXIxCErdtxQISaVafRUl=5`mvT9kDmfY;Zv^N3s^fJFvd>qU +=4H{W#+WYv_D%*i1)VVMQ&yySa<`Ai(OHVO?`GiOfMUUGhs4M{tpEsFOGX3*(^}`JT4RfN5#_jLn+iE +ZCtX^TJ1kZeV#me==dCA2T)Aq+${TN0A-=#%i7RBQfm37N{&r9omwBQuG6p}St2f9}1cRcW#TuUd;dj +hPt!JXn+9tgdKj<0Yfat^eBeKdgGn(E=8q9e_QG@OAGq-m|Dupv9)HKi&aT?4pQLgtCZBWLjud}E}|3 +r=y!1eK`K6FQQSo={wT>@$P*mAz6Wt$mk`foI4PsYJ|LWsL;BNilXPEz-Z9!qS3gWD&q~Gs{Ka{JjxEs? +s@nT+xY2)Inuf*{m2K!KIICaE*<;XgGV2c@Byv?@c5>PI8c|>CGh(zAkgYE1=bz1o4#p$;`KIJ{GGS8 +nD$H&Lp$$NnL)vPcWYZ9;;WxDdvL1+gkU(4kY3r$ofO5&3Ev_$7tC?@9}xx{~3Jb(UN9ClT|_-~$;@s>)yIc`a<2*wLArYwPQ5Gv13`DUm6p0xw~k8mn%zWU?-hr(5?Lb;<>+lJ +ks&FqkM7UR6oD}#dTfwtcv85L~_xOaQ!n5Hc!0|Ki(kqn+fUNwC;8mk +8(<=Uu!F=gVS=8>K9p71cCRTA`94{y~qd$|7lENpXTL5d3N-<8+qN!9S=FunSbm)UdI$YY*E$-Wf+9G +*Yl>)g=w$^+y#SG~Y&9n$R7G?dNyaPHlOgG}LgPVZ`-yy$2Z8TbYCmSzKhb#$**RQvE^o4b%UW8+D=7 +y=yx9|F!+6t}Xsp0;B8FS-1G?pVr+_DX|Z6IDV_MvE83I5Fb`aRI4gK=@KAB%N5yDvnC^L5wr1v>M_M +5WnzmVNPnk5Lq2a1h2JQ`4m2Nd@u=;d%maLuR-)hUmi&WUl7qj^2kG3o{aZZ{Bzo8XFoj2a6NBSjVpc ++jmRsf8d!>By5T9DF`{!U3knO+6A~c`&y8ccO1g@*2ksHdeHFqVnMeW;2;iXxRd;y-r5mwmf=FV@oMB +Ta;y`*~`7fY*9eQeRO%mgbKJ2#()o9jkJdpi!r*t(Uk8RTe@_h ++R`ofiu;AIC +Rpd-d4v^Bi3~FkZ=*M$NfUJCbwZGv+dIVN}j5AOGo!JIebSx`Ir<-|%n>ipiv6U8l+w4CYIE`U0y}K@ +Z0t@%8PJGoKM3eWK-7pJIB%%fu4w232}jEsC`&My0al+Lk6OGF~SW6y!VALy?D!H68{|JX#@dK;Mvs9 +2PfL>uM`>bCC#kn!2T>*8;l5_hZGQshiqco2$ZZe8u8rzEMLpc_r(6J3Cj<6;-*|8g&`y(XGX{U45D^ +bbHESk(aRSS}a(rctV#eFB4``P%0xRlx3e2guRC%r)4`&L?pu(eLlRHXRSdcLmtIRP +%%K6+vmyD)x4LAU-Z4R&$DgX?1wWKoqD$s*Y0tbMH!W`7)RXNZ-Rl +(8^P=u1&*rge?uurKGwG6alA1rZrO$YvA&3#sWk-9~9H^09i~V0A8nvG5c|GaaPet%}) +XwF#^X$w7m)G`qS>Au}3K>h$8`{6bNRbJG?yH4$YF +wd)ULS!D@mf+4v1lME2V++3SdXD&Tgsl8WTGqIe=Hch*q@p3XUp$L-)E-C^zSPu+17S(D5?uq+4?0-t7sI37>WFj{-frAVCLynlTQw1Z4_bfs;Kj!rT1wM8!2T{&yrZ%Jr8Q@|O +?e^Pl}F%w3>Do(oYe)7MwBD2*7!F~m`df{KVx1jwOSt+67^1Zk{V&W)6cgqZ1xF^MMHV4yRn+f`gAsv +R1D@Vq604YmlF#;jSAHl)CIBhUUx1usS$@)L_y({C{s3@!7#!AJJfI|Hb8p{Buw?-Tp@*%&J-8hR#9I ++IBzF|RxKEbD&NjsQh)zKU9!{W>!WIa>_Aj*N`A|}y)KJ`K`*~e*0K#TOY`NoK|_Hp-)W(uAO+V2r%P +9k9(Mq&ij~hE1WtS4#0KZ$aDmd-j=Ml+GRx12)$;P{_4$V@dXwh%i}z>mPhC$&$*67{vY+AqF(Ny`>l +OnZ4fY6V3?~G5Z`i-j*~9MLKG%K(kB&<a8ugOlrOTyEQsB#MvrXC&B)e>$ +6`^%@xSET#(K{)!sxkidx3F)3)gS#W!9lKO!(`w=GQSdFV*>N?RwE{8kPXDFC +#G$mnwP?f@Wd7Hwo5^j`NjzU+rU^pE$dz#HzhF}&3G8R(slrE!LLz5W?GN4P=@td#&`M5iQVDe@j57I;KhKdSl_#vYN6)6%HBCrHqbY%U$-F +FZx-uvecDTaVh@IRH-&;@)4s`!RR>+&c|E{D4_s +`c5zRV)XzksZd#nheF}B0VkG@0nH~Bi?ItawC`BMZTa>EyWQSioB=V!8-PIxw|u9wO)~#jMl0(kDDIF +-m8elS@QE{9y@+xGF(Lr3=+^an{H_Z;Pg||poO7C72y(CvL%)*QY|Ox|ST{Zm!nwp)fzOAB8IH~E_6! +&^ICil5_s+ow561QVKP)U_M(m_!uzB+ijJJW35*85CKOk_uk`$M9v7$g6l}6kffZ%z1HhG|}B2T|^gB +i@M;w6c1T(Xrcef{kd(385pphkRs$c#bN^jYltafVmH%5<(CSVO|Az%VelK$`0)L7`le7a$5?PW8qhZYsv^AdZEj83Bm(qW$)uKz#(E6M;Ze(P{PV2fPz~ +1`t|h(o8`p*cl3dP!RY#gQgqN`3{96GMbO9zy}2qt=kyd_g7a|Hd-5t#})#QRd~gGwTQkM20Jcib@?` +(9#zc>k9Lmq2E*cm$_ss^3ee+aVK)w_s6~<030|$o9AGT)F%~un*nQpdcI@(CV6&G6e>7k|a{aX3!}d +(d?ReOunPUfMNvx|hulS7}^C`GAvbI(Ah(!J#AoUGUU8|N0ih2u~Wkq{tN~{Sx5!m_krv^MAwFhA8q+ +h58GWBU~|9`~#>fPC4Z%=*6#}Ji(S1l^h?@KBB^MCL_0MKi-P8`Jxc(3<%Px-tQ`W5dMjI!obx_k)$D +OotCv<$xUj(4UUh4->XNkdIxWhpa0$vahrm~vgJMf7$)E~gw~GbYW1FaVV%`edwh$*75HV3gOxP +&Ft7|`6yokJPg_-Qw;HXs~pMKJBJ^kt{&0o91*v*1veymc`H~>V>*lNzov>r9y=OojdWw^leSAS0J6d)x-~2MYhYhARTa^i(jJz% +J*6rL)^J?w5@={(zgo!nhObPjqEKQ^-+#AlG>rchwW|09uM!1l-4amOJgL2^tq5qbCSCkAi5bjBSex(lKn2EcoO459p;w|>!OB=h_fJjR9lvDYE|dA>>4?4oYO7KWk$&K$S+FUrHh+6>6_@O!NGf66#j0o +EG=1M}B*^lMK+05^w@$h}Wg7o48iRK{~_-#djq-dLcXrS49ZL+eYXa#?3Z?DMaV8YG{F3jFg0DE;jl0 +=v^)Dhys5R>a+aP?W|{%B1LR=H!(?ltiEu$d#xiXAU;eyv;v18Gs4 ++8rozfHyI^Xn#c^X8fpf`U=WaVsxnDyI5p1MO?-71{y~+{YiXcehv6?BKMKEPcRV?;JTPqeRc0wg)v5PI*I;6^D>59%`HnP$Qa0Sd7l0i3N*K#kS +Lh7R@Gy=}X67*a^siQ`LoYPqx*~?RFSj=QQ@a8f$vC;T_5pfvK8GuPmb6FRk?NIPvFB7oiJHyhX8Mhg +aJ+y1-_F7Z8TFU#~u6H;L(j%|4fkD!xbjLI&XeWBA!0J5^AEwtk1ai;DMawX@Z!S7I2DtC@8uxkaoA7#Df4SL9_*Ypu|Ww}wGXJs^B>U+t`{T@cY$;|}R$WD +|IdudXk`8%}1bkm)TdHwX0*{c07W+eLEvt18_6+ppnMj)xro72;(@I-S5XgyWzRi~fmCPyTvfB<-Efr ++sAH=CkXqAPxLRx@8(jVJzrxvM-at^_i^h`G +{+=|vR$;!DOPGNu^{ZOwYDr~-C&|_cBZoHl>+?hqxN;Wf!#Qyi(Oz-fR|xKpokzd?N)NSk8~7HiQLjU +%&*NUFlV|E?dvz^~?sFLuQnzrKRM5Ha)wCe<(pHACw)`Di^eB&Xg*uy0#Vx;iCX@}Lh4L-*wZ8Z!&nX$j_x|2(NRV +X?j{vbayiPeLUkLcQZfptWzY=V;?^Iv{-kI?k$?u&gsld&daotlmI{s&M?0|XQR000O8B@~!WzcL9LD +**ri5(EGM9RL6TaA|NaUukZ1WpZv|Y%g_mX>4;ZZEs{{Y;!Jfd8LxUPJ}QJhVOlf2`4ro`v4|h^kj_2 +i|3{b1B^lk+tIjhZ_6%h0dMp~=s(~8rI{?t-i106LJu`NsIVqWwt=22?7YgdOeyLIb^<)0Gr~?ORd&X +Ec*gUC@mM`_KNyEE^h-A9(+8GvxKj{L7=Ls8Lsh_+V~RYnh0+Y>H1$er1jxfFvLM_V_{8%xuf~ty1zH +C+(K`3o)kVw{v#%bFuC4LJ%u!!DQHLzt&(z!fay&$qKho~j`1abJ)HsxHXCYqZo618v-`&hvT69~;Vm +=>3#r){U3t@@G-AG&^o86Yp+OpYg*{m(`YcDbq7D&6>(ylD0WCAUqM`^iA;8cU@6aWAK2mmD%m`;%}xKsEC008V30018V003}la4%nJZggdG +ZeeUMb#!TLb1!dobYx+4Wn?aJd8JrwZ{xTT{_bDFDhMLCj!+au3k2r^!6xYim(3lLTo>DIAkY#Wb0do +?N!c-q{`WpZO0pkmJr55L~u-`@Wn30+StU(6Uj +Z2~J>aczWKbCyD_m*ru>u4HD98$wrdoV8Fq@1iZMM`3(sW{=l*H{SNu<MfWSoC5Dv4qyPN(xSeA01tJRy&GW>50)|5Y1f9yB#V37WRx +uYZyAe#hNn-G2QCSw>{(P;qg8TpAMJ<}=pTxmE&Bs8qQdIqjD#mL9Y$FTG>)Z(TS;EIh5|p(m6;GMTd#>TrW^wG +oInM2dpFsGd5$5vWmK=ED<$n}H79DV4%7jvq5E;BXHZM`HiJ1NIMdY0+0ILMYp7iBcjwlGU~ox)?f8c +2cf#+a8H>%!G;~JI`jL^*+nco{@BfK4McB$LJy`OPoZn +=^-AsulZuEs9)ev71VpMd*J80@dJ79qu&am3tV1rD<8PUaW5XxjMGX4%Q$C%$5JdB#?N~yyA5=D_C3B&dq;n)XKq>gp!s0yLZN9Bpi(N|>dXad;JrKt +*ja7A2KFPi6qZ9(ps=16Nv(w>yrnl~d#puHK;{LlzlUg94L-qhKKVw;!1e#veG#!jBJe!KrccZ4GrC< +^9Qnom;tLCaN5UB-o_6Y&hiV%m{x5XG&q9DL5>v)lW}r^~y$>xZ*BG0Z46XE@dw9m>g)nN~I}WGPIb! +CP#4XXxNn&$)YLZ&Y387efbcIEt%DHte>@^_2l+8sE2+Z=}PtAE&)VH%cb1Z=0}ZwQyi-bXQ&?oz&ah +H<~9s2JYlmT9@s$7XPkAnH`u~d$KbG2t`f20+#kdye7;Ie*^#n^djRzI-tqYXApXT3W;v8liJq25ao{ +1eZ)5?;{G$keto=tNIzVn&eN;g2ZoY?Cbjm>-!q6)rw<9K&_IviHKjY6|{^sml~X(w%@e@_D#xl+Jw*rZxKDhyPuz2GubG|nLHBUXJi9jcE@<1D%t3u&z +jv;5NT@7A8#A6lNoBxN;EkK4zpP@Za^;%^F)(V`F>WV>{9yck|;glmVMs)u^4M)*xWJ4CQLHs0 +|1vgP-8u$ZBkWbPTkN7YBDTQ?1vxlXl0Ug8m$k2)svPM?P3`b#6o>bO&sbi6h|5Z%1`7Xfq&G?^_R$$ +cXk&x(n=t-W(koAsD@tE~7A0`6-IM*D#4Xrv#Og(~PZRWEpPpYnegx-d0B^aPR>VAXB@-Etrv{ye2?a +sYG_%J5ExYfHY9s9o@h-9X*Bdsh_Eg!KuCQG3_J`A*3k2Q`=x2J(I)hBtKSp&LAn2I5U5Lp(Ka=O$PV +C(pJyy=4lW_>TKTUv?!y*0{oG*-iRTo!zV3*5g-QfW4 +-E^-EpjJR*&7=U@1444m^foz;dkyx10Iwe^5&U1QY-O00;mj6qrtKz<#^E0{{TG3I +G5g0001RX>c!JX>N37a&BR4FLiWjY;!MgVPk7yXK8L{E^v93Rl#oCI1s)2D+n(FNr1!4-U6gRkS49s) +HM>fi=rqPMxtyc5~(FAxBmMMNztMt2S|OeE%D7G=grJxsbq}^DO=MjMhN0{Bb7n)Nz1A=jQHo-tb1R{ +?Usvec+>|yD=h=7DX(xtm1Zh%+%i_I-J6*QHN3%O&qN`QnC4|m6w|U*Inxsq5aut`ZW!>oVL2~3Q+k2 ++@Xe)&$+<9030eg>`<=7K07#zz;nwg<UstQ;>I0 +}%o_KvRL-28|LxwNzh_ve0y__}Enr_)~BmdZ=21><3hKToE8^xbm<7ArI;z4;XLlyCsnLGC`B}C8~>Y +o9uU?s|TEPnyQ|62~Mq&b+K6zS+W^BMhP(_t4V4SD>4U4Lfi{2h9d(q}cF&)x5}^W^?1hjG +jAS-2@N1!K1@u7qIImE|Y9+;VQ$gJy-{}_^@I&@WdhK8-VaNoI-4%2NC!$gpp8Cp<7Q*Z+_?(uk}T#Lt32{lQ%=0Y1Pa^~U}LyN;Ueh +H@?@=#G6%V0k?67Q()&ysw;*<8K9+FT`B))zP|gIq3TaQrC51+WUvcY=BS>BISQb^9fGGjSi$5$mYwy +vyKUR0;5ybiR^3TPa&n*gBl)`C{O-1THv#?eWV#J5uk7Ypg`n#<^#Nwe`Xw*S*WG3bpLl~)p4 +Z0LRVJQD+qI>MIKwjBU-1IL(l&Z!{+;2_Wnnk@UC +N>7_o~@jG1cmdQ%T5=j+a3K`fZ8*tkc9MQ|mkgT*cJUsWVexpV0(@x9WC}54M6eef)D%wP)h>@6aWAK2mmD%m`)a=@ +=Ch^000&N001Wd003}la4%nJZggdGZeeUMb#!TLb1!pcbailaZ*OdKUt)D>Y-BEQc};+_(f`Xzjy&IHLGc9gQ>EiFx+aeQl^FeaXml@O-*8>wgg7GjS-+bv`;D$R{!;S`cIKF%jOw^5 +8y*wQEhuv;d>w2}`LIpB|IJxUR1^z>e*n7pny>X#+>pIlBnukUH#oOwPY?y@6aWAK2mmD%m` +)MdwU*}w007$*0018V003}la4%nJZggdGZeeUMb#!TLb1!sdZE#;?X>u-bdBs?3Z`(E${qA4EIv8wYj +<)W-U>+8a?$}UHlb+rAP?{3@ZLk`))Z{H%qw46v0O4) +l*W3-SI(%)i)DBojpBP@tv2<8^ul^$l&fDTvtCQRt{;s{O71uHqZdV)OC?6592YHRnJlFS49!(id8u4 +dNSD?o*uq-@gAr6%wy4pQweZjB-E_Isya20bqtPf;+&OjyYdn@#q~6&5)U4jZ-Rx|{;2Mv|PlYN0Dh% +}-4klh}$GFbmo#1d=m5h_2#&Wx7Sq+tp2;*uaU7VhB%~pa{PGpP&21^b2vh%FqnxnzS(tFKbzGPOERy +d(O_tI!)a>fbo?v>8Hw{is;aKU=KD448sJvV6p^ak7!EVY7ru;&OYn)AYF(ag_;5?=J+UT*}TSb}ONx +{aw+hQ5X=8N1#H&BRW6%yk!FN?!&ci4mCv&whhNOxAHLSUsKfpdQgncRU-EF$Z@rKzc`kVN#RfgCOxb +l1aNFCc7#RmV8X^IYPN}QBg0~z+&(zvZENoBN3=cF~7qfWL3g3=+LaPC~B|#Dd! +A9-+DPGw87v5yx!EXvMF(k%` +tWwCQp>YxbRAO%sdUks?-CDQx}wx)<5)|N+Nve@svI^lMc2feZ=^}C;ZdR4HlM|n@-rRfNHMU_@|p&c +JsjA{ya`{V+-zSAcUSu*m9ZF1$5q;HtWI@3y1hLc(85bs`#;ovFp%B?9w@V#})F_uR4&B`c4q~X%5RZ +d$z%j791D{>Y3~c+U2bJr!p0-BV;eYP;2FEQ?dL0`rHj> +n3W0B4ov_ye-f>0NZjkOPk#ZGGkk!(*gf2?3ql4u3g_3%UJ;gxe4E2Y$SH+I#h0Y +v~fI5@oI;%>mtP7J`S$YRFGq?qzcN#5IuH@gMDcWqcXWoKM)?w)?4WN3-)zBJ8P9;aTRn#0w?SDTHwF +F6uZHD(#Xv?|WEyf^5PH%2c`*Fw3HfuxO-t`h4*><$+-jT~Lha;_rBz`3d6B2Zk#&sD-I-|DmKx*Ep8 +vlmAG`Wr#>{I7m$I3prgB&|X$Zq&UBaC9~JbTMiNMc`<^`7q2X6gMBAc7MyiSE$EZCSPAm6!zaA1 +AiDL34meV|TSGdZAek-m24dqp_vi#y3OQVtNEBanL!VPK=28ctkyom35d|{pxuf#19{9frxSClf6uor +AEln6-lM8(j=;V1H?RX^n~iP^h@N=6k5a(8-{Rz?$!gmDFvmK}y5DHPw29@1V9+P!&|1&tVF)Z>gZ+~h^dGW{ +v2%4hUbfB$;3L?DCKnW#hW*inBHG#3l^l(Ta(v93k%60!QiH;f?|%h{hIY8j>0fIpgY|3njB3|T0w*a +;%W`%_)USQB*oLH!0VuQ_!SjCf;0$}Ac$9FABScal7nSFbh-}296D1N1SPP+2op-4Zh_^&Mm9xOtf1e +q-}ev+O^JstfziNNL;ptKI+cKC&yu4B7{MgkZ@FHJ>BBj=r>7LZgEEUFp*?0YL*~Pb=8&DFrdUDJXz3 +;Ty^H}XfEGi&ffuAH=@Ao-5A2jZJXjPjEv_lIz>dlL3HzK)CdpeP^|Y~O1}|~MpYrUl!E|Ub4Z?#3jT +^3k*Io)JM)la13bmFm_!gBJq!YI@ha(eeb_uFG=oJ%2aA?9BkJ&vo9K;!eJP5&mAMuZh_NR^X-Llyl< +HMHjs3-?Vp(tGHk}>NAyBD}{xHza32Soy}1F1%Shvi%E`?3v`)WAiU4k}LC=};cSDMOT=y}Z1j0uQZB +?1lg*>=Cp#sVh;Rsmc4GgP<%yn6mw`@QYnSzk^};=_a|j_~Y5-)$ue?-|3sD+>w;st73;f;@6aWAK2mmD%m`)o59uH +mu003nK0012T003}la4%nJZggdGZeeUMb#!TLb1!sxaA|I5E^v8mlTUBkFbu`-`V>SiyCgQ&0y_lQVJ +OzF7*-TTcj&2MEG80Wi-!Ir^S2)9v^>vS}YdV93c?qegZ#?Jq;AH4|_-%v+p2Jqdxfnq +aPb%Hp4Vd8(2Yh^lA?Q2JENg6J+KdjszueH$zt1V?G3p-3s^PeHDLZj_(VqTXHt^_5T1pdM=~>#M5brQlVfsB%muq!a6l0_$BpdU{!YBR$j4XKT>19O=LXnU2uw +JHK`JEKDeaqbb!%*CDKp0r^yvdhed4Iz?gKlc!JX>N37a&BR4FLiWjY; +!MlX)bVi)mv?E+s2muu3s@w5Lj$v+D>opi?J?l>bk9Qdz~Uq5EMy3jL4BSHAV7rhL+Xc{qOsnc_D`sC +2!g;E>=Kni<~)g=Da@V%w$=YYnCL-MmM!c5+>JGS!>1@s>~ZL68nA5GWj5tEQ`s+jY!Kvi$|Tyg?}Qo +sC8N9%0I}nhRwfT^DIB)}q +in$M*xYR3(c-wDfN6*KkkRvZ%4oxY06Kaayh`uKoD;*Eiq3et)}vxD&Y_e-+T`{S&lqDpD=t3)jow+#TH`35?q%g(ASfRuD8MP5 +rwB^Ue*WCi{EaQ7V9e-%3x+7bZtnRC-Fo) +rlQj9%KU=-EIWQ#cEN7SLQEzkbm;WL8+;70|7f1glBD2k_*FESOkmV3Q6d+qPP{=RY0j0JRkZ-ywaDg +d$@6@{)BDISCW^E)tX_~Zxz=?zI9|$J%-PhBna&MESc_(2FH5!&EGvs6&F+hG!!|3JQcID9!H5LIZ&} +RoKopp9l;`Z1Mj;3&)xb|JF->!&205XKplT|kgr<<7CrEs(QG$rDSGSkf*9?9Wo5`?*qU;v78>3Gx5O +s=n%bxGcGAAK1JSLqI#i~?FF2HKK;x$iUCyMsA;n1`$&B7b0S9YwIk0aOe5zM_{A6hPUZO1;z}sc`tT`gmHM{c(vCA>q)z+oiR7pjkOrw2Zfsst +__9yvn^%IP=EQp^;aSX@lU!QM*p&6X3T?uggEa)mo;=Gb+!0&yB9(9iT9M4b>D|sIB{R}8ac|U=b7@j +Yr=Zs3=`#>u{7Wf|S-00HHd_%hzoW?di*?y|)+(>e5aZ4JtD8RbUr_wPR;KhL|#Fhke4VF(z6vkR$s#N3#nGKh%AtT92 +_QNWx?*nc2V*gviEDm)^OgEN-?b5D7f&Z$V;9nBE1mZSkNFZDjVc(!5@sx2nvWCMyFt)R@1Xw-V3&p8 +4?Rin_3~zMj*68stK2~yTu<$u4T^aR`Wh513VDvBL%g=2~0$mcMy*eiXpTzGMKYPL-C00^#RI9EM{l% +%ej?^9mC))hWxUmZ4xmo1PQOzxn=4sMusuMQUpd~EUIBx=G{y4E<+lG^eml@Cxc3u10s}8s$6K1Z|&4 +C%~TSYz-}oIZHjiVEXdGPP$LiHOGuiL;}oILtv1`RvRTP=1x>(VRv?PO;<18xU}Pq8zQu2WG?!v2Y5f +;|25pSJK( +Y=dH~4a77YiUV|lH|yBCA6Y+Nj+5(H+c>aYb@{Zcn9$ZI-OhN59k>rQgew+$o}Ds___;jejv6mt}JO~-I>@Sy^h +o!oe{g3Ym8^yV&6EK9Wq+$YnB#a#m-QS(wwBMo}h#~Y&WM^iO9EEK@+0x$57|0j-pU4xq@JPoHO- +z~yLe6jV7@u{59KGuYL$OAk1bZ&xVgZq8)(9Yg)MAfZF9|#J^WH)%Nz#ai5Rr+}F1hTH`%una9Zue50 +Y5RR(1mN5VJ^lcEjt+liU2w75oXBm;fONp3!w!Hx8R}B01`6-6X%^En<_)x8=7K;IqlqU@(%U>i- +?_(2BNj1x*e1zFgpUbDLrJ0|c&oIzYUZN_oOY<3f^-#);{VM9RZRWTlIgWSZD1Si7dBINO(|+W1yiGA@dWhjOcG40eiA ++z_bRXw1GmUBs70{4t&kbIUvw;`vxtg-)?YKl|L%u>JLQN`XG*Zu5ad8$bM}XpyVt~~B<+f5FNIdT55 +Fj%>E22G4@2&bhGzZ}QyN%gqS4R!dyk46~M~T~HcVClJ*aAEkCx~tvhtS!po7-zf<&X;K8B}U2XW!L` +*=^}cwy^3Ta*3ma@cA7_!Gx$8kaBGGv4FJ22`gZdrrfwIeds18t#?Ld4BWBYSt}q$$x#q0GMF_sqF5m +EbOD;`PAl+D4Lw^FKP75T2Gf9?EuU@9XeDV>Pl=Lj1MJA4gF=g&!dR8PeT$-O?p6jkAs_%nn-!;4szr +%~P(rGzEKJj7N-CKSJkGWC44|`EvXj6Fa0zvBVO2311iaAVJ_GMQW0xy|65Z~bLrZm26vQ`zg||BgJ6 +9f_xBaknnKiix!KIg$Ij~v~Q~_U +j=i5w)is*zy^vLsW^huY)Fk@bGZ2)4-vCY-Zsmethlu*<6Q%KJj;5*=P;)e?4&PDTV-fe4P$MN9P^nwDQ_dw~ +v?i6CWeE_p<}S_b$J4!t@7mfX@!;LwvL~#Q#R4pUnzBVUco(5xN +@)b++RltJ2LKiWPVLxw8jYks_YN$yN3L#C;o3fl(5Xqa)kr|IpjDTe+`QD#9Q;&lPp>f%N-h3@4-092cXr?7QySr(s9Xz{|Xt5z~}?zIpW +~dHeHESGU-~f7BHHlSrn6BnF +*ukLi?tkewqqhBpvmCvj%5z +(S;)&hn%_QqW4L9Ng5x{7u$m&(c*|bDh$WD=!R!ED7ZhxRA9)nzEpS%92hIp4qc!6a!QV +#=l=KlfQQtP-6Gzniq%!wXq+2I_0XQnW+b?9(|IUUB8al@z?F0gAZgepWKi?q|BZ>Vn!1WlJ`sOzLwg +9a#sO$HfLH7j#8^!f9{>;jn=LsjQmsqpSxnd&~=%IN5iHRJF5LzErl@GHRbN$mn!?6g@ykD*{ndGrOLV=eiWarkC+O0|l{wXt58_A2g-%PpZm(2a-+cFaOelQ^b= +3i!Zx&qi=`vC8fVoe|PA|yt`$Gbn!F{2w=y-$7`J-H$#!~MXccirgLrQF}wfAWrc%CQ$ZDsv7k2BFFB +A_-_YA%}ea!_)B7Shmxw*xxZgmyzQ@3dRqtlnV+bL6+%R&=ZyE*F3z!TG}m^h~dYegt?R6S=0_Gc@9O +my2PzwZp%@czWLq;WQ*|Vy@IxMPAtWF +UC%6o)enT`|`2TbAOG(LOzRd^6!ji-gQzB}*V%Vm2PYWKWwyb|chy7%;J@TMl_avL5nA`BLXg24`bbG +Vm{wEN6^D`_eL#)^Vg4MQB81hLJYX^b6d^dngzmE$NS+M*4(sh$wFe~OzVlN!UC}8x4F6+4#D`$(G7xzrjRR@!=v&?i+tw8s$=>)z3MfEj(V|>6hnS0F+2sO%4@I$A0Uy)bXwHOAV_R$}P1lsF8WVivW@VakI$orR&Sqs{Z$ +F_F`SU6B2nF8jE?Y#l6UkF^!HctdA*y4Z)5^r1GFNozuGqZ*^ZY@o4a(V3VFIPmY0 +M{9Ein)Da#&V2S_vZQ%%9me75xcYp#r-jv?@%`S^XVSjnX|(nZ*RWZlNk2<>u=9Kt~)e^8PvcH)4)}d +pmX$_Li~Za;)l5UKo-k#Hhr$n>A-j1mruL&|D#~kNtHavm0EPH{%?;&p0n1tO#NpUW=GG}5uLa9BGo* +4I^sN0u$L9eb=RDjIkgT;cE7{6W*>T~uipcQ_U#dNN9B7aYryr~T%qpJ9N@9LScSl`5R~(4JZ^80>s3 +u>yap@y|6yU{lD(KJHH9x1qonEOBEO=9WmLBMK7foxY&$IGwvoF|B(k5u*VHC*wq1!%R9)rH4LILhy8p+;p4#1WeKA&Wc*S>0AF6ny> +hCCy$8t~9Oz5=$%+~v@qHe3vNUOlFWx23-&3A4k?r`RBgiKS8WSE-}+Ik>WW+A!3|27#TW3KIt(-;#> +J1;|Iz_kAXP)h>@6aWAK2mmD%m`*DfpvguQ000F`0012T003}la4%nJZggdGZeeUMc4KodUtei%X>?y +-E^v9hJZW>=MwZ|8D|+S9f*e!OI+?1eQbitTWM`t<#7V_Ywx%>H2n3pBk3axH1C%)`{r7$E^@)>`<6V +B>0rc_is~>oLeEfZ!rx}+l&NBAff__%qg7RGSro0Bx~X^+F|oxvEM +CeYYib^;-$zIKIDwN_=x +Gi>EhE0`aVri$vmEP^Hy30cbpTgJ&<7SM!G4TOoU>p*5ryJx!9Ma&aN} +cB;;4`NlG8eKx6KgnjWFAOfc0`-UE%#zoB&G*gr?qH<*R~SsFknHe%G?DZrt|t^XBL%ijbZW48IO`i4 +5S<5egfx;F6ZQaLwx<=-Mob@^}lvJBMK@U$Jd`$0L{rg7teND!%1;9f6?CDqa@&1vtWY3kKZ!7f))My +#S?H0xvJ#7df9RvZ8+A=Pw+TBWLx7vtNJtfvrG#W6~^d{ZM0Ct>w8Uz1i)YX2P(d<}{5UxEJ+?#rdA) +oTogc8)d~;;uD+ka2>MawWwbn&qKYM53E{o*5q6!ammxUxy$fw*aDuf*O5OLDA>}uur8vN$T;4c`2!W +t0Y#V*JUqU6czgkCT|7JnAy8l&*IjaUcTx+0*ec4NTZzOqU&5mQscyjdqT2fltLyV44FORfCINesES3 +@&g0y^J)ZZ0Np1!N9qME%kdajvQ!a#4rPRW>@6-xvV2DPa4E(b!&CW~t{oXCt*S@J}zM1sf(vY&OqL@ +sNP%>@|O0+h`%5hf^X)qPf|-LzC(;nf_7&59MUPDrM}lAEH*Qnus_>;r6_qD2FOiS4$jQBfT$=?e;X1 +j;AsC~^uedA3^EU%Mot#TSgdK$`%SDSq;Z> +GjtY);hdemX1IjCYq-$WARnJ|WJ?PNlqbQM;qjcL;Nd^2$Jb5={XI +f$A~iT#Gv9!=m%OU?c3S`*Hr{o2wcIDx4~rMt34`q*B{k@6xM0(`$?8aNeAGqMEa@l%<_<|b4Wbp~LA +HDTpk*i$6;&V=8uSSxQe%a|?b_c@F`d9SxOtS)M9PbLfKasl%Zm=Bz+FbmSaMuSQGggZILVX5EOw$uk^T9{B4QB?K90a|M12zNgwVM3!IB$!p6H6Nc_=D(3`0_sdt*_O +rmBF$%9?;>hj6f|wL1Whevdnb4u`H$o3>IIV9-riN4cwEK^oKu!W?<5E!Rx>W@o%R9G+Vz`CB4CsKmf +IN!$ijTZ4R7dl1NnM@K%4DN$$_gAPWCvP?D*9+9{QQf`6;3m~k)kIfq2m;bKtL$2zQK6iO=GvMncg{$ +RCUH~%@S_l=lMa3-u#2ScIRN{aX-o=$D8p%4@k+%{gE;ZjenecOsu#sGXgw-A(4$_4Hn7qY+R>x#15+x1>?y{1T;x0e(3Q_RQ0(HY;c_+~1p*>Z)XHaj2)*aEMk3Vf +kgVxzU@jC<45Bxqjui7r#hT~B;i=rDhna$_ElPStBR2-Yp6D31tLsioDy@;)7$=z=LT8Ahef`$nV-ri +#3s?)(0qGoc)y4QdIOAs??b +SreAxh`#(?RhP?P)IL93E0OWr2$6Ih4nIP#)n94x_Y95$#+oveJA6G(~!WJr0|B?Xbe^U-7bz+Y!|+CLVG5s=*XKJ?6*)#i6a&(A^7vRDz_Jm3b}G6vU59IO32fF&JYnljehM>?zGI~p6$ +}uSw;W=|)C!lX6h(2GQehK_F3@ocy2R2>;2{vv_eJnD~pCiB_^xYG=Y#XX#Wst +;B-@lIvzfsCrD%koCe6ka){_v;$zf +Cq+M=*3R-p{i&=r#Fe(G2#eJR?aY|#ce(fSEottNSbbxr9oS-MU%!yPfut09QT(ogc=jKzW +p2CdF1{ab;v^Rb(LTfY$kuw<}{04o*~w$2Sj#54!&D1NJz=M^%?sk*4OQ(J_ykW;_*?^pvU6n-gd~3s +)bvOlHk_cQFec==Mvm>~FMtVaLq7%D?fj6&Z9Qxzck;l^xk!a7(Nz!!a;a>W{sdd=lQ +JW4t@OQ5gvOtTgBm6&M4F^8{bazkH97k(%_KME%-p%h@KD?LXcURSl4`#U*$$;kf3yTN!8>cv?+LEb0 +T|?)j%c;*Pqs4=ze#UgH59Sc5He&r^A@P2FwFN(pz;Jc6G-366#Wrp7%#ljx%w#eP>l}r;vy`WlC^cb +YZ=5Y1{!#LIGd}yIM9Z{y4reIUB2ud?IZE|NsEi?toUL@uW-8)d7G8nRhYw!3(kI*aKv95X6o{zeVIf +1j7D`^WR2*#h*IzN&=04@sa27>l7p#s2Dy!Y6%tTGM$mI0OEO^lmlsx$6n7 +JaZGn(%uuKW`P^P}mi57s*xYXctbJGD8i=n35=NfKVhU>f%CY5hE1%nTo|70{r^R4-opA`FP$_Ije>xdv!}kD|Rjaz!;$L(Vb9HwU*M- +q7rMMbJhVykMY%1A$2|sxw>gd-%bTuv5cTI&221@edbW&L$kDnhfF6+1zf2_iYJ7Hia!xWCj$;u$g6T +R!{9J?0+WlKh-ul=Qy`Yg7LlZX-e7zW&O4+;Iih!>I27}(@u|xh|AUztJ!|sco1&)n +)ml3gFhTe`&i8g5KuKhHQG#RKOp0_{vuSls;DbS^D^bpZvtY{2D)0zvY2E89djD#K1PgXB%eYjlviiP +IHAJ9>%6K6b%4<=BbrEZzIZ+}{=qdz!saUOe#j%5M5^GgK>9XwAoLwlx+q?DEWFd9M>tsV+G(-W6^A| +no88KDg;aoqVq~_t+3nCUKra~1~QDdz`PPl3pS_$Bo0!8;Zw?dJL*cstfF|e)npjA;zbpo2Y=rj=;^v +;KK>Om$<=Oq7XUR%-dU#soUG>tpEQ8xu#6xntu**ztT*M# +N(`j*nWRXP4=h-gse_9RUP;C)?4uZAJaii5i-JRm8c_;M*R0C&U}?QT=4eKWklL-GE+-4T333M=oFvF +<$t*J?MA8^cWmnHu8I6Jq(FOXCk0a;W3&tS%JflJTCC7m@KjJ&G}{&_*GDzUUA!g)D=rBfbSG#>>{6Y +k;e%DNX|f?4_ZyLHyb76vayr21dhxMXD{NQ3b<2yX@2KZbW*ySvi{?6`J)(l`d`7jnv|?wpJ`>xO`2j*tAwbntg%@ln8`WCF$*>ma}0DL;hEjfMTwuwIXzL +wMuln?U+uhy6_aV8>UVqHnELKarMmz8TOx_OX)pZ~!urr!PhMHr-w@tmnw{v$Hj@xmlw1J1e +P|_-wl`_h&-NhRd^8um1AqQG!pA**RoNI`}BrI~2F$rU)EhK?`Ikr-0u1N_4Cz()X=B*&U%?OU(TASe +Br|Sdi*Gqd5!yhq8)-rNv(v?!!(rajyUCW?{a*x@kLGx8MZ};-KSW_t*z3>e=b5iCOo-q$CD!dB(LJ4 +Hg5+)^XDG_~?LJ`~nWY3;D7GIj$M0<8$}G>i{SRb?t938!-mSJ0XD>L49GjoYD>TgfTrDtkE{JzBq+m +u(t(Tfej_)=1~nzGLY?KaU714Qw|Hlu$v83l4t#^qSCl&|AY2>Fvu8nu>*9~+3XlmU1FGHoc@d++0nG +%GUH%SK!i+cWL6_<-8x~!@X{F>yTS|yn&U<}hYuif@6@vMkY6YC9%)k5YHIJ=n?x*~7rDFR*<>dircC +m{S*=%6MZ~G;D|Y1Z4q7mS8+?M+$+pXS3NCfK{f<-d250$s4K^RI#JZ_?`sK3eR`c02vG3%}E}5ni=X +OV!S@p|7UNw27+g6-swXcAseLKi58PwIDTOJVERljaXf=Fr6_t=5uJ|Hm_6G4k5_^`!Z&9`X +z1N$bj!)-WQkKfNr7{sw{l^g-G57*fSHYhS4Ua0%bN|LNWPkN8|cq52@uKw>4!R&P4fu5#U3fu~bola +284PdrioRseE{Pc-&L5nuSMd`MekVC2KlPqUTjb^p^cQn}GxeJg=#p%vw%VyED@*uH3#*9u0eK9$Kx& +{L{M;9yQQHvZ>tKYssL%pbfiRj(V}A3Iz+P&fe{D}JiJ+kd7(+QjydhyG*-+gK9vW$AR;d9dt8J`*FB +&+3Ki)TCpt_(`qt)YLFtQudc?Keuy<=1U!KVT6lkU+{tDH88$onZG)IM{?^YO8n>GEP)l+omkEM{8s_ +NS8tuk%4V0`bX=ueb!wUjg~@GP;iGIRuYo +6iNW109CeDT2Dx%vzEuf9so(p@lK!xb}Y49`osGQBItBvcvEB+})I2;cV4{Wc!JX>N37a&BR4FLq;dFJfVOV +PSGEaCwbZOOM<(48HqU2q_l!WM>_uKv7`P1=pTx+XBs76Y0 +Kt_ikGM5oDRK<-pZII8ffY3lseT21H=dvXtPJ2?i(2t9B_7RPaG-lq4&Sc#(*^o9-)w89Zjnv%)$j3$ +HJ6E-d6!wFn=k7P6I)0wkfN=hI|54ICpNZA&LqGXxG*F7*!{9R<{=NzEJ#JFYXluuUT{eT!RnY43bGL +mjGO&+g+Zb8J;1jhpR49cp{x;7i;2r$2>8j!nlSKSC$DqDLitQF9|tS)s9TC@tHYFc)+=@}U7@@K=5f +2iY8Q-{W#+D!Ys}{Zz~11-l+YhuIz60p;`#((QE#EH|S2mj`iI&M1sc48XW5nlhk=zVF5+h{gEuHGLI +k+}{O2$mo8ygs(!J%h7Vw;ozhY+@XBlMD~UqyRKuywpD&-s4l62Z#Eu#PQHHuK3oq{Q3_X7MfTyCwN8R5PD_#Q9Au +%A->*5VTA2#`_cZdkTMuj8kpIm(kRj>||*{#ZHB8E7n)tBfF~f +`Iq8@hi}|0cy;fPkm24bBj**d9{1KxZc;EPx%;?Zl|{3JAy>c&8luGbhGn#T<%%f1(KOj>yy8<3CV^{ +y&>Zk4A&!csz*p%o3an7#>d8S#^F0Jv>!ni={bdWL>>fVu|0fE>mmI>mO_f}J?Szh>9~x4ZQ^s%lBrZ +5{0d!422^{-D7;r2zsmEae8)ZB;49&L76p$`B6pf +Uge7ytkOaA|NaUukZ1WpZv|Y%g|Wb1!FUbS`jtts84^+&1#Ne+6r!kha;C5ufP2l930 +*)bYCGIZIT5&^CyV(o+-*09}Nz`L)_u574O4M*Toc9dbg;r~pri;o}TBIqH>y6Tu@wrh&Wku@VkBHYE3wfIyCV*>QAdj3y5f3DVRUgl%)m6e4_GPMT&)H4iUi-j!2Vfe +K)Sq+^_vnlvKMFvlS+MH(=UX0l(ou`N*1-cL8vSPhSbE#{5@8SK0)FQJ=@5iQXvu1DCVy&$BMcJ3CD) +URNm7cO+oq(RJ(rQ&q8NeSM0SQ2+wCtiIhNK=xfT}zM;=ddn9id_g4Io~_lBKXe(^#CQB`_{cCjfT!? +A=v*efjG0HvrXw7z`YZqZ>Y3Je$3II{V@F%lA)zj}SN)3qYstOj^i0k*>H|#b(7P=SK{FT7b%zY_3!h +w`h|!x0wS&6j=cbXRoAFNC{`UcG*wzIc6&l;Y!uH`o74-(O!|MvhPr6t +4=Ka=ip2+#;Kr% +%BIZOHFzAop925+l0-r_LPin8!=!@&usS3Ocs7F)iX#&Gq`MNq0=pzHQUeOSA|1o^Zq8?gC}Vs~3S+h +0#L;OqncNQMmtu!d9o@VS|C3Ruu46@u{}!>LEf5it(OC%?Ou;j->W?2$Wq`tv+QFRR2rT3{=^acQ_qp +%)HxR&Nh>S15EYeL;As4*>7P8Fa=t(qTPuSUkLE-~6nGur3tLDHS;%*6ql|P3hFXxr4%sjl83zX*OohQ6D52Ux(1r}du+Pa +p`ETOK5)d_T2JlFqUx6Pq!StWSl4pA#)Yxt%vlZjTj_(aKYhDx(i|qA4@GH$p^ynx +}!&G~n?lfG7T61{p-t!@-*N3<=gH2Umxu6YTOIV(U_!4^33Dv;Ol@p1Ef?Uq9(`q|9Qo-(Bw1`bpO3^ +BmCGJ+fs{_!9Uk{JAd0#sNI2ALD|BpF@q1VuG7`}JHEGMi~2Tzr<+xF8B?m)$d`khttIVmd~N@dkT*xBq}wr!g7t +=$c0YZe*i{p=B5(E`~1!joVyk-SP(A0%*rg6tV;z`Ro(^rO@6Q3$SHVVc-MFcC5N%K+Z*p&sOtP-K9> +Ua1-VtKAW=1h}}Ue@RR$Y$tk|K2FRf#oXTtg(o%wXX02hr{(0z1m?K$bIDT6`vT9?+okv1w)guktUyww(~`1WX}tRbJ>P+65G?rYTnTap)B=l~ +P|TfPo3Xh0H?+rD7As2ffLR +DA{u9UI}AQvOJC_D&Ui9u5)=2U69l;!D{7BkvhGZQqvGY#I&0Ju${SDg9{3xj=$xLvlBTOt&22R$oV +&}e*!NviL4B@Uzav`q#v!%g-{?P13QF`?imJ6!FvHpN>+c&-yrsn? +viMjxQ+V$@0*_lsYdor4OAEQa5fmsVI%I|S90gdOd@L9gT-uViT?h;N04Q*VkQqZf2mE`?0nyK)$XJSQl=f*Pm~&l>qSeASh=ibCah|JhLaq5+L@zJjKfg*T=MTf?<4mR +R00(>@^?zV9PB&ATr{Yt^i_in2echjXL5AhaueN>+l${Yu<7@P-sFRw%AYVd6=EP0(J_>Q +bk*!vYw#J5UP%d;v=kzuI@OPXrF(F)(ddq_4KI5+}1L +^8UV8Q#zK4DGH0h>U4$|i<9%Pre7xp8i6P}4ob^CAvKA$Z}n$}1?eI-aB27_4JeCnB>?JkWUE-Bdvg6M?U8jtW9 +(_xslj|cf{ez1M`{zZkjUAmOKO|54iQVb)E~{2BzF(xN8m`LLW--91(vs0(CTxh;iFrah?CQ3K*EHQ?4;1eONi~=>np +1QKs<+jxYXw{d1jtyE7u+wi9IrwKK3=g!S_^HeAfu&5gDV*e0J4KFLv2S;G6;kDX-aEh-(R7TtE;2f< +1q=wtvhDt1P7Op6YoHJQEtQM)b>}K*Ir*cN2M!QI|2La~RAyQ%p$ +NmY&^yGBN%GA{a)-Uv@LzuHKrJdX44T(z47MGreov4(CSI2)IVLQfb4S+=e2oq8k#3;t$&F}8t3?Ycp +=kwK)=PA;P{vB}qgyTaLJAwZl`y)60n}Uze%DdPi_XmYm=Tt^IlB$mO4BRM6YCpoXQnvYs5fX2jjWy)My`kY +rI|I{9IK<&|9pLk@IUTfqiXQ4C)00^P*tKuG<6@OpWG*0k7uJlDU +oP56z!vogCne;=M$|I7K@%I3eyN-xB`IgH9FPI+(avs}(KXo|TX4qm~N^B;e^e0FE15ir?1QY-O00;mj6qr +s;J=Nh;1ONaV4FCWh0001RX>c!JX>N37a&BR4FLq;dFKuOVV|8+AVQemNd9_wcZ{s!)zUx;I0RqWbTj +-&u00y>5x9FiSG(|6lK`_)vVwWPdBxNTk`rkVwC5y71P15tn^Vy&8o?uXRf7A +)4|AV>Vp%~mYuMCGN^>@C3~jc@MQ}JT~8}vCad4@`&(gvJ8hn?nH~74hTp+hq1C-s&S<$N_$$ji8eqt +Ff~9Q0{SagYrHXY3=qk%HE}6CDM=*Rag2`g(Yju|qe7rh(%G)Ln-v&4X6oLMIV_3YT!VbX>5TnW7;t-B#$CHlW6+ +C(13JbDcBS0J-Yn52t+}wN!D#W!wzHdTxR`^~J7KPY<;&gbez&fFVkCQX>aPoE(u3a{?_$XAhy@_eut +O&DYBEXzPKo2u42h}tFv6wVU&!iEQg`OD{<+|&bs*1&5|Lk&Rcq57e6Y?&#jfw2S5(=r|t8k3^@$0ULi5tCM=9bSYG=m-XfM$T#F +TX&Z8DZ>?|4Es|=XBJVkh}Ham&IU_dAif(}j|ARqlpgwux%l-dA5rkW_KAnC3Y5j#clk +npPu`uw5xD(w^vPFjUr2hUyF~`_cBK0ox`LA&_abJdZQwxphZd@cwt;Np4hZ9Fc%Ec7S*EMCd|)-)2f +;5vkd)%g^OE$@ur$D`B1vX-P04~Qa-U$>Ay_OMq>Fej^}`VA9#rZQO^$gOzxYjSA>r;~cE(soBODZo< +{SZ@IP{JbKR`RoJP%ZcgxWpiIx=cmY}bw>0_nW7HSsj$>5Njh_>@H2FGzC$tHqVEE{8LzG6h(!8L@lBvX_;*!lH}{JHmGJ8$9w3>M+;A^0xmjig)awh;jiFKy +~}@%v(gp(A3%q!J_9sPiBD8GDk_SAGnw9W{CT(p`5Sp;&xo3}173_h#D{plwxrT3ccf#u$y12NoI?J1 +J;$p&o`a3Bh<0&W_^a%1P)h>@6aWAK2mmD%m`>-7%6(%B008G70018V003}la4%nJZggdGZeeUMc4Ko +db9G{NWpZA*3QABuF7D5qvCyTUFEHdwti9Jt?&4%Y2_gYBzB-muKMp`8=!-(gKiJ +YckrFbesi{*&(JYl(t;Pg03#%1i_{Rx4;gv&Ce4^c_gc1lF11Y=VIXIw?JQrie=MLAPx5l<(*T4T7-TdY4&0nKWzkK}o{^Os=Fn6(Z2>)b4@*=+}awUp%O5oFE63Ja29kMj4L>dW3u0bJTTx2Cr +neV~j^@)G`pOe*DaN-39TCm*!Qh4x`aiv%?gYSU!C267Xd|hZRF;i^ +Pb*)DG*xtoR3gMQM&!S?MvQ$*@xJMdP7TrH2kYpA8&w+EWx&8#T0t$A +?AT|TX)T!f2x_=@;qad~lmb$%IiK;h5EX+qwyJ97S-oX;0mQ?j^Np3j%Bt_YAgTz(sUdoiOWu$(1S?0 +LTUE}Vz+$GCnME-sMk>x=WntNC%RAE+Sbm&o;UO6Hf#i>u}0Rf}sG&r+UOhuJ2tY9f}64Fwy!4R@~(2 +oUI@p{VjGHhTBLuV?nNx0+(0?IWoY2T-M +ro;~d1H3^3uun_1xGlird>qu=W9OC1x2GJo3-k|ffPG)5W1cb@O@GM2%$OA1hE+#(t+~GVts?z46*Fb6J%pHdYCnBLweWSfni7}_DiZC +#o-ITWS9_H>H*1}*r4y2-;$`C;vlmN&SbR4+q-1`TfuYR+`WYeL1&@8pnqe$Wv>)8lt+ufyZ8V8 +@OEkE3$n+1iTsD7N|^MoR;St&%m=cgpb@$u4urNu>N^CJzOZ;ouCHrf8j5EiEE@`OmUPFo&x!& +r4BxuCOsys?9yn0*)^6LhSpTOt=oUx0F+!rNVU4qUgL_^QuKJ1Cc{xO!?_L`v2Cab5!RbJrhW)(cuBpvtm1HL9Ko)pK@O>c?;+ +iO&YZy&XX%?CM^6BUCAqPxpWJgc&aFp&E>=dMD&)^wT>~lc)3PoS{X1h~j2Xzz#TY-YyGggi(f#*Y!T +jr8g$%NlDSvq)waLhzK>kPW!@x7Bpd#Vn&{~+$z4eOcB<3>%(moMQf +baid-cC~PdIu;R{0Q=?R>KI6we%rZq~3j^p|i9S7$%g02Q0)u27uMYxU9(LUmoyw4%7B$VU*mI;%QWl` +ZIz;%hHwji1@VXD(5O^bXZAM_Fm0=DTBH3;U7j2V9`Rx$ZISjphG+D> +S}2#m2RURAP;AHx`b|igcPb+$A4d`&1LkMf;|Jk`GfEHcXCs&!nDb1V`FF6%#bk1_}Hl=y5~F@Ck3?@ +`k5LF`kLTmIttn``w%1;oIJLT7;S25YvFR{crXp{j)l|64+3WKVrr(@fWJ2@L5-_dF^#OQ(LvzaHtUsG=YkOf^tBTC*;LQG2Olw^>ZQxyIe0-cM-H*}9Ie7Fm1nWQ4 +xwb+%AG9(St9r5E&fyAHhrclAuT#e9$ntSGog)7v$vgjvv~JZHEr&@{}(?o0mVFpt0FK&0!H2}?B~_! +s=6g20ss^k^=I;U*)6(4oBQHm~4%x<-L>`N{3oDlqYrVL+VC3ns~SoMOFHX +0MD&fn{^ztK}Qvr)u={&8LF@KLtCgbCPc5f-cWn8*A5I;v__;sBn)6cp?2D8?+8Xy;jM?=t6tX3&`zz +@*m&+7EW)0XKaGCJeg||Ghm)Yz-$?#7Y95v7aozWRv22Wh90&BeVPSXMgS@6aWAK2mmD%m`?Rsje!{k001r$000*N003}la4%nWWo~3|axY(BX +>MtBUtcb8d97DXkJ~m7z3W#H%At1ZXp&fWLv4TBzdDWqNvuXl7?XWlU;3kU5Yh{!UO|LrBF@Nd%4ymB*G3Rrqw&xC4E;)4=OV%m4iOQ +Nr^qupTWRoQ+t{0Z_yy|^#DbEqJGu8{ac1HJ}^7x!2!}>;>_4wPktdqVTAKlI+$s=)TwrxB>AV-CtYT +bKdo!Hi@s6{Pr3AnBMw$w<^^!6CV;TlpqgJ?JaK7h)JTd8~E>i`6Ad&r7Szkk1ccXcUVi8siH_DTG`M7JOoa8zFa1ON>nM_M+(OzD@WU$ZaIzNQ&)Zlnh;yp!iEG4V}; +ueZAxgg^Pvu6aH=WEGkg{9P=Wvc>od5~W`~T?S|RTu|r5+u(g=t+9uokHmYZ4p{Q3cj$5ysP&K-RK#p +YE>`Fr=tn@klg^=577hBg0@){lHUK)*1-N!bK_QhF4M|9ouca5)*F(IC^r3w~K}gv3^&}D>hzbVXGw8 +kY;Cryo#Gk4y&~5Ysnka6E9^!sE#Oga#mUH1o7<=u&uIT4hktU1{$KVUbHa-Lj0P%IW#W#c&1^qU?mU +hG`xFbVqIm0j)9?Qb_0CV?v5(#Y@!5pQwrASDEf=w9Cf~KHEQCP-EQ^eIREPKa-M7Wt9QfSCIx#7-^* +=~dA25mMt#X5L8^W)xmEgiU8lPqC;5H;sFqz!BXg9GG0f_|Bcr+maxyUtR7D12FasvD3Gw@G#i&P&WE*I)0W(6H%)Vjr@Py&n!;Be3{799 +wT3Z>43Px=SYKCu~A8cGjPOz{t>&i0DD-JMDg6Xh}bBq;n)TqLg<7AYe=@Wz3ja{dTKn5t5*#^3m_l{ +<6Z(zgIPsK)v?-|bXYs^-n-3x0RizuJlY3W&-T$Vsn_j585;gR@t;NdtR#}}HzC_t`|_HsHK8O$&bYi +b7Z9>T@$91z_Dl8l7orw=cgVXSi*|Je_gPY{{K{@9gBAM=Unaw&e?`zCj@j%`2SdsM~gxXX^Ddyy8hs +0pBXYjD8bO`|bf8+o$9RRA~6u3K}mT>C~pKW7hJzhN9tHuw$a%o^GP!f^ji)?0nZr>XeP6!vZ)a2vfI39R$C1ZjSGqa_*hLTwT +s{(9{{{XSmGg&|$&Y@NZ;Zs^TF>X6K~kd)%DP8~(>EuW?r%$p252EZx5tgip#Z!xNeaCz-q>vr2XlK!u!z|h-Al8;RJl5{$r +I5TcvIzFA)-pJ{sPn4rj6eKaGNG(BHQtz30kA0(ktgR{lBtcOZJ8pM(*7}jq1W+i{^+SQ=#^0KWh?-q +5X!78Ojc4&N3@RIJYjcaaVb2Q&`z(q3TR-3(xPKImXOTA;#;oSn+3xoC)2-d@oo#mL#@-EY#ZJswE9} +P;C*tfZaP5*YJA3S;*PF3R9!K8){!bWHDwbuvi#^|qJuX;3j98DyJQ{fcFu@h!=!7w;i#EorwPNc^Gi+F@qEFYpvMy747iPR1Cz)6hMk8o7yGz+_NH}w& +cc9Ah8z|WhfKsFTmUWBb7F_}JzsWZOwBHm@i>fPd*r!MC_n_nNRRiO#E)%9jHmw)uGc%b?*5$zTZ#Dl +-p=;!^Cuf0TCcBO?d?2&va`Fhv%9wg^1%!EcUyAexa^|EKJ4p>di;j_;h0A@3Wm#RLN^)lASNL-VaP@ +6L-QyMTt1Ey$8Y|4c?t}-W+LXJrWf@1)E>qopC9;o6~eA5rdeVs3+`x#Cea4>o^?SVKi +uV9l=4Uqz>bcEgwWKVoANy>D=&0081S&=!cySJ7Be)27A(Ad-Yr+-mltK`%CBrwUINfi8yMo;^2C{Qm +J?&6fzStp)W&Gsa*cL2PEL8ogeaX`x84jV0$pC&!EeG1+>MIzyrhP*guY_3CE3rZ&?4xhBZgAn1CtOs +$ZNNr&^c8)NHyR-3vu0a7IWf9gahg?^^xi-X~x{j_vEN2Ko1(h;Slc2DZU0^%whaX*IIHp1~hH1~+2r +CrF1Vu!$G!?N+IQ`wON3OHkys87-yPo`|wPI1dBfz$oD)5J)5Sw= +zogR}?xB*aiou4$P#iD}o^Omd8mHuzuqEZ0y8Clp(GVXUfGrj6N_W34}zQ3y%;G^};O05{Vzlkfnmqj +P5M=JL@ya;Fko%i$jzEU^b9#7|oDWL|pQoZOkN>Yq1(>7C7!<@KhSE7g>O7W9F0q+CtAmC4rToEpkxv?VzBSm3XV9n`*6?t) +P^-8%UXD49c7};}tt#qkM?sE*!YCev39L|XWdnz_4TTUD~BEi{_ad7e(w9@?%WEBs>zn(`Jq(bT$QN9 +8SU2rI594@0IV3+`q3E;?|*{FEbSc4`p$V|e-2UfMDk&g9ZztF43&ew +*;E1Q%Wu1@g$6{arR_P12p|{6cPlGLL)lTH76dpZ`V|;m<4W?Ji-qL9@s9R7NdhkFfn(BFlPZn5L{^b +UN>^0S<`i&egFNFAD-9Vx9pwmIw6af1~m$mXsm7`$OOR}JRuS;RD4jbljB;83E>xn-~E(chCa;SzniZ +WKZlu9vX;a^%@=U<9F(5%^)B$HMH-Th?T5fiQw(9=Y#_F6U^wss_8)*yI>(1shn-g!Z%!KM24Ex}1fi +5XC=U`Rt6`o|DyrjjNBiw#1&t);Q%Op+U*O`=FkiOwD>w#ew2_NL3P>;8^Gnfl<>z7R&h;7>o3-3w>S +wHUneWh&3#%fEG~=3dOO~{d?pxV+0c9e6N`TUvHrRxNRr-E7A;(P-CrU}-=7N@GjL2LTaKkJO4b~#7Q +NaiiJ^nAT9p&%?W)WVpGSl|@xx@oLjLC0*L0&r0VJvNTA>_tzKMgpr6ziyUcKo_?czKEIu+V(ft=AVv +hgm~PgmS|HAUB(0Kg81!Uer1R9(RD>4hXFWV3H;S{A;p~{Fn?EmxOjgan$TqGBrVOyvm`MhMuHujOMq +emk}YPnkhwt&izFq0bB=?MeD0om&csyYVoYiV}60zAW#bIk!w}MP^*nHUJDj#t)aU$nahTg$*JtWP<} +Zws;eX;VI1{VfL3@hzZ;;HPy{I564Ih%dXIqi5zu}^fHw7oIq{912u8(#xWbgAs~52eS<+;5=($5&7n +%oGh!w2>rUUC`z9+Z9+Is{OLt0w_dZyOReoXUcg9!Cu5ZD&_Lq7^fERAZ%XK!1qAU92>fd*Zrl3{5At +~QGKs7RJ_65weQiDK}%1rq%V@VS_GTpG0&?iYZcB(xap9YU;=py`(2?iWz0qu8vSI-dVGKo9%v%P1Ux +1T?nNv)h6hPe9`%^+(vlL&M}b}9oPduA8Wo%Chg1i|NeSqOo~PjN5!ST5k>Tqp%NSl(}sG+*6F5BbJz{#ep?iqhmK^ZoBeQ)rlBgYgl7HNEFd3UoS&Zkw7i78Swg*>r90L)b4;wPa2A)eu(%0~e^gkv!7Pc%tWR?(sr1C +s0E|X5S-%#RTh!uem|V?YrVw_=MEqC^drZTRX;=#Hp-W*|&bgmrmIUnY?y#jo +3BOr4U9l6`r#YmPOhH^Dj1K6;;W9ndAY10uh1e85ItP`aNj(kRWN%Nf1jg4cRAsr;(5s+76qm$Cby3R +P=n@6zL$TskVttL2F?M|4$kT&tQ=W&~efPsvfGnus#w>SI0R537ePs#!p+;I~Ff;n)lCFWi6KzG8t>J +|d+@r1WhdCFKiQ!6L0t%n2QJDrJXi4g1El))D%JrF{mU%g&xy*WQxPTE^(y-oDFWD_gp+*N(Ruq-0NP +5LaTwxg2g0v0n~|)N<*@JkVNw3iq{-T(ybmQmAsrhpiOFinNdP>1T3MG#8N!23!zZutK~|?;!L-S4d| +D)Jq2i2q0-GY!GU6hTT7xJZkjWtW`-!Z(kKIPlON@pda2^9Z<{%H?0&F9y?iL=Zcr%D&MA*HP0J|Ak6Ve(-gV>>!LdUdj-a#z)1x%w9<+)+Fd_|De@AE42k +k8t!6j(!_(^zr8)7vfv?;-S?lWX>SV2BvRj{wfliKj*8}4LO^rhVt0f@ +|kn+U4_UsXY)%+ti+r`CC_>nm +Ccnid3Ia=N#!?Y4IC~zk68<*K@B`DI$1}MJXahg{k$5QZ@YO#y&f%Vjhh-zS0qG=Jy>EZP?|u>`Ydo&J;$)?Qa*`{JO#~JIcYSdk~8)~i8M3t-=!X;aK`dvYeuf6kq84_)fR`y01V(fe1~)w +Lc;JE$MQFj&MhEJ{9XSjjKd++=4-r|X11pU?otof&KZSwoV6w8UpfvME&r9JCr?Im`)nffpH|GnS^4j +c@=}ujl&3fmUzQ=1eXQ$Q&8LKk7{1dk@Jc?(jgiOQ7@ww$FJ$;g=e3!d1wt%h5#uoe}q{1zeE`^9V>G$OxyKvOg!3Ws^W-iMi(}q@ +0YU5tO6n+>(f6noFO+QVB~=kZnB&i4(!Li*p2X1cux&LVO5`QA|{hg87()Xq!X^8548xDE-J ++`n@h#AIykVs*b#zg9fUjZl=3p$bDbSMP;D>&bC(OXCC&MrGU28DE2A51PEP^!qEuw(ZUhtN!vam8id +zo|9^eV)T15-y5=)rQmw+i0Cf5@pJn(@H@y1!abi0A@$cba{(R65T!UlsL+mh=Ib_I3~dx4R2 +t;z~c`nfqm5nb*&xM3;G0{ba06bbsYi;56xsQPG`-1EnDZjRM$)k+(2x!Y1C2r$apXf(^>j$Ec1R)fF +lSxIYy9fy-(5IH^hvBM#K>ke6y1%^HwIyamRy}_{S#mpT#QQ--ajkI3gO$Net=mU%td8u3u6ek^MvE7 +0953hId!_)2O&tGQcilHMqNWFuk=a4o=02dbtT+f{|hfxo|EBTV`K7BfWgj*zxg~7Q_-H1Ead0cOdGK +m^8O^2k>W^dOSdvonl_PW^y?YB_GsC?XpOKs!_@F{+}k)09UlPC(K`AM;YR>^gKCskYMo%UMKsa*6~G +4E4qg|b;1j_jj9gtH_*?tZ^IFz!8F847oQSQ!1fNgr5{%-Jqz6B53%bg;U9AGW$X+q+Msj8!)*BY?+~ +Tkq`_J^y`8Ze?2}xGf}&+A;~LNkM{N{ +6F+iekusMd%>bJ#d6Q3vF0uPBfwR!)ohVYpYsxH?RIt`7TVdo}n+-S9PevNiA+^_z@P6 +YuDAG*mES5i_fWzc8mt*gWHqm!)5Ty~T8tP`9b?q +77j6q20mnD2nJPA@xGzh0hbJfYkIr<3sxg>demN!xMQqAW&gj6<2yYW2E)NZV>}TYmwMGV;%Zc+_g`< +4^icY63rNH!^HM%_aMm<{%=Sqi-(hYm}N#K8wqUMsAhjrq#K`u2Wv- +(nj-|v*(Ac%Id308k@9qn}?e}hTmPrZ+3H%aEDwMKdlTh?sP^D(C8>JXJs|(%?x%HmcE--)8PJ*Jl(U +T{&0sY@bk@3+SuS?!tU8jV_2d25cbx?UG-k!u#nkPfx*-LdZk+uE|&cex +KxcNX`qQ3*dinyjiJ)w-2NLX?}X$u224A6Pr~wi<;22SrYAeW2)bcuw;0o!AFXkTapaB_{v?^QZs-6 +#xJLaA|NaUv_0~WN&gWWNCABa&InhdF_4uciT3y=(q*P`;y4&`7>vrAPZGD>9IkD5ddy}k8 +i?Ga?BDDl%TbtYe{mlmef*>f#j+4B5&(%3?OcEFjW(I?q!2oz5o)xo2nNBV$@$~VNKM&!5-{Akg6^Cg +FA1`FS@nGYDc%F`Bu4E$Sc_K?uT}ZJzi^uSf{xTH5%TlF9E}lk@MIQ@n>Q9@4zW{_qF&EQ#A@ZUUb0q +;ps>FGkNg;2>a#o2n7vo|&%hEU>OL3i67u1Xf5&?+6YY@d*6+`J5%Fp2G+$|^KiV(i2s@e9VN7vWaQA +~(NMLBttaUu2S`N6aO!{hxeK$eQX&NHc$DCIxrX$jptTZniDxQyd7z%YxiMNx`)QcCz%6^QF~nO12&8 +46XLSJ!bV0ZNjps!Y%3RfA9lGw82d07w<*VsrOc92{?opLUNAj)wr_ZwDv89=$#hf7^ZaYWMKuVE1VNf_;>N!!QtLeNFWn5BX4FU;txosNJ5z)y^f`9AaGtVLTV<*>3KSae&v&SJdt8 +jT*)$r?ueNzr>R0lDnKs*C|Np9tGJ>!txiQ78=IS(8z=DQ^ptv6oSq6G_$7kvJMUBl;1uETJk94fV$a +Y5AP>Z>EUwZ-s*N;I&#Hk|EN|bZJsmOr`^YMj<0b}4G2oUgWV+u@9bGcQ@I3Xr7Cg +K371~^=4X?2=|z8qA@C2X*iAdFK9{Y~KSSr(5aJXM7M%SClj5GeRtPc55 +aW@H@u|Qf_}5Ut8|;ATwU}ZDrUgimDHCUDwTQ$nP$8>;Ie_AoB<>O-OrSG4j;B)Oatz#$%LTo_(Zwik +d>#E+Bobs}9HYqbn6pR#Lv%s$b@Uw!xh#XeP77?O!e)z!MDdD%E(&m!3AFagE%_kob! +Y2LqMj;MR>kjlLlqsNpzM1)#4HNN|YNxJ4Vs6%-mGYf2d7@ZU7f7h)X4V5ZS{k)i~Q5kDNDN5`J9)NI +}W8sspJVT{lSIn~X8)X$}O^7YfF;(OE{3e?Bhe4?TmeJA}vWw6K(ry~@F4P;qUhHyA+0Go=k5`{8<0b +})FYGGf#SBQ;%eUZr<^N#U;eg=YrUESE&7`;9`_zzGIKkps956G+(X0LE`@6^cBhWnihr2KKp>nTKFkUhVRPAkSJlGZ|Wt^*wWv!x7gz}$bZ?p7Y +s4qy-AM9;{-qo571nwLL9&xaShtN>lt093v83i4SwYB{4@Ql*rR7^qY3e;fRSnHwqO)j>@?{Nm~0jYA +pWA(ZTf)661ab``O71yA#P)>#jOz^~V2Ac0uc|}RNsWEU=)ooL=+u~4n8A@K^n`q$8nNZbM|NFX3a8;H9kQWlpme!o$*;IvW|Xpd +y1|_R)lQn(1yMKz*h=vEWls|M~Gx4f0D%<@&F68A1R+&s_jk_S;7}`%}{(R{ +#F+W!%(t>8KJ88rFaSB3#MJ7)40fymmS0u{ZgViArnxnxCnx) +_4gsA~MriK>fIcBs_WD0=zxl`D-NUzoe)Mqgwm)_-Z6YVhxj$4`y6XZwGc|iC7 +NjyLUtY04t@dd))*cGYK%}Xk!RpKj5HFxA-@GBWv4X#s*qFfRcJcYg<-m`obnscGq7jQMccgVpU<~61VK$Cz8ZkRO`|CVFf^IFmzd7pr-OBZ1(Ew%&-u5gKXNX{&};mKu+0d~_!WpOYo +^OgX2j>GsOHwxF(zWm8nr=V0HnC+S$o*mV?o;1H@|>ylctp9pYU(_hVJXvLw>$7sqaX~~(QnH`saAfT +ii9Fw?;$>AZvQPz=`H}Sa2(ClZ&j-8_zL-?-jKJf=@a)NzczENh +V{%C?kZHv8@O>(3%QfV~u!R77D$btV(B@?vKGFtq79!h5EITpMu^;uK~Ryw+SVpC>m%2?LuSd1cS2y2 +DR2Cj4Od>hYmPgai@aQ9YNwL&(5_{c~dPSfb(zRIGUp6Xwoc1@DP<)Fzu&3dgM=N8QBjgKgq8^@1VK7IR>s2%9efxk4MM+>0BmYb= +yxr(<6UUV1zm?9KSx^*Fheq6>S$&g<=LG0s2f=!bhycALD8KucGeCE#T*=l@g>G$xtU}0$X{L*jkH6)zaz2SeS=mqLrIgOMpW)GbyZgwc>R^*$%={w0lBi>Kh@UZ1snjHwaV6F-5fwIDWMTOc=J#e#;04=amZ)5+JGQ5b>F7b9^tgw=0hU4!Whmqoa6sEXY3}$gY#u2MPD_2u3>CX1FEskCEsZ0$4a(SV>;Zt{N +ezACyd9I(3r}vb<>JcDmNm7Q0IZ03JYVArTx6J)@+vLn3cR3NCN(rW@wKq{gy+XsN0e +J3pf{+-+dHqo~7`XY*QI%%Q8+ux97XHLlSq=Qe#OoZ4^)4N?o^2WC}^VpiyJWg1vE +1Tiq=-`VGtjq+kpfNiUeiYt>B{$GN42(rNYZs`zI%VAKeErq#Bp$3pv-N4Z^q6Kn-&@&pax4(0E5j+?@~SGC?}(@G!_k&g@GYetx{iBgM3;IW|!XsO +3dmS(kzVVx6$LxK^SVSux!N?%@D-8u#omXC|6^x{xDYGpgb +u@J@bQisfN0X*fbiZr)@v--PC|Xi@~vf1QE6pXY&26*2`s@$b9p_aR?o7IX&+qWza56g8n5x}n8}*c7Ef5-lr}=Q +RrT+0DhsTuP2=}PITSE_@t?DKnk6HqHNa*`W!DG=p=&GOm`S-Sl*z~S}dm;x3gi`VBs+hVy)+Mjk33t$w?@q4Npsn*d>^#2}OBpp(DQK%Hg2KjXAkhx?s{{g^YqI2##Fiq&>3t+KkgE;xCT@tQ+Vjf5FP +&$EUi%l<@yshg>q!2xO5JlGpOKlrU-Yq<*!4sbAJfM9yb_W)?|;OpK*=Mh`KSg +IT~yQT2VAvSB26qbT7rz*xnz~zdZx8^#8|Hw!_4@49M_(VwaN@Htvjd}m`szH{n0(L8Qx)0$vP%&?Z& +1*Z5_>0f*Z4Nnuw5}1W3!^&@SiNWv9)X@4gv*^QX;-#m6p7IcVnzrX$S97d&!IDmdnaQ&cd{1hh}%;Q +d_H$ul$^=&n_?Af`Clk}p;Z^TQ^8&=}N_NaG8w;Ru=J8JqNyELr_|rrY}XbssMnR>!5*2n{X~?pmHr0 +t$@vTZW#-vZOsdt#lJ#Z>V6VTtHRjv~tN?Dar-SZt9}A&Q0LB_LH>`Y7;(+wBwB3+TIqN{coa*LT8bh +UoTDSOw#5TlZXhPzl|Pud}XT_$~3`J5i-cAx>uRMqLqMOebDsPoxZS8uTkU=4;fTXSc>yCd{hm8u>=L +gYG8jjDQcG1IJo9xU@HgRFD2*zS~g&HK*Ns|4NqOP@d`wbmh9N>X!9Ja+fcsdAg$MB3uK|2PsY{6rXPR*0wfGAzTb_6 +0Z8{Ic0uxJ(#=to{5PW5l5VYdV1O$3RU{d+S6lZK#krjySw!pTj#eO@&8jf{{` +lOuq1dI?_Px=w3X|BrQpjsji>To61JjLySMV2PC&cRaSoGhY18=};mYTcvNN2naj(N7C#f?`4Ip%m_?Gc*$B4CMm#+ocsI1-I2^gQ~F}7x1=^nKZ$W6wmIm{ELdqg*XY?M@CdDXHL0;R7^M)G0(h +ygfcjA#iEmj6_@fYR&0w?@&Wa*~+5Q<11R57ez6PuV004oY^ZEdVMw9uVQcON2A4c-ht+6yKG%Wt`%=>Edh3dPUc@DBJz%_f< +GSIGi#i4u*K|Ow%~zv;c%`CS0nvQm>6&_975=()jv-V +NMnJ{5ya_2Amar}&G{Ix1n}g8r{>%AU2D5r#BH8{NstD|vIVBr}#U3F$fSOqjEIo=48F%HbdIGZ(W2{Xj9B2H}TiI3CV8)VC{(q$XdtHE#yUUR*tq={K`9JFwJ72 +~O24WY-AV&u(u`}E*wzbuRLbelJn96UPGTcFv7Ztb5G_H3jMZ4?EYsgDVap5YGuJLJ+ +EE21^dNfuLem6LWr$sPA}5uKvgd;<)4+py~k6=7GR_eGlb-6I%>!Na5m%?1Oi0vZjyg@$`QJfUnpV@Da&0?Q^ +eXV3u@=P6ulu45>TXV-hey&&3qYWgX!OqgO;nq4k9DuRU7A&n;0Hrr8+O}~imdVL77=-l=RXsk^)idv_n&v<_DrdF$M|rvJL5vcJk}YWwdyss|Q34TQj_4j}bXqN!WIfhvPd6Dn(Y#8 +`TVP_}mthlH*t%zm*aJhC;o&USe1_(A)n2b2P&Cw7JqAvt@Ws93bc*{KWID +?()UGx(!h%d0r32rrD%Taej*3AES=yA#OD^bgld0Qe<j5}-!m|GI)d0$6y<#z-(Yv^c0XgIPN@yGu +D>ei{hRiT+LEk#?{Y6R1GfdroLL(x9h8(6EsSU*v2P&ivysC_-iq-t;4|u-c3}>^x3*UdvGp5wM}{S; +E%wf5C?2HWbCn3nVN>`YaJaz+Q0fy413V9Cbm+aGhqXSR?2WK1=R@Mvyz`@>A2# +hP!E<3u1@J3>Awi_`gzwMudrG?@$@$g_0bBAAJ9TrysI9IP3exAGs&mILRT>C1Qs$M_18?Sz~JK*;%R +ViYYx;ZV06xb`J2(^K>T3Jx-XqwpgYKuumY;Nc4fayI{4=fIEjC|T|@5gtd#L(d-93B|h^3~vN^dtTIqy591UV%H5rL)rn7Sa2@({jr+&^6mK*L{ouw4!T8ld_o4RKGoM +Ye8^<@Z9Tx;`!LC)gxUxY|PZn{pGippyu}a@Sf&Cy2~2E;_s&kA)-6xN{M@7!JEhLoSrr|aNnV)jScM +g+EZ_*&s}=@#OY~cm-OvBx@>#;-8$&)Ho8myp1yN~QkOCix(M}U>E3Pv6jFS*2?1Sp`B`p{0s(^&ZSN +cSmb2CV>-EoWc@1mu^*iEh%?dSHl?&fi`jxl()?G9Ed$WbUP>Mk-ZDr`=H8IY$5N-sH!BHX&p0MdIlE +E`=gw6}w(~$ojjM2WSw@B8;puW}aH@Tn{jbJpO!%Vf%mN}3?3w~8im;bZ}MeS~@~kR$+AZOaCK84iI8CLU8Aj?@mv0~X(Jt?5H?9^qroye@!9Yd8 +_4q)7=2s&;JDzb^mvTb7{w}@MO5`KW#t@;;h;fex=j!9cZ|h|aFRFG9O!8qs|Y)4FHt5UDO5)MPY?@|5WBiRq-(M{I_)!0u +mVA^LYvSrihpU8i_hSc`o^N(I!Eg{5=k?o)vLUfo4oEhSsXQ2R8L>)L-snA{`D0zJB;hFVHEC+zxZ=+ +)3lpHjxSC%2_nt*ko9^jB|Vn5CURu$QU*Uu4yh$8Ra+q)Yq9b9vPF;!wLCbBW0v3T$fh(M!*5wpFUI& +3-5&$P0r~>INPv6)voAP_QrB!LtS@c=5pjViq16Kz%NL(5K`4m2L(d^G=SML!ChJ5L(s2tCv`b)g+b* +-?y-Oj|5fT765pzWUXHE?9evS0TTi&GN(e(v1LWlm1)GSMJ^B)$gJMe(-OF?LQ$C< +vrSWzy}>2*;in9Qh7>3AYy1~0MzG+<7qh7PQ0e5p?@OC+6Vj(3tWqfDBk(N+3VYm?61;N1f}TH3pV`) +Twor@}L?PCZPHGHi3w$sdSbs*0`ezWek4-Fnh9cLvIEm(u#$W(xE-*#E%rUFYD&oW&`0Lg=2fX`y;|L +5aDw`UX*V&FO(T>e$@ZO6L_CVdVXj`dS}*_}6)QgZaWmcBS`2Iner16q%da^;I&sZGa9}$E|iGDN*DM +RnS#xp=?-@f~}0 +cgPltHk+VQVNNuDcCg+|>iHGxn8ldfv9vqxw>2PtKkc|5Z|2Z#c=P8ioEFN +E~ELImns&PESG&J03HkST6r&FEolH4N2qwk2poxD?!Hok>A%@DO*Ueh4<;Gn?GW>`{I<7l9Fph-h7UM +js7GR37&pC}J&xrQdwNlsnc#J52Pp`${LIqWY_Ygzuo)l?O^aBL%;m_k5p`P&fDFoM=98V{AX2kY;4h?Y4e=81%imDP^2-*?Ot|Z{l_;SS5>I1MLmXc+;qfux=(F3OeZ7Sk(Q&fTvS3B>F8k&vg-9;WF-={&%p3GZ?DAo;Rq27VU +fW>T?o4-X{z|H=^#-{eO&Gh(Iw3Ky6I{KjX~K6**SEjhn^OHj%~sHk=n-0h1kkp +iSi---JtXgR4!jwKp<>noYGtSB0%j6^SEmu)X#n4H&Gl9R6hoUyS~hm +!huqJ<;URKmMdAU*kBqDMEX{Ch1@4H5G3LxCrg1a?15gxWoMmm3^nsCHdyW~2?_UI6n8~+e4#iO!kMT +&eeY|;x_Bo)+3VOy?r=5aKgDjeu)G5XHi)pSPqEW@A&T*MUh;T)B&)GGPs +V2UVH}4wUJq^h04POgK-#3ghmGYU1++o)%iJ;!bShJFECP@S0c2L=4pffTECdM=wNfY}CNfWaoGo0al`eo0;5 +_{;YQJ%i+!*QHLOxEX;7*;Qf&BZJHosL+Xfx +Qg{nkR;RA^)jmh}DrCO9#47X%@0Cj_9I48?3DFTBe)e>}hdBGh(5_1gv`5&Uz +mU@?YERyQU`oek;`3RA_6|aKLmAqN>T5Glu@jK^$EQ+QUe2{5<^erWd;mwTMBDkRRz+M8` +&b)ab@DO>tv`}q7dNcuE%+GMk;iEh)AFD^)vqyAlmwNQ%o2Sc!eQDgNgGNZ46>?8OQ}X|BGX~5%4o7c +elt(U2aE!!@j`(s*1Ull)pD(=JTz1C}c4U2Er*&AlYu&xxFY3>sFt45LAD+N7UP!pV=gp<9mQ2*{&Gz +=z6K5f^Iq^AxtFAq#D6kWGGXv_P7ocdp7Y|eK3S>ADt;TlL{?{5A-#2cSdb-N1b+-1m+jzQG8&6iX(O +8-E>v}Da7fo`#21Q)f_(42(8r#^=gB0qtk5{X&(gw3f_a!SP6H0Z%KTz@~vU*PM`sP&qfm1M2@L68Tt +Z&Ni?f>-pmqw8|NqCc9X$u`!pzo&UEk?gN9zM_kUeYg!MO;qk?`T)&#E=Fl`_5qvJDVo;wxF>F+O)_v +2M!#>U}TbNY8mfsZM|18ISidQ@13U$nau#WK6%w{Wvd-t9@m?7jd;um(Fxk4s+>!W2Q-eOQKQ4!6W^J +DHeN6aj}hWi^Iy}CBCPl&O6Jp<>ht|fc=kGmpm+W>q|n6(Z!Y9KL~gSgFmYk^4l#E?{2$dD@?k;l87< +xzH>ZF(=MyYD*rn0T@A_yLZYcz=qp?8hK)<66a{+3o5mOiCJjKHcS$-)LKN_Lbk48Eg&qHA2{{c`-0| +XQR000O8B@~!WE{%&KemejF>^A`b7ytkOaA|NaUv_0~WN&gWX>eg=WO8M5b1ras?R|T98@aLP|N0ad> +3T@o6h%@pEi;z0ipQSOITL&C*hzNR>+m$mrqnUn&0#n7$Y$?n->Sm<(aokF9#8Ht_j+s+C=?2XLZMLj +VUNAamN%>9{Gwp}Zuc4cKFiMMF*{2qot-_#eoQ8Dn#WUCWbCK+Z`eAW#w!*EnzJp(-adDNcKIfdTot@b#Td>h+wl3DIcr;?kVwtT9=uvTK)eq#qD_9|N}p>yK|sNJyHI-Ouo^ +PSOzei$WbF)D7BaSrvG@Q-$Dr&!$#cNlz1%dmNtp0{@5>q)#U*xP6kzh14f6|c37^4zBZoI-8UwUU~4 +S@@H_1#-}9HohrW$Eajb^HW&ds2aKnkOq9&QD5d#fTs +o5dQ*xfw>~N47XRC3aXL++6tvS|UdUSggu-o%lk;gV{!M+k6rDlBnwUW_$&)lMqI42B$Cqtiv0 +7Fo-bNGu^Wp_NZm}oOgeze96()w+SurR%swi**S{kS4#f9HfpD9_Rgt2O|fHLxy@arSpfB2r$WiMElf +t6$Ok4ff@vj+Zm5fuz))Nad_kDw#9?+mn$ +x6ez)bBpcXpg!Nd{_$NH|Ih#2j&msARxG?^gCq5?Z&~+x=6q!DGEG7K8*4MrpGnM$3+TyJmNxLu)n}Xv{mwIXbrG*(GL$U7PVypPj1;YA;v0 +~}Xbbo(u|{DMC}*5Kz=~QjI+JXj7R{DDbU4;1Rhn{WNUdKhryC7v6DH8ApeY9ODB|Tw&z@xX9eXJZMn +YyCD$u{KE)rPT6VNiKtsA~c;`x*%S{>Pw6CwlcPv$_DjXq>WG=H~(r9Vl}|D0SWX)_!DBc4b*JR0Tmt +jK9G#4+Y$_(MEjf=1GKVbx3Mb8!)~4E|U#>eVXAVFk&c7&!zvL*pr`k4EzXDB?ms8pXeiM&kRw#Voqa +k||$YNz?`MH_8NqY#dJ_a2sGO*ffiC)RYS#Gmo`$8JY>4tX9yM`3<{?3)Z|SiskU&V7xxhJ4^1BWUKR +oB+u7zuiHK9x3pRiU(Gz8&)U3Ots1jn$EcsirS;=q)-dN_DB#zQXo;6GEe9_Jev;jgV=%Z**+tw5kiw +KBY9@a;1b6A*yu5#NGVHQ@)R5mjD&+MJjU=**zXp3+Au~||tD20Smv{6IjBYawzs7hsiEWT3k!@K5d6 +1F2C7*n>cFunK>(P&|-+uq$2WbAVkN+O1f5S4VEY>OC2mCdfueqz%)PEHnp`8kS%jj!p4mT9E*FY;Jw +h|rMIS8_E<6;rzpYK98JznavC=reGV!sZ57X|QbvuqcvA6vBbuxFyC#AL$EY#?YJU +@bNrdog1@6v@v9-f~4>`(0gbT3201qp0U>nS!>#6Wh-O!?EMz(>u$jAvV6T<&Xaih2T3yLiU5lMEYpu +4ANJW*GM^iC#>jJ;Ct$m|l*VFHH@-nljMno)^y6phveA{(luC-h#(p4E>YpSRSr?6!QB{xI5S10X{aA +G7G3}^;mxNZ1m2jg~>iUVcr(@Rsu+ +$3p#cOT!?9vAtF3uy-p-M92fTKI|gP3kF+>9F|bY$0pnHHmns7Y(pNl)nCV!C=LG2*%HC|7PbWE+G-Y +Q>Hhi#TX{=&4j`Cy@&0#wn;U;~Yq&!#;S}+DTpE@Jx>X8Svk>*wKQPZxSc^dk#7VV+hyTi0rleF%{zC7Xq(` +yLjqP?w{i&d=b-xmbDqIJV%Vz5T*^Rnp~HfA}JfDcq*qMNLMtb^hEa1nC>O>4AofDk +$egkiQW2qR!zY(J_Th%uq#dDbKv%p=5>)}3?{{Stj5Q-MS*@)X|)#~R}0%wn@6#2l{4eGZT9XGbYY%d +xtiwb*RGt~;jYZMb{*|1r5W5-X?lY%sWpQ;YYp&QpV8ZmWN+~0hjO5Xa+JeDSd6kIN-mm@L`=aSQ5k{ +F7}YQX5PYQ%dset)rExrsr&2mdnVpyihN`g+k#05)ge>?m2mRb)FIj)HAGiB1g~cXIV+KSRFuX_#jF` +aiJzDLW4wNxA_?;BTEJ>#_h9bh`%6rhlcmt(iNz3D3)-j$VfX3z73LAosuAvhXiqn9k_f9SK3+ghM8X +z`La&nK1O2RRamH!t;*G5QL7xX$=tQST +@)CQ&{AQM$~sy=Vh&*nAUVV+4!_OX#XKu^Shm-zQ0Nt^gxJ9KpQUxL!NOh}gPvtFwu%}c&sETUEN&)A +t$#*pbjcrOdXY>>v5A3mOgAxk$Yx9H{T>j(qDx?3+_zNE?3EMvxur!{)d`;-Y4NJ4($Z)a7*jH@HzD+F4h@ti)xCmr-<(ee^UEb +vGqnz4%q(@4snK4-CSlA&X^JCgNn;-CLXgZX;a}CGJsXkj{OvD+6C@dtXDjt`#7z0h-=m-|Y5%}=4PW*)RFx@IuOSh>Af|ni+ +Df(omKmIs+_xAOB+nkI+p+0N(X+DpZxmqaWoQMBlhY)gyf6THa2G3U6`uxH?@x=KkXrXrsj_PE+TH&@ +3Ix?PTlh59&ZKzz&)>Lbq8#Ig);$^?A(hce>p%Oo-y@p){1{M6dCH90l6CX&ZS?i__Q^0 +FnmW_8#)EpbNWZ^)J|V%XsF{dYE^f1rUtzt7ps^g?+_I~7Bgr7VXuw&$j({!v!_#2eKu%}o;D +(2q8SJ@#jk2*$AE$(jNKf~r++8qfXKtP)Bb7>7)!PIvZjpCWxS*o9nDbS7WVi8Hw@w^{x2#)21!8HX(+x; +5aiufkQ_Ob*oo$)G*rW0HjWQ~`ckoSY1#D}~4Bwg!S;I9N~TQ2v%fr%b4+pk0^EBN5}$lh)$WJ9VpBc +*N;e##9oRCP_H_o-ns%Z-}7aoBjoTN*zM>_DW5^aiAamJ?>y8xVBQ#p#Y7n?-Vs7F~Mm7AZ5hhL-K)C +*fxq{}4v+<0qL^$pd*-e8{}&;6!({@T?$@k%+x?e0e`zb;(ed>%1e;hp%&mEVahj7akU(2>+ +$Z)rW^rV$bmWExQi{O@WSfyuWd9lCs-dj=Zph!BVR7f)AHyg@{IJVT3a~^v_BqbJF`jv@Ma^%R7)+s} +cO6-lfg44XK`8Sy+Kt&DL87j60RAA4zPa&Sr_%^CQRxVLn#^V~ZGQL(IZPKkwn8P-4t`lI5V)S;{R5<}tqx&!8`V0y$=l3xfnnq5SoXUS4(8tE)>o^yd> +4QS;my6ND8h5y8(9;`UU9wy-E!IwmA5~XaWMogg`Xb#%$exudCtlbh9@inE^tQKa +7tT(M{kRafyGVIi(fU~Qf~j6a5MUi=RfSiCB3xPHaB%~;N}DH*8w%;<=J4(=c=a@@-|9zpkVO1?}pr8)UBo+Ps*o?@0>6PG4 +lyKUSSDZR=Dgw6XBlZ$xrnKCS-METu`$g><^W7N*ny#U6!-F-A=P57-P_rv;3995grBp#{dZ`YzwcF2 +yDp_4k1lcXyo(Q1XbdnpQqV~+-_cv123<44nn=ht%9tGB7n$L+5>ay)$`Ja}z1ps+r{@6c?^+nbJPJE +77ZEQeUjlS+ZVYtjmd)OTDlm8^-iL5M)0uAtovS0Z)yELS2E$aHPpYFrKBY&D*y6n$;xHiFj5MGPI9> +fz>DvHX@cSEc3zuV*W@axA=Dc=+$~3NMhzPWyj^k{~lbYZBY^G0(R38R;Nl@oVqV6nY{#>3K{@z0A{5Ly8M!JZSif +8y%XobPcWr$xh{AH=K|b~Im{$Hkb?hwiy2LMaD)n&9CIi=5=Bp{a$mS4wwfFILt}0kO+8DENJyX@+jr +U2kxQ@&_%-&APQ&Q13KXiW0_>z@;U=AVX>Rb0%e0jiZLoE+s&npzCaaY5g9CPK6`#fhFqRt$Y#O?NOI +J~}()#2__z)ry7))n@dtC-r88@}gh&KXe(6fJnBkxwKK2EKek*gT7NPzFlXr4?}_8-kk@elNE15VINt +{V}fy0SR>KSoX0`|)l)YTswG%@BVV{=aQ%9X2a1NQC)MusfOv&%Tze#Ri6yh9%PPd4}&KOJS{`?U<}` +@5aKDnrkzHBN4P0dyKAT%;(t^?rg*yVNVYBaoN9$=X3mTzJ^xT{4nn7A_08{pC)b_RPqc@=i(Gf3K#` +`4T0j{unRROBJxIC-@hJpM&G@Db@u1eA4lJveSh}heFv|?FVQP6nq@Uxnq3UyXf9raEY98gz0LG@7G!f`@qY#!m`Li^0p2|$D<&p{aAYja-moyMIpxv(+Gm&Iv} +Bt76s;)S73kVLQP-tZa(b!OiX~C#is^BR(GmmY>aXW6*Hxl-De<|LZ}Zwa-rb-td>Z!G|N}OzLbr2Q_{hMN2)~s@KP4QgCH{>o@jJ02Qz>u55x;IO69%7@(!gxpX)xC>$8I>28-j +CAr$cm$%S64>E2W)eBlV#3AF8pFI(bn6m@A^0l$KA7B$N)Rh`B(9hEP@eVHTMg|y4iB*^8W^a80c+ +VywB`3tDtI3!(c~iLiI-oAwgLHrM^jDR$wm?3U^l#pbkT{+1Lt_(UT*XxzhBTD$cU9Z3jLB|$qGNoUrZ@B(oUaE7B$dj(bpg{pm +w=Bi#42;RO@MYuypot~w9`BfD(H4x+a8+JdN;e=}uFbJX!J84p9-eEf;nr8{9Q%1KS{V1>9Gjo7&rz< +=otx{em~?(9cc#50@-Tr=%M>LrTf{FaTcR2->Ng(x&1UVl|;8bjiWi82P6f!hA +D4K`7lOf+nJj!8gu7~zYy$sWsEi|2IqyTJGd=?Z>rVKUq_A6M28QPT1!R}Bk6e1A_fM>3-OfZH_}1pf +EApZvTP>r3W}(J9-wXR!u(cLz)yHKCcN=*6a +4ji8ZBewZbwkqqvZPU=f|(^PV1ieA&?$bcU;Ur*!mrS0c)_(5Vhy<&DcQa#LXtBp^gLPLPI#5{0}=|C??d@#Ta-V7@`EkPA4B= +@&DBn)Q&dt=4`=}z`i_iivt1TjnBwgpit*cI>uy3!Dn~3 +&Mxb7>u*TAnp(OG!FPiJz=4rZ1k$Ep1cPrz_P+-6lLeZ#7WvATI&#FmGR$Gm9l!l6+SI@z$vt&UIJ*9 +Aj6K5?(n9b~aYyvUb%GGsK#g}^<7Q8sgz65Wu6VJgSM*y0HHM(`~n_eNuU6i>K28rnFT2^fFITW^$)b +`>{hX{T3V1S+2D+)Qe-tSK6iL#vL+4F4;*8`>(5mQ&Cks3Fw62VL(=pIaas7&sCfo+9t5eLFu=?W=!# +@mg6bUst7xQO+K9Wm$Il*4?yH!cgDT;*MN0Qt#SKb1TA$PXM!L` +FTWWEQfZjHOc_-A8qf~;Egel(%z4!#{7)|cLormD3k@to;$@4z_N7(d7Gfli1UtU4AUfXl{lxU=qCVxUpyW(fXXAv_2qjyqJZbS9VV~qUPYImF$iJ!RsMZQTpu}U{;}G#Q&*e3IZki**5BsCFwmjhJ+g% +O@_cr<6Y#h(CD_W$6UWaNPw*}83_In%2z1)Ia&+Ss}bFU2@44v|A(IKk-vPN}XTYS-V(xoiugFtYR|G +ZC&BqDN1=m+208;^wW`y`l=gjcGCPRl5{ULTF4L3t05FO&*jf^fMM2*@rlu&Z$zRHsw_}vQSk1z0PQ +%z`X6ND9rkB6h*wYkfit^I8Soxm=KF()bP0&#Gacu_4W9Wn$7c!Kfx3(!*97v<2*sP48C`+s0a^Fpu0 +v+TOxES5Vo870?{2;f<#LL{VEJV{)@W@D(#vhQ@cZ3MVS=jvhOf&x(53}4VcLXzFk25wH`9?cX#i8u2 +2$z7^Mab7c6>!2D?w-g7PPaE;k@T+(P_H+H!^oqHj*u^RA-c!b-GCqfdeP#J{Ql8PgeNm7x;K= +rWZzjFV^=d*O0amPcjAd<;F8s*T7n@yhYPd<_I=q*tc}*qZP-T~R&cPJ>R_6SJrL;X{xxpC0Un&!T++ +m1;?0ykuR2G0g+Nr0A-^6Q}W#5yhe}H!F+Bs3+|Z=a2BcDJJd)NnlPo(viWupucBvry_ki1cnbw*Gg) +PVN@&A8R>XY(~S|hy6GRxb3kSjxqypQ)|?5efMorAPxs|)_tvH`4C-B58B%OYl5JZePM!dt$AXIKF$j +#=JGcx2wAOht#6V?sQj+g)`GwWNQ4KTLp;zN+Y_7)U@nBoL1L3ZYuthbULUjdIO;T8w4%_4jith8YB9 +BZ@V?yM@YAU#4{FE(#i_y;@594wG;WjgGv6L)w#24UG8<|F;!k8}5xIUi@CJo8Li?X{9t$ +4XD7bg8t9iM7#n(B!gvi>1;v%KC8oj?3W7ds+qwd+aM*2VGh2o4!%?N>#4EPU8uW2*y+Ev3ehi_8Z9G0iOe9Hm}R3?B4Z_Ykda#soZ(a-8g^3eh@ws9p4LCeK?A;U^ +4BM&WH9#>&&0*HI89pT(pdA?my-V)+c^}8@=Qpod|M1x%>vx_J69UVm&aT^$Z^s +ltFl#vMFIe@Yd~*!QPdv1ze56miqBa{>Wl8U`)7xe1k`lqJwc>K)2Y|KZT?k%kXpTd`=TYtC>~R?IJg +T~VQYSy#?de}qit7{^!#9&eq(k~P6ywnrS$G%oec5fLWLh_lxp-YDyIcUy$s9%ehI5?j;Jd0_?V!AO}I!$FmA +X^0fb?d*`ORwdSXl71e+b}O3S(#|7+eIjso!79S|G9()FqyF>WEoG)Vwx!f`#VWZiSIK2m#FawRL1rE +RL!yNco2c*JfxRc;+15Wwqy1!gd9+WUqS1VR6`vLtm*AV|GMe?6KFstYO~G1+aYoDJZM{f1KNgeesa$jP)8~ +lcKRrfpnieehi%b_2|dfZ@>TWgT|S3ufd1gxoKhjc%`hc=UAe?D)An{omuT3luoTS3V26kRWa +eqzYIp@9-lykk@QIS7&U3F^2bKG8xphqpwZGiD$cge8qi>+A<(2s~hvDYfy3`a?n?vn=FvYtiklcYeoh$RNRbrgCA36p_27` +ICC`ko()&bR|wlpGfhL=B_48Uwps-1d*HX_kfo?b9u2Ycee1yxZo#dvBa-uJhCtr?zpNwjr51r}3yjZ +gJamq3%FtQE^(s58C!*I`$?S>s%87?-$f-5Wu$M{2SE!HBl6Vr&oQv`$QT&)Nd4An0TM$58tj5RGGyd +!+8yQniX&gMA9=Zv=nm{s71+BJB4&y&;a!x*&g$1&^kNF)sqVNGE`J+KZh=aXKNK9JNPd#rbaGyf-CJ +@%~nrk*rE0y1w0uPm%EM&v~758mx|@mOwVq>wg!C5sq8b)x99drNrc5n+aM*twt!iVH% +xbela#~%<6)|NaR`zLV5|bjDn@Hifwc#m>(+p=0QHif3nmy`R +LT&`9y0vTFQ+kAbS;hb0HW}x#L=83vM)&R|d&X}D$o_roe!{ciMz;|jD+NN_BrXm_yDdhq%<{o(+V`r#Qy{hiPDBTjYHieF+PZeuDZcU395=rCQv(l+K(m6Lviq?&J7e)yMCdMp|G`}iG* +wy_E!EgeRq`IDIFdeu2|SeKHV#FJXKMt@47V1=to9ui`hwb;v~JxqJ?!4rO9 +$V$HOBPzttPTxa?`k23`&XQ#2Y~#nETz(rDB$Em9ejY;Y8PlOpfqD4RkDIAV$N!dz!R*_Q)p-%GI5_- +1R{+_du`op_fU1D#IA;M1)=eYZ~jcG&Ot`u(TRkDs>O_(}!~AGx4}>x&#zw1G=>S(~lk6}+<2TL%KpX +2z?qfmnb)Z|$3EuV=Gll2GJRhJ*3_VcbBe-I*-y1PJA=noU7M0Y2qDrRXJ|=)#DnUjZOzVhy~KY@;3t +d>j7kpGTmCf4=gU^Xxn#sOlZroR2R}(?vw(!q1}&oBCT3pa9yzH>`YdoWjO%A>T_eAMzc?#w5fSiNy^ +s`{uJjiSHD|voE=PQikux3QE$Dud%91*h30R*(TiUI1EJNpdp{KuOEln{Yxre2$TeP*u-nW5Uc#F7d( +`0mm@UMz?VD_J5JJQbrZZeuFuj#i9DA_e5Pb0gFZnWe&HORu>V#+i^omhvGRA0?EIZ-2cNFJDbI`yQ3 +NhUM|E3XZv1yoE2$O}%-W_D6{d@cJ0C&GiSDRdq1&g2$b)UqT*>n!zfH;$kxhCB-hmX1-%uK@A{S1cJ +?uT})lZx)Re04(4UPZJC8<1pM%#eRl2JG849OVHDVXMR*?e``CNeMY@bIvEOWlyPYN*Cnm7Az(X(>GK +KfA3IfEp3gVlcK(XA)}C^vC6nrPlKpB~D_K9J-LR>v)bvyPcB8d{>|r+sLk-+>9x`&9gF4o}sA(?^ +oEIzaSp%i8E4OMRTqaB%oD2TRC44c(e&W8w?#_p~hvAJ$afyhFJp1n>f41ZHTw;K +6o38J$^97&y3fp573L44N=iR01keTg)aa&B#P*BoC|1%VinQRqS(|<=$-CPNC@8h3>EK&Nb$}IPR1Ew +ubw%=R?T{2S@OaW{OnJl0mCLk!NbpwS%o0_KQzZhtT*s+$=fEJBXUEpn`6mYEp>WjIbk2wDqrd^kRZ +?^a+wB=bF3awCC|%(gxQW7{dhe9&cJP0Q<*kc)N%ST3EyQgFxMi2MQqwIoJiYD@S^t^Ng2(^vu~#H%u +vqIn7Ae;FDzX8xEVJ$T#Fy5SkC3%uY}&9W&kXlm&WX$!-zz0_m52b2s!7@pZ!SuK>i&)z4CWFD>NH}2dsj$ulFIdE<*RFnio3o@8zHixmg6~Vn +2jH?9!3I5vy>hjXEOp~;koZL3Zw_Y&EC5`lzSp*51~cS-)9o}goNCt%*I)?o +)=;SDUg@j!F>AM>BQ8B@AT0~jT2LcLahT+9iEX#ruv(Dho<534|i;8((&&F$f={jYLJpbWO5BaT0z{! +p&|2*15Hsi4yL1AZ|f?htC{QNa&Cur&G?$>DwGDOROveBtH$E6F^cAe&*brI=={}#=(LvU%4izDeNY} +DGHw->#FeZllHJH2n2qa2Jd^@BkmEww2LV{_+sEH(1=H}3k2)^@*s~Mh%D~(IhT!}hrCQvIO3O&-Ha0 +~X>kpe3HoV2idDmKmUe-Y`6T%fWz74!$_|1v<)t6o(=V$n0Q1HbCd|gQ6gXeL9TLgap&8;6EvYPUhJ* +wDQRDJ?)BU*j?bu$jcMX*rf!8UQy8gi^m8$j)~ALEd-lvd2X<4&vjY0fNvlsC_@+fEXb(~#!E*H!{k6 +?T%ZATU*GYir;F;ccf&jX|vF$2Rk$?7dJaQFk0p(f5taN2gj< +8mrCGP>i3UCB?XJ`rf|5;*y53OoKzFc!d61F>UTAh?Qn@+jUr}W%gQ)nEGza5b`Jwys$X78#2&iz=G% +rsy=PtLmAQ(?94ZR+2FDw@e}3HQiBeB1OFiv%aOf%ykp$>@BZ@k1 +C%^g-)=z8IQ`SB?_R%&#uHeBL_9QvS0NgdC>tJN#dw`gE)2Me!54(9_#I&4zYV~|U2q^QXoP_@E&p!N +2s{)uP#^+ZTm~wqB0TWI#hwPC}GsGX)(x9N$X9Nz~6FB=^AK3KX +rJ~h-l^r?{TMJZQ^(Kb{DHGG4^jk+>ylT|jAcDDA)Gj$9B~26rFglC>Qu0TP{Mw#20aW{_=HL<)o3y&$qfl{ +l)<9nAWin`pU=(Q83U@@LHV2J9*E(x_UA4gfPk +^w@<42tKG_Fa$2v-6qO+Ne)}%Xf>6RgTbWxm@oln3Al%i;jqDvqd=S&;zG5+&9#Sx-i4SZ6FS}}z<`L +Y)^tXNQjPgE93$Rt{y71)nd#?aW!cam^C7H=>z0h9TiB9gVh%J(Vsw$nM0x?Dl8H;e{PoA>jW}!>XP5E8IG$zVJw>aJlG +r?}MU0*@JJ2V)7Ok4YAfG0kWotTRwwf8d?z3LG# +&rW4r&`@VVg7@-@-{XU2y39wrXPjTg7uy6Z?rbS>_QSa45ViPbP@TfP%4dXgkt~u5FEr`)(Mn@zgNsL +Z&kF!Sl#7$R@vnb(l~#iJ`evx_jx${kAPwb`xRUd_E}Sn^b^&=z!{K9=tby+O>|$uP(^yV;L!0)omo) +T`Ra~0LtW?v9EQ+?!SCdKzqX3^iiuYwEA4-As3wvLJ!b3XQ>u9ilNXi#=$FUgZAqo=m~BqT*CiefuSe%OuSqPq-16AM7MAcPi +(06o(9>Mi+Pg#bp_kc)vI#_L@;01?HD~$!O9B@8v#L2Db^j%?);<8t5k480Dy%v$*r5oM~aK&3T)&b<9HF!Pd%@;<}XjlDNEzwZLbVJBhZWZhWb@iXDm;pKGJTCFTa2AySW0wrH^G&^~va{Z +IcEmV%5>=%zRe}YbGp&BGJ69{fz7%e#?G +2j@gdmpU5ZM~9nj2|r-sVyY@@&&C0Zm4NhyrI +;#|6WDR$fJu#d23pLPP|s5hQ_ +CTFs%(T!ol_DYNkZ(BSm0t558cW`&L>T6EEc)xO$|MA^80Ztfp^q`kV%!F)QB +Zo|iSD?$Fe3#Ka)+7rN4VrsB(aQJPono}JZDW(E4{>TiYWR>{9ez)j)%ys)Um-RO6_z2S6xJRCO4E)J@~NByTq-DiWrQ4bdV{?q6E!$CBUpFP*J>@T3I#v9ULoQsm{fZ}L^(+3?~r^zpC475%RR5;^iipF +#m4IlNMA3nfv9zN~yr*;Ro98?ry-9h~g!bNZURU}sbrep2Hx_PVy +J;iEyd6)hvK_D8Z9sjKcoakz=l9zc)_}TKbv`x9NuA%Qd{!ux)z~UMPn4l)-F$Z#8UaDcp>4iPuY9?a +zP15W$GRHhcFh@6$QGcP$u63(HygohS427SjpnWIG$qsl^2D!Ha}M;>!Ns@WJF-AKba?la|Hx&dqm=~ +)y*O@&0@aQ2H{34vAc>S7jnFsvKT)TLPyY|Lfih~0f@Dp{GShm{IOyeKDEcd!g{c14vt#(VE71yX5Ie +^k6`H#=E-%D&9e1|h$gA(pvaE&h}N7ZAI#eOZf(l;6_Gc4SVKXrz_4QCM}*tdjoeiYT(8&HBiFyx%(3 +VlcU$fZGJ=v8B)SYTeQ8K^+3qbN(dDVgeM6#e=wS&W`i9PY?TF|#MXjXp8wW(M8ZB$6ZZC^%2q(KR6t^I$+xvVE-Ks-9kI7Wa!s|LoXTs%2-S&s6jK#( +o37hErK4Qph2)1Nx<^gZE*L&9l_mYdLKm&oS0iBqWi!+hsN#YK@VY}HUPSZ4zaOvDXP1!FdWV{1G<;c +pOt~S>+&=B3^)GKEdhInzB`~y_X77W+1s=kbK%}4i{&{S^62ORayYaiF`i)L%v#L(1TEy!I}oGc!NTk +D1I0S_fYjB`6xb;Hqq?dG22ckgen8h^EgW`-ibiGM7KhzsN29VsKkgOGTUn7>xiPZv1LnraCS-0*kiY +WWm|$^RU;@`vhlvSH9nTEfEKc+FN*uRc#T+_sApkj$2D-+WGO_9c}T-o3R`fVVM*XhSL6XaJz8ppi{{Tw)%`=0zd@Mg~n +{4Y#0#C3vgPc)v#ycXqd%GKTSWaV8>yzb6qn=&Q_8&i467Cg0nPhR!@&)FI;HNe!iGYo^?fsWvBHqL6 +3X_oeOp1QnBtFs}{WRp)2tw+;*;*G)$JvYR~Z*2#g*Hs~n-!ss@t_-xGR&}g_+5&~%u4qHa54MGp*E^ ++IeB8y&b$1gYyisM=#VW_Oq1|;=zKwAa+0EZK{7exT*wr6AcM;EZsUER6aFNHI-Qn<{e^_0j4`q(ZnK +42Whb}CupyRrG5%A(o$&7to_r4Ut|cdxF9b$*QuGf-(F1BQE38ddKwp(@=Z(L;2Vo@dAfl&4K=*w +8?PI(@iyBmDPN`iQ6~bl77B9-XNeiuc^RucR;=DRDZ%w^n~59&dXf7ytkOaA|NaUv_0~WN&gWaCvZHa&u{JXD)Dg?0x-X+cvV`@BS-L<+`F0O0k@_+q!Y +yI*HTzn%KG6-R?fuE71~VvzADer0i(h?%#g%0e}DqO0tu_xA(5vZ7h+%02mAggTZ_}=sxU*e^h|yJ)U&f&*GZCdrF^}^CDr6UBl%&uyz=@!X^Cgxou +K-YyP0HISkD>TjL`9K}k_aG*aW-1a;9@?C2o`QDqEBy +kBc%-MhGQ@LZj(o%>7UWrpYXktsnrxM}c4$1&jmx8X^Ld3I2^~aP!5*G%2n^fHF=H{KcY##|1tf#VOW +<(LBy_QN+_J!bqU^G~%jMRpU@pm^TXtb`tOPjEKo)g;ST#Z?4DxInx!_Mmydb!3by$6gdAP(lI|G0$>p)E +#e+JMry-I5~cG`osRa195mF-o88j>*33Tm!h?Q0>4|K_~G#M+vD#~1(bNVe{}kHar{c`AN^f?cX;#?F +@Es3x9<*4PQ>v$arox#>%)VWp*TEx@%sChhezLt=TP(L_*A?;d~_0zzeR%r!P`o-kJwm9j0PMbayZ`R=@WuD9_uq-P-@ki%d~yI?cnN@y4v${FgLV$y92}j(h@fS7Dh~b +%KgG$n`>$V9bNk=J7~WAIUmU;v`@6$$zC9J+9>0Eh01uxZK=1aSzdqo`j{c4-@%8@Un^3&mf3yG10o6 +MOIPa*S?BNgJ9?&CbaUcHw;`H$N2yye`_~`T<{6yTG9=|))m47%qIS9r6yTcPi%&T|D&;TM9>KqdosC +jh2a1iO(bAX{|2MXa>zCSsr`t$N&|2056!RqEz;^b}(2C!%c1Fx+_yL$y)y+^ +WvjwdDv<)jaWuJEDJ2uuq0RkpCDwu(HvNya!)z#lL2C?| +$JlCxJ{MJ06w`;LeKIAy*-HUtBbEdp!Ifiq2)$S&S4VXo8O*4DQ%^Rft=z>-)W8;?cnTVR&J(tgPD>G ++eD2%yKfhg`zeLWq_O1%@}<8V*}ei)gxF&iyPDPowb|#}voUK4}eyurpjNl4&UxbLb`3-lg8}4gvgl7 +;dSbuM?Q;XgXwete)09h@e!%a0g8{TX7(5$_4ESeMW`J#?mDqt-VLjYp +mJ9q9wvY4@5Q1CaqRhI0%$qnbd3N1inlL)MyIWfVK9d|ai+M8d4Q}FeoaMcWu7Nax9V1F%kB+AEtEk{ +Q57e4dvjxbFG^(ix{eZ=cl>@HZ5sySGY{9?o!%tca_X_6_Dmjx$@8&R45H+s&O{@D1xIHz}BLX-fOz` +VYN3KvwB(PD>7q~5(JDeK7)s*Ny6K8FD)DA^E#DC}we)*(*&TyF?VbLKrwUi+VOrZqG^ydX29*RZd=w +b?6Ht(!3F-YjJxlg(#qm;!uo$kHMx590%6~N>&1SM1gb#vP%j5g9S=r5iD+EMp3F-L(zzaG2V(wDc-1V +)_CR>3|K@3HpnRh)|3JfW3c#_vn!0(n7`+66)f_DM_&<UF5ipBEY8M=nY3#_S>w!Vo=>h(z((K_vJb=}X_Uy~vscBq-AchZIy*RiJ_L^|MR1mhwqVw?NUvZ53jyvwT@*-|Bv6rMx#NG +v_^eZfFrb5_g-cZm3Xg!>lBX;;}TG>4e)8q9pkOoz7(YtJB#Q{zpzEdtin^B2%*fM4kMvU_$TcwmS|P +(s`SOX*(b8E|Z~E#}@P2PO`VEzxfThj`*KD8>sb8#ozl;dNjN(0|5xcAUS-@|eJxQ*oTe@{QSTT+8M@ +0Brpk>>T>hukELA5LvI1yeO?V|7brw&f$sMPWw;orw1SoSeplJsj~}Y&r-NB#{f(;LohSw9hQUl??sk +!5A_L(*$^*f*s610USm8DA$c(-%;~b3NfDQl5RU-P5JAIsG3HecEP6hH6JpgXI3~b8(;Xp?o+j57mc} +uiuj27*U^+D{L$8k~6>u66;22@!dIPxjz%4S+bU)y-1f51rOoE96STh-IkWE +S(A?LUkCc`oP>-2ZZS=S%VZ=?g3gJ2MQB3(?_No{YuQc{v+h{$+ujt5*P?M=>m}%ea@u;s +%W!XOYb*y$j3|cn2JYC5Iq33o_zG0(;^TcdtouxyVUs1n$6Zi90xuf{yXJR~?X%En)NfuwP|G(cPdO+ +O#X_YXaNcB3I%7i9Z*yAfP#HyHO$aG-9&Aa%vUj<>;ZVon~(|iFkFHi7Q2CGmv +%HpMnQzR{F2p9|WPqxAmhCP^Zd=pQzIqohDk_2RsNKqk44|uY>iY5mjE)HOa9hBL1Ob6A;G$P@fn+1l +zXWhf1Sj6JN7f%=$@ECd+!yKn^wkQON6zWg|A3ALFCMfqv6h&b``=ox*TN+?Q3e32PCRF4&N0GGJO2nuP~sFY)oKEQgJfpnsE{W-qeoVn(38K|;VUM*FV;_Ccz@l1R@# +WPi5WZ}WH*j}`Q4?(x@AM!)%Mxt~%IEj#j$>GC)o@%K4vgXnusuujgE*>PN4lGMXACWkXV;)5T6mUsQ*vq(FS|f9Ooa$4dPDE*>pl=5OL}_>^q5@-DuN-(#th>tudP2XL ++_QOrLyl1~N=)n9?#=c{u-T>%W3?APk{6wBg#OzGdhW3xkXaK<(DXpetY`n^+5_pkR?A`;62HHo=5z9K6hb`F +QzuGxA4&k>`zx_DN~-N2e2rPC-g15O-DdVgg_c%%nL-cuj2QNfUWjbIhz{reu{1)wQ!G&`g{3xrO_t$k9npUFWO;~BuF3J}k?wqTnpFj1x|ns&cAuPYz5V;(2^6vGoNb?ry*-fPlZn6rEcOlF?Eh_Wcy!9ed$Z_$k^Gb8XwhWcn +(?jgoRSpl}U;O}jY7`kP;G6s{#dy>}v$_q14je3q1W|s;s_7(!?U*DMDNQY;qK?(!kvzE}D6YDnUp|) +=aZ@f9vrtUqG=xKWPM5H-gkn78hf>8y$O=(JL3QL3HNewQ%o3;qBL?)waF%L92%Zy3nndD+$M5M24{Z +!*RvK@RUHsIkq;!yDUgp`nn~-W17XgWTD5R;vJYv9aTu8C#dq$;kd`RMSJYDwSd;`K9?6k7D0s${3Qq ++r*DeE|N?MT5pNaL!ZJCrx-Alh6Pa>&&r3E1rT!U1GnK>JmM +>^4VwQ$>)F9GEyrx^B9FU+V5vmR50f8MABosV*#z+18kCBg1r5w2S1Js+BkrT$2*F^=vYV{>U3Q4( +;K0O^x*6Zb@6mHxQtU49Zr{XWPGSs2!bUIl`b=h5eEGZUQ!V!gee@v#VCSuW01V%IAEzC&_nU3P&^IA +vrx3~Mv5*R_-ros8JI7u*CS;mPj@s!YY@67hb7FXMc= +u$TP%xH-93qvUQ~>dWB@0GI7gWVmX-Aa4}A1u3#CBWFsg9-J5N6Q{EI(-`BiI6ioN`XzC9AH{pT-U9= +wV!Mlf})Eqyq^BC;EgsO;9@qCnxBYs0=De6`crssu>V;`DyXk~A2xx&tvJ`>2Z{lOLfijq$R&$pQjm1 +yubU80c>mIngyxte#8V6*i5FNgeugIBB5XR+lT(o;|pY@1f4Mgt*1vii +T!w6bwbg+N+9dP;*4uDy9|i(VCOQZitf!i0?IVw$0$yhZm($z)j>vmm;W#nG-|X&7vUZj|zMV^>5sSu +!pJN)S+A%`JewOi4XRio_|LOABCQ8Cu9JF7zdur@N9Bz?g!0++(D`7s3nt1=P@A3$GnR5FN-pprWscb +|f1+1+Ws{ma02#aj_&FAYM^hv)>hb$b~PaFo+M4Ib6iKy6Uc$BVJ$TX*TZvHcOE6cOKpi +Dpaw09qD94lVP +jK)qeB#kLi2cp=A$f4_zz6j@<5)l6|U@;5@CB5`nsZTZ5zhOZK5#XtF1jy&(3y@2F}CUl)4|Yl~6-IG +l0N(pyN)TD%V4V&I5De#|h3m&1{_zCAUI`Lu*CJaUjb;y?{hms%lFdm9$Y8Kq|3={vK2u<|@x_Q@%Cf +BZPTL&(?`-GD0nV%_obExbFwC-4Efn_hqyaHDpPn%+ZMC-SZ3C%b{4=!Q&&|4+bsVrZ3~X)v@f~P(W? +f&Mx+Jk&xwZG!i*s1MPU8N|wAUe)+A{BMA^o;`-=Fc1Pt3V+aTDVL_I3Sw+397~Qt!bA4uW{i;dTPJc +@i4+}K~st`wxR719Nu*hJHAv~CuS9|?08f2O`T7)U1Ycv%$rh;w~@$5WB!iwsaut8M10Es% +=tPt?7$1lc43vnGVek1@NsN?j+-0HTN)8FukQRWs@JYXdCgrvN~53;{~x`)pS6Hy?9^%*pV~uA)O+4D +Vft;9r!D$U)qV0nZNEPA3M#1f5+@1&4CD{CIu%09#)HIidVR>Y#EQzd=-BXddV6Y5Be4M%s$cqVUbd! +eDV4UsSX?(vUIw1_ZZX$l0^q?Nl2k;n+v6Bxk9}>cPr4v6)?1FuHH! +=5W(4dS|(lM1G36gD!+)xOo6meE+6(7C7zt+jLP)F9IHV-M_C!~vQ{yPF4GL!8%g_D?yz*jP(8A3Sc{ +6uX%eoulG2&7aWRoW5B)-lxCTbyhHSEw!583OnSBo>8zVbK)xag%+a-9zkW3Of{xTAvF|t9kjN6a#IB +}b>b>fm6Tqs*bra)ykrQjp$f`bnnpka5JMN919C|}MIMbHMC^z=-vBeRzdo)VE@j9qAvj)A6?iBE%mR +@xz@D4UcOT)+Y^6z}1aU$Gh;4kkI@mqPP+Zx>iQex+TLU=4LJ@x;bm*#M#xVNihtqMDLX6=;jLcqphG +ZnX1C(Z`G`&F^U$jFagifuVJ*NyMv>At|E3ziHMQZj@MkrT`q@Yb}_YlMmGPa;!N7;*LbQQN70M +aZdEoW1UJWSkV0KxZ!gH?Occr1t8sbiB%O(%oW(6Fk~zQPV&_JAybet+4ih*N_DB4V=_prExvy8mOsl +7xOwNODZ|LE!;cW4oYft#guEf9{E@kBp=`db|U4Pu%JwuT3lBZX!mD@QLVea~v7nJU`|BKii1fH$jv} +lG$v>L%hu3x_ic<(&#kKB=Z<=qjZh7W%64*zO{c$+kD*Q8z1wCW}EV?Jg1=%a+gkLwDrc`6B|emu=}D +cl}eWj=Ci35DACh2gZ=Sq*nP8kVJVlB*(@HTdHHmyc1kvtG-^q8|9mzC3hGvVHy{iG)IcB#udY#`VT;xa8QnRF*>Of%r%HL&#gRII7?%+&<*QMfBaF>j_W4I6 +#72V>M9Hm^M)g>AwP*KL9|vTABNhr7D6)1uHKPdy9~Wnlacj=gsbVFud|VK@Wl<@<=r|%Fk|;Ev93{4G7#hE>B +o#x$1|tZoGF%hOs0X#ntYP%mSx$u-vOvx`WQQ5ktG;(*o7K{zeso2c{(^nur}wCMd?TeTi((8Yc~N-V +f(H?#Rl;oUW1Roly}*Yczq9b(8uiRQ0puyslgJ>lpE6pzCd)R}Dh<4yMYz8FekNtyD^xE_+3i&LS8Nr!nro1iv#JcB)c9)l>#; +=iXyUSqcZDdUV!59}X*D!m6fLcN!IYPxH#R>e+B8J=iw##OgHa9F?MO&rmk%m$>+(YCDhx9mqjz8Ao} +G&V-NKjY8EU(Nui~V#L)4)E`I7mLW+#5b@881Q>_3Ae$LX&m4{fXLrA9#_5;&f*Ra1pc-metq6`R3YB +JH#@fKgZ0o>^drOtu|LUu+9`|=1Kk1td;hI5X{Q&5AlJ4Qc>iBfIc)iqpCbUcGLSFqso3I>ySkZmGYDT@f$5=SCml=EN1hd(+Y93ZBj`KbByfgjR?l$z+?QUz +oWlC>9^0FNkT(VsKZsnfbt?E&#!L9k1AlPQ)OizUE;qUy@BjY1x$J(XUA#8r$DIzIFnz`eOQHeWA>NCKY^{NWwlDBdm@6yhr2Ecu>?&_V}B|lI70~M(Bk%ri +NG>p;#GZ0a%3|GQo)D^D!9XKv@FyzC)-I@3*b?Wjqlm%P--_u%N68~e|*CXeACLBZ&L7vhI@ddqmGQ@ +C22GjR5EP0!?W{_XM}#*slYZUw2Ud&-_L!(d66|Ll|5~n0?rC`8e&jSZ__cx66a+D6~O}jw*6|$W_{r +YHI3(#u%XEc=nA@6-M88`e`BYs{`iN_xBS6(@sd3jkb&^GLp*iR*G=a}?XKPvq1=#?=ItBrPw1r?cyVrS4#mx8`? +7(|o3MdgJKp_T_2&9q*)Zv6blY?t(vH!=)6Ch8!}J#yQ0d0Rkh@b|hsMM<_JAgodT`@wV8uk=XB17#` +3BalcYqC;hPSIY8N4>d849-%823}s$SR(0yiSr8$eb;wbU}$a1$Wc7xe>JJSxZ(C5T%&P4Spvj9`>MknDk`XfLiTz+`DV +4)RS%`f!pXLdB2#e=13omK8HqFE2}&%d=fk|U_E(`9-&2@5A<;Qi@<|Btp5`qvog*-eZj{oJENSLHmrNLi+*1w1T1wOFN?Zr8J6W$R +FE5!jlxj0RIS#!ZCFt+x3SXp+32-h-{gh(ny)k(b>UPSNt39)qJXLwEn;}z1nhD;fzS$56dfou-SN)dANLjPM1|60WZBtuPWh;n$ifi`aw^K7off`{nV27ex2-{Q9hJ +MMQRJ#hqRHDJV?Qmt;u%IIA2A+= +L+ov5IK%(~8V(|nEUwX;nnKRYV5sUoO+60TxL;JB+jH7C`2_uOqNa%0(hKrYY$BhVv2OUxoR+Cnn)950eIw6|vPJvK~hb}A^v|jH&KX^?yq26wKhJ*DT@09)LR +Tt&0RmVNAV#ryVSHHatkKg9h0Z8QqUTOREbndyD{Y?onG45Mg2?0#Zn8(lK$-8qyo4 +oPd24MAvUe@pIOOYAeaKE2s~<0t()xt`oQf&tJ&pZQM!6W>nPa=X@e2l^bsi{v$TPyhdNow&W`9`m89 +oY5YsJ7dM++nXo;W)~5z7Cd^A50Gjc|%F*eXqrz1jto>=x#;f=1jyZDkia_@S)h!~+YmKW9o^)wb#3A +-qm6RaWxyQv4?TdS=lq-%%b=w&gJ9mhG+W4-zI$fzKpn2itD0|TN!ZAx$lES634?;wTs?cAt5Z#3~$_ +p$bSj<8vGN5qn$xWOxP?Xu|A~%;DquK@+BMxaU1LK%}ehdJ%Bcn?oJdnhIJsS?0;?14QE{c1dl3k3A> +?D~bn9~7Rp4{vZ2^(#8D~)*wrN4s(4A0@_7A!?80B;DqG~}Ku*dXh0h9v^>`y# +s;YH)?Qk+69JSaQH7sXPXw?OWP56Jc2_LvcoR?amjLQ%I6esAS?kD;~s#1{ksmwwlqRLoSvH@uU>lZ5 +l{OBU+v?`q7#mO$qlTmmXI@FXzF$qC?aU-m6s6U(81Up^;>lMjDO_hn5IoQhz)E9vD`}28`Z3F@&3rdx@9X~TXwz +09M7tOu3?xY*8(hIZIc{xCP#xB8|{7QEt#znPh`^F+jFgH9;ggPh;&RCOPLr@uWs%6oQVo0q>c*V+Qi +-5)mC5359Bpbw3OLa}jwS*5m0?RACy%qdH<%#~Et{oJ@iOoCWM0RwDq>e(_l>C{c0EK=mPP0c54N|4xml9v!bK5rYHi3%12(1cd;s3M;4wcBRbFm149YfkX-U{PzLw +u4|@Bp-n4IRY)T{0Z+nZe7br6PmNf?B0v2p2Awf!aaL%o2X8W?nsMll8WoA3JMzMt)jwSlbrF+P`_E8 +eYHe|D3ey|K9ci7nSI#ElPM+D4;GxwqFNJH*UcBx@%2w)THwF*-BE@;5HYG0F~RiZm6Wgv7;EjTSg>7 +keaBl1y2iuAsH1X$zU?S$YlmcWnms};*{4gtDCLnTW!9(cWm$#W?^&5Z@Tf!spu7%+{K8Lahs^IO4;N +F9k!lY!=2EBapjs6Q2hwm|s^=7l)dLwwdvWuZJtTazW&l3YlO%fvfOS`##RacIFE`;`Hh1+Ryx|%P05 +jEWz5rOY-MkDcUCsZqdgC^!j31K{c+JGCT|@rbl#YWl$5T%G&taSAq4=c@y>9P@IX4)Xxe_so;Is#n~W%|aq=T)u=osyrh2aZ0%e!wfK^|yr@y&t*5pHuD{G+) +D6ko3MC>>nQkF*wB8}0$=;~gjo4$%LDK=HH>5gM%{Z!aN-{jcwFNjze_^O&79sdNN$&R +vzA?;%{$WE2(&#jmqfKaA+Ol92J=DX^)&u`Kl`|_gb*RIJOdOW;NGg6QjXP3_?g5hB~W7MCeFQV45jP +F3p0-m=%X?bcG@|PJs-ANo>n+^5*SHidHqPAJghdP3Eu0tfrIB@!@r+eoXgI^xEV8s*io#uVAI|`|>r +$={zLt(>70E9*Gu=(F}KhX$GS?s(lxwELBhxIG!vS2Z$ +8B*>yk0FoQ&X&9T#}np|=fU!IsNz^@TuQ078$aUn~2HHOvFXk>p5CYrr}xhJi|(}On#qU1U63{a@n9c +*h)TcN50zn-;(A<}c8L@CNvS9Hz+dDRwFlad?!jgr(rf`1p$-Dja3*-TaCEZHF3w))uUCN@x!3NfqAL +D}TGc}2Y}I(28y=AG1ogFE*3-+1W$VLzaI>6>JXheu-EAqB!QZFnNqxwD4Fvw8{-e^8%I$xlPEh|UKN +S2~w&bg*8x;MHek49(T<(7L~p4Y=>$&!*3_@lwVDGt(2X76+Da}&|H_5iU7b;NuuriV$NFOVsT+`HYtB9=Z8&gBW^;>V54?xFQY{7R-pHrm2&pAI|5 +FGt$KbbL(4msgL#wY!IXrgs{lnlL<^BBR&x(EKd8~BP>TiL*BU`O#>r$7lZ0wUP3O4doCY8&`S!U?Mh +i4VssibKur{M8(g8LrboRE^k7N8_SO0_mbJTNi94_Jk$2C{gRW90~{h*B+58YrWbdD$+3WnPp$W&JW< +rWTVfIDP}rk{Dth}Gv;!64L#peB6Xpn}8^l#edsR>#vv%#dm6Jax~TbU3=2t@hm65&eF@yR*}M0w3{U +XQ%(%>7l6!XK;0T=2JWAq!qzpuD;zi8&*(kxh<=3&CVHyDt5)rj!O*i(CA^~q*LAg^QNPIqc~{a=UN9 +Qa<#WkXm(Y2<{sgKnt~smH%f@`u4i$kjf|fSE@AaFQ1_?OA~|vleuQvtSV=$CSQfX7z~fNb)9zdy%!S +w|yXIg!?Dk!cdD+uOK+=(IgDY*DC6eKMWqJwc(RN!Uo7fI1=>VNc8;+zes~G&!2@5G)WdX<*r3yk?(& +;Iy{E8Y>3O%tuLY)`6d1W#oxEKz(bLhaN%+HNvoSZWid9w`qFEcsDK+NN@O6#E2#l?IYky?W<_b3nF| +5VMf6+UeP|AsNM*h*-Y_l7o>8A3^;a2ptd{j1@JtXlp7~f0$^b(*4=xni7@~A(dbr +#;SYl~blZOXuH*%Zv5=;_u-Adtb)13ccMK?AYWb4Ni$>r?R@%b))m7z2(stK5EI$;uep2O62pwA6+`h +m0X(K;xp;-+JAz?Em5Idjjuc<#OhfaS7F6=M#zW}Dtu;dDc3-eP9H8FG{2=~Y?Ii`~bM$Jwap&B?#Im +*tm_pFEx>7kQK~A9KmxRXLkJ8x91A`mYqVdIKGg6S;pX`)~M)Y^n0(qE0Er@5J!ClHKXut5*-K%Gk#Z +_E)L%Gz<eHvH>LXd{SV|}XMn;+ +eqaV{Qgw52$^~il3LD>g~Ng9bLyauHP;uFGtcO% +2Ti9GEbbTHF|>+r5MGs9IcuENNfnRmxZgmRh(-=Qx9FuTjxhyN+5_ij9AT8<5Q$dPqOqSmS1FOe$d7* +t*emst&*ij9*E*@9U+}w~hwiuNgTvMMP~hTr``rWIH@FuDs!>n^nTk4NS%DsIE47r7_WFBY`>OWnxAD +V2am2IjXDC%&J_Lfs?QjSWy*WL!Sb--Yh7;_8Ztr(HbO=FEPMHZbgBV`Pnhs6}o-_#pEiyrV%uRy^cz +iD-!cm7|Gc&4Hah8hTRM>g9)~1OW~Ywm`ee}bnq?WDSD=%Prm|%bI1CIKJO1kZZ{b_L0NcR#F$Pw%Vp ++~`2C!sibfYIgPfIN17Tgn6HLuU2^^FwtbzuN0}VNPLY&031N%eE8$5c*=Bfa3ixvPY@+o0!s=-PtJ2 +NNdaQO6e|2f96mwrUW;_{Ntp$LbM%mw?8Bvc6yYb2n#N#a|_ElHtWKSDrCWf;nfUCDnWp4IMOsL88=q +xn&6nod4I3R?!%^(n95Q)uTY={?xSw>X0b=#sL>M>VzsLsf296ulgz3KHU4p?`>Z># +nW<}H5CC>uz^K0&H{8DA_erMDOQ#Hx7Bh)~k^ON6rQ9|Wy8bWzcQ8Q`N7Y2e9Zg59o-S8}FW!KdR;Ci +o7_6|b7>P;y-Rk)W;1>h6L}?ixBwON@J+j&<+Jm$Goiz(WAC^9`c=j2`1dtXk=koZe`2ymbhq%#Usl4 +xH4syJlBLs;zV}otoeu8b?l`yY|bh3jzidOk0Ak#NkkQ +jhR4=s9u=gHcKg=BXhv_oJv$h1*5@7(`kX(y4vG-lyPV<^pnk#S(WV-GfYZ;gQSG(Gs=^4shAARBnVg +SEtTg9YY(VIfG{vq?R&(;-jgcT7peDBx;JFENY5-B9XD5QxQ(Xa+j(G(lQ9j(D6+NW`_ +rqmu#Qnawv>sA(sI#P1SwM +(Z1Gb~Ph)su-r*`AskJl|AJ`&B&HFjBt{B*S~;OC5;0;7o&ns{e8#kcjC90KH`?6hdKyuInNxkMgW2y +6E%`I~JPCehhkDO{^*<)n=5smP{3mszaMK&u2uV=jzN{rSw+TqIeZssEkoE>)M!u_&w=;PAeURi)r%D +m{V9|4k=6!EQ0~6ffUOEElVYy&vtjtan}l-gr6JBK>CD3AIbscaSo{Od)tm`@&QLIfyDyd8B=;{ly)= +&`nMcKFETUq#nK@Z?ag1sV}{?!{Ai5tJ99@FR-T0DJpo)uVqqD@VqltRPey^wt(NESxlBt5&|eXc&SbTg(x86&FZ^w| +J{}tCHVw_kdtw+8bIEk-Tn18j;z}$lWk+7q)wU8&_4ElG)JR;VlUMS=vUM6*zk^fO(uo(-Je3$+~Fq& +)s}|cyus$dHCuT4CV{j%;77sfAn|p;`rr(c=7H2(KiPtp*Z;K!IAji-=Cbq^EYn}j!sX+@jLPS_5RU! +1O$paKREs207{*HdmxSu{&q^w0n|$g7oWe_fBjmV9*bAsAH5KVM<<8S#t-lI-@ZL~7aE;;gAF}D5O0p +*=i$N2PvApPkTDKOnBDWP%AJm;hIur=(NpOGO$M58XaE$=tNPVHf25l?lu=Eaqj%Hu?s)#~4qEr^coi +E&r|*UxuVK5}V6THZT_;LfA#L!MVw{Xg0R`KN3=xTm+zBQTmV#vC-uQlP2#rdCz1UwC*tFI* +gYrSAtHB0XSX6QF&PmQwuTvy*&@XtiG)C4+}qVGD6S3=IR(jL2(MFvx+>#Q!S17;pl>1F#|u1hKJm9x +h%;ug7$RM#ll`GiJtbaB2Fpcm6Xs~2Inmsswl^T)>D%yJ!6U7nntsK!I#&*fr>6h*wl~dnHeMfH#iMI=2%pB2vMUpf8*a<;qA{MI;w6ZiI+Km!E>mF12k+<96W_G6T;#1>; +Jz`Nl0}NQ0F0wb`X)!JMgdD1jYem9eyq~3Te=04I`HhrloX9`C{r0rWE3RPZWZ?PS#fDQ<#BiL_EtHK +*Lnko=xf`f5_dw*=ZR)!XwrZ=Gw3dXECfc2*q%^xFJp}?Pc9QOuOfg_IK7`KF^WBA5I(5{#OsJ%LG +cmb8=C%ie4xIowi;=z;s*7z;7M2y``bI8;nt&_J6hkhyzt-LAHJuNH}1yfM!D3Z`nBqS{^|&KpMNL%+ +uP!c&$ho4JD-2?rnP~U^XL7Y?GUSl;)~BefAR(V-TC6n&z^k#+2>yvQtg4AU>(VCIK=B6i35&oO|mXO +$43p5ZD8=jk>^_{qd6`w>{!oSROWkUJ9c+yGawuE};MgXWT@@HWs&?x#0N=EvXp+J`Pl%{U3IN?f%Y_Ua! +{?0p@!EOo{DIh}%IL@Am29bl1r-Xmb+6NlVgO>yGU!_OwykwMenPOtH=es#|Kwz-m3Kw3F^FZ0SjGle +{rp^|r_0jmBKkv4gk)p59e5o=HNSx_Ey&QVf{T@Q1gKO45!Nxq_h#Wh%PSj_$Hw!7pQ}b-d9> +N$(mbOr$szF<>n23?vR2mtATXM@me8sz$(wdCRur^v!L46YOR@P!$xJEJ{s1lTSv%y)TfhXEhutqZ+^ +Q?qx#Sjt^#R=7m06a_wq+ml}_ZnI2{*AKtb!F%NPtMbhhj2xt+Cb9h79t&f(8uPpXI`_oKSphU{`5S< +zxZ&*7|d&1~)hzrLE1<9glW?hSj_QS|>C;3Y)%@|tu$zL47%+R0r}L@V6eq_Q-zv>MR`dF7F2i7l~uq +;VP!bq8RLzDH^Y;ZqiWz3B55nPR@$kyyHB+Lshnoq#|v0IlQbyMN-;$79d{XX1Da53jp`LYs(xbXWIjb;ye +@ilivd22y#zKO_;=6V+@%iqBGv;PqY*!a;Ev((G`sB>5YSMMA?So5W<+}qxO-t(vT`-DrrR@`Z#V)i*uG5=(jFoZF+Z3qR*J*bvE%QzKvg{vbm^EwjO1&Zi!juH$ +gnoMkChT=-wNGwui=!cH*(N!FcIo4M+MRf+&R+rM1H2D#Y?&))P`)A{LV%gaX&{{Ee=R!pFrQo|xrO1DB0iCKn0|3u5MX5FaosUZ7M{5%j<;zd;f*vNFuH?V1TOM?kH$Q +je*JrRu0Bu@J~^2?LH|Kg_Ub_LVP80Lt4kPRkwVi~VuRwf^$l(nAaL{F;xT47(>4tTf_CE4@S1m?HiauyFm0RRT_DR<}eYY(Et&x=1Oc&? +GTw>xVZ9DDcU1!M{D51)yDFO6G3nc|WHh@fXtDu^#^$Y*t2)(nPp6qTstA^7Pb**ypULz=T5de_8L^%mdOTutHZBXSG$fx0nn#09aG{|D|2lW +^Q>X>Ppb;JkX3Q?Hm3-Ax1NYuSdVPFS0fWKc?d#}7n`nL*^_UHN}U&emXYryn7X;uC +&@t1j?O%j>LfmS8;_$Yf3jjo!SSgQ;dmS>i_-`-P^PS`}KBOY)}WMx=n6M^ATn!DVk=EZ0^-L^u$#${ +LG7Htgobq{uR+(FGA3WdZbeYR7srowkjCS)6yHeZKzF|DM0F+5{qwN*=a6^rq^c4$aQ$L0&xUy?sJyy +aqc0Uvv8FLPq_orE!s9Dxj?kFGP%dqhHJV#(T5?u{6GLdcM_aaoj`wEi|J4bF +piJNG=2|;@iCaie+#47Xa{fDdfhW=JXWXD?z2{?(OgA-+Tfts-|(Q>Z(i&A)M>9CuhKymsB{moWH(a{ +)z-EZtkS3cGPMfQ`q>N>YO-Nled)BbPDoVjK{3ev7F!4ptYAJA;WQ?z-q#ZoT|qPTm@;`Tar#aU +x41c>f4pjc>u_W&(SpdqWlJ+P_z85F_D9aN|eid-&y$j|_KT*T82dOgtTJQ@dwC4566#9mT361+JodT +jBCp+Ew7tO&MNrSMlNR#c%e_$twh#%co`9qnNCifZuIx&n4KIL^m$9*;4hsXvCUB-dBTBx|5lg<*?Yp +`qlTzInbkf$BNN%R-~uzH*xovoYtJ6SM-pAyMl-+l1{aCbiz0`ouHB;0GM~cvSOjj(H~n=cdv9NcQ(# +yj-DbP#=yK=ssP$LaR=BSE+`vZl&U9&1%KZJyxu)cDGfltKEI&>Z*5Mz4lh~Z@EmJy$L_C4hEBi5^Z5 +#)mR!2jpLsead37n`}03+MXN!tU(|Zd>N@xXJ@7FuK5}ON64s@qsRAPCqpZ-Cjs3BVYgO;Oj2~2)ta# +brd0oaXz+1LFo^#e_cCaT8hYK0I=$g%{b4pt;BQ)HYwhVmxiZ=OqR1T_TDIQdwet;r2IJ#I$AD{7Ct` +Ky-*2T!!LU{!O^tfa;(;+)}jGTbi4fW;*AY@};z<00VucRlt07lBebM4u7D7LGxmDsNIxxi!&8V}Q@^ +0$x{?iMo0Jwto(YqJ#5m0)jU@*ZGJV1Plh5Zz#42J8$F8BcGdaZ3sKMdO!jf)U`9!G+3a7Lh4cg>rpj +;p5atyRZHB@H7-}4o@)95IU{v7o6%2Z*jeim_UstEAl0j+1}Un8T6k$R@Ab}vn$4)!IinwwbL~hgqi1 +(Cfly_k5zppqB=u#HAHx8l%7;yjU%zTb>Ga<>yEn0dBbk-Kw{Ypd0`kHg*0y}v7Qcuxq_n?8tox8+S3 +u>f`{;ntb#YyGt!tE;}6zb3kataGLpab&!zQeQKjYdKQ(P+T2CHp&H+ +UAW6xezVcQcGFBp^IFC-sj^nZWyzSw@nP>Z1@{Zv&&>;nK`~w`>NCuv&mqgV#m_{p<=5klf!_Ux*{RV +vTVvGWlTEu8M=RAZ0TwIUR>r8M$auewCNZodfHcvSId}b#8QSLO~%n!?mF>%*xgGba{FVbk&L5~qtcA +gu<(r@JlYA8ABB}&?ji$5Pt~eSWa(I=NV68x^PY(YZ~+2BVVj3{g*$8T$aGnQIUEi<@Q~8wX`5=zloF86<9H0)GMajlmoDH}WBVov}Q?7>;KQ`fAp-55yrn=lVddd@WugVVO7$=<}Aorq9s4cH^{M0%_(p1Fyur_@JY%sxb;7JNpO7PRW`$q@MjwhSl^)8x%@}cGj3%!@w7iJ%tc +d9a45B}r(E7i{m~GT0-lN!E>gPq0$5rGPXfw%e?_L0^L0OLWY_ZQQm=2Z0p~9RIMS> +vleU&dzh@dl4d&8{Mu1pmpKEI72beXC2g!)WtwIk^x`R6v)XW(xIVfD0a1GUrVj#Wls13`-xC#e^lnD +(v5gD|{VQ5W-FrpOIX0U>3Hq}P@DvT*Hx(8$jl!%0={N*WI2>Z-ar=4YGV#nx|izkEQG)Eh2M{PUUS3 +APb1^m}Gf*#|?N$0(`y1@`BzRHRKVz9bZ-YqZBv^leRym2>1R_0X!K|S}o)mvu=Qt@N0IIY(9xS^{_> +~F*Dq6&xVSOUtugq$BG^EbIt#SL7gglP|HsU*z1^X6ojzi$)2KX-Dp;u +Zn>sEFdCaq>Ji*McexwdMxl}goyIsuSyvnM$o`NFh?>uk)#e4Ir`LiW@6#NBg%agpXZ(E;rX5kEkwEF +#bris^o5Ye?^j<}-8ob&6+u-o%6hs3+&NP~@7FAAg6R2@GS_FG2+T?1Y2CI(1}BM#b0S% +)wjj1*ktOU#w3A*nMX3k23_??}glptCBC+8rx*MOB6`GN`Wzv(SFE?e@9T$dhrl#BH$+!J(IUl%QQ6C79-{(+x52(L!*AOEP +ARv+1*_nix2O(E{_nnHI2sXvT_Rma==?&9~`pYOLpa~?+RFX7*(*SazCF1u||6uZN`O5M%3Dq_EP!r* +NnDk*klwp$Y@4ByH<+qqIze`@S3cW_(K&N$UjH*=)LG^Vdj?-EaK3x4lQl1O}SP7Vz!Ok&nQ;kKPbqqmp)SHGuB;Dn@hG)bk<2l +w1a%TeS<8lkJPCr#WGX!tQ$Q8VP)BJ*^vRqCAeW9tAafbFWpqm>%m{TAM1?eeKUJIy9xv+b39Kr4he& +s~V-;^m%7V_@l>vxkbf8|Dl+!qHgBi2*2O!)Lv?zQV_x_fa0qQMKM>9?eRNkRxY!;1UaXHQMBwN72VK +JMr%?w?`6bp)>xy_3fu4Ld$+0PlVCJ=AC#kt=b+Y^97zA^n@LeukQg?|` +M8tihVc0Xy@rd;skOS2yAJvKc9C1t%gil*#s!l>h5(aG5-MvhfN>Lus<&fH1Gs@4m32N2 +CNOSNAS@cSpFs;4V#?;(X$Amh1qpbQc1;OPAO0H@7HlOHh+JU!O7&1BPt%Cxpt1%YraGQq|92(f(~Cf +CMjJusQ`#L)iH=M+Vn)`DdaThmQ$mO4_zM(g8v;yv_4_bSsUAFpNHbCjqUI^Y=OTaZ26Y|7!9<~ZLTI +^g@Pf$UxEXF2?{>Pe=G>zCEDcFXE}+$|p0}ei%cb +*V1C#wGPGc&j3}!I88$!ed;$A>9pEOkU6luLsEmh*+3cktwlA3V2Wo3HBcikl7VZoxx5~Hp&4REyqn- +|rdK<2={ICZw_xhe43$Gs}9xokv-Q)L|Kyg2Ka_Z-tS?_q@D;|ZnI3tGMK>)prQPyVCjD2tijP#LV%< +B4yf?9F-4|09%we~i*PX5WP$7ZIALV}){owuPT;#8lb{6_+|e#4q}X22W2sEl}x((9kq#mc)-znDt;K +NASuEifkNllQmeDxCb(`%MWTqQeW6o6=wPv8$GWUsjopJ8rxtHjmO%@iA9)(#fLF$h(YNS%_D&(AG99 +3`edtQp8a$@>|vzp#0Wl5Tbae}G#?hVUda$PNpX3giM=Ps5jaOg=5<2^l)v3NeS4`|uO{PUb +2GF$Ax3zQr#g7N3qk@!Z>p;EGF-S3I|A*#pq)^`vdJ!!`%>2&p#2f9MT<`J{n}?UN2qWJn3Y{l_?->6 ++13J)v!&h{9|NuL(TOS-{*DZ=)PDKDKV#0v(i{bQ1U_esWSggFN6_Xgz1eFAtVqaAA5TI#il-+ZZe|5)n(&Q!o +d?$(z2Y%x_cez%qW&{*ja>M{ztInjv|p}-S6qoSdip#qPD@n?uRnhz>3Rq~RcBy`S(1hzoc;#g&=A;AH;*qDSk7>Z#mgTAQt4ZC52TC=AQ7{8ia{U-Ep+9O9t +LSh4%v83lN%3ZKH$pI*_mhRFBMJ!AO9KWnM`+#&pMVVEPjF<-GHDM6gW3VK{yqPc8h8bhC?&PRn<$%2 +AK!h +ilf=rGAU5urW*A&8>f8f65*jLnJs3dCf%D?H#&m;+RRfp=vd^VRmE>j?^o|8yMv74;|n@Ylv7cp;eUc2iAO}V+aWkb$gFich5VO7P4wD`{ +y3&!OuDhs?VfRrn_g>-#|ymD;z^FkR*i3H)zk6+rv_{t=+lJL0;RR7H~F&e>zeRUBC&r+O^SAFf@Ml% +}h5Q!`}P!0bBPr-m$IP40MR6E(vnWe?@1@hNf+C2lm=DzGTx>a?xyAB9l228?;r#m|TW;YU%Mw{(%?h +?h;eD2{h{ac@a&KowGNhQQB_Y94IUgi*jmf?;Zo+#?An@*zUA!3&-)uHjBQFoA|q1{{bkfE6xz|`9q^GojbMDz#0htW>CD5&)4 +Io!pp|}X&A37-NPU29A`-NwFA5r-%-l{T*d^E<@Y@Z{<=z4N;>0LxU~N`^!@&az6#sxbbKFWy8k%$|N +D^u5Bb;Hx&QtBXZ#vnF_$9%fvjJPWQi7E$O4I+)tPOY1MtiBC1uhM`%2xi7<_3@g6DW8XSwS +vb-EE*wD<#0R65?GB6BPU=Osd*`H38U5PXcvICV2hu9?Rf7$GbZ7k7XE0Iwo+7H`M02Ad#BQmxmZKw+ +$^Nz9`uZA!4M@JaL0WHcK8ppP?SyGm$Y2~Prg$`ojWDVEV8?8r68FDgix*otBB;%-z921Y8jmDsbeQR +};%?GAte$?u=>g9@TRK%k+bMjv_G}8#z3&?fxMC5p5h#RC<$gr$tC$Zv6C7MxHW{uV)iYb)wR%i8+Ig +zELM^3gVQGcIFrMjOFevL?)EJ!~^t_;fRN*Nex=%eWZjd#gRZ(h0ka4UZI3^}9|r}x#krg3x=S9vy95 +AP*M`r^T1f==>ZhvD6704l&pWm<;;gw(1jiVu)E-qB0%BYHgR4s6NVZ7vqe=v(~FlZ~r&T2}l2C4?BZ=^7s6Gyrk4#| +aRI4szZHNrbXNq=hE-S`uR*{akNOS@HB&kgiMVoe1^dFkm$OR>_^+d%ivSO6>NsLAuli%a%S55 +xvyo6Oj4W}eQ-%9TKjMG*Hcdzk)oCiR}|ygkl1LIkZpdt~t9Yqf|Z`l_(WWZf&>8l@^cR=`pJZQsBoD +krdZ7u>+U7D@t=s{1K(Yw6UAIuV90rqNI0@k8CEhmXayxc+I}?&x?$SfqVkZ&bzv2u3I6avHy203WTv +P_+5^CMJqC$+$r<)|}te#@4|p(N`6BrCxP$$RhJ5$+F!N%2iADLlvv``HG68>Ce!G$7PS0#nv@d?FNiG~p#>?NAT|;5o=5DC1* +3a-9ixoO5;Q$Pk0VEfR`G22DpA>}1wTD?U_3LZ0ImJ1>eo&PbU;iEw +W5oW=jild4?CgBNSfH{qnEsQEM$`WsoBrZMn*O}j^cMz +|oK~l&;wrmM*=s(cFqz}Uh;8;v8JHQ0if7psBarU0ne&((1uIUZf^tc(CqtEBZWzO!c$-VfQ-<$0oro +;w(&6xS47{R}wL;lThXX-DP7ElXVp%+yK2ykjnm!AjB4(b2PXRH{IxWMT3Vn4DAw5Jeom}W8nt+dTF@J6~9LR5j_FQFq>i&>O*(Z-M1G9BKfu +dab5-6Tgo#~bs)z#7Fm(;d}ZJdTQlgQ#L$;2dQcSVY9glw=c{RH9pI?`~ +NKrLX(%JwLf7lK7pTBt7>-BK5{JT0#749UyU{tPv(zv;=+OAh_zhbS#rFP^E&T)eQh@3v{p{YPY6kBT +Mc)qF*$HOXOD;c8^XRB7v4f5qZ%)vx>o29rjzxIrsR>LnkDDM@^S8Mb00BM(7IoJhen(b661nRO$;k()p~(h +?VZN7D`bn^Mm6j}WR_hDT;?D?&z&q*}0|97p=G6-ZG8M&^P@g5X?a6*noX;L=n8b*ylhKox6F?%K#OM +$@dQ6aXr?x_3zRARvev8A*lG6+5`@5Dd$-}{WPPZ`NPw+|%4hfXb*|hZYf;l3Ze$lVm;rVV#0dvM>P>S{EaaC!7(IBj +GP)6g<-d@e+CykqsBY~k7fsGLNq)D!I8w3ZVt9mwCSr=ah$(Y~TH<`_oV&YgeX;uBOE-Pd*!z=;&CvH +@K3S#YNl$^Vbc>2$a1nDs53?9VU2m(lJm#A;V>r{NJw3*_YOxC2ZC>8N0>68?3$tcgT0y$F@iwkRm;Z +rb%(HP51g(-#rlX1>-<2d`)NY0`uqic*5e`MS>)l<6jFjzkJGGbJjFcgNItS)?2hG|_;YC_<+-I|WgR +-9VW)8-3~(n|wgdln~0A@fviy~SI*yre>Ut+e{v+YR?p{$$W5TV)BS!dS;3jyjJuD9;jW8hNjG(Xue7 +$rSK&il{N@v~WmN>w)*$5856T5Qe&cxtPsmVLHvrJ2v?U^YekELJhHi0L8L`gQ=~$)?FtrVDO1NVYeV +-4PY2(IGo_T$B{u=SR|}~Rmq6hSRpqX!aidhPFheP+cPN8VA5-WbU%cWpeC>1<_GC%+bVEttWeo&vO^>mB8 +v4ijGM-?m5y8u@a-1zJQ0B68K&enD3imjOi8K*l(j!9wrL93f2>@0L@s0ge>)2_5T^Ku6pcXtTW1c|X +nsojaxp*W(zgCw=QQ@F)I7x|94y@!j16i*#l=2=Mpy=2&e61C6Anr7*-gNC=lxCHj2FDoua`7kh+N7)fij5sEw*&mt(iTf!y +r0=sUnQlcha=ZJ9f$5BCdW*;XKWdJAc{+a76rk)qm1Uddm2Jgr~{^;FXyK~2@V{(6&X7RflR#RyXu!O +?Jpq8eFG)GB<@+un(Ho_GK$CHuyp`f<0vQ+owA` +;h;io@%qC;N*pHV8p-Ul^rYAStk?hiD<9Gvseu;AN5G^1u3-(8x}QO*0Zh;#vO>)N4RJ7@X^kb8sIw-bDfaS=#c|eV%}|P6~+0e&5rW_YX9)HKaWp!QSijQC-|% +u5%5m*Tc_QXeflMjVLOw)(@h8!zY4S1ufis;->T7U*KR%P@eP|6QR4!-J5qg@SgWU-va=XcrgpPr!JM +NjBE+7Z`AwY(^&XAeXEBd37=ttp(QVLn7fQXnI_OT5>zIy`zT=x>h(X>`3Bl9ML~7Kb;$VbnB*svCxRC+leWxju=P^76fd +Mc!Ry?mUTN(e$64 +_&|Gw?o);`x5`AdGe180f@^xVd?pmM_A&y=f6Q5)6J3Wx2&G_ds%sZOz1yrD;tf78hz|t9?IH^h02V3 +3~?H?DDcrvL=1&FSr*R@FLWpBy^4%Iy#$yzw7X<5p(S`|4>iVzr74^L?U9u@c0dC}8sMbqk=qBv80sZ +~S7>w{CH;j+d^Q|c4^%;y7@I9`LqG4m*zvuj`%RMoXT@L&m5R|-HwGIgn$vM&QRium37W&1aIWZD(K^ +nZhYc7AL1IQn~_$JrYU@B}^>$WR4w$9UrQYULfp+|#c~RKgnC6RqIY{^|bfPRn7T^H^%}Utz&2bGwv2 +TfSMxbwa$(j|Kw;bjLZ5dz^@`0mDXlOf3bxWvc3woo>IwnW^Ak8p~b$;2p>ebR9Tz23hF9*pNgiJ{s{ +ao|OwnFY|fqo7~m+PQEU75B~Pz;O*(*@ln-TsQ8h4tFMaGhd6Jg>G4KEP;6)Y1hwnEmHEc>u0wI^?LJ +hyw*qAF4Wq2S?vZ+ts@~St7H8W&#Te`MRgjb>K;qfIz%#+9Y%uM|I|zCak|@9z)@b2TX0wFT=`Do>4ZsiBY1`DV@}SIOQZ&G6s?gH1%0>NcoWcdZOuVv@E!bckdRp<95rjj +HHWhU_(^axwxN2OV(Y{ORvQP6gk9Py>zjx%{kOSk1{d}str}9j3M!t#+k+-YTS32vXu=7DocN?p;|@a +Jf9V4)zbPtrNNN8m9bwG9!6j;>$3z&F>g6h2?Ymq28@qJs~%9QuA)*r6 +h;5W+^d!?3tiE1zzh!f=0O&_90Z0A|}xSMModI4KsMQ+>)yWxzcMk#e~`NWG($8f!yU_$stas0hU%it +<~n}8+*&j2sJcYgMmsn?Bz`D)~7|QEj~4D(-@JRCMHu6v5bGqR&dT#IE>B1wi=i?zJDOz#yLsGls|ld +cIvk?Wm^O3WimtBa!S}l8feIZRriQ8 +6vHp*ej_fE(4myuEwrtq^shQ@mQ&|PF;9NM?mI=~xc%fqY$ua8#g0{Yr$_tg_&A*|5 +Aj{Ef~s(1L4{NE*EllzL3g{gb}ZQ39Df(@_xf#2_(vgJ;X$z61K!kD@kIAWIPrxjZ!_Z-HA~s@6Yu?H +k_)h9eAO48sA#HJ7D7l>>tePt|Y;0?vJIR0x$>wY+^dXb8n +%=FD$$~c(woi>(jw^2Y>(J_}$CFi*NVeoxn0yI4&Nw2LHZu?E3A0-m;X{J#VVqR3|-0PSCf9!GtWG!R~}MOiOHHtt@=?b%ig7C; +UX@B>Vazre_#2-8bs}yBQWF>N_1Qk6vVmex|Urmlyqvc3w;90o$RCw@7j;${Zq=;i>09AvMY|Xy +)rH>euZQRfW_l<2$s0NIegYtk<=#S|7upBU$em_l)kOSm6L4QO2-YRn8?-)hti4C1dadt7(o#tm>)m6 +Mk%N<3+P@Tdi$CI&Xu412ltnU!gejwR_~LW;!*YCQh_?Qi94mXP!*57&-O+F;)qqEEZxYx;j<$fC6y< +_M3o}j!$$|%7f$v(X4`rHW>OLty8i#d}K(r%IrM}fI9vz?7%5o?Tv`A={;41fGcigQPZ(g=Kj!-t5jR +iaxFJ|NZc1s6VfJYcs!T2N1T7nl@TIQJJfOE%i2dscnHQ}uDVX7Qw95wB62qcW2`rq2 +ffN&iPjktxa`RaIZEkZF%o!72@huFJIW9rXYaiG)=01JbOQGd^1gh`UZCpuApceil>Vwx0(eFtGe|t%uqPqxy7FROZ +@!G}Nvo1yOS`)AjgJ&L^2swn$6X_wde7#ZL|6W%9I(>Zabbb12JZb8A8NPf)0)8>XpJKa$1>pCE(LJC +cPQd#IK9H2HUA1^dI&1liHYOsqX0>>IvKwKzsq$-hxa<|V;d+j@@K +h<|BUqiFAnv$LNkpzQew!W9XHmEt#-()?mEPYy>r%2hzQ~_115_ +#`ELO*dx*RXf%}VG70!PVZBByksBU2&d=-Pk+sh%7Iwatj;wkHOT?NUZe3MTCl~FNW|(Jvn8nEtjTe5 +J5J?zFf5^rnXI@~M3XGt|7y))uchl92u`}m859I@IFv#Z$;MRbF=melHY*0I)J3W9wG8 +@6@gNUJ^%2H3^p)|dvyS2{OmbQorQOp+tKtlYG9UU>r9&~{+-N#}Zw!Szbyrh{HCxNK=K4<5Mg^C)fSY9-3-b5pK+ccBuW;GJ7JC*uj&ef%MJ*R6e+isyy>V&`8;!&N`%`RIkISV+(xPnVP$cD%Z8_0fU$vE{PbGy~kxPj&uk4bRl_>e_?;JP= +SS(2?PSf;Pwz0@vU@#Z}gTY{qhV5gwcyIh}s2Mx$sE*l7cj898TrY~hl;Y6s^2t)|`Hh=g5a0roZC`0G2!1>pLYC}nxyyb3pFUoU +TruR%3-uRyLx(*gavqL?-q(7zpm+SUUW4d$h4$^2eWRJCS)FOA~pH&X6SWh0_XC9TF=bCXC)4LHVa_! +(kRzV&WksuHBKAcGcwT0&L=D}Z2Q8Iw?y7F)fJZ6FtHs)EGo2I$C@v-lsEkRFWLJ_x?}ngT>WKs$J&s +-z#5(b<&kyx99k=iuex9d}`&=&_^~E3StT=l4NXl?;~YyuY!L&ob4J;X7z|roTIVt-=2sy8^kO)&rB0 +vL7Rx+iBBxWOX|mD#R-U&2V5r;m{%w1@FbhkKJM|D~!D`4x)-oVEG;SFxje8XP`8c0- +aR8nriiX5#a9PSo~#XZF0xKah;ev&+EF~XsSmjr7!pGAFk$Xjo$lHWE++?#i8^^y49`>E%ene59uoyW +&#@w)SLot`;0gKoX55(3FuD1Mr-tG0olUu#9!Hy0+wy!{ATTuqa_6d6)_VM7n-{AIOKCB>j}rssMUK| +gP4Mx;Ni4^&RwsHqHw)Dyb3)_FdePZL+2?Ane6*;{C@yFKb5ML8)lcZ4Q$spcGKcGqm_a;jG=*Ttq(E +(B~kQNJ3tdD|cdkR;8!u0)yt9P%l#tXrm<>7jW#yT~V(*00y!laTX5ouf- +Anx25)7P7HXVo?1>JCe%mYJ8n_q;BP^-ymiV}HUarM}5`KkvNw((KU|jU1ETR3MX!i-JMDtL>$PmSG+~>EI@EAIn;L_hOa(!2adKLf{@Z`waRe?7G|@j$|dLXBy` +sK#OD$8G<1C=yAFH&cU#HbqH$N@=mIT9r;jJ7XkvuUw)|9)@MEm~75(3<4u_aEGc8hM&u-3O9f%tpi +A(+*FU17Vhn$YdXE&N{ZFBDtraFrL&IzSuZDO}=`)P5DSLo5ksAUE8~5+M4Su<2XY3droW0;GD>w)h0 ++7Cv7~(NSHgp7ONpzS6Q0x9`}BJ_)EQszemuc3wUtc`-&g*(kt~-1j +$%~M*CZlrXl&#Ox|aCe>l0sd368BImX)t$@l)|r=LCe;*0wilgnmr(!83?n=~Ps=t%7xoU*nW`ZX#shBQl`jpRUdOAqP)Z#)_0TkpP- +IOMrNC?34z%taNqG79ysQ9)rrTZ0f|M3YK@qmHf~MshfJCE%ZPutF3erwVhJNNK=G}2Lun+9xOd#toEA3lvPh^|ZP +`u>^+;->S^jEeWBbB8U{$y~rxQg5XVNGz6G;&XF3HX$5r8i}{%vd<=am$5@Je%-DImRr +}ExvqYxk-DXqb?>YCR$M29@_75Wy?ea5eINdKIcPa1p#fA1@fu&Ww?^a@G?)Pbu@{7KO=rG{w=deew&3=C +_-X0y#aLdv2YS+*x{jVx>dZ5cifR0~yYetZYkYCQhLvSFUf5imWt@6>uIp`{A|JyP%xguQ6tZ7Qq>M|__bBp`2k*BF~I{cdmhFs +D<(U)Z^C_FFsK&~GRW~>{+_{zQ$AwhD~P_DCF*^Mwlt2qkQOo0!Y!XAokZP~m`nC}_wrEr;p55dqFTI +@wDS<97fAygWUvua2rs*VK&8CX->7j%5<0%ZrT6UzseFq8J0!3-~%tzDfrZ +$n4{^Hy;xyn^kB*qd|vEMVSj72}%L%1=16_V>0gj?IX-Dov`2{bEle(I~E{#w6lv@w=y@CkeTihO%+D +{J7WO2Ph(uzS8CLIku?&O!+m;MJDyQ2FZ?#9Z)BS)VzGy7hUizNDE$#n%nmoH#X_mcyX%idtH{z^yG1 +9pVevz+AH|0%%AX-(92LXf5B-|hWbvdt%szAi4gLIct>FykPVJXpN{w3pK_q_uSz-}08o&HfMx^+07( +yaO9Mm%3sm0~abG;P_z)UiZ^)ilQwc-S2?ikokvWcUkS_xe3gj?K5+Q?+LPu9yWIk%9bwjgSW +jt!grEEzx=h5n1mo=z-ea<+m*kBb)#6Rt@tS^Ucf$9_0@T1B5jMqlQwzuT`&GcZyg=Ta)8Dki_9P{v9 +U8XiRr`^1E?03$Jk(3Tqrocjp$%0g}(-|wA+2@+sP26w=pxeto4ucGyW1JGAmkUH3uZsLxqK%-BEVoq +6>9p}ND7BPYBxMB$yrPH=1{YxZtcAqLPeJO+xNm%@uBK^qL5qQW>gyJjXtbkOZs|3PH9KZ4y9K<>eaB +nUZsE$EZl`jEyQZ?5e}v-bDV;7z%`d)vet7Ww;N?E0L25mHb-4HZc}Q2Nb;)_{ZjpSob@ct+;%;$L3t +9>$k!SB{hc$FqS#+H&hXW=0Q2j&?jGuU>0$Rdu5UN%k +Y;@+N=k^;u7OsVpQ2W$Z|n?!wzc0YBLm-N*6HllAl%!9pOr}oz^k*d$PallqIQ=(gu>)$wi_FbX1h)) +KI-KxI<8xX;v7rpnG^l)7WEow$uyyK?Ya-Myi-(yY?WbBHv)G<>eU<0F7(>q7K_@{dJpcHCUYP`5qpG)-@m&&U<&j18J<X2Krx|Z?|`2y17~jwZP=|&_bZ0emI$N4sYWp1uF&*KJBaXkrqn2O8m5;jD#X%1)^0N?-nm7vxD)i!kP$mU5vNaTv;K<*9(9*gpo)pnxX?hpzkb$@>9nkjYe*OhOTS6aLL~#Kn5hxRgM65mkDFq7; +**_J1ZZNewZ +CIw$t;1XW^%kDQCC0qEYcYtV<=V#ISPXF4>zH;?60QF0d;Af^e^<6oTof>Z`AU)OKEiRJ}`N#<78!pHM5hnFf@ +HWLR$gtTxDgjf`i(#se}#Jbe^ZM<>y691*YN#ur$kYJp~A6e=!+3VjY_o&vO+KrvUgEb}JpvTH59!GK +tHK^|27oQ1}VPmvQ4Yf2k!T0z`?8;^_Ezc6^*4ACF@U-4*Q(i;0R1Euy!PK-Q4bRHGzLsccac8BDwQQ +1W$k+3toJqaUuL8T9~!mcls?W4H%6i*CPty(>9TexKI1^^qE_Be!Q`< +w?S`SKK2@&AGbgKoZr3r`kTEMowu*|p6tV}_~x&Exz9KDsoaZKFTZ~E{9x~8=kKq++kf79yZ?Ic&EDa +wH(rI!jSU98|FZM9Z}*;-U$^=7i;CBqx;Eide*ZvMuXz8E>G{o@{r%?a{Ws0(l8=~dufBb=q~NDi@a@ +4rmX!O90Umt)?VJ6oGM`hK*WbQ;a`^2Y=2NaJ_=W1nL1l?OD)G(U!JDcQkEz5z_ustge0T8l@SBQqo6 +mTf1m?-+#v^|D;zjA*13lCSPxoJa{buj=HwRD3E&NiJr&-FlEOubk&S1@s;|h_w9GMB1)+#wYsUWPsO +Yde6&W%>k<|_zTx20%ERF>8;%iJ<1lGlinYvNaaJIvDenQf;cZgQdpQ%_Po ++Z}_y+x$!!#IK^?VzMdRTo=k@G(b&T&&0_jMQtOkUs~A(lmpQ6Q-{%h14CLo +xT%BBcp{I-Ub8Ou-KmA6ciaT#VI0N?L1VjL_9SXj*HpoQa?SfY{b20%lL71Uq9>f^h*Yrl$J@^mY#Tb?aY4I|J7oXb +q_L@rzV*6F{_`&7;BLb>QwSC%ljfTYITCgz(181Y9EYBVp5EHf;J-;?{PNY(J$GJPQ>_Q$=-J!-XOpb +Xue1z?Wn&H}j2NCAG!)b)WwgqucO=Oz5^n}frB&Pr%5J!3rY#Btr%(gsFfb@XG7J;uFqcD0iFtYq4O2 +v>RlVVXENw_%wT6lA|qIOYhFoTqa^CtTFT=sl|XwKg=<~p4AMJEJTtQNmKq5RxMHQtdMAN-3TUb{cUs8bPu)R0F4V$~TdX;21f}%%**MdVB_z&a#X2{Q#4g^aF9gD2IqHZ>eFzF=vQ^;bIISf-&b;Vb&5H1|K)SD;MxfG|ZT(E-JRpx +f6oR_+#;PKa;o$!|8Qml9%{!waU%*^qQ@KKoRR1xT)$-kL)kU?6olbD!nc@Fv%Wj#DN(=JvRz<~?5pNeS)mto +7T-|@rQdMhJ!P7H1aSmi6KHBQR!K!HTltnbJBmUIY0NkOr=Ha@b&UrS*B#4vz5F;IW<3NRQ@}R*T{iuw!rvX} +2WICCjp;>dAJ@;sn#B*l4iBxxr6b%t7y7~88p +D;aTN$(9=-tvduxgk4m%CuxEsTwxB0%}BwjqpnnTqu=Spvb(W_gy5P^7I=$%H8(>ecVuWbuV7uA$O@m +`;K9j5G4D*cpf{gMp2y@}(nBvn3;)W8W4s!jH +lIBe~393X#08NI2ciANhirD8@d5z-;(~0XDx*68o3}T7!kLCf|*@-rN?!aqgM{X<|CqDm3Lj1;^8ByJ +ch3*HqPC_-K(FqgZM5A^RtIK^cpfGeRF!rv +wmdo!oA3B*Blo^`gk?IFf033VQ*+!-R#w&4 +YbgFs`50@fki@*GUQ^a*3giB7`OP>jz>+Jq0ngl4%=;C!akgurotwwIXt8M@lLlHl^Jsr7>*KYW2Wk`{k5&yf$9f-(-M$g!tpraO9!QOW$x +bgvPqF(fX&qtuL+J?N!ZQV0Y{e$?JNDO-pLomeAs*KxMX;# +@yE4?k~T(A|Xx0m-23pM!Ea?n2LBa9w-5f}hUL93MXupht6t}5~XnDw^4BkK4p$6K7v{*v~3W+z-xja +98w*C(D8wCTR)#|gOXYCxkkI>sM4$~ISm_2gSFNMoRopj;ac>pz3?Pq3a!!{L{fr_Y4ZG}TLd +V5KEw9kNHzgt0v1pr~rq%(C^X(-7ltk=@Q$!}Ch{fy_MI8werd{D}Q;y+4o@h|ae@jhOa4j=Y7U`_%Y +M;jws;0}oA*~$~apy0zmD>~p?-^=TT2fK-`CV +Fv^^+PiSla}3eZD=0RX0|Eec}(nJ4r|-$zgAR!|A}{BS+0wa_xzKJuemFeuktIc{%0h#s`s58IzcpMC +ztq5u|0H7Hv0nLydQ+tE)Zz1&>4uRtK!kWQjQ(b&itI*8k%kIvB_2I2oriK?nu+MrHnZ!egSfuv +}42DlF4P+$wkUWj$8ynLr{oZO)6r!vBg$4S)+d)MO;`R#jj}ypQlZD`Pv^^Ha@d-6)l;u=uxe$KsYU)=Jz%3oLAbuSZ#Mh!r+HMFvylO!8n +e3Kc&)%s!2OL4F9t=N;n!B#N&VNcmyVMlUXROeNsRhy|uqb(2qH!vBY_+~Xrvo<@H|^Nt45NjX +diFb>MC`=)&p(lfzW(=Q;)*)AJB09M>#f8!afd1&-%N`8@A2cd#}C02$(raKWJ>n`L#>|ViYg3PLkWU +L#cji&X*E+1YO@7?f1bl1!A#5Rd1blQr_U1E7C#H*+b}Y=(nphX5u{?we+DU6$Vq=TY4`fS(yo?v_tW +mh3UcmEO;8$Sb*SQApvx3nq1?ySgrm$szs~kQQ36a5K0>aPrcxEs70hnoszt063i#V^alxPz}oYnizAE4`f|ZYt*ET +$rVVH2~`o`h;RlT{UU($E#U`}FoT~2!tjF%n})0I#)fk+N_bfHP)0DaD(@ieo(OXQa|*rr#&$* +tNC{DbtWdEJWaOIj{OvW=1fcW@fCIhMaVLFxW5^}kE-dl?BB=V8$i!5(w5iL-h6XY;u7TXj=i@_Q)kT +7VRUBqT;~S}Y#H3cUkj61;Z)`N8_U1;YmYQ}%^61fqtqv2KYd_j(eC}4|GCcFC;^u||XJ#)|-P~wAbZ +h#kSKf}?yiZ3pu7janxEg-rn)r<>;}@!5qx0Lw20m!uKLAQ5C~P`yipSh~pswgw6BU+Fz_69~kmy()zdYLT$?@&JON~diL!VdC;@kZIDZGk4As&_J@Ogj?jIw;LI)2Av##@n?c#)ZT +kvsJwckUgDo>O&)Hk;G|OFj+CrO&4A=EE?32y%cxUQM4snK|kj=Nq< +_)0V_ +u{vQWJdD9=>^U~Mw2DljEt>4W0M$_jycAtC*$BCXkh-=`|TLOvz@{ulL#!Qx>L-Q+AG +}E29dGRjGrZ04ib&soXz(!fZQ&o+o`^unSqq(lJSr5*l^<{MGr_f~2y|<_5dKh(^H@NIHbPeC(tJf=D +bcUN?wDoB}WRe(Eh2Y1IjIJ&jR_i>Q5wk)*71li=TTqn2A*jA7RRvm{cR7S5V=4f`NG^m2?<>G5-5e9 +9u0s{+(F>R=dJ|E&Rx5D9{*4A4wgApejcWCTsv1hqT&V(tjVFGgpv#Q)X3;B)=_1mOmKqo5q?Y!2bnc +pub#5rlXbRltqAvPP!>Rl#xoe;Y=8N$p3Mz^!fo!4FK9yFBm|11c +GGoEf5%uT_NcJ4Fc6Bo^ka1y26VGiziD+5%)OBk>p1&o2BB^ne! +seM$Coavx0Rr7O0X5gDNV7DA9moT$lf{z!EcJl6Bf6Ahp0R@)%Xeo`K|GKmWJz5QuH$wi1YDPh#Xdge +mshSyX&ylBsnRQ7^*-r)SZ7^gzYld7tHj{y6$|EHs8WW(@k6qgG(WUz7@G`wB6bYejG@cKKEcTNnDcYXWAzq(x#}w)ZZ$sq)UB!yQzAZO*mV&E8Mt;kOMaVc=qp@X7Smc!%m>4vg7r8?Gj)MKwAQOD +75o#kA}tR$h9E3V6Y8JIwmC7^<=b=^}?U0w^w6$xM{s+8b7ShT!p$ZD3VP((-0&=^eV7S}AYZM-aX{4 +IS^r7pyBm1oS;Um=6F(>ZM)(W1C#&wF=X{3d=gnfRWskXW0fc&!SY{%Q=>b?tM#+C2%1ynq$F~!z?kA +YQE*5%slIkrD1??DRUx>&?`9?as_Q%H?jR;dP$ze3`BD(#gbq+00yQn)vKe)Q@2@mh{gN{%$vf!lP5} +;0;#niY?8}W20)rlBxu}8PfzRk6jo^6WQA8o&krI;Ir%i$4N}u%s_CzV3$2iDMX&JqfYId|rZf$~nM%1~T7 +=%?Xk%LR1@zN|qliKg#$7PTxO6isg!VE?G4``qu$TS)akH3R4Kt84^8rP~<-L`NM3!Pe^8Vn1$c6#q- +htAnMY2pHUL)HqlkgYK%15wn20cu`0i70_BG@j<_5WvS{b~j-)qjfcJ2+9xCnwXO%^h9M&HaOZQeT#W +^Va$HymoOu`melO1=e-W^0G#p<{e-6l(m9R0}gh6sAO&-@z++pvO%SKg9#_|Mc%4W4rg!IY+YTQa0`^ +M^Anrva|uEpek(e`IQ`}3Hdbsz-6QL2>YFzOOnf^(X9gKk;;lq^zE&u&0^&zN`oR3SuKW?y{Xu_98YI +rQBD-}vqjS-7Z_?WArD%5~8gh!QA|w&0MarTzGoqGVTQ)6N>m~d%xx`HxO+Q`5EP5t)eD;B&xXIh&>6 +jFLonknkkuyQ?Im@Uli&3OB>|4^aPe~g3nEC-M_~ySH;OMMERVXPlJqv_Qsy(h<#K$bQ9mF8(frv>Eeo|K$Kjv9QS-U$7<=%InUlk +Ob70`H(pt*0P;j{P^5UEvC=y4^h@P+Zt2GQg^w+*i`Jc_AOV4WZ&*wkKIR03>m$32ChzHlnD&Si){I} +)bJY_{uq>%47Tf&Seyy!w@4xr*X(M{|rV+h-br^AQ|0gj0hd=-$+Qv`_%3zVWRZNEiI5ayJ53}?gV8O +wXDOSP=@WW^C7(_wq-wIYjvcqT4?ym{9agD89V>@;20qQF#&L$I}-M9lRa0K;?ExD>g@FZ$L?5n7o&w +H7!DrNd61$KZ#J0<~!(TB=#Fas(3ob9z_5ZpCIO{{kToj`}vD^4#n7=yeDgC|Zi0#(Hy9L(1vYjc*Ez +GDw$F^9;?H$b~m=b5ADiCZx}gWYlt%k3)a4=3r&5ur=&6VTePDDfmv*~ZLdez2;tf~V|aMa7EQ4~Hc142P!T$@Fg>6qryZ|m3Dn5{ +Osy{hvV7IMuvcWP0UwQ*=raT+}H!ZFeM*TyVzhRB~{onQ_BlBq*wJ7z>p@^pd@CD|Rg$AP`0hL#efJ^tt4U%Qezn;bw9ski>1Gy|$I^#|;DH9567@=5L@;dhf^2AZna}yG)sJSKh*}xpCntJV4DYFGg)}f-nH$bO%kl* +!!7X(V^^kPhrRi;K=FuI(~hp2XjQ$?C%K=qLcHj^822ynLfdga;R-{-b)rTall=xg17^(~-(@#kC%+B +{QBFBcKIy)#4(%#m_1Vz%-#tf8&|ai-;m&tble5i9O0ho1576d4~cm<~z0Jb#QoFXxZZXp+b8`^lh32 +;iLIHp&sYaS9+(A7><1zqh?DW!KzDJ;5v3&~t4cN`PIbG>!zW8(^Jlp~Y6H}M}{Hsh +17MpPil+|I%wp7(b$*^l>>Elmv20p4<)F&%1>dwpga7edG$>i*ZtUGfKy{LRrx0~f8miBV619J2j7a_ +&<)YVEf3xh$H+0p)iFDJ7X%1LTR;#Swfp4RUz)HfS86gCL?y_t^o;7UxO40uTHTq@FwvHVgDM3?i-3p +j%|Mm}6{eg5rRa#~3-d1eo_u46h=fUQ-K{W5QCr?8rhd6=Hv8%z%;i#K7~xJj%=HQ1DPVZ7?Zh-k2T1FbzgGyuJEy>qzXa&u@Eh$l*R9F<20Iw^2d+-tNaDg)r? +TS`7i(Z+DIsr=08nz!CEh>|k0;%qZ#w^en|ADy%JN&#qGO$S}N5&UsJ!7ZUs`QzOLpJ@DsuI+Ut_YBT +2W;#80)F(z{lATP#w9t5>O1kn4rtq`1#C;~2lS5wd0tcjoXrum4kOFy!#iz!Gb7=0Sh#Q6kY55{zQMlH%LDz1uIHj27=T3m!M) +t^tj?tk%+LRuHFya!#R#55ZYk%E*n4ULtbPtIY?liF}{em$<$13=pkJ)oa`0dHRn#+cj{3%+IK3baDG +yZ|l*A}YCo&nDcTlj~h(Otox$NA#J`Ix +vD{3oNPZe%58nNnB*_Z&m^6u(XE3st3y&1hi}%OZ_%dd-jeD=tOti(C0jl{hJj$*McEpM8P&6Q?2-_o{q~BI|ut)d|76Oea=_9PZ3#U-+FNoR^*&l`pv3y!k+5Ryc| +T4J9qmkMa>xF@}Z`qQx1~_nY?ajnSZ$eynl?^ouOBmRH@OV-s1<($59w*F|Ra-2Vl390X3uRI6BXaM7 +jl{tZO_;$m-&pI&NLLzb_Q2mL;lPh=)tzVfE}!)zQ?C3*5~o}Cvf+L15`I?~=s*Wp)=DV8~cDH4XwVV +nl+#O!Fp5Z!=%Wo$-lj6*x07uek3X9grM(T=Sp)T`|sL(8C+AV`FT!3WmZh?#_MrbO8*w@RfDYE5YM8 +RrV41CjI6hZ>^ul0ImQ;wc*BD6vYMPD(W@O;BhUs*Kd>r5>XyRLcYi!m2b?uWmX(vLLF$gv7^1u3g2) +%gU-?Vmx186;&#%@Uw$pCJvK--3>88Ml{GU=*Y%yK?KWSL`b`U~c!X5up=3W=RwsF63%YKkc;ng +k)eX}2ob1vk^O?P!a9YNd;Oc&EXU!?Z_p|w6*uztVQt5DLIa7dVA(PGWDa45xpK%4zJlS;#!IG?*^L2 +e1M!l@Al6z)ASvoTAQwsyhHI_{|f!jJ-v(HNEEhe8SW&ZA=v4lk}?IKV4MKw-iVY;TH +iHH$&`U0kd6j-&|C)@F?t$6X^yT1s7*T0&R`03*{U3Q7d6Ccpzlz2^D@x_gL^lgTpI6P=ngO!)}e6le +}%V-ePH}9g|EQ&cF9@bC7i#uglRvCjSQOwM+sOP{-eeZJ(ko7gPh241*0970$(WjZ`tjFbW;sFuU?S) +3-v#_tP3aFF=1%VxAM@^zwFTlxxEc_ucI^gPo?;yQ>(FuhcU@;9Z&*=)H(Mg5=Pwxf?{TNc16LQu-j* +(#_LA7p4rF-&R7q$AGAu3zeZQH1O%fR@8TS9BSKfId9Oo{0WU<0-IF?=bDCE=%1 ++!y30)gyo&0sXUuycpF(+h{QyUjIVATph;6tpT1Mwx;sWG04~7iC)pI+nun;{h}EKT71c8;9yrF|PG= +QRRB!n<4$yKLaa3b~dgUe{A&-UN;FyrGs~=SaD8K&$@l3&{enX-RdE%j!ymsDV^4$Jz~}lIX(5#LAaw$XHwr}-7Rd%Ad2SP<cw6Lqa?%#e*zZ;Xo^@$Jm0k`K9>4Lk}@@g|#FPjYSo;@Q&5ACPLO>tVYii>SmEG1Dl)|05TA>l3 +b#-RO<&|o&nS1u@5y!?!GJ*)1|JGCBmWAtaMC&m&fGYH`BvJ{MNlEgehAq@K21s*a+w?va|oCP#8EkKLz2qmMTUSUjt$5+~(rD5;PnObNkjS0fgN=+L! +m412=RcRBUbyPCp +mSdCR2vumBAm9n^^O?d4As=r&5h=_8x3J%4REK&ls_2Uev;F#sI%dFHQRJR%}Yu4}Ptuphj(%)98pIS +%4r!qRE&=opfA?0YTMlwZl<6c@_lC>fGZY$YnZ$5y{U{y0Q^Z?)%cH$V-IBE`slkh0ARjf5+8!aE>AEpcVmHDOZduS;aV@uI6=^);M?7biv;4CLoe1VKmtxo$w~BUf2UND +F0hyv?Sg8qm#o)f6`9{c?4$(`1?~umH&&Q7rV))My>z(4=PdmCrj+176JMCPk!C?5QssE3Xmw-|K3Om +fc00$Sde35)pOtnj1wa^T>Ai|IHAwy@Di`|mA#UY&Y^!2l69Ry>=|833mVF)Mnyubfbl8ZXR~oR{uxW +;h8NrpWv78kJ=i{z(n36b6Cy`GCbx}NNr*1v-DNS#v%S6LYUj0J-=646{uEPw-DHlZ#$(4#TyG{iZy+dI5Ey!niN$by@ +~al-=G2CJC|YTGEYJF|JAOupsBVh!U7M{D*3X5jx*&H2(_`04T6x}?XaxfXC +9AW5UHz2R_4q0XUi+DzRJ5KJ)RFoE+bQ2sRprw3+*EZ=Qv70PBK}g7k+ +?EVM?TH>9*p2RCRv#WjXtuOP&EBLd*cgrUUb#Ke3pYFq!>4Q#YijNd|ezA8KB +fionE=OU)Lzfw+bZybqd4SYxI&%YnucnYF?~yon{*Wz_!frL-6>cyY2s{)x(8{u9hY?EIHhD+s+cwJD +G*T{%eSI-(CMBwRJZZNxeMIit&fy=; +GAUe=DL#Z|qxAsXx!VCo~Tp0@muY^fRm5JQzz4CB^dg^EstvM$a4-(ab?aS2lhe#0Bl&OER6Sa|ZCZg +x&t=oAbl6hy(EsG+CtV9{xUZ6`$9DQ!q0FVURSade4IE6{cvl=yhjM9ZoEJY(xESFSiCF22FOOTo`(Q +T{Jo0c411F~H)ndhW&h*J=08&S8>vvSX6rNnpH>mcfw`1Z2rhOetNP{VcE^S4f2#o6Jxd3PV5^k--_u +Fp6!#GN`@_U5@(57W&Cy!iojoq&_~oZq_oCB02>&!fYK-shad<7q&P_nVGi!dYG`=*kyfj*iC!@)=& +eLeAniq61#vcJ?seRt6&&7B)%vx`aZ3Dod!WDyE!2Z3oo|3{ +q^opKUUpQ0>hvw}&rudqrc|m{nZUG60`jn5>r)r-b2@RgngX(mk%x|8NFO^EhN*hR|ab1rqy!7k +jf(=I}tL?_g=X^2y{$r*B8|Y1W;vxe1PEFFTu`pPRcLJ+g{l8S^H`{eaGr}uy*UQwowUV*qtDoo#AYqITdB=;$qUK6jP?~52rFLm37laEa^K7yU1YIVu>FMBw}?aA=6eAW*mQD(J;mj!0{uJ=O`6~i9>2mkbd7r{S2^y6yYySr$+p5{wNogzG*7o+c9zWiC@?`7j)2;n|+ot>6 +W7fUlOE$<-8Ng9Fx*kVI+S!Vl#wYrLD#4MT6c<)VmBemsn7}$G=P1K{f@iFbif9u?R1(IBS%!P2RZxT +A%+W{zt}g<8hwY>07*~5Q&(kZ-24GF0nUG`e8(#XVc4*6KpHR^kb%j|r971!H?tlb1RaG-17W`TYv(mk)PV9xCQ>2LQQ|RJVAAL0rL<@bP6j(wBeP +9iWw2EQq)Cc4{P+U+vI|?Ud(jxf*9!LAI_M3D0)r}N7_9HAA>h>78#Q>-Ls^T}E6~MFZH~`oHFiWyMF#X_LJBf-8(rII*GiJ? +Fdd!s(g?O@lvrn|aEdmC=vPS`yA<5kJfgKXmQYQy8tR2|l64IP&2oH(>TlTr{}7A*m@}zLv_R1tVNAO +pU-s;cd&v<_qLX`=RS8Zu>Ou*P%j+ePM1|Ku%`x}99N|X4keB?G6xRf=hd7yqq`paW5&cMWt(f}w9KG +_L_i4`|Rgi$}EccYuScmx)ZyQolN(?URf|izL))El0>ru_b@zEiCYQU6gij{WyLu6~?}+4I>k0Mn;qay|5P>XWospX#0b%YsW1jDX;eeofOJ+<%GPrAR)i}_Uots9I&>8uG)E~i5b5xM +9;60Uw1ugRnyU;GZH_557l9EjPiz=?dK$O4+A&IjD0`yHi5_jDDkF*>XWf*&f(9(Hn>4z%e?y&!&01A +jOG?FPwOWJQLi+NL4QhrGD&i=yiE}S2FperEO`(cfL+Ma}wx?F~bfU86Aetm1f?WMB=X{8TZko;cdal +wBhO2_NO|MARemHqUBbwzU&W0fx!?$8|ClV}eXOc(j<( +m-II&xV(b!IaT%`#&JIYL>yTnPd>`zT^%LB3WZ-Xg9x6|4(qREc+aoM9T^3^)`1%N8st{wSVscIBGV5 +=fa6OG;j*5w%GQhVZ3l1HNFEBiV*MU3#ozb+(ahD!*hY +8SsjM=bJZTEkvtB9Y=8C>ZYXtYlZx!;ha!pT(1OEO=$go6|MpN%&GFpj>Ig$-$M5VaopH27Y1U*OO6r +jL5OEWe>B(WWJNcfW^drg@Zk+6CuGk?tsY(b6_BG6OgM_HRcuAyH?3qv5eoA77@o!A#ssf%TF}lAt;D +;H&RGFF-o?5K?clzSkH>K%$A80bXY_U!JAF_tQAz>?Ir&vTK?M#Gx}ZdEI$p!P;2t`5_zq9~aX#q2Gd +vU3LK&T^g>$n`eO&N59i{J-*%#l+O)y#4Z~`POW=&>F7@|*_C*~RFQU(^)AEIT9>drZ=Iz-ovp#Th$J +Z{N)U#7#;vI9-9XV?;ZBA-EX5%dR-^eNp3Qia!nB-ThK_@mQ0W5euKAQg(bw-hhF3&;1YtK8l6D687K +sD`e|Ulmyr4)B!q6McbnU6GDJSJ&Y5=y~8+)rZhhI*wyp*U{jolusSVsWrg!Y)s}q&fRA`$X!CO&kS66g31E@k&11SXJBE!JpXbBssQ+3)n+ltZ_n +dK!U7N40PQamZh7sIV)O13DvNP*jPVqnSoQ{ik#F7xPOrO;DMD0HN+LYL570X>PVeTL>5^YgI4hr;@`Fexx8`t5gJ_%1V5) +k(DUM;?ImJBSH%9||2E)zZhX#8aIp&Y1?0S3aq-+A2=sA?AXb;dr-H-EtA958ouzpx?mo4i;X@02*nt +cgC*6vidY(TwkanO)t(D0nITq?PNCBjIS4~PSftt7|M>}@Cm=$*;d0)dIG+Ihmp&E2>W#n;M}DmromE ++uPSjri0GUntlUckCpRQ9J`)Xg;;2Ld?COMq{$g~d+q87H +4cdQmDMJ)Rg|NR_cp0&E+|3tb~YyT!Lsh>F6G58-sr!*SA;Y) +l4LY5oo`Ytc?`KE_B(EOmk;ibnwatIhP(5kcQbHA;b%D6Ry?mco!wz&Q{FwDeaPy*Kgx_065ciCsXHp +_>hZTq2WW3s(lfS7&VdUwxDHXLL8xE&VnZA}XzYzv!>~N*kwtMAYSdpGcBL9u;&bq!`*5TMCa+bmp@r +yv7SjEp3Z`Lm+%(7o^b3We!C2magX1xyk1BQ*KN^m3L^5G6@4%?t%0l?IX0R%aHE}bOSGkt^@!^AY~n}- +-qbbSDI8Tj>Cx3?${ovHRWBPD+K>a$pw7^tJBNy70wYp72;ybRCr*kY1rrFcofMe^R~ca}aA(QUur$` +UjHqjjw$FAW5bS!<_Fxxjw0(cD8*Sf*r(@h7hD<%XdX^v3qiHq +qlJuecd>dN>iq2OW5;|L4{cXrNpz|e4iRNq`6#QYJIt1yBN*U_Az+KHsH`;PmFcnc_*@(NygaAB&BB*}4N)7KG=qQ9|fxX~!3cfB~xxS +*o)=!+sS7kAO>Zi0b*uPDfaXUPkWG;US>w=t;{k~Hz24;@ +#9B*kgM5KjRzhqHUL>1qM`5&3$@XIf}Pum2q)wgP;y|uq&aZ$)rVfea=2j3Kd;&+sGvGSD +NoSI9>v&3mo?S^xg4r2cCZ>pZKQ(c+;+Hh0tpPN(62!>Uzig7u03`FP{2qYwW$IofD`kv98#&1Wa;@n +Wd+@t}K=C)$d#HDss!ymq|tp;m9SKg9!(Zt+!jR&Eg*`|PI89JRMj8lMwrmWmZvhjiDG-&6ZUV{#pl> +h|Sib}&YyPimT+ZGer8i1fQAG>vRds9@qIEdcQrYUkNwU}NtxZ9=Neui~TF$(tL0&z*l`-N}=9oSg&f +p@Q79P?AIfv1{3=HllYRVOp)&By%J;+#IVK>xDd|zEmnp9my3d@WMpBE3ihKm8>PxZYOlud_2kX$tCQ +7q}1iZM~-7XjcP|HH3yzhS<$(Bsdx&Zn7V(`Pe;b= +UW{+JiD`TNTcS3iYo{!a(%F0T1Momg+tUIGU?)?fhnF-huVF9y9WjH!~96hw}SL7|UdDFuMH>Dcgugx +W0~cu#qB9Yko*p-q6&HM9YQTe&) +6;qY>_zsW8uaOD?f65@LP`M6hs`z~wl6ORxD%r_2$cGyCWV7K72No+wq~p9Y@4V^CO1>I_yF9|WJ?)^ +%?4+K;b3+ZLUhul%-M@j-SAM|c(@!@I|el8Slx1^4O!B&$$N@|$odm<`c0!A5gS9SHh%(W=JF()bz1` +UE9KQ=Vk{eoTsa#|=2x;lL)>fr6P8xzfAEa}silUFnU&_qGu?`&`g%{?I8VKBAC!DZJN7EJ-K`4~C|Y +#5r%h4rZtyqQm)6@#b?V&WnWXUg=1t*+S3Am#6~7^5m*KjR73wWygW8O&>aI&VO_GB_l#- +-B$JCG~Cb#?XPxUKUwL!SLOALPROP3e15?O)T?vDlnr0jsU#s8D$HEFbi*5FcO$l>TIl0elMAL>b^E^ +a=~r(S*;t(hEEJ8;G&vcf@&5O~kmnJ-iGZJCdS7i%F-9(ohn|oP(IyU=j7u50cbRCEBSJnB0n@nlgqm +7h(HEMpBuncpzj-MiK3d5>lTR;P5*x@E(At#ake~lX=JjYW6`~$7fH}^cD)8s +g(h9fn`CwlbJKmBi*q0_ZUwS(`3Dd3zpPzM(WCiY}zhS!G$%Mg65Bp7Z^)9S%lLpEwu#y(W`+Oj!=y> +qJuBD0LT^sBv`T3R`~7WW_+K!KsxKYpKAC +>;kUmlE-tZ8e`v>Q)S4+KBF@HZnoj>(iNCXQ)Z%7|(qH=acD-B9q#xG%Ah1E13n{~1lsXn^VKb)?v(AN^QRz4 +peX2q;X{IuK~8&SI*ZEi+s8a;a!ZKTmgFKVYw8K@&}n(3l25dL&w#$l=?5VL(V;Of;#j;sP^Lj@Q(Pe2QR;V`sxLKefH`NnbG1u-@JPB +c3-+8|1RV>B5r(8&~a4p*H``MmBU}77YO!i4fZXAeSF1g=C=SAs{9{-^}`KNuGZ4Ug!aKjPKGmRteG+ +2k--BJVO7^1K_07gR8pDqY(}|ln4Q;j1d&?UKumv1wN!|hTHVATStj61BnkzJ>r7K8s);UlM{Y~g^v< +366ipkAGmTkA)`MHcsH_{4}7%OS +dGVr!gIACYR%tk*6$szX^HH(|0@MT~rnN=!b(BtNKzE_KrsMVKnq-jkY4|JU`sA8oKScURm&KS#US5T +iN13=gYV-LWWUz(XFq(7g~*bxy)Si35_EcLoOq&ao^Qx7=V5@f5;y&pI9$z$h;uB=b$=5k`Gl74 +5WcE489hM2OULG=j#zd(IB9g|2=zJtr-4;vaEd6!KDp;mpwa4j0``f8*7FB)vp@- +o47$ezw~U~Ts`-pCHtqj*;))lpe+?}!1j7f;)Fi(ORaC~m;bVAAUzUt(_qP<*lLTHOp>T@491q^?nh0 +Kn(jwu!ImXDS^58dSj+aS59P8h95DPF2_Q(F}Ix0#h$!qfQ6!%J5okJvKJ*gt>Kt+=?4<1e7P47AHKr +%hVf@PWDnSQB!|~aU1t;0b5+Dnf&vDb)|&LXFk;W%ggn7`wJT>+K +>_!JLSbNZEdGgJ7R${hjz?Hk%e(_wS!WEAum$CZqdCCK2B*2k!>)uKB%vKi!S+87zkLZ2LYmVUIy;4% +v;#VkmBsHSrgO7l6bNr~pr!&Dk6}YRaUIR2gtMV;%1aRy!Pw-)STA)LNNQ#X4Pazw02ih?me)5sm-{3 +<{7@gofjqLy%pxt7Bf1gQ`^9+k3k-Ns{5!IInSdUgD +F)}`oj6DP{J73e;ksU`e7-pgI;U(=fjsWr!(OWtdz(lcka(n^Oi7dYs%-<^)u(5Hz* +1C}BfOZ6(1*#_Yi{=j?{}RiZ(%%1$S9SIW>?c}CqB;yy?D1BJ&ZP@cC@j5zXZZ5oK7#GbmKv^3IDYl? +TYfdq!zrut#CqhL*@99c_uppZyNAlP-uYXv73KkY;vR$s=(1M*eNfiw#87WMSJ!(xV +0xpXxN9t|rBlP@+f+kDrC|P|z=rl6Q^wtow#96eSGboRn1PepvjzV()llY@|kGqXCqh*mYT*=zeySP) +wA%K_>)e^Ao*XF&3DHT?zta@%m&Zs+dY_;6~USX+S4f-c-H`k`^%x)=un=c?rjE*JgJ33r^TKQTIfNA +$JMghDFvrPEXT2Ro&iEZkmaZW7)x+cDOM$WOl%vTFr{GZ_%QKg6iUyS17A3xiea!jiehZ4w9q9nEc4! +N1P<3$rnexLBBufqDRG<3eslxX5*XY$UZoYSSI>?cR|8p(L&Bh>Vv-cK^Btgv?1AzcNV_)vjw~r8Mg8ZbYe +2yD~bs^2M{yKUTWCDj?}x>^ZjRsl1=I7Zw|ix=CH)S24gr$yi`_23E6t=lY{bP`ka#64&jV#FUe|24W +#X{bQ<{yRq +dA7!U_iMJ>`fltO?*IyF3e9l=?*A%T}!1kHztT8Pp{tiQ)L!uP;)}c(`CGlkEYVh=QcjB8t(4o9G$mG +&_iB5K}i7<4`J{?x;#~>A2QpD?J~3Tq{vLxNi?VMlbBbTab_D4?bOnR@djO +$#$)=|f@vP38}4Lw1(w%YR-MsdjYvlGvWY+rj}n9yA0}sUiXP|8nA9o@>0|g#}=Fg0h&`Bm96&VGG-H +-MH?%itL9i(PIXWwAZ7UXc@CDj0H9+(7}Vc1?-N22Cq^CpcdpJquUNiQ!GXGL{C&G7{P)XA_=$|s-}) +nY<%P_jMGzxv!jLs#25P%_W_-pjBpq8#mtGa{#2tRO{nSPGHadA#UY}YScwnb0^(60Wi%v;Ur$DZ8Cs +cqsU1cAJa24nX@Qu@lUog?va&21Cbl^0UEv^+S@%)xgQH03$vF4=xRh*xB+TR7TGsIe_ez%;8Lv``1B +&~P;P<*68MV{dX@yTsz8Ey`Xe-06Gwdqye@z9?G20AM7r1lN8nWgvH-H@jPi5z4l?+LMcn@VLXQG<`+ +*+}gjDIl7Q`XaVuBHY6QU)uf8n96UpNAt=E@BZOYFheq#T(uBwT9^$1|2!Sl3Ej8Zjob&W#-uuC2YZ8 +yBFO@!D!Q##^qO0cs*(^FMLuDb*b9&^3nQ(d!M?^!K1qOthw22w%g7l00jJYj)9X$Q^#naEH1l^934G +sM74FOegurYb`QRMdU7JnAAJmtY>fvewuY_Xp$Fw@5H_(ee&L_(_KD}~yasD~N_uQ@vVNvgDLz)Z<=! +My*#;(_!wJf$P=B7gF-8h2Dsl5p^ib4ka(H}~kNkco!uZXK8PIWKon{ +vWHusXpi=kjo)lcPbl@;)_E(ltgjos$15R#|7B!sR(1I5P65bSMx(F$nFi8#6dI(N8=zY002Z^ZhE?hJBrnOm~Y?G0RVM@tvLMK}mmRr47m$Mf>hpiCE+v +wOOU6BDD}@u}gybrkG_Mk|%boT%*N^!2aY3Ii4{T*Kcb;7+v1$DQ;?hb{=DXqG?)}gz==6ogIhal$DK +|j)7bjGU^Jh1vA0cBTY@?uq@sQ-(^K0KaC-UJvA){hQk>}T)uA3pBo{Gu?p0)Rq?eoN~kmXRr$uNkXc +_916ytp#U9*ZtlF|y>t@Ee#5rE5W-TMWBIr_Qf?-enB^VnSQ!g+&;YUduHc~#{N6BWL1CycQF8+Q{7i +)~DR=pr-bHCAwSVJ>+dx8J_jZRmHawmq`p&QfCboLx+6+bnGg@LfN_)+t5#~L82g|~G4xm-&{L(*(SO +g}T#4U73>*JuF6C2Q0o{!!NGO>n4e`s1uq170pBiQMhi=|a$d+&V3#AzIRiI(=unx&vqH!A$Cw2Pm(V +R=RX-PaAN2#ofC>dv_>KbY+mOd((6k!d2Fn)y+^~N}0s1<8JyO+XeWm5CSzQBQPRJ{a)&#DHEHf?`x~ +t@{Up^?+}nk(7}ifYT{PQsdU=VilaNdd@`Nt{7U_~61|5Rnw_xIhwC~Z44+j5nOdBDwRQA;d^|qRkB? +8T;a42j@z3!wz4>r*{XxdFsn_fGYW4M6Tr0)japGw7CUZQsl9?$AX~p>xOyU}~R}+}jYRfQ*>+5kXUW +|zf+hH*I@%JLgbrlQws6BMhXJwb_A>Q_QRL1}klU`QpZ0C7Wn^WxIfRBS{Ox5>Nu*B-tgB89M-iw1T? +!-x~tf%37ow7`mA01_yg%h2LhPM-Hca``M+$M1pH*kw@`>Sm{MbhI0&?EI8pcZMTTcz2lS1ZU>V9BOw +!p1jYy}ZCFq%eY3PfzP#%G;1d8DKF6FbBeHnoiub#rlm~RQ`@7-5A+zkW8jD@p1q{ZR1D_jhh|v0Bn3 +mm-1!XTn$}=D54CZ4MKU7=kzk +x6yIxsGY;a9M2-5x38~hQdrLcstUK&TIGTUk +XTp<;^CQD%BuofMwd;BzuGc!XMr2(P;b$OuQ%OneWov@|o2YIcn(N%E1^WE;-kZi7_=n6wrp9Be5yeS +e+DhVHqg{2x=2H6^-NJvVIU7jg%(m;O`*wCU%%1RMlLjN*j?uU8L>{h5jQ@rm>Y_;ZB#FuMw7L{_P>z +I~mkYn>&@r>*c%z~Zp@5=yAGEu-tBhi +B@%~)SPu_R+J`_7#xPDVhq6DKDb`DqYSe=c4I14d>z=tYy_|8s1b%l6X>1L_QM)wDpkY?jn|M9DUw7y +Ukp+6$Kfg~e!aew7$NX0v169w}b^FMKyT9q|`SZ+|015x&2(qH$uEbG|hnP_rY97ntt|p^N0YK9=veqjhnRSH&WdSl(cEg)ESWOOfAi7u>0yAM^*MR9?!Hv +C<=~Q@9}WbeV3f!zi(%7yuu;kdkQY`7SpxqAK@%EAuWi1^5ps)(~cTb;s5o?j5B}CIXQ_wLQ+BWw4AB +V?6fi(l%{NL^f@l>s^^knK+(IL~h7v6fEJib)j}jJ-Z_7B=&S2rQ` +HGb4WwU@r=^KoIMRv7$WjOj$A223u#(e-=^UxdqjPjE-vsinQE_7fo&f-j_Z# ++19En7-tR}*U=M7DjX%9!V9vc#5?UsC*IAOO2dQv_cEHtDnN6k2j>2x9aDS&w<7_t;lhqNJ4!DYl7G> +(DIV^wgaY#-X<2aO@pRaM|o7KRLqLo;0$dRK6P<;>p+WWN%ZJcYZuDKOQ@+Jbs*{jk8AAY3lJ~*%lYu +OFU8W>@02j4>tV=w%I4<+fxStSiYm=L*vT75~0K<=jVk-1@%Eqgmd%|GQU_8JJFFyWLnHdE?ak117!8 +(MJckn0pUsjM~}Zg?6N`G9L+PDi~Sx*g0_(lYK_-EVDsJ4y`nYe~Rs5eC;*g8_#PbHw6L2$vniMK$UUIW +}deaxEb_?Fx#FCcXL4s9&s%h2TUnveG)tGo+oU;zT;d)m<;wXifQ;yC}yV%q=I59fkxHKaXk&o=bnif +9kapr{tDf@~F1gri^<|Ht&rMIL^|;ug$}~O@2mS==AWWWEvN9_~+MGqtBndV;(u)RzzV&($j3FxVq2v*`a+>H{(~g|Dk&z=-qnX{S* +9OsshHHl-pQCmD7+E+rYYTbyk7EI3=cdy#eDz0R_ncl=VYMpO%+j*2oM*SBO0ZT!HV`(%PVf?|a?1g} +Kh1;6~n#l6`+DQO;5$=$^T@l);hIRKI8JRNF9xs1Wo5xS`}-k^LBn#L7Y{3zobv%Wh +h2Wtvv6m=9S=VKKtr2}+fgR}@EGW`nk9cRQsy2ybBx~WUq1J>32VO!`{=+i&o8g&xE=`|29rWdP(c_j3M5`|_e00 +y8=(IivEbIZJtXk6bTD+)9BCsuYeZk?&wvFGaTqG>OmQ*ab{rG>yh*1;?|G(&?m#bws^JZFl=GQG8rOK +ztHKJQ$kEA65HH^406@j2`aRfY!BZm3YK$yY()+LRJv1$Mr9zEs8qhQr=qz1LP3-D{PxdMGAvlxJ{`_ +Q3>imNAH2N?jVm;x(aa}?FY?ru|Lmd33^n{C~3`|wP-M_6_}`r>`u=!ikDMl=AxRtZ09+)n&TC1lS0$ +ia`KC~Qut9CbaL~9V%cy=gN+48QTiSh0y^#7aW3ZqHc$7D?~&!ty_0MF_Q`#+_`#95cV8MMXgpVx_AHdG`@2O>0lezjc$L^Y#tpK$8S&WebsF4$^j*sFKq+?P%}`Q+QG!gull%BMK +dkvNjZs~Z3`=rP6Ddov^g8T#U)?H_x^n{kvbkswzHr!7NJm0an=3dI#xZ#C+CkiZfQjZI?{()+{1#0KVTzgt+yV$@N;*Fekna6j%OSVc53V*F +*Q)7GW(8@HP0_$eP~FQ}P#H+K)~Kzf+PAt00vJcf6rypZO9A~ccM5SMR(A|)Q;O=GG!BhtM%cT=V~^< +p^e<*6oW9j5s>n5Z$J34oR0Gy=n5s_F%!WvgW0ki~wCc1Jm&1_1&NJ;4D-^acLT#LLBaHNENKf%j(7o +%9n>)r!xy8t}?%X+K+kJV@(7Ry(bAr_|;5(@0J#F0~o7Od8yl5WF@lZKokyO(*mHiNfU~6IsHsyRqR< +-a7wwO!Kf(wJjS&xhpF4<_ASQB@+qK}@~$#Mon7^!^=+HH~|HfW=zf-6!oS3YC>Fdt2uCf=di6?+I^G +98g%s`bX?Og8A!>ME>Pt@6h#w$+#2(}tle_ORH-e|K#PGySsY4p1Hd-%?6{)DT)tlhjh_zzdd-mJ)aMHPb|V7kyuuc>tjl=q-gkT1d~pBaO!TH~p@nTjlG7kH975oI8Ra(#zg?*K}X5FR19RuOsz +96!Dka5j|Mnd?3oW%kPMOp4_zaF2C@RZY}O_YhjODe?*@{yu(3k^N~zcC0Gc&dE|g9uS2=&jy77dxU< +}jnj5XpTwqm8TSRGS%YNRrC3oE)wS7FC1$U#xc7$s^sjX6{R=3wV^u-rpWb&kewiMS&94QXzz-L(7NX +I=L{e(h&sT1iy`CXLTB&kTYNOS(iZK_!%nzU=jH0mW6G?@kYWTxJh)0+77G02Hi6dfQ4mx9&*9Op$hs +h4%3G7lP*mgGES%y8LMV&|j>G}!?cV25p{y{tPJrNgE8x#4Q8=Am}9-aPs0xVP>&8ajRcD1_7va|CX6 +0yi0}vB65z^>U^JK2A3R*AdQiB=ymKRJq=;o}h(pJvN=xPtu`xs2APr4cH3`b7YSLgTu30uL~nIRcDt +u+BmsC!|N@z4Li~fQpQl}+8=9iqhP+&nl*X-gytKneyH!HtRU8^U^dHCao#%$s+xY-G>z066%(OEDTh +w3i02Wjn2+i@#!Na4%<$vZaqnKuQH`4Idchoj=J2t~#Yl(}Bb%T!pger=E;2Cayd;$lAb@IelGq^Qit+y`m#3n?zaV@O$;p8AshOzww21Sc{Ba&nSol5~%QJ@v%4Q7SVXnh50v}Ox|htMdM7B7>Zs;> +W{k=Tn(b`FbZ&5=VRNoQ;@wFb9g?TjA@ptor#>943{!!l;_=7WAm4Ka@<;8sQ&YVUt}jy{iPLWx|{M@l$@S|kd6NX1_sh=OZ<0wT31MSNJ$23WhQ5U^)iRXA3E +&{fk8Ff!MJ7}scgeJEdZ}aNo@;vGyAN5?=v}(06>H)JFi0>a)c~_HoL*HHj<6Tr)+JvwdI)QtyWP=7U +Yq+8j8r^pWuq~_CjFvNt<0nIm|po$?(s_7LArlQj^SJV~@6@&sB?RH}Qx9UF^e$`YC6k=mc+dflhd^^ +kqvD7}@J!`_~~lxRX`1S^2`u;!o`?MlaX~d&D;EevTWop29*+Trr0?e@TwETFsNX_wcK&ZS>GmF+}xA2QS7?O2=5jCx91w^6|ny6F!;Fhr6smZ26Be#q3IS8TQ<9YTe0Nm5a|29Tv&QW&zW4%8xy=V{ClY;G;e?+fhr|iiZN +N#p5j|+vPlDr1)8hTC(;t^i)9~Y@fz}^o=};Pm1m*Dtj$NJG_ng`|wX=05!X5ej>PaS|VS^Gszn9t06 +)xO`mFGTT>&*YdyWecxeX(`-ZR>8|TMM^Z0+zt4xh2a1zx@77!s+Eo%VW0E;-IEO3uJbSO~!PcWM;QuXnbmP@R&B_(ih&CTIqDNowfAC^sW8+`DivE!0Bga(=nqR%%zRJ>k_qYeUSRHn^CO(4 +En_a-O?q7oVfU=mZ~JOy)U1*`o4;@qC +u4KF|}+!A4IKI%Z-|>R;ij*-yLwyv73yzTEnXDpht8kqvc}7pUy);l;()XtV|5U6K6rdcC=^u?3S2NP +zZVFrY)y2N7B@lB2R#h_?CA&fX$Jn$A8~9z+p!Ma{Z8p{W{n)BdgeM37LVe^f?dG5PgaYfl;H_hwxg3J +^FYkB&1Qj=%dwwNM$u( +$nMjMn07}RBa_n$9HYTAA#xo=Uf&IWX>1+v<&eqS5^E$W%ln83$R2i}aIlfLaRXSifQ?~_ccU<6}tx@ +CrRU2Aix!e+Mf%(_^l6>!IrdHY=sy@88f +y!FW3Mgj0lhQF-4`Y%CFwMN_W@?3q#?zaOkPjU=xLgF?OSew02!y<3;~f+ln_wHX`NyE(-nQiD{QE8m +2hq%#Z8grb~=OcVAkoV!0P?6;ItGuy^nVo{jvM7)9FpRoesUxKl~DCDrbxEuREgM^UO92Xkl=`!galY +2jvhiG?9l$QHs(8HGQueOjL%sof0V4h-##<%Ez@jP9fNm@Nr8$q(BGRj7q}}mF53`Z&&x*MiIo{`&XO +{5;k=#Uu?%QQY9QysG2?iX{Dx7>YROdjY;evJAp>Lw56h=;)RDcLaKPEQYfXB3Tj2#^6?);=?h8UECn +Kj;D2CeXZGXn);V7qkw}TXo}Kya?Cy9!Zf3Z)v`RcU6W>Fqk9im$;8AaPm+JKy`;D-NjxOPt^@)lK1c +E5l0x4IiMr(v5qojlyzkz~gM5S599GV(kO`7V+F+*V;nUz=$4i;fvtK5g2P1Q3L08%|`k6C3Foz8_7W +|&7Xk!-6e!%g@U_-$?u4^tth&fFXvsNySmrVDQ|*NU>9BGXD$hlmf5q9K86D;YzNyJpDL=n<%R=I?Qr +VQ|RjO;D8_DB#oSD+q$QM3RbHkGjlTAg{ +X+v0(Wph@&ptKt!WgiWZOoJ`l|8MB_3wN5%8I{0dm8C0hejw>a6#zoI+ts=;8a;~988lSkJ$zGjxC{; +=aCocvJnNiy@z6)=LW=_=Okth7o`Zv0LYOt0p1WJK*m#466Hgg2WxSz|hg$KA2lG{#~Z{*m&5qtKi9o +==!0FHTPMR5Le@VzC-#gvB0!KgABp{J;&mFiL>IHaQ#czSo1IwLAzq#j0*4_%0U0cayDo0Zqd9S5_9^ +W^4fQXJd+b8cDGwXwT0V*kA#beyFo*!+_Q&rWkt$QoMC?WNIz;V`P0uF2dMTYVn}T+ZlllsgEs_>co1 +8ZsclK7&Ys>jC4YDce!YDJQtG!&?xkwen{6P_?U>j^ +3P;rK5G~)?iIQ57vZF^0|!F@ldoC6ta4N)~2qH1D9b{^&1WuyFwWb!AH%O6Miqs6fNce3q=2S|?gv=YrF5aP>OrEISMA +9W6$Ut*~apOE}JI07fHDULjs}2K5~$^}XHLSA7bbXkQX|qRv4O7T5?wJQX7zq2XleqFy-|Acp|?k@1C +#>|sY2QYRhpP7^!GEjz+O(6@(e%Q;{d5TiX#B~E3GmpGL&mAK^w@fl|347;m{G!iEW+u0au^BIClNHY +PMcvbKXiw5iTyfbK`M34Y&V)N$ZZEoJYf_I^$F@%&4~r406Jsn@P<|;oMc(p0g2;PLcj$goH4@{fkRIfqcg8)O2IKg36tnOIhTY&_VzdCkaz>_|M1t*2WX&o6ClY&~PY8_z%6dT8cHE1!6Vn>RL}vEQFIf7yJ +p`E>KXksV(G$Mf30{rjWsFSqZqzh7x=f*3wIWtCHVKi~fI!P>suaNH +;0xqIdN-7CMr-%qc{amK-#g!$zkcdvZDd-;pq%Vt$ZW>>sc|GjbR@5c}Rx%tS*kiPd~x%8i0?Qg90H* +Oobz&FwmJl4PI-?`Rbf81Zc+h6~+zrNOAf7ris$;eU}O9%nqfjJ1f{Mb)6=P=tNIrHWWXpbb)n}bJ@LgSc +)dg{GX0--i2=nk*r@{3K?a7`uL1w#yrqd`<*QShbHUb2M8C&ey?19-R-<*A3-4bOFXvYfVzIt(cu=>j +2$Sox0X7r(DS&SQA=1~KA&04z1#B}jjc5c%PjeqF_yY`u>6{8Q6YxwF&f&Q0sCaZMWPm?6$u>R73%O@T!AucWmH$Q$u=J?Pn4^}~p7Q9us6IJ}N1=VVHVj^3sQ +A1XHId{cb47eJKs|DyL%VrFzp3PI?DU@)f&6nHDR;`zgz$Rbr+Dj32fTq?m=m2&LWhzDBR1Yj|mlj+4Bxw@N@zg^ +s2-OUl?{nh;sH$UH#_ZPRf7uWY!mv`jmmb|^Wes^_$b#o0*-;;~$U&-IEuHVfG18V^v_EZYg0L0{INt +S4{-7)5fkQPQHS+ba?JO&qz`*ng2Ygmg>EfF=-+XoY=d(9}o3Ir8ti&!jPN;a0b8>u~eBRE^Cj>sz=~VxH$Kpa +z1;VFQ9;4=kclDSIjUr&is?^3^6_8ioY1PrM_19oVs3eax;|UlrSM*6Q<0;8l9%v0_WC=FZYhs#Zm=b2zusS0TjXAnXi9}_u^PAG8{@tmtD3M9+Y`9M%2RZ%XliySt9E#=C5^^--A +l@V2nZAum8)n>)SLGpxUbT>wY45O4kv1BiWsYlU<=a!)DD1F+y7>bQxm~CL52$EhX8^oDyANB%5iH2F +M9a*%gGR3h>3mep-7#C0HZB*ou**>AN9HfN30XU9|htc1GeNQ3e$9#k3aKBp)5q#nh38Gcd&La%9Fd7 +LNDCA#bT^gH)?G^EK!j2J*anjMIcZ!9>!i@Wo^;{3I3rqv1(X2rSsT=p9bioTy9ga0T1nVaEA=0P5aM +sK?XuUJ^K!<7Ki0hdiau^aFg(W +(^NvyU8wfkI4PayBk6iXcE@YqU(0VWD;31=+Jl}q($vabb>V{MuIdSKDOig(;g2ND5ATac32_qg?XZP +vQQ7x6cwnEtR2*w`+pQ(19-r3(H`6e1uW2#cOWdQVH&@Tug>UZl~7V^3GIRw=o}ikU62O7;h8=gqaCX(K-0Z?ZC%ep%4o;|T3x~HW%Gy_W>S-GHs2F*umu8A)Te_1#(4I8+$nVD)4i0LCK8o>lXK1ltt +ajwG#ZbGFNuLEwpSw@}n&LUS*QB-LIeUbf{-t`i7`>5x&+E3}7@W>PcPtxjUv*fNfjwPP2h9a)u;(w+o-a!$4ZG}&IsaI* +uz^Cgz&K`x$(V^8dFHALiIsM)hcrT_wK@mc;3^r6KL99(EpB9TwBy0P7L8}{i3^<{iqJljM?{LxlE2g +%LK@p?z+DPdWv470!B(^usmlxTfkICHc3Gk|{*9drYF_U`7=ebGa!P#%_Kfuj8y@z}B%W23!{tQ~=F{r)98)@#25!YjYZ}%KwM=UeG;AIVL@87j;4T)u}da1qu>sC4~ +&w-`)qOw-Xbx~!ByRtcS+Dma7bTE7^t!vtFO=Z^$^bMdF|7SVcaW%bY_(-#geK`HtMeeYD8HFFUdvSQKfm%7j;hh38=m0-t-%r4>_n62Kr9I0VakDlNQ138B(a#kSVIvyYc6#KI@p{xD#;0Q0uv?@g +^KF0$(561=z~;^+OXg%%Df69ts-$_rujAzJTG4zD+j;<7t*ewiD5UhrNq`Xx8> +ct+|PqGF>%$BW_xX;sjFU+H7`VqRkpCDajG@3VTvi4N0n(F^%rjd_Jdrg?eRP%r$VJ}F6PCx +cgzBl^8B<*oF-RzZbO0~+-Z0~@92iC_&}yW-5F6;W>Xg-m*E*{-Yw`C9xphQN7+#y`t2XFQ*LD9@#Bn +9?2M$Rka1J5Z6N@Wc6SfMp_1k?3XqXR+l9Nn!QAh6?ftO~jJ2fca`(D;KOn}yT?j&wX+1&e9YoxusHM +T`-IA+$rFX64H>$m^0zR;?()v|fm;$5XZ?s(sz1lrEUlg*1-gyxCnNNus|WNuDxD~4V(wI%eb(xl#=0 +>}H(dG?2XF+t2{RTBOb3Z|C_o%=s5KF+OZfF8toJUh^mbSFO(L{@kTR*E`2E#E%F2sP@oc7;4Azb$^B +6Rqv}zw+Nsf1idaW?sEB_G5lJ4L=n;589us)YOq$1+HqdXDHVf;}={E-w#RAahkdB^o`dpdr8?ACp)y +9@`Nb>C~6q;=9gl196sU$mHD{x9pnaV1<#Li4@rN +&d^*vdq=ex2-0W-jaEQY2(?OpzKsY-_jnzh6H95`0RQeRZx>L;~H7Mt7spco29cj-%B&_HP%du-t*zf +BWw38~E?9;-d`zaF%{3E@dj?Bno@4davLmUiwMmN1^Z&v5>Kxt;KEZgsJp~VjfE=qPcJvPJAneB8`L- +uEmP*MKnttKlH;};RqK>1#$qJE`U%H&C>@bmH_SvCrKjLcYvbsA~##gFm+Naaqb5)5mvg8qJO0@`U5J +)lTHBifL+Yhnc~4u7g3gqSSD%gyGUgSKyHwE$cN4j{H3qTKy(sE0_1>jmOwp_+o4!So4x)Sg+&*sqY$comq4*sYs;rJ +R~XDf$s!j6~$C&wYDQ>;`3NsU3|L!dNdu2$(6XAUi>;a8J~#$(G|S+hvMtx`t!w?YXK0`qx0+E#lxszbU$58#gVu?nqE(iznmUT#pRdj<;B$)SU3T~=achKQz&PAHa@=|LAj77#=p +XgxcYo_dWwYswWBXkhbeL?jxR2MpH6=Hd@Vj-oSuv!@#7e{JNkG!=E9(A$EQb=v!OUSIy?GhOjs8{2W +yCc%%k}Fd5noz<`MimzMfp1V`Yvn&abENI)u7TuXE(DldJJi98D)zD3(vti!-by3KnoKhzww!kC_e%y +{sDm!S^p$Y<}8 +FELPovI-}iw8a5mB;{cs+AdwU}e55+!YAGBv5VD|gQ{15v#;-^Dl9Sp_$0f=la0Q5soz#lrR@YW^?AZ +{8DDcuJjek~6s3$AXGgzXP5x)Bm|Z%LiT_X8lR+XIx +tckNM!E<7G6*wvAbU6Ya7pDn!99I7i=iccL +n1B3xCH{-8+6f+u&;vI8X2!)AG(mn9X5xC@8AkoJ!9B|+ +$zi4ie2*iIJ>i5gFo#3OL4vHd4I^s7gqHY2>&U5h3lXGZxfdp%|ptG7AHPU~vgfbaifgta$;IPyx)q}4+j-mo(#lq(11x6j_27Bd06OSh8 +Tk=iGY_n@~S}z#yISYusx$ALr_c@*+_+41pI2^?0{?tCbB?Up|g|)^$9yC&KoMJqyNNClv9N>2j4^qp +wtv7r+J~aCT=s`o}oHwbwnZghM70O51WO3>ilzkA`>^R*azDML~N-tjG-{t#Xn3OVH#8se@whvS)c)3 +XpJia69Td|2a9po{`X;&p$5naX6$WD*frDd +x$Cj)rakLN$zvYD22{F(tT4(Z#eeg +;+JTmwxb(Qa#Ix?kzuAFOwDG*E;x(?27Q4i06mU<3QT=&V>Ob<>rJ_#<&E`;Z4J$U+8aM$3YJ5ykJIz +l=Ej&8ymNcRk~`a^t=e99yF{oa>a3kM@&Kgk+zzDqAgBgL@UQL-8ZdQH^=fF+3U+HJ(^Tut70Mynq*~ +>7qbtk(PpdQ2kg64EKeRO3`G|c{?o+P($1?!CbkYUKAhH?^=osTjECCR@rF5YNXc&z|da#!Gk0WeE36 +1L@?!|cl6?cr75_QE~E+7RGLn-W-FUOY$Z}-LA4?Q4>=t1PbBMh-q-DGDtaj}HLF%%|h7>VbD$1vDzIGPX($Ba~DPrp~^-#@~?jzrD1?+sEwwUhT=6090R137zLu+ +)9L8?a+n5NEtUDLVD&GeKkCE(8W#qSSfarY25TjTG-$mKeOgIH8K~FhGKOSLRnG^_%dB_3*s=f&?y4L +k;c8^Msj{^Yvc2|2T{Wx<>;5L!4FO&3_=yzU$|&3FQ;T3@hj<>$C5%#mh3Lj^iqr^J5asDLp;=NF#@E +;)9HK^6~t3*kX(YU$Vu|FUeC^Zz{BP~RL8bPS4## +xN#!yz!*8RT#YAe_*n2?}rI=JJwixQO4YiG+$e2`{61}dB~x7;}M9-XzV=LIUGNK;LrMMIP{)+1j-=dgx^lx%iJci`I18$X0iz6qy1+VrG&onVSG-)!E}7!tQKsu +vsW5dP_JXiy3Of7(gdIEya1{v95 +t0%^XQwAJKHi4U`;O|Whh&i&gJt`(7!Jf`b +tI(?u*DatGD-GC&iFMVhXle~j*Y`G*rTgZP525neERRAg_UkgzcDv4Whmpe_R&m)BB-iwX3;hTtSm8R +a0YL<(JezCJs>%-;xo)vg$3KJcLg&2g#boYRCUmyRFUOCJITT>e57N*bL_&c+{0DF`$opbdneL%FR`n +v|1>6oYM`wambPq2_6s-dR1FXcpib=!Q|)LK#!l1IW_qRGwUK +IaCAdz4WETZ@Y$tX8N^o5SQ=fvDYyQ#bnA(Yz-VwO^(OB@>g#|q!?ITK9k)>Bnqe$%3aOg1&^^j{f>@ +*+g6XNE;qfNxl~!BskS@m#o= +N)h!=s?Hiu%ZxI8Dy>%`5IqWNsp$XsAxj6RzHP9*2040^chg;$*nKI#jrIJ;F%>-Bh<=de7ZRkOPOpx +4Y7X5n*6&cdC`&gYSGuf9E+y$Z7A>9|?AW1$N1dBxgkWYeC} +4hr~gFj+-xSA-04(*EhZk@{d16t8#0P4mX`RLrc@^F9fcHVy5dhy*+?Ht(hCyq|3GNFbDH5V<>}1BA2 +O$+Z!>sjH`B$GCgXzu(y0Z_3?#XD3qb^E-REhA5!ur8_a3`|VD?dM$nPhCX;hSUjkQ;3^Prj-ky|E#H +md0ENdd77lQ*T?z*%Y5Q>C%k*?yj^Ot@gLwlLCvbMfJ%+&-wAAY;x?1R!&Bj)rQ)#x_=Gty&w}iWs-4 +bS}-8S>}RJ&Ei(q^}15pS~Fe4y4uVx!&065LagzL@1IdS%;HiQ8K*;6*DLHXEQWqIDe<#wI~vBLUfB! +y8E8+KBfY0=O8C%H0R>M)Ti*4^aD>#xD4`GF`>dqu&y_Y`~tX>|JVpK|(w6aSKSB2iZUZ{m+S +|MA%gyV4^ztFV(8eLdO@Y{w)Bw#r +BaJ;r#74;Q2PW79T}H~T6I&~{`TZA*vf@j{Sc&;xeKB@6yL>t@tvSr4+kg@^Q&YVKVY(PGd-T3W7Csu +_l-O>GS0&%%;QXg#E>Y9CFiS`9GxNXiyh8}r*fXhGbah>>$ft@Z4k|zK!K5M%TMdhz)wd=#v1hS2Z& +a&Odeb(2%H&x(X1ak%GV(Hb#lF6CtO>obexX1`xqMBVZW4HIekrg$DbaDbUYBzf&670@mE@=o$AlovT +zn>a8@iO%R1`@+J*DtKKQW2i%D+#so!hFOe0DHO=Tn_;Ru*J7m1y +2fDxe~s#>R<(eo|B3@72G0;eOCfx$0%9m-kk+-F8cssO!pUkIjzBVsvh>*t2&=opUaKYNX9+cF!055S +>;EECKD|%n3Ot#RKG9WYKdrT5auC2mo29Ot1dx+PLr|xm(YO8pLf<3iZfjs-DQDG=!L>vTU4Y@l8qrM +0R>frB)`1296&%Cmwc}}^3U1*E+ffxvlLtVjbtl(}g`eoZzI$l$cR_rfA7l&td=P|wi&c=KrI0w{LMKmC31gcYd6 +GgH-O$IA)WO(>HnvrUhIo=fa+oJ5B?m#A+{bBw!(ef$J7kf^77!Qmxn)!ba%>(S$?C-G5$+Q;=`c$hD +5<(_qD7pV&bEuD1?=gQm|&df$D8Ssrk+Os8?%1XQAFJn&8&w0FB$R1Hmi^Omclph%t2e$h(QT>_Td5p +2Kb*6^a(C$oVk30o*$my?79QDHCF&+XHr^nEfrsF>|C%_Q7n#Pf|+Av-^TJznF`0-G@Gqz +nb?vzd#n95uESP(Q4SN$4B1(u-BoYY-N70H)RvDmVpt;*?F{AsgkQNkI3tQERWn1nrS(*zlO!jHk +xRoX5zHT?B!>=PGqm>y9~yYW(rlc*wN!EVY;)+?z#X1wmIE{kvB|=XG@dIih%{HOWc^e>QeI>IetNm;y$GLXo7{q +ds?2)56?B_vr;j9vKF<&hQ1J?-q!28h(`!DtWwOY-S;gY3 +k&6eZP4uL~1kx`ernK=t1&md>5YXgibO$OAt#E{3rBe-HcRhQ>P*3<%NhI(4!jiKH4S0fmOfRyQ|pu7 +uTKqIGySa>YQ=;eaCiq1J^AL94NolEjmGKjAkRGPxOGrYsju1}cX0p(J2q&>CL-Na4qUD%j@!^HBA?# +V}@LPi%Ih;Ilis(Rq+1i)ycnX#h_SvH)d<>Z3A4LQD<2_IZbs1oupUmN{LjV%s5a2;e4&{U$Abs>>t> +&7tYrLU`{7Ma1$DJFCRP|5td7CJZh8+faIk#Z1N5>CxrocxoSAT}^&D#~X~Us{1Cgm4|n4H6VStJUO} +^Um0@Oh2kOQ)kU*;X^NzUwV^I<0QhBe7(yy=+RUS#8^Rt@JMmYsWWpH+s0)Dr_OuN4sv%qr?g4 +^u@hi=WqVHrw0p%dpy|KGwd^xc*ODR*U9VGdaIjp2bMZ}`jat))gpK!{-L6ue~33fsnH!BNBs{d< +sStUz99rBSLq#ms6(2xXqw%i#_vSW$kGj_Vxhz0p0AE2v*s}sh2mvmhG5#3Ny@QbEuhAB1->7TM#cMs +@RqT??~*;-CCA%J27|IvaiqPQMw8dMF8+VCSRqg-4!vQm5JQ92ksmnST#aQV)aHMlC~8$8-o8f{Rctg +Jx+-rAyTJ?l>J*#phiS4#iI~(C?8ENl}I +jY+|o8~xv#d%_-ub(@#AY3OzqBBW+`e2jwnYz+nA6Wk`0R-2{5~-yc?rB|VsaS&%SVT81T@QVGKsCM4 +`C*<$#A}eOh(i%L%bDlUjR_z0y$LxLU`cs4`*ue8WkI!S$qL_{b!H^5;W9+@{|)IRf2LoME-a5=sdc$pBI89u-N{vBZuG9l$365z +!Sd?$uD_~8ff^HkE2g5D90P_bq>0#|EoASjw%0J%al$FscaF|*DaD7Kj;-fwLXgtk0~I`IgM_OqajpcG&b+}8s&dT6iIe2bo8fVS!`qxs{V_H(=YV$jTO|PgtAdS#14L`_T2Ayr$bR|i@ad{;F28X +Yc!Jc4cm4Z*nhVVPj}zV{dMBa&K%eUtei%X>?y-E^v8mk +3kB;Fc3xeImM6z1QlEgN^v3R8Oji+Hnh!zNow)-rZxo^-TwFf@JDN1p>3&RpM-mGLtsg8^NFNEOGc>& +b_6Z~Vf;YiRcV9=uyfaz?&MO-V}hRj3p@@KL%tA=(psy!#xY~5YdC?vinDM>iR@=Y1G;`8l*!q#7q*> +YdCmAu5_7Z&JF`ESqgLuSz)XT6kgTizpD6}DF{EwdvY;ZCKl*Jq$Lb4EO9KQH0000803{TdPD-13rvd +^101pKK03ZMW0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gD9ZDcNRd4*F!Zrd;ryz3RLdZ7SAxf{?SO^ +W7_8b#xr3Bp>-L?x0TsRZroyIhj8+$4=IGIwWZhcmL8tZ{*jW*C$ns_N*>#H_Ndcm~}Y$5aA1c$&cn{ +~FOAP^x3HpKsfIfIhSRcu{Bt+FJz!&scAsg+Zhs4q5Aw2|R5)+{@9qw#Tw`n;aqSVtp9+tqvg+# +Y}4vtU?ozZs^IOst#r{!Bx!ygkdAq|!WA$j%ZSo>9?R>e}FosFNw5*?0L1m@MW;H3*}Ew?=!&V!TBHv +Jl&}w#CaVEc>X{=;i;MwqAVL1sX4lt$;-q&;z>k`w8Vjk;CJUHmlvRbdoO%`_8=3hI|hdsIHFxBkx7# +yCBbwQkG7|^yp*nKjna6^zaI@Ga+55XIoy!sBpCqT23GY>pE5o5rY$=PP3F^Q~d={O9KQH0000803{T +dPIwlb7KjA^0RIvI03!eZ0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gJCVQ_S1axQRrwOCPa+cpq>_pc +xv43i5(NYFhM@I#lT-GFT`ZK_kDLfTAUiCEwh&f%t +H8&eOs4SDH#U7NwHfj_FA1-BbvN;g1S;V*YH;h#+sa0ys@AS>*RmgZa=^GW8Jd6RJGMgO3=N~Jui=NA +BKB58tp|sh|)T-ZgMXqoHcKnu@)(JynOtKQ(yhmVzDSCHzwMlGbbCFwtBZ<_=x(6OHpwv>O*k?dsLNS +8}|3|^Ox;%&6Xb?etXzHEdN6gWa0>|7RHJ)wG-b-=$)C&zv22|MxSpU&+elOhugEoFlLGHt(~Wk@8#4P%ePfa7wx4DWxU8peASIs0OOSwyBAz% +g69$%Unq0XTIuiEh%k%9(3y$UT#W|X>e?H*YlR$SvzQ*k#F|n0EPPp_;xkGQdTtm_l#dJvz#KarWW1^ +{9eL&I`krBF)v7_F+Sukk`kiRrHdsm_n*~wTl^}9)S#+Wyk|T4-WP;$e0_2h+`0LBhViF?KHKfrbR&n +VbGAkLgk6aqKmUYwOIcE3Iw5iLw4)ooHo%kc3G(##9$y-B1A+Pemm+es)b{0}H%HOs@0Vzq?xO~Px@2 +ywaC=0d4Vj?ebhE>6Y|0@e?Wk(_FEc?#HykYl&fV{p8r+~qjaLZ2OaJ0-btLNlI!47aSP>Q=qsy>jD^ +okFhRCdK>Ac*G3e|gFJ`B?_JX=gk*)fUa!zzZ!r+)qJp}@Q0N~UWfcC8}<9@#Xr19 +o?N`vaC_4XZ1-YLLLYega{sp>*`8zT6Q4ha0?4%%KfwK;C5)l&V4)5m@B8uez(3*0^0szRnV$jR-RVZ +<@S>fIRby88tI+Z|{PJIDJ80OW?aX3zE%5;>aEfOT1NzS!gicbmEqau120cob^{EpVD-81h*2pMu9pX +!FPAYA|NMBdE@H^I$+upR4*V{?CIc6T*t1Z;jnI<&Yk`inm1h2nU+@cdXN*Rds5SCZpWN`W9Z9cTR%d +TPJP$H6n$kP$wESXK!7$Q=M(dDBGcpUoe62zXsyyFyl6%?_if~(k7y^pw?yyT>zlZZXa$0q@6aWAK2mmD%m`=uGyiGCz001Qe001EX003}la4%nWWo~3|axY_HV`yb# +Z*FvQZ)`7PVPj}zE^v9BQOj5JFiQBRt56k7-Lj`Y6^y03Y54d!#&~tygfwo(FI_L7IrL^R)f(iuySOAM +#=%$2oZgpVD^tR}GC83IFdwSszFGjM;MRYy2l}Y>a;`V%|Vi8E2@fE*6H5RPtu$-8@YimzH~l%}_6!S +d6qJ$)hVD_@Yne8=6Myf}1qT1RVMt4BXuIm!ZRCa{9k8SavPHFh8-xdXzZdb{W6Pn>v9x`m|^XSbAuE +n*tW%8&FFF1QY-O00;mj6qrthmShtW0RRBE0ssIa0001RX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV{dJ +6VRSBVd7Y85P6IIvhW9*$CH7m`kQkB5f~uDfY96bN;Vr|I$|_#0xEyc9UBdsi6P6wwok1c!fCzX9d;ELAP+w?@;rD +I(wBZc#u|(8Q~FX3Xc4zMK5;1nTUC25jG!CO9KQH0000803{TdPTIDN+J+AR0D?6D044wc0B~t=FJE? +LZe(wAFJob2Xk}w>Zgg^QY%gPPZgg^QY;0w6E^v9ZTI+M$xDo%ZzXGKvW2%v8#ZKL;XMES3lgxOUTyB +zF?}O{pP$VSb%vTA}wyx9vy}Ni3;6qk&SIs2m1K7nru>0EugCLlE-cqs^qRQCnl*HMlteM#6oK$5kXi +C;)O&U(g13V=){dYsT;L#+2nJmXKBr7)?R&2~|P0dvjXS7J;+T074)5*Fnb3*f&Wl4rX%4M<)PR*+X!1sY +?I3m{x+q0tg^?Gi_vMlmOe~k7)fK1NdZy-G{!kWFUoWYMH~jK*-M|y; +MztQoMJyV=Ov;pU`ACw}i#1fWYhEgXxF+kKT6O+N#nOydcmA+;9Wctd0n)8w57LfT8C|-oMgs0FkO)r +~iy1jxoXyA?UY#voOqJ&TE=`nEaHh0XWm9KGS?6Jr@fm5|SnK=;c%`-;dhkyl-=Wcxn!@%6|K{AT%;uUE{J|DSrOhi +mb;yzCGdfr5AFoU)YG;0o|E9>*t58J +{*kdWJxkK%)C?ASt%4$^Kz1(vD@$7gclQIV}MOgw*M#VZR>&?klk(@_F}iA28B3lTRI~d7NY&-z?r_e04#wGIzyG!lo+L}{Uf@Ie3c*SkNR7<3C +k8YBrA#&REBi7Crc-a%z)I069ZndIftz(&gc~jQhy#QK!n0uNMRo>gVpq*%Faa_tkm&B!8+&={&80FwkbltKo4PLRK4FC^qm-_ +iO&DBnAckN_Z3@YOc=l?AxWGIzYwxEADoyJhq%qme$kbn%vbQ4`h;5;ZLlB4!=xa!cV^o1csBH4W+N3 +X$R^@e((#H{H>J^R4WPYC3M@Qi=c+a@R)v)S@Du4HE5|E%{mc8`s*zsYbqW=?@ut)U6qzbMJ8F5A>YP +Sl=_6(99Mo7s2`-M9|FtBrE3Z>yu(_WHR{?aB?71EbFuj^c@?|eXMuRkhEu>t##x2h6~Lv$4;K)DQxN +DN#SSI$TY*YyJ+yzY8rXpRQ?Sg0VuwngcP9rOYtxNfcMnd|snS>DN=U!l?iZ#~DemUufqNerVQlwnvJ +oZ&*h@1fKtWh3PFmGz=3iWt<(s0+YuGP@Hxiei0L{_^BFc(daeW!P +o?Ezd1VibRg8k6M4K8A2|NfuwaESSBNMB!%fRZBY}hOWf>9ILH+G^gwUv#?ap9a2I@UpfND!i2?Y^??|bkFtoee&guU9*USDQ*+oL`hs=gn-J>)Rn2Tb9 +iN>Xp2y&U*eP-H=Q}_@6}^SU{IKcxGq3z8o6j$+BK*eW(}gzbf(`j%&>q750mp++Grc!(>8oSnL9HRK +ysGnG-UwavRy=e1{IXWv2aKf6y`uFE6_R0rf$OzMqU|b3<@KwlSGo_&U}D+HSWs<9BW4cTb)a1m4nHT +6l%5t5YPx8#7@;f1Xo&ZC!3^>E}`K4ZX0+8fmgg4I;T3UqRnQdT>7SV869_M@bc9Wt_YsP`F +U7aVAm0Ae+~0i+o+N=(3*My^w!3M18y!2J#u@!ccm8*sRO3OrV+0J&*n1~8YrFYn>fYBAddt&xs4ZLa7@tp`u9dt!pKK8p=9- +uJ$M=2Zr3^v3hBDDbIao((rbxxv1ZzJ9Y6*pE%Uaja<=UclwSgdR;sgM+40Cl$*258>KfL~MK|VtWqZo(4%8)UeTsFkO5n`ctKW{PtTRzL +sw6PbJ@CPc-*y^nH7uCy+fHF|cJ`LC%xNWnTnL>ahEhlcBgDGEL7o +@r;M5~ySJA+<4C6nRV)$2vawgn97O$53Vb~D-O2OOeoE21|tb+13;M*t5jIAkJAE+<-xfd0yK@W%=Z} +QkfjKqL>#eWn+X$k!8J-7xv(t%ogcF9{qfmjL>2|{LV?_tLC%EsL}#)oMnFq~VvYc%LDH>jhGz*67%3iNTZ5S$7>&B^K^}Xcv-T7Gn7&Mz^pqE +Oa=$Ny?VJwD0dJQIP3h&^(Y^qXF4JEd4JZ>gdhg^Tn5Wj|&2qED^UIdmo{juUvVpMYGErOEEbWOLp{s +9=zSkPEDj{i6Hk+-hp8-RD>yqAA*?o3g2YCcaa|WyrB<2XbEppeueU0 +TR$K^GVWc_R^2lF?WeRRFF$-+3CC^%c_Vd4OJ2gI{5AKrITlRSHUVRI(Q(c^h0xE#$c+144k`w*cufC +nEQukZkCbMamE`#F=Ruk9Kvww8L^(i>9)@yi@BKRWy;nJD&a3;^b9LHoQZt)6ZKP_w+44vu-;ht1{h<9j1@ +;{a%?5S8R_HLqPkziXA9nrbMptTM9D*LYI$62e}-Pw-^r1=Q0=MwcOGQg`F2&E9Ojmw<#s|EPK +$ibs)KQAeuulP{+l_meAba3x^!j?>W@(da+Epx~|q?W_aSBsMAlUpA_cdT*91BPe92DX_hX6N|wX{mLX-Oq`20BoEVJ>%w@jF&w7e{%cc3HQ+0UEwN +<(eG8>%EjG_=%P_lhWE6!!=27Qg^^jm&$F#cnVoXgwx(+R=&0nzNe!uS&;ioE9m98?T{zA_*95GPg;evmj;DLP1@#r{y-&$k-ZH!-%p|4290>k9NeX8m-r@O +I~&p`r}>>YnH% +zE%JZSu;2haC*!2N3*uJLpxay8U+N#KjI9)Lb79sM=S3Oa(%zGrvy8z{#(%4`@E4@S7UlOg+>AA68c- +TikJhM=I*PcE8rXTuIaY%CP5+-sa_i1ale7MP$1^4jGwnRA*FgJ12J@W0FHH%L6nLudpR8I~(qK+EKf +Rjy82u{7DBqG9eXN3)}LvO}KB#q6f5}Jgoe-dsaDaJ3JebD$wWENX+5Azr#Ja1@QL=ZUg*v${Ewcvz? +Q~_UmStJ#rcs9PQ|SjSDY2M08sSN6VJE-@xnj`S#mU+olg0Y^U#lk1IT@l9>9S~mZ26b2io(ox)1+e&pN)R7?qm6@u+P_5?B6 +(DA}PSdV}pZF1Tq=aXqKb8HzI#u$W6D;3Rh%k<=j9Dd~M3tEb7AB$(Xo1{gXDo|H&YaUaUW++Co8zbz46#g${43s^sd(9h@NTc%<~5JientnIYBnjru++BHuS6iXvGxsZtnsnyRG0>3H +KMDddNruF3Cez;C%dIg*@nw%N)vEIgme@RT^w=*6Y6tMHuPIYo1G|6`IhDHy-4Z2NW2s27?FB~n)Pqf +d$@aW8O$cQbO|k0;nn!8dNGwbYrQIS>1jzx`KE4^T@31QY-O00;mj6qru)(f%6x0{{T!2><{m0001RX>c!Jc4cm4 +Z*nhVVPj}zV{dMBa&K%eW@&6?cXDBHaAk5XaCyB}!EWO=5WV{=2F_t^AeDTOX4BZ6Zk?~}@-iJg#923W%Ulxmnwkk$?Qr1>V@1Kq3&q4 +J)hn26svQF!V1>v<^F7y9S9U|#4hL8$=a5X7vdK$y&&>G#+!5}Iz6Tfmerq;L}1y(f~mprKqRSiwU;h +q!_4lO%MtxD8@0hvhJ`pAe+BNo509ugy!K2gQ@sl^%2VA{LHE=BUqh%=%Wi~RHv2r8vuDquv=X6l1~G +e`hBz#x>t!5)QYW-wNBI{rtS35ifc#QBc9ibEV3D60KX*%L(69^k98T$4q;g4YLb%o|129W$KsNzy8< +O%2Yd=SZRBFfQkhPH1cnAHIi({KEWK5i)h(yXB)G;C=6@)S%y{I`+$Qq +SpwvTkM59U=Ro`ZnfpWpulAnOm2toM6C82TJPVSuh3IO7CmauVfcFpuZJpF;3qv?^>_dyeiyf-_A7!| +aimynve>%4;xjGZf<*=^dlj0agw0)3#Xb8mAPpZSrUbLITxu~l`~fiCL+%zXcjJ&w<-1UVY8{dj +zy0-^sew>xB0k%CxPxXZ}<%cjS+o`MVmT%r;_i!%g!{7fukqP?3fda>n5z0ris@$JqCO6FVc+k{zHm8`poooh+-mXq*fY +Dho{hcSImd$<;Rx?daP?~kB;Hs-A-&H#wd#7R@rA|BhS>#Ja1Jr&F!RLGrf7Zx-63doy()LTCZ`;!=qYZXOc&0;b6qpV()B&d>PDua6!l_go=89lm(5g+Qo4W@>o3mmMtvjIKZ{|i%M~;Sg +-f<^>NNR&eCb2fm`csUdf6k{|jFccf6zW?KK0!q#?L0YqnT566NcHK54O9avhzVM+GFvJ^?dQUbX#uM(@s`h+RDRO*K3v3Wq9G?9FD+$Tnp0ZL%^b1$(i*# +zPXyw^?U9ajW;vN$)JKb^Ji2Im)E?%MR^u~MI6lVnYLT{n3Wz6ZmC*+318gun&2G`!CF(De^A7+iTSs +Q{1otU?9tQjzdYlL$nV+JHyHUx1{&B7ZeP5&EH0J)pVIyfP)h>@6aWAK2mmD%m`;=>ZC001 +Tc003}la4%nWWo~3|axY_HV`yb#Z*FvQZ)`7UWp#3Cb98BAb1rasl~-GD+cp$__pjho7?nL+vSX*kjO +C$Q)1^SuZmol2C<=j=sF)2!Y9tlME%M)YNRhIoBu?W8S(kJD4$t{WT9iU+lwwABhGmb|&zcsb*UP0S5 +GgQaQKczU$bHR)EU?b7CL>g0sYvHG(chi2c`~-Vrhgt;4;f(^_j=2>=cmb=^Cdb#K_8D$KSTW$>i>)S +XN&&%qW=l~b-oOGyZa`Es{0CnQ^3@X{WVAAoS2hM&+^qQG2JWl96yQ7=Y1~VWrR?SdlYQNvbqWL$UfsQe(A_7~F2K-aeN=~RK2!t@t5njJd9T+5>YT1gV+3d4Dy0j;wTgPp+a +<_(?}#c?N^wmyk|8Yw!iO1$wjvVOkl)c9twkl_iDl8f7`a+KpH3%ejDnAQ7CvdHTJU@aepT9q +TVtmV*5Ja5S~#1aoF3Xxy+)XCA)AeVxd-k056ja90Bj;S`*88@HQ>3yTWBnvvMM7;3Fwv2?LunN=+{3 +*FFDP(5CPWhFg94#CC<=lTNj*BDDMbyp*vPU09+%HTe+slP0$Ar{c*bk4wog{K8#n5YvzH4t~8=i2ku +632Nlh`x{Fo(+ft>K1V!`S#nzvad<=`<0=R04*}ZXVC%p;TV4euEfFOUaPlzI5 +^0?sb-pd;N&&l{%MLGwkC@M-}WSF~=s?ZcB-xijlk+!;d1-?nt*n4uf?5ggUjKeZ;J +_Cy$<#(WJgXso(Loi`i{7Yb72VdJo^NF3bS)-wz5b{+g(}80UKlj6-x%;ws@paI)*EsXhe|0R=VGH;9 +0cG2u<5X}h1+ylCvRc8cyVGY*rK$O8ZTFSU;_;#nhcK;&L$LN=MU+;CwSY08fRvkYZg{yQl8Wq}5+@1 +eR40im?r?au*(gl?S4q>7dPO +p&Q*7(?4w^l0U_Xcb42bry#{rChnpGQa0kyQfj258cXnWn{%Fjj)&6(jYQ#L?j!2sRft5T_C-6A-xJK +D{>4*jGimlTj22YanE)zB^YL0nts2_ +ZW3Wk9+XU7ku9!|>#pp`ee)!R>o1@8O1eck)%+2M+2+hp9*a5n{G5CYQE3_umwqHk!cG!G7Qn|#bh#QA#jh0-%s}A +el+_Xfw|-4U6Y3x%)+L$%q?{OI9#8Rqszj+^^`U^NL+h;?EIMO_5KG?O9KQH0000803{TdPPkDG57`I ++04f^*03`qb0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%giZKk;ucko~oj#YSkFnGR?oeTn +YCtp}MC}TFLJDw^D3Zt6ifis70M^4qO(h0spnq_chBOX5X`h|F`AZ=uDfY%}v{I-R*ger@oh(OD&8z@ +HZki{(vl3Rn1Jd@L$*0KmUj8TH)dp(esBA{~G?;Y|N?VtJSLDJJ@W$z1$Q$R|Vf}PloGwn_R5`e+|cT +rPngUWo}ix&A7A=5!1O4QIae`q1>?^1IBbT7OWI`{SJm?(1gHS-~3(>m@tJ-LlLtOIAIC*jZo@8VGxUrl0+??oUDYu_E@W=1L +ka&H5cHH4gyk_X0lrbp7@UzW@I3pwY=-_K1)F6$k*dJ%jgW6)0JrpycczO7P34FJsphY3kiX`ox1HqyivMA9G*ZXD3@0Jb(y(hF>G)(FoSOn<1#t2>1a +gk(P~lH>6BP338W>mi3{z+0_`SLS;Wv3cmj-CLx2c>_YO|MECe`Nr!cgJO$$pxHasZ2wNs|a)Jn>56ufYrF2rt!`(%y*z|E1P1fgt}vFy{4&#-K&p^3ChvkuA#W(G7oq)K70j;LMJ8)b%7D +6T1eAEY`?1k2!^YH}Z@Xh%G%6Y(g}PusaW) +XORF&@v|T)i9@Yf>_J}|Y+GH#cy;)j2t}5Z4@t5)5KUTw25F@W~qirxiwGA9ta{_PCQ83(~9q?OpOHn +aEVM+8KLZ5Ucc3dHGncziGey7X(GcsM5!o*P;jonH9cWddiG2Ye8P=4h)@PvDnSliYMvEsgO4y8x +rT~hQ!M$|oe62>SYJ1I{%ta}UZrBito5ReL9g`!ehG^&ndQjO4n%~=g7<>BoeF+co0DZswX+amT#?=A +-PmqUl`w$caKoEQNF+ewdY_tvNaUvblIXaOcP)A|*{Xb1}n#3=;-4i4I@li@vP2ttxBmOz +(wSkZ1gSSnini&iNSOwcaR9KTmh}qScEFYi20Lmj1E^ZLjuz}tz##PviI9 +U8Fb6oRve4uReRFkj3xD(SMPtdm?xet1V|P8N*FSwL*9k7$YKv=CYdR<4mJh2j4*tKl@7mh;=H;u~ep +c{f$0!bj#>pqQg^oa-$!xen#j(;BmOto|3qUW=;|}*}gIUiE%`!IRqm4~~&EfYyq6`5mW@1E2l6ag9t +7$y^fEWThr=^&9G4xu!nT~wi#M@(G*UH?`XFNIutthX`asu|L#eSdMOKlppu?#AqUF+hNB1U>Nu_(>! +hS%7f_5J5G<860Z1UVl?(ML?G-Dy@xu)!z4(CK+!ZJ2Eyp>0YWk1u+ZaANgMViq0|QcTTr%wd#-`XF@ +c+4&h}9iHph6!k{!E6$`QW9Cc}rF5AT02Muh2p^ADx4u4+Uo_Gf!_LyjkkEZ`2ooqew{_6%x8=f7bc! +`Id5*~5$|3nlijScQyU?AA=1hwg4}iR6{hOg|rrtD<%Gh;LV_8wNXG4_lyK`g)J@-U-X@`!LLDO0V0>Wz`_kTMAW5Pjq9}p&8lrsP$_HLdXt3LE1)XmXq +<&JQzFO?u(KMoV^ej20Hkmf2NWW +(~v|DxG3pH5*$$+R)I-5fn(kF3)%&7H_dp66sx+x2)9T%YkjJ-tvb-~GXdK%QQ9g#vBAQ)JeUj4@T@a +Cbh+`ft?lKRy$5J%Hllf)H#?T|Kk1zQdd%HvC9_s6q&d55ZHFdeUE=xijZq5c=krhsTC%Pref?}(MkB +In#J!MI8u>lTPc9f-N8@6p8$Y`l+YOKbijXcus1DIZMNjH9)}l8lK#*}Ir<;cRNzQ9aCqJjeoCKf{#WJ6#j`~ArnPrped+1SFY2R +lOX}_?>0(lAL46x8wl`j+5A|6A7XOS*A0IloaPBb{62FF +Gi2mCzaU4AiLbYuNMd1-H=HF3nt@1p+`3H}dIO9KQH0000803{TdP86=8UFQG*0G|Q?03 +!eZ0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrZIQjMgD?z*_dG?^2_#hZN(@)MbEoboH +<%JB5M-OBPk(9nNeE@Z_W4ds4lTM~UR9$;29%~B9kRSD-ND@rjL!Znl4w1sKgx#v8qFRRLNw4GY?+Yr +LqJsc${VYP8zAayVD+NviPJhIK%=aA14d{E6B=TpWBanj0@m6pqDWfra+>>%>d!*m19z_3wEQN5F01w +JFkCOo&j-)ov7Zg!VvCHaWr=8CT^!pro2U*z6jLaJ90J>`=2t487S@920O9KQH0000803{TdP8q+rFgE}I09F7104o3h0B~t=FJE?LZe(wAFJob2Xk +}w>Zgg^QY%gPBV`yb_FJE72ZfSI1UoLQYODoFHRnSYz%t?(;PE5{7RmjXO$S*2Ua07}sg9Q|n74q^66 +S>mBDvMH6GK*1_27!c7)dB!eO9KQH0000803{TdPV&hS!4U=k08tPC04)Fj0B~t=FJE?LZe(wAFJob2 +Xk}w>Zgg^QY%gPBV`yb_FJ@_MWnW`qV`ybAaCwziZExE)5dQ98!MPtMcZL#lTL%OPup~`@0I3b6+0vp +Y1X?;ptR+$)sW=|`<9A0=Z&uQ7{$hzo-pg~(9Z#aFmA0(lrYOZ`Cj6^1vs|l+S$MKL&1)9cGsr;NnHR +=!%F_Z`**Q0GK?|K!Nvl;^f^N4s@kO^hn_0a-nKArbi4s=IUa3ZAms%@5gQpZ~%T~Msx8V1^V)gz_{P +FoS?36{ksZ>F`LaY$XQ|_Z8RjR2AS-%un^^VUZVOX%PW<^qP1`jOv!T3c3fI!6?41k!4|?WI +<;g*G1A0@WkQA>?ht8mdh(J#81zV)c%9teu2(moX2F14y12bOyJO${%jL(58@3Z=$#O1ACUUd|&J^RN +2A=I1JPBisv%K@Rf;NB7dGlJr?zKB+;yxHtLn`vUcYgyZZw!!*Ha?IBkwG!H&MbvM@|qjN@CdF2Wlo} +c=i))6-%ekMtBv}dVp3U_W9rq8nSE6Xxi#cKt>F=Ag`riTB&sI%Z?_aQZe! +V)o{q(XuFK?}#L$0*Tf(uDCIuLJ=w+u=^+Ho1kL2x-&TqcDHsxVpFC$OtF`k_$`m3r*!VBut;?xuy*A +AQB{T6R{Au`aF7gO;os$~zbwm0UWJZO$_4;xcFg*I%5i4WM3OAd4|eT`@IQl;R)M!b+8HLmE(-DO6Kt!+P~ +zkee;vaT_uPs@kOx0m3()ZZYssV43eDgxj!d5r5j|HBGPv+h|GW^30#ikchj@d@&m&dYIKS8RAqa){} +;eQSYzGDay#zJL+}ZCthv7LTZO>N=s#sOxdFMfMCM@o0il`s9n1YAnI-k9IO~dwe`n(XRh7T*nk9C`%}Frz^}zFQTQy`9Bb}Zihl29;aMVI +nZXus9wQP)T7?v#Qx@GoI8hXO$+g=vxW(Ha#wf5tPs3ahjfC`@&*!7H)%x!8gk2-6b%tXFmI^^cb=wPBSi+xhH?^s-L>Ky_;1v1Efj79+?P@iRwj4UUcqYjMC?X&IAa#H=9$P(N*P%;8ejer;c;Rj$ivfEJo2)C@qYe^IYMMBEDe=){RL!-YN +Dsbq(g?;H#P--^X9kcDGpl~i@1QNOgwtVT)#iLv?k8cbUeRkKC9OrtBkOOatcV?XR60iVNuKaFB(d`iq`^ +HP_Zbh?jTd_kTY5{mX*=!an=gFVEa3HMd3lRS6G6PlqLY?Gz5M!u}Mn+QNPS6}i!RMtG9+^J2>2;AdXMG>b&T`tt2)^4)OIjs1Blk3J4FjAO|jsaO9foIyU{^DWNdenf%3X2MYaa^M +Iy&cT2OOwp5UDDM?P_dwl8um&FgA}XX#n~U_|@a?K1>^3CRQaBe?oXfxUh6MreQ>)1 +9-RGdR}%PhW;amj<5|5RIZDV@UPpO*rVh6P^Q4o9o>u^&U^0t)T(#?2oU0R@R{yE^Aq%oeDfiI0-)8{;09XS604@Lk0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPBV`yb +_FLGsMX>(s=VPj}zE^v8ulEH4nAPk1@JcZX&B4s?lq+YhmPCHE688L7=Gzt+WZTI#wNlH?w<&@a|ets +MGDIP(oe#~P+rNAABm@-&*a^zwVqAvwjXUy)1HNE`L*})A`oiNy#q|xRFO$<3jKmS~rS55d<0zwGmH4 +%KGbu@*VnrvT$06rFbw&jA$N;QPO?|@YUr(roIC`%0XQ)=Z7m>1+1|29NIZZfQ(EQO_HMQMw6aMFIn4 +)8L#gtY&N0XKTChY<5MyT)(aNt!QN#M)Ygp754ggt(vU*K?h;9J2}W+_aBx!OMJ)3%OYYWR6*TMdd{- +HEmm6)Q&BBM(@sRRbPs3XJtIWX4XQvwL0)_i+@l{0|X +QR000O8B@~!W5m;ebHUIzsGynhq9{>OVaA|NaUv_0~WN&gWV`Xx5X=Z6JUtei%X>?y-E^v8EE6UGR&` +ZuQN>#|rEyyn_Q7F$yElTC$ijOZ#Eh^5;&x?;&uvJhpGBC8%GceXOuvFp#08mQ<1QY-O00;mj6qrs4? +-cJd0000r0000V0001RX>c!Jc4cm4Z*nhVWpZ?BW@#^9Uu|J&ZeL$6aCu8B%Fk6O$Slx{FH6l!$uH7N +PAw|QOv_Zr%q_?-Dp4rUNG(d`Dk#d#E71V6H8eH308mQ<1QY-O00;mj6qru^7Y3&2RssNKR|Eha0001 +RX>c!Jc4cm4Z*nhVWpZ?BW@#^DVPj=-bS`jZZOpw{vzy4iC;HB(aCE<%4&AfGJSgHkFbhc_ftX)zFb@ +I^%<$=NqUGhXUG}bB``nK13Ol?iCsGLVH~jyZ3;Lg5l(y}YX7`2H{!6YNVNhL*?Eb}gJi0GD`{n$7;e +GheHu!S3{_ATk^gq8``>;%+?%(Zx3c{q?efb}M?)pF0!IP#4Ks8Qd1O;O#MdJiR!4yd{FifB@4%(;!@ +kJ``S<*b4;tnQ)B|Dth5$Fyfb}+LekR5~W5@Z)rJ0jj;)Q(AaA+n>X9m?$JV7<(qMSdIu)Q8cIA$N4R +i}78G@0fT;qB}I$1@w*yb~Lg}KdykRmkRJ567Ohq$3!3Fp#=Hkh{<~(1m5BBF2Q$UxC8Tys2z^(B4(F +h>xeP7Ly~peb+}-M)4Pz|k@SvuPbHyt5vav>5onq2$Y>o916@EZ1O4avA1BI+_JtP>Q;`&&HN|%+q$- +LKn>^1}XvU5T$7afjW8eRAlGOzxp^t*@9gYuQ$%jZ|by4DUcC;7qq_Q^|Vi8N^a+TL_)+C#(%VnC)u@ +6%e<2FPOc_?X5AH}oq?sX9=PNKk`Kiae=ha3hd#Pm#u#YtXR|D!@R#oLdat(qBPo)dJFO{5Vf&H_uQf +;g!qJ3^|!1)y*Sg`gmN7p`Th6ixiX9zF*3O!jt=RO2>EqbJz9eiSEeAIeMtdCp`8PTVUpfu39~R}FR) +vUj7CIL6lyWne|rIMrxJS$~&@E^@4Hu`I4|!pN@mNA>} +3wk`xhANWuiktGgqj_EK=1+G@X=Bezr;;TK?wy0kjTD}-~9oNgW#LLtv#|^0!9vL)q&HBOcgr*t3&SV +>zdv^aY;iIa;c4=*KEWWB1XGIhu^b=2E+jDiLpAv)1n5~)o*}Z8CecL}F#A(X*aU<>WhKHj^7jhLIZ< +zE%u6U^2)p~oQ=iX(C)Vf{{2fXUSD3(dnkoQIjeuCP&bR@Rii7jl(w +%@T=VG#X+G=|OFp*?KbD8zEfSOa)J}TIH_5y7QybPZ%sN=Jm1NF3fddH7>io@>?M@Bg{eIJC<1X%!8MNMedh-Dl#anpj+znDu& +XOj=~X1FH?Kx$7ay$#G;tSeLalpDXjS8d4c8<$<0`k`B2@Aq)>W@71B*JH0C|msT=;-ctcTm6h(5nJ= +|q}fbk{LPmv^B6_JS$Mr&!MS@vug++8)|*wJkvWo-34%jK5VsCgzlI7DB=k`D5nIpqh%KQvjD@-;Qr7 +l;i-yVJ+`nG(;Fe7hwaxjd(7@_OnxACgu=(BnAd`@F_qljKcR%-svmYBtVXyH*fG!tuouhswZQ9zzk2 +@e<>O+l#{tID_5xDn}Bf)i9>D)f+NOnQlmU7k96^QHEKliqKxQ(x<`=(p5NM*{tw6=J=IcY{l|$y!ua +^{jdM}SkgpI`167W{SLK$fExfbzd)q_{9>TL$E|;TfZrq6yTxzei=+ +#*J;CEa20E{u0L048`Br7If5Fev;bd{M+Mfpihp&*eq +AKVDYMJCO;j1qJe7%l;f-eF0Y9fPw316llg4F^4fG>VhT?3s4ua;U1t?psLeOvPt9?q;%nZ$)PKB0~O +4xJzXPv2FlKU9Lcai2$;DtG{uL_`%bfK2S@tYxM6E`z=mmYk|y*>V4gJX8D)VSWOb>~!U>ptGrh+w$= +da`pJbNBCN~)&W%fsSez)tMcu>KwobR2X2f2py|R2pn?A2!Ot9f3@-!uJho8E)>IHRXl@x;64*N{y4}};WOYKTsv +s9l5Gv)D9)aG+%w+@Eo555*3>D{cv`{^Jb4dt}N5YM>&a=E__;dh5ehcT +m{7x<`U?*USdr^l1YHsJGT2i&WIy#YtUV>qGO9P-2+`uemj>(h3si7Muqd3_H~t}>r$&`4m@_f@Z|C= +0BUf!74jV%ML>WRxE=gjF?M7g&mMwR|dn1jp~OvGyc0pQcBJ2L^TKj=iX#Ubx&s2YBm@VHW9Fu?UBTC +X0~{YcVvf_R09Pw7-U2f35{qK1ki`rrfCdslu&SwrpO!e +=-pk+-}f*w7nhe5>ZzL&jv<_qyL}FZEA;3#SiuNv#@!+#V!QHO;-|oX?b}`ALi-}cL~rafA}8}rztsr +&AXALIiN};zHE)U`HXVd8ybp$q5Jo9&_K$wgHF#PQP|9nyI(LYu|{5GK3^lkS=OFHl}-M0S`{ +jVhYgnq(}25_!xId;xB!he0kif`6meezj>aYNWXSz|IImmPX|z#Bx#&vNR(o53dIl@C2*9Y +XbMJXm?23}h9kcu2T{E0L4fK3wTj0GUnSuO+5`QG18@b35}@o`^TNz8$pIh)XuN~tw@Su#c(@~(9Rmi +7cOigyVi#dM3`kORM-V#-2vB&(gsTRP$lq&QKq~+#0b~UzXCP65LQaFVGn($ua4kgPRoDU<8-=@oSpO +HuSU?@9c&#OXs3vwK@un2fS`MfK749e$e4M``2co=!-Kg-Q&WCB{A07))^s(FD#C$p?jQg`pr6O^2;2?Q)zhydV&#_$9furT%-vRI+E_RJah#j6#yuYnrMD>px+1< +Q%U9*SXeEoOrZ=mLMQCOfeBQwI{z3np8~DdZ_&0ChdjFvR&JBEj3;&%PxZXeL;|BgnyZ$NbQhV|)o#= +$4gMCehkcOR^jaoGor;O&7MUAbi-}DBN=%Vr>(a}YWDr#9LTrV39QBJ`s6uv@4wB+-qKs)GIOa4=iYE +uJj}lERcN;}}w)10z +C*St&H7RM){``t*S#fwWJwWcbj97a>m)8~xh7+j=L7`6OfpDKCOb~^}IFj$m|S0g(T`F+lin9RHF +0QMBbR*Z+5I`lYx>kLLN0FX8;9Nz#9O`Hu=b6kYqJDuVDI|LYG5@cnqFwMi2H#7h1zoZcrH`M&njBz4 +i(U*5xClc;Z!m23=2^OKLx;3P~kC=UOMTO`S9h+}W(8$(z70ibw7?h-&ah+RspPI`#%F#Ij5 +E+_T4GBP40DB0cb=vXU<)E+~4X@q<9IehfU=?lvq(5c{P=GwrKic@i$4klZE!sMR+1115g*?qh}AQ7hbVQm9!{pbu}aRO*ReL~^!_H#R}itfe}^6R +SfT;my{c&58H9LUTZxCWu{*{ljWel)*PhFLB3Nn5N@Go=r+-efW8T_}i%Y90V*kYON?Mlt*9&X1k+!{ +-+yRu%A%8#w9f9m1ef{o~Y5u%=rG{l2;)15SZ5bHwAB2S7Ti?fO)(4*=dBnB}5?dj)xp(jQH+QhD|3$ +ZB+y)u$qeVA{9rr*A1UKRQ>wATEFfeV8xoq`rP`_*azRC@7;QWY6_M;*>vWW$`N*(d=5!XU8`%H5PJu +8ArM8U!}rEwp8mc=m-zSFm^}Nqq=M#R6Z5sy2>qjn?FXaGmi|C^!vcm{PRhEBDAWC_U*PhaC!o +@p8PCb6bGyOiQS64pv}$GVsGr8fvck&^L)J&?11E065A1W8!^fa>T8o5SGlr#7g8&3xI_i%XG^&~q4+ +hD(89X;+lYS*US0b0R=!iyBs)BQN^b4!bEtpsE&RpcNNt;tYc9_Hbh;e%3vnV1z3mKT$*kG-8m6rcRp +_rChq+aFDkfF*WbL&5t^vVJKZMw +CX9&q1G|MK_Ye!;kqKQI?Fv^Wz>bgZ^S^KPK=#gIoOcdp(_r(UX*HD=Lh!Y^e+1=BT{&?J)sYw5(z@} +9GkT}kx3A16%+a3F{8MAdsMMW_VA747bdB5ZGNDeI=WwGbBj-Pih+l9dO#K(uvvcgHVwey3TEht=$YI +yDn(JLa$`4>+z3oGU^y+6NYw7znyT}sSS77zl3ofeF5-&(Cgj*E$WL~UaxjU|Ay;ofhNq`D<6&gL +1lXey?e;T2Yu(FmP!7Y3UMp?*u36q@<-bTkjhD4ZM`Jj^62zm~)qQsec??$3cBvdAC+5q10gIKC2&4- +c24-BBAT^z;+2bel41+?wCZ^d_Q{E0f$cNtHY-r+5Wh4o`t6(kMIdT8k!O2xp39hnHb1Hc%>&LEKmVO +||K4u?*i9|8>H_1yxtn4*-z-945_&Iq>%F&)?Mn`2M5%Cr)tRU0T^#OEdL1| +l);Ix${|2QIaJjen5CD`XSK%MN;|~b>whsUS2;SyEuwFQQ$I(MR6`v_{WDDb6cXo9Mb +!slsX*u{?1%aVZ)e4O&IALw2y~~F=~z|x?!o%Ni;q}?%HghHu9DhX!veS_c%v#kTu3k#ed~BdvKwOgd=en^8gufSfQrOu^9&w~UALlyowN36OD7f=>ht65Q)W^abNVw1*S8^#ENbxaNzqXu +p@0FNQqmoX@-YbwGyWgWtX6VP%Skz}xUa_hi``Xfu4@*@a(~DkCf?vkPX13K;oVUEp*kg +3zFC%w4a%~^r@f|F*PYfB#woj#pAs!TwIkDsG+Cy$FY`T{xZBJ&*AvYe8ZeA^4kf(FWZtTRkp&}>4St +9$vVo4&&1tQ%}ZWn|L;1T`|#Sw#9H*A@Gw(U)1OA$xhoUO +%6corfv-&c$apZ|%Llvx5X?mRdv^@_w8z#g23F@KK|;@j%ou^FNDmFA%sHxZ_RKJ-$(-V7#7SM3HbZc +{)@WifD8%G9Q=u}QA1d#u8F_SqMbCL$i#)aY29pMXqmllm9z0am#cjJBwar=eFwxp}n3GLVd0VdSD8W +=iAZ`{b@|_vClON?ON9189ZQaerH{?>FS-!jES8ch8NN}5yyx2bY28P7v9ecolhAdOU_-N8aMUwKA@; +nfLQyZr+MaIx+1CK&(M83h6L749|Ny$_?TS~q_xAs)vQ=rwQ!oP6b!;+gWCd5Vydc9fjvD!Dfx}bMo- +y&OuOuUxa8~n(*VHHzG((ly?^{)tzq2e1l=IXD3 +2zeF?`UHxW&7(fI9B*d|GJd$3)2aE@BiDcH1fD#2LMucnC8WaZ&=-=s1ARp5;5eukZ48S3}4wR<56kb +In09hp6(eZkv_`@ZCN7u<@_0WMrO@dV`BLKp}9SzzrtJDQ>3*;;c20{N)cWQ6lNq!<4_e(EJ;D(>j%m +iR&LEno|-7#*TtGjL~)1hQ<-=v}?-TZH^tBuF9J%<1uAVo4Pi|5Y1YhVB;nop?vigcVW8=uG~C3~ZaY +VdBZxm(u{q=UYLx>ZB1GH5vir~^p%bJ-X!KO&t4TN5M+?DZSe!QW3);?=7+9@x(aI`YfeKwvtSEwPyi +Bx4LDVzB%KgWug3!_8p;m%ZnV@6h{-g3#ZB!BdLK<)x-GRy>*a%&dkE+EY_2&?vGg&gjySp=h4nCts< +le@+MMMc+2CAou6Xvavf$YMg4WE$6|HSGNgIPnUsu^|jTOtlO7BF9pbGx9Mmu+lTrj;JGby`+S$(k-_ +i&lfAHH>jlq5QZ`9WN-s-WT&TX00~em_$iGHWsOcWt>_q~`Io#u4=lT&`J@0nx)K;X+*YdpNTA41-Z5 +}uq3V}~96u{;1A*YDGh0rm9=TP&V^U@M$JE0 +L0QHaN#{0>HzCN0qUW&EK>z^bo{@oL3ONRb^3v@w_Q-X$5q@}Tp&x|ki4Sqbs>a +SM@oeL8&tt6nMTB|=k;S*fne@G~_*F>>UQG3^?o4~gQ#7N!+~!M?(oEr*6V5u%kO{U*dP(;6LGhcyWT +RtVIyBu8#-tscj+r)QPmEh*Bp`AedCSndvVk33-KWOgy&sNP%ZNuf_q9=!6Y{Qm$Tcs`Bi5*vbAif>g(5uL+Ic&j +xdM*#O|V4S`ToFrc_XW}ayjjn{bY!X%1@tOh7pev5A3?%)XSPrqTW^qWpbGNZI^P0xjoV +OUr+30O3<6qeY_yG_BoLMDv%KU~}Q129Oz!?B}z|%DWE+SVJ5yWds9AGDKveqWlnz9GvHx;c+BYD#dA +hbc>)s-jLG(jNO(Qwu3fO1ga6D2!5`b%nYTT{WY`kPoboKClYV`;a-kJt>^wmL~AYkgv~V109EzeRXg +-}hV4cK@Tz4gKMBt6AWJzYb9XiZOz}IathY->hyROMOrWq;2{&S$ADE9q7ZlU1@~(opn2ASJ3!Wik-^ +0pCEtxqyAgAUj?nc_U~-%ue=3SO>x#1aFJ4l)#}Y#zLi0m`7Ru@ko^e(Y*RJ7QDQ$40Qtk-{u<<0fxL +&b@hf>*I4s7Z-v7~99(05=6}eiz+1p@t-s(v6T#;Nkp!c0Ma&3c3>&JL{@%H{_RbbKYtp9J{%$geZwl +Y^JIsDP!Tk<`?AUJURr-w@5U#16i>ob%NC*~i72>NSA6xiKO<2S9}9cxCx2tz&Fkwmo`AzIP{(t51jJ +|A33ium!eV4~>PryHEejTo41Xp9F(Y1R8y_1cAHdMv}*jiML{6&{@9F~uSLRI!nnN;4dttN97w{%Cu- +8yd_Vf%##Z-G)PBQi-YcdM2@3-g}Ac8Q@R}drLYn(6Oomg|OU{=p=iT5E2Jg-9x##9#ctyL4V$1>cPM^D%sTv>sdkfcj;x>mRTWqH_5TtuG~3GL4GZHqScAXHWqJ;~(0(J>c}Gp*)&_!6LM`;8DmEqFznzn4?ke5 +Av(;z3{wC}ZjO!}8TSKtJbT>D=2}LgE&Qp$BX>? +z;i==4kxj-jDz~c^SxGx{&4Kj$00N@I++y6uoh0pQ^owL4sM$7yfk5pB?E~~cJ?X>{%0w{?;k9ijRM7 +9*wIE;AbG~07#?d4Gh8e^0)!yeu-(t)by<@L7fyYB6i)d+H9jp-SevY(Ot?_)1`tU8jy?S-C8MaW;lh +XAS>)D0ByW-0_RkT!_(^XFdt&=Yo);g1S8;9Iq_fje|;AIf_MB&9lj;n|Ecj0L;%Ne>X#%SrPd6&AY7x{K#c=Ek0&dbQ`9@T +KHb5@4tpo01NcmdUpwZ>3d8`N1AOfPusCE^As+xJCw4Fp_{jP*0RDhlli(S0wYX`(F3{hQ05A$otnM} +%?@(f;AW^*f?lHFd@dWv%0`S{F2Q-CVv+KY|2;K%dpdl2qy8jfqc2Dp%q8$>eX^y>91F_&Q9dmnKtIP +S51PE+tIKRx36O}(<9P|^&?R|&&6yP5q_tPe-@9IByW4(p;*Ti{c)J$bk1^v6k`Jc*4j{n~2fW9W1IV +z`rIvtvU+QX-w`bq{umAieCf$R76&}Xvzd(YS32+yMJ=y{94Knxd^a^-IvhNeTIyhUM*-{LF%h;wyw% +!MwyJk6`P=an*Wc&0vIYld@+)7>l|To}Kg^e*3s*2tcXFl6WJ;mB^1LmYP5_S`+6`+coeyewGOJpj_| +sq`k@OgYf9($jWNwlF}&6=jnu>FAzF14d!X@Mdi|-PYneYrHfnY71kaEBi=edbI$}RGTVBlY;E-k0y} +x5aRYvIYMl#EnB$4acg5oCO&rCiY>Kas)@EgKf$uio)ViaYl9!D&6%f+z3v3e4cVuc1} +*DR;lJWHj+azgqI+*2J_U&topDrVy-vllY|Re2owj5Ym-~yEUZGBRY_F+n>~UkXdyB_# +;WkGvD`&Ev^@VSrmBgy)S+vDM>G_ImJp0O4H?krw@gZ#kJc~i(w}Z +yWsmmP#=-ArJ?>sZT^(I+!p|MLweCRSbZJV8t5>U!7=#ShZ^c*8ks0%m7}qyP0s^>r7&+Ck-%$U{;Bm2CEdtqt%KA+BSWsWv!kx +vc_F;bVW1lZNsN;(>;9aV<1xTckVX8J>)OlYbjXK1>yh7y_SA*uir~L^cQP-qH^Qsnr?qzZ#%>@UW1t +t`gL9Z5Oc69sG}wT61%1|f0)q3Pi3QF{vmXsRq6g&=*Crud>U_GQ<+OP`ZVUG@9H5%viraV8ttxq_~N +T{Dt_lBD<8@!Ta^>IS4Yo=?0_$)o=wXGoLgGT4Mi7r!8Lir)$E*LR)*)T7u~GAljZM6swgOJeyil_s+4}f~T=Xd#~6MIQK`A8sa%{&$&DyC0uQ{~$vSq|5 +&fl{3wgfPm7o?M|(57VQM50S1?k6l$J6DSAz5VqpbO=#^|g+m4)$2(J8UAJBy9;HK}i@ +QeXCX4rapIKdkc7bzVq3k?~V2!g4o) +NI=x<_a4M8TCBd!?3otEsCDs61M}IZsbq}lu0sBuI|6<>F{vD)4KVW($vZ`Cw6XmA;!C+^1FTMn~HFA +v4Q}y8}!N_mtb6eIILvk8lF(N1k?s{Ej^rp8`EwM!$=ZH!!ZasZX0jGf%lamWXZ>qo@m}TSV7Z@R0dY +ZcFHIS(bDPx(}5+yiUj=q9mi02LFoei76iWDl9(u{bw-{7-k{Oq$#C+bZ)RX_ZvqJx4vz?8Buw(Wvq7$Pm|gf+8cp;L5+wW(vW1%-RVF=Lwii;gp7aKBl +OaT>MU1e9LQ8T0xn0FSvn>jFI}mu&;&ldQ?; +=0-dyZ*#4bq9vAXG5&YS68dk^rC;^>r-bPX`j?am!`FPXkbZAqCs)n@~mTuJ$0^;nZriuW1DTgfgLTKOPI$2tR?YzB^!UB)a ++nfNaso>d*u31cqKS&f|COI{`gt9i({l7z*-rL~6QY +QDGQl`~d{}AOscrPn;vc41Lw;#*OKW6j&4zRxx<-eQ_^!;?cpADcyzdL7z|2StwSWi@)6Zag=N2rbj@2@n+m3vpaAmesc^=|dytq30z#2EtUuqO3eL05EQS%#H4PFkD6e +q6rm!rZn&(0srxXBy4%bLa`+sYY^H`KYn8#%pn0v|kYONpBRbs!}R^=bp!M!tx(^YqF%XvG!Ld&>)t`?klnb?I(%+dNX1Av9b|OLeDQvquD +gDobxIcotZ9OSc(#@UE{{H2c+a9Go-9;2}wI%#?EbL!_FfKuL6m3&`!ppK3Unap=?`e$&;tMlqHaPm6 +lns2m4AdRqaU&7)be_1P(y*Xe=spRNb0j^0<-1N!H-hk??Fn{Qq^y4munD<3AxTwr6#^yBj3dO+V<^# +82!pW_Ce_owjA*USO1BFP~)6_*7~*gmYbkA)=1mbbOzHlv(F#~y?@n90_;rke$d-P`iGGF`+)@GT|o> +0{g08#~EfmA#+05h96uaUff%#9J-$%dIx*CN?dh}B~c4C5xLlsO`^>zJ5v%ykMNRpIcHsiaf;}&I)SOVY%q3JT1; +%|SC0+aC<51T=qHJ8_M4l0=n4Wz0qzwng6DPsa;_|HN8bZb!ea=Tic=@fiO*%t~+M}9!v2t8snK{~2i +yW^>R&28TiN`ms!c>$C+KE!``r%+hXTH!Zhl(XRHp9IX9Ug`j+b=Y&Ip<}e-G*qBYO88!e01%78eEJc +hI7=wvq8J@oIOMar>MbjPkdY$JCC_jXFan!>NCO~je`5-#ESQ)?hvo$pqNE7+zIV!`4(;6&u9BKx{$8 +2hvWHr3U0ZHZWhh9-Dw)i=cAa^XD8M!Mh?zx3HD?-@A+xdWQqeLL`e +%65dWwj@ndB-zuqVKH@kiksIPTv?{7Vte{r{VYP;?J)>cr%RF*<&G2{|Pt$Dn%_IdBY#$z1zSYRK)H1w#9qd#soXaJFFm*d*cumHbs!06f7R7a!bU5T?nnNp(K-@g0$3$jz3ggV+-PI}|xUJpvm)1Ix8|>9 +Cj)yQysXe4R$nclix{2T$P;;&mW}lH|L|;$~tQzdxoCx~N#uQi`s{?(-(q?aHGEpD~?N-NlPu#e2?>* +;DMn^T2EadSJr7Y%SwdQ2HazHPrMqNkz8VNS_IMKIn83d!ibHh)edg#H4M`a-$T2EX2ML#M0Sfva*K2 +Q2@b`boSRtbIDJ<0g>RHD5;MkR|sgdo!tZ~p02qVnT?VM_11{tOS$`f~iZyVCySA)1LYs>e}#vG7AU% +Bq~h@t!45GqaYj2{RqEKB`|cjW{sak58oi$4mD0$fG~46VPY;hnGT{9r%#EY;K#*r>5JLU2a=(N*{1;+?O>~VJ(|68S+4M@Gj7`ne9uW;VY`y(6MB2!xp2(rreuI0~Zb}r6`YaRbZIa|u%)fP~N3iwSTVB~lVEDD=nPMJMwib +v3SdW@T7*mMs93Fl@wmB%F`c~3?H+;xWn>n_s^gWCF1Fpkn@o$+EtNvF+PxD)PEdj?+kcaAaA`-dIGM +f+D7ir?CO1=~LkoBef{pK$zt<7GZE|EEj*xILdHV3Z^o=2w^xuyj4Ik6d@@QRte$0K==%0l&jTDZYkl +kYr6x1iS$K&Bnjvy|Lnbk{|)U_t{}9O8}h!$fx9*(FoufrdHPjM%J-uW=%Vce(RdxYZApeZn&Ol3+BK +?Ypg0k*4Wp&XFuIV@cIKuuLJ{Ja*dL`(=Et!&3attOs)G1!By7-0^#+%L-L&q0o34Mxh60G4DM9?u|2 +=>^eI7DR(O0?X)2q-e*BX{fhel=W +o+lP#1O4-n;5Q%A$7}v=*v+`sXunwV%$wHDZTxJjZxOGp7a)@?0}5)vGl^%4aI#G=0mE{HF<$SA0Bu? +gW`_1Nv^{e{F!Dk}aTrmTfVhGE&)R(%vp4T}P*L-lU?(-Kx+u1{EQft@nhg0>9ZJdplpEAde@{RQuZj +KDzK>BNXjr-R%;xN88xnSusAJI7E0g2nkc%lu6})3IK7RHELvGpfrd*y}W*KySPMXG$yT}>`oHBw@V7 +C&ce%v1;o~FRGQe)bj&HwaqI)+@L&Ocb!qzCK9L*NX4v&Pp^HZq)iJ+5Wa&~_M0W{%Jvn(xbVV4U9YH +hQx|USbXOOg!CO^VszuaSSCi?Rp7MxRHUk$Vti|{dJ6N;a;dfq(aXA$;9G^K-++}Ue%ezZ>unnH=J3} +o8h9?v2JH{#}UPp(SBCDcapICfhiI-d{M;gXB`CeZuwtL=a*yajkO#NP1nqI=45^wzweJ-GWKc+v)yh +h=`vs9hm>VY$4J9`W87qh*C}fVddjN8s^>;`j5d4Sww}>v!#cVEJ#-5CP3I9v>kd_6mL$M+k5}?fu=a +)XP9X#_~Zd{Lt@|;5pF1D=gd|8?ypXb(H938kSn3A3WDgr +91_v;PH2EX8t2(?;8{_{H$?GHKRVa5k7;Xej=UsaNj5b<+=O$h$^V@TYv&LjbErIL9H^zG}*L`SN>5u +PtsNeoEIt*P` +*&6*=yPfMcULCpb7}g!D^r%~WLNR4kox68(!b3SDmvZjQVOo0$GaR~Z%}$yyppLNsifR6CmzmjBfct} +!K-34UEa&({X^bpPno688#vYAaK}w&b{xeQ+wUoMXVpuBRSmK=pxy +XZos$Up=1Vvf%T0brMgU03o)Q*pSycgO}6^czq5mK+qtkXi&EW!xHr01oR84;uA`g3bC}f6)ao6)`kAWzb +H?}EKEI=HKZUzc`j^~|cpra6h3gKKlwOZPSmR0P>WKu=%C$fV9KH9z!aFqlC3gc12@6(hB}&(^5&S)y9y` +XsjzRmh@#%VNda3~BA}%Kv1Z0b`0Cft{PZbbp&+o26Sr{8{gj`R1aIUm1;0G^;9ehtA7E94*E#1F +r1p!%+j^vACx$kg(KYH9DYnsq>{6zucNL(uKB>`lK^(fYQYL4S*C{g@E@ZUgC_K%}L#8Hf3IT!G0h%doCm0!vtu@{2*fmP|H1%+uZ&{1w%%3$ +08l +*+?hmpup%Y)wUb0HAMOv#aPHeO%w6KLn2?6BjA}^_x5_+e{#9*rBdlf7ceHfxD9DZ`vKoOBaSdhupV- +AsU;FNpU{Ri7P`N0+(V% +mi5L!&ek|H`(ksq7{{leT&OenqPE4pbmi92^Bxy7V*2$!qX5XP3OpW6bmqLH-5Ng*MD8iY0$n=!u{~abeJB|1RkJYIK*I##P*t9l#y9sGjqKw&k +LSlk@EAfQZaANXE#V0+kDfDVyPR`@dbE<^zAEZ+eKgL7e$383e_i&@eDlnN$nWX`dOG()W3rc_X2~&! +!{^;4tUdIYBZJC4J)tJ)dYflXJA$vxWdvz|w&aJRrnP})^Tn3{om*ZfMPT~UiI{U2Zc@8fpxLIVMczl +nqG2$s&zfEp+(B``hffZ0N}cC@xjDD7^Nn`OBVZNXr*j1Tyd#(YV2yw5-2EW}rU$uvq_5(*9CXv7Ist +`PTKA1kwt|KG##Q`#cCjqvPfvTy0YEt-$I +kcppF6EFK!Yoj^|JIpy|4zZj5dDL!_|5yuY7O^_dwv>1fuW<2&Y7W +6O-pS;>DvmhTAoV>t2OmJI{5MTS)-?)k+Ky}FCys&+`!wum!=E188Hzi}eN)vKE40ZWZxGDDQ0jqL)8 +6!Nbc~?TSadY>sC)kG`xoF7_Ip=xzxZE;KeiWGN`^jBRhXbl8_*3*- +Ra)~wpVZ>k2GWl-uJf}E+(6Y$;K +S9fupJ>^eifKR6GLuC$!T8@!%hbO?%LEm&Va2fzOI>Rh(@dxh6(y;@R7XF&Jfuekqa)(qT=Q~kGEqOm +{B@C=K|zf`%Q7KVrZhkI@L9)_30m3o$PXg+zaNX#rDVL;S*@m9q+?+m~?{d3kvd>CpGYq{ESKD-|%IUC_Y%Eey;(G*G7_al +hnpA<67Fd0F$irIb2Pg~3EjE^|@yB30}e!z|xD%RVl+5pZbURpm=3v{M$r7eDBfn|Z +^*$E`oT6tz$0Ky1CwwJrX_gQs;ai!p9*y-&+ov-9%Br2C0kJVyif7Nd01!2K>l$9@7ai_YgCE2A0 +jNY3v{Yg+T+u=3G|Jj2=yL@Ry%Mzs1I&i<+Pwv%ACQ0%%A1W{0p+If(xJ<(-*SylM(FN&qvXjH+W|88 +-6t4m}3%T&$3Zgl)KE&1ab;M1GWq}Oe)JH38a4a<1i!r|=9ulRhCCkpoMeo;Yyct#yOXyN!^IXLF7Tf +j+>Fx%)5l--u3sE?i`6^~}ZnFaIbGPnz`QfwO-y&8p?)IbciC`25Fd|IEbr<2SO8ZkUvLi0MANH=tI; +w(>{Z*W*DUhw18LZP2;Tfk(VGwmD$hqDaN#~J1ERz*s=Q($7f=ucXvCa5c~S_5^qbDeC?mZjJBb0LcZ +{Yu*9#@)9_>~W1Gi6k`ZE`#$-~1bV2@i!i&sWh4d`o$(Q7%}R{(x($Z`~l)fDuF +4N2Ah<*52vE9mDeq^fLCgEK)XgX5)ko8$577ar=%e+wwNW;4$oUtj}V)#$N#EG5j15mbAv{6SYYNlb* +PUSH<=*qaoRZ3l#UwQ#@vm*gP&eWrk(gFl>0g462V2KuL<_;*`N9Vjfl@k3>IuRuo>Z5&ytT(##>^VZ +`}B`56o1oM(HjP#bm8im9Q>_yDY;`^=8c?A@D7cuEUPQw(;-Acc7b(-91=M^TB719681G%z#gni)yNw +viMU7c>O#fU`j0RX+RPtJES2>Lx)JC!GNm;`~TMj1dTzHU=k`hB37UzAZ=8dycnWIS)qhN;X`OtE@WB +_Z4cJ3PR6YdS_`blnAWw(fe2~?yQe?%TAi>A(_h(&Q6FyUWwH*)jD+*05$DgC1hVX$WLgE-7$kZer*3 +`nNk1$OrF)%4_BG*Qtxlc^}RF9wsrk%zPEq(Sd^uqA4A*!+3DY-+`n1)ODFm3LHM_{`xfHj!5$xOVPu +Hy6s`2FyP6RD@Z!$zigy`1^lM{O1b>^kgnQ7NQadM}O7`O6?&$WWb|K_{z;qY1!QO1Loh2Xb1y_^ZY#}ET_Z(T>o9tlJ5>gE>lBGf((Nxpm4#M?qCX8Dc=z5BZ+vy;R|Aa<}H +5NL-lgS%Sa2jkUQx71nXuDjSd_QApb`555bzrMA9duPD!ZtZt>_N(tH@O$G^b{&q`5rp9v@$yL}Iw2zrwDiWa5<5PKZ9UgX}&niJ(lY?IP-RA1R903FXN +>Qa7tiL;8W!;on3R2hqFpR@_-0F! +G?+viG{xqnBZ?&Qkg_8OU*|(fmtmE`fXlWP>}C)?i{smp!*!6*mFb +0QcYtTZax+hG*lb_5JFtyJ}tkYj5ti_PAAd;1!_1}S=h*C%8hSN(jSsSV@2X~o0m;?l+Gj8IcOpXvW* +Al_`7h_hU5q5BRnX+x`> +Zj(^?NLWsR^g2%g_8A$ByDhk{sRW^`8lD&boVbU(V2E7eD(0w{=p9>2%-1?om+P3$T`%)0u%QDehzI8 +hpd`rKO@%}OhwgU^X-_>4d*$q*lowWqMwaO7>=PQHQ-j&RtRHNRP)&te&rFOE+RHaFTrnQ;ny$6HvIUxa +ATC^i+lg#-{q6mVyZ3qs_n)5A#K=Fg6sD?`fin_7T+e@|FzMmOuOdYiI<7isv+hNxrZG2f|}d|eYS1{ +>Kt0Y$Lk~gdTDooTnx%)0_AEkDi3jT&tH$PNK6m%aL8Oig$?)kl+isPB#+tkSKqI(VFZl~-@X-h?%wB5fNZ=aED~;RE-S*^+flys@y&QJ0-Z&6A~vahXl43-@!ArN+Z-mDq!sg=NSxB +%DLx#M$%6wW9 +qZLIgTnoj6z8AIs2hz~SDFPy^T5u0?)g^(MDnK$b9kRs_1z3Yz!k{Tn8bv_>MkWXxu*7GP +wthzruk3xOoq{uWi-?RZ0ry*f6 +RC;5%XhvW+mhkiivKri>t6um|L!Y&hoGNdh5oB>I7mPsNr5B@A~*(NAca#fMS>8F!U#fae`W}!u&)g> +pndB{KgNrL9SLG`-{`mef{J(Oir*Q_?w1+-Cx*V(0DU7GiT~$gXlAFlzLiBcSo$!&M8G|xN|8Me!rtW +EkS=4R<>e_wAd#>xrh{&@bNoJNFAAAEsIGj$~xCBNqI2vx>ksQRB@A0ps1Vi+uZdY=9 +a3v%I*v@5--Fl)BzzV<4D&5BV<*^3y5y4%y>NbXp_iIx2H#wOnGdOh$O&mbTMD5H3 +*6Fb$319Eo`6(GtWN2jWy68Q=U`hHglo1a`5hpSx4~rU_d>=6$uE$;g#fJrfsw2+N$2g~3M>ncLq?B5 +$Q&d%7X-hvwZ`~keF!GT*x2*?zie;;kJi-of1-RGtO~m5Vf=>adTUZ%Pjc7edTs?xp0)nY7OP;alBz) +pm;gFeqeH(Zr!0-}G8VLn@UQ{pg)ku>`>e>a#he=V_$-h|1`GB;CyjYuviWD1vmG!H6P&CQ2Qa{kI$o +DTs0LZ4IY3#C4br$nAVih@hg9r1{J*9gd+c+0OJ*qd`ZzCbD`PlS@I~tyvA5~FKHM;;V(_?v=h;@vO> +U&a_`Mad}JoED>laL{`A8S}FG&o*M`*{}`c-8FI3>( +{#n_q&+qlyz_>9RXwSiE%v^x4ZgJq~-kLal6sK2@|af5SU3S$XNghlAWX62X4 +Wt;m(?Fud=3D~ptRbpV>BY0=Ea7hlxc(1l~+qZxq7+EiW$11aCtt)gUC!_(9#zvTss&Kkn6=5^N3CTgxA3M>De|g^F$QW>J7)M8)Eap=x2^ViMXw>nde2x<|If;kKZN!VE{Nmh58=^1yFazMKaYRU^Zvz1%>S_~eoBV?<&=LeTT;+IUjpL$SZWaNAep} +54kC8WWEj5XGl{p}=B~c|C4j@kF3B0b{Vb7mH~!f0e8W^?I}hK*&4Ray*7lzSxR(yeck4Y#K1IR*3gF +25<-$E9Mc)c0)H}Yw(Y>U)g#lo)S3$Rg7TO*}dyR9uE}HHT9Yj04$8SAxhL}0s +Ng-J&S)TTi(Br3(0}+bEq3YdG_8!vF~#8$&&=+L!B+3N7ufO2ap=PeE{^RzV=3&2d7zCZ(^((g0^obeI>&|nfJpNa&=PYkU{|p#oi|;?9FkuU$*K2!Sq6DywXyX;|~289F-H@sjYvS@MY1dB$|9gd;8+5<$E{evgiyjHPE2RS;>%A-ByK$9%&!R1e34fVc(9S$CXo>;xvk`?_ +zN~P59N{(?t-C4-+ULxIcbhX$q4yJhT@QRep>>kdx4!(Z9AGC&I~K+@N +DvsdmO~NxANg&zs@u&;+`&e0J?DQ$`7?x_el_RzzF?OKn%_kVS>k#|3zLo`y2RygFH}DTprdp*Fqjbh +=hOjIDVRgpv;`p(N@3<<4@K_6msg;t*)0y=W>gaO9aSPx~O@W-dw?zHohZfVtI=pX_;kSVaIw8?b{%U +p*H73$1wri229Se)S@U*wT5RjKD}TI+ycm3zM&B>1yc&|6mxd>z#xh9oy?#ZAAcF<0^IU-0^g4W_&$;vP5keEi087D~5u?;5Tq68^Gs(KEOmKPSIRbGa&<8YpoiPk-=l?+;tqIk!IA~I#-qz9x<&Cs4`Urp| +?7wJ2<YNFTD8`HmlEqj(%2$ex!3_jlYUD~!f;Y +$}hp@o136AtTdR@3_Vrsiiy1^GXT +UvO~8PBz-cv2;i{j~*obcxhhM=;GNBea7xf?gcU^|gepEK`0+NZc7oP&Swrvv2ExFHgWvLnpLz!2LBS +{L}TkwZxMKZb&L`UmAPxS?0E-w{2KcLkP#6@2Z~`DC(V_zgKb;d*^w5p2GqEHlF<*JOjVAf2N)If)+6 +tm4O`yLy%rpC+uvGb2%=!1Xx0sCK9f8UQ8(FJ?XBw9F`R^Pqj!^w?l +JQFSi#BOTrXmI0qz;XYo4Tz!OUN{EY*T?A%+1ee7U4J{PV<(?cfYPElsd!bEnD}I8|W0Tgj>#X1- +upr?}DDZq5g>2Nx4i}cD;@*d9jH2j5)5`VN_bid7_S0NI;RlyM=&hozcqn{p$eRls%fg^yo|G6nhj|4 +OXvCS26v)l7fyI&JZ8r!{$X)1iSMp5v(Lfm8WjyyaZ!3%qXM?7=3f(-%R=K{*X6SJ^W|shiE76K%a6?R}q7JXN;yf^ZCxBr6AD~>MNciM<0P-0PSY4{H(I*ce$g+f +GK$QYx +`^xO+KY?-5y5{|+wh&Qa!yW>rfTpu~&HS%ion+1jl&zH!d&wbN|dLX;T4%t31X5^5Fm9_C4GfzuFhm? +KI*nEsGkcD_c4+|Pfjky)}+s@fu%cwGi*QhMOlFxeLiO%RU1xxc!t0Z;E5T-sjR`uf;tx`P7PfND(Gf +_>AidvL)7hY=GjTTFf18_Qy&7vyf5W(~)r%}Am%_mh4;Z~mTsh*E6p{5sH4Nt!(#6ww +>*L$GN+`S<`+icCWhj*y9VxrjOdm%s5kVfIQ%woP71<)JQw68<#j12tQ@2D +t5k7oAXhIjl3DfeR_Ia{0^(_W6uu-kZ`PSy&i|oN3mVTQG1itx!sH=Wd6^AW#LNLesimSD9d +9XKIUpIjM@Duq{RFf+OMu>W5rg`9-)CEg#(c`u+oVE|0qw{v(EJP-=8)XYP={>~6rdi4_$I8rLkXn+N +I}@taE5OaU{eHraXK8b4>m|YxRf8`1w!JtP=Q*J2nkWVyGm#Hi&&nLbCSx0;=Bx{Oa?cO;dMEFRd~vfS1^RU|kBH+gxOMmE`w@$1XS`)hnlu%7G#7rW|-SnA~i)yHR0|fB>IXBD;z0]lq6VFL#+CYWJEp;zA!* +INc)3c@E9^90=H1sb-ettneU)rN4b!fQCC1>L4pGkM~rAar)Mp&ezBB$xsORI8=_p6qpvDOV`l~kM+_ +TIp07mc^reKLLC=)#+}VP%90pUL1(aSvyq4@IeCxEIn6aYtxZz1?Wxwa;dw#MohiBJ=Tcht7mC_pvjW +3#ooiFm-BgxZLsAh&xw1ZUE3YbP99(;G+-w9#ir`agn1{o|C$2F~>o@@!kBCcvv&wN>UNa%|vpJMu>S +@oYtEy{kYF&is%ORava0}O>2))uzw7E;x@xk9T9$Gl{NmoGUc|&@+{(I$2uE>f#Ec%1qjy;n24~hF6# +MA$L_6IINyd8_SV_y&s{?`}#9)|tRg?^$I5Dn(A*S3veFQG29 +>?#AQ43Cnic+?!Caod806a7LzY4qmk1+lMtd74MPOcIn+?6xs_VJJk)_Uznu!H7T^eBu?#g>}?qm@0F +b`^u+#|PyJSP=sr~)uAH7`n2~zMgkLa+BZVV9>t8E#R=J|Y6w*m-1ac+Lrwe#ZrquFF$ +nN>)7%$1??vw+9M!z;;yB+3bR!=)arZ7Uuneb^2lz0$bTqreiuPs`Ja#7nd&QNv +j6I~f4pnpe{$R3?|SC}{Dr#p8zR8S<*ttLI_;hXktE{m;PPe{5D_46yHY<{I%U$Ba>_IAQqXW;+La~e +m$UOyBvaW^o|MfN?u7K0QdtxXsVtWhcxCb~K+Q>TJgf;~Ep7Xx`okhFw^~e_g>%J&@`6*;^EJtIpd;o +m88q>!)>L_?eOgb@qqQliM~?t~+oJj+$Ck4gV5 +i7^iD<+3E*WRX{p9V;We9&y3J=R6g}__Bv6z@J_yU%He0qrDlxFvbbTm5Gwi=j_gpH +}BbWix87AB5~_qtT_L&7WiTDZ`s^!hLgzQJd(P$L`YXw=OYr;p{G6#7Kk0?nIEPFikrlK=;^AWH|1Pv +70g6@xy6Z^N@ZYma^wgKjJ`Dvo%3qy2S4Ub=2!X +i^wOQWy-PAVQ!N29XF%;m8J^D25^^{uO8v)LwrNsJDgoTY3ly_TKykdt3gGrh8W&ee>uxB!a)LW$ZXe +?xRK9srXxS=tFiWe4}TK?|gC;{ML+s)16L7z15YF-_h~*S0r~5z^+n_?ypXeJM9j}-;H~0=Z)`3`hGT +iD`9W9y507!-4yT3;x`Y0NcT0!+b49pW<=}|j6?qjnvXYVezp*&3u+>SB#5=z>}km7Eh<9zmMTH@t(K*NkUrmHo+jOW?$hv+mQUUO(iFMY}<}}ohQYY%;xDeCBV!`vRCt^ +k&TNToeD3HYtaksPMXiTkX7Dc4BFGfRuc_=mNmkPocG +c|A0Ic&^lggzKUK3Xl5(V0~S)9N18<=c9we;uWuh#y)fUiCy4euoWB`Jpy;v1eahl`ayG7C!FQfim0c +jSi$umS$~j9u|KS&RtX&rbo4lE!Lkb_2%Hy+;b0ueU|2eO)bGuIOhnnmWBZ!WSE(;|u_C{n*%pOva9m +LKpB}U+@c_hNH0Ma&_o{4#wP5X~VJ(F}uUIN_sdELrVv6R3!NXT$<`u7J;{gd{WP)6RG)_$Arm4&-B& +72ZPxQKuv(&ZU^O2!Z(t{Z*+*9pLgB{s{!y#-h-~@m~iu;x6GqEJg1Xkb+FVhPb(kL?lcq=RX*LQvR9 +547W0nAYlna_IfmB~V7EUL!NL?vP^SrEu|B;#YMM76Q6as$40KUYxu{_W`HmgN=>GsH#Ujf;61$*@l0 +SI+{{UwGFR%F*`26klene6P!w?h%K>|l1a7#ofh$3K=KtKXP5rTxar^qjP?J@c`cSv>>7%bXHVR!gL- +sE&_*W`<^9Z@%Y+_F;g>uFx>-TF@6>^cP5p%0x7QGn +kd%Khj8p}u}OHiz6VDrRp7Q;W7f9ZdNjF|m4j>kq0BFZH^?DgvDA_oDm0=o_E?p|YQ{5XDcQ!T$I&8~ +xDb01Vsv3=Do94*T2LFf~*$_fi7~$|Nuo9MwKdF^@kk5m=d_|5ApFU2#U!Zi(G+qPnhRU$1kr+$q-Ul +!|ezhlR+N16;Hb)D=Tnd9cc+Sm|ul)OBLr(#==tV)wCs)-I`+`6a)2m2fzy?f|caiOylg%Df7^*qpJ` +>Fl(noi<{tg_IU$B{kh!^mZB%)p%+H8I^|LHxB`%Pp6h2iPpj)Ua2?80HhMDJTGCcHd`n5A|rXF*wpQ +bRbX^mUWZx*111m3K)hVH55#hn(+h+;(vHW(*LeiUSH@xVn=!K6wmF?J-75+@Kan!Lr5)!OC5Kk&x#G +dr7CXUyTzMALnztl}z~Dv?8Nd%O<_V+cn^mADIeZ%q)9zdJ^@WAQU)krtm-O>9f0*HtJDe$zj!jR_TZ +w*Bcb}cOA00b)!%pCD7yov+jE;mXa1kwufM#7JKl3De5ku*gqDr0g(<@uzlD^ucppeMJ=N(7a(mpxz4 +%Cd5s@|SxndIDA!dD|GnmVXmQmn$+qYL?bodx%#Ag@cQ)EaNQ7->$;3C>=ae-QjGAWwwCGDlKYWZ#^oAV +(#N=#J47meVPUN+;V<N)&^p8vG=)9dKlp+ +Ek5!q3&%?SCK)k|2sv8!)0Ej6x_*5;%yGTY5=g6b8O)pMNdKlKW&7`7wY+?luERwD-qTVy~ux$X@sil +DAC~yc;rp1&G8)Hyqtt;RL*6>6SrK@Q2s-+slaDEt4Q{PY5IUt$zXUxEY4O0mOZ@jN0#HH$_O_Rhm6SD*klt)eZSy|Psa@JNFQLS +j!tZ$Xok7KZU-;xRIhB}pJ^T}?a+=b3**%`S16(nh|D^ +QKJdEi`=6?1&7(3wphjOC;qma{4Dtqg^j!J6oPjc;!`glNb_P$xsE`Jf-jiEJXj0k8l9deG +T{t{(utqAFN@0A^_me;q6IflIp~l7lpYhf`UTAMh?EYp-W^>ZLlas)U>L<1*avXJMp=CxN*x{5eHxluj`N&l#UD#);-hC5t5|_76qY21!;LhC!!nfl9627{_XSmrNPV;qRdoXaQHZ +yg6Ph%OksT%M0s|n2yW0sXS|})!?yYpmU*74Q0PF3jhL +ywY6Z?*wVA<9=Xiu9b$;ZC;xIrdj~e1`?}<2TuA28%T2xev@UELlQ!@xq*<1w6ze)=#VI6w1ZjlEWVK +>A9%xew-RK%gUKaAVI&lpYXGmUeRZ<*W}RDYO7)&%48k$i|T{lT`sIwJp}(6|DYYfHelOwuMJT)NW;J#Dxf#N8GKt5Z@7ZL<=G?bYxAFA_bL7u +Lc-o9%-!%OeJh_LZ?-eE3oXI;E_$&~G6nCEsOUe??^=!E8^hqY-|~iy0kN~bw#PBG&n~BL4UH{*q<)x +D-l<*jzHEER^sN)Mt7?F62g0{J)rYG5uF*mLBet14w%tFao34g(m@_T7%S11$TrHfZoDRNB_I3u?pY1 +i}dwVSwPJ?vPwgd>vW6@r=bnF&2_PXaX;ex(SD{X)3J#(dD**}yNrBn9Zvv14E%2nm0Ek~1Hy8T^-V? +W04ets{_{$POpG%EZ~tz2WTQ(D{IJU!Rg(yH5c*{19YlTX!%=F>Nn1^5}`Z_uCAu&c><>OWZQ{fKYdm +UNhKKfbb(=8o#C@YCR$Jy&syHy^6ng@o2{X%y45k==>|*Q$swD^K+(-D>N>qdM?dF=>I_=TTF04t7mt +ESEdFRuq!VeDj2=h?QHs#))kQO|n@~TfIoz_NJ?O!?YhCkej1(i>^ps(w#j|9B%a +!YoGF2D2min^n}w|`F=;;b56vPMuotu=#_rKsYpRi?5nLx(O6#Y*!QdDs8VypoXkp~>v_?FCvobdGDj +)@tgEl_a9nPu86X&cfy{8wPdDsJapcj+qw7U*amop56pWu^TRo%DLrC7H@BIU=iPxndAeSzpixzM|kX +*0ztL(?3a?!($s0FBL@x|C#?v>Z?$OC)I2-5DifV|XOkb)ixf!A2ajauFa_=D*$j*sTF+k>oQ`= +|kZc2{E(3K%(mi1{GhmE@@56&drW&RnOsV|%l7P#CU2gKdwWg}t#3cVK4L(=w*Ric{239?>`=V|+l2m +YR=p%Quu(ZQ@{-LC&$qG>LMVTX!8gmxdZq5t@Q{t$M1kw2fHgy+F@E4BoLLcT^AaxXe==s~_kn~)EP3g0z6bkALO +jxo0P$&fczQSYK6Oza)9uMuYF!^C?@Frju~?iAZaIyTTllDE$+xf58hXvZ1kO_kYTYZt{1_DP?8oQHf +*7NI+e?T?{-T6g!B#dgjP^^aQEr{|6^_$R{1^m(L3{sOt>Vg4%c`$CCYlYVJ#SutF#5wxQWx<#nZvj8vssU5)A&IL=j}jj(+vmedf9Xkn>!4-t4jK!*TWA?iKMvM2ZHJP}V9OlX@bS;)!Kf*^6An@~bW=K}%TdQixJAd$6hi2~v83`SFy(`3%s*3SwN6UG( +qm--VilacvZo3uku>%l>JtK-6$gng7-!v`1^gIkn139BjJdcm*#ZOUFq~|d^V0nf(MYkN{t|(>2Uh+c +(;Gs$?&J;YYq#AuFAzxZ=F@Cs*Jr5)`O>W_0svNc)CF7 +4_iBvZ!Jdet8G878Uyyn3F*l)-o*NEudQ7PF#i^;t^1}^+tn*xf|&63*I9Z8>@-B_}`F5t0`ZPA$Mm +DD^J6aa>dAa*?wn9i6>`zWQq=9Qu-5=_{Jl;Uq~qbmu$g-tqKN!lG=%rB=NZKp%f1esE=Lsrnf%u`d7IAH~mRxvA5i%H>#V9qk4Lw6Twe#?$MAs`j`IXzWA%Pz`oeXzN +v3>}5L;Ec#sBv9)XWp3a3@)>>n{@4BY|1S2MUr!jnNz8151 +1M&YWI)hJp4M1=w<+74v!h9@HhN0HLmE55bkTDsonA}AWgKjdg)p<&L9encW7dJ2_YiN~>51ODgTPXq +6MB>{@edT$d8|;xdxK;|rubf%CDb{46wLNLQl(e97LFPO7@$Myab8TzuEwr>uBSO1P+GqXC%i@xH703 +KPt`KPZ-oSkmW;D@(4_1Q?k(sH4=f9Wb5HO?A(~5M91L`PVd}9N$5gII6E<;$G%Uf8K)Vl<;}qky@Wh +|zbd=&(dUzg|2@o!~{+7~ME+=*t%bdI-KVGUE-pa48ZjS*#5X +yX!4`Rqj58tKj+no<&m6}vjyNc-Ra$hc7%%AS!$!Sj-ctB65>w4rv_2lX0V|xpETyV>>{d!p#m1FzXJ +~9FCVY6e+Z1w`k%(Z^|J3Uz_ux)kH>v8NyC0JmPm+~S;01EE2YdvpaFyY2Fy_CZ_RaUw%wQcLSvdRst +&h?K%CAwE51?LLXFQqalFVtT>zUzQxoc6?%^wj-GdsCNsR3*C&r^MhGqfcA?OdgP;5RROr)Vf+qSvv---whkP7?YeX +_bQlpC#ZW~m%>b(JyWm!68J%gu|+4Z$iKb8Ln;hI@gQ}Xz41GaxU>#rf(&u9D?v|$7YA|wK02m}!rMP +c}t74O{$1piL}?Rh;B?@9LdAdU7^I|BC#Gl9LSRpd@ng1(N~w&Xkr_J-|;_HvT!gy1OL*-JYOIoYGN- +6uHR)B6un;6_fxV=uEzNum9 +UZw!wgXBrP-^3O^ZZYK+zs3I?vrT)27ytAxk*wErJ3}UM28XYGOnw-|0^UX@VD@w0^z>&;wvQqkKPW= +bFV*`oiURiXK`8oFRQwPreRgr_MYCvBT_sSf-d)^ZkIjJb%UsxhdpE#OLETq(^AB;`{vop8ho9K&cEHB+jFtxik#ERR7 +CZHRD?o$9ts*%AO-S1ncMiNOBw7x`J~~;%B`vs}?p@J7F*gt+#IF=_^_wSnFEheJa4^FkGu7N*kqF?l +r4VrY$|;K;r}`GTW8c6or>wL=%%y<9^^#4R?hLoDySb +EYcsOdn+Nd9PgM|g^VJBZGd3KfowPmsayU@zR^H>Zz+;7do^WE_f+rs%(o9!0L$^AmyxwYmVFOi{M>n +%OaK1)i6&=3L9Vg^HRI}LTrKnTcey&sabe1Z@+i^nnX&Oz5rZF5b9P!P`xBaYR={h>RM>UW}vZV#yh| +`}8^?F013BZYsi%fft9rAW=|B=LzYdocxU2fIV>g-^6Xe3FovqF_`h*g*rK&nh=cU?vCeG_LsQrtF^% +Q#eWmGaeo)L0ej%~zlqxbTD%BZLN{OmUQqcqqg}_O5IwjMRd_)y1a;|gq9H>S%;V+B6a>n9*o-3y4`D +L%4sc{KDh(d$tu~&RzVc+k6A|iEI*p$`Ml>3Dfm9ksXUW69R*6V=Vi$vIii9|Hxv*oP0jsD+p?qc +vq_aCz2y_3R)h54Va;kvg6c*V#Tr2rH#IL{D6e+{HsJjhFr$qN +&i5k+8Tw7;L7270Y*W+ftlC)=)zGE(KA#L1UWHabWbSd`d}RzTZgWIS?u52%Lz&Q(S`XW6#Q1C_H*ej +obyW{_rJKzr?}m}yu?rRKbW9M7{)OS+5#yGM-UiAAcO>Q6u~JH+MeA0{Z;U{MM&^Fc={Of0?EDJwg*+ +n9zw<7w}@~%lHmUdzc#N!-W&-C+S^A^_-0CwZ_yk0Z4mNiHtf>r@!po%UXXgf!WIQmza!FbPsiB%9DJ +_@Lhze)5$*x#u8armU7_U7(xBe19mrenHYN7~x`f*ABY6w3C*d9%Lezdk@!JVxdq@Am%_H608@2h_5) +zaJ3MQx<^BeBL%LGpkzWsXo%=?P}=cvr}d$~+AV0-%BjQLe(ZVSCy;Kv0&k`De}XYNn#JfPmApUCrX* +>=lY)b)mGRu!nH>@Vbb)$ryM{ZU>7_!$y?hx*>N`c;sO+Xcyfc>cQG!RWa%_FdZm_^pE9FNFEu@#TS? +Fh4yqJ2@V2sR%U>Pb(8LXKxFVQtefe1o8i8?!C6$RM)P-bFN|?b`SOUiyZbCeLx0DfXIR~au7iQ3B=V +mFXbwSRbICD-u-ubILMNSCB5?r^O@6Mg0pKU0#9NF-G<&~ZpHC|EfLPRXCT&(_f+ZYF)5DS0WHgrbd9 +I(S1dctO#O&10gq;|P#*^*&hqO+a(&KjnMRH?VAF|PtbjZ-p;FhpgHoMhaMy%tE)K29wf7q4j|PD~MT3zk~rq3wL3(k}^z(KvD*Hk*)6h +ZH$eHG%oine*MJsKTNq5}R1;jveJ!-ATG%H$F@rvUXz!&kifeKpuv6OCuu{;etI1)&(OrnhLcB6KpOo +ahRj$IBf3l(=@q`n{@LFVIEdTQ~1dc8T-XD><9b$?*f~HzI+~^~tYXjZ+ +i#qiafO;_fWro!VjeiUUd<+N%QKuTDQs9Q;xVW##R;a_q$SnS +-6jvm%zyYrZWKqgL?Y5V|2_wPD5G)6K0xLxNB!-Eud;C8!_S8#yHGu=`|`~8|49DNzfc$^|N3sj|M^S +mZ+}H^U^QpyUypnCSKl?S9{}_J!_#;N+|N(pTX-cI0%ec|Mi~^wz#oDnQ82THQ8Yy%D1*Zc{3*OH2$e +)D-694aQ%MGzPw{G01sH?~=v*zp8PTA;f_y&Q%^)kmVXdlQ8K_{qiRRHbKslTSZ8e5jC3IFF6*2)O4l +4c^{j+`;Fn2}4NZazh1?7|FG}h_~#eiDLf~^<{$}Y@00vDrTkIdRLV<_;3cvY-jPJTIRj<0<(9CYgF7 +_bSMU()Nv)!bzKDjTnhl;^z!kIJSU!*30px!>ZS$;Mxuze{+1SJ_akJ~*XtXn*L%^%@_%^V4(a6J0oG +fmU>-+rKz5I)#@6U7oK+{EHek*zmcRwTmjKBT$_MrjcceS8 +B~3REF=Zl`7EnLtbbr0qn})dYKbL`Ufk`Ec3W-Wl7n_gPMMSWb`TA#`EIh;NSBc8b2oUtxl>w`_;-R? +gi8&Dz;+ZSJagGei(($@+eGNy;5-W(CTma`24ms=x=&wTyep5w!AXw+}K$4F1(2$9{<@b2(WOuq5x>G +equ{An{$jMUI`onvq76t_o*JV&os|Jti&rFMpSSynP0}S;+)so1 +JSP*KoYZ7WxQ?6;%q!d_jeeEJ-DB%w@Qu%HtqaAxK`-`;!FP~;wJ=n9D6Z&u#}>at`JJ%sAmbyS&0uy +QH$_(_-6qJ94bi<$O6sTY(m7_$vCz--=Knq&Aj;p)rE{D``S9ro-Dv8NJ>ltGUarGamq{d5-Or>izl@ +q^mcrVUVGYlDB>mil1fP(e&8a^#2ZNor16ui`;^haWzM#E0-(4l{Lq*jt`)+!uPao-*Bz`_L=CY%dX= +fMwb4QMXYA@0v_77&wy#*TA_QM+yAN%Y0h?l(mmwE61{3R0$y1#G!72iL0_?Gz3e{zoBRRJ&zl;seVjsND1yCi`D{kEmdfV_z5LAJ#P54YIu6)zseR +~7{z@X>3TRyV;Q;$Gh%WBt0dN5!r$qyrKSubk85jK1CKzL(ShpOxCwx{Wq6jSBF70F+(m-BwEw-w>V* +#r&nW8U`6hC}i@1s~(ERlOi#3L$a=>{%Bhs;WoNbV#_{`<^ZB9`3E49yz)7%X6a6ke!x7u!I~ovp#h&o3$BEs!_I0Harb_{Y=_vS?pSMyI;YOD_mPvD6ve8 +^#p_(JX%nw1^&j`GQbT#v<2jP&s>wOsX#Ohc?^gq&a-`hpdd%r0D)&t%g#lYe6-a`w2=0Z(MM$Za%V9 +qH-T_AhiYW$K5%&Y=&g?keUjh744tv4q}?xTAh5Vw)uu+d;p~l}cIp~57+SX3oR&|@%$E&a$XA}bDA= +VVl6;s;msYzU=JNzkz9<4)V7bTW*LmO{KPmZc;q~#7}v5lnpWuC8+A=$!-QToGie;3oJr+oeT`|K0oi +9#liy=ORoG^CA=eVoY=y@Lu?D3N*2`lfyq +VO6p7mOC_#dSO0E81j*v@!!j3qQ@S^Jk42wh+iFsovJqQ3rBZl`x7rF@`M0i|F^VY1yz%E6=#ww8t#GPUu +CEYlspeH&QOx<)Cyzwc)bI9!dK6*|(1a&2D2DId31`p0;>9!7*cINal2a)wYWo_)%~+M4z9!i%kkYN0 +QJ+7k-!cx|DO_Gh^`$GJ0C(;5^<-UaLHA_Ydww=kQ!xv(5rvXTVAj*+9i4R$YGnxX6kcYdSx;iT^~a2 +l|mzVb*(8diLTrCsG@`3EMo?Ob&@mk{)$--9gR)1G{-Ouq&Wl@GUUvub3ykxYv2`+Xv{)z|KXiPYvv# +uMT#9^K<&z+z^Dpfp4WRT|M^XA9j-IrkU6YVQmC +nE4T4z<|u3W-2rJ?@=hI^Ergve&r_-;%yFYGc*b8%Z+acF`|eRZ26eh_F(r8%l)Q~6TJ_8uAyw4_NiM +ewdFiKf3kk&e!5@U@*6)t3)$i)e=(^W)r`Hy>JLtHxb59pGXq8)dcIz+?ideJ60NY(Ross{NPD-&oQ!0P}F4&Jw<VIbb0B4Dx0^DpeBPMf|L0)%RX=V)HR +%gh+20tfepj~#J@+%L)hfQ`xb+z{=7HeO8ClXyV2HE-(=&p8Jf+_`qd%#dKXsc5Zt~;;{Pa?vPXWbkhw@c!%4LFN;{bG`j;{9+rHwf=|b;#x +BBFS66t1im?AJTh~9+)!8#5r|r1>TnQ+Q6YOKYm&&c3@9kL=%y+GVLF4Zuw2#=X=Y3g4zqfTwzI@`+w +@=(#vWV!)@AjYVlFcJ4b4LV2mFoj!RFG>00yUNN%P^i%Q#q2% +Tld~cDv{h6K~K_~h_5`D(<$S&+nb(nQ4#-q5l?60wCPR;q`BfFKyn5ryU;Ii4hp5jX=Tl1V +d@h0hb;bO=ZOE@IXOJWy1bp49uuFoZ2_Cmo@AGwo&?A +Vr6hps{7s53|5t>8D)j>C*_zoR2&iX+Trmb5Hfk+k=d0)*LjNmgz*h8X77r63?L^jAJ1A+BzpP;^AR` +(-#u!Ye7ni%gYjF0ygj6`fp5x~DQ-}5+g?nK28+n}N)pPm^eF+XvYT@`mxvgvx%xaQaG~f9{A~$J@i% +R#fWnQ5mMjBVV}$zQz +f#~-nfn2K6|)v&jeEOXp3`g#+cm(U2h2U_Kv*x5mn=c{UYfVYkx-+MwxRW-V>R@C)@-o{r`I=;K&ts84(_s$Kt-ACf0jhFBl3CwnI}SBt!}$X=eW_GtqN&Zbl1o +3q@D!$rT|4TJGq-jqT&a&(a%>Ijn&UJT)$+H<}%ahR?UK_7}YSacG?fV#b>-VXPcc^8|-Wn=je9lmdB +n+M#|Q3YcwkQ3E+68?fc9*M)mT +I!q2RqI!k2!_FaL#C1Ngbe#QULW0(BCnzu1hv*bEM}{iu;`!v= +6<&4V}J53~bL@vW2WE)%v?CH$~^8TYP&ILk>gg$}4EvpvB}opF%_0->G|jKh&Jj2tK^ym_sIa5nZS_H +19n7yyccyyG>L%7pZ4^@K6OlcOi4cZQYCWo``0T&fUcNQ0}%vHbvKr*9SY4qXtRH5FaKrt%>$t3{TmR?zQfE!mFw99Dc*z3$b^?qoCfUzyV+ +jD&OHi=n#mjz|G?t3i^Gtx~1#obufCV11y3$3fe(e%6P^(ToLxCJ0UJn+d;LL!vT?F2+oC?7EUsKfyp +e=DHKLFmN?{iG=66p~tQkmChLF)0(%fr=Y8S!^6)lTcd>5_6rFV2b430bLOomMzJp&icJ0~lV7hj)GV +SNhRgRi$MuQoMEDNq)fXB|rV}VTHbW$OgbubNa3=yrj%)#{AJ1=Bgjh82Zyw{_%{VKRx9y*0H~vQVZv +&LfV>)$*79ocxnlt9&FbPRJO@`8=l7*N+?Y{P}5W!em+#Y;@B|hTy)!_7~{5)Ou347Sn8E0t4qX!9{B +4{I9a)=@6>|qjz`GgM|oE?Wb({OS2*C~<>*9_TF+;BnhnQO=Gdz08(z!DN|KrjWnxZ_KKloIY#j8~K& +`A_Y}Vf#p7cCC+LP~hcsR9>Gb;NQcXE;&yM4+Rh7!wdofx-kC*EAN;oR9q?uSl-xZ)<>#S>zB$fI&S> +ge3tdWk)W^kC(&Y9YrV(5ih@XkD^3=Sz;@LPO&e%h}2fV{zyj5RdySMO#TJxJ)ar)6FYwmEOmGB;9@X +dbFu%=8p$B;QO1XsSm;Vno=hqr8d9MhIw&(+du=wNq;4aUnYfwkb-*YX!@4gGa(gLJz=Vvz{`7I~=VOV06(!X)U-c1 +Q3p&>H2!tj(K*%E2iwu|D*^>nCf)JO6F*$l!*P;kt{U6WvxLW(KGb>(l?a;@3vlAXo_ +&(+!J=zH%Qj&+?^$O`%FLWDC!NUjJy{F{Jw|7i`bs#@v)P(2cO;E_QvZehVhIk!xI|!nMyZ0c1OAFcEx+NcJJ|QN$@K!vBwlUukXo*f2fB`tEfAi@;GC9xA8bzj3Uv7jWYxu2cQOUep +4V1o6Nz&jR?b?~2=_I+=Zazh-P$;UBH7GyrSk)+=}$B2H+6x3Bcldgun)~a^=n2gnXvYoChx_l0bSj< +toog}wLIyF__xHZ@;8bG(66rXSCKcD_iO`SNnAWVx70H($m&yUUO<|g>TIdzKz_^9opJ~$aQgEW +u%(ftDuy4VoLynDl;O+#+Dw`8-_U9u9bDXh6wLQFR#<@r{humPX6x7lc-a$!j?HRr_ha; +&fGQN#@`pJ7ueDUrFjp(XzMt2*(zf;t~;U4YExBk)E3rV762~JwN3$d%|=6R!8YD#oY_8a5s&^KhI?? +0-e-UA~&wia1x)Z^^>!ZP;q8t^*bQl2ca=l$j?v`}u=^0Lx1^1hs(cDxVRS2|zXd`8BjX2=^!P_Asvy +39_a?I@YE3nyEYUgwq(JGb-+$wJ1uTPjrz7HR9)nnsx*hB>9Tbb1ha-(y`h#cSO;}ilP!z^HB+1fzhf9QC6`^oK&9npea2Od23?aNP;JH6F)9)ecL9xfEu_+`K_;55DlZgR{+ +HY^SzRudg&aT@4WIxdbtFjhfTb1%#Ax$hs=o*{Sm1~DV}Umvx2&6IG*T&;Tj}vt@kxsS{^@>PH&)P +$^01aS#qlUeFJa#H*|+4v;StlrI@R%`CADU(m}b@5huN7XI-$~rikZ{=Lp@AKneB71}2aO{95^47Hj3 +>h|V{))k(8Wlo_+r?h>LUtny{Ox7pW%Du`yQqsj&X^hV)rj<%<}md(jA<~>6Bz3K}dGp_{o&YE3}yAO +vk=KcLAXnD}ss7L(Ww=3m7^X~ewoC++;zX_jsH)1-5++H!^ju&+3+5CGm!!u@HDu!QN|R?sk;1yx(bEwY{U~sO&g49_GuCqtM7;`g3m|h +Oj9gtX%bsr6bE~dX6xBV9P1oGb3$HxBM9kDFL4o?0FW{xkR0~Y=gT5wdQlM9C7!$t1P-rU;Qq+Ho>xL +-!n8gX?og58pb`~fZXRfp*h-7E_ci`+`cBS+Q|iki?nj*%O&$J;s&;jD#Z#3rMmrNb2Q9;D%C?^a@Ow +9U6wQ?-{7dDjb1a^ud%!!0|Vh4W*vGt9+|RdDAbq9X}nv3%QHjqumKJBOF0!0M`!*!6$ttreU6FJ2R~kB!)-1mtL*Lb6>g683}+PJe8 +#Uc^Hf_+JDaZ(RX3O!D!3;-WA5(eXB5hZC*lYyX}U~o(c7MXq3Fc5X{ve3R1a5y99?vt;e>cyxRhow# +lknw0tuuuFHR*5J&%Ka=efb8hC)*=orcU(n=1IhY3yYC(5{!HIVp#b=g6B=&voI*IZMXWc*HN2bc&!- +_e_?Gt8#C&`n9)=LMdhO>05F&AM?gZReQEBlH3$LRxGE7XPSu*kBWFzM>Y&ANUCubpI(jLi$Q;$?DWo +BJxaC9U8?;Xj=HqFNrR0X*-hY5e)2#!`AKsFN{63#Snr_ify(&;{(T@{vznrdfM9xAwXc4t{$?8T`CG +pA3IQ*FSAL{HXAwpj3P)iEBTZnscLB%C?iPy11el(QKmqlasCWhJn+yL{$M#4i_$VGB?p`#v!rKotKasGAMVjPS3{CkKXKd_DIwC2ED;j>U +)?%+vG(-Rmcj!?*cQQVT?(Z|_;c(Ys@dlUWkV+=mU(7*dJE{Zd|9p)Nh&F#)U{%lHClzE?*ZB~{yBKU +Bv1xl8i|K>CLwOv=5T6XRf)VyxX9+fk4dt`;}zCrY>M-0&>5&|Y~@!U~wPuQeODE7$4ZI6cdte^Yg@+ +4=#=sYN|`My!xXB61P7Ex3NbA(bkPplk_M`Zap7Bfe+QkOt^5)lI5XuV@pB$|+6;5g0WFr;U1tSR@lg +d#O^ZXQR@My3mmD2-r_0dq}6lMn8X2c-BVcOfq)QZlX_qsq+Sx?J(FSj@f0${qv+1A!Ip%A&!nc +;s7bmYJ(n|(I!V|fX#N~WA=u)V^=>tz3M~mXeG*XdpsQSEqp{3lT$p=HYi(T%WGuzhaC1c2hP}Um&m| +>DYO`h@bj!ZGXg!O`R3Flyzled>jREYkBt)^{>Xqidkpua%>Ht+COh}-hnxiv^8DM2tPFBP=YPQe?JR +kB0m-@{yZz`P^55L?hr`HEclzB>Dg9|#aBW-R5fFJ_a1N$d`skW(;S`W}&tV|Bj;!TEnErfJg8+aCHi +ZHI6j`S-h!o_a%btMl)G8RY04N3nWTX>762Bbwv3J`sO&vLvL2jP|Rvu3r_I{rZ|JN)&iMh6B)`w#zRZuhy@^7KR2wCqYuAdTzaOI(g6dq}G2 +btEr2o9x{~e|X0Bs?wQ%DFJ~j%J+E04gIMBJW)uMKBgv`xLfOK^|JiDCxOvVcKYEw0!*&HwbcUi8>{E +?H?~^DTcvM#uKxRFK;Sz5lgog>b^Irn0j(v$V66ME; +-S~tdm8}w%ubo6AAPKlgX1S45{t*ogqoz}RVP4c6v9sgV&7EWXUV(-wLgVvg`>j&M4?LM^#Ln^K={d- +h7uBgBBy`;0UyoFq*(3CciI?3${SwDj(L!R(NxoGx6$f;+BX;{O)*kA?}VGoYGu@qd7$eZCg ++qzv!k1qG=38kZgRrU!Y-El6Plt$@zS;Fg&V@C#}pU{&L<7L81?(m` +RriQs>L5*?OcVZXO+a(d^g5=-Fd^eDD`U-%;?*=gV7j4!5B)>IKhxKN>db0;~4pQ=L-d50Sm;@6zCa|%xW~e5;(F5O#CfR=Ii +L-f_2&F(}+Y4gbOkPU}U^HpHMWwu_e_5gj5PtHSyJ(F(CoipfO;nV)*jkpJ^hHU=A_O0o`QDD>G&-)U +F!cfNIJB(kSpci2$%Ju$D#u(-wG*Q!ps9oIJJScD6b{q8Jz^S(06h0R+|P*AUl(!f5|d7(FcCZ}5u~a +Q}L6i%+GojadvdF8C-49!;#N0KMXE>T3Mrg8ZFnh>-a^5I28;g0~VL^j^dJI(4W{`n#Bb^u-|S`{zE6 +zP8T(lcR%!L+jE1fQY%#D*9_A#w5}5n#UEe8bW`g7G>M(j%298k#A`VtD@td=%DouHcmqWYB=-* +@=A_b06+!8`{xvwVk89mHk45DS6-8F%q)&Jee{hJZprnHY7{oSC~*688sS5G*1Rv9b(KgTJ! +}ehoKn7@WAHY?$!}IegDS*Bn|9EfZL0G61M=zBD>QC_+0+5L4_#h2{WyKE+h +M`^8uBF5C;-6LNczMGv`2Mw7z1%H%P%4+3!KtDPiONT(sMueR +AW8tWwuQk;1ijvad#GO8?tw3LfD|~9~>t3>qCd_vmwTqSn$n8hAVK~~kQdwPktuGNLp?kT6Xzph#f^LNg>mz!*#{s~xdCfdb=X>eD$zWGzL)tJV +(ia3og>WeVDKdA6222~g++O~v?M@#p=+1*aC+f>-H5DgzXdSeHP;1mmn3n)Sz={qCOJ?hT6Vv{aR +OW`e*%+BN*R%0GcYuXfs!dGfv!@t#Tc1riNtN%r>OWP0|I2T)mw5|z$O?9 +d3@T}Z2zUPsHwhZ+VJ_q;qg~f6wo?GA&4)~e0*bIrf)64AD+`B{0AXn>!jJ*2&v|m${2SMBE@@zXo&? +jw`O@@Sp<{)hiX~r6zhDb#jD1D;dhK<8G76SvcD##Kb6M$G8FNt4F&YAf7rVX1#Y`Xs>k9=(2>^+qdLEq601P=D~x$pzpEi}ed(^i_}rzY=TUu_Ik8QzYAs_2?)1WsI2)ah+Y&v=gL +UIB@HD6$TS8T>yc*2j@s`>uJ8F+w`>Ju~i1f29zvs?46Y>LmdNx}JWzr0>OPBW*H1Nftcxu=Q62jimk +fRmk4T+>Fekb~w8F_gw5xo(r=hc{S_r&i{951-Gf{6|cmkrg}8hR=M6@eVCyN7vrn@qo?&WVHEv~ow7 +CO@3d26f$7oGxp^=5*BS6N26z#$4BX#y$zRbG*RW4$9}`x;drzj5vc2M`@3<#@Rh`NHgTp;hJB1_-w& +k_{3EFUWa#my9r?rHhlAXi}IX>?u8{~jmh3_gu~oU9iA6-KP&b%$4j?$q)VHRshP+PXLDW>bOb9OC0e +>BX|}Pq4;S(kWFtDpWIod>=4yW)oBr4_ccvtd!4+)+=Dxd3bY-5!EGF9hama}y%#m5lH*9#Yq0WI-DR +NELMrW;y`o=`(>~f>HiNi&ITh??&3NJTG`CFsxO0G@mvfNZ2*Y^86dQqUXJ)y>Za}3HP%*MW-t(#p;c +sadZ+vk%hqeI%s)POqyW`vv5c??KQMdPXqxh2o5E|6Y5_DifoblI#`HwE7XP2%5zXU#D~X4{?H)IveK%)VKGUNyP+p5n^kOU4>@^h36HMI()pOB?{d_IzEUq4CSa=r_}%h8c+ +At5;ao1d8M1!CY1+0epSmrG;EpV-uP4lO@JkqI%Af?%F|t_$H*OX26BriIAlucPZyU{Mq!#@FJo8hrDND__wC&_6-(}~)73XJ?$BFI6UdWxJ#}r|jr}zwg9bW|;l +=BYLe(xY$*bi&%#>f3`MNg>JbVQ=I`xqw>N^`DOzR%iO`cce?DpKzEHen_BeXjWy{lMW$4+7H^^6&sj +a$@(^%_0R>b&QedeiN04`B|Ua6@`@3WxeHPCNyB{>E>i;*w)zjggzjI9%<@HIO)k8xe?IFg)jLDWby7 +5XCoLOY2rV>ZeD1tD6gt?h2DWd6UhLDyVH2Ogth)6m5;6`pGF51!l}G!&D>qm;hI~TBSRE} +{d%$dNvfh#q@o4sB!|w%Dc9e%Y$eB7ef^VNp66HubEL280OVZ(R#?mr7*nFezCE`ZQw^6B|R+?AI$9iM^!D%0Zy2*goqvw5?4tkL$}mozQDij2q6H3N +6U=a|x?wDOqBuURLCT88jk+5rI!ucx@do7jzb^4LU>e1*vX5y5t9ThIwamB(W4fW3`r^6w0Vy_akX5W +w4i@b4YKCZn(D_CARM2j@vSZBSJotV7IesV38Tc*h}>^*N-0(8SxZu+-UtGymkgwbxvyt951RNj=hR= +XZl-on$3*>mAbi6)e~md@U1(-SH5U;vR8019DlQ@Vf^385>VNytb>s3~e{dn4e9)0>=gh>?Og$tPZ}8>qI&5WXM)x8S*A$L9C^a6imy|>FO%J&i +Me-*wyM4bh&ZBNL%)XXP|G614po5Rw@h-f>j^QYFT9iN$Obs^G5akhYnw}J8G8rMweU-SIZhiO)lIhP +A!HSm%LZ6%>cBFC4FbXc;TLzqqjs@kohr;3YymDq|ZPj`He`mN<)0}+>b{G2Z#QXqXQWv=y&bA*+Viv +PL#THuf~u*;63-adW6tJuzhgC!_7HwYWJpwr72$u4=vqNMCqt8c`o1PEzw_Z4Xi9*CSk8^pPSc{%yLD +!<*W(0FWaopcz0E++YPzatkG^B=lJ1cI(6VOzVL|Zuow9-Hkir2v-#bj*;zjc8CGrXL<(7HfX|MP-tU +UpsnY)XuwSe#yS<$uF+!eA$Y7~W4Nq|k$5%7=M_zFRSS{wEn@ +_2}O-fx7gw7>;+hg~}1%HkB{ZO}Qtqu>V9G}pxS55q(Hx1j1qeNjR?}>}X!F+U=!-l~zb^&JpRoC!kn +veBfY4^&`wYMkiI?i{P{=n{E+IN4)(@nk#@S(=N-{RaD4-d>3VsY1IHDR(a|85~jJgb0=|Jku-I6nX+HG&;mQ$ +k9I&J4>>H6TBDx`@TZ|^OubM=n4c-;|pV${_Fc!epmna|BK`Qsgu!q?C+})G|V6{L6HoD(gX>-j2Ie+ +X##~Ah9YR1Aec}67GeT`6NUpAOBgV9iLZTWoCYmiAS$>Lf>Rs}fWV)NKr9%?WUFH&y?TaIU~Cfu@$nl3Qz!LrC&nf7R-n~qOaA6XnHhU`^wybW2)>jPQ_7~e+=jEZ*1oF6VX1YX59}RUN +>!G$2#lO9|IIQemwFo}a`b!h?9Fm}J5u?N%${Z2>B47hLz{8*VBSC9j< +IT5n{?aS@m*HOsBN;sRw>STeZNw5n +z|i|#%i-I*Epaa(6`OSDUybk-&~ld*ZT`DF;!nc@eXdUJE>Il(WB?(@&Et6}@mGh4x0LJaYpCK=yLa( +3M+WnYsP|h=ev0<1iWGLwPP>Gcy$*HQ%SE%<)@`Bk9yL`ikO*!U$(}jNmt@PG9q*M5FHynHnq5Ui9o_H>%dKZCY+q(%udQZ8aM|ZWKwT=w>S)CfKIW5QMtJ@v+IcQs$ +GuNaqC07cDe_w**J~2$+OM25$kN2uryI&>4aBJyFKvK<7SznGz4{#dPOX;aB8VsM`sgzfP{AcNE?5__ +iS@KpE-9%gPp0PJE>0x{jnpvt{H9`b)+uZUX-@nlGN5q@WK>snr9&ol@Fsq+=TzP!U8iGq3`m4%_3es +SvrN5D*ALoXDMz3e5)z+@MBoOk8fcCw8RC&WF3!Q&rw-dF&&BD+bn;g!^S-o&E>L5ACdZEk{h91P4Xn +(%02Bnj*-%ht~(qwyCg@mv^eqhtnXs^a_vV9Ez5+-iMsc9)JSBFUGDc)b`(|ou>>q4d!ZshNgLs8>d^ +U#G50AzH>Id6!Dw)JbKQF}mOPzQ3MWkW!_#%r9aN<_Q#+l+DU6bPwq$&YnB8OnV*Qe-UAb(yn%j9ZO& +>{t?NeGXvE!jA6Z_2S$H$8cvfzx;w?e33m81uGff1W$1o6S9l`cCSt~EWYZVr;U-(+@SnObeerz$(fjBN22=l4i>3eC +vHsad>2I#o6tVy~hQcI;(kOu=FuXh_5pv0L7kpp9e#vxU@+YLTHxXbU%z&?XWeU3H3o2vT+BknJ +x_~)eT1zN$ZXR>zNF)$>WtW-8YfTnL!X&ljh +tGNI(eVXq6(i0?EkZo(%<}$pf~TInUq7EoY5a-{Y3}{T_Xb+n^-_tDTohSe6@r2l`@v6&?%{R0WM^u=smf>zaao-A7rPhSL= +P|8VG%B8~7{Nz;-BDjTO2G+eorO9)>%)hlFEc;qmh0DgyP(wTmD+i%fP53w2_349BHZ@yWd9?*_vJ{J +xo8UB=I}r-m4`*RJ4lvLOrb`;luBb=tCx!#}s%pm(Tn9+#bHw%#1)#AOaicPe~ka%UCMZ5-(*=oDi6+ +YNU1uBq>kM^B(tB0kgL_#$3xlhrjTx_?9m{`rE4{rd)Y^nV)!{`Z{AuR-Fw3=l!7B~C;L3MNRP3dAt$ +FzW&iKuMlq7Tmxo>eCc(Sy_=7@Q9c7m0k^El2z$FA^$~@|H@JDJRSp@@{-wMpYyhI1gz8`+e^XDG6ob +r!RQTWIj^l~4D_cF3art(EDKO1O`*V^ftjKb>>>ynS=>u7DhN(4sPN;PKI`s%7Z1hj)l@b_ +CQdO7?8Bk@}|ItDo+7-e1c=J8+31c`f)0#5r6ln7Y)G{8|u-fXxX!oy*knVX-bfVa=QZ2mV}?iK$w#C +!+|{uac{ZxFMf39PNy_GY6CeN4a#--!r5eg|T}SwkNX^L1eLAWnamX;UT8@dp3*W>vHpicQ}_6ZG$3(>KsGLw`biyWi;UaD2w7^h`759(P^ZLPc`lJeAjjCWEf6?K%>q$q@94IOr3$TYLp$0@Ikw__t(fD4+l|634KdLK{!_lrB;n439_^mhmtwPY%lrzLDkPAneR{5j7QIEpNed$!^uh +8o6VWuaCbL?4>=Sg8#2Q8Rp&iB`vzz1=@8qP(;FDG%`I9S_$bB?R&)~+#*6FIoe%9jD^8{y2dHf`5L4 +X(ikEh$-4o3o&DL|gO|xL=nb5iyv8TxE#E!cyzfpzbDYqg_BjEBHY+`nBUN_W+=JG5jk3c&K(plx#m^S8N!S>Vjo!2JtQLC2)o00cF&OUo9?|ogJI|$hj0Gt+Q@uDWzKd}7Zm;@zf1ZSE8yguCKcIoG4bW(t&<|2=f1$0!kvWPxC2e-w1{|W^gJ(Jh%$az~bT +W2bl2+|=zPtC3wX#YGm#=ebv2v@zdQBs2MBW3E{r%A5PfDxkKa_Q;{|#m3|JL#UowD+GnI{bc&NsQ_o +)|_WFbOn~kR^(MX^KFo|A)FaYjPB8q6FXh742ZQ(6JBvQZu101#lu-dQ$(A2i95qoP~0Ec=QbYZCt285rFJ0)- +7UL1%fZCN3()5Ac?7ZiSBz?CE3vc3cY=-@yem;~kPEyhQ`BDsM}ir!~{&#!T?I9)tO=9FtMF;xBZ>0^O^YNZ6{%dVvz5|$|{9Rjk+oxfNeX#gMb(*l@aDfuSpQ +UBC%(MA4^ZW-TWl&LuzLu1+e^XKh6=mqZDJg@BGL(L#Y+p*s*xLi={6k53Lo?zQ;r>`s{(U6+UzU_X< +cGGj^k0{hzrmt^TT%va2{K9!1)A{O`jj05XTSt2=ZqZ3vNsl0S&s7;@&pT#d#bzRsF;g%qnLwW)*54b +u?{&8gz|)*jB46rd(LWmy4Er5;OM2|%0_&+iE5@jP?Vi^uoFqXAkGK=^166vIqG2z4Vpeg{F;#rBHTi +icHo<>Y%6NR-Vb<^QU9XM3Vl{*{gGznWu}+dUe?$B6Bfd3=C+)ACwdppU>`EX^IzUO(CKB-m^EaJH)O +~6!|1^$q&`kU^xjskz%dGmQc+oX +)(oEAECC-Qma|`qAc^~`L#IRKXpc>|7!==| +1&P_52meu@3MY~L!gaGP&kF*FpU#5!fa89#3%wKaU8}F3MJ{!$=3ASMHN`6ARqz66Ci@LWs7wDE?2$< +m=GMWu|buQ`P>wS1mR%ISTO>yYPMiOp9mKu}G*Q4vK6<;*yvawO#Ub=9XTQY{z{#~ +qz>%=QBZ^@b{2;EePMJFkLAX|UUZKuzy)BnHlY2DJcf9ccudmgyuqRbB_r(V?5==SsLJ7uT8NB90Y;r +&Iv%Y2gWULb>WKN8-f*LZ8_y{#rc($Vis-utuk-3|Si^@UWCs1qgGE~#IRC5wNH^v-v^W9g5-iH~3h{ +aLgFgFD~)r^xrO?v3GP`}uDEK3euS2R9B#u2haEBTb0_WhuUg{qxMf?oAPQ>C9qjCBD+5_`)Z{lJ7eO(sc@DvV_M+e_x;n?J{#ZMqd&_@kF +B%N#!n$VchG98>n#HIS1lmz4jwv$wO62i3#mF!%l`ARYBm` +}<~&G)BmR9-l$LR6m4P^U2-Yh)-dKi$#W$6M4}3RxihHMWP-?9<)ghYz+ce;@u@w@>BtVUPp;EgyOrm +U+IH0b`k)MT6Tu$QM#d9#TI;{+YWNlI!z+Jp_JI>uAzmOBQHM&)ghHhZz^x;vq`vzJ`~l+^Og>q)(?@ +?p%ky?z}@gFa@`l6~7cVw$;&?#<&vG46o^Ut>l +7Y%BY!1L9024)yG*(dC39G#d-(Wjvp1M#!;v)hlG&J{Q6MQSF*lD8)26qNi6g)u_?>c7I9fPJ8a4KD8 +D#4!PR9hC-+Ch%PsN_*w#b#LpaZt;B6t<${NTJV)^~a;}gYk?~qi@d*ib#}|aJilzzoc5i!)Jz0^MaA +r)Jj6GEh6&6`AoR`zS%o8c@WDVs8!+M~tb7?O^*Kz0$;ud8_k|`mA*NmJGbH2M?@W*aHJ>}>0f|DV!a +B@iJi_o6Ja(9~L>y|)wEgD)rqbfF3+tx9QQO`8*PKj}^{4&N_hXz4XNCk1TmUNU2BS5CTu%8iM&EaX{ +uBseo2fWda7(^K;A7mmR02u1O##a9aUgsZx*1x#M?@S{LFajn +?lE4szp$P&;HWWtUFiaqyp)M>0b6^{^O5X){@=`zCvT-Ovy6PNq>HzV#{U+8#;XQ)J0onHWYv;a~ +%7^xGDQNdU%*GtjU=6JQ4rGeD(_1U>Cvpe~XDjq2n*jSgVbTd^#Di>M$N=zqj-eKOFph{0>)Z#LV8s{ +mz<0cDK%Et|YON)e#)fW8O#wu=CYDSvInSAf3r{QQQxbX?e}_7(cJY7PEnYW#sLHUhZK!H+2(8 +2ud;?uQ5y=QBkNj92$yq~oc|#5gfydY%`TG8?4H%!H1Q6 +v_;Vv$b^FaorhafI#n?d2gP+1fR1sR{9#Rq@omxhUqc-ZOb^ixg9AY&x-o1(VM6F|^E0J`C_Evj5D9M +}NfCZ)_Ld*WdoHFTqHD)XD$&P5NIWj1b5W-v8Hmuriu#5=Mg?kU-gE`bPYc9aroLmbE^ker`F^{r +k*)%ab(KJO8eI$pP)lyH^Dlu8uM5`}V#efaF|UrU3182ff02DPoWzxE~YSqbEz_Otr6>MBt=97SX-#L +SL$8%Is9W__W0hee}2wK)O>fJ`^~6VBm9>nKE2CE^eeTb=Zf6E=7zPxs5XYm9KKU_iZTo!>fLCDp-tC +++wLa9|d*!VkHEQ0l}EB$F?{MwXYvbKaS*nC*2rtTd9UzWof=%OxUnp;Mn?A?r{O3(tsj#dw=54Y#H- +nzF6dA-d?ZmBI=K1Odp3tiG+tw5FuI@SL65!SMYYeRMw%-`4AP*uX%k4Nb29+ee0rux0xSAvkxxj3sS +{oie#%*#Yn0ye|*({Byzp*b{bQJ9@%H%k)6w$;6|X5sg$qr%G4FkJ-2Q8F|UtPsTxYj2;CW~B|6NcVV +GXrso*p8zA)Nkgjc>5R$=e$E!@HaMAp-%H}91;cm-rc#ikso_IydY7sOuKaxdcZ^FkFGdb(4-ML+aXG +tkpcYK48TmkdH~=tHvwo{Bs_3{!7lD+S|-j_C==W05*ZD$lxFT!&CS^T3upiB$U=A0o)B+dqShm!0y4 +UA@l6se{ap#d>)>pLDh~whXCyGH0(>>X@VNQZbS2tPt;Gzfi)9zwRj6_NATNNX)glKQk3>$p&rn6CL3 +J<0%UYaoW)BTrOdSv!b^(a!-AgC0ldHo*e5Qu`=)sJlymLyuqLs>wMp_2NGw{SB*3A@37}yr}kd$d2} +@SdgiE?yGISkWp)BW1ixMH_)2_wmGbgHCm|ls7=5CT*K+z-<@&P$?8Od4v(be|@lJWGzLD +eb`RGsmaMUhE7IG0_XwYSH42!rA1UgL8?G$;@4c)E^twa|KLb?u#@8%MD+%&?@o6LU!FHXQ>v>!rTBB +9dc1Bit(uRhW@0o*nEL4@KL>`W|Zeukj(Ah0}x~``08VIfZFSZ)_K5@wIp}FmO&eakM@qC|PV|ih|t|bcGHfN-o!j4OOh74WZZ1nKOUNiGCqR^$3@xwHv%w5T +BK1`QmU{;YeCRd+z{Z=;);T$~WGku+cS8tcenYr53Ke44B!f^O4NxLmE-oDo1JxT9B6S6-&>1Uhz|7M +|Yw)KCx$dAsv;J-Hu`ZJTDkO1uh;9wVl{xy}nXM15lYuj>6;+-$!D2S8v=k4(=1Ok3E3YrrP0;q04!y +11Jn^C~lA%0IEZ#gaqkP!&o$vbOCekGL#nj7)k{sDh0eZK95sJ9Z#7GSq@ev7voWWe6Gd?^VobqoE;+ +k$9A91-@W{$X#&z6f+IfE_Rbcz6`DW&MAt0keYkIQ5NkC$iejFaIE#0NM~-_)}H=2%QBnHMsdh^Tl&9 +y9h2;ewDoy6wATCTjDfs|Bi;!&xfz#Wdg6Ax4>8cPI2{i*x6FCEwuE3PgGYQ|C!Xa{yq<7tmZpv=8K6 +ufZR4{25bkcx +A}!I;jvWVe|fRG|;QLN~cTa-XgS<#NwJ +u$Ys6yVbi{N`)G)`5(HwQKSJ$Nr1x;Yg%(-xMLcmR-^e20W9GsQ5~C}!#%fDN52V6mc(^{$&X(aScDJ +0dq(8JOe}>2HU7L{HT&@TF7Bq025J%M^%Wdz6_Q2&eH{ +wYa^skDdXVv39&ZbtB(Uegw%83~C)q(hHNH9I$sVFO_!EB#v#YqG9wIdL98W(N@NLf}Tta9{7-grK5m +_JCynJ49d&hsty5x120m$DI1>go#Q!7B20>1=;51=fRgFOxNw+1@!**Ew_}DzRO8UpWq};IH;VGZds= +o25;%TQFQ4HcLZ +lhbXKswZ4D~F0n_nB(Z0Iu}$vn#ZbvA~8>&&CTIbnU9fYgt1A)%Lucf2UAV%w8Znzxw>ShUCj2iQq5B?jh8Ach4brPPZeY$L ++1>1@8K=$mm!H=ybT2>e7yZ8F$pgohvQ+^_&79Mi>O@7#%}0&+d9|Sz_6XfLjlEY8JRnz_%oj7%k%2F +FXmNQi<3Xq%Okq=R<%3R-l{!3_2hX$8x7Ibw5Fr;Ob^%CiTlDh-@Px?U0%nmOfx-<@vc!y4}`pl=#E*uNE@3s1(lKads@xnk;X?h`gMdye7mL>a>r1VbcHbLr0R4KCINo~slx( +0Z3am?mO-D;y&)Z+Opo>yX@v}e9;R?Nx-Z)F3V7%T&y4C*W+R%tkbMvLb{su<{g_uyg3`Ahk<(w^hZy +WWQt7E`pvVv7-Y2;HPc>GSs*oA&86U?I_3qbMP;MK=2adJ?XEL1FrVEM|^OYriyyTpw>gIN>) +SWoy`P7t8a>Ius)G}FOvOsFF7bf9hpQ>S^*^H3v-YALQ8s+vY^8F>P2C5j96Gw$a!rOlJ~^vAv(qm+< +uz!&UB`u$S9NXp5cx{5(mdwbMWFb++8M-EqQZ?EU;B}}c`K31DGJnywoIyXz4#GRWKgQArz>U8iU&?q +FXIp}dSxI`$t+q@(6CcUYwg`w@N!%JM?>h6-B?WquRe*2q^h|(7CgfufMmlooQKO|ZYiN$#X>}W4)d| +F66MQhi|zU~e*-S+4G!#)u-)aPZT;hkI@~H+3^_ES=foKVXf^CfK!GAnK>?mgK?i?}Lde^~7z7*UO{ISi^MQazfhd@~`SL +IgL|X87Ai*;bDTxG>5kSEr1ThjJ!EpFrMU)6s>+5f1d5-;D{WbWh5^!(@v4cL+X1*|PP9x31mdOA4Ox +?FZytg3-^p)p+1_m3+MXSGde&39@EyV_X=PzS#XTSo?XH#%dQ+SKMuHYE-{Xs*@f7C0hTI;(S#6euOL +vY~=(A@nf{X?IPxBcFno@e=+hogDE`X&-L-dB^0q?#@wm%6g2-1+=w;y@#xsI`1#DbWb?n$7hv>3T7PFSw7B_*(?uFVpv^1cHXU +j?#a8ptBAp24Xu0$QFt!NyNe3Z+Mm|LdRq(WeDokA=~#KMk3rkW!E3k2uEsMb3v{%NY}m32>*1f&F&^ +dV;PH_v4X%AmNHL$n`+Ck>267J=!dZxPhOf)s$#?F)7f~L&Ty5ka@4M5HVwa}$##QZQc;;=owbZM-E+ +!kW>EnKbXd@Qgtn;r=jRk!7w +H>gOQsDrsr6GB!)SxInO;kD=58vZ1_4grrX4RnaYD08;F$~|^x9`B-iJ9kTP#AmJF!FnTWh=fWTTo9& +&*eS4{_pvE0y)SlDsTLM=A>4S{p`F@!b&vbxJ>TJ7>X92618>wZ +!F4zeQ6jhMN9r3j8caHF(p4f9RPZyKMy$&bm?uH*$qR=RN3`;OZWbqDX`EjzhnyJJQ`?WtXB+&&B8#W +IS*PU^~y*nLMyJGN9jA*YX0b7GA94K@iS6)KoS>O9pC+%YP-#)K><(X1nt5;s#kCTpP%A<6F5zaOHET +iiYRH2y99zn#|>9v;8DN5L?&g_&?-aM)3b8gobGm^K(Js9GO--~5$;}G~AS}-u~MZK*Uleb}3iU9up7Eb8 +&7r_eKQl1QO`?nPVBR>R`cr*r=vBk0Q9XZn&6wKqd8fW^pCE2c!CP5AszKuoF_naAUVou&XwfD3bh@^ +krTINBubvpcR^k`^1YqpQ}i@yG%z07|EF6e9I`t$bk?@7s)#2{^eX;Tc$pFZTvwHI4|bU>BryAx!0aI +qHH=}q6yZoe7z=P$NW(07-ov36jEKG8%lSL+v(1TiIAiAVB##6yj9umJZ+<6OKW9&`lu$1nEV!SCPS- ++6n`pS{1o^Y)-Wdw+lD?Lo=;A836Y?|8X4%Px7!=poCkX*xkwLN?lTySBbLch@cQl_s0{s2@GWqkW_b +kw9ImK7`Z7mlA$`2nBi`iW^pL-@o=l48_qsq)yZ$d+aNHLD#3^E2y3p#CbY3ZY#s8am`}B5R27|+zv* +Kv_7AWu{hUka=~3FQ`rsd2#V#W_(SCi?{MwU#Xi4VxI)GaY3#DyEV&PzJ+SR^NAAPox%2Uo&WXAw?i6 +I=k7|+bhRbnf`Fyr=$BXhKA}-XpxH4J6R%aj=X}7JmMSt%c-L!07rv_1$q#Gh0+A^7%vy?04Z4t>aiT +$ZlHTCGxl=pNk#Y&i{6`u+rKTcF$j6|tt=8y!h)MmfjS|ugbRI +>NMCQQhm4>JvQ&w{mkrV_)%XCan<+X>(byBA+K;@DUDW;2xKnu2r*Z`)$(ZA{<@V7dK7>}l6bJHAST6n&kyRA-!;Y1bI^z`SzV7sWMLF +K>qMqmMj%PhZ5zw%T_G`P--kraTnwrWlhf|(tEcb?ZI>LOA1SvO}+3}IBhrJ{fJD2H9Me%Tl2}vr3&{ +KoTs5bL27+qa`HHL%?(#Szy*oN=!TEn~|Up!x;*KNwM^86s-FxjqlK40l_AqGe>OvHZT2p2}^MSu&cj +^;H`Z~CQmpO_$Ij#lS)-v9dp;BSYkcVc$@;RpBopMG!V+Stz%-2Y~QZzI^BpYcntEs9`plmz0PpDS3$ +1c;!~I~H$|3ntza=C?C35TFi0q87hZzJM6@=LD~W1QX3)rqDpv2!pxiEh=tn;{+&e#t5iPqHhZiU@k( +u!#nw(@K>^(arCZTqVG9s3e*+Rw{ib(rd682iIb(P_xeHDRF+hr4BGn$eHW +PRjEtD%@vpa<%q`UU|!0_r`pKlpA#Je@ +_8{a}+SSP5Y6CCs9B2&ny!?~TWRkI~4r)zuMNBYX&Y~qR@0x!lo#d0y_oF7MG)mJj!F+4TxU4}hwL1T +C04%P$S365DwVd=aeY6}Wl*{_aU-Kk7WXXPKOUK=)ig&tmSV#>>WV3ym8dRqQ|CM`k$ikVG_DDjg%KZ%3DI8#V9^x-2>7qx9Tdy+ +BL`U#!xrR9_e4{Te23XTjs>Nhi5d! +qsbws6EVfgyhDjTnvE7JOM|fE*Mp +K@dt>^xWs;}9(HMi1NWGegfdwn;mRE%MoDr$XvvO7V^JwCms=Zd$qZp=q;1HU`AR110yVLkr8!mV)@| +U6x!=Fm&a?1Sb=fvn+PpXsRp>W_4%A7oJn^g&*pYc@UCqjmCXIW@SZMONUYw#5j>mPCQ==~Q#UZI-@F +Hd>Qn{<0Blv+T`VmGo>uOV7)uw`xG_N6U704Hu>~DuBb{rnvEeVs~lJxglV+?AI(yeR4wtHkLkP-{)- +*{E}jU`bM!(o#CDN6k}>wE;Of4#;J(?c*$p%jiX6bcl`Fq-~!K%2teB9!>sH7W*Orx5!O^A-+^-+q!n +$eDgy5d(kX&m}6~^rI{SH0ABw^lcp(;~<~I-yA3qUf!mWTjmGD@6bd6T2l6_Q6U%ybSWByPOuh|fp4~ +4a*J7X1{T`BNodehW8TWyKtlutYLr_v-JRkuL;s2z6$%K+6upZjj-ApzF`dGGSEWkweBV{_eVA_{iL*Fj0favt2R7d$`%K6&H4N^d{qD|Mvdy8m+v1kjfWm +ObWqYPfAz@kUtTPBFS(=5T*0-E>5szDG}XbVW+4jPj9Q|;3`8?HKA>{tGkPy>++Fo#?PJ|H)_`494E0 +s1c0%Hc&Dwsdig&};pcKHGxW7MC^q#&Kq;qQ=Xb%`%_!T)jcRurlVqSQ)Fp%6JQG!l7=)BRQ269jXYf +Fa|mbf;%J(G!%l$*5u1tJMoM@*R@!ZgVy4r-L}4$PJ_eogxa5oVasUpqoeO#n~?R3aTjsavJ5B=d&a% +sCyrrC&U>{JVNbKu@Uwmn-ALe0`Z$k)Rsl8Ar8S|6`xKA?~(iwH|1BB!&(hohAf0kiDonE +A*8iu*-wW>_^2rdpp>=3ws!}}(KPfcXQdz*bB#0@f8X68yfm!p9_^^8-6B!t<$!ym`H>tR +%bH5N^R#?Av5-23_B(v})`N=t9!@^yJVCi)xB{%E8!eWyNcL1d4@B7Ph+^F`A%9idT42J)(3z{@% +S&_WM>K*Oy0I8bG_a*&gcpvhbTyUp%VsA$@{;QjR$;n>cNM)Sr^8@K_e-Td;w?>zoOspv6}s-NKxz$g +FJ=LJx%q~@BMAYHpW{~tl)Mk`LyQK +KRgH)1|O;v`wzUH)+oiUv!2_nsky9rfTqr#+ +4&`bG-sOIwwVjol;8Oc&DlJ_|eP6mB~<*-r&^lk%4Nk0YC(;VBu8)SGJyfnDXNP36PubB~l)mpg8n7<2mbaDTS#v5^T2!`a&Q>RhPjkAJ^KrXBQ +lH(3umTxn40)*bsEX9EZJe@*lfvb-282{G6xxZQ5(7Kkb&lTX5hnDM9X)n5kc +C6R=*=gtntIG9(M$tSRggU%7ErHjWN?%JMNS;anE<_j@>+TU@)zrPl53uAN;wDJp;PN(ws +**z88(9p8~-Y)3rPGH?Hqf%uW#xUzd^KMx;+HJ`bC2U6zw*ZmL*SJGwELULPJ^-TAS`6x;?YBDyeHJh +YGj|arB3cUQJRcym)5BzpKkH#K-b>FVCgO)&ae1s^|pCStG0KKPvx#@?18VtBeW!WQy-P9a}-yHcCoFZ_uYq#$Z-n`HA!I~J8Vz0UV-Z}OZFw% +o>wc;sxuuc@~LXyrY6z6jBAZ)v(`-JQcc;jz=7`cki|<$OHHC1o1iE@d@aM9ixp6oU6u)NUPQ^0b4r& +h=UBf0A6BvbG} +C_^UGd3L>qTOe?EjVZ;$VI}LyKDv<=?~CG@9boyHP2y@oTxo`n$EB_WKM(5JKTksWm>z=MS$!OtfxZO +Ijg%gG!Fy>XwK?8S~QtwY7F+`--bi8If7hLcttg=h;B*V_)EVl(EE5mjV9?>XK!lAW#IicU +Tfoh#5CnItL)S<=%?qn-YOr_-~DxH@%)v-;RcgyQzTUgx9FatBMu9_Svu?`{H-oCMP_cT8pz7i|YAMu +F{-F%+nDDcIbxeUK_reKROS2xMen>&k1NfLf3|2fkI<+=jyjIPUvvendizjF*9J8QrXV+Li}srCwj#FDarp*r@bMWUozcoC_2dOox-V94mKU`C`2|?yCtw +WgIIBy~-jON!gMyq`t~Eye+l{K2b+2CxHcnEwj7&Vs4zR?F!g=TX2C4p7X;mXXS~t}|IncQhN_B9m3x47LsLW!GJIm^` +MHnC`wsbILfTsvkjhXx&ve;hp=U9w$%Abi*iX3GX!bjP((dMR{0>Yggqbg>qHymG6T-d)}&1%A=4Vp> +S@V%k4gfVtqGMwn|IUKYGKCw&xM^XRXWBWe&9C7)`{~(a++%XRU)l`q^@IUh@Oe%n_C@{wM@DQoo&4FE +mV$VZx9Ya&bdQmZ9<=-YX-&y0)1Ukq^42LWtP>HQGyQ%qo?LX6jLS`mO(y1Vb!XUGlC9ZS +njurn{(A1XFO0FQiI7TK*G%4J4S1q&b-X!i9%?ikH%MwDyk+I+ym@_F{W-gJR)A1Cotp3bSD3A791i7 +U@Ho|ilOaH8rapssXVz;+dl*_6;D?GpbJ<5S-tsaN$k8LRRxQ*agn74D6Tpt#EThZO{(vGQ}AxDZ-f5DLh +49>zQ&!)U(vM;TZAFYeAy>aUURSy9A!`jd(>HT3sD$JF5{y-M^-lW{dkBG^h&bZm15Xspsd+_vKHNSO +|9~3F7hw~nUH{u7`;C7zP1?ojmmbvr{YA?0_&-_xH$L1R$Ut%LGYI%^*Z9DPfA#zycqqtQbr{8IoQ5~ +VNFn&A5(h;3W=W<%AeadM1E&Dn!EcL!4V7i@ZW!`*tH*#m@24mcILf_?k74}oYeiq{bQ>nzj&E>pL!B +F-+g>E3|3jsKT*8F^iBq7l_>00J30`gkn%P@qcmsP$1`G$V_a(vaLgof*aTH)poCH^!(17a+_?;=JCg +Le*i*0CiJGi|hpoAu%AiDh+!+(VmmGg_|xpVqE59M&$b}6#zLn{2#$Mriw{%;t~J4=EgerXwTi$R`!s +RHFWl`mdb-^~NeTjRzX6P_!svb|m}8{Cs67*dt@$W$5lNF6s{s)=8f+rFK6IExO@zkM%m8=7?nXwiBZ +WsX6H-Ous|DRR*`YvqLR7yCeohckQsXtSxJ`Pk060TD+?m6>KcFh%btne|7jO#dp0`1|nYTPA2V$_n{ +ic^D}6|9)_bxA@PcOV4nP+4^#Yiuh{Hz_+)EY2^pStgjANLdh2WHqZ)hH>A2MS`Abfz|iKGVu)EpzPD +bRdX0SXYYpVvd97iqGbDZ~j7s8Ma~rhAOu<->8{C#(?DeDXC{~iNz0L0z%iWdW^ipiM&>DYq`*I5{wv +)Ei??xV>!S*vVfF}j0`*lo#9lkgc<=@aX^w;p3pIBp<&2?n`>On@z&CNn{FBf~%One4H>E5&zb*FU)% +kA3oxE4V~`mgBfG&F-$f^Cewj<;@)t}Jj^hAGs7gz<2F*rO~A&yeqWJ@8oBo#ZsbqJEwCmXc$q=FBpRVN0T +P>yhE~Kz5hsVu?z^Ty2QR&HWbk>a$-UW7^R73ctpgyE?=&1YD)>=ru`_b+7g4slsw1y_l(HQHRTMz{E +V$p{png?PN*7X-G%gPKGwya +lKi4PXfb`dW;Tv5?<)5BakUN_kQn$HrYcv1Z|gV*$&bWq#e#YDvJz|yUVYaREBp9Vae$$QCs9nUu3JD +rg^pCxz5n^crfFIfcy%+n#2KH40-7GHlb#7^OmmX+6WpcKbLZ+q?KMR*1{zXEdQn1 +aNOBi0M{td&rgAx%>w(C|>2$xxMO(sno((Emip*hm)R=@vrVEw3hUMHMqil)|W^Rj((T>KAr9j1R5|} +C%fd-48&tm>P+{`z)4T`8LCkQ`TKkOW*7pMcWQ||1p;Z>PFU(ePdm6mGG)3+E)qRtM7zIYB**>C4Ve| +$ny# +5F3i=~`_C-Cmdaeh`&`;<2HokBrD3DmMOR%uy0lN0%Py@V*Y;cac^nWZufzM3=)!Rby?d8eW2VaFJX?HM6Gct@+) +8RA_NJD^@DOx&{UTL%8u5JAlYQ%WnWl4jU{6 +bR9UK2ZY1!a4<{`Yr#6!@tD ++&Kcl-`8)pk-Gp~{FLO@EU*P`!|A)B$I~Mp^`JmVFoB)OLhEbaB^1dhS@$eTGxbV%P?CmaMl*VHI?tz +IJFL8lB4t{@Q{>goTKD#mh0;^>BvUXs#N+Uw7 +qOkuQMKLucxj{RehFGm#cy_V7;wSCOKtMn)kYq<#ZxAH)igLbolxkt6sJH}OW261S0m|7u;&GnWBay@ +g|Ik2sOr!)eBQa96Hsk4`DMO~@bIb1lu}7Jlq4r^pL1TXCN9aRmT4n~L86zv7LSeU>~*6lCq@poKf)o +{mxo3z0*SZ}wspK@V- +v>{KEHCb8-Q3@(kHgPTl5ecbN-kL3I&fy=9{9ia6bhe3$RUc6=y< +g`OQ|VIJ^w(Ca3rM>aYmF{>cc@F;qQ%g=&u7;}k`A_ +FVKRn?nbN$odx-B{AgdYVEY|nj{)W2#do{tq$Y-qiOt~~pQQLk2I6N&Fy9o?;b%LTTb$9u&qS8SWjhW +O*p@a_c8gT94c!;+I?UkHbfood$J8d9fxaX1PGnX0hvj6BHWR7%4%5OiUO@(gnMe+m&XgbAUj` +|Z~E+}r$+0U`S{YA#OJGrg}@Px9;NGQc!Q#ck4r0?HaS1I?y~Qb>jneu{Q_mnVHs1q%FxVL*A5t!wR49Sy(=NwYrm(28f$bhyX5Eg%Ie+=3Q;3xN=f2{>c}YE&QiGW#BiPUtl^WBPi%uAaq +DWOTa-&5lpb+7U&;$tX4QdN*8~cR7usE3Nn48P&?!pxaGTxJeh%9a!&Ii~m9Ezt!*E%4AK)>lg$s+GA +MJcaS646+$a&Ub+gAd$!(f6e##?7!isM+F7-4)qpNfy39@S3ko~DDx_o9<`FhNLLHcLJg#AS{Ud!nvk +OVfr$KiFJin&a)>AGGRzzvIqH^`7yoS;cd=rDIq6J}js5wKRuJk~wuxbo~P|V7;}imX5N6oH~0cFKUJ +lYPzp&^md@qIXfA+Pen!&p1ZcmsdZbExM}|DF^YJeLKDq9wO~c~nqs$wn5=1kC(mi*a`5n&DxT_xz!% +zOlFRbh%ag+A*<+Z?>v_kKPx1=EOg_IB!#pn+t16fPy*}f +jN^6)MIaZUIzj7%i-u6)ucxhme +9Dy_A+C(i +nZdi`1`(aMP+B&E)emO;>0mHPSzgQXvJ7K!)B%#S94m;tnWw*R4TE`fpZV9Y +rWn7`8EsUn^{oIJf8R(zmE$R)N3NhW(i34`;zeQX<#}P@VV!+rNoKEP(g;W?Qq1@vu=k|9T%j^^m$ce +>4I#zRuqKT$=iP_C{xxATO6)UBS#UY4YKO&Ov}gGLlr$;EwotAs(J~U$ZCku%h#mhf$0VmY2%) +mb>F%YGh9BNk^(#-F6JwyLR}4RiOQb)slcE+{;w&&OVxmWLpO6nb3p%(>e;f=V5m%yl2MX`b-5^iM<@ +i{`lZDi?Z+Y3JICPUT+)h_UplX%(kp&=e}6-K`2S~@jAi`B6AFWIE_P+83nzg*v=&#CunM0v%CV5D~B +ujwY7+##K@VVT`L3R7P#Gny<~W4GqFDAIkriy7y{wQ(d=4@A +(z$p7U*TT2x(L~^LsHTuH#Q^)7p+0hi@egS+x=C7Fun&Wj!Y_yPN;uKs{m?6XXZB$Q<;Uj;bPKi7%JzpHq+@nBNL534rcS$+`OrNC +!-8+Irs^|WA0o!;`r(=85*d{+Uj|OR<1_8E&!E_z&UK$4r6oDab&c(lsP7CC++1_)x@6SApD!jx=21{ +M!`k~%4N+H{jQv;6K*%Z)UD|J|%W +_iF3ZV|eNzD+NAky^_IuAYaClk<4?AuW>tV=V~AuHhyKV7c#pe%7^9+YFK!7uAGrA%-6-Az|`0YjhY0 +N=0YdTw4afDelBt{03f7UZ9(47XXie$;*g>;5>_N#mk<)Q`OUnVQi5+-3iyK>T}`{3VrrnXTk_^3*`s=YoU{4We`d+|+w +cnfh_8RZEB#yW3jBz#e}Pxq9p&)@UZ+iYc`H`c(b3AiqgMgpk$7*;DeLq6p?0(hE3+TrME%`KKf*2WE +4=*`+yYp9S9XC+zWr}st) +N?sEA{hYBwQq&-Y`VXgziaSx-OI(O=FFEz?h4z)_nX^kb@EEN?0Lcs>LbL}PD!jOk563LO#9q@%WiBN +vRNETS^(Xt*os64--R;qwj+X{1BG1sTFUSC-v9E^Zm4MJhuu4%RI(^S?Tt!pL92Pg@9=9&vTyz5(v@# +ZhbpgLLLuPeLP~a<&duVOB2H%c*~ys>`^gGg-GC0jNo=xdOHWGEpT4~~Dbd7o-6?kfpRga$fHXm1&Rjs +#o#t*hQ!HmdA$<6Q7x;Q1Q${sX&!rt1!KZ}Q@XY(v!GG0S~yZ*dZ4g8{>To9uUVKnDd2_+=R-630U-p +g(&S02p5Z{Ys`Za-A?{oPk_Aikbp|-lw)`XUA)u7FAKHkme@eTa2c%z5u?uWDfGekc{; +uU3ADoJM>A>LGvl5Ko7g?Fc%-N1(ox02bW%s}sqlimg+HVxbCCrC_?+qKq!V2uF6eFT@LHr^WIo6i4= +$14Ui@D?J(+4eO;Hus-x!UEoIhG1J@u_7_bY=9r{W_jt}9G9#t{?|xMZBh<>`b#9f^Z#EWvAM9s2NJJ +r_F=eq@Cg<$F{{y%|W>=Um^cf6Rz~PmRKGb+f +Zxpi7lZgazD+~)cSpBa$Ao?IPS+DTK6_vetMKyfaV>=>Aj<=MZY%U~Qx +lDAA;XBdg3#I~|8!JQ^K*!7P3GZ+g7Kk&DjFQTA}ss09#cadxL#`O$P(&)JC%1CdJ+6@(mewUB;B)W0 +pa=D1R2hX`{+35bDM)4mqVo{kg)&O4so5Z8Kl=7o3di%M|LU82&PL0BNg+hWhi8Lf3&5ieligY$E9Pmy_J6aT&ejX1Rg&wTt)vIlsXD +&*owQG;X<@L^zS8WqrqCh7}bLPo9Rz7{> +GS$<7rKgN3X@LB7^O3JOMp_~Pnmm7pox<3n1W>HeFPtf=e%wQ0*=q;ih`jCp;SAhUcOiwbBStpiwbgZ +n=gk3fL|!4UO0lRmhd|J8RVCkZcZbJ`D%|Mc|ghOtTj(mE#B;-Z+I8Jdzci;r-ifYg8_7QN&dbXMYeT +we6ghc+OWL>*w*av#}9rKp7^~}zG+N+diZxPcO*<>1i?@gL*mG$AMt4)IQ>O4H{4n^(p}z<4mV^AcNs +ro7ptZ5uPq$W=Y8PoAuE@Sc9C?P*dUXMH>#P&o3QOBEC~NQiMN(*GTrcXGulCS@ptNHec;$fL-{Ua7= +Kv?yu&%ZoxFlN{KZEn-P^o(>?d|r3XI(FIoz?I*>l{Rup+!GA!XZYLh6_B>1F%S!%<96M9=r(lfR$N7SArKU;aamF!21``ZwP|wHY`Y2=21*ux3QiByI$xTk|`X;7wtK46aBc?-pV8 +P+$kz8gncl7494Pwg2lVDt~BsXe`0b$Y^q#pF;n#9v(u1OmKX6Z?wuDWtwCWbov?vTbkcl`HRd%99Fj +{4nCh-!8&HD{*V4C9f~kMB1DSLvV}UM=8_da1IAl3YMcHJ->Drz(sk2>oyLaGT(Cbn!l&Uo-?X6MiCs +yZ1ggXf6NM3ij`?X#1E0pIW<#Wyi3Vxx}mijV*&{5C1aXnG`JpUuf)}gE8kqH|u_V1TOCBSd=&zQ}R7 +?LFW}kg8F>5auB;+Lh3L%DB?E%Z8($oqOMPIaWmv-QsjEE@3*0<1;!S +CKsu(MVBW}p@9n$mf072jpx(ZI2t$|kg?ty@|&Dk~Q%dzuHOQo;x$)sC%d9}(L9$%$vo=_9ahqJClK~ ++9=B#>zzj&vM0DxS#!gTS2mj)0qBdxI%xISpC-Mr^|sMfQ1pOPU(S@U7_FS~|Naycz5Wac$hYDd?H&0 +ch%{8AQI@7Vk`rSf7q)w#j2sL~VrA+-k)rwRVO}X41bum-J@<`09GTZlJ#nF@JN)XAtwp;om_FLr@rv +(kO*)W9k$|e5z5j*?JILPIQHYb<<{cDIt6>)Y0+3aby?aOZI8*mB?kE52Q2OzK-sx%*{G{r%v0T60wo +AP2LXOY)+Fs>$(!FFEz-`!{cWR4Gy>T?FLcdhJY*kqISu>^|bZ;Z3GG1u!BgpDW>&u>upw$+vJppjVZ +1Rj`l<;ynC6$={AeBo|3`4@5isj_I`wzOrQnxytsE8{@nTFe;Q)Gxo?L)(fk!+^7)JF$Dbi)f9-!BV! +mI=KY^HDc65D;hmbgTAu8GrbEp>V?mDLL=1QY^{#gjFOcSiTHI9s!on7B|+!mw~n}MqWk4`rWMJjj8M +5a&`wmKFgXCp`I;=ve0LGpd&ok{T(Uf%(vb!6MrA(AqPLjVqo=2_ +?xUqHz2r(V&ac*1$-5;Ck$=(N<@xT}XAQ6fdpa^%F+MIVRxh9P|UMu?|jZa0dkp+G>_!(g|Xm%yj$Ke75VioRgKXj^QZvf9&Fx2#kSSU50zuwb6|o9#$7t$O>$ +f@3PTx1<%~BL87Fbh-nuTfC@lUB#BdX26T}jZcd`U5%^uU5wOq*&W)1#tLCiPJbylt~T@jEkU1N~`9^ +Dt`&}h~y3TX2*pzi%jK~OkFHzzZJo|gw#bVI`>Pzw`siZC#z@J8*C@#7ikF?~Q3###dg(RP=o05>Oj; +yN+#p5^Vi41jfoClrifvc46FC6Wkg;{o3obBewxx8rR!&F|Kc#g2YuyolO&i&K7k%Rweyq|^%lEq_3f +QJtC8Rr=$!Qn5A{T~tbZ6!VoJ#C*(VRUW>>B{(kWZK$F=lT)#t9^RwJ2jEc;OgmM?P2`POY;Xl#2^gK +`-11~#drBhiMh30NK!Nzq+aq{TPLU{N)1%6ybAZ#pgr)C5EgcLBo;j}M^ljxVCK9ruElS)Kz2#F3zQX +>^bpIK|oZ9qW4)@>2m!BQ~8Mu5s_Rq*d(F{gym;zH6juGgJ>YvKE;@kcV@6zdOxKZ${JTA+0{PWoPIchHy6taYjTdtBUM!8R6&Qbu-+PTs3G`uzEWji%;D>i5^Vs0Rh6E_*d +wx1pN(3^bJ$lVIGtrvRHBr8)gHI7dTGz-xmqEu44L}`HjoP5=+U#csgYeM_QUZ{4Yf>36dyBd)5_90q^*up_Lbu{Uaqr3Tqz&}kPnG7A +rj;lOw7j*aYH?S%*RX^FDA)wtLOHRo#uSRKgBmC +cha=#DCW$;eJfWUEc`G2MFF_fF(>EiakyylZO5Tp16*AVzPKKzcG??xfL$*Op1|`r2UQ%#u1f@Q`taP ++u-oIV@LCKb$@n_GL-a|j>tddcp;x;-3JuEmm!g(2pcb2+0lnoFAjFZF2N!28Kx7+#)7%^5MWxnGU+- +L6OMUiwKw+O4_=iqr@kBeAKL@~*2mf>;;9FRuv9R=&CDG$9X0Y%m^ofkjgqu}jUeZeu{(^gMvTO1f!# +Sqc7QUULeZ$lG} +@DSE0=p0Vf?`XpVe+cM)pK;{bZ>E}y2gBC&hLeQ4yasN5>*Y!A;5u}J2?bOcAzpQI6qyU+zC-M6=JHv +iuZ1CNxsHj#8)iMrD+*YOd)rP=x^taR{n(TYUO)7efAs{-qc^8iJ;ZqC^0SMwR;Mc82(eR7k~G-CmQj +{@=HaIq@}AieJo19Af~k>g6D2> +D>xppMWiHkPfU`;*#(<9Ex=_bR`wUM?}7$2lJ#pJw*tNz;q-3K~9lo0Rw(N-oP@NEt-5{FZ_{l`1#$^ +#thZv!&xv07tm0AJPz~?&+i`B``$bVw|eMl=BbOo03r)%W9P(aF2w9as6b>E4yG_?5pTpBZKd92BdOc +#$`aR6LfIo#bQSavb9s77!1dwR3wML_Be=9&TQv|z*(&C-N!|3XdcJ{=K4|@UFfHb!Y43G+f01Jfy%v +A{SU50PL1YT3=>Z+s`f)suSL>f>fP5C%2#3Qz4 +u(EE=Wha{?fCELHVz{wiZd`plgRoPN`4v?ZJsUgCZR?UyZI!t1sDvoQP-7#BiNQ!T_c_~a7tGio_yY# +L~rh!Yvi&s=q(Go#Zcs?wYD<&O*$^#WbZ?K3vf2;muRbxZXHEG>-60w^N_6_INQBDSGv6!vt?V$@XFi +CUBEcm_2yPqzOH`_xhQ56zt8AhaxUFy^`>wfZpme0*DayxEqq#oC=~luP{cu7P;~YG$ml9@U3M{)*4B +8)ukscYEfu`(pZa)qzAuUbzYInGP@7*vk>tC8Xp2OEk5EJwJl +s*7dNCIfUG+!42|JPtuM@bI8vmEbUMm?zH|6omGhwWUGBPSq ++9h`NR=fgL_A|d6Uc=q(?0VU31`3=W5V@lvhXG*SORW8rJKKqJuqtUQDcVjE|a>z`n6uGda*EgtTqzm +MAK=_FA>5#w#UpUCIQj*G)hY9&fYXkus3gG1G|5A%t8>i! +NjSJQ2PR4#DYpC9YkHqbAs2B_kSDJ^d%fzgq*vx?}A7N1A-(>o%VZ^Z&X{xupH$yUvV#(0KFS_sna-Qmw0Axbe6{^@k{y3?h5TP6-~c{+st+LMWs8@;2M&2e$vao}v5My5XZ^;ntO +$^%!9w|+%;we$7VmCYf{wiT`7YqvMYFQ1|`(isJXJ=^)c!6m#M~KYX*6lAA29q2@d<|RI~Jho<_~-fNs +m9{H>$E_M&@D2AA`D<(c&rErtl4-oftW{+DStO_&HC*!mU{AO6fg^3OdC(@N3uk7kggyZ3r*yVO@ccl +2(uK-7tpyyJVfd3Ssj(#+S5RGzmUM`O{kuZAG|kn+cCfM0Ro4@1e8!waQ;U_Yk!0?#L&>D_~)`7iA%I +q+4vqtOpv#Q~@Ff9Li%(zd04*Ou~(P&~IT9vp63fR{6|y?=oG(SAAA{Kxz8Wk){O!JiVKn^DSV2~gl? +rjt0-GY?E9$2YHta)yMXXyQJ>a@4a|5Cme7uJ4dm0$dMlpS*g%UQ;y6!6RI;EAgx@p_dj%zD~mXnV51 +hX!&untAd7e$F}F{A&WG{k(v%Tms3QO#A!kz&wr(UnYGIcty~!o0)?g(g_^slQF)2yW(+)(WTF*``KIo7scrOt*r`0rzf-sXyTlxx8^OcKb7#zwE7J4y9?O)4JGt&)at;^RWRppQE +q(kMj>7YaXhV&8;JOvN#yQ>a%)0>2hujWH+az;Gj2hN$>I3z!`6BifQ?TbRtUX_z}X=3=Sy*K!UUJ}x +l&!_LOc;i^W?xfhYewWp8!35QM36GRlbt~x8$V5G!CL~Om{J;Xt3U&mV@gqAnoW0QAbDboO +%*`RRpHBfx=78bl(y2w2~;9mX%B3uksTM%zg$lXT7LT+m-Z!QTdzZtx_-qSk`D9l-^qK9!VCTyAPo21 +=udTht4Wbwv{UXFHHlNJK^3wfEE=%El{74%rqz7@`=Usu3;7)xy0$73%~R`htkOW5(7;Oz{BnOivIk9 +zswR4}OXv)y(4q**VuM12ut2~V430LHFOvr;_n6)6b6DADjsLSjp!n(x}e8_Pe@=@^wQSo5W)ZBFg|D&^Cq`OW>kNVjv +rvRt3~U4JR7{e0AFOI*{^8lBBtXKE7*Oy+|O1E{FCK=wp!q4%Uw6IpGi$~U$pRqO$%=Ww!@e;D*j|mm +w2rkm{XqZLSzdvp?%+SQ_4LH1_r*F3p*fDS=blYxX33^TqE{W6xK~$g(Y2|tRj#KM=z6BR-+NB6^}a= +*ARRY`5+wQ^j!#Ik^9ypHdZF(Rwr|D4@wfCVizq_z@bl$iM%A$lbH^W616$5x5mqWpNhBQ<+i3FYSf0 +cPsS3o{(UW$1Da>)1vqD8;4NJnfoF+PY7r{12~^UmwC@P57B|n3Wv&!JWrk3axFxI6tn +>C1+}la5~+!fJP0$i&~tu?G*W-B*sC&zb!>?VJiTQIX=l(ql}m0=c}qh%cx~2SKY;m@9b|VckMI&dPg +jyN$1GmLtY8(B +kP)>uXK3hJE~z`Yq)_O0G{xaSh|loxasj-(yo`Eajesx7c3COU~kd7v% +|hHqWhygHL=-ueeYP*U@p{fD`vKJ@NSi*=Q~t{)x{mu0 +6gYRjKsJ~i>@f*H{9;4T?uv=Aa1hezDZ*8(o{Wxh<=EdZ`7WeRNV0x!#vxRSF=Ps-AcBh+-JPVf|!$n +Nb-OYLtbugw2z3kOsG!l(Xa&nv0AcmFz=|MmZ94!<)qJB^1OgSIZhq4@xo4Qmc8`e!8jAGp@HF@V24@ +Ru$BWW1+@k}dzVg2GCvRx%c$8%ayZ4MDcj8oKpuBrDJQT*HdkJ*Mb*!@w0}Hr9phNhf+sG{t-KBC=1C +$Ls66B-IKyF|{(bpRqh-pQMlXEY*I+m9K4f$;6h}qIc&6B-{jTltHEEi{By|<;Gnv^Py_lw|DZy#3wyi+e-IQacd>foU;WDPcxT2tM?4EZvLV1ly-i +wi??&H63@_gBCvezNWhHHYnwxXy-2jVc7t?!O0N#;*d~v+|kchKu_Pap?Ni;+YW{j1K&cK$4lSPBrI9 +0T=HVdYQm4UkF@9d8|N2-l_lbqVf*;lPwWF@r~@WI~phWiZwe{|cm>39W#&#w7BsM{{^X7A`zJ9q`x-W(;RB$2vDiqL>%3GuGhxYk3P|gp=MY2qP?by04lX;;Idw&&2K +7{&4RQF~3F)sVuj#=*LKWbLhI-w68A7YoVi%`Q*5%sare%Toh^e~n4%$n(p +si{@{WN{h(v&YMXXxX)**ay&|Toe9_mZ@f4IhVHIzXa12+qP!Ol +`cga&aDKBVm6+Yg}WI~y!FiswJ4FJL9DL+d8@xv@=+YNdGp}1qS4 +k}zm0`82E3vY0_>pK=wE2o;fH*p%Z{h~V{R;w1ApoQpLky9bw}K!ihbk>tp6yY`!?R~ErBo2S2W+GS5 +_FW;bez7V)?@5&b+m2y9?9TW}Q843K*5J82k;*Ty_>e~?~IY~8g+>uX&K5SISarTx~*1 +fvGx#u~mG@pD90=kX8aWXwK#U3A=njP-q51C3yfP`2-{K5<(gZM^{M74hA8Y{Q0YOt3~K>zn8^!^b?~ +X8){L>!qB}VIKGt=hfO_O?`O2LleC7S1oWs@G!nSfii~cxv0hBR4u4R2&V-|u6M&t9o}G6wG^sJx6?Rt0{BzcDyiR$ +gE(l}E{A(E&vpnplbS<1CA7Mc!-@rQ<>#RGIU3cEDZgK9ki +BFP=@a2hPz9nW97Q&Vm|_4HzCo%IjwOf+%Dig~UN!Nnc9^%JAry<6h2$2_+NAi|VpJ&^l$p!IQ}@W+9 +cHGDbluVoeB>+F0+VfFfdtRGI4suxvquy1&5Or#OCE8xfVNyzD9WX(%adi^EQOEoOIM~-f7zVLDVSd$ +aI@b~Hry+&%~mP-K+PP|ws_@15ZeCUZ~1tbF0|ytfRI1tnSJG~m2Ar-@{;F^9TQ1i!zb2b>*6Td +g}LUhtVfl>WpXo*6Q-AgaotKL~iBjEk|n*GLCQZf2{`;LAaUa%Yw*ze2^nWIvU#gfN2iX7h{4e&uAb5?@X##~AlKQc +~q(6z9doi!S-nH-N-hR=+Du7C%h +{i-bU8RZ9W2}_jZeLC(GDglT7z|Xtc4|l@xELek(HnOx}5A=nT5CU3%}~V92d>O77UbO$2^ShO8Hbqs +=RZ+<%%y+p?p5UN8*z-Fmf+t7n@y+%_)%OKL3c1yJ%^npgJ5$GL_z0jED7=L?q~I$~|lS|fT^| +2qAyb1w3XRs`2=eU!fn4D;NRyJFike7$VK!tsINw2~eHebEtfWwtthLyhGR-pr0;x*`{R^{3|wN_+lv +b0+waHUoP$_5+>y+pKQ_YSjwJA2Wd8zxLho_x_dt&hod_1OJ`nZ>tCXNe}Lmj)bRuziB2^A9a6pRpSk +~&X67IRvB+Oe(2=*!4=Rg@}V4oMS8nDw_l5U=a*(q^gkJ+;n62=vJ4PF>PRk6H$!DTN7b@d3`iZFOJ!HIKIR{Fstmy +BZsBx5g$%7<{FPwJ56;xjT^OnJ^S1muT!@kbIX^C{t$Sf0_vPH%B}<}c!+k3-eNFDgoyAV;#RCzRg#U +7d$hbxK&|`fMYhogCRGCA~bq*WYSHKa?)Z!$gusr+qAUn|p!*OhFELW2}a2!1@uVr{e{EO!@k*T`hoE +BaRpUL=^$#?5(x(9xfheVGAyY5Mn^G|F>q5% +IB(ND7T#xh0{7=lXK*!VjNP92MPvt`^4K^&`u7lJflTRt2ir`4{jJVL?`;J0XVHlYI^xmyv3(Y{%qwq +S}&l7$=NTu$2g)86|YU)TPj6rYUBJd{lV?&q7l3E!u#Yg_~@)FTCLatq7guVqnir>@Ncq)Rc@`t870k@d44TxtBOkIdzx_+VYPFJ-eU +v-BACK$#hoDIMI|k`G4De%G-3vwq#L35_+7Wi=qhRB1dO?zTJ2zIjc`Q|typc}K-uK-C$QRvP#2n1T@%vBFa4ua^uffq}R^*)$<+7IlRV+L9LzJL@su%i=$M;LXj{NwAk7|r`*V0(ZElDUMw4HCJ_G~E61uu1$A*{hV^6>`Wm^qzC#k=qc9lM3IFf9(K=z;#gYPLAMEApuyEU7HP066b-%=y$*NfrQ(` +KodFfUFi*6Shg@hoe}bi`Sn4zzdOEIYmeW~H0sDN=q|=FY6}%o&R>rE}4lQX7N4*OKhec5+PrEfl4Ka +F;N45Euz?)?sE$for%{A0)1~Y??!JA9xSJIGBIE6V$T_i|RTtJ()UCeMPLjAV>kxmYv{(%G(!;tiBSkl5ZGrC +9JVVJqaEg}2F5lKNTu?iX)ljNX-Xu|59VqP6g3vI2tv+h`5#Tn!;?Yz!rkFi{leRTH6bP+61M}Fm&U$aF#@};3Ty +y&@eto!hCt^;0(0iAn%)LNWBE%)e(e+UFwKS^Y4c?{q$i45JdQUa%pgwG~avHP{Y_n@zOkI-q3g%+~5ek1h5sp4&8d6d`dEiPPwsTlvAE*CT_3kfJ +4DdwB{CJ~M8Q!SXG2dGWo&56&SVF}eYtM?#qdi#dk&k3Oi&GEz=v4G~;T`H;yc-yzb>-30mZy<8A;B0 +LS<15x&2e!y&qQ5*>!JXq2k>GLyhdH@X<-5Q?9w+_yuoP*%2Qmja-B-(P`5|2vGJvUVA +{P!4MW2(w#fUTb|ZDNQm-o=E^b!M0cPtIIHZxZep4SeDS4$jKjFD&PK$edI+q4L2f`ix2nC#V4c`sK0 +)Lu_&Gw{)tqa@lKj&-`Y=kWjKcSb5bsM&4YznzFxIB9p-=~HQA4U +-cTkHR|tX;U=0W3qX4GeVW6wW=tA?Hqqig)L6FlzS|ppZ>_a-}Vgt^USy!*hiSwr7 +g{lY08sF;VjY@V0(7wzF4ZoCumcpD!}KyZVJ_>OGfEWN}#)osHID}>z%2M|u4L5t$MWSk4Z>LR*7^5F +AsSk`utaBjr?=?!_4)QpTB@bYMoyOOT9+JoS +q{fowFCnQ(tiC=8<)E6<>e~;en%NM%+Ijv{&lFgujrrB1s^|Q?f=8j7(!wg`eVxBAD{ezRX;iLyO!!t +g&WAd>lpp_m;C<9$I0C+c4g=Uv#TsbTfH2|w{OtTO9MEwp#!xm^d)=q*!oX=cWWi+O}%GDrg$HcT`?{ +ucMDo{>uYA1pFj~4Zt08l2$a}z5Y+B66*1dD3xn?>d3%?2oNQ)NTQ!2-?iZ0;1NPP=5O1Kjb%^c#11l +!M={CHA><@_3zf30h+cpay|0oUoh1TwMcJl|+F`Y$7)_uJD=)!WX#v|gRxVe#V?hF$quTLv|SoA8MWS +&jGHbd(otRU%yD>kP>z(S|}8@>Dyf`m=*ZZ;|w*Oz?Mk&iLk?_L`Lr}`d(oEtq!4jX;Uwur(Xce6abH +=TUNw(FuVGPcdR0Dl^EIV6{Qyl!qyg3;}N^YZs_RQ@!t{)0b~kx7?##&OIU17W>jP7V^L&YNE(NRS-ST7WF3LUcL=%J0ItteP&GsX`CTF0UthSx>)AcwCL%C3?2^*0w5}SwBx~R5$hNk`BA`;2m* +!s(Q8;mdvWn)MNN@=D9Sk-H2qB5HFpgSZk}}%iKR6ls9DQtAh>v*y23Ecw=h5#Ry4T{(vsECoYZ0bt#e^3r7aqrP-~Uq400C0p3(?aogL>Ct4ShahCDDQT94V;k`>>Nu}5U +oPE1*EbFb+t?V^4_Wr;@Z(b54|N)xQoJD56T)**Qi3B~J;#^CvYv<|kDO7)X3FK|EIyF9ZUMK$g!2Q6 +`|Nb}Fg+y$i{LcK!Ky0l#Zwoa=Q8W;6T$Uko2ez3y)p5AzJ~#$xS>`8;<;$J+Y>_k8F3xzA?N3^0K+@cM~1{7D_{6Y!@^%Tmpx}Dur5Lu0294Nvz7@>QOAho6 +^h1lYK-RkNj;y^8A^*4Um+g_CpS8g!+n&LM9{>EYNr!Uq8-4Z@DSVNdos=bLBYBZrZ5D*=5$&k7Bab5 +k;b-ftMijU669);J>jYA&%Ags$Jd1QfLRY?Z4d$u3-Y6rIw^@5hl>0&!@38$z0a*jB^bd;2+2=WsGC7 +Jo`{gMd?sJ%`2zs6u8fnK=@#Vprfi`l*qFy@JA6TJsvyWVSJbkI+vH7lo_xD$0uA-8+BlE-aSJjEP~( +8Q98h9LL$oK0NT`ouZ`I(nDMsj3zpmOf;hUQd#qCRxxp^dFh;Gu>nq_qY2Nd9C`=H5OYh54mXbyGAfP +v5rD&mprTPo#Bo};#YAx%y|pxNiOOd;P)%T#Z&o?*8GB-)l;lEC=>9wwc?h9YP+^p{S5QS9rrVDM%Ak +TI5o-zrRgkmFNfUdw}=yE_j*X3YX*aB%(R`NS*`vc$9tk=jB-Gr)ZctSpgGX5GV{YLc#RwLc`9&2!<= +ysA+eo^V5@0HSB;s5~Ah`b?&XmNl3Z_|mD9}7PKu8?M;}KS#jHldQvvUiNA)~3c(*j%(B=k-BjZfI^l|1jSqP5-XXIdm_vR!Tst+qqat)CDLx5NORY+tEpY +k9=?p|dsi+B^%;U5yyu?!9t&Jl+(D*MElTF2xw_?wsfrWkq}U#{W-(rN8j?KLtxwj+o*P!P1x4{?~&g +{XYzr)Ju4Hy1r|g9$k}3QVB=Bc}4V@LkIQ{_MVI`_F3u_`U(Wv95V0LOOw*N-o{d6aQu`+`OCb;n$hD +zdN)H+@Zv68bUeE~L|D6++=ZJTBNJl+U|{jXIhSXmg*^9-OxlG72|5zW;WVo38%~~OQR0c$RSyT!Vo+ +I9Qy$ERGq>-n)-gc8G(4Y+(%pk?hv|8+P75l#C+|X(l)7{7YM+RY*Jw=BrExD%sa(-F^;S8oe;4TK0> +HfTLTaSrPsb&ynlfC3!L-;$G;n-0#~^rIZBjvIu`q6Kmp+YYVe*Ra3ocI>m52cdV;$BUCdM&Hn+ZIS^ +$i=nk4&ULjCyn@QCu9q(`d(%&?zPmW_+aR8)+bY7+v}Ts0F_)dix+DqK!t7q!&J|eX5spl`(wLilERTd2i0=a-5=U$9Ejia>Qz7A;x`skY<%LcNV)aB +14{0j2$T!|LU?Q${9$ha$74Ud8@8^nE_}ZE;Ep1$zM?>NK17&KBs~?zOUaSMBV91eHTqR~^4&wm~pF~ +}ZjxcJs!TZEsp6gCdJMR&j+H!dk8D%KTf|X?e=DIM5LomCFbU$VO@I3qZ2~Zh+LW^bHCo9$Vm3}t3>e +?eYkCd;9Jkng~-5(ttC9Nt1ny8ze#_C!-Rzi2^v=IB}!IF^TO9s^uNa5Wuz5yqv2qik0r{kOdr@<0?U +@O3KT;ZlG?DfvS@ygSY1?=$3wgy#vC+~+ZzRt2SFVCB<&8JhYHcZJ8Q6HhD+pXa10kLh(OqXkPJH0@~ +?7BQVTnH#y^iqAb#47?tMbO6y!4K3xSJy{Q+&u7AGO_y9&lekzk8KAXWKPw=;~=x?D<02JXPL#;keY0 +<^MfSJ3@63Hv6vrva5zjoT_ac{KU{&aP(V_&k+7~9rbhRhvaTMP+9MnuEm+A;xgfd7ISDQpRyJmFug{ +@0*SvVh4uu6GrPPIhN!Xa=ADTW`8r82a{&R5Bn?4@L)8*O~?DN&qfq7ODLUh~ItjbL>M5f~3TbI~Aa +4~=SP|71k*as&DB6)Nja;-QyVu#7&(5dbp<{Spni8#r24M6FFsz=hKIc ++4{MF3LFREJYwgVg1I5&-p&rwWQOxPZ^Cvz{%|)hfh<@zJgPK*G-?u$AT${^Kte^zPZdg2Cuv5Wu{{n +C*rv_#+5Y(C7h`PUCeMmaez_ruzo{aMFgrp&e|G}){|8defwbS@tUp&LVge_lV7<2vc$H0cr^m}yBrG +I!Z9Pg2|mpr~5^;KCq-46b7obiA4PT%S)e{+{#4m-x-p38x^OclO+Co$;OzJlxy=XAOa^2hkzE4s#Lp +DT`T7EI)3H;(PiubTi{yvvkg+eG8$G7fL)CnovYzk(qDPO&X6OOT($Vp*~kKGqm7!FH=9d~4Fl_QDFb +i*LjG4K{TYauZ8|cQ?d@*~RP9t+qm?Tis{9F}2H+ZpD{m_dj3byIk5X_!X{r8Ogdfs{^V~m(_8CEaFPEs-=XW0X!Y +LF>jKZHx1QFo*16M1F!vEg{YeU7>*r)=({a%+!;$(|ot3SLWuK1x{P}+8@qoX3zTbH~;P0OA?;h`Cni +BZcI3;Txm?Suj*HU>aDwU^A*kutGD29*s&|(0zpyec1%3e)I_u5JvYgU>5bc#=ByH84oGmT@>h@4%%N +41q$WC_#6<_kYUz*(D}lYeZT4mRFzHdm0`JWI52e55r(TwUYITlTu;C0Q4Sm^pzu`8?Rm>@pW# +6l@$QUKg~SI|6;_i)S=sT(p>6xN)h7ZH7kmh`!kF;4By(h~)_mGR&8x37n4Ob5X>B0D_e5JiW+a^m;j +glJ4=waD{4A-FWbFvLEBl}LCOt^ +JL<=#(Ii(EX2fp9{A0O4a^@E#$IFu#64X( +}r_v#aXP9TPKAS@B5-b0nd&*4}6DwSHNP@uzOe2L#aP7{0^8CCG0tf!BI^6|DD}xUat>Fgw4oOXR)B{ +uJEaSHO|+sk*_Qgrz4s6lN>Cpk|_nS62_yft}o@dPxBlK{*nDZ7Y#j)S=fvL^8u?&%6&n!h?Tc&0Es- +WVM2>rtr&;Y8|M680e_UawUuZwkpMzU&KkrFdsmB9v +G#Oh(W02A*2#eY!R^kWfjX`GK%$*G9cSud0IsVWelYhVG2aq{YgdVv?h3Pd1G1NoZn$hPbG+&Z9^ev; +)jeV>@2AoPVMP#&JKj;2+45p}?E_^EB! +!IcD$QyyzT$RR665XV{*j2)*5K2l=D$CfzS5%71(4dkN&76!*c4+ +HLD5G8VJ8HK6c2V(DnK6qrm*8O`+0VXa8yQw#{=Ro%St)=0MzL_pz8LO#h#)zYBQs(&(=c`v3dN*Px@ +1o0R3E)z#HZdf;8Fe>$dXo0s4pnxW?u?_Iea2MDSSe|3g5uaZlyqeXGSxjXfIug^Iujd7{SpA=U7u`r +$_~k!Zt{B4O-wQSIf%u9eHxW4EK{V+T)G`Tp0*GfgS!?Wk-36f;_t&B9c(4ixd{h7g?B?;*CHS|yd+IDlGS<;177|HqM3KtVn(0x2;hIpABmAyrzBo>zMg?i4+b*j>UEFPAm-sK ++^0r4-r?<}u(NQv48rltV`gRNe_79DM`=XF?kBz8X75O|St30vKkmr=xZ{QXvg4Qis{g370RAYnc*B@ +NtFOEkM-XzKXMCIp{@$lT@1GDZkbpQPqe!rN!AlSg0V#QnMVHyHHhlQc9PS5oO^N5!+ugB +bR6D?M2H0~hAdMefnyS4^q;eglGikvwJVB+1g|VTj3w +f-5Ce;z)27AN>0$&HituVLi-${V6s*IwJqI10S_R>%PM$?mXhrpK$q~9{UZ6|NC)&?&Uym@R!AZhg`s +?umS%lfTP6GGf91v>yVEx#j!T<5xqg;@75MS2d?DD|0q0EG?7oWAA%g=F!?!p2RA4@!bX@n;?VTtd5E +Ql@>~l324~R^W(Vk}?=m_pF7~h)hd;#}AI&-p{RkIepPml>hq&IS!} +PFgg8m)-jb_XPXP56d%U(Qf`&E6j!ht_wkii3rVa?q9O)Ycbtg~5^V0n0y*{^eAx#e&xk?q0dx|a2+Q9H5(BP_>(YGq3 +-d`&agLSbNhh&OkuX@;lv0A($gV(N5;@YSd3Jhb~mEDhm$F`14R?vK2GTP)SNMtwFSO{6`_0M>{0j9x +hS<~=E0WLcDj_syqotL-W*bq9qB5>>mq5&p6<7g2xppu!Ory%zqk2!jID{L8M@PH*1gxqFO_5}4Bc#- +^fiLN5rQ!Vy(U{cF@iQ0)l7E5VhS|Q6+w#`9dORu7#3ABi(U@$B*tO8^1i2o*c4Lsa)DeVILpLN9 +-{A^j2GH?9<;(aqD9~@^W7Q}?3^i8R5X7Z*yWzCy|=0ostMe0^h+-c_@%rsWv-&ET*a$$73imkXX(|) +L&3-+_W71!ql+551Y&_&lLuDG?w7kwZm>GOP^?)(#~t{vZPk*@>-^;=vsUG64&vCRtUKG;H!zA;d!fKYmYw({vI}agTIE25F(`M-+M4xq>VV>+s(3~8MMH-h^3Wd4Y*2nlu0c;u_!{n**^IL$(&D~GzZc_UBEj+L?YW}mm>j$7dx$wqbk)1K64<64%_Rcd>S1 +=FT<8-E%0zu-$DJg*udz~Y$??=b(tfLis)T3L$DqYK3$9fYgmS*1H(kKn#C0j^Iy$W +SAV6*$G369OpgMiO?f}J{ktl1MT-Hd4DPXAUXNhh^-%pz5WTY!CxXaPychozLoUz8#Z38zk%3>?fnL| +tyyLLpHSPHfn(#ZhW2+y2K;VlzaQB@@$Qw{C1;I!Do%)UyWHRI%xwf#yrq`Py7ZA`T?^D@CQ&(auOHI +ZcssB>kd{ejKU!}{*=6*bovHrD4=2jUBx@Q;WvSq2cDjX`c8L`bKuittMls)vwj=UfGx=gdbHZWy!FI ++BpA_Bm8KP8(8&tUQot4jiEevK2laD><@qw3aDtxkJ0UM4NaYCr@WD<_IWauVD=0h~|^wp!2Q5uV*2W +X)}C_?6l4?aLuhHC@p2(0OzPyE&+qR@*uuU$^}9L6?iT7owY4wjca-$Qao*ms5HR4Lvaa&X_ddl_$!k +Oag`KZ!TiW6AN6!4gS4N3-@XosG*cPj|hOg>cfjoB9O7AV@?4{0HQI==0Guk^QZeYV~dv)lzWl)0cZqv#?I*U$)rD=?-9G$c0u +J2&z2Pwp67Cpiw}(~S$$)b$Q6{vLracqu5%&4n>i}e87fA7{OVTnMWQ8Nk`di+gm|AG~KpzQ0lHV)+l +&qbqls=-~^9q4(3m3&(GJqJ+4!5xsxty%KzNbjiteyApG;03ZU@$MtnNOU}VJRyQcu{v~_lFA@Ru{I!3p*rf$fM-@Ri8cV1E)l@1%wn8 +0o_n_NIrJ_~F|A$#=yGk{i=dYGOALvn_6lER++wvBb1+kQjEwj%7r5E;`~BpZ$=l9&3uR14sL+O(@=L +Mbx3ZBY`#n=DO0VLpUBX4?AJE@dpQr!D7DJJJ0aF7$Q1|mZ_#ean_*p~#FZTVe1pm{1f68Qo7y%;~h= +VXfAqYak&@b14Vf;u*@3HRzpq~UYM10IAu_I(XoWVZ1WALNg2mV?pa1U&8=*UVZA4R@6IbvJ*(=&&E1 +pN-3BkTxf(NAUG0sO?VYD@fX9XNrH=p79{USsj62oL-yE@2<^hdz?J-~soCARu)#0>(Rc2#;*_5nX?L +k8$K!m<~QUYbyRYB$J2Y1NfI#7<_Pm4fMSxPokyUKKo8{G4SQDLHha~34t%V@T#mB%FKO9UyIz_U805 +u_o-kH7ySH(*KYf3+`hf@S0sOILZl9c@<$j0-n%1U#snOeGkUw +vnt)G^2EpS-4jW)iD9hjF&T93&p+UJ+4^IZ>{orz{ +2%+;0pc$txV0;rL+*e=eT@KLbtER%9IioHh6VYlFn%u!1fF5PCQ0 +OUB_5~z2k4ErSc_SHx42C4{X&LhN~B3Onw)QHzR +k_rQI1r~U1`dC>yVtZl<-$3IYx)KKCN0r`ZDDRO09W>Q^j^(Mkld43W(%RKP^x*~}6DELeW+482lVFl +@yugjRiw_GD-&csYP7wYOn1OSeQdlDsAD4U9$dPd)QpYA2vdz;ypkLinUZIs-drHE=32oe(8y+#fgOO +eibGdqc&3jbeJzjQ3swSr|o2XB#(XobJ_IE%RaJx^>LVbg#8hzYT=advrT75XshPKl~9JFmtwO-EbH* +CB$74f)LHUf-E+LeM}K%{6tp0a@nHK%1wuO62?$2cD2^s7RO!KCLkbi-FQL;9&KaQ5zm?KG+W2>TlqN +PwPtT=jf*HwWtP`PRlRc!_jko9_v=E^XX8mvwIZZ0tFX7}_T9o4~IwPizs#%(7UZIQy-Wlnj##6cU|i +x}s`b%p(J0ug%FzGxuE?w>-@KzCh~UUd|P62)>N5l9k?#0cd6At{F)&l==f|@%6xP#8N-h#EikiP$wpUOdMfS>B`{v^dT`YqZM7mG +@i49Z^PR$)%J2lM&_{s+_jYA?OdNEdGpCE3om-q=XOO^d%H6v)yaJ3D{Z +X{gxKDLRE4w$WUlR$%6d@|Qx7*Xu=G{ZjUUyg&o(%$@TD44xWlHocYQ0wq2+z*!#)5!N+a3&&f9dx_3 +pX_oSuVEY$vta*{50x?K@FJvxU5OGyr&Fhsv;LA`2~*qkHXG^GfLmH)@??z5<{AJpSN;pM3Ea2^3KO}9qgwc04qVvOwQSV~y;W)v*>wa>si-42WU5JH;yI;Zf-ogk9!0RhXjXph8(XRpjx%folv9L{m@)RXhex;;pkF6xtR? +axEA4e7E)sP5v5#tAu#$bA4d>G`BwsaT;-66@k39o?G^ +EY^u!02y5eu1DVbr6g}ok`B45`Gv_@OWTP>WfLcV97J;T&&U=sBV@d^`jMwyr$+MMSD?CFY=ge~hcM* +v_$Y?cZr9`C&k9rjb_$`#TT4N$}_cO+ +M}f@rUAs$-%84>gZkAsn*VWV&Y>O{^`1a;e+Sx1PJ;J8~)+~^wF1!p+oiRXnNR(@|W~T1h>nD3BTtqu +I_M0x=KBFclwvc+nhvtDk$o?O4{K$l|u`i*FNtltm|nHrmRF>YGgjA%OAX3V=wryBfwA~U6Io*p2Mg$5 +e|$#EI%YD_s`OyFL01j03Eo$F;vIVO5O<}@DFOhHHxK1(O{1+!22VR+6H5a8meB_(JGEA@>W%N +06TsoO(g%WKv@aWiQJZe1=qSlTVgnQ`UjOi{0DM+3E}^;?Fy8hvN(9e8`%F&hMn8@i32+#P6S-`<;B) +!R*IpLl}P6SgQGXfWSj}Yl +B14A7&{9^?<`m%0u`PL#q+t +i8YN_O259G48G?U%~(Xt;1a#i5vj1mBP<7x&h`qit!^IT||e5UKh-H2 +(C0~wABMOg-rU2x?L-{mR7RQ?RzZLdK#9MY6K&>)V1$=yTF>l2u|s*|_ml!fpKx;-CQ#UW{ljn`3sf> +=?c7g5q)tUd_hX|%@MqYHq@?W$nhL0VAMeL|Bc4@|3TweshD(~0uoba%mv!#vjeSK|0^!BGo7>ot^hL +DFe8Fj<4E)2C(ZTL`Jn5h~w@`?5zLSL3F`xPMjXF4BA2|HgRs+j%`wmqRqCx_1S>FZt^n7n#gk;eMzk +*yvv*JowT>yvcW!x8KwQ;5&R3I`t%jhtz4_#SOK|KQ4+m#yeW6)pKgxbJQ{}xyeH$P+`c=g@CVDV)9) +5ex(prx9Ec99<0K0V{d=1FEk%HVV1}iwH4&TfIYn!%nX&1LCo~JMY&8s(YylbhtCMI +B~zJou-S{+tJEKk&7KNWphb;_9iad60_JKjDA@CB0@w)mhw7F7=W$!Q9}A2k)%%kcuw;1}AUX#9LXn%i~w4l>hnyF~PI{vc9Um(gD@Uuh4bhMz*p1w29{W&=^6Mdm+E87pegLIP7*>M72KmN}9e +*0gJqXB*1&%}HC8R_S-!JnC$7Es!oj}vk~UeP-KddGFMMxoeL<-6DEOYZO2v4;EQR^~X4-5IXFd=Auw@4vv`73u7-E=3F7o!hgew +vQe4uuCHn*8KFxi>Ah%>V@&G24M)s*o=9g_oZ!hvWq)_B|y%gniEV|9o)VB{?+(UtdNSNLHql9p6Ng} +H1o!HHmOicQQ#SJx}@Ia0fq#bS%9=&I-fJo^5{daW>LNUW_(zx7t(>`=tL#AlE(j(b6M1tJC}$=-lxif9+5jOnUB*V)k7QWw6q8ka?|s)t(yTDTYPLGeZFQIBer~Xepl$F^E +^bqTKz?nnS4$<5mwn4ZS|xW;oL!nix%JT(u4~~1c)TJ4GzBUwBVFW9olQr-L9%TR4O&}G<3b0GcE^TP +>7Rcdto|}$=;a*H5kenGL{2ZeCxW$L*cxO<-BgiWVMeu-i+=9F5F{Hgdm(y+s)^Dud$w4@kCOjH#e~# +mOu;}4dl>5!^3K8kejJdg61*~x)FqDGrtngv~d@B8a-E##&a|KeJ5s;*siam4<+1A3lGG|$&;|>>OT5 +1zY}~Tc<;KP_g_)TN>nnRQo>IoL~l`2=K0)c*ONSN*@#Sq20dXB=rr5Wm%x{`M`iaqI0+oGMv|8?Q&! +_5>3B%TrJ=!sqpfn@t3W;CpZS)3X`A_>n)vTJmHpiV|Kv^f=Y#&Fga+fk?3YeII`Kqu*jpxtdFG+aLL +gsTlqvAw@`rh6dUUr?zgakqjBnUgiw}FxC_dJ5N#Y1G20y-*w|DgYiBK}Yb9DNfOJNjk-n~#rt?AJb&`G=C +>uYpKO!%7*=YI#MKP5m(tSya=)fKMeb&;8^gYV7mXb>_aAh|aaO2PLjxmJ)3)w4W1zF|un +VoZjA3SdoWXD(?V|&v+SHYuqc1;bj(_4DU0fm`gPpN455Sh+K1(Wxip`&Mf9X(wFYlWZ?hV<;YA^X>h +@7S{d3n8L)D(H0kye|UVHHXB09GLeh3^vpy1mP9An;-@<@<=LsG&kqzh!B@Xe7GPK7ZUsZkzQ`$KJ6D +_1fclsSvk*i?s&f7x4Mz@r86vlbr*<>mO19gu~}fl&>-h_V^0(6zgDe_E>IaQ)d&OYZ75(@(Yn+K=x2 +2{F|^1gyoh<_rP)dw7|>9b*TJXh#)CQ7e5t~?QPi-)L+D=$pbq5wM!hcB9D#x#cGE?8-CVr6%lQ3fJ# +)XU(t*4~7bi`iQ5TK3@`5L?P+?ZiLQeyp^toFl`}~F+gK>LJGh8~PP-!PmEVSw2#$9SsE<&Gjyvm%~T +r6zqWds*3>tlImYz(`l6Z5#^>ZvQ8rL9UOp5^pGNb>caHD~!!@!>4>?Q|mF>x*>h>YSH)?M$+d*-j>wE<9*H&RoM*!gR8vMTe +{{B>pYk1BKDs;GhU_WOQlcY84LbaKSlt;e{!c&P5o0iH#?&{E(cs!=8b(3(+&EBdceW$;`N!^_USgyk +Z*cpBJ4rjMrr9D6R6Vz~_2=YF40ol|j*{(5w;p#|i;Q?u~IK_Z>>R(d*HuUI*;>l7LM<-*7&)}WQ-9fpe^czB6-7O +&Iz1NtL!?64i+YM_Oaz@#2H^_wYH$ml_V=j9Ce8n5!fgtWxPkalLHW@2L&rH*H$n3m(#$E)S1Giq$ji +|RHLl2F?kmh9N>3Y>Q{}XvKzUF=0*=<-sCs{z8NLA-%E8WjKt|2Wqf|ctqH{&XTZ~y9z*wPq|Gq7-O +v`CRwwH&Gy0V!_XkgG{(KaF{nkljJS>v9lD?ij{eNX!Ht6BFzJk%NGA5?&wNnHewXPflFcPjHfQmH?@ +@H6}Qdxw1IJ-^)jPs`L41)>mz;{*zU6bOL?g`@i>m?U6`AV{19Aq@Maj{o8O{mEZKpX?@vAIsJ-{*}Q +*@S)Z6wZ$3xH~MQe85B7J9gyXB=wi<=zgRW*2 +_0`WYCgx;$JKxSK*Ru%_VxjE;F3>4b&UN{lkzCE$ZdS5LTA4G@p>^RdvGsH$hajYh&b(G=Ja`?pQFPANi44)Ntla-MI52UE+` +#7E&)C)0$zmmnsDM&^7YxbFJ)M*SRED#^wn>4 ++9nNRY=@?_}C(sxb=^)AX=Q+;kx5l}nf1u5UsW)1vpGw0kD3t$ynd(>9v=UFqHBYtNYW>jrCcE};sgW +eqB^m&2-Ve`==}f67emhh|LRPj!z +1P@K9X8s4rtq~jUP#c$srP}N-8{>;|CBtIz}%C<&=%n~s5E{hsjt@PCC!t=Fp-s8fw%?mv8bM{+Fr0E +f5=lDrC^y+me8^Tnuo(pa~IPuHbTG&-)b2Zd@U?8e8BE{afSO!i=BoiM)7e3{-cf3RyEE?-yRzSgW!< +L(VI?-qPgA5-F-dTL>-o1ALk^Qkh|b*Gq_wGz+vZc0Phv#Qq=@*b=xCjxle?>=^s?sCNiWnHj%uDi}_ +$pN|OITC2#dL#4!r=oetq@vfG4VuNm7&b44Uq<2pBT1^&d%6p^#(TsZ!nub5o;u|Yga{g9);K8z2BM0`|S$l&lT+&LN& +95jufcEb1TmOkiMSU(&P$%7N_^a)RnL=*L?)5oHZigA1t6Yf0fXw3UG&|^E3`<;mLF_QG4gz%?NF#c3 +5?ql1}xNpbeW05`jbQuO80vCaw1_$)WWbNFPL=HcKB=|HYQXe}h?9>rLyL6e +Odxmv_+A!_kj^75)0kcNXUq>(~qII0vZa*yT`%=a}0_4+oukI)7e +Yfj=Zfcip0|NZdaQ@UB_3oe(@3qq8eHsVxo&E;15JEb3yWG +04Y9BnHQ+K+530DWlH@qffzUvS}DRQbdp4*6P^*Z4WNMBe%cW2o#w?texIJ~oB`v!gP3A~_F#?{w3TA +F)#+L;h8vlH0Qcuv}{J6dlyLpU)*K@iGaC!T{Om%PkxmZ;^iFC#2aLFlvF$d>fb1YA3v2~-=7-tFDi= +tja7Te!(m&myS@k(d%BekIvim9|4&sQx<=f%Jmzu?ih&)W}MTbIz+68;~lZpdRE-%Wz`Pg=3s-qPm`@ +0DdY@TdKkE^wQ-b7DEeUZNg%^;?NhepT|Xjn-e?sCOcNKEErAew8m?xR-*586pX6@+jFmrJiCYZyK +r&?;*Qx81zVStvlVM#Yx@P@=UYj;rsg7+MKWR*LWrt#5&1a3-o*!jXNg0ynDApy@>2FyqsALxiPtae{ +~R?-8?+aSo4(i)cpmv#M=tk#(Io)m0K=gkrU!)SYv7>7F(;1Ez-Pz*6&TFE<_0vk_1YNwR3hHkkDkSydaf^JOaC$m +hn3A8%yL)?ifH1om&H1-I0@Q4T=DQP%j +1v61JfT1KoyaM}zOr?AAEc360Ruf;(7T}g0E +^48tWlxtw!;|Lu`DEUb&{YeHJ?fDQ_)|+pUl1GkCvBOvw!6M7pk=X0i(^wGONSv_xLuLBvI +*!!MC>!=Blz#!gak1`!t`@vY4LyqeyTK7p_%%_c^!-041dP+G%d#{w&=gJe;1c!Pkq>C6O37@QEC$j$ +9xk&^mu#oUNR>Iz3Hhq%NB+wHZ3r~MlkI-N`qeuVCCHDe1$p$*9(q#5A?~z4J(ic_ +qo@@7xS5h4QN<`e8h}vjSgH-9j{(U?`x-<)$=8p@1-!Fc`2W8Gi`Sn877u4D@c%Oci`Rc7u=sMRXXu{ +ttxDX$)gA>_r8NoXwntkrK))Va1GSs@e7)5hLb8$UKbUq3yt8!G=KPgKJ`pleFSw$60xzjJlCtr3roN +%)ytn}T)5QIrzAm+1W{IgzR&}N-YEr@Md8g0(dy1ct24XdcJQl1ltXt0+vQnmIE#kIR08oB2-9B3C>d +K#xpcP*lG{3hl8SLTZ@)|yj=v%nF7mC;+Xga0ky$-tvOR^?@4c;%HY;T!{n~B1|-+2YSYI|gjTc-2IR +?~LMH=5WmMPa-OmLDOdv8?-gSp?g;i!_UbJ}_S)GE3DplCbwVf8Al5gqB`J< +!m}pP0zA`Gb$2*d@kZpY3)h>P9sp`>nr!21n@I>!azR>6kFuj-jdh)hrWAI?}iv$O`D{6RtB8NA$ZzW +qnyjo4)>XY$`rs#@z!OCZm4*Xm6?HRao&m+P7Ixh~5g}s}Mc^JDhpA@y2R+pz@sK{o~#K`kvQlJJ3Mh +4PB4S0Rqwh-b#2Dz_Pxpsx|?m|MlqnX345Au{;?IIlNbawMH=1cm)WJ+VUeW%R9=+;4LI1$X~DnPYQ( +I%rJo2^lkhFU5?Z@_CdRm$rNerW9Ler}m5R@8R@GS&1dx8=0mcM@l+y-{lb^GNO-&QJ5-Hg7!I9>(Wa +%u3=9Ccz-|X@S_c|J)(*-*^4qBJr!;{?smkqX2Q?NSOL05 +m?QpkaQy3oAOZ#K&*A+`gy5*BBK|aY6Fgp4bj^@pea^hjDKpZP`D1Kbw*a80-Cr1Bx +qmkK=<+%V>xkW5bXG;;2ur1c`rj?%v^!{76+GpE9On8SkScd|)+ss2->20pr1r?dV^EUVMOFefpzag4 +JZNSkhtpk9Dd~CP!nrL}BLd?Gm=`9wpFUCvw5AzN~m1o$1{2bDKmgP}`5fi2yfC`=GwJNg&6XoXT3Lv +N1naC;cH)$j*yc($RNqCEnt}5K*$Pri!)ywXjGj51{+0J>nSY&)(WQxcyRE@HgmT=jP;w>ywbnx7NLt +4p8?Wr*NB3udzkVfIbOTg1x0aCHG)VtI}uEg%|0HLe#BN&R3ZVBYyRYgu2(?z6UJr{Q3;@E|ai<96LP-;r>JPiu+2V^My+O8OPSw-fO2`Fsb*6Pqb73Vvn?eYIH|wS)IoW`h +7NK2%+twRHSUl*lNoi!qNye$dY%qI#7Mpb|0I0f$^)H<6*O!9ZY8lT8;SrUIsYNqFgE~_(Q6kOcBOmBAZLv_d%Ci^1J +bftA;$F1YOmp`oov@pxM!tM9|FK|ovQ#=j)Bx}&bn;F(zA>1kd=WmbCA4)3?Pt*}TI*0Ow?ts9x9ZvRnA-TyJ<7;#d~}O(60Ym7uV(x1qY@S>=Juy=4)EZk +%V-9#a>B$$-M4S4;9<@iLd%Ry_M9!$Ld2EKoN&9(jU<>hB!SxiFwhCGd%%t%Ss2uT3)D#7oOj_{j)5R +SuU35s-#CPpPUIlKcj4edKAc$cOcj8qAo{`wQ+d$a>ByW6&;Qf+z9ch9Z4>+Cf|l-^)9oe+h@g{rBx( +-GYCDrGIePH;DS>A%E`ZBS7@19>HN8$0-;C2?U1;2t)`R#4!xTVH6}t0tP{3pDKR260y(c;m0fyNsj^ +!rg`@eu)>;QhET;=i +jYIpQ$DAlPTVi3sP}G#c9lF19KAZQ!H4GiuTT +9T#@f0qs6BSR-HxzjR%4srP=E32|W)vzMQk}B@isgHujYPOD6$(wVy4rZZ!2V(3u$Q@0fVelF;LNgr4 +)w5d(zEaGed^c_TOc6!{7k-S_GDrSkjF1;9x+on}0muds-s8JasOt_?|#GWUov3U9+SXz*{~`J$N{<# +H0(W^K8Km)kxCKAt&%YBTn#wIFqOEYE85&4WCnobt!>B*)LI`b^8mvKWYi(J+Gwp_YZXRb%B6c=Y+@c +7T<5AWFFPu&RCbEY;(s&Jsi7UpvjDB)aZINjzv%FU^xzfGE2?x!aZgfrUUkE$N|0&ZHG +_Je694MV*@mDiih%l+ed)LZ5GuNIuDS8|06&3xL#OY+NC9RbMTV%22_ZO&d0U+_cmm1-vJr91(@bN~6 +|@#(T^q?4Uq*VY@?fYZgqG>yw$FQl^o+@{c_{MY6%=v%o~R{?qyqo0)oog<=T$KK943V%tT)yrrmGJj +Q-bGa3i_sEvjeT+b!hW-)?GMHGpQbB34(zwP|se;-*8^7g?YqNX6O#}!}k?NT^l02-FM8?mp@}J6tUv0YgS%@id2XRTQ?L`+!#dSPuE~z{gj)@`m_L_v=g$&C! +x~%MyKzEkHH}CgRf88&DVg}bOX^Dk?IFIYVEGWoq(6BMx{++gZY@QHi>>H4EM8!i0S8fxf&ga(^&imY +sVIX1^^E~ldSEz`fJ%jRIP=3^E+S!zNYU>wbqnQgj8U@w)gA$f!V$eqIR?8H8DJ&Iuxx+=gwfY?*<@w +6tnq%f~JQ~d&QWrJrmg4GxiZevn?V{mN{JBTH^(Mv_L1Sa%fdSqn8y&dJ_*dOzg=$dAXu_-zCZ`5zt# +@BAp?0!Cw5Y1NJRu9dv|zkE7lDIXTbSQK2)h`(A;UFU5=wi>Ys1vG$}hfVV%_V`D4VxM>7`0|>fU=wj ++BN}Cb{2B$QsvA7$9>E>`%0`z}zd;(yR?|BCnp$a3!WuY}Ja@*Z~P~DrJUN7xYty>r}U_8<+<3a;^aN +!I)%i?mSpvyG$-5b3ea%9o_b>TQzi96qI_LL`?AX7z!kPvs^ +I@QR`vVCe#@%hpI8+_fe?m+#9@3uVLPiLP!#{90H~d2?b~;{1;RK9qXdloMnoa_`1X*Wl8o?64m&;)1 +3QP>V|)ny*fs{ogM(Q8Ix7HDNAnZ@X&xfO<6j&dnQ9C>VsZjI#0x<9tJrb^9qH&4`*%eC8^M3as?v`H +b9nHv!*wz^3ObGw5#rEG06%Wq;m6zPFr*}oO!t26{k;2ycaj*#NBJ(89EBz5r(f6Tui&@q6AG4~wFPxP&%E(5uvoXD~{v` +KTL@b(-&;5c=f!B*{t;C*$CA4H0(g$8e-fo6_cd6RLLo)B)j_}0C^FrDw<=A2_%UJ&47)4CgUU7gH?a +MWuyq!#W$`U<|_u8&0`xsSQy||KeN^c^Hw?P{4R6tyDDX2%QdJHESn@-f)01+nWUf{9(g{RL%Zt*WfdvU{I)vSphFNrS-@is +%v1qetQPwQ~Vk6^Bn#v!h3o&uGFX`-$RgK2Gg3Eex=ypp`GV8$hOpFs<1q@XjlDsM +eXo(UJkEJk6_m3g4L}6t*4%dpd#)i$J4wr(hU$?aLvtw_Gcs@ry$&17^Ss;K1sWZ|YQ0DPovdc9rmq( +uW>IFaXBYaPLRCbXyp!g6_Vq=+lVOt((<*eAXyL#=KvlAs;7K&@AgV$(@UA=i*3(6ht~J9DO8I-KZ=X^yo +pMioJN>PuwI^BE;>yeU=6y;HC79d7UGN~;EV34!}L2rhn=x +_*v0#)NwGBYl8ZYQbQMBe^xDrP`JCcj>3n>O5&N9gL{Lifa`Tnt^se^M+cDn~ELEEkd)1Ok>Kl*!%oI +D+KCMW0Y^n{b`HLb@%_+TlCJdxZbYC<&udHnFmhpY4RJVZX3lXT(Nt2xTnATx44L*gVJLW;Dcszkax(ojuIKIB9 +dMO$m@hl6E&zL9kQ|dW+f9@^4UGi6icpl&vE7e%}`I!Y_>bK2yFENSX}heJ3U3O}lG3ps?3!4DQ_K-& +@2YZy20d(J;OXZ-cDv)-5(czb$?TZ)b9vHJNVSlAK1R%T-Y7rz#-2`g#OSOjU{3TZN9IqRFX?IB$a!` +LcC{lO%D>i+sr3bA!D?-vRe3GWJZC?IT2iyEVY(1_mXIJc{&^5|Sf@gD`4poe+FJ=twmMqot?!mP5Le +`p;1n^3PD!k6-pfRE2zls&>ExQXqjt5CQIR>PSuD2({xY42CcQfe9FeA%p-)3Pvc5{4T-ZfIZ1kZV8j +4SdV|HOh5-5B0rNOK;$QiIK(?Y?A7o0KamIO`a){m;Z;a}YBwMHY)brufS)NCpEOqb=^c-=Puo(upZQ +0qiaf?N9y1=(L!onj>VEbE5Mjs9`(`ro$fgnS!O1<6WZ7|gDEkO%f8;#D&s?fQr;|F$J_&i`%y8;xfk +OXu;MDI>)%AUk=(6l!WH>{i-V+1JJyg;Pi{Bf<{|l&U{T-@0h6KRhqN-mG{x72{^>3r9ZJkjgK#8Xyr +=40p6t@b_A-{w&IF@O*ycp@-N+D?+c~)~O +neNNBM7j?-I0^N5hNy*@4{287-NN${qrn}8tFmufj>Cn@PigLuzq9pI-&>}LxeNka_f>a{CFoSzWK<= +R1hsvF+j8Ms6=4&0+-niAha5Jw@#33SieK`s@evqKoHSMqD)R>Zx$lH6T|voIU2ZlX;d2Qva|N{pJf8 +A#XHvflvx3^L`_o}@6Ds~cYp>D*w?I}$!Q*56QOrO~pzgW)Ug8j_{eA_#E=HP;3ht!JqwSj*fpI?;;- +Idm7}^)466wFq4A@|=dmnE0E?KW^ewOef_Qfaiwb7S)%S9&oojrQMh2rj>}0oSLjEXn8J4^|^_!NJ=> +TOQ0P#J8>sTA0ceHjM9jCw}g<@3upi|>S<(lQiZ`|#tN6B3v;gdlS`fbX)t(t#sS?nqhu0jlE60(L`)ebsBEC5pfOBYdX_0Ciy+767TSGGbW2wg!?7T9-%*}9hZ_vfo1zs< +XV}>N{RSS3_oUCLUBY$^lA?u6Hen^aVS7!B;{!!W;39UkGbCFYEZS~S+~R%Bg4#=#i!bEB>&*DOm5kY +QdXpNboB5H6>{q}gM$*Dsccr)&7x(R3HgEkCna(;^4MKblEblfx!W#h6)%hj*PBamXd|HR}>e{c!KjS +QifzR@^KcW=q%9H1Ad0fg!DsV>LKX!~PEHmwA0HSdA%MCje%cl(069k=yj#G5Cw`ba(OQol{xg@xjt3 +_RWlU~lS`yH{$UCR}>r~yb-F!_?F}mrA}6ah`2Fa; +CFHYxFVK7u=GIjVv#h7-KyOtiHJ{@%IgJpph{S+C3q%xWT^EOW>>f?Y)?D8ozzjH2HcuQuU%`ZQ1K;5 +%%Bd0dt!-9f)QBy67nw5Cx)rOOrO#krEIH|`qK`UZZ&)vgy{^d`|WzabN>BucPqy>DTF%7JLDK19K?V +teCwCRm22KQL;fkKz`s78q|D2s73e?oer!mS|47^y*mL=!TmJK-QWqbb%XyyvPqH72_hbJjeze~XEBU +vJ{W7}b#|!<2xrrephM**bgCq*>kc&b{97R9`!QmZzp%jRr5cNIubpWQ%sLlh=AV(^QgpVTJ(E>yqB54|Jc#U6h;TgJZ6FK7lQpM)1^6t +?mGOJai1)v#`@%A!D$aMh%+}}1899ua)V=>Z6fccdYsq4!Z6*2mwA +5k&Y+bKTmr3Fg2;xA;a|*2TgosP&6Rb7h)IvjG0$Q2PRd_c;HzDBjOAs +$tRE+yZFO3LTqEju2&>F0|BF-%X>Z)4H;8!Ap|90O4)yXyV!y%W^~3#=rm_cIb$^@bX1GoFxjzU6BR7 +Xm*=Wr9rfm9aAAWJXsW*wW=Op?Wo(`MX%0e+?LHdRJ +UVd!$>LH3~WN~8SDT$lJEWyJ-j%xXl&>uo^KEi&ufy89usYwXLXI~zDSHh+(ydHD@P6JQuypTQ^Ay59 +QIru>aJr}qvbnl0?0KVWFCPuH#Vn*&RV=nTy69KZ7?cTwS0vK#9UsKJ*&9>RGm~aCh +bFo>yp9m=2UNWJ`3|DXJDkS?&k8;luRI5iDwD)bkaqJt=HR}CV^pj%I-4n6T{3@eJpIEMmbCYZ2^a+2 +>JatE^Or4R_lVMW=L{ikBMlX}+2Ot&N7O7-Q`Hvp^J0q}v?0%5{NvHT17yEOki2T+mqS&EIPLU7@k{E +^%2t>goLZTG5<4z2Paf15p3~b`V_uRc80(~kzUy>2YQQSe&W6pH?3H!t3)13Q#`b>r$4F%z67}zm~gg +p9sp4>$iw08P6`1Jag-l8#V-|{PtgdC4`J-x3xZ!>h93naDEgVvxx3crsNEcyl +zsK1CWU`gV6dZN6+xf=4d}Q=^rPvG9BGR`bBe5aIK>$LuT#W@@Khk#hTJe{Dc4GxHUf- +TNAu!M+iu(Mx0g1$X>YQiAY|7!dnS!UK0$sXXF$-Q8J5hE>DAXw4Q#fDHP5*2u~?VV%>XynL$B;YDeL +a?R((#Vlgv%}6MHAh3?dA`wCLO2^9^W^9Z42RwYNMfcKer|1n@mCu{((?c!hg3$OR`9G!0j{G{!a28t +USk8w#Ljt=nN%O;>c&OM*bRqh%p3Xp?z`BHWsI*EEy5dBcR&53rP%<-i?UZdtfa*Bc*@tAK)111zeVR +mB;0&h(7k5;SjQ0P(gy9PA*#0`hE6!j4>zz_C4fq!0vA0v(l`$YL>JwFjzZg(@8y +4&to6nFXl#8{9Mu%hHZ6srg|E;Kkp2c6RQSxhR^sO?ec;s}yBz!j-{V?_`dN-C|$oF3is`JY+_42JUs +B8ab+9N+NzdoBBwd$|Z)1%FcAD!y@c+N*Xn#C$0g26@N==7KLG-&n#+;GRxI*Cul2$qY8{hAn#*F%C_ +`n?d)&$0o=M>c@@$Oi0?^R;D~rY%HBwreP}lht`=b9fYNUTT!tIBWKj0QjuG$m%KA_JU*2@p5V3w}C| +-US8McwJ+O_xIggXgbF4k(f850rm?^DqpEG8xU>rZEkt@wvV6rXPQ!^&1T`J;#t|IAS8tu`XH-u5WCi +`zZ}4Cm=sgPZZ`4h4YM+8r19-yxrIXI<>(zpIAgv+cZSJW^E+njq;mc)YS0*=SYF?TgB@lw1C)pyb(K +XV(!tNU|u{vR2Ac4Gv{n$J6bc0mapF69GolH`a&C@M#33jWys*ZNKiFtbxaIux*fyz&g0lX!>VMnu5Z +owun24!{;S1gt+*`_wkl)x#0{D_`Jr|ys(Rr}(bv?cIY^OnUoX-m759f>Jj0DEaKEI;F?p|%La_o}V_ +Zr<`ULi56Oifq2Qx~T9?Oz<}Lf!!NYH}!tCx^w@Y#zCM?vxjJiQc1S%3!U*WDzbJvEnTJexx9@RUey% +qCGqR-wBIP8r2-5mr`8zWqDhyRYzshH7{Z7Kox6Rf$hu3W;w+CdBq|jgT!|@u5uPLIm%xLx3m_!Zqdj +w*syQb$RkT7Ts&X2_ra~becQf+V%#O&2hADU#hoCDQy)3e03o9APy8{Er;i9*p@a74Di8EYM#^T1aj0 +>Gr$4tH4yxGqJbJlt$P7WC1R~b2%tAbfnEt{d80{wN5nKUrUTqUcThAX8@-Ib9W;Yh;8K9Z&2{x^F!$ +qt%{YSk72y5I3@5VZKF*;xaq!{5*(`o6dMH&MhtS?G^_-*2LaPtg)ZcfSWB;O+-u3L@}5jzEqfgd~dK +D1?4DcsS&7k|WuLeH0tB=rax{JsP!kEDk1zucGiHyN2xn!S@@ciBC`R?t)0_a58()vHLze`EbJUL%MP +IRLE!MPC^|64G;b6?}CToe=B(S>wfR3a{ +~Xy?;UOr_&0v0Z>q$r&)>fbDBrOEO?<$ls%8vY!xl?il5@Mx_Rc4) +bt@;`WFex9!#p6!4iFOhlC4|_2|@{aNVD0kD!y8ickEtW_MVfpN%_642fO~LJg-f$QdWp;NfLOp19QG +!Z0~E9SEqoI?rnSI7z3!Tf;hh0q|>QFjAA$-`ZkH%9mD)Du35{zidg1^k+8rrJt{zKi-#+rsu$r7Jyb +@l5FQQUk~Qh?l?AYz4&ZN+GCYu;@y@KWE5diodR@4+R*0CqBoz8pQ1z9OirDM#+bQ&4Sj~U5((laXH>>={Zl +V~3fgpyF6hR;aNDu^t>~`~*P6k3a4xupe{iF-|>GO$?NvDT~e|DtnBlJk}A6-XZgdLC%X#@L_dRmek_ +VyTSo*cRV-8Ahl-Q$EKUF$4A~9}pj!ZuS{b7G{U7#N)#f6CZPVAU2kow?(AmxAUW-vxBhU=1jEp;QMdL)57?%SA +QK4OOQe=BC-zsL)HY-jOnYxYZH@2`?B#@|W0l>b{vm%qN{W5<7oNOHz{W(#*Hj|q@+Du#O`hNX0Mm&j=ak1fgNQt_yc%;vl$;B!7M=KOJ#DWgwa3yvu|m;q_Q1qJN +(f{4*5C3*!lTAB+358x(PfgQ6s-%TnJbh!z_BmH#^V`wqu1I^35p}K4H1o&#>+}QZEsrj3gyD7zxamC +U^7yQ(;)KG{o(7hY5-MIIT~)f7!Q^xUpn!!Fh8L?YuHy0p3O~Zag+Au!qzNuC`K-EAvBn3Ty?Ba1=%y +eYDs8?Hj6#mJfPrOCf35YSa&<6c&nf>2a?|gWa@v3B-g2cJ-CmqsJF;`G~<_&mXIpAbo)XAx^n+D-rV};SX`3M7+3-SJmojTd~gJP^W8^Z8AG(e4wg4MADQWFrbfEfk+2Fjl^k=Fuu&YngXBkG)>d(tGj}E +U-#?ueMOijU+R>iyh!)Sd@$H*-X1Sys+GCN&{k6zi|8z=gC!7dyD6cTyB=-HtX0RiN*}RXiQ^RK{6eN +)eBdhu*FL1hX64eHeeb6diN1j2f~O7t`7%$o?YHvXSh9GakRdp5~PhxOLeYCT_$HfM`aPFR%G=`Q8tv +60_Y1;N@9-APNHxL)dd~C-a*mOPd2EZjr|?!-g9HnPRJ_C*y*Xdx%eaIFV~wsfUN`!XWeR}aKl>u20k +1bgXj=rUT$Z$#Vc5smf&gebv8JVVk5Oy-a5ves($I?LX)2k1f2aQc}s37+E?qrP7V?D-kiK~UL}JGos +S( +_aQ{tgh;u{vXq#|3K^Z=O?lB56HUzc#*GA?avqZO{oloD3IDg8io)U34;`Z9JCP#!4V8b$)j+FK%X(L +zk_X1bil0WQ&8Gr5Asn+Ib^l)gX(ciF!)GpWyw$Jew_S1fh0RJvB^i(BqR@@bj*H*k7`(!9cfr9`!ub +S2N5`m4s>^np^bNV_#@Z`e;VDPJo-$3I>gAxBSgnO^JQV;Gb; +f(U?&}a|oKm)tBK^e0#tgO*wYjt>vzil0H0X@HbwgXZl+p8XZ~_p5Rja0HoBt +=(*g+6@C^IUt`KznbBnZz?65hC}ASpN+3=mXMWz=7w!!FlK*9QIW=?9VO{__J&Lvr7d2>>B^< +5`phs=L;iG+d)3gr?(Yu@Tb7l|s2$2x+(joW-Jo_}*EzX3_)t4XH- +jEQmL0He?1C6{?&nEItLdRuhLnxV*dWstXTE#*-(t)LJ&44FvBl8;%ex3s8)CIzh{j +boiak8C^uPQBy7-MqOVPgbrtu|yCL>r!1N%3HY;iMt5j;*`*)N_8(S@bzr&x0rfA-;{j65;O3;oxzua +^xFA_zi!4=e|HZ9l+rRO`E|K1aP%(9JBwCqaUU2X>FA-0)Ax;=K0NU;<&U)}vi-K1apiesFHe(19~~VC$#7 +yXYzjgl4z3W_hG$bPI)28(C>uoQhs)pSYKf +gTBYuJ}hARZRan&fL2jmG)Ps7C5dq79{r49DB`v^mMMGf#K^n`Zc5pdN5wy%$cM=nBF6H%}H4J`q*v6 +I#8h(~lHn|62|Qep3(r4lw-SLV8#rC*&s_Ghgt!+79o~vZi+Gy8&jwzCGBxPQN>9R3weESpUYT(;$T9 +s0AlJxc1lKnO^&T9V0L>FH50?N;omT6}nFqK$G~?GsELL-@u{e6P_8Ly)@xVh6?>_cS&P)>Yn&bAs$q +lRen4-zS-h!ce6d2(p>mUrCj$IL`qAYm}0xphow>vLIr2J(WVmc%{xC8HT@YOSdkn7Hh)=`RCA$J!tND75}Dth0;sKc +DBCj%EKxOQ-oU)ZgI4f4kOKnE030`EAD+itX@_z)^yPK#U|v0;3?3fcE1!juGVkY4LJhb>TPK{0gGj8f%i3Q36li0<^ +Z%)}$80eMS)cx6w-B7uN|dPVTyz;54SSe|IE)UrbEiaXT*8iXMN#iL&e3rYnC{XZ>4P@k^iBpJ2s5x= +i4&T<0HMCh%9T^N%hQ_@nFmD|iw388Fg(>v&pDaPVAipt5+J7fqX$*|q{1IV_gXlF?WTs@Y`I%iyfu! +fvF-GXo$u(H@h4(AL~kz%10`kkpG7^ze|%0=V))1y0^dudgrjq|0wmpYM`P%eU9{k*Ku~OtR?stsP~! +dLjMX4|}@2UAGf|W<^1K!x(eYA>A~WLg>uAFjv%f+#P(WXY3To+Zhmg(0{uZT?@l57>hNa#v&L*r$us +Zzgcly-Dc#vruGegGl36@P!dk(vwpH+S8jLl66KSojwdKOQ^fvh#OF$1LHfP9ZbCOQ%s2j}J6YN*FzcMy +vGnS6qZQ5)$K5JHyG(%xCz#cO~ +r<-CUJW(8ZN_UK{IB_ik5cLUyr%44`nI$u9zfTyYO|DP||v`XXO3Vo2zR*F46^ZQ??F>hMYZqta*12) +#U!=m5+hg-^&g;BLHoejv%``zUc^G>0Y8TT9v|v-ZS;XrkTo(lul%2njz^6cgx^&YExK3Kuc3U3)Kja +H&Zy5%7(8e9h@4$H$0|+PmiQiZY4Uy13_v`j4f3fw$Vb3eJ7MlQW-fSspLI2fznuG9$Z#UJCTqlX3tJ +c(5M+JZnnI;7rx!tn)VRyeDYHJ?wigYQ4X)!n|8ce`&$ZF8Ifq-r4+2x5ml-{*N}*Ct&=Sw!6qsE9(gRT6tS{g414y3nhVNE57XucRHToRM)0#wz)g$3MQG>p2L(c-^5rB*8HAK*ovW&g+U;y+v +K_jvIS*7;3l5k^1=Az_4oL5QMI654ShhEw~mD2h-Nfe|o-px-6Zga?29kSL-)LXp{lWhCL1*YoXBx1m +Yi{nH^irK5cUle9%hK&!ny|I+n=iQS?JmjgkXo?yuUPgNH|9Ie`x)=kUmC{wa~BI*2sIe~C1n^a>XD= +`4x7xD%n3KBvmRBhq|9QNX`JiwBAV{ta3@P!#YDj1mk`{p*><9W4H7X7SHJG4OBD;&GY4KR}DWxlG_k +*ZGy_{{xzTI0$C=%$f%voe~_f%(p`Z;SM&2WxB&)8fF>k<};YI^ +)7~>3wdFY|8=V47fzv7=G|^kfBlQ|>)#Ih`Bhfs|ND=Leq*rz@giR>^&dRzH})AtZ~{U}m_jKSrf?J` +K@y`t7=}JNcoad96oC@owa_qlSWcKY>~!*FmJ9e3m3#tl{6i89kIpIVOQ4*7*Fx`>c>j;#A6XUf;Pvn +3bvNiCbV#@C@ivtm<)kP)NQ!BCsMCefVK<}bM*|Pj!$qK{yl!d&Ot;!@HdZr89BJ__ +VZvier&2LJUoE2)ep^4x9Lr_jah>ppRN7XodG}E+F#unpbGWTC-7_f;@3aa9&W^(k<J0889q~4p|OgG;B_Q;aPc$4XDuxr$*`k9Oi%q;8Y)GRl=a$Yg6ilN4;`+EW +WSw8zWqt<>st4*-x6o&-hrOR}79+l|*I;mt$K2Y0L>Bog-pBGC-sgErLb6VvcRx-G_eqM4Ok8U)qeg8nhgz~&B@LRd2uUX1vycFc^9=T&!k#%NGFdET0?LFJH6#_9m_4Wv)^Be6@Bsr9!Q2fKBj*f@I@CRlK`jok&Pw{-; +50V^dO)&eE#nZzaBIsfKcDQ>;VPyvuF~dIi6FRz{lFz8t5IeG$8Gf)Pk9s@!>0hPxz5Xe%6pvJ7X#HZ +ge4&w1)_=Vq4`aJjiL*w5FY~wL+J9uWp#OKx*6+6V*Ui>omE9*h{ +!2)G-b6eXEl7e{z%FlV4zlF+v!}q$Ses9U|Cqq68lYg{GOQhiAW^_>fxi5h4v94*|?fJ2J!KA;u@ +`gc!3_YFU5bZ!~O(8PSZdb;-U)`zA0Sv+tJAZMVFu_Vl%W^3^{al*kM1d-3d+H})zbWsJB#?+z*eFXU +wS-k3tS-M6r_+IDUdbL7dNPX%)EcfQ>%9d%jr?UhXiZ@_{U=F>J^bCjHer{f-LDMMr`P1WPx{6d{;P$ +)+QUCzArDDF3_0v*3LUkgkA +%x%9JAzTQ`vFcZWfQu`0OAZ?PmDM6ny&N;XmhBCkIgnTEAL7o|el}|9%f<_zgK(2kc)BIAZhJbr7@gJ +tGe;?s`Oq$M@(Wy!P)e)f#8zXVby4vYlLn0@w{t{b9JY?*3gK{X13%cl5XB@@VMzIv;wsdfKN2B?r~! +WA!BTiz$@0pH1O>|7IqiUH^Iz(nA$o4fO8=za&x;`4?2E?~<^n`ARRI7Hiwh1E)y+KJ{`S5M!_aexP6iH<{KaE>@L+zom^R1@)RXRVQjSUtx5mrEvufcuQreJU<2 +D}b^b<^wVO;hbsr7EJ>6%1jn5|I%~V2zoN7e8ggQ9L)6%sW>TpjHd_#XM|pnapS4eYTy@6}`7X-I}2$ +bPRcOON|wd^BUUPy*^Bec{_zIctXvh;Raw9e%hW!G+QnI7`!XXYOt|NwYbDQbiw20y_^-;4+&{#ppnw +3yDCqMgF)SE#7`Ot;0{41&Q&7Z(&gxYee@fGiR^|T^7~#TbeWVwuVo8MVcaD#l{>qtW!0u{)DlV4Cjc +$qdXTV{h-nxnZwoPEo^SN}js?C@r&&lI+m(XtnugeSB@5k?^j4y&d}JUHY!h!lq}D_ni*9*!o43k6ge +4aF!HvP^nAe2e<_~SwMo)X7@Km1GYIbxHt8b-t#ocoACV<(x@X0`Uw}mM`&}v{RhH&Qsxn_723i96Mo +Uqy`BboJkox%i`6p3>V&SScYi9G?H({9iEa19=Y4Y_NMXw>TvONc#Ba^cgPLz3w0_ ++k24ou9kGwx$OS}r}12ZsEbkdqy=TqT=3rt-og}u``xh0 +M2)s8mcP|zHqI7bKNA#Bs=c7z-#H#4O6M@&R_h;a+-$#LQWB>C}Bvdg7tzJpD|_t3?HV^61Fr;JWB=* +l0a5MJ(-YD9;ci~UqSR#+NEpI*6D_=a5b+EyXtKX;LuhO4P;|PCyD$z!TC(+>$S@oSqmQFRcp7#?p(3 +IB73abTu%-a*}Y`bRgAH@rCc#ebGIjeGQo*orYE!!UiY4-B)T$!<{Y9$Q8bUIlqEH!(lud7Bn;KV+@O +fr(X`#Ucsk#k0OYo1>DhKips7V=mncdl`9kG&Xt9Mm-Hm87Ol5lV1Yur<65%V&AFHH7m>bkE;2AIk5w +gz?PQ;aflTs?0p_`7$$>=V2RFCeoaoKYZ4GO0m#ru%x_pV0027QmHaImle3S|iC9(Q{%|JP&C@1q^w{ +RQy+8|3wumic4c_1`7FMO{1SLcUwXh>uD|_-P?a$)g!8gAS32qp^)VVmso~>b8TXJ(!Dr&<%_qd=w%* +kk1iQMn}B2|Gd9w$2r77mpRf`QF;I`nEI@p98ddUiVXb>eW0KN$D#2-%%QMPH3UDR#zW%b1EF?AwPUX +xa-|;@%pO_7AB8{okODl8P#@w={9(HsP0z`(E$mN=7()C(UFEM)*S-2a>hk|3>Z)gX{))PoKSo`q>;D +&deVsIUOqD#QA=^BrR?X4$y8>$U%fVT#icl54RX4`eUzZLz#{Hc6>xqGH&b%l#-F=-?DGC3DXTL*dd( +i5Zj0Jp^K0X3>>32G6KMP#sAAt+@BXF@h50p$!WmebLHdw$OEJN2zHzIUfqtN9cTNC!8a|)F&cp-V0B +D583tX~dp%Q8by?mbvMYZLrS&QDaw0#50prDET8kZtD?Ja0j1kC5Tq<-mnp?o>SC+DE9kIEOk`rdF_| +*6utOaA)Z;lIfz^^!Y-ZDk_(KGQ@?|JW9+lVI31@+Mv-!M_@zEzfpVtlyP3`HbhVe2?AhO3u+UCw`|j`SWPbeG%@Ktjo(CFnuJ#-AY-5N!A+JMP +kvD2}A8s$90r|RH1q>pJb%E34?;LB`s6T5JU7R1aoJ8GP4D^D4bLrJ4jm{UBCk0)Y(pbNXTm?(D>2WV=pdV|u{Tf}Lc%y^U#WIHCo-(Xz=vj~uRLGuf(|k2b-a +gC}O)d2f!C+4r$y!usaL#8s754#Gq9%nrAfj~v!!f%#@Hmy9-*C~PjY5<#%0#?m4_W{vZ%O=3Q2Ejm* +{H4sUMT)F%D&MM)pW5#lcWMu`|r>45R{0#Uf{>Y_Ma~04m}lzU3iB@tt-xxmOTIMBtFCkElSPDr!Vj0NC$VC7J!w7J)}Vkbv{_7vaXk(Mus$@?G7 +Wt;o@EMlANea7sc0J8dema!_2RoLrW11cENg;}NEAPb4qLtK@OFDhA#iDM32!*`o+_MK)>jlXV>GzKV +ZesM<>U))BdE$y)83!#I3v~4=XrT5{5torBEC}VT1 +xP_(*S&hoS&ZA`}XLS4SX1j(#)ZQ?uK#QTi!LCdf}IazH4QIvTq6uNd{|B>O?0EBojprUy|2{fMlfpQ +0j${Y0Wi=RW?K{dGtlr=QUe@lgmx!k=L5M-6GoQH9*kOGU@HuH?fIA)^Cg9Ys>`lk!iG;sfy+ABKU)e +V89?82DJ18(=`gi9^7;G-EIlcdLoNDDQ==hQTo**m7DBsf&u=YszYqOPX +?GPnu%r)^eP_=ef{xwCuVDf>&fG;Drjog6u0OszlKHU6Du;eps^kVZstYZRxNd9%cvB<9c$_|lYZup#BAPJ+ds?pj3T&sD!6vY{F1n8MqsAaCdqaMp6X +Xux@!!+R898-1xUorz55w^15wozuHY?8to$uLANWRDwh<~fjVZZ@O}wh~jMa%p3|E{X)|boVGbh?WeD +dD!CpW3{v;#XjUoOc=(m9tlcRB+Dy?JJ!SP=y^yn%*T?e^Wqe9xfigB67&S +r778B9_bRCA?zV!fkvMTx`%M=!Ri->7OMBP#7+*Rs8chG0RAZ +P)}M?ZDgD>#lkk6XlHwRCM#f(|E0jSv@V}Yo36s`Bn+#8IE|L=fybbq|V +>mRA~x4PNHguP*BcFx&fk?Lpo493lKbEekl +X!Cq@!coqUhi3ko40St*dew9RxVdzH#c@AgBaUNqV>~wmyFn?{;WR3eBswZC$_G8rP>`2r}67`GW1}& +5_`<7MgVR6wIA38qit@wOI4IQ71`^(>%H7^*5_lWpBHR~bFZ4_Q*i;%G6+o3Nn!6UJ27Y!GF15L|IgfeExT>5+k*Fa3SV +{?dvD~ls`>(%APA5Ek?)WL5r|Ci=?}oEDND9w%dWHgbk*|mG=%UIQ~ba2g)zn$AN;5=J;K8$4Wz4y>< +3i2wPNpP^UF#^NI6u86OsBrZB>_p;xNc+U5}Dh6vO@HBLgMKSE-MQ_GJW@GG&e$Dy396Q+n#M#bIGI7 +&_q=!2l%KJzYMN9>%C(@q(SrSJXWZx-{BKb0LjLda2}WxCgc%a)~(p3t)Af!m5ZiWD|{T{|~X%uU-3R +c=eO({vKh$G`WFWg2GT5MG2bv5yC>rcTEf5+ji-DynuddWAAgZ;oeV#-%j&UywAw~q^7l2Xg4^#Y3WV4vGHCeC;>Y&^t{C1cZQD +T@+UsT%@vdM6Z?DzpKjeFegT{BBS&Y3~kkmewf&8tytLX3Z6AMszM_74$OyC|QQSgZIw!m +^Hb5lU4li(2KO#vB!Yg|Z@8eW~k?vVa|CeRr^AwSTfI;77~))m80C>t~h^e?(e{{4lA9P|So7_uQ7p$ +CJ5Uv6cjqdpoGNPAx<3vAo2-JH|-P1xPQ89IuzXZ5L!R7nJX!Ybzn=PDmeK<0V3ZZ3~lDz+gj&7#$%Q*#b)3^-7C%IzTHSy!9*%2!fE|$IDF{5C16S^&$(9x +Usfe-XOgBx!yS~XFmCD-JW!s;*M>J8ehEA3t0-$G}wSwC+LnH_hSiVU|#nfmM3h3J`+|q8P`wTtLvBw +8&xgoHq3_Qx$Ucs|gBh&!Uk~j){m`{O0kO->}!>l~2Fw=-budynAN;2G^ZeG&0xBB$-{nk75skChSwZ +xuE!Hd*D7V^SE#22*dsrLFNADDI^yP7F<%&$c(~_zzM{o&E2PL&C}xsk~>s(8787~&fRJL&zI +|U{5qE;!ubNkTSM;qV`eoU=1QyxgB&PrR4{fIBbN7%ACpS#SYg5u3M-Ck#mcxn1{VcbMZp)@25COBm@ +U#B{?D0C;b@$*o1Ni?52yEJ6_dK3=udUEM_aJ2|w{C)GXGPwpOlWfoOR<*PU;N3MaVuyg{(E +uoxvUJlBV4R`YVkB@o{|} +X3jsF$;i4sEgF_oP!WvBPy57OkQ*0U>j-ujSP&&gS$sMJl$F4#yA15***2kZGFTpp?nC5XQVOpp9d#- +?NFm1V9JD_N<4Cm!COJgEjI@Mi{9v%ZQO-}OP5R?TVMl#~=K6lZ;@MWI^ +>`W75|H_PDgN@hzUOjb8zQ7p9QhF{#K +OHz7}0NsFJgC3fubEiLCG7Dq5HJhK4%~7?Zy!KAu6QaS0LouBH(Rqf(AQcBZxQOD}J|7lbvF`|#~9lKgk5P`K`>aQ#Z~7jD%>RsN*cIlKw|^B)GcfStP}mW=i3*~(k?6n{XfK^CgXTe0VMv-(p +!_y}v2fBPbW>EICXK|jJL-__?(vbSx18RNY@>Z<#oEc$t&%H^eUV^)=Ca9Q~MA;6cX?9*L!h|1ZP?m~ +e?uYvohe2#@9#L7YhACi3}m;XS9%u{_B+tc@l@4ePfq*q0av4xka^jzZ+B3Pz>y_tc_9Q3%0IubAH6T&pS-Xiy)WROys#g=FW{fNuphlI;ICfT?w0mpdK!6?Y@r3)P`ke*DREv;dO2b;%x8ED??b`42rz3RwG=9G&#TqZIk3eNaXf +(nc!fzuuhqy=2~<{a|c)=#Tvj%UV6Pc97eskr{Id^DJIx@=mh`p;A&jHAYcfyg0IiXl_f +zKu;4>`7_^x@5jQrsPGAhCFeAW$iO~Yp^T(=_EdK-MgxB4mX`QbTnzz|m{d`Es +hKaT;7O0ZE^xnaRihWK25nqHpfvCOa#d&(<<#y5b|R&p?GtH9c;Kn8we20HV2(lWIMu}F@Zou`gwii& +VKj1NX??)Br!NAG%f(_uU2$(Cc!TRQ06Q;73dXQmZi;f03bfbra1N{h(QYSq=;)q@2Sh?<08TYzOO42 +a&x*!b&3e%38IwcbJk&glbl}BV#i)b(D4?z}ClHrbih5SNm?vz0VFu7J)4lQAoC3L!d$AZo9itq&9%k +thtb@xP)#g~H6e(1hjQ1W*9^1j3C%zgm^(xiJEmOYSBT6wrSkQacwwSo2*ibsP?griQ#|fsNmjrvrAv +TKiKWU}?VoVh{_}>S682O(CBLCkl?jItNZDHR+5gf*`H@}C1X%r$b8ip|#CSY_gTK%vqNW485;y2Zs+ +6~$FPT-q5j)r?s-@-ply-7Urf5Pa;@B&*6ZLke-_A_%oz%F +kFa2AeQ|_=+72B^el^UZ2=j3*Om#Qp{GY;mTiRAO^Bj^Hu6?K0l=mLKgb^ki(3hN$p{}|eT1*N>Ui$8 +;I2mDpk{b|s()aNG)2~bV>dEo_EEv=VUwc9}z{XDjzl>OL}h13r`A-qLocE-({Wdw_1^HD}Se|SPn>M +dJN*{7~KZTgOt#T!mJ*I!@m6xJKKI3v%>N5tXm?qg!`OEov}^eKq`Vp?y#XK$6Ig8kD&_KySX>Y4JE^ +2Sm=M|DN`j-G8NRkB1+;qkt+te&5=cIE!{>Aw@Fb{C4k@gE){ZvUnyS@?Q0D0veYY+f~4WUm~u>j(dF +pNM8}6T1b?0$>oCVP)N1V~z+dk;LkkPQZ5RXL4}58e!p7M~p1FG(E1&;H2%<4`FYRB+tKEPj&>@Rd3p +W$6zb+J?lxY549m0T_ur&!=-ph9@$vy;3g)>Q{z5ugYOCt7E(IV3RtO*0Q(|US@|+!^e?!dz~WbAUlpQD0qrk@V-|5zXhPWI_5xj+2{K1UDsy!X +$K#Gc&v77=tQ!Cqb}l>c=844&JyxZbs7R4l#TOxk +E|?BnDpz~#v;eOhhQ%ka~B}aize82w4ixUa{Ofb{-d_>zrD#fZ(%!cSzl?$eZ#L8(P>{FRHL=H(AbRV4P;Yipx}Qd&KN|~ +)-g0qouL$fNpLVY~d^gS8mIq;9?0$9wptlj;o>ITPuD6sFj^5fQ$*zkGy*XIhn)X>-{GC4U{HVWeT9k +VLK)t8_1 +caso~|bR=^i2P?h%;Et9xSjeCLDZ{Ryb$wikaMEdRX3zgr>jcT4=c6$1Mbe_a)rcU@=J1fEJ+yRlgdL +V-aihnkx%qJa{3XmGPad~REbYdOXu4ktUXkc;Rb>AWoAGI6C(dup#zMc>h=%{|V5DL+iB>3OmslK~Z~ +C8^?TvZZ>&6;;aDNq)jz_uM`>czlt{wq2=|{X*sW=v-Xl)ZhT +%%(-pORpv-a@(~0HyZ|#Yy`W8_`MSUgS +#%hNpDxLzF_4m+=CGhXJD0Qa7`>x;9%m9{m`wI8kemm*ftvyu*@|Y2w^1^7#sL5=o6qd~qFADffnH5k{>4Vb*d~neQepVEX`LSpi!7lZ`_v8tbT#%$ +~ADEW^%-qVx=2Agbjr|jDOD-iO(oayN}TNY?HfoxI3?|9f3fhl+3Y+NR`6gf=63zyR$Wk5_w_ph81~d +Oth2*FJuwnjIk7kT;1tbsc)w&sI?3*8&9eQg3bsicI39oM+TjMWUAv{@SMvP&b!!RskN +!>=h;6@&Qs+pA7`wADFG0t8t9e-eqzL!5(E%`=D^2y>=hU2JW$j#3R(K$j5G~iFxsBJUV8QuVtS>xSB +>eS)(fdSO1p>{3TUv_!=q`x{MqbPMSZ;90tA(ZUuNohWK6Sn5dLTd3bVAq;gR>E|t_QQ* +eq}&;d5u=htq&&b%xQ*#XG0U96=0mz)#K}^n<2U$bus5_`x1NS3!yiMY}MdQUhD=UfmhXABl3~6Iu}2Kkz*8PH!Jy6cNvs=Afzk)GiTg%Zy53>*8O*li`g}e|IKF}7YM98Vdz3Z)X8}oi<;s`pv4&FeZ!}RO$Yll +WnTNlGFi1C%n^v&TdSBD@7`3*x+nx<$7{Ui4JS9kadynb-?cMXCc3jbnXJb$Tpm-$7gJtIb`w-oR@k= +^og;w`ib?WTr51YYzT&xGObwiV#J+C~8Fx%!rH@A!v&D|x^>ha5$A{DWd|K038M@F&0v3HCAGopTlKc +iFoG>08#1r+eN0xy>N +HO{$Ym4XSVtnfL5p?pyln?eMBL@&WrS?g2p;__yM7YwAnRQzIQ_y(1pN0SMGuSSAjpifxSW8kWL0{wL +^<9E*amT{X5uA0&FBED1H7x0IJf8v}QmHdtBT5EFm?;i97#1~_K=JovBJWHYT0 +G*A4w)Yhfei+r>(yewf+I;Tr*WpZ-*;>Mu7BrOE`QDf*jsbF_Z2_>T=Bduz@*|7!a+4vIFYQ?pJ2632l7_c7f@5g_PqU)`!ITx4|L{5z*L-mOj;Iem&rfU +_Yg$NlYcp{ihQ|w5Ja)y;0V^FDV<=Q(Pp@}=5%JReVNCDau2s%>Uwgzqwn9juCtI@W0WyJ601xdNoDX +Gn!h0%2JKXcei~X+RU@@-?6%Hvk60x)W3I~xkwpejnllo;^3Ygeh8nj +)zHbv?UoStz(OIdEK}Z9DI9Is +wZQ9mUzZ(_9p~V)R5sck0;fFN*RijOgjw*aNnoO*Yzve>1)3l~>u&@Re7Xbs2V(fEuhaD5uA}el~MkgX6k!&y{JJjwTFXo?(K +@AEtSlOdsd$Y8n+w5IG*kx04b7j-zM(t6(SO8;EVKC5i8{>@R+89(>8Z$7V?u=e}>dF>B +G4XodpmH?^bF?kz5{5Ff9sn=lLsRE!R6@jX14rzfk%FO$c~5FNgg8l4|6xkH`3>mNNYGZ$Ji7aCKI1w +u@HS{oLcH)#M^pb(W-mB9PIFj9YP+cGSBYPo9XyVTOyk1dnP4sq9q(T~0;lxybHons^5dlzoc8eUiXf +t&5Y%aV2Hj7V*X+gVTYPPb)&-oJCvninBTGrU5zT*+<;EBZ@KC195NsafJF4!nUDgXQfCiO`r{O=s?o +JyY*#s39!dpAkJ{3t~%u5(Zl@>iJPLEGyEkK@Vs0dP-kw;NrTS~FHnb9_<~*BYaT1ZRS7c@Ow6 +(dWdq?DEI8X_{Gyl)7q3rmHf)xTZ-d5EC~iNR7ppE?YHPqJS-PJk{}P8)R?rZm8rf0;9;o6_LnBs@La +TCo@<(sW2mPCJLyHy?j&@ypP-dNGY2OEqT8W97Xdw*h^FGcSSqE_Cg$~kzx_?jIc)0;>hUsKsP8#27+J~_N5IkSxc90St@V;z<#3V&je-RE~% +nk?bhTRa!}W(vPK@-0!4^?UPZ_5(?M{@DhjK28?fsfj;oSwa)H{qQHRum5c~{e)?MbHnct8%~l0g>Qf +uCUA$@EsJ<(2lZjc*9gb#C1@*m$N +YF?UPFFEUjIVF?b8>QhSGE1B~09=;U4aiudYV@UD6#Kbrz3-jcidMmOK_&$}qua +Ni;0`D!LJ}qcC}%>qYYK2Z;e%A3WdrspE%Dqx8t^8Wq?uBa9A6k>aybY^StZX`n=GpocG!INIx(5 +dc)g??=|qP@wHz3PJ`FpGfc^d6Aj +V{zi4(j$6i!m4FbnCtv#PB?)P*aQ +WRLVH&>lsZIxahyl`ayfW(DC4z&H4`hw2`yKZTyWye@1&PRcH)rBx7p(%B6Viz2{@C1!{vq%4x;%wRi +b+wuYI_JInQUNj|y&EW$cSJ{p9(_(v)OF`5KJcti(hoF=up( +}$y?Ti!)+kNR}GQmZGX<{Zx`c@TP6y8{y$b7kEi@X?FY2hvPpqF7G6!t|}3PPU~VRi2)Dhyby6+b_Z9 +riMfB(HW~BO%A^TG;JwjhS2_9Mbkp#lMPhov#ly|cd0jI{LpX5f+a-kP?@kl%f+IV$z{$Y>oH9$-2*C +Ocy|JR%or7t*hzkVPQb##V!oL3mkHR9=~wU1JR{&o)32Hi%37@@Sa%%`=2(jnZdlXBs7q*9-a9Fa$Fh +vXX-|s2Mervz>>B0Bt3ng;&5i_mzR^uOVPqU%Yn!)+%&*YQK1evm;_jZB9UMCtn%RFV^ +LyIm0z2SYWik&aF4>6dlw7MQn*u&=S9YW>~^R6r{l>ce^5>gQ)zX1MhU3Cg+6gVb5$nUxWzadw1#2jQ)d=|T%`&=fvvPf3A!$W2irsC))Niv@%{di1) +;3`&Tgi~xxn|@GN)LC-bBV!xc#e+2kw9mK9Il{M)emJN4Y$4ioQXMLyxHAVKas+4*tOkZ{Ne|9Lry+5 +v2l}L@%hl2z&FSGmoKB+8k*OLC?!DvDY$T#!)qkM);xnRbeDs1iW*>u8`k-u=;5Ydd23yp6RYmklnqo +h6`)}sI|0wnHFRuTp@$&t(-|36uB!r<5ijf2fQv?lT2uva*iDDQ|ktjuw7>bf4j#CItAoLFhB4PN=f` +NBV%5E?8b_v=|E8$&&k4)agndGgbmuzA3XC0^A$}-p~DQNmd)&+U%&xi3I;I_z{qI<~Og5nnAw&1n%p +VR-uKXW|Vg+$Svu!FwU^Wk7u{KJVo5aQ%J0;9WTJsj;7lr1=;?*h%Xej3{!iNA$McM<($Cn!VMZe<=P +d)$up$+dfN8#-?4fHVtjz$2!gFiwv&Sg=Z^c(ivlbuiD6&}_C-SSUX!QM=Ww%);`{1X567-!xWKzr#g^~J +se;OD{5W2z|pq0!H(--IoNXX!H#)nfNvflv`%E$q>j*r_o|ZBJXwL$~Fc=escNcv{RpyH2#}+(qeT%N +bzZ>8t%NeEiz*-c^I@s2M9;3CrNUKN;-KD1C +p3TptR|?9?S-7HUk04plk*o;Y!>cS%Glxg3WOlHWmKDuQPlw9a=jd4l?ib1c0Uj9Tr^GvI=Cn9R3>P^@7# +r1LK4v7oVbg4TG=AZib_}GRJ{n2!(ru%|HZ4JPvVy-7=aAVwdZ=8)CbQwyZT~vi^3%$NC0&M-g$x23c +iBTZ$s#b6+!>nHO=-T*>u*)Bsm%nU!C#vMT1k(uDh&BpmQ(O*nlLyGoJH?)i1Kx1C=tT`-Sv;7px!61%zMh*?;f^*mx9~GoaRI{n2$N)Y8tDm-e<8&u)XohJBeT>@c75fT?6YCCdR +*HQCIsva|v*g!2zCPxCs-uSo#8l7w8x`7o}f*k;KzM!izr+8c?d<5F_>_4XhRpr*;s$yZ;u3^>ougL{ +FNn;ftC2`r@Oloq3x9VhKIF8^ToZ!e8c^>1(XWfFfnr|jw59+Rx5cqL=|o0&v;(^hR(B*Qxz?J3=tOM +h{A;(zct-Qj);7=!wG!P80Nxhw(mq^0ufK)BEJy_McnAhM>Fc@ +}7NRy8#QF?0MG~?b07p1@=hwR^ULBJznjF_h@H~Zh2pj?t}VUHn+viEwM!2LT3B<(LU`#BR}&Ec)J9o +?~%MX*l$FV`xxGKCGqzEONqThuw{nvI{>5a)HlWU4?-Y&ZW#u9#<@tw>dCT~kz_DL@Fa- +8!czSIi>vKx)qhb$-HbG8;TKn4c51&?Ydpy@h^FKOV{!YqV +m}bxR@5=T?f^*de>@B!&VH65i*76;#4QqN!3FC+Fs+qOo? +70-0?ah3q&B@o5e(8b$Kb-)%>5Kd|_Z;8vBX*$dgWhWFGlm!6HP9`2J@p@)R{5WJMbihj#PHE!0A9Mq +c|JM56oGQtCb2GVx!)N1*z5EXpMB>a>&ZG-vM`0nVG5$O!c%f+xr}pjyX%^Gd8~;Hvxjjpt=?He&6yOD1um!AIJ`u#Jg_Mi3LuYR&duRnwuQVy(AI)7bP& +xOJ_dzGj~`XdnxgS2dUW4-Xe9vYeJoFMEuBjpRIKN%Si5GqD25`}_#)2uF>aa@fr53WxJ%^g_s77U&& +Xpk4WH`|0&ttb6znf4LDva(%1To4`}pZ~2(^xv=X%fSrxd}M@71|zA8vYfS4e#f7cb%2_665K3!{*9A +>`GAT;o>zYGZL~f;~<{-ZN7Gdv_buo^~K3#R=xg#4M795*T$BAa{k30vMj8&Q^U)Kdx6Bb$mMQB&m+E +fjl^1X-0Dr-|WeG;jT@>kYup&GY*oA&07~7lrIi&@oh4c*}!~i>vN20#eE1miJqKGoTBUN+~_$xt8C6@6Q;r=j5h#!PlwtnpA +SW_!46Tq7Q=0e!o|LRdN>M>-&0!u)PDf}+<>?tt*ztCaLKM1q0HCbIg{{zFcpTk*W}va0sJtuC^L+a +Z>4Qho)mNNua6imj(0N!IJysGHhGRgH9%qWXmw#p_Z7ap{~DC4RKmJ4x +TJac;2C>NC9kI5s``IKr&r3b%9F-fJtoB-{6IBF=#ssMx4J?j{I0JhhN2tAF97T#SdNyk>`aM_jaV6 +7=tp;bDv=-JI47KP7=Jit@BA9K@19!>q+N?or^>D(*+i0-f>!{)V4#2;CxmXtJmt0ifvgf!i3_geQJz +u;8D!l0dOkIr5171jU-J^zSMtSp!(#{wfbSiAE^gOfhLgvns*giWY7L(-^j|*zTZjt%2z~B#igf3yZs2l5X&VNO!oB0Ldq%&z1 +QhljpbhtyMD%0VD(LMH0}*>&CLrF-5qhU@Y&Q2&ntY +P1PEdaKCw>5$j#i@E4z#1mc6fz!-2Rmx}U%hfZYyFs!)w~9v-PbA+M#8@mN(rIj?+ISJ0yxxhl*I#>* +Ppn`(;uHIRwc2}te)5ggE#ZY*B)6eLe5>_u}|bXfR3;vA)fK^}IJmIp3BE>026v9@dDN6wtGNu{^FWqn?uyHZ8%rf}v +_i}q8lri~dJ2n@9*ifvx-2exL_;UdZ1skRl6n)Nr~XXKQuPVI!~L^jvX@-I3(3Z)*CWv%F2xc!njPfn +gx(zQ>MKY(fj(u6MtXzlRjPb1;fA2kIzY<>A*nc8ZEuG&{aoQVip6_+HxMtof;Zmn +kbUhWCOXR9REYiIN&Z(>gqSRr8jXt}Z&UXS@yoA!AgcEleCmJn67&}ur$N4v-MudCtJV3TBc6I3oYXq +!){i!Jk72h1JSr$A$2i@3U +`|semb7{sH%5+DK{DWu_OQwcJ#x52l}9YSJh;(U9Xnogo>elW77sj}dl6!+&qFSj< +NBZq4}3PYI@qcVsF<|a`Q?CDVuYLq#e}BFu2hb&K!kVr&a_T8aa=n%P8~`OH4bosY6hcAJ{CIiTYZiO1eF$E6xC}S)s6Z +r`^=bROE%GGT*ZX{(G`rKD^$<5X;L^pb6z`A|+XyO<6!ny{H#@cp7U8G9idSYu7W+ci0Ja8qF +^GV2vpt?@j4P?0A8)flB(p5rDh52Fg+z`Ksw$@|;(!Kq=SJOa +-Dm78npdNGY;Q1^woOk{9(r(MA$4kC% +Zz&-A#NbBwE&B>AD25Md3Q6ONh>FxnqgFZoPA9{Jy6V(3*l>M~)`#%k5|97wB-$2?wtl@8AEd}pAybU +qJ8?@brcA}^HCN1lGv2~|Le;!-1pndl;f!~LD;+v|!xi@Ef@Qh^( +(4(?Pps*-ner{(_kN<|Ut$4A7JOoNY(}o3p3j*OD(_r_=2a>o-d2OZyt1oYiuSzI5jLigGr^*n&a$>q +TUdN2L5CXw-^I0T;s_UgSI$LhD0H1r1w6y*${1^^FVai +PIhi;{9#Iq?!|*7-o;9>cqhQ@TK3RBpn?6kJh5%9Vf>!bpm*n3=s +i@4!h0D3j^APx#6DLUy$c|8{Py&r-#7jlUxp_3jX!zUJdn4L{oX4>_ptCq!8O>sY{*+$BY4kS?wvUFZ +Bq1BSA~O}483jiNwW9pqW1(#obIi^=x@stVzBSy@YnK$!N{`yBKezs(R@R?W)pJZisgsXUJGEp{;U)A +yX8)6?%VTQaH6)M4~bIyL+;^A77l#u;qe-x_VO(qSXiDX3qBq9t#&s;biOLAT8maP&~6Z<@f(KwP_X* +`pi{EfA1JIoR4)3AF#8?`ZGmC}w$wAT5W9@sccl1kqchOc9J|a@G#T?VdhkMJTKDL4n9~E)f5MYd(Dr +n^LL#5OY8>nBHH(0pB%_h0u)F-6t{2~Jk0lyMN&(Jx7tS7Iu4RbUg%k=mbL_puhQQTz3JP0Qyp6VOA>!WXXcb*7NT4LhKOQNOxPKj?n!cGQA&7$(dNM~S$m`H)fJ-G#c{wGit29DpV@?7cEH +|^c<#H`!W@bbAkU(v8Lse0jUlK8~x`00UJ9>MqjoAQYPO;moT3~T}YQ27(h7C1{PkF>-vQ~WBle?l_Y +wmUK=xou$wpDpOI67=9gi9YTKzCfF3ly|Bu9MMY5X3!|2AxGq9@t;5+8rITp4ZzJ1k(`9Z4Tzn`Uyt! +E#P=K%E>@)ku~BC#B+oi%OSy8GGP_cuD>F}_2bt6q`CB!wP4_SGIj=R`%i1Qyqq1#)yF*c{AD +u?RDY0b|SCy=c6ap_w2OZ{VFHnDZ-#9tg)?9O8VQ(dRimn&rgJXm;*}fDpZe`U58eOova`eipk{f$Jg*YK19V<$PPO +Y=uL$+8aH4qjGcUlVlF)R%;{xEK)V(wi=j7YjKc(AitTyas6%YtlbADJ#F27 +>;PPv?r?%4sDk#$3m^PWAMM|vSkH(bw2p~W%fs>niH;7G2Jn1b|LK$3uAet`8Na@Ob=hRrJj)P^)Q){ +%`GN0_q{t5OnV;P&_Anz@F7xgARSP>J-PT$^b_c`C*$wo+6~!lC<}TI0dF +{tAor{`cr%H&e0HB&LUy(a^zQo*@IC^yvy;i4ShFF)@O_hAkN%zG({K6H^zY3UvmH7i(os$wS(#ii@33{YPrPXgzRG?9F3Y0pmYP|2@dP*p`^`!3Y1-woC +z|DbOTMi4bk9CatMbhAoq+C~<(>GvJ^c>}=s$n@{&3*;lm3Z2_2ZcxA8KCXAh5F9xTrpTWH`567gZ() +y}ok~sZWl@wFvFHC-G*w6u5GEtaj`e$51N>)H0&9)3X#{+34;lEqcq#6gL~o22ppptp?*Cw=bg3FJei +>P&$+^9MZ{d&}3M<9Q~&3c{zMBFTgp9(Rj7{aMW4roSA9;R9dJpWVV@Rm3c^#)1Wgsqk5;yNfh|_Y42 +>O=8L1Q`BMZ&mUjbTOBw~9z|qJ}ChuG#c6in5z#1ob_HpU;Li@XJamy)Kpr|Z)35)HwLOh2 +EE#L)vBsV}+q!UIy?T$;G+X2ygZzjCe_Rm2EqfzIoSbTvZ_@3pMsGrhPExX504Ru4i$57~4oMAKn?lgNTHBN^^8I83C)4Pq=iD46IFwHEUc?&HBYWg< +=pCPzZk_pv+U3%=>f60Qlva!8N9zDJl@BHjI&5LmNo;Iv +6yfR%5D2RG!T+K+>maiU>SNWl8m%6)%lBWV^TZ3%GO5pGu%a}ku9Iref(WyL$Xm`JAzAeb4EqdVO?Zy +ztT+waH4amoZxL+tE1xQkURk`4eRJEasGH(epI^-n|k&9WsDndK=rk>7(+P2-eP7;UI{N+q)MS-0o1< +`=h<2)T_i&b_D>qioX6W2<{Ldf2r9`D@99MaftNO-z28gnR|gLe{PzR6mKjbXg3fz-#Fh`I#IyoFpsA +jAs=&7yoM{32ilPB^-_82Fm|n&!(vWGVCcoLJ!!9%7G_pXCD}TGBABK%>n09t<6ESTAS|c0O~f0!M5| +3~a1W$Lc;3C+)nf2WAluwNoOm0nOI)1Axcps)BG#6&xLxONkUEx_t+F$1!bGq}R0Ish3y7cPZAqrUlI +oinq?9IS5QA>O+pb>3H8^@nr5t4d)gvKOQ%8YT!Fr*MKIsh#8mBPdKFCd;C^Ur}x7C4z`ka@&B!J3Z;AT +pGbE7)b#Bo9YuTPYS%MO{saH4$3P|fuuJk@0G94zuGAY^?Fud7UW3|@Uxe945%dvfy?E`)c^$>qgY5I^LsXqah$<}N7!fUW(S{$2Mthit6s`SJ42f}*5wrS!&r~+MgME0 +c$BdxAs=bv}wtqf!Td+4>_x1JIaxsN7@W;y7@53wY-u +W0k_c4d%?*MCig#NjrFFgi5d)L$V_i+0ez!E+Hmc9e5E#{n0Sav)riRP9-6wt>^WTDg{Js8Uo`c$ +miP2rYn^@XadW9vf%Fk1jnPNyoq4uMXsVgWuf7UU8ZJp>bimgX8jS`u-C{<@1dGcozWMn5*h+AhIA>= +vcr!6cg%4;BabX);jHARLm$PD;Q^8zc|R490#FDad3AHdJD +Yv2#ksF&G^Cz{;!5EXMTw*F2r8t~344hWbvx=TbKE|AT*l1@?WNa1nQf**?xjZt{-tK}XAl6`$8dkZ0 +Fr)NB^xA^S*>J!V);5+2uZiHR{AVn0QRXfT4!%$83(%0=EAUfNi)kXg{t+_t)1{5taRQGK{1%}D}m?5eVCS=Ov~m2e9~3eid>TkdT6-p3OmgBJ=p5Pe7IyBn@a5-c +r6GysRK(pb~dy%U9BAf|9t`FN2lZ3;aqy2y#@>y6Kg)1KaJiC<~-p-^=fzKz<9;Z~7ol$ixQXj9Pk&| +T~->;^~2C(O#QOv*e)quh(_UBBFu1DHBUhnH&Thx~N*mF-a_gv!rlehz`c5bMgJh8eY^&KJ01LUhk^xr +K%Jy}l{qH9wqs)N0tNBjMTR@k>t4aYcJ8hy-ID-lxVeR2I20&+tJ}fvqII-8DinOzFW`NZEr8$rUHYz +mZw_p895}pty)C3Ck^Mp-j_3wd6iKouk#BYGuzNe%LRp_LQ7=~`kc^I{(0bhzkl +$CXw|!UlLNW{T#j;Cw}2#)ke8*KX*BBj9_Fh*W=}Uc7VX$SZNiS=6U`0Jc4AIx=Z~07>Ok3vhW%2vK% +$q~1*0Gfov27gd5p?j#fss1sm4vW4S8qE}jWIL}l?QWZYJ?CLWo9GKJF@^F`oXTUm(hkX8FN8ynl@GpM0YV)?9rLhIs +Laa{b>VSwXlPCk*nu(*&&IS9hXrw2$|@PXI=T4VJ|=DV3R}iMLJHR`m;`vC80*m`x8zGX3T3F!0&%Fr5i +M%?_LM>B^|;Rp(t=mX6l7vLBR^YnK|Z|Aac{Z-MpWQP3M~LE8gcKq^vGevWI0mZk~TJ9QfAK1vu+q~( +?4^>P%c_2^!fO+1B!kYpGQ$RO3&9iWMH{hojj0gDWMXzYGZ@?jIz*bfVFFvdB&4GP?yH +un`RP$2yUU6b?ew(ZP@eq-9-N{>E0x3%p=iQPjBz`x6J9g>2L-yRj8h7K1d8K7T;3vLxW&cJ5<9NY?! +z)B+Hl;nsMq;^Ml&?Wgb~QL +Mpo_&zg}4lgkxR3tX|TMOGZJg$_Mx>G+IZfVifD72kg3fR#F4~I80pGHdT4!pam{6LF?+HSOHUSki5c +ZuaHY)o;@w-Vm#3~4FIc +Kr;HuOpGrwLNI6)WqAhkZ*Q0E?d!Vyj}t#iw91ZW798qE6XNe +Bfp7*kl(;T$Y(fc`=LMzByb$2P+|i=$QDj-!8J&2K{mPV#wg^|rjG#Jhl)20vtf#q*nvt+zPt6X9S7~ +9_PY+TtL;Ktbo=>CO1#6IINl)(5`ER--Tq_bJ|=>r`%AyfxWLK2>OQN2>?INWS6m_Q`Imk8Iel|trO; +ap?X5eKAUlW($-RRkdB^=bH!8GGJMTp +Y30vl?~iy1{2fY*PrOnOjN{W|Iuz+otiWLWykILQggiR`+=rQ6WctJibir+5q-(ZIf|TjK2bhOz^~~c +I2>k0X2|0KjqC{Y89c%bW)mcerBYHY6mHb+(XVWi5kB-H9&^p@Y$3z8gFGCV9d2#f^D&3GUbfkGe#@AhN=lO%}EVZbCx5}z{h?fgRTF4`D-YYq{6K(%+yzDL30w;aUw9Q +5738+~5(O!1vFfkgMRXN>RB&GsF}-@@Erv^NuPaoJ{F_Fuw1IR?EWE`0kw|H^o576Oa+hA{L^aI_l+a +Bn@^nfTt!fC#y#?e^G-+8@z(9Js|@(R*kv4fhP)-arQL(`>t4eCsW37ec&A9RA99kh}5liXV*!DG(et +clyEEK3~J|VtVHEv+-E}!^Q*r|IT<^PJhwedO7z+8E+s+y&MPOoPblCfWC4gm;#^*FofrPkz$F)1&yk +Ulps&ldc$avhentHNQ;;U);2=M<5sKRO4O0sbtzlhLYRv+C)gNU1=jxiEqnb*qY_i(}B?E` +j|D`_BAY%k#OK0rnng-daU>z1ZODX3|1y9Yk{|v78<@*NL*r1+ipYUL9IQ#bl`FIJp3He +klPw%3P(ceVpE(g+-2f2SaC<DMo26NxRd^CW%iY*kkpQZ4nh{f>MzwgNwFE +E(Y^3#vL6=c5gDBv?(BB14qIa!Q) +`Ap2HQ19^HQ45omWGMaC9)2!f%(o6b|Z9brI#}XO590Bo;7ZwW@M2*U$r)a$>tdLdFzd`_~nt41e4`g +r#1Pegt&aks^Hq|pX^1hjY1ud{H_6QTN9|^)Hubh)g&)Vu+YvqOp@VYz6L+~~8$n|O;t?Tj}ywh>Mat +jnb&o$&DfuhGHJ@_x&H%W`D9ShCP*X7v;Hw6XOlMzZ!R_M^0GU;ygTYh}0`TelH`;;aouusG=^t8|2z +2=P}v1F;sI>NcPf~kA74^X&O-NA{B;b=jOl~O(W!ee*!pwF0Kw%%wlixb<|zAE#pNrE+bNU5ga=k9_> +B~}9^HoKh5UYoXh`UH^~P)nTTt|>@LSRN?a9?#8F3*FouR#~JAlN_X)cuEIa>cnt!y(ca>251rvuddc +hM+nakyie;}a;S92(3dA621)|cy_?++aNWZqXQ`Us3}{RrZ`A=H?^lD1$)|5p_q8JJDHM)s2#X2d`Tn +hV9QpgpltR~1?wyHwR{XpmvJ0`|sW@3FTml|89+hChgc)O1KQ6oLv<1!fw%62E7T=;~W*j?ncuJ!NAt +!RN3e9J|+_GwY9cmHC`TU!tY!+m57TCY2<9r#s5lx!YHr%3~qRrP&3~-+J3GH@PPV{2~H$9VaJflY}Z +QPPTG{8tyapgt5e2;lXa0P~lj4Ac@^%uW<{ek_DU-Z!a%oKkV*c?9C8Lym$i8P1sOvn~+;6`%ziNE!@ +WNrMcB*uK@{gdm3*YvWFxsodCrzY*oe5}y=yar84#0@#6Um}t4sHT+J+0Yh6)b7aXFz^SwCMo9GR-sF%DxwI^?O8>%@RXp#G!m+VY$qpCK-CIT)i#XlEI8Is^F>QeXfNhynB +NG>bTEO9NICGLcI|Uon*7`0K2q}0rw|Fmun2fO>U+!DHq$)^3qeN~A>%mZR#-!{Np!|*HDNUaE+;3v= +`%UsLx~G0$bEJ$?YPMSfK~Ve8|9>A2SM@ANyJjqBZQZhu>YFJZzRzS8(#-pXGC(0Bhfz57xm7k99d +skLudh<1wX(I&~`I$@pg>_3pBJ=TNiDRk2+M47$T=@I0*#$kkIoForQb;q&K%~}`2nz=k}Svw+SAggUSUJ_SxUlXb0j}C#P;> +D;dY`K#h3j;?O=jw(7t*lW!O5ahsJ78q*yrzP8;u$_qf*r_L(Qjn#gwnZM&(-qM=xpx$-^O*8%}5q~{ +^K0f(;ue#hiNK*oZI`3w|1JodoUD#{MQER`l)_5d{|R|FJ8$XOi>l}kW_y>lRvEFzO((6#r+Su4~DVm +>)?;`{*q~X?Z*)``~UrNkZ&u$wvbd!`g^kO$M|{%KS9X|r|^yeS6beWW&d*DH50jPI$sB-jz_hG)0K?3Ba!J`%RAv!?@hF#A`ql) +LS)6rBD-sEB32pU|hnOAGK%dfmu6fpK+fx@uSNF=48_xy}$+{2u*%gw>cMIer#~wFQ@-$;cmZ78*yI1P86tqrO{V +cZc$5n)=m<1v7Ei}8C3U4-0!xj(&k&g1JA&Qo^8A2ZYuMIz@J&vs{uPjQopZP3E@lbZ#PS|rCF!HQth +vmz1@>O@Tv-sIJpajYK&lKkVLNLGvv@35w0Y&d}Vcvmjlk7cp@DCf{sy6ck8I%z{vd#W(tL%HkbLKl#}XQZiROrndS&5y<@hYLRHWRRm;1A2M611`wT_PHi^Qc8 +D_&*~D32?2IT&=AXH{~$K;rs5hUb!Bst_GD_-vfDKIB$Xj872(7u0$%AM2BGC|m*|>CyuiWRB)14$+6 +jTl*I{M&3x%ly!M^7m6d*>^KQ4`8<>yPUXkCDPFwSht>Rr+fH~YEB^=-rnD-DfMth(pUZkDBQ3u+ +aA%BdzB9&ulYss2C5h9RtAf6#|?4fAkga6CY_593!`g{Q{nVnq&Yx~$-z`J=phLyrewp*BemfoD;EfP +OtGzarAbku+RX>B=KbZs^4i&z5Z!#0=^S2DV2c?s^q}Gh`HHGbu36-z=ZO@FregF<4U!$LN3Xg1@DYm +4V7%`e|1tRe!PkiXF`+=U&L^SoPD>YHh9{u|p5#>t8wo1M*@a)3N=lBR%X(@f566iP@+AbbH +xE1dt{7a;ENnNFGpQ__f|BYf5R0YG27tLOs$2%LiuEhciN)=6sS1=*Z8JJhUret8BW#Qsg>5LAr5TyY +5NWxO&Xok%jk=u5I!+`c{P#OMjsWrfp07!@xc?oduh|2!EWk?cuv6{@9Y@;wZ_r^1mPCm`>#8u=!~NT~e?IKHp99dnl@M1MtBobCy(4NSz~TgMuC^J2t%)}IXa6g&7X0Ky- +QP*l3-w8C)5GrPz%yjKFh_9-E6#tnE+u0!#A#ON=XHTYsru^{XRFpyHc_Kr_R#GCfhDeT*K00Gz$f)1 +jaGo@F&(ZFO#8y@Vl}$s*d|Aro8#~|pLV$_#iBZ#KB>l6CH9>vpYcUwr! +M=N$9lhrWz38Dh1CCRE*=C_i`x_Ld(LXPIA4?Tmb7l$H#dBTG^hRHlz%>B;P0OD&u0w$_9;se`h|rtm;LZ{ezRfpqoU&c`mc5`7v9TE>r9abL-nezM#@52`>SYS8K<_Myj4MA31kYE{?Sm7fchV +6kdPPW-$!+Z%UTry^**^?E9)YB6gm$S +dP}&;a~pVfvGX<(~(QBE^XD(kM(X*>E-cK2tH}AQ^FK^?rAp%6z+t+M+{)K+KeRx +GN^N}Q6Z5CzIJI44EL3exe%1;Udb>W?8v_~3K*Zq4Z(^+f8lF^f=QvM?3;6HLeq5%u+9&&)7*jNBm +5&hd4c+b#e3qgouTs76^yonE_jLflrT6p}aM@J=~=@5J^@CXRB;yaXrv49Big+Ng#?{oS{Ra@C?NPuR +m<&#FJ7Bz!7B@&{Mim277(bYjVF$)ZAu9WgLP#xsW&hpf@_|dul@rJ~>H**IB(+pM|Jo7zY5UQ6V^1C +kJS9D7iQ_i+3l4CXC=XBZdcdaA6JMZ+(gwMz{p`1haVeXc>A1h5bVZJOky{HBH4wUJtjmmW2L!;R +bGCm~Po?g~1A-WS$rY<~qtiM#oj3)2TBbQK{R6Pb?hxHUC6ZpXsZ4ciSUce|R~zQ^$R;ZY=uWmD)$8? +)i~1(=P3AZV7ZO)T%&%Iqd8QbLJo4TrCV5N|HEgf#>0BVXJBvsNl6e=K6}OTjSP1^XnaSB8>HJM4BzRR4 +f$<=5Byc4Cr0;*CKc_k+}7QIUGnBwi=dre2dCacQE#z{fY^ay8vFx8_a~F+&cGI-d&|eJ1@&eT{-R8= +UEr=DwaZxiWuiyj@!ayQUqYrYkB|_>l_qHa)A4XgxPRm+fDcUu-TJOif}RCi;HNFX&s9U8xi1`E;)x# +hn~UY4%Vj$JML`1CB_zI<2E(ti3a1c}G8?JZSa8PZ#aK$g-2Dv{Dff9&&1gH^m)y>Y!E7LEoHgby +rOuVQ<_4-{)370-9Uv-*m-VCn^YsV#m{n%*@W6zhY_=QgWv+MW#@mK^-9c$W7K2&#)}MK5*Twv{Xcbb +pfI;J)kJ$W*4wyJzQ2L`w^Yg{kGB{6plk6XaQ@*Yeql*_^Rew+EZ}dYU4W0g%M-R2C;NKm68dw7uz&#UFwP$Fh+%W`IsiW(BV{;t57(tc=iJ(xg`Zy9BbJJuXS_ALkI2jfP{1=VfFq +cBb|9<5eFEO2Uxh=<||qY#+$1>fvT)Lux45gv}oaX92(C4d9p*30HNeK9JRLeS5W4L2h`OGK*_{m7BN +vzOclX$z3J_W*vaLp?RjbR4ZO@pdup+=RMpaB> +cvQ5A-d)x!~1_+|#%)Zj{}`F4YzxQ+c1pW4G;HAaCeUz7U7A)b^n8n2+M4Kol7}wPSVqNV~x5e6xN`y +Abs#U&ZzaoDywe!{q$hHM|jZwY6v#zmyL*Cz;KBOMiRvXU_$Gn`-X%Cy9nPuPyK;M`Pb0S-5fs{3_<4 +VN>mBuy?;@uwM1C%NBi%S7%{D%ajk2@v_LG0^LBQt4niiF +;&9kxFiKBfA=t8E&!YGLt&vk(4ZJ%>>DWdUBP8Wz-Jn2vJQ;vrY&(K4swAs(Mro?LE26XS6?4uAsD5k +@^>AGxR0?d;T9((vcQb&HvEe{M|Z4h14}k9I1&8Po4qOYTjCuoKxlJg!57yd+>UyDF03w`y0CUg2wRsy7N`iP_bod>d#w|W%x)~ +AvLquNe;ve+MFs#I}v;lMWs$$hKA>^e@>PdZgUv=@EvBZ04k_d7AgK6o~MlYK0A=2U(6^)I!&d{KSer +I6Qsj#`4%wc4er?mzd7{%srtd;p<;6$b$yK>e11ZiTofVav6Jnvk>HOg_FQ4Y +jt|KS)x-v73!Wr_*1Zyk;3Z!C7WaV(@iA702$+(Y$nF(m +}^5$f;vsD2j#)^?n~*>HoERf$+rbEJb;z9YjhdJ#1}tj9ugTNiiM +OOcHmYeT_-(lvq2#gY9}t#L_OCJ1Ys`gH_+`FI9=#qk{UKeD!}zS1+t +T_A({zqBlB(&K$l(aO&tkMw7l31yuWi__XG$p(ly>h?%<0;o8^tpx;^*n~xW0yCM3X|nMrC!pG096{S +lSo@8+s7H1rLy?^5Ad-8-&rg!=rIJcA8=yH@jlobVyc}LOSHIbhEe96YE!YC!pB0s)cRNJp!1?+~6FY +40s?*%{iiUa2@%gR8P+s5<2@%pn;WYR&`CuoF0xj%WNN*3%A6N@k#d#Ko4Ys`Ib+jSO|0L+$2lR6N9Z +*x=I(dC3a_lYK~6~llW8B#I>GH%JUJ?ykafxtpl(PVjE{&J4>8(i99%jty+&PMFukj;v+mVyr@0 +Gm7Koi2IYHp%V5&oTJVE>fK+`P$eYnc~pUhGHrxyPcJmr4QNl_R|!YE9k8y+Qb7^BEfiFIINPujr9UV +a0Ey_tMNf<*M@ea81>6!mT<-x>Xhf8d|D#AD=Jn>5|0XLiCuVt*a}W?)XiJ^KW`$pm+rg77`*6Ygm%V +gs}BuUg`Rol<85o+0#=#UOr*SVh=AQAi>C-u*G!d-ylt9KU5xp~kpGa9+6n9T)XSHmC9IyL`3wA%Ru$T7mJ;^ +0W{Id}HeaB2&iwiRLTK)(jQs)4wI86lVSh=*{l3)s=~^CWWAqPg+=SrlM +`@u@g$oP>m#uRm<*Xu^u|<5Om0RdRAb~oviDu(E!uRG_Ht62MLXMQ|kbKCWkyR&QvM%48An^oq_zM#x +odMcsrGm)nqRYEWYke4$>HaSUJymo?bs95LJ$s7ca%r2D?sSK`hw{M^NOt4R*R4l%oy)Xwc@PIoDAKz +GNQNCZL^-#BNzd%%zGm8t)`RlxiCcK2FbpS)W-<4~yUC^@@yoIqLFL8PfnZ4&P*cFGlg?HUyrpPBIj2ULZ ++pPF~VpQdoz?1hn+BF@U+fnS6HNZ@(MvbkVh8oSpVTm>W} +0j}(KRy>O(FIeq(NKY%Q+!T{7gI2QY?ZbAxE8uj>uKY9cM6Qt|rQYtl!tvJ)|G5P)%100TJGCd%RQ^} +g)?X)IKbIc=!!YU18SmY@n-A^U{=NSv-~Deb^x>y}caiTsI7t#1j)E|?Gv*->2%?{M50m&_quHG!xHs +>l(B6p~y#GgEN=wn6yx9rq_W82U6HCNDf^hHT0pG4X3HHVwg4nZE(B@9TH=|v!7ns8M9|5&@6rt4K=d ++o)Ur^&=dovLp?0G6U*(D{yWUoslZ{hU_+Cc^Ro}k;sB=NmiMI`(7T~adM+ljFBEnXSyC8wRwDBZ_+q +4&rePW@$*5VA8Fk?yy|Qu2C*;1bYkcmFi8l%9TS5_*rnmbCh^B_7-zG6Uw%xBuKv`JbKCt$KpqowA#Ml;`ayf2-$|+@iANhYx +LS=%On1BdV= +-8ABtXK~(cfOBA6dRb6@R$6m5h2B>S@k&eDP0^zCG=Nb*$DmVoeX5%mM=sc;ruM60pLn>&2sn2i*{4s +P?NKmm{c^-793ZklASPal6+c;pRL0bv8R*mwU=c742Dfx +EXOQq6YYig-12x0F>^gsW~L(mesk~Y>q()b?_9*$@3^jAh;s`P>2{wq2`2^bDXo|o-;10zz-88{;BoK +n%9P +IVXsp=FPEnzpwLwjZ*IFr$25*WNY}+B#&sP_(nHFzt_fk(hZV>c9AsirIUi7);nb6k{FYP2}+vlXI@M +B8aQhk^50eiggK4n6+R*Wo-shtq^ +F5kJ6mGK5BD=v4vg+i=^;wXB@32~8PJ!?500#JN1e0 +;J#AHUrHiX=Pk(guiEfpLf>Mo0XhT1z+XzGIu2ZTOtH?xl=SHF7sgHmdx^CMz33S(OE=3q17J*}KNAQ +LWTB0vn{8YKjqndg@lgb#sWFqna(h_lLKM7V=*r$w2cuCu^*cG6t!;Puq(BDlsxbIAtanzi|h1=n6V@ +|k~MVwH!Y$UO`xT^gww2gljJVQ~4REkU4%YJxQRL};{q!Fb|s9DxUBpuSvMR8ht`mCwFs5vTrc;dpet +1@~7qtjTnMN{cCohkZg?-k2mQUt*(tB)tv-(L|Rr5=UcqdgO&eKMv%2BBwO#@j|*j;n4&GY&i3Sr(X| +bUeS-urQ2z|d4J|fl|2yP%K@2|Qe9j`nv3g_9WJ`l$K~K+<-y^vNEuF}6zYn2h-~nPN3X`MUvUDuv{Fm6_6X`K +g;-qkSdbT^ZZ_c!Ff<8d3v%mN{kQwGokTAbPi|6yqMp(kqs60vcr=TK?$-8T<6sG>6hwXR#v6r>HJTV +kQLq?93C5g7|AbGv&=^amUS&Sa`tqaY}*qb}Po(Zcft+Za_K1gp?iQj$uj5Dqt>rUfc9;K0Skulc}f& +IPy9Ix=8Lc(WIH*04aiJrt%1RrL4Qib_|1gGVwPmlfMPVb``|`2sHfFLVpVyZj1Z?4N(dsV1$Gam?B^ +ZN8!(tJIPKBkf3`Nk4WDwKIvZO+aTUfW%6zpf{49xhXns1f1&7w?C6V#_BCMiEux6NB_qN&VM4g0G78 +)Kyc77{W|Zt*-5|VSzh6K@nrleUW_Y;@Qk*H)#hTYYFaV@&{PBqe9@{frUFN1pXaZxT8Yg6 +IjUWp!yRm%$CcEUVnszU$z1N4lI0+X#YE~a7Tr}Z^6Pn1+{+8A_IJ*k>Q-_;heaxP~oN`+szLsRUzN6 +)Pk2eqOyusM5c+C_ZnlEQLL(>SA0(b2p^R$QP$vSt=dr8-`f5_^20S)dGiKxL=hnap#&EpRzZe(5liM +D=ez3=>Ueyx*9>5jnmIf#B8Xo~b-RT>@)s*c?x{1j+8l_Y?EU$yx{Jt3NqPC`9R_}$IQqGwlZ^r&t*7 +RqTUME!&BMXHgOQ%&D)|1O0e@~Z{*|EOvB9Cc(Fv#PEo9x~0P+Wuw19iOj##?r!NLnhuSSy26ca(5ut +Rxaum(HnV;q$P_sFDKBwjdskY@QhlHrYU*zSG+G8$YlHz)^OBf8jC%K1KY6?8zKw8#qi2sTR>R>u@`y +XtQnXU_TSh}(dF+eH5x%l&Mqe{ZSp%{30ABn%TMg(4WdJs{YpTztu!tQUdyoHZ2eZ55lT#oop=eH-d6 +oQA&0>BgJQ{nT77B0e}eaa_z_l<;a8XY*@WB&L(RkX+U$1q{&ODMu~dC0e*4HnJGSrTd9-r+*W}*b4k?-fwP$~K)AeoS6=1XZy4x;k&p$WJW^ +um+=39_GUp_h*S!|E?ryER-o7r+d$YS;;M&O?UEl9q9`N5?-|t)=@T)jh^rty4*}l3TVmoy4Zwpufck0CSsu4rqLe)e&Y}(CFaNzhk04 +M8!magj64N6wQ|R1>Cu;8(Gmb?C?er{PG7N36r9jD3ZguyaZKiW+TNGf{nGaAb-iABOY`SLyF#!l=uZ +wsl)jI73J}fod7lRT2|araKVGv7!hqe4bCK@Qo$sV32KQTwXPQGiVv>q!zP|d!d|>c%$(T0-2>kSsht +ajlM&-qwa$9MqVt67atSvC)5L}k)g}j4S@Dhz#oeT283)E)z8@0xFTKBm5e@$iyiHjEK6Y +5POvxtHf9ha0qLZzc^UM?b&7y%qJGt#_=D2U*XO}F->9;n3h?3R8@|J>yf|WjStFwNbi6~0XZG`EB)5<&ejG+^*XF9SjJ~#5{nXFv}xH4F7bYHAgkKjtHahZ&|%pmj{|ePZ;p +P54ogg^GB&<;v;KJWDx3!KXkWanI?%e2jQuIJrGy6ebfR_qx_^#+p<&26QCyCaTw!rr2Z0U7);DZ%Ni +ptTDq4CQ{k<9Ry5@(`?p@U$d(6WPPIPT)Wutxi}y*-5IsQ8OIl9H&vdDti=vv!+BvlcvL>i5DOAOeRd +WQ(k<9Mt&~01*0EoRf;P+092|n@Z@4hTkA^+`9ro1Ug=v2$!2eg*`n%Bar!XIZb~?lD{l*Cl#V`yevC +nWLM(rpOhTr@v$a}yV+M#0v?m_YPXGrbUn+@uv8z=-n#f@mR6SZK_9$v@L-tPgwp(BLufG)!K)(hm_D +6)4@K<~C?d|w;?RS(B@J^{Q}baq5HU@c5ukR|~%@8w#`C=?9Re1Rba_2&$M +cZ_+6y|M+&2(aZG6?XKvLRMa=DmK}b2gU(}qp8&UE0%n2_4 +)?z@%I1LQ=;f<6UvIJCGW{^b)bjuZcqBYUOrgbn%g!mhA$OHD6IeM4+H<1z2je5;2T@V=g;_&C>tUO9LFJoA`lcssa;`cGs++WLO4WW2=S?AUAmjpEhtXVJ>=f)^E( +r}GswP$=XTMdH-qe3_U&`cI&dH2z~2*^;oI^B&_3k>z5C*z_Yq=jPvw%(JL!tNHSV^+ANrM9j`pPOcH +A_1r-H#fuHOvxK7q3Nh%d$++^swkf917>sXdzzy>k)Uscg?d-`pNMvDjN3IEdfLf%JC@^FN6KYeo_fG +^(yM>Qtr{9u4PDEVJq!)>|ho+tBxyaGhOL?}M7vhN~w0r%Onnb)UWX5Cx{^FKn~=0{pPCWK`9pXEFOq^|i!eC{V@CU97;3zcFI(gxHG7n3s~XwoBkXSjWy +kT*9{VV;{Zzyzigoao{iYh-6#D#p~IBHUqDA#Pu3o*sA~<`Y>d@Apy%YhSxKGnz+q)Eap8#j@@}!g+a +>uB@ARR3SP&>(riP|39gR?s289%oh++$mbe;nwyOxIp1Kw^rHDGatIcLgQVxsQS)=Yq!1{sjSAJz;YDXH&!Tw^p|o +^5krisUx;e9l=0LQ^?W3GcFIKtaepWpO{f7J7zxhf-$EXR;5*To|c!MC1wr=dWDIWr(vk8ozTsdtb#z +z~#wHH`(o{vM|=CGt*|95lW(d8z(ZawE$oH+xLL$7rQ1d)S86q*r51_>d;um3=Hxovm(xci*D*8NtyZ +5M(Usx0kyKWT3$J7hX5;dxB0_G#O|{Ijb`ec;fB#vNOs_RnE3;rJ=@*HZ5T;BlQf>r#(=7hf-eJzt~n +P%5wZ2v$Z!-bPeR#w8f6XK;3l8*`0i1Fx>BwZ*#aYmHMtzh!|S>Xdq1UO$w_Ki7Z#OMf2lr4;^y^TQZ +1ep$_@q8qaUo>zZ9u!luVoR0rlK-M0Ce{=FLy^C(kgX0AFlyiqYbD6`z1S-)J-y7E1}C+9R11Bd#fX<&W_7G7#!&k{*g4+2x_09? +j~4!}*qXX?8rX39df~7{KvqaI~3MuZ^i2<{+nhDP@m&jx}wJ~?+WD=dwW(ikSS;3XNrdo_E9Yvl9mPBmy1WK6t2Drm4i$i^XYtIgagl`)C|*SxZ^~RZ)`fftuzTHUR~CZ +A$R9O7MjCTz>|i3ZH3~*PGqZk{6?xn%MPnrbXbYRwmKM06g#K=+1Ripmmmm5AaR9a81gy-b3kG=I_%n +Q?{MszkJzF)pYqmk6+|=c4Yp~$7>tE`f{?+jcxKJm_4>h_ZZUTCyMsJw&(|K`^|#i(>Dx*C=A7L0)Zi +v!Z8ZQh+U%t+796uO29aRmR+A|2 +Qs*GB0c>~4fDddIbUZHL%P@f#D|3*gxv5N|J`zoKw^ZzZ$`#c;fLVj|dHJ>SUNUWSL>VRgEfe3ED%<0 +Z1ab_2g_KgjNyvJ=W(yaV42BqMZJ?%1Mi9N#6`VEPX#`E6t!?gjJ|{Gf1W+3tN_B|~0)GFC)Ax&k7Iz +nGh_&pi?az6(WpoBy){v+*IxgKFpMKI_yu7F$H~LG`ZAc6?VgvlH8(ele7krSX +?BjxO3)<{gW;T6uNRiG9%b&mMqZ+%30AEd}bKbb9^+g}G{5a-r$Ba-Hp?Bd0_*QwT4Eei+fO?#gi|rY +;jd&YI$dk-`@WT4E9d|986(iIefvflt+k4}63xH$9t91J|DYp+p7y9FZZwr3!i}1C8p71;0)umuMGJ* +6ppTRNbKv1#ck>O-MxG_h^tk07koZ`HokdsIZSX%(8doP81^6)q(aSLraEM~WGK^j(&ITCL{wi7>e4gC$$9Y5G9 +kZT;UnR?b$bZ{%>^{sB-}dayd}eBqk`C|)7RVLf-@Bqt0n0KXXUs19Wnt#09FNY23^QHN@}vw&zs0d0 +fRkFgFpFO5rz8!gD4;Kj+gqlytryS4a@*e5O3dnh11qY}VnKtOVAXAzgWcK7UwC1i2{r7`o$NmCq);>2TcHON`|Mk^EC4Ib#I350_Y24 +2d@!!7cTNwQ36+ec)1Wu7KiPPI}1P*P#!5f&;Bu-K=gb;gH5~4qie<@^#oiy8n-vrq~W=}t6d)0UgEo +pM^|ADa`vPk3)>hp5;?u<_FdIKr3ue8O`8~S4Lo+HHY_jS>Gehu0YF?kzN?J+X?M@s!F{te%w9u +2A)xs_Ottxcm^GGno~w=g|NR!U2p7@XQj{Fq5cHQT)$cf{kkG^Eq`-c*|TnYz@)p8&GN +%yg%ZXFx4&p>@7D+dHFH+{c;TWF7}oFlcxc`f1KYv&1cj9z|Z6VU#I_(<5|_D(aaNkAW;o;Pmk2=A%^ +NQgaa?o!gk6`zd{|z4zCU&=eyRYmkygX(0(C9)|xqs%wX(a&=JI``>B7is&cufclZ9nt5nr=&XYq^|s7%Ve`QTSBksxS?iyB#nz=Ra_p0h-!T1Pb3sZ1t6NS^tZ`{qs3Z9}` +Bv*cFmPf?F4Z%Uo8pb^-LKDxt;}bVgG$~D%!*8DXuGNkoq%kK>N`_{^?0K~#d63_Ckk%x>RYp5(p}fu +i{F}K>oxYNuITPjBA2PNPm?w?6Z4FLR~Aac>J1MzKWCV8b9BUp7QWZX*=|B=dD_jY*mr2Ve8J+rqQQ_ +m%4pZds#=^n47hd=DmYXucq!==o>8z3C2(A`;f&+8mqIT)dcilzBIZCHF-&{L7on*A2Slv*${l)OWt& +RhD7E?$YRh1__5LvJ$ho)Z!VgE5#3A$1BTHGLh;qw%z0VF_Ih;%zt3|2B~Vy_xHXtH(3sACrd^9dFdxWI=%U9)?%0Rz3On0==H5JH|7AuszEd6^-}f>;X;DLno~leCPxgVYuMr +Jmg1v4~+RH0QLC?DeJ!uCUyJoc$(0j3*k{SKF9ZF2;RD==(N85vFCdt +-%&@l0>$bd5yS#PT`C`|ZdOyPEWs$}JbxSqoXd#y(s+*$gQFS~RNbq9GjD}9sMGZ}}*UweY`0R>73FQ +*S*)Fn|O{ZA}rkpVlVaO~TP95AMdwpFd;tE_&K^9-o7l{t9Z0r!YPbO}@j4(X=VQJPFRAIc9(;$Wjy( +U~QFYAsaNKQA_@iAU4;I;_OoF74o!X>hwI%&Ct2V!pO1cG^ZeaYNh9Ihg9k5|g?7v~n}eGT=L->Q(Aa +43*aPyFClL{(qz)edLj5N_QMq9d@33U&SQR= +Ii%9W6uUt)B?Z>?#hwN)my)`4k1b-z-W_90VT1k0*_Hd|aJ>P1BF_+F1~P7h%(i1Z&4W=4sIubih+K) +gF$$fH3W~r7omoQ3+TTw~8Zxned^|5N9RO|Dzop0dLWpIShgHj7@AX{JNvqZzjwQwzygC~MW94|dn^6 +erwtW_-I%~(3OO^!?2!ydtY}W^%n`AWPk449{lg_1TZ%^YbKR=5x1vgOFNb+#CSh*euwT8NAxD4cl2J +ACUoy>(7IhJ>xzB4|~&|p!%kyAR}oN=LAW9)<_i&_^am%lHA3o#FSEP~r=B+~#K(Nmxtq;ovtu(@byB +j$~Nki-B=JW0FPoFKq`b^H5`gntqm@ni?#SE7*LD!ib|tEq+zSzVMdCd +>k5YSZn#F%$zpCf%`Tt~Z1>A4?R-q!uot7c*5;KbLQ7-h>rNYv;n;o^=e{SS#Hy6hDS^a(VKYR}tzHh +vRoEu}?NY^fE4*h4uslKoH!V9|69YR4{qV@lVILZHC5vR{(lYT**coTgg4G6A-z;9d6bPXe+MMdY5(3 +F^X;lo*-v8qt*1#qwa*=Es{2W-^2x!ta<@C32$VIH)kxw&HkJ{fl6)hylL=!3+jtt1s~}aO|&L;z)r=2qAWDv>VQE)+dY+vKCnK`j=<%`j5+30r9Tn}e=9)H1icKXcL#&wqkCd#e%cyu+s!E7r=d8L;6?eg~F0*j4NrZ< +DYC@^995zf1=Cuja6=9IZ5r{6A5jc(hEu*cRhXw7#gE}$_Q(}}{s7m;BUi&Up4kPSR$t@bgiqxy_HaX +Wj?MzR(>1-Hi)RPCIC)PuxL=~>^kszdUjCJ>1os%HfUowiP>*~tYEmNQCBP5^4As*J)QN#xUs{j?OUB +cf7eC~=E<8A#E*XJQF%yqCI*I=9n17V5o_FO&10~^~;b3|z6`MQjL*4;~B#w}ld(03cfSUHkQ{duUG% +6j_VGojDiO;TQBs-#AB0;5H}LyuXoOpm;RNcx1m!2()G4Mh_5#(J!mc&J0q@DzBxEoGz?qC`rM?7V=O +57K7i7=+y?PJtd=(KE2Ibw>!OR_=a_$wYk4Ry@I{*lg=(9^~SsS@5pX65mnbaHP2S701C)A24?Q_@nE1qEuAdJTEV&$a2ZQ6&IB4 +_?oo)vfJVJ<3nq;Xj8gFJZgCaOBUbEDxhj}^Bxl3D(9m-hlMr8q-+pZM6*Q1I^87D78~+8JB4&)Sjjp74+2{jR@D*YkUGz*YQ_I3 +Y_PFBVgrDc(yELvsF-u9tpJ*Z*VEw6hf8*EB`{Eos`n2L2n;v_B2-_ehgIB_(raZ}Hckfy}Zu_i;O)8 +9=@n1;d;(XEh~#Y1A%o(uIn1|0pU%9VRL?3UdzY3OOH?T38}b&EWe<-R|dF-S`AZbc@T(WzLGj;eHVl +QMLs3D0orvx+^V6R*Y2Ib3@>Q?OW$&hW*8|ROEQXh_GZ32H<%O!ML%78CDixMl<;t-@7qFA8+4bu9~P=H= +(NITbOFf3Zd$*N86C`yxPF`gS6_wVSyWDO$E7aJ59gx`nC{(p}LD2|J?#;X~`MEv$u6Opp6xTh|#YW69`#jbuu6?#}4YG77hmK5CoTl +lgW$A})uiB^pJ$wN*Hd>XtvrJR%Uukh7w@KrG-dv^r|0yy28Pz66HoYa+=F=k+h?q$G?B6;oPu=lzaR9Eb3RGC0H{gcME01+_UIms|QuP1eKk_c?# +!o6So0{bW93ogfebTf#^7l1MU$8C!@7X1WTzdQE>s{VT34~T_eBuNwW#e471ScsRf=Gf +uVTAnD(1d!ceP?gxf_)h~jsGB!eNuqV-o>G}d%K>^Gx?WH)$V4?&_8FYc&9vm7*6fenzHBP{ +TH3W^DM5+^<$vmSnraJtOR`YIasUwWvYPxCMmuTmwxSDWxupIe32CYc1-7?8Tetiv@%TH`a06~o^8mz +sHwk5GV;erXRD9Cf7^2ncJEREzP2ey`q!@9e=`0#r@;e=(DkL<+_uAx71A6uCTp(Ey;`P1l>%3^OzOp +l>>$qW(yNrv3X7bmAd0I&<8*C7164ELx(O+=;qDAXWR?8IOS0-h5413+9zjZ})5%o%xM3lKf*@@0Ppu +svR$)YkWo-aYy1NtCd6eE5TNF$xrgRBSc|I}0YCW#*F$`;MQCzjY8O&Lm!Q8X1$jX4v6cN#b1$f=JaALnJzX8PEBe~vCqcAA$gfCw-5RT|69OpYVjx>?0F$Z5rYSaO#k7pDbs +kK!oK9Djxg^yf*wV3P-27Xf0DL-y;DPR6;~8eA6R(=r|HK-L{Tn2gOs$Mn#ZfQCMv +#`C_tt5F2+$@&5pr)7kG|e7kLgN1#UlX08XupB_YpK5@;D7Plvn +{S1HVHQE{}~S}%RD*gjD@6q_zmIUGJ}chM{gX^DmLnbiP%Zw)l1kw%6Xet;tIW};=s27D18+}G%KL!V +yb*3XSQZd{~Q8Q4<-hO9y>=oV?X8y>U}{p529w+To{td|`Nd@RumD^Fwt8b^DO+r)8S7%K?MUAByFA| +7^&f#l1_G!HmE!)K~!(S=`EL`8{Fd>&>#=$<#(E9&#mYRo0Z$g@G{?nx;;hM9WS8&lhD<_ndTz(P^&H +NaqjOfC!0U(eo%3tH4oH_+9?)NSlk^nysH{H@5O>A=c!JFh +wSuL9#^Ro1W7&$zLS9VNuvpmTF=-o)`2+qq*RahnHLfz9wE>uQ3ST&gU4*gvj^V?F@j_8A20(xZ4+iF +BVAH~9n3lJ3I2H)JGHI8$k$}-D^*0Lz!Fq#EPn%!_P=yH1=X^}JS!a*Z*gf>#j;I@JFaC8A&7F5A0f~ +UNlAm$%(qT~Eb+ayi?<%MF6!OCun*L{5Dv?w=WJlmtA`0dlOt8{FN?k8u_J|l#^<5D= +?5ALxmvKRlhkPpHBac$3`8uwY`7Kn3TQ0`zvFTgg0XnfK;;TXxlNa9P0 +=E+<$A&{1RP#jq}`TV@m6fao+81#`f=Odw=U`fbSpYcTe+AnxcB{9Cyb_-Dm~7{p4_7X!~{8g6YH|I& +jo6MtTf|-)-=My@Wv-RtCO{b6tpVED9rZ5ZfbbEDv%FuOapbj#JYvHk%HDiuW?4<;bazWLbOJz;F^zh +&l__3%p+u4oXn`F0E6zvAE;u98>ujIYKOraIfSp81#az7Ue;>&p0?vgI0xImfJLE61q@P<;Vc6S^K0QB!q9W~GCoX-G-HeC=@w2mtH$B +TwmX$*i{A^T?WkL-f|_O=&8z@oXuIW9S|?DVINV;9l&1P;WH0wbPc=L3r +{LUgvUO0-o+O&yh=Q6qb~G%yI&16$*KoR^Jdn(DBaxAr;}&pta^JHDz!~}17Bou_ +T%SI3na{V&0_mM}Q$r&d02r)aDy^vO^+dG|{kR@LnR1CbbbH&FF84VP4QQ~hP#`}{vV)T>v0SfQ7bZ( +^?aTw&kF~uY8iA3^nZUOwiO*simGF?gQmLUlP|P}itM>u_sdwC$rl`;WYHH>L|J)n+&}c?PK60gm*I|w*_4<_9cKFscx-$<=8svTV?Fd9NPH=wT0$%iBZo?`&6fz~j{2e!(V^q(13RD7e7#E5N +qO9wRmOps81As&%BgZ}^b17|edQya=mjhY4i3TfA$l2p~ +hDuV_d^=;5_2K#ADwp|Gxy +0wk?MzM>eTwU$@c(MxiWE=Txz;c{l6gHiZaA;Wj45R&{n50( +4@C40>f#&*)Q+ugo%K^wz@;Jto`K<^|{y3aaO_J?d{2PW|?*Z>^h4*OCAH;7JFhqYh*E@bwPO}*O(Ti9+duQF~z$+WYP +T7xt8Ml6`r~!WYqa=n^%k%M_V*a88!MRo!`Y;}$Rv)j&SZ6!&s|~F4CGlM_kjWn*qtqvpf9IH1qdZ=9 +HvUK%oxduGwNZ2YrhxG=k^_86OdYq2cMrVe?Sc36F6ho`7wre~X^=T;FK4B8 +igdaX3$91P|^3C9PWz1mXb{n7DsoWaOqQhK(Z@IM(@d^abzZ>fQtvem?U7M95@^vlN%}g|BpYIk|Q9S +BKp9Is6V&0^D4?{1Ax|HV@3{t#Y<|IQZ5fA7bfjtz?@UO+S^^Oig-K^Pkxliz5yKVS@fsc@f(ZGl#=M6 +BIR*^?B@~+$7y6B|3yg-rVcQ1Nkq`%f6xfW)YVAx5-DS`wD40IY7dSNeCo+EcdaCagDXJs$42&>D15?@=#45v?%^2@8c$A9tf<68sXa32#z_*i+=PxH +SXIkfn$vg+g?JhTlXWo*t95;yDr%+%w*xMq9E|IJ$Ub`2dp~?1NJO+QF&UkI*S8(y5w`QT}t=h^yzm% +e=G>%}cZq0<1UX51HQh#tY;}|& +to9Z@Z(QP}4|+X!sv<2c)1QpgxG6V@03cS>K})!kcZ#0iEk1^+HFXy8E*U~4Pq$~Qtiob~EOMz+MK-o +ziy^RSqq*Raw=oOU3=-pGg_joCxWRJe`5MI{I|B2$^$_|Vc0{j2^Ci9X7kM}s7sL=tZ@!vcgy~gM038 +w=q9Vm0aedHkp2v%EEpKZ3Iy!gy*d&x^1)$Hpki4k0B^OZXekr8ArPo0rz3Eg70(!?L=Rr3u5b5z+D?ijG1EwPw)^VtjBA +?Z9<08k^T}$$^by+TjJ?-rB1qm2rC`e0`p@O3-12iP&{Gpkl@MFQ{3cCb&f%5mB6BL}QM9qqx=tpcS* +l$&*JDnt3vk^oT92FyAiQCuvS*hJZyEpX_w-mZ|nmV1ZPi8aQ?OC}FkKpueB|OPimxdBlCBG1bQ;e}w +;X(l~Fsy1Ny7gGSL5&otR-=+~=Gs{9jw{a;w_gUo)i)DL_X#c33#2!fy}6s9*iys=^k`&9auj`t?|eM +p?#({*vQcbbLd-ds<=^>rd*&l@K1p0Dt88$K%B8{KxP^mm(o81EUm_^q=>;yarR-{yYVJE0e6yB^&35 +|#cz#lIl1``N@U_70(Y=UPbbt#i8oQL;Cg;P}o@w|i_4AHP}lcKht@M!lU3y*cl;!rm$O)}`Bsa7^vL +lDE7NLH>@w@^1;ZcKIN%s-9h{;5HAwiTcRr>A?198$QMPPFRPVb@l4QU)6b7&32Bp&gmab81dDG;j5T +0fz7(W)i=7Rp@#@b`s+o%IU87q7i%9j|HgK=9mn}|!5`#)BtZYlWKEuVOR{aG_0P)d`r|QOjDI4swF& +5!J{`Xr`yHpgj=Z-*(ak+R72S3x`D<17IM20n@v2Z#HhyZ=0g{gqGQWT;QrGdq>KjqtcehHnrb+xZWN +!Sq;0O1%nWub==k15j?iE|$(~|A^U9x50CEN3nsi2W0{7@x(ID#G9f!HCPz%(7j^9p2$frXl5XsrOl_ +;8ymsDEkKE|4FneC>V1d#uT0BU#tSp@Oek?^R-V)gd*3d_(d~fa*kO#;@kXsyw%PfG3HCV;y;^#Naih +PTe1-b{}B=kX`Qa>F`|VBU$UXsppX+L(CmWNb_}KjzeT3S51Chou&zfS9&@}%#wVj)CHv}n*q5&8|io~0MwZ6C69N|W+4!QX8tPkh{Q!!tX9rM* +4@God+5HrT`f%QaTT;Fxz9QfVH;X}EOlhj5tfjF+!QG1n0Kz)r`JKi}`i +15?^_tP=?!8iCAAwMaJnEqg>q`)pa+g}uGh`*J|*CA|m9$)oO|{wNMkgIZ+!$ez?uCJsc)1QI}G&$7Z +;<{4iHt~_?@ZOK+rFO7g@OMg8Y=*Vgqm!FTSKqM7brbX^j5c@*f&c8(qV4cS^cqj80jxLWnruvXryqB +$AUA{j!BCDOwIG2=TNTg7oLtcL^(e1`TenD5)n`fXf2x4VHCab!Cy#4J8qu*^b=>NhN_}?!1(>D0?az +AW^6iHDKhCwg{<0K4G1dZV^PJFf%Zd=K=_mRk34kddlrKJ0ofxmZ+l-kQ&5w#Eg6XYM*=W3>3x(~B(m +pI9g_of=Z+lSD-XK~w?wtW?+-hJ5A?iss}#1VV9V*E?Z6=L7`(sxG_MD1JNE~lUDlX+3P=WkGKujj$< +RMYNolI#L6Xu7vaqHn=~y@{K8?~=)$tisI(vDvAB +MYo~9BW0Dw#R%s`5%oi*5-seZ+vjFF2FO%5b +!_pi#k@U2t%-$Diqux8HwMv-i6K@0d+`eQ`Bvo?9LOmB_G&f}`@Qmn;@|%sG$cmhwL +jC%EtVzud*jP^LLtA?FP`O_@7_ch54d}O(I-RD2GK?jFxyysVe(X$Oz-}zQ|4u^O~;#*zZ9B+W_y!}4b?+W~{){_*7 +BoMp1HL+3O_c3uxPF1A)CT`K$_ys%g%Z&j_KICsH4`E&)OKPp%@d|q2u1K7j$D*Y1cJFt&d%(jIW|`+cjuMG+1CDTthMb|DtJ*uAq3g!Bma-S7#b>;(1l?TXVHT%A2zc?K(i`? +u4F~GTU{WM-sLYG)sMlleMd*C&55&^}wHKQ*;Lr-@%Ol~gG}Ia8E3YUbzNsXTTQ!dvtRQ^p%&P!C-_5O++jt>GAUag1kbzjf64zj^q=op|8RwW%kH@!*gZ}m +G)8T-p1=?s+V(C8f-xNWR8etb#5lUQnQi2EBglJMl-$+-Giq1Vir)JMOupfNADjH#t@@pl+8gNJ9#`8 +k+md9m=c>|dr_{TlK(_zdtE>2~w!NpKwvB}N#oiUYr=xbU?P$LMrrw2EYA@ODDqzXpo0q+P2*};o@I7 +Uk>;VDsX7?ff9@Km%)3%ehtDtn>)}UnX=!?+bvU_#kyP|J1PHKvZ$gK{sW4pxnzq0%AXLi3&6a71S{B +3Y(qsQ8J^jL`+eFip=Nk7D}1?1a?w_6STymzhtXz%*DhWy{{U4JTVZ+lnrZSS&Ng9m=fz47`loCCi(3 +7n8R2ys%$nS_Yq0?<`Vq-Aj(TxG7EhJs+Nd=Lkm>SMSnuOi>2UKv%mKQ<&v^Wd_f@kx7n5oVU*>sbJU +EGkUP(zfoY7+4h^rx+FaH7%;{bgR{P%Wnj&ztIW+O+3|QYt?7;;gQ4>q$g-b5-bb5lglwK?Zp^(zs>IXA2k0;U3 +;sx|NnLBhUYg7+TrVmSAGJ$zkk&S(EZ|yAB1EHn1uFzUy7nh7^QHWq7Vw+n^p*fCTSESDH26V7@-h|` +V{|Qc&FPN*^QF777w&Hbx`3hm4jyQ)?jL<%kkS+HTyifv7NH<>IB-;5y;!=Z->C>?X`mLNV@w4yq)^? +0syk3()Q&(vWffx|F+-($#&WQT?{DRll2=C)6kv~*^?-5b;bSq_hi&Y*@^hA|4-~li6%QP?lOt#j@%o +T!|$0bGTYNMyZj^Z+y38m$3HUtz(1E`uUSzoHOcTw1@YOehvP;TWB-2sl&?(DPX;dbarmxVWqT*P`73 +JTn~l)pbv@cUHoVWBbp^1+?cl;{5rVh66-)y2q2~(A`>_ytzkZHT1NsSt-me4SpYS~rZ8-R$E{o{zEQ +gF6{Pja!_S-RFKd6h;PZfY%`)Fm^ef^G8{l1%geD2@Mci&#@06%?yzRsRM@ZNZTd&v8un=8`$+}017k +NtJvhZDH((jVI+{;ths?{WdYb{wyTk=@rDb#oqM1K*4%S+~?wXPN33`EA0$P)|Bvnd0C$D(7jzVb)*B +K`?2mOS$qSJ2isFcJ{)ja);B{;aYS3^p1>M6 +65+WOqq+SyJ?B;|k8oag@+C9$8=r-bjaG1o0=F*Vx`2;sn?*X*$SOG(Z<)3l +-eNt^mxoU3L!Xjs`Bk9gs>Sf#-QscQlNc~y*di+Y}aPO!(+h0<#4#kkS*iel^J0o=yms}m8Wk9Rl8B)S>W;(@29vDm(e4v=F(5k>-oIJSWnP-0 ++Ep(l-tqj@}Rey0b+Z8IMONtB0U0?>yt8qCz>8TQZ*xOS(Q`qszT>=hzox0yWaHwQ5j4<|b-c5s+Z#kW4GO4DP$0E#L;7NSqv$L<7tI*R=H?) +#IY!1>a~Pzn@ufU79)Tnzg*vf#v=R$*KDhxkpvQA6rpzG*)v2wvSzyJZ8zQ?q}ZfM2#J3z3&1WFy}s` +`ix!d?qi~!icd0ahq|?Ca(6=CNvQsS%pdrPloEsZDRg0CenjG-X@Er0zR)C7PQERjy +9Ic64pqtBa6`=PQi&3@@(E&yEm!dp|D}fzTFd9g$LuEqq>tvzI&T?88tTguM&gkW;k>QIDEc5aJZdc; +fDb4eBuh{D_V3M3IS5VC-9MSz9T1%?dC2Gk+nXe5#PVa&Zpbg=a)~z{s{_qOG2pYf_js?RqQ%Xb_uY2IQF- +aTUlJNl5(&c0VLP{k6^>580+^bvz|FyR8NvLT=;!*dQJ<`L!+%_X|YK%)p%r2BHZEk1sDTc!Jc4 +cm4Z*nhVWpZ?BW@#^DZ*pZWaCt?I%?iRW5QOjh6iYp{6`QjNzJ>P?l8sr(A4!UM@!9PU)Hw|^!+a;4& +J*fnI6iMUH#=R|1fc6W&{P^*7Wo6;LjVuQ6+<$!CoI(F5-T=G$gwu%y=t5y`lNT0ENZnriA+IkzZ`NZ +4O0aGLl)nT3Jv28aFNCP(uk~@6NXDvfd(lpdy;a5ZL&j;)hlrv>;?Njryt=5P)h>@6aWAK2mmD%m`?D +|4^!j<000*T0018V003}la4%nWWo~3|axY_OVRB?;bT40DX>MtBUtcb8d6iR5bJ{Qvz4I$}!XYr@x*? +fflF7kIOyVgu3^vVh0%5O%T3d1@IfcEHe-qYK+t8Vx01y}xU5W*<9_QS}BtI_!SE4 ++j4cDfL+xrUst6jL?O&rBhLmYI2C3NN6R6(mf6!jx;H_^L7p+yE2lXQ_x^$dqTb-Ks>23d|b8pei)Tt +od^r&R~RE)7dQwR4j){waR%yHnQrH;2=sFcxdV+%0AEw;2 +8*M9C%WkX2;0a-6fTMe;o)!;yUnUKp-Z5=G20S=tG{7^e~rFIdCPlvCwZGaZgSMgOg8#vy%b9ETWzF7 +Wm=K2VX|F)9GYN7T_kbC~e=1QYr(J`Kd!6XYFAnxE&>yQ>vI4%DBbNwg)%uK}*<^vDCZ?ptbncHx!t4L#}c!Jc +4cm4Z*nhVXkl_>WppoMX=gQNa%FKYaCw!TU5_P2lBVzTSA^7BEiEMw{vFZ1GZN6yQ(79>qR^=K1{GCF +lbWKE$toJLzkcm`ENXkDVWeFylB|>Gc=(68*=w)8?&o*E`|ba>k3aqMlP|WGeDY6sf4_V6@YCJn_VE4o_BYy$_kVHs_RWjuKi&Ob&E7w}eiQ$E{ORG*e?-IER}YW*`i +sZA=Wp*`Zr}ZCi~sRa&mU>)r(feyKfK-E`{egqInN`S_|3O}uzmFE)%KM4zS*AMy}5h*``ybN$tMr5- +#*@d_j3&My*I!AL%gzWe|i4+Z`)V*um1LU|Ks-l7Cn5sy?xle`t|J(53jHB$5g$#|L*bmZx7+jAFF$;EjL-l0@bdoqUwP^0*Dqr@^!n}Hi$K1`1AW0cdy^vZO`9qKk?d|AO0~@pV5)8ua0b=Jw)@)?jN_i`}j +N0{`=kIn|NibACz}byIQ>6Vy)kM{+9m7YW~Cre;=Lxb$b=7@%ZkOAN=MN{9~jqxBJ&N`$Noq{1OeuKz +|9d+P=HnetvWJ{m-v%qlI|y_ODN#{mYl%Jlj6{;;-Ake)RO|M_)Yq>mTF2G1KwaSifxP{>Puf1Yd43s +>kQA-~JjMj|Tqo>C;dCB|h=d$4@?g^6anl{<9~~zWDU(ueZ;>e7b$Kef81PXHP!)=JSu9ZeM-#^s6tw +{`7-w`}*$g-4rvKzctDKXNtd%CVza0nS6Qo_WAv*H#zjb#`3<24!(N1{qX$ncd^Vb?(V~)w&$@$e){$ +QYYksLy#AZxjgS0eLjSnkf4{wccze73@^~M%6V~@1RySJt$NJue(ZBfMb{i$$^!)X|y^1CHIzIl{{rA +!IXRjU}9&fjgAKtv>t$+C_KD*aa_V-KM%eH;la~_&% +b*`U&BD3J-`3u`Ro50P9`?O^T+7oSC0=rKG6Tzhd;l5asMjb_}_kb`}U_leE8unzx?vS-OHapc>BvAj +`HD;@sY<5|JnI3_1L!e-~Z=r|De}8OT1LaeD~5=$Ka(=>bsX#&zH(x`}NXswxjdGy&u<0=Nd=z0Z(4u +;XdA3H2r(ZG;ja(uCWi_EAL;w{(k$X`hmXZY4q{o$KUwe>-b=F=fn3#-^=^)+wcEr|Dfz6H`1>^g+Kh +w$36d!T~Nn=!KAWN53ggJzIn@L`tj!%KWsmQQ`3QjyLtMjr#CkrKl$_c_Ss**dh*FfpMU$OCtp8%`sC +wpo;~^Ui*KKP6#vU1j992oet7yhr-qxe?i +L&2rxZyHy+EIFZsI}WxSNs->9sgYMgsu16uwedL;*)2OALUrLrSR7|&f9h_-dyKx>!aM(Ia;>c>P?|r +@rHPM8~bgiA6t(H*ILHy*7)Z*qaQ6ESkB2~wuAoi+c<8c#hrni@z++f-G0P8%oZ>Ew-QfpC3-aN<%)J +|jklKQTRgDc*3Mu1;hUo;BPOlwXW@OF$++5`{U+wf$!iREr{^s`nd3We>vG_2#E0gL9`)$?5pUUIdoy +#f7^OD4Q+d`k566BJ!-$#L2gBW24}RlW@vi7}=`~toMoMM&cV~LBBAx!m)aHyZL6hHT_nbHJ@#xIJ9? +n?j_`!-}6er`GeefgxI(O`$xJL2l)@XdO82JbOd89qW5N=|6;~%vhJa}MiCq@wiI$JEoepc2w`mv&Kr +N=zPYn{g9ExlufGv@1z`HJ-|*=~(>D=S{!&oCWlwb1=NCbS&g@$D@8&LAFH_A^==3_KPtjIA>+%xHwc7CsiwxBF>lv2kun>~xH?N0ZS|tUva{jt+ +37T`O?Oo6dnvoPY5@r9u@COP&Gb{?*EaU6NndV)y@`RIlV3HdH-)#fa-SHIhRKhf-z-ZRhZr#J5Rk +lk^UM0RXRx1V+-O@4J1BCmYokwegw +s`)*OcPM`lUqFhJP9AwaF_e7jT-%Jyi5R&T^eqnIxRXMeW%liI~+LoPLs>G#BZa!FN`o@Jo~keW4z3- +D;^7QteCP9PY6?pPM7c*;d%!>r(Mjn5MM{kNH`>dR;*zBv+=`cUF`-AW0vD_bnB=(9~>SJ?gzeL5}66 +&3wN;&p2c1XQ)Wg^!np1#I<}5%x9@xSb^SFx>M^S^BjSyT|KqKM_=AOFNMS&je|6^UCB}mXiYbk;*7W +NgTr#6uF(3gBz7|Vf%lG>u*6ob$mxC3oE-e-pgXOPyQGo($xz5}dJ#a}h$vhCr1DLZ@F^|QPEtYIzg) +C^(hw2S19XMK7UnQI;m*JM+wqg`hHfuGN&wEzBx4k90xTvg*y5=L!wygxo$k|pOuP~R?5 +_URZs3vv;EXK{h9*?t;S0b!mKYax5YDGthbTepHSE*rSTe$M7r!vzJ>%v8mjE5MQ@23`i^l`afD?r7e +GoJbCKSlWqhlc8@8yg*OuEX34O`511D8}=V?bd<45;ZE7=3g#o-lDk4m>_dEQ=8m?qaF}R$~vlud!<` +Ts^@hF)W}xy&SGCkbw6K{11|niiyY4FmU`sb>?ty%P|JjCYLVu6YPtQuSh|?>}_VYM6E6SqlsHc-n}uRM0`#J7_LV +1CV-#&V)gj4e9Y-KlypTq)^E49=_=S6Z0|cAok1?1>*%;F1j=Q;B$Wxo0&to{ss)_8a5|1j=d3%`~zv +j-~Tqa749c&zcH#s%8L^=+a^g4kY#2>_DU*tGMY6+bn$#Rp8ztzgCp_75x68igntOn5ae*U0Q#!K!!-aeXYMV>uvmMTA*SVIT3W{_+1st +V{TTJkeS8EiX;*(wRx27h+{Zj!uLms??~7U8g@)apv-UdcL-xn$Cm_A%A#h2rCV1@j15`FTO*TNCm^5 +SW!D{Ju81n)XPZqgj*wd$0W-0UI*nBr(NFCgzDHwAkmQHL{!hy&Pt3%u_yKNXj2~eaKWi`_naDC1Gp7 +14Lu_jfq0lb;+Dggunj4{&H2DL;M7L70lqNQY)$v^RRnD5T?4<~%dOn*YWz{hl!F$3iQ&mGMEffa(cm +hPAivJso~4UVJYLc%pAemKD;7;Gc#Rwge#4kYL{$?`DL%EX@o*C04LjWG1GX*Vz|hfzK4EK*q3Z9#X) +cH&Y^cw}BXFQg@hG*- +aG|zX9gT)!#w>7QKvQlF$wN0dVP69?uy84$F1mC!<}4ix0=WHE9lVo-z#r$(MwQRr(7>dir!9eDDM4O +W;Z93t7OUH#*oPoDUp1ux`We#AM*4`kCzpE(xQHg@qX}kTC%X$p6_}tvS==0StGNo^;*+bmh2?sz`FS8G?qDEkS0c9))LyFu7opiu|3x<9Lh~0JXTo2*oy=-d@Z}Z@xX5 +28Mt2f(E*uQAUYdqNx}bCaB5p}fEnlGO%dNVa$z0VArm|$=SU`b>%Pl#`2^+$=sKyLx#q;FtY8ry +&5zKFy=;(P@s61o@2a%DonJ~sN0d!6zRB$GJRSR-%=4wq!Qor#?Z3@h!d1TN{rc_HMyfa~pLP3Rj+$__85 +!!`!NDm@zVkWIRW`IDB6mkwYK`yaTYH6_K!(aqy9e!iS(O~Rkqt~U-9|lt>~&7b8;L`yL3%`LF#&|kQZ&TwWtZ=}M#-!utir^B$Vb)#Kzr~ +HoyX~&Shvn-nkaRT$gpmcM8IbwEQ){flHzd*xaJ8Wh^9HjUClo@ujnb`vN4vV@4 +;KRiGqZshQ=%C)C=m`3+oBx-Xlu@Zbe4f+KI__@kI!liB;)aG?nCnONmpK-h2xrC#j@E~%_rhr$~rHy +!;jECHzxX|jX@Y;Zgfh`E!yH~d2}d$o!;SFT$NTv80|SZx8r4wGtJRQN9GG$KB3NDBVgsci9ADoPy+a +TIMoyOaJmrY7=O0wDZ)hhrQt;sdI>W*xGSEdkXRbS2i+;9W}<0Tw(qWG$6}TCy$@&9iR0S?yQOWhV~+ +%)pma(@IKd#cDxuZ$qb%??%ElX;SPV;k>flNqp;!0FX9LV+maVp|CQ8S&gnzzQaWtBlU44BNa-clFAP +W+>1}8ghRWy>M9H){ljYUljXG2!;Jt^lW3Lr!C4o#iH;5&mHF|J`=WtMU}9q)KxJSi$eYrVlO=VllC^ +YyxbuMCQ({dfukcis#d2KoJFvdtCqY2M?d{Y9V3H)&V6nPfRcp%Rj}ZDDcA#YkyMNW6$wX%y>hdLUL~ +xhUknbYT!RY5s8_UTsGXWSc<{WQlX$YKAMHk{(=o8xwTvEY_BQh0ClB}tT=WHB+g(GLhW4LZ%!vg6&$ +y1rkF99cmz~vu0d`V$^&0>m)qn_A`q$P%`C9$dod!psc-3aS}i8n#}DIJpgA|8CxnEL^uDQ;KrStDc? +fa!3T*Gwj9vg;x-#YtRQc=IeLGs1Dr1ANJF3t8u#T7fyBsSq1%I9v+L6jLZ{1R!(momKO5k_M11NQQR +f73M)NG6~%-R0l9XLBnvAX$;Z5IS{PdWN%7%0Nil2hZWJDb~dQv6jxk=0=AwCMS%#bR#3NM4F)Hnor9 +FDP?Nz_Vn}ln?S|0{r$%ZTc!$&!Pv3SYl=w15?&L#DnvT?hP!WH{pDnq6O~KE)@J!IgU +CSWsO9?_z+wQ@B8$?TTAGHybVx#w_m2}@70%C-?jIIj0cwo2F>?!@zp^zloojdDxIC+rV`ZJQ$3F|80 +hLjI4h7o59O^KtKIgllQ8Fib7oAb>1oz!u=fFEc*N@c1HYo(E3=SQILUh5km&Fw$M +^1}^DHK>BWJQ(^%3w%GSm3&lHAkF7<5oQMRq-}K2q$ruQ=8WP66TV+> +#v*-l(p1<#^yDQ7hWky4R}%>5RY6!@1Ub*25{Cm~}fLk$aP4Q|A0=^)46tep)v5l?8kH$xTSG29#``y^SBUItfk!%ElJ~<=wdCQO!3a1r6F}Ee72;?!2F6kG!*q +E__LXHrx^Wy6PrYJ0`VII7_v2>xMsPtOR74dcnX09m=uZ4AW)7fQajxRSGx;-viJt^251(>w3@N+?2w +bZkby%>cN97eezdDySgZ)!GzLdRIek|RN_l)4r9~_AMX=DdtHW?AOj4<#2SUq246GSCY +3sGHAl0SFt7M_!k3U|wO!>wCnY1lx+ck_V01k;HT;G~pk`6)Ff!V>^8f>|%XMJ;!`+zn +d!jE{@Z0Kwib$W%Y`I$Ymtc#?1n;qtAT-O`%`zVmzp5i8nxSpl5Do_}>AMTS|2wH>+n20VDOuK0d?dT(#=r(s(Gb1!F>%a-zI6X$>8AJR}REdyK +_VI0e52JZGSfp@FkEO@geX%NtBjk5dqNAsTR~Bm?3x-V?S0%MX4*5TL1+CKuaDRX-Tvz8Dhf3R-<;`x +@Ey#B@b?XS-ErnDC_irILqDb2UvzLsr{M +G=XsQF)sU0;=uh!jNL4`<^sU^)F{UJP%eIc$ObcnEcX1jq)+S1$X?oS)XhZ|Zl!Ne0&=mI2l*B3sw?! +s)ULLk6lYK$4#F8UIb=kb1)j9Nt%ew_00)?nCv>_#}@Hq7U75&)cG&Y?V~X4ublL-*RN6d8P&GR(A#?iCqFpYpFwQ^yGc*QRn{$$Kynw9ARauru +g3Yu+2v6;WZp#WiStz!jbTIL)@4D@2e^o48>jq +!arO{70Tx1S{8PY$QU_q!V0s?BmF*jgMC&&%}R<-a+gy}QS2jH=88o;GB3tou^AbfQL(`B~~i6T#L*A +yb*qJ=K*B>t)nq>roJN_=a2EXIN>8T#wx#{q6`YuE|wq04pbdgtZ)nBV*?=9xS#O1s!^#1{+3Xrv1XN +Jn(pQBn@U0U)WtYe)Cl1H&;}4G~OHq&L548IRGu22yeX{E$sDJ{(@n*T_+ZM(kr4xK5aWb{NL>cG%vm +SG$2rhR(QA&BK*-$_^VYs-qApZm=#BfSWas?Q%24jDQ+3^=n;O&H7MP_e%a$@p>IC=)j9L@L82eR=~B +a_#*&TwG2Bp$S{zpwdic&NEg>}VXx1wbzls3-d1T|e`3w8$SLq$v2JgHDUqA_sRI?!WfyMa +pz#iF7Tpjd13FbL^#KU7$_M$iE`Vfe1Z>yu +E3swFP?c&6*~1X`boM<(WRP=9_rMrc&JmO01aNR`(+R4UbklL)gl5h3Xw-+*&E)mH7(gifib{^RA{nV +)PXc8KJZzoQA7U_Fq@-icFS^&-Jc5EDve>aGP_$- +pU=?=5Xem4Nq=|)P5^|%Oh$Hn}>ItrP(Y<@QmFSY?1ve+y4MNZe+y7~()X|8E;q~;Bcf8t?vuJj1 +4P$l}cq6BaV2+7|}H6>q9pMSMG;3rvjRcaPfG*ja@ym?z{1Pu^!?o@Bo!;q~M@`Vb*9!*~3S~qmBBNL +U=USeWoQk0HclPuMNV*ZSQQY-Z|&&k1SbQ6R|$3$=Gf6={`Lt$>wS>a0Ho=hQkYlwtm`Zk*9B;-{9Sg +;-g#co4H*~nGBMEGEk@SNupo3aj0iCt|$dm6>bzID3P_@u_k{;-97d(0xp%Xh +<=(5de5hWtI5lh#A5{;>YiFucu@M|Txf@8j>H32DS6MT?iDt9qqedwC7d3oBu!i>FJ;hA>w3e1um{;N +SX}cs6Y!vVq;6jJi|(~FtAD2lF+q{l^DTpUV^*sp<*A;>>~`NDJ`4H;n?BtBsrO`|A`Z!MrvC##3iqc +9Nk47}eT~?QHd>q7^$%I)HY+DxzIXz3uN^BN0IjN=&`$!P`t(G~?lA-`lwjYi^1z}twkff^rFk~JLE= +7iuXVRRqy6f`o4=8CvRCMIZTgsIYY+(3hse7JWzk`s?ogq5;j=?r0tQHSOHOI1_9xg|CV^0*%2Q?ZND +zj?DJ-rIeE_Sa=zo9LU+Orx?*YfSS-&-b?;g;@7c{xWiDR5DC|S)Am+*-!cChB8eeJRbbg$b?=W5^qG +m&1i03F=b^{_`uGPM!*n+Tgt$Ak{KmSwV+{8>f!I$D}F_8`qrndHtB*p;5$Z#FF +uFm`-d2r~Ki1Xle9L>O$4c4d&htXK|=8-STFS=3%XJ}kU7P_RghtrLTXWhS|du>n;MIO&{*v)kwMm3sQT(y4MnR~R?6j7_1Wl(~4jsCO?wtG8-_vyi2?{lqdNmmt*dlUP$_@~jNbnRD=o8h# +>Q)qT5M*6~rJcbihCf?u1Snc7o$^5nRg$vDIN6dz`WS9;kWds*Svx!gmv6=>vR>HKy(+=rm}Y}3D+HN +>3cFm6k#+N|J~WaFzHJ%=0F`7xm}jht=Ti4<7hD2n8PLK*+J6HxO-c6Deyg7ZeoT9AYEI_qO1r0Uo66 +QM-m|HDJ(M13k|w&8y5$Z$9!a8Kr@NuZQ%Dr~KAt5!Xcio?_|$VXbgz{xsN)|tNh~P^5}?BI-nR7SRE +1O~LVj*&B@6y{GgmyU#vBHyBijX+urCIPZR9BpK%ES)MMGRe^)R5d%#5Yv=PfJLbU#5Qtt5{Ks~vVm& +T1IpR6zGU0|C1nYA8&vJ*ny;ICl9GKz0wPur`N3pm)=sHFU2rQp}o7x2Yemnm?E+ALwfNNwy9&vxgt1 +^JM|p1Y3>Qe)Si=ghaPOrPg7N;9{dOKu^$yNr}EwTm-GyJQPHrJ~D+RH!(rD)(zcj&B}vV)A})LGA4O +65g-{sru?2`ZIT-&^9#hFhPf-qJ)EyxH+8QJs1lwUEOASfk9>(XEdYQRfQcQ{lw*Feb7N^jWJo;gPI; +d~L-#t!k2lY7sF=;n1R&6*&h!}sMdk0%I92C^2EXqf$5SJ&93$_mXy{%Wv$dg+sl^oikkIi&Ac3UH>a +({`qOigx4;hjcj6}!m_fs|{{R6t!Dw~^u-PGbVJ%RpPnkmaJt1st6LnRe?OtOq3=RZ8xVOfcGIVY^b) +{}`aUbUzUJnWm3O!iUz5IK^^y}SA>R`u{i7s3o!ftK~yhVHdMunjd~%JU@R%%W>*>4sz8jc +DFDcdXRYBeN6&g}L-$&7Zbj*>sp<4oA@ng;K9ExmR$gffQ*}z-b`T$ce| +=Hm623%OU6xr_f0L9xmY)MS@!}NuN5!^Wu_dvH_z2!9vovCDEb>^k3Q2fncsKq1}>?R{kA +J|`Z#GFV^2qJ-`6T3Bt96%Aj|IZ*$yYaZubu$d^THiFV@;Q=iG(pxA@oUIYkpq$A}C)y5quA*fh4RbC5s3u%&vQ=wV9CZ6ZX;GyB82v5c3Q3y!}K|P7G&VYT7Pr3vm +QH+f&jLJk=&LPkc&c9seB$%k!7v{K#8+MC(mIAs)?+k|NlKV6eZe!UyxzFfU2D;~>ykUq$DbI^Ebg#` +MW?23(S_y)iOYHbOiRL_@ydQRuQUs6_hIw>dI=;T=`R=CfwRu`b`Mb6atIi>wN@`Jb-$;L(Hz*+yZeD +qF$SNHw+`O&;taQzTx>rS)how-=Bv-uqPw+i41kSRM0oUD7kw;1li!6ZvR)#t6Q{X;G%aaHO3MnL2*~eCdzPoQw*n1>N2z6uXfRw0I#-FU`W2{VXI=a`> +db;w%n=eebiGe5elV3y{OlTOe2zGfOXhaxWR{A?N0A6;e6JvbrED%QbAa9^;w+U!$}Myt{aTnuLXIes +g2yadopq)e@5)RDQeJ%cMM2xnpqdu&3RzwA-;mN=*fS8OEymmq)OTm5@GT@dQ3Rdo6JgqFXK1KfLGpRo`q +KsClkxOY|ptV`n}W}HFd9f+khvUy!pi4gBv;&yJ)`%3R$wzJ)C-Iiuep;qn1f#G~3nRz$G14vYMPpAA +89VD_)Rd*Det0YWb{gzyxFGRtb;1xd==wU;VCKa0ygfrEJx7pJ?N%hw(r(y_hKF7(iLXE3BZ-yoiPU? +%5-&pBIio_u4#52qWDP?~Seu0IZ-&7?@p~GC~l7o7w7eQ{M-E05cB7x8usQ(7kSlLeuI*Nq3XzE>#^6 +P^O=dCRA^_G(J|)iWh2FIXr9Kg6UGsA;%xYq3&H=RxMH@M&%p*&>+k +01{hf{T}8+Dwf=S)OSDulbB^4(Eh_9e^b4Wgt4-TRG(o +yLro!3fI)vt8$AI6xcy1=cW@ingdx3N2^e&*Ig2)_FAm!d(vBe4cV3YJ;M(!7~HNd!o^fe8^dq_%Mu7 +-(=^F;lWv*6+Y416SeaxxjcP~L&6~yYhf$fMPI^$8^@Q6I&Vb~BX3FL2)4y1Z-9aGIrL)i1l+PUI2GG +G(}Y~AUpl<5?sd10ZMG}JfgAEb3n-%(lP#~Z;piJVQsvy)CQSz!K8C>2D&>C7FLj*ZiEp@51bvmFK#} +6AE>G2mbFIMcHMl%FYfN?(hVXFa$Xjw>bak(KSZ{6e$O@gQQdiz5cIGhv516X=@6XES9midOD5rK5^blSCFU`R9U?V=B$R((6r=*#Y0T@mHb&p_gay2 +kD-I^+7$cK3H3%-b`6|mDft-RtYzwaSXHm>v5uedqN95qT&^&@=Ywk6P(WoN8kEyz<`pYQS_tGz{&1n +dVCMKFqATmB-TPjLXVMTzkd*X1X1sh>pfWG=*(?a*Pp$tAFIogq4M72oXV4he{HibUD2&+xyT^NHao= +^R{{=@Otm#x#YR`+B0776=wXmu=5K7jb^?7c@j6BOr0;+xU23jhvr`;!B6vv0dhi#?4I=q2Fysi=hBB +xBNAmwVea!;=jcL;DGth};rX$2TIu6oNRodO6F*TK5DCx%hVT6P|(Pvy>ln*uJOQp8&+NjFvYhJ6~+G +3vXJI(au{o?dkc(DT;3yn{fUc{k@L!>?!G;Ln;?PT*m`QEl4PqMk-(v_;BIV2}nhM~96Yq@P2{7exWv +MPH(JOL>!;7G)XB;z;qIP9t8lOY4yWkV~kpIr9=?0$I_j($3Jm)}HSo8+3w8m#u-Z?Ie@sbZYfLFp40m;YsM>eL-Gn>XHyi!LU^8d;@Vv_67b`dX=L<75;AIxr6Gogw^t~ZCV%wCFCa08vf +xnP4Io1^%WIs5BGv$=>MGZ|aZb1h)Mr;z^*L| +1>~Rv!y)tNMK>^-W9EG}TvHl;-7g)W3P8G8t2dL%O5!#XO>-*YT09chrYX`1KqVyQMwZ*#g?G@s0($5 +hb@$~NI*aMtu%q->3BMIK;hndhk!MW_1WuW@e7<-+?QD1+=hPHDW$I=0SdC{uIg|rMI;Oy1o2J-1y;7 +cyc$IybT6NIx<^jG03mvxWwI38+8pX@zT}m?Zkl|HPO0~*uX!Fh(Fs_`tH)mcte$Eiz405U=g$QvtVE +MX50c>?BEO+#t5+P7lkHf*|_T^zN3mbH&WWA7cdpF(h8(3Ka#D2WU^6-K|2m}Iz2zM$=cI)UYar54pO +VU}ry>?{1o3jqlU-BWdM~%pPsYd?hVlzI|IU*=FU3a$$&`_$x^EKo$=&iC{_!3LJ0K*QcS}7VfYJJr! +>pfLYQeP!Cb#J5q-Fte(zh3y3N1uE8b#$+rWCT4LAhn^Sg3~qKGxf^ch7r_j2qZ`-Re~uRcd#^XA37D +p=6N!z?Khjk8r>FmKotP*P|GbtM&-Mz!tsc55w#o&@4P|_gp}X4fit=Aq`KGBjqb5Hm=lRn-0TqGc%2 +^JqkG}c>1CjK5Y_a|xPok#wC}qA4C?i!c`>6Wnn+Lj@-8`WNw>!DJ)D3Omj}ss^E*5aPYRs&iMoil#3 +lbgn#8)<8SjSyi+L6E#gZuDwMUuk1@wp(#O5MuH```flC0R}Ce?n4*lX3J@a0@azK*zmfoG=J$F~v-jI`rVdH$ssm@@*Sh9` +@5e#IFlN3V)mL5~imR@=5;l1AlnSQkxpBX*V|h?g`z1$nH(v1q-D^$3q*#+ojv{?Kjfd0&mPG+?IrK` +D<^%CS6sIkOdp^M{R%hOa*U`N;X*~}Mclp#)`0SYdLKAHSfa82Y)T>?aO2U!cruV&g5B=3He910)@se +7P`?)+80Ay^f=omp$lM8-P&o@TiEY6q3 +l65bIi*>pnGi;2a4Z3pg5>|q>kDoxkR%nr2-|e!01USdo%wu9(s+Z!$lsL=#4n!hJgj^`1P^Uuk&pdH&yGB@d3yVzop2p>NvfVM{eB +Fc)@_=O7lQ2Tk`PvV2aZl7_R=pmn^UIKYat+)dTD9V^4NXd*rj&A=KMtESAi!hfbM{l5z9uFLfMTS%D +nuo;mUSuM#4~80Z(v^%X(-f1;`dtZr)rYDs7vSG)QfxMWB^j+{4$Q4c6jXAsMGvDHv`1(Nr8krH}wOB +VyN8@)ZT<@aiE3GPiH4s2der&w39fMPL^kb1yW=Gt$^@Jc{(%K@i0q{6)C@AT`F&Z}MSRr3g-$t=aSv +9cNr`(fJdSw;>7Kt)yXK!Il)3Q_@SL&4DSQn7dKdVh(tYR>AtW}embz!3E}-Gv0y$}d0T(ak$~z`v(o +zd(}X-6MIA_sIKR-K54L1sYHaL;e*4!Sfo27d6RL;s&5T#&Y&GBSV`9EfPm@WnJ`F<3#1Nyk{Tpzg%q +39pGL}lD)CqTi-pNcse*w4SAl}(n<2E+(Z_*k6-|6)v?QJ`X{+-V&(ma%FJZ#u&KuR(E(!a-kv41n@Z +&5`?#iwbAW!~kNXWHmX7cm54pY5ADEK~khHYRsQjq=R6HOd`%Hhvoj8$i4xi4Hb-!?pB_`WlF1CA{bJ +!)H5S>00hpLItD_HCEbbZzXxCn)FYPv(-m8C^*`|_l$3NvigN0W~kt*y**GH94Qk+rqy%_QrZ2hQU-z +ej#`79@`jTKv2FO&|80fs<#ESdFFYRR=;$$ivvMYb)nyJB +PIeC65l~&+|DXeOKUmk&EXmPw5DoTz)edqRU!FwWg?p_M*=|czZH^g+mSj%aF6l+ +d~H`n`w>~Hg&Fcn13uXiuw)EZAus$834;+_@_{J-OYZ@QvN=U4{Mg +xE~#6Up4>fs%~Y;bDWdO)|NBx#=Cc!Jc4cm4Z*nhVXkl_>WppoMX=gQXa&KZ~ +axQRrl~i4C+c*$>_peyQFAm_kaf<-g3kpTxtV%dXknq!`a! +@Hk+3p>h+(76B-TU{v_#BZ#0d6(3RX~qe+V`)6~k1)Iw2gGA8M0Y<^3n1ip)+)G`&`SW1;-?I}f0r*V +W1we%9mM}A>tc5KPy3 +a;grnViY}D}+5zWlBngCd-+0dwLk*N$BjOvA`E5lX(?FrOr@JQ0>_k?&#suWJx1-P)bj%*`k_RxmGd- +cqCKSj!8J$g_zr(of-ro$w3GW4CrfjABZK+!`&}z9U}Cp(>>mHU~Ch5-4Z_NM>lr?cni@LDRjdgk)4Y +coGZ;p>Y8>7@9_dc6#9y>qBT?LI4@Nj49KOQ!^QXMazWALnSMs|c{Eu(KOh%Q;}redGs$9y5zGixS)q +Le;UF0I=ka$SqTX;cTs#N$gW+P*PZAnT=M>Q_nlFa&aum&Jww%wVNxwssFdr=rW?nM+WN{A4!obOly^ +zZ7OMgat9R#Y3w&I1+=9DESiUfX^nqkf+W0oTT8Y`g^!?FYu$=qb#?YsoHr;oTB +=j$Z79@ZVWDe?qGRC&4XPghI;|SQhPu=d_hwkUQF3~bUV=qD$PbCx2B*@u}-(bI`%tj)~Fx- +3qR4gR9^Nf&oNFD_Otr*fWdZ=dgDAstq|!}YCgi^`XmV_mmx?d&Z)p+{YA2k|{R0-#5ioLwnW!2afSQQwIoK`D|jk8*{9IN~g505Lcds=6vHq{B8Q~vEa6$b +|gR*?4fLd~sz34I5B>%vNea(~12uUDOTf3?L@^a$3`Z|EA7`|4ETp_?l$3VvUuWnWrNH{q(AYXnN@O( +`~4!Evb2@lE3&P)h>@6aWAK2mmD%m`>nXC_Oz1006@z001Wd003}la4%nWWo~3|axY_OVRB?;bT4CQV +RB??b98cPVs&(BZ*DGddF5GcbJ|D}{_bDV7uVInEymzDw{c#!3fth2*x=)(QogN}N=O4tA|zHbgs{JU +pB@R2kidpqYWM1>RBUE?o}TG``enw)$N3++tlu2+b +D&(|r&|<4!1SEnFHb3}RN59WvH*0aas7g{vY}FD_mJB3HajHP53C%PQ&!CBm=5jZShE_&St>8ID;{#a +9?1y0gPCbT7S8C?|A6*r6sJ(EUP>13x}LOy$WzXom~7+AtJ?R4~+YZ0t2Hf*CosPoZ$7ir`@gO}6iz1 +|il@0#^*OqGVM!NAvs1X3( +SobvviFwxjRfGy7bXKk|wZ(`fg0Bm<=KaH)Q(joarWfSF8{u+gIoAa1le#2*13QN8@e2TP&^c&D13@z +-hBL1O1jy3IX763Q-=kXVfj-tcom#8+@EWqPG-lzy2uV(+prA`QRcQNqfsF&;uHLzNhZVKU=54e0z`J +iWd#!r6OO1AiYII-g^qN=w+ggY2`8SesR?cWke@03gQq6#6~|Kh;~T`X_NA)p&x5 +QHVV43uWkyBgM3&Z^bQN%eW9O4RRSWZQ@8t?MTymE)tMVHixPEM|_LBPf1j&vEz^>iw(UM+@%iSiQE@ +=+yshwL91KPKlx!IPtb_b({aGmyT%5CzgD;Z(h}It?OpD*J)n%d(C#s>eTR~xYqt9+|>S|vrRi@o~WH +AAJsk@oIS6erPSYC@=&h+c3!eq=BnlK$F&-%9Xg +MW9M4v$B4azeUZx)eLk-1ep`!o-(`WGADMYq49T)2YLI0Wl<(ePN>jbSPaILPU8wAwJf +6`s(y_KA)E-QHxRz!qMq84A{l$RQlRG?fa5zlxGkRPt@1`s?KVoqP>Y8Q>1_wih9b}a< +qf|IH^o3f{%kUc+RcRcd>nAW-iRbFsVKqRh4?6rXS-})S=)FhglkM(GAg3~El>Dqld~Ad!g3c;A^+kB +b02E`ksc?lE{7`^di$2nUZv9BG0hQpzPCU`py5FLp#eHO87wp+YOMhg!_8Tem$A>KO5rU7-y9VABgzB +?Mp`Ef0oT0BU3OAU?mHU&1vW}cXTA9o66(geR-QnrkZx*n1^p(IlhTS}VR(>!*_!5lHUEFguFQ3~+3C +vTY@v1f$qg?(3;jfjqJhmR4E7h_;0?}S=*8@GoMF#!t1DgqA9~p*nwZRZloKj|qstJXhfAl+SiLVs5H +J{Oj&?p_o2)P1aA+aZWsd$PrbT`!OWQA2Y~Q$<{!VHZinZ#DDWNvOz(8BV4`!pW#XQQk +4o%HLgj)ev;2^2-#S6Mttit_@7xI`J+Ve!hE+T+Ntbi0!IGSZc~7~ANO>x +b%iK0A9cNJ{iqb3RHw*4co%AEy)0`A(+eM$0$n&eH;|o!+d}`og;c^JF=lxMKa`>7FQ=l=>QO(M3r$4YpgN!ywB2Xnz((PZXnImO=2XsQa8;KQXeQT{Hw}x#yX>Nq#=eS0)uk6i@!q#JjGxHF#gKCYZu;_4 +P~e_8Mr7{zoN=F=bTPX@N+0qvPyt{?uM*g&5`wks76LLz(;oh7BVBtxXh!6Lzm@@CFq0(ENaa7b!7!$ +Hf0JObCM(TX%gGrtHXz&Q +BQ_l(ek$UI*!hxjz(D^=64=VqAq`s^?oz$0={{pF_mzf{K>h0Kv(R%A+)Gl6Uo~iaA_M^{M2QWLrd@8 +f|AoicY>r$*VhvcOsF_VlhWGP=XxAa01%gofO#eJh8iE%(QT*}dl9}^4PkPnN5Ew7@x;$Y*wbdM-_9u3QR94$R`?;^&2L}K3JOz~vlmo%fD|-cB_ +kFYbV}frR@?pW3|EGanv6ud%!5*Qv`|k(`M4tMbxJDinc`xJexfq&g5_>dR>p(2g3Mu#t1!AT)y{yKy +DKWusQ{OHc8>MMUj_S*oIq?CUL@4BGs#msXs_&<%UO^x}ukLy%T}R#~Wb|`qAaCX(c4yAWpXZXdDT^IYvV=`{_bBf5R +P*=N42jMn&tv^96M*~*v2m$p%k%}M)q>+U9-DNP=Ec+>c#SlRN{Uq6@kdJGtWNr%!{tBsvmghKMlt)8 +ut3*c^@7|linXt<9pS(g2e`5qWPLjCZMN61a9D2{mq47^n1IFB@dWY8Un#lS_sI;YZReF$t|bIM|?%0 +cBnx`U@I`me~i`yY=;N1TuDPe^-k&Z2LZ!W>C7HzWEMkMB`M)*%%@XYjgm~ye!dU6Q^3F5y7a)z7e +rINK^~~lb|u=CW9v-EHD}Vq%_5ERmh{nnPM4II*zqPy)}h~Pva$w&=6C2LW!EPnZ_%@0}3AT0Hr}-26 +oP7Hl@7##8BCY6>15vb0Op8=#7@jAk@pfu1i4kDWQdk=VY1X +;sJw;5vnX-vy +OmPT>O{5%fSPrCaczjCHQhU5agg?sVEWouAtsfaRPlbr1B%kMCS6SB*xb)fPOIG4(Q4&5h1fs}+~)xu +qt`&w~xq2JMbcNS)lTN5(nYX=-dV8i8QO6xJuL;$3#sJaVL&rIDoqMd16KCg1m)21V4Orj=_y;(}WDe +yk+sp6)U6uEaTjZh;HE_V!4J7zgjyB@+32J_{^0fKOS&J+zMxvm^~2{Q1{O*b0sH*D>{opG$EMj%j0` +lBQ*4(|j&qp9Q^>qigY^4)Ta`d7*o#Av622**%&4?Anv#?0&j?p<_IAI^+219y%Av^*h-}7n|(G%e%~ +%Y>THFX7g1Ce4JzIv?icH$%uz213XFd5;XT{w6T^M`4d|WhIg1uUBa$IW48YPCtD;^4nl+&=5xJDEc* +1ZIY{t=CU(^8m{Q7?%aiUripjh9ouS69JZjQBHqBwrzEV>c@P1x7{{7L4^#+sW_|YFO&T;C;D0`_ZT^ +g5OcI1Jgmcw|m@Spp&t75+k227ZDEQ6cFWpF6KspA(~ZRfX^m_u}f +1N`HntmZ*~WdtF8Fx7na#$p+^(zvs|QI_jV>Ts^dVL{!$f4>(lS^Z^eozBdjPvZwrO9KQH0000803{T +dPT-eeTE7PX0QM6A03-ka0B~t=FJE?LZe(wAFJow7a%5$6FJow7a&u*LaB^>AWpXZXd6iddbJ|K0{qA +4U6@M^nKnuBbYj??Gmk@}li?IuErLu`v7Saf2Ek@drWLx*w@97zV1cp>XRZ?cAryr-gPdDf1$3OIO_< +1~~$#^iF&WH4Iay|HiPRO30ozr41=vvE_R9-}bI1nULx{CjlQRLCBl8-{CxbfGXPDMt6$b_H8ntX^lX +Il+pB{K=JPvTKTaUwLuA!SEYLw+i<)b|pBqs=B)()ThMs}x^#5^M7Xis>fS_T1OP%S1rS!f1SH%G0bX +DPU@yQDe}gH=RxwDvpXf)Q=*Xv202+kqZ4N0vpL7R+*N|9Pu^MW)CMsSDt>L8yT&%+)$g~VMbX@H$}F +Nm64dQ3;gqqcsZ<0=uNr>`SbLaCL%>B^jRpOVg4pxM$*UQiS&g^1$ikYe3q^&C`atbymW*{G1MFQ-;$8HXWN{9oX +{JmyR}woY#~-^cp3YTbSM0<38xE+kS@J_=^TZiiZmdpjM_DlgFm1Ufj*)9XelU9MVLn|Xn-tz880rcZ +x_^`ex)z{*{nZZe0>X9qyo1{u+=0tNhF~dQE5+Q1ssQhtKn>Li5LBkmOmAxO07t`Tf>$aO}E +==cYo`2iEigOIrX98^wUq0&-vLIGR6HA#Va(;YWo%5o`o9ixor63LP(p ++SGCv+oT{uk_o&OIY;%**T9VsN`~7nidkzDz#Rd+Ip<_}yLyA|%(9;0M=jq#_Dis9d#jLm8od-%n#Dp +oz*43pj4d#-W8T_pfSCabNp(Acjz_gpJu*iELud8m_Cnjd0y&<(>vTWyZIYp43rsJ`ESc!D2l9Y*qX# +(ad;Ru~S&mxUqDoSBosy%7(Uk5DF2L;4JgHbOQ8GSuwtyP+#-DvH}oXKUSd(gz`_l>^Pm$AitLWMxgJ +5%2R{3y9Tkl%OVqQtfHc^?=-#vGA*1mUpAH(jc?zdJDv9T=f92any)Vq;sssUKo5=M>?e#%h5wc5F)w +nTVjZLh9=v+>YWMdSW{OZMW*F|(tVo36bap?j-gr^6_Ld^+kx(mU@ZCvD-@Nvp{r11_cEWou^!C4+^m +{%|@bLTd-#PTrsCv7>tP{G&OsX;8P*x-&@XojYSSz(ByEi=jrAolR2sA`#^C(+#NO8{N7-WRZf)5o45 +9}swhz1*kAIS|UE2uJ5lwPEc9U5V-eD57DxW`uG+g@RoL_@!Lsah}4z +|K(hP#>LW)Dh-;+JBd8sPEdpcgd&Xc1VM=38kU) +^GUgnuA*&V+y*E|E6R&7AE8FGh)nX-{NjxWD6f@85JH(kYLQzqN(u^rDYwz%@X*-D|*8%GQY?$!Mk8< +pLjJ<`i60K**u4qC9RdCi1)1+vP03e}Jw^ja^TGhU;4que#KQCH4g-1T7!7B(cwvFdfS?j&Mw_AiA@t +nca28(>_wYzsU6*iW!o#YXtR)t%xH`YRmsiwuM-35$Xb~Av(=RYOr{D$U~7ra +RXKgQ>3V$;7}LZEb=t+?D;yz+~nfpA(eY8R3lbRlecV*CNSwQ9~`K`=4u)Q72I_8?l@?dgGTBMLhWwv +ZcoDQD3zciQ$u5orZHbBcn2EhR9^I6qa8uuK59{&y0bzw%py +{L;C*SwwC725Z9*VxGeSHc#BTuN!Df2A&f-QX=bWL1#m-an|Ui-jy%lBYA@2_k=M+9eqo2039xOiL?aT)lu)yG&|h=x`}idUtBex1B +D)IUWeNuZ1{qj_gDqp&AEETyo)#$HwMZU*W6M2b{xx;)4(tuq!hhh-d=eM1>Bk$M`DP}B`~yia+w&2u +UM{XCgoqEDy0XVT`Qb>{oVe7voC={t^dGN2t1?cQy +#D(-se>p4LuKd_kcGqd{~LRVTdsrg{bW^2ZV`%<-4|A!DseMR#^4%kc`6|44s$j9g4xsj|;sDL{ve#o +p`SM0EwC{QJd%NWy32ud4D4S8`2 +fxXUB|&a3F_Ss=GFfJP)h>@6aWAK2mmD%m`+^#H%O!f000IK001cf003}la4%nWWo~3|axY_OVRB?;b +T4CXWNB_^b97;JWo=<&XlZU`E^v93SMP7zHW2;pzv9q*h_kv{++x6*Ai$i|X^kaLU^^&+A~0y_WOJoN +kEEP>fBhaQ$-k3zMuFDHyT`kCcaQGT(cuqWc0c#}bkn=)_J>`%yt%vjlV0#WY8=sM#&l=oROUj_l}?z +XrA+@Ll@gIQQ;K1W8ntULmrla-6E9flIUCX`xdRyR@3XV9m@`aSR^&1kPU_s^tC?#Pz5tl+wJGhfVc| +HT$uc1BUnPvknlEwH%u(~|gxViJ{tk$P?h$pAqJj6dG+@hS!AV)kmCl`!lfr4!v?ph<5Zwy%o$jTY8k +x~MLWYiAb2R)F?SI!Yn;YsbMCoQ}>L-&S|L&ibYO_6KP9$5aCGV$*H2O!9lGxfM!lT)P%M8;RM$^zC&QDC_>VF!XWMqTkwZ68U$977P)7EmJ^WE3Hk7F12;u^|pi9)A#N6>AUua(>Bq=5 +SEud)a`%zNf9|}G|(x(E=o_K0nSBqc7CFa&G3Bm!?HfH6SID9jQbE(_0zUibDJ` +{8z#B*)_ycG_ab(13|QM~i3P?*OqAa#d<{{E7UX2cQP9urfOsbIDT5wcfZF;rWdu?LErgOucxE8F$mb+95!4tEjWwD<@+J&TkO}8brqZi;fV=J1X;pdUiGO6+m +Lr=`C}`mInct`<>j>OL;1$QJJ+QB7nEtO#F(sxlb&Z1L+M|S +7*CT3Qi=$l;x1gBaa7hECKbsk7D?4anPqr_eBHQ6`dNk5KI7uFT7m8CRy$D9+8qoaq+1Q&Aoev*akpC +ce!t~gYZ@qCujjg&L#6Cv<+x|3wvx0p2LVE$=Us)gdSVfT^jQt-=Dk(W)?ojVz)ScLY2{KV$Fs?-KRjjH^zi(hJ`1~<9{(mTLxk6 +U>AyA0vPa)O5K>HU^O9KQH0000803{TdPJD*tWk~`60B!^T0384T0B~t=FJE?LZe(wAFJow7a%5$6FJ +o_QaA9;VaCwzeO>f#j5WVv&p2USnE`>zBl;&WFNvsk;*eK!@t?hBW>avS=*QEaU9rF<)C6U^_*z@t;z +M0wSc0WECNB8j@vv?BClL+J4V)7H80gAU5gJn?XN;vnx+6b9dI(*7HJ0&PQ^>MuU9~RA!dC=OcI#lugKg%Ug(N2-m>Q-RUK%|DNshO7@5ws$;JQCN-*#dQU@UsVxB4y2t_5 +DP=mtu#x-+u>VGAym7LfWtTbUh~RWTtK`XZG=MyMT?wF;PlbMX|X4~un*aK6D)xLSqtbTi^yUm1?lo{ +mg%yHk>hxhgBPZ&)}JJVvX@10%w5Jd4v!t9}}%^C(F$U91pd8LrZJvYv%2EZ3{$B8mDyLUe9%+su!e{ +MzD@DYu3@S&$b}xnt=Y9rgL4E)5+)me9rrc(Ib-jyLb8%Pg1q +28eau5AbcsNkactJc5MbQ&}?gR2gFfjE(bc>SM^*!S!%B_%gg141smRp3e@V`Q1M*RJYUNNg3>GY$x93 +2I82Xm_!gb_+z3MG>)_8IO*m_UQ&dy&@O9KQH0000803{TdPQ5~!F=zt-06zx+03rYY0B~t=FJE?LZe +(wAFJow7a%5$6FJo{yG&yi`Z(?O~E^v93R84Q&I1s)2R}A8d1322ay9G843ap~osS$rcvQgw@&=O@6r +AULM5~#m^A0^pNS{vBqNt&7WIP+#W-R}8A55uSNj3(n~I7^1~FqucsbRo9e>C$q?X>P<;C?+Y=87E<> +&_9KgEYN04DQrRK5IR=E2}C~fS1$FQ8`3$sGaQJYac5Ju=P(sTsYJ@0(8}W1?6s+XKuim58hdIub3CI +>RWts66*Hb|U*W2qqh54PgS)%GL2))bpioMReXOOJTW(%?)>IN{<&4;rPMe;+{sIfpl$js25OQloK{t +d99XU;l%I&mj>xVQ_Yz#A%S1C7~lhwI5@{W$nZ?qh8{vVVk-MX8{i9_iM;ZrQe`N|XYIHt>_ +Nk)*@`CIB2#+eiW^k3C^u5108d29mF2`N?Y+(JPD+h@B1xMFjWpG*!z7{6Jf@HqVZ0nit4SEsVihmu$uJ; +FI6p}2#XKkSQQ{nwg@%$DcT7mzl>UPDS|lhl+Ob!THm6)*qKM&%?5qFPL#frat{0G#p!XzlQrh+D%?Q +j6rti1zg5}iTK88LG`t*5#Af|puv>*X|Byv!Xq}HZS5865(It_un{WKWd-VFY{9T2S&SS}qJ&L02c66 +tn2xzPm$>5iG>K=@%p1N|!+uA=Ao@tq^Yo~SH#M2o|_P+RLTZUswsLh%DKsy&JKOdC%NDK`Ex%iZ4S4 +Ww@4r=@h_p>jNeH{otkdruf^izD^o?ytLbGF?ySkHbl)(@7<>wlO!b-g!2x3v3I_Mo#Osz|vW-dzQ<* +wfkdBte@UHsy@{b!4YtMiiM+9V2$j)o~gO_G1n6oD|Wsderb~S&yh7(Ll-}e(Ea8)#@)>veP~TP$s7K +TtT`A!gyuOnT)E(5p6@Bv%y;o8#Q%D^!@m}4u!bFswe=q~581lvC}`W%wPFSTRaC=WX%t=6#a>-vkW6 +h$w!Mgc#=BUO9KQH0000803{TdPDBK($-n{t0DT4k02}}S0B~t=FJE?LZe(wAFJow7a%5$6FJ +*3ZZF4Sgd99R9Z{jczhVS_mqn_FeDzueWNGml!pe`XnB&^g^Fv$Sf8k>!sc9Htycj7=OtM;&~<^q208 +9(#kxwyD+Tp>WMz-$maS#CA`;|6$vP-@I*Rj6{kQKhj*(hV;%G_d38GhbuNak{)T8&z~+z$Nqqm-Yx; +W?Z(G$L0Nc%X866)%MD{pi3Pm6`4dxf)pdZr>P+<;Z*mPtSWw`uK#kI9%aP@)6&AD +vU0G}3P|ExT3(W-(Ah}Wnq=d9Y$Ytxy>vTTz5;y8I2H)Y@N?z1&l(tnK*ythYJ;fd=od($Fa$Qp3!(1 +3F{u^2x+`!8E(eR2EmhX0A4@LpEo)(MwF{r^Irp4ksmi_|^yvR!;HktZt$h<)n)9>r{*={^@2P|e`;Q +IA;$8JBmQ@7f$wOgx=!werm>K^P?c$FY^#b-G-?_R}7|zlNj_aNa(msLia?qw(7b=j}kzqB?p%z{zV9K&!P3=$SMy%B_QGC6OI2~Rh<#4jSWe_&ht{0uaT-C2C<;MpvkHH0jV +{w9p@SBWx3KYvD%Zc!Jc4cm4Z*nhVXkl_> +WppoPb7OFFZ(?O~E^v9RR&8(MMiBnauNWm#1rp~%s!GkJkxGcU^Br%piB4%%S&Kb}Rn0ElU6OLYzO#P +8IGDTKwf+Lk&OAHw%rk>8FPk5@bKiMW7<)r^8n|#bo((_38Q;s+B`nqmGsRb2uoQ+eM&KGY@-t6U=18 +@Ih-^-)boB%`oILOG2~)X61u_BCfI#yQizx2HL|8^sldfA&5qI2L@>hzV+4Mqek_FabC$#3ZwXPXQXQD&RenoOqlu$<~&^~zJWJD85%GW= +6kc2qNty!N%>MSwYMxK3K6tS%rhl+1ADoHhzU>_bDhHz5eAruf0T;iH!|kQ-kNqIrgCi72GvHF9KM@A +z!)`U3hz*$qH5;5Wy&K89`gu=MqnDY)~44LQzM&5P$U8)N$?rFH-MbZ?cGnPG+E%v>6f<^h+U8h+RWJ +eshe9H*rBBNkWx2P8R;}qP*oZO7a8oDxTh}!NQFL=j9`hd)0phiE+LRFeDW6WXAcV)OdsLX!1o8!#p4 +b664P`_{mYT~W}9*Xrm7SZW>1L|z{K^3?f0OkXK;SC?g10UuO{(Kg=4n +TldQf$d=BKbgZLXaCtOvY#!Pjz1UBehpkf@utE_Jq{t2stSV7>&qw|4ltirC4S4QbIe=p&~KKljOriN8{6K|tXno)GjXl~Q%#PHJOaCj*M@UG@9DH~pV_eSn96Eax6@r}wX1 +BA2aJqT~jgXw8&HvsH3Q)l>KE2o1>?pqXdJ(vb#1th6D0ZCJGC0uSEVNnlSV`AHFiVn=gQc#WA@?br% +OJSBy8!Gf1zRA?TU{VJn%q&H=B`~B}>FbOBKdv{C>2D7W))zxr%YWpy+Y%OSb3crv3!LQS5wW5@14X% +!ArMGLpXy;gfi;IiwGaIX#gPj;n(z>wg7j(474PF4-61h}fCQ(u+MuzGJ6a}Msn$I-yNUH&v=IP!FRj +vg8%$6wv<{O#9^_o-y8vou=xV=kRO=kl~d&0;JipMC7U0NhW67Jz5=a7E(CB_88kkbYZ!?wmW>C*BLt +1!tLbUT#-i;C@|ceI_`FA3^`4eU4voMVKe@0|*V{0l9G)ZSb8`zE +2VMH6yP`|CN>ONsU6c~raGWv>FT2#>NmTjoUBSq6-+MP=Mxgk^VYlU87l-_oxD>c(9uX9)DHUFo8GpF +{6=pBcP9k%MmLnkseskntY>+>?hGi^vwwClNc{@<=-e!tP`BRb9gzmpy+O +@arw~nv*%)abV#1?Z%nT7U9G_8+okMEdIok{^7sEl(z`zistOTklASVFuf1G#TVil)@6aWAK2mmD%m`=e8V4@TT000gt000~S003}la4%nWWo~3|axY +_OVRB?;bT4IdV{>gTaCz;SZByb%5Xay1DZ17dY87x0p4Yk;$fC0HR0-CW`^Fl=L{b|PY7*SyuI{^EHz +W&@j)KVQT?ty~bpLy1dLH^$;pm8e!Fltt)rEGe(d-&cIB)kF*O1_QlsbaJSVB+P_qHn>Xm}$Dwht5UF +WYfM)>HRjVp}#9xwc$8u+j62e2|Vel?pry0wxCfcV*z4Vk)s|GMTxyDFWMbef(EVJ+=4;14G|a%XU*q +5y%k?=ZlD&T?s|8rgQ9S9KcEA6!NuN6+^J@S*SY>=;Z5zE`6yUJY#~v!7=9DE%NeRAZ1wV0MXE66>UEd9U65Y)x?i-c-g&yw)AnNa4B7>a5nwf(6LPvw{26pz69aJl-m69DpMCU5F;E2TzD9Mk=-+pHr +lE02dR8)0WF)4dJ7|_!BcP|0vbQA=9Gk|IOsVzxEd-_X4w?1W;z1fU4$KD?(q){h!g#Z+X#jdX1=s$P +8uViFMMkau6j2EsCRGSTV2=d-NEe{`eLThitD$GWKX7!je&7iO1Qxs2aW+cO}%l2iu!r0-5T7|=r3A> +ZqqQ}qNhV0`gMKKYTUHzI`nV!e$QxT0Sqal6jL&}B>zgWg&`*%W^yD0VLSeE>bJPOJ`T_s!B{*M&?qysxIyxO;j%`;O0dAsH>gxMlqi +w*SaFWWWbFnu74l9QzE>}tAI9ru$7Hi9sE+6UgaU1FKyiOyX#`mX@PUCe2(iM1Jfpi64S0r7L*A+=u< +aH&|m3Uo=bR}L_CS94=l}T6TbrsT8B3%)GOKB~#k*;Fl`o-U5tCFr-;ccX=^12%7YP_ySx*D$&q!YYO +kWTQrA?b#^Zb-TzuQN$!@;Z}rCa)WjZp7BF7--k;Za +Il!E&Od6#Gc(qng3%G}$Ax#6Ob#*gmveMys%Wa0z|!9^9pgDndq!&JCi6e%Eex?~p&*O*%t(JH~#(^V +PZQ^u9FP=<)Zl=?LGy3&hZo$Dd(Y3)9P4u3n*+B}}AJbSrOq_%y8bIL3epGZyO3k#4NN*r+!(u9%SLr +>pOo%kzv@$ZMZAogCrb&%`}B9ycgUzC8XXm1-G1EvIRX?ym~3y{igeI8cQz{tqhrBU@PEwRHTwUg23= +Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN+}$Sm8NaRN-0Ms=}`hWpbh +Cs`@VVXpb9}DfGLL!hxIEBLCYEV|x@?7X4R?yGx3m=Y+!{+up0Y1{tL%$mrm^Y{?bxI8lXMrf@(WfB7 +_`d!$g!6dv7o&jZ>zsjc0U$-ovPoDD8Yz_(hWW1QmFZ|daOkC`rMzKIbc!b4$(l$l0%6Y;hqy|4Y9Ni +V8UuSI$lhV%+d%za6(9CBWjCB0g@^g(*RY#*femZXP=@;^*^Zv}sQklt^6GBOGm&o0 +d3z%L+TV^yzly1NgrwK{n?HOktl3r%AB!6?U+3XtDQ5e4`1paO?+;1wP`(|KetgS#0JLI2bkEG~%Z7) +4+PMF>hYKE!9gD5LL|i*X&yv8h{%uPFo8K%x2?C3AyfX-FOmlk>xYoA=foo4m;SvU<{smA=0|XQR000 +O8B@~!WAUDL&Dg^)lr49f9A^-pYaA|NaUv_0~WN&gWV`yP=WMyR&UoP?pZ`X-`?HI!abh_yy#2kl8=1&|&7%p=aCQ@h3r(SYgCG#1fPi#1&mBD7=`jkk8CWR^dqiNs7Zy>%)rH0Na0!hS +(uH?&nTg-nv>b74|?2w{oI`R_`@ey!$Wv2{zaoFg3Lk^tAjTpO&=>qc|uEn}>c(o|*E#gA%koM8GhmY)vMuq5pUTER@DB>X$N!^(GP^Mpl|hyG7t2 +7<4D?2UxUjd;OmO=%T;t`NOW~(cNf5EgH8bey=_4w&>Ip9lFHWUix%h|bl*{R!LqM!9ZerL>hwnwASO +RYD1is_JFx)uU8Iz*)2%YrK?g0^UcGKMuP&Q!u9`$s4=d*$>JB?UI7BWgm4#MoYH%5&mr*r$bjDiEgj +{+SO$6sGTnWjOw+y|Wg)62Fw;Ld#R%SPdBP(vVmbbC%aXU_SGaJkza2m(5P8oM*?PMq6&wTAnK$CZ=I +{}$NciMhG?i_5iFub+~gDbWBXA?^MwSab0gMYOpAo4I~T>u8&AQ+4~-F~G~2_t4qx}2s`J)I$@5QY$1 +Zb3mHFw26VYIwBB*4<-bOttC(Rh<$v6gHPH4B(a`5TJ#?!0ct&J(qcY)dM +Z%`^tJ#bT~Ty6~e??99I#O3}&RXh5*pZSFE_%s{d=FMHP9##+(~_`ZBUesPW>VsaU?E40Suj|~4#j;F)j9~^vqHm?Q!M$M-mY2@Pb|C0PgL6jmX4&#FoUlmGx*?ihV(JTo%@6bZKce; +MJ?e~WF*X0>gJuUH4*?>zGFINFRomka<;Lgi=rM5{kE4dJJE<+CFUuh)X!)W5Sr+(l+OuBgKcgk~jpW +^q=X!$bOC%V53N>P+#7-tWP(^S&A(3HTzmUjHO=Su2ud8P)h>@6aWAK2mmD%m +`?OT19@Q>008PV001BW003}la4%nWWo~3|axY_OVRB?;bT4IfV{39|a%FKYaCw!QYmXI2l7_$cuSkh6 +MrxSKsH{t_wJQMzPiru+4QS;3f*LrOqiOoEryG0OU%&A@1@=m2q+KMJ`&4B{M#klhOXjUx-~LzbKm76 +RNqKzs;Ng?!56k_>PapiP{FAY_PHvSK?|0?tasSKy>f*9IIK17J{dM{2@ZbB(%ZvQ|;lrn^{hN!M!?C +=%-0!Y#%9|W>_vGu;v#b5hK4<>0`*nAD__#Zk!@F|x4VpRr$?oR*&Be#v|026TTwUkSQtxldcMoot+WVR$zB&AExp#S4&KY}M&Ue?ly3O0;-*|&z5UDKnDajz-tOOh=GCXGx49j-zS$i=Tz{3}k568f$Ghv~wEVcc+8uK +@&py4r+`q}mkN0nOSJ%68aa}(0?)v>7l6nLq&%ZEI9vzar(*3^d_W7N)f88Cg^G%7n_3LV1D4v$o^>- +IH@SocJ$i&;p^yhM!+BklldH0(l_+zJU%l=BT?^E{qM-t49{+4D{Uhm4M>)pFgm#0Y~$CkgJz4+_Xmo +Lh_CqI|J-#b6Q_vFRT-{;trbbd|!ZIt#OKBfu2ExD`X#nsK{WIPG{^zi(_UvtL2`)7~OUi=LAkIr5^d +HDQ!dGz$W+$+!SoxeDH@bdA!^YZNF`Ln0bAKoqH`EK`B#0c|SLjGOE?~>$)LrU`P?&e~DdA)7@=Tz@? +GI;s6yubK$muh~q+owg9i*%8XpZ{MvygXd};(l|=9|HZp?BA8E!_8^=?YK|dN$dNQc9Y5<`aMmfe{=V +=Of?5xT>axRRq#BgKia=b(vL0=hvR9vf4IJ3=uh`@?hv&Ocj`FQQeHmKH~;KkdHCdq|0Af}I!VIMFHl +zQ>fQ11pG?aR`Rnf<`FpDI`|ovT!VvB2i{4vf&d}CBUiGdn&))7X$`4;{7r!`1pygjTO4C^WQogHqz +WlhI@0amzK<+%*%?67be@qCx{KnjqlZP)K{O$bJi=UsJJ-GMy)emRS +U!0%afBE9<>62II_ws*9X}&xBKJMQA#}8jUKl_h|`94<*g!SP4#SxQ9bNSDwNAcz2_2sUdewma`lQW; +bdUXEq-(NjF|KZ_zPX6wslscZ~e?vZEIIUx!PfJ_tXnnp@n4%R$O~)xt`PI`Ul-oYd$7eJx~x^y1vkmRC$yJ?7@qL^KC1nMb +(q6;oPNf09A{xv}JH?aWx9x?L-RR$QfQdSJVF(-j{$+ByrmAXzDO_`>6 +qYJ<%W5EU^D}f=7bw8aI^H_gFlf)XGVvG4(SfTriXRMbX;#_-yObWE=SkYUjBv9U~bKw)FCBRSA2OyQ +tRL&?J%Dse>NVlxqX>=EId}U)%mMK+U=!i+TwBysUif1(D9TNr(bK50c{Ga4;>Rn69xB3EmxOE1i(@mu|CY9flZ +^*?t6EF%)pCk_$L0~L6#ENGYY;FZ*$5cvb1PE+1!6sOV?cs0({?P!8#>QIeD7 +Or{t)N@OQAeaXgd8G)wA!-iF&8eNbJ21EjC?1<*jN+m1_72mVm3sebT~E-p2Py&YiWSpI>{!WqAXVU0 +Qx3P0tpW*TVC;@b@G9APp}F8V#yggKw^Mq6%=R3u?Qg2dDjr`h#&DGx2&0>`pRR#uU0T~o#8Z%xuCiBtej*EpHSMyJ6IARr7jsvjEW1)0SUuoOVrqEhhw&}@j7;ZlCl&KG~OvS^7 +zuh>8$B_;w@Ww^Q=^xfDBV%JcaY-L5_`VdyMBEEtLj9?7lQ|9Ie3=hf86YhweW1IN_a3}>x*k~Ey-~j +^)B3vItOE?rG`JfAp;DU$^eq`1G!PIXm1+OqD7L29N;*Q47R+9fJERyk&{MRZj`*URxwG6DzP} +QM3#zIb!`^II_k!o!L>5d=?5R+?e?v7b*`%W!aSMI2_;{gM4*;Is(S&2$j-Lm=Wa%I$)l_CDU%3N-_S +G3%5k_M&$y{R)oGREFPjSjZPBCa^HAuPQ8N}Q^ZZQRK72@!jin{=NnHUk3m}fT +Gi2Gepg*FC$R6zue2-x^vZW)vk7i#)#SvN*x6D<%7I$8ka^Dndvtv;F^`4y?)^PPmV65}iJwi0|2Of| +*^a^Vo&uTo$#4$+%f2mhFAZ%Ad;Jyv}gwR`l-KXf3on;&)pe+ +M5spx7r37FDYr^26q)Tx2qHa0a5siaKFu0O5uiEl2nnb+NNyFtFe=qAYIKK!|R-*tI8Y6RH)A>}QvGk0XoPCBv{8D|wGhvd^qRiFW-7}L6HB|eRghA%Cx3F=r8UmIA* +PVzxzKsuM60~kReaDxf6+)Qgx%kafUof1u@kbj!Kn{~3=s%;9eGv+W5BP%FXnG*WDQ^*abS=3;;*|JE +6We(jEPWmFA!(kXYC1iG^TWAXpY^<96MkUS~nYL+h0)FlFMAFvhU +U88xNkU4uHxqs;Y0fj%A~QG#o} +)K66|S_|CJPe>3ScmTjDe>VB3uDNbIV{p`ACE)%ez$^1%|W^RthmbBS&mNNeEa?zJqFX0yai6ISPzAU +_f;>^r(RG(>w +AoiTH$fMnp<{(M9LTpeG&{G%#&eT9Jr$y(`0a-j16#@W|Kppn(9b`BO4eE0WdO4fnr{Z8BK)A>&3_}XtB +~L85UM$&3$eJnHNxPY=AET;#C|qy6^BFZ3iQsjgC6`V$g7|Ac)!6o~cx6)`om$dk{Zlju+VC%Kp3svYF88&ZJdX!6`JaAqQ8If6;H`0;+#+ta9miv+ij}8BP$&J3 +q<8nw|YQvTXK?*h_zU^VbgvE>OlrjN)RacsQP;XSgp*75A_F*GPAY*4>ll5$1 +A|%WSBBl>4hYd`t%aHp;or0$hY$8WW|0wsG9p22pi(q%u`L9a8G-<;WlYluz!M +?5ZsjK+ubpeZ)-x-*?Xb{cp(`_z=tfLw$!ApSWstZcIiREx+4BP;o!lsDwGP4}D_BwOwK&bJdqx69)yCPwNhU?Ki$we%NG)86sW +R$^45G12c396G~({-^XA*LAXns{g-?IPG5sX`DuqbeH3FcPE+`k~kkJ%1b^ZJb$|Cr+cDDa;D}3f5_s +i%|&IV=kpw%5atkVZ+hx$My6SV({p4KHz5Lt7+4=W$@7Yn4~>u;0EbRJ|Kwa7r<^@ERNVCLARowfb~K +`+h(VU@idieOCZA>W5*eZ*c8R4&G?(eiYeHvJyGgUE)1K^Mj63>G!n=Q{+C~ +NJs^GR*d9V|3jg6M3ahN*KqXfz9NFT?+FNg{Zs|phMs%~#%*mn>FpQ@|REG*>Y7Ly<$2Z#&eKvdC&G< +M$Ju}4{2ps+w;QHK77knE8eZpps#B_SCO7j4Pp6-N~fC<>#Rk&pg_^lG0AKC~=Suu1^q)`Vg<|AaR +qlFLQKHWg2pk-6=#g#1p2#)}GRSaDtMgbb$EOWWLAR{BsJIN=Wf@Wy^7IM_!1R!F|$iNt*HkmvA5%h+ +G9#&Wm&K6NbXmW7~vH%bi_DyZx5N8@>Xch%cv7qA>w1k32O;GvQwta;(s6;`T1OXoEv!I*`^5QT_}lag;Zn{i)Sa8+lVm+xM20;K@L6GLhC+g_UFSblYmV01l +nr0%JM)0p*%t$0HtUSW*B8Kng@IeU9faVQORkZNf|X3JyV-T3)Sp`yj$@#Ow~0lqU^VBzD8|iJx)=8k +7STqWCTmwdJg2RP4$rFxKZ$9Bq{}{0h9;XM1&0Eu^d9=1J?_JLm?$5{*}!pOh7Cs2?3&IOx91 +}CQ!{q76`IYodWqUTSbpyRF6NJXkfdSDT}=vrVylPQf85c_iU{MHwG>Jo2-*0@uZLu1o0}i<{)4i7Ew +^JhtgEFjcbi|Bg2}21N?{JFg1OdG>XPUgxsutMp3$+?PNWSe2U^RC=WuFm9W6Td?}j94>E(*X~=ESXh +N+WJdXxY@L)Mb$!PKlV2rfFfZrPS`AJkr@yZ6U=1s%q5U#8s(J1g$><*Y$>bII8>L&mdPw#ADyYOnKe +HBMLyTwHCun-yPPX^|kWgg;F_Evah;)6jD6kq&l$$;4y>sTcp3y+lt@WsB9MR?!?2se^sjn*tXk= +rUZqjEfC|G-%!GLi)1_$saRwDTxv3R08O$^7#v5pEN(GJkb=_H0Hr=ve@G1|@Y@Q@}6*>(}8XQE!dlm +~;<@>&UPx3v6c+NmhNCzQ+h2jvjBj6*U +6_VF@uRi>(f_&+H8N0-w0W5!^ONs%TjN;S@eNQ4Efr!jg-=MBze2aQGdzJ~{tO(Wv>x9-YQd1Tt|gAv +hEckD0=9y&6tPGiReJAF5lPd0;1Ir&aaanDHEp5|n0IrA1V|@j_gvfKjDmRBg_KNWpP%o!p5mp*&AqN +lY{JK)-ue#Qvcbw^w1@_m)|kAW(Nv5l>okOSK04ONCf+LC&mbV;K1ZNas{Iioq^FP3_pu-t%@b@U +SyD76Xuzr>9rR#N4-^fD3&j&G>$+w&C#~&vgNMgZAbNQ%$crX3C~FD{h84O4#al>=hyIhy+9V@~oJ1} +Kgd0pw#*!)IiU+GS#!KIt5z4~BDuL3>mg!`f1ORs1!juBsLJKpWnON%00&|qf9&h!~#v4Iipwi;uuyi +^0pnGMsQ=~BSSa|rsf(&Hz@Y~vp(>rTzj?`oFeA$+VU?)lmQ21Zrf>_`5ol#?FoM!=Cqsj!7gmX)4AwBAAkfH9i%gs&4;Lb$QPs#^W! +JH%hAtFo}h*8c=$~SDBen$J-MON=TXo^j#cdil+|bO*TiRmP +1V7CL%-;4LmgEvd*P*ThK9VS-L#*q!49pn8pp0zYhP(?1F#LJ~9+GBxz5!~BpyKWcb#xT;(5!_H6h-i +c(e2G2$Z&!#7@#}Hn;##k(EV1yV+ySmV%F00J~uZe`oq<-r-R85ExSO~_c6stK?GP{x%CP&{Jp!iQ +vLUPD24IMXWGj{9wD6#lyLmxPk}@)5@&L=b$`IuCS}}~y=Zcp6PWI+A#EPAFZvF%oy78|CSm20V +mqR8Y-(ot!CNTozz?3yyzg4Qu~q@|aLeB@VFX3LgLLH+^;;-~CgCbkSySyozR!b_tae(l!S-4B3iZtU +KkSr(piTGczm->(w3!P?fiYU8OB-BR!K=f44QF+8A9DTOJGD +5qiV*_Q68;nQ?UV|HLlPpsLZnt8QSGDGrMW~?2PaI|e~ZgW;@*bqq$L}+LLzf<>tSi;}j{mRzCLZ5=( +@wNkEmyD&3@C|=-bK4}|f^d#6oF!(Z4;CEVoJm7*$!JeGTFOm<;0RD>B0VXgpfHH0+0?#dMG)G@Qj0(mae8qi8t}W12 +7H`79X(L<#dz;zrC%BA+BK09hI+nX?yCxqay`Xs-i7mD5JNGTNN6#6*$66WP}PtB1Rqz`2Q=%F&kcByZiZ$c*_a_>L&diQs|Kks`)%LJBdh +X&Kf|F}fjtyW=8NkO^FHo`jgTWeORAN^|{(WFvd_G`}(yb1gH&U?tgc9DARJVvb)*+yzUrbRnX(s(9& +&oKosr@3op`j9YKM$hr%J4c9hR6DGq6Fuk3U!v1wl1^rigK?|X%9L +>9IN7BZ;q?5emd`D(!%f7OjZgAJ#b9{3RLJ7UD#QJLbGaj4JH?5ygO9KQH0000803{TdPR!d$)iXK(0EK%103 +ZMW0B~t=FJE?LZe(wAFJow7a%5$6FJ*OOba!TQWpOTWd6k{rjwZ#mrqAmtQbMD#r2=RCWklNJEj1XtT +N?w@G_pJ=sOc_D$xRo#x-nv|e%A9uBp%7$(hLVhSACh0krC_nUGIwTz4!k0f7^#2|MBT(+ow-I`uMXi +Ki)q4^z)DYWBV_zeedSI?fG|i+vkt>f4zV6;`R2?!>haP{_XashyQ*5`t^(W{rm5Kd~^Tu#k+^c?d9w +HyEpH)mvPMpH`lFC-`u~uk30Wx_xHQk4?o;JZV%sX@BYP@as6j^@7}(A@x$H!HSGPvo44`n;|~vy{t^ +RkUpzd{zrTFEd-3k>)%MNLj`+`ydhy6uKl~hz`tIHKtB-!YrSlvy#J{}!gYC)d*V{9$eY-uodwciz_q +$i~O+I>f^X~Efn;+vffA#j)zm30a+n-)M{%!l>{`FrU@4w&P-(rUEws#NP7eBxI?%~aP|5&Qm_uo9ec +>I}F`}XnfZhQOi?Yp01V!zvde)w^F`Qpv?c=zi5?HoQ9;@$S*&8y!$JjVUsKfJpC_GkX|?Fat$_Pc+q)F({j%QcbhlZP1 +I)&1RecOReg?7!bVzKy?Z`Ga&lZH;)l#a{pF#XII7yZHk*{yHZ8^Y%J+62&M7 +hgU5;`1**{$Sg_yt})Wn8o~8i~P$He;Y%7{}3zr>h9f(``2&htN$go_iaq@^{ef>7k|HtZGL%o9}=~_ +2o?F^=l`!geEsm|ufA{G@{a}m-FE-&_U7T;?e^2-eaKEo-#_hcjPj5Dy$zv%`N8ehQe5=n&EHj~~4I>9-^O=KHwg@i+g*vr``1_Wt|-w(TF(oR1WL%I&!R)cR=rsil1Vs +n_|ZwCB41G|nZ9}RjYe?KmPUW-|ru!y-f}K`G+u+um9EKUVMXk`DA@zC&XfKl<*)BQh8A_Me|WYM|J}?e-ev$%m +hQ{PmYl|JTRNzx3l8J=F2p*Uvxy`jclL|Ie>KfA)uupTz~gx(S<_ZqwNJ+tl{sHYVO~Q!VK>toFE#Pt +W)_Vk)>N-r&bE9JK28pFkw$FDsevDJDT5?|@m)vldK=ku0l$GgXB<o&N$u1D>A7gK0RC>2G04W^X|ExF|ji?C4O|?J$CzKWslnU5esIWtd%R~zmaoVpS_sM65#jhC<`s`n(t7+F7dM{6i~cg>zTa$Tj2Z9g0>mUjr(&bd!a|RD#f+rI +d&XwPvpcg$yg-X}&!w~Or!p7MDQ!u`7{^U4FIySwnR|?$N-WBDD6Yuy$?WzshHI>L>|Sh0VOP<{7TcJ +5VvTd+1@avD-1AKetw%`X3WdDJt+Cn;5{rTug&kugr92+7m4T$Nyog(@!ia|*@yac)8J}s~ge(@87Yk +84>fd=jYLVD?W^yp_2q{m>W#&#%&{J!YK +m68)WFWvabQzoyJOyK;I`kyyEAZRk8`YXh)TRWDul%gWyIj9TYKTt#1yekad9p!9#(kK&bsHk#O*wen +|PftY#6+_0kuFkQqvr<(4(;Lv4f#7F{ +7%5B(rnF!+;$Z{PO6ZWwI6~fQ*_Rv>f5)Y9Lyyf5`-6fU$Y+cc4`X5oBL+004s6QFUc}$x;*9tYc2KL +)*!bbVac#XR+N!KZ#r?7EiTgXZ#v?)m5SPTQ2lf@e(mvWwFMsv25 +76knMQHU@3ey@4h<-)&*y_hvUJ2BM`h#?`zz)gYP@1>??5UJUWIElr31~uyzefhW^-#S9$FG!DIRgGf%}LV7ypjV6ih;NnS7fA+!+19T>MkCZsHz|ZpA#aqFO@D~SXpEDy<-VuqZ*IKE`(_7cpGz9xzW6sUD4B=yMC(x8h~pna;lT!NV|?A<`_0&b?y0VrG3TsR+vvhMwONexrtN#iGO +wN0_)UhhB^KWVd*!SaJ0LJBfL3Dr{(T!H>p9?Q38HmLt3DjE?5wJYutux#Dic2PeWjupim|MexFS@+s +cS_#u2&sBT>YN5B$eq5?R0OhUXNLK4pj(Ne>CL?}qcZpXhe8xrr{=c0Cu6~kfY@Dy`k0v2plOj`v_I0 +~IU;m{0Im{@gAF`!_WSC>t76hxi4v!QuC79b^DB^#dz)JnZnIuo!&5DEXN5B%7xjjTJVK71?Vm*j4t3h^;-HQ9!Hymsq*pGyN3ab-A9TLT~k8U`!G%vI%R9d +x&ps?!dD-I3gUwDCn2g=09g%~jze4ZgQg~^r?YgBbtzGFF-ROAR)67gtgGm4D!$c3G0I8L107}$9I%k +W3Reh@L?AoqdO&IUFZ@8z0eiy~klq}WcaJt0ZWq$J2JCO={o0*S$`#DhFLUL^)L&SB%L+FZCKL~;!r0 +ZUfFPi9ikYcxO1#Ez|LJc5vwEn}g>be_cFxWHI)k{A-B!QTv}*5(xgmV6Kd4d&S}4w!s?q^wa+W(MPo@?L;SSq>|yQOhJJ`5>z3PdBd8i)|Fg)GGs37mIj?&R5IaShjifFJc*iU?R +D`e0KDDSFk|hNSoEZpRK9L`5nW!=VCLr;IYxVvN@?QO!FP!E4|_s?eM#wu(G}P%wmyaEK|kicxOrD;A +f}8-c3vrOm|1)tA&DVxt9V5NmcvNhj8U1v* +s{h0pGWMMu)?wUXe}le!Heu_8KKznn@}NkJEj;vIy=jf&saF2h&Wh{3(I2~O~kbsL!7&>*Gci%knvs?JgOe$H)9pgof +5XgnkYv2f2LS|7*Vu+T#maK^w;NW3HkBIxnM`S|%kQ5eQMZ$~|fF<#hb}TtQB48=g_NufRa2ExKvhy$ +ne2{xG*${B&&N~{Wu<;4o$0ge@GmeNY487h8SsX-cEq;XWP>)cnjF4oIF~qWB9YHQa8Dj3JN?0O-$AM +UlC2o;O-GtKO3W$}6gkm;WM+}a8+?6koprm}Drh74T(I#Q7i@6Sw|5&c+0Ab1OQBunr`Ditez$+oHjf +FNs*iC}EOF{nAU3}L~jskhQ*D$+#?1--n-_RDI!7z?-hz*8q7jnLE%Bbf +-4A-0m`b_ij$bA_%C)9>B}tsX#i%l8b9)>A1zAHi3n@A*HVPhVDpHn$nJz>PQ5fC>)z02LQccOVqm5l +LP$)5CrC%u(++I;0-M5m#OBp0_$Vkj%mKtT=ZOdEr(?2|Cqb@B;rtaZeX>v|dr7i)Tt+B@%!oFtc9M9 +IwQnR1NJ^yPx;9f;&=8~NVkqeAk@0z**$6<{G1eM~3%$ucy2gsdkHimO0MLVIV%z+nuv+Y!sS|)NZWa +6h^XkCF`@bwj1T0-&6ybXecPby4$b^D`1eueGIc}$6?13p&BQhTdWqS$n{*~N>Ns2rVOGt8+#7hRx-& +tA0)0D)24*e~9F#YYxNO%QIF?8suTGax3lJ}?BB&7RC)bz$055fWS_@ +_`=(6`KP`#2E20)`a*xf!}ON=m(EV+F1on+5GJ=(d3emeYUrm_TfQVPsj5bV3sH +fUQnHn$aO}YGVa`^KQgO_8zwtqUX`0V*xN&=xYnj%>c`ta3}$g#=^!s;w3X +dNc;*$b-DjRz_O7ycYSWNsvxQ-^vjPO!xTDPL5(-e`-bOFM0Syx^25l#;3TeSGg7~B|1&-(cr6CWCLI +`hB$|be_aOjdOc358@=C5#$@$~WOd3w?_L7Pb0ZTQtKh+H#FK}`P{9~iLu?BE*=nH8lm3BiE>81P#RT*5=c6nyRas%snjLMCjmgYA +M!II)s4C3JRKSOQLyQiTyMfDski=3beFwAiU##cBx`|=nsjQ8RRaFSPR&O#MFdisEtW+Vc7E{>mv#S> +5y;%$uf4!4akqD4(*J2i!g!Y#`J|kd>K?n+ywpaKANjDH7bsHATHcTXu1Bpb;!qxT#I&Or}0}M4UTM< +V1z*aaMc?}BE@k)S{u`=$=U_*hJNyy17I)P&NbwC`#p-Ng$&fe>)j)hInH#yBs@e0?I=}hyCq*7#P$W +of3#q6eR<9Lh^NKVXvkA-c9V+hTw#%_SaT{{b)*DXUPVK}jKe0w%Qz@{K`)URrpcQ{#Art~#%1T0~?c +spaNhN=~=CC*B^<)n?*%%F6GMafhU2#iRByZ)L=R8GGvMQ8Iu%c>iVInDUoGFJ>dK4YlCgpxIfq?(f; +)LAwojc&#yiq$pafzPWxl`u&>ZTKro?t3=8yyUBi50j8rX-Xtj1lZriX>?_979!!?W=JXS| +9F)Uo+yS!J%BhNHfyKew>%MB?A`10?J$)vIxk>=paE&nRSh^8kA7b|1z~1EDgV&iC;Q<89$bSBuYZWd +3mAm*iPXBixk;Kbz<5dV9DZ3fufVe&6t@8l1dT@=^EI8d +jTW3b*I}a0=}f~NRI(-$6djs*BIy_|_yqK<;ERAO8`8UJ$*N`huIV79V8%s-?Q8RL1T5vWPG^h?YSb9 +BsoW&L%(GD6D5SSpjJ|=?8MpSN#l$y*V%1*Oz?6il<&wj{<1$dt38^FzYivbxWd%~$H)5xA7|~;=bgM +(a_8K?>maxKXxj`w*YZxo2zJ?>qn4glU5}O<4ckyg=fVppG?{)dSu>WixuXtM4A@GNakjc+8#gI({3f +5ANnRI~vW|F;ZIh)Nh4NfMSOO7)L3xc1BMk-a7UZ<8~lr1V!6Fb!x7A50CPplxj+JU!{I3l4`y%-^2+ +BcP|X0fi_jAhL|fpjSe)ufY}kP1tYeIn(kjME)R-;grkuWbz+0ZTpv^xQ3mBfw8cWvnMEKoQGY_aGE& +x^J^hH18a81XNgKwHXm-8GK+am1~Ek6mZZ-i`vRMS6(-a#6dBTaS+_#Kf?JO%N@~Eh5f650I;TOldvr30=3Pt1AbQ +k8d=Otkf)7n)4opd?PdP^L$zi6?H9f6X3(02%IIO~1eZVVaSrzQ+p=CY^moMuUY1++3m8gK)WZ`{s`3 ++UsPL~(JX19FI&M-)}YIKNV6WW3^W%J|x^3pYHHhD!f-`oN!LluWCCJm%Ct)Y2D-wjxx>S+$Kg~Ga%P +nw3-wG@?rr5|nz;kM?Gbpn}7RCx+scEg->YGRpUY$iB}T!mQ_Ow0+!u4v?I#snezwphinLNAr7`7 +8_#-a2O;fi4^{tH;Ko8~xh1S}o%5z|IU4`t4jo7}UK+43p`O9>IIAQDCT3dmM(mb0^@H!SnQ-6DKa^C +awm$Ga6+VZ^=5aU#ZytpslnU?9^rJ3B$F0Q4g!V*nIU_|kzX30c=_7P5KZd5Rf=+*%t}qY&3_QEt{UL +Du7vZoLJUo+z!Jx0P?AT>spADEJuMI^;x) +Bq=E?eBHGl)i1we!O+h|MzFFuj;EQ!DqK8eyiue}EFEZ?K^EJ)ITXK9*5>oKfHcg-mS9^NLQt6P?o17<6irrRtEE+RKD#xi?DJ675TmjVh!8__pP$c+7UBh%-YkYvPpr +G++h|^cqiFC7FY=De +Z{6CQKi*WF;CFx5Mksn;~MHUa0D!A5-Q|k5e1smHlc>14RFilZK`Ul2V@YyjgqF>B#YzXbY-THZZl-G +0ynMj?j19e@dq&pl2T0qD%}P7c0@@3(p7VUrQLK0R_K+ELAp&ydMy)qCFMTQK_m^NpyGEZKg1h@u|Y@ +9v&ayZsG9CqP^Fj#U3OGRf#5Bh5lBM%|ynRah36bYEI;De%!8sL0HmMI&e3uc#@(R9 +h4$b(~8$dT*!+6p)+7&nRInPhoUJx#0HkQLAtG!WfDcbL{L~@?q=caJ~=E#k)T+x9g-fI#CxVm*+)+)I)ME+gy%KL%k*#5$$PrsJ`2R%UpfYqV`*+p!8W@BHdk&8b=LN#j3^ct9(`Ac>Gzdhn7< +S3vgeOEvr-R89bTHRNKx&X~3*5<4+yLnX8gN`rrfde1T>yLvx?U-zC8E*}^{xZC^=2>+%+c~S@S)~u* +su#yjIh{JGwANI}5MRiXB|gYQQokngRf}OV3n#ts9!qT1a*&h%i=?-Xz^7p?KYkF~A^ +gY{E$tk^tJe04IvrMS>2wc345$Sb)b1$!Dk3G6&B1yi@DQvU8aX(oF6t?kAUB07|z=IF!5I3xktS`vT +BQ*Ju@38l>9<2Pb7+F#l?b42D1g6R=aIf?299!h)Ws|*K%t5?F=87RJ>%qggq&MR^yL6yIO_bDGa7i!M=FufYc +@dkB2!*kTDvjoLxKRBN3dc(i3}QrD+d8d#Z)x?>S)0J|=Su%;Eru66Q#&?Z~f+O@_JuvBSBRDKfPw?iE1z_(r2%x +QQC1PQQ{uqlN?W2IRuv=qJ0*dJiYwy@0x={6sBz{vg}ic5Na0R~?-i|XMKg*EY>r%0bjGLkl{&Q%i4Q +fWxHanpew0IwZpL&PfG0Fu9&97DQIG`eMQ)J*GDp;szbs|qL+Al(* +Hs(wszu>m!LmxMZi-3?f%8yK4>s~5%m3G-|@TSd@GTnYl|HUWjj&fqBl^(T7`JZtu{NRgh|2#(8)4VC +VS0fL8<>N0#U@V`O2?T7V%>a>wGj3otycoo;(P6l<5m`J=8n__PeDcVMpOeH)l>5>Xaw`qvsDwP<^WG +-%NPBw~DeOYa=r_*Gy+Qq>vNK}h)Na^Q7bGR +-xGd6qAV9gD9=_S_-;^j%jT5MOd<8PlYdl5h2VWX-PC96&znVDfF4g0}ynP@s6=OSL0uUblYt(INdyX +=h+un0`LAovG!@D-k>O6?3xmK0LEb*S1RLj3O1i2K%Nf~Y2><=FPYvFDU(rq1b22 +>uwk4yHAytu2d7r1o4yp+Hl7{WVtF+l9-KtTl^l6b(7Q&o1hLPw>mda`JEHRPXz(@#qjQQ~^;o0heY> +;mIVG)a+vAVW6Bidf_Cp-uY<07j{dbi+4)5$gU1pz1isH;7{LAvd>FgJxv1K!0Ui8hlIGUz}A^VO`YY +o0N{2(Hz-UAt|lf4P51w~5d?lL;1cS2VBNzSuQFHXK+NvTz}6)ct_G*FIw8c(!h?l2C(mTdSo+J8 +v&{^&IP13E*f65qTHZ2jq04*kKRat1yLk6biaVu2;2|!~SOH(u=@&%eUNVkQa<9--l3s|#dhwMZM&doQVfykmCAUpel +ez7w@ZkQwIp$bLUwj}ZOoEYK7Zvc@D{s?Rg?Hmd5&-fMp-GMcbDc#y0x$A&k}AYi +=>CKIdNJt9TOh2(X~3j(mY7FRm`AUbq5o&Um6#jIFO)_zEt;3Ru)-ghIo;sQVzFfI5RIC^~N+T3m2T`CRfwon7gIP*+dCe1D1@g>c>kO}}w3Q2WtC>E1 +n(`-l)FExkg*T9`T??43%!hq*@qY*{Wgo)VxFv(A{lXCM5Ibj36C|w*UffPFo6QEHw~HUGX +GcCW`lHFq{ZQ1v%ITmgis+Hob5uDE(&+LLVw#d#YrMAaRFwc*aCB2cm<@}Omvp%p{&s2x`2x_o+v394 +l^!QhA``Hzap-o&TPUWr}^=!{kPM$W+VXkq+ly@60<}b;n3A;7D{F*dCDGu-2}l%#;C<^eVuz>h91&w +A|Q`B`2(nSJ^~4t8g7UrnnA<1;Uzh4(h{Khc83#2_I??9NVggAF709)VuoU0zzVcgcRJC#P1jKJdRGx +;R`NtD4Y}F}>|QR6{(y8_SeSx)=!DkE0^TfaAui-;8{k_tM;(TDM0>FQ5=*{GLdH7PtEJ$8bX%)M8$D +__>{E`-j0wB=mry#GP_i0rOC)Zn?7C$MneOT`^v7;VNLxc14YRUSPD^0#c_x)oBT$g;;Wl$USWg>?gv +=~;bT8>^;0RbUab6d0Jglu?fQ?#!ZaRoWC*3Y~dN`7p}51UC9$xJNZD8pN^7VVOO?)`4l!U}dV?L+S)~8WIiG8dobhHwk~Bh+Pq6<6$M# +)pK(|y3J4wvghi^lEb$a$iW?6aEED8=r1k;q*MAlDa8W5;!k2G1bMY>9FT4ksd=Fg6?=pSBcBC6sgk; +-XHxkslesSf$AJ?X;KLq7qMOxFvX%nUZOM}CQ4kV@JehODjb_R1gRZvM+BM}A2|2+wIYg&-^HzJE_G@ +5DLZ-=`L0IpPtnzKQ%SYR1z-~;NP2aTwz1kYo}@#wI1Tnx2mvv +fJMDi{cBo#vTME^0Fo`D$Q2Al()!m>Xs)c_fZ}J2lO%OB*um61mjurMWWKj426a^ +@y~yn>1*Ih-R%`3`Sn=@z={8#$HJd@)%aBir3p{Pd^282#<4LJw{6;|tAL#ph4NSx_$sG$aw-+Y<4V?XDF>w6-X#m1HicN0@vt#+GSe}X!3 +e`n;oXy(U_skXKI6{Qa)mp!))>-lvDjC2jmUzrBN$2sz{-}7Y{eI7^VBU2P9D>jSo{O*<^YYcV1=W24 +vP`n3?lof6@3=Ov7_cBl!oL( +rdpD%8EK9Pe%uGLs%pOWPS@|UF&Et}Uz5U=C_(bzG+X9#D!a2JpDC$k5z{jC+tXcIPJu$W@6Z{>hd598g ++X*sp7#W=vJ){8z{un^(8BTJRse6FxV=lEwjmk0$gK^OBqsp@cbmty&IS4vkXX0Zn`-U+5alW9(4vRE +Rj5Z59|^&MLx6P!|=Eh|HYO8JI!-8a7ffvd!LQJ=)k#RH%PZhow3D3d;sEE6~E3hfk5FWjJJEdne#OD +qISkR&IV&!kbhZY&tVZRu&Ylrm|xSJ35l|y3r<@zVFNq?#|9ZbopKTMAa+fz!$%HCw*}Ze3(0z901-; +|EP}~h!q`g0tMi9$RWJdLl#y!pUcJxSJV>{cy)hr+X#hT?6*LI+t^`nq1h^~{pgdhDN`3;%E)+F7;J& +mknD>BmyR~`ZAws6AXzk})==s4*CBEBwuG6>n=Fx6AxoS;ZR@GwY9guD}d|vWcJCVwHj?3vIj2skFq~ +eqo>uZy{32Ah@tH@gP1^rrM4~|2QwP{2+H5=!h1{XAoof-^3AaAx*B0tn-9Lc@*WoPARd1*+uoY2P}d +8irThoo#7=-{%$>MbweF%zcD*`7P=Y4d_3(1YWc?l16ezL1POf^mY<2ucZ&xYCQc?QHXY8hF^8isp9kqS$&nDxw=7d86sA- +uOPDT_8=~)SKnnPlc0q&P)6$#|pI+j2$YH_$=zJut$nUUUKt{gM4RKZ{0IT@7I+GKRG4V7!-3?kY)+t +j5q}x8k;|}?@CJlrSQ!422cDIPlg5fUTop61ZxC?VU!-g#m-e2!-@us?lV?jO=^MWAY)X +H$9J1MZf<>a?28LfdJ4THTl6AqEOuCt#zbPzuXqK{p4a+eC7cU?JsZZxHc9x6}(nmBe&(#;z9VcJ{S- +wlNW{0~t)ZTqnmIkZ!Ya3D`uRO-sChOn2DCeaM{EbOEzir>Fh8kkMDeE~>$_J>V*rt$=i!?TnL8HRd6 +2o+?QQKF@+9)X%P#oiZK+iA|f+c3>g|IwaeE4Gf3HaxLZbgp*62Pe7!dLF+RZS(O#x(GyLfAJ+5fo*{ +|SHxfeUdd0_(ZZ~<75;{a~?R5ZZO$M*Z+j|WKrZrx4#^ZtDuyK?LYnN6q`T3#rUQ-x)*wl08a^BFuK0SI*TGw$$Wra)h +FmExq}#&wB-J0xGVM0ccnImK?PN?1BV|b0JyTMqiPCmajIaT99ba`wx}{cDvwb4!ro?xTS8I;cn3%O{ +H;VOW9?K%m?B8(dT}8SE?!sfNZ1tUxepbvw&8lbFvRn3vfwp(4knoht5Xb6Wv-`H;K +7dTn+;J?Uh3-7!oa_y;~%r|sm>JdX$?!=cPvWTUiol*i#ox6OBwbxdVY@@LUMX$d8SRRaMJAK}eBCB_ +~^G4gEa;RkCePB|=!CWSF*X+;i9u@Aa<=z|BF5(;viMM2NO6mBHZEgo|-IVAZS7=)!s?U;+job2=yk? +;%|-klJ-h)9Y}4o{mVl3{-`1fV3~I@TF_2c+BW)CK#pvsz&7ZD%;vQ*Q(P#I|O;U~LeBvR$%uA$!-sN +?N-Hrc20*@UEoKR$7bB1_Hdr;RlX{KzJ-S9$)WvCfAPs@BQ+bgRg`JZagl)k7wcO+7N;E+uI^97cdURyx)p-Ddk +ghmE?vyFVlhq5|1ZhqD7RGq|ufQ4CheAO64|FK5~%-HH%5T>&X3QF#Z|tMe=Z#Q^_A;gm*be)VF39m` +DYesjsn8rXy5@S~F`PQiP+He;2!vgYibfrm%6NGb$LFg?rx++S7YNNeDOBO5*C!G>{S5D)zF_=lp9>D +%q(EY4WB459%3;=v{EfMuG?2z5xe8L3FrrIMuy&;H=-u?&J&ce$Xfv7J<&4hUk^JxEVpKY&`b*IH{z}ld>g*!`a&9ajn3+L%QvjfNjtodJ8TCim&rfka@HL +%(;1#A?r3n4^+iwb1HMQQFej&5B)Eu%LCkq#x;@oWwHqIHV=cYr +t?H)s5QI8h0gj7@yBF=`PyYZ7ziy#gXP30CEXpuW~YW9%BbH4^AV37m_q+3KONTa*G;-n2s}@dkKAR_rQqCrAg(fi=%l0} +~&D2{{Oc$%ElxVHfc54pg~O0?CA&Ww%q0b_h>+xTq!_(rxt&<4K#Yl8D%{(}T!yZ62A_eGYgj_55Ty1 +@(p|(C!hIyTZIqj_HtYi${3lyov`JfS2~ut{NJDNQo-t_D1bRfP=kx +R0Gp#@+i%UsB41+4WP##=>QH2zch1~pRi+#DKF6p+bN1jj6Jc=GJgr|Yd56CBxV~D&PU{S(BR}z6V^= ++<<7heO@)_l(U+4AC}*>ZTn)Svq4q0ma2eQRBWm87G%WttwlXH=x6d5~_aXq$(0%L>b;bHhA9sKIilr +!Rr4D!86WI;GsBzBL#`T#LBD8OAYV;$Dwyu@TZT1Qmo#t72V0coh8#jme~3kKTZj~lH+1YNV1~`X^{hwuOz=)fP}t!F2(NI3?d%{F&=W#Jw&v5{+2>dF1)&gIQ%UX1V`ba4J1 +cd=B}7B@K^^P%T|+!k1Lse86G4&`)1*%?~=KQ=T=7{=R-xRU_+iv_gU~}xWjnCkqn$Y5dneVSK~Q}*2 +DS&kKK0GwzxY92u(WGXu;iiPGzXNf?bM^O +gJl)GIfx>hDZTslHGqDW*~A4VC2PmVFxWK3z7vqOsyA1nJ*RY@RJ%L+8W_@TCdSNjvASD<{ZSFcCjB- +T!kK0#g$x_p3N5ut0;b0ADRt)}ZqOGVw!+qNzx;z*q|_|B@+zE-?!i$u%X^TX=QMkA1ElH%@jY`YK&R +;1FMb7WykRRmj>Cvi^*2;t-zCnQvI62{zo3AFj;i1PpbHi5la1>E9Az;==#32bKhHQqn)x8?I>{iAPx^DG>h6mBG1d_g5zt4RAMQ_d8rLVs?j}qQRbx>GzmWbe12c8)~+Wqq!bVV|$4j1|>J`= +~@a%x0I^86$e}lbjNS_EdeBunb5S@@6+owV>m3 +`vhqAI-Sb!rk3ff;4^zRIECHNnty^`n(+_UP5Q`Hn-;ZnH2v`Q$ZjoU_HdF1LwS3(~1Z-O+JDlgIhs+ +F;uu|sNw0Iq9-|5#ZEL#ETHk-tGT!QBwWvPd8*_a0=OTe}ma!6{zV&Px`-w54VSt?nlueUT0(rvbn(H +bF|Vb0h+$ +aC5X2iD>dBAE`Y?qk?N4D2Mll?Ak~pj%G_1e!14tuBh}Qx=NC2N>B9L!~r1_I%B_uzA9rpebHq*R>a45EH5UV5;-66m^Pe#24wj{KB{vgp=a}bx@N8s~3-K$EF1)~?q0Z5g|4<0o<+zQK +F^8)m!?Z%8f=L6?aJpIzqi$7TR!{nRic#5lV3`VHBTgKs@iSGGGS7r+7wn}&RfEWw6Ku6ir4{Yf^bf% +33^rRI`DTThV+fXM+sKv6K^D>)|Zi|Pyp6bRxctjP45=5bK-s(3hnHr0>yWLn9Nl9ixBHOFhMBRd=Km +yF~J)0A9-vk-8lLrs0W+=$Etaib74Xx*g>TawwtfNPPsi~RTHzTjuh6zuO!C+L!6gBp-zA@W45X^Ur2sOD=!^z;~89tPrF +;VO?^J4e2OwIAYUl=7++vLO}7CWyt`?4EQB^gKMMT5|F1%LH$w$WbNj4-aM+x!;ujAsTLI~|W_bpN^`~uCY<|-I__D0xVM`{8c>2 +9|tOv&k*qQH1`!cvW@M( +5MP+8x~L#5$kiRmh)en?GzTH05O7x?*jVeGN>&VkjwEXWm<7Wm(wwTx0i0`I-lAVJ1#TXB)L?*)O}ID +!J%9#EE=87+nT(dJMcfTRu@2&oy?&Y^|F-cnekEL)blsDf=yeesHZZZOz1F6{w?5NhRX5as%``JW1W7 +yR8oRyqaA)4f!{m*(MALZ!h +RK?MhNqCwfe63ZswMvj)HmcUY+=1;yER%ebBV^XE%gcSaj*1&w15UDxGSVJ5Ehp@#peCDvoAodODFg! +KX!)ZK49>Pqi^Q?3;*v=)_jA?5=rokaGY@Va*;iN=T*d#K};VGSY-s%rWXKRMvUR3!TkolhbMt=yP)h>@6aWAK2mmD%m`#xjbHVe`%Pte^}Q(fJ3yM6gX{lU{{O5;&9n8pL@k7v=pbfvc4YE!ahnpwG#S}2N4#v~mT=7&^D1jc +SCMJ#9?OGjFIiONTQWo1gXWODKsI8Z-j?^01RLPb$&nF=qBcKB&aV|PD5Omk!R@zk>LoYA`8G5-3Lun +kvPELxesBz2j>K#x5C49pM}Om}c1 +kZy~xSg=yF$GPr2LxzmiK-qCL1J-&btjlN-xXw6hP&MVag18V7clzf{l6AGs<^c*f0;WT-9KrNg`7W3 +OP$)Z#e#OTTj?P~}J!DO(Az5x;TN8?fQ(x@MflIb9hX*gR@Nb_)!jH2Z@T+n>En9t%tKom0{EpE)bWb +(=49F&EDlNoyCR2gl>D`U(lOKcPg{6)(8w`Qn}-t77X13r{FsE5iJ+ois7zA2rAz}|oA_3rO_f8O_qmN6pNJ~Ws<{?8-QZnbi23JQvK +x)s*3FRfXlf6TA>6HO}RWxw_uAse%w@3IFBu8Y(g=do&qNVih+5f<$-ag&+sGe-z$PJ7qv^Z_tfM#=N +zyF`d{R6CralRW2&pQ=~!WHp&R4#urks)Td<=w4vwvTj@p91E;QPOFu~%~`EFj#Yk$Hy>Bw`gGn=b!k +@-oB+4yS|ko8tRU{og|<6COZ|X-@5D+p9shv!U#`3H@o|gG=n>pSzhZO{@9R^Ohmo$dDEMQemVIS4-Q +cae@6aWAK2mmD%m`)i*($`}r008Sy001EX003}la4%nWWo~3|a +xY_OVRB?;bT4OOGBYtUW^!e5E^v93oNaGqRd%hv`&TRpT?r&Z@Ab0ZZYz-rC_1IkK&lEw+%L#fnJz1) +Ol;Gw%CEoUc~%i3HIWiN6t>SfYp<6%#~gFaxy}b4{QiIC)2DxW_Eq`v*=J9`dhxV;`sLT3{d4(m-uuD +D2j%6P>+<#e&0lWbUfq_@?p|M)n}_n}yZ^Yky}iosKmGK}+nZNck9YUw)$Pso+sE=M@A>57*N;AXd-H +gcPkw&=*X!H6pRe!B-H+w*cgD>7zq)>Wcy;yj^?w=m=I-r7e!c(s?%rQAaQWu$e*XQ{{q@!3_3QG(J4 +gKcM_t`B*3a+qs5g)0!_Ph{^*oOZ@w;#Tq&&I3Ezf!HLwSDvaDD&R>(_H7pWVHEyubP3mn`$chmZbm{ +!+@HukQb?d~f{Uw^jh_U4ECtNVBC+K>0w*X7~v$H%{AVt*{}?tUq+ +uHKgW>(@6AbNFn;W4U_!`VV*a`TS3JuWx>Q$De+A`#Q^E){ocsKRx`qhkyF&+w$f0LuOk3bp7`FKCAi +Wmmh9#Ugg7I-n_bg`*2;Z9?H-B?cvRDJM{$E@@OV}h?sR&{^%_VHaNo&o;+^!aE1lutbQ^x2osU +Vg{yzj*fYtEVqslrO%1UY?Y1o;-i~?6YsbeDb_}^X>C*zJBralTuz>U;nzrZ07H6@_%mej~Vi(yX@ra +>&L5`+lRUI?{d5knc(f~^5*KV*E!}_*Eg}KaupZ(`Q88O3~%q={>Am?Bfo9vAIr^;8I +D_jjk8QGPq$%NYHuPcF+^^QNn}|8|=rc#)5Par0w_{^IuT?*6iTdiU_iTmSqdpIut5%g41ZwUlpP+-*QgzE +&>t>ARoGoB!DMtuyeNQOn04|6^G`*-w7*hrCdiHr~H*w)Zd8o)_9Oj$dCm-oLPHc_Bm27wRX=^6LxD= +{$RV4Rri!&3MXlwz&L*kE?zC!-w_b_dkA=zxFwa=W*^#_wPUWHt%8Te<&aJeO&`6`RyZztLr{}>D|wP +#NU1D)eksATmKJMHRpEsHlF(Mh(G=G%d0o#O>j*NiK9LL{Q1SjJb~|De)r9@&z^kw{pZhKynO!b({Eo +s`}(WzpFhd}eE9j>8=rjo<-qODzyAJ<=THCT`>&sW{`7g?@!>_?_Ig?NabD +Ij`ep0exa?=kKgY7?*S_#;y{!9^zl|+#+0OjBR{vRJr+d5XHGgYuSuZa#LI!LZp{?t2S;n5B_q@BD`E +ajW%iqRwIhJj?tY<#b&TY#-W54X{v1ELHIx|W?M$3RX`pa@`=jCXbQaN|tvmcl1*8E(abgo9U$&!VC1W`+FG?G{kyrM-Qja~0TJq4k?}LwIWk>CoCDXaAc@JY{u1iL(Yvwf$p4mpm +-!hr(Vc)W{nw1?#R@;s((_Aycnt8R}vL094GEA={d$BQoJ=RQV&x8Axg&k{NWttb+uWZX`2b<9{!jc* +8J^Q@m!z~Nvg(LII&h?W;^sK4$tf?<&KDKa1JxGVda#!%P|{ri^Sx!4Mxz6V9no +XwN8~==axbnQrCR^NUwhx<#4Gb(MvssQjZYD&vrH` +Zk4^qYz~IebTf2aax#M{<#;v>FHh!J+k3~%o2!P`Fl@FayOhu7NipmkN=|{(>v?=-zqXUj*zo|ob<4K +&Ge7mM#Tt5Eh(~1+2itIF`(m4UTx~c-&47*b$u42UCrjC!Toy3S>_x$d2T$^VcYezG^S+f~GS-SeEHR ++6IYUe`kdQg-Z1!>TtNxAOZXC)U>xe~SN_cwX1ecbn3u=N6v6ANYKpKC)>!lp`<42mlpNAsbYB4q#;1%XPuT*}e`q1UECUZDR`9Ie@e-0L>adi +p61v_2fKaOED^T?!cQexl+K$g{|6R6LpDq#+UHP%qEzEwE?gNi#+j}CDs;S#=&zSIQ`BH^UuJmS4^t| +rgit^vkhIytXPrb17rti!w$Dq_!^bn`W!p@nGl#1;fE5^t+u$+Xp1`Z4WHqRSJOsfM%jga4V{T86~jZ2O!=9InOfVs|-@<;4sBkuD)B4&k +(^c@J@Rt|tOBf7+kiTfZDI~>1a$s8u`A4mg9*w+QBb3$H#tDpwH4DBf3W7*?5)$@lyHNr`6IK<(31FM +yX;D3!ZjWbqSi7wR;u({-B{J=>D^8!`_;Kc6J{mL6%Sp%^Nf{79Xdp-u9Pr={dTt!gdC1y01r`O0$MX&_KTqQ1; +~zi{xJEF(Nazz1h{1U4NnG3XYE1kP6c5-D8;L_?=Kwq)GiHjNSXIwT1~vlQclBfCQ`w$IGxlM^AaJdM+WVS$;HGtx6J>du-b};1yf`y1~Pz*+0@fL#7@LD@oFEnpL;3@__|%1-3n2-po|DIK3|SU0<}=>Yfx#IZN%=%F!U*kOenT=0Eh;t6SD#X=M(G6 +GO7V+Bw_h}AbYM(BiA+_tjU2Ye^5#tyNiHI|U$*hx5801GAbb)6pUYh854N|S$J=X@-G%SQ53)|6AkY +&gQgRwW`ZLnDM)$1Y`M!Y4#~WAQP!e3pf7+8DHw@S%&sIxo6j4t5mQU8`)B!-U#aHYD>0LS<37?72Yu +Fb-0nIslfuCw6F_vI1-?INiXZc|5q|f;Y(kww!Wdz-E-#WW!L3;lAe3N0TmO!!IiTChlYRhanC2V%Ef +5H|#4Q01yy0Fq_=~As}JCV0Wg)sQ7XNLK_J|;f>)+gzc((0<|uRQ_#9M0=?nn*nlQN*h!|g5I!)I#AO +T*3KK`#G3*@h(J^O2xk!J?&32PV=1P!SSJn;FHGVH9LyKrbcG}rk*>>ds&cIjVAAxcKA#xNUd!&brjA +Atv!0Ymf#AO)eDs+I@!sRy15sBxJWm((FK`kBt|6tBJ88YB}Vr;CjLhcW?l#t)S$iP=M){$?5A{8FfP +5n+16MT&XCQg`N1r@zQnz3Mq`|i*_u9En$?ZAB_3ut_#>{8tYbB2!2aDtUC=IHEj0s;9GCc!kzCYj6( +2TU%g(cm%UXFC8+pqF#yM>xv@<6v@&N8JgBkOq12Cif#QH>2K3+Nv<15l@zYn}NxpitrdhGMTM*ZqC! +lK?q@;cofFU$wQVpn-&ko1c9ot8DQlGm3@_&2t#D84HH>CdD#T}Pv|?@3)o%okc_(%x%z~?mBa-5Juo +fF2CjYJYq0bNVUC$2U9cx>Lz+y- +|<9@{Djq_QX8%Yi)ybzx%6d%gh7sCnRc96nnJ)}+xY-J-K#~laOeE?ruB^nbF2-cMyh}|mk;|PU*Mpvp11LW`Zj3C&rX^kgK6-}q!9Wiq=(urjGWSLIN8ALCyB10OSXFSq +tGbv?6QKu6qA)aRMm%Ml3TIj${BW?^jaVd+KM}hYYYkDyJV0R +!v}tBFGe_W8M__Ak@}k8YT~-b*009Vi5YB~^4r|wH-L!e$;31-@DKGBQlzb=Tu=P9p+NQ>f0TEN$F5O +}&9S*Szg(z{IH~^c>$tz-jHazKAWvAKK6L*&q;ctb^BZf_y*GUg?je^~`Da@h%Er(*1JFo*<1OvQc?f +4dp*BGnh8*pfd)P?xbcR8d|6%+%kNa{VHfkqrQq?-VkdGtIEVz-&8A=vH%Rb1WUVvVw^-<}eJ13ctO$R4oyuHH=w8eayi +t5gKLUjXaF36ssO#G)NxnIJXLtSkIE@P2?hDpy8m;{f2mSWQ<%`mXS|I@L4TFp?=cSIC8FD!@#Gxp#e5_JkdSgI!$naN<+7nZnmp|Lbp_*DO(+CU52`WVO!!+MFMx +Sc*8VEPw?4zBc|F=Ktj+gv0->d=tISWe-KVK^AvbYN6%mJlmRvDXf$&e0{W4a4r4^;!i7ve8C_Xo@nu$-@CoJbz`t9pQvzzAyT +u3Y0KssfKbI4$we|i-z$uSV<-MN?fB@vMExtT1;t0J14siT9U^>A<0#PZHgoi+HOipfreO7DL^E2AiZ +(^`=*Z~1o=1I#o7;%q}Ex$B-}P-2@4_FIKo2mWrgt_hl8H7*|n)pZsxNHu~Y4Zyy6g~Evu%~XMztdVD +>{*WJMfoRM8Y_s025HbBs}$p2Y(`U{TjeK$}L*pcFt6avUHAGC`ZVm`vbin~{++7Ozxv%{Vln9Ip_sj +5vt+V`!xa$-4zhAZG4iwbIGa54NR{XRp?JmHQe_Z`FEM*LLv3BAQ`A{Sb~-Dely{WM`<9FFK?CLe4hT +-ig!r2cd6+aa38tVnSv;Ry_|TpSaxRhciXxBg%LPtid^y@Qga}g(Q4rkf)UofdF4tlx`}H)_(M56c7S +gYcfogjAj`en`U|BXR&EGD)bi@O;n(L0WESCLJlh(47gyha^Q1HLhyWbD3g_@ITIu0pGy2NU2DRKJRP +^{C^519nFXv&gy4J{<26%LachJ`LIO6`iXr1bN9h)^o56;{!D@l2lc%tA35 +@B>ghNVY(iq7YPlnHoryfRI}T+Cd=H0sAOqT7!s#G}*?~#7#dkc(W{MODG-o0DNwnt`I55fx!ePp}t8JRiEfx;mSb{5 +h%QzFR>!N79_stBzG>eh}!bC$@neabA9VMvBTmQ?5$YfT9D6U*^iPM#F2cFV!6jLg7Nynl +;*ORmZlwfsiS1>Xc+UZXdbO^AXC)&}C;m +#VR}wZAZ|qHiZ*5vjxn?EE&7o7sdW&TLQrc<~}=PSlMwXRgt@r^Wce9!2)G0>5kzL^rr;2C|pt|Sti; +H+ZpH`uzx}2$|eKL?g+7DQU$fNAzU}OQ!$~W{FpqBMAstS0Uqv1SC&pIpjZyANL2(+X*N@!>cL6r9Vk +dP?Nq^mQ94c1r$KnS7~O(wA)X7NaMWs>2r|VWd&lgnRWpR9Cdnnc8qkN3iG?J}h||;$A$sJvo02>SN3 +;yZv*Q6(2V=K*f&DgJ50S5{ZCj9`BcyKf!_{5|9GZMNp2_EwGY-iBXJo~yYK(Slke8BW?EDSoHGpdG1 +MG`-gUS{UhUtJ&M;FTSWWMmXW^QCgPl)Mux!G-J4q{LuQMXNtE~`q8+xN-jA&HC9n5cn7j_yPwK&AU` +rJ<@pj@x2A%b;}HIJOF3c1z*giKVO6RZ1j<@@B7=N?~oQi3$3MKuIPTdgAJ0HpqLOXdiy4iA<~IFbz^ +8v3quJpSN>(^8;5~NPK2i+R*5ta61QR4?3l$b37V;J^#kPq}`MaE=KuqL +LU`Joc?Ii$UV{AsnAM5Ef~L-4vosO_eCR(UP;b8ZT8fB_7@9xkIo +@ldCwQ7xI1Iemj>*#`1v+{@^Ef%nvO;7|a9hHxWCq$BV%qB#M3)qAdW?j#k(NH-CZAexMGESpO^I}*` +BoJqOR5ANW5KUmd!xAV2q$nUEO%^o2bxe6oUDN(B^U|4CFcD9|q|?fQNjg1IHb)+o=1%i$%o0MVyV$C +CS_9c7J(NEvF;p_v0f+2Eb1+h!Hu=~|YkkX_6!3D|)u?5G*z??gWKy$ksbAWR8c{a8i)@O)5)}00%A2 +iWa1R=Ps?|FS8tP7`Jy8d)cUb$gqQBcGAmbn@pxQRf-cbSuhPT>=V);~7h@z$#NH1G8j8@2N4Bc|Aq7 +rHffw-G$9#;A7*Q75bZyweq?f(^@XmP0S3NeKC7}$#qbjDIcj6FG<#z>?B%I$$uG%o0-6d~$9D?aSC{ +-3MpO2(sku|nrYu94XfzKuva3Rkq97_%4`oqaVi7iRomOuZYIK9yOgh_wpct?m8$k%IW48y+ +4#{E@6sgRj%B>owdV*n3hG|8EXfw;AQw=h7@B&FE!ay;5r*_gbaR_0RNLaL4(O{dY4L;O~T*G1|KXvp +M?%F`A5hKXQyGpns3}U%r2O?5Gm7Py}MJQ;U7P=SZ4cRu)m~|iaBo4c^PaF>JM@BSGYrA{?W(Q3(Gq> +n3D>QwBm#y}45UW?wKu_VQtu2W*(hLhUkc5VKR=WxQCb!uvs>wnjRHWvl8c8rrxr}fe3cPYChq}WwvY +0d(hskL}-wC6qR;4-)4y}{5$<-*l?3So(afeFJb}oabWodS9*mi5^w&-thZ)zfu_JeFPiC<4GYUm00da9_E +6iwWvit*HA@_T4L3X7^S8Ci@HthIckTt)z@^&Z^#x1nwxZeoK^4>aFUk@Y5@ckg750@it5_T!T~!SR* +iJ7t;MIn0Y^Ncxmea;QrJmK!R%!^sm)%9PgOs&}X-2owNWCe=~8|HwC?>3Mhisj74)`-o9 +7oct>vR6V=p`2Q+SRxLM&2pW6a$u{{E#aeESDl9>(7++cH?Fy&}71SAcU7ouNoxve9CAW}E$6=7~f{cxsh>(WF%DO&OCuu!ml00pc)`ddz|uHb= +ZL{@E-i`S!lWv;p~{9locoL02m#U%OsGVF&N&c4jMs@Zkn49EyF3X>T%b|qRA=s9j#Kop>D1dSJY-i$21M-i +==N7B{775D!#4SqnJ1P!i^oifJ+udoMwxrcKPV|4?FtFl134Gp#h~h8F|!UZ}D +y)?A6|4w1Iok~6gfDKO;^l5#{{cmTTTFu(#OUS!Z6n>uh;P{7g%TnJQ!zRSX8$iCP^rdDgmI3=rk+NG +%u1yT|wnw>sgzTHZ$4cM`%J|t0pk?**2;g7qx1?Mt0JXVzVlI2d>;`)NZ!!d +F!RkRs#0W1nIPpN||AiR?@T7r&fVn);ttTxF%^xEU^6U^CZ)(p$wM;RclovSXHP6A_55goYg! +%(+^cn=S5Gk&QCW5H?&7TSgb}*qMlW!G*R2tgj&v6@=MhUkh}uEjHF_JEsfv2AFn&6;->tpfS@GWGmj +}vOa_=jWi>@_?k!$KM6j9(GJCBy4GEoFnGyeKc#$)p8v@egf9F>NefQRGG;tFR+T=4*M=H1 +e3`E^|HXY4!=*1_qn}28VYGhh6uxtI8$@)oTO2i&99jt&Q-j25VK^N)-F*EhNmhql#2`*hM23FZKd@` +{PuXhwrZ5go4m|4VviKU_ND?o$OvKB<|b8Nruf1XNE$Yva>yX<_xpkg(ax8dvRrUZbCD5+q3m3aLs}x +g3i7y1}W(2VYd`{gqKcDxtgMkHAu*xrT10&81S^NV?#}&r?$C>)2k3($FMswMqd54W;UX$EyO93GyXHr&#lvSS5^&{J?M%aFOecVfp4X64K4Whl|o7ht#MJ_wHEMalIyIn=+XQ%5gWzp(I(~i!e;sdWzEht} +5NUGq1u8Y|9tywcq6)+%nyzEDF$GM^h|^eNm7*CbP0<$wrXfR$$U%4ED4it(u_%%vR1xnrSy4i=ATLz +Ovf@%e7&IURADavm?9B+}`n0w;`UR+br|Sorx~tkaOF-@M2%&@V*Et*es`2sfZdQ5NcrY=Jzav8=4dl +uyZcYEOwG`00=?t@Y3ES?cNX|NO4=LfD5hKU2ExDHN}+CW*SHdqjpT9?eprgh7B}%_sVlHrs$B}J%BVMEc%}|lRn%-uWQJZhhK0->&{O=%fx{ct^J@+WLsrf=g&L^sYC93>pwfs+`01@6ub2 +>ht)6eYjT03i6Ac1@vH}229{k!6vZ}a4<*poFt5;xyjFrtBC#ncosU71qtyC_o7h4-ChIVsFuV-Vr#a +o%D1ghW#1U$cp!M+2_<-5&(YG07vu9&*n!Lix*C;n1`p_2h^xNh_QFX!!5`$d#RqMN#wcO8H)8;iIVQ +4xabEVlX$2UG7M5_D60D-a_J`u!}aeVaV7dAiKS*EU$Wz3@AJVKw3Mxc@Q-a +c%3wkC@;pCWG==rI})hyP-@z|8n +$|;mgK9>qJ&+VmUHZau?mZTu-p3U&2L!kqQ}BIZP~V`adWx1XO~JzXyHI&q +&LLpWiJa3P;P4h!=`yiihYq@Q#O&K)ut~tmDozqL?E(cV3pLVR_~x1j{r&(V6HWRSK!H*G0gr}uku(d +feo8H3gA;}L#y4q5#nC^br@b>@LM}hos0Oi+fiyhi$k01nI3vk4T~gs>;$f2^d<2e>%98O{JGXt#N=5 +V8{QZPuUyn-f4_M!L3h}F?gb0)xGJtx>LS3`N=j|>iJ3H|v{Jo1yxFG34$!yZt>tbJO3o;~=D{HEm>0 +*iS5iypV(1(}o!UtOhYILcEMT7AHc)G65_GYTXzWdbX1$R_6yj^PfLC+jg<+~0F%3M;cbhI)ufea_FB +`9ly5lgV#vkC8XbipDrRO(J5S>f2$zVoyn~2y$%Dh(ocl)0dPphJpH;241&g7KG4jZBuuPB-=(m^iuR +GhFwdEQXvrY@*qr#v*X5t8dUdmkug``t2VcW4@90T#6AnXo2h*NETo0Hl#s_V*YDfV&9raCSU&i4d!s +v4ON=e#wJ1HWr}lRqa;ucxY{;*QxLGt}2P5{ZBagBGJZ0XG`a4<#FPP6=c6d#12M_5`K9N>oM}e57E0 +D*QJ}q(B>X`znj}u_Ow@9hZMnQ^_JDrm@~Y!<*m%aZ}K?gBi;ZrRl>x*`(-)MYDG5$*a6|!PH^L^L;r +$1yW`~`$HbMfmLrH#K?WfLTFT7C#hBc{ +L|Cbo=FSyozR!b_tae%h_EyB{E?sj>TbW?6X7X;tqS|9nc=z_qRM)W%aQxu(viPai>Xu{@$!DVl{^M> +BS8pE%!lk{Io+TvguKmb?Cp2+>H`A2gL}ZDmRC2ns!UL(|%Cj6U=aYm{7BVe8;hVVTL9!aqaU9o43yO +lY#4OSh+o5uSw3|1lQ$(&VzJL#Wa@+6k&X+tM99d>Aii$PP;Bfi+unGp$xiW&jUm#@aCnN81o{o3m5> +AS68qp}qnA&fPm=iF|nbiLFC~ZlliewF6_DjHQ;ZUI&3Hr;T`Gj5 +%Y8jUs`+$hQ7pGgL;ecl`o#HuR2ULE88>JzI(0!S?+zU9g)}9k&Q})wc +_JF~4k$UYsR;?7-MruC7l3gYZnbAITgn;I>cVVXwfQRnw`_AqCi%g7rR6E?FlRoFl-^-WjXgQkP_lAu +|ri62c@Lpr!0xd%U>*c{k+9}^a$>v|6+j9@9R^ahruqjDEW1-mVIS4UF{#cdW%8{y{^RiO?VRebbQtL1yD-^1Q +Y-O00;mj6qrs8Dbuo<5&!@WHUI!40001RX>c!Jc4cm4Z*nhVXkl_>WppoSWnyw=cW`oVVr6nJaCyC3? +{nL@(f;ng0<}L_o=U2nYuanB=~Z#;M02+6v7Kfzc{3h}ge2A!sUt`$>R;bycL5TVXeW2mc|FsfO#+Mk +z0WR~gM;oL_2%r|c%m-Gr)QJfGxg@;>hu@&#M*Z(ZQNv2bEn#V>ZR$b=*NzzoS4_WeP3X3< +jaY36{Mzk0#Amrcn7zl^vw9zW%vgZ16vw=1V-i&Wke1GpnM)=+eY$x?u +vllyzZ1ZM6aAMX7qHN9x7#@k@~CTs~BzG*vgW)~Xw0P4Q@AVf-}D$|9Lo5T|F4UNLKzx_D66Njfi*r5 +dOexKd@Vt~cc(&z!hWP?}5&U2I5Kv%(l<^I5qDV?U`)Ua3fDsxWb4g*@agmCoWntHBFNUn=g{cWY#Ec)ry|kMWd;6V&v8_qRw-W*QC;)lu7WO&L(5x +iFz?S@uxY8eFdBLbV>Zfcq`g?1g1ACg*6JlbJ(eZM$%X%8IxT=_xJ?_A?O;;q^3qy*37E34+>bTK929 ++Uwyb!qsb@raddMtn%sT*32UKgyoLRQQnFm72?#@~LTBX$jDx`C+0E&D>=?ZnUyScQ5%=fgyUE$@tvb +KDQ6qIdy15&lez+LjsOt|m*H^b^LwKAqUd5!$E+yA0o`K{thbH0jI!UdF{t4!_U@(o<;9jpp+Bi)rn0>3t96mUci??H)&-TuzI`}-H0-OFCs?GjhZH8b#rE@L2GZwgo)>-fC +buOmy&Pfh@r#p_4ub^&$Hw|&>`G2n^$^n$OE)bQ?Qj9m*kpSElf&T!_gwEk~-m +v-d69;v@mOmOOv`~c8_#Yn=Xlswp+`6LUg>4Arxm+u?>7j!wznhRpu*Vgn~o1Q?l6~-(C%V{PE@A20! +j2)%+{5kj}lQ*XtyU^R*qEymBxpWRAc7csw}%`nPjRpEh3_wM=Y;M4FLfu?3e%|CU~_4N{h0CaN0P +m5GuW$8enJ2+^5DmZb}hKm3&754$)-JkNDmK~QLKhaE5z5i{{$$X7$<)H2y*nWVaC$<`=>Qz$17-Dr` +@i(ah|NRq8aC{ILzxKv121qF&Td}+Qq0$Co)gP@7>EHXuA;y#j8ikPXWc+`GD#%o-GNfd^Z!=b*E%els%~>P^YszXU|52wEv;oTW{>5MYKBrYs>m^x~RxzD3W31s`9X0qQ&X;%tH} +k5B3<^@YHd18B$GmiqA5RjbodmHhiciW7nQ32QbbsrWT0%-IGDmP~WLESW4+^dP60j(jxJVB +(F3VYlM=(|Hb)ES5u-px$bYvCT2?K61xGuPs$t&aA1Ku_YKF$!=k(v?iTVoMts|8M!DY +RWOY3C2CV0J%Ftk_8Y;?NMXcbD?zEb-*pD4e1`UD9j(CT7Jn8Q9B<{-a5z+^j1JX4ogK4N?Iei4Lg}J1!Q7o?a{^ ++bW2pU6^yIvN>|E<^eTG>}=;a +%~8~rs#lopudok5bY +pCseK#C40a(?mKRH%_JauY!P0or7K&obXsfA1I4!h6+VfyEGvd`#r$P@7B$sk^oF&|8Zet%hf$~7Jhy +h1%5XF&q`*5$iqCJSv+ridF90W^F2rq$;-Z0P(`o>BAb@&H0DTCglQAHWQ +0#?3wu8=#EtP9yVVzg7vO2y#9{NZfb)AcYfe-xYba66&tlcd_EUZLNSb1iKrPRBj3mWosR0Pxj3QJ8JwtPWtXCtqfgm?!;YFNITz72T6Q4diC8QElO)?lkyQ1mFSF9}3%H8D!6+t~mx$-5d37Wcu^#P04gVF8jc-)H3aH(CPA +bO0G5u_#D&vh9FuQ)?z8{}(*A2}#tl`0C4V^pjt&Qc@fhE7rk+h&rajK((ayHW*76>3hp2%LIF?TX7h +AhbYaiwvG@r{a69*7*pDgWEd~;Oh>Zmr?Edm}HdZF6nPiSrFV7ZNd(MP~-^7=LDogHMyH>ZEvF_-DgB +qPYS~P+DA2pEhGTB1PS>ycdyebNgZr<&~TePp{6`#%`WwWh`Q2AG011mgF%L1F_i1n-Bv;fu{oDw)rx +GIz|7_=eu0eW|0){3v4?n6*&0?zh9&Z?GL^RL;?k+vDY_McRNc{q_*A{w;!}pF2xC$xEheETOekZ70b +9c+Tg~TGD;!@w$H)Y7n=^!)hy`-*eIZEfzo~gN4jVVdcmCD)h_y<~t)Yw?FCFk`%}8pM1~fGms&0v{) +3x4E`~w;QQ6CSFkIAiI@R`U0I#5f*)7uP~q-ZL(ZAML$#iX%9;AXZ2vK9`x1s3ouxq4giD{UPz-jR|0 ++fT0cClp1pZ=b^D4y4ux-G`(Z?zN1l>Bwu>MUZ^29@KYIAS!g6dh{{!3nup1-KCp +@`mDC`mMJfn+P&4`_K;cywsI$TEfkOK}GPa;AtPukG;oe?^p4GMl?zNKA(W^Z|IS1`j@F&$!X-$v76T +2s3mG_;GC!>q|UqF21G-*-MM@)IfBur2KAk5M<2K4}Q>M +OW%iL2u-n*J~FDiVkCMX?Gua2G{qoEb)2K_f8@wrTIwKAF=9xS@yw+jazuQi0|n7M0%oTdbrS> +pq?)ddf?RPAxpwc)t^MbCIJgM#7)PB<5T$~PTmp%MCgoj?ao4Mb=KY^RBaZhFag42ReG>aed4(M0Oy> +W~jTysV~3H4kAd5~4*bMYBbanRDAnig0&k%^BBxcMQJKAmnQT`T`{zQd5(eSyH-eVH=qN)3n54wYOcL1#vYqCU)^O-IV4Yp4tklR?KM +pzOjk)4KCFTT#H(x^kDOa>l>R!u^vO!Ur@M_#Z%p4K&|c@eb>0n%W)Oq*~CiFf#Pun6|!(fxV&n<4 +I@&!E2#9Ui>B*cLQ&nwfS<1)ei^7fkPsQqrSQ{%f6aaS>FX0=iz>vlKYB=(m)-S?PS(8QglD#7&`kJ8 +U8wHOZVK{Q8!klzVpv$8TE5?*+M~-SP*C0y`$QMuv(kacbPC4;5ZYwNk&`78a~UTAHHD?0PLcC(&w1- +_5pPh+bFZi{5w!b3c&xLPBe_*r>7Itmr~@Fa^uXCr65Y +;-eY?;GR6jy9Rhch!>F%0l3>Vlm)V}?7Fil#>yH^;wdBssnx%z3S$q4$0Zc})SNUk~MFUyLJ`__|q#q +$U2KG8`xL-qM`bnQw9`^`+silwi&)a%!+uenfc?ogm!wd#}m;Am^SqG^sRQ0AcMq5OU +xym&<{Fn3=*4^Cc%5%=XYRQpQaJxT2wee54!tCP;X=m{I{+YQBcOYovgg6$gmk|4dK&uJ*w@G%C6=h#eCyfFpo2LsAsD`(YBbD +mMZ>+WLDFyz?`W>Xf;npVGw7Nt?QA^?l~f=6kH!e?aq{ohe@*)Df%?Cf_Vb#*RhcIvPMnCWPd@qe|H>E7|M23Q^7V@^pMUe}dHLe&Z@>H>{a&vceTfV%1dtGiG%b)K5{pR-eDnI}7%lo^VH&;*h59Q76&Gp?=d6U2S{NiKR7k4*LH`(*|*M +Ggfy?=N8Q0{*!Prou|{{EZmr^h!}@2>x^VQ=p59`obFyZZ-y$brju_YeE~HxJiWPuFkDj~_JRKVItUf +wA6w$V>hFRDSd2r^VKqImEC2{PXhc_O`s_w~yuJ_2c!!U$5WpC;9UJ?&;y?$M^Y|zj^%hzvefk{ORi9 +U(0tlw|{xK`K5eT@(!QM(|!5w!_&|AcjxoxRNdbE_;B^`fm!?M;rhBf-v9LUx4g06l@Ist%bTma@^Jn +3=5Y_76Y*58?%w{>{X_Qu<^Ju>PapW|{oUJq9Paw*`r((yk8}8kZ@w>IUq9xZmOotIT|ea0eE0sx+nY +Dp`RkiE*LRQC+=5b`lt7|mpMZIw*1SB*Z=(O_ +pi&dZ~k2V<=M-Z&%Sy6=ilXTbEflObN%*6H^00~2)-@(R1a5oPapEebAUfRfBEGpye% +U%hz!>2U%2(gMEYHe!&tATM@#XhlKYLle`~Ky3-@bbOc`2{1uRl&Pllg0t{C}qSryTN^`<%(Q*H2e +Bw~zbL|D4PFm^XO)w)}kc*Xvy7H`h0bsB)ECyUOMBh +KGZjSQz^}S5czxn*KG|L}d-TmurF2Sqp{?*M-IrLYz_xBH%<%|2rCw}^;XW92~v*R<1!%F%7RetlI{a +2oU^ZWltqw>i`4*cqh#mcAp>EZsDa`ht%>BpZE-~aom`~r}2Z$2hQ-rT-V`*54jmloiCPI7LKoWNh+y +$5Vh*KdBlyT85v%LmQ*AFtkB-CeUJ57+py?@;>%}W|M2@4uU@}=@x}MAUwr$`4=yn6A!o@b95eeQvCo4)+v^|wEK_44`u{NdY|zkmKR|M@o;r +PSjx4X)Aj%VN{BX*4tc!B@L<^O1kec3EQDW$;~%qh7|*=Vk3jzYOc`GMZ%%the=x{9up5=Te$Z5!Mxz-SH1jf7Onv!SQc)9DGEL18xZaC!tif*wH+aKpGg*Uf^SLC>IP&@<> +6^sMx(^sMx(T&vQf(xcL&(gPS7@MPT4bKFMHM$cTRTr#>hx;MHvx;MHvx;MHvF4*bT>Bh#gPLE#qxGU +FeVOKwhB=p$75|1j(r$;TlpP#$<8xP_tHQ$=L<7i63)S7q&aX +*4i?b2UH3UJ0{f8WFs%X`vXn++vfR1bOU_^pf$fyj$aTmc%cV5FtNevMWnAWqanqMvV1@H*4Q~1iBb@ +jxu{3UAw7Ho=6I>9OcJ8e>-E#k=hma%NI14{6uo4W(*G+$MM}^VkeS%vpa)BB$|7wmO1Q~26!@L!+mr +rz#8)+w-ZZ(&^u*Vbc4QG@+Bk)_AH{+Sry=$s8mzoT&l`~?P`4YDA8_h2Y7AybM405Z^7^X?)AG8~m# +x?vgyMbBFTcI1<1lwt{aVH+&0Qn(%IyTg?p`JE0o1m#QjfR=lB+CU3#?1|uyM!6xE-_MtD`?!A>*ly= +S)#&n;^zyduZ+%JRt?EavzDFt%74iTVsNZ^J|K6l8JQbr^NyX|OY%zGQ4_#5nw~z{02HcVZ5#`mwyURo+Ph(b+W +Z)7`lDhGMqOk~eJfhDeRv+3?S*;wB8^im0+c<0R5^wwz2kbath+zX1+3;v +MVAsmvfLZ${X6u-K@ASa&I*!--dB5-yjB7UZ!~we=4F~KvV8;Ptr?R0ZZq#w3j^O~K+0bLsWA1fp@Dg +ZogFt3OPn?%S*RZ+`dYKJ9HLExcD0L$kXwcBc5;WKRuFXptyd*F=fyoIb4-(o49vUpU!7&@YzllKN0v +n6hnEl3_XG0G_5w`bRgO>!1Ex=`f%K(=FE^z_b&=aN>;4#2sfX4uj0UiT926&9qK4d(Sg!Fts>w){~dy2YOa|f|Y=&1sDl15@002NPv+5BLPMNj9}EVp$8a= +zSpfMFKL*_Z0HGA0+JSBB)~|3kpLqBMgoik7=iOQ*nGp;XG4#%*R40!4XhCF6;v}jkRk9fnor~0Ez(=11JVi#HeM%BdzT>GYZ +N31(E?I14zOevY{uC3^r*6iWMkUpjd$-TritP(`g3HwmTzvNq(RwkgPxw#+nU1fn>#I;2yJ~Cs3?BP3 +1u_)0>$c^?~LRn`GKB5vI5BpBrA}tK$3{I5!f{mJ!Ul_)0>ugxVbj^r11MIYSljmVBY8=FpeK;5K(YeK3M4C#teC9|6f01yK(PYF3KT0)tU!_A +wAGWZ4|quhk`+iop|YVTkgPzmVzw$!teCBe*{X2u3PvgzsbHjnkvh+Ho2(mHsbB>{pA9|1NChJmj8rg +E!AJ!oQ2N%uNCP7cj5ILPPQE^qm*j`WH=SnCOd5KE5mb+c644;?O}h@{;^OPq5O!O2ce5Fw($C10xNL5UpgxwZKRNBM_%-=mADr-|IHvB@L`Ju+qRv!)!G$( +!fXqBMpo+Fw($C10%>B+0X-wG%(W6_+r9K8dzyyg&-;$dV-M#Mqu;V&=ZU_Fw($C10xNLh&ssG_v2hQ +cu5B<9jtV)(y=EUjG&7(=x{^lYDhp$f(~j*Q+!T%))bG4WkFpSccGWSOB(c}$vVm~b}-VxNCzVwj1c) +{!?nOj2O}MfbTHDvNRPd43trN}N(U<)taR*22O}MfbTHDvNCzWW{cPv~MmiYjV5EZ)v@DGaFX>>VgOv +_eI`*W4kq$0qT}PdXUsV5EbQ4n{f{>0qRTkq$;W80 +lc7gOPs57Ykm}!Ab`!1SJh|E*pA+5ovI!TaD1X5j{5|-zHMo!AJ)q9gOrd9$N5{4pur?>0kvJG8?0Dn +xLsPji%EKnn^t@;SQ*%p0Y(NG8DM09kpV^q7(qSE%}5V0GQh|HBcs+mF1%!bl>t@;SQ*$8^pf1c^aLXVj0`X`z{mh +21B?tXGQh|HBcmUCTzJUfRO=41{fJ&WQ@MYO$7XhhjGno +cul_PQCoWP+6mRwh`P*pmrHCK#DuWP*_iMkW}UU<4s98+w3|2}b7TB^lu7x*-*3Lr<_Wu_ve*X;JA3M +kW}UU}S=k2}ULunP6mskqJiT<|StEk_lEOSeamDVoxR*A;!*zo?v8xkqJg77@1&Xf{_VECK#EUmzcpz +CRjm2%!Z!WlL6I9e}=m|#1OEi?i2Gega{075sV)zS;ps +cpFd5Jl^WPz0hRu))U*pmfD2pO`WCm2~^WPyb`%EF#3FtWhN0wW8IEHJXb$O0qeof;{phU(i8z>=1n>z2GEKN#OQP0&=DM$>5q&7`4cVx$wbWkV0 +6htb36v3ZGQIG*DgJ&m45Pp7BT)9LB-bb2~HoohKgoE}b(phwVS^AgK&JjV@s20eqGLC>IP&@<>+=~? +MnxmKk|rAMVlrAMX5<|UTlc#d1?+34Bm+34Bm+34Bm+34Bm*|=7tN2f=pN2f=p$L1wz&W;?n)3ejF)3 +ejF({s>s&~wmp&~tFDL61R?L61R?L66N#EW_~}chYmxbJBCtbJBCtbJBCtbJBBhtwoPTk429~k42Alu +G?bW7Cjd|!3r{DN9XEjS{*s7BWHE8XdR8SlSS)f(K?!RN2Kgz(Yl?yB;(|ZP9m+7NOP9LnYRj0Eju5I +L`#TgrrZPSH|8Y}96G7DPU@{7J(!*TE#u^iitOW%MTdg~R-}_X2^?R6wg&29AvQ2@7O=7)NOrblAUrv +GRJEOVvW$~23U0(PK2FS9kPV!;!3p3CF%t3aC7UxZow#wr&!W7kG9-$&p=(B{qH&X#6nLr=Od6!e(8` +QRF0?C2sTl!6!PA)(Cn7UrmI@(kA(Awn!BG)3Zt@btccR*=_NVUMj4Kh`5zy%i{aNUCPSojBrBREo+o%wESO9BJp>;XezHXMYbRCe-T!B(s2gN{UOXrYEZ +4W;ymOABeqLL^r(xf(ZArvMak3?~9Nw4A_B6#~Y>eHaeSu$YGRFkG7vDs~VvRI=D3AdBaB+9FIW=9re +9HWu4%~pe}_Fz}AVgk2aU)v^*d{sJMsAQQ0(1()Jr@?VETuijucCT5#F243c^pD+S9 +TT6&TvMCqclR(PDb6)jqFhNh)YAuD-o?L2^V^r4sK4nlbE`2GQ^HGHRQrV6yhX|4Ry=NMw@2Um2f+hg +VF9)o{qiBP9o^^y7OdtN91wHeUc}$s#*tB%tP6xybo{68STq-Y9g3q>;u7Uf&G^zMbni|-u5A%3f&X< +8~7#lg=peR2@^0HZq$%BttkP^;t}K+L7Yi?Et`tH< +?2U0<@V0yNSZR*DW{6g)5V*Y(JF52<^h9I9sjx8t6n59F`5P`gI{AQed;pmw#V +YW9pV73)Wt%7!HkO(&k?`)VMurCr)A-4p?a{oAjKq1+oag&!gKs4B_5e647;}jtn?#@|fCu9mlEQd7& +T+ETGYu_?Hh8EjB>p2g}OC0&DA|9E12}vzuu?=y<5xIlMb>fhaQDfa4R#u@CM!0Txn2P$Oag&!=m#xE +WAypXab0HonL}*SP(n$L{0YX86G%~(M%xtRcB7`-#euPx7+@ur(mO&IopSlBTGQROf8<^WjaehI?^#!-gKF;o$`pl!1)%r}m@khn2Yt4`w6(ZMT8mqJR!@Ek!tAdX$9klvkjV^(o3gG_x48fxyJ +rpGEGG&m+{2(|xbtp#GuOLckTzCngv>_}RbwSp}igvxmWPY*rO&b?_SLM!Ca3O1#JVX9!qi}40k#Ta` +btW4TqK52=O7=(u;`R#{0F#=_081SKSN|AuQjzfRU{SKQ|GwUm#B +sTJ<32*L6S3!Wg(|v+SXW#A`+omO$5deVL^H}0ySeXx}Eq{CDXq#M@|4z&_o^e&UT=p@2b`f28L%u +h%-_xmF%(;@0O6AW<}<%Q%HV796*();vuTkDz@1V`6iJsH3ycB#}xpp`0RjuDmECx9<*Z}dtB;XN$Lc +QA{14GiqIet6!uV(#2w)jMOHyF=?^EqDM&^I@8?}%-_CbaDShGEv+@n9c2d!t9I#j?TCqDbVoEX}IYsqZ)f$>RyRO1EcK-1I9ItoRJfGI!cdK)$UfD1_gbj>z%w_S49;BwjjxQ^mBfbm-zX642 +>YhGZR7@F>^uZH)N;a3JxI)w9q0dOF5+@Q55`@`*F^1@{*VeREQ`M!%e{s1jDJ$WHWK-L*a1K(tA>$HRs$#=jRv3`&^ +H@1W;%0#{>M8HP=!l_(y%1sPyq-b1XRl}4PY7ENU{=%ty4R&u)L?<7~HJv&`3zb@G_kz_X^Ib7zEFKB +Uvee+WhpMOMIc~>J4wZVckEcA%!8Ecp4ZgmE3@j|@>N_%mLa}EHB?nZb7=6vRzi{ea3tF!!OhPZQv7? +&`Ny5C)PzGSa6j?W?!lNL$Qjh=#!#CnhR29a!$xA#`Ud7`ozM%TUT@jC_k>D)060krm-Um40-Hob3Cl +y>o6voz-U3IUdoE&H5RPA_^XaX;o3f&GdyN(eg7$7{M3a55mA5uWsf~iGFv*&z}!ennp$Kk{SeGB(N22Jee+2c0Di`jRrw3<9D}FIz_qD^K#UZI;4nAKGMG4`NfQGl6vOI|)9z +6B>NrtTxiNwu#TM*Yb`)EJl(Z3DIRvY+VVwHz&RT}b+@^FZOas|OjSDXk352!<$sc1Hy(vF^g8GZ +_%4XbSXINT-4~$svcht2ofc8FjA(IQf$NB}p!%n(1VN&R-}Dmc@dI5Jph3P>|&-7QQGL5j@-JH+S7DP +fs#3P;guZ!9_Z-Y=@#;HYxgg846h-5tx2I6o4V`QlDzR&x_zUsMEy~5naKdom^&68B?fOC|v{{771DG +Qu*XksCqLd)S)_MZmz%gF?FxbzHk}R*p;|QOl((7stxUXZbmBDP+p|MOL8x8aH`KDEuRo4wn;Wf07n75;sW1JdM;J{Y0{i3Z#kima6yV!6jau_nW-Ls6{HUvN +-glOQf>WG}s;${S?gWWC2;fAghUSVfLXZiv6nOvAy4@dv(f?3O_ZduaiRep?$A7YiRZn0c1V!bnt3N2 +XZFf5o?W%Z_zC>uJjT`6-&-YE(WXCq +$&f%V-4)x?grpkDEh0D)gCzP<{y(=0w(qxXy#$JQh{{#QAe_?HM8raPw=I@R^?;6UjZ@Hd!2>ddXFhf +u;MBdEtA3pcrOw7pELkU%2*A*3U8Ud{A4*49GPL|Ey<{<(E+a~``3`ljPOW;OPS;dsKvteg4xW!Gn^M +h0!xRup>SKZob=DQ*Ytq=Y>m0We2WU%F$Snr1>R^~jDi(9cX+ZfXS~FE^*M06xivJ6fYzFQl@N%f>f+NB*~h(Z{3J3$rB^e9-FELU5bwz#0{XxYy&a5XUb*WPCQWeYE%mv +>a$hFr@BkXj3NROj|In5mc$rW;414Z`5Nb~b80f6TSvqdUQiT+A_61lwj{4s9fjE;H*qY~0lVYM2Vj+ +)ooAsuk87y?$wy68awDi|0UL!07QvcpqH37uI?AoW!juN2~k51-4)bVyMH1#5useWX-iD1mcY|>Rx>bVj-162m0X9Q&|@1CAURIsngg{9!Yk3X~_m`L} +w`>X(z9y?zOn&*gdN}i|CSxF>*)PhpD42MAl6@Ee2l)C`g1jt6sr;g-Sf`?vV +%E@v50e(m_?ARyl&UH&((m5Vjpq^#t4N_uFHxKm@;(Kpv6RRoRA5$(=*R2M7dm +yXCWQfu97AbL>2fmP2Xcf&6GbK%P^CDkcppdKNPgLrL28IRr>;TWt4r>nBCaaHL?kqool}Ql)U7xgiX +GaGl6fVuZ3hfcL~jwL;>5$$Ibr#Wrc@n|hN5TMU>j^ajZ`RZhByn|4Mz!k+TI6<3zYj@hg0`js!lF5G +ohWzDLti}rWBm6?T3?L3D`QO$jD`S>7j$s+E`>RHE!qp+m1!yC9r>~hldtQ(RP=Klx&KP!&{$QLf%q} +ffR0{=QDnz?lrnXoK3z60nk#W4r8m{zDn?gDPfTILMh4=*XC9!t~0bZJ5Jq*y4O(MKZev?QRb4|A`XP +z(HT1CoD^A=TR;Id?S`q61BCRg`J8bqb+05Nu~S+Ze!68Rj%$H9Q9fbhP|Tr2VnjMaDMdMN=r}~I_&$ +&B)V-RrNXlh$e#bDbu8;+)jAn)7L5^ieSy-~sWhxXSh*S1vla03RFLkdbmI19WS5E5CEx;t0TIoi3Rp +Ypn6A|#3NKrf&aSNArl`5Zgj!xaH4XIY9L@=oiQ8@*I5J;sqDSahoE)XRMG-J2#Lh%NJQ?*81*^23A9Ctm3w32Cf6QM_g;|%Fxbs;u^N3O$9yFM+ +cLl^de~tacBk4S3-EnMC_v&58*-fF4cnm*43YtoUP=17h?^LsKVvdcV0Fy9=Op4T>v5zGldtCGq@}{N +(%AvEU;D_okCt9(-$Av%+2-c3a@zy|$)3c$J0m%lJRbpK95@JTv67QqDnun%x1WdKEAxZ|a5g`5n4GT +z`P01me>84ofykGJ-6zY|>a}atUrdDMvhZ0g!BJdKZKV1p=seBsbQ*jm#tY;l|jteg#g%apC$hJ62Rz +~T4PWNQ@sNjONMs>M}LML`RdduVlfcZ2Fc*uv~QW$Gyq(YTxwb}>u>Hq4goL#LRA +P@(|a6?z&uYMD}Q6}_bB7`gIJII_?oWX2_rgV8q1VGV~yjD+7pYiM#69VD@ZyUZIY4lys4DY2>)P8s? +`)s|#j^pdgPNP&xQ%Jw6-Xn8Q?vh^}Ka!@;?ZW0G+y4VH$MH=?5M~goJG&E$AG-tg2ap!-vcp#TbS?3BB$Dj~{Ra)8HXdOwsdH*}|S*>R +wG8nl~GC8b?ELlOhgk&a4pWPFG;1O{8%#e)vJ^Zo`#%spq)L<8*0(XcJN(LrS-*cF;Yi=sxa_XCPbZ% +GpR?ni9?TJm70~T*xW8#Dnal;`GhKWpKrWm8+KAqGXN^isSh78jr3Wg74P~PHB33eyMx)u5E?%AW>d5 +n?ox@EUr!x0$q5Nu8eYh$bCRI>MkI2NW^)+@Dk1l7I7g;`<$Gv@yy0S12b_29jUHj`Y`OF_bzA!p{QL +2Dq88-<0dcZ%HQGzgIc=6%DCVxqm9}coJn)ssB2rp#mptaRLwa~mYMd=t9cs=aksPyX-bPuT5;K0F;R +^0RyI}KMnU1Ok&*Le;`et1K06K|xX-wID#tHUsoewAUGAI%#8R9j-Zv#4RfGn6k_!T7Ook~GQ^gJAQe +VQ!4G*RF8_|_Ax$sop(cuvPD&I?8M-7RK`}Bpb?7eF-MSb{r7Yy%rq1t7p?ubS0tzqD%u<@U8;Ls>vWE#KM!VDs|_8NFnj|nzrAI!b@ei +Un$Mrbzf#r7lztHfS5FcEF0v|T$oj( +jWDD2MS?MJvo0m}cTG($!y|7U;RB>K@Y$;wD6*jIiKm-|~pjWvl(JG=>Qk#Ze9lm)~Q1@!|G#FSY;!z +c=UTUB^IOc(Kp82F~E8@o@Jq&UkZ5tm_{*naS+~ZRBsx$ge5Ejjj>W?XeV7$LaL~CL +(1?1QPwm$xEnvjky^G09WL>Bv3BmI}Q>^0n@F&jWR@HKbS$l~FICi`A9xN&Xm +R-VvOgEJR18t~^|Y=6A$b$F7Gw;@t0J0wx!3dK=ZyibGr&w~HhRQyag46O&GAHI_=g5VrL0C$u`(Td4 +Z!->7@F?brvgB?=C5L{PJDW0NnKu-mBq&XdW5lA3w6Zc}*D+u!QDBqC&~CuOR+axuftY}t%6rwMNyT-Q=n8fx9 +#r=#;ak*RGNg1Hs@X!X?2ziq$tQ1mF;CZg@kqP;Nx{FARg$vjexvTyI2Phl0j9Dy$`W=NTx|U=uvg_J +9A4!GdQVPMa!(~!YyekE{2Z4&&eBF7nj@ei0VtIGXWf7f;!$7~LcuATRxHWf9LLa$+&B?v?cB%Iz1mU +*pUjI0uL2vnI}9$~x+13q^s=DI8h+6CI!OJI?N;^oan5h@l9-$NYPHz2a&7W2lXnxjL<=n8P(?jzGGH +Hi<5ZQM)+?!`32&UK?$ssXiR1A`74YsVAEtDsswP6^eo{SjI)kvbh9ov^b?F2u5Ip@cb+4sqA48l(&? +y%1wkx9L*d=(#G_hAgqoMb?Buq@da-*8QGrmyW>ynIv*+M;Z1yK|eku3lU%DYRTrX-U?7{W9;=nBqFW +xGn~uAP4i)xB1|1F*>!fD8%hQ&9!G0S=^MPTMJb9Y`QZR>E540=kUSmvj3!>Rt^cHkRs91R_;-0d;tF +AZ1o=wG7q1xN7i;eY(I#fFKQrA=|Du3hG|VRB;(44SJs!L9(OKJNk~J!<41SNM*3%f=ydOmS| +;c0Ei`_iCi8V;d#~@W_=aRDqyZ)qzx*Qq7=5o}DVx8-BD+xojk%&Mo$Hom*U@Fn1Fh*qyT8F)lr}UDkQd$u`ZgnZGEwB-LVIN?uF4c|z-goW5l2y= +_Bv2C*-*pv1-K!s}qUGO|ciO2?<#eYCVlh5Viy|MbGX`S906_VcrMN|JfZY3diI<4ltALtVt_kp+(s=(FzuG-E!aYO@FjvvGj +z~!NR23oyY0IDl$yAxL{h})syw3ZDm!S6<%6!NVDSDK)r;tTQ5yb*Re#oTXsiIX3ltc^_SnRGYLFp4p +4>?DL5mddAYB0NkdZnmPC6&ITvY;SJ8RW!t)=gx2DG}q!rAn!cJubY2F)kZ)BVymdkO;?qiG9Ne +|l|x`Df(W&C%{fehc(b&1j+?y1b%;D<%~k0kpRQ7S`8=UOOdsWh15WM|mjydjRo_FNgI9zRl97+KU1}sYuY{DgNmUv_$F)?C4m>vBsnori=AIJLp!Too$d?K)NZh-Qv?+tC@>*ABR^ +uX)nv%W5$5bOlY@MJ|_iB{n7%^2>b(pf(h{i={Z(Q1!wERQJhqX*mU&$P*#S+9sv)3MXp({&GaAjpwp +QQ1P!ACm;yh1QO?jN1{J{da9J^j$DR3e +ZR$UOcpxSfP>?+-!Y)XEfXfU?@)9D0k0jH-_mtK}uOGXX;tteNe4BVJWsjTPyqL=6mzq{aI$gxTyg`KK4q>DC6n? +VRv^(g8rG}M|3Wwv5~>ayz}Ds``+v=#5`F?nI7C3SKREwm~WL5FtTs_>v1Z5^)=uh%XUMfQGwA5`glY^_)4 +>h#8I(I2fj^CgzG&T-)-obz!)P2UG2hDsU)0Pw>a4ar`3znwb4QId=d(>Wt0BXy2y*Tq-8?-fg52;i& +A`&BzjMU!!+$MHTs6q2ee5AmKvf2aai>|Z;{ww$-^j^6i5$w=sEloaWyFh)}Rj?+mzDm^RP)m72NtHG +sUDJYWW6xyqMTL70;}#sC($&7>C) +Gkp4uILIz|*yiBv_Q?aZMV*|E`~x@UMm6IMe%HsmU_LQdb2mfoq5jh@vVz%lRRL#deci*mXh3#?DPDh +*Lm*&I9!&_|!nl;q{KV1-TnVH&h@6aWAK2mmD%m`(hWqtfZ%<{Gq{jBmOvH`b4c$_`WMw +}2WL8Sz*|X_?;)mlGr)T2T>Cy4o)v@^D)%np+VoTd+JI}=RsubsKbz9ZNS{yZtQdFII-TZI0UKi^7-Q +A|H=0)GMV!p1*x)*cR=3ob1PwT3$RL|$-$8z1=m#t`)qMsO3wLdHSZeHA%Y}l%)JN31_Z(8$34JkB +3D@F98s26{2TGjuqSyanMeP~lJ)N-`cec9f1(BX@-H{w;&)j}T>ti(+zHeI>gtRppoYAb#|y?%NA=2{${y%j$nUS1xaUBCTKwN;u{XO;czNY&lFg +5W}^RkcOkKPti10I!cPk6x-Chd-RYI=z0Yr9U~nK0Cg;5+~=E;!s>1US6Lby?J$bDK6ezUYuVY9|&<( +mQb-)=9H4XikE80yGChpQT9c(?(EXvD)V+q!1Y3`ijSo-^SrDSqC}xw+dpx9_WUzR<=M^-kfHvssOv&@^HtG`uKd@gtmkSq#m!oQO|Pil+}$YsC~3=Lz7q3Nfut?(Tj +is*^3|$0zGeD7DwpcZ+opZo`Q<)2QX^{LEr0FB_hNTvH;(ixiQ?boC4XbT>Hcyr+SyH_Onubv)c?-RO +P@*2w^V($pX~3{oRjXnjB@h{@7#=(nxl#NB+bv%|CHuP#*So8S-O{fS*dK#Obhy3^zd8t__?pd3aVw# +-P^7sHyX9N$&JRKFK7+AL%ZDT0^c(CTN?daJH<}N`llT=G3`mCcEsGg?NR;HYxMv9%L+=^#OK^;ZLB% +cY35!z({%21ksJKx429BTG4n@qH$xtAA0eArj7pBt-}?HaF&Yy_Nt?0PP-2jjm^DeSVY^=Gbb*!YpRf +bz-6BmI^x2<@`y8A0b_UEZy+&b+1nltpWAqQwEn$>APkIiO?l<@}jR?7tajNYh%`0;(8@pcC->to*Uk +2=um@z^gC)C>`dhrIM(l?|I+-YD?aweR^0zmkQCl(?ZJ6_@z6?@nueo+=4*3dC?NJwKKWi`qt`2F(Fguq=V-DWs^3t&%iK<|Na +S(Nl-5)Zq)ERJ!(w8$a_$o-%#TOz#OlVM5wfCyv3$OX)5BI!ViEl(KWFa{~BzsMj7$FiO>k2os;aj}O7(LR7fOXP%)bOu1lxJF4wvFAr%1lmj@q890fNIcFUE? +7hQ@g&124+-F2u2q5U-F$Mh6i4tMKU?^Q9Ge@N2L=GHsJaN?SS@aN5QiI$|EFo9EZ}F)WSMvgHTQctcDxo#NnJG6K(EN|2g%od1Okw*T-C=VQxfJ&fQCT +|Hax9W=iBoVa5sz@C{!QeCD)8BN2}PcxhPD;XImq9wk0a7#AQ)5kDYi(fQm(`_%u$Qizz~;bc{m$lx` +ScyyRJgLo4sob;n~&_laTM1D9B(iGxPzN?~ikC$ +|0gusE`DWf&a4At4$2l*&v;lntc_@g1_2!o`#*kemZ+t5j^60aKGb107_9vw1V>>^Sa4#J(4bZ~&kcH +2F4IL@TBH;_)Z)34DPDnRfez_0+pt80AA$Bj#lgt)>Zxb#%S>sUy6xHIuBIV8%4k%`tr8l?nQMq{GEo +{Fbw1P}_FTu%fkVpDDd3ag9;Q7MrFim>`Y1v8$|F5fy6=|CHtx)6v-pOn(%5i*0YN|XC>t;*7{q%+K5 +cz(l6HZ%!f%(6mzJ+LBI(Gr41y-`T^nd8h##VFCPe+c`b7yqT)gBkWT!{5lUN^kTH{BR5-5 +*0wLk&QS1%Fv-;SPejJhUct#Z_&QvnYqbwr)h8aGE%QT|>W*kvC$vl1?kA|DOaR{Y%!n6!sV4Fk#c@EG{UliKROhB8>8#V0d|p#7dayrPm#_$1w`ZLOp=e91uLu@G&AjQ)uv!jp%8dWy1(Otw +p9EN2pMN!V$YLA#y3&i-EQ{0FZ%()KOK@}$ppa0JmgXIX +X#*Q`rLb7?xTk7gluY976+OLZFHR}^&p_sgr|8jn&Q!%wLqGe4|$X*g5#628jeBmEYFt^NNJIL5fngN2PNOUX0`=a=Pvj77aNnxeL+WiT|YfN)pTzvn6w4V^{9N4HzPHGB`F&2!UAgRK79 +!zug0nddo7D!kNhPKpw+P2Q)=j^FZ{xuEH}Wq9nen<=G|-%efZY7Pw);ohjU04GX!%d-%!AlC=LOQ1E +IB_j3NWg7O$A+05kkZuD)J7%4LyA0K|FX-J6eDe+S#kC}!C=Qxk@B4cQJ4go6M%0P#33?h8EV9Z7iVP +N})#ZAi8$e9Ad=dKghN2%hBgpI06-0Ni|JurA;H`H$!tCCi^zwE{5P +Di5*oQZ1r8nni72!k>>7C|D8^^GV88+t=~HbH+TD5nTOeu&($pAJbHTA!k&&xZ +%bVxot8Cdv!LYZUxK81^)YH#EPD!*3|yyM7+ic>@$LCn2L~I$t^)up)Gu<9baM$rx>PtR5gvAs +Z)P0iD+ArM^vAlDvjf|%<+XxDs<2eE9H0TgnK5QY*5VMcRku^=s4ZWgWET78606Dyi0^OBvV@vr~~`@ +!F^9WjPYVt7;8W&Fx>bm2bCRY=Sf_UGELF_P+%Nhb|+#R?3u6~fjfjXd(te{p7@18ceJGgR1koPYe}! +Pi6rP@!-yCHA-f3crg+(>^H-ufsPWUMTA9)U1=1GmU^ +48pb|!=d^81`6N19k(oHagusA|}{;6FkPiKZ2Pev_RhL6YuoPcmBakCnhf&OucJC6|SfojTX?Raz`Q9JbrVuXq?d@sAYqN0_ +`*x1-32}Jm5w9PCGb!l++w!^yZh51MaqjDS6zl1Ve(aXR?_2@w!isawlalZXbLLmeYZv5XyzoOCKcaB +!JXypa!9aXR9#0o^!l=mWuZh#^pYeeKzFn5gq|yb)@EUUN)=miu-(r)?QRy6klr|`Fgu5W2J0$IP1}Z +?vPv71i#u>WuOSvWPjo^Wlwt!C;9(fK-Jev7&+1%5DPFGE)&ZWUbw9$q3;6U5dkPcK4vr+gf8D~%2CF +nlR@g+vOKOdAI2h5O0oF!yL{5!mtd3Y@}>)H9q?C9|N_{I6qgc +{Oo%6)7kmY>d3w{hmOzA-@JG^yF7k1yMB3jeD(7D)pK=L#<4m5`tX0I&bgDPXQ!{#RL>8u4}%ujjyb< +5mtr=n>Z+g3cDr)DbmHlM`s=~0Z~9_AYsx#Skbvb>$F3W`)W7d7B?q~XW!dbn!n{K +L<*V`sdtDml&Y_w2^CeP?+5BuFcT9!TV$u-47JQL;sJ?V%iLw&br{vk#&Z#K%TZ5P=`A1n3cRtakkcQ +iy*o2MZCvyV?`?Ops{{HHxJKn0t>S_-Wnar4-l!RMQ{)em>yY?e#?Bxa|dJ2lT{QnO~MA8l0%E#^w%h +>iA83T+tufa-_3c@Qi0zSB<(>wcX+tnH=esr8eZc9PGuZ2U>H?n^C$ei+>zQF7k5<;SYobVghz=;_iv +V7puww|bGvq*}V`c2h?B>0aef`k`q3AhQNWQ7@Dw>iK$Oo|Rq|9UJSWENivO#TH1N6zi@e_$<}(40mx=r7T0^&|&?rE&EMd?=TtkqMgZ<4Q`dml<3x2t$tX)TtsFO%x+5LN6{%t(dIBuHTN +s^g*(7AH)eMrP8BqYt|TPr#Wk(y9~zGxix3VR4)jLDvRCSTFpi*16vD$G$6^O8UY(XEaKS&`+y(l|EDOMfy(W`F8C(c +g2TN+-;OgFDk7W?Zw*ks<#^J(X8UWs&CmS2APAQTxzyXxCY{Fg}H?*;wUvG0BF@XS)3{KvL=$&TO{FtzXoXhA;LB>E9dI}@{g +r}WHjdjK6gz4vD%SIj{(BdKdMh^U#Y5A6=qz=ZKMTPK8;PVFC%4TmzQ4sczQL=Nw?&xZlou(!;NCI-H9c_$E +!hdIH!?Fv-&*r(vBjTguT9r{{l-geyu7;A7dIa#c!Jc4cm4Z*nhVXkl_>WppoWVQyz) +b!=y0a%o|1ZEs{{Y%Xwl?OI(=<46{L_pc~TYt`M7n{kzskkGpiGz&9mX+S`0)KADH1z2P3tnG9UyW0Q +0=h`XPEq{d2u+lyZmPuSy_ug~Q{ip)@&71xo@#*lF<5O{Rd~kSrc_==eoE`i_46J?Qy%AUUTAbzaU7S +XVILH=S#D(~r{VPtA2+t1>t2CZRWtNM166>@SbFA6%jOcM1moX&&uD|IdTk2e7x1#LPiS?(tEauTtGq +rJ+7I@5;SzbLru{h82dVHSisMHH_^H^!@nu>DLwS0uB`%=6+crWB^Hie4bEuum!X{@-nOdS!B%QX;jltF#P?nj|x%#-bJIxjFH)Q&XP)*5|*Sig%(!jEV!N$@>DKZ*p=$c^MqF9p +`qg^1Hi?LD~17bt|I-;q}0MvGOUZ&!&A4OlCFJHGn$?8}wdKm96x+rPNjKfU_;5o^ITW)Z(yQ~a<*3N +8e^%A>S=1aK($e0Xv2D_Y5|^Zkpf8JHms%T&i +OfEd8;WnC@*xA03tdKWQq-=0MR*GUOcvrk`lb=)xsH)hB0`BQAD +s8xM-rc)VAaRhEePeUwLYBu`N%!m3zBN%ANbnJ&mdq5nYMP{L4}mHLme(lCMsggTDy^v@T%T;*vs9PW +wY@!=72PCyuWB9$K}k=P(N&RB*4 +;#i6e{L>oJuv8pH|6T1Z*j3y2{RSR4`QeXaLZWrEo7@J>0;+Une6{RIHFe-=ZX5c-{#hr{n7Z9pZ1|o +d*K_?e0i~9dJG`mnkR-mR=47@0Cp@2vMi3;FYFu}cxdy0EjshP +qlaD(1}8_R)0Nh~KGfKo{;msk$2l)^fNbqebg)+wx0b>7SZkJwiVA_^i3A_^iQXeY}d=0b>t5DOs|(i +nId(I?i2(@ISQHCQUJRA7l1!BM$iKh)@Clg(TmB6iy3phvLBvwSvU)DeFirNDV9rQUei6J4H9X +D-wrFa3&OqP@Z6%3WFRPk=h!KhMEZt(+wIcPC)aBa)>@b{fL~P@1TB6xg)D=H+4p8ZUgVV=WXt6e|Du +myV4JLrFNHTw--rmWJ8NFU5UzK7rab}G7^(jo=dq~x0F^FYPX)ID^05|#5<6rs+&@zCQdhMI#Jb?W_3 +SUccoqUH$}80AsAJ~$t$s{LR4p6k=;scy3)&=+x(f$jpnJjA**?FTf9zl(?8hU2q|lBbyva(AAdn6?0 +lA$I7AovpDUftb+HE&!Cx?b8|OGgj-}#rv&qgZoGCkxsvEHd;Z87-Q<}~-X1OT+1UqV0OQ-q{hc=w^` +HEmC2o#JrE%PKw?`pWzEdxJ%;!+z&yr;y?6*R(X{aaSQp+FAUX^VD8k=Q<5=w7nAWzS4^UkXW$E2qg+}e~rXGS&ZmH%u6TXMkbUojk}jYt-Sbt3iorkK~Vv9)y`gzN +aXtF(SH2;?RX!XBGjaL~>H`^oWaRSSLoZk-1Pja+jtebW&XbFG6wI+lJg6YZ8!dumXGYZPkjy>y!HYu +1AGG;AzOHme#`wiX6CNI_g~E?!8VPY&s#xrXJnCu(2y|$N$=eb{FFPS2Fwd(B*!Rs3Dy=Et>5p=D; +0tc)bt=EeEHeJAW0^5zAtc7Rffk6=ZHvd#(i$|r0#O)(K5Cwkz;dO4TnT{~z#tRWN9N6=aWFGUH9NOq +#qZUlG`}SewATc`=-vD18g?1hU&7Q1$d+c<(5O?%-&j)7Lv8SZKH#@V_u%4}`6nb>0lKg@K?**tk6%PgCP%D3bOe!C|rX3Dd6Ia +%%^+sybMU276;9R_~DEL!qxf94dcwHZ$_YrKdJ4$g?18Om^APod^yraHFxi1cl2SQHeq*%ya)OKqaya +uBj4H5@30$xW;^2izVH9Z%Z6|0gtgV0*GT{kXf739YNLLD0=ace(ldNix9>2c{eJm5XwgTlfwK?bfN9 +1>H!<79!`AW*G?BGM)#agN)^Y+JJ!Dc9r)aaEWsJ!9X6k`EL*ezMFsTmfFe#Qwwgl<50s60<(j#Jm6i +~ZuLA096@hKvi-=Y44JidTd6-ievDFVncE|HP+M)?4w(H|b%gn|Vq*+}azumHA{Rps0vdCM*-3PgE?B##8 +@iVc@IEUSzi9wwQ_U!9Y)y?}2dBDq;Z>t_ok~OMJl;I}TPv?oR*y +~KW<=(5x~mK;S%p?!n1(B*X+J!nk)bbNXCVLBbpK8$~=<`dXlMRzp!wgM98QTo>R{^NPSwO(m^(*Gyk +?)|^;9~c+e_u>Nq9bkZ@6aWAK2mmD%m`=#?R+|D00010D001Ze003}la4%nWWo~3|axY_ +OVRB?;bT4dSZf9e8a%pUAX=80~WMynFaCz-qZBN`f7XF@JVO_LpE2XUMka=mfA1D`kQF#+kRsDp*On| +6EGMj|?Zm?{Wv(u&AaY5ZBffphke-nxPQbB_IGxV&UV>{gX5h~Y=P{Cx5 +3VDVs@M-*GU@9*iJT$SyHgW>_5qD7UBB#_AX5(QJLjzGE3sLWE042dTQu?nv@Af{vLmiXW2Z?S$4%rh +fc^J#bq&x=CPqR$<33n*qMSzh-~@;EBvDZ9L{H1?;8a?&-w$5b~Zd%g39iSc*@6;AO@wmqA% +Q<5#%XI@ +!amEf?q)tTK$d;kKmX(S^Eul-`pUj+pPp_Xo +qv4~SwtFlk-u6~aythErwm@@QCi-^a40z3J>B^OBep;6AMBrhCF}S0&yRM`&e-1ZDcfcz+o$LIJD(4> +Pua=m)05+~-A%^M;#h^4g6Rr!8{#Xdyv-2FXp2P_d#Uhl*{C=ez&a(8 +n@)tvNK;N_EiltfUvmbc^>;Qee>_UsquMf~qHhmTf2u10)8B%bD;d{vyRPW8QEce-mtSCwJa2sQ}6oS +7M0T+yYK10u9ZkZX!sCvh!LsT;+_cU62n3a3o$IjumOe*Fl+$z1E?Qh=pbBZO;}sQh8Qx$OarJJ;u=E) +W@SUVMi@y=bv{HNHK-qs&_Ax!47kSzuwsZy>V^t2f+Zt?b67Qk_=x(TX0+IvA)Fe+k}<@`5FbN)3`@q +Cc?|VqI5{5sl5;eHhEQ`1=fDkzT0W@MjNlX>;&OxraRG4waRG4waRG4waWO!HoPeBwoP?Z&oRpQCG1N +$iONdK~0mLMRNDPs5jv)bt1Q-%PbpY7_vH?^FkPC*Dnh0tFhzAhgg7_B1k$j2dOC(<+`4Y*ONWMh!C6 +X_Ze2L^MERmW^gjkYBT*62O3z(o=Fczw@jG~YHN7i69gTsuG3^_xEASyKzsDbZHkSHaORN`FFFf_!9A +tnql0pigh8_;i34^<8PrceX8G4c^kFu;$&F$M=184QOQmERU&3d0c(wng%|k9e`5Rue-_Kw>n6W`a0k +#0d02HVX)f5FgMreup$28jua>0$aRNbH%+kp7$e31)}ysNH2u+j0ow;RAiCRssu#L<1M3}irF5ZAFnO +*pegOP)CYB4K2+wg#_Jb%Q1b)v1{HGH6g3qz6+0C@6*_Uu7FnQZui~e%ras~<;;DydPml#&vI`o%Bpx +MVBcdacBRCWJ5eZhrH>}8#2nL(!Bn@Bq<%M5f_{HRx7ka2Uw&u~F+2Vy2zuZQXo%9J#NWzNie&ab9FD@5P0S0w{FR#+g8V8K?oo-aQsLFQ8#YJ>=hU@DEJyW4Oh+XVH +lL9Y+fkhn<59_w;Z%QAv<+2wCRZq`sA{Xi<5oqHUFxWcb-*hM@fLANRm~NTXfAP4iC2|8kuQ}!5ipfL +kuYnBnEdbXP4(#s#bk^2Ve~NyQ3R1S(F74TQ3a7U(M8yB4Y59P5UmCj%z>y#%OlpRc!L<62#J;k;*_x +A5t@n!)pL;8HhqqV?g!(t0$6Or{;pd-2{b +c-^D`gL0%R*%7=8CJ4DJS7XJ);c4?H<73E#M}Gz{3~X`6&tVbvpJ(QyshCY3^1>ZMAzL%7L&AMply1z +1>$iQD1^&i40IOMnW&ESRbw~${k*8Cn^)`PgMJN2M^B9djS5E$9Ff4eC_f89JzlEh;?T^$Hx(*EmYsi9ZR{`a}Fj!9`QM7eot +`qCpshSZ`tREQB*Xx2t)?jMI$xgXh;)Z^2Xf!E%X)g(wkR}eMCzTXS(zOR`kv +bXvm;={Ky{kCWNFRGTWl!X)NpB9zzs`Gi)2s2%!DTl{MExWBGlg4#)0rnJa{%?nejD4=E7kc1N(`$>^_M-;3WxQnHmcO4y5jn`kBO +`LT>ZijijPb?;#NMnXN2HoW8kT*CmtGtWMMcy|^6b2G`iv~Ljrh>rN(J-=LW6c~QI|{l?;VHJU*-%$M +x9n2*(=K{$4%EKe+lf9pJiGc`u;RWe#H|J0dUrv_j86BrCt6n4-fCYJGWulFX2D*l>@0Mxaj7vF$xfn +*ir$@?bL%M$B`)Ep%6FZe6vt&|QyAgJn;F<|1|9)3bCp_a-NGBVyn{uZcF>s2LU~uyMik%}iJ~+I +=-b;Xtp5N|g<58~+Xq`j~SgvOlzV?gG~(G8f_W{@Uk4#lukY`cEXQ9LBS=8wKu&m_6R=o7~pR#0>t8XOy*JJEe@0(h$-mwL5_R?2CUd`#P=_! +5T0bOOD{0aH)w;d|M@_wF7qS?hfD-!ym#6|W01wfi_j)(Luj7sWT9M3P}^qO9WznH~k8Rrn$i)KaaEA +xuDyhx+l7&m^a-%|dqx~E=MM*pkEgjc@zKhOJ8zY3_nO~2INg|7}i2ajRgH2YD!B@37MeNerj^k}yiz +0mX=yxu=Memfe4@6aWAK2mmD%m`?t?uPJH?0059N001Qb003}la4%nWWo~3|axY_OVRB?;bT4dSZf9q5Wo2t +^Z)9a`E^vA6T5WIJI1>J@UoqHX(H2m%B4x*Riu;gelWwqS5+o^#ehL(uNrWnrPm-JZ4)@>hq2Bl+$#o +hn?gfp&NG3VY%sew3(uQ8V=>DU3hwqP1>E!s}@bvPK-kqEs{7F4?UpO!5>R!-U8s3F*5Ya)h5EN$gA^ +ArbMFBoPJgnky9^^?%^C%Q?PIJuJaca@yILt#x{w}_XC|Qb>l3U6t}3Jo?);tU_tWs(*j0 +8HmeTK3OV5#(Y)H|qkittv<*)^ZJ1_c^^fcuj0Jn*yS9`VQ?!5naf+8C{4>q+i9N^yDCk^EA9!!Od6M +>pk=keF)MobRI@`Y4|{I2o~m)Cv?8f?~}OlA5=x*O&X+Y$=Yoy1ZBx>{s_a~(mGkuJcub3i!dwUK}1e +Ly!b6iA^(sp!rQg%TEz>vBdyLw`jFKezCZm)CnAHT^j^dwg*WG`n<$(^_#~W*I1?0Pw3L0>y<+M}8gf +|~LPrVU3wGa<2r({oe-&wl9^yN!)>a|9gjl}{a%n%Jxs-yhVf30JL?f*wcRDFho-Qbi3)p*bj|Tw4(M +O~e-3VG`;&v6eK)_u3bbR&4*~cr|KmAOf_Af5>Pp>||#au9rQN*uA3Lln8!3DvqG>G#x3>xnO!6|6yE~!Apw&Mkq2Rv +m9BqAcrzFnE$BY@DiG$m2$4|~V2Lc(Pl{ob#CL_i5K)A_rSO*GBzNgC4Us#@zE*UBqT=f!>E}BxjTt5 +d@s|i8xP^UbuiznC8^6R0kM7X(+z+oY#)?7{&}eKMT^&g7p7ikWe{>E=cv1p9N{4f`k({zR^YXc?n;(k{pNHO#FQ% +;41W#<2=V+61;U@w{R<6&Te;<)63X`Qw=!j>R2LYB+c6Gce3X(_fw +UI3j;J3F5obR9PuK_j%Va07yJszICzc?lq%c)p+s0>~Z`GiEF5QE8UF+N~hQS=hjoHM%myuN}Q)?>$1 +)93LRY>c-j-UdX!y_1<&As8<_1&&R~}A`oES314O~I^tSu-v6_{F1GcpVY?B2gYCTYEVm%f$09{dd%G +Jt5`!la{#53Z=8!LubjlO}b=cLX-J5#us2ZLC^D;DY~=sG>Oj=pC^YZwbWOOMi`#ynTm18zsb&aWS?N +Zj=d&)e0CyZTBTjsqRptU`6Q(lysCaJ3rk>xmqgvDfq5H^#Wp!>cw#MS3=gPuJQJg-tb4@uO!YtE1p| +pgt=T^}X60W3FD0d9?tBIv?0IuPYCf{`zz8`JjuJABaMCCMpXytc539P}W}igrL_XorBt0UPukI8qJ! +h*PgE2)T^@Z4qcUX0(GD5sQ9k013cRTyCRv^aBXa3Mbh_%A6|`mr1i`*vycB}9N2qtZ4GO*b8Y|Tm7~ +MvfnNFjM*m-*2kPX#X*KfdILb8+de2BdxHs~KiMsOp2AJ>ahhkP-L!Z)^tFH_5yrQB|de0QV02XxBgL +=LBjZWTh!Zl`w4JUJG7jhaQc77Mz-SZq*t+jJofg`$AVe=x4tp54e$uwa) +fF)GjAOtp)vL*v|e<;>_lNHFPmo&ka31=O +ph;bSshkX3>~yP~G+O%W%J?@g~FCWxdS?v-&z}q6wukfoq>TqF_^Gp96F|bcQ;1XI8&2Bs~57hcFD$@6~Y#O!dfn9yRe+`$)n=~`)Nq4$sL0>BM?HvCVUwQuL0bV=RtEI)e3H5sk|8$ +66wqEUexkr7kp}JCFDc?0-$d?|_m8ao12$-)t6w~tcGMop|^)ksq`KrWq@s2&_dONeJd<&zP^+kx~wT +SQJE9BRa$a9fm%25zy!mX{#M1CCy4*~<|5EC2u|0001RX>c!Jc4cm4Z*nhVXkl_> +WppoWVQyz=Wnyw=cWrNEWo#~RdDU85Pvb}ye)q39n$`$fax<=S5)xXYRiHyRT5bv;)K8H~3b5MP8QW< +(JDUH#-?8Jke9H~?VJTH?SDiZNJJ%{BfA~=UN5_M&XP0z-b~3oU8PM_h)yco9f%b#(fo`7_U4`zG>pL +Eu1QSJWL>Iw-T+egp&Ub&RFv86E*$E>R(?rE;90wtdL3&_h9L{_(Z{0%-GvkWpljEA3f&j_L{p%mIH2o!{2cfR#m(~^-SGmR50)AxHdzn^(X-?G&NH0`;e(2* +bhQ7kj|=m`;GX*sI^mpc{}?JoQScbQLd(xI4`wuWdWH`4iZNO%SW +_CCXgz_41C+RRp!^tMXL{2-mX*&mCj&xjR;Vq{xYA%45-UZuV0Ka|fq~{|s8V4YLS_l#}~1^;|H9R-xm^a{vc}i^1^Z8&>p>&(6NY{76>#Li=0sO2~W@0vGospL&egw;x0G31wIj$F_s(*)jBLMU!^z8gpaPwFp=O*MJN~ZIz +eCP%KQ=%`HKRmeL2Fp*~N3cHif*>^MIEZ2|Fw#0>`whgqzC#R- +QNIKb7e^Q8V5s(2Rq$*_Gy(fs8BeD|j_e;m)8G(;2DOO_8RF)D2K8ibQ%p*$iB>D*&{_pUz)UZYO}Ko +Qvf(+pBLBbCR+B?F9-GM&2MbL%{K>d3f1yW|xkMBH$6do{Wmei;l$7yWDcllBeFn49%h?L84ZVr{{uz +B3!aY;5x_o!LlcBhAfvGaEZaL!F*UJz>%zu3ZcF5?3BOM8|WdYYHLIc^v%^YkE+qn<~|^3_1jf1dDD5 +)3|mHO<_rNu;{k16y36MZ8xH6FVM6h@vsFJEE%j?ERosrGsZz9EJ*G#Eyg>zhqtKJOW1UPrqh8Wi!%< +xAZsx@T)V6!E7ird4L03IG>4WUBw_$cNC1}>-$PQ1*tROQvGz|fmf)^)?pf +$&$#H4LuA>i8Fc^-^ywiIY=7_tr3ARGu-UktR^xjYFX8xm|t!eRn5vcVLcI#3Hjq|HKs8gz!Vc@cVxi +69vUlwc;|Rtet-z?AThSQ4BHD-+ZsVkAJo1}7fJGl3Rr8^mD? +LlG=ZY#_nRpaRD$j7Wse(Lx-XBFP%Tw(50~XfQr-RlaT4;7~MspQW(u)2pl?W-r0Rcvbo3QSv~{k!pPa6BB`kIws-Uq=^LUk2 +w%`Lj&BrpemTbR7DlBSO&O0o!C2>4Qk7`I?f*q=`k7%d54RV@ji5()uPB%@7MnIcICx#1g1JQheGOfn +7vkC)()<#0Chg-4LW~_+A +P@2cfu#*JNqYB4WLsD|0^JKzlTwXDxhaCCdXUZu%^z=wgT_dd8=w$oX8ei`^hjvV#vJX2UXZ0|%nO`h +Eo+`goRdqGYhq%FK&)(5;nynsCIzKz+j31@*LKPUy)AMfuSnapwQ(S{YM^@~+jc~KHm-_;qIK3F5DTx +DqaahaAsfpGsxsFisLu(x#FL`4&HtSjiXPXkpV#BODz2=F8|K0){e@TSDJ;SAM1hQBYSIH}$pz>B52UZ~tYz;+z6sT0B>d +Bxf_SVEfIR~*V3uYJYWzwCW8dGXA{LYK1M8c7`F +5x1)8i1ZgwQMJLg%~&O|+KMk_nip1Qz#0U0qr7HxX+8=)4t7RRUy(Ak^lYdXv6UCf<5l+jd~3pS|kNxI2&qgE|q)ahCmkNLk!iXJg^ZadjPm`#zd%gi${Kaiysd3z*Ur87 +t!iefd&D$;u)$d8y+SFT>V+#BC~T3;ov=~PfK;@g^0uKVSkx-7dk7mB8_%yQzCH(g76S{^j@S1)Pmhd +(_AswwpzHds%zDk3VUH2uVs*MTgo_5U|6wzloVX9F)3rL8(_z88YB4WwBNCSm5eQbACz!4T9?Kv%}6*m0sSN%4wcI8F_`@B>T6p!Ny+LeN$^dP!1`*tmGN0*`TiW +HNPEffj}0P<_Pk7P(bj`HYjGJzR9kLgI$li4Ut&fDXUveZmsvXK@~x^wdA(RMk{gfZeA$HK~Z{*7jlS +oX`8dHN7|5$o2&HxJ5&9>kk{=>F1$N}{|^ST$UrOyi>F}AET>L!WO2}ZvkKLkxLtN^m@)} +jBBFNe5hvAxvq@PsvtZdqwH`<-wq{7w=>ITavruuVYddHtn+`B%1pY=^Wgz7c@lHyPL+aTKGZ_q|@Fb +cwn3P&%_bnl27zvkkPLH4HnMc;(KeE@kJy1%fZ^5H{58PBKg*zrcwAaePmiBZU(q=DQz=ymynjD+fkQ +qz(0pZHtNk*DHVg&;X~yhxcD!brs<-+57(`0Z8uMD4ePBKuAavwNwEd#3S^@n29&0|XQR000O8B@~!W +!@*U6)d~OrFfjlCDF6TfaA|NaUv_0~WN&gWV`yP=WMybDEbsAHj@Zfk-U=J)VtXKzK515k`nDWw_fZnur*Xm;&6E8%$X +4#=+!I#Kl*U=@#Kt7PY#dHu8!!#>G|PbX^rix;1yjzNIK8s`#6mfI?QI0;(|VBe~*(S!u8|hB8{g}nd +LN1VwsjSh0R`|r=Fy78Dr+}^1Dp3xy&iMqtfFO_GhvzrqNtlZsRO1aGB4ue02fGbdlxN{b??vQqJghx +$@XuD$13w`4US#l=SBCE%C`@3>RMWJvvAdx>U9WUCKh{-{q`|AS|iO=wewuWN95gs7m77Jj$1fwYywODzdxs3BcadGF#9zN-3AKxTxHNh?1go_FI-?{$nC9Y~*_8o|gg>>5SrZ<@N#G;{*;7=o4f`w~`ixyjvtacz +`W^J-PmL{^gnu&c4ytgUicS58I3q-rM`^hPa5(sUbb0s*GY&qSoSs~NQ|OORu +FsCHuITvuk`CzN;PU$9@XP7JC0%^Eyg0u)+9SG>Qd6wR^pV_9dTL54(qlf6b +M4G2EhN37!iOiQT%3+eF_p5j@#Sr?Q;yX&SvPVyO4DCRDo$SJk$!`y$pYHW&z+n`ne;BQv+3#C6l~(~Ai@{*ODyuA^=|hx9Q;4Uigs>~jc%0nL>km@+Pm%m-ga*?O2+u=SH%g0;zeKTLA({d425?#4&T;9qRso?A>%V(>JVx +Jf)d7|(gYDlQ_`8?f|*B|u)>f`1JH~Y#!9U~ay +=wsp#hC_U-=+|JW5D-@6FcfgcF`3{{;G5&V01^TMfpb!0%0|tBa~cDIz{OA*D?`Pz3JDH4CJk{tRL<2 +T?nl4}lO7*392|$h5#s3M7~mM<7~vS>fZYgo2$zpwH-g=$4+kR{j$k-~;RuE!7>;2$hT#~7V;GL%a16 +UK?8dMg!)^?_34?D03&k|T5Fl0vOcI!+GSgS*m?+ekA{VwH76~~VKr{mR7fKuh7 +$|{&JOa4_!V%DgP+|hnG*pw7Eyf@`0Z|1sR%yayFe>^A0Sw1#5a|Tl0;?0?(^y@Dm$6bIY(PAL*g!zK +0%{bHCAtR&V5l6a5THf@ISVE0P=$&~LS6HwN`kjR@D!&UHvjJ?|IuzD{-?XipX?&Ki3IH~qDoP95>+) +j=qAH0x`}E6yXhuj)lF0#|J%BWY82gW(yzP8pzbCLji|dxXmu0SD6l$+th$NnEF)hx>A$#}V6%%KQ;F +WH;CD_|Vn12Pzb#}smBl_p#(u^9yEw;wYQTj(HtFw;!r|DAb0+$h!C+4eMW}{ziBWs1`p5Rh<4Io)r} +7?~By4$Y3%17?oBSFyt?o2R?<=^f%duX#@xz}P4}3R;=Z>h|@zr_tQRjgf^iAg0wQ-@o+3E}uV7)*85 +ja)|_!uer?a2val6`uvS^MCb#(4=e*`%jS}0dJcGcE*j7Jx>O^PaMYXUA%bHq +fcL&}Y)7Px7mls##MkV?+;j52ls&SJN#U=#yYIZjeP6onScA>4r?GZeqL?4E(N~&rUKi>~51SZOMzN@ +%-&-5Z)3mXt@(x0a%@*eL**{uarkIbqC_H)mLEfDB@n;uk!!J9yLfuLK7qRC2Cb#?~A`mw&tEcoIV&N +IO1(yj%kD{o$96S}~xZQ{1OvQ{FuaA^d)t%XW;+*;q93u|1|->g2{#dE=|V^(F>lS%jA&|0^0wKfYce +lm4yK{U+pMuoiYMBKu#%Uzn$fnmC;1(Sc#bCsyBc9jKJ@nNs6344EL_rzW3pt@nQps#fIVND&fx(~P; +qTTdF-wwrS-dx$y?_{^$WI;cP+N{x5!k$M%7UjBTn@VJ%*9Y=K?_Ik1nnKU*^Rl>87x2Fm4y> +^n*);tv%0B?It$&NXyWv9U`s17eoYnFPh#dwHA!tku-P|NAe{BwmeS!MbU4s}yOZ4A$%d}%dwdu?9Ua +)ak9IAD-YmF}x4>5e>pQd^SW^oIYP*rK&YE3rws<pIfLYGj^Og@Zu%LSbEbbii8wx7(WM*{Gw}ePOIo&`yo}cVl< +Gu2uqHtjsy<%6csVdj;R0MSb^zHhdd_?RqVOZd6?@ZWNOHr15jG5y85j63jWXv*F&~)n71t?Spx*HfE +u%1H(yM-j;*6LH%ZD^L~PUH{l-v(QEaF>P?y5Wa`bVo5yJWdY?AG3EETB=IW*2nR*2RbILsafoa_rAX +cX3avo2kV58;M3$w@VRD@>WKY8^WOw@dQgQqI)&=y20_f7yL5_zP8>(dp7*dude-9gb#?b?5TLCa6U)CzW`860|XQR000O8B@~!W +A`j9(@(KU|8Y}<+Bme*aaA|NaUv_0~WN&gWV`yP=WMy#li>`sCfgAee`_)hoV?Z$7LBE!3P{r| ++L4`iIys_MP`m+&*b>na7WD8YSW=n`sdj;yn9ToFoyR=ksM6Popx+#Waa^T8 +b&g3_LUSG>yv`Gk??HbdoJ}F0uzv_Q=He3tbk|XrY>q6(>^sKhzC`-#czF)%3onrR@Ekc|}`Jdt{P9F1kE;3_~Fe3P22_Ol}O-?+{_&GQeZ8ei8!sqK7o7OKp+hLj<6EF +w{AUv9#NI~8QlB~om(*+ +qQ^bf=h1q_8*sehD}gdrrr)p7Kwf4$b_GEb}K@IVx+`90+BESBlCTt;<>R-#*x_qrk#oPE#oSv64|hy +W{j;x)PJAxo0%dyG-JE|y7IIT})8L>RIUdi9h7`618d@M;pzV|pwi#Gw{D@_ctdqK=GpNEwR-iMx&N6 +Mf*_p5Ba9K;5_5WsVh&e(`s)Nn#|43H_frNsJ;f%HQtXEGDec$bIF@V1#pw +Gr%*o4RP+_S^8o^_vqiJ{(YPiA90LRR$_*MC->33kLF3>3tYtnQzgVoh?+>8xS!Dda3h+%8jTnYeKA% +zFEMu8_LBMiYKG>b9NkTC(B@WOmni9{Tpiz9)ugAd4vehPVQvs0LvIkvqgdfp#KOks|bsN +FbQQ5`X~Gghok7&@n;>*-it&i5Sv}K1pbZZW;%{BV0!z1b_&HJsQzT<|xvJbBH!@AVShc+<+6bsUdiP +PzAJVNC+s(K$IBL61Qzo8p`62vRIJYn8;wERXzZ4a_OR8x5 +rJX|q=UxQ&9ADt^Xw$q4v`f}vLRKr_p+luupESb7m4c8sTvbyE4C7#m`2%h&Y71?XZP^9KG(vqb*I(O +{ZeD_EU2(WVZ3i6ljGK-*Je~sHSONQqk)56yV52}y}@%q +@cIVx;5+2@WI6w}QoyXkd3E1P@Im20BG0+mecdPWLtKImpe*^uk{-K=>E3((~E-o)*nhgJZE%I#4y<@f`P +qousvNmO*Zp=FQfM*7qWVvvAZTAHeAchCK3hi#8p26TmqD}EUN7+aSI#{Ym3>hdlE3e1mIxEiJsC>IO +TeFN~-L{aMAbp$6`L6t&9D2L(rgaT47OXhT{JK2Z%9_eSFptFGe(yGXiT*eVW +eCNhMYD6A>vrH5mJ%{6_zzs!TjtIoi;<*toEj;^~qtNu!rbMX9{lmgk&_MME!rfkL6qiigCW@*@F*Dsr6q@LqhdwE8(??-mO +Sl{xheZkdcmXF=9`rcgD;=qk|UMq86l+$mF*m5n%cEW}@;B}%&t@bt44(~4dz}AVI--=$01Ea-eCc6u +|3EybvNzUunD%*)$Auub!_||H%FMu}b^B8H~T>G?JPM+t%vvTdbvDMAXaBCD#yx#K~w)O&l0k*}SEqd +J|oWGuS-dL>Gm!qQD+N@T$*fu^_Y@&@yJAx(Ew;e2ycqOzwojsBGN(5$WRXz5ZiiDRs%IDj=?9T`5e% +SQB(EbHO`L5=m!@iBf?#po#iK^Af-_pAov6lnOdl#}|PxUYNPzQl=B$wTdjs93^-&|{*-Kxw+y~}}Vl +l7Y`m;TzA^kh%$t>@mZ<@T8^rnl8fp8Y$XmCCaL7yV3$6F388CmOnD@D|V3KC;!uYXxh!Wj?T*M}a8uEzxB%0^E7ez-u%1% ++O5lGlSucY^UMv44B(BGVBjAmZ$O{|Aer3lifzLy&tqt)b? +bgpXR{*?~!$|E}{*uJpUsEZxry_3AWhyectasV{h8i`Tx_>F +W`&>op%`(WeRKvxI+pLcFI>)b7gcE~D?X?&i_r{ekHFe#@u93;Nb?MxQ%iWSPf5XfXfSp&C`L7V$Jn? +iN`Q(>D@#)hDhP8Vn|iKEJ3&{i*fhPN$Fb1?OF&%TnhUauOwl_6@K?mv?D2*XZ~KpgsWAFI8s(h0ExX +I^Gk2_rCWZ@4rw>0|XQR000O8B@~!WwKBtG$O-@eUMm0qCjbBdaA|NaUv_0~WN&gWV`yP=WMy(|8Z)9a`E^v9>TFq|TND{vDDGHNAk_GKyH!WFmum{IuXN+-d!*(#p$)KgSO@t-|l1idk>}% +|M?0s*u54K-ZY<4w&6vdg-hM+|@tE;QN`l`C9=mqWkZHH#rJWd}DXj$IxO!SENV&EUWJ$`q3PG_e_$L +H6_^!DuH=rO!mT5eT$}Fc@605Y-rl?)dOg&BGGRDkb) +Mu4s3zbuLPi2oz$e*jSm_-Z4)W%s_;5J`md36KDbeZMr@ma2-QqAdZRcY)l73EsjVuht1OL}$mn#6QE +fr?)7T{=t>y3(=*U8zFlpVfTr$x)V;d3?8oo3D!32N)rGALXCuGEN@y_=$E17M4_Ibh#=Yv$T@<^Iv~ +F{P~}p-bTfz|Nc9L(9JUc6c>+l7Nrl%=s^LPHy^e2C#N^($Jf_%a&bk6ba{Anb9(gQ?C^>%KU`g2Tp#ZeT`OfE)?oI5+(3K}l}{O +voU1a5lVa`qM})V4fyta6qt6Oqo~ao0qX_x5SbbLvlPrCx{KXUt=o^afDa}fszT`2u1FCkS3oSOjJ~C +vs>(fX;C`vyi2*EX`pTzf2eUfBZ?$g_>D7EPOL(C1N5W$WJ13~oR`f#uWy`basU$(43FFYugqtU@S2e +X7`k5L}YK%Qbvgk`ael4M2mOcmNeQeVLvO&CqHQhhBe4SUdlP{+u+pRZK8%+qQ(JfLFrbO*h!7Rz*2E +~7O?E7gt4J5_-S%)Vs#yqYKvC_qL}wS7m%Bou|k0)?1vqPs*LcxTX-j&AF;*J3x>MUM1@9Q~bMdGO5t +k@NpW0m;y(aNnmroZ%GrI7brKV~pYX2+zlXPeR}8=eXX}*V6ZBZ-R#y+}pzh2!}$`7N2??O2!!5gM!g +`g9U^MQlFS4Fo|#qTuWFa^>ZkYSU_N9!o9#f>3b+32~)L&?4-nC1(vg^tv|@4fcCx>)EIq3RB*IuZKP5357epZ0(=_2~La$$AZAIz*r@Fo=Klu>9yB%4^fW?bx +dUScWuF1nYZ>y_#D}`-+aY@Va6Z8z3^wi$LB2`36R2GX%$t`&K82xUI5Op3J3vB374}yji+u`71(20V{d2WGO&7`tyvZPWF^kVR>iqOH +pGSOgQ>w#$MfvJ$Paa*j@d3zSPk@)7mU}}-w7pw(MRqoG(O%}P&JUM8Ap_r-4CMK4nVzULpVVpU7_C{ +WhIi%KG0~s%-=DJ~`U@N$kG07yD48uUMy~fQ(YqY7#qWLsYsIu{UBG5e=3{2!r{)>8L(YVA(#ByQNPS +|IS@LldY7KqMg(BvL(gd~IWuiBZ+T0H7ugEc3XvB8kcGcegax4n^Qg!@=2xCOih@rq!}jg1X&y#_1Nw +~yYcY%8L<=iE2>V0$FNdC=$Irqvq@M3aebJ&?`%(&yFE9A=mF3`y(*i@Po0CQhomkYf;l5}F +hEpVrqe#MMAyYqAK@LYf0Udb{*`nKq}IpGD3h%Mlvfy(AWw>M#LZT4Nkpe>u7C}iUH(<<_QEE59r-Wd +3HTjjg6snfQ_w>7e^NVX3!B}6u=B%8>ayB;RmE?H7*5g? +`VzBML!-xb2GgTag9X*kXIvdUxjDJ(CAv!*-*ecg5Co6C?Y#;(6c^A&R1}7ec=s1=&)-$<*QjXQCTaw^j@=vHdlS%|_X=z>> +VNfUnklwXvHEZ|-_A;1M?ak8sLOy8t&#?9$cE{2>-L7KChV?y>C?-6+@%ml28k+s;H@7Y8h`K-sBbuL +Xv1or>hLkvG&lN8Ai;Ss+`CkR5KezdvBf)P}JA9=S0J{JR3Kh<|UlF&Fyx0?S1XUeHnG12YA%Tj(}iXhosj;J9A9 +bY33~5BNHwg@Mb69wu7E-H_R6^fR$`!F_jq_TFf_Kkn<$bXHW|w;{eWxg)_42GUvAU3Iuevd_G>p>0o +x*LEy$1Ibs}te!D(+oNrX*KVM?#d9dI-(`VYE%>-+ymdEG_l+g+-3^$Je>Vngn>^|BUD<`Jy`62Ka{s +Qg&Ec78T^_bg?pOV63>pPC7rG?wW55qHQM9gp+=ahHK|j9R{YT=DTkzVef6G+=I>G!h;U6B+OZ|(i+c +LY&^e>xkpQ6Rf1KRY0o!dAIND?N +qtgkajVh?{oBRcM3tq=wZeRKuaa&KZ~axQRrl~`? +W+DH)o?q4w~Ur0+Rh9o4-opj*f79GJHhE`EjS&ms?731aBOCs*q-;CdR4Itszv-8X|Z)aSd!0p;QC;Q2?HL&qxg^ez6;}kzcCr&iZ^#<$P`SNVxAHbJXEb}sf +BL96-TuP_Qrg%WD>*_)E?8Q-)AcH+$BTNVzCOi=PE9O5Fh1I$mjtL!$8Pb?n&k`oW`l8Q5Q>rt61RJ5??HRj)pNR=>}?zj-!Fc&d~UQh*rDX>yDntd$T+0cWfI>YX~hEw +1%UuG48d7Fc=R9mffjhaT!ZfOv&7r4*C@nO`6L7IZmg}=> +=!;+$#fy+Uq4&V25C~O)cgeALuswIGi&pabR&ZB%)e2nesN@E(K9;~nxXGtz+Vq8x6=;i4k?La$v9-F +c*Dm!&O$Qj;C^__jPXFP=mrqI4rV=+zHF>uzrFg;Uv3j(}3>4Z-4I*Kp$buC%eWE}sJeb)EyG_%~Vdo +#mXpNly_!0huD@_|en0QkIC`H?5$^$mhtkDk?>Le6Vhqr741$7d*p~pGy#3fgle4i;5t=qWX$k)S#>* +uS+Pa=y}J*<(+;BVrc`M7T3`t_dml%4Q5h4t8cg0>0W+*ysWMh|^U!o4LOCCISnyVyjbruDGYf$mTqN +5UW}DwZ{TVF6~La>|9Q)@t}xt2NKZ-4f0`8>bVWemgd^&sQhD`uThf;%l7G*C4(|fe$

-qI{}j8i0{fg8+T27*L(Sn#&=D8*BkNKA6*D{Lwq+W--nPKM|?Nt*|;Y0HTUuzjju_3%|d+ +meyXIAT8DAB#CN;hFZg09-bJ?Zy9h^ow=rK%^>Lrw5#QYoU*=+T7xU3wL>l3U@9zBl&?3Ip`TLQ@G>OkNwF`}oGw==Ygvn;Ek54*2;c0b^=LDa>GJlP-I?4he7 +m-3ERY;cOpVsI%^$`#Ge)PjyqFq6L(#wus2$X8dFS$g1L@w7V$G?%4OtW$1TOzI#HPNHJntJjrYT5@i +>xI81itbc)!`jf)x7hUp`_H4AML#Vnr4}7`ATCIJRxEFv9C3;xgLwV}$Kf~&I!-xc{xp%(CtTrFST35 +VK%`R55Er>JE>s;PRSq3n9WOap^+mw8lyJ=Z*YWVsP1Ddm4T;02Lfe^#v0&T11B_|)4-!7te#2)d9*i +^njTBW2w6QOL;ZYoOqSl#b$r0TN+y&cqP%^cW0etG(*5&Q(_1&fZ>5v)U4Q4BMcF@G9JQq{OCXreNr& +YxqoEHm#RD@whu}`^=K|3@WIV_mbnCrx6^st=4Gc*lq9?hNUQf`<&8)@D>Mn8MMH`FQZnPUD@crNd++ +-Jy6?iU+&4t>599NJ{Yu`edaIp^Dst(ZQf`3T)Bj!V_PHF6$1JBSy_+*fVaMzOJ;>ESng!6|Bw=5Cwj +588IQBS;v}ZzQI&&#=in5ls1n1>R1dV8A(u!rl|rW+D=*TD7L<{PCoOt+QH`cO$$g(#5KOL>_*N4KxXLP99*zT2FLHi$2O9KQH0000803{TdPBwKIP2B_l09 +6eD044wc0B~t=FJE?LZe(wAFJow7a%5$6FKuFDXkl`5Wpr?IZ(?O~E^v9RR_|}(MiBkZUopCa)?=|SU-R=OQ(!5 +38I3~y1CggC!`jx{Slb(`Bi$w~4^`!9`Cqz%a{zg*~FSS_HCqjmXjH2n*tdz_wW~(iJ{aD$1mGjLM$_ +%Djsc55wG)<%v98`nOu~=wdZ>{8!W~M|%<~!)z&{m}s_>we-BH1Mc`3(6o{7q^2uT?0btvyO*2oWq-! ++M<@lz$k{X~YTm(F04?$Z47`ViCZ3Bm$NRlb_JWo+Yb7-+@hJwoilx3h-G?Ziof$ZEV{UIHBuS=MZg= +*n|L7_l?aTJ+QHk4J5s#7&X)f&uR$@rXdNL!LCp-d;lPben(Hzf+mLC#Cj780E3nGrP(5J06g`b-XlD^cf--peYV*ThVHmOo6%t6P?x4%#~t?Oqpm~Kxig +*2`YlwP`5>_svr6P#;s}sy1tl>#zKD|@^=FhfL4t8eEB}>I=72G3A^B*V&Gub2jFntweBn|EdP5>2sn +BxYwLtHnXG_%uN>SfkZ#LW(1Tbh-K0B}7;E~}g>U=1(`kR|{NC;m&1X2d^iY3%| +C1Z(s#c3MCaJYwI2)}NV2|qA!Rz60#%7uw?hRR{X!^Z@y%BObGw3#C=?5zzIeV+sYC-HL*llTS#NF2L +30VE)4YQBAr4JuIWPht&a+B;s$Psy-z_#(cdctwkM9a&i7l{~+e>+x^_o((sQf#7nHExrvd!v=39pfB +*ZWL&+Z{^d2T6#WK(Dny}yCoa>)Dnvc8hOdO^45b&#x)i~AaAh?|uusd^0m(SSO&I@6aWAK2mmD%m`<(J5vXzl007(v001Tc003}la4%nWW +o~3|axY_OVRB?;bT4gUV{>P6Z*_2Ra&KZ~axQRrl~rAj+Bg(_=T}^5UO=K0=vHcX)CWj`(lQVwpwVcx +LMCy*9b-qfGo$p^?=c?(0V;JPAtm>odwlOXwz<2z{ZM}}8c%654hGYBK>f)q_(8wH-qr4CzTq@8Vl5P +t6zG(bu=JpR2`L#Zlz8FBB9m;GvD{J09Z#G#lmObQ9T~<-I04vK{=%isxgnjAyFm^7lslWSoFlZ|7D^ +<{39T$XO|H%E1H=?+vyUf+Gsja}l{?1krI_(td5NVqj_N^!y6tuc6gS~5>PbnF$6AWG<>rN_`$+<=oD +r)6^VMzRZ$yY5n0cm9$h8q$dPnHck<%2GZll!>5pPQTnAAS6-{##Zv;%}j>nztoxhC34j;cXtDOQG=( +o3Eh&dKV`y<(huDs@2#Q)GB5?7k_;=ZLBFy*8-d>QrQ<4;3nf2!2+_&DI{3A59lD;TH4Jh%0W;Q&_B| +NKiZx30IaAvy}Uo-JJ9t`bOeIBQ(^Y-+6LRTp;h)_Im;m>b5$^)eekJ2tak_eE--3xi4&>>5?QoG{?% +@5}YPYNvIv|29Dtcgc$S{dy-b13d^%XHo*WaJ&xz!W{WxXrcd_zi&u$c5B3Kvm0iw7+@&iPSdFXkyc2rrVK7b^}H!S}ENTCchvI^8O2)c3JVu4i+_^&_f +)lKk^upD#uX5vqVzV*Rm-=_7Kvn0viiZ2ouv)oO`k7I%9;h|jdEU(1P`54RRJY(~qa!2P*g)-9J=6Ng +x>mzj__%3r2h@dMI7w!qz5zaVdtuWPj4XwC`F-Ww+x;9L74EPbJW-V**f*;#KiE18pvmzgu~E>q`*-6 +%WSbeTFc=Q4Hj{{v7<0|XQR000O8B@~!WY4+g{j33(07+>%wKAk=!sne6z`54=oPMpj0gOj8F*{IJB2j@rMm}1{*rOL)PoSg^ +Gwc}YXJMyQTIU&3C|LeG}RriByWuv#ux{28PqYupJ^-Rcu+`Y~YT$c^Sz9Ad(kO%jCDr +<7&dr{y_=8+$~4?p|?DU6+3!C&mcajygCmT3%17_rD_7mMh|_mcWU)40wgu!4nXrCGo^3;kL200sNV7 +XF;smd64C<%qOm619{-s ++zUCgLUt$8!kbk~9gBjDl7g^fAF_{I_aoyD;NsZ#JP09$HR?usv?RwG^8@zYibVP0Y~Bgt2PpJ{xo|d +ulvyX6U{%v8bG$g)8)$p@12Tk)K0r5O6VB!#pUvGGF)Tn93SS_PIDEui3#!D)YZ^d~S54o?Or;~%2*$0y^n{%FLG&xh=QT^tO@Cr6iqgCV=P9A2D{`g +O)eoTp7J8k1_|WfRXJ%Ud5>a>^siaYI@4A8>j@D4;uKH`YCe(`<7GdK9zZ61iJ!bq-zMyN>G%lvRU%W +X_CvepF)*fdhR9dSBt}LN2TGTZ2w-*K4e8z)qI;mkXz01oUHP23a4wz8}=sp&v$K*V6;w>J7utHKVB; +j9rc(MfJn_XP-+BBGpP|7WlWU&b>MGWjJf%(mA#48^`0L2s%*(j(m9XrCq6r|F4b)Bld~CufRpej9T` +?7!*>6>rd|rxN5ns|G@O0kOn>9<=4=j_m(^71-1^Km~9I7OqshOayPmN*R#0b8)|+-@EctKzbW +`lHNPqNP04T6vLAuB1i#f)oR`c6}-&XTGg5Oc|JA&U)^SgrIrTDV`UBT~4eyf)K2;3BWv# +Z7h-&FH^g5Oi~dxGCf`OVBn;FjQ9lHa6o!MA2gd?NT0HGd-b6E)u!d|S=81>aWlr-DCK^QVG8Rr9&vb +2Xm}K3DT+fKsDa;(5ZO1(cEo)2r8q|q2gekzH{V{PJZlT_7pP4AW}7Ljx^9$lUG +pEoTnr>P}_;m*zXyh&9dNZsZ625lc+4f*N!b(j*B5oFYgqN(tS}hpqlJTY5#6j)?e((76kj0lj`?ST7DG#@C&|fc4ExBn^ +*~p^Tpp-@St`f9IN%?xksl|G|glIlfTE2!ddDl}{PF#0BDci`o80nw48ZVM0^k<(vQu%7MU%VR6(y2P +D!Cqwug&Rc9P=0N!G(v3YkF>8Bl?rUXUSuLEl&M +N0DFr;WL^xJL@o}sqWoB>`E1~!}Rzl(^Rzl%8Rzl(^R-!hQYCevYP&kg2kT{B!P&kg2kT{B!P&kg2kT +{B!P?i_RN-$<5_u@EKLh*5|gv3#-q)k{o94n!$AdZz#IF6N&IEs}}IF6N&xVgsc=3*rzj$$QxE&IvGN +=O{VN+=x1O0sA>7b}tD0ScDLpJv8fHc5~9Nbi6mA{3vf_ykjV5gJn{KEcBZ^KH0NnDO_xa^vrrTTrTlVu8tYPeNcQJ{FjinZc33P<$*fB#s1z!m+@R_ +;35TzVRr5={$?TGz+)LSYWb`c#ML;Py&hthQyJ;h_q(>?>Bi|Ul14=5VjDQO`1b&T2KEl{)O&SRZrqy +ZZ1H%J4JK{`jP?S?QW8@H>2c3vuC?|R@OSX87hvRU4+(Ko=|NUvv~x7dOtUOM9)6k!E1Ck?EE +(GVwrC(#RC*vBt>!)cD-iq6cYZz8p51Mx#=Z+p-fA{}DIK)L4$aOfyz0_096{XVFNE~??3ddfC#F3YwaO`DB9C;ZE$6h9j7Q9R{B0R*z+T*odtO> +%{AJU^ls3hBd^Zl9pJTbU2Tfu{fbvm%%)4^Dq=kUm{;DeX#@Q*6|=);6@KTS+){A_$+ihTddWP+(%UJT7k}Dh>1o6Z_Yf{zg5wcKO>tgP+>&tqc?OV4{rWV+Gf@9C8&|=A9o|DVm$QKS`0^Z*=3#qN} +ebqe^82|Nm0vkHX*9ov6%T@kz1q_PpJBOhQhM;&@kW1Tm5Qy=}53Zei?$wp8_B+ksC?7ssg +%@`VpT*(J57=@hgU~Oz+T}H-c)Y^Hp|a*=x!y&}&ieH(@;Q?18)`XD1+1WcnTDZW21!SiUFp4XoPKwPqJ}{x!20b@>OnP}HtqC9b7z(#eU8d4I6HJWJlBlQmj@lYTiq){M?!A6bP#V +ig8&R^iPmyjg`etFW{RgMM+*Lw2n0X1=|-gRC&ObDKvz7sy+M5?OCR)UF|WQq9b!#Bo)wp>#8BdI*zj +3U1<2ZL*7-7_4;@jf|TZY;+R?m76HzB?u=mP&f(NM-=L^?&TWNMGR6G0pCoh<@nev|N5!i%crd0?)6g +?{yQz0NCU;0FhBAa)RN4neEk%)wSXgkLE+e6ka*5tyyhH`^vx$GdIJjf7b~QwUSiRQTM8d^h}LCd= +ZIi^2S~kb?KdUv0m9t$rCB9(_Z(rrl~a_dBr}ag<87S+Vd7_nObY>e$%BlB@fxwwf3I3O54=hPe0P{) +LI=~>+E@Jbxf_Zbsy@{o05m@>RNZtTcvAi-4}5S+qImjYv!J}oM~$2w*5&Oz2c_iA$z*k+w)fGnOg6~ +`cwIqvvkec^Omzr&3bfy+WqhoU7PHA3r$RIvUA^hk@urjZC$hXx)oW~HZ^;7^Q)Sxq@!Q?rWN@czv`9 +6Z&wvJpq=GS^qMGR5}_**V>HSH8Rb2Dxe#NqikkwA=DWWu{|8V@0|XQR000O8B@~!W9(C^?p9cT{85R +HlCIA2caA|NaUv_0~WN&gWV`yP=WMy$RT#i +UYRF0EFiIy@)jF5 +dYBZWKQ7T@iw&&4E$x0eA$%0qr#*uV{9|n9LA-}|-A@`O6U(PDkR%?KZpSOYvJ<6PAx^gi+EL7Aq +&gch2-E57(}33lpoC*MUpKd&wvHU(jVQ)!(ck0cK?a~ +Xpcti{^aQ!WRVK&BEhjGzTS8oh7na@`{53b!@#3C>O4TBebeoACr`@zyY8fKj>mL27*U&s?a`#$nfBT +v8cs*U!Pu-Lxs0U{D=^DI-b1{A$+ZBIXcC)yG7kL->6LKMb7^J2GNjpI=qi_NRLExcQ#tg6ztr(UZN!RrGQ@nU%nf<}^{=piVJ!|qX +GRF^t-Yo>0jn*e3@Is^Bx}smQ>i=wMT~tJ~Z=VxuTvfE3%NAr=95iQ +HHOah%p$LO{1}aVUAak$pY)|#8Z?BmZqkP>LK1%{r9~preYbRhaNSVE??@zfr=wYL7>GR-}{&&BJt{+ +WJRhwHzK10Q$FcY6tvw{gWHV@MNkBy-AUZTyB{WK69k^Y%EWuU1C{bEOda*r#9NlHmIqzW1sIb4y^k= ++a+FrE2!B!`*_EfKg{Od)r)FWC>vL3g1TWw}HsLfcbvXZKYjl<(up_;GqWz%3RcEBktg7j)KsGRLW@1 +HAgwICxN%f+0$}OwWy(>W@N~)|V`_(CL;FH#TRoP;ogt8|T1m9EGC&mhnZiuyM| +ZFOsaUO|YY>nknZ6$RnY)ISSXp?2z{pmtQ{e7sfUgL#1Qhu{;(c=ha!>fz%RGs#O=IUdb}C*tWJAk4Mw--D6wwD^N>xiwihu)QLU?n +q5Ld!zc4h^W3vh(tVbY(9SnTb2yONJNu5D|G8**C%pv@>{i3IJ#}jIHOJ=YAGeDJ-AJ+9FN%%01QGNk +%!FXi`RjezfW^Xm0suF_}nlque|2h4( +>t+@eKYsv9*ISU%jx<$_s*!_niI1#>Gtox9@l@N=zdFZEPp%{iwu3f;2NXUQ#BeLRx@K!=Gcr@a^RU4 +$C-BV#Bzzd+-37IV3efKM(%hVA{X6x|4z)X2~2 +92~nJRRQ*>-%$X;)c;qZGH~^698*!-06`rz=zEg2)u2urq@jF>H@(8^Z)xB45)%Z`C{B%D0gNgNM9=f +eK3hjrwqf$N^K7;s;+blF;zMmRLlb7PGTC?6rDJ#z!C2x(iHD;Iep%`r8#1DDG2zMLqU=Q~ySBbaue_ +vK-mj$o(B$~P9J`}FeV+IN6H!xhiQLN1vpD$mIkq#>V22e`_1QY-O00;mj6qrtm{!gHV1ONcq4FCWp0 +001RX>c!Jc4cm4Z*nhVXkl_>WppodVqa&L8TaB^>AWpXZXd8JovZ{j!*{?4x$sb4^%IbcPvx7B_C +3N2dRL_k%wS|O7-VAa^jcHnZq{>Dit1OkOSOO?pXJdfwqcJJ=;7c|>1-2wEvt@gleL$fz*{e&~NcZEB +cEGY~XTQEU5w4_ggY3R#;80Q40f^DeMsPUFWX==cyhI&RS@X*vL>=?R&8HQ%hbVIpZQw1^rlS7U618T +HK))YmnRVbK843k3Rr&>!De;_f8q)OzTqQp=i=26Uex)o8DYaQWMO9RDL32K!}6)AGf9cXY4V{5BnOf +^*->L-!3q%exjLyWJeOW#of&?o8xMvN~MTfse`hX#ypzxzZGk0pIs%U6Qahx +Rn}U6$J}?o}F0nZH0|_zEEw&%bDTJB^Aul5X+QM6R@;aPOpfPxdx5jwf7);)u&=yO9S}btF#8zw0kQk +#8Yewl7D|Te +wUTp80hZ7XS_?HUH7`~(iZv-j&r?v=-eqFJX)`i3MP@*ph=qrz1jnr6Oi{jr72lYs*6P((s_a{38GcI +ksFL3W_+s@iv7&xN&?jD2@+D1ozIuFkNa6OQUXMRY2O%u5t{)ly66Ez95Pbamr +C|?sOTRYF3Q>uxDF_;v8G;b*Ia)RkGp(&v5!#hGx=rA8M5eijPf~bgt+&W1O(pUt`UoePWyKl*HdXY>c6h0L6?8uaR|0Zo;Y#H3z+4GCn3@|9yV1HKsDl~15_U3(H{~!pcQ-~->FM($bMPDtHJ1x~2=m#o`Q>;I54*1~mvgH_xP8uLw%&WTVLJ +SOj=@BQ^gp|I#;uIl!I!`+ZnjjQi@6Cc=SGu%v^w-}Lxo@bb;OWQd^x(jU4NGf*?krMFJiDI{smA=0| +XQR000O8B@~!W){$p2AO!#bz77BYApigXaA|NaUv_0~WN&gWV`yP=WMyAWpXZXd97A|Z +`w!@{hv=UYIG{-2p3YFbZykr5g-XYehC{@Q59LnUSO|g7wxXo(ocVHZDSiSxl}roZKX{Gty9Dtxm9H$;c864JL-lTh+V9{00f< +WX7ImVCX4Y5JjA^ExS(q~EN?{aV#73&RZhU}+XymJ}H09As@eN%PDl}vyO?PH3MaCb}M0}xqwX-TM6= +S63(tJZA~LatMI2w}(<;crqQej`J^+*wmBLeQ~Q8>TjTui^c8PD7?qDcv){6xdATMZ^OH4 +|%|ZX5?$yTAN-MO5NE)oU9PKlYmduy&=YNZgW2~rD37#R(qcP0<`m^o>B09H&;lO>g)!z-=ao=(1ZZe||O*=Dp(47xEGn&q4(}~k>5jl+QCAMN#iJVKk1ms3S$&e +YJM>?hci1um}7=^U7sAQmhib2q^@;A-*IbO_RPUj@iNVopcu{MSq(Z`k>XM-` +jBV#n%Wea1egSmw>*Dq*P71mD*U>Q3tVC*X{PzW&7P#n`rL9a_*u2xcAB>a#5=-mE2Hkvk2C{(#&j?T +!26NXD`txjtsxu8P>(A!^|`}&0?@!xL9d}QQP>znhUlM>n10TJsG7Z`w+n7b7yBd3vfOSoLFR;V#|kCu2eght%i4Or73T+<`SGm2r>PTJk3) +~tK8{jY&<4g_iPZ2)8TQdH7IK*5FH9-G%r4KEO|K{X4LeS(n2D7*gIf+f2Ojxi75l4mz;8bJTVJ5QH- +!RA#=^wCiA8Ui2kA?Jc1v-)baC?m8!=JOy-IHO*$;!A0CeMUKw83bNzQVBFZ`)-fPlqx2=eh@)LZ@8Y +%)7cnztd6s})2F*&<%m-~OTr|FR9S#w&s;1txf1*yK2S+dP3eeNqY~*_&CeOywr=Ms+p03gwI28c$qr +)IW(>;EUwzft5x7CB?vX0Ch%->g;!u`MBo|-2WxN*D3kp?}Ev_B?O6@ +XJYk2pwWb>y0dU~nm*GNz*@sip}UG1N5L-G`b9Ioq9x33PS=d%4&xMB_y?|k?VZc?xB_Pg$2eE;Eieb +uY=UrFOJA>-BB!#9;*w_m>DF|9NZ=1QY-O00;mj6qrtRfJZ%W +4FCYeFaQ830001RX>c!Jc4cm4Z*nhVXkl_>WppofZfSO9a&uv9WMy<^V{~tFE^v9xT5WS0$r1jpUoo- +j0;<3UknQuy<*U*Q$mArX5~v)xp|FNQ^jhJCHnN6CQFW^a +JLA)Y?lVbUhIYke%^+?)pm}Fn`KIgJ{tAcqkov$?5k_*09lI{OAzI09xa7e-pXi;O`d%1_afJO<<-rl&Fm`DNckEiYvp_6Z +oneI`3w?II3g^D3DEjji{s&+{0$8j%-@c@fnF&D=bB%GE}1=&s~On6G{9EXEHAP^gUfc +dd8XOZO7$gM#FXxWGE;QiI@fF1WfvJb~MH^;rf$G4!xQD77YtR;!X(iISlT?MumuCQmPBv +5({)EY;NCk9J9mWRTE~zLYAv1ouTV{Gqqo^WD0%D#FTk{SYr=?fbGCM*G?Bwvh%IMD;%rFUNu2vdv`9 +5pbz$rm_l^N_5Gm6PJ9^>>E$ta8?9!uQEwhLnvC7{@n+M*+P$+!g3tcmix)5UF8xX5a;UIjOBuhE88ab9OSO9<%TROhd%ibQ$n3h4Z9hv-c{TU{mB|mYnd +(!}`v0{Lp1%9+#2L2cdh-pqS(&ynhja;jdn1y>0FeIkxddn#6hj85*yRf}kWY2g7YnsO*x-brN7|A@d`UC4?C_ed5 +KA@22l471Ob?1%i-YtO}qd8>f#Kf4Xf2qgYUcN?}sNJ2kqfmd(b`|0Hxo-;w{HtE +QQOfuEb@g-O@bF*%{{0}P{m|__PW(@)_-_AdNNktK*C77ABBWn`^XAo0 +^=9RWRXzxB;y=iGv-PS~sTEWaKN&--#L(Eq@T$bn+{N&^#PE6-!;d9~!(9w-N(`@dG5l0wc)5$Ad068 +3vGPq@&V*0da7chX99AWFr#0jq-fTEknDwp*Vb<}*MeOeM5Va#o(uJ^Ivjd7e0_LOns;u?;e ++rr2pH#vHh2gmNRLUspt0N;B(O^lW#Qq5xKAJ#gC}8KatLGFxr-AWk!>o8-%4-NVmj}{KL;Xo-a8s4R +x=vakcBJ6^gVaQJOCU-roxCv=UEehq%8yq@}w~jA29NKt8J6Q+!)oA_8=G=W^v!5s9ov;#EX*`qK1mZz(G0U3!9s@I9v=5kyWK5zIj&T)qnU1WyQ2aIY@$l +-Dj}pKD#-vmv#%BOE^a&GMneae!yLRk8& +ilFJttl=XgqfOZG=$el#MnWUWbXcjla|A42bKH{!_*$QNJ?qfsiy4wG^co+42V;1EbgZ0Rbm5FP~31a +az}GMjTDUEjc{RQV^!DN)u)wy;s&+t>@IoF&PE=&8o_-Dso@A41Y~9ppBR|kS%;AgJQ-zjAu8?d+sMkSWSb9`qn(B(c0nwa03gq0~u=Ud34_m{F_Rg8&XN~oweP +GmGr^7mJ)@aZ_rM|-!k}45~F0XTMB5cp7$^DoGyq!+QI2N;QT)Xst*!sgLe_TO@(WWZn^Vdd${;Qbvr +xcLr@3dckSwqzr$p{&Vk2)v>WK#bQ>R{Ewm(A9}leF^pI;xL)v+?@n>$;L&CmDYzEotp&O?BF4Eyc#7 +Y;C8OTFsY-->W5(@rTh;-jU(LdFR~jmddZ1uM>x4TOBgzio^m}+(y646`QaBAL=tCfw=^hqH;M#bSgPcn%9KVQ;y3jl6l0S(k!GMNOnSp+US(>J@Cps*98P+SSlr^vSMl@ZmW2klSGksE|3 +@MoSXQ$z6+83pAjift|!ce9DG9(eq_|mdIQChND`d+rko^G{l>&UmAP*3k6*6Z`DderC?WYSPO{{3dG +Qxhvi`_TkbGUdY^z>k@t^9=qc0_U(5Eh`5G)^Hjatkq^(nVREE2bHd*LL#dVEuhnR^(mr7>!}H?|k5;ElHl7Tw3U3v+v;51_Rfag!G`4-k#iUNZCp$8le#ZYL)~XjIm4fspz6U>p!?aACL+E)9-+& +gmqXI3u((x=EnMaNsxp>rrY?`^&J@9~+4?cJxqYfal2Ul$>(Z8*zb;)#30F|fcBZad?9)dsdbSwrMFIv%KX8)2-q_Xt%Nw$>OP`%cEN)jDEq6;}P53yPRV$vaduqvdB!8+D8h +vMcYLg!!O6XKu_h^N_g3d)xU86h=zBd&dTO7DzOGgOvJzw%Xt$5s6IL276KeJJLBqUeMttBT!RyF1_) +S-F7!}TlZ|4KyDNRdOE@>Ll<3;XNPMA)zz8|X|@o{QXMdz>Ui*{likvNkDg +?cEOUl%*Sr6^>5dO;)nL`+OTM{X)RhV~iyjg5u_KrKD!XoBP +;<^i^G7(qmijyXSmTlk@pCV*Xp9r!?qtmXjqvIpDqUb%hlBO*V_vNQ3CN9c$CfS;so4yFHz9Bog=hg1 ++3Xs+=d71lxTY75h3nwJbOW0zjn +=m<+l)F953#=JF0^Hy@$&RwUdXgnfbo?=Heljm**dNvY#goOeaIz@ojjTy2C%=li17FB?M~(SFsfn5r?5n5SWHc{>?a#EU8uylg +(=FLMMV5Mv)_YM=m$0K&D{Ma8SI1M#s?x$&_WeU~y!a6q;VuMym3Kh+!^OWsem`1`}9rOUBbwkt(=0T +S~Py&>nW6e|L9F6lcRN7;p|=5v##Njp`kfs*<4;MzLjXq-yKVJy`%|k$QtU<1587xCT;az(|;H&031O +ergS8OBJbY(WO)&f|jZIAYl)%l{v(b0EG$D6+Jb=KqQi%r6PPL6P9iZQ!WxJr%-KBWqQ}cXJ-LZ)T9) +iQJ|t~=J}Gdn7~sOqtFPEhD~A9>qDo;g%H0M0%J+^Wp^I{8TpIc@2E6c;Ku6jvek@TkP6z7DfH7cHwC +amqPM_l8fu5M&bHuCX#z}?v}@`;{Xv9O=m)J4ED>^zY0kUEK(X+361=#J00z!0d>we+zzJR-D3&@+UY +cLU#Ig-%L`+qwNSG}NCxV&n4POW`c$!Qn!E2#@JP91z_hIaMFo5~M3ns(Gbl|~!;muv&wg7y@U5krmo +@?^H#VJu{k~*27i5S;a>8~_iO#*oW>*yV6%rP?BD2V72*=&DkhFpqOSua5j4SfKXf{>;QABxfL(Dt27 +msk$-?b6c6Ru{hXDJT+eoJQaie9Tg!9&;&G7oMaxMd)lm*xpUQ-@ESr((3~(e6oD@fbERF^N3uwTB(v +5Sn)bi8qG$@B~?$;D?Xti8GSVK(pU$g$Z6^8fWpJX$~Uxaq%w-vOknx8qovPAtaM??D({}V^pvqRu7+ +gGSnF&Twg|?zp+5^}?#Q0D=!toxb!o0-wHqSo9?&@e*RexdG%uWc?h`yh&-&6T9SNoohK$Zl7`8R?v< +4K9>956oRC1FU^~=MYMcy0(zCKAx$j-B5l64XKG?whYUz6Wozhej`HB%`=p7uevgPr{o>_yx#NfV +@&OAcZDZ0xoisUf*7P#=s-7%A?h%=!-+yDPmHFb?IOl4C!Qj11P@sxHw)r +-@#QpyNZjkP(?>w5crp=eC@c?z|p7Ngg!QQ+p;~+^_r;;ZQN!1_S>)=Hwb6;31UgVnr{s&@_$P{34Eg +Zq3mOK;f%sb@W15u1G>?t=?Qk!-xcjhoGXRGluN}?v^((oBix*#4+S)~@TW)Uw_3+3_PQEHj_kl51{3 +G`{&x!~*#%WHLacT#k-F~7mDO_ +??Ls^0SE0ld08!_k1(qWe~l{(Y*r_I~6V@6ScoasL2NO9KQH0000803{TdPDjU(*SP=y0P+9;03HAU0 +B~t=FJE?LZe(wAFJow7a%5$6FLq^eb7^mGE^v8Gk3CBSK@ddq`4z<^cb5!;MhAk37nmrhm@d7$y*rKb +vCQ7JL#i1EhkM +vtcjNA?`8>V7Kfk_g&A;8%?S<}lZg()hP)h>@6aWAK2mmD%m`;-h*D?bD00031001KZ003}la4%nWWo +~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8dE){AP)h>@6aWAK2mmD%m`?X5w4a~^007ns001Qb003}la +4%nWWo~3|axY_OVRB?;bT4CUX)j}FVRB?;bY)|7E^v8`R!wi?HW0n*S4>`Rj)}Ztl1jf`Ey} +|iv4$=)FON>dXu6Ixy-GX%(3X42Jksm3Fx_7-1MFFxU4uCJMZh9w*@I6OZsT`WA(n+o6&?||Qh@z2B7 +~UW;<4UvYxUpjVwmUoQ(#eh$8-dXqHjp-MSKzp@2wW5=ZCR;X40Bv^{q^d!DSAhMya|cHd=IPs9Vb2v +6HydZqQ*>HUn=B+u9HS8VdtQDEArU$6{nd`43S3vUj!1SfFqm8%xVBw(krHovasY!tc0<0K-XyOivu? +$ghpCNqXEFOP)`|>$6N3YWN?E}{uP{t74k*c2aqhRal1~8OFmLQXlI08?wqiPuoO@RpYfNb2XC;Xnnw +7%(x}Hdzzu8A%cJ;v$X}9~q<*eOOhUn;8@%$vA!r=Vy<^-MzVl3{({#^jA*yGCXJFTuyAtbH_ntChq0 +zb{RxIBL>|E{{se40B0}E^j<7C-4+%!Art*HA3WDVP3i>dhK@4wiz1!fP~uU{UT7h&Z&NKUN9qmIRxDVH$~ee08E7bD5-bh~-M5D#huD7O-#Q(I~##gPTx)@#Do) +29K9dFT~;T>M3TJiI%&BT$sNCH$RH@yPpwgzgv74oED80CwxSa3hR!%N{9Yyxl{>C$0q-bS$NiKf1)@ +eVHjQ8l1}>~LgOCkb3wY1RP2#8H4>I8=3Z3C4Mo@)d>VRgT0BQ-C8}*FN?A)$4dOrUwV=J&OPWx1$MV%g8b{I#D+CN~e%ET7$c@3 +D7$=E1kui(@(pXX$}gj8|1Lx|_uQw24ob*IG1P9{)~$Y}eRVdriXz-Riy}0v-hQH~C{)%EBp+rYFHl; +#gr>IO5Vb9H4yU6OZJ`4UQzSS;i^pzFFBk{_zcfVXOR>((kt$`rr2eOrvbs*R?QrZ;-WE42NHg)#zn7 +kEfB74h$A~{4T-6W|dmNHk*3u;6P2o))W%f&ftOnBOk2qx-^=EyC&793FecS9cpCFq~*@-lJr<7{pBE +;ebv3cf|y<@%H_e$2@8dA%dSLne!YzV +N=4=MWbK$zM^#fmN@CY4kr(O9KQH0000803{TdPHjq{)3N{n0Pg?*03ZMW0B~t=FJE?LZe(wAFJo_PZ +*pO6VJ}}_X>MtBUtcb8c}D{=+|B@#>8)HEjqj`u)P$}SRaN`-!zH-+nW4vtfp_}V?cZPexfY%{!W@$qW3U|eBx +%V%(DkjO9KQH0000803{TdPCgZO+YcCG!^= +8E`Peh_SvDDolWR3(&?dn!~42hwxgewU1vW77ZKPw7qqNm&G3LWf8IGM)IrY#ER>OQCDowr#BvCdoF7 +cPWq!a1d01B*WQqLZXBU8YvJY%3=(vjO2oG#rOszX(mhv@h#&tm0fEIa7z-U^4sfc;N3m@&T@zu?Pg+ +gtykAtHv}2c96~K>O0axPHX!y_r{Di#Tl1y=vifFQqhMOBoEzL}#jrNjgenVleX^xj?OTiBB|z;2CtB +_|B9$mG{B3XTf+|6Uis4bU%x9ga6XV|AA2xm&9KSJtnKcC}LKz7F-ogWeL9Z$8_9g8H`;?n94nNEMsB +bn(sl;Az$$Z^_R`&cCM5^R!-7sXFsW5CwNY`atUspsWK;-V(C}8Viz+VDLp-7by?0Kgfy-!$_5DoF&_ +8A0ru@ZUAGfo(niel5LVz}CaPK-BF#v?dU>zv4$0_YY_;=uyD`d}9Vs;q^7EZyg{k;QB +b<|pCf^ZbaB1p`{`R(hAtqISR+115Dg_2sjWrz0JMt%K5(;cAAHlTD}Mz3SI?TfwgVo&GHkw&fEt~YQ +eWF{^<`1t8XXyBd{c3})|Trsqd#PR%T_8RJ_qQ0Lmo`#F@YuJ9p9u57Euc3}B>Zkd#Wd0bq9dh`8`oY +l6FzV$Gv%Ig*#rsS^>o_2#+GvU;o^)(L`i=n>!MN5+1Y85$ErMWH2YLqh989P4ry9^Nb36uTQl0@GhI +heiH9Q607{LELoSiY=8sO=EvI^?JOp@#nCei~AW}4!}=XoX+#2qtKdH`~?K +FQX_JmSE{RK&%MPbYWxD|1$1@TZY~=TrcmRS`CTTLI>*j*MOf6lY}+1p22r9)nT~0j~nev(gv>Zz@2a +RmFH)0p_fZ$!}_27}4naPk6y=@`Bgo1+U2qUXvHRCNFqRUhtZ{;5B){`?X$hohCE5PLms4r^ybk)8q% +&X)=WCG&#a`nk?Zubx$nSA^ndB#6lBGEfX0}9*zfF+{0|Xco@6aWAK2mmD%m`)?`Y;$P~007=7001KZ003}la4%nWWo~3|ax +Y_VY;SU5ZDB8AZgXjLZ+B^KGcqo4d97OebKAHP{@s5Cdj3IFD#@=-A5Jx{EbC$?j(uZ0eb0!(+1Pq3!AS#LSdCBC0Pf2H$hLU;R4*0tWVI**8$|5$Wl1+)^g +lDP38uR!YOTjS`#zN9KfJt=Cp0XM7{V)!t?|XtpGXPX>PJ1M>W+#0)F1TtnjK7I+3s-q>-J(i1U{$A5dEmkcsLVBZ_b4m6Zums57ChR0ld0GZCqy0!DQ4Gi +6rctaktY>2X56C(oU^6bxL=bVoroVS4YEG609ca++@J&V1)(k9icl;hpRCC3+SSAr$!h*nxkQ2Hk2Sw +{Wq(*?4@|D2K26YQ;3==ZCy1gL5f~HVam}YvxVC4h93tcFXP%&+LDrF#W3|b;^)_5@-{=&g1_6!O7$P(b41MgXf(bKR!pjr^z +eoLlJ#|6i@TAivNI6iWWXdCQYdjzqct6boUmk`OdTAg~`s#UA+V5N4;TvV@iZarD>EP_; +FM413)LYE|Pdchf*MVMJLto^D&6GLW|5poY;jQrXiB>>Bz7r}(my^68~!w5}=Nh{-D8985u<@PC$s#> ++hNIdpeI@Li1SP=^?84gJ&mL12Od(3MgF{RNYSRJFEE(q2$SR&6XP%SLBASeN$!HQL^A_oZGE$JFmNG +4QgMzH^b?lA&jDv7F?9dIp6RD)TJ=74x?FdvZddJd+OJEPwnKnjCAkZ?f3noxEGfl3b(qnD)?bE_^d4 +WpMgpE6OjKRO2mtVQ35snopaErdqRcOI8h1Xs$670X)_(n%QJZ4lHjvn?dzey*s3&dgG)6N`yjWijjDZ<3 +<5V+B9LgMJeQ0n4(R0XtF|`vluE2zI`rQ990*Pfnpx_4GWPZq7t@zOQ5VQj&P616P!@s9y_-*3ZdbO! +j}T7py~xhyCDK-2CQ|6za}x=>|&;1C36za4Yu1k+Z@CqR4g}pS1AZMq16MX?`iRjmD`Ztra&D!v?P4~miWOB7xTfJ`6|2nz6yuRNIpx?K9|7FtV{Fh0a_UF-u$<^ +IxGk_6j!x(=ZwS)lQwrSs=U);4g01^D!K6$VJYU*tomzdNlDg4Pl-$3I(u5-w8)ltm`!g4?aO3KER$HRa7JcJM9j2SI270tOJ(I-^YFD53=eW^-1MwYcemmurC;WziuPu1Q +o2=cs%W=ylhUtoQw5-vn~e7*ZmK!Ik(-ouotr8E?cAg=D%?~7XyGQMUFD{F1UGS$nY=PLY4tXZP2AL! +Hg6|iGdIyzLH +tZQELIe@zox+4JgM4?y|Q+}g8Zb4F~1>Ia+dW~p?nyisTtWn$s9@Ycq>DQ_4cZ;#d2E9-diw7pwz0K_ +I=_xoOF+368)zt?r$1O#^v48hyHEq*f~mA2n?p&szYd33iq_o$-wi1QH7gHY6b8>^hlnKM1L-=pzbog +g^d-j;(^yKRF#pRr3Fu-cPUz0oYraEe3Js{`RvM2KpWlDNDXS%YCOa6-svIcDbEt&9`lsk2WzS) +pshnkEY`l&lf}^~a;4|EU0DeDoctYMY_)P9l)^EHKW(vy3*$;b(T1rL98AG@j)%?aRC?Q0s&#FifL-` +az}HVbgH;-#X`YHjUeRz3uV8D_8%HRaZX_^0JLj{`2J2;(M9hOV<0W0x!g+V7vKIdHr2(o4NQS@eX=z6yNO38)jFWEqh_#85f2i@cVqI#Q)=`Wv +4DwvK&)!7BXjN;ne(NrWBKI0IsyUhPyFk?y6=>8cg54O9T&8+T+UyS=$ocA2ZCKNIP +*_hJ^*|+8f7ox9Gthyu}Vsecl;Z)?;0u@YL_im{Xm=8GU@c~*j3_?hx8 +V`@WuY8@g9WA;A|fLx>A?Aq#*a1pAHnSDZ^1&=bx8co1vNvrr)#n|#)hUm4j!H|?iR6=`FG9=DPrpD@OhXyz|0EJZfME;8^p^=9V}t6*G~pZ+IJx$em +p_4qqDk|xV!=k%#e7!r*gxD*J=`^@uq+E4I9-;hB{*3-{{>J>0|XQR000O8B@~!W8*fE&g8~2mdj|jj +A^-pYaA|NaUv_0~WN&gWV{dG4a$#*@FKKRRbZKF1X>(;RaCwbXO^?$s5WVMDjMT%Xs}R8!38_*fpcJt +P?PXVR093inq%}BpHFhZZ_t?&tlkL)tRMnmtkKdbl;~A{fu_nGh82GFtGY2N&6C)$AhMSkK7Ad^H{{V +{@E5Ry_AovcY#soAXe7Rk%@9x)7aDi#W%cCL#%-~;cy4_AmyElSwJBzM$6cwaONSV~!s1uiq8)&`ntm +#30bEYVYlm)iYCRde#4DOV~-h@P*DLN559xu>eAiX2XPt=gSD}$BPgTa +1Bx!pJwUYGq}~dLYTdIy#%%Wg*&66^rhV5PL=3GZ9%|S1lli183zRCX>fmwh)Zr_RvG18nFpJ=n*KpD +nage)VTd2wwWFLpP=%I2$G|~$c3?8MzdHWjC+t(TS$?*>-A9buc7J7}!Znei_{t~u5ZtlCD#6k{adU8 +4L74**Fxvb3ujbADd!e>Wz_>vPj9U{%1_enV=yj8BtOu*4wAqZDO|x5Pf7DiDhAwHv83dON&yX}c_$WP2nJcBh0QR`w&?Xg{2=;Q3#s|)%d0wd|^WLBf)zc!Jc4cm4Z*nhVZ)|UJVQpbAcWG`jGA?j=%~xA*qec{d_pcZw+8VY5(ovQQ~DBND}*yaJ_2LzvZy`fAHU+gx(b4sp6z3)$_@rrqDH>F+xEN4O^L6V@h+L58e?1wnLoleazbttUN +!HW+YL5yo5SiH&vj2WZMB9ojie=#rX_GUDNoZ^5O(Uj8!mhd7<4akys>s8>9kM3o~jq=_mb_Hj{Y&l*Ga>>zrzPLr*dvLa!Q`DiKc$_24%$ZNet}|MU$20fl%iZ +00;ZA0EbEDK=;FZtO(GkzdBu=GTpQd(XBempk!x)l)yJ+^$k|-bJDA+pjcQ~??U#8VK9%YPEc29XMVw +!d`Zp+AW+20bP%JvGnj{vy9~Dk;ATFb7Vx{f4&sa?>J#>`4zv3RT~O^iafS^2HItvOr>dFjrmBQr@z8HsS`Ys_kV +jM~&Q)P`?bq(R1A-!wHhdXVBq1>V|?gR4Sar$xTCz+}^-VS1@@8Rt+*2z5j>#k>B7%xJ=7eT~(2y`MeL~j)N>VDKIDN89u{b +OR?62gvD{@LO7faG(PHNk_HN)4r(|HoBeUT44VP9%;_?+2f1?UhtJ&`w9jKwy>t1Y>nITH!sOp)!n)V +WRIWdpvDlE#a*Gi!2qYv#n*SubWKrveLs+lZwG|Ad@bI(B?F^++it^=Q=KKgY0@H^?C;+-DT8uN!^aD +64^?^`1H?in3hfYr+jA==iT!s8ik*Ug3N!IOP>W3+V!QwgyZNw)W6vMrEyHZ2yxoIY|4mP7a;ZYNmT3 +(5pt>$P-APM1=Pi;W6>PK8AXbPc1lx{ILOV-T@d|!%=4RS(T4vL(wa~G+Vn{77GDsllfFH*BQkvMMR# +!AIx<8L(9R5G#uo~l;^VX%u!1KCiX#`7Is@l?b)B&TWU+>_I+0Kzu9iJL;KlFGU)kao$a^#lMRQ%K0P +EV4y?TI>(^-PZCgB)_f$Njlm)7$Eb@ylgTWt)Phz5tcch3{Un{Ha&X6ZRahB}Mu_vsp8BzlNp)_fmz; +eekg#2x;K#g6nU>y7dP)h>@6aWAK2mmD%m`X7001T#0018V003}la4%nWWo~3|axY_VY;SU5Z +DB8WX>N37a&0bfdF>e6ZW>4Qov%0&QVa>+f}N&OB_i3FI8Gg?z)|8Sw3oqbvdo~_*2@GClH4UI6qxfp)D +X?n{uA$S~Qf}}3Xl!%FscWJ|s(5x0bnKDjLx;~V^7CdQkfhU12c&Q9&fvBJYvkq4j7>@`C!GO%O#1}H +vrRV#fA*Rv^5nHA$SP}>r=WGdLM)J@qZl1+%%<$S5YZjr*{1ki|IW!P4piDrRupmI`#1Ch{kTY*t+)$ +?A(oDRVqX7$_qkhQ>D-tu;Rx}0njqoLpg&-7y6}&~q{c>)5rEV*+NuV+x)s0B%l{}fK6qAKoQ`^<|i51$XAmt>Jpw|al6+hOB(wA%^P^xtiZ~1Buni}S)QR|r%+J~rLQaAw)ml24pD(h(4y^x&${sUHp-0vto>A +cS>cz-W*jX)4|cRl)=Eb^&Cc$C)#)C%g}=+u_JsLypIh9%-~Clg4vd5H4Elfng4dJ>muzmtt3FXj)@n)1 +5F2mc}Ax)c8Q7TIS~W`z$Ml*o&6EjHitMX=tr7IVYjodq3%!kHZjGgBbT@f&&~ISo=8eQxe$|T8`ARe +J+0>_X}LWQs`)EZ$o?UGrY*RUg!MQJvXB@zb<8q5?c0H4(^jUg)=L22REgoxn5Z^&IuLCO7A8yy;B=e +PLA~^cOari24!H1#VfJ1Vprs2p?%Xq)`tJfS?WfyNYh+JD^rc@{pd@U3gh_u7OZyp`)O?0=~Ghx1+vz +cL=%guVdtK-z|K*)ZyxHc4H@~7amd<i{i>7MsAD3RdI= +G%QZ`keT7tc@clKftkh_>tne1B`ow$s&U=i~ix23wp9QSUEccatlJaq#O(;z;eMOr3d0x3IaHkYpyG( +DW*8zdA6gd|B)`9w0#l1%{u#ceHF;^1@B1QwN$x?m3;$A1ybspk%STavt8YCzORnM*b9T$Ee77O#;_h +up4$o5HF9s&78q0g*`xU0kDJOzv9b_7SQlKw5 +rbi0lyTgoY|JBcchqf~7?`u`>1hoM?E?vmAGdTee^<#ld9rM5>8XLBa(7PwT?oDvd|$idum3Sf_ePII +H#Cov^Y+3F?#pU~*bY__*~7xTZ>%b&1SIqmfL(Wd#m&1y@Veyp7wqRjzq?1!|`zWTql{p8l>JcvXrip +R71wwlSti&WuitlB?NO9KQH0000803{TdP8*_L`CI`207U`-03QGV0B~t=FJE?LZe(wAFJx(RbZlv2F +JE72ZfSI1UoLQYg;Bw7!Y~ZI=PN96pq)m=xC~X|GS+EG2qwyQtwQUz+1jLX%?5uzx0H$7a!Bl#=jZ2S +1e3c7q%JeI2;s>2WZofaq(-oG&6!M5GI&cLX48k+M7BrxFjk)-)}N*cgtj&*+7>fl2V5e&ow;-tVwdx +eCWIGvw3%ijm;^|mrJrRoha)@53PP;Wa;Fs|!g{rgHgOd2i9y>8mfOvKw|aWtZ+CGA3Qw83al}x$q7d +UsCCN8ZD=m@)7BHR$vtT|}Dy?+e!n0|)GKc7tV$<31{vtnAAgd9UQcUMdnv<)q(lB(|9INV8+*C*k`* +K+IHxZGe5Ju3DE@~Zubuyl~>7_0PZi>A@HyHB4LANr@q3ltw#VWrC!qidbhZldhG^`E(OG*hf}L4myPF)vB1t}#jcffVR0yAE+XkngKsP)h>@6aWAK2mmD%m`-Ne(&;ZN +006w90012T003}la4%nWWo~3|axY|Qb98KJVlQKFZE#_9E^vA6ed~JMHkROjJq4!Jo?!r26U$@CNp=)2Ig^8~w1Wion6aIS1#418`p)JUk +F_nPkPyk!YL6!RPqP-u~XcI4)P~D!aLDL~uM2PaYpWJ%E2c6W?V;v=-;l&)F)3X5VCSTGVMGno=~ksd +%++Zp%WPmy6~;s#5WyY>OmnGWZQXq?L$ZyrQYH>$WN3+f9|G%d}_^)_IzWZ%&U-UY?(X&AUcKMIw&RU +S7OD{p!ud+3R!s5!&r7s&Xmj^F`aVRXU%GY`H2cXntLndE2CO{=T;-e=lqGsY=zSdR_1BHP!lPPr#r0 +vCj9>cX7IE#3}u9QdMPjB*ea0Rng5dIub<*=)X-X>IUt_OuQ_M6vkR0%n%;cFxPojEXvErSK^Q2>2QC +V$2riVxH&yjNT}~T0)3e`>s4CAP}fnN@=sHG+@$XsdI-SfM-KEH +0WyvYinC$y1YYO~34SuC=fS5Z|X8*Ahvd|%P`ZrE^s9mRLlL6P;gZL+*;(N;NiQqR@*DSm2;?(@%OR? +vrfm1m87OrI@ad3LQp1@N^>fkNq90P#y(HZHAYHo{PQL*`y(r7`T +O}J)LFgbcCwl}ZNf$hBP*09DWRQ-m268r05yO+I;+D~b*bRKF!?eIh!I;+Lc%oat#M-KmlL7F1CUck$ +Ph7%0(Uf_e{?dZ*(A>*a3WR<0`WrckuP-iM@y9`0P@Au!I*XsR&F$B)H1kyUd==I8eOV>n-fZh{b$gv +AS(V0(`f<1`3S%-yq|=JYfvc^~JL36fjANWj;3lPRn+AAxZT|FbnOCdW`SIV{v?b~J1wV9z{rckDZ{# +A-BdK5Pah5sAOV+GGCU_xL(LHE}Roeic_2&+9)}&QambqTF87$R?7aM=t-gXh?b=q~HuPi9@77$!j<& +Dx=N?b{V@nLXV){P;OqtU2)HpYK1k5%Oas2j%j+obFf!Lkh +h|n2p7s*yG`ab!Ikzee<8rwIB^QkU8iWrgf5Lx$H#~{w6Z?^O0J4^ew!p%61hT +PQ{bn(nNHp0-@~fr9k*Csy{1tQTp(;ukGPSADjzla(ecC6|GiUZ2G$1r`&tWd{}wIIteWW9&FLzT8N} +d-mui^&s5Vr)o-a>7p;nwoQW9gI?FDYs&EH0p#Cg#u(kDX)t3gCk5rrT?}N0bOTnHJHQT0WGR&6JoOF +i8XER-09D?G7HYlwg)$E`JjZ8~t>2Cv&SD`z49Q8BH@eYbSBu$>df+RFIYW8hf-PFv~ik19K>G;ksrT +*w;%ATZv=BQstV#P5)2E89gP0FP8d9MQ+D9%9)dk})}qP*pgh9N+mzSsFT^Q5Q|fjMi66TM!7h8^oXb!W@)ns%j)J4 +vf)v+h_UOw?0LXFjUkOmG^kE5uS^ABl#NIV+r&s^{-QIT+`XdyNfD9)3dW(~o8{@ES(d0%s&pA;6zR; +k4}<|z`RVZJsspHr1PxVpuv~2cpdXGcGt@Qx(x$JC_`W!;Yw%h24?p|j^T$UbdRt}*aIDB+Dx!o{pH^ +=nUK7`AKy%U7NdIN&*wTH7z76(9;Ms-;L^i;&RB_JN!e2Ox#K|KlXDZ~-T4Unx^8+6PH5qBNM^ +OxrW#rH^z#3wNBssgE=7#_nuSe+DbZC9{_mM|j`Lo6olAC(hvdi|*1%#jC{ +2YhX>LAfl&VQ93zfFN8d!t<}s-hA_1yga)QQ3DNEL}+$?BG3wH4Xuy?32L)NhKjHd_qSPmYXHQkUJF8 +e8&y$^>I!|V3K#$yQRLBenu`)zRxCW&2W9#Ig_<9SCV7;+Xc2iZV +m)HXQCD-~L^+AY^QjrAX%fE(KpBRfS%?&I=5OG+(_gQlrjNcUp2jKC7;nO_pKX +xaym4#13r^jz%qXX+6_>vCs5lEaauhS#}2sj0h0AS#=1Ibet)*JO;fz2`)xGHElM|t))0Fjia{%A1`l +N((0w2q@y8YmJ^Ow!k>OTRM|t@{kUN)!vt`a-i@dd*XjhBu+OzrTO@A)|wTvC1O|&8zW`4>5E>c>pDB +t-~luh={D=QFkiAf`C4|DL|15OUrZ)R>|rUmzTB=M>`;holGR4l^x*#zR$*}vc^A#;}G5L03l8Ir+*) +#Jql0%{POJe$?>!ElU~FEjg8m`xi&Ejz3p!Vs4+WJZ(H{7(kff5arHOiAvSy{0+?-*VlE>=3IH&4o_J +vR>3XgEgK;=7K2=BQDVDY(Jl7r +jCz!h)&gV^q`Nih$3=IGTfWRCi4bt{E~u30O(7h_bu|DvPrMmNNjWK^zd_MO)BXcW7SYsOSWRCjDIFf +fR7;2AR9gKMO{z^8g=o>^dB$4&OupmJ9Xd$b#4V8=;M^i4O=AzhSBtLP}B$BF#v_Z-a7t^7>+a_UhvF +?B%m>5D@+F`sClnbOo~PE?rN>TOMge3=LR$$JEFMjzdepyn=4=gSgpyq-LcSGXa~p>{YE?MTcr%&KRYvEb=wz>J)gApc*I33UZsF5Q* +gFInqRc2CCK$AS8uFIqNyn4IV2u$f7ipxIbqPt=nrqY4*hrKm5@5@o~ZO(jeOp9#xDY3sE9@R6Q&^aL +X3jgNN9{nhU*c3^ucaM$+O(PqzOkuB*QR?yJA;QUDQTpju79uRrvy_MUS)(u?|mZzYbBGOdfTbdJ=D1 +zY`~?l*oQf-Y=BqsR7R8La~JfTwyAlgXs#8JWlf(f=OUKd83gtT2EGYoq@#gbgeqU{6(oAB#aiCpW0I +Jm}dA3c~d?2fccqlAURbWQ4ZU4&JRzm~#q%uy4HrX9KMvCP=^?Nd2Mvme^hO4NAhxHpu$(GjW5dA6RF +x>OgCm)XB2Vn+%ZRMO~ArkkObj)Lx*J2AG2v)Xe7ryW|fa-rYylP3`V!z{7ApPqG-AhV3c=QU|hSk6f +H>RP^FVT)`=-)yC-!!9`%`RM1u`0GpyHA`+-FOx+KjMh6SCyoSH>6 +GHh3=NSQeX@uVVLh%zKWw&DQwuY}77U+%=x1`=?Rauao7$IJx31Jq4u?A5=`d1l*5CwY*Kpjxn$j>yY +3_Ni}15Z<+_Qf%pId&i;Ne!Hr8Y3dlN(L!}DOeXwgc8ln2>4l&WE_zw<5Mdm%K&G>GC%HF>6@nv^VU{J%+a +#5Q!nReK!@_)bS~QokV5}Jz;3efypwN^t?Ws6MCt8?7CzJH1TnX_xBCJL +_hE56g`>w7t9oY1_{A7J$Dd)^ooeys58LR)Hw$!2~nr3iG?DTB0xafpoT&7Ji5<{r%y&cZ?i{t(L{GB +?(j8*6&(gwxm{!A3+VOG=_);*qfJq)ZFBP7+y4;QpZQ)FL+2$gaf4N27^{X!ht>fWms#R6u67q2#COJMdjGW+axt&}o5XA9X*A0~5K=@?1n1hl2l#lc{fM$1SVkHfz`p^Kh +dTSt`&6>Bt2I%NQD?hr|d?IXGx=SA^6X?LC$%Q37jT+(vSt^`Zl6*5@Y75EqI{LINohPHVvo)sGW$9+ +29S+wjpBEo3=Ib^!0ndfNBT-1g!Vg5Mvf1LRE-6*2{>B)=BxvIUZ%OUbmru)7v{c9&{NL;9q^AZXf4n +?(&vK;14D**lpt0OrIk=DdO2bt!(v(1dJ5Nh$ZU2ix-|%@9nuc2r2=M!4`*5h;xCwr +4rnzw{KVC%x?sEp=dBy5U^+lkhXn3?ZfH`=@(cUiP}(gW9^2_34b{#dB|QkH-y +gy!yJC{^5sgcH{iKKmt3sd(HSoGKN!IDr<6cyXsaOM(Ct( +$FJ6})?-q*T}7x@9=N6B*|H9uiSf_T+i2|X_pgM9)zcWu+K@U0Ux?9mx1|&?qlK$T$H(eHzgTu%bIs6 +)@L{MzRKx0qiNRx{t>2mcs7AsJib@1*94RjIocG&w4(3?F(sH4oV;04rkfeZ7wh7Oty1$*fsJUj7O`r +NEAMqB5dc@zldj%l>RT|}-6Vi}Mv4FV?h{n +dVxI@JFm5`#=Bde^Y1zu_uNm5}uW5?vfbjtrz(`kBS@AsloBt^ON(Fi;0_5kx+b1X?G`0LSEo=$yyv~ +wvo0lfUMu$lk3y!3#)s19oNR{#>XfF=q8R)`@{`*wLM+C87TG=6*=z~jysuFA{ZcYPBz=FMOF>K%C8} +o@T&;b$W8)#q39yT&5%@)vq6<THG5Sb%td}Hz?m;~g4+h;w{6joD5`pVN+X3^5Nl0 +F>A413-Nw5PkcVI~<@%yhzNGBa$-lawMH|@A4X#+#f73LpoN^t72*6m-NeLH`1@#1q%W3?;OTvf`QgC +|)!uTp0peZ&}C9?h_BIjFN6s;^Vqd?uYSbJXFL8T6q +{4zpZt93icxtJ6(U!}P5nZ4%UkZoi?~GdoiN{<9a-{WA{Z?By*OZz|mcU`0R`4Qrpx5tR +_11Cz&kaOlfJdD0cJ#?UYB1TL0L=zOEhR(%4MtITVOh3#;YX`SIx~`QBK)DJwc?WDhW`I93c$2=psI5 +X-rY)o1ig`9ro7r>*bhSX1=vNkYu0d{b9Rn-2)taE-s6d2I)fk8lT_E`2EltgR65Q)3R)bp1lFf7;DE}rDtAydh +f3lv;0L%*Rm1Duq*FxTmA^fm)~3XEK4ac$*uFmngWym3lrB_T{kZe!x8E$)i)zFRe1Qr@#YdIsLzkPY +y(h#ZOczmAlc=$K)no9-tf{_P@1*`iaT-ZDC38RxJ5Nh{5v3bEhB6gl8-jOmCu)pHb6Ak!=POb`L{p@=-)$0jrIu)O(xvu|7u~=4>^*UIY!I$;i-k`g{xr7P5v5Y^rC8=vO+lw{eSuN$ +lmyK?Wv8wR5;Yte_(>UPqA3kXS+=sNKo9UhnM3ff&pymY3W2NHFM^B}@izwdR6w1<~&^Z(&CFwv{OdFypn)x2tpLgry<|Gd|V%KZ2wv~NpJ{ZZAh$P#WdrK}BY`vilV)!2nja&%~H- +KN$w^Q(UY6z#>s5dPu4zETIKW(8|ekZ0!Y1ZoGXbeCT)&4!OW0-v>R_xfcE26qj4Yi4pLIaTfk6@jW9U +(xe*9A*$5>nz^?E?$t}RFmg6b7g&zNoIU~W_tkK4yw-U`AaHS#xTfZ5r3f8xHrrQa+C!y{tjIk`B76E +7suF_dDfO-Pz1}0~g7-GQ}*jv23MPST@6%|}#Ks$nOv-I9bS71ht?iR{vpH{)83=LT8inBVLc?z+4)N +mFGyv9{~oo6v+c48yzqKi!dTOK$Od|Z}JBEb;#Lp+SfSqK8!mFDvFYD@wfSaOU~%aT}v<3n1WAOdBYu +b}}}Lr1J|WFn^vf=>&+N-081eqUuxS}QWuoS;k6JZ0NNwPNK86AQY&n0x>YO=4hRJa)4TZoxN_p>I=8 +p-o1o0ReL@4cBYb)8tx6^4WFIa{hLR&xt6Dq2Ok}1@)XvwP*-=^fM!o#d<-RgAMn3=EwX_H5G^oWe(~ +lpy?pTFW>)q)wSCfQGOq-VR#UmG^(l64v}(+BNGIgKBy*rTP}Y|*X-hx9(91gO27l58-SqAl_cS!E;) +_95+Ae``aTnaatUKxSQqg^E%A47Vd8W~AAh6BQ1y2i2vOd~8lapiWg7Bf(KtWU44h2l1go^gN +lD#x8`Zb!cm`Gir5(9gt^23UecD-#Pt^!tHQbr9!xU>LK!R7CpFQ)4w +gR`yS8P+74rl^(77R!;Z|I();@ZUU#9mRVtkg6y#$G50nf2B`f*4gyb6 +zZj21OV7c06A!;7X=0g_LhEC7&@Faj^VlU)R3ppBxtT9e0wAME)6TJ!ie%cZk_Mna=44GV!!kYy*4NeyR}mKT*IVYdVTM+6q +d!5CG)4BECNRh;UbJ=J-pLcDz7j|&2CS54+|GpvPR|w#>a~l|tv`k@**t959P>VgPn^@Dd|76AUCNps +*~xxH)u9kD1ZU%2g|E|P`8GATVk1)XOAv#sGI#|GN4&O>Lmx>kOu7LATquW~n>MkmHK|barsj92*2@x +ERd1kHIPMe26dSK1l|*_7Ego7VG3k~;WJ1E!r_(}ql@;P@(jQN&z`*tYy?n*s(t7hF<70fH<~v2#_pO +XnXeDEQJ_1`Z;8c^cCfL0qAWnJVtzPC~&p3*2(>XSn%c=)F4#ZmlU(UqS@b@2d611OjgK-AO8p^H>g4 +g78A>s8Kx9D76w>NWnE;9A`nCQ4xeDbS1XEP30>v3-*&IUHT+2ORCkut=e=9?jU&VjlgyDY +t*@UE-AM*gIO8*%XUBc~;!joK8#1_By8;F1(zCl4}lNI^jse_nHdcX(ZyH +_S4Y~p0_B#6-)EfzOqZ+jp959R~uG8(zoVp7r+l1+*+>jkOtN)@uqT=-;}_?+vUUrc>?O2(4rzIj<>0 +1O;xD@M{nr3d6nXstjkxgPrjRqmnT15OvPVL{^wP=IYZW+g-Nz#%A}-931iZSLY!weMTFO!BZ3Zh9Zl +QkG#_mP*5PfVx>~Ti`3MwZxrCn*=juL{gop9y;GngZs3@qq&YB7_+?-;QH-(U^)4$?`&~}QD$NFS#)b +K4ahaKWmaf8*!$yhw-;OUmD)?Wt= +T}1m<9eKl_rLZXt@&J@yt4&u_ZVwR@}e5dC^=xXcSW{L%%?#%73+!k<81b&D3i729GvJs$MoxN3B_DIB;=!vSw|1+Sy0~%gnvLF#<<~$v@)FOAL~FN1*SdPc3s;9*Jf +C56Kk%9iod$QlP56=KPG=6x$2(f<-o_HCHiOo +~`L!vj<{6f?^_?{!v`%y(SAsjxwv%a>c}t{r0?QT{y4Yi8UcoQyh3U&MfiK^jzBp4Z)`D#a`h0*4X4q +d?PwDdT?amihrg^QHlS;A;C#3_OJj51mOO*Q~kxt)W43(~vdT(Q!&T9H4&C#CbbARH(MDB24;DT?KA> +=%5WZyyEZoy#;dlO(&LL)qJYbJBoH?W?wCo^Lqx6+~BgZG_WnnB>f0cQ?rv%-u>laep1OjqQP71G;M; +UdUpOtHzqfxW0`Z)rfW(KA{>D#oJN5*9$2c#}u8H}6@wQgICoqtu!?klI8Y9O|;$@s+n-DuwB&Zc@NQ +L-Rvx$t}P!+vZSTatZf>|w6Zw1+)$w!BOx4@tK +1h#L%|WwDH#ek_V;DkPc?0lndy&-BQKC)ntP=@q=82Y{E%=z$)1q;_@137MrAj-fbRzyrDwhmu+9-0_ +qymooPZ_2f>D(96F=-F1Sr?m@eyq={PFtUg?L9W>c)1JECfsG4AsB+&Rwo +jeJhIj3t7;ps;q%B4_Uc18q`)yVcxR53H7fn4LhFTTYxV|)WsrHkI~Q}_)_pzC(I;%xyw5F +WW$Rt}yyF!6mCk)osO$6^^9BP0+x#l)g>}yS0W(6WRS>2(!DI_e0ig_CS0G*J;;2lm33eG(cO(;hpKh +>uw^`MXseVHtLvVLFO|D31zn!WWp*wJlTyzdo)5WIssx0Vm2=7a~I#-s2>g`{^$2`r8B225%yb{pd{F +kSYw`w%Q?eOhz%X)LotzHx5!1|xs1>?@p>by{9bE@RLsqC|Dn0-K05ib@}!xhd9ffK*?EZZoc_EhN=O?gD}=ZtKX%9h}1mXo>4 +*Hl)EL9=I|G=H3^Qq>a;ooSeKfjrQ3^R&c2a-MtN(W|hTvIhGCEoFjL7CN3{K&-lvrr5%F|wwUe}Bx_ +Jfw_a8Q`Wh;DvMVYpPIxO7+hQ^fRyP-BjC^ +xal{nti8T>w+w^8_*DKxB4*n$Z+_u|sk0u5m^n55J2o*X|38FQbFM&9Cs^#|K}`uO9wRzQW6VEtfH<^_KA^0P7&j_ +j(ycrs_@)-=QSqy;9?s^m+uo_(WaCpx-TbBpy`gix_YvN$ENO#*&M5j`eYJd>xPq&2ZVsbBOqbYFAO2 +B=}xBIh?-CvR2nm%Dw(Iy~C1jHJ69g=^`mCtmC7BI+@6UlmvtCBT&~oaz8wDu0Yg$r7ay$oKnt~3zM3 +5h4*&zLA9)sSgT7c@g^=9jtf)h6?>6-3tcTYvDG{Jj3L#F(5h68t^peFqRH1B@a@Y-RHr0~rmoeY8_g +s6;%1h|?nt7zE%QX}jz@6=_OhFP*BC4;~T7j*_s=~zpl>(O7!6S%y86@PmoAbZfeMJ8vN^1ukI1>4?BNnvESeAzxn?U!~YGrGl%!X +yO|!oe>l%~Vb$M*2ixht6YU4-?xDG>yb;j=E!zg=O`Dab+ExueRBKZ$@PBLVf9zF@fA-4Fl6SL%!%aN +5+Wu$odRI367w5qa3zXmojWde7MCti|${Hm|f4@cg{|V!qhC44F=B^tqZhlYW1?#lVIj5jR9;;SKF1j +$6ZvO|rebMGR@nv7Ns=pkcz5EVezx(Rh#l^|%m(Hcv +c6+MUtm7Q;)woN?Z&nYj^o7*HG%&}K`*<+}Kr4H2ku`qx|QRZ(`iGW+%Vv0Zhz2??BipCdL(vqp=?K?V +8AQLilBeRNmZ7k_3#c<*c+jb}Y74f4j`~qi|8Tr(qlG;if}`y3JHH*MeWvpuP +K(Fnklejx>QSvuXuoIubQ{uV0ljZh`z-Q6+AVCyEyozsiHW=m!;5M6og8Dc9eQ^%KQyQBbSZuIs}mA= +W>5sYcKVpHUt4`9Mhsr8JBtJ3ck4yq*kc!k{Kp + +Z`Bl*BJjsB?=nc8;=Ot#CdkU*ZLBtdqP6@-6x5k8%)@af{j-SOW+>ssHX=caZ*Xs_6My*d|Y +R9`DMi?69bOeB|R|v(q^wwxk1K;0C?=o?GM)j_(wXtvE?uno?XYPyWE=jrBk&`Rh*p`+YvE5nTYwoui +sO(gsvf~qbOoVRjb%@PYy6$!pt{CPH;p*h@hH<5g-`^is4zCf}AN{MR-`P!a49|g+BENkSeH=K#ptp3 +nK?(k8d*#H>(n1ViG_1*z&Ojwpi{x#^fjDW)F@GNWRbA(1Ni^LsmNrcogs-N_Kv?(L;M}X*T>vfqJb; +#qn)2{<^vO?#jgpc8-8A6wyd@x>%fFN`04dtKDVLk#UeF;bHo6&pDYs +|P}B#iOlIB;v<Ln2bHL7AqzyPdv6^pa!p@pTXc9cr1dPp|G!X60|XQR000O8B@~!Wyd7{y`Y!+gRmT7T9{>O +VaA|NaUv_0~WN&gWWNCABY-wUIWMOn+VqtS-E^vA6eQR^u$hF{i{R+e`7f6Mo=be;xmA#6snd`cKt?k +LoEscwU$fkr52yg&U5|h3Eeb1xc50LUqvPtblC1VljKHYu#^m+B^(~q;G!=r58EXw-oINS8gqd(%CgU +1JtvuDkE+m=_?eKvYF&c68U^DmCzKYz$RT#M}Ow!d!b?0vKB?}}Dr-!_|iQS@a~Pod^}A+nb*o}ImZe +>Uy!`>d!J*|RsVKfHVK=kGtfdG{V)Lb-!Sj~=}}dz*dvhi|fSwXVcU)I9@%F9!$9wpnGf*>clwS}~hp +nWpWtOB{?c(O;_ +<-By45Yq{pXWM`+UkI%~v+d8|Si!}~tlC`31Htk$=vgEv30Z>)`ecwXkFW$(Hx1#N!mil@n`dK%>2K- +F2@9S=}#$X{ow%<-NE>jmPF#{Tz$zey^Z$+_~iF<_IO +|rWdCg1#g_Wm#L;Jaw)&mZt(J3cr#n9Yi+0?Ikb&U2iSw!GZnbmWsP|1(g_i@NKfgjl#A?e_CTnJhoM +x_VJBn}MqKr?)^s`A6sz5}IhCOOoQIFuO15-Dt+Bm_gUieti4p-G}!Y#ZW$9Zx;aYNRE2?a|aC`JbUx +%)#>Z!(UL%8E5NHNdhq1T>PBNDTE{O +pyx$-z&SUZrT;l$2Mzfku94x6VSiRpZaMOIJP^*5dcE|_FwL697E*wm8gO1!Rm)^-vaj&2YNX3N)+wT +Se{{ltiP5xoB+hWM9eS>a46_F50e^!6C +|O0lAn$0V-&I?!BvY~_;5GV<#N_;YPWb?nf-etoWMe1w7FkFXq}3$P7iEjCp@qAE86Sm61`@f1i|)C+ +n!)@#A1p!lkIC)OZYfV;vP!0F7IrAzcovdF)HK%oqcY}9Yp<(#M%q#5;nJRM#h6RLUg8mN2%Fz3|0Z5@RK#{TGxGSp)BtdgS +tOMCt3uA0+iG`FTrpKLU7|)#mVDK;KX27mc9imB>I#!b6)gW+gT^g4>NR2egpu!I`HE`@8l)!N(N&sr +0fc5LZE6B|LL`jBm?6ZV2T%;~8E8;wn-mq>3-;AO)%H>i;(M8C{1%clkcs{q4lNV{(g3?8yOtRae+Sn +^8-hV2^(ELwIu^NRPokW@)d!mEC?i3&$vD^~$=@yo*&wB$&!BFE8!OWljZsBQLifS=)sC=k%|B1zIEd +W;2Q&?0}06(HPNlsydd7S+qvRVK_fm1;5<~O)T?nHhopwj{-w*gww>U>sIsG0&NzZCNV_yDXp3lYGE5XeuDhdngZlFy!MkqZduj~QdaeNr~GOLm1kIfM8dW0*bI#6dBa=6jX@ru7nw}HSKY{5in}I5_rH2NrzQvu#xt+1S8KwjmgN9vM)bIVc--gdsmMGaT +^XUjs$!(042?owLks2DQlk7N!Uy{&FW#(%Oee^m2_Q{#Z*1rUwkfs;oL+^2vEh+bv0#0OCaf3ZW3U~f +QtHR#66l8-3(Z#C|0BK7j}wevqg=$ywLQUQ;wGh6<5<0akxUD``e*x2#~M{6zin073>9d_saMs3NLh6{GSJS;V6pmbbF^NO1$bI83}D@?Hx=3)+B78M)-YH-?yrj;MJxb;QO9)w=$BGr$s( +}y8Ewoug;^7gPp}7pw4M+O(1&gnMkj%KQdtgL3+||@6q#}WUUtg%AOmZXMg3a|aK|s1?bZq5hO5S_=KGSC7T=^Wowi+DS?heH!s#u28aPzX*m^BfV#~tF7l)N;sP{R06Nz&Td}T+ +xkYEh?xFAu3$q#tD}vV+da{7D;H&Y`K`HFC{A?+f*m-gy;U^NoWa8s5<;Jczt4rWAW|EKfh^fXgDvD; +*=%7IdRJ|zLh3mT^_?KHb9Q4=6$c!FDM!Nx)(4YcVAA!cah5>F?qAlk(dI%HHAV8}^txG==v6hwJZ`V +Thza#&BY{kp)7f@D|V0b>IVh(&|$Z=4ud!g3mMu!*q_f*c9jtst0V-9XV@3v{?6k` +y{uU>BF`A!NbBHF3-fQFnUGgk}2ZV^U+vM}J&SHK8nagqVq8@?rtc +KEbO~7|$8N?-Ea~_n%C%u3w?WCsHpPYZ +KXt}qjf)=U7D#AiuT+U!-D4=SqYu#SfH3y!Ov*tONKW=&{6<2NH5JEi8%i*S=;`5Y;`4hQII|4%6nv|+13swUOqjH{?xF)56uCijM +<1P4r(b3(VJ_6}-CGA;u8016VS@T5WWZYKUDpwO?kXK#%YlWUV^0 +`Uq5rmTw;|~pc=ndcRK6bNPr7XMq#NhilWgSLO0NAVb*x58Rc~oIusVb9athDdvf +7R8BH{dT~WPfgt$m>(Z*p~VlhL$}DR@mYR?V7TKyFUJ#M +%13GLg9vz)-O|1FDM8^kzR3fwXx3k00$}J<(6RYu-i-{x6z29R16&kg=Abja5zj*Adw5niWzFzorjxQ +_lh*mN-A|%Y)SE3ZMvSt5^ZYh4HNiDM3Hwy#PUzvT9;b4h(1p#MV~15|>5t1z36@G<0*hY=jF1x +be5+%}>~Xyp6u^d_Tk>&ZJ2!Q6N5Ni~f{C?YfJX>0vjC3JcS>Mz=DB-WvFr^VC?^#@-r +a0X(~a!R7W>d*u|xMaiL=>!4%b-WylkO1__i5?1KK)(zAEhvXiv7J$+o)^;#xfra$QS6BNOi21OEWtZ;<8w$q&}& +t~kP;&dG}eJ}o@N;T2*7k?m$BE^Rk7{No(n34+H$K=CxAJ-1_qLda#B8T+b+{&K5-~^oEnPK>4%392} +-qswq+Z}m4Li!VD98*z_9`Rh{iusoqZ&&-o&`qm8Dzi3D?$%CRmJ6-wQXY2D*?`#4t7DMN(E2M8Sc+U +7%mmXD`suIy#}0M|d?uTh2oEYT=JYe{!w4?_{jE4VGoQ=96F~1Djt=`vyc7tY5pEztGBsevvJ?T3DS4 +7gG-frok8p$RuMSr$1nWPa*oIp<-3TZ +q{in9!)J-?B5VxP&f?d^)#AW-pvrC&Lk_sIuwzx{&_-hF$8!a~#C|^}KCKFXd4fGfI#;S`|2(?TCWb- +L<#ZhTsNFo0+x~l5KgzN&=B~ziP@2o~wFdiBGDA!bW#BLGnPsK4VO=riD(sI9JJ$wzy7CUPDYlR2XPv +c^-QH;nnJTekB?a5JkX=((XL(6OE`U^2GQ#We>Nbg|c44m(I`|-ygrA$6rH4DL3VokxAqF5wdwUTXuN +Ut&eEuS}=ilcX^nv$|lT0r-vQ)iIK#u$#&a66bBw8BXxd5;=QcK)RMi293H-YlqaGfr2|17-1l+8%~Xsz*<{KMi +R}6A94{_nU#{psY%=Y*QRt2+gq_{jp@twBu6(LmG|W&18nmzwl0g*45}7y3h;Uxo +BT}BdR7&vC*lBY-vfqyHd~0h+(r|5<_~rFp^fW@x{*%n9bP1 +9GP5s<=Pxa#9jlX3Nc-CQlrOFFOFT|f>Yk>k79M%r(R1+C(g%nbaY7316N@~Da_dCy06<|Kl8JGf7+0 +d>#4p0Y6Kh;*2b`TFB4uB54`7nG1Dc970IZ3l**Em;ZrP0~Ap;AS4)wCdwFr0U3dZ+eW!c86HM +tdWpXNs=;Vku^q-+U!%O +s6yA660x$#JnC|0_p*dpl^B6&C4(Y?7?rQ*$`SfJHus$i)v664S^*?Qmuf +2*J{ukqxN$FWBJcC8GtnI&Zq*_$+xk4il_gpsIm-L9cf3c$tHefU#&3WQec|JL3H0djSYaO)>Iu1Z9? ++isUrHV?oqzkJ?S0u^*#@b%W~{*K|@T%Oy`tDrVj}H_q%3(azYX(=0X>pA!A(e$hvSAADAL$2nn+-Y} +71qg?glbSS4(SdoVLnHZ=?B +b8J4+3*46+pB{G~geug{ZR6reA!iB(m>n83=RoTTh(Z-PH$~rQ_GPpR1?a+Q^_1d=Da4i?W*Sb&1*HMyfaRoo7sXzjooU2L7fr-pNn +@X;LZdfqqdStV{og_-1XXVt6X;vSIEjnMC(cb!#2}a^o1zMV$#x~b;-kMeV#|Z05VZkr8BpySBd_0lI6LNThtsz&ILhT3rL0!AC?B-7#4WZDvazYq51Tk|V!T9G(2ZJ +m$e0}N8D$;xWA)qQk~9Otri`*PQO+mT_70nqbmU&N&R(L~{td>Zwopt1w9iNW;DIfa-P)x}<@*m*Fr} +*~seO^2Cb2xh#R9#S+Gf2+b$pQ7sd+j%@g_4lHR|M#Y0)5(oDcsYw#M}kp)%bj%^8?hO-0W&$HqHg;lTj}XnTRE8ATI~g~-x=QAu}rj?MJf(j?Hjo66^R-<^CE=~>}8sfnXn;`uLh6 +rrZ5>GA}FmHe@H^t=7!q`X`!ifv~jT(TE{Yy4~vZQIqnl6>N&ref#@D4WTNoZTVe%{Z%VN?PBuTX;ZZ +7HdL8CsP+n)6nrPMqW9R{@+0e^mMJGGldOOENHt=tgOz-wMTQp=nt~WiKoVeI|A!;YZ(U*VtCR&@qWj +L+Ii85I8kckbX`;v8@5K~hFgPFq*k;I`6ZrMr4{yy!eTc`Q8+gn8L-48BUv-ENwJ6IRc4Ic9A1aaeO(Fe2# +<8vto`2l_@DOUL0(rMV-q~bq#Jr5Jb)TCn21iye%dg=usviVEHFP9#7OcX3Ec@0r9d``Q?f^#m3Uhxb +!k;as8+J%c@V5D2j!L3ry=QQ60@&ClB%Ir5tiGKb%VDPFk)W;GU7zUZ>OsO1xJVVY<#fLsgvap0z7KW +rQQ=2-k^rm=0}&~8j1ilrouN3(bsvH|_>WG_tNlb%K5ZtmK(+6V=UfwaRp-Cct +OSZE*ljw6w-qlxS4T@*Ygj%Rmn#FnGuB(ulkjybCj)-jWOy#di$ULqG?gV8AeM3>T< +fiIi0}7G?P~B6lI2JS}>{BO-4b!Wl$ +#nB9%Rqx9KAVhv8Q_8}>%{CBQ7< +%j}u!8A?JNk$bsbtqq^M|NrC6BUt9rpn#~1$S!nk{7{M(oHkUA0r +_ZOj&9C&?b_k}>^$V+fT=_z{3kBN0dI)CB0tF+qE?%wi{rAwMF7(?(sC=yrGT=ek|nE1KzTgD+RE;Tr +hTO~beM3tSbj6?rdn4RF)O3QXvz5jUN``{KTG=2K!+Jw%XyNGd^6q!uZzl7>dvykcW}D9JvrTyP32Mk +Q!SGhQy)T2#sVKEdUf{!%%Zo3rz{JZ;lSJ^7>n6V=jJ0AoF~=@Bc%G{w0GQo@+U2aMR7oJp)M1c`g6B +C7BylN?iG+44(@x3l0(i02&HXDf?+~aqxL6FiybNF`T9e1G&(V1{6nX1c_U5-{E9qSgTc_2Pr|SnN~2 +*;s48c7bcc-cWb)=%frl%e<`)-7GB>=C({AsT4W7YDhHTRfX|6u@Khj`;iOW#%vJ2|j2^KSQYNY|`J; +QV?ITB(TK;ayivWbVY5EsrFGCr`w$aGT&3?FTH%pNRrQZyK|JQI(XR7ro_gx!Fcm&ae~Oq4QSDEre%_ +L+aap3-djjr=dCkbhai#EDE|B}z7Ne)Pq0z}x-$WWKA_Ia +tq8O?^zZqu-#@*VgtonGhYPY$xubJGnYwB8?_Ne#wavFD~7kRkP1}ifQ@Fl@R>ecH5FPeDf(Eq +c?Rq8^M#eX7Tt#&N37t`iXT1M%j4R!6ELS?TvVP__Fkl{std%4J#~>PQuVQ&;mo@JN+5gLp4$qK=@KO +Dk-L@Ow>)wu*ZxOn)XWc*^r{xkd;aHF0tA_CLNm!h1bnI7&;R%?_m(MYBCpJ_edhx^tC}go8ndsR95~ +n0ONS2JW!Jf)g_9B0=#@P%9T+@_<(4L>74*Vc~|ku&W(37cWQvdGfA ++o5DmN-B5;ERc0m8FKGKsYV=MZ5Z9xLwGQ=&aOQ*W-XJ_1&`*v!Qu2F>e~=Y09a^RwWi+%MrtB)ilej +!yclT%2^qH|pG!-?bRd&tuu-380ru>-$=5{t}Sm3`QU1CCs{cL3#W4yZI0S#rKioN!R1K&Einh?XCNb +?lmO|n>SZ=*{SrpRvSE|f&LEN{o2Z8iTm}0%DTB8DPGbdHr!jo5j$Tgh`NmCZ~Aj|tiH<5g +mgN%~}J;bp+XOT%^Poyd8v*mM^TQo+y7pY?^zt~# ++zT;%K3K8?fd!D6C$*a9!6>X_WDaXgoa*e%&yj7cZrwq*9U7jO2-)|Q;RzEVmE{3V66e-{b|La3lSd6 +jAq$`Og!i*zb+l=bX8)<7f6iqeF}3?w|dsx;R`J^xHGRzA@H_qcjj&19@?o1!9B4Q7Lyse`*#t4fX!t +}B-wq7374_U(%wU!8$=UN0(j7i_2U5B;@VtNj~fT{@va00s*}Z{VL255V_R{g-GHA&m0;Hq?4gKGYX) +;{GNC%~3}_br|L!r@(Y1|_1fA;W4mu#vdTphEcqCyD8Cge)XC%l(D|bG +eh@9EMM!bd`-as)v5$?curG6rdNG>_aP=~SoNlOQxfhGr-OlpxAg9r5SNwTLMoGFrtFyZ8+j*$md)Y6 +%uCkLGs_+zrC?sL^BFQ;dwQD7`%IBx8rMHD2!rt)S?kLmJHjwNZgbyi6q{QvAdzxSa +j2hzbmJvO0hsjo)_sSi$w_21cAviyW_yjy4L|1sf8`IM_I!KXTVtMNJt2#nEWel1bKNIWLe+;r~Lw!U +uH)Zhlq{)PnyHwzoVl6|BH%_N8|?qBbq3VXmWO@RoC%d*CptH^m#I-)8@QS05x%r}w +^jHlP)UZ=uy2V~;QqY+TJ@!S_Zmw-R1{K0R#>~tiiwVofc6eAY8eW2zc5tX+4Fd_B#aUbGi8^f4bmNe +89hR9u(%2@Jf`t%XsM9Y_Dk;_e9Rdgx(J5JQ=AOA1npVgp<=z{Tie=ZbH(v8OE8l6!GpAN2D&1nUNxhgNbUimP_DXh;D2*!IAqMJ3 +u%*VXQGKzguz6Iu?z;d{yGk=!w-xuYlR^^Ed0P?^T}P=y`m3H0GGl51;8GvUlc!eae=}Q)67zjbt+fc +-2s~G+oJ9;{+D{r8C75)l^ZrR&E9Cb8w?Huqwh{?M&vC`q2IaPU5}MQtIROvMST$wxL+j3KU}lwZpyX +Xf&Ld@^Kz$%;^3!G69Mqnu-uym{AZALNe+a7(#`x +%p`%f7PQ;R!d^fL~LIf+N{95mI!EfyJ{xnfn{mHAy;tgqv@tiDqrv+nJh*%emNT8VS>g5<}P%H34p;6 +M0$U9R~om`OWWpru_belF%%bcSLLxE`75t76UU%Dvn{C$mDH2DX8m&Z@W+71{+d%_959p#XiCInT>Z1 +`2BThB8aV;)?8C0;58QE-vUN0Hw=SgR7QQhVPbKTHOXD3MLa*@k8Tjc3O4Kgm}>k;~vCvS-O&A;vQv{886HTFh|jKO-t7q+@R~Xn@sS=z;z1})`|D1h5oN7wsL!N=HH}w}6vLX)AB%PG~(T8L-Eez3tvqMZZ?r{2nml8 +PpRz~bG-$Uz>uA+U5u~>0TekN&`X1z0JoIcJ>M&z?e#b}34p|91sCS2au5Qe$Q-k!?z2Zwf%Llw0~OV +w7A_!0%H=&_FJ#B1h*5R%XBj(?2g@OJ2bpzvdR24V%B`M~uf= +iz>mZ6<T$+J%Q6$&f;XO@@`)+&arSj774yl#HVDj!iWyZ25a{It1PZM`!`_Ix5Lew#^6DXoCli|d; +dlT0EM{SX*`5oK48!NEAN_4y8+%jJ)_~r(>9sCmaWLr#kZ)?N%D!4tQ&8-*WA1k4HWM4UkSO`L14^}pb4jWO;rpNS4z#lpG)A +W~m>YkXil`_2qBHY|t2aD3&YHT&YO1)DOZ88RKb^}B6LBd0%sVf9W5(%`%oeDfa9Z-d@^6Ze&mHnQQc +F;(@BjTyO&719+FB!JI@igd%cs;|ys|5WGEeu?{@E?tId=bs;c3@<3rXD7LWMF)K|TQrKU;D2ad +B4)u9t!c031TArwAY{t8B76SkgPMEIAjkrcI)>J*$hmX4v{?oEUxLQS5re_N0KoWTXd4MVb&gi1A(2j +3uu7+u%swLxKBmvHt_e-A-5aNfIV_LSg^umZa6sq>_Wt7Hs48y+y7}9}ZJ#R!V?o}6-j@V(v5Q)o1wQ +J?>!U@<=yWvazx`A{a?igo*}@X)66y6QV{fsOgGGFX^QLO}wDE$91=CFYw5+pXvT@LbNYXfp1esYUzZ3oX +FXxl@+Tw9*=>1hW$Bag>q=)t=--;GJxwzA4YGqhUZK6xVNma12Zr`cw7<{+bsX_EGa)kRiBv+47}+u1Qa~yk-)8^Xckb2BLKqZ2pW4puHjZtCua}3={^2*ypT#{-`vE`e%i+2GWK#km&3ly!S;KTw?f8ZO|E3u?S& +oeP9$?4PM`JFM-x<>`-2~REH#qWe6o!-ZtbR-30qFoYwMS6zuv1a*v1jboAX1+DSt9fb!0qaBAWqR=5 +DHO*dcm>)GZ(lJ*^TuXc@SHo5_zR_=n@e)3KW_8UEkdd9=~9U;!HG>#m~3k_-s9pPSgG$KcXmt07gzg +T4gVAM5m(9f6lPDoPAj$tIJOn=k{R`vDt0F3Qkr17acIAylwA=wwx&cjdSl*fYiE(#u>(s&Wz|^6P|( +kv{{TlxG)3z}jbf9ZpZg|LFIb5j+>HS5N>4=xjMt3ra-8vx5&y%J#i%?9wiU*%^A(vmc~j7tOKD|rSs +{)n{BER!2Z;`(BVX;Z$iTD9O<650BZT(zON;^qBE4gV<(%L3)E4_h4-5Ig<;ohaL+oo+dn#dj$}KN)b +BL59mxI%cUNnTuXvmY>=*}abnaKa=6SoD4AqSYMXS*P{lI42vP^`DGYLLaaob*;mw+nYxm^Q1xAP#k? +cJ_Z5S#(gtyo^gIEJ(8&R9}eOSr}`~`PF~1&w+VSw6QoWj%lN-1Bh^^@&$ThqQ`Q+uk}%}zcA7g@%5Z +vfQ}aTM|`p6QYl1!W03jg46GPhY#0R2*$=x4h&egp{&Mt%lHW05Z_jEQ_^vm2-puvGo4cYYVMcrjTG)wP6~87Rij)x#FINE* +)3-%sV?&kp!ZgQX>}!P3S~+OWtQ;d%TVq78Q^ +WL8wZFhxo$C2?iWAf>7L%r|jhB-CM$bEvansyjOmjO0=m#8F4gcO~t8{Y$Hz7@xx4T}s`ru^eKrZx#) +z6+|q-?j2QEs7D2n(o}TU#3O;TV4OL($wnMPv$9Lz(Fk}mT{m`M4|GSnvRt9kZRT|HHrAVufme-6tLY +JuXdP->>A6tYpoe<&*%(JBEk>Ga-ZB*H2?Y`Kd^rv(1ke*smx|lb7(ds@zzBV}%i3B&QYbF|0Sibqh1 +=@?y?%b9^@F+%T3bvW62Uu`PHbo8H(WfnhJcDgeEqCtTt~c1;R>Sia)JQr@Cw4h8bRt9v~38|MvPb@^LGU+Bxr0%;8O=;w^^+)R^=q)1_^Dse2YQN +Z}IBN>!wl(71bxk;A&wXBGkQ>-*nm=_(#36^3_c!Jc4cm4Z*nhWX>)XJX<{#FZe(S6E^vA6JZq2Kwzc2)SMb_3q)B +GwN7|rw+r5D6Y?=ie$5^lXfNRWXB+d-88cCO;c0Il5fA4va67`y$*v3T~L@>M>i99?!?{i4%p*a2GR3 +t^J^39p3&HD8B_~hi_$wTp?DEC@zwnl_6X5!hCr(cP`s65__H}Q|EjG)C!mB_r3sW62wTPa@e&9=zJn +__M5VlBnDMV+UyQSc0Iq!uv@l^d;AwJG4&MoYPqxj|TOq!ceNUtGL;a}k*jM#On4Ui|Rt`s(seZ?Av2 +dV>$4-HFvNYn79$si&Xs=UR?{@peRM!(~6S=3~sLH?uE(jn{$i7aBT^SqKDE#jF`t_gUN+r*0v;7 +Wel1V)mSMq;rS(&-O*RSKMx+`@0{YK9Tm%&x*tc-Of=VDc>EL{|(%n?iloX9r|voB>ev*RPR+~`T1Y- +PFtij`8E{apN0m5WqC&o@%vO8r_FAND6FNPFPzxnn}Kk>({m3m1z#-pR#cc5?E~#kbGjzPw&szWV0kZ +_qf{8dFwhj~|!&Qbi?6PE_a({SKPuR~OG;evi%h@kx@wbj9m9xrsOO5`^kQSgd}OiJ37Y9z1wJf3LTy +65LqJQp*a&tOEHfxu;OrRWP;HDwE<)nJozL>&v+($^^;|CTO&%8HH|EB;k4w7_NfT=DOZqRtxxNzLP* +OV)TMWTtJ6cX?*qf#cu+Jkjk}Kz)NKoi?EW}dXD@$e^untPRXAZUYF2T#hI!kC<#oYGI5^B=%i_I2Hc +K!2<8mvAjR9Om!eqHvkk{2wM&%>{_Q23cI|c*8@HY=>_67K~ckK8OqT!W-%be|Zohg +UUrn;uy@WSOy;H@zOC;yRWigpz>Q_M2aF-R0?d`{!Bco0`W);(V-`$Ro2Cpbs1)WobEQNs%!!3g`630 +uqiiF&llSQX4QL1vW;3F7FCqW+q}*)nCe|H6LBRfmEUxy`%t`v>EbA>Jql=CX9j2hGNM6HK^FL14@A@M6q&n?+O;ash9--3^{->`wYOVvC#cXCotjGv`4_%w5ZKFPI|&zPG8VhYE6A-qkTc-5SerFWE@ih(sFQI#qe5zg4_(=TJQ728_)CfFQl?(S-=)A&~ +)kq)NQu|sUuC9FfD(UhAaWvEc67Gu$_oaDmPNc2{E)Wm!hM^Rcjm0v^2HO&j_FeGj2K9dAcFN1w!cHc +}WTvlqXz+_K1M%fjC{gc){Z}T~eU756iPQjAplAn9f=nj@YULB)o#w)`I|X;shnKOC!>`x&+1C6-ID%^Lmfayf@zPTk;F18%v5$z;3blEN$Kp)0?1Y&}-|a1sz(q(1=$R-^$~~>kYI%EMAfLdr^yBU15+6jVoZ1FB`(w3t +vopIatXxY9ZQC)OLfSwv!MNrCyxzd=smD?nwYNs%<(jBCyj@gEiP%rVyn;Xj6HN{oGQvsDKsH2~bCD= +3U9~cr--t0E=E=WAu|lx_9YK>{&^fBai0vo&$}zwRO@38|YggSQ)1xyz43eZ~`L$3UoTsZeJW1-ZbD4 +wFU%<)`|qn6a5kuq?eC)gkQAb+@kq+IDRX4QJjLRTX#IjBG +k32i)S`?)pb8L8)NATY9-MP0ErNeqo{RSLS|Kn~+~_vTDI7iW~poGrh%&z4Qxk7z>n0ANAhG8qGJVu9 +3{4sMW}HX;&vy;}jo=-!>YHE(tC&2zj<$pR3*lL`z|=ca0dfNOhG9o-v?ggKzKRJBlDz4<-$G<(?}V)15D=P- +FrXWu=KFKATdpwKKAc43PddP$tY07b71&3enfBEh`&`b0}nw5A&g$tQ$~=B9zxf7ZpF)0MZlqeg8^2P +9K>GWjsa!?PXOv#>Y+m5@GMzbu~Fcg=!r{h87&c#2f_huIRdmV+s~ptFmBG^Y*!eZkVeF8cy*_;Oc?M +L=n3~&KTzeQN`M>AWn$WT7*MFJjROyO`m-Hi#PqZi1kFMyaS2%)$CHE_6VDXmx^TBunH1N$?%DSW<%5 +u*#2bNx-2_J2g1|7R7-k{_4bn&yHSiHwGYn>tM#E9|!19zLo<&%7Uvk|D0Iljx7(A+6>Ks}zn|TJDkx +#OsLd+ZSL|fNOItHuc903CgrZZH&O090eq$1r!qj;7C +gOMF^+o_X?gVO=uKyg0^aI&QuF+`RXA%dNzk)SbEF1TEh*Z_F6yfqEPxzYfWC|5)A== +&;o44oP+R_+=Zco4|k{=9e{5u#LI{}9Q57+#Cr$*P2N5lnLH^iq0brqXr%X4d`*UtG#;EiCAK(5Lk?Q +T-M_Y=o8yf3N<#WDJ^Php2O1r8oe%6vi{%-ren;&wZ?*Xf1QvTE?W%_}GJdgT$(K`gKI7IHj_Cg565sl@0{}~|EeOC5hP} +!W6;fpVLG`}|SS4f#4HaF-VNKES-y$}Q`VhfoO$W0RCt2-%n@gCAvvhuy+Mv_VJUtCfh)L6ahX=~G-0 ++JkIhXzoR=A3IE9Ib;K0Gj8a;|r)?#J8^e?O6o#6yC+!&wI?XqroFTEqJ({TZ;PNpAEnt$yx%c^5{-O +5)-yPW}~e-p&`Gxi&bY=CO?UhIP{;9n8%u+@a$_yL@ESc~o%u2DzNfyn +;Ep*nclB1n^&b_|bB#D5J|=cdY^2)51bVjxe-Hd*5Gn+T4y$b2 +>-!m)rkZTig%rfuOxD!nK;+PRCO?&9G$qX-KuDokLxT;Y!em_wQQ +@u{6iBgs4yCl4?gyD5#4;6fV9Ed0fV(*xu*MI^q3!AXbvdxbEMVc0g$xGU-`Jpc_v2&P18hOv5q+bQn +Q@<0|qeX#{n1e$#nJsX+iFW3qGJk|&tEk3r8B73 +_+TwT{zaE9ewTSS1w2HB6uH)SkP*bPcud<(9Rs#m8BjDpLc8;8rRl0)eIn4=AuKVz^l3^dyPPVF#(Uh +#IPbr(%+!I{Xp;C*TS+EMzuMXENu!eY0aM({9fdd;G({J>3oE^Xsyzx#UFm7m|&JB{j+grb*byOp3b5 +fB8n%e_KU0BkcwQqUH%$~J%6Z{+MgymYsHF#EQDbKh&zk_Q^KKl*9EPYlfd{oh{h-x2^(!ZO3VFhElV +dKw%m$<13P&ffPlf~2j>@m4zA`)TPQWeDX_3^pm%H7;;zzFV7IzLG4ktSxeumNH0KY@4%CB=BSdB~GbM_fK$Hb| +?sE~4my#o%iaP$zC!E}8UOv%^hdqeS>ma^?!6NgWOakp?>8%DwOk9J)q_?trugEAKBN*d}0ES}F$j1{ +(QCgcyVo^gJrKU|;Cu+Y2=KMcb8IH2rAjKifci2%w=P77}2j+8+i2$1JrL+<7e^1$MDcYt;C`#Biq`Z +!`d-6b8-*H8^_)e$-3wJRG`S>%*3i5&jf2h~*UCAkte%X?($=4Mq^R_UEBk=hGLY8L2}{(nAan6d2oe +lf#Ru?bU!EnnIrppKDAGPX+I(>J9iyUx99U{p%X^(QDAXwsx1-5sLfS)?!;LVl7BB^k=Xk$5@cR(6DG +hni?~jj$aMNFWO+}TA~JZ*B0);V%Wn+fCQ%X;#-KTD({30y5lVlF0Bk#BdmgN +vCu&NYYTzy`nNlrWekghKD<$5p4({GSAA +w8UaGn;$H${PBMCkc{+_K!A(jNO>`BxbKTQZ1Z6lgnB)N-Se*rdc3Ju!6V>=%nT1#0ju~ru>mos|`g+ +>K`VPW-o*PBtR%66k8oe8N(H^xM_C$VFc>k09scd=4D8Xoey;Tc)Hx&hg%!U1YH;<<}q?HaeJRL;kSw +o)lVjHBnwliA1tRmak%?8`St)X6Pp yuOidDe8T$9oR+Hzp+pJfQ>`wig-n`wS1jF_BG9hQz1sV@d +AW~8RP$vaaVK={dY>vFHf0b@)6CTb|#@gU`FRFsA$Q|2Ewnnle9uFPCe4_x;1zk4YM)$UC+d7=!&X#S +{b=g0{9H-zj)&-u%vwMvA>k|;_gWbww{AK~z#AnfmUPnOrPV(U_oH00GqxX;3Do6LyEyu3Q(PJF;`wS +r-XX^51^bGTswpG!#`gIv0(&5k`tg<4xsnkC)8T$Rx|9&=7rlxnNPe;mVF~&nr#$o35ZuBMSzyn)XIR +*A_%=Q5)wncXQ@Ug`~VZ3A*?}t;v5U8~}TlAQ|s4aCXg- +6%)YYWjfp_}Oiq1u){va{=V!p~i;+VYa*84m4_PV}Hr71Ie~<3rYvzHL?Ks4MoU~cpsa1l0TJIR<%Y} +UVspTjeQSofac7~rr;RmZd+v1?kfOP+2HuDgoN{dK-Br9CGz5r^zf*7dw^VE4PgxSB}coKNdv(JqJt- +n#G@3Czo1cjl+w=QY8a3|5+UMYiQ*e$o&g!5SU3j+hLs`+3cDhIZsVe0Pv4%maxk{s*a3mtqqy6U9aE +XeqbAtgsfuu;$N*3DG=arY=^T;u5gvmFBHF`1jZ<|-|5!l%%Mp=hH#@>-x-{69ah%6&GNO*n=Y$A;O> +OLyv^TpS_%y{f>ob<t4?A$n+JYtypDl4> +pPd0MKgHC;M;&~dE#w{iCx14}Fb6bVOyaRcJHLTcc=>fpc`UOZ_c +h+Tu-20nni73pItWTVK2y;JCegZ-M(BL#ppRj}b>Va+C`Pg1p=BNeEnwP)N_<@IPnczqGJ|N}2FYkF+8?} +@8RjaR}C*JXvey-^%yAE7rC)Jw{Znq7<3wafi(FnbP69yEd2Uv*sH&9Ch1QY-O00;mj6qrs-lC)GsGX +MZ|$^ZZ#0001RX>c!Jc4cm4Z*nhWX>)XJX<{#IZ)0I}Z*p@kaCz;0Yj@j5vfy|93Pc(&z=VQr<*_rG$ +hjWJnfRW>@!HPZ?2#1;BtQxy5?}yOGBeJ9-+FbUyU_qCJF_=?&f+8%33gY%s_Wg=N5S#O$HA;j^I~xt +Y?}G;pYhGX(ZNyhq+D;Sd~wwT(UVbd^5EggG5qs+@Q=Jmw!y39pZPk5V&CPntf;dzXv(0u%7Pc$=Bg} +$SLM99O{y&TrrZ>1(&X?CK4evpKzl_~<zB +{|_T%dxUcSPYQ10L$U#-ik2^PQR>w|e!u7bP_BP?Rvho2)V`r<>JkJJBG5q&DD5n +O~Rr^ngbbt9oDObpx-TQj0K!^7E`*L2p%|Xj3i!S?0w!fDh}Wsx$huDca8`IJhEN!8i5k1YVD+kDce2 +O}2rOzii3|s~1^4OV;qIhE*#TlV-cl>TxjLupnG7w%%EF!GbW%k>*L_Zm*3H+k<1I=SuzFS=JXMw!PJedZ!cgL#=$DN&L%0mminu#Nf3sr|Gj +)4>rc;$n`D`%)T&ehcuTz$vt)LarIU39^HMcioNicy$*js!!0|j;!oHf3I68Rp?ce)`ShAHRD&dG`G4r$0 +gE@TzIn_38cl>+L#^*F+HGvRcsh@ZccL<}{CfTe;Q?=eW>XabR0_;W0a +XgFi}JPzrdyzyK@N2GZA_I;0SA&5l7Q3THBe{RF+n*eLT#3+2=;04I9LK`EP>51%x+_`)vtVx;9-#i? +DVNdM0|M`SaU_2X{9r^yH4Vmx`zY08?B`^i%&wCKOc@uS17}(;jVfF= +3TMl*&cYECJD9<)s{@DnL>`Ld%>LtmYXX85Bl!4E~2SNUud2hU*5g6~Sk&fp4oi?E<0nYlV32=| +le47OwgP3Frwm}awNgA}s~>SS9}XLzRvVJP)sX{Y641EdRfH(=nb+2A}=ovU)QOap{~H7h34VJ$Tg-E +cH5)R>sOOjKUin=Ckb_~{pa`GThjw+8N>Nrp6K^67(#EQoXlBr&wdp!+YfO9bnSd|)!)08xaO(P$jFpauL@QYTGQMKW}l!zx=ZlUX ++5H|})eBV}W|WCXM3ZzfyTSuYftZ0I{zbP1G)mc;v_v|scYeAFg5pt@E=4-r4i7oWN>{-^umL{UiE9A +y=iQxrQo#E|F}mqg57a_KrahOG`P9qCBY@axRtAPzaK%S{E#0UQ>jBK#RT6oqkR?-Lg4+bR8?cF0(#)=6;<`Z95}-N)3nWOOdH@RdAQuDLk}Q(Es2d`c)J7{Z1-E%~#q@Pk6sR& +VAf}>3`a2B=C6uqYE!ZL;{%{{B1RIE6q83dNd1yQ-W*I_A+R<)+QUW1eZ*NdYPo_EiQ_ZeMGVbnx37p +ZC&_Sl|AWtky5Ts#H_Jnuw;1gT~Tqm^%$QmY-ya3U7B0Grb%ULM%Yi@jnVE8gw=mJ$zKvUCtQn&yMJuRyypTrt37SGI0h(N|vspgRv$_u&0 ++?-pp+WmEp1wGSu9Pbf{{ep$z+>XYmzUu(TO_k>czM|eEN84yJrtoHHUum^BDS?_5o2C#Up$Mw6O5}7 +Pe}KHwfxs__792+NEZz@t7aMy4P>EO%TXesUNQBg#?ALY!W&qQRXsLf-DWg$z@q@AR@O^{Dxqxv)Tjv +lxq;Q&)HpUE+gKpBJ1TX~EY&u0WyR6RX!Y6L)Xt(2vep?0M=+1KqW`-T-yZyhnakg4F+i0{~q_K1g^$>O%&|qNEH=wL%q +fSxoQVgmf?7PS*Af_P`)KlzOw?(vp<;5nmelY7bNqs#@VM(HqF M+=X@-W}s+Pdo08gEZ1F!RkG!^ +m}Vf|lXl*-97n-_;vRz8AsiJbXr*heDkgBNAh}JpHX0ddGID!OM8oa0K~G{TX4adu#t65b%nw%=YSY% +M?RsNoj-6&TxuT!BzJ8|+JJG~6i5Q^Wjw;H)Es}}Fzc}BZF*I1@H?Rg$i7Y?x5@Zb|!XVhdTCLY)K)e +C%4cVyXL%6+73s)b@ePf%R+~&(A!bYlwB8 +3K|3MjqMq;$xKK<26EAeNH=bDOhns-Pi_>LC>g7JXhe&)UI|VJZq=kRslWQYqbPoS{R~JT{p<$QyJJf +%e*F$UdIeO04*|kKzxEd5B20wLcI>TIxwe6U&$g3o&gyX0)0hS-_4glPzFTi4(i_PbNq>retyltyj1X +*ET1UZKSGTwnUv8%>#L1Hg!4#j!K+ktqTK?t8P+Ri?EO0ua6p-*)Ul+Yo(GfJTGghXJwUCZ8uPcKy=kKiNhxe+796h>_Wk^vi+o)mn)UvHdWN?pEiz6Y)tv1#XC1 +4s1BMsTDQ9*VL*CElGxX2nHUR@)FGv=}G_t@y`SWkpOrx*!r{Cdb9t3DZqu?ID0)CO)#LLXE(0pF&;G +Xiuv0?MU%3har^6RD3np&AQlR<{O9#1*BVp$Xikuo~1QH^81#iZ>f9=*lzKcp27lg$@8zjDDU0+!h*-i`iswO{Q=FK*U0HIngOeIDlyJgHtq(!1 +=JLGX(A;;wR&>>(C6>(~52$pgv(}}m#Nyq31;2uHgt{`o8>7iRoe*B0#+^x*6s5s3){ft6jy8#;rk-y +xl*zR%_z$S|`x>_1C#g8uLfL48{O>ug&Ghd7+Wad0S8d)U&HLp61Wv;>DR3x|Jg +<>4_K4h^vWWg*N#cd98EJY-SuWaP>yw1l=Zm@ABsHF$nF869-#f^9<(^+@;zg&vUaI$6~iUXWEF=FdS +A>t*4vrucijEN{{B5`#QhHNtqa#o{d7L*chKHrNSjY-WA@q00t*qj<84n@Fb2bA&1z +6&mx0l&>}gMyi*gLOvH<-F0IcFgRc_X%tk)$lP92=_u|4l)l`n9vQSiZ_7NdQ7jYx$b&W|5n5Z}Ka?w +&>i;Q1+3bfI=cBD>dKvx^d|SZuN7F#|l>dTcpIqzhNN>9&B6jR4dZfo$Qy!lT&Z?|`4gtC1Th(RG1$D +iq{wa0Sf$TC)LI8=Iye_7U5jZVR0LhV+L1SO0c^C&X3&d5jJWmzS-ltEiZi;aZ9w>S~&|4A%o%0#({r +s3>wtlG-YF_PjY%EDT4Z9i3ru`na6|@8%^hW=66ZY%&k+Fsy@YQmWJp&Yn!&3;JIw>ILS#L1B+@5`nbq{Dj6dK +PlT*P&lZa#NjY(T=rtiq0zGqL;iH{pWRvO`q;o%_NwxlsgcF}T6Hk1OL +J9Z6AW<|hJomwEhDdTZd{z%H^tnse(YQuXy#P8PIf5=Ilc8kiGaa6T)H-2-FAVNcF>Hk2 +?9v@4Y|+M|qEw-N)n~*Lt1roxV&^wBndz2%;baDGSd9^vEV^Sgln{HUI&A1iFC`8w2~LhFupo#`VRl5 +~K8DqeX`{2TKX}3>lx6Ew!akr=7?d+4BCo!EeDe7hW42>_|MllPOc$N7EbIfvWz|;+KtjH}N6tfk3p5pI?1t8$sv)J4!QE%V%BnI%Q*ZPKilLhwX|FSN-@+3-w@ogWW`e`AyJx +?D$0gWKs>%Ar|AZEZ`H(;?DoRqWNqo@g`sxfHh9@+zfWTsJ!Kd_e6JcsgV~a=4wu!Wa=3qkS8rw_2gp +A6n0XkPpHnU5n%Q2!V-TTsT|pJmhM1cySKDdngv_!)Yv`KM3w43*M>If3u|Y&afX_zq6ylOG@Df=uuo +}jYJJa?G$EBG#bT8n%Y(fnjdl7Nz3k7)%waDw;NQvq&nhH2kfKmTZIUpajZd)doE`itrdM_S*Dd6p99 +ITDEUu}KI&!-YAjJt#*Y~PZF*x3+75z5Sq9O=_`xW|Ex69At7P39s6-D}d2|*)t#R;WaDsn6!mpo>Lb +n^nY@DJY?eY>;rIJHC!YQ^4t{8@XLkmL9)*Hz!>+l_2%JA9C+z8^=?T5mE +>IMhU`)t+E-zW`4C>A7s@tx$vNPqOSL3(?YpX~raL$QD#%GI~Rd;ZYl8@Rwn#5XH60jm@Vb#3~d8M~y +9a!N6b#zFW6RXsIlCW}l5mm9b9a{&H!l-Tp(Y<;UjupT$@}?}3Z=<+9kfI=IulHFS+@f@aDz0 +QNy+*dCTJq|r*DNv-IR$}9(fS_c$Q$m2kJm0JP2iqW-DP{~^?>f>+IeAW(-s8#T=XhmzmI-N_C8Ifa7 +QC}oLA^roY#}~*I^ZrR!D`A^>k%-ce;bFuX7I4FiBiE2*7%jpo9AYh(9Ug*Lv1szhS^NBkiwDxmF|!b +l}#=TUHz1vRx~OF_O4X24+@vBNf4|_^>;*YU|W=yp4;Fac`apnSqa8*CdwO;%S}T82 +fpgQ;t{zSB)eh~-ms+#z94)Eh>}^veo?R`Wjr=ppuJX|%M`=^mgeY0t6AGPFRN-I0jp(~0VcBx69WhL ++kahqn@)QZlu6yC0RX_u6*)BSNZRWfYNpS*J-v>ar>KE7phXj`X~lNadWfBE8xI)EX6of8Ez+6_`g;`P{{ZgShwAX41R0vi%hjvDEjDs|7enom1QFCOk_E`>3fI +f-hAAfueTikNb>=T{uN{H4OMvj}O#g~D1!uh$;)8K`Up5|yd5M6nqVH7Yyn^|u#9+i#k^afpTN9R;A?9mWm0hp+u9H!@M}vFT!~BCm!>C*AB#eaYD2pg ++C$=(WrTQ{U +5qKE?Z5MyyIbb_4Y&`+>F`xCIb{X*hY&Ggy3fkAORLw*eR(^w~}NEhatyyR1PDH*A^Vf4=(R`CYjo)( +h(ZtHP`_Sv609rvMLxm#`_eAc(DU33s1w3btEfm>j{Q010*c7kMOLH!w#!JM`W>ujMAjfZl_hnCT;U* +8eb!qCa?@Yy&!STuwQ)@WOu|_ppx{Ta!6PYyN%A5QFv!N_WD+)9vJU)Kh4Ctu_!J5Tid`^cP}}~hw2xQJVDUY`uNfJV@_r8qB)M)ytt-+*ft*-1x>HDdCJJ8+azL(VR(TgJ>9Jh4rgrk|2Sl5 +|W-5Z2a%LJ>^(03r~E09OMil0X4GXuScEmqvOWQlut8>FWGrk?U{8&j&N4Je=XDer>hMuqpnbYqn7;|ubE*%#f9`eu;jx+539>+&+^u~T?23DsZA!HG_xJ-Uj|9 +-SPX{2@{^2GWh#<`}TV&X={05Ry9Q83j3k$djdF@iXW^kLd^WS%1b2J~l^% +s!Uu2HJ!8KxO5$l?#VU;>xV8hG^y50Oz4Mx_av{j$10ek$`;vMK5ECY70R71h90yA3q16>7qctO`H>g +bV||pnre7MSL0NEkRb}(TAj^rC=c`qg=1G%5%WL#trdcZRO8ZytDhvoSSp|nc)(=~#oJ^x_gp*sy`7( +hAGS)JwlsPLcHz;qCXop!aV6gft+wawvV;KpskrYof3OJmEWmYTzmUu(6w>bUnVTcKiG_W#;;p|7y^* +5Ap3{#GMb$S?m_2Nr-_wdpA&xaQuj}G63^5z8IgzzSOCoevQ7muLYn*!dB;KL`QuMV)44m>4hldwmMbOyc +ql-^QF3|oQAe<1d|6HQqyx68x`LW1RDyPlU;=7!SVq2q`-(!YM8}*lgOc+Y?He)PYEsnl-?Sm^#ys#_ +~M+|U@G}NK91a1p*m>_y6b2q`$q{XCimm@s?IXV9I!SP@I^glis-#`89*;oG&AKjb0dGqf0Lg&aM2>; +<^H`Gglq+lO4Q)aYQ3Fc^bVO>s0Lrc(pL~d`e$@ +xt?S|+P$ngAUL!h84boxDX +W2I$a{+W8MgquxL$lC0S20OPiD+Wc2W{!dBHz(IspCHa*xsHUP1PCQa4j^;=?T!2;Zt;i&c +ixoCeMLgA42zLe0)>i@slSdPRP#SF%5ct%Z-ZsgUY7wu62lS@Jicn66nMEMpN-H|ISUT$T%9t +VU8N8TcYK?iouQfiK+1>!L0jY<%NT+KLAKckZJLH=6?)u-wq;8c|b9km^)BbsaG^02B*`&tv!!DcTpP +F*QYNDHA%Puxe(#ciHkp&(w81+M^i7KE7ScalW?J~w1LjmKP(-cs>YaFLaP9DF6S-p--_F!Zl`|R^m% +)6#i$W4h~GGstPIwnnxIXNwnCfEv+HX)vGfY<{uLY@R_Uf9qcYrARy1Hws%uW1L) +O5lTe!5JDcB^>#HFqmDT@-g*|M7J_%mJ1Lxlceni8j5XUy>qHKLRoUvO#nNnJS~nhj}IT77$nV +Uc}T8)Eu*2F7d#A()}Yxp^XurmbevX)1!O3%K}{(z1m{rF1(UYDCD0T%0-Afi0-j}0nGSWV)0Hf5GN8qk;2NbQ(KvN};%Pf{!-D%3z+_k6Ln6g)3c1KU1p*b>V-%@&0kv_5^EWUI1>Y$ +-#2#pC8q;vK8UD$=Ym_0!t~$j&~Cmw^hT)F4A-&}$P!(=D`D@Rb4h3Gf+2V9r~H>!@L2o62gl67pP^e +OcU|gBHLUTH6eewpb)#IvB|9@y#A?Dc21vw>_$C)ex#-14-cLJp;J_Kz> +L*N%!Le#fz%p+{9Q*3QI_eabl)fKMkqyj|7WwvNLPHl49@eYyy~()2#fkTP(bmt}5w1BzQ-Y~D_y{7w +4jFW$ZV^B0pZK6{r`E4scp9*G{^AdPTzKB_4 +*pqp0mv&ptCld9#}y-)+fA_p7fO$jG36R+Y4ppvV$3LQ_euC(1~Goc2;G9DcUqJ^(Jp9kK4i`P>G{^BHO-khCqdDsCnM{LR6S2m +3N5m1)2O;T+O`=VCGtt4&Lq+<|W5(8TOm}18OEXg`W#*iaP9Rv%-WJK3SFzEiXUmH96VvapB{iYid~A +|WQ!*SnDS$RtvVGcTIWd8MKHDslj*ZpG8%iBadvsn)%<~#JC;Xpj)WnWjOXkTE;mZ}yJg}4e{gZxT$_ +~D6_V-R=B;nPzQbk!TeA*XIB}RZS4r|4I=pjLt};XbI=~~_$UVU`I01Zmt +A*Dzl$c-V5uC&KyH02i^&!mI6O>DVPqBb1cMTe+NJ8H=UM8`?Hg~3(W6^0yW#Rk)V(t2off_;JrWR0Y2Kp;CL`tsT~CYxnTz2PBo+KjfxYlfyv0TfD|9<#=T>s3$ii3<;>hq7F`vcWREl#QXRNGxqN2 +BYTx!DN7AvFnUn)1}%|s*lnD%d}tD^Nx?2%=kF$km1Gz|m&cfxs?ITPU8Snbi{n+cDnV6Yb-pE;KmGJ +m@cM_Ze<0Q4R9zV%sj>_7zO_0B83FJhJ%!N2s&7_kH3D@-gQEa)41KsQQC&eE00Ik8RY_NizWzC#V&? +3++AyqQGH~~5XhnwGSL}_|#z^tO{)CBC?=dVMsYJSKnBTa`mULChrpTKu>f-mm&TgJyfO>WRX;N>WVH +cLmBRNxaOn2iQ1BLnSzRtlDX^%LesI9h$}?;~Tn?2kJ7kb{P0| +pVYrq_6u}RE-Ph?R&MAz`&amQhE(x56JIMPvC8RQ&}JL{)};--tkNF9H<>;#-DgCTx$~Y}plisK&(!p +H`N4SF20}30w9J4y4nfMkzoZ0U5!ny)?RFgSuUyryG5;534eOJYIyZVs`T!I90Q)BPBCbK|@B-0%+0$ +iwx`#b_i>k%%8=Z2*_l!dJW4s2|i7@kr0( +Ik|DjX8Q!BYc1VJDfq+@mwb13|imV?1{5h58`x8ftVki1)n|mY-gSiBi{NOC)CO +AcK-9Di;o{g=RbdW@yY1RKhixv{^&`sRlqj&nZg~X(OtOGTu*+c9}Dt?K>tuQhs6x;1wF7mQJltPx51 +obC-4Mw8Zm}OOeav?-Ua0_zOU(~JS@5g;aK2k +aivWemjWJ}7rZZwQu91X#;n`tmWxZ*D->zrmX$0i)0W#=v;ME(#@n~7 +aem{3I#fp>*FPC_GLR8{ov?UM4X{49ebBUTq|k}XEJk~wo$(i-Lw!KKIUTE9+6{`ZCUAW$+X75PU>gb +nYNNgMLsmSnw~P1RLyR<-OW%iknH~&-Nl$Cx!=3Dh$I+t)#qAepO2A;b4sTrYS3Tsv`yl@b7SDzov(t +&b#O}&Fr2cm?TEco`}@8qc7alwKw`>%TXUB!Mcu>jS^ZB5v^P3)C5_>U?4{ +C|Y!=Z}i;6qfgX2ye)Pd_I`-P5k~C&eGBQWQ?H@on*-uKw$KT&e%jwr8aqq+=R_{r{(PZz&!zonbXNO +eaxc?l>2(N#U7T+jfy2onZZk5T7A{{0S}21nCjft?GY4-(bZ6Mefm|OdCSs|kh5;f4Z&LBd0*gu$s#X +^wI+?KQ7_e9&}K55|8COoM@%6jW)}l!o9N4u`tWU+Ea^NTI&}$=D9&`^B~-je)^yRq1sX);u7g0J;hh +8Rbp!M}#l(2x6Y%Nv{nA;ll)N={gP5iAtQc3q>21IP_LzUX>lQp}oj=nY4GEIq2Jo!N=1?u&P_$9IA3 +Px19n$%+llm8Sbp*3w86(tMiJ3<3S+0HZBQyEv}f4#2U$>D8;Anfms}mEs!g!&Gp2M8j5$-hhr*8rmv|1Pj*Ra>QR!+h+{+qj{$0vk@dV`}?;h_M`kJGCc +fqVJQSpFf}<4j?L{->C#Bid;zPcn;)wZ1(j%b&}uSqvL6d4Az|#T{9IjiGKSC;a!h0gbXsuYv*Qq?-2 +x5N_4YQe>QjZ;2Dg!6h)uOB`9bqzpe5nbA+(5{;sotc_B*sY;=n}`SGZ`bKmfKjUGH9bdAS+Ae;p6(- +?CaYO2wnqR@d)cWexSZu@1RB`Ap5E_qY0uunFd +y3j>~w%2?XpA%<`o^o;QyaN{JK@C?(5gk^c(W3}xzVI3H7)iSb2;;sZG3dGFWR*776E +y-4ITFN}7V=9oqi&35`b5#JQFOFc^!G=zt<#eGPO!JGUFM`ibz6kE~r_Ub52TpJ~Ot42u^kR&nRFO!YSYH^?MV!3}Oi==shh`*kg8$+HYw3(Zc)0eNF{qTJ +9@~L~E9TP($T0A;`b9;R8$>>e}@s306Rrn^t#FJ;3_;K_V0)Vx8bpG=QtB?MKy%L+4HW+gvEPr;??<7 +~3X*{G;W!4Qix=NoOF5{-eQFl_n$9y$_dDI*4dU7~<-_1PzdSQ!&>Jw!*v{uQk(R-hst=AZONs^|vMX +5FC^~}NJGuwC7Zx9jq?4POCP>G +^W-~Tq-d>8kw$*)SucCS5Kx}B82DoPsdo?mOGcbU`%_}s8gOULRU_~Sj~Y=I<3oI19h<@#p8iQt6~VE +wKp}f3?J96(UVLuon!ew9J`mN+f$;4r7D}IZ?0*WydxWmfoxT_0zK}I`1X=2xhSX4o$f@s);enBbNFz +iBCq)Caq>p$?_Z&XI;kYARB^|sL{4mTZj(Da2dd(_I-N^t=nW|raUe^`l)iPsCWbc5P#1AE_}A$nBWCP%Q@0D2YL3w9z)IC1App_lpRvdM4ETNC}E^RjVWV$o9nIXA_z4NQrwwYM%8QR`aK~(Ep%+uo5&Jw`kDDf2ts7 +>r1PGHfw#&h3Y6=1t>!c5W+4)T8M$*723nGP;+*r{kq#qzl(iwZ%`B+ODN_`D_tExtS3-~5;Wo&z*%j +n-8j*LzD4TXUy&y^YsU;Tc0sm61834N$B$_80RcW>3kSa2I&Ued^+nrz0pO9vEerUmWHaVlU~C2{zx` +Nb*iup(-v10nPQ=pKHMB|g>h|EB+K%;pV})FiB%M6Z68QNcqaa{p`+e~>^x*fv`~UP9%!tPMfO}cPX{$%ci&QCRK1pMUudJ)9nHK +pKF1nqS((&z$Q+XS3y75jzU7&lf@xdoHAPVfO4Yp{d4M<6UWv^nplVE7uI*Ac-7g|;wG|J2rCU*1Z!Q9a+e*YXq{aU6qU~_NGAepaG3zV8M;npt +h+zwi9J2khMqi?AR&%9Lt|xsfS~sq}Ix3YO9VZ=5fMzUrQEoXr_a+g@9EDf{$bV~YI*$Gk7l6Ezl_u%L(0@*t>9u>`J8_rf4UWVW49UKAC +dY%Hj<`zxm4i)Cx$*w{^~3Y*d`6B{$(m8&u6A+{O%XlYbZNxb&yhO#-gbB<~KPA>(y(n~YVU)FFod7g +fxoCE`%VJ($cR+!6613{tmS_cqaUeY!j(F!tu?C%I+&IGO4lQvd(s8_~Xv<5{?R$bQ3u>?l4#mAEVg# +SCec4k-09qoK7`GJnU)tp|OL9qy->t9}mo1%u6YqSN2&{HKFm>XFgZWDHo3#O`QNO%*LII{I_H9SR`- +%(^+BMs%q%}>w%lb-j=)a3b{C^^4xb-tEXh&*7v0it7G?TPWlryrkEaIr~bY)PU0L0NdHl1=oFf>SI= +6bD444ai4`1L!}=XF1+?CdYl!KH%u{qBz2ki5Q-m5i&*})9mIH19;8e8!@34_b@lMd&v#UQ|i)2pOpt +6C($WyrF)om$*ck$D{X68S0Hd2v|It~jIjDXNcKFB$rg>z-FTzkpj3QzA6OT^37>g2Iy_{0}kv>@~bIXq`^~ivOU9H-U{cbF--7!*c1Fr&}J&t_+9ke8kf*kYvI!LQpJn$Mj&^NpeNX7 +%Mh-zmjP7@7hBbla5J%+O+C2_wp9ZRKdEFJ2IbJl!(Hla!zGsVO4k36qk{0Ir%EmEu>Y{3Cif2-MGnD +b#E{s&*{DT6!(+qX>j_L4H9S1_}-D{5!tm&eR!|d6C#b-qsQT?xsjE4r>6CtfbHlRWR}x4Jy8bA`l_( +ZvB`SOTq>Q0Dzi`Kt>>lD5{Iy0?|@8!LgBZhX=6$cF&^(nQ`K{X5^~XYL&um&pc`OPDp3!0NB?Vq810 +O8S-wl6P^Sbv6K1wbd0SNWV^fCjMVY%zMfZM=fsX9V9wZC+guMnVbZrM0PI_#r{HB11_52lw1F#AV3_ +a5WKmy-d4`QDe!x?&n5Jp`}zatAPvYOp?Ul}xG_@3o4$u!X}-otkwXBHH*=$2$di$Yo +_9Bnc`}<9%suef-nTFIM)2QDc +D63&B4Za~TCBpHv-hIR;;=|W=EJHB&e?~fgTs@HL%+B$SeV7^;PmA3{OCVFUY?#`;7gb{c>46|;2;g9 +WI12vT=J{{99S{uEKOv=#FR~wluMRmEMzgf%9BZ{b{QQ0UM6>83Ts#)Xb?tH>EjAqJ!CKy*5AW=DHfb +9b1_NzLi)6CvRH~7#}zo^o!U}6V@1{7tUDTK99 +{2~uCnT7=)vK40;=P^J*VGAZx)XH>iK?3;#g%UMrDsrQud;Y&j|6clg%=dlRJ&^>;0Gn_&$wi4e4r*q +teChv_i44>`mZ+@3+5axTKRpS4Iy}EPIz^6wCioyX2@(&IY$~qCdmyEV6xztm6_ek1RCwb7gAXX)+m> +oi$|Nn2XxNe8FH?~l6QJ?6Eck*5fUgA*iVPxH;c}U-aqeB1C!&-Lv^a~AyplzjMF6*&FkXgvxF9%Vb_o>V69^~=28eu(c +qs}w18>1|zjqr%#;2A0V1GW^gda{M{&mgwOymoCLGwUlFaX97tzy^nye24cEZ_uCTovGNaK7Zr=0q?$ +C6axHTxbrO5y=bJQzY-G|JhkNNt1}ZJv-8`D+VL?0V?sg$<+5K7Z}n?KXBYOTje}tlqr4JA~e;Q6&YNv^f)n(W{4cMA=)URfZJCv361k +xWf(p>1_-qMHXOeWucvL*GC~3<)e)G;2PM*hnEl_BJgk!7;+BLC%LNtqF(pg6;O>dB3u+uUdUAf{>kz +{Es}9&Ta_x?(RB8>ARk%Laf39w$*%y2Ut3I*4|1&;leS`?Z1PW941`SX^ErqnNK63}RPY=8QcehnSDd +LxmEgp<(T-J^p@qx+_hBkG#j$hBH1xtc!K~wy$iW*omR4U3bJ309Mne|26zXjQmwN5o66dBJ +gl|T!?7JuoLdM~kk&5OPizY@;^}g%imdhkYQz-LRJ(N<&_vR(0KTC@y3>|>(m4OIPdi$qkUCs7EO8ef +gQ8rf;J^@%`a2-hbiY)6IaBMX6w@;?AV+h?6U;GD9=g`jc?c#Ott6&`_VJ^BIm84m=L>Pi`&R2&T_;o_p&U_-6Sx +{pqW0!;F3L1UcSMCGhy?13-T=f@&6Yr+$k2h;btPbO{PyJN{o%!>pJYG^;Wh4teEQ6bVmW^PJQfkC1e +FuM$Y;+hXwRi6^N8bje_kxo9oQG#Z7h2k4>@L-gHKh3aRvmFhJl-8<#MRZO_sTupvv{ETueYB;L=y%& +ZGqj_(281kOH&Tep<*=eg_t+R``rLVT9GJgG<766|QYCph$p8JO(5jsq2+os>Qgi!4=^AOgf_93EbR* +Q_OP?&H|9v5aBOo8xjj5N_Yv0?{FV52aussHVcF)e1^;=p9*A|R~{)BzSeKNI`}BSLu)y}g_&ds`lU% +|p)>~pSQb;;%D}?p^ascU#R@C0Tl`yK8CDa4jJ$&iDkdCZ(mcE)p;;h$#bBuQ#PnWCRE@VAnQ7ruXrkVH3X}>#m)w*A +%VQZ5s}0G<+@1RQ;g3BC!qDgsH7q^mWv;$)mrqe)jQoD_Gm}ewK&RqQ&n +AH4S@>6$`CIrOT)u9vM=S{;2pVWwW;1Owlqgv$h5`C~E7)qbTZ=dY8&invv5Cb~d3ko!FVd<(7SO4eT}sbqQILQj?Aw +a`IvQ=Yjr(L?oqp>lEje)a85-54>!WmqSUpERe=r=3E5IfO^x&<&W60`eGckZ&9sm(p?wJ7|AeuV=6m +s6fiGxGZ()3#uDp2d9!vW4WqYlMLHj?zh8wmgU-vSF7Y*jZ}wc`&!$S78!LjXF@#%)8}eSM<+TmZg+| +sD*KA}mb(&W8(T|Mr-#$(csSLxx?m3?eY=&5cObpU`XipMX;H#hyUg&5bPoPE +mn36{M46IlXMfBglFskElU72v^*_c$i*J4HjEnn@L~cc&N6e@?PktmJnzi`F5S<1k{U7Zxjyrr0Pz5mO(u05L +Pyibfu(k7~~u)m9Y3?1jkfb8r+XVf}R1U#_33b6++2=~M`MhnJR+lmKtnbWg= +w%#Zh>vlp|q10%5n*r5sx+YBD3|2(FrCd&(u6L>nd1oQlRRAR+*%lmOJj-@|NOP&%IAv0$;{y +p{%Fuo&7{H)%{}nZSE5Nv1CEM0AAMAj}w4C8A*sf%MK$j{2Z-LmV_Cj +^rYg7NrxYuFjKpV~Xn5W?yh)+dGdWfZjIRL}+Z98{s9*+V4(PQ@Ss|-kk^i+J>zvN+whLKSv{J_2wLnW>Ps#GAu;dsXNLTGBgu-yz0UB=~f +_~b?>7}_++K8Ftq2pwlDDMLCCF1@@BWY^1g(dX|pv`moZg!(W*7D5dXG_jt8`Sn)5-ju;%~JWWS +wa%<&RCLcg;sGK|c{4x#eCKKe+Io?|pS=UpeuGV<$UR&WR%6?t3`7aic5=vI +pW#7#k|x|mBbh`A~_O0&$4cHYLjQ3lwV4Kmq +WJKX->om=4q4}nQX^OT$`Z-CkGdJNhE*~^Tr$-_@|L +#Vc1>mnOIdiL2mPQY_|8it2fV|6p?j#JaB@A)Dq8HG#kZn_WWI9{WPr*HM*U2aI0yV2Xo3k4u5hSmc6 +6q{b{Z{!nSEQ_^O#&)IKbDv7#yGeHHg5cG7goSzozIU^Qc5efGqqxo5P13H$`-R +a9vjgMgw-Tb@}<7#YF*IQQc`c}RO0&D>5D12Hpjt72)L=OzdGz2rmu|ye5IK+A)ns{#gF6fBG`H-ZyP +VxK&<}K<#G*nBbz($a_5;;|NLG2A6qD{_GHQiYnqV}UqX1jA-TrRSq!y+wP{1;1Yr@|OgeD0X&TPjVp +T)Ehr6F4@eVT@Qm;q4zMxl58+qHq(_Sgwbh}pFxQF7k(jUv@8+p%GDGM%crYky2c`!TaD~YSB77~?r^ +xGVDldsP6JHPIMgk2T)P!nLMC>C6~b=?~2wu$Q8!c`X#u`a0ELo|PyL>tnPhGe?PbPq&#sBcAmgk6nk +i(?ZW;k`x2*VFuZ-udBBU6QoG9UXsvilJ+j3*Z +VbkM)lt$j@8y>kSH@2naiD#U1>uk+fSigld*7OKk-7cBpR9sh^lNVc?IJh-iI%-E%MvQ@6aWAK2mmD%m +`=90h-L!@001Kq0015U003}la4%nWWo~3|axY|Qb98KJVlQoBa%*LBb1rasg;#BF+cpsXu3y0>C}gdU +khUvU7%%j;QgHil3!CubioZ$4f8_W9=Hr)yjUTyk`Dlw47zf! +hLj;IT|RawP?FB5SH1n9^j;OC?V#DwYjhGBRfiEhPqu?PFb01BP6 +Ocg2!qq2!w6PEitY_P_$(D(f@r)-h>RW%UDFfM3P3Fx#4G&!I8A3iMnQkKm}WGe_b4lq5w#tEwo-l-# +CZ4W??vOnR3j;4xBgT~r(vX*H7BBq8wO3nC=2(_CmnMaf38dv-=3ED$0c0e*mIqXappm1aq_Aa76a(3 +_Wkt0nvqxGr=!%iN|H?|^55{o8-E{TO +(&$H>-#w+n=#o=$Oarww&NJ`W6ZY$5H!k$yzgM24Pc*j*}VhAKIB~&F&%*HPV9o;4`918z5hPDE*O%d +uK{LE43esk0bVhLi#`ORB8J$Q8-Tg>0R7MT7-KgC#7MJhF~)d+yvORtHX)+osKU=I#1M_5NVzcb5eva +~zqK`IvS>s(`Qoxkv40w_Y+in8*&)EzUXTwdbj?b>;K0I*kq=4%2^J-nle?2&JK;SXF>xYw0r&wWn#w +@HTjoeFlG9-nsX=_9i*&-=BcdHyM6P)w$~6tCEpc@0XtePp<`WyGR)>)+rVYF5%iUHwrA{>ZUutpJ +&Bl#wpDMNcgu3bC9|p5-?TikL&|hq#s#DRpSvEbxRwHya9>nqgtCu8qp=k;%aRUPr3n|_WWBwh!u +hT!TjJVeNzn{H)&H?pUoNc%mvsVNo>bVC>sFy%*FEM#OizYGGT&vkCU)+Pw +c*YvA|;B(JhM9(nC?1XyYI8V4O#VSTY7Z^#ZIQuOI`alXJ6Rq~LISBD$YH^tMFR(l~DIg;_t$H@_L`i +7iE2^mh8W=;yP<=ZiMH*?`-6?hk7_t^H%ew@*-^va#6m-qdpM6T)NnEnTd4Eu#^fdj!A!(W4N->^q|W!ahG`JyvvLI!Gl0TU?w3Z{5PonxjHw3!!@PW8#?*dk7!Uq4Y#qbh$ +}oCosTLkWXb|rQSHQb4w{N4YgLS&a;W(iB;3=K0?-AWjUf)H8pkWcPC>n%tcnzaSlz^cK{XRSY_49|D +0xwpxziuE3dnE}9RkgpGBrMFtK(d>UGgsEyxqalu7Myli+1T*&9Hy62u)RV0B9QIo9c&<8WEwJM&T1y +`l1d=cqN`r+@@WE%g04M-2~6kh2o6(uE14U0COE*fP;h6=p(nFr=3m^Pk2g-6&y|!9O&xO`AYa234CL +-8ZPa#GPTar%dSX3@??v8_u5htU$!bGp_6N%i+zg|dG|)yr3!Ha41_(yc7KdFmj0ZcXWmzcDRwU;PZL +r2;J2+0iduSu@&Qlt^55abY9)rt2#la?+eBe|(!5;rfia?LB{Y+{TUn>r=2&{m6B8x6;PxUDc|sVy_cjY}rqe6T7lPQ_GRWic4-tu4FawcRv90n=|CD`G0Js&59*=@qnP$c1Zm?`FM*odZHnujlf~V!;uF5X2njm^Q2qxP*li=iv1+VX#tFj +1=%ZuhVsaWv5To!54WMwgiPREP|FAkng509tg=3^5iMH)PPb$D`g@b#OMS4YSA5ZY~QZf+jT7de}=qM +^<~c@Z=K{v~S?0G9+8WhKX2B(v+}lGVZM>FavDv2nayEXt~>gCx&`xzS;sz{6-~ygdwd#yj|*$&gT(j +JE^!alxvL2FwRz#9-s1D(68QUo4wt#o{=~<_I@f78#I)#d+4SD#`1O4e&T8I`&66ybJ?5;g0mB&I +#1~o4WRJhsWg&mh%galkv;4DS8yg(dSb}+$)lHtAPe0Ds0*NvN@5H+Rn=PB57og-GbG_pkW^y`d##zC)G6olHIZbX11tUBVI2XJs0R%C9@_zzl*Qg-7vUhO-#?k#K!_7*&g55vny +E2AuiC9C)@G&)1%{qSBLS@bYlZ&&8lEePJayTU(mBCj*DatbRPgAW_eQAYV}`cbq#H&RaI6|n<|6djR +1aN0r!E3KP|J0rJ4=0I+*j`xWa9~Ps`#W&t}a^$W6oMizaAF7$QjnV8+`D*uh}8jOA$!JPV6~`(P#@F +Oz)i8~II9u~~UpWdC64_nd;Oka$yE7v*iC$CQ*Wmh*E~d51YDZjwApS5r;{P4Xo}vSqw0LEQ=#%X64c +u>bmiZ%w3YnJ$5~;~4fG?3TUYG?c@J!ytV9-8b>U;qzDV^ziAcX9tJhSPx$xO`lJXj;7BfcZ6p+%(UR +rCs@|7in!@f3P7(B_6l$>)f*0E7&|0s6%wiyyI>V^fgsR0__kcIi)EhQ1-BUpiE~(=tE9MODKv*Q1;G +%M#f%}t246n;3a4LlsRB?KfVsQ9Vz5KI(MJ?O$N&QIi-W@{H8^-1@5B>$Q!(17fP56bF9QDa{{1iEz- +|ry^z{g^{p86`{QO}0;@L4YixkC2f{BpGhp>(CU*pm1JZVrOhQp1({t1tla}Wo2*yf2eS*_^xa{uT%U^gO|0i>f>3y=0tExc%qCtv-Ct;x#-&Nlc +zUkLq|>|m^#(|6599HChCujJp^tdZ^I5{c$|ox1v~_gw9&P)s6rcf{8FFJ9;|Yt}>q +^VxX0fSIw#P)q#p^>N?vUL8ID_jtJo{p>`AZ1 +Dh45QAfJSJ5r0gP)#@2+C`yBWp5>JHYoLwj#e2?_M?QmD|7noDast63q&?}ZZy>>jkG`+fdO?j)P?m6K}8+LU^pa`6zp_`;cuO%vz!xMK72hD8KmV72AGi*d@%mzNR9RBV@m@wgqNum&)}N2o +OrAv=&Xj2?mH&gUYzvnG-|>m#Y9fIxEcxkygdL~^n=lEzUeko@v{f(iOEQ~iRg3V>R20Xjr*#gY`jI-;n1>Jx{Fx~D(62O}8@ikSXqZpq1-TXN#tl0q)Ep_5bu{k#r-S +|&NF-pX%O%R@eAMdV;Lz(a7yIRKq@r`u;V@CACtgWu@0v>WQShH6jn)sl-!TK75_10KLLH^=~wf~adOr1PP`-CVcz8?Zg9_F)5S5+uqMG?j|}RBrHx_ +*Yr^sB+=X4R429W%wH@sBuyhwJ!-5$|_5uSj;$$0u-lhJU7=KNycQE)M__M`)eT)09TylSER`BZr#1x +N&-vL>F2UGYR?rP32deLuLaFyIJI*?~qC77&ugR(tD=QrJ?z`xK}v<`q7@g#&9!vTL@mDj8YgwZX|`* +UDkFs-k_KFXRax~*x-GOsNNJIGCF{@j#VYQ32Nn2%s?NuUT0M+3{Lf$1bE-xWq56az_`qNln7WsoI!u +ftac20^cGP_SFM3M92S^I{A2=fwPTV!wrj&}%>>o0ZEvEy4zng=R@{7t{+j1Fp=GSlEQ20K-x8(N&MYaIcG6Bly)ue5`UX;57VypHJQ +(2?mpV}`k%tNb~^2P+;YZy4aap&@wT~ePwlonRpCs#r*=KwHl@yaIPcT=7Yh8 +ly}EoIC8OcJF}UZJKe+`pBS%9@3HNc?YqA*Z(qz?nRQ&Z>w4{5Jk^3?I)FQT;hk*nMMybPO^+y1>*US +r7gLjD=IH1=oW7X8oF1MW%R?YCBqF|lb9nId)iV=>_Ojb<^bY?$0(p6Ge9SL_%X1t)!iUcfUQCbopSN +6q;pvb2qrWAie{7HbFh2W2d-^bHfuaxKa94gOd@z*8zz{tV6wHB-_sDyrT~bH<@bW0rd~j=S~|NW +Dm*+TIA^dj%o>=m-V4+Mj_c)l1fvY;jW%bLC(_qc5?df0g#j|oI2;TtJ>^k70#hk?6xd6x15jSD%Vc& +Z^^=J6mtJ)YfXbg=kFU+gJ@RS*@hGY~&ZFx>%$}f +tIcs7k;mgI2_Ur@#Ng820jWT&axE;wmAk(C=?vSMb+k>KK7!Lod+#!W3@Q!yE)pJ-ky;+kzylW8e{v&@|!#*y +vw-`n#x^U}^zIwlblmEbqgHh!Kn9fzu5H4-k@{+>w1eG}WEW1OVM$9t}_L21cQA0VpZ77kwL5zH_M|9 +f>Q*8Sw+Zuy<`)Int(Uj_tlC5>{(37U<~^2pIRMUe|&W!}uczkN@an70=o*4hLg&Kv&VAJy*j8pg2e# +so#JYx(c%svW~+I*c|@MUNV1$on|?#l*VYE`CkVSs|idSpxzTVtrFu>Fl@kry)t53Q|Yu%I73eMrXr +4A^lov$LPHrC2rEC4|s_CE&pEFuXUb~>7=OoT7*iE!ke^Qf)bEOgt8j0`Ee{l#KD%gdUXDv9oH>Ie^* +C|Av`sm|+5n5&b?AapRl?%AR80H{;t_#H_P)S2E;Tfq-ktf1)t@hHcDUk~UQ4s@*xbBL$`l3zp-^qga +)Vqzn4BMFGOAsS9pgw@k#Ft_)Xz>MFO5Rdb4u7bH&u!8bL5j+nua-K)GxYw@^2Bx!xta=WtQ|omGJ*7 +yqi2fee3sAPAa0n(b5mUvH@aAU@D5bs;R^o7}ZM@w>ijzqA3Xmv%ng}K#(C*MW%tg;tlYs8Y#D4Z@M|wF(J5eZi^)Vb)79@agpmgqJE%E6Kf00Y?D%fSzAoqK0r)KY +lP&Kjqn4cmI2K&Z9oFuhZs63gfhJXA`H1TxK%;@)OyWb1fxL?K)*WdG>Lmn9&Kmf`1<<=-+iI~;(@NEw-n6%=ag|uxCm)r_BwVP0rpOITRf15+GdIH%y3yy!q%>YGw$)@>)WKdtZf +N!Y|3L(mqDR`K1*16jHSjHhYtkq18po0%TVLLW^iU_CB?6hgYpCVDutuy!!D}%vOkY%`0xRPI6i#9;j +hY6`v;-X9XaRnvP6v^?8l16{P2Oq1#~-uZm4tDb#_@Wd_$nctFZz#1x^~ux1x_Rp%QTV5b5a90X7jY& +AEMt5v7!jn3fog00MG$WqW*)Ybd`iX}IzNi1z?}Isg};W`o|gqIk?miE#Ydw#A}~X`;IG@lgrZb&g4Ae?O(Ku +H;banAetLb@XWtV@n5cr<4erJ!1n2Z_XksTg;ly2Fh4-`9$p;L9xdT;6T6;lSQ=8q!_pvU`2}P0L%cJ +~1cv7ev&H-|kH7Opg!>>_hLIWNK5uWEmo_{eIxGd}TFq5i1bd##=>CG5hE+QdUmBci(Zd=RspC1a|na +z-q&lT35^S@x$_{%-#Wv;SN!n1l>pg2pPmsKRQ#DCa7Iy^Z1rZv0_doXxOx=!rFOI=^+?DWXE*Ko8lM +PMgJL7N@DhL^qWe$@c4SlR5FOJKSj<%by_B;=XtQg?7zjyMo2rlv6ocveL>lE?lS4o;=Ds7Y)zXW>rsu-U_%Rm? +eGZ(EL53=T(bx;;$6YKyCMu>R|kmrEwps9y!(&;9Z)O!%nPe;B-U0Qlc^6OAUT224Pl(6&yNdzm}#1V +YzAn7+br10Vgm*=vet(jO3GV+*9OTcnkTc@kI5!sWmE%rhC&F7x2?O6+}%*50okGxig)stAc#F35U*! +Ini%cR1UE1KPR(d?x#DeN1BlUzQuw?~&by5- +6rf-Z~|gCta%L{9pbfW7#s(VAljLyJ7)v$(nI@=jz#J5SFFD-_f}_2ZZY(=jn;e5$Z9v!u`c#Ajy7w2 +o~);I_-7ZkXD`EWnmG)c6wMe-P!0f})BO!8*Zig}yU-iH3{dSsefWDB>;+nc2*gb9?F8Ej-oAYs)K?h +HuCx@Ur>)QFCV)hy#H0`Os4Nke$%5;*OejlK+6xom4@e^E+9brMZM9cXS*4->Dtfk+>g#zyd +BN6#bBQt}=L8tjIZrN*BF7RL`sX@WOLL0aI`Ue*R;kAK9Q(6|mZ6%SRaFjApC*Gp*6DGnuZ1W;&&LS< ++b8@(FH^5JEZJJ_y3HT3LWF>eICJ&*QN4-rT9%*GVDSFUg6!Xv=)#mo4_+;Z#yz1A;w~wX!J38_@j3U +|Cs^e|70%-7B*;Aw1k0M=#ViXmA1tW?#mb{jJnsvVc#ZhLK%)loSBPOF8HrJ((J?N&Mqsa@pCMbS)1YFE@TTARlRo_SUft +t!Z1gdkE)2*p&cF^NZqvHt=omsIa=V@o1IcLUO`WkxHmb>6x~Lhwi9JaIMxraAwWPIc#OLtbJaNzzoNX;LPOP-VQDV9rwsr`sRLoW#MsN0?M< ++C|?fqsNCrED4&(7I6ZOP@c;EO$rOfrrCrB0I(Pbig!^3;*sbbb67l+6lV4u&pCcbKjG2C-)32ft5jj +1`281BwXbR=p*0NlYB(yF$GqnpufG{LZ8U&r@~#-T~fl+VI=Z4mkX3TR|JF1{VVxFFezff#-jER0s6G +KU0bZ-&8SaHgPS&HmGO{-*L_=oBAz^5y8?6Vu&gWy`^sUc6!tCyhlD+Cj!yt;G{J*o%D(`K!54r~AL88&_we>Z)1tV%-Qk1X{N8AqB?>cM)f +YcqhALTefh#rsbpx%Tkc^sO9(8*1v7N!T@kfMVBCB8w;pJv+^^o&ssi1kzqHOjpA=@k6pq5<%u?)7Mi +#`ta#HjW#c`jtRS}a6!;u?wI=Pe3|8`{?j*_7?R!SW>P^R#@3I`wErGZqLK!v?8Qx1l?9zOavI0)4o~ +*q#^3M1IG~koEwZQfN7S`{hOp@7s!Ikjx6IJwfDX=a!TP%xT-DklzAl2%;<(OBphZjz7Ry#a7|SB)+- +()w=ih&PCaTDZ_9c?W!n|HT#dJ%2SYVN!{}KN~&K~?G0gEip^U5?(C$?E5MLtC=k0F4_G|^$;3lMQ8B +U)RHL@ME`%9mXjDH66)&?Q^65ZvpoflaELP6TnhXe0%Nhnni5c@)MXf2(vkA&Db7O9-h5p$)F`r1P6eAcllW~Ht^5jo>4ARS(6F-g+>v51Bd1g)qJtW6iSN!Ntx65-h9I`Zu+#P{vb_VtiC~)VyGJM6P>Qe^h>;J(J%2Y +(G@oUs9^#TLw_<=K~jI)C4yR)aG|XrQWt-*^L9s5VT5jKGDZ_i742waX_y^txSC72ITeT6Xz?%3bU~t +fDylZqITWd`@-33wc#G=~+o1Ecap{1_S|y>{h}Pw@nlVw1D{9yAC-tjErnX+}`w)WB?~_z0b7Q6&Z%@ +uQ`I)%m-F^&Yzud90-d>vYvn{cG?_qGJjuTgourY}bE_vCAOKfs?nZjEktNt?Vjat836<&UEKL{2HFCVq6|oL{e#IVmryAApoyiZ{~SJ=FVPsCU%R+CD4AuC*IFV +;`)^lU8wQXNlZ{lv})xW|Gr|v4};Rz7C#z^@k1-k7;PIJ&dYgE3o7p{F;$F4P67T?nnwlowWPvLM#xv +skP+krMp5kO?lQkZt4t~!v43sP2}QEhug!luk+G#BK7n#`&o14zv +1)yqSzGJC*Z`Z%6)nt +5fkmTa_Y40fSq8(UoyN>GgD-=GSMAAi|%vF#2^>nN^C6mMHQ<+lOIC)r++imeyec+$h|-mX)g~EM{dhf&q{E-H +O$X?({s9l;uPimqE7DYQhxcY&c=CV@MSkmF1o3CrzQp3N>V?`YR-XdI{?_+fq?BX}{))oAag1ZM@L&{ +sY_E7iNkWO2XZ)ZK+=hKv|4WxsYPL1SrR94_XR#&@SbG9=9kx_E(7&qS}abeTRnK_4 +&M{?4_VbFtjOYaG0i=KeMkRpsA^c{NviSxbb7fO+Msb+B*BOB^(7 +w_KdHsN8%Zvcq$45j`<@u?l0xr4p+=~v~ZtmDEDW|zs_V3Lci*A#w-h96j}4zf57lhUBVo!kKc9Eq6f +k5!-Z~kIJriesYbw7`JK76`enC6rXS&cq-_AH@(|&7OSyq&ZN}DoMbFjKq-H6WO;0fOLhbUQNXas0+z +CrCxW>|0_imSk`qp8;&qC861EEkYK%7UsAIUeb`r12taZr#NoJOF+s_TR^m+yt;6Y+}=v;QSvPX*eD1#WofYy}IiK~OqXclT7 +W%=BKYddXY4wT(3uJ5exB#QPz!(uD3T2TatSHSzf!dIs!Ebo{*)X(shk6VtB2CoV=Y83YEfO!J6 +=91JkNP9c1MWzKCXM=;H9YglO*s--@#&oP$K2O`cX;PNjY*F5iW=ykyu_|x3DkR28X-%C^qQ7)yDN|IR5Ai<@!&ZR_>Ti +9dfX32}LLBq@R*%Ocgd$JUrWGpW%_;MJ5^v~)3=M3#TY~s3uKk}ohl!PP)o3Fib;|2Am%J7YPk%PQi6 +{Dea*1F$S%{P66TKsO{JxdDtJ5p(=bjBOlU(*+zviD4bMq6-Pf^nI&d*WO+s+Ru(%a6DOw!wxADX0Ac +2tu4MaEBtENjXRNhW-0Ggf0*e^a5JC;oLlT_G)qwl5gDgIh|xqsP`l(TpP6GLGG5#f{OZ*EX$0d>u2b +LZ=mCMnyEJd8f|-#Ws#DML6NtcXbYw7$<2ORS$8BDS24^_ +xGXMw$E1*(B?(z*f#Oypi`mQVEl&em=|*4Z%G&CoVFypTfV2{m1Q;`@)T +tRX_IX&O>~95z(g{GHwT!%OP}!}WA**^-J8olNV653?VpjXd6xv-;S6I|fsh3z_nSTrqG|<`@z^huC- +va1N0^&Tzi?_6D;qF*k>`Da=!CE*fJwrr*M+rCU?#UBk_mSK{yh~A8$hGxRCPPJ@M}RYRb9}q8I+9R0 +vTUZE%xbcQs4^KwMafI;YW-Dzk=Kj~pw`e>T1xG6QCC8s@Phtw2rHFC{82iK=~hv7>t&?E{{m1; +0|XQR000O8B@~!Wj@^V3s0#o94k`cuAOHXWaA|NaUv_0~WN&gWWNCABY-wUIa%FRGb#h~6b1rasty+7 +J+qe<`-=Bhwaj<;#s+&t+FuHA%G${h4$swB*XbnT5E!yU;EC~|5yUyXhduN6Zk$QN&cQt~n9y7z?Jbx +rLW*6UIuyv8jd^=|cwYm5+J{gTiWA?fzkCoi+6pLO@*$uHtL>Ng1s#cdCHZ9XK*1Z#$mi%RdRJu1>9{bA@(9yDC=4X_Ws@LHy^Iw#OgsYo~P{f# +}A)By?gcL^T$uu_z>tuo2uBeB-tF)p%O{LS&Ox@ce1coS+U*1%8&L#%d_w+1ElAQ0sK-1A^M2tZ7p~wY;-xD%{~Sj +e{+KK!nbDR9&WQ8S2_AL55OtA&fHF~r~RFXKQI4RQspi_t>yO(F9rv|Tiv;TX}RGIP41ca!PV391iZ^ +(dG#@W9-rv70K20y|n0$U3PN&xA37m8~7++2PrRgfi~1p6t|gCCC!Letk}?yRwR>oqn5{83COM-_^N|IcQ&enPf7c@ca~!vm>~9!XVRo +TuyD5HRmvd5SDDze`9))YJrs@9SQxz6GVXv`|0$qS_|q|!h?Je3Fy+f0L&_YcmalsaVGM{lb*2%0HOo +qD74ID=xuK@X^0kj#)pvLQeYm>=FbN&>h!Hbs(SR6-x$lP69T$RO0n7@99`>Z +36UnS(P6MKCTg37LdETiwaxfYad$?{(;)uw2|5flcXwKxRtr2g;!dJ1<741p2els{Or%jojSPkqPEtd ++yt;Sn*6}l3zYu_v%(pi;hCv(@7Ft-fd@kOhHPtwsHgW_GllGTFYr1m%P!a+-BOnJ= +wt;u9FFw(9M^NDo=3((0!mM_+_5vx4g~4EE&;;IJlwv64 +i;OA;8FP<+VQLfE#w_sF4yL@5&l*NyT#y*bpXN!1QWHeq0gfC`Wiv2L)9Agn{a80*WV)p*7LwP6v##( +%h+)5->m7*;P2|&*7@{7QBn9HSgp>pemD7+g28AIlqsv+2Sii#c;ll5Uvr`9&Kk%zXdyTU& +|ITu^L2WH(xA5@bO27!iz-``>;6|3G%23D{RIVr1#92u0`yaccrY7mFDFzlr-A?!wD-Q{RvJ2S-C9SB +AeF6ia-9p|s!81^9N8;mxG)ru37A!bgXwvtl*V<2c(t_K@kx)>o)ua_0O~dRJ7U1NLs2;d%M&DrdNu$ +)qDxhz1qfSM%4P5tmI|35n%?BJsvtpJ7G-of?T{U%fF@&!JFh(@W8WG53r4%3cPz9# +>y0M}3L=)x-c{^EyI;D|2Mt974O8I{))k4rNF1W;FKq*opoQx0wy1Q+#{ZXHtJ>ch9FzvZV1*6y;Bo` +m&ak)rk%I{$q!IBBOMiU2IwDAngU|n!WeY)vw`U+}=UjAo{7sgGt?O`2dlq7)E!U1loo!dc==gXAbGm +b>siA9Zo`%5H>|td9xvtoA_FD#5k)dn^jsgGucw}iI>U^RAqk(YF2+P9477#AtHMg~o8e)Y#76(`iA_ +LS%=J$7S{EpWIjXez!ACt(*v<>Psguv0lIq8Qd@u1J@RE!h2Y-*zhQ42HgWoRO_`2&uNQ_~R1Nc<)EJ +p^4R0H6mP7A;rJm%b&5Q0D$r2QXH!rPqtGNEZ5zhP`;c#NG*=0)TQil{^h0a5PmY5b-)4E5-Ux)EKmH +XHZqg6VR*SUC5=s^y~@}bc)2@A@Q54Dtd~F6HB{EZP2RUhFtm#DNe=eu#G06&uJD +!sM!`iVfH?`_eFL4G`S}*4aR(a7;U3E}oyXE<{MC`VblK#t|&#q!B8_=!V5CDCm)cXBM?H;JxEh{D(jzR8hVI4+`pPz^p_q8H@4By%*ozeRSA$V|R-bIC@ +pGPA%)iG#mcgSAEf1E*EuZnLXPqctcuGqz2yANqe3FtZ-bqr^|co=5E#W_rJ1Q*f8Oa=*b(R1Wdfw@}w-(^cFlqGfJ~p6d`ncRbDi4Y6p?dcW-kzY@?N +#@UL?FPOpKa`O#EHQyg9W`#tl<5^FzR{|f)`IL7Gi{;$J*?$w;*U@A`ccT)`;%C+miRV!(m-%>fM>Au +YS7w@(vmIeh9#!j&;5{iYEWjOBS5YmcEz>T?1}2Smzv!sJk5 +jPfPtE82X~C+Aet%3{(9qXq@xSQyGtQkpV@eEJLWe9 +~4kw^=(wv(-F_RI5>qBdEWZ}-%%@=#LgJF(~dp|7tHJNR>t-9U4^DzW(mcf!dKkDG$6~%2$AIjCtb~F +9)Pjm2VzT+eOYiYcm>>`y;{xH`pQPQ0BHstP8hBKqnMdrL)5CUJfUdQ$*t$i9}cCaVy0uwihMc)B(|3 +iybyatgPM&SPdP)h>@6aWAK2mmD%m`+dL&l9>60090#0015U003}la4%nWWo~3|axY|Qb98KJVlQ)Ja +%pgMb1rastvhRz+cuKl^($a$r%1&T<;NzMn~I#BB;#6LIkw9)&U(-GsVEYX=%Gk10ggtgtNZQO-2g~{ +q%`AfXqPRLK%>#`ZZt=1`puL@d7NaMb5_aq^m}|V7!5}3=e#(S$!05=|MQqVd-C-86#n^^{g!0mfn9} +Pk|Ka%uabyog2zneOl~=Qdyv~aV^{fF?!%I^mwA=Np-kWz{NN=EVZBV2$*Ph$+-*wEcRZ5_>xy&sYVq +^s>#NH^-bof_G5h(=>+5%mpWa`;d3S{mVccL{<~x?;EZG%#DcMg4$;IN$K;NeMW&`^%x4AICN^X7$Sy +qv(?+#+1UC6DBiXNp)8_TNeIGD*3fS8|b8WyFPzC8-hd?=CN|@#upAQdQ41at +v_#qU6?^fx7!Te0jhgF%Ki)hPtp_uNHsLTZj!xTt+9*SLX`*g^5VV119kiXfBy%?|>)FK9IB=X>(gMW +qtR+KpqTIA(L8Eq3}OH~3kAHM$%Ug9q2!!rRt<)MI|`y_k*Y&d%{0O*gVQ>GxV4->Rxd``PDAn`Xsg&p(wZJFGH2yD1;9$yki0g+eymZvPmf9JzcEVA4Dh +L=NDB^MFydp=x;so=OJ_QUK5*qOcbti~RgH8UiB0Xz>t5t70Op%^jPOmxGNwb9^2uqaGZ&}_ItVy%-> +fOaJrXZu8M;Ta48*#+5077bo5-d$ZUUoBo=F5g{(OqHC}36Szv-v5jq1>Y0|dH>_bC)587K7ZqXWS`{ +c;G6M}fAPkHtDoO3-d-=SFMoae>f)LJ0EVL@77Fk*BF*L?zsuz=1VvbS=cF=?0#8uw=~>KS4k~JT%l% +y*SExMeDvQSFwVExLYUXmOM~v%Na1S^E#6Z0fAJzY#>k&m*N&#aKW*|Var0)e@0|C~qQV9bm~&44fZ@0^Y5``rcaeQ6%_XxGP +}LtPf;mr0hOCB@}oSytKnCAvzm^5BH>Vvg%u%)oVmW*M~Z^^H5ISsw;9H|`(@F&O9EyF- +Bh5fX&Zb6-VizFJWb=e``Vg;e$e?TCQE5OpJe1()cXI9nyi!i>FrbG7&ov~~#y)1W!?a}l89B)3`QBD +wR%$a&}am+&_9P^bC=(9;)yS+?Q3$lQiy5@zHo0WaT2*W!H${^^Zd1DA?#=q%I^K+_JNea&Xe8L4@RS +Z3%T?JZ@}qiqga$aeSaZUN?vEg?nLhbcI#EOh;Wl3F`3&&g>COX9#%=!Y1Z``)HXVDH4}F|BN&Pkyc_ +!_6){2m1ng46(3-e4K$~XKI_6EohtBXSDF5q3aBC70}oSoS_QGkoY<<^V|uJ?wU2e77*)nIgk4Y*-l=y +n|h@#%{$>p5r%3S1A^MYqKQ!t8I7u~@YA=d?PDUAJRV-ms9Bd^66ii`X=SC?gpS>)mk{pfKtDkTgc70 +)0}^1YW~lB#4K(PC#9q8$?$3n68TT*j=EyQK;ePN~7T<11?!S8P2x6t5BcM_%59B^D9LZTwfAoS@6iI +FD6=@+!%yJCrtXNFwOK(fI%h-Jtt&O)r8J{84a4AW%KumO!FX9(+$*2~Tl@mhw*WujR;VzNK!cl;(SI +;NyU2vC#_J9!A}LQNxJ6$Kb1kw3TBl$Ze9q-+v@oobSakCLX~`zjcE(5DYgUX)NHXO44|#{dbSq1Dh| +GDxSCYVC&0I2m$p@!65Al*g~b5BB2PEVqm}7)C7&UJEexV-zL%4$b`&uka`$`(Tq`I71xeg1wccy1lp +u3RoOrMuE7x&YMp?+F+uNyCKG|g7IoN-+b2rdO?B&*H?Gs*tk8r23$~*cA-jXh2u_Ug1eelPGM&&+po +A-9L92#WCCYeV5`kqNcD)U=8;bV+9+n}{_H|yyo08MM80P6oR#Y-*WFJdypwsy|+e%rS&u07mK1i}@m +F|L=&;D;03MvT9&{^k|nCVT-Mk&uWa@!;Q2uJ{=?FKUB-xG)v~L*fu*D(f*KyYOz=S@hed&suh*y}zSVpFaDK(}eT=6=qYYIZoy}en9l+x0d^1-h;&0iq4 +P}4gyCC8!O_`W7|;|MnWVQ*gyjit?U7p7P-qi_bjPdi5I<#7h{aK;g^3zg77JW{eai8D{?%!US+o$I&&T)ene60l;N7 +xs{LlM8?-b}R!nLYQ@ +{B;PO9*O&DO}sM^E)9zlqRYg;Y~lBzodz^o3=cIL+pBZm8Qq1JV5RppNBq_HAr;gTB8|mVsI=aut=wa ++#)Pdl9hf^G>lbhla^~f(fK2YpiEMm_!8X%CF%N%=H+ujxeU +=b{T8N`n$dMEo=rsmtQ?y>%iWIBBl3Z2Y>&Ot{KQj3(k3cHK*CfB2>?vo!+c88tm$1wj3-}9V{83-A; +=U1*M8|2n02WAxQytn@wB*OfV4|#f0#uNW77j!<@HY_4)&1i`$%X +a#&`I@PILrwV7_-y*5c6X!HDP^sI!p@@CqS)-nGqS07V18=tVue1S@!)ui +BYZQmcf0laXEfg;9i3Nd;^{RJjF_;R6Pi{l?0!*49C`$h+CmJpsXm4im~y!gsUo9c2>9a$WD((*O|Nwm#F-;?did2fP#50G~GT}b +eQ5DS?8Cf|Kc;hFA2^3~W0Lm*h2`hDG9{`a*y1&6VI-7gWqc3n|&SNT0DmT@RU#F^H>!2T8uQ45_GSL +(e!wisl9)e|x9q&g1-C?vct)_En>F-$94bC2YdW^~So9RYffm4&FyUW-ms&}?Zmy2Wvn8YitlYWCD^- +MwU;_su)+Oi=L`41#{x8QklHhy&JR%l|){5$9TnSivecFDK6lp>Xala{4Nnv_zKJs3BU` ++mwX4(XNK1Fd<`~_O2caRYoG%I$?ad6z>s^Xxmv>;fq<9Cr~Wxof|q7p%vTjK?gCjvu{)hE+Kf{H`~z +6#J&ajLHJ~PqP2t{=50i4d3T&fbNLC@S%B6%EC42*PhJ9i@_5kB=AADu9ZdcLtwvK=TRrr(-$kOUPJN +84Db81c^tUh#FvTLkdjhfw#&`+PX@?PB}MS;8~koW^-N*yvDHKKUonMsmWU5Wj3q}9;gbU{48ehR1PN +VEKpdb!W7b9EDW1$Zu(#f`sc!a3~OaHBch?Q4Z?N2Y&^{5Zc>1ycLf*$LSk2(tB{>J7S>_>rJ^jc)v#rRt{a}(-D`G7zed=i;X{MmPG +;GGWKyuE!^|<|#C +dWG4s*=W$V#HIG_yt9V?R!%^5~r56>C~y?gpvWI3EOiI+%b@cg;7+MSS?s{9`(8hPcaTW-@mHxJ4!YaZx^wXTh&3Qq?MbOk3=gld;ds$I_6np%eN#_!m5T)!Fou)w12+|R^ +0G9MeJAlBa%@}RuCFSOSOS-3C6BO0iaq1_IIle+Bu@r3mX5z(b3NOb)VbH`&5 +3yHa9vl9(RaC6MMX#(Rt@k)m*NZBM`x+%&WqGO5K#`r`w9DAa?qpdQx?YyF@3&wzZfH7zIIXO>V=#C- +nLA!yYrDE3jIol5Cy(p0Oxsq!ekieVM*cA*0^dQK4#?$X=;;c6U_!nlpE*Mgd1#-+TFuc6DVGsmpKtC +*3!v0-WA+{@&PiRrhD2ZTwn2rv3GJ-1=Q_y5h|0PO`gBYln0+#P9LjAG6PvzgE;mL(ulvEmEA+6?*lz +LbvVJzFu>kJnE6Mb4x%pBz=cUAvIy!@Ft9EVeO{!7Cayp4Xe9i`}&d}*ou6b=_7X8{U-Ec|mTetYRXCUx%&zbJsF>q(ChES)RsiTNi@6Q +Rh@BTUk96F4q{&t|kcYkel!}bcW8U6g3JGx1fn^K#PXijK~D{T;Y#FbCGosGx( +PR≻!$nii0_X+_4bP_gCkmYWY|A$BPt@i0J~sWGI{X|h_H1?KffZ$VjqV1^&aK;YkszjXJL`VQ4^0 +U8JRTqPrcTQ66$JIzWX_O@E3NyIMRF4#J!9>yk|#`M;N(e^hZN0VB+-48!wsZV>Y7RB=-EW@1(@LZkg +x@*+!pSpuGL~Tp3&D%L;@4qPLb0IPxShKUSQVJ5@1Im0mGghst#+3DdTOIBLrG2AX*L5(_-8Fi%s+YqQmV#721i~?R;;1uf-P6{GJN8%7=TaqrfDj7D%-qJclwYgdwauC9gjc_ +V*&pY2e`wj=MoK;!LOTU^@2AP**9IJJ6t{NPD&8c+JNqQjvts;=b>^{-`uezD648Loi46uvFpVc_iqB=m3LGeT<6cr`PawkEt6@{ +XbAk0|XQR000O8B@~!WZl!l8tFiz90BQjM8vpqr05+q%M3uHr7f(r|~L`c92aotkIFauZ#B%Lf~GHkW2-mCp;uUu-cUhOT +nm0v2j%W5_#RzSrlRHIGttdnXiF)R==-{(0qy9sFT?fb|3dH;FQ%$zyrIlrFsoaa2xbDndy`mV +iO_)}Ge+0SVIoXr3JF9Cl!lU~VTUe0*us{MwA?_9Oif8U0}^$ic)+i>@f3-7u6{`()`3xBw_utB)L@V +@&CEAI3Z{`i44Yj4QT&MeZ)c=G(6H=KU*s>bBsohJ`8{u$meOIzb5`hLCfJ^Gd#UxfDuU4Ll&h{6^&K +0@Ok)!|>&->=d4lKbxQV|o9m?QR#tEHqe{SAO*VUCFpE#%RbgWHL+#eEeFA`_=XEu+c;fD;PF1jD<1K +^yHff8z>S>zcBzloy`;wVN>tai~d`0GBC4gLk!Gs+~3o{-3G>)!7z_~#xMo{!x-!zyke}nuwVZe{sw; +SW**)@XxAHreKlVWQ^+u@Z)jL^H-9(7WESgvpALUVFNcGAoi}J;%o{VYJcCwd;yZBR8yYq=+yi0SSLi +dd1m3LSyX7^kUH1S0{%4Mc16tl)-+`O=k9+w4|NDRPZ<*ZF++zj;*x532E@OXFat(-$EF-u=E}L5wtf +An*MOF2yz$5%fCvNfq%pCEJTrI)vpMJr~kO#9NF6?xZ>A9F_4H(osrpw95)dTi-2m^F{Bnmaj)vV91h +AIc#+#ySN;#|hPm?$|kM=;EfKY&qkhJzK1aw1e^kX>wXBver{pu8)`R@Gt&V$XD+e<4&Eat+v3|LS5W +Luwq58hgpTP>cPDBgQ=*@h=64#iUSG)qv5b3IoKO59|%ztHv +%0GmLtYc%jz%|Lh_=#0RU(oq=2%Du#{V%9=OjGrL)1}rt9#`n)YCpWUiF_SCtl-vtt#$o<5hk$s^UJ} +V-7|GQqL!}JUd$DGyzGQ6&#?aclSWzE2IugJ7prW^+jdHI&>^R3g5%#Z#K1o84o7{%cuAX97U%&!2)& +THRS{txx@(#-|&>HcL>BT~KvCvg~_93IaKfrjgszq8=&?g_c2P&e)w~r5>>-0Yk<-1AGC5o3&#T>P6g +_2V*+Yao8gnGvaKE28j+whfQl3cx5RNYv}?&_^sbwnE&t2b~1AjsY?2?=r)G@_;k26ckh@4tSoMmx{~ +)~n{RKp2q1S1J$s{4dk7>~q6-x=Cz|)^&=Nc^suP$DnXq$dz!v{suteSSp3XigXVzQpiO>pO>VMqBP} +b7v5J)_WnvNZf`oYXqDVvN1N-Fd)2&L$R%FQ1dIU#pa+X`t9cbjw!OiA!K&uXMu0?`V5o$A8vWti7`f +A5Iv2Z;5r78d6#$ey?9|e`6U{xRndEeOLux7NWDrj*5SLx``J{@X0yS?2R?-=&D6+W&>*2N89mw#gdD +At_Sj8U9>nI!|N+PtHv6=!V;VwdLRwVYPS>F=R%*8yChqRtD6Gkk7xY7s@F#1~DIO +J@OCpkF=dhQu|b4+tq{F0x+4Y-eFMLz&-diGK2-mN<3m`uPSV}s)h5la)CS1&m!! +3D=nskHUy$=8uvL01F{(KE|*t)=44)d34lB>$m)kUzWkg}B@5h++sD)c&L@e9$^5tg>n4ItBVEA?zyl +hv@E&BymTOtDos}=f-@zfRWdm0Kek_wX(~asK<`UE~``m+`VoEotMo$MW*3v5whewGmK@uIBPO*4iqYuz+^F +Ou379R2TjR=iUqr%j~zh%N>OONQ5k{N{VwNws+0C0q{i0|;p*WH0I5!+6_n%mWS*7w5P(s#V?liX5F$ +lll%K#4`;mIdIxiILg|NF_Tf)d%=)at>hl48M1ZG9yCB(|E1Q28B5v_Jp{rDyO>egqFG*o~MBmpy}Te;*cwq}Xsyi$y?x;h-M75@KbV1Ljev$_NXRDOT@zPv|d>98bu +-GOge{2~zO%0A?iLmne70lwd+`NXUnT;3-Hrd^}<5FoiImFT~%(ddWc;yVSt?R}LbskM_grPl-sSWTN +irp-sj=H028QDJ6e@DWgk +19BIEINaqk+$mpFq$aRvrcj!AeB|kUTztfhe1!g-?)QjX@EEg`C;s8JZL17e+Y(l2Lt`LntJzsp0~IA +y=>4kBuR_3+OVb?1ZJy=Jk+YQQ^%dxw>O6l#f)BLD#NsatiWCQ3^T%Yi>nSY;md1K{nN?xy9dGd?#V|}&wmx`7=&dia@xW| +!FkE=~>!ArSUrX~R&xOgbR9p1(z2pTfu~%EK-J}M-YNWJe1&hVC1B@5t3uq4Z;o1oZjWTDykYDB+;71 +WZWI@6utFWZ%0g0u8Lb8Eg`J47iD^_+7`N6e->q=IxS|{bmReouaSppU;aCt1s@4nXBz +`r(rOB0MhhY>?Ktwg{1m0QA-EsVy)FJC0yJ8KD*q`6UAdv^UQ(i>)YvO-&SiwT#h-Hf%nmUzw;@|h+_i}n!-d?w +Uf@Q(xL`qa7DlJh=rHhnwc5s4)WaHhYrUhFk1Df}h`42h^KynFqnRV#E{i{(`?w2W7H2si=u6y<1*&c=}Fm{d>e$LKv(?vbml!6W?V#os +`Wa<1snG3e1TZlB>hJ&MpCLAy?1yN>Zu+OEUJ5oJ_BCtRcyktzwcBqe!J0Jzw-=>e}#EJqq-gnY8-Mx +g$Qv>6Q3RL&#*cnj%+HmIdo7a0XSbQp7?{d4p-Ol} +@r4RvoCC;zFqBXZs%Mr?~oeJR5AvAqzqfR%vVVQfWAa80&+z9K6pMgQ1!4l5ZaX=qWcV{Mbm`20<$XjY`L=&^&cTG&FB;6+SP~=KwsDc!Bn +g6bair>(76NCc!Mf55(1)B!68zTwDWr=9JHI7M8Hw+~l&bAJnn4L14I6ZU@nX9}kOwcpfM1d7QM7!g>j2G)OJ^!e8y-_~(Ebk0+pdUq@8~l$n +NNm*WrBJF$$NP_ug4LTq4iycU><a@jSQCM%JdPg7SgwSwV?vv;lIZ+5uQp#)*x&44(_D^cZse$P`yTHUc>l73F0iA9% +i1>`?6|&YdfBE|Ou0Gsx3zi-SvS827vkV=ic@~1p2SLREuJ|#Wo>O(sq$Y +CuXLq$3eUjeHtptGE7{W~rb7ag4qMmgbV9N->#6(W4*F;V;}aP(^%2js@yc +o3i*wS5gM#l}8{pL76M6#EIsM;kNb$T^`;jwtDJ6a&%X!%7xia2%bRjB?cB8rZY~ke=|8t~o%?Zt|D% +q#5gBWPoc7u0(O?wXOlB$VK>BNT_)K08_R@T{<<n-uvh&18K7mn_9{U^7T<{d0@93D+X%SOm?L=@Qd5Dbkf@GKVz4{S?qy)WqkK@}U-W +q3N=^TP>^Y7N+=!QjT&Z+D&18TYcn{IVhEP`@H1G6vYKsO4UJ5m#Vj%Pa$gYe%ytrFLSX1NXtiHkvC| +c8$gtDfdttz0aW*W=DErQ6lnv7kc)Mrxpj>u4V$h)lLr1(TcDw(?<>@fVSsPw0&qvyKyl<;=lJjx*TAZ}6hpLnfIY!#> +bM9b^K^Eq>9=NUB(oN92x?iW0|y8QIZ?LC+-Qfq>tP}J-*+gqCfm$C57?D +*Z$eAk5^ywN93grc`GO?x(C8KFpreIQCtP_Nrv*#9Aaf?TBVh+k5|GP?OUJqFSUCJyfMgq-kvdMQ^`y +(vRo{Qju$eZK^`LtrJ)y!j&ARYjllU;o#*FYT#@-U^3;gtTNmCjQa3-c64HjkK69VWlcq64E$L+Z~0m +AVF%H2k;@*S_!3Kx?e}TyghbCM3$0*5^gRMoZKR$8zr#yS^41Z3d~*D&%;{2f(KcAfK(ZF*RN?aT*j^ +X{~7qKg5b%0|29pe%`>3e4gcVUchb&>9NXuM1jV#ykuY&nI27#qMs%x}v+ +esTPranOd`Ml?5BjwM=o)z+1#Yqwq29|F?Soy*gW+q^r!|#eyeG$HML3rm!HEH_b$yNiJOjA~kXiWs? +sSrW?viS3(4TFB!a@VRn&;AYtdIjhs-Xxk)7k9kGq$8CsHXD^bK#Prm8dpNs1LI-1is<$$z_fgU+K^*31XzL7GfLL +lQqy+XyHdV8i)d(ybs&?|(v?F{ +$1j8IR&SG%nZg#>PF&qL5Km`YaHkkmdCT44{dvgT-in^07j(hZgN)^B~~_2Ku}(kTq8YqOj5|e=SXZPVVuNR*adhl6F@LAps&-xvCwnBVmo9Syp7mc)>rmv};^mYCF@Ot`D3k +x8!i`g|W3E$>j419w`vCE3_)JPh$R6&{n{@aO(y9NM*F-tEzGt5jlX6c(am%2buB~S`>LYAGaG>Dc|H +E#)|z|{Orsx25s|%2L%^cv!!Ky +(z1lKtXDCiU0a+}$fNaHOx(?vh=~S%ikR5Mk0IMFsmXG!g$gux1A~9n060~$?We@*0fUn9YK8%4+JI4 +$X6#4i`arnhT24ZA=%H<|pyxsG2-i|zKv^g(COq7uzeL@An@9?|mVR7)NEW}Oik~l%eExcoWb#*mQqB +c;8gM~Pa6vTP#as!*nE19W9))+-r}5WN0Ejxd;O}U>lN#`1u3iL-KSdLbT<|fv2MD!>CYDo-S7TyQJ^oQpDHK(;IEV`TvFxkKiqZhl1m5n5Kn^Ht#M#3oYH&LsFE#$(@Kv?+Bc<64bZp$tNeNDA=q1OVaaaC5i+A3`}OS7cSthB +j6sk>tDLO{Bz*LON6fJuSQ_Cz!mb-F+$LhuijR6j`HOaNG3SU(DbPri{JF0unA-`e*3qy3jC;+S +NCpW^xrEE;&Orc=OC5>NG?j!}f;8O~n#^)2A_Gut+HC_;s2c-7DIsi^Ty29G+LoRazYH*PLSvF4+HAMRCV_lyL6 +8ykPS;R5t$JXU{hbx$>Az|QB3OS9jREHA4H(Ir)O-zE{%}TGrz_;8xzr-vs<|APYSpeQwfo;gbB@}>Z +v01Ln#P_Q8T%23`JKmLEcj7##q-xUd=skrn|OZ2rkp_bau_i4JCBdVk+W2w4^B>vqXTrdh!|#TqhuRL +SMRj_iBWTzD8xm{x@6RV7G>21E%LcaO=>YfCNl$VmLayF5yD(o=uI^nUWn-{r6`I`sTDw>){peAB)ybzuFnI%OFU2 +x_a$37fWpwr!df0}hgKT+`+4Qd6I*V}K(CS52xsuhs)xRKFu>DSRy~cuJ)I-aNK^gpAi +pYf8%+Ea^1|)8p^EJ`$<>R3Ya)1r&y_zUSQS)i2!=O1w=Ixe3Aqz$75>!Js4{$!oOXE=cKk(af|oYo2 +V@IvLZ8;VC>qr04k6&Sx$K?|KkgE)70aJQJ%TUvi_)mR-O5rZc52jEOhWX$cc_6YMIB%wcH5-z1X+OTu6$KMS4Vcj-^F +580uVkVNw3FCGN$G{mxrbG?4VWsVHLCNKruJc>dyT1f$!Q7G1YZmu~EV)i2(Z-@F==#agGu+Y0@vO +iy4Z&laZ&;~q5x4%*t=!Rt6k5>NZGAM?XuT>u`P#?@!ADl+=bil)AW|`OLk-x+}fBOl0zg<<2ub_(7m +-07q1UTj-H;OZmdIZu{^$c!Qd3^z9iT}(k=!vrE*9-$KMfaq2MeLHr=yyZ*4C>{xz-;`un4?(s7UVQPz157T`wH1Ji|MWU$Y|AyY+MIU^=R(^j7| +@ZA#<38$NI18uF1a2RST0+Se4!w@fXsTMSp6eO+0ip)nThhGPCrMK_vjX;^*&pP`l4k2m%Zmc!DSB(-Y8*xeI8_rr%>Tf?4&#G3)b@!#BJ*sevG`y55&m^3dw(>8f?EJTNl2dGjn3BTXoP`2h?`m>9EQ5IKmN_Zui^R_y@q(syx`+2Y_OVdQX-X8}YxB@PYRdSV`mWe= +OB4c4+{gxijDrm68ODDpjAVui2Ua#}$3Lbr8pZzar>Bk>oQ%ZmACDlV+uP|S~xlz>nj`fsN;HcD|@r2 +!_{wcOr0+}^MPDC=r#nhuF$A3zLC$84*@9tGVaMOG)*u&9g&UwSo~I%;ezOl5t={oz#w*# +Wu3PP=jHikG6J$dsgj3POcKZ%8qd;L)x*fDl>aCz#c}3>OOb(hs5lSmsQh<|PJ~?lZkz~b`XRNtOC>w +fa56}ZrwPiD@+v=!Ie8F;TNmq?Z{}KjI2462>B$d9;JoMzp5j_6A@TrfW-uk>i)Wt`r%=a9@-lTVlU! +Y>xeZX)jMM5ye`=PDkSqP=+B|U+*J(60)%iVgInE6A!~V+kpu~QO+N=dE`O3eGq0nv +M(4e0Em}eOq_UfVVv?0pTSqjkbDu;e1=YWOWrnv{NB8r5uT%F}rPHenD$%;b=^VYY8|b8i8TuBZp~io +i+y3&ZukNv|xULO7t9{LEaa>ra +O3M0)ACyD^ae1>e&)5M1d7(Np)ocxa3)M{3M0^SFB3l<5nR8pYL!Dir&tB9NJ&@@EW|7Xntu@z4MB=I +D$@^-YDpszucf1sQN6`c3W+p%d7QCF5P+$C?{uYHYyuTgHY=OY-#y_k#4LmN|#y#3|N03II#*k6qR>R +v35Y#EAw@FSc6^7gQnu>vwWjmUyV0M(vEpt4m1{789$c_{jIj22@Qr!gr}emqX^-APye@oMSpl(sAPrT|{X&-S|L&UIL2Lgh!h)zXR-q`BVK@?peZOxUou5aIt2d?I~Z@&Yk{`^>_A +NdDxm4C4%`;Yu|xF|6Pd8AcyOP3l4&|$iA9a_J4BBCIyZd^xRMW2*pjyxoqY0#V~R158Z;_Fc8K|C+x +G+_k&s?l9iEyW(n3GxPJJx0;B$e#q)|Gkivk++4S>etUPz_e94&Z^Os*_~N`R32KR}ABoUVNl?Q4 +ei^|AIfTl+eyeL1zSL)uq`_O)C4s?xsxUHe*Dj>CizKgS3_7t19Vq^*ARckvAq1XYdWgXHwVFr53eQF +<4h&LNJfj9b@1-YGuvJM@Ealv5wk+-8-|A**;RBS0b74Ij9P3~m%zv0UQ+T2+yp>G1tqHXStxTgflAu +<9F5Z0J*%L1tV+$!%2>xOE3w*f;-`vTXl4eD9it19#HDntsgIK9JnMI4(iL)VQ!HgaAoQy=NW0y9Ca6<0VXAajALFtiBLty791XAAm9NJe)F}qxf^H@E +p!RU?Es7-IIHZ}Fe(mKc)x--PzBbOsR`lSk|UYh!$dTdv6R#znH`Dr#q&n1`B^M{m{$0IFIAGng1@vK +HVmFMi?x>XwIq;48wPcFJoo^d=O54@^OytMTUU98C^YQ)h5v4s}EI$x}>!4& +p(qS4(M2(pFKk@fF0Vm1&_fTt4;dmu%rW7Ek)ct)4^MrJMtby-__bwwoP-wV@~Jt0|U0MlDZc{rDyil~dCIpGn(;Q8nZ>H;Ae +0K7%n{iW>+!>B<0QF7^8SzAX^b0s#9LLfRoWJZj{GqkRJ>r$aGDVB;~fW3b^HvHWqYXH^|P-j5-|=`~ +pc4E3ML!&o$D1Pc95WJbSMK+tE&`AnT1040=Jwx9ssf_@ykHbbz@W&3w@W)&N)AeTQ&$-EWK;H8vDo| +HSK+GD{}yk9MCK^y%^l*iwfYEMgzo#NMK2sFRr0c^H)}qOA6`U +@3ET@;O*e?J>#KNlTS$k0~$4T;1yd2hEM$Ti~@}gzV~;866R>ZnJVG=IUyq09`FQK-UmJ7X{GxQ6b%0 +vN6K7G1_b7YJiRr8Mw6yRC5p|14!p_EA=9-=uxs8$Rg==sClpbesH+cA;i-2luspN(PR-|h@^evC)zN +6qJPpnB(6D+lAF;)tL;Nm>oiTZhvjP4VSRJ=SHQ$Gonm5i!&mg&fcedrzj6+3A0Sh{%vBZCUoSbJ>A$ +CHq=ROt({Yh&S%*{8M8+2C0&bP7i%^vV20=n4GCYNG&YEu5Z5vjHL0GjfkbmnDE%8PY;3H&qA +$ycNivJWa9Y61X844)=$m1rVJN2z9;h_H|h&+VN^7;sKr(U%1oVo|Q3~@b+l5s!x+X@Yge>G(Ak^8E( +10r=E{1<-+ZTWp_-YhCbInMHx;-JdUwTIiR3tD$r*g-sWRIq?&o#kk(ZXlje5G!zpf|%xRt-VOLRG}- +49^qBw2^YNJEvOL`W1L#~&BMRwu_j5APJ=Oycms0P@NI3fazeq8*fieZabby +2O4IaMZ8sxm=f5|i2Pyb3<-tyMS5rPNI<>IEICULciX<9w0NnCAbwD!TXFcTVg +BO`OrB-5XuQI6vcCxA<8Rc!fpB~7LwyBa*TwE_1U=t8;@t@%C}uC@%c23Ge+SRo5g_P&PPa`~KiW|AC +>BrK6LX{H(4$pFkOrOB>=Hm0@GOm`SVmDbeGBG-bNm0HP)u7r7k>Kbrd-10N~DfuiGLD7br2r8e2b*D +8gGB+s?wpW^)gQo;bpntiN8Je%6N1zz~)~%CfLR3|L9>`vEe5tnCry`|DbHs#Ez*3w_hL|u3W(cz1X% +jyk+M{G5SS$@W;e7F;iQD0akV?l~%{xX9{jOS3cO;6AH~rdT=d<@CoBGo`$Wv-SCcCE0vK#1c<0K&UF +5J)CPGA-~v`7;gaC*^>@RsKAlPV*xlt3O#>8KKr>z+Y=9%R!NOrj&j@-Z(J&$qua`51-p4yaz~qUlTSWI%@!! +bghoj6UHA*Cp$0P3n6lM+boWBJqv +<6ImIA!Z=LRQd&y}V^$)z&lk_d)AYV)PAx`YNgzkmu=&3Eft*(NMV!aurL!BH=>fri0I?$JJ1FJ^4(M +z_dR2Jl^H|C^sl~!~-;d4RlwxN;XMX0CdTxZSrFsk2m)EBD>aryPjK__7l3>bkfowBC +fD#$%|6Ci1ml!I48mKp&Bqh&$O3m1D>e|$3L!U0kMSiT~tdK|E8v@&?fhj+tXD}p +Jw=65#2Ibt?u5O4w7zbzA^&xxIHABuI@<87TJ +}naCoSoyLIIpm3t;E5@X%asl>)y2HG=!s6A&sq3x-SdgNLg6(nIfvcW92l?hg1q&*z}PqcpagIHQkki@H|d8Gp!J&1h2!GJ>*QJUJzoE>e+#?f@(xxtYqC&7q7ag1DQ-F6rvpB&0k&7nQ +5l3D3&OZ6j3H0yd8U#_F;Biy5DY&wzCDcs*~m{m!M5Nr5;8&S$dE-48g#{xpz~TK!?=}isAGBLdMH72 +;5`l+tlUml3wqqZf`_|4l}{EQ!y~`=7npr?z#E +M;mQVy&GP#F59cNifI5HMd~z;jH(baE3+Ls+#Oy}Xr7rD3O|SIEXwT@!0H={Ma=-dc%#ztW0}kdJF=q +UJGHo)fAvNICMN{NluI(jv3t;?@a1dLZog3zG*Mlxne~5NgFa^pIR_70=_znDcltCL(rCl8;9&Sm=S5 +CoVhiVlL!!14fT$F~^+GVVv09Zpl**^rfLI*=9IGqas3jhw#jMCbz8#6#1rYD8dLgrh6bEH@X5V?Cem+%6Yn1@ +^ZU48A|2H=BUste^*Hf9}GSz}V{$4inqX +WPlem=xTZX?@2)>uL<+43=EBTFe8p@9BD+>*z8N~DEb2Zu8fx1Q@7Qu#4uBol#=Ou$<(ax_+QcW?r({YG$%q|zd_$WdARN6@gTj#oNKZ;rH|DDw +Sua_WPUWt9(=@`v(|}wH;)Plqe~LSemDZmMi@oFr>H2xF5-+(y3lH)|p#EP4AE2*zL$j&2LPo$h%!nG +C4e2$j^r_J1G#CAJ_D_X$JaSwJI{#LBK19gFZd`tB1SB*$M_pv*_8R6&IZ7_oO}cDi*p>nF4}?F!(a; +iEATOf>9~fLNxq75!-7xLPlb%jMWg$b3ccz#QPwUCBMOU$6X3ArSwW&Tkrv*K??f0AvR7D=^zj`z5hG$;hbJ1%$$`d3zKxIs8Qbo=*oX$&grpuh^PyKVvRdSU7N!x9 +frt_J61GQAGQ>$%Fje|^Umdu6b8*~r8_KF-!ChwNHwuL!U5!gk6Z*65|&Z*@ML9a&8aTG +K+2?}5)4eaX7028Vvi=kU?IbEHRrsfe{<=t#TR|OJ0!nOVwb);$=_sANIOE*;ag(}j_{Y(?r(rrK&h( +ROQg7#}zIWwCanS!N>H7lm3!i#ckFCM#!O0~ej`W&5{c$}fGg>8n}tn#mt%H)YG| +ZPjY)!ZeFA)lu6EiZ&)Z3*)3}=RTjJj^8#KZ3g)H&>+0$;ir{Ac1oU{uJzrCoir+zHUl(XjuyLmaR8u +`T<{p9xm4jU+8u3KEk`z|&5v)VlCYE8dqm;Hgn8R2sJtQP4sLIjv*|!r0os;H+bC}DTihWDKZ8evY{G +wl^n^#mm7mOYbO>fsr{a{k{)(HROH=2!F1^VjCX8D$+D6G->(ZR5^U+?A{JMI6ai=o!T<22(!xFqWjJ +!^DKO2b8#kIZ12`-2pRp<>c!*1@ugT7&5M)IDLvAEA8R`;L>BnT|H|1{!N6!Kj?z@50DOwB@laZ!8AW +9&y9QSOO|DGUWk3rCkI?LZS*_2U0b6x5XwaEvGFfh<1433NW2A5kx5;Vm6uBaD1}52c(wF*4|gY?z2Q +=7?pPLN+x-*#epL^d}Ng3+8s&j5?JV@xrx#L?tUIl`KnA$+UX0F_FptA&|YiUNRx2B#=@ta2^6v<@EN +7w5v0f>yUENHQ*p6ok2u!-4cpmEj~jl1lpe@pm9h*V_{D7Ip+Q}B%mCll2I=+8W;=;u(bFuP|u<53s~ +wL?Xbe#|6Yo7ZhQ|Ni{k-YHWNSQf_GtHZ4VP)IY_tFP<#p4{2i#y1#yoDZvza(Z|yfchk%AMv<%&Ne$um$5BI2swl@C4Khx{2rq3WOZslmOwF;>p?4H2@T?`mz6!7#a!BO +(kgo8D!06?;jxH^-q7QEH1b?4B+*VPn-tfQzUNW)6TvK1!rn-Um_e-unI5nFb~N%UV>*{+=O4OTVuD7yI;}ed5 +Q>*EPf>^)2{|Tr5zd3Z!r)Sd3-ST>~)}7-^#p-@`F(5AulQDgp`inNuf#*!X=b@mP?iSAmu38@~!B_I +!CI@2R#C05~FtWf^&s#5E{BN=^B)q(Sl^d4K|Q>{-&zU^;Y#OJZ+ed*B_#LLJj2UpKEpUY2rhWsYt!e +yg5rA(P~r;=rCu6rGBxSoc_Bm>I$Zew5Xbv+*oNcUU4qNs_pvul54iwT~*{t +se>vsa+bpUd2WY9wI1lU70AEW#hy%6C448ITnZv!}Q8FnFnQ9g{f0dT+Oc5TXrm+e$G^@wSKJa}UMj9*W^Th{<>yW&r{#yt)(=bl2_`jx-jBy#lO&6{cri(GNHpud}0qG#N#WBc*)(w?-j-H^ +2--T|vbnJf=&g2fg6{=v5X|xc(6;A^1!Jfru=*3=rd9g$-hYp3!Av$NjBLZlq=&g1aqttM$gwHVa{m76@Q6Mw%-ES9mwxJ--F +gLgNFo+OtYA*pyd6f!+Sxq;Po83=OrJ5zMd&fgqh>sv3D}zqf;O~!TXBSI!QNr}6-b +n6sozr(U&8HMFrfLy>lZVIf;h$92SMW&K)^eE^(A-{&SBH>^-7s$`MFSt+uZ@^ZKRvhy>yt +Z`Os!zd4$Y;`AJAec*o4Uo2Bcui&`eb+!-grQ(rPp+fY@g#2kQ05#r4X*s%5@^yz_r{DYyzf9% +W@QnakY5WkQ|2?UCXawQnaIuqmBAR+zjw-6u`W=J%~puOIm{;&|J7ap*|hY8Kh%vL-vq6NGD)_q>#_o +kkTIkp@e&V!GL1MN%)j93UG;$rl(+yJTU|`E_hMka_epN5T6ce8z`}7izx{nPbkwU_v +^ZX`zh(SHO&I)*9oxSYOq>O;z68;fN(ssrcF1*VJVCQZg6I3V|BeU4!8OBuVTfDJAEUxuR?7Esh=ZVw +To%N#kvIdEG^M0OqCPLgy9R!?!r6CFTTYV;FrpqgX*?VRf<~qAWC@hGZdIs0&JEpO251%NnLDB4S$0c +G(+JBu^wftRdZY1Yd=*(T +1Sw>^|8`M3IUD;Bahc>fkCcq!WvOo_IeydCosW_-Atw!yzlHTq=1KV51%Gk)8|!y6!&IS9mT87o!A3^CF-#p+s(lbg{TkeAUQg0Z1NU-J9Y=W=H*MX-^ +aff*Aj5cSz0~iQ)Rf{7-gQ)XDdj*wP!+!r9j1!^A*w0I{~8^xia&m(DlY3_>r-H4RP>)w#XY2c**{XW +`v-?9+M|a`o*4ayinbU{D%$_G?6N~*a;+_RN=Ubd<7o!ELCy%{$l=2&y=N^1wX0swFnGxf-r)rh&kjM +%PeI@v6Ta7}4dK&`d1T8F%p?d>8BD(;*7|~W9M_37f4jVlEk4QZGv9p0t*RZM|8&qRHm@Js$N#bOnp@a|1>?^wvqx;s +qjxkpqQYMNc1G&4R8~8{_v0@kJpEfJN>OAL8i2P%`Ru4>kHd-c3?QjqOqBD61zu8yJN_ZQGI`P48Bf5 +xz(*FGq89raX#%}U>XbmeR@Q1|DWzUwfP8qXM@?w6fu9^O`be(Ucsv3$*XwhWfB!6bJ;!Zg)Et_z6|a +yJ-c)H3WZ*eSor*z5oWjH`O{sHJH7i!tMOAu*6*)>b3~#`Zs8msf*T^sw6jos?q@8ib7gCL}?Fk +cF3h74$nR4E*STksNU2=7pRfyWR9I)EJ(K#$U#%acjSIFl0xC^%LY3FJavJcFtuCv8EkZ5NJNU)koes +q%%&Vb`uxyN7e|4`S{Q<{`iYS8spn^XgGgtxspHrNC$JLz{uHy{~Uj;bYH#=vhr`S*B2~;Rb0*Denq^SMi?|_a$r;*xo)+zXf>#U;(3+}q6IlnR3mR)D +XuAFL87!apU3jI{7q)$t!v7E#xP+aBUZTveY%vb<&P!5oALYp@}DQaaeS4!@?R#u@!nHqQF$o&jXR~v +obpGL-?*Qm+))0DPb}YK)W1Xcom2iYey77X?hdFM*92JgM2)m{jgpQXT#O%et5?uH;o8&zNDKL +hFP40v>0%*oX}Xvp{2P>HZl9+zI0d1bTuU69(Uvy5kT=iH +5Yj4@vx}6!(1c_9>In^WX$`cg2K%Y`c%@V2+@?7z`SaM?t8ue<61}V=P=hY4K^I*Hx2r{Siq4>$pWf&;YD&1y;RN~R!o`?#jvI)m#$8GzvC0_e#iPUyS{Xl=u20L +(Cd@S2hgq2>n)CYk0+dNkJl@?`ZTejouB0^PYwf0AkG|vqb!O< +{xBt}eta=4)xwk`-I3z`kXr{m0~T_V@I629(RtCO`HJ))bFx2dF5WI_H=9Qpj4ZPxsGbyl*jlCsrLPLmugcoW3Kn9`Lh-j! +_#iEK%-qQ_(>Z6wqg^kvo4!3@|?@YIMW$C!*iN9H&v@mvdboRnTn$aAafXvtWEsEfd|n>Zrd?EEyCBtfU0RdXUymH0@fHTS&zzAeL%wJ0e_9T1w>7HZ{#XXugA&f=LrQN5I4gqR#aM@z6UNnUTWB +h12dm+r6bH}Gt=eHc$oUY%R_q>xI*<6kHRG6Eq`|!RuvAW0n0^J5PWi<9aU&v=@>8z6Vyp2!SK5S$mU +TyleDxti575U*FDhNpviE9rEF8I4D5XZ(a|k5lIto*(2WA&40x$u)ptSYC +Bk&MVcuI$(LnwwJGw@TJ*Y=@iLbF3I$ot)lx5zX9kuE%#bS60ZGWz&F`!co+=6k%}j1B2Zo_`Q3{?{_ +_WZ(9e=`p}AT?*|Nen+Zb#(v}FSjw~7;fZQBb$Fs$Wf6KN>8gNXNt2J^R$1y=WOSmcX#?UuVrX4xG=C +=@l0y~7qNc*8*6K@5YcEx`R;$9c{zwzo@;p!vAjrtC4;VdA{;$5)&p|jY3S-I9KZ5u-3#A_34T&28g> +jYc)^{@KxzdTTzxp_-RE(<^8#~7dqvY6AOE6`wcG?Lj_b_!Jnn@gAQ&@=E-S1MN{%KJE>o`RZpzD3G( +I#-R>-3bEV9BVqDW(jU4Tx|`%n{)$%8|JEYeABP*W_}%d60e?wJ$S6rA#v;Ol)@z8kBrks`lfxlavZF +A6UR?z3a7vBcT<{sq{ev=wDUouV*V^IPa>^whbVRt|L;4A#7`Od?v==0d8$p#dZ!8u +Q7B08~w{Q-*2JLDU*D?`zJh-SyKE<+QhVU#0mYpljhHkkyoMe7fz=z$$>Q@y>YJN;ikKtK&lz +hN3q1=IX(w&$gAY{|EwowQP~NE&N$})92eV-)d^S#I&-)Rg{~L$6VUhvz}4QWo}{%FXJRzDJR*Snzl( +^5-=ev0n(X@9ESe-Q691?;3z2{q$hT(>OZUpIKxcx$Xwh{+KIo=H&g!8uwGCOBAIhQiit0~psMtYAo< +DfK^_j|`lq4lxoWq59tCeM&ewmtN*G1X|31m(pZPsCz|;Wm2cfu;)qmZptg(QH370!{8*UDCjt@Kex1 +`2_;eP2zgK|4rnb3cNplkT;2Qu)@7zlx|q7?3?_aH$1WsTkZw6ex74YR3R{`LM0^?1s>leFpp?yzF|1QDE^#pux6Cb8|gjZr_7x_7lEP1&hDIF_anlsMY2*j8vnWC)orCqjki7SJ*d2`8C580*Wc!I`yh1umdycm!>)?3k_sR^|e(mVm|6=ej<;gs`H>w#*HP>fL_j-Glgpmu3w&0 +5uKo9>iM*RsIL!mZIq@pXT6;rf;tS=8==zg*@jl1odd%1~B2&Et +Uy1oIkg%;q<-VZe%tv}5qSu$-f1WC=tke}w0p{v$lMrhbHH)}MepuJ{q2A3c8MkMQ6x#el5ZS617{zv +QD56wX_m!bRGR6J3bY(r#)|)c`0jIZ4f`+6@&{ybZ!EzE*Y>V&qGVc5(BgyR?QE49`g2BIU+}tCpDSrb~@o%#WxEstLQ141m?`wM=Krw68m@CSX1lI0FDJ2&|&-FGg +!%n+aaO_AY0`-Fr-si0su6%-6nK_OB>E~Nt75ET?46#xmKPP=XE>}ItWozG_sAN$!yzdQC1{Ng+4>kO +XaUkRCSbq5#^As^C}9PxuaK?*3KXdHp3h&*&5T%%#lL-L?6j@iGNug%`g6 +~6HdhMBg?thQ4zNN8kA*9p5tvLq7{i;%E3SBE9rIjS%{tPP*v3gmlvP4 +04RV3rGij&mv*^o=x`u3|r__H#*7hXjBDxj=rnNGxWWXJVD=X5~A;=BuL-ONh5u)Bm#Y}CO@X{HDoP) +`$;W*uOrLodp)V9Z=Sg5dowAg?=7TMZ^B+w+{iT;yB7_Uq<{wTx;Zj}26tdEjRw)&NiK#kh?{t%mj<8 +2;9qI*X$*c$gU@2{T^jri2H&8;=P`I7l)A#}ze1@CxOUMX-rhx?q(O8lCm|Zd>sQE6Lwb|ZR7QB3fN~ +ePj|NewC3Q52Klw~NG>BY=RM8;XcS$)75)9ru7KW20b)53xicOI2(iIH0Z?O%`{kn!E0!+3WEj7CNIRV9Gc+9pos>TVlW|Na5)D5MuRIc_&E)( +#^8rCmCNcbJA1^}$Y~A>y&NvxO-=`F$E4wksdSHMq>&cmT7uSj}}wpuuR +uuKGtGpIV?^+rbCOF?XXnnF?+Qbr^8aE$NWZ%sc={p>M_62VyYY#w;t0(V>T{ylrGhKe}9|SdtF{c6z +H~a_y+NUwB)A?op>MXMFHM$R49jlLxgH~7i*sY1{({;);Vdgq9O$d}eEY&UYC_Ur ++&A)81evyxtDNlS-dXb_u-sizwtJYO+65l5+g{kG+F@8E2Tb7Sk?Czmui}rHc+#mR}r}?`bONoTqmdIge`h1>Kmb4=Oh-Ttmq(xQg!5(n{IM-Xt#8{-eSEg +CXd~AFK*y|PnG=xiA3i@g?kFCMH}G(@v_um>f(Xo!b>pVq!#B!0-9IMt~;tO%vSDdGD)5b7m&sAWNI|&+h+ua2=)@}AlO2%iC{fw2wQsA5%&05y1VG^qWjNu|C#P(bT6a(CAwdtdpX_9>0UwiiUJ +)Ls+hJ+TdtG_2hn)ejX?r7GhncYT72c4JC*s7)S6BK{7!Wf&EEQH?63wThYBa-J8?BDczgW-IwmZ +boZgV58d^2*VA1`cU{%Gk;-Tl{jMk2LU7#hrQ^I%Fqlg{XR1Cq8LE~`&vWj2{tfCTO|wbTy;GQyJW@)NE0b#0?E0}kjg +<{w;Ji4w@F|mQJae6&e+a9zp46G%)^)*80DgM~7vGz+W-H1gmO`fa}ob-DXOTi=7D#a)w!(Ig3+0uuRd8Ku+4LFuVSMTiX~35OD9>SgPpqyn$VR6T{JAj4g}{7|7!(9boO$c#TMgQ(~n$^)BE_KOt@a!2P3Umrs`6SuIIN2<0@sbs`w&s{$-nIYV&cEi|rj5HU`0F3;1-+b5zV1-oUzobU0x}Er%2Cpn% +1$BX1}Lh_HmT&|F?QK3?qcij528e0vslVTgFyZq4jGJPiQ`qi?u%ckS9L57Zx_7`4`EH;IR&g@GtRh74Jjc@8iV#a +OHj77=IiPZuLzzNh!iD8f^tX&M23}4?#uNA$=PntTi|qT!BYtIqVkZb88oxp?4PB(^?cnog9_wLv!j; +shVhh497oQ4lmc(>Me-!Wz5J*1J?qVpm3M<-e^hx!H+n?e@5K3!(|_X_(uU9^hezoV6;>XlpE>u~uW?&*l8 +7%z$TX6X=|sqswsT(a|IM)7$4fp#8;5I*v}%XhO0icDwj5yQJAaN)sv;p@XOvHBbdn=1^2WFl91lR5x +CXCqQ&N)3M9;_^P$ +hG;)t^F^0h8WmR>AdVHmVa2ITIZ~wgY1!)S(Z)k=&j8OFxup#U_%Vk7iaLgW{WQaCK9qUK(QfXOwSjoby88NqTDoQ1N +OnVN_onw5;dS7A9hwra|9k`}$vuO=a5eVqASb5c(=?YgTM$ymPiC6<2UG^@o+{2f(s4bmsRwhp$HZh~ +EJE?K{s`C{o|>!bUV(8`mpO!^(&2@u%HofB(~xVF;&}vXk&eOhGGYC!f~-W1FHMy%rDeS0}QIdobF3a#o}G8YwVr! +ab+v<4UhJ6n71z1khjDG=9D%-Zb=I~*mr2tf_x+8YIw3J+NtF|y`2|$Gb46%9E5qqhbVN=1*=aVftn# +N+5_L#w*oJ$7DXZ=(?Fcx1%(psYk0K1CqAz*ox_JHh?G}o$e%`i?)?I>th|K&15UR85Q&DB3kd6$VBvAPlB@7DQd5&at2XVMaystsqN|EopqE-G~EV1%nj`YNKO;q +ca~wIT;n5WLy&^ULT*EiO9|ZaErFckq_SKyA=@)OD=2i;R5JqhCHm#y3@pJdS#;f!Y?(flJJ`%B0_2m +OEyErnUD0jNWBCL^!+tfU4IW-Tf_Fiz=QT1RMJJTIv|koaBKyAjsoN?2OQ0Xo9p%asgRR`L?IdSBan| +s)I-M8dT(mOanTOp@5-$bxRt=8kH7=iIKzGWiu?=^S8p=e8)A~jcZ(Ro`e-wDxUob*J{!sc2it^3wxVTAZh+{P>E%%T5)Wr!r_OXVh!H +axNgBRT3O=wR4xwA});$MdH?kv@zaH+W(Ly?^brxBm4*ZEP;HaXaH?qIHgkKf*=_2q4A`=}?QT=h{;NM*_qkJtK9 +&l`^`o7lfsK?zjHE~^Ds-|UaRa)+Fed+dgJxq_KCu*g^OVIF1jO$~giUu#Dp+}4>+9-W +f;CEVV0&5^wJrSd`o6j;aQ*0qtc$`sZ9eUS8OY7R5|M^mdFxJ++MPk(DP#;sQv&@ODvet(7M@XjgCQ( +J>RXWh#NmxanA3!si#f(S!I6rbdwUd$z*V_kjTO)h$eKv#hqs_stoSm>F?!$6E$GHfe&hQF{x1txm4F +eOKu2(lOvGICc1}20-3dz7kbK*N!asl2~U6&0^j4yDDH5E(no!mRhcXC^1!v*8Jv);Rv +O;R*W&@ojZUVC|MCkZx0z@ +93hY*cJdEV*9A_C(BojqQnRw_$tYpkjNXmCE+S+p_Hm*I%?f@n9R3?TPi*Z`bz3oSSS<^p|W;^tvtE6 +FotSRP`mDs~ewq9%nV_v|8w@qrpTGy;f1Blr^=nm@C)QlAYIy=V-M-}s(N4KA8*{Vei51u +XtmO%jTwRtYlmNH3Jh4|$Bk(D}z%5&yu*y~^CMZ@XcB!mRAY3h0Cwd9169`bd)rrO`s}pzqb*mG1=YN +`Wm#{j~_{wqnr>t(X6LRVONxKvIw{3R<{k^a|Au)#A?gWbB)^;bRR@$8ycaz--Q$&)z4^s?J{Px!kPo +N$C8x2paxL$|hi573yVt4|QUrmN5TK=x|E7c88AfKv+Cw9Db`-UfAL_!#z5Vj^1!xOLxBMeXEwonH(weR1&$?ya^B4Ky}53UKxm}3gJn+;DGqy`&! +dGV2w#NXYfM`)%X9=r|t1(#|Rv8$P)cs~jA!-5Fb?^P3fV55np5PU$;_!SdtO)!<l=zxX7`DK6(*3q3iXBXAy=Ygr1(+@$uHB*qWj2-w6(_jrwKQ4uqZs%M3CBB~!u +OfwH*Bq3$8x19?mM||9EzRCr0HWJO&>kwsqkxZxMl8eu0VP$Ju3FS7xWji3}=}IQcN)`K5Ym*q$O#>|GemDs&@qRma*+~6WN@v{Q4qrVv#M0?a4mFuxjN8e>9;q +3_dpYB4Na&`lWN!zjRQe^FyV_c*^nfPtU|-L1{vpipWRY?zJ?x~QN?;P(+N|#+ +U#oAQdvG4MKB(9#Eo=oAVgXpTZqhALSU2fAuBq)FDUg?8TO$gkJ}(<*{e1+w4cok;UDz8cmY(OqEXtx +yV%LsleuutMzH^O%pZ1-kH$1gxG?mw=*wlJFODEa+%`c?TSVr>=5>YJ1K9e=pyPdgsq09_jSRF5L1JA_W*t8A>FOO17sYAZ9AU0r@tanyXc-WgTqbY +Rn~VY@D*1Ek)XwlGWPSTPeCKfe0sD~Dq7`9y<4TW9BRKVN$G3H#8ZUn##&7th~!U)G7K+3i`s3x4u4By2fj-I(DwPChYB9gQ{t^q-sjCmqXdKy}GhVq$Mev0 +@TVTI78Vq5=C0>ZFsDqq-tvLfuw2zxe)GD^d480K)JgFN=`x5w7r_D$-hWeHEk2BCIm0pE)+O;)RnyE +e%6${AXH6w7OJLYh#_7}^6SAE&L8*L{GD2Ru}-NRAVO`>kyM%BmDO-886)&U$FE6xq3yC>NO<)XnkJC +NO1diPcBqo>B{|(jB3)4eB_1NhOVv`ud&!S_iSY6W>nMA9vejfSPqQ|+m(McfAJQu%3B|`wJ@N}qvo+ +RUm7QsfEqO_=;O|@VtozwmvQ#AOZ7=U_YmsEn@#ty0gC8@45@kxuncnCOgsacn_g&*sZ9Gu +&dpgBh*F201ryr$_)9ZY5s4Ax@d)*lEl?cQN$9_rh=Un*OXcP&N5LQXbbrV4UVPcwqF!E=JqAu3MCUF +NlK=Jtg_^GGPR%0TXuKu6ghEj^V}`eOU1g&B9u|8dgp`+$7*D1$h!*N(%0?@798yxeio&&6)*YRu(Yu +!?0Z0==Ix0UDs&%)ZLrtu^@qH1N;7yc7X7UdtfhN%UzjdqILzWjqgk#F84bWiZ7nF>lY+BHb5r;s!;$KcqCmR#zcnZ6CRaIr15Nqy2RTU@|t6NotIMzE>`tPaakCF?}Hf=Z}nix!*s>(3h^*e0ummJZ`imG!$(fF}OR +#fd$6jeWBE>fOi&48lHPbjKh6pAX*KhV4x`A(7B0#sD7Ze*zzUBOpG6V970)Kj7eg?b8{oaE3#JtaC? +?S9dz3AC^16b3Tw&qw<8-CQK8rB*^M^{q3s+!<3*@;SZO?x5adnk`P^N}*I37Ia{~Ug{W}2Nqlvilqk +%-jq~IVjW8G{CG$H#%qd7sj}Q@>Rew+OsJH!vP!9#Qd|b_&9khsYZuwb!_k7B@i7CDCVK{Pae-_zAtzBN +c+h^HwQ(rBCoNya**}ltk@Hr7vle=3)^fU>tGkArycJYA+l`@1KC;0t`bXaZoAcEB&bFER;?Aa{B~WW4LI)PQigvKedk +ql=c@L-&uE~mHaCkcxksh(r)$wk#T7UsYOc^aZ!s3T_WN(S*?T@ +HaAcv$a|Eh5_%;(xU{ht?u6TTrw}upqE(PI5_s8>FUg|&h>ebv%=jHLDC7kwmT>n +rWtD$-(`O^cS2A@fkTY52zsRp)ed@+)Hl8D{R6l)Ksh_Pwf{#}-w3Ndq82RdK3+84EN$i*T +ZzS_3}K!}eYTgZZfWickuY?1%uwxTsG@gi>1r*9@u*C4Lprg<=Qmr$xE!V@oIiHz^y28u&QOK5plJ9u +3g-%o6NW1f7nb+w2Y%gmvfkD!wZ3a)0Yf6`fNYmv6J2U1qg6@>L +cyotgH)>+qybXbx2n$Vz38ZS|wi&>-b48)ZW0BxQ;6ja1e3fNSE4_`yyH&WDN5e}3#Se#@yUpOiT=N}pZ{N+!QAxA?H;)@?6egg1g!cR1Q9>PynfdgX9P}`CGPpuC)_t1RSYADrGcY^o@5xzrhm+f +Z^)>h6vfnOK>Y!qLuS_A~I)ghbl@C@Mu9N= +Y}&R{mhgSQKS_-mD9?)^+$KP%%=!3;QqhgmC$?#!H+rzsO5g&q?;QgvP8tm+a*sOaNq)D4$U=aj~hIf~cmWVjPovggy- +W?rRKJ^j%3GZ!dq?kPky7K^F~q*|=XbJUX53AmyLW2vSNWC>z|X9fkUY(5E +%6a@5iMhB(5=HNz==T;dFGB_Cee+%-wK)DHRCVO9IyAo?k)kV8z*@ewQSOLtxY}2RKbIrz9d||z>ng5Mw*8yx!z{fUD-2-TAzt}s% +P#`|GQ#cW$Bu<^a6ts`Zp?-4Z`H$12P3UMdG0x_3)IkM(Yc;11h;jWIC2fxnx?vp~^qqB7U|~|uyJYQ4#Nu)_GgBgj@0no=zJY}${x{ +@CTWPYR|8Sw__HjmCT0FLC-WW}562oww*d0|g-|fSFW&88mz(P}vDsY`pf~PXqv%IQGy?IP5PO{a&zK +Px;PMLGP{XNM`;Vxk`%`x_8EP;&2F}i5N&wP(5dHWA>lrKHF+GPOL3f;7o7V_C)u&n47Sy!9)j}3=IKtX{N!t1vQ*}KDU03F6g2~=PWMuaPEs1TtsMm +ED9W`^2y&E3M=w_p=?V&CV9w=hao(b92<2<<<7sQ)x-U^N5orH}Q=>248FVd +Y#$3uadwNV|@44y>=gJwvhP*H^6S=-lLOQmn_8}IPzLy)i(h*+Pevf19C7dI0uj`|!O7gB_Q!78wad; +7~?QNIrHz+mO-j5N66J1EON0qF;66f~`{t>mNY#`Flp=MFz(oR)f7v_HGQR>P~(B+git +n|rko0|^-+vY9Igib0(VRT@Hj08OsQ+X;yd0Wk;UIoud!cC?Z!3Yv=GGj@&$(#(~#+zUy9@8KLWkLp +;1sNzOt3cRvDcFtQNZY#ngVqS=(W0MlDBoS`{BpbtX8IQ7_(s~!+fN&;el%|>@vt^@-s!ljV5Y7hM;B +qch+VT#5FOsQJex_HqH=;@(ZiXCV1RT|BI65J(R{*e6DT9q%*hD+kThim*S_jF*CeZXeQ< +A%-Cm54pdcmWejE2jsGaUg63KJ1Cok0PG$FS=#x8LW&dW|gGl#}_X}7or?L-omy2A@%X&BDInM8uPiRo=K4H0w>-7lkK7)L%cy^yb{_H79s`id`4aQ^ +T8RYoHM?QnxLq3Dt|0Bl;n$9bSkl%Mi-aubbIzm3(d4Lei{=^~V&0_E^*(ld{-&QtjYggnuNuT6sUfL +SpXH_6O=QZIpslxTvVI^OjM&7_(Y^C1LVqrJ3@;GvuPxqaq7vC&|#Kxij81Xzwm|2=sk670`;cm;L); +8o98|S*1tB7Gb=l)V3$?)NV$>NaE>h|=6eUBJtly8HB)+qEj^L)04y#3%dBfj(RSpV!|Z)>Oeh1T}=e +H#0IO}`&4Uj4qG<>B!|zy0)7Oi%mzow7B+8I?x^5B57{t%r43Zt=MCm9uC9L@x2Yn3n#NsVYp#t^UC0 +z%cW;4$N1qu%Oikn*hA!^93qV6sGNl`}sCF0PAqJdN|th%IQ76Eau8-c^Nm+uc=mgI;}l6fxLK!C6va +0uKx>HxlY5pJTNN|dvg5VA>3QN$NU@*aCf-Hhx>ucCag7x&gnP3OOX9P +bJ+#vAvrg#MX2x1AW1d9kZ6BH60Avj6!6TxMIM%2l4BnTkrPcVYuL4st0nFP56PZF#rc#q%^!Eu702+ +9fS*VC|e1osj2BN$9Dj=(~&gy2PjcL+WuI73iQa0lUUBnTiFNHBunAp$Ew9>E%dw+Idq{83*c%5aI7= +B9EjYHec4!6x?o3KQFM(8LHi>8~Hf&lX`4<-ab>NO?(rMz_lx`Hu +IgdGc!?_tbLn3*a4DfDX*ZX;MGn_10mB!#k)yW$c<_bhTzhoV^*n?{gL?zkf9IZe(N&lwa>$~%j~r;s +0TOrYnfutQ2^VWzY!6cTPqyab9@=_28);HcoG;G^K6Mg5tlSZoOvDNI6!c%*!gKGH>+NDJv84T?7hX&^r0A`Xj5u-Yt%2_lWbmK5#6x(5Lm2q8VbrQd6ZeEuiwk7;vu?yu!|6}tmzF))Vm9L*W46X7q}jyt5Y= +-?T3Y5*rOj(Rv^q~OZ+*S`4SX6lGWa&Wqe;_dciz>!Ma#QewZ5l~v2DBdejPe?>U{5g{$09u>mJbK{= +lBSdOy&oZ@-}a0|o}0LI#C~g%2JwG$L}?@Td_ZqeqR788bFEZru0>Crq3)IsT!9DN_^8Nz;;3Qm3b-X +Jls0uw+|pGiS}7^Y9~c=grSyp_!KO*(ug&OXgHFYCoNLZ7T7Gg}B5_lqFINK>b(*pIC{f(#hQ@TB}8b +GYUEyvidS#52yANLx1Wpl5Y(4N+Z~i8hp?uM-oqlh!8dTkEZ@DfJ!@1xOAm3A%u<8cc2e3ik`(NdJeP +b(~#S6dIB|x!YxUpnJ&U66D8U7lpuOUsRu$ogFetE+D-=b0Y>^w5LC|;DO9Ef{}kbqK=D%8!*V#Zs`{ +eUN$IDE)|o;v69l$Wo<_>eCenvL`rAyAEBvzPFU=i8O0gUHLpO#DSOsrnh|-!yv>GXgEQ&i-u3stjG`dUFDm5kfq^nA_dOkgF!B;oew^>!*p_I-T +xn3-8AE|^hMX8}J{X6)gIvoLSIux9ga;u4g#A@;HCz(QtZxb~-MJ~mu;8zupPQjGs_rD?KxBSM=v;2aAVEsR^=mLlO?1stK7FJJX2F&uTJNITcndN_i`zs#aTqEiS9mN`YqG{EB +sP5r$kZS33BR6x|Qt^Wtu7Yp|j{mlf{^06cVqw3OC%`9s^YMbNl!qgv5iWvvl!pt%6^Gs(x-iT}Zo-& +6O0hZ{ptoRezl%>Og8e(uk8q?ga)mF^ECAG*Uzb2QyCWecEtlxQ0kF-~Lr1#PjS?^k+-Q07m6Mk=|glGSi}!VIQz{!(8qhi> +AJvHoKIkx6BWQ0em6E5$}y(?w~{qThjX-BisX+}$GDinODvq}ET++*!<+z?JukG&*P4($eVB3;!A_E2 +i~gULL->@bGX?T)hHtR3!y8_K6Q8f)huKIqv^j6Yc-9?-q%5oPhwCCkN`q(1JV&{^ArH?OL{*Nb~eCp| +ER;+yXxmBy5e__qq7uT)d@Y2g0UwQSlO|QT4&&_YX_4byn+qS>+?tAa=*tu(WVbPxAy&vq`f8gMUA07 +Jmlfy@jetPV)&%gNc_*W;sKKaeJ-<>*r=KHhfe)!Q<@>A*0zx;Z>?80vsFa3V`O8M14u2o#W!T)8&MD +2=)+fq#Ychmpho&UdGF;u(%|A_L(*-s7R9*VLBRnIubSdkl+s-7QLJug!|FIPSPL-qWG>KSJnE +6-b1&oC5TPfAa0zZhaxbY^iW8Ht&*Vyp?)l*|mckIgn)MovjJPqjv5BxPFCg-4teXLv%kHDszaWu`eg +Gs~7G+@yCY85Tt;CQLIA%A6g?#fEVMbX+dUStN`_N8_XwW9QsOxfF|$IF_88tk-+b&dQpVl~qL!!^*)30<0}yOXT1LYeJgQY_Vioj42 +t$v;5KJvX`;BlZY34+uHPe`xWzH~~XPc+mtO--npy(Z&fd}{{5uwI}3}ZqT1xlpw(E +L&XbW??~m=h9>NtVoX3N50u_HD855JDIYr7{^ucgBL`vWU!_LU_50+Bm~zw#-S%m}X282;JnLZMIrf- +YnaiNMt42veHtfN+A><;g@N%*6c}sR46t3Rnjt*h_RZDSrWGxZQ01WQ-`$dPF2fnn%PQ4mSQzd%}g{K +Gn14Ukoz(3mDWAF3k|1*?o-5Es=GYfQ?BsYS;Tl!ic(2adgMk+_lfm>2_-0$(SHx4{oTEat(NNYTJouOH0d~CHSlTP1RdNoZ8Ew20pS(v!U{`jh)Risdc9$8 +O`Zg);agqozE0v8JQ^(u#=8`d)a`h}0Lqq#}+<)dT5Vm#Vs +wK-LMI{eiRTNc82zwi2gf!Vk}kaoQc%Oqa)9rn4OZIm1d4t`o4*YDcRPE*1-F_WhIKv&)AD +G(*ul^Jz8_#*pQC_-Tn(Y)b0Oz=eqshzPE1wj{bG~dv>Yne@Nv&v8#z?b*<`uq+0 +yN_t%~Nq@dc<$Gv;-E$ACm)&F=k|8GN0?&n`r&(*`N39t0qqRZhC!2)lJXSqa}Y_Q%0L=rK +`o5y7Or{rEY)wjJo}wm{~WTKjhV3uFpMcVsAWJyZ@=DOziAaRsE}%vDUg6GX&D;1Z#2}n?Y}CDV`)rNwQ}fS*Vcflt}<_ut>{hvCtr?q<>Wxmylu|oN0-nK{?GV$DKw +YGt3r>9h#Yuotb71wOZ1`X;8H?b|(wT&Q6(@A*V1VvocHe9dZErp(IMUSL~a5kZV+CqAkrlm}Hg_3F$ +-z+n^l3wuhY$Q>?(u|%XDV@(`NH;Ta@$g<4Xqlto$$;fkpj>#H4ZPMB%F$vs7)!a{X0W=R`^^sCl3rkaXeSy|r4bYnA; +1sRFqv!|M~5RwYsift|%P#(2=Ya_D5%u{UBrkO3#7IQW#{Ckgx3_>>{E#=|rh=*h(#$=^rgl5_(+)qR +^B*^H@6wuB-#I6|Cdvo1rYueZh68;j|$AT8AHfeSyXpIJ4>^$X0p{Wq3n-e24Xljx!xUN*~P6;dS$%q +>g8qL@PD8rHAQFyLTbi@+IiGmMlw#q)xjdAa5*^g)UewPDybMJ)Nhc{87%`3T9;t8siY?PjgyFO60s4 +>Zy6GqU~D%?Y!dxs<@T11U>@QkC96Wq@-k%p9_RB-GfQh^`po=uf_frM&X7K$W}9i@^?Gh1(Bo40f^X +=Za4>#7|d8bz!j_y_G=JDM;NnXx3~hDW6uSb_%Rg;!2?qCOv=>hGTlWt_eWHGa|Hc!vaROyF)5T!wkR2TVvo!19}aOWSUWs3f!f9tOM+z +%;rOZGsnKSslAo2@kJRpoBQ~kti4ZE8IL+WRTXr%M8)QpLB8i%@$52|T-b6=yBx9Co8EnR`Ewj=t5*a +nmtOSeMUG8y+tt!9R1WO907I7>_@<|+-B-Ki!N2PWKSkve&wQg!-jQL62B4Zm@^N{<0{wnMp;=XG%Di +7bA!(#1KbF*_5e~-TrxBp!K_b>3%h#ySvzu97UnDUN~ZWLb9%6I5`v38Fm8u2L@=IGGF!mJDQuzLAkP +rlce{TitJ?v&%=ZjjUUmEEvk;0_t!-d1++CBKKr@1gR0v>a!&>>eZEm`#vHkVr6*AetbIz(mlWAb_A1fiFQlU8S6+r*}qB{ypJE;37ChaGc-( +!8-&S37#a#CCDO}NHB(AI6)Xee}bL_T?qULS`joQ@FCC7 +mCkP|xPtciwA^vHTz_%{>@?W|9T7>+q?;3V9uKIf_!>qVKym8sY)?6VPDekhCA&kq{s*5J^oLis$OP8 +kF{m;7B=Kp8I*XIA9>tDZaweQHI+NG5*C4N8|@gV{D@mbP*v-Moi3Aaxv#xBu!6L;k-qit|52S&pUKSy +d!jnzl-jer%|9>R8DicV=fk;sh*BT>}D8RgFDiHs0MdjvsDbGc3)JB`-)oJH`e0*PA%>SYH>eai@U1^ +cZ|*DMP$1Cu>-;XXSh6MDp)Y`F_Mf@4l7qv!A8#y2|%c&uhe +YvC8|<7c}faRemr4XCyEQER~&AHDBGjbz?(@3}JC`aV#Yzh1qO2siJao=|7jPSh0e={PN4}-FM$*g@u +Le%P+rVH*VZua?{Nff$60TZ$9ktL%BZ8uz%L9!{YTYKVOmSQ!#7S+_?yFo*$|>%nw~5@BQ?yrX1!n^D6p+kqnJBCz-Lzd6;iX`DbYi^nTXNt`C$?vlc>&p>8DXBtw&q4S@hm(>H@0Z^zB!3*ET7h>;z +k>X6QJ5Sled#^ziU@z`(BXZO!xfSKcgSCQr~Em09>$^~+<;%j;j7=#+hzC*{1;X%K2&k&GSa~NjnNY$ +C_qITrBCmkI}SFzch#Z8L_!kEM}PeF1x?ONazr`aujk+2c=(~i6k-XAOJDKIvpxDq0mOUx$A{Oq+jK~ +T1(5sCA^mwdMHe~%!vB+XV-A&99L_Bi;SY0ueeCY?3gM0LRK6vv%DM0s<&Pv>k~hK&I}*nwZ;`&hP4Z +^?Me-$ivx+u_Ij6L_!NdY>RG=l$S|Epj=Q0g}mcX09K+uMR&wXWHzZIYN?Aen=MM +bfgm>Bl(!w*;C@ny@Fu~%Pxm2KIwMez6+UwpyNojd2|^DL-aHd7zEdAm1i;*qRJ__n0oENA!m-AU6kS +q@cE(r(Ukc9+HzCrr=z_4oK~^pNxXxe1(KOPY7^+}N>WcP9<+`5N8hr$^2h$@$iJKHt%4_k^+WEQhb# +y>%?odv__)&*A)+D_1r%!Nrd-Hor|9?(5x#Gp!7)4p72)%V3bo31wsw02z9Nh5dwdu>vTi!-yo<9gdpPT{kF(&tob~#Uv;LoOHt}Q5LO +wnl)_0h7F>AH*em|w +r<@j`m!B6cCcf`o7ut(oNX=R?1K+JU%#@Xr9rv+b> +l$5Yb=YL|~U*)W9eh7EQmGSsB~Bl;-5G(3nlr{B{&SfZ`9N_)!#}(ke@#_;V=!Vv4_-;{TK47g79ADgHTCd=fsQsVQfXuz~X$Hq*T7F +!euWB*bvz9gGj8_!BAq!xaA+iocEGf2NAh8nI}07q!{8Y#H;XX4{(`CeANo5sWu}kntW_jE{Ph@foWa +U;Y;3ZysR$=y$64MvC8?;t!|zQz-syiocZNuc!ELQ~X^Ne?P^iJeQxO_~$5onLB`{JSZBSBf7@@kdkqsT6-E#a~46S5o|!DE=0TzlY +)U9j^fXt_)94MOB8=M#Xq5nU-gQYF11r==%A26Aws{;hT +qq@gI~LL9f!DmLk2}gM1+M!h6V?RgvEF5+^JIszac}~D=CCUkT?BD&_h^Qy#KujFl2~P_K%DT4UY__< +ikTlf(M1fcR_#-9on^({Uf4GA(0`WVWAWscy;UI?>{iU63NJ@NaY%Qck{dAyLFRN@N3uB*nSA&Q~HsS +5y6r1t(&xHPW}|2vmBsfJjD+VLFCZL_`91lX(9Ow9R1oE3CRd|`ti-0Hfb_!fC%6(0<<+EerOncL*U= +EN$X)UYQyhC4irB=I3#LBWMp_`d`l$IqWN8S-Ra}w(`qq;j;2#q(8M{vK8ko&a;& +w$|gsQ9Rea2d-eg}Wj`dkzZiuG7>XA$y>#BEsC7nuz$m-F@qMX*7+85{5uADl(WDsnS2>fnEWD^|bms +BFHmz5b<))o}r8MJtC|!|M*Y@85z{j!`lS^&|qTMNLJ~O@*xH@HE7&uWPE5 +;a1iktW9sy!Yp8GIzEL4mju9$vq#q`{$^C)A(4dH_-V*;%`eDR~5#hc1Rr6M*Pel_E(yy8~i>!J@RrB +V&FsIy*8+?iciNe1}p3A8LYLw-2S#ULZu5LL+k>^H_9xddN`Q{;R+2iHe1KFaKaJIq{%C;;FXPcj$&m +K5HG6nT>L%-xK_KYMm%%=O(Pe09`d+s^5di83ycI{fWe*JnOE4=;o+d>|E@4fegtnhi^%j`LlH#U>3u +y^lX_Q@xo2-)E5neW({GiTV@vu9apX({{p=bzbc7tRaW;P>BuXVMRyVxjxfX(2?*m8c7y~)qf_+6%oPXl5!&FHgeuwB-L;`gTbCW;?P@h4F +H85I99iocrTzeVv6QvAws?mu$Mf8><^t#V3BxesXBvZYwMY9X|sEt_}f-n~0aA-6QPY}veJ+xy!1Hfn +Sa@mY&@ojY{s)S-K0U&Fl(>Ahv!_MJLW*v7tXy8CzcXRX@Z*SUM^`rR8-fJO})-qWgWhtAy_)bD(c>| +iu@zOTDp@6(y$+zef@g%{HcAl?QplY75P$>*7Q#K`?qS^sl9*q?*90Ii1NSB-`~&QzpcNZuN7TbLv7nuTB*x1FxDSR +IIRq|DeE<=FbI#05^W^?5ROZDNCYv~+0Wj_rEKZ&Qh}$O>wm@dSC%S(FSbxLYtyC;3Kf9Q;yTu=SC4u +YVStrNN|=(Mo~DPGg%{#z+;H{{8!%8jZ%kfB*j7Wty7H>0nC=%HhwHAL<$d^Bo;Kc5F{~lvShKjN5#|gbBgD>7wVmzx +?vc$7vqTckkZKfBf-BPU9*6;)^e!pyJKu6bBkSZAdBXYs#y@ggT#W_kPe?R!xfF8%4JpLk(mp}U+9A3n^#`syozC)J +O@9nYsuo#J1A{k3=pO$w0ABksg=mo8kmP)>YzjnZ`e@y8$hx8Hud`1$9bzx)07-+xDWT}3#e^9gEiy$ +FY;i2G;pCwU5axdHeq02&lPohShO6*`n>1*+4c0O9Ngs&hA}-2s0E|Kj4}B~*{?h$r$u!=62R1peTU6 +DLlHIyim$w0H-OXcN?i#r@c^V*=1NP#?IX-q3as=cA8468NJIsr_@*!;Kp^xcZ{^Yvf)5e`>?`{~7!* +U%t#~7!v&7r%#`b;9~&r|M=sN`TOs`&#BHi$;_e+qx?}H2M-<;0Nf88I3U`}@#DwEGiX2`0DeO|K^+0 +NZNGAEKEZkLC!F^@$a(hiET1SbJM4s2OZ}8fkT`J9v~X_a(*At&~Yc{?c +U>j=}FEjDk@g}8T_fQcLVTOK&cA_{z^MRI{?4LearcfsOQLd;9@D+GNp#yCkdUl}eo;}-9f1U^Y!6((}0N;bJt +J9&-0$v9neRpUJe|c7azRos)Kc78N(12@F3FqTw8lu1Bd^q7W^ea_+1`Tq1?uI^z`qU28C$%LS+Pow6 +t#mD@3IBHO+PV3k#(0eLH`NE)FUA9i#fj+G*I~)-=+3{KqT`?P54uPFZiF@+EU0vXmbi33N4@k<3Vk_1^m%ZZe0 ++<-*_a5ze+T0AR5+MCH%9`bN)~%(ct1d?wr(~(I-WIUD=*NgVLTsgVLVSCv|>bBy*)Y{%B_yUr5e!18 +7j7Ivq8&5rr09+jIKzx90ZaZ#*2tUztrb%pAafFZ+pq`G-V9Jkc=WN1{R1o+IV<9CA$Rllputjn7J-) +QMzlb|{1~fqCQD}i1##%)#gCE9Q$PBpN%k9gz&F{({R%>OujuSKtlYfV)Bq`hN8HnAf1+#8`!~4cD% +PefYaX!`Auz_~yAmd=t@7y*)ogebVyu5WZykAigLil-s9;@|?sl?zBC~zy0!vpg}ETbdzO_+VH3TUhq +HRvlMs(FWi9>@J4$8-b$UIk5|jb7=J+{_`i73K)#b`c!y}%GLLAWwt)5w8eWuXSSi!63^b$;;*TX04M +|~qeqy+w0T=qDekvKG*9SH8Kl%)eVUQyL8#iv`uf6sfhg_t9x=!k9C)clE=SQAT;6?Ta_>Kic1GR;>i +H3j5?HPU2TH8Rr+A@%@$O`69W|;WnX(8N6G(1W)EF>D{5e>Mi%NUc7)!hF8f8qtf|HRjMpykm=ALW}i +Z4&g{4jl?Di0eA~Hs6!?052pO-X|JFdnOvtCn@cD4fRQ@EW!MlEE9i%Xjn=#EG8QAiH{bT#lcOYPYO} +V7;l%>-2VfAh5v(sf;s{R;J0YeA~y}y>8OjA>(?vz>7r-(2TMZvZhIg8zTBSQQnlyxG7ZnkH2j13XzB +D2?nsenz$Ii18lQ&~to~7qzaO!iuNJ6t8h@9M8Z|01BO~KO;EMK$HZXtwd_jYnziw40xT8%~pJUZ@eY +y7yw~T@ITp+jSYFC}|5Aa9b4;?xb^}t_wi{y@qELE4IJZgc6K(mTCIG^k|m;DfAh^ZqThimR1+=08)F0dD#${RM=>A3h4y^- +B^$5!gXSCSX1d$6B4ezS+w(GN3%A05$BrEal6A%?_;>BvwRcidQbuB8Vkz~bq8?s+@kKsziIHAyiISgn(e+oXtScp9KI>Y#>!K-*9QXi%U!EdcP8k~aF*k5^COJMv95K1(tN#^=}Oh4SrBOyggFw2fc>{r6*3-?y!QSg~RS&&$iZ +xP19?zHs5f-yeMNL7tYDCd!@Wm4cT*1KI`X1a6?CIxWyaU>pYDV~j>yfj$EBNVq{pLfwIu8ZILL>bEG +PKdb*iWNN!>va+(id*qQvZUE1?xHti5(+Umu-FF|KHEWir2aFktZbzX5_yT`L=Zm=k?r0BaBWMrR+dI +Z=_1pvVXZ9!cZ)jWKf8wRJ3l=Q+4DB>BGLp}oJ6F^LXaN3$1`Xol#*Gv1r~}ZT0BBI=y_kzZz6Rd|Pu +#&npiRwNkf{)!`jUV6`T6zUvSrKTm_z&({K1<5@DlXRa06b@IooVD(SAciL%GRh;@!G+6ZHUp#Hmh4O +}wSF4do6#LVp0hLVt|9Q}i2z6PDXK?w5HuttB=F(GhYQ|X +zka>IA7za)$20IoJ3#*fcgUvTAIREh2WSIm6G#_*FyVfK(#dPyyt#?${l&d|_qv$0=Hq?4_#7V-f#ylsBg4c;!`0@q^GBgzLna#7~jy>fWH+!L_0vcM4f<7Pz +UIf)$$OYkuK^8^?~u6=*1U?=r=uY6L&ZMYF<_Iu$s4l8|VTLp)EZ2*khdfEHO^2FW{yC;-H^FUxW+%g +ESJtmT5yMsed5H4{F!H-5&W$#cLfj*yaZmyJH`OuuB?xcT)X;Tz+K?4p8wL +=vlM)ZF$i=h`hN5u=<6^Zsp&x3ZriqvKl|*nf}fQ(3;^AVZXR+I-oZ1<`T_NsFKe~he+73p{_1g2EyJ +i~o4V=*ux8B~5g&9RJZJ;H;4So>phdx*uGxRTnLa&Qn>xL*2j)^`NZDq0 +Z13VJ!h`P@o04Qyzb%pQ#gnwf;w$OVw2;knbV?;2rC70Pq&>`}XY<{VvJ??G^kE{Lv1GAJ_klxC{K%` +cLX7-1;BTfUy(u3;I9s0mdVYohW0>IZ^hg2SvY&dcZsSeDt;G$7oI=)-{OczZ-XfKX|t;KCg}6)qN5C +6}<(@88m{|iH~lOjNqcW!noSW~ +$o?;|)!aJkxi5${-0sjd&K?LuD7N%jq(F+b95Hjg5CKaBc(Y{SO3GsxV{n2Jx4_BZ96&pgBV&@ZGlHt +2$}rf`2T=Mz8S{EOcNE_LAmT3dN~dOkpNyBXA`%h8{a%=tU@wpRfNV~y=r`C|@1bI=T$FQh8-d(3l@FXU*Hi8AMb+@!v+UiRRR(t01(%C?l%q`Ihbov+3ZB7g +PXhw6JCP$n3^emQr7zif{cdd#J=4sgmZoX7tpt((T2k=A{c{R3)##QG4{8T-@y^Qt`A24f1%UlT~qja +Bc%K>b4o1}+$X-d~w6bYRd2Lnp7~519OuwC;)ZHo=d_rL{J!@qiz(MuoLbtP_s^NJKrLb279>+iq?*JgQr +V%tgm2gLacGg`OixnEbQ7ps@ +6YbGKa&Fuxiz+ShPjV_aUEyZs3A4!2Q#8DPr9a>s8RJz9#FoUy#=q&?c}xg0;e2bC|mfaH;!ftlg^lA +8qU5hab+M{y$Y&AHci-b32p?`W}?UCD&K{!zZG}Isx?4n`Qm_dR3diI+IggC(Ds>z$N&R@|{R<@=DeA +uguTT4k7ca*ICqScPOV@tr;EL^G~tHg0;Fl!ePF=)~LE}>i>|x)9Flj{`u!)u{H#G9C#@6YGvOb@IYC +hKY|}Ftlz%zaAljQi62$GR%8DU8GG*Bxfzc=_EdjS-Fd~wcT{?=1jy!7lz& +TEl>1`Zq;Xfm1RfR6d|=VwltGG%{2KmeaUeY(&CFI~D+=q{AG56T>Ol)tjK5#>>ROvZ&YDcq;TTXo8R +UAuN2OYL6F12NWPT?T7QBxmsn6DA0{YtuDXuN!3?SN2v?^4RxW_Xqw|{>Yo;kDsuX2)%JcM1;`40*4t +hW{7e}f1s?9C_JF(kQIKQaiStEEo~a{ayH3G_^=yu{#(td+Mukc?3X1cC-1`=4|Mcn$ByNw3#_lvxa? +jpK)EY?sO%9@?le~YLFM@frS$^M&wpXkCmXlA+9*1HqygCu?AWoF{$$=Ff8;}bjp+Yt!b6dP-+c2;zIyd)p({q;2%VF%ruY~07WpF|W&8y +%fnG%hN83}@C4mEY3~LUD+r2SMzq$e>*x*^fT!DP|uq;ZwCMULS^A#lK$kcUij9;_b&q4*RA +@uTCa*WxxuG2RldCi-0GWM^|!n3cua!o_E-MIce}<~@ucyvO>KU}kD)KT@WPfCUwrX0^-;fW*s$RrFT +M0qm40W_rcLK5jm%eHeO0(q7~Q&c>mt^yS+nc)*IyU)sf=N$XKK@5sN-Wjt*EF7de&={#wp^zOK69f8 +-rippgBm)*U~v^Wx<4B +q&e{R-)RJz3G+wHUols}TqS_!N-GI3thHiJ4&1^2$oG}`5kkh +fNOQ2~E=g%%E{?eu=6;y>Vcyw?=ADpXAX5Qv^jo+vhk?BK_ER%N8tSX`nxxZ#9szSUlppE|W00~3_5D +Y~g}eoM53(L)O~|^KZ){rS5NTk}F_iE?{f!?#UaWJY4?{Ve+Pju-%N-!*laSpZw`1ObxzjxJ5RpgBcb +spea(V8#=Y%|nJtA0FLtTPjs>|X>iZ%C`b%o|r@Br +-=M7DfJKDLthU*MO}^_JzA70`f1eVw|idXZ!H`m_J6LPJ&b?&-ph!;Rf)fA*DfKeDf@BIZ$suneV{*8 +OMtqiOVP{Mf2V1T=Zc{8KYS6F+3#Wf8q5{oz3Tk~MBGYrcCu(qaUuu6m?f~7T2Iiy +k8S@V)Z8ikcLZ`MB{JKLN-C2fvzc6wSy_JDRaOGdx!smbQ_gzT>ADN`+(*_lb!u2VD9`z2(jcbnOxoi +RNjBPGe4ZH+ZsvQsiM2DIzZEuh`NhV_lc{#J`ETbw|0o2dm#@hE1td8*BlVx1$ulZ(YX!$!H76QeCDG +gH#c)6Cg!PqlZrI0TLm8E&3wPBW(AcR;&@?1+q+nbXadc1BxD$W$DqFrZyhLRz-D-N63;ue~dc&a$|| +AF}1JNQATrsK>Affl@N>Z13EedG90=*$faZ*Z{FaKukrzQzKH0N-V`_QKCde8zI;fkpcojKn2SZH6n{ +*!7X4=!6>VgC1oj{FWUCB=lHLGdQR@2_nRNz%$+;WeV%#Gyys5(5B&MxgQx%S=r;X7e6{KSnzV1*^nb +<^b24)>v$6&c8{g0;h|E?Vu;X0pZZAc~=O=ghC$Qtqn*-MrNZD@Bop59Go(xtSDzC|z4E7;Xcvi +@uoo5mhvmF#V{ogHJ%c`A>1HXqHW@dx=+yqquQtNCXB7XOGJ;)l5tH;H0#Sey~bGLlcrO8Kt5AX|p*! +meQy{w#bnToJwzHdj&=t7lXn7z%g53^)sG_3L_v9%zP}31+G(wGb6VQ=t(G>s}cgbt?*=_>jJ`#oF24z +Z)`9ET#Na)EqPzAtOT_NucQt8P>rN)s^fAh0nj6f6=225-m +Ya2En>l8#wWIB1yU(7p{iD^<`_TZr32(!D@kx9RU%*#!Hy*>YcoAE^AS#wYS +Qyp`xJn3yE)78}GC@sZdk4tms_6b<5%XerzKnRb?4WgjV}kr{G;93pe%NI6F4%c=6W@^^BcoG&ZnALV +knTD~f4T*pfCFj+(dWNuN$M9 +%6hR3HiC_2<9#MR$39{Gd<^G`^DT!OZyn^|wZHdCS=*bhI)Z?VAL6VHeISWNlH5HfP;AB%1w>$V@DKgECw4tpud*%CO;(s5d=u&Ib$064fzAvNRE@_U@d +)|Rj>}83&!vT{3ZShujacv1N0Ij#gn33tnq8wL58wpm=aD>Gt_FeL0wb{&=I;rKRBi@>DH#b>1a~SER +WO0W~b?5ds<<&9b@x-F1}=|>=wJt?za1F>!?H2C91|O_p;mK4!FO@=QcCeSmU%6Ng=spIvL8Q`pntIj +_pJMq+vs+E +H&SUVme4G|Zpl6xOM}|rRB+yBZUSvb6DiQK^nN;vme4u0l$O!?w47GZZ|DhniZ*x_9mgj7XwPM3Y(6V +z8`)Q^vuDsAJk4hV@!L$rEuZc4p_G^L`FyK5Ct|Xt>?Gr!cayZy^Qp2*zAjJ8bFx|3Dr_Hi3{%5m&!n +Ycit438g=&DRQm?CO^?^F0&Z`(C!&JBj?t^(y1)Je*_z-I0D4d4#&{DV6Khjs~Yjr;j8udVZqt4UM=v +5y1!#xw`+0}Nvt+wZFr|5;Kndh)-T;uk|<6RMp#ScU!sSF;V!`OrDDYloLW>5NcKf)(^B&`&O#0jxf4 +h<)TPlTsEKQVQKxz2tN{TQ#q@o_F(8Ed@FdH`ANG5#8TgKqI!vyJYg!&x4?ht2crca|0NgFHcW6aB?) +Vud&>7RhBY$E(J@Fiy|V3-pW8;do!08fz8DdXis~r^q@|LEDNBqLWA#SBh&ychO52F-(jVv&5gpZt;z +1BX9A{u|U2izmiGeH69CN!U4;n-rx+>0T +2KMUm&uVy`}x9w+fa$nit#UZfv+gjA6h!H(c4ORj!BY>$tNn%VoO}E-$_wC%!8@ata%;#4T|(uHMD>s +PXtFkTf!gOdtiMge)O7q@E-MNdXCLkn6{qA5;dLg1R6^Q)vdxqxrPR>wbmjoH`ow{GGw_*_|ww*esS5 +{~Cb!-c%a&1p*utSjd1Z7zEjn10%fZ+2>Li__uhOZyhfdRdHPKuvZFPpu(t~ui&e0=uuE%Y@o}d +f#o%$|asHf{9JyXxpCA!|{bb{xVG?Q&|O`gg3dx`?j=5^7RQGIkIO2BrQ=yww-con8%4@~nKuFzrzX5 +k>r#vB}hxp)^A;&d#+nK%nea1NGY8UFYCN|QBNlQmhBHQE1z{R2=-0|XQR000O8B@~!Wwgsenv%&xX0 +FVIy8vp)xduG7+fZEII;tF3jZwY4OmVnQGbi-bLZN)(qnKG1-WOxWJ +`VX@!u|35xt-n;v~=bn4Ed+vS3_pTPqf*@Gn&oBg`Uf}<{!vFrS3;qUP^9Im(5)G@KV +>3%Eun6eBcpR`2&wW`k3N+aDl5*ebn{vqb}c!yIqewHh;n7tgLi*ypA^?Tzw{LKKEAQ@5$ndwnWM@whmA-mCCZwn>LBIX{m}5avy;od1CGfFQhZBd=4)hriFx&*z2 +zlX*6w1_DAZba*H{N186o*D!er&&b9IV-+&7GZ*FaPOe;9Sq|?ECIB1ZE_mL2seB6-KL#1Sh{OOZHiq +Xe$~X1UVa1|rLc3&L8Q55uwgkRWVr+PYN^m$_|nSaI9$k+mZ(V!a{{+ +99W8axCv)khBFOQ_qO&+XJMHzA^}#ZIwd}N;a_?*I~X7C66f}`t}Em#y}2a_7$Ab+hwA-^JUT`lQL*u ++vu9x#M-fAJ5D*g!tI(R&6H+Iv!#1vas=A-21zs+v3j7B(AUqWLe-JtTz}r@!SI4yIy6HNB(gQs0BJ7 +BB0k?p+s_$>Odt=8F(q#&eR&i@sW_MZY$SgPmUl^!^=BYk$dE+&j6bh|?4v73;TW*k3b#oj`=ojcz#~ +Am(JO|rr%c)@Wp#JpK*vHqI3>I$A$}Vg;X +XTOVZ*eSrt^Rx@Z#6N-eK<_7gTWG78*^T3RnXcUk+K}4*zv}#qKH~BuL?bkla5uPDuPqpo@7s^V$r@*9UPz +{hiX<)oipKGC-qb-2fKY!pMr@_|HLvl`^P$g}Vf^scDRs=qUiwh$F2R;CAzA!>BIq5_0=jm#D^Y0Cnm%3sU}(9RfW#|N{x5HYnB;Nc5rr^_bD>N~(OY@Xo=$6rge&Cuyli4fv?i +QyQ}>zvO!zOC0VAQ9r5_5(3b;^5*qp}hxbEE08@d<~^$$FQXqAfve2F0+hAZbS +0J+v1g{EQn%?j<7aq5*7nr9r(bhd}F9_-Rxn4G9dYf +i!L^<{KJ$DtC;cqL?n9$>#2Ob799jKIRW2r*(^D?MXpk(pSVSZA()0epeWzC;esVFU-r$zs4j(t^wss +q0*z2e5)mVYU~-WG?}xy4=NCDlT+0Tj=Vjq{Ohqj41i?KA@rF0LB#s`HD3%Do9t-WusB{v{rtjn}MWZ1tDDEmL4__^kpdRtG$BJw4BpH(nR*Ijh+<*AK4CzWn!GXeX_St$~e`HoR +(q2L)~nu=dUP{L1ricq?+$8Q4n{@UOH7|ph#!)4|u533hmbMd<0*1b4lfLs6ZdcK{r@T%rv5N8UpT1C +~+At@p-(&iIaULItN}{0;vI@#P(o#zS~Pv&m>^>QFk0>6g&QplPJX~ZZCsJH>4lw=J0qPQt}!CTAKl4 +U4Wd8l%!M~e+yQz+_NJXkua8p&q7!>+Jfdr9ur_W`o};p5Gk{z!Hm#xDU1TNBsvk3#9wZNw&?_DE(n0 +m4+2%n4MwuCpFw14yI>GVsyH{MFEReQoqB;jY(;toe2xw|%LB=O6&2#x8YVBxo~)lcO@cZ|Zfvwy^fV +fVn(|$f+}LK1N+8YklQ|Ql5F}*awSLmcC0u{rQHgAlLv7+O8vwAw={IA6{tLrU*m??H^BSU{L<%g=PL +@ac2m&zESMkt?)H0gWL%^XDTryeoHCBfcIpYVAbFw;){yJGL04OsqPq^r47pPOK^BVNAAXfWfL37z~h +Z8fz5T?ymd~HD*P>ORo4!dy_gH72G@N}TlE1Io(;+%S!)DzGa8_$QH##VFivX7sjA9 +Z4U_P9oqbz^r-@U7m@)&XRX3pQ5Y;^Sy(ff;kKVQn>sDkOrs0J635!u+Lcq@Q+dn!B~O0#~wST_(!ii>^+Pz1up0%BbUJ&aI|vo|c2j-{+vYAettv92kn(U%X +B5RfOBrCjY#2$Qp1R0WO|M_IB0WFC-QrLrczrt<({cLvG+0_!TE`sy-(f%0U0{Gn4`0BF(l;Wet +Ix2C#|=0*$OWHhuUP(-wWve_LU|!Q!c9Kfxt2bJ6e4$yczh`g76|)&p{@T`EXh6Z^xJ}#O|vLtU0-Wg +#&S6_vSIOo~6G|pB#llMyfy`OTNmaSszSyK`wf4G7@D>)To(y&DClk`_@gONoeA0f>`rQOv1ZExg3>N +j|MT_>S+>#O>%kbI^^qNs{^u7;U+|CYxGv8fvN6D3E=mZaCU44Bp$wzC2ox;rqz!`YW6sj^Y4My_vAkx1v5K +=t*D{lcH(1uN8=yOX8ieny%dQmH{Rm3sZ0^^mp6CS~iq5?m*I{EW +RQCc@hs|b*>nfchv>ly_iP)eq;VIr0uBXiWK?=-GBP;>+M4+dGDXfi6TfMWGkccWOsD;1}=fIzuFNar +pgW&}rV_I*)uH|h4{Saiq?qZ}>$K%{(7~SUV<1Rmd_vm9V7xXW;ATw^ROa(zHPd^YKeu2nCVcpG?K*# +`AzYaAjA98w>0bF!26bP1g0&d+(pTsJ!;#EHCL{=09x+|a{jKnL85wA2PUKPkkm|UNyb^>n($rKQ4Yr +u12=@4w0UV~MkfE%3yXcTIA`XSUWr*_Ic$7C&*Qdv432&i4I?nQIJvTNmtB+8z~W$AK#m%;wQ{B?Fw3 +l1lz6Xm^JkR+8WThg{}g#|E#?mdk%RScPv*dl!VF-}X1T{oj-6f#sheRFtXu|}^!Oa@5AK>z@WLt#G3 +J1YPRnT3o93=SfP--~47r&G`bpl8wr!;?UfBQv_H3$QKKN>_qDfs#`(Owl%a8pUD)Ge}?t3CtjY8H_B +jqX}jXx4GHk=7?UjNO1PiPTz%Eko&s02u8mG8LMgqXtb9iFjGx^P&M37m8!$l +h|M`^2qFXmpXudu}Gyzzhw9dDdEuK+lPwr}gnGW$m1y*g^lw+le+W_buGm1{wd-FJo-kF9YPGfcVy-o +@vfZW*pI#R3Dk))>EamXo&YgcjtkYE7p`kay*x`4w;g2f3SR+%^&JkO2k@J`2(JBeB#uTe)3_^(HTox34AT9iG2o$<3;h5V7YxJm_2Zz +&Zt#=iQqM6R2<|2yIT`5b^5q=Y)A7~wwO^ce9I8i*ehg=I1T^W7HwXF{$YQ$OXH3&#hO!8#at@6?ZXg +O#uGrL>_0?zYdU==tv0l$xKT?W?JqHhUdAs)E*$m7#%tlB%dO(%tK_k53vGgM;#|4A4w0A4S751P +1yG3Lz5Wv?;)^quffIjDX0~z8Eyv2hs7Y%qeXNpz2huj(~#pHGzF0sJ%yv37dfqr@=HmO%m;CX3E#~A +2D%KarDC+=ZIHFi2K5?DkjPKUekCvl*%l0YVH~pSZd?t>!_ef`4b>-f4kvwbNV2bK@Cw)&J;a%PQs)R +p=DX+7%dr35)0|#0^kac*N;k@U#;($0=adO@c{}48z1CpFy8Q-|pnW!0UbM3`U>@2E?C_Ccz@Z1h%lu +(zx(8Ly`Wj^Fo|^xRIst1LiM2RDPyk^+&aIJC2h5ob-BNy)GK79OIN8_x;8pw3fCYOMv!%#Lxr)hFW( +i{kuI)4rFc5?vvJYS@20+=t$m2-DnvrAUI!0l+0$^!lJhdLTJ;k~M6`ocVl@otGl1vCK1bh$(zO +j|(*vTfiHWF})+yrb+!bfhPI^_}km~FlpYBB_oqihxp0Xj|U1`zEZJ@S+cJ7NzHPP +*N<2;2LmhU8YJ9{?RAiJ8Lv(!eKqhsNncmP$N$ukM$+nh!A?hR&T3bI}3O;V(5Kt$>G*=$vSK%gh-=~ +emZYKpN*23gKyt~>^KGKy@9f;cSH>|B0~*4PuhjNS`Nr+b4*ticUp?4g>LcQpEE2;@9vFD6Hd$qDmQw +m{=KtE7D~b~>?i6)!qkDs}s;(AtW`C{pME7=@=<9nVy_?XtNw(TNt;iN?xfJw;C3NY#sQgJdt-CidLL +C}Qnipg&An2CguuyU1x%GB7iU2_&YN$y08S*;Za>5^jgqS<4m$>doni_-;7QLWf2>pckc#Sus`>=ZAK +rm$rm%(T@N)=o4ac!cs*xVfsjV{YfNNux`?zXPi2rxtrSp;?n7m~P+ +_6}6k(wj#$Cd9GGgQvf4M2*H{zOVOq)@W?;A5`nQT@@`-|0?iBb+%e??^`>kOp+z(-g(tl+n`*AD0f*5f*^uw#9 +Y7aOCy^B70EWV;|FcK^JD~Qtf_FK{McG!+-eeu0$JGXwh-7pkO-a$QIF1I?`*=E&Fh?C8Y)%oZ`qaI$ +Hfrj(~*{OEq9n|Vkyc_uVfPxod0vddqph_Cy171v*nQnGuAd1s50~$$(rNec-P7pfD2{Gr(=AsYsbz-Std9rdX5HKm*yc*>5Hy4M+@;Lo +F%!*PxJA6SUJ$q~7}_im6iIIJx$~K^8uTq0lXCIRi*FNwsnibU^?*zoM11$58~Gpi^&tVVsb5!ECKRFesNAuG5It|zLrV!)e13m6lqWSkK{mjdTVjG2*liG&rPCMjpW-5@ +Goo0Bt@~Hr%QbHRme(;&fvTDdnQm=1hM89_y)4q2&A!~;ReW_fVstJN8TTXw5OHol|uQ_M>^GsvR1g^ +YP2woff28TH>%vrH@wzy;B7M;e}-r>-6FC5c2?JR`m_ySVQR_UmSA}?1L;JJm>4kc3nEe67T;-d1Dxn +HkR4Pit;vofsY5}iz`%W(=s)4Tm`JX?qyD_3#W^jnx)e{|&Vu2O-ylb3*oXvUYp6^kCU`uaX@L6CX!i +_X>eRmgRm9vtf-QESi>YLBOQvr2kto7VCZBk2S~^QMn&igA7TJ7=6oCTVRawBHw)9$m=%`}#d2*C%@x +`;~j51O42EbDn9$f1AW?thX}&*mAP52Sp`YyalTSc0zB#$6>ruMJIx~m87JER+)nb*(crCU}8BQmqCW-JmE0gDo +QqXb43`;3XBIl%xF5ULQ02AsiDOjIG+WD5NSknZtpmNomK&n~Ss`cLe%oEBFrJU_z%?@lTnxRZH+LT+ +gs8hK@i>50hv|fw)oFB@B{wAQV-L7r7M_<9>>%L8kBKCQ^TR>ey4AZuIqpMi14t)hgr>Ku>U!BvwJfm +$-5!Zc_rZ0ht)CZvwDZ|jqwdhP`h87*DOo1k^!nTKNy{TeoB;ZI-ivSBzy%Aa&s2BKQwsZWXRb1CSP| +v|oHVb_-P|uF%%!HhxE{f~E%3Nxd$X?w75&gEC#gGN6^`oIOMobNM*-Ll(m-Wx|36au`;fVgG1fSOv{pg@!i +4!w!EFxv>Gn*(E5QEN3#wCGa~gTju5+j7&GtzfC}4%s^wGr|^&YpuI+pVE@Z|fb2dx5$)Dfx&);{2Cb +so>(ta)Jzl3!1v3_mOgpQ^?91$t8Fsqd&CNFdWMg;SfCb6W;~?o)Mp0PH9zPK+?3VAa4m9DlL()D-(y +cOLo6!<|0tUIZ6qm(M*#2BA^CPo3YAWfuk6etiVIrPM;n}jtQe2oYU(Hd#rbkL>jt|? +XzJ4&W}zh|@`l@vw%F<;U2KcgT8kcG=cwBU{{s6Zg1^%@|&OaN(5o9|vCASNiFFV;VgEe^bjldUC +k#BY})#dhxIgUs7-Ji$it3Tnb^w>`iN8}z_G`Of4`aR(rR8}Sh|5{A+J5}nb|LlOcLvBqK)+JkNvF!S +F+Nqw|TLN@GgIK*pCgkEJc%R(^3C4exB9QIckj{R$p0h5^FXjvn$0mz2qoi%KB>>)$V)J_{9AZ?*urg +TJb@N(W(`e`Rxcz^Fk=m1#;KD0C!Npjg-Zoity$>+M^z^$c-Y@)x%jTgtC{}Ycx3;{t%HYVJ<=90ceY +%`ri0YQE>&;;<_A3%}zILJq9P$S%uuxW2Ya9tKektP_P3EZ#!LUozVvrN$Yj=8ViZ!pUiTQHLKW()~@fb8%^yf#m|l4CRk%u +=hcu!%LSLvuHCUt?~HhU1^_FcGpblY3}hX*hlbF;h~Pj)W_OQS}Cj2Y8upC+H)^+<6IKtIpv(a!N?z$FwdhqvV%Fz +Qn%Tp45%7lU*$_btPg}>iej%C;F4DPY=>*B5mv&|X*sPXP@+Jf|tC-@EAF)0v$p;cfCXa4= +}qzY87O<+t?JAF=_&|>|Sjcb^Oq +Zarb-%`B0|CXZe*G`{R2e()kCv(n5&bV7UeMTLMT)@?0Es3WQuSI`1xi1O*)m~ziFgF|TeGHb)_&y`w +<+N5GkFOTQCUTqxP^CIZV(6KLwmH)o!-x(`L5e&n8{KHP$V3m2P11YVU_riEb2)DDnYRYaM}U6kYQ5I +VXthDlf=pjyhNNmE%HDgJlCa%y{Ov8i{=O8rsNf7Z$}cr36U8<8;u_iH>0Rc?*$#EylnouKO1A{ey8}5})sxV%lzgYUOOD(&X6-qspvqND&;$sYx93#Qmz)) +3=-E!CQtja5wO6o%a&G|CG&2{X2RHF^Hxv$<417&BY%XtJ)kw%ip?Jda*n9)0^F*<#i3zOLE-z>0y@# +RSxSbnT^;!@AKJToXz%i&y^BK&=IjMzVpJK|Cf1UB&=)P&_K&*^2AG1C6z;3tfh}`^U^_O +$-645xT7zFi$3KTv?A40Dy4PiI%Y1`|)L8Fk+qgu3?}or=7B{bjanK#X8?~ +dxaFPkrxI`Koa%O$UaQ3K82{UatLHuGKD8@S3>4wK8buc{e=JQH(NftqBr=%2u +1UVH+3ZNnjD%{!48(vvtb;p`bK(F}c-hQnOvXfZ>*9N>`Fg&99m(4C3i0eR_&ZWJ?6`qQm>0K9L}pYy +-knL#Gf3SYq!bL!Bws2|b+D5_Y0Hj)!2=9DzCsmn0Qq}p!cf}NRB(`wiGLFf6w-2TCcR4Ub{vX$gOtA +kun(xqg`#E$!qkOPFnxND!u@;q<#+MkWyX7lS<-p;vJ%~k$MODcPV~=bs-4FWweeyfyXuK7Wj{9hgdEBG9Ue*YG%AnCL`!u3 +0WDup%Va`$@7t7NT7jSrqD%MS;v!fBJzR#>5a;{Rli0hK82L18Y$_z?V?=cni7Oq +z^UDzR0iy;v+v&;OEUv`FgJ1F>RznZ)_fn?dS?iG@0V^J{FERW6!h#=u93sAz& +6v#fat}LI5q%*Hz6QtH=}QL#QF~4X3*0PYwu=uGOmg3P;teD*GoTU6WNiFW&Q=kNO2}*nSu0umi__;^ +_;bAzi8D^6lfx7Q%0)>%DHql^F-<386F_!gn4tfS>!z??N!H^hQN1&iEW?ol`m~lc +A0n7@XY|*D`*hei>YZXPg4X?wC<;}-gsR~KcA-TY&5i(7<1p~8xmtloQFC<IxBz#l}k-cLzrB +qaS|Jk{0B712k|mX4!_&L6&rOR(6x=Y*25YfI2%8G8)W{~yhP>T3)Gc<{WcsWe+4?7wdw?JOdF2t{w5 +@xr)ALM*R>+Qn2?o-RPspHTx^WA8;*f2?-qz12C`ch)At8soHpHNgw1*yb?s!r638#d|C*Hk;@ybP^N +)_+%tH%#=vO?ngokQ*XgLo($wGv!L +>BQdk9di%ptJ_Q;H>mci2opqGvDmNY?cU@o>4r8qN9;t4u>+kqWy&CRO*C+tDz9JCuZ@JL9BRU7L^>- +Im75J5Lk0B;v2GUVMjuq5X2jgBt5yPS0^U{J6_@nIx()ggv98#@j=S(|UOItki* +(>e%($B>*7@yvA?AS9gTz%_W3lO1lj%c2YjjC$oak-_TA<&~HOzxUm{<)36$|`c+^EdX*J&F|=JcHtV +6MOqyoRcV=Veaj@kraPuQ3_RaEysZTF4fo{em+FWIwIL-P$dNWA2|B4Po1s(GNuo@b?V^@jX6|3z&mw +D@+X?n967TW*wup&>zp?;m6}o)PIp)V~f#`@5S>f0HjG55h=osYNTM_nryP?Q037J&sFp6D7&%(P|I- +K_m4Xuq!>FAC8OU*S7fblJ?`g`{Xn%NS^tK2`t+^*#2gO(&lqvT{Y(~^jPQzN8GnJfe44r0s`o;8S0V +cBU8RjS!!3gy=U`CO@Ek%X!}Zp`Ub;13 +uErx0NTuoUGOg@tCkltU)QX#ro(ePSSm~6UtBF@nA8un^EAbckH;a``14)shw}pqA>m!p88XkTFX*n@ +vYi!c4`UTB$%S9eQRSLy|U+AF6B@*UKNiQzP37t}n3)jXM}K-kT~WB!EP +_B+)Y^ibu!Ao&i5JyGV*++>^azUaS&DS7wLY)XFrXY~1ETON*j9`$#OdKsct`$L~AB8QG0C=vwK%Ui5 +-dO1*dLJvD=znwO*BW1t`e)uAyB`NFM_3-xF^nzVt-qz922Q;KJNwPt3a}D7gqH(VBm5S(@wR)?m4WP7fL)6Xt2~y6CS2JJDZU0)H4xp5 +}s3)-WzI0HO$(II|O8#M0V50f!rHW3=K6ggTrKYI2I2vR)lZ3@)X-SHXO76h@)QN{tDW;3Ti-m2tTV| +#n1jZ`YhmVY;+0*@Gw8y$!Ns_sKll`J`E%OJehSO1FDeLvK_lf(ElFD-hrG=@{X9C6O+k4di|VB*ZcW +bP%jj3cniC>8-_uv%h>p(Al_WSVjkl$!0;Tww{Sdm7j6M#cpqorhA8csF+s%}t(`Bn_+`!! +hNLSow1d6;RcGr-d8r5Lx(U$)el%FF5oI_J)^T`bYlUYH0fvCWh{!<~!Of`gbU%1i?Z`TOv%~P+%&@^9 +dWf7h$#sb=gQaN&a53dH#-fkjUK1itW6)5fp#hUAxz>f|lxW3S+7A$wYE7)*S7FvqUUlcgSpwqKOjQo +U+pzsPP%zBTw^k52y$3o)x)`m_mwXB(Nnt4yy@iE4D8kb6Pq=a|4>cMNO&g*n;dcO{*UEJ9=;`lYzqP +5sOyH?cdsU-U+Hr&QK7drU#ihwr7Z72)zaZY(a>h=pJLvq*ZiVnovCHky4NTXj!IJ>Hlws!eM=2_#+gfj~3ix7ZWPmQ682QD$<^Y}Tsc5!b* +vxZ0z|Qq(l8(yOOyF|%sLchLHS9(#NfIP_cI%?&6<`aGF>7RxTTSUl(0MqE>=WNehHPon`?d`?C|Da) +INJnXaIBH6|@h4=|;$^~l**40yN6Ef)+`#onQU8K+od@1iJ9+A|x;)N%)tTm~4OauYkjb1pvhgL`--u +2*%{DGoj&~r#4x+G3JB6*Iet^M{|$O^Rd^eHs|y?wl_l* +nt;$2ePLlkte626K5pP8MWbm>BRT^InpKgN5psRw)U +9rWUa_sd%fAC!bY)t?i2~}%>|&0eb~R&J_etiz<>LXHCNsqSkpfT;$Z#wCPTl_95!KcJ!CP8!6D16V5nacJJdMp +*D1sK_%jP?Ce8KBv-8HFzrGgc95>nCw~haFpN3Beg^IKbc|}~V=jH;=;JL6`aTlP>xL<~!$dzyVSdGu +w%y>fu-$>~EU1MC%MauEPpe6|U7OM=C<|{VLp!^t!c5!`t!{5-Zm-s7Fr8#}vMI`ww6i94Fuf5s!96X +?c%vDbck844p`+?B$dUrHID#iiqR(JA_7I1M)iLxls5S=G8coq9=-0v~$%FegP^;)W$LFeq-JFByJ}> +UAgH(rQj;3=TgA2#a4yr{aynGmlPj}wI06C*QV>79j%jM0SCN|5F%qmdzE77PD$!wLwAllFQB_pht8% +=l^P&@5j(Z=_&`z&$L32%I@$>mKbw`%T-k=P;fv_dqzH!i%bt;+#qUAAZ>YV)ddA41?a-SGHTv3WUqf3VJFn`GBEbmhu@Ex*rPZ+NCDteBW +{y9Ec+?eTtAc2(;x8+H6mrV~VaVA`ha4-(jya5A`ibfK}`l7r~0%aTYhI;Hjg|Ao|N32Qi?-7b%*EN9 +B6u@SJv9W97C%2YvM8#8w48{Sn(~(;qJe#m$O`3xN0*%R%DzuEhh0LC>cWyD~zY)(BO$xA^H)X53Oc; +jcaH?~sf=C_#5Cd7*~oml?$!%WX38x7Rv#JKltp*G3naxn;>hTJ(Vhb2_HhmR)X$e`tynokP#463)1n +CK-3)Ua#-rS&%0h!1G>s_f;_(0}(m!pp^ru)CfG#7TV7yIQj)Q--$JC>}97|)4(>Z+8-~b3qL}6{5BK +XZOZUa0TU#H+<$f=cNGGT$V@`DxFH!kr!J<~A;9v-i6ImysT)FJr~Wh@^%3)!cb1_;*ESz<#Vc#NL}e +(~H2cOH0@gSZ4>hVzdf*_dSIwjC@a7A<^eaORPfTo1W4W^Fx`Q}pc+OGJpl=>bPT7ZOB1? +c0HaD1A`y`AWb=aN27oW}cc{0D-hP0|j>q;A0yBs-KL67kxK%S$Xh9YOOBxx6(ven+6Z35cVe9e +nqA=w52EiKFpR|668Qi-cf)u}Ag5Il>x7D_VT&oCHKbG^PeM1CC|=lMukb_JDlE$Yw*i)X%Y{CafpQR +^JIE<=%pYodIs+9MSnoHX35NvvHCppv9+{00y`EfTpO3Vn_(4{4>U%!BW;P0f$10V}1fag5PSxG$RkG-9` +;$2LS)S3|Xi`RmpR#o~+QphM<2*%n?bCB|*c_hj1o;Bew9ap}))bI1{*Gsu)oWW7xfiz)2lfpN6r08rPTFKwrw-pr^rF-FOhjDcM}g@VuSmLw2^Wu^gu(W{5T4vMs +3T_EkQ2Zmmfl_CCW_JOTO>lH8){0~(3;&rl1b1{GTPFMkV+M%2mo*nSl3FYBI;jat+Vrqx}eB9qpY#IcAPy&8<5qRmqA65vS +6o0z#C#JS{Rb{$`=*&yWKL2N4)q&s-Azj?CH%aQ4ybTEYH%9K`?CO&XI8vbc477af;{#g!9mv4+w4#W +`4SXuW){u(F&SOmMhOaSm5Pf4nEj;kG}N;Bd?PbGRi*rgT@F!!4mDd*U1pordVtJ; +>prD1p-(_b?`>J=CAcE$`3d`s%|gR)BObo_nr8mpieWbGhs3*Sk5Fy9&76m5}io&gORQ?#JeucPHom? +%hc?*Z{P}I$|PP^7%A27|SJ!BK&(7oW^A7FTPwqEtfme4X<~2Gu6@m2?o-DZ~6{k`R-I&UjgR;Z7 +YVo!CQaw6}`BRQc?Pn!%{Wf3iBlCE>3k=BEPNJF3Ae7^K>Pi87M5*^tZ!0+HD!e`H>duhy44z+ZDzc`%UyDky*olsiKQmEzj;WI6Kz+1 +LO@Vpya=ssg=ua=$V+W0`CyGor5yFVG7`vCPehX$eM(Kk}hLCG%Rg8wGOEPq+oI7ClqTXMF@jsCEUOX +>XD}?cz^Xvjg8Rpt7y0vP4uI+T7d}Dxo +QcS)Hn45ttQ+DWX6e{BH;l4W>J*SKmYmgF3H*Zw3n3HtC*c9E$xUHYcMr+VRmktj^{3blBpNe-%>Q4s +=jpAyBk;M`t1DalnLyMoeGd9J?__rVP8$S)l4I%bcQLyqOB?AN?f68^tNf ++4zH0~Qo`B~QH3O4XYqL3B&jEyy;)3vIgT8jJAYdZYdJoj9h`8dd!RPT_$?-6zpyv@PKAQ>4Kp)$`Ni +T<2iar2g!G`Z6hy6KUR;`?85<@#u*hZXKgB$y@v8CHw1tOQx6n$HW`&R3scFOY1aOhp-V8~!>5Z9Qe= +D#N_kxYW}xws}{s<^(!gduj)d-8U~db~GC+hRmjsMTojY=An;H^}A=ea`vd@IX_wfY;iolof+knG-O< +Sl_h;+9|VoQS8lFQ%;9I1mM$iAP%AOoizLdz$*XeLGnn6l=I0B>LXi%^<&T`3Vi_0bcy +%FdTT?9!T`s4}pU~cQ-?2o+dJ{pNh5R?njfJ3%lT!^F|HoA&}SsjWOuZdmd??|+TsJhC(zhAH*QMPtw?#+4-v +Dlt0uUad@L-dr);WC3hxn4X!4d;I5pciRG9&l8_TL0TVoNxaVFAmt$B +s0|Z{Xi)4qsn`Ob3v7N9ruXzYN%Vb0n)DwSjz~4~SS!%$XSOCd5q+M$;u*oHbQT4kM^p3`=uJGbBeIw}d-+t+e=uVx@`9JUobpFo8@x+TdQ@g! +v4LFA2pfHzNJ#W%bX$*1BM{3EH>vi=RB2maBg+Ad=R%dprn7En<5)N_|mH!vOL?!<9Pd*Y5(ZjhuOk2VOb!q+L+0k|F35jN5I?vt*J|3v47sT+^uA#Pw}d` +<5v}s%3y#Pcf30v3}p4kJRmTdf9Jiw?L;tJDFMr +Mp=w;?#9Y249s_wcpT=v_I?jolb#7XHn!w^HS2;8;n#WTzY=gelv<7rVQqDC=3Sl$2`ozLN|fUT0&IT +kPKDqhr3T5PUqL&B=#4Q7z#Bryz_g8XOHE3xz#EIoqV?X>|f^kUW$ywvOYMn;aO=2t0K)9d@X-PnBTZ +cC&kYEDC^fSq{H#6n!3E&f$N3y=E%ZeIM6C9*RZp7l?E4M-(TOb?h-FTIOeOu%SB*ewioi?x4G<(tr* +Q%aW&4v6bF0@ZuY){tTnv`cV$IM+{JopS1DkxcKwac>LD +*b5;DQq_SsdJhluCYO(p^&z3Ti)T1fLPb9Ghowl`Dkyx{bX?lL{cc8_li8a~mn0mOKo_<>T>Y|Xn5Th8A}KMrUlRk7k18u9kFOPJCQQeJu`ZQ-M +gOs%2tjAkzA;555!45n{sVuNv)d!o#8XS2^;k}E~-JYMT_->J`#n713IdHoqW$o}LO1SLIjR~%q~3g`jXy~(A32z8U562 +2(`!6;s(j{uU`4i%Z{4%Xw@c3+69X^0=0O9vEl^wB4?3Bp>2!mn3JD;7VvEv65Lse*@{#ibUP!@I>#Z +i}&S7OcuAY=NE*9F7fZO=q=Mn*F39WIU0^KZ24WX +?V+}3thms}q6x1d086sxSdcVCrsis~f~Ql=&8U=Y(RZ`0z(@#d04D3pX##m4Z~X9wbg^c*iS2L>sPg2 +BHSE|Cs3MTqY|f3IhVH0#sp`x_Y7t@y>s~>;Ygkn^dWs59UtZlZ2TPW3r?sJ%gqHp?`XnXOe1TbAji3VO7^%4YLlw0z_dqq7=+@mx&>~V +UNw6naV>Uz(4;}0~uDikcEY&^@7%uKZ`NK;?;34ar +CK(px}Vce|0bNbAB!)-qjmX!03O=EZ|2#$%o&C%9ZfD7|kGOmZ>i?0<6CvRpl>M(}6W&I8(0$%3#-@g +M#hZku07<<9pFl&$;&VAH +OMC)56H&E8){0mwiEFkpc0}Kwf!pB#wjA6lTf*EYrBz$$`|QIIASn4(jgyTHOlD&IemK*9`)Be-30`UT|mj)^1fY)`&F3FW;iML4hzc|5)QI!8TDcG7s*!W-`-;lb0zlAWlV`3MSsp?>BD^)yWj1n#U` +)RoO^%MrS5Pj!R?vk-b{mgYBTd{saHSLas!n%3)|u?=s+WoE7DW12b{Ua+1 +%2e*L@&Mhpc{!bGueSFSdMWaK3as5RKq!z%&+VA_B;GC4^^s#jFaFon7K{-evh^w+2Je58U^E3mveZS +lP%HJ>*Da}`_e)Z9>JWQ5)6Cr#lud&c-YA=F2skuDKYH$RVo`NMtyAiwo$CJ%gifar+Pw$^c^wTXg%M +LpI{KS`o$+YI*6E$%VlBilfr;omVE`54pVA=7f1Y-d+i(qVgXmEx6qc$zdw%uoPx^RK +|M3)v1o%H*4ynFo2^PWl1!`d>bV9av$Fsz2o_yo~To-dTfO5Wh%;_bkCXJ@i|^^-cQT|MLA0Sf$yYH} +Vf~ku#`rW;1mXO?FzW5O0-5DPuqTL|Iu;;(JhsBhyUm^9^!&EA{Q+H&%zOPquJB>Gz=4pF*wp$t%2YV +GDf$clk6=VPuI(nJkxo!(f3vV`+QX0Te97HVDZcWU7u&n19oq=n*ZKH_MUHMeOrg??A;jG;)2$^jrLn +&xFex(VBZji}m4;g~Vy-@Aq-(^ZUoI6}f0t9lPi|tDzaD=B?kb8sCBUXg5FeaVdW|!*SqIw8g~_1OzJ +z#wvpu`V=_Tp2W*HIW6!ems1?&pLQXLa9cb7livZOOlRCg#Q;)|A)pSpfxE6m$9s;Nf`t6yf8a{?CizGiG7Qei` +k|BDR}gfZk>hp#Y4F5*w|~uO-3O6X7(Mp%+0vpIJMa~!X|)1nh8_#bR9R?rJQ$AirG&Rv_H<3@PZB}o +m|IBY-(MS;#YHuzrd4?u31axpvxZlPG-i<39BGV`wA$&Q5qnY6F~9v8O6T|+MWs{S&gyXzI>qg84%UN +?kd&?(!Z`rGQ8~uB&?s!E<_zg-(15x5K3mCgV*%iKxVcvr0;PXm*muBvR@eoFE+G|1?=?6Uo+!a&uMm +sF>FS&9DbcAeolhjv2Lo)XO}tVXv>`zbpr9a3h^o=#Zh<}J_Z(!!$(@7;QftBO{Jdkg0MAys6T$z1J7 +WxlPEJ5CC~d`^4=ie^}Y1ojVP10C5{t4#{{X>FR}UGTu`9c<;b%QY%{6Rj^_`KB*LE7r4~px2bg!2Sa +TO1lpvCgeHO@XLMepL?2dN@D9WQ&%{oMz71iPM*atXnI0v3po!wfFb-RJnV9+$d%=@NIEX@zfg2<%fE-RKfUvafj$x5$xDk3x{Y1Bp|TWcoF{OfOPqHmx +$(G^k(oC(=hXsVSOR-jY2B=mjsvl$VTLkX1WDA6 ++xUqYZks3d*sAD#xvC31XbYquqtl6w)hq@Ken2StR`Qub}yJ7}{F4PUEYS#idM}GC(N;fZQamZ>7)O%Y1)f6b;J2Rk%US#)bvs!_+gFnZ#(qI0gfwDf$D0xnW^DLO +gqPsDT$ae6Cmnn%fOIQ~$S%=^3Bk$0a%H|7#CN{nP7E`Y7Dmk~pu3q-|fbbv??NhGXVK+|IcN$xdPF2 +h3!NkQG!jC=BeTW2VUS!+i;@|9w0NSB|T1E&tk%F;?~*TUsWU2hl07*I0U|92t5{_Ux#XaTny{Ey<7V +-i2{X@+=&a^yd^1}NUR1{9E-8fhJkF__gT +tsxhG}@9)fyiHEtf9VDifc3$Sa=dIk%{t1@qa9r;E ++}wuajUO%auR4?$3uN{RTh0=V<};r3dJ=b@yM{o%E=A8IG|F;=6x_BXa@svR$pGD`aiZU|rSdaufi(8J3lim!AZZLnvOfC}PJA2vAwS$Rt~jSLz`y2L%LqY(A`-8=k&f ++Y*E&t{lRXoY`V{Wl@b4|mI^S8W`Uu)c^9<=fRT4P{s&k8<;+HFZk%vs-l^x#Nm8EicWtYEZn_>&Ej7 +fENJ4g6th45EcuY1MMfdHK^osC;Y*crpV6jB@ +Rv_tcmucewG4wk`bOV2@~PMPR~&xtMyexMZ^W+lH_iD-mp;PV-E32A(4+uO9+hy@-m9Daq>B{K^M%z0 +>3t@rNA1ca{27lwBk)JmdcA6m-_u3*iO+A)2T5dyj-M9R(@-zc%~&?vV_o(83 +$5bcc0RfPiHvNom={rQxu3(K;(a%u`({Voc)F8(p%0PXvvQmLd+6(iz58@64klc@RSI<}!&X +^Wtrdjs_Hq7&uU18*YSGsUNiZ_6GE7_-9VvLHnl7aP>PS=ygXkW6$qI2mhU1!km8v((<@l}OjBU&*yPuCZ=o`&w +^EziZZkx-zhn{*3&;Q^+@}s}A#FeWb&Wp=RteTBm|4TK-{a6iXY1h4mP$=#+9G1E4>+yf5hyISBLeC- +n_mXFmnkrRo_v!=ixU2u( +oB8rz>T#PBO~V}q_tid9s#}oU@Rcmqyumh9S^y_k +HvB*Kz6CDIqHBDX>vCNXP!!ZfF-cTVuuwEv+0|WK5*5=*1B69Lgmu|fEHCInFSzoCU9GIwO3Q9b`qUUjLG$i$~$FzKb;AYHSEc4`_Xb +;1kEG64GE-m}2J%bs@3d$!+OKEhUEeJq1%*?4jIeJ#9%uuj}`xMUt(l1Wut#zO6r(8@;{v|MplAN>3P +tylb|lh&3s>gzGIQHqLRnI}!%IEHJgZ)id5AwUeQwd!qmT7oWjKcv;xWO_DeV)qOCqWLcB4JdfIH*1n +luQ_4&z%T;2&C*+&fwWJ3Et*s}L%%g#$JJFKnt@U6*CN+nle)lUwoCNR{O9g-R{GXJ@l9qZh%p$ZST>$ +n?I!zmvEvT74#602#Mq2RfYz;wYds@2^`ucJjl-J;29m8$6h*d+7v>In(c%(p+;IEw%jg?4lPbf7PF( +6q_Wl1`wcaC>Dmb(a}4DX{8Fp7L7yGd!NOH^o_RyXeK<%$><%?^pZsJuO8`Bj#k9+o?;%97(>IpgW$N +70mx1@0!XjV+JQgiTEg%Scnl=-Dm#N&gAUi>X^{K|zQ9TFhy?TV&_My&JuM*!&NlKz;!SDixR@}%9y& +St&Y)IZ$Gf%eC&30UEGnCod(PWOd)+STivOU@##TPi+Z%YUkm>Xn}u*XhXG)< +C4+Jy4ANaQ`oxpbM#`;8PjX@qZ}8Lj*u=Ub;r;8cq6Il5DW5rzWNl+NvH}lY7oSBkum9i;2VZzzmEDTyL>cg}|ov0Ct8(Q$U*oq!hz$nMW@+te +Nh-nf2RsxMp^_s`c19de5OPU5;0^W~`;=(_rZe%xMGW#A{l)FuUNgeU?TvKXH_P;@8>mi=rU6LT(k&y +C~Ofj;6{(3|8aiPG}Gc0#OAlky~8SFa70w0pb7_nIj5e?mWQ;{Be2{T|O4li +l~k?p&~a!n7iqPTIrscn@c|d?Iw1^2&BO1li;L1A5zM+SsFtb&oNnv)q)^R_|@T4v(Aqt@rSS*_ax)Z +>x7REAnmNVHMoCRpqvN4|4$X@}NE*cs#Pc#nUpAA@1f-c$fHUX&^l!*@~wpar&3TTb7=WgfeIWIPL$6 +p84!2)z9Vpq>_-*DVU+&mg$Qd$&}h^RkI$CP1@AHt?1i9&rzyc^>~KzBPeWe3tF>u&97Fw_5yCiHNCb +=iEqwu4_`&N+BZeJwjQT@s0J*VTQJ716iOd|R-Rt5&qt33G4(dRZxDKggHsoTe&Oh+M86n3p^5&@=r5 +o@tC-k;zO8zCO7mIWS^-PYt?i(P#H?6Jc5-ufC#`O`_QO-Fb8qP0L0a*U)JL>~wAL0kmrkM`1b!ZlPL +et(!`VUB7CF+C5>DpqAaB+|#HEO<>>ssn2e!Bsa>fn{*W*!F@CCw!vSL(neRZ(qW7<8XVz>6v{(+Ido +b?a%MY(G?vHq!d=^s5W59!;1^le2y0sXKObOQP{qu+7#Yl3>w9>VUM8HE0{W~_s-n}e^^KX1^pvG86z +1)`+W#+Obm99YQ?EemfmBwX0R5T)=OLt=y{7!of$L=it>BlAcRsu-db)-WVPSjLcf!V-pL3waDF5N>5 +ik}!)QMnT7rG9hK9!*Z&S$Z))!O^9JQ<o2!*QMwf>t^Vs|p?r$7x9DxRc`ex)Dw@9N$YqGsE%SBz( +khoOOf-hNEsxc#GlqjYW8g;V2mhTN#e~HH1wJZ$*3q!|^6Vp`78Uoe<0n$8(}W0mG?r=lKjrQ_w;N!_ +jcGpuW>-^f~EHr?uvh49Bg*f|B7Wh=<3iX822p*D@SeRYC>BamSrd#&F!hCKNHe3Gr-(Z$Uhh;l~lzGQ1h_i3}GIk7sx* +;?WH6Ks=n`sOA#<87@bhFgytH-&Qa>BQ7wU8ms?;;W3CeF&uA{5%x1Y3GrPFNAr8a^92PG5jUOJs7@=+Uz +f*%N2HpqVkYA-#ONOw8;Si7$o +(#JOE^Sa$s*>kq)PBHF`pUCCkA{9n9n5U6AwPOF`roGlLS7Q%%?x|NdccU=HtzLwBVD%e9kRr(+&9C$ +b7zKK1T3SGoPc(rwn{1FrPik9TO0Ej$)qAE_cjC;HhMu_b+!$N#Gg6Jj<6m>CWw60rdm$<05`Aw?wL| +WJ2r%&UNz6`<(_!^tMCku??#AB(=&zrW5NbxIL0HXpbbYDp>gCe(4C(y9ssn_jMHk{584&l2w3^*;sy9szhijw=B7W2i?(o5hA-5qRPr>| +1EtKhr*g6$Oc{c6|^mdLdobc5irp?~*FyY=G7ll#UmH)yehl?`hkQ=@O3WhJI)UnJS|L(#?dTr}1ix2 +Rx4BQCK~O`a+dJDMu8G#)DKW +Dk>sOCr1TMz2>TOCNOmha9godFSgUBzDh|QIg_Yi`yp5H%FeY>M0k(B8V>f6BaNJznV|OF)T$;plUw3 +1)qb`j0F0GqYkUJS}SupY&upMW&db_{Yg=?;!*QziX|4t=*{y2`4TM_~;(Kb2(m +gc^T2ujfqH%HOcdCF@=&TM{&A=K4%Ae);l-UB7ppQ7La~j&)cAo9*dX?yB^t#3Dgf`nz>yK{yyvdJl= +7soQI{r7$`lGvfw)IC3^JwdjUgo~yd**S%xs8t9km~@or|4^joqGm{Ou$b7T2Pe;UcWFeI{^DiaGzlA +57AvDWNwi@>$2@RrY_rn^tqnbFC=9A%^rBmQ+*KXcIulwwC;OxN089PS?Y<=+!7AyYjWi2wvo|xv`aU +il{V)YywQ}RWLq{ryt%4poq0X19wvMBDsoioWNEdjO%=>DD~D)D2xr|o?J$ +tTT$SY;omvZ69v#9f25zR4#Ql|FR$JFR8QrB0@TbnJlba!Dt!lWIHOmBJx=htM56HEH3(nddMu+HM!a +Hfkt`KFn^xv+bZ;94wwSso{1nJdWAjF0Z+(U0%8$=4au^>apmLZiWsYR3EQsC%4-ZZ6Oz?^mp +Qgz`v-F7~3nrUb_8CAnf9+A%{*n{$#etW}r%Zs{C)PalkHtzt@(*1bua+++&IIIlg22bhub22kBs%}p +Q%d}7jJ*h9~;Ps9_o^`g7BCbENmB72cu80fj{RV?JN81^^nhVbcfG3*`|crOk73Ud?`bbPyB(1{o4xN +aw5^MD<@0BxAG9~T=WyT>kj2o^m6-0Mr5>nDa?%S*)_1mY2ky^E2{l-YA!cCVwZ>503DbiJ2WWrKAb9 +!nKkAEAvOKd_X3(C<)Gvg@e=lCzM`U#cnn=x2|6=}DKcK3V)jVU(JG54l6eeI87uF`CiXJ!&vL2R((E +bfog|S1&&ph-?mq4Pt{Hrie>?4v1+;VRpp@A1}B@e>3isNP>i@1?+#9!XTqsj8WI4)2 +^2Kf>)sZR+S0nZ---#+fiXbay}$E$xUoQ4Cu>h43pOo496eFhr2^2q9wF0v2PBkL}A-kaT8ENqcFUP3V9ih@BFv!`y(54NgJFZ-+r4@5?)&1=Pl}Z59dVW@dAd!pQNik`-Yun62YT3L*zurW)&{Ob8 +LJ5@C)8TMMNg+gjli$&zN|0)laDXr(-RtH$myIcC&JTuTrW|YlS3$Qw1%Dq&J`ssSd+c9swWNabk^81 +`laMMn{xP9wcsD}M^B#*anU@_qHwbl#G%Ts|H7H^U+3#BJKkJDXGdc0_2yh<9YmXh(FzoXnww@My*f^ +K|?)mndVUiLOUhX+2w4eOmYL%W}W5u(;p-LDuHIhlULJ5(*=JvSc20Q+V4vYuEA_u~Inzck*bcVT-7h(Q0k(XBw_r|BjhlvJ4hRL7k(L1g~m +Ghu&MoY`4{W;bif<-uA7w#`B)%@CLt&o+|4PgVAU&?oZ1|Uo6g3tv4%@P)f*7acfIy>P#u`bffz&Wfm +Wm?EtmU^suT;t&l6t0SU)!?^El2i$mx=4~b#yv(tO@zE00kP)M51qZy)mqs5_D>AL?xI+xdEM$ZRnl6 +~gzbbk)zrckVj&gQRB+_z5*8$6k1whFBieQx$isc2JFpejHNy9iPzP+*?U_9Y(n*Hl7Cx*KjuX;V~I0 +N<_mOQTv7vsKnS2*QeG+jVGE;i+)?MIccJ +-50x0=MIu~hfML;7i3&R&ywPm=_AAWC-Yb6(b;|WNdBc9I0Rz~eo};uGPY4JiEo#KNpU`Id(37h^5}_ +zgk$&>mENWL@C1q%Sf(zM64!FEs95DmMBz;MU1`v;jy&jcvaeHg*ytB7WYp{jQ3=S(oi(0&K<4C +Nd*%OJ&0cTK{nd~1hqJ|5IjDel`(?a2Vw=~3PU;1Yd;VkZ*quCaKn5Ja~uvL1B9jSo@W%8#uvACsmCx +sE7MBo<7Yf?s#vRV5!Ny{6^IOQN_QWS+3cK^_zjLSw#BRjCzvV9Re*2i4vg^h416Xno6h%2~%I;8Bg1 +({9|?&Nw-DJE69%DdPhtcjAS$@S6CJavW|kraU;%9R$tU0ct$9s;zlViN@Csscidsb%v|fdqnHR{S$p +HepP){xWV}Vy*s$R$_vr8=S3Jtro-B(`FPB^Qb}#A9Z<*C;Q_G>kas?(SA6-`)5D7>+0zce?$K&%?#K +9I*yLo^EqJKZ9ZkWrjI^<>+FX#Tw8;k)8~kzCk!}AQl$x}1igi;Ve#@^w59|X)<#DM|sJWvNdu!HMJU +@n8tKG1JEsFf=zAET2JY&qh>({&GS9?+C+Vh>*!hOBB@cdJM+` +AiTzGaGx2EROrAa;W7bj%&Q&4JNK}*=Dq-ot+5>h0v+GR2t@4)GrHLPKfNCoDgA5Z=|vooja +4LDDBl$kFHwQ`s)E2E#m{O72vwbH{}i(zsGoRASLE&(630?rE7Wyt~eEe&@tGYKL;yd0g4Qd_6tObO? +Jz3v;lNRzX8$Juz%w66={)FMOJjqGBvW5vJ3UBe +CS{b@VV%%OvoR1%AMv$D>*mqk&d2Iq&c_m#zi@nQ59ed&ZoTY$?EJ00p +N|cVy6k+cj-HPV>EP#MO^#B8zpQmRAGa-ykl^cV&7-t6iYh#}lRT;N +Nodh3{4#E9m(G7Z>1Yu@|HWE_W~-(s9p}HWMX})Z=3u^fS%1BBxNXZg>2Mn`PnhsRIW<&uSGnVS7;WQ +YO4`N{VTmI^xUivXwwTK9&jiq|WAUV>0nz2JeJ0Mc8BTv37VFqN%AgL6sKoniU*ur0cd9^14M1x^^cQrtC@QMbAzO<5F4GWT)A2dL8u)6`GY0Lo8G#3Lz)2IQWY5)HiAhO;sUcmqn_yqjC7PmYd>}r +6hB98ov28do+ivsFInomy#h}P5aNZ0Vo3=my+%3+h`ziohMO$W+Uy%-?+`-@jHK&0;ABHz^;AX*jq4; +Ubdf3b@JqBb>12E7{~a(nSA3=nN>cM!UZ0iyHsx)>m0rgTu;c32=vm?(L?B`oEz`B9+AjiSeO7yCva +dbZw)=|5wpWJB)8_f2XLP9Xu->EUv2GS(gf4iB^~3m#Nkh>`H}mRvdeEatFjVLjhz2@q~{)WJRlNHRJ +(py_@f$u-o}X4n_>S}@lWGT0-EchqvZwK>J!M^HGMu-U|~0FQB;122kJ^2K5bEP1Y9?D*6ckEUj|whM +}#KPxIL>4kuhr8m!V3_316#j=b>$C;V1Vh!u{7QCrb4%hQ|FTQK7I`O(VNH{g!>XmN(T3|{XFv;i;E+PoF7 +%jrcX-u6JnJLv@PL(@d26D^wiKk$2o +Z;EVRqQ_0`!*>5dpp!YO74n%+Qo%p8IuUZ6T@h-Dbv{gJP(j$)r=vQeripr@Ho`&!0sXU8k$(aP4CS* +T)K(5xAs8)_Mf%N#Go>(CH)b&{cjt|nXgYLZz}enIiN0$wT2LNjq1ea16hYFjm)Mp0SM%T~v$l7C(qi +)KKe0hOOC?yp0OTRu!Mmp1gDjb;f!yy&CNT}v&$C%2leQ70{unUyx`ft65HTu09}IqsNm!FQmrzeKXM +e_2g&x$Z_+n){i?p49=we>v2HA0}z0)v#$j#4tlNJ4B5e8SGEdd#Vn#l*1H7=aLk>zaF?v@S4dKWWaZ +?f3CGv;WpJNik%)e4@2?4d}VYJ-|QbRZT5!_cHU(#<&$tscq`+d%c*y}(|v_qzvI1sBI?`gEuL0C(Z$ +g8AL(oqJGstAu@iMR_lsAlv-ziOSEn-D)#Fu)oi4_!2hz``@4BJ&>M*ok9lComej=yg^o&|%+nUC!Fk +s!2K1q3z>XVx331!a{21%dP?o3yGutVXZgFAK`M%gXO*xL;_hC&4a`Q2b?SjVk9?G_;qRH1(o>5dp`BJ@1o%OI-bK}kG +n%koAo4LMPQ;rvkbokJV72eHP#qNX7Umm8d3HW9b^HaR8mp5OgqN&%qH)v}--^Pztir4*Rs`?fWJf2t +pqgSq|IExwD4ry?=YZ}+er28<~!QI<9tmRO{;c%v{sm$P&+MS20&3eV%ecVvHG0vT9Y8oX?%}g2B)Vv +{SYF=iV8bw7t)f9j*d#4-I*36*Vn$427W(Yk!R}`(@GYY2xScerUDi@%7sBM3Wq9V?dssv8S71lNnJc +hk8dcI=`))MCFFf*;MM*e|57%!=M;%SbU*srv&Vh>T*lzj9M9^g}>!bffEuy0f=_9TH=NCjBD)pB5*i +79>heZp2JwvLu8oP^rcpAJXanu>1~6|v-^uj^3~&mQ0r9Z2J6;VZR|cR?cJ8=K)jb!N~f7hiK&xtGI$4@rl~1J1 +Gg(y=3DD#;%#2h^HIHoWg}SuPp@mXZ6kMW95?ecdM% +CKg)i#lt!d_IuOkp$PDBiim)KPU}*ttlmG^u5}sPrmWy3s?cHR&Ml9MIZ6RMXSGO)A?(u8NA#a6QwA6 +4W#8pc%}mrFteh0%!{)Wz?l&jC8kaBswppBqdXg)M-g0we=`vCY+Z%*<6UTV#|*gP$9HmW>)NqaAv1H=Co&G_mdK*mg)EDWhx+RHyWb@KifhM(uJaqvpFPqrPmX#mLP +O@V|#8j7HiWPhaOWbpe{7t~_IbH=MXSM{E0Cg*Pp0YT3l2kIv>35y;UX8vODbn^f^Y_v&G&kSN1V2y9 +!1a0(XPI`>OBp4!&DL91;aMS=A_5nrSBp^l2u;+=}9aoiF%M5;VimW7oy-^?njbXNAwHk6WazDzi#dQ +-`UUJ6%A!PHGZQZ)$KQ<;v9E2rRfjnP!aSJUjs}X}wRY&t8P<*hbL#FQI&+!Bch93!+;T-_u +p66z{93%x%#mumoQ63pRiE~6`H70$jX^En;b(KdZ(H!Z5uLR1Ro0~IEPVl#xiPEP9@M|(bs6SmO-kT_ +V;zCNDOw(az+L#thSK15y&j!~4kw!T*j3_i;_S2wXWts_x6CI?hO@4cIcCXNr4<$UtwBw{)M3XlO%jN +jlCoHcK1VyDLu*7f^*R;WOWF_Dsdf6_Di8Nyr6RA{K*@0ApwVoG9ZQhni> +ZCbT!c5;HDK+0UX&cLuY!=$ +EN$+2ZOy17^dne1S}(2d^h67$u;e*MwAP8Bd_Kky(a81Nw@G%zok_OaI-!;R?)u_c;WfyW8k +lg@fUk52mb+^iHUQrOu%ohZg0l9QL8!aYN%3)+w~AP|u~w0TEcwLVD5osNuApzf-Fsq9^LHptMVbsjM +_m-Ea|leA3@;#_A4tscu9M)lE1ihV^9?z64G6cNb}m`#EbovZoqLdk(ptDNOKUv4pR(9r~tpsQQ@XfN +U#N{aS7AQIPVB=!ZeqkHolXqfH$IHHTN1N02>Icq^Obbe|(9Au5||&*&b~%XJJ)F9_7p+rGt3i29mwZ +dMm9U*h-l4QpMQ;7=@xH8XsK$?Nc719cC8$vYv4-xI$tj1Z6njt#vasuTR#mGU8L;Vmwj71M40-$UH~ +L1Ng%FtkqF?PhpXR%n@SkM<*N@g3`WYB6LJ6r>f0T|}K>FXsVL*iiajlW?ZyHZV#zE}vVk#%nPixrQF%RR5VG*G$YgqGBcL=yaw1pO7q{#;$NL!ttuk +pNPEg{omp`yEF2VP4Si0g%20uQyO9f +3K*-yVk^mEqJ2f4V-&w(i+%VR%+w|t)pslKZR0H!R)B3_Gq$t;xT=t&gS2Q$G|CJ>PrV4NI_+4{DBl7 +Uu(8M42!yXGza@9^*?x`hy=nIH+I9V+~{l`bqCaPxy*J%xb+hDlR^z5<_{Qow;vMdgVj{O(@nueRch= +s1m%N#T-D+(UZyq6*5R(;Uzp0w!c=CcEpv+sPN-{HPc=n{%Nt!D49+UY6 +V}{CWe^o~f*Nh7v_3Zm(4A)FkZ|3Dv_aOT(@Ieb5+80NrAZ`;q%qilX4PK+;|bzeA?wt2&5{(Am4yVJ +TvBbUFPzus@sbmx7$)@#5!eg+q{{CTj>(XzqOc?69gsQDNw&Bbx*6Dle+fJLrz16^l?*gwbdYO<9X4s +(K7D@XDO-p{>zSo0my!qny4*lO%0;Wv1HAsJ3hF!;HaNSH(b!6R7pW&&`ilyW1ZX!xDl~bh$%O8A1Io +YkNcmwB2_;-vkd0c;Hsnctyq5&aO4PkD4Spoy4};38N$nMZMZ}*X82Pc(5Y3eT~=E2Wru}P=ioK?Y(VvkcRV>Q}Ng|?pB9fx^9U4I3u>s$ +wgcLclYp`e-xXKWYrwx4ZZvU~e3-Qsxft_QT`0u?%=($R<-n#_Fzt*hZ7qEpGpY66uv(Nc>(xtVE5^2 +ZmrX>H?L3s7pmq*B~>P@6pNM{rq6&}!^YFtE_>t^F1)$UkD8c6^}aoLJ{DlU%k8>C+({o2$|K2w#@au +AnDHBDAq*QM9eZtC*|3sqJH%M;yi#63%F=K=payMn?*^N;6i^ +E=@^gn7>l%z8qoa-Idp^8=9M0MT5Idn9leB?q#Dz6&tO!|J4pI;v|ZnX9gy%CyxtE%;r&t5KV^Jkfui +DZr2mxh{sqh^5~B{u3kSnn!<*2-i%&`Cc^V>&F+JBj +$ndMmq;t$;5;73~M!tKjHxzXc1u2m5i*S1>Yux^&U#}fYbT7WtO)41q(ZKcBkD0HTf{#Q4?y^LtmYDj +-*$Qw$In#)>7QT0gHOK_LDW!+>#F}Hkdon+FG5n6n%1?!iwK)8Q;KA*0TaYxW|#1dqiIy-2mikkVCdW +@SJ?q$Q4DGnJq}X^^c0;JM;rvjlUNxsNBqq>!5~nF#L81Psi!}h_)uwOYmOBZ$n@gr=#aIn9E0K-9Lc +}>lB)g#jrhr>}pr*`=YROt~8zEu>LHG5z`NIZUhHZ$+oZMiA%1g-{^g~g6SqvY{Y2WShSXhFG=5T9cN +Hd@Bj+638Yln&Z}&#!o?(}zmGxvy{clR`#{TJV5Kms(|6V94?VyylkucqPkPeqyBbGEqiwdMs@?QPZm +8y=7BubFi@ju+Qn>K_V}gh_kEh9OKMQNWX43?IWy=6RH(1*q78ZYvvnO~>(!#_OdmQB$ysiSIknMh`m +BWvrHFJUE8Z@?pV%U@T>ZX&8WsGpkO^!>wXWWGLN_#bHokicgZ=gmB3jK=e5t`MueY)h6THD7OMfyST +ezK8$1N7H!Vl`PEVgFnRgPg5No)$mBK1Z_oskI&v@eZ5A!o9Srm#DfN#$yAD+3n!6&sniRgWCI#A<|v +VtdZ=_7VvoCH+r5_4BPCFVyHGk)V810;^r1nvZyc}fB_otNSk)*ZYCP^}Td^i7f)Zfh>4lbE|jXg*T_s4KqQn{w`bBj0C7TOi6_ +7f3x!$=(=o>&R&P&r?J;A^R$ke}&zE&V!M6zP?)c3+$4-Xfrn%<rl2|H(sA~i)Uq!;q@Z&+S`p>4LKJnL+i)d{te81PmO3L)qLLjGAf9zSoSui=)lm`!6 +o?rEUHf-Ru=R%9GlMEMIks+I{j%zQ*>J$@gv4`U()KeK=e8h&7Al`j=-K2z*e(*PG46W +@wSn~==RlsMn!?n4sZF|>2E8=H6c2!RgSF$hBxFxl1Z;ClU=tD#4fyU+pv2Cx++`sxxdE4F~MFkZ-ao +fQ+o!V;m>e=D8)Nly1HlMXNxK*cyKSM9djT7#^UX(7^H3tf7nTuYm>jykK=Ompq@z|$u?kiDjPYsvT{ +jvDcvBhd_vx8z62We}jxIrPd)M%>!dCM!$tnRP2y^D7Ko9OK!bFJ?wp$aV%Q8w%p%|or7o#sJ!mezJa +TNBo9X2vL`9S-jPd+pw^G`o8aG*l&5n)~6DLyw(p_);1)r>S(88U&NL(jNIXdlO_vL#9wPJuIXZemsK +3Ctp%jzJs4I6g&4jCK{Lh=UwOKcq+>uGV6ty2jS(!^3}>fnh`=09Iu$s+M1hW^dg4_;rV5hNS<2TL3{ +XR_b)8W0Df{@)?lU!(D*EFV?oOVV|w)wvpb9DJ%-?1eF%3rq^Q|>k?*`wR`R^*W-7&Kr8`jqG&eIw#4 +oq!JI!9OuJameQU>^&KXCc{wl83~*hU~_#7Q(ir- +GX>_@q+!jZrQOApxsfMT-f+<523s1WI1bTPeJtkaD9(KG*zTaP-BQYyr(#H +i6Xq+Q;;?{U5N`zTi7}?4zSSo1l4ujs?nt;G%Hh&S=j>qJ{u>AP4IHQEEK!v*0Y!8>`K;zLu->f38_= +uS8s#A?)_+86;I3wu&^{*S0xg(|LV(^#IU}uSn9ChaDVxMKc)6;UEr2bExJpgTsX!F5_?=hxc*#1cy5~Y~=7G4o`8|%AwmZ1|vDV +jzc|%3prfL;RX($;P5RD-{bHEhXRKk9QyKp8^qyg4pTV1g~KWirC;cfuI}D`6P0N69glM`Xnc;lD;ez +moA)F0kBsU$-1Ya;;*V}Yh_BXkcv^#Hq}83JYEG5W^yO*>bK$QP;2e@krjk*3w2}TK_ZV^=(G!g$?>X +c~q9dtf22oRAE&NR&OW%o5p#5O~iMPY#s+UwBsUEDn6^?pHy@@^}iVepq{_UnbNXW0iJ`Hy85D +qb=_mk_oY0{nDZS#V#>s(|WqPb7;F*xl(yj{!)HYK2mz%EA50OOD2>$7%C5bBbDj!QzEhgevJOMC?UEDKr%_ZoZZ7`ap0F`Btr4%ZgW+|firCEw;$E%E{LhOU|98<2NpA8 +F5mK>9VU}-tU)CuKcS(rcOjd@~zm=~m9fq7v*m>$!R**Rv5DKCfSGu2ecF`!F<#Z>BW0lf@)#ReCTOb +c_RmlRXa*%l6S%$N_R$21rZ<6t;VCv$W6@bvPQ`}q3#2LvjDg8PJohV|_i-hV(ub|9Tz`lY(nC=>#k24KOuSIq#GuusHUW!5Ev?ODK-R8Nhog8mp%`vta&iC(EKqR=iw4sDux;1ugH;tUXt|Q+S488pmgUfrB|43wZ9`h(oQiXTlElEfAQxOFaxJAEazd`7POkLK>5)>! +w2sI@>>XgDbuo2Gsit+p*|U(gvwMG!b@X>Jq%c$7D5lg}1Z`D92}Vep%lnt*UIdV}R_ZAhvc!d=uDs` +3-k3k&ugm-0;6nFQ$S0HckI50jC|yFShhytM!5`h}7Vl_>R40jkJ+&aO7kZ2ZIYi3GLVI{2r|Olcfwa +JSy5=e6cl|%vpUY`WuRQL0D(|{~qCDitWf0#)r2x#Mr;#L$O=pf$eu@7?{j+GU22 +w_A9>+P0xv=M?Uc9{iW61a`_IC-CX5cku3zJ$yY%1H +*B4_j9>qRgLfz&b>l^RVe^;MBO2#PLOF5VJ(4$iR&iOu{_7NLx?2TmvcOlI|N#AZp>SLmAsWvQ4-eoj +$<1mG=^_HBwn?<&c^WpAt?v_%n<^OICp1ocYmp3+&zFhYcDc)gp? +n5M@r@Y&fJ5zyNbI9OXXc)ZlzQncSmt|b_a8pN%Y`uNuE`5_Z?FGxcj2yY-etfyN`2sIvx8aDwm+Vfq +iikeaA_&UMh)&KPB{ZSBX*&7_QWu>oi}Nej82yV4Y6aStY;+7;_1iH&_ms-(t!E%i;eUXu9sDXdI(Fi +sqluCASF*M3+W_SZ3m6XNg +*#+6~1A-gN;3tO|#GARS+^Uv)n|C}7~um1f}`|&Rn{#;$IVOQN`-tMmMt8K5d-Q9iYW$T +V#`Py~XipsnGQdPa)wxQ;)ch_#b=idA7f8fDQ4?XpOSte&fxz-hO9KUH#sD``ByM_(;>yV;_F>@h6`i|Lnx)Uwrx1$>y)W`S#Rz-~S-A{ +AfRY=BKl*KmYRUZ|B9O%m0rn$a)X|UqOHT-s$Hu9tMKj!^QnT +H+K!VU1f>Cc5~m|&0X8gy|J77o^I}YySaC`b#=ei&5fV82=JI?XT%S{FR^^%tml-ljj25HApZT%uNIK-4v&b-|q>QDULuP}_H;ZbJMiV +tinR?>-^C~aDt9)%a2z2gumEX0lJk-+@B)ZDVN+5iEe0fHB6-Z|>!;>=RmV>+oLS04%-twZ1DX%JrR0 +PDjf`S6M+`G(ZTy8X8CePuQnH%B3?>Eulo|V7$U2L +!Q!HqAW2Qij{^kL$1Y~v#?0|@-e3v9T=Vu4OiwAD|3txF%Qz9RvZX2x?4PxAtz6nZz@>=DOff`qww2~ +3TmbW8qEVpNHWhqtz;q8&(RIar51x}MPczGWj?LgW#Od;v)Lt>l$!IPd3hFNQDH8NA%(CXgqK*%y+?p +>AX4w)&UWQO!^{Syk#UvMQi|0WKCGy8cvm_uGMIskg=S@LNuEJjk}suT`HiMJ1Lt?8II2N50bEGensI +z}-2JC1GXlf15?D__{!5nR00zB*RRJ;#9}WFC9I?^@!@?Z!EGjHEK%WcNQ0C;D4J +PIAI7_K1Zed|@oS}Hxa4B&&K5+60mIe_EO(n%k48>+CzOx*IX-Q#m4(&AP3P>?(sig!634Pivn_epoz +f6~GSo-CK<^t^6Qge>U#rrC=b@mr+50BFWeWd!capaoUW%SH5&@Ok4!`Wm`=G0M1J=1^q(BaA)-U{TF +ZY5kEKWaF%v8bqIIpx2hmvwh9{oFfEdf_kAA`5nCsWQf}3}%MHe5GND(Y)f?KQ3<}uo7pM9H?k64jYM +CDN&XfmXz>MXhX;_So@X&RB}w&gCDG~XRBww82#{lwlR9BO&gZ4`Z-P!*F(2 +l9oY+g}mliHD78$and2fDRVX1k(`MSi>#=M1>4Xz%3ROb>RCn0(MBqY&~gv?Sj1=RT&zZlDOJI5jjIR +{Vek1YNLzyl+l?*5|!#tq)DAQ9$3(l0Ln^6)2$1YeU^vqzH~Ea1)AFz;hIz8=Ik(U(AoQRXKjeo#AEs +4odkRFKfIL9Kz!{!PAha-(;)S4MDuU($cSAL(xfnCC$?6UA88c1o9#ghaq|QYt6 +Zi-hLMq0Zh|XGgqoqXkP>yoe$X@=Elg`CX|!NMjwmTAJb6&(r?|xO<$_-BaDZh43?R&N6){eSL +`UEH6i#T|kSuV+c9_BZD%3H{ve~CNiZzQRW2`WhShT5(A0S6xlkUIlQTFU8qqO=}#i_6eKb;kVHaXM$ +QUv?b{sM)Tb`U7);yc19g!T#VluCKDnNdHW>EL+c{5+2HNKB2m0}z>5~{h`rPA}A)|c3c`VYG^&9kOq{-Q5Qr&0FAY=j1vPz=UC_fUBHY4?qUh +ZS&)0YROcWs5@hxU{s%bLzfR`kMtsJ4#`ll+BZCw3$Y9wmr0Yz}`nmxKOKAh;08N_N8^AYPDyM!m@cw +F-azbGa%nKx;nE@~t`jgOmpbbcmOkbdf52Z(Nuonr2HU^LFn%AopgnSCm*)Dm(13VN8^~QOX`N6vZcq +kO;8#;^U4?LlOJSn{?p9BD(0Iy_nUNHgx(eWjx6OGOQI9|ljvUtw1zkLZ +3?aHV+_uQK1P0-1^nXj&XV$201L!&cuc3IaTK5#Z0-a76b$_xL_$&n@9}MwH+waC)Jg9@t>c{#4D}Bp +ier98`rhRH)erb9Bq7k$JzcybodVJY62&WiM#@LNZrHwfS)dyU9P1m;`8!_Xv)*8LdVH{*kfYlfjxe~ +NFYqqB$62J@Dqv0yBz;WuO_%NHI~>1UHi`h*C<4X`%p;7yOm2K!J_X})bC2V)$%FTQW_MWv=neB&|2)UM+ +bq@ZhR+Gff=7PFwT}WJE{qi@AI3wLQ43qmU38Oq~(0KV-@kT=gr^C`@ez_Vem1R4Xf{WI9OgYgFA +vwx=J9m?i?hzE08YoF$zCPoS0j9z4}R+PD9o^Hf5QAT7wGU9`CY9FMfFVGU;Se65wSJz47fRBF@jGvK +iWPq%ijT4|#|6wrKniGL{6G%T+Xyl0#9v_K!!3Ci8 +Lo>hYiN04B-veW$XRB%%-_gbVS+x$Twz4&Z0OeSDstFE(o +{Jq`;Et(;sRRXJWW}y!HBs5iOsnA_*HCqufcBax>B`ap=Hq`gDJygD8;V5#$%Sb=%zxG*^*N8L_+RilL!7MTK{CZ?dX5Z?>_pIJLwA +<^BZJLj6`oNg+~=ypMaHUEH5j%68>*LY_sM-DEJ8QrE{c4&x6($|&_RFg__pT$KuMryDTE3{5)X{?Pu +Lpk{fLQ*#y>$Sty|MWvW!PLahxZbjE@$#pZjXg8N5RbBY&eU~wnS%4a99Z+o^#%HWR^lto%fhsT0M0; +(Jb38C^gZ@tRoC_49I@-xt(!K4s?_en>d#o1Bw+H%$G4%oyY7VgTYAR-1VvHKt +jr4P})BCSx{427%^jMh)U!pi)7eTjZ^i?(!mt+H67nQ1d#rhk8v2CN>6F7Ld1`wtq#b*{~$D5Xvc~lmU#~&1VSom`had`jQ+NJqt}arWH`f6O>108Cb_` +VIz#q48ReuxVWJqK$!*5i@6{6B|F3Djbc{B1 +EMKZ^U0<8Bpqr*d}&Pcw`A&*pG0&;Mp#b`keqLU899p=bSYkFAN<)r-e3=XGAo;W{2}< +>3`PAGG&|J4PSl?#Fq3w(|0x=Kec*{SNc+PkDH_H=~6_v;XWbsMjA0SN8h*k5}!#^6P!`6$|fubI|{6 +z5kuR|KE9_+wcE4OJt1W@|K$ioj$h01f9KZ1zx~Pe@~rc@bPU7uKimx-O``3x}3u85WoJ(6Hh98$$xD +pgDD)oc9ro}9KH_mk34bei2>xhCxj<%?LGh1k5g=JSM%S%Ma1KK`4B}AEA>pv2jX{CK;~X|}SjXX89PZ+92Zt|l_&kT(Io!(O77jOaxQWC2II +QKcio-Gvi#W{dmj8SXGda|An8INahcO(6a~Q;-KZitW_c`8f4t+ej%I8hozk$O#4tH_*5{KJ4+`?fkh +vgg^Ih@B~3WxC=hI1Iip`1g)VaIO_wsI(N*v#Q^4x2b^;INLvT^w%bu$IGe4vpRN&*m_L!xRopR5#9g`>lnaO0FDd?8KSR@!hi^%8~6tS91y|c#{--JPj(*}$ +pAPC7V&w2#{;y&6FopiwgUVbo>0I~0US1v`Nse}#PLRe-wcBK_lGzDR}N19Ac2WH{sl&u@Tl2ly^Lwf!Itz_u936Y9_ +b@V0ANTe1NT9>MCM1o%lT&=KMs2N*w+kOIIFegjW)IJ67kZKDX;0RGtkBSy1!MFJdz`#1qt0(=;rrZ5 +@V3=ntgc!bJ`2f#bWK)(RK65wCQuyShwqIj+cf849_St9f`;sAGF5B&xBTL44GL%D!Q0$el!$_2at;6 +oEwKAQphB}3bxp8fzwB(t`g0p6F);vn3?afBC=8J&YB5|RkdamX_T;5>Mm0nY}Q1J5bIjR2RzBLHp&_ +})a8Pb0wmNvypE0DqgrXoc|9WI|3ue1wmsfNTtLwg8M*LElBlDBK2%j(G6j4)87w&;jr&fG=rS{>@Vf +xmnBTJRjhzT2|*B0I$^npF#X2fD3diem20cG*}OSe>lQ4-WLGt(pXxAzfK390sr3sTJ+4nOpkV$U?{? +PK^sif>CArvz$ZBV7C@2XJN`NnBK)*vA0bt-vmUbe*hh_t~;(=!n-Z`K3<9z_{SOEP3{wo32Enw|J_|$EX7x-@n*qR0W7Ad1JFq`pS5Wv!GRu=B3*_h4w5 +TMBYNe=WKJeweXEx@nf*$#L!z$LlR7Qo8^-kt|-0lWy{T?STe6~K@4VJ!*xaeyNVcpCxEC;|Qh{|tbO +jf7mpv;glh@;U&FSjxvQz%xs6u7vsn9Bv|HBH%Fqi%qPaMu48BjJ9%sJ66Fw3~>;qt!DY?0miO@c?0} +M0?aIju?ILpp`4ZLu@>e`c(#LoBS4vz(ai&3wUyC)1KzDt!RU<8uM*Z*IIaPvR?T +iLvgaKtv|KN4WgHb#>z05hI~dg9y;Q2sQm*D*f8AK*zre%nsSYw&0R-v#h8zoI?P9`aFw&9AMxJj8;Ja!(Rm2K^%mSzR2qau;eAqO8{SbiKRtoeVOr31wh| +d814_SXgBZ;#78*&4VXV+&eQ`O`X;ms@MwS*c(MU6132vf<4G;RFAuQ#Gy~js5bu8jdIId%!0HeVaCr +l(LmA@lK_5Y!T7aI7guDfK5WqQ&Y_6UM@NXR70`SvDmd|m3*M7k2FcRQ_57-!K0663`m}9Y?0FQpgc= +98Ft4}~*1J9QO{Ots*1Hy+shkghD{Qw)kg#H2?VeLs+*8`4l>q*8}2-BL`*wF*@J_TJ1xE!GM6qAcK0 +gV41<}C0>*a^=UfRi5xiTi=eKLCv!NB9iKcL59*U=D%!p#Yz3fp;0;TLJd}kJjro{=Xo52coqS1gkw35FrDKF3pkEv1gbcW@Oh3SJjii`XE~00=5fC};t1n +8j!?&O+$(M3I6~a}i}ghK8TUtcmg5Lzpa(yH^M +6RIn5=WH(mE^0e@Vd>;j1CngC)rux&X#h66(l7b`IQ%JJJ_ysUdZGJ1kj+k-#V)%D2Cf?Ms2K0ZtY1Kxy7YC=yReZXlDs)>3Tx_^55vuqsg>s)5zSpb4g)gA+cC2tfR`y +;a@q~v}qH0`st_1?%lgdU0ogd^wUpCXJ;qjD!XzT862(X@+WsUmirUM!R5=3Q0Ecx?8S2bi_4dh(Kd=T7naGZs-;9kBQ-NKQ^#zyL<%VRnGcUHWZPs5k5Y?Yse#Nq+&UVcR0f$8(}FEaNUjNf +=9KmW)hb9q7JPIW}0|cm!f>Kyt}1K +J)OHBo=|XJ3ctFb;$FLG%h~ie_AzB?11F-n>Ez`@ROO19T$(3*U|V#MDfy`JslTmFvbV^wruVYX)vWf +W+AX(j8BcAA7{Zde_A&dOypJk$AZbl!F6kz-ODEf3k-I7+~JXx6E@NG^2m5R*L0J6dDg%qmJ=B~?(lf +Sqkw0yhzpjIMtpM5YjZHa-G9aW*NEbo_V$+u<>EU*))_ol4Duc<5_kTPD?CyhZ~iD4o +sdQ;lulRP*)VL_FcKRZOXB0>$)rh>h)Sg*I-QQvZsyFH>lT0ra<3{ +q}gAbC29(ssu-n^M?*|LRf+qRAN?@J&kzxLW|bS``At+&XB`(7gJeiq4Vts;5%-FL~MLx;!*AACTL9z +9Av`sgEa;=~E^<(FTQv)>&jAO0eeufP79@mmJS +NdI?8UkB-rLHbiJ>92wGDUkjaJevvW{|f1!f%JPJ{ZUAN9MXRU>A!{aEs*{!q;GRcA9oF`e^i97ma=z(l3PcWsv@_kbWzqe-+Zd1 +L+S!dMI<_7m)rtNZ;y6KN5174mlJ;4u63hwm}a2A&0Laht^<`{4z!)zs(d$+ftFVZxqS-mqqgXQPGh; +0@9Cy^phd|EJ&XV>6bzJDoFnjq<;$1?|}4sA^j0Z{{^JCyQG(M3WP!W2uL3V>92wGBO(0_kbWMdUkd3 +rK>DX3{T@hv!X(WzHX{uCpDx}AHjUE{rdqbA9l4 +12^goN~G;k1s?LzGZSo +g@FOu+Wf@>62)LSQ;TpiRn|-7^=eX(2#-CdDZkIumnh-HCdH@V_KRfEo%T~&_BFizrOzd{*iht0mIYj +5Aq+-B|;XG0mD-@>AJMEbWQr;E)gJn_z0T+lyr5PCS9FAb4KBRo~%sYnWp*QB +Y_fyz?{(?$%O%GqP`1eI#6yTUVma#ng)x=zDu>A3komzp>wHO@okdm|4(TItj(M|jrwxF8=dnJicfHN ++~Wr%eV%a)zs}9~YnC<1X)`gTT}&z{`n=sj1HJtgI=j8Oed(p4S1InuWRR)Xws=QZdSmA||l}A<^ra5Gfr^{| +2RfQU|$&^ZVtkaN}9$rnZZvdGB<~i-BBDv`sCNq=)eBglx$Rm$DLLPneQS$iXkCUxiw^CW*)mLAo^57 +e9yg_A!kL#W$kAS@K637bs_wOf%4scdlW+&OaT(j~I7T_ +i7q`{?g3^K4ucyy)=b42;WKR8p^i7v0_PqI-%2i#x~|@f|W#Y#>X;56MRH3-Yq~9lXC=UDCq~F#}fgM +tIrQj)e5rLHZO(p9bk~h4f1y{a+ycqmcd;NPh^@JKuAE$|--!DgRgH6vCa2Mh=w5H(_OP+%Z_Q|&(_X4tUd!{UO26xRlTdqC9C;lm+raM0km*tl2{Ib=jk+(6&BV2BVH5HKh +*YFJF1pKr_{?x9r1jEIxV{bL}_wS58u288z;5$7kD`}%l#`d_P14Dj$8Fk+ye+!sCKf(D0q%e;rg;cu +XiC+6Qb+${uLenWkId}3jIMGcE^kAzT2G7#KQer#mu@S(ABaj|GP4ay%88yg)P8x>327YRSy^BWaKon +(!Ikcp^-bLUTQs!^Fs9E^_}`v)`q5ZWBbrcsnvoM*4%CmliXa(O&?ssD}NKcg7N`r?-Vu)%`|BT?}|6 +M@(G`1rugLa(_*bKYnI9A*l7Y(S#;zw77D^Y#CK?VWpY)K!+p8yOdCs&1bDX0w0nsiLyz|b +clO|2-dH?4Kk+%m`Ksz$Go>MibE`|g## +5|SHlg26FxUxC?1X-c!#=h%6pNiobJ4Xy3klyU~^X`}dp2V88|-Z|Dg;g0@wsMG_B)#C#(1z=tA +Dwuv;{EYf(B$P+t6@{fyLxOlNxb>(+Aq})aSh7B90*Q-~rna1!rYA@l3!2rGNIr|D8cmeG^hWCdK9Ws +;0>^b`ly~qJrpqu@N$KJn-#O)P{-6PU^mq?3`M4E0_3|mF+RSfmt6^VF9B&qte+i +7`W=gsH|dVsuiKP2+devuBJ>HdR3dC+{P$o+~Tb)U$^D3{fO5JUSSw +N-V6fBTD32%Q;kbPHvg}?vPZo~qEVBp4$ZLaQ4G}%R5qa_}k;jjSJOYN#9eq}riMIOuVNjp3N%c1b^| +{gdpiZmBE$_bt8~T;cQyzHWfe5wd+0c)igyKN%k?T+#77MbD93B2>g}gZ;T71LW$Q$Wx4F<+D--Iwj@pG3xgTc|~#@HmasduSO`X9wmXHC$y>KI!d{SgrnW%92+9zXvJexSej1Ir8af#((j^sC*I +O|SP6|Hx=rG@^}o6~jEmz(`R0`Ltr_p>+J|SP+BNXE0cO#wOkOf$sZzBKLqn_dk5C>i>3gnNP~2U+uk +-f7P`d;vsa-;;>l2fIp~6wxAz7xpHhfDSWZDDBF}xN7)nIC9}ns?HmUQ$Yx)cZtIu +Gt`ixC#u+CiO$58swGyIFjS!ELpc8208Pe&{k#_BOGW%;O9Qusn^S(2d`hPROmXHUw$OF<0JDu!Ms6o +X5jJ3IQ^t~h9uqCO7#XKR!0Rt$C5m1~y_{Tkm-Y1XV+gvKb@(2rf@h|GY2n8#w_HGHj&%XkleOU%G{C +#$8b%4{ji6hnbxSgaV<&l)7>&wN`YWAm-zOi`XhS$%e5jJr3KPe1m;%73d?t?I)IJJDC@hBj!oSg`%r +d-59WCcX;a#@H|}O4cfdm6@$%>8REcPz<5^{5Q2p(^J~Xl!5JKVp0bg->-v==@TcDhxL?0`-%((cZ|{ +4i7_goU+uk-f2Ah}x}l3BG(k7|0Ns`+*m!q*jQ<5A^8en%w(_oGSfdzLj8+V)3+OW#ybgw04u)x97|> +oO^j8dh<0P}sg9ZZwo7Bn`V>H`VzWie|@L|Le%*Bfri{I}T;vzfUJgH1ie*XDqDS9J8Hji&1>&Gev)r +Gee!&{C%W0UfRwUv28+RDtd7@3h8D^ru($z;Xwl42OA7)C1wMre%j=i>715A>@n82MMZ&IZd%FTEszK +)~Rs3J!~fb4zx=EnBi%$R@?GPB9pLRt(rAtIxS=ljaVIk=N5=aapJ@>452tG!}9abSLEpC*|Kd)2iZ72O4d30yxgVF3mgn{91MR|Im#K>P9`M +5uFOnvC13!wicGf80h +mWjy{KsO5-2shxZ*jc7zYIWXTc}dlAb_nlwp<4CdO(4j+R%9JTaufP2AOJjG4h04PM-S`G<6|oTUDER;becrWbm|VG}`G#+Jn +LgVXW0s@O(^MC3MF0Br>wlxM&Yvv(jT$v--nVbx)INRse5ZEQ@WJc#%43f`Cf&MqlUH7OMP7UDHJLGE +hM|Z29(uumFThV&9ON)yz@8$9_(Im$Iyp}Eyb1jmWygZy*J6y}!59O5#wN|qcm(oqn14k_M^Ad>kw?Z +NKPv0fHSce>a^=c^>agg0l97=isuRNVhaY~}#0cBAZ8P!!?a&I3tXx@sfDhRt&mpdZ7w7{zZS-0B;MV +6QA^QB$>iNWhbE+adEnBvnF>BT=QwL#fN0%ilD@)?z7-Qg{{i8d`>R0>8!JVt*;)M&v%I_-IA7;*+DcRZC=cZ4eF5||HyU?>|Pf1QrHv6u5r +I95tpcmkTHgJSup$35;M(**^=nC}+@DQ77BpANA{)vf<q`HB@QrjkS44E@L^6Ir +6(%xlm^&3V|cVMc#Dbm$=-shZ99OcQD)eU<@j<5&F74{h3+4_dkM7yo3{R>0C;-1pHdG +iR}!))~V-FM$L7}y``hN>S1LqbA=bm`K?$ku`d3k?12HG9ru=td8)KfF$Ciu@33qX*~!I>B|Z!Akp8y +-s#mSXiv`-Me+`))G&!=Toby^s}xz{;~VYBwvIc<*jIJ!Cl2hAC%vs@@8ZJAH^Qqb8I~kJIbD7|CcXc +E`^1K#s|Lj)?4O0_FDI;L~YwM>LW)f?OXJ<37%lzqpJNI6TcDvVEFAW^Qh-IUihn9&FHyY+*aWVrkd-bkR-9`!DE+7S%5!|LVW9ZT?jm7F+YQ{X2NWYw*G +LM4)90#PWG6blf8!zw!RA=c#h4-)?&vrr!ajD#eA!2H}oUBmC1QU^6s`pyl?9k>@ +ygVb(N#58Y7e_ukfq?b&F|d@bj7f`F}iFgZmzC$BSu{D)RL<)BSswYcw){5kNW5qA8R_t8 +qU#ki;guyuJ2km%Q*dV=d?S8|PTZImS50G0stf#~K{3|K3ix=OzaC_tbLc?Vd_v +Me2PzKh$|KBwyq?9hJ~}U`2zq!Zh}cRG;5DF){IRjrZf!=5rf1x1AAl|A)sVr(FBXQjy`uL^|#b_SmQ +e(^I(rJ&~tB5!w5Lp`|h!!1}w}Z@;~T=5~Wsr%SPC8gpJyd;6{0rN66PI-v2nS7X}&8UynkhWm6zXuN +Tz-`BxD8MRRQe65{Y?x*KOc6~1rv(>DBx{~#OuQuGLYnHnE>Goa|TR(SV{;N9Asm(1`yZH_mre{jOkv +8$tVm~`CQuITWdcAe9)8odCOPDcZMm#hSJCQ%&AF=EBB5XCWEO83&@tD!8SOp5VVu +9X}v%j*mBW%p9i%`1~o6XHN$ErrnMO`@Z)60k=HTAEM6~t;f%*Ju9uWU%i^zs<Oi5nH@ +|mk$Nt5MECmiUg;lq50S@Mr$d0eApU$kWc~ZixS+nBZbg(vZ&XGaCjhZU`1!}^pUQfGW&+z0Wks(S;o87@)8#+P1)4e`%# +mJE(Q^$-MGr-+@g$C*->;;4RI=!X>r{71PiFzpVNRNr$#(1Z{G^%%SzBVq&&|u`T=vwbPbp6m?aA*%0 +{%@WTWBOh6il}K)8@KXEU7Y?3y$RFfa@HT+=Z|Kshg|a5=A-NRPfRvx(ximBbLYmRi{$&n=ir7G_JHF +aUy|t?(yyYf>UV0}^PTZT-hEl+%}rtty})ltruQ+Ayw`F0NWoRFCe#LPq01g#rcxYWyh +;sO`m}J^irq3zQCmu^qD3*eX=nQ4GbfXy6)3DzxeTb{kQoUdPvOg?z6aickI)RdPc=t-ZDKFdUe@KL# +ESfbd6uwKh~c-d2+%VZ@dvtZ-{stI&5BT?;C^;_5ypvdkp%wg)dywiSp#pC2Qr{e`4%Wqei7pm@pxQe +V96Rs0RaQ*PqInul8P($D!BcaZct_EMKnw*X!SA*N=~nKN=GgW9qK-rjwGAU2u1V?6O=Ah@FfBu8W$VeGDaGD8;3!Cg_UIg~fnkK21I_43^JT= +^ILb^lpgeR{9U!h^};K63!u?MzCVr9VAkgYtZpSY5ooZL@kIbCBUzSvF9f1{kL4tu40K +dpcN{_oS{p+^7YlTQk~pueVmxvXEnzFRr8_lVe|`l?I1pD*gQ=4*b=e^+d9gSE~2w#Lsji0#;KYPrZD +wRHL#=!d(H01vPWoChuJ1$G;o37s1^Zk+0=T93l$|CA|H67ur$;%&|ipP`{&zkbrNVMBTJ(MJt!w(e* +9LwpXovG#)d5|=Mup63bX3RM}#{$YQ{j~_pP>rs=(=VNo|Ej;tgGp5IkUhr84dtht4#LM(lh}#vz+-j +^{wti?0%UzSe9}O8Y#MlPzRkd|R_{Cm>8=G8QT)e27Yn%01M{SL<|K-tPW8h`WmdU(%^GvN6+eppH_7 +rb&ZL>b>SpSPGf!D_1=$`FMLIW~JkAwQt>eZ|5eS$Z;b{YPv)IhN_*gp8Ybm>y$@09MvBu}t@a4ggy{&mr!Mc3J#Kp=2NuQ4b;Ki|BrpZS%~=j)W4o4cW)puq6c`Y`ycI=$C@KK-=Kn>SNuy{y+bqVjh +hJtQ|qUJEq`>2@%9A5@IS*K>}UORcu&^I2q?7|zBsR;RFK&wd-snTSvKXjt>W2iL{N9(*usp=&lLa>s +%Rr-C`~>K}gLhA-$`g>6EQpw)iAqiFpCnLa2O8}@c`C-O(~S8@e%l}OE%W+`3tTFJ?w9r|D=f;My4@b7<$*Qb2CZ8mBCvGQiAa@#__>ftn+hLK#x-WC) +%rWsG_lVF}gO|ulXe?f|d8vu}NB1s^xdFS9{ZqeS>=r#a?jNwel(8(ct(-hkZ1$5J>Mu!V{qvUp$R4& +HIfa)`Jn@9tQ|vUnJha6t%f~%r?*E*Z@v!W8=S|LEY0uxVVS|a)?EN^{ZDKC?fjxE8!ee~7TmJdH<-f +friEH5}Ss#Byp1`%S%j)~bxX;H<^zdJFc*bw7{mK&=8MIFP(%S9LC&SI}to@7g$ +#C;4YqdPl3F+yHDbFX549`eOPEBtUF>FX`tMuOe6H^k>8>J-m9x^C>P~V}AdJjrzm5`p&c=&x0;VB8J +NqrO3?SJ)b6LDYT$cVQ8`s?uU=%GV~rJMi%S;eb04W6fGrYH6uHY922Nawk}G9+>EFkL0FPuC$y!;_K +|`z5BAz3G1Y!3;f>|D)L@ad={Kcrt(6L?onlN*z9EVB(O7@L@^qdh^d4+eGwDNKQ|TXdB(6f|IW;-lX +EyqnlhuYjl$`(E2>OiQUh(UE6hS7Z=y*(T95Ua31{g`K^1-{}boSy=%OiyxYA+-V*OwZ=^5EhisF;EY +4k%yFGV*Zb@!w?j3nyc@6TS@;c`A$m^e%kvB1KX5QkwHF?|f_UD!4mFDpSkDsEnxwUh%mQ2f^nV*}#I +DcvWn*2@q+w+U^_vatUFUdcfUz+dn-{G(A5A%on8~7vrQT|weM}Jp;5C3!i{{A$7hCjU)1T{K +>|g3%`aOX=0<{BSf$%_sKx7~)5F6+i=o;t|crMUCkQT@YWCbP$rUhmOas!J4O9N{ +Hn*!SdMS=Z+BY~2@*+6N)Q*cK??Sim^@PY;fkp)o&u>~Cq))ee7C@lypj4I41oK`rqFt>1V;nKoQg^D +G%hNp`j(!3eoEbm0`OmD7tv3IH0?$>_r5#6&=ug7+ehRW%#mu6MfTsGk +q0BG5;L@9RGjge*sWS0|XQR000O8B@~!Ww@z`2JU;*cA?W}B8vp_nn1 +jsW*-+>SGH`khqlNs)syCqt6mq?rL2?FkF*JzcAC%+Sv;@gx1XA-l;4Z$`Z_PK<wcvKu`ATx~g}BU^AH4>Gdq#4ay2Sa+lRq4ax_j;IJw?z>CXyT +}`q^q0v05uWediY3Q`sY;OL3Xz%NEzTx22-qcw-#a=!IJ2?o8+3YbiVGo&ui_hHc7EZV#n26cL$4zdw(+E?y4Kn-}3=N>1^hqy<@NB>-+mqc0l37 +~c!hrHW2~V2=&+=!_p3%R@STINfE)#GW62W!WF6t6qO>>g4Y5hp@6qu5V$ST>xyaw4r!kj>&#MkQF=S +3ka2DjN`6FjTt&xXOX;-+~zHfuGGF%b~AzKw=@k$}{eyiJ&Sz119NaPdrQ8$&ChAmCK>wT|+PcB^N~t)o1Z_T`lH +KG#Kw(SVaUJ;zaR%Jd3k(8Vz>4vRMJ(kw~hL)l`}Td!0T41s_OiMd6}^!GuK{=n2q*>M9^n9S$_0O=g +1mXrN)?3K)DO9AJ3D^YB@?>xe-Q8hJ@FSmUhS;CT}U&jSw)@lzoZ1V65`d67=C=;JU5!@(Mad$nt#4A +Zl1pv3s2`TYI{=6fG4@uPS|ap>e`QQi`tR3GV|kI3v|61ABF0jQ-@G8m15k8V5oxr7D#)_FrCZbPVgK +u|y9bUsJEsXh+8h1Me(w{0_q{NQBJ1!(_tuxNpNGxNhF++4=V@E_zgF#uwEuHYUoMU46P6ymrOv7bE1 +XJHtlDicxbZbRN#s#s_$dMbNp0Wf;>(Vh)L(kwxsclhH1+nq-P;QHn^pF>LxNaLa+6@&!wMhAozD{gP +t!P&5dFHU!_^wqgqtbZnthf(MgqeG(uV#W3MV_=Idqlr(TiNSiZ%NQIWDJ&N^S(7&_cyKkPmxy3kt$k +g!Rx=u0ioiu6(x +~Cs5p{x3j(OJCm+BAmMQ+Ea{VD_=c;HeF>wrNhjy=SGF=1oi +Gd@^?(Zp$9pI&B1Z(JY4VcUj$#i*FPx>Rfui1mY_e?Xk9^=6b{NRSxZj7r>OS3}Yz|J`Z-*uwt|&n6O +^5_%_ypn_pi+yN%M2*0!Sx1CH*+ +yzl!}YYMNj00Lij#5HGuAy_VobfGArKYSJ%s4vRlnLPdG;%-ADcnmhA5amoE-dKg$_T+6Ur0ydsmSqr +Zk|pLIdUL+pmtbG{xCT8A0KJMF%u}LG;4^dDARF^r8Ti+Y31VKb*XiPRe1>fE|2;&Y!GlZGs{>FLN*_ +>cupRX%FIZUTwYJdHv^CL;m{dXFH$868N;rnliM(q{V&u*zmd&bYyskYeHQEe-)3x7K~od+*FHV%EYr +^WYXE)kPEDvX9&kPC{Y_XlN(q~sK;$wW^GYT25Sw~L5HIpDu>J~{&R*Kw2OIx?zk(U#UnC?YyQGCM_<}>NO;nGjMr)&r%UH?7W2jIhf_yes?@~SKd +v**Q*-Rv9Qa{5e^xJgd?5H)!`#stO!T2PelIb9)_(3!66NbN|FO6$|<$kCqe`CWfLg?C^oyc&ug#aDIqpXP(Y&k}XGqwbT`V)@w&-jD%@GCwWA9Fgk +;?IVkw${{Smuh3RF6*<2E>_Jjc4J+PscZj%`YCv%f0BmBHaT?;Q4ePdjAyeX=Oc$Z5b8I$9+R_k}CdY +b3q&Nw9yx;C*@@K5qovNERIi=&Ir!i*fgUf`SC*JN}z@qW?mu17bx`&Y}oGjXIcY5{~$vp~gndNKIfr +KQf_5+F*c@Gy=tas1Nz5Zlog&ML?Z#L`#!Q!T!OOL;kL-3f;yF(40Hx*tf7c1XvP9y0S)8r2wOb8dQ^ +&(~}!1l6l&K9Z4|ptFfb9f++*6`7?@56;nXF?!;>IY`V3*)nvd=VjXF3y3qlU$fEF%+HtL#7|X;^1x9 +FF+kC~x#F_ARb!l|?VZ0W-?ObWtmOfEvK(Wxc$Vz_OO%nnrsG*T<6#T;eOr+ms+F)GL;_51Y7*aXp93 +p*3rg@#gYp5vkCC0PI3qf_bA@KCFN$@Fxq^PxsAz7;g7NY<+s{vVE;%5pm*#Oa1H6UU6tWAM$f}A3jp +^iPQ&Pd4Kb&tu^klsb1X29RoUB-bRWm`Xzw$cXouo9y~z&mO5F^T8ZJTmYb67Z+2jj}6t&pImh_es{L +j*SSlejbf$jlEX&Y;5%Ef+V_V=OsdezY*Eq)? +?KIsTvT_Yc2M-o5#7xc7GdBuQYkDJL1JYjf88ibsrdEUFTN=E^LaqCX*R0L0`bg@+Vjg#6jGi_4%$7v +%(_G-g?f+X5+tWX4_V%5hYo_y;I@ZCG87PJ_S0QyvHET#>fu79#)PG_CLRG9-x_g&zDvuDkLB(;C)-n7{}}W_@F~B5!h7KyjcVxf7~FL5=+o0b2%1iqidz +Lcz4z6ohFto3}%$vL`UoHLxDVe6d64{V-gHe)@bjWCqDd)o89QWoBKi&%BC?=1e( +7st&)|e)Z +;2pJ203zOJ`kIkmH3q2%K?Mq0aopDEQRSs(?L3Oe3gL$n^n(>3EBN0wx?SkI}u@YKGc%d$skS;XpRL! +646IRc%qir4$zV-={~1!{7=y0hRB|baIPgsmQL=$sB3LmtAtxL4@jc<|dsJN}ZYI0UY@~iOrU5j5p3CV7wonf +#u=+u1TR(>B%=EJ~XSi!VXRlxTlRX}wlv}iS%$LgIk%C6=mieJrD*$sY7Y~6*##~fNu8~akE87$V*1D +zxWy!Uy78%U>ovg9qz8$S17(+h*qGEIsKUY4gSVo(z>3ZY~DuC9M-EJJsdqyl<1;xJ6)EPzrnN&Z&=B +oMYy@6uwC31H0cP;cO_GzPnCRV}aNnjF6tw{Ozx80~44I9YM!w1pD^kum3jZ;ijNp?69Ki+?TN{#OcP +YQIMquf^bofMWDr0R>|H=$j)@Q8SR=R2r*^of90cPU(j6PN%?j%s|ntX=#d)DTBM1>)B!uH2@kOHYJt +y=9QIPlJ#|S4EqCEpEtXL+w|H)qg6+n;g?rMdhJnTBpZ*PHx~rB(cL~;Rcp70rdf+Jp35-zH*)M^8rn +`|ZG6=oLW{-MSz4xGNDwFDiL7Z}OM@w-o`J?2?4h2qQ&cwnN?-ttMPxSjzTS=3GkEA +g1zAQn@B#^ip=>NxN!eD@&$FJ&DQDL+Q4IDlJ&EPPrn!9!vdXve^pRXJ@&uRfCq!h{=%Qi!BbePwwMz +M^d7lohbo>P0UQzz2IZDL|I-sj?|5wsVkck5P5`6U-}tIrc6AX_B`|5}_CaJqyf5Z9?J07@wil0{?XL +nVd4P(Bf1?%a0FgA=f6!teP$g^=n#9;Hx1E2(qxDsagCwRCYDCB%hHXqv-%if+Ad^3*8w8lcLe>9Wmq +Jm4EIFA#8|kUTj8Pf00n#Ffi5PBoSCc`_!^39!ml^i_az$gtvGKDM`j|1zaFjv@ZAeuoSNuz$LI2wCw +i5KXlATIZ#EkLMY#ayir8qaO47@gHZQXO{z3n`{;nV%hGhuSOJ|mX#9b#$ohC&!I +;odkZTM+Tu@Xzf}JdCbXoA=44vQ^}FEX2`wTGR5Tl4F9- +Z=gx4J(3!_@OF4^sYqJL2XEAmb%RMC9j_%mh)Z=?ziY+5!BAywH8^I_-TenAyGsf=f3k3rvkvGbHv_Y>s;7}IV)f@((r%Pr0Z>B8S}bsaB&d0SY3y$oD +AgnrP)b@2GtJ0D;7O{02r^h3I;awNxL9U^g9vJr5qrc{LuH13Ck8H0T*GVxQKmHmQ|~MTVVQIIG`}aq +0BfT(6>^FI#NBq~iP&FiYqVlu>T?O0_zz$agVbzNDNX1 +4(V!SP@f(4YF6d-y=J5 +1s8+U_PuC`Zlrd}PxgIcY5yZ98$j7K#p=5{fK%Xp6%mqF|+IC4Bgi%urtpzEH0OO!capD3fabC_E)JS +-||HeJfBl`3qTfBW&25Ihcq8R$lQ%SqPr?CJnL4{(6lqNZ*@p~n8FUBC+aZLtwb> +{PNaR97zjyq!^*~=fR5_EOg6?Ix8m?CJC`k3*jL$=}MgG#pjQ+uJG9y9Bg6x1Rf?|1oy1pH3 +DFjrwB8UM2afm{iQWLeou)GLHL?%K%qus`Nafn7|lKG0NPVz(8KoT;>R(b9W)*P>DtW1{=3T@Gfe1G5 +{G(7ZdhA=TEY^fqC9Oht;uhxNvfktvvuPFNUNsNVVr4<(PX@G;amx)lI2JC6U$P#m{PPe>ZMc14>rYI +8h5o~s+2{luGS)`mgtO-Ozllubu$1R*#u#*66yY)1`4)vSaU?=BmLrvRSSIjE0JLk{2PtM@4|*;VTCvi>8U?Hg*<)mI#Q*mSYyOrBm&bSon200(FK^h0h +-x@cXq1JKKpDK>{Ne-4-rA}mo}5VMv92iv9&yN3JTj;<_$6IHhTr{pX7Qq&Dzn6OaXZf8#a*LVz!K$n +y<|@3RQB}uR>vydrxmIXFtGbc8g7U>-U;@3R&Ht^jUhBk03o{3L{0 +LQb>JjJLiF->kYf+rc<=50-go=oByZoGzBO9V>Pa5f#&4*|GbGb*7`%94;xiy9n?e((K$leux5Z{MRF +7i!Y~jah#kAK;vs!c+R+16}9_xiHs2-*j(`cGqF0P~S1d$?JQ+b_n`zc7kbr$whwXn{ey$EOw|>Do;)yyGjYYpn2tvS +6*YHqEZ^K}Z50>A&39DU~!&5g9>B*xr`ppf*$gYabUf2>ZEi)?6=nSnDzTtxEaeWO%NIj;7Mn +uZa?Y>le_a&?ZpGOYSUG8w>3|2DBNtDTt0j8ERDtt^FM)LB}~?LIKA@>=ki34sdZwm$A0M$TXjWdrQ?bZAOmY +OLTfp$m>10_xy5kBTj*Oa+%}Q3BK`z=&u?k+A1T+SERFfd&CW=uP>C12`k=#)F}HIh7iQ7|*LTFPQVn +EgICNoGs!|o2mdl5s?EN$TF>f1E+~5!_djtl_2T-2(|+~(kKlNM8LOrHP&j0>@LRA#TAl-)A}Zfj)&R ++)X;G~XI&!8YU*h~W?9r=$PLOk9Jo+qBm_VkinMlkaAZgG4I!7!#evY)VlxMh3`?K;W6gP2a-V{?_9- +lG)utqmkPLm2r;0d8$#UL^EIg&TT>~%FVIwR4ie8H7t&xCjzNB_ABnAIvDfpEY>7o#)unAi(b_5`{)6 +f~}%^PtibvCa>{|EhPr#0x|=Nd%=5vI6Hiq01t<|WB9)Ctma@@~mT!+59>$iP1P*agjCX`3)K9c4jW7&>xkbgYDw;qwZ!igwFFzqN`i=8SDd9cNzj~3@Tjv25#lE> +srC=gPW~r3aS|;&h{ixK>fRVJ`dqQ;2TUJj!1?sMaA)ATwaB&TCaZl +lh-8_Ool(IQ-U7(bB(*!CJBXi*f>(X}eg9PYuA=eM4#{O!r +;1!YfT;9UqbR9e_}05O_J=s{|ClFh?t`?_*-61t9!6Xq1d~ly*KaP93Ox4=Ijk31n^|ycRq +YfCn52${SY6N440d4n#GL69qAxIhaGP<}+%-?p<0pQTQhceFYO3 +H%>#}3WaHFkb45!(&S|BVA6>pU)72l!VQLXPYe)*%pt016iD_?YgySX!lijcuAAUad`;#m3CZL*`=fiw>e<%q82nd#QI*R0dp(92f*M@4k)BAhKr8uPL1c +{fNLS`x&P{<00lD=SD*$rjFiG;lEP106kby2$v=Bl#Cq2d8XfQwjWR=|K#njB>TfGfa)Q(mOJ# +AtFTEv_qIfSVZ>!AMV$m2fjQ1U;q-{P9OnPJaARilk|ck@&zwA}xcGFX7hKRw%^_z(${wOjw6poYTt5&;oT?$dFD<8+*otVdUM^?wlp2(mPd2CZMmwfV#qE>4dqSf`YS8sP}U +3DR>D*Uj`Cqc^aGdpeR;8(oSKM(-V^~iM+(yp1i~j=cUkFX^ia6FgNJ>6JYho$ZUyXPAKe{ulb&Xq4o +5t;a4P}xt8Vz650?yN2dsVkxJE9P6lA0mW&JVZO7_}m_8I&wUcFsI?i0H(~(vCf*@`siM*z;i7UU71x +9no(_{Jy!7p~I*RL74dbA|}f!HMxr{^2IN)0^|jmo0!=JYV~G2`saK?v}%X;{%Pl31&*F^cB+=s&M-G +--N0@YC&I2-j@xoF270czkm7-}`%K$>E##`^lTbZxWI2%ybuo(Ky}ud1vdtl8cwoINrLzpUH)K_yX+q +Eq9a6|LK6mbd?nw^aq2Dpbod@kJ0(`JpS^0`ek>o6Y)$U59~zp3nfoLR|q*zeX9FDXHby +GeECc(RO9TnMw+}-9S91dvI^93d*Rs!loATP8zu +pzk3-dzVnK6l$d-jWAkyZ&hJ*Y%-kou@L?q0v{K}v+DTo*sp_&Z72slonD>R^-g{qkukF!j^9B0iWoo +7ysIy}D&hk@A_w?FtPsXvtR&OdLu?vxiD$Z^TZ6vfcV{&lLnsWub6dnS+Q%{s{1S5LtR4Au8f2Rbs=% +mp2pvNpoHH{p|NGz3zSg@ssTrUIH*{Tu%0W0jzYo+^b<1Ztj8i0B +eSr5D;~&nO0ahIRDIDml8XY?Xc9Dr0qq#Ld-vk)kkhhP)EQ2XIWeo;2AUye^n9Z7};-Uhcm*3*EEWVE +6#W7pC%@#U6*cmTM?cyoGSuo#)7S&<@lu~*G;Z;=y(W`i8z`fq(A=o9|%E5t7H&Xs(Q+c5*<0hpAgUo +w9j(!JCcu*8uA{jO|zb%`V_Ys|k&ztj*V&E9G-_<9z8R_PeUKW`IXNa!=c6gz?S20T;-XF2Z8rphH@4 +z&oEJW5)*d4Y~rNz_kHwebD*zQwsM4|4tRtU9_7a?aU5ioRBN<5Mqz2OUYJL}g`*OFSB>mGFQlzzg7l8!n#6hUGRMwZi=nP3w +7nIj2TmKWWuYKZMr@Sc;@oLU}T$<4@1~Mb1+#`67nJ!*LQG!=;(ms@6Xw)i;1j|K>y0F<;MC}=d@us{ +DHJH)WzS28@F&zuMbGHNuRcCCYnF%a6b +PQL~z4bs>V9EqcJ1Uq<*P)H-^_6f8^Zgbi4cA0jUemlSE5Vv!C_)-!8#Nta|^rp7vcU +@%XYy@}f}lItjmj%$Y2A3>t56Zqc(e|5{AWLZwDgXDVN2qM8a4};8W!~@@;mvx9{)o +fe6#BDNJ=#0Ji6k^L$(AU=3KOx|KzG8BH4PyuSeWyxE5TM4_12Kqkb&Bx?(>?rDAL)FQ4Zt`?4ZaHak +Y%<0)PiTkWLLY|I@W*zcMU-$NcOK&}IR&=C;@;iG($oBO|#zpL*$H9z<=yWA6lFvZ-Kxe#=6clpTs+a +i<(^9W*#h|2vQ2r1ED|O~R3Sz?HS%Q`#wCGao@ +aQLC^mhM{%b5YJ?{>zIbv~Ef&rF!5AtLzE{k&#MU4W|2&CnZlbmrga9LfMUUw6Dx-s78Q-BkJ`=5>At +1Ptvoz7zpLqu?G`(UW1)1FEXUm#`lR{j1tp7&`;78IDPw)`qS>WA>HFhkd?QF;#?@)dx^ZYGJu~#mNG +N>!bkdd}*jC7Fg9DkWz-eo13b%Us{Uo85!WGh-)YJEA5y(RTAuDYX{eR9MX;DhHA8JV;=gw@`ZBZM+? +%l+QW}=zL>eY7m^tjZ$s)vv`-6IBmYWu64t9qrI|MTf%C?l~^6zQ38$z2B-1XTUBQm@7o-v1S@qS6X4KYzLGpX +pM;N;wftJ5t`Q+aDv+hxVsFqVVV1Z8bb*qXba|w(=_*cH~8BPCkw)PPLGgVVV2U@*1;()`x+*BPA8Io%21wF)SRPn2kK&(?%aH&$VLUgw&nz_oSruy<;>_ +BTIa-vs#j!Jtx;F;tPlb{Y}>=BC!7xb|B6|qwD?yIv6H+YJghV<&;+PaJ0&m!qh&F$Qnq?Yj(VpCO{a +Y?z4;z84ENylL5kURX=DyT{|IpR$#CZVFB8Vnm6ozbI>aUORd7!7f2)*t2RVSb#ac5f41ze0DYz8JL}>h;>O>X77Ow;nxqhYN6!WuBX1nEM038w}W=Kx1pQ&`E5SWrg<7y_4PLX+CEF`pVIRA>pxRC9DphwB`~}ir<%<{Wd*AsQ9-BOEH0< +nLqZ3GXsb@YuCi${ce63=is~L+h?ZVQK+H$_ELIP%>vVo&t`yzNjt~O%$Wrl$4mjh*p^iDFU%-}`-^q +PF&D8x=GxSb@>4!1Gw0R3f&B={V##jgaGX^E>TRUaH*DGzm3|@|cSC-fT(n^NZbk(k(d%y)bZl9_p!< +>5l)OV^Z9_>YHGr~_am<%vuSNG~xF>;E?!d{K5D=VBRl9YZq0XB-NaFg +!?=!QpOq1Szbow!=d`AV0q5KllR*s2aarC-`EYKN_R=jX{J$@Aqv%&yBS(`bQhSM>VcZ-ftu<;bh@|q +`}@u_L+`l7od;LJk64rg!}*L12Gcw5fuP +G(LAkoe%7U|X7C4e4!gD6bKAMzBZ^jwJng#8AS+b0OsTKkp`?GzHBf_Q_;aM$OR~cWA)>b{r?E$fJL! +h?Gt%yQIIWyaE!}z&PIF#I{u=xe+TN(i#8QWUk3n>w_On1@X*UO(@%kT6rKFm*{DC5605qem>vqyP1)gr^_(c8;_(Pg|YX>Iirfg-Ji*It_N<(!n9pGAA>+B=~8Mw1hdM_B78A +_EvOOtEvnM)nrk-#V=Eri6#`Tc+lN9JHEzBTLu4Is;lXjkv(aF(#t#VLhlbXOOr1Fwv*FG|-*LEUM9S#g_#BavgrIn9+=RwxFb-kq3pJ-9Mvr=Ra%t&M9`2?uWxj4leusbF9vzsPhBkuYy@Z8dSZ9Mww248+@*0tH`4oX1-@lNm}=mvXB&7MK99VqJR&wCnt +{^>M${v4IvyJcPuqzda!$rLZG!Z;LWQu)&)QY0Va%-rE**S_i7&C!uUwU0Jmez{Bkb>!J3+ICIp$A34 +?%3E8z^xrbtb~!yzGBj;{MbaUB{&x5I``zcKumI4TYq~&6b#dU?Ia%f(+CO`Rl +mTOtp@aeFpRC +X>Y5+l82SG>#&+A?27Vt@fo&tLG?8S>`!3@)t$s<~60iweQ(DdD+#`mpovlf;*9e*E=v% +I0B@)Td6p>kc{f}tJ$LYE?izlBdnPae0khf9p2^IV(?&L=mCdI;Dmmeg*rp?4~I4Q@Mu?Pu1+j2N#RW +zkm-gu$mnt6f#E6GN?*X|kssHAVJz<05z5zjoQ26(i+(S4jsg*DOjjv&+J38>EDXZud +|BEh}kVMtRL*d&_dq%`lIp39ZB +$Jqsru78K%wE>K+pQGAOFPVS(tAYQNZ`MFhGG6%ULJe~;WoSh<1YTQ1h4)6J|#puqhiD5Uq35WOHKI(?WRh{lcT(hKTuZJZ_ +GMN%iUXjc#W-i67S9y1@`Ga~GnvC655#x01*%2s%x#&Qp3S5%X%_&mpb-aIUX;o~nLfJIh +hgK(AL06XSLK;JlGKq#S`BXFI$~>g*%!OE*Qlw|{a5O2q&BaB#B!jZ> +rlMjbDl!=uCf6O5oSR|qn8Y!Z3!bmgh29aj{E)nFDJtao$_qsEo`IZBR24=V`BnB;#3GCh)TZyC~#$tUzWBMtkw^h^1b#f} +QoGbw#0uJqEc)dAhP&CF9$%V~B3tp$?{joFBILjgjiu +Q>%Z(o!Zfu^jGM86_Cq}9jPa#tw(0`htwzN7Ym|j9Iu>D6Z@uORF_@Qhgm~e#8fOnaK)1X`TyTl%#cG +MV<`xrb{i_mnm(LqI{8V>{RmR1SwkPkU;a!dKxF*SNRX%_^II_Si!rwoA;l2e{V-f@l5{Gpl&DKt*y(uc(7E$t7DkAVrn+isS-ty+GaAt~yyW@h!4^A3N%0%54bEY=Z#p1^+iS@k|K|gV3t(%1m%+y3!aDF +&>M*`DINu^OO)NBR+OpO5e_U!#T8EL}#pTu#FhsU1-jH2aZJs>zb +VIuQ?L6N~wzyZ+-;){|lb7H6p(~KfSk!wzg5t_ItEcx6SWh2$85gQadz(YXwZ9_-m%NrPI%9=rTIo6V +9_!i2t%SB#HiG?$ig(QtJ9f^P?F~MP`7W0-kU29NVWRHMWa-lV?d#zn-#YM_2pM%WIa@rUf?Fc22#4a +G4Kh>$8!oW=y^$MO2yQONk<7MF{|NHxQTPMeRA|Di+w&X8BC6>aYf{`0Bwfp*loFZDGQ4qZz2LB=Y)) +CEcFD%zaaCVI_00a3|gvs`-@90ZIrlyS!8p)ktmZiY%$Zhm$hi|CXuT;V3u3L%VxaZ`>u^*6yb4~g&9 +TVzb#2x|!pdpI>8iAtn8CiT}x?HTT{V~G)lZms8K!21-Opvo05W~08!>p+16C{gz)_-B2U{$5dZl01WavNotP{ +B+Kqd7tnelwNU|P*=YcQP2bVloIFy51xPh&vk625oCNYjB`_ +|a$_-8S_8sT*qzbm|g`3*n3=-!iDguNd>jqtP9wBmxkYgJE4r9MV=Q=d)U(|)17sB`ba<)1n5jZ4x=H +^p2`rLJ3>d_fIfYsE7@Yj{gxQq4rj?Yu}IIlkIv$W3$#sH?AZaV(MO4{rmL3?rBEwoKaf!|3G*x@b~d +pUYj3C@Zr53cBSv%uh|wo*yaLo{hhDQXmf+;$)3kA*%VSsOc=<(uAgwfohRo8k#c8AQX+RgoRK%i?GH +&jx;p5hSk=+)9=mTj##;P)RlHBOE$&V^Zjj;=1$~;Mbji~H>3$5gZJa$ZFP?h5%QME{I=69Em%bs#po +IqOf!43zjt)<4ew&cDlIrP!#e*}$)_V6w#U(3bq;|X&@W-|#YJl7P|8s%Gd$YJZr)Ifm6K-+KJ9LQ1B +1K-?3J}d*QY_3zpXG|sfeG~An>sTSq11o{#lW3_X;ab1FED7IoQb;jGoqlyy~ilN?o?%)9=yu=p=eVo +t2g%)nqu$ihPE7+`?UQB4A*`Q1*oq?zMPhdMy(NcWHBJobkNbU8mxPbX^J_uaMxLY2e_2a!>(Jy*WOB +g)Dv$CMMd|9UvSY9s$g7C!w8};UL(Q48>FCH$7xL!}IuVA}eo@E|h-Irpya@=b0^J8_a1w(~dDHBA;- +sb3yKY8SW9^=+a@pH-MNTIa;dr&?4H +nXRlE}dvd_3l9$r}Izo=4|d%n37KOzkpQk}hVg71y1u=DlVq@?XWyP!}9)XP}UG{0nAoI_LMk}4T;)7 +?|$Twtg{wvGjHT+piHKn!r4Q*sN;b=!9a$a~8*_LOe9#xL3&_*+d`AXm--lvjOfjA#6@czAD*IUQM%W +6nR;9dj;S-Ak8Jb#KLjt}|G5;LVmH2M>UHhwI5hMF7Pp(Q43hF#_Qv4~b)G%NV3H9JP;zv7!f3f)xZx +$$gbyFGN;RI}lWixmJd@&h!WJTsEahO!$mk%PK!zfn%4C?Scbu^>LV&6J8GCi+s_4SZG2`aC&q7{xKr +L0&fq{k>IV(L8n7;b$?!T`iFCCgG8L%Pa}=VCITwpPFIB(=vel$=tNYxZaR%$s$mcnbSW{Vi|~bAbs_ +nvOjmxW&t!(5>) +5_dU&J6Sv-0HQ3AYEmXY(r>crI=co0HMRBK1VJiOKMbJ1n5yV?=vn0gpXa-JaYl4LFoHr^_qBOw&>e3 +3r4JYJ3rz39#r$r>&2Oik!A&+);+w6USPw8;!`6rx7J)bURez!0qB-47#!8huAFPoeN{h;c2wHeDq +aG-vs4Xfa29S4!DHDXxC$oL!M>R(4C1#-dxC9Jg!!*|TTzPG2R@Rl;hhzPr7Rly9p^RmA!xvvaLRdf7 +xabo|Jyy?u8mSm}DnBo#U>sT%a2G|Zv0$wqRy#U0rzO9^nV8M^8vlym?sF2xn8ORgxOSA6VvQI;aBy{ +MLPpwJ|pw+opFD6cX3$6UB(dM_=Y8*(nec;PI#Lv@hXSs9ULqAYYzd^2CGL%<^iMo&(vwD4gdRWcDE) +tk*c#Vc;m&X(5*sy>IJd(sp^0%SQE(lS&b?XZv#rGO2h{Hk+PQGylHdAf7VsOI4rB039Fkp|eb(1D($ +=UUedQm6tQ>2ykVjMtN`s!?_l84*Z~$m?SEc$eKnKrH7(2mAbRdUx=`TRBE+tdBCqE_bfS=i5<|51GS +a^%Nbzso&VPiVIDvb5$&w8;yjv0gum!T^A)L-I}GP%>6r=O}$nMCjII7GCn4`L4~17+D_759vttl@JB +PAP9@K()xN?N_Xha_@76q{Zke0X+16!O0(4%wHt}2>R4OUfE&rMCQq}Kb1Br1cU +!r(ohoZR7Ox#-<6lrk0e;jJZpE`wvylVD-gRmBx8w@WT$DganjtZ+nYVD>l3@(yDRJJQY0j^p-7gbWGi*^+jn +LFkN`=^b|1Gr>!vn|$6zoR%nJkVv)+>)^OGQq7bCVR=Djblq_f}IXK#~qlZA_`g4u5!HtY|EJ^1yUU0 +iW?wkfWXn4Kr{;@ZnN`zl$*fmeh{>_X3T&e=Eb-kzMEpSZnHi-(P(9{u~RTU1x7^u +k&u1MtsTRf_k%L&OA1c_)R#AI9u~9hf+X}<^B~kV`-MG!+;7_X_{mOn{!5(@A_~t-#VNGgmVzU1a5LT4MtS_{wTlPit%FmXd1 +@0M450C?HEYJ=0wby+)0i5f;BL{FVw~TpbAZLRTSyy>C+(bb2lZu<0jeSX~yR~>HUT|@F1z@ca>Y`v4{^Cf7%6 +eP)}gb?P_Gy^h_IB3AxES0)F +C}Kzzq3D+!mNTG^Q=FMsBpJf{xtxRb(i*YITh0QHt-H+cvUJ4OuxtEEi&?K)+q^Q`ygY7g1QNqXyc!_ +yYHmV5-rn43b)RPYY_`G0^;S{QWttgt{EEFgb}Mk79){zi_U4bu!GBRpSSW=o7lk;#@5-Y=0TIu)-jnBrh{DCrphXtq}&*J%KdP@0SZVcOe +t2?^eW@9 +@4rBbspwwP4UN%!n{C3cA_Jnfr$(T5Fi{ExjBjb(k>2W|AD_;u+XQ_6l^8OXo)x^DXb)lq8$*`3cEZG +@@o(=w&gytoMt20FiDBH0My1^+NFK4rFlEqFJXX7i=coY1G)u-thE(Hd#=Pj)b+ +WS|^pRT+u0f*;u-X+hvowEN35b>6(!-(Pmsy8e>0bt(3Lo!NLA_-dQt`T|{6^L^oMuFTTBH8F)(!cvx +OJ991;avB=s_>oP}`WusUk*;tu}+ohU?qNK;ul?oZ&Ku6)o0tozeyh+4csHK{&9-Uhm_Z-v3?( +6GTUQb6x|G&&VGpI;1?E;^bg8Y$cVOw*L}J8dPwliWW_zkXzQ>^=*Muvi@sU)JX0&338Dos}zx0y5dn +{6R(z)-2gJwUOS}N)+m@nOAt10o~l%w +<~RePQ$U?%_wDlv^ZRfouyT?JMk{!#IX!lTjWLP#P9RK?FnFD8<8*H!7DKN<{0d6f8IR#!EL6NM~+2i +=I`zDq)1V|OvOq^gOrsDj^sXqWKD=fR|0Y=Plc$O8X%(4r3iRKW2?gH99O23$~~6}G5?-z8*x)&L7iH +JoQfz;=YCp{jX_$ZlAS97laMZmWBYU_*ivx&nfd{{Rfdv(Q(1CP%aW6~hxEKUrj63NBEWdFvz$YH+00 +4t6ET?IjDq^Y)8q(`B<&0VDVzmSIEDt`Lrt95!#j$*?Cl5a5l~{G^aV8igC?LAZeVw3sC{ZJ^XZt{lA +9%%gUPM)m7=>Cx;$Bvy`tS*?~vYfiJ7U_EnT_#$k!j9pF6~P3)p&Fb`t@CQE4dd-H;4_0R +>eDAoe^)R(gf*_?^kQJb>g@oxOe~8XCk>5I$O6ry5p4Abinr*D+90syMj@dL(X%T^;v$QJG40*%?TdMb}G^M(lK$ol|6)(xjF3DUnjJt$U7 +om3rBY@tT#^w3qRD^+aEmj748%LA&4~82FZr2;oQ5fW_LK4y~{5na3YHkB}sI5Q7yg+MVkQvrw4=UaM +p5E5&>u=t`s5|tA=KHKx@7Lblqw@XYyZ`)d1S|||Pi|(jKk$>$%^X)$vT5+8rW4 +W)uxE}nn!GjfsZS1jUq+W*=3z3u^19M-KPvm9XeJI`3dhL@4<_@+{#LQbYEx@4t +PFYOZjrgX8H7d28h?<{TpeH97nb_kU2uz#q3?K4@#V&;FiV11-QS1k;BBdnq58>>k7h0Ru9{i1Y#YUF +Ztxfp7a0I8pAA`^@b-Wh5d9=VVS7A_lFsfmT&mV7JXxt}m`rzVdxQrR=)RaKay9+e*q!1-*WSF(p>C; +l-W3KY4%h&Gh2U*XQH_7WSAVp*6!_KK{z+H|%I@;{3W}ATg{LZ|p*PqckafY>IT%f*IsCmWD48aw=BT +zUi`!9D!n9MP}cKd2ZzErqnq%$Sj)%I%N=1O2->8pm9_R>28|nS8hGVZqO>-7^3iI9Fs)~BySOE>J&@ +<-Fl2w6M=uwnHC+~Sdyfbr)%lQRa%Rvuxf{0s%Bx-ywt&(;9luf3!~~-ui`&hjq@s1=Vh}H1WUHD>W5 +0IMXUh-qIr&9@FVQGDQP1!K6yu6M_A)fW~zJgv!=?*u?{R1->-m?=2jX?22^@lIHhSrfSCf`{T2`m%+ +6Zt2B(y9%G|9reK*&^1}KgZVW}&`Jdg*#z6LVXI+p^t3b7)D*aCtHUUYX5M}%k8*cv77A`l+1RFG=)2 +f$@l;qxnLcL0)V;DC%VI_!+N<_+=K!W)wbZs@7fez!{jsL!K<(bPtj>EF&uNl9zA +$PcI^0vuS(4JF&*@L2vSz<$z0wzuJBY%ya6n;{yBCh_GRE8sLblSmxDUce +deBGEUFKGJj{LvTd|21!0AnPB2{4p^a*w&b!pq~6X(+TOrX_U>z-2aHZw2*0aIlb*pNHLFh-hv*)i7ES6(Po_vsIji?L~9%)=RHE=W<3cy$D` +PxER>V^OQ%J!vq!WKrli|)wl3O4+2`Jj+q7Zt~o*r_UI4=UKWIMQ`W|_XT0#_DqHw`uVuzc~6n4zP4(7ZsXIkU#lRd{CUtUgj@OlYt6<>RlQsG~DSsS!Zqk}1v+hz*~5VSP%e9pos;t +O;Yw?O+n*~#54U?{wN*cd-X)3ODpeETs?4}@5G_(#CUs)A7^cYqrm$iu!{`%6%8DzxAEcvDrD>?6UX?^i)#8K;^eZkH +Y662jTf(}~*v(fn8{2nfv2jo%iduStpoae}6`VR%hZu;0IxQ0lrYjR7Fk`FWnDCdZ3Wm3qWM2^#&I>W +s{kxJiF~(Y3X>{!CyPtF0Z&4N%|(T@kg%+Auqs+qvDtB7kFPdcjxj8&D`inrDe>xLTN*=PzZ^ +CWm7qeMu=NddN$&_IQ>|xhO5-JFs@l$ISNN&yv)!-|1C9?zlL@AQYz1ymLUtM*PFj}Yj-fQ$r9@9W7^ +w~zDxy;DQ1L!FzaWjgJogqNxFrFXwawksBJ;P<(A-#}*fFvZ>IheRl4jn*g|LN?WIYQ(P%vKHn4lrCD +F!09!Gq<({s*$Xj!BrK>;rM6HqfrjvzjwuiqNKX(}n1HDLAWkT55X&69DmwE3pXIymGx|d{0pC-JETb +m5N-NO~e^dh>^+akkAfY?zTkL5ts~PvMBt3g2}!Fuv|57l5!8IUDu#6<>^AYztXHUr~c1o!c>>MZBky1ck5N6(qR%H(+!FbVn;P=B +^Ld*`yR37E%%)iQ-H1gN+|@|WS=6_N97^A=u){r-zCI~soR9N}XcgILiX8y*gZ%zk$0zBqg=kIGtt(x +}c*;)Br;FO+9QIu2*%t%?MCg0_%Mq}Ha#4v(H6G5d>w+dnG7U*iI;aaza#L9snReo|;{a7fI7lFQ5m>#!ro=+Xfg7Kv +#kRC8J?SNv>4lld2UEs@)U=e&L5m2aqbU$)EWHmLM5DZ8LFvX>xTxfwZCk=5$3sA}kfDH#WjZ9JccZ> +xtIHqTs`V1*ioOIX^AO1B+YX`!0!{VW(MmeO5*(DcjglTX2Xy3h$B1~OAPibcvM8UK2K;`wYprxCi;I +=zt~9gliu&csp@vJ4!;$mx)`{3bn8ATs3bQV*VKW5*?CXBT0bu`<7TSXrpX~umeCXqY*lE(e!Gb2cDTdN9XccKCdNkp*~n;T_&&gT6Zu4W7Rck%s}+KY!6O +upAEaJ;mee?6o$y+Z_EZ@L@b+Lm1R^54-d*8+2im7jFNPOeU!f;(nUE7E^RC-Pdwjtzg%Egt;EbvmLv??bnYk184iZnfG+|)EB!VPRheUc7nH+_JA1P9xfz3_4 +izMUVfwjB-~tO*z8lXira$f@aP${pS#aK--Rt=D%MCc-s0upRc#|7CtJi?r>CbDE4+ocnuJ>!UfO8jz +P72uE&RT8Gh_gr!LYQ(VLp)rhw3Sn32Q`mkuXy&;8C~?+vm^|3DC~Y{o^sA^*~FatPtBjz$BzSy4?hZ +lTh~o<{KuAkdzr$_1)uM_GtIqQh#ky{X52d*g(KQVl1bWa(4_u!dgsCD2j4OA(Vo)QK-|cXisz5GY7z +nN>*l(PfV=PBOb`{d|#yUsmv`bm7N%fh9hs_W`n-mw!q4=4EqfFTEiFa;bCv^d^j9d4Y5qL#PWLMOts +$HxXF;&ZSS_%U`6cJD(z^_n4SPqg@QihzO2yq8r9G_XhR2@o2bJ+#&k`#K`1jD>T-j98a(TRlsnof<-`uZ1x#-NjeBfxNmLhYA!cj-6nP!OMgrdjxYRMo?za$qh +)~K5L@}qKKhRtB{3=7S*#Ia75Y{2T7Icx+^V=!%X*ghZ-~D{I+y@E(%v%Zfwr2<=9|Y_0Rc&MW(bJ0$ +DClywm)`8Di<4nyZmXr2eNf`QW+OE?*-$h)&3R={-Pcmj@;0X$jQ4#yhY}yxDLoJ{m3*F)*JB4E`XjS +d!L_doInb|DrW~HVd4JIee&T(S$-ym5@fPGDh(QZYO!uAB(NYyDu2JTRVT2tst9+SJWy#er%6j-lQm? +0qz^d0<;8utCFV#D|kRK)9-17Ao6;6m~_Qv%VEXOYaQJRq5nxb0I^rwi8P7)cfE4`vxo;(Iu>ZG8nl4 ++OKE=proSnG{&FqSZ%IsUYm}a&TuIcXE!?0+!b|Lttb|IMPc~f6^EN#&8MqB&Vd$SV5)_eW +4jC&upajQY)`{mdgD%=63)|fuEmz3ks<1vMQM-m#+S2JDot=_fXyUdoRkXr +10FEAgk@TjY`*0w|D%kv>1e*uFegV)Kc>==TTiZRVM}NkhQMdF$Osm@-y#(<(l)jFxh(B=X1)0D$%LC +D}}23lpe-A+RpFrXP^ByeWSyw?v>-$C&V!(iN9O~)9Le*hxApC`6^i85kd{nY(oKs9_o3zd?HUqDVIO +Tj(NCTMf4?*+9kurmp;mg3M!2&^Fe6e^7@}R3rZ`MO|x#M0qN=%n(i0bY7P;^!K`yT( +5$?fsU6Qh9%6bU2x)XvS4ShePNt-wFwUCQzQpkGrTN54!gzZ%Rf&HBw}BwhE&F@u_%B4stl@B1os(Qu +hq&o>+#0w_E1mbhS}RbyWKV=C4ruwXO17uHEP#br{gsARZm#yc^iwPkq+rR{tL6Ieo43&aYy^w7T+s6 +@J7+9OUrqxOQ<^`*IZC6f}xuZ(3SiNLhIK= +>gk;2Y$SFMoy}hc|4N5X@$*70^Uy!O^L;Kqg{Aq(ctC;2fgXPOg3Uu71$k>{eS0+MX9cU}azh`bVD{t +OksmoI5tbaafe7`#UJA2I#yqxrZ3~j5AYFS)BKVcVa=rTe^5&U1QY-O00;mj6qrseh+@Ljt +^fc4Tmb+Z0001RX>c!Jc4cm4Z*nhWX>)XJX<{#TGcqn^cxCLpeSA|@wlIA1)t;8L36Mg80u_n_78MO3 +H55{5N>z%1KthEUe1uLW;tZB^07nX~r(t?}jN*v*j&q%RWzhTL=*&1XD)=#&G}yF)S`e`gsMYD!T~E~ +_wGFiNJZtT9k`~nG-sg|^_x|(pquF0;f3LmvT5GSpPuZP&83V&GM)*?{hB?fr|D4Q!|1S=InNwfQWL` +{r`>MmbWp7`#%Kx*ixm&7#@zd(N?#;dXuAl$>7hLZD+LT+(|2+3+KhG_`!;^dOFE(zvE+Zp7Pb=fT@s +>^Vw%s*9@%Nt#F3g_`?sf88^KH~s=HE=+WAm4QyD;dr)52cy@G(xo%Zs}T5iHE!Z{@MDF)Hf>bUuV)w&qoe5wmw7=)2eJPZ9V9#JC?LWn-K0bR +Z9dO13u%!$=4tm2H1H`MV@_k3y(btZ=l?JVZC_t8SJ2K?x*vzXj@z_@1NR??wFY5djhDmZGR%hSsyE) +n-Ni7o^R>RuhQA}1!$G~y>r^nNla91bE%VFo!G*7@-dcS(_-S9E&&*12FaAJz)tff|0stS*RL6jpw@h +~>+$}%e!~g%^|INSEQn%MX`%5RIWRK5o8$0i<}9tYSzypeAq={f9>}On~uQVY +>axFe}dn7^O{414t`C+QXFpisjy{M?Ys>Q;DjC^$HvD1HTqj~@}xO?DMCj +2i1En-oP6j%EjRN*067DjT%FO?0pxTCrfMjP==-P|2X%a>NwQEMnX%$aFvy;iwrJIO!FPlF}S3ub1MX +Qk~>t^CO|+IfL@MQfxhKn$SJl=idlz54i^Iir+s8$`ES?#hM=Chg$5dj+kX%#J?FJR*)N@F#)|#;Rnf +s*+3@2mBus76QYZl28XbrdE)AB(G_>ZY7Amc+~Wn7{y9G#7_H|>xglarJj +JPJXCY){4-Jwn;$c{;!j9DP-Yj<5nOdvqnG>=t}jvBe~qWLd9k8iVx$%ILPc*u8> +Jq5*wJr!JnV0PK8bv{o7{=fuI_wSZ@>gKmILq;Y8$X>@(Ro{v_?2OJD=~&=R5Mx->E>ckiTEGITv49wm!j;JP`TWP}T=u$QKHcQ}c(v9KnK +HvMY)wMH(gD^KHjWkIT0Y9!s|*PpNfCD6vph|qAsbl05l*gmo6Qrn%)_&>psgQR?ktfKChj@abf|v?2 +6AP7U$(CSqrd|_E2%2)g9OZ&JK4V&7)+^QAfrs?98)n;Z0Detha~#opfgI9#oXNhw>V5_0Pf4r8zk@r +x|kkjWWVH04`8m>4n6(J~w%+j1Hs7<;|4lEd;PYpK{s_i5p2TAX3bjmq)W1AsdwWoto$;AE=2=n)t;4 +P3%<@H7dn-vLcw^g!gedFKSwPWh!G9W#GXGziz%WFfoQ8reU8I~tblQs3YVR5GOry4AP-Ek@&V2-whfj)9#nz(_aH-tRKW_(tTfQ|Hcn{;8!-FZuuL*L9Z63x45Y{7?~ +#%AymV1fLJwqH4y6J)#0th@*)FYYE-|+r|J-hD`ksrp?94(;4>=G#6T!zNn({@Ju$Ynhxe1m-DVT7{q +9s6s^i>5Z{1;k6r`u^APKW@OXsGVM)iB61Xz1sSTaW0K1(&H?IPxwci +^dh!e-w;m+PSw@)4Dq+Di&KSs*O@V1b*jT>8O^z566BP?~Kp#6`naFveEqZx0R`+4%4^$_FJ^G&+KcI2YLTO*`WsmhIGApltp>A|dqTn9OISq;li%<41z3OAC +0tW;DRHug?Pnb4G0#q#=hnD7P4zrxDlZScgl<*A@6bu&Olw90H7L$Z;lH3WIo*E{3V}Iy6CJHPpkJ@f +*KZOT(hdDMevT+lXqKz|?TIY!^kWtk-v0yep7y5t`C5rdsLlHr2iq3bt)?Nm`w=vQMA(7zx +NdoRRFGzYAsP^lg^Btxvq@gCooA2|`1dL&xG_Y%b5*+I-mekf6Dkto81+>nqB3Bfav&~zehXfcE^pD) +DSza^$({+wW +3Z4jgNQUIFffeV3an98frHN_T(Y>pP{`He_G4qnzfPh1q`V*YKC9P5_Kd@@RdjX6T*x3PB#mxfoumo! +N0AMRXTc;#C57&xJPV|8EEx}pfpL}M9P-*E0B@G_{Iv}3q3?uX-m3)Cv3~Z>h7}y) +Dq}67bt#Z7@jS<4IR@tgxE8kO9VC8_?Xkh-=Paw0qLER#={Le$st#Y_XPm!*-X`tB77O1rxBh{TCz>; +mb*mCgfo2qufOKzTy9FUg`OatbGa1-#igZhur-*7JeKAVf9l3h96Yv_dqsEJj|47PH5<%G~|bnxct?n +IY_!n5;>7>1kRN0-#jf(mh6(Dqs|9w0 +dgN0Mn8DlVvi_b0SEw;Fmf%x3lk-kNInun1xFMgG+Qo{t;2F-Z%xi;ah=_|dr^Jf0Vokg7jS>8gf$H1 +IM^`aSK`QqZ1QsbbVK(v>M2V@&dun+Yl_;X1;w*0}aJ6%pSWZQo=xV2>N)>JLb1_%v4j6;Fn$CJ~wvG +mblo)LwT%AVw^O&onfdX_qqycmc19VUT6`f%wp<7mlpB1CMM)?$m<3U)2h%Dsq$o)b($3pC8jE#~Qpo +KcEFsLX3kUvw|!CaAyr2@heiCE+&0}K(>Fa{xl{89_jJY;AVl_tninB{W6g3J8R(7@v=`TU8_oG^ +O%V+K3RU1!OixPKV&1$s=O)40uU+}Qxb@`0_W6=yfmylEdQ%n2#xYpAD>;|8sx^3pFtKxMzR4*DjO78 +$`mKoqE|ZCTw=z`?pEikgq2D+iI@-%=XO>I=UNW+z|Px)%o#+F!srwl9R +~hJDYJ6LRlx5pu5$EnQF#HL%CQDY;bHBFF~$xpd5F!kjIZL-4;jKT=yW$W(HvQ +dwNMYs;neYg-dUA{VBX@$&b>u7^EEnNcOF6E9`U+qwHqnRpLQ~zdB&9EHLFkB$weK|2~=y4Da%pO47mC~v_)_$gOU7oqW2^FB+xW;s$Nq6Hhu38{E?nX71|56~v>M=fPAo5Sv@CiCr!zc2j^} +suFnTZ@u$iaWRHj1$SC8gVsy`c;Z?J`^t&MEeHg(hR&r;JWl$8|`z4FdG^8)a@nq{|9kGkEoK%lgnQ% +Gzk?mZA0ddx`!I!f#?NL3_stgsoff(MQlEz?jJ>WF^+>ijizC@PTK1j`Ohdx7rfBDXJX0X6q=W@RC+L +vR4ilTb-&h)$arEEHRSP28`A$sTo*0ZW8RB!UaTt3y1)b+$s^U1Gv3x{=e+uuFqg(Jf48!eFG^U2!|z +5rqlwPn^+ci90R;tX2W5>2IscOhP!mvpTJ*G#%>)=D<%2Zx@lb%fRK)3yOsnx>?haspA+Kx>YGBvX>1 +`1<=e-SLM-^GBg*B(nB%a7<T}!ODZa{S_l84bKZkDmQj*&t6Ib_2%T +3()9q^$|kt}Tw&l#vua*4qrF-W{6)>67?+qWMkoC`!B>?c4QI)ZrT3z7_^O?j +;+b>~c4`+mTTJJs`vtZllf>&u^dQ8kFv5wlv&OuYf$GT;#g*1hAkgZC7W#opKVh4Y?)@;m!9OYli30 +aX1tT)p)El{4&%vBRe_7;fw69l9>!IT!L6_rxnKuAngNX6A!Cs|8CimWF63g}sG8lPaubHDQ2l{_W#; +J-4d+)#E-R|iNRc(!FVrev1;G27sUoC|1st9%u@sZDhXG%sfL#wWxKWPw;huAy<f1JWb|5fO+O4bc4iRYCzHmJME0aXP?13c-JBVWdMjG`LTGJWu!m8@p1Y-yyT%-UQCz!l=!FpqjL0oSP=saF>zq$m0 +WILjkhX!!ge6SI*kcnsWmm0fffKN)5?qH?%{13&7-o7RS^yPHqqDitn{?rWMsz09^`8=hs_(o$b@JS~ +eZCkBUPwma=yl%-Yj?>lOK_0|*ev%aJLYBP#qRBGu>nmzwcdNp +@lmN)xs()E4ahCKxVx!C^dA1DxA#mF_V2MOcpQkKiW28KkAzv|_B)$YGJNCBo8{T)hU@U?nm_u;O}f# +ZAdXyn#|cpoN*uB1bcZ`JW6rG4f1Y04b@O;DUi`klz1*u$q;r39GlKUM8$cCFX+yZ>1%wg=4ut6*|5F +o?j=HnE6aEc^}rM&Se%hS($P#ses->w(|P${jAV22r%-vgF0@^L6*yW7Q4x(#!9kr2-IcjB@H)Gy5@G +EN)YvCamDg@BvhmTX9eB0_CR;9&$yzy@0*j|-CVK)%XHC0Gx#9FI<5wRFmpJYF|>bC$Y3V*FKDOAKofYmx&!RvYO5gj`V{{v$t +2r#-mQav9$Fgm)DfWE=T9Jvq&ff_GF*F77Ka3)})P=`Fx%iIYd1sB%~`4-eMfSWM*$y42oPex{;IBK3F?jmVfBDKNy3aLaLkxdbILv{Yx$QlBYrzYILA_x_EbAnv +CQ`Iz13AQlJs~ce7GWi~(1@;ah(&|s%efTO*}x=H*@J4MEDq02kD^B9&SF>(He3&nFVUb_vH+n7ECw| +qjr;^70y;AE6|%U^9I*N}3M0XE_PLJgxD?oATVz8Zy?lk+>&L#3PFYbzS4RQg$)~u3MsS{d#Iyh$$;BL)O*KO2B|rx@XBLj^>(Fsrdk=1dML-HI`6*;OVRBIr@} +<(JRiwH1hss38uirHI=|SzJle-ru`T#n)M)Tp~QG$ufB-c`DI|J5+HH`!Y4IF;wH%$#En?GD10$B@f +Sz4dMCdna=|1-tSd+z(5AZOW~LT;Ag2q>xv^+Uy45VhI +cU#;JD6HXE6lFjU{-c3N`3@7N(;I%on}|_?i-P}jKv}^*lNaVd1xaIKLQS7)c(1XKtw+2LCzDHE^&3Q +xH>Mb?vV|6h#@S>Q6&-=>FZWqPa@2)l#3MLuNKC#66Zr9z%u0Zh_=l>idv=AfvdIrQ8yMWOLUFB%QlTAVy +1YzYaN~xFv|XtC%Z}Xf7PHc16J*^-0(3$iYROmf#<0ypw9MVy+$p>w1DF>Mg;&baxpP{y7AEhj2_kDh +B=Us-+6dIKy+va&zUM3uF~{r$90}S1F7GG%8CVDVE>_0O*f0VOSxqQU8#aqO`_4>NX83Zy?#|#r*OOG +cK?JR4vcwx?_k3vgI%pBHKBmy;ataYEQE7mf%?`bM-KmdQ=k!a@VW#Qm}}N2Mk{SSyXK=xJ}#t +EkQiH7MfFrfnWv;c|MuNlt}kAk}X?iOK(-Or9h +(XJWFB8G$c$1uGjv?lL5i#E6KIwbOw~+ebiVhiHD9Gm4qAmv+)Y4~h*!iMR$t +59f-99E%0!ykdg{sXg_4^XJl({c>$xZaso`xmk3w=&tCd_Uxd6-6*$d95Dy;HtBuz(z+oLUB@R>r?Lq +TF)-Qx>f#$f_>B-%!Dj#_?mJ0sfKCxIRa? +!5zeL5YM^kL2v$jX6I7+Y=WtGm_+1({Rd`Gl40b?J44uW_$J_Ducc<|8r8fNi`*A!oedzHxbwb_L`CSWjf=8+IOqe=x +!89|`tc!d=%GDl>{9JZX*5`f$e+g9OuV9TY>I=mAU#VY{R6r=3|T^KfXDtc~hnnV~}IxKbrSPao`IH~u3rR +n3r`8GEb4_%?2A+}I-F!nM`sLZx2`7e;T-3}mc<2{XREPmeQaDn^5=%yLHy2;C7O%vMB6W*TL>QVz!r +unR+6lnk(1)Sw!ror!qKXA0HJtq@uAAZ6Zr$m`&Wb6~gfyKizb8lOxvxb>l1Va>0Vmh +G{HiuYJWR}Tsu@n9=wlRh9=6;!GVhIcr3FO^(zsU2$N->I!p7%oprxx5L_e5y9VOPg>rc^t#8UbS~oQ +~=V0U>MfAg1fig+riHg3ZJ?fd5T;=y5yfIZyrT`pha2@jMPdc3*&{OETApKkbOGJ6%?#7b7TDKpu8uw +kbhC5rLs8E!Yf*3xuR8oZ+IXhm9o&mYak~Y5Ge&7v!(tH@My&zBSnzZH33l(&30DhSz)Se(z3kl)hpd +AR`|CRByk{NUsasPZWL!|STRRh!vged`vhr=Sr{7P98ktw;o=ZybbPz*y3pKhp>=<=N~55~!UINzKkn +CIFP5<6GhnY?!8yi2F9hTlHa>y^4{CK`Fr!ecvA@U&1dBP0aGV|LW1&O#7IGEzZnfmkR<@XxEmqW7FV +ghI6b8B>>JQ_oM07P2!%DN1`*M`~vX%R0k}M6d$;hns`aIH?Xxm{wY45Wu%89j9Nd8hfCq;l*E-pq+2 +2xugT~R*ALmICyz^wF-yBRHxjy#Mf!E4bBZF3&Gas}E~k(abX$tIQoa^bW0z2OE*AT0dOXhflHa>)1{ +13qy9-3*jDLM%J63vlKVVJL6sd-kw%ePvY0qkw3La86P@(&VQB$a@6ieA1$z!i^Pn8FgHSPkGNr<^z2 +at_C9A%+?L%nt-Q0OCi^z^v|UsByVsl?+vGaUO9YfqRf30ffKACNVYHFj(TxGQS8c6G?h40Fd5I7_-y +jBnVv{7qY@(Lz$du#0b3lJOB-A;g)>Sq`QAV_X}yW+DjWm6g=~bv630ujJCIJ+FzOCnFon;jW8q7T13 +%tJHhqS|-1W&!VnwGsN?atT`p9jVbfxa)F@TIhsk4+MtByyjA+=}1BG_HsWI85Nfpj$a{8N-W=O>wS; +C0%t(easxH(^z?A +l?%TO6DH_n1=SR3{@W;X*`1vKIUyr6W00>*04b`q_`+fwQxF3Jy)ynpD(t8AtnaV?3SSdwbAw>mZ;cf +)ZmbpElfRUdh-LXL|J0&jN0P*}H>5h$JSzB!B#)ptzK+J3@<1h>-2 +=G$I>)qgF_G +Ry~?~i6Xts%VMaSinb(pmN$N=gyokZ(%IJPv|0oQPb1U=Ol8{Q9kbx=6{yZ%`6Q=Dj3jG-RU)i>qe1qD)k<&-^L35%|EwlrQ&qK3RAY)|GfJzO}rV-6Il +zG@gDNc@J);2m^%l$T38bIzh*y#a8d9aVW*{eb-^Nx=gAGEFvfVdMMqE@e2M{#VH8x=7{PV{P7_AxFan0_or~IRNW1)aW(r+sQ3=sDIDpFlXni39GF*mGc +$|7rRg||MR~9W|Kdy$D2{S&l2&fIkjsxlv!UcIiTRE2c2({tDJZ|MQ3Xv}$mR@X!e$T_~(!3|BWtR%0 +HCDwot+DFT)EZ0cAkPDm!&Kfa6(T7U{-Z@Epo^v@qe?W1065{gg!7FhY?W9x +52e|i#E7xmBlpe2Yi{?uhlBs57XqYyroR)eV=PeIXYnq|_fzVQ;5I0uy9`Y)zW~m**<&O5PrH2_1L%^ +e#qK2p=T5WOTErI!SG@Igap(R#`T|{GZwOH=@h@y9g<{s8ISXw#HN`-XzK0teGqgVOh0BwwmMFVg3R3 +9WYV<4A2bUl`XL~uAi1%?G_3S_SVHtTA$Z`zA~xr)Aac|RG~m4 +iWV9obqlB({~P;BO_5)kZQ0i(HB}^Jv7|hPj7jN2LyP55k8$NUlRHxq}gl9TVR}(tymlda$7Z~!_p2M|?vgCf`?%hH+J1juPL4Zt3iy~#O(5I^Fuc53u3QDV>UDw +j%2sOn`Q_$MyX33csAyfO?gbrOoFF!)&RE09C-nXBu!$XcR?fD2+&K~}O4A^!|U>)W+JN^OWGTkY}$5 +nq#ht&9H=RcgodJ`mnml+oEtj|l(L_><(&yMn{5fY~5N#mQywMH|*hiksOse?sdZHhV-jAf)iWsk_>cE(BMVg8IYXf>J`A_wCpK&rC +FWH#L$C(qVho5|-z&7QX1_KMNTDa{RFDZdQ$mrUKgsLU~oq*xQ1%D?LkpH2_P4*UQIy(OE{<9Ey1e@j +c5kunCk$*;c3A+q&-z1K%`A7ZMTpi=z3mJT5vuc7OS9?>4{5U_3IGHhox9!k3iEi}3cKJ~si`-Wmo}%HslgA?mP#}^b$#oZO1&XQ~XE|Kvtrk-K^{~WK5w-le% +YNCgQnal6r$B0!{vC%7vHJE%1LS-!lfjIrwpmg3YDeAbQl4m%e7C#3~Bz>CEr(j9h`7rr?qbDV=E$ekQIXI +t>vPXN_X;urFkt|k|IQnjvC*b$usZMH`$KysBkD0Uj)l18e1C!%)ph5XE?XMDP>@_iecLvpl64BYOs( +Q@dmN-)YpAEU1f7mpb#G(vYXEHyVnl9zn41&&-8T?ndAY^%vcb`^eO!LT=??A7!1O@wN-{Z{;#A`joe +PBxHj6+)y`yx~XY!_af94dmtWSfsODblYNlML;i!}aJahbKtQYKp)A2MOF^60*Zp3B0hT#SN(8Xii)0h3c3o}?b^>l^Y)br@s8PAKL-kSMjzqJHUd{0-G- +VzQwvbZ4$GFkyRo?Xt|t*3gPvIYYQOVY?ZFxuF#u4OZFE47lugx4Jo@x$Jv~;=bAc6mD-n>4q(A(|1U +k_ET%&rCYek!tTusH(uKAr(9|-Id+nAsbq0C%G4R;Pdy3#aJygRJ00_=$?<&H5+-^_u!=(}tLP=qV*d +RIBrf$!6dJO5FK6`W+4jQ{-w73P-z0^0q1)<#nL(q$vrvpU*$C@F7#iZI#7yW#R#VA33k5Bx801`<^` +N{^7`nud841!3Ao3YuXpkR+dN8MPI8i=|c~d1 +oi?>>I5CLhYJqZrlCRqqgb=6QwYx~>;Z4}7j+7`gfyH3$U3Eq`u+5DD+aPv2OT*}y%*2FTm*2BE((mg +35h-~w9t|qubVhQ$g!Wi1vTpr7{#sTg4M*b2iHt(&DT)md#EbqziG^@Z?)7n6SX;+rGq0uFd+|MGW5t6Q{ +U3gk~1Rc_Wli-6h4KZLuY2n8lEvp{ST5E-?dB7ZU5CpgXIi8>+-PLPRfw^|$for1O-=?0OMxL6;dO8= +a2GwmvL=m%>?F%NZ{;sYON`Wz6iO96tZWdsvKq}&N!0^Ls^tHtU>?r1CAbO|aV<)66 +Zq;FT?jUR7#G5nE=VowP{^8ZadyR;vjmRQ)dZ&gpyVU$^R;`1eX{O*l^=n!XC(`uK7UDM7(kWJgN{k)mW>fWlOA8qS?hlv{NQDr4W&zCZlm#c1} +aXmQ+mWQWJ1R)BwTCMher=u!F_4&lS3Alg%DWS97xAE$?8%Cu5vP`5>{P^|-X=Kx3bgaXHH~KpNq5>j +u?hP$J1jVN(Z#RurcpE-DnZqoou-CUA*(apR4dFhWOn2F*ksq!1h_v?l~fPx=)~Rd~GO# +=zl`ffq*x!oz{kdUwplqEfl;fj9?a%%w>NElqe}5Ewle;Y2uURmxZ%3OEJurWdIq>ojF_X>+g{Xz43J +0yeFM3P}GSH47M5ys@7cCyBit?bBq^V9O~VIxn60Gqo14U6Bm#GE_D=(yyR;<^<2c1<0eS;9k2;*rKa(*N-C04o +q7k-o&W5FmD2eY>V(t{xMT}(Zo6Ou&LMAO^p?%qF6=s{?!vEh;x23^GrJNxvw5gn5t=u9Nx7nuo6gJD +;1PhniePTOQ|$#cTNb))XsT?f{}shod|9Hbn`}FV8mMk*xy^pYag5J`j)qF#s1hzr*lw&+FSN+FQ#uOMsm+D!rkc&S=6y7HC#0}e^vYMrLFl``u%yUF{PE*P{cL00P(U2{VhCFT$8Kp;bNA-$Ha@k}H? +D-X)4eJ&umfwX1qOTmjV^m{fpgr3@OSWf%+MbFia1>U`Q3TJRp($@I;LZFP;3NKkbf6DL1yPN+l7eJr +YI{s(;V~_rqaGkT2DV)zEm-35`oDVw@agaLxG5XYE0+=mt6DIPFDHGU!UncLc1zhl4RD_d*j&6wVGw$ +PP-9j2@#OfYYMvRS3G-yjIl=J#lbTZ~kd^%LQ)~+w@)P%`v?If70~&P2rHl(|B^4tqF^4;rMK(YQsyV +3&6Zv&bUjc&Xu2FcKmP}+QNu +mSgPPR$O>KwLjLK9%~wlN^Bp#eLW<^*;Ggth8(7184>Ld){l{1)L;iy<*f-MNyeroV)GzYR +f-`7dPy2u#=6XCvwZMD7|;hgaKunegts0LVXue9bI{3UkPRJ)!Ib|AT<$>~H%_cH9<-`UQd-Um9YbQK +Sb~M2jdY71`~V?V3_gqZNch?0sdgCQaIT|=Gn0MP?{xI=8F;H^@g1r>3&clW4&MF}Gcsd7OMNX>Ewj? +1P^nJLl$K}b$8Qyv8yy3?Cj01xoG;1}M)q=<(2@(a;tIN7Dl-cg6mF7mVTcIJ>gchqocHx*f^t3Tg(qG;N$@v{s*ig7 +^BhmH#bauziwTVTV3e3B&7`5r!Nf4B6zXkCR|~H88a2(P#h=09gNZu)LJT+tOmLPI~JvC1hL-bR$VH0 +L9%SX@nPO#4Si8(kYDqJ~%-pIw|{yJ^uk35=$mh8e*k1q)IH_HS{Ay`2|@+=%SV)mtfEAO0{VwgG{yHd#AUmNMv{@Bmg^_vfsZH|nF3^FGQQr +BsS=WnA0-J%>PJ@)6761l7FnEZH2Lf-2nQD_;+hW%miliPTtt@O7wGD_Q7W3!3mZZUUL{ahNE+`99KhX`Fd?BG&+rW4=#L=PemKhT;N1@(Yp$;uR=F2zrtXJzGW)Qjh2^nMPjCGL(Q?!V +HLvGG+2LCMzk4E-f!>Dkyg`*4-BmlUESj9PFVJn$W<^(LM}s6&L)WtV0aA(*B*SaVkhgER|}1;o=W=9 +;IxpB&LjXy?HP4FEH~j30?;)d-d|CBC#6O{Pib5>$JiIq@iy|Rn)#_@X4zkddX?SVmx~p>j`u9}DNsm +X1f-Ws(7%ETGdHiXcut-^+!k+e4OxzaO9RGoZbB)D&rSVpNce=$hQ!rY5VFOJ9{HDQEI)y`)tcs?Ng~ +3B|44m$>`=4bQjcdpuy3ZP~&4zTDhw+#1Rb18pRa)R3H|6qH^XckoEBIh^2#k)D+6P +T7ySvmrxDZ7fq7mZg~F8IFn`K7}Sc1@ok+_wKqD(VG}F+6eGVph0+N`@s@GJ2^{ARr~J5PU +>Y-qYfG`Me|)fI04W}OR$YmRf~86eS71m`qmvOOS<+@Y0_zVxmC6ZapUf>P%1#9*+M&mhmXBR=63UHO+qjuzf%XqTOmrLXt~=+cZO4XbW2332_-w8pWLrD0X(j3q+cz$Zdi +FUfD0$Mm;95zwu~2d{`l?V052%&+Jy(2_|l6|kj`faVI!ml(&CgTGy{poTBXum?|C3u)`fVour)4okknUt^jVE@p~;nd>>BO)Xj9Q8=^*~`gx%QnNNv>Z;Og*!MbxfwTdLp@91Di8k<$Lc#t4~T%AkzsFeO|rTD5YAC6wfgV9XhUAz4+_ +0P6|6=H#KU-biJQcxg7G4Z@k)lBOLBIMjfZ|?;i5&3yGU;@_6#%`^marf1j3vmz)xErkPPsL32*y`DX +>|AvgI(S{BnQQ1>P4CARl9{zYETOa1f)m=p9xH?lP+%bdR`{=rE4 +e-p;1>vHx`iA}wg-;EfIsZgMsu0r&T{^x`YKe5Ph6p-VaNZI=Geo-dT*~?9px|^B?n{J&3f4#A*O=JB +mw7|37qy#M0cRk$(o4Rg&yB%qjqogDf(58|XfJME2k0$Qx_LXAw$2yACZTjdsfsxjCS5EwfM+U`-t4> +z0``W|>!o@0rfb+4au3us(}VWY)o*)zRRv|ATk13E!X}Q0rQU$vY`R(p4bdYAiO(Z`yi+fITtM-!=AJ +j61_xV6$`Y@qtq@F@mK$oIIZ|Qm-=MWg*kE94H%zS+HrN@peej!`4vo7Wc3NnX;T>p{<3#mIA!byo*! +g=oMWQ~t5zHQ2~Bl +o+WgVW`BMw5_+)qgKt+;IR~^oQB(g5xng8+QiL<_Q>f77E8eewL};&SRV4DAVTL +{$?B$W98yw(vQb}>QTCFfD^(U1n4rv)BM6CH=7Tu;gaXvmn`kM@z(~kY6NLxAZZdQN_Y=r4iSm8gRVk +I6gz(04?j`Mxqt%~_M6Bn;2qN~!6DnEx^@)*0Y~PhcY>x(ZPZEq|p7@^-F%Ma`^2bP2-_QsWHF~(@2` +7G(MBRTPL8A7pOp+*%b~{;Wsr}SoKT~@_&pV$*X_+ekxxptb%8v(?U9){|FPVilWNvbFQQ~T<1@hI0@ +3#mYm+*FSDivRkDeEC4a_wSDr4+qFvH__CZK%uT>%C;BYJ|$s%iL2zNXKhWoXtzZcr;4xUxlK3d-#CHr|j%lEkL=#gm263Z?)xk7y2FZ +1neDyBsGId0Fj~eLd=w<2=Cx0N^!mowk*>5P7>x<;O%-uRRQ8bBOmb{8 +hkNyxw-Y_Drz{#iT=dBij40r(+ic{YZzn3Zrzipkk2gLlZN@i-3BvEGf_cyngSq(&vlBtJ~#Q`%fz+0TZO1GGG3_LJEamx&w43ta?@)qi>sem8?Pa1C#Ic ++)PdAEq~~+`oW&sT2lT|e3?*?XP7KTF!%8tUbLmHIjaz+ic33Eo;z0e-Ea`SlH*wh>Ro)D{0t5T68Rp +@bwwLMECk|lC@*}w{JT_v>y7-p57k%>9$Ste>$}Q_X4eW3djI4d@f3{^kar+fp7Hn4UYo>#;g;Wh!`~ +zFm>9-PF)VbTg|9%EH(661(vCNXsj=$)f$gdJ7`pC>tOg}J83C +U9AWSD}+xI1QcDLdN+7J|K|#E|!FMVf;^Sc52tX6Q`|S5k5CJ2sdJQO5sa-EgZsdX5ot%PK7Xvy2`eV0aiI#F7Db0oB(ui1qLcNtfdOh3e9k{fS +zr`fRD#>k9kKm1Jol^JDf~o%EH|3Ad7I<0Yc|3oW`fwTZ4*aUqrfKc{%JRvsb7uOzKKX)1yO%g1LoL#; +HAug79gvyMH_``zo~<3o>a){Brr9G@(t~oS}g(wSiVeXFsz9Z*rFu)h=4cUBK2}jf&N&^p!1hs6a|fdgKheZwB3fP +Cy?{bip1z=2lv{e%&q5p;rDJ_625;TTR=@LKALZn8qy)p5Y2DN5XCZo=)P+)lOzKra<@9&MB$GJ(V-a +`x=M=5+G@{xunYrGzqe&HtQK2G0b4?%A_w{u$5~O7Ko#w8}YD{{fyUFFj>QG$H#cD5Ul}cPDDf0hRL% +hp(Mkca5DQ5<;8gn-~;U3snE9t*}OsI2c^}6s2TEjLN&c4oxZal2b?Oz6Pc~Ip`z)6vh@}z9{EBaGFl +vw>iKR`t)qtRj`Q3sExTdJ=fwhAFC_{nJg?&G +fnd+?bWr{7tsDp*c7LT=JCC;{B!4Pui^J*V6)5!M!B^9wgdQPhrG#){Z_JUC-Cykpq-B^Syu4ddsJI~ +bj>tOAKlAh5zf_XclFqN9Q}OikvpJd*&000o2BNA(MuU7(qSFdBhpK_{inrwSPMOo5@zf~&4{)q`0Rb +i;obH}w3?wJ8F7x#{TDJMXxAJD{0a)m6$ +<6vkP2i?tfTX{6_9ddzhS32#G%5^|k&lZ7hrumnF&!4DzT0w3kF@?-j4R>qmi +;Jd9dfTc3EBpf9*bq +5*lzW5wNo~Tt9vDvEnvlKjyJ*IHSjkX{;UFV^3N2k?xpmzTb>egb>kU}oCO|g8)F6!wE;DV6~HlBUxk +91=}oWTv7C>ZBRe9y?c7YDQhBiE#uwu09k;3wKmEjC8*`}^Hmkscp8}F^2M?{_mO{n^fO88O7!k@tqB!tlRi3o+WaIw3?oSxm=o>&dQ?>TDep;U?p$h7JEz)Q69RAeE9}tbj2y;ZG4!7zFkh5z$-Cb +8&rZX73Q39(nGVJm}*kXlaT8;(6(+MZ@5B$0(L-YTYyNT9a(sKi=&0lhbhx>GwL?=qU1@lLoUes{fsw +B^M6eJG?X~`ScS(NWF~DH5ZtaRBQ~TXp>^Yn|JyR~weie1=+opKnv~JU|B<|Z1pAGbKIErVm0g*VRN0 +j&EJDvG9=yPmBDDz}Q-|LZ#1r50MnLXXUBfcH@q6iz94gl5)#lbVlwGRbbg8tVOyPI;MQSbe2leEvwS6%ONbKNJhnAxj$=6;dj3pCe)k-mmGcW0pNXM}1ISzb#XU8@J^Pag!yu77eM7xQ6UXsil4j1WGNzrD#R(>Qsh6gwS +`5L8~>r&j&;C#58&+G^&X^?xPV6(=_@TQM;ucm27GYQq;)lO;A%1Wr?m-%KvoEKx@6iA +^71Z0^Gy&U9-H`H4-B7@vimIu|n)5Kgk!+1I))=$u>6u4@8H55v}E@nj-%eh6P(5FszlL`7w8>xRCa? +TYYkm+ClsZvKr!!Pj-IjBCzpIp +TILS6guUE=xDJ0p5QDTrvy1U9m3^+iRYSCokURS-x5Hvd7~&_8=s)5PMFf7#miA^5SR?$rd9pYbYHu$ +2St2dSin)xIE6P?N*Kg0s!oJ)~X~baHQrHG?Bf=nw~`X0k4>y;s{Y@|v>*bTbBAIP53~UZoeFq5guJP +HtvFO@}(N_zW4H2(3TEJ^mL*Qnf&z&mZ|74Y^7gX}Cup>{qW3qC~`^(l5($NQYmW$*6MZc^1w1oAmPM +5NSD-o*$`*9#>z-SdFB|zo3SG>x?{kJHu2Y?$llRp2v;!sgcq_dkb0dBz@1rD!FH_l-zkMiH#oVvEO^ +n10N|V&a+=d`hcmP&c|qH5nAg0J6_WRYyAOhU^Wet~e;oWxKLO%)YGaA6VX3aML=VL +_EY%Cm1|dcZKb|Z+bn7rIh0@{Ij$(R*`p+cPUKK`YMi@L;h17d3$+Y4?lxN&gf;0}U27&4-+hcWaR;)&5vu+!P_mj{0fFb0I;^{vsp*u +s&1wf9;KwDGbLf#FENhPWFBLpuuwwK>Qeo`Z}_=bssbdY`Prdiy_wkzQ6u`0YJZLTD3u6nm2p0j?fDg+QdDLCASyeJ7XqEHJ;YknvWR!s+F=Lq!VKk{ +^kNiiVQDOG)3L=F_CTyy4qz_<20oTqKv->k~mb{QYaH1&dI)0AyKUwFzJ2pWTHj;e%95f|s7GNFodAT +MM~e_+_^b@N}KpXwv5l+{$Uc6%!6%A<73B9wZoEm<)H&urm=pP&$cz*U##2A+$t{D~7oJ_#>4O_1OVn +NS795AS}1ojgJqYSBm5JY=R0mJ9vhhNsoXggv!pY2$(}3-RXObI69p+oY5*+Y*fzkKjL%lE3kCRl^?za}l;@ft +6$eOlrp=`=pB&ZWS%dI#SNz4{{m1a7&aF&*DqN9|j}7QP8>;cb5%ws84_s{db&A3(5qRny>;ytQC8H4 +UbAwy4)r8#9)C_?JXuYW_m`l#kRy*D6sjw~c6(UOpu?2?M|=NZ;Z)AvPvcYs^oeG4eF&T>iI~L*^9iq +ZfE9`3}x-J1^sT7#jcL{ixvm^p-sqWR=Ry0e6*HeB02PF1%L>m5|&1lI%%WK+zu2r5CDqOc5^VcbSC? +2Hv(GA3d&!Qb){C1H|%|?c>Nt??B539Rr*{mWnMGVyryTO^UwPc=hNG0 +2eDfesHyCL@l`9Jf4DzT;AyM$SDe+OHI<_J`eUR3l*)<10T8ew^U&7C3(N43f=P1rq1LSM)H1r`4>i5 +Jj4Ih%n*JlH7`-_FoWwR|D}Fr^|HhD#0MBgeisH2go6ANAQk`$pdxw +qu7!0<4_Zgh9Xa>^_V)MZUjLi#4IhwN?$wZSu{*$c$kGof=ZE8iJwXh}p~E;DFS&TA@Uw*)jK)2r|2K +)j8vYzh|K1-MtOp;*!OEk9b;U5r^yoh4hla_kJydkJ0gt_mq-h`CtY^uq)HRd8QrAlUKwTU8J$19mZ_ +%Ak9;3lrB2hPw2-KZP9-!`QvX#1X$UW4ZOYWv_4p~dx1;j($h2-{q*g~hW%}Jazs+cUGZYh~V-DPAZb +=@SFx~oVwb=MFpb=MJ=x*G^X-Hjyv7`lGaL*31UP%gAAqS26ZwJZvO? +re3@kOrEA*e4mUwLA`i{Ngk$Nw3Q+P_5KFEJE-?b^xjLoPoejJQSZ~}^-=FZ^e%fWdDpV&vE)t3`P7T +oEJ;4~qSZ6WrCz+7N3s%4#`7tXN)u4lCWF65FDf#~IqJo4>5|W>7pV+6L%n!rOWLTHp!ZGc?WX;wUV0 +Dn&(zyP`%k^SwExr_r~Rj1`pkwvy{K9wJE#|rj>x^#iQ)*7AM0mzHF8m`b&nm>Oeqn3ic +VFR3xv4wGApIiSYmI83Xwm`Bx^T!(3m7PDK8$#a<2X)*VzF$)}~En3W4HD;m1#Az|NsxeN7X@?eblNw +X(FzwW0W~ecx4pXfbGnU3|TjrQouk~K1^*$+2d$sdt_$RG4qr9L`$JaBPbe89gdGa|JAYd3E9=Q3&6q +?kmvm7wyZT(t`2uE|1AN5WVj!cF!xYZvHvLt08yNzr!iz9nYo|7P!7;G! +(L|7W>-T};h;u8Nl=1qG3tun4H2D2jsSg-{j+xw-5rmI}I1t}CWpwen3%%dW3hXk{v>p_X~C%*{Xg`P>Sf&m-MTA>7!~6x!FQwtT)h)Vhd^y{uT?msqOK*%Db}c2%l#@#TDndP`$Bmo_C$uq;H+ +Syc44-LlsB2+&-(N&Hrd-~Hm(Dt-@&-womyi(FfOE25uaui^eBx-YCUdRhm+X0vNgZR9+E$A=VycNGe +;zy#hE#LFE?&BSMGTH~~MtLX^w=3{(;28UrMyvuyQWxwfsS4(B-ZRgVSE{@HM#TT0nmd~ofJo1b$B3% +chYopAQitjp$v>y5D!a1F0Em +rOh5Q){x&De!x=(*sD^VI5{yVYCs*U>1^bWSaXPelMSyQGPFYk^w{Jx_BhwK`2R7vgbHnY!Q#=H^`|1 +(m9w&=4H%QP|`qSYoCkFqF8q+>WFB?RZ>i<8k?qP2einZL(?%BTQCDgRf_q!DGY-LmRqL7apM4CdEiz +z7zWh7va*W{5{*Xs{A#&UM#NB<(EHii*hKp&~^UJzQ%`4`<$f8x8&8BcK{O_{Fu{gAzl}Yo0mU~HwOi +#vrC$)cYanB;dVsAygU?%H-au!?jytPRTr*RhTBHK6)Y%s6A-QSAmYCKXE#8JGEB(7Im-}{e>2_CKL6 +%Cb>Ww83PE_Gzq|~|g3^umhszIXv@F$O`CD!Z0q*55+paa`Pt)}>$6!C>1No1se2wi*dmQAv`L?`Slq +T3mq!=ir*oYL^heA#fgA~c?f=HZG)dfRv&Qcc)!r7=U=!bKzx}Yb{6V(M>fWbz{2Axp1tf&x;FIK&Ec +dRwBt?)}PD}*pkGIX~Tp-C1AF|@vTiv-wF7R>@0L_LcIU+h!N$AUE5T_stmPF6p;4KAjF30TDdn^C}l +Z5U;;h8f&RcpyM-BSxqTH#rmYc5C(tNfd5!(HP3(DBpDF86)T`+RH#&= +*{zw9(gzotGqE;5LyuP~N7RGtp*lhgr9;m;hpDMsxEjRJ~P4}u56 +2d+CV`DZ}qm}HPW(I@*e3$g=qb;*6rT%Zb^o&`$YQ_j`h~dhSw}Dl$Pf|DL<4lO1PEJM{%w;siy3~mJ +v>c2MmLxvcUoME@m!5YD1ef*eBeM6km`cRegCMx?aD|Ms}?AiOW>)v&OofPXvWSxxk!3qu>gjNfki_s#o|fXR29}|bv{k4M#%FdbKy +FvzTD-V9g0zs^zIVLqaV*O&_n(8i>8%8SuTsDW`&j3fi}bhSu=9C5LHkk(l&GJ +3?a1GLhBbn%Z+yoN3^)y6h5xHvv&l$>_br2HMgbEdI9*0`=sFrqd=P(NcUxk6Q#zl}KunDsB*^UnUYbjV&w0mKWYj3%?Y(&^5uPDsOdL +RJ1!3L%Z9e=~b0#4DBU`RF#q~q~0~Wrosu$Z%svO;v*h9uAxrzSZ$(Cg~#&REpRF<$!T@{r0E#DeyWx +{xjE6m({j^t(&*sBW$r1$Ata%rN$BM3(zb$iq{6bN**>F7H-U7K@v79taG{(EOY&S0ZRlqags&MFn-F +L9Cvr@s-sZKEU|4RNZUiiHaTGjV+H!Qoj-tq`o@K*i#2~VTk|80Q`V8^j@S*$wZ^J|`TE9j7mZ`k872 +2p2lRug5rV@w31IAxHg#;e0uIM9F-@1CLufjDdpHe$(#TN&Xw2GokJJ1e^=Wx_X%?)fEL{)*Wf0{_u) +vux>zCV-iJS&>xGniJ=okpre@y3qmwLJx3Puc2NEg&{G_Ow)2bg}PUHfzRM+y4d(aK{Z!g*@*pFGeoQ +4p@GcwIZ=7gmkRvkvjgS=oPm~lMMZ(OD6)p1Lah7kU*0K>pjN0{aRh%-&^#Y^jBD)I<4b41aA#U@QMzE;u0BsP8F6&8fsImnEWugoZ%0%74wF_74am};?iijCnb76a0{g+UJjpErPi|F2$IW848Kmj({5RJvBYT +1$UWWj%7J@_jVoR#qHogDOLd>Mmpk~$6TDD@9mX%QG{FIi>qF|u#F@?(%Cy$4)a*UJb{ +!S&=kM!7Y+1ry=K|<-2M_6B_kmCbi;lC=d{Yiu~|u^ca7&(Qznx&=AQpHQrn(;02)tnKNt;;48vp(t1kFD#YvCloXs7&X +AjbY5jBi?zmgtoI2;=ek??N*@)OBTt(roU7kNoVH9jXPry&Vq?yyI@;cW`0!#!Os +r8-d#{+ZC*DvY=UL%}+}N$uN9Pm$FZ&IKYBozhfsQleO^w_O@627*b7H0Pq2Yh%+?MMX$6mh={n158xI^Ug&@kph;`C3!{B&R*t8;x1eqk4H2EYBUFpUeZiDrSR;7yD{~ +mPKA`Q3voAkr63X>gAg;^Iiz}TtF|!yMnCowrCNH9rV7=>~KPzM=L!-HupCdQgYy!B@f`^23E9{vIkU_;eJw +4`5o-VPD-PJB7ozD8(Ogfr`8yypWbI3!F~==QT0jiR*6)zy&wZ*qg&-6aj-cP5826lB%UXwrnb)Gy@^ +3aZHk0ruV=c79mbz<)ExyfLGp7I2QYmHetOURNNOdTlG+d40C{CnP3Dkqi)XRhLY>%f<2timtA{|5So +;K7S)P-NvMS29r8ymq7!d=1~B8y_D0r_zCw$_ek91ltOn+X4os$$@u)?#vsxxGa^b}UmB1BCROVs>{d +Tf768w?Wy5f0nXT)t!_jsp?TS9F&a|DW$glkV2ACSWCE-39}>XhD=tFD +VQfT@TpQ`xySrb~&NU^B0f*NE|5x{zuiosv3r8G8PUL8fW%#)apdR}ftf_5UKEVig%5HdH!07G-fVk8 +VYllOT=bE$)rM4O&Wu?RvvWupBRc3?l_icrD@Ik7koFGdRP>u&?wR^q8?V}uZ5k+&{^&b7#@m(o+y3 +#^_dXUMf7~{7kGH-?*Y-<~JxBMoOOI7JSoSQ_dU)goJE#lboQt;_KbF57Awa2ifTq?16w?SGmAc?%0q +7w+KpHzhZR!DXx&u&^)+ygGRlL!9EzKF5Jj7a;J)le&xr!A@E2jF8T~)crn~!$Nz0X3{(U5CP-7GET7 +13G}3x`~bkF^%PtE`;2e|XTs$^}PKu-AviG|cICZVO9Gd|z%>nOqzyT40?~%8>tnSiaV_{{I|EzVvO? +eia!(&f`0UF??cadpF8mR0-BhGqequ>TYoNe*g=Iy9MnrNH4PZl;E2UdBuRRxnjkDfQfC44@ikz)LUC +pD*J`Sv60H>pj*AwCDsbxtXN8AA(k3g`nGtDPqnBgsn-P>pJM@2-PF(S9!LBd8=uyMXFEv?K^2xzYP> +e%9wf5pHU867hEA4z+)!caf)ucT)My^p2Wgz +Y}*|5CEPr`o+rfY+?7gN;~|Khn(-Q)w~7>8#%76xI{-R}H;FAg$MfIZbR*ez49FkJo{ll^FY2Mu}Yro +BJHQ{)^=#-Tc +QGLrGN;l6nBa8nB_CeamzO-XWDLeX`#<5t?*3cx-mmXv4oe +W*fi%Oh;T|!snOZg60ZZgO#MTLRJh`h8bnf~-Ug2pbzN4xyJCuTb1;SQNk%oCQtoM?^c+s9Ny002q#> +_Vu2Vg)R2$hVg%_kTl`jw-;?6^n)p2}em9HXBiI2iF^7IOTZC8Ymh6>UZ> +in?&4M9w$t`)v{K>6auhh>?Nnch4-8LLnZ);~RwhA0Bi{HKCcN2b}Jx9MOL0_p0HZ+ArKgscidB?h2u +$YlUy*yX)8Ks!2;WgS;-)kgbNnRswd#@25!)r7~e1+kvexilsGxFRj`HVm=W@+r`J!!{*Y8wa2&%tN3 +t)9=wvsCsOZ52KvBro44JTbU*Du2s%ttx+6_>6EZd`2sgL)?}ZHo^K5H~ShrX%8>%hGx!)+O(98mFm|}1ywG%GE5{r1W9nkdUvpFNcQ1dzcC9I2AppCYs{M=|QcQUczQ+4Z`<&#A#G +~>IB(C<6Vh2jG8xaeKQTZ4Vo2)JvCN5-W5hm{oe8q)PUEnD$a@7Uh#l=K*K?mV5f>;o}XbR(sgoN!Aw +JbI(Xou!pUg;{6oveOxfbbjaQv5!6sRWylhZ)>S03Me1Ra6(Ar-82texKDcBuT0*g2fWi+M*pbx0LDm +9hIUw&=v|0sLd-Ju;T~PVv@f6jPMpAljJQrz-l?SgW1O!UFGMN9ik+%B%OB&KhYkiDv?SfRlQ|$jd?8 +!RTtcVljvL9Oer3kHeME7DaK79SFdR0jBncE8FO`pB@XqW-U`pVD>izQ7a`z+fPfwNU2vrQwBlJhOZd +a9^ephUx~dDV-G&9PF8tUDjDtBQ1V +>}7;lgetV`9GAT#S}n;hJI=aZ(D2NJ;gS`(b=u+a|=^g77){NNlzFoRG(G9}PQd<)i!;jEy%Q5l!qzN +1Ml~QlQZmE1{Pkag;qymxRag3zh6~+NpS)e#9hAb*do~9w!gsae75~oP>Tb7ejCi)8)1RUsJpdS*k^= +R&4#IF31&rCc#4CXM!ZBm>uC~5{lMwpHON7?dwj80BQFX0)A7Q6iNQ2HSjN;v4mG!;%dsj#Ok^Ck@lE +rOpv5fcn3xX?O)_3DF(~_#W#e9XmHUM$v0G9iXCbIdXl+t(=Ej}RLgfuHGD(JEPO+bvTtY)L0pOG@EU +XBGqsh@i_wyVZ|Is$Jm~3Vkpwvs?0rLPK?;0B-z&Z$p$6gl5#SQ+eM2dx9Y7S$p>OR|*g1zng>y*ohs +YZ)wbz954!1$hHK8-mf4YJ%9>PKNSd9?zf|nEr(II?)C{jtTAyK;$_a)cR0=&)OJ&`2!AQ&K$no7pf{ +h?c8uXIQ&W+ml{68<6F*S2j#XX!#K@dtjQaN#EkuUS*kPL3niD!w9-N`Bm+zeu52F0zilNN^PXBAY~X +Gzpcg_>1ry{vshEvcCvK6cyhR-Wbu{6iHoBt;+}ukz7X3RYV(HM$2#2aT$RzlFO(NfP~jbX&jOcH4DX +Mm?peNW%>TzhBz+TuSH0pq^HW5cSW#Jd>d?yR*J7};1x~A2;Y*6V`(8bUiB2wN2{e$Ogqq^s1i1bc@d +znNo(+YL%55a()v}j+@zwjXNAiq2Sb}Q&7>4_(Ln+Jv<%*|10A)eP?(-Ogq)Yd%SMJI?T8l42z)e9eymvrf5>}3(9RCG-9mS9`EGW3-Rx`Sm2*Xpy(v;*2mIEZjzZ8r2y8M23H_d8m)`z`5X4{ +@Rp|B)(k~FE1GgkVTwo)v@ExAe5r9Zfsf?IOqAbE>Aym@APz+`0xcf5OIY#o<&t->uX?Y9cYxU?$X_9 +4uUxtcq>_>@epxZhftXPc#{&QoTGY>Qo3V%((9B0gU*IjDueA`VQ3A?vzvpeGwssRI#5p2t`_9SG)SuW^3D&D +t0LS8=PxWyZesHlx2sxaeUP%@TS+V+DwYzhT}4#hsM_b-fN5^VL1|5`ADN_;I&k0Njs-l8j^?Qs`7k$ +SX3Cpk)$@ynE&{gX>yh1UMG^kUw^A(pa?$$JB7C^}Eule$Jhp_}?N;94_sYmCZ_D0(Rv%C?V-dElx+p +$DKAqOg8nZ;&C{U~*i#c6-c58{WI;45wNfXzqi-MrMe0KmWyc+oG-fTQ)aS~6Q#d@)oYSVM*vxYgTjF +U}^Xwd3U7`_KUKHr8DC&aT(ce29SJoR*iBNkZI)i7%xRNTVT%-F7ITJt!GZoo8jijxR2m1!$XmW3xR# +&ZOJ{$g-IWcZ!4*?7@}{afY_FMo)bEmo#||0CN*TZW{f<|2n#C9hIzX|;H_ +plNqbyE3g4Gr93Ht#eZ>&t)pnQl^UUN`G`VFT5y8!eP_-uBGRd`YMCqBv|3u2Unf!Cm@x@RC+GNVk*t +7+w*~aiuy{)*f{Kup{5LZmffZcd8JlY!(jQ#z7%zyib9w>el+;;#*Y?1vG{oeKiNfQm@y-aM+%P_23v +O1c-Ekd8mO?%uukN +cF2vm7^FK%6Qp+IX|H0(l6M(@10W!{rme%BH-nH?`JR@rkfc2_}bQA!2NSZF0D^_07lZCxzG7ofN*$Y +OzII`_pB`sYWM*UBqPYp*U;0vi-NT;?@=LC&Ez@s$cxw}>>?9;v3IZzcntdXqS?*b +rWUIPW{3+OQ)Y-?uCX;SX~pS9EwGZb_3|3AQB|cSva`H{Ond7|@eKPKl2qM~NAY(1$oLax757^XdG0q +lr#VclXy#Kw!?-miMG;I@`wqQWma)PkK}-~dzpX6R;cjtJZ*$7UqLL5b`?(HcaY~B#%2MX(j69{)4%b +ftPVId~r8J?GV5#;gu^cYshEV~oh9;&`C#@-f8L!7{)0|?ho3MOoXHCAN-gVr`m)>2Ivl*4FcOto +4Vc*zO($It_+M|7_}oHK=O8alP!0&Il{XUJEKCK72UeHqkSAzU0$}XvSIECy*WpI%CkK4T-aEo+{RWn +iO=~Fd^uyVXRL{O29k^vGPv!dQcGLTtmOcrdB_ynpee>GGp#~EcX^*Y;N$O9@on{@g0g23tsBqhAA;W +!Fu5>F_IW<^|s-GE(1#;2N>VK3Z){CbqePTcs$rMe+aea~B;?= +s#F7g&M@fBFT8G^hLh=%zS? +4eFULKx*3QK?o;*wuh`aHo6qjKA@i|!<)Py@>8H?w9{~NOF}=u#duZP*hXy{ji&CDATJquU$KHl! +62n#%020dz#0kjg$~!x77cd@+NWM#NDzleFdh|~r#i_n4t*f4H&Ui9NJ6O-YKoeFXl`Ym;{^5$kYIj; +O@MJ&_sk_AgzuBn6nuS3$~|w(-+I=5m{vYb%qBOt#9Ui8p-sVfRTr{$u&n!ib>^3QM7qn1Sv&faXd9e +pb`n#~Y0UZpuQPFt&$*jn#fznn5F@AVk=GDzf!6xVRP=Qv6)_1F-eRBL_&T3>Yhl)4>-lK`&e)~bppC +ZrD6yDwWkq+Ra7h>{4;TI;PHZZWPZg`zk(@4K%E<7xeku+I +@xHbJW(3cF-%r)c=fek591t5-`=x&WmZI^W1nyQhE{P*)jy6GOa@;+y#-}mIv!rd;iTcArWs_}l` +t9T5vDcCcA2_<1#Xbnuq;Ihkrd6zzW1essKA1_^=t-3HEhYtee1^@QZg4{w7Nc0`?pfLCrg|xMAy5t?F`a5jFx2M%ea+FD1gVkUUXBmZA_@47yu_K7}lmWXJIUAcBEX0LAUbeETCd@X2;dKL!wV{uIzH9E{H%ogJ0k`sSle%prw7_N31bNR`%F!o^TDHtvqO*W&>|cG1 +S&QRl2dVhw+-}HbKK0=W$}SEGvMX{l>niZ^RB0qG?GBnakgzi1&?(+DM&lQ`xjVv@FcSp(H`Qb-t5&X +NmL*?a}JRx5SF$v2>;fhM{!EQct~bc3_4FaCTzGA^A~G`Ie?dqXu{^Yn6XtasFqjrL8J@*L}Jq|1*aQ +YkrbbUPX)AnEY<}g)s4ru3~Mtse8bTo~(qCsi|eG*76tIL`3Jk2+&2=xzbB{J&F`ZW%JZR)p?qFzPx! +>HbXs%OHo>P?ZDn7t*G&I2qAj5`78Lv;AmN<3K$CwE6JmUG;Sj%oD!Tn3yi3FwAIv_?EuTCn*TL|@>l +nK<#g031{1>Kt4LUKPknA?*wcucx+Bzsq={=B)Zt(WI0pPsFpBR)MN#n2wQcHtz&hp8^ax2Y+X$TlBg +4}+AT(z$*?R}E?c-z*_6-n#oG(ZHLAT~%r5B(@l|2GGSQE1C_Xrfw%7>`rT>=BMZMy`X-=s3M!=?h*BM{4;) +Y~Hvn}lJZ&@>0rxhs>K?Xhix_KTZxrYtZxrbHxp}lx +Ay;+^-0_|Kwnk0GXn6~^A)*%k#7=>2BVKPhTcs}3_VO`D$_ny;E#Hj!0+cdIQ$T}kFNI6Ra +xLUV>9d_bJXWR;5kDRxWT#J;rch0(#f#J#e0d4^goMgK|8DSPgs2gE1SIvx!a>ipP@P4!ElwAOs{pKi +>0zgdAK**kJYA(O|bRM_4B*kS={yWvKu|wqm838v#WQyWF*Aa~W9QSh6Tw|;$jSV_e=u07j!Z-@a +6mlu7pztPzG76_D{7Ru^6=NP0{3(o}Fp)wUg-0noMPUPlrqtcuyvf)}y1q=IhJxF5#@bNmMZurKXbO) +|Fi==Y;av*5DV(D4D}|2LgcAin3Zp4ZqmV`+m%`%|R#MnR;X?|CDEvU-SA39vgR$lm?x)b5f-i*#3b7 +QXQ^=;Ugu+V{wo*7q;R1ykT87zm*U|CGhb +oAGsC9`z;V@yNi&RhyJ=#P@I32ZzY#`-aTyXyhWkBwrHqPz)gG>c;4Yz&JKPe#)3IC>UIDSX&Kf*e6t +qeR+a={dvnIvvh&IzxO?x=~yYx4RBYPtTfxw0dS_nasda2~!=@P|(vK@YM)dEm%`=9#62xusHg&Pb0; +~5oV*=@CIV2ekfNA3lk|CipMdI==3Hke8kg!l#Yft^rs`7vgxd$kVU^n;uLU<5haeID{wYhJWCO9Gep +{1L`@D|CDCt=fHIwUKA)Z>6AV4YX0n-dmq{r=`CI{^78c@DMNAUqOJ$GB>9Xi~Q{sdIAL)|mcZP`9$z +^J&G^2ozcny`CB}zqHHvOgBa!3&SQ%sbgQi7U6PjkdQQqCs067HZ2*y%+{MtX`gSwy);z)KhDCCZXS$ +qJwP3EIHRR7#^GoHeWu^P;Ee1noh=JxIX}8&3B8Olpu*nF2>h&kRvJdV!0+PRXwu&_?;v}SK!vRL ++~_9$U`5YM`wvX2Q6J^xHr_n&)cqk?j3Ft{m!Hm3dEc{rDky;HV$q8IlH7E+$%I=oP9sQgn}v2Su8I%9Ntv6Rl3w(zEND?C4`W!T(pDVBFSWwLIdVeFy3zUEF)hg-W1rA@KAqRm`B6 +F-&>4$HEub@|D5lUkMzjsR=%>;Dg0^^}`xUJa&OGT)L!7H?U5%ov>68=Po-b%`D)XVg_#>N^_y))`MX +C(B@0D@`)@;GedGs41*G=6LB5f_An}8i#2U?(@c?A6h(jD$|g!M^d3Hk3KVK+#B8rzfk@*fk=y~J}b` +3c$V!UBeGUOGpJRxH_FXrVYp6BcvpJsTt24$6}_I%muMv+^uVNUc%maU9V?C(O59LvKiBXA8?NUEm1* +&R`hL4x{+#!cM8>d9>)gYoAE?DmW^5DflQjC}k_hI7y<%&`1zWq%(d^gwN%IDwn}eUhL>Do-g#fvvz(;3)aAI!9neMqrK*j$}F>(!|iA!Nq(!SWJ +vpaVcGgrQHM$T8K +VAl)AhzAy_6;?Q(RIxfDgEU30Qyw7?f{5U?4y8A`gp8G8pyANdm?&eX6(`Kg+1kk)I{#k~4Mk&3L196 +_b@I9>f{tbCLmhkq_yS4rvh2R1S_#&MvNQO`0}q-lC=2z14lK+qAvEUHc9lJ9X~zKvzw-?mawu_Uhf| +!M>gk_3Q8DJz$`Z?;yXy{sDnO!9zkqwP8cUBO-?l9}yKja#YOdF|lLE#f_g3pD=OK!;_~>otF4W()1b +0x|Er-QqyLqXJlq&&(Y@?jC1GZ&VTf=1q&DDvH#x>%^iPzY=3vg-T60ydYHTY6*TZyH^pMRKh-_{+2> +zk_vdhre@b4>|1|sm7aVui>8$^52~gGk-Rn_D0#vns4)^$1D*^x2zdxcMe{JZ`{?0z`o=KMJu6uv4^w +!c{|B2X}kL533Vk#(n{E4OJWtQbdE1q1r>ZzxndG@*ISFd^D#h2Fpk3Qc1$&Q`7N=kR{+52hPzWoP2`~2V+hYlY(dhGa#FTeWwlH*M6(IUVY={t(xC&^Z#;3(72+%r;gx%n*RUk^8f7}apUp-EBNnB!=PreM(je +@PV)70cGuW~)J?u#VR!wc-StYl>s5BwPuX2RZFh}rNtNqjyKAft+C+jUUa}ajQ|84JQZtjY=EWJ345? +&8(env8I{ldGX}TGPsLYfseTIlgkn)U5$}xn^Fr?1a#b#w2v&A#%UIN2n2x8Jq-O#Mu1U7*zSj>#qpA ++vREPjl{AC&Ghjp^yqCH75ofj8KlIl3?x2Y08)$Vg`#gS=^MgTxyD*om%gY_PX?LaZxwHyS~r+at3cp +@Xs9>|8qBC}T&9mb5)1+K%AQqy(G8bg*QD_fVT(dFu97!66&(_x%X$ixNWQi$=Iq)bgxHYG +}?^sv^cLi*dK(d&|uH7WY63`#AsvmV_rRtzIdM^GJ2q%&hdGLNFOrV~E4s@Kdh>h$wdGiPd21VVSj=j +aRuyJ(hUNG5WUjoIm`Go%zsjEE!R8;+znonGH?TrDj#h!}%TlPyWF#+ZYmd-qJw>0Os+Gj#@HS*k%ZB +P&^_$x2ajV0@4HEorRkCC0OQI!_mKCSLNaj&eliW>Z6uAWEDjco`W{^_qD_~<BgJXPxaDb(knW67D4lbVs8u1idpb>5WZ)EvW;T5J3me7(?|b8XLOv_^hK|}g@g?=*AMT>PYyOix?;hXn!Mn%z?tAz67d-DCKmVb+@k{OEPxsT +Z%6@g@kJQV*%lGc^Uk$1of6^|VQ=DV)-T8NUNaOi&ekD|EyWV1VT|ZrNSZ!Rk-F1C@+e9>8-u6f>I}~ +|$dMAvm8-K8VeT}(${HPig>2y%pzfSXnifsRIs +p}aDb;uNQY@fn+Bn3cfh(4GAVf~-bqRKcdJ@Jh_6)aiQ6Aa7#f!lF}#BUGM%Y}D(idsIrh;gpb+ +Y8aNKkE8B5T_;1DNhvdRddeN1m6?;3t_wHl(<7-nH4v9rSWZsr%uE@=_^et4*jbbSV#3LYu)QDD#(|# +3WF;HZb;HP78J(0tM6r#IV`2X`NXbmc7-PC2b?AJ9ZhTfkYO*eTR+64QD^p}kN49=4V8BeNy##o2tq&b(~e9DlAc*vglsVDWZ>giczRZjayK$^+~~+r$~Yua6= +%@Xe-u#`H)2#mSZtJtXkSaal#k*+!|Xm7l$DxEW*Ix|FhZA*cu9gv?n2spQDq8M5f@{yM_DZ}K6|I1MA!<&NXvXvcPAn>m&BAq9I1S4OqaMdZ#^Aas@tm+sO%`p7#= +NYbvLvBBB5Q{~5?oRor$no6AcD2Nvt?6@Y +UQjn+3{JncFbOv+Iy@{F9bDnhJ+Xu{WPGAPn|Ja#i^67t7XQ{? +|=DH<8ax<+x^careu4aaPN4-Q{O^|K~nA;CVOs`5^f|Oui47?_=dWE6XKY4KZ@K~Z{_Y(fShkK)k6t8LY_%|c=-*hzYq?Fy2;O9J1d>nZ(v!P#8~P6a_7XU<&>ed?|QSc!)wD3LX?R6gpFAPoWJ3cM5J4YR+icH42x{Na-)q`80(S6!udnq +3{8PO%ygzSV!R*3i%Wa6q-2I_DShMpQ)o`1`a3Fz!U+l`6h5S|nZhOt>nNM4oI=fMEwfTMNntOA%@j6KSVv(wg=7k`6ma~z`cgyFu)p< +Q#qPuv`@$-R<~-4OiR$`C;uYmR*DQ>Ae6RgWxc_fD{^)%shkA#jd?@+Bm+r&|*eLl;?^e>i9UAASJJ{ +dXAHVgNgE!U9s7`+z^5nyp(#LjcJfN;sGHiP}7++59i-K|}^Xax@q_fL^o$CJ_(mOnkV!YLdh9fPR7^ +~!C%(YY+p4g>x6?L?Zoh6UI4beh!iWZ*1O6ioJjao1Cm{CEm +p1ZzbtBI=HS+w!MxO6)``l%e-l_Kf+zOTWWL6D%~zqW?m-W&pYf^jr +=JoHPU?^(jPpWl5%*Td|xBQV>_H0+!Op7ipN1|@+A1uefo8g{@}sGWzvJ|0{&T)FWpo5oLdgVDT!ymu +jcTLvvgO5c!B?tnq>!T4pspM?r)Eq5=9AW(g{A@JAZPZ&4Vu;JWM2{fIn_0-&x%HiZmvL3(f8K!hx+u +9Xw1amV;exHE+Byz+Xxr?yJ8zyrKKs2Sr*0dVV=9m{(JFF$X~SA9{8C!RngB`6VL#Va|V_u&cU8L?b= +%xBR7QE}{kh0m3RpBfVIs;iMET;0xTOXy&$5KBQCz>eoM +&UYWi#o}&D&g26OUy-#`IxP#qy|%Qg(5kx2qzNBw=>mzkW;HN*8(mxHOsbTPX_tO7L#%*s&}=KAugQG>J`}I+ZO-9>!+QoXOJ +C(pW}D2Gi^HLVqk=xR9+khO)OF9m3vU6vRw3BiZuV;p~~LF!rKe%eF5LWbfohu@@FkXWLe1v$7{gvLm +m~W_@;Y_Rwz529$9Yx|g#-pK%s^h_fkQa29@ovyrDb8+(?s910UIa5niz&SsqBZ2D!+7B61R%w{uNwQ +3c6{`u$Gnl)?KOE0~|)~#E|Hg4P~>UZB=0ZZ_wvw@? +Bsa~dvA3iKtl{^uA$$Ov%*V3%d=6X9SFvKgg`MC>6@ALuQ2y?e-<$Feq5PvL|0K#klk(^CR%{vNe~I$ +HOZiJE|1rvc(Jp^4%CDvT4^w^vd@lelk8{sVQfZv4Q<4Hj^EEnDkF288KXQALAjEe+uP)l=44M`L|O36L$GoOBT!8QJd|?R +x(d&wtnm|Nq!}ZV!YMEj1S0WeC*?l&v}XQRqrvrWk2Ib&)VhJP<}tkKZ^2Cr~J8;e+A{=K>6RN{5vWC +KFUvJt~yQmFH!zVTmFX#!bpOUN)VnP2pb8)UV?C*AXK*E?AHODT^q|;)f~>Quj1^+7S3)R<+l8tD1Sf +7A4>VhQT`c}e=g-;O8M7N{?{n~2b6y|((8lc!8rwcMTyK +WrLsCwoU8SBZr6to+3dv4f2OaAT|u~ZCZC3DWf*3FG`^NiJ@UJqoboEqZ2yo)=7{EHXuGcGA1fIIwmrvYn=oX-@C7XKQtyHIx;3AX4nHA+sX+L|6refqnHFgToj>jEio7gWc~ +^G1A=0R#W9i5F@gwDg2I2oKQUr}7AQm$jE=*GwQk*-64>Gs{ag~YUXfJ5Xo`Pe*f4=YXIp%@+F9-2(m +OIbB8Ip;tg9fR%P?6yLIcCX20E&py+adY5@VtwWh`S9>52;X9UAWCq-r`^jsUNsB5X4YQHcRw?oC`&s +#YTiL!cNF9ZG^!8y_}!khf10N4NW;C^CE~$+E9+czA7mV&c%SF+nX|o&D%CJQ2{NB5KP|3`deNK`k6y +wTKT7C2@^rwejE&37EE7tCnLD!(&2&NY)s$hc6u?+*<|2gb^R3?4kibLPXQ^!9L+ZQFWsw`62ibB#2R +wg97VC+rcN+M1=*`i)PVvkC=MVoR{QPtMfz8ks(p?_t_Q)dLaGU +M%dTt0?ni|Pg>%-XxOCs6k7Z$O>`^lytJvZWO&f+gfHbX9*pL^~(_Tq~#vbAg1vi0lNvkeC-sqN0LbzI>Ve`pXqz8~pa$Z|wKqe +`l+%bGC)C|oTa#4KmW_C3A +4ys-9XM@`3$?K^hs+ts~g%Lho#I&|;TvuE#~Uaj2K54NEDj@^3n?oDZ1xp(#Q^zvk#yZ7zm)upLdD@x +F^MT-YIck9{5t69@N56BNRnm&EK+}xV?p*#=X*Rn;&_U-z5HFI-o+Qiwp`Gab8M<1IseI4QZF=|c^z!n=heA|-Ur$dDPtR_ig +1*jlz~|Sko8(!_Q!^HfNjOJ2H0Bsk*`+~xyeQFCnjgY;5RZr?n!D=RdpML=I$Z36vs~(b$MIL(BET1~ +P_*sZwJVs4fY0K3HEGg>G>cfzsZ_XzRVy!`UZ3DoawzjEcu5C8h +tzkZ~?=fclF|9pwgXRlqmc7?{J7f+u)y=C9NeHN8U?PCGUWS8LQox5l!#~tDI_CR&_3G7w&fr +zcd(7K@^5n^(ess`vr?0>M`bio`^If}k@gINukyC%lzxwJcOi=N&XU}pPe{;kW4V?Pf@2pm9InjFl*s +){(C@n3`8#;8T50mN%ui&&}(kn8+1@+og4!Blc3Bs#4U63{-Bg3bI}pDQQycUJjKPBk_ +X2)|m%#tC&pzWHee@A0{P>3-ekkz1bmd~XeAmZVQpMLs@mz0# +)_AVgAiG-v~UZegy8gK6maM|MuH&#XV?J0@*y`Ofq-vmtTIVCb_#sFs(Ol-sHdj`s>v%zx?u}@4x +^4ER}Tw>4?s!sl5#%99AIjpT(c-DU@Xkz+VZVK?$f6B>;bg4&_=2^=VN8;cN?3=eA(~9O19vzh}>$RXeIyis+ytoIBXcN?i#rgR0<07DKpgwR$y`k+O&*z_iF7QVkQv2tqhugPrb +NhqtZ_)D_#8Vp{_-F91s;c7D4GH=8_xJAwIYt2fUwrWe-@bi2r#k0kGmAD1{-Zt)95^5XaNoawzi2Bb +Po5OlpaD7n@`iSTIs$H6|HZlP6z8FbIQKokx!0%I$By&BE +mh-~;3q%Tn)f(GCVo`bKT2Xz75agDk^bLNZ)xCYO`Z{Q0#04=~9{6`(Xa+&jpuQ=Bp<2>jv=YtP&?z5 +k0*voleqM_Fg&bxoi`HIt=*VNR!^k?uVU2hA(UkOTGDB-WP6SM=!OTrn>ho9s;{7d3LXrMaq`<(NEL_ +_A+oLALwo^q6P@0~W+#697E{rYvt@^T*^pY9|J1)zcI;SO4W3*-nmHbe*b4xXcqAUBYI=v^AK353QF{ +v*GYXc&5e^AN%{kZ2f0a+7^h!awym=N_L(ZQ@?>r#^!#`XBO7{Sil~Unh#3gRiIy$Q5Kmp#yCkat66a +yHL((7dYb1b3U4Az!na}zLsbha)k4MFC-egsVzLToAW-q{yhGqi&ypR*>e!p!wR%B=$3})fUGwrU*JF +D(Jvq$^o;!xf05cKX!wrvD54>fXxRKSzn9||3NJK<|BV|rIQ27i0%%ZzLPtY&(hwcDZr$QXKU&K-E{N +tY%n9YsWoZQx5C6dVgzq^YdyexM(D04io=IkcmG*o?3Nx!)&JnN4RU+#51m9hw +I}JMZbU=Z4<+47$Kr```<6X9BK%E()U9CsjaPmJ%l!=(4o)*8qgm +!CR@NCda`(N7=QP%ApR!Nu#sq3Z;@i%gbhPgxdZ9EmhVh5KP~<-_Ft8WuLJ4TEz#F&$cZC+{e&~CQYoIsL +SD|miv2%$(|A=TPUKGeTF9_mq6Aks-^RuLrR%L|o<+F$KrK#cEG&7v%B}Z_J@nL@E>mz~&dmE#_Y-2Q +rKk0iR|Afy9;0?TR22Q{m?E!czbpjo4Zy%%o1&xsZJxfFQ4x-^hqTz#uL<6-2v}e%picG^AnTD01A#E +ssViwVm62TWGM+zEnKqm#-*%*U9ZCL)HGth^@jzHM7X%m0zt+zPrA|=?@$=%w?@4x@fkNhKvmzoCiPZ +kpm)E3?+8vZG_XXvE$#t^<%AHr8>hw^7KwfxESFm53l9w!=>5Dg271|0QmjA_Rk)<3|XWI@P3$#nr}d +HnIm`P*;5E$F!yIuu%v*Lw7QzPn&BFCiMX6Ahw06AjQwN_$>MI_V{SD1Sa%%bzA1RuB!#h=xLvqs2P0 +EtJqnVRkmg`xOoAf8ejke^5|RFW>ccbO^-)s2!(iixr%ftCDlRw`sx99il+VcjPh8JZ +To+3F~F*}T#QzaU32pfa?=TQ{a{wVt2&)JtVESq%9hSzkrt{z1jX#cxv^<`lKp$ie;~dy^s0*|Qv}w_vsUGax^BeWr^TBN|!w!7$UW6wgAmEubYu1Q)5R@&qWuBj(j~yI&j~+evgA +YE)$+i}_01vbc`v4l0P@fhA$dm#by7h~-)A=WbTI!!A8w36GTMNVawx?(EZ$ID4tA6|KIMw$(&p)hQy +_y#k6kJ`kY879yWXW$2Km0IHPfr(or*Wl_CD4F&0Xl&j=%`N%<{;1yL+;T>qpe^*0^>+LgN=l`11$|4 +ME;F4;L)F*|3PMIyX&&Ev(G;E*kiYWXF@`P2x!v^4SoCe<@4sv6ZL>TLz&xA=m5UJUzzj8*Z^m=2ec8 +ihx+XueYXAB1LJ4*C+FYLwjlo`OY0XeUVH-WG&(w(FIccZ)B|V${zHcjfz#q&TQu`1zBqb&BQ +KLo)+1jvSgTNoW2G4N~ywMJzfAAc(DdY#XHrfH&0NMoLLI)G>w+T)``}Xa%RPV3s-MiPyB%hD#z2c8@ +?d>0huLu|~0w1bdPPPT!Di-a5>YJ0i2^l~i1s*GTl=(#HQScP{|GoF#0Fe>zgL`Fu2(5=+gMgIm}1Nm0u5bXf%5_J +MOK^;IR+uK9923*t;>I3~b(TgwQpf{cG5qBH@_Ofa(!}hWb+&~v(2yNksC!XM>vqV2_e*iZnAP@8mbP +*2755`0Yz#VkG{PN3~V_fIp;P7X0x8bkY|HSVC(4gqWhUfslp@XRJ7UKlS6#Ci*=JW;rs2jzGfL{l44 +_N}w(S}yzW&S_U_d597%Rh8P{XVunEjVM2eae(6{Q2jf7xHb-cO@VlWC^m4d-MUoUGa~QUAy+bfV;ro +e*8;)&kD#T`XJDu%=bfoK-Zx^vZn*Q-MV!vf8m7}ggh&47y)!EbMvs9a1WVL{0F2nUw3qL{IB3{!{5G +Nw6|gGZJWE*3BtN{>qLIgh4i2e_(HazJ3)(rJK3kN{Y81d1ApK`?Mui%_1^```0H-8D07~Q{|WB<5q +E*V{ro5C3ETV+Xh7cy`vv+Ba)AB_eJ6N~F(-JBdQj$fQ4hF>&WEmr9-}dZ@M{pwe>d&|f5`6L9+mp@fsGv~t3BDi-qhzu>vX!YWba3i&c|!mcVZMquzjBL)|NZ*!|Ub;+r=@i-LuaIq2=mu>#r6t0raJx+S_V +*rNF6#ho|x!_;HoH*uUzr4ozkzeo0*V`3(ddZR{NzXj^hMCsuw`MVAP(0!CR=O$ +h4Asf--$VG_;)ZT4FG<8wuxKd9 +ZMEUmbKGc8b0X#wf_4B1u{B={jn8#cp&jC*Vne)V-B)@6g1sb4yYM4niJ})cU^bmtWr(T;B(b`Y(MVRQS8#E5e*6=EfCy#Jo8CEAUMSAD3MI!sKD1tl@U@IOJ +g6`iD(sHk*@Pdg-Njv_*{fVV{F;-~t}teC*X!;Wvc83iGOO$#dH;%l-wl3HV3gE6mqL*m!`$UPr@sYc +Kz3TaP~aXeR0ZG{rxFaRJ75;0bgOcyZ184gc)vSm7tY{Pbpdetm;on}DCmBKyhmWE^k^d8BfuP&j?PZ +u?ipXK078`R)BI_P#st>5qIy$9Mlz_*mepD`Lbop#P|+4DY`(>m8c)^=Bo7+KeT=}|Hu?3-UU$P@s;_*_#p`+z +kdBDP`el7K=k$S%fPopb{3yJd9t9pvAO2@b))p-%Da^W9`8Nh{R4mEKguTi<0tqMF>f3d6(#0hfy10R +a|GX^4-_AXA_K}CvLX-EPt>HRr_Ur=&LJBKA9iER|3_o0uHY5%e&wuLv&!J(!5saB2@^Q#0{%7Xmu>z +6@LiEZt!0B|IDOMHvZ`7s?6~N25dX<8*{mkLCmGYuYvYq??*r#KrbL4Z~-r%x1l +qE=dNA5o@DptqY&+X`SRsS>({T3SH|3^XW%e%=1lJC>B&cr9xZTF=KU1^5Yj<)cjKACt+H26&j0N1qR!1K+~bsZ)iI8SMgTaexQP953u;_*7uG6Adr@iL!0w*Pp|(pOZj;q}S_(Z +os>$%Df`#3%my1(8JPg%7Dw_J{_@K&fAGpHuT+ta`q##d8=rdZwb$ +zCowwh9`wGFxdh^XU#dAvI^y;gxMy*@7Zs$Aiyd&yU>BCUZ)TY0(&kuiEX=y3uS#J@Hb0mM)&<-&+hP +=K@W01ISrT3sh$-aK^f&jHm$&a*LIgmwg6mG3)_e6oSB%93ou8S>Z(<425NF;>7>#hb=TYX~p+S}`UE?vQ_!`^KUuVdGq- +G1!aOBp4WrW9)^oAI5zccly(~6E+NND&P&hg#%+4*o*H!J4e8~7#MSmAUsfilO|0Pes1V6@ZsFv^?Ymo5HX&F?GC#g;|7eK7V3tJGUCp1zKQ +tq;)^c|dl2u4z^{h7guK+Z#gCM37Iy!_88(|6#1?~p)Gr9V1)m(=A5i*I99tHJ@Sn~d7yQH+sxVcQZ` +&0HvIkucIYnKL8#hky6nYwUd1m)3{JkZ^#rvOYb4T*eK7JkfiihHT^FvPqZ@>XB;41=6=(91OguEDMqwn6kcW<4%I2O6S9p+Af +Im&_EB`9fJ<)FrM6?0`8jk{Rw2`jFtu!63*!+L8D4C~@z2B0#2IkC|rOQal>6ei@L!XtCm15{OBP$~?DJP@<+yUJ+8A+ +L`DY_g(yiT8!nw2@E`+)x5-9uV5)o6kZdSi~*S>zs}`AGRFXO3=$QJ-py>5Qm>Yrt +4nGUsN^*6F)zjHzKWusOnz?kP#>IlAs4!CsAIt}WcF@zR66> +fjpeWh0vIgS`}fhQx-&hDAg~jUGO6qI~h6`@ioVoiLP*vv)J^`@Fk)_wx4i)_TW!&+vZ5d$;$O-ZkDX +10ERg>ws|sXAgX9;P!$02mU(n_P~}t5k8ZAbUurGEI#XfcKUqjbJ<7j+s4<=cckwu-$LJKd|&b1>ATP +OJKu}G|MI=*+hkD7L7GAR2l)(oV$chN4h-_~3-L?zEA%_#ciFG?;E2I7gU1g}9b7p0#lgo0R}FUYAL+ +ly|A7Ble|^BS0q+Ow3D5@q8dx2u3UUkT8}xF}>p>p}eH!#x(CMHbf+~VsgIfjn4jvdhDmWoHF*qyO82 +otfuHXZ~SAwg8-G{UrGIU7!kSjw}A&-TaLRN>o8nQPO=Ef$XIm7!UqH>G(rvnlO_4FI!S3LMZD)qwv| +3Gcv*ubfQ#=ygYt%EJWn+e{&;1j{;f-eXE8tgQrIYFH^WX6z;Av=e7hxmmAhYSrF5i&YtLdcYm86jyQ +b3$@M@KEbW}6%w%$SBncfS%ANPLK`x|eo_r`%=53Cy4)+g8JMV}o$`+aWvwDk4&jq;86o$8 +z6o9A2Ld&2hz-?BkR27NcElV5i~FTX*4dcPHZTm1I={o>bh@btmK{t^CD{O9=}^8d|W70^5|fM|{moD +!H5xH#~Mz&8W81b!BHCh%h5&w(t+BPcoO!=RHv7lJwjcMbL+UJs^WdRXw-;C$lsir_DUPX)Ib(qYK|Y +wzlRsw~6saiXDOp=se~gjlGk&&T_|&-*@~I1$lkqSIs((;4c~K%l9yi3=Fv7dkPfXs9Q5By=p%%*c?P +8Jap>T8_-&M}}!-Y0lD!W%t1!`wtrTFK6e6_dL&a-Pd*9=bU$Y-dHtKB`U0p3aEYRfMPlYI9Z_mz{Mu +LLkED1L;CYhE?RV}Zqq*l8y&irdDaXvBg`aVqR52INplbIcbM=^ta!lRAB_e@oq=IZC0TLo7$y +L&gM$%|nMBk;G=uR4_^U}Q#zrg#57!fCs@We#%wkQ$hVy`$Lj)RJa$r*AX@OWPewO^f9T2Iw; +b*^5ow*YSkfv+F+UHymtM|U^lJ#cnQ0!F@SzTy;WG%zLgnZ>oGmpTm$T0~>kMHf?i?@2YxM^41pX#p$%}XeuZDFW@HjC~ED^93);DS&MeSx2^#J!C&QM4HGga+kD|!E^*2P +Z!Z#x{4kKPn?FmK4T4muWhre*P(-3tZmj_D<9OK$#U5y7GNK<6VRoRZaW_;W{E;kEo#Iu(0C7dNG7TZ +wNnk$P)?9H{l;f;au^d2o#B;&|BcxDzqB~Q7x) +N=Rm!qFv1pgvBXJ$DHW&Tt)S!p4&quILxz)PKy#lwB9XK&9Zp}OiPWKzrqDF{8l6X%0=fcPLN|irZ_o +}}1WMd!AGF);_nbG_73OodyQOlgtd&RQ+0LYTP9-R=(jcw!REeroHL5|KQQ>BXpIqGyc6J=nBn@Zb^> +~l9-5$+y*mic5?eu!dzL2W}h^-Lg)ekUz*5)MRy8dEnj-eJ9+jz!UuqgnVknM@Sj{l%9h$8 +f%@gI;?nmkKNN5J+nIJP +|wj8G{m87PqO!dC{P#sanRgP}f-|0v**8CmD6!Q6GCqI2rGRlNqy$T6)9*-dzq=w|uGCOGhX?KTQKFlb?nM%Yg86$x#eSuoG=$TefRUJIPMAQ|&anz$@T|;NMcdmY4I*ypmUelLI`+Yk3{7=ZC@7 +jXcDg`6+&upXV3(CEm)f!^F4^IPU?{M}XBQB4B1miD*C^1DInW{Vd@E>LkFO3dqv|dj_DN5BUASKpt> +V04x*%4{L#m&7x9Nfj0vpC~8HWs27J}7Bz~HXcni$S#e%mgvsQ}RGA_DvOrdY`s-j~AC?WWQHE5ra$! +Cv>13GDX*wMeCj+LmUuWw)y&UFrp)S&;dM(VRp#IMv3|-Y#UDZ`x)m8t~`WH}30|XQR000O8B@~!Wrh +HB4;JyF=0E7Vm8vpnYkpvME0-1zY0`dr;0*bPS +0~kP)@XGnt+WX98c-VWt@86FfnRE7g@3q%nuf6s@We+SD%z_|T;7`{Dp+VsPJi`C}uN(dbjafBF_#l1 +Dl?|rAmMia_^V0>+`BhInUiHY6&WcBV_OquH=T9DURt10N{OQk}-n*tdpM2`k$F9%L&TtuZbUrS>{Br +75(fD7Qye9ezJb(4ONc2PYd@*{MJsYBbfaf2c{V@7#miOvt8;h?q@~<|YAF<~>KdqR9^LS{;aAZ&-g|M0jaKY$-Q2Zc#6-ctm@ia)}@lSKmX>?=+1=BbGnia#z5U+^ltnr9Lw; +mdN9@YiYZtTqX&Gm?R95*~#PI8O<}=>Nl<43rauf2DkX^7YDNixqg*ZZkTBW4BzG$0-Q2udjOa5#sxQem`THU9|L=dHb}_ULo&oZyKRn%D7B0;#3r}@UzhAC7Dg!KKVm&yCR?}94+SO!&unu6EKp?%67a>TLW94 +2kj9TvY-aoO*e)uT>gjs5^?C1+%EqHte;v!`s`9<#@zuxT6hs@sM +b6TfN6jzZPT6EukcVH{8#} +U4V{!)^_>+2@#SW^xL?<00(l}{S4!b_I$<;dr>uYu9mQV)72Q%~%{j;x(j`$o=PPU?yQyh3jsc +4;ahW8tTWYWXIQ(P_-8Y;)WztD0tGf#aItKc20NcpHgmFuu?h4(Xe_l49jXe)={0Invg>0gs!Ms&y5| +-525R~s8XqAlOt$Im|pX>&x(I2J?NFQ9dqd?GaAMGJr=dOvxv$WIo)>oc;Sd?`IFJtWPNX3lEa%yDbReTY~Efb8T%iE;Au-=-)+FAg>TEtv!DIm%NXE=_}!NpWgE7+ +W4kU)@h(G)<{(7xb3EUdYB^#O8e^%AQ-II<9N*EJi!B0|;lzF`bD!B)-68fEp+wk&*`>6+HNUmn#YkJ +|vaUGVTjIMj>Qkw+$bWpY|~n4o@H9VfsVEI`h(#v~XWX$z1|GT99!Ca90PoUkH&ke75pt692Z1iY(#s +iOCDTukMBElq>=Jh+zBqZ2~y!678O%5MT{q}U3#>yE$e14)E+R$V`##aM4kT)8vk$UIjykS3(?Kv!-b +WsoM{eCT4~_QH1E@!CF|P~QQmak;?h4?ttus&p3E#K@HHcx)fSN*P?U#5E1G1=AQQ(NX}U5y$>MfZG> +mbiJmmTPR4bE?$l9*teIh?;Vhpw9yYCbK!QJ!TCTA=g$(?aaSmc?Il#jk&Uh +hx}m-QnMBAe*`oI=#tAC`VkMraM02bxz_P4?=~I2=Q|vegFsO8HDzJq_IfUWpV^cUEhb5ozNYh?Zc&Z +Ncz}j%r#7^SFE3Es{~ZauT)QuRmMwXCyfnZYhwhIJ=u#5Pqo2%+!rqs+>DGV({KJvCjGGvfpu*UWRx1 +RSjAiE?#wu`iS=S#0n&=JdvzZ|{MlTwUc@E`V`EF8F@{c1v6+`S-;1DYr4h`oMpKOJS(v?y_l?SAf2F +thYGs62pNa7|@%Ri`ZApQIalykz!f2MD*ebo@ahNER4m$H}obqn$W$PVUlSv&=xgfUj`bP +m{y57{LK@G7m72M3I>yb$uA<0j%J1nC&?*+4F&^E_QO3iVNM$7W%B=2^nO*8BsE@8))cQfN^DUkz$S9 +)vu+A^&PU>WD)DP;lfB`MEKAeh8WO`^gv{y`8!zRV*`;nDcTUS3%k3`&bm9uuWm?@#Co5A9X=F@+_d8 +slkhR}n!;`Oj{bv2t8tD6yWu +EC;BAumG#gz-2xOi0DvwE097goM6$7;0c2^Pz#x!Rac)fS%|yKIpdKJ>n~|OYpQA(1^S~wlDl5e?wM- +tD-Pu3SF$uxJa&xo2vbR~+gDIz4>x1mB-t}g5({Jiozq7Sa7ou!cuXQ2WRUA$X#xNbr+1;nK;b53xFOkwdP9oYx1((y57R0Z>_nT;ZgfA +$s}p!X|ADh}S+?*jz>oF{!2xVLOPuMv)ejoibQfn*r@ih<4vVM9?CW=9a>y7NbpQERtQ +a3yI6$KVkE(AiEf~3tMT^9S<0hAR_CXM$MZOWobQdW|Rxw-p=?}BhsDN^)3wX_p#&fo#&@zSF>6H$~2 +X|ZlbSU!Jo&k;?K{GXO)W!F4$tshZV~1jSD6+26;bciDwW}gbhCh`_^KU-TSMKU97Y4?8x0&0jOm-z+ +$LOG6Bp`a$CG)EV<<7q_VPFGWi}LTx5>|x?lFq@J^q&j&ma%{8bq7NH!Gf2 +C4MOwV0N71ItoU01s`@zV(2c93Kt^%?4W2r +Lr7GJvq9Yv+kRC=60)%3?NLIhGF^y4n_gBrQ{_&8tI4zi>eT@+h%S6;2KV;>*=yjMFPSb&`WH(L2nn! +LkwCU^>ESv%1fcsR?8gNr(b%310VNa0xvmnu?(HHGCn3Cb2uqo*S6s7e{C3EEPDC;MvlR?ySU+9n`a_ +G!=0t*ct3SJep9vsJk!V~UyA_3{3EsR`u=#G^gh?Xz~^KnHlM%g~DJi&b6WNnXC_9O9wcbGO)th^ru= +E8Q6mQAs#ENL?nSs{w7ixp!`Vr}gP6oZv8|5~P3HR?#epb|QimqYBmndJ?TW`IxijerrLMRa#C0ctpX +J&%D7_+kf>Hm5)ssKteA7-V0MfSQwsnkOa%!%@W$p*ZNwJihuf={@iUq|Otzp;_R}@LGw`1EFlb{SE)omy#T7LtoOwdN>7hyWEe(UoiLAWR`wJD=yQfeo4EL- ++G%$81{zJb+k!=xToLrO45WqDFsOLI*i4cSvpiO-pm`*>M7i!F-6Lw>*)#y=#oz6`N?Ba@rjgCpr9qZ +16|IMD6}Sj*4F-e$?$m4m4B0KMKu&%k5^00o@B;)vKO7*N%l>xsGEV5LpEl%Y7Y9EX0V +^K{`6bEE|i{hyS8Qfjz?owK{ABy#ZP&9DT-8TcHuNPTBtnZ@Hn^7y|Vk(x(z*1H$wHag#vA!k0*;@n} +4Tu>qO9kqm5hmxk$_bLE!E(qF&|MHqXSQ(OTnG$jdw}dIwmxwKKzI?rK>39+{!s(tA8CxA>!mpUK>pr +Ru|8`k=o)NPr`f2QoghsPsZ`IfxHBwnozt(bOY!S%*ynca^G0R8SierJZ_jT7#KkH>DWfxxnZ@WV38bN>IsA&1HHgnm5HMM2GHqYvG%w(SS)tA<}{jc7TqXEBvE +!ZFUpV`x^?zXl+^>>^i}AcoPPjibl@<$a!oXCGt8MblpaB%4HO+&U{v_*Gh7N$yJkjdHlzpb^uyfv#K +dlZ`VbNZ2ml}k6dpwx6}S+6xrj~pkN`?!yATD26`|Qi%c4)_CV(PG?&_{7#Y@vQSU +(YC3;-V!@vu7Dw^LOka&NwTET_5LUaG2nsVa2+4-0q`k+#`G-*&LUf +lH$fKlu3V>_{~5rav;g>H6L_3mJK`tN*hrKl68v#K@W;iuf$(f6*RcHL1fxS|0^}ef%WOoJ2N5f9c7k +JN^^C4$1jxF=?Q|3HCwjdjfk7YTz{v>b?VU>(?Im!TnTA5CXY1WmabU8x6<7fM8(M0fFuAy3qUHd&dD`FV +!K#xk+rLs!72bN)WbGhyrfxotZhYk3mfm`Zx-t}jcbkz6v#Jyh5O1#Cn#%WOwzh3Co%AKLz%Mq +YeP^tgarI1Ke6F+qP7!6hDu-Y2qo8tI+@qq1WX9nqgSj?sq{fzM}f?aL|Z{ZY1;z&nwEcYIn(9J1z9< +G8xic#&`vf2!+@FoaE4#>wlMa3d3nfSPfmm7!|^^#(~NW?kUZ+DVdlV*dFOq%;XuD9I^fx#PmC$b=I;46u)SGZ^V1k1y({ +d90LBAGvdoguR-7Kxc=k%?;cn$af640zB@QEVYd!u6Q+%%LIy5ASYv6>GrrnF5XJ2fhU9Xw&6#N*Qm# +b$m;|yy1qOR>qH?VF3H87?g~!5>N9{9#SpF8QWpW-!DOCTK53Oq>p+7-#Je~pPEIcnQoonhm&FZfjcEw0d9bdQ7w&`Mhk7_Dhtg@{fDroWAi) +2Ha`+15?q)eWhP0H04slD`E+p@}nOa0qWV;LP(&7{(v$IXBQn>U;pFM%Lt5g)nbLe-25`y;;cqM=^z$ +yG>2Nqp?J%iFP)>I&THSgg@J2Qwm7-s?ffoa>IM*NYnn}5SblI%Kahi=fj99lIffhamukr~x)?~!s<< +rdmCnIS3Zqd&WYqwB^JrceLQ&*sqz)o7sPPMv@gl|divMxInLK~O7ljg?k#5#A=PVJMu0usQTdcA_7P +vT>zqS3y5KN~-!uuAp_(>r;&teUlzv(eFc)wkv5x8||Po!=IR?5`;_L(YF?)sE^7XV8*AjThS(7oOcS +IiluO$cB5Qj9oqptH%DuV&|N5aq%jkX`^9o@aDU-GwE@MKK?~E1U+ojn2;CC?z3X4tO=UEjpRsDmmLV +p=1mf})5YvcmJM@DQafNK7rt8!(ES~i*M%GiHWj3NC4h<)=zK&UUfi$|D+DjOSGa5%>!WYMJA8^82wv +@uR!czL+F81z&+UURTH1aZI%}U5i|1i~v!u?D721GG_Pp>?RdWw<;llT(mI}H=t<8{q5iS-~DOO5EI; +}v}y1EdKhrw;nV7y=tDO0cZ4*cdGK1NhNKl0J1cgM<*YLCRo=+)S^A-{m;@zjra)N6mVi32s+JoA@_( +@m=27Jqyd^P#~n%#QfBk5>^*M_0=HGGfZ~E8$x*MXh#AvC$B?< +94(&SlHUSt<*I-@`$YB9o6JE3mKy|QaUU(aKh-6ahVjTcFH3a=PjG)>C1jBkGMiJ{We1xrM?HHm(@0r{q8GLZM4{Jn=DuK+9URNY8+PS~ +6@flO%Y)C+@<8d8=_#8k%A@>Z?9x5XQ~|fSFIvgEoJ7ZmvJPz={4n7uZ6}$kVnmawCx}e)4otS$=OBI +T#>EWD;9ZDTa<>?ED+`x)g8J{iSyXF~#G3*BGox9gv@hW97N1`MSxMC~oq!P&{N~*OB%E7}9WgJ!iT(<*gBqc>*l{HFC@dB0xPKHwtSuvwv+$U&@K{ +-XbcIuK7j7>ezVIece{Dp9u{Bkt5feNXX6YbuH{0FA7vySRf%t81B7vwKXlE*!7tPYlUJ^sN$>ekQ%? +oD8dW+orrA0RHC#9hDbypR0s4ckB7doa`z3zPFMtpJ4J*P}i-9m5#;^N}S?WT8467*g60%Xg~QAzKNc +fIPv1}>~KuayS@uyf(LAlYSwudj%;o-U$#O-e*?_u+^X!=T3{O0C4NpvK7>T<=3z^?U$7xKzfo%6|MDSLM+rz1cht4n^EjaX +!*KfROL*HgMf{<MapnGF*U)wS6P`JSek-PPiDZ +CY>D(sncbRgZ8{WHx29ly66xgb0%C0o#D=zuwcjFlt#4CLPk-)dCEvCa=Y|hpVSk#n4E=#onmU1oZev(8?gK*as9K-$&ZSRXu~Wd<^BW( +D6Z9o{=*Pa*CQLt~#8xz$%elngt?~TqVSi1*-L-!DkJwD$4+*0cG18(I3Uk=;0^y%X^uo75X(Zf3&0~ +XRcJ;C1Pk1Pf1kZSk5Z23S4$ejj=sBoXrgA#t`jJ$g-4Wu^Cyuq=_tc$TC>Vhb&brOPZ0TiDeN(8N9J +Ukj;KUSG>iAV(2K_Yzm-RX)~xdK)unq2%Wg-;pu!FdmxK$%@%>k1B(m?bHl#T-f++s2nV5|4e+qT-vn +-S0W~PG(^POF&AUJ+DJa|*nQEecM^Uj*N28~^J4iHrnIKRf98nJ- +I?P%vc~Y<-FQwUu2KmWv7d++3w*txU-I;FQ1}bwUR$xJd}AGl=%5b)dhC{sOcxVNiSr&pJ&Ig219eYR*W~pa&kfJxy9X_lff`gX}H +`9rqqow=zE`$!SYLHD96d;?P`7pQRP2l8n)o_sDq=;;yzegtL`0aZ}9AXIYFQDI3-@mM19CH96F+h;L +nI?eu9zUu=Cv}JR9$FGM#clgr5L{OVP|OX4??vC~i_I)-o@Iibqs*22A)U$N>d_*ZIdvwfmWu|Aje$t +^e|?7p-cPo9BOaSOL&?{h{N_%zZ(`NSh;&Tt8@wpBAsZ#qnr1H)Y+%Nd(}N`O_NEs3Rf%|;EgTkfT$< +sl1zhm$9!>z8?0hc_)6Gfgzlx{lu=K=U@&43-JaZFyKvQo`MLcs%?=jps0+DHUm@qeVNeZVVHc2n`$E +i8m1#?+e*i?r8k^qPR%9!+t*O{b^X+|k1;zcAv{RJSLi@pbTf3(?Y{mlr?X5?8ukeSziA+5Et(-8l%8{&U7~t`A)K0Ph(?#9!^t()Cz6u0RHELJSx|XzaAKC%i2U)_c +H_}Xy`C3471q!krCQsXUIosD-7t^8gCO|(3kji`+1l3XMGd2?%B|#(~{w|Zv=`#lqACQ)`*kyfda0e7 +R`z@wTWh5;V)PP{B?l}A}!N}7Q{POY!Ex7^&N$W~1Y;FgN)&{8mDi*s4M%)>+V$T}xC0s(7YBZd_lO+ +g|JM*YFBd$b0@G08Y&&p<4h!bZ)#eQ|kc@PpUq*Z&maRO$!dU9gFU!+yQh~j&jS~=5zX{Eqz4ZLV@qC +uY1{>2>(kP$B04|?#A2Fmtm+5Yg%^MaO2XF}3)^h@{_3vK)-AfI +|>Jf`_y?P{78K!SkZlcG|A|RRk_zQT|Jg^)jY>#B$0*}~>O#c~wE04Mv9@-KJU&X^?Fg%a$NJ(sT+t6 +%Z#jKOdnI(v93{+S@Y7>OwA6t~6sLwGq(Kp@UJzVh#cV0)S^o&A%-6XzT%Rj!thGPGgKf#=32CHW?6<{G2B`pBhFhRR6K-M5H3 +NZJ6^>6qtK+fP$FIkD=NA#EYi%`(4Ui4_d#A1^DSrnG)Hsp20x)a{bZSHMLuazq{veooUHgxsTHk+WY +LoPtF-+@fpC-h^~slyf*^ehc}wh)AtwI~I;_Xo4dZ?P@XA?Z6cE7=4O_kLv%b~zooEQWG%TQ)tP +h(jn*#vtGu|v(qQcPaN3k#ljk(QzVVa6c;`R^fZ#aBn=HfSG>cCwjEvXJJDd(V7TiWD&S@y&ieT0-r+ +nFaGPYmcM{o*u4L}Ac%)KDvVV61L!E%9Ebk_W9agxVb~CwSA;zgwZF<{x`*eI3@8iYev#8{wX|%+SEtQ-(4a{XE)beYl)AzwrxlI6Z1ahpkCuTK=x# +eu4o;`ea;|6O3t~+-EH#yYHjI*=RCdQ^`|C?x|+4BwGCYRata%H9XVqZLb2s$8a37-QNFWybG;H|u6OGP;kMP~9uo2m{P8wN- +cIv#^<;7`cKcUd<9e#~SIF9US8?+-SLQzY_VehNQ5!YgAKjm)>UZ-~sv*$B%9j`n`(;LUP;y}zE^U0u +K04(sg})w3TYB(4(MEGZkEJ)PmWKlFHgNA5)g8Ipp#xf?#>Fhw^wBl$!1;`fO!)oy&3rN1fP3T)fdV^ckw +9x7gjgJTfz*gc=Fu^9`5VcnE|cX9KRN=OK^~bm;L+%gE)c1=J4subC5!(&&1(qhvgqx@HK!j~lnd=?W +|I(^W($z0?s)hwTt}a%mgr_Q*pEQ&XzgLT%_cNey%#lOo!VO%NacY`_Kz>tSLMi$N6RF(#>C|OOZvIge1toqv9rWlWtJH)}wDJtapXc~A*+m|SKlt~24GEPW# ++Tuy1_z61#$q8V~z#bRz0tL8?r*AK*vV)L0+c7pgV#xckr{sj+So48?dl8Jd6;wjQP6Ck19>~5+0Zkg +A0U#r(O--!;P_i5LNEAKaX#g$E7_qs*Hr2I~aGyyra;K5VVdro=>9^Y1@Da+Don}VN^+q0O745xZN?u +3%tEnc#T?}Uct1ELsS_uT07=2T{*^9YcQ+?T~p5JY_Q@k9aJTMMuguB4@~9lZ_c^Zv_Z56y=fFDxOk- +6o?@8S?GOjQIhcQ_hDK_y_EX42pXozg6lno0RnGbo(-I#+TY42&O3Z>U5{H%xn9yt_FdnrM1@ZZB@P5 +kLMQkO~E$pHpI<4^8gO7OA(J#?HjSk2Gv9+JGCqcLxZ3eK;Db$(AOcLKdFk!Br@Ny+XXlBrCZJIcDb- +@VG%q7OZdxKEd$~#{q9@lychS*->LyJgErZKf}wzWU$3HssmpH`ZO&IrU>bp#8&z{(QqqbvmT2|5NtO5Vc9$C35z17Uosldj&H5KR*P5KOl7pss`V(C +yR+J&HvDO_cUKa%JmODM!Em!lYXU_+RM6II}ITu1sZHIdHTrdYMh|Z{0Fw%&}q +J5O`?S=lTe`1v|9l`S;gJrJatIIuwtv~f*`dLDVJneo{ed+%i%OrYLG|H#+h*8(>)J5lF(&4}Esd%rEGGaUgXH{fI4r^gAP?^Sp4Q4{`}3s@1S +ETMY+LGuyLt>}_Jzv}O*v^XwX3s{L-uoo{^f!ND`52kQT +@mlKc0Xy8igJ}3i+*fUt`k=d7FS9pcjuxJu)u$iCoMBe<{gsFgt2Aj&F;>HN73c7Xhg8XuQu7r%%A%6 +j|M*ixYc}vL&Kgbw=V{w@GFbk;sKvgF!tSEaIp6Sm^ +d-x2Ia)Tlbc6d6F)B3#A)Y{dlttC;gNPuz7o`7F%E{$J#@q;ApaX!Ob=-PC>#pMPxNYU7%7c<%jxyVS +x(xke|71e6~aD%6?G_Y=l_e#_Tso7BLvd{_+gI +$D6#GuEXJxniSO@11I|l)|<0oO?hCTc>?Nc4KuOEt1^^ij;&xh%j;nm>Fu9^* +S?vhqnV7@rh8$7tb6Cu)zrtSIa7fwz`YJx8J2v8w@?K|&X6Uo^h^}k-Adm&G0yx}%5Ho(NpxXhx0`k( +&4#(|*nzays_YIz3{kOhtAQP!2kr8MW&S^x&m!<>WN3DxSaKdD$1KqkwCN*{wR|U=E-NW(_8KTxQYLMSSH}JS=CLUbLgIEoHi@%pMMa*hD#7#&e)kXvZ_RCbt`clsNg_$GIl&|4 +{wr=?n0X?N#86p#rc|zh?taJwEQ=jWY34z>YOG(0X{&_oC~T{`ry(Kg0Sf;_{-uao4F>sphHgK^!O9afmZuTGlA&MQ>9+r-+p7%a;U&^K72S +qIc-a)jX3V*Lz|=hjxDG{=tARWAj2!g?#~Hl!1=ew{X7tS_^#;zu1eE*Q@wT>AA^re36q^**~+f;j+b +5Fx~s7Mpe*nVJKVu2W+6G(2VklB>_orQ*3}CJI17#R9*VHp*?>>iTK3F0-G6DKL~*Mq|I{JSpUf`AIjwH>eDW8hTsc0TBnf7>~e<2SR%o4UT=q&9-7~JA2tK);2N5* +SWBa(t{|3-);h`V)COiGzyS&0^Fx>0^h18yZIE=p-|J;ADl$uM>F*A*t8p4+ +G&XMW5~opF%VjEaLuIYrF}i>?j>N-7!Cd+PuQymoryax{4ySfasOjkmt!XS*9=+ut&KaIJ(lY79gNX@ +Tb%0Ia_nc}dz^z!^V~=mVPvE=l^!5J49y?#3J{t_zEpZU(P9N&-v=DU|ZfoA}w=E@b_Jm +Y~i9-AjVUl{9JxVrR^?3sSz9`gtnoY`x@H4iaX1iD$X5_ilt{&`{!{+eRTvD0~Y3hM*)V7pxY3`eNt} +u85-Lw;Nt_k$cE}-`x^U!Pv1v5cLoAm&*NHL-8{Er2pw=@^MXT;hF%ANT#nQqUY3nXQ-2^t}#F1;;WY +6~5Ec7&H~fZ|8WagR#7Uu}0n4`R0ghT*BbacY0Ras|6Tt`+ag1IvABR|#aSG3G$6|f7B&-Dm>*f#P|m{e7gulC*Qw_akTb#` +8<|i1`JqEX%PuK4?xE&fH=*qpw?P4h5(zo_9hIjwWWQMmmnc)r8hpyE?#^*iUpUm;*@VbLPqz~=o9Pe +7-c-KJ28#v3GvNwt4-Lf|^_t8BGmY00#Lh?O7m*^3v`BgvP?n%^A1Fx~6cwSPwao;toQ$Q>*)!0(Cld+g%7m8Xap}k_rnqEszn!$vzBFJ{Q*80OTNnv>4Ylbhxz7h5# +sVj8Tp*f+fv;GgAB1cObfHHz>5wBgeSzD%6B;w>gac6!p7o;!0+A4vSh2?i;EH>}r!eeM+wSxJ@v +id*Qtc$o%X~oSvR^_?<1_a=D^eB3)760o+Iq&pLz?ID-BSR$ZYUE}~1j;*2G>0o0g69gwu{ukhx!9>* +Kt)K^p4W@~`-1tQte|I&4Tvu;(t9y67^c-r}pNs#CElrQt%Xj@?tYv)1UnzOi`7Y?VTP%|_zx+^}fv4 +>L;SclQe`PNjNN-^{!=Crq6+2&m~@5Umj0gX<+lw(roc}ZNe#as8}Y`tB{0h*afT6#NIn3NUjm;C{9Q +k!jrU)`oj?k-83+y%_3oL!8{{C-B!H+IK2C};zFWtTA>08txAOyPERUUz{X%`e&AucBvd*Hlu=h6F6W +z!MMn$u6k@w@Z7x1wdPCabtQ}pdekk1(cPSP+@}M{1SEdx|Sr3w;7GMhxRFDbs33r=Do7M4vO?)kz%R(yeW8nQkh$@OdgaOF;IpVI1NRy%q{V02}H_1^`Z$l>qd +6xgYMA6+^kuLmhOrfp8^r8L#JQJAc^nLZ8u;9&KK<#~44Gy|mti1_cdaKW;h_x@KppU+iEm +hx|5lpKN6xb}9wffNl+gX3bdO!KRj2!oyTY)T7b|`2R8e~_aeM(y96DExmYmpL4x2#vP*`|wM-w@l(x +UG-MdRxFv7Yz4Dd?q|^oQikzY0m}-jp1sAk@dw#1~k1Khi04!(l;1mObhdy6LrTQUSMyP#Y;a`9)WRX +!?=l8u2M5wj?x4N!~xZC6ARdg*MF7}}P?E?p99(YZs`H}#mSLFCd~V($ +vZUX3QIXDrVRhu&2UfeiXOaiw{3(Q09~WD=A^;>yg);+k3$hS+J!;I@ +#Q%&AJdAZfL3w@LD~SvSjcwa~viZ>%Fm9J!1}D5_=2Ql;5Qd1^D#tH6T>6o#x>wc;BG_d2*VR|M@oRC +7a4fD>9$L?d;CN0Kd2PU8D(f1{|96^2JE%W}~Ytp3$Xv@Vd=qzOH +y%h^otcdy<01@v?RI7Tlr*5R2`J@>qmYAvH-R;Ov{SL?fT8Y9i +f2Nv&H98kk-at7O%57NI3{OYQqE~8kD)eQ*3_F1@8C&ruS^WBziw3E!vND$9F37SS!%$Q`_R4h}yQ}E +1p-0N#{}Ec`|4r`?U`NKe8bycHMcj_G=^Q{%wrMGz=8=ZQ~M%y1sni&XxyfCEwl6&K@UU5hEdcJ0e${ +R(0f!%eLXR6W%kFs5XYDatik$Z~Ozixl6WpBX9gQLxIBq(uwx +tF>F(L=IQU4G4i&#KkgcFIA(ka1GG~%QCi4kqQrOQDy`g72xc$jYq|wQK0Rys|9}gXX{Cft3Uv|sLeY +}!uItNSwA9kQgK%0ar&k))DNmVwxG;fiC>+v{3PlTJ<0~zeRe?>jdjG$0&CcrflJTuC&}akK +4vvX*->2F-_#x1&jVuPd7H=+ZDb2wlY`CxJ!nFRI|a{8VNMb`=rU&&G68s7!r5nzqs6y#flpS~rOWCa +y?SMIvMywJ!&PQ@yFtikoqQvPrg-bBN@Zf*i3QYk<#ObXUS1745pN*b|AK@{Z?WR~iCFtXMoI7hFfw4 +=qzqIzKSF^d5Se2sGk;Z_D+Y4io5aWqYy>4Q95;H8elRIH+`c`BI3C2-B6X~paGH5%*x_d#ZeAeCk!i +fc)jzqR`hrduWF&Ps?b6P+6Nj0NB5HGgvZPK+C3&Zg;Srwx(7tDv_|-`+U73TAe&rFV$0wMS2k>DF4) +T*Mm+tsW4fFo-$razAz79p1m%L0is9zcS{4vnyuWR-biwke}LiUHJbLxCH-LblwizPorn&ivUqrlDm> +Ux{|?2=j^`5Gv=OiG?QhW(r5*6}jWN$!3nqdMTWRmVa|$0J^s-s*MRYI?gG@aFAN?P~LP$Vt6zx+C%& +_JlH*pE87^%$)s>vsM+ixDr&z>)dKz3KB85&7)}?=ZT#4tJEi?kp{vWtXECv>D< +FxN=EfFV~!9mXQ}_yqX~UougRv7uBc&qEi9lCs#A)Ce+O2yG@eyqKZBI4Amxj`-9xv5wz2e%?UFQtjv +47q=Q|+!iF@i8f_hz51{(TXStI!j4>Uk=58pbZDtz`Epo)+gnk((Z)M};ZS|uz+xhra4HxPbGr4XN*D +MT*=_Own6f>8WL-nc?=uDz}v0tHN+`f2$yX5bhAS{?Gll=kmjlcOkkjb0=1W}+d$)GU-sXGotGM5oaA +CR%l4{!o_yvLhs&_9XnfP{VQS`uv--MDFh{%v9na{_qFgNy)q!1-`#u9n7(bX%Ee3eVi +(job**aOQ>Xl>`3nKsPhEQTB(}-N(6WqZMb_iTCGtpc4+Xzuk@Zu(i==LAgiWa9}g%a(=hWis~h?!k$ +7sa;J&Dx<%KQ7w(hP4jmnG+<7;j17wY$)gVyuB~Y_8K#V)oNe2XF&K)G@K+oh{Re12iUzJg%X~07(#!92dUgqWt`p$&AYTwzRiSl^_OS`CeQZ`**|l3u`OVrCFWDL +((N!ipJ90RI-Qq%@eUQnBSJSWB;=S|~&2xd?c`w^t^SV5SA5E+j?Wj%tESX=Q=SkX>Vn<~Yr!S^G+`@ +eY+XG~qw>bN`PX!^kn8V|lL`&4xX24_MmdgY@0{PoPyt53sbl4e}4m)w%r7`Rc@nIWB`qoc~d70_9S* +*9qY|O1KxOk@-ON8?K+fS-X&y=?t5955`%3UuEL`t<*k>MQmd5YY|1vVg#2obHiZ)6!xl?P +{I&3qS5mrO3lQ%QTV;nkfZKAKDg->;tMCO~6>*b2$3>GL>yv>COEX9n2WG7xVl>If^EWI100lA`8j*K +p4pCI@EDvoVp?v*sO0?+-7-@6GlxvQgAYo8GJtoZ)Dt^t2tyz$*h`_{9I_p)a~Ewqr=I1S!oJ^ce`bT +0Dq)E##|&D{FABX6Lxcnk=Yh(5)+!QS}G@%$*f$rThw>B|s|qhQM50K0k*M>z&Rje?RzhweDFSQt3sa +>+GY7o5vG4P2&SI_Jj9kAWWUJ|qZ@2vAiw1=BsX4d|;A%y6F$=Jj}Ho0Q=+Jl!~{fpnRs +ph|PTL;=J3CD$v<4m;P-%XOYjYPjKuS&aoeJ=Y97jaO_!lbdsEsnPM~kI7F$3fn)3CAjN$P9J`2d?3< +zOkuZ|w7~A750*;*tQBii+nl^}Dk*FVd4kY|`I=j$m6diAL;CxGhM=xthG9I(Ds>q)?k3@z8d{P+;FE +(YgO#F7*|KGY^Q<2+ymbrd`))_9f)X%cbNzIC&7g8&}Ds)K~_6WAJ_;&Y+-x+7{H4c96T&8R_t=*`6gyaYPO^7eKa0+ +w=J+hy4lZmS;bnsY&}3E8@rO(XF@{)Xvx`uu-_&{Jm=W$tev;nDfaOD_)wp=*u+o|nvM! +s>niJny3QU52U7avnlsq!lEXE{F9|{u`3O(#1;wa}PrSU1Io{V4gT&etk46NEy~Lt_jnP>=8n?@|U(^ +);CMgc(a;>taIFb~HUz*bHsVV+dQXJY%wOeb7|05|5@95C3tttL6WgrgiBigW<;twDWcqVp2^sWoDH1 +Zq#WmjHFdS{r8M9V-x5x)guIvY)3zL5xkrq_rM+bdU44;r`V0R@3RA1d9G8;x96P@64-sR=e#7 +iO2CiPUcTD3a9%6NSu^l5nrHw7@27{u@(*|Gl-})&LF$vJg|Y(hc{qNgaA|21xbP_9&x3yv@6f +<9D@PK?LTJ6tynvPkv*29qa)fO#p+jGF36eszg_CdcoaWk#ZiCzHyrf~ccJ7{a%h`ioN+?3y1Ui73qM +$?I|4sPe9H@=`6gU)RSR352w5R$24$1o0LN~%pBpL)L@eC{^)gYysP*yl{Iggd=*rx6NQgESHhIH&55l`<9@r68xH$Cizwx2+= +#HPxXJR35R;+!KOAjE1IhCBmH=%kGZ%0v}Dw6ZN@L3>lJIkbCZ)B>eu$^7{%>*vpF?K!@1qvg%8y9%K +DIpn2tOiybi?QqCK`tKntkB`7*s{+=SL+x4h{x}~WwKNKQ&>ldC +xwLkdF{)zvEUk?E_GE43Snr)r;4|cyMzqs**rwl8g?ogg$JFfo1eY&IRX9Mr|KE-W+MezvtQ@H+T!ni +8Q{r&+1Xv#~yfR}m^p%uc0a?9~KTvdpckh>oCW%vyO75euMEVU# +B%l{p@?LD!9c!P&Ui{JMMLO%nDd@$wlKWe9g#GuR_}*{C;RR-WGC6{d`~keu5cuOxJn{R@rJZ?sYrHc +*xS%sjw#Ga2o#g&5_)#+HYDpl5@%^%k?wryicbRD6YF%F*dDzS?EIW?~!qUg&3Sj)!H}?w0g;P*hRyQ +-E*s1mwcT7puqo9ep)U!EDZiLKB*hloTy7|RUf18V;?8kZJ37Yadb{EwBdr=Am5d~Puueb^2gH<4UM= +y1LWBN2+VZ-kWo^he0K+RD!0u}1ght(1}A(OpPAH}aec_WXT!b`h6bxX_T@X~Hy?H0urUfL(s+qE=r_ +_03kGW@(}7k$>a%c45UT3=rw4xTLhFWHvmU#ed?CM=bZa9#J*_sy22BdkS<4~*5~dfyTzB+X@e!QO~cRgX=xJKp{0=Bq_t5%$B`N9$2Cjr9(Cn*$=#$Bm!Lm~a%~ +BIM_aj~1bsP_>q>CnN|{h1q@wS%yIIMLxzMsrzS4$Dt8q_D%am55p9A*pU?UDDT((&Xbt}V`S+80x2t +A!+eREb+N2D6j+XhK6GLJG$TooHBiK~v=)r}VD3dG~6#8qEsEl8CzjeH<}K)z902E5yqGWEhggXkG^*$Qz$y5sGi4pbVvMXtc_?LD=VIpihz2ZFxYiZ<(h-SOV +zZ0GpYhq_Mx2YyIV>~|JJxlaA5A+NG(Cj7f<=CW!)OMmM__Ep{kx}*AW_662A>HQxfsBqU<`@Q7e5KN +V-J3LxCZWUPI)h3e}2S_IM;B`W*r8PU^Eg9S5(4H@&51Yegy>&}$AU|hbwlhW5(z2*auJd(@AymbDwY +nJoZ$LGv_B$m=GJRwNx*=>j3=`>VLnw`)yFLJ2xCnDAWzdl+-{^V_og+!69GS6$_n|VpbO+tGkJ)#IS +E@^Qj11c4iWzN?|Nb)W_Ou>qM{$Y%>@X)v@AIOp3uE!jD6Z&6G)IR{2D6E;Yuvh^CG&)qlGzQDz7Ej6 +v;?Jn<(d-we7Z8W1izDx%fSPWD@*V*-AvuK2*EsWov&OQ-iUWY8W@w|t$VUuvmm+QD_N|42RH0{qJWc +2o5D-m#L(*)L81)P#x<89hKaR!`)3KGCiC6RV(1x@;Y)!x|M=WrEwoGOIm^O{@M{%Avv7-MOY1 +=m+trddV-iW6kht1CAiS@p=l70|Mf+JxLesc`)_xO7Wx<}5&cHpS6Kfy7qZT$G=j<1Xs9R28U@?<$v$ +>UvH$y2ow{F>Kd7`gb%A!vbz(Tgwiv)=MSJ?&zH5^GQKNLKn$m$B1yYYe{<2Ef2xOCOtA3;v4rP*#rI +Yi;x8uct#N8Xj~nqVQ`z;By~+Zm(v+d5XJ&WO|o9R&FeV>O;?6g6Ccv{K^$WWwK8F!dM2|Avvp+K!(9 +Z&oxtf(}6UbcW{xXXlZBA$%y>O%P*XO&E_=7PZW_!484MUqP81)$Ruc7(f?Dy=vkZ=CCCsErQR_}i|~ +3%9Iixm>kj8*20U&8eWQX=naI1qcq>NvNeeT{K?l$lhaH$){b;VOA13n1t$;vPcn%y#wvmnObbMr6<* ++4#L}L?AGec403IqHs&sYCM#W(To93~s1K(_?HccSy_(R1mhe+{t4`~QWkk!`lAV$v<@${uxzYq0?8Y +H#y%?28PDZZBiXTIMc~chot(WFz}-+HNLg)4jd8!3GIGgu(^D%JAYqxk3b3GeAciw1fL-qklHBtYd_e +h_v}O?gdwcI})NEdqUR}Ry@zc{7hbvM4H+6W_dCk3z7=`q}$Hf0P{KvPB2b3MnF|&>Q}t>-@Hb$9{ +dmmpKRgzXN2CoWD(c{*T@NWKM20aeaWtPZX!n@I19EWTJ%wqoF&<1M&hk6PlEBU{8|C0R0or17nGFBKM_h#5++<^&82Lk9OP +P`f27~9AE#-;86`i$>@#>T|(2B+lumdiC~&=a-l!v-f}ORgnD%=Kn?tcT8`?*zN%HN`K2=L$L*aO&@cLRk4%YQ@ydDb@!t +2!{2hhx$WW!lJ)lZ9I*+K)mTc>B(VvCI7?!Z;uAD&V1m?`4PnXvXBwEGG(JH>QWO8j`SE7-;fO(^kKq +L62GF%1VgYbDycx+B2oDbKWYe=izi7N{e!6vi5uYEJi|XWQ;`7s-G(Q2OJ%n!`!nYgaD8}I=_$kI6z_ +>1q>x6!>8N%ti+m7+9XMBQing{>8`B}x5F83oEL9cozv8nj}+nCVCuPou;Y3y2y_l_9%o3=d6znhBUc +`W6n3qO>5!Fde1caQug-aia0Zuv61tT)weR~}xG2Jmmt``N!|{T~VZq(+TQ>}7a~YLhKs-YEBO_ZM#S +kNZS{H8HIZ%H3VtqfC*TkJ#b87~XF%-mirB;runDwkOyqN4zGz1%Lb5?|Jrnj{Tlxzh~I*Y4+RK;+Z} +p$x{LpJ?m?~7vk3%$PxkgpA3)~^}dTAH!%Sj%!GK+H#H?-0%69FtWxMU +JUDaw8FL^01XgAYJDy^4Bi`oJ#^ZkFHbIv=A2-WUy_jmdHckuOj&h0tRdCvXz95w1C=|RsG4T|Shm+l +}TJR)5p%q>o>RFo69$kiF5|@j!u2U^)+3V>q +M93JcobDjk>>V){f3?POSC(*?Y!>Kh{OZ^g3I`f5%-$c!(#?dhiQz~cF9zen(bLnT%3AZCaJ-t%KM5{2g{5V7yMR)S6uLSb$18Op|!#R?!auo>hO#|^CuI +Zc-q?pB|NPi3XR>9I?LziXEwb>nQE=R8K28)tzJ&`^@|NmzC)>Z-@G7E&2oQjako^@!Wd`8FthuuboV +Zk`bKJUGQU4aO5+>pz&}QWal6$6DSK+>=$84pPng}dGIujQqZ?#(>&)&20nLw6i!Dw=_ommj=;T4gC* +o;fb+;N-H-`@5DDuck6OBB)4@6eguDC_0U`lWPjz20nbxKX|`9RNsi8Ww;d^vHBI02WbqcphK06MgS|BNPjB;atSdp{pDFT0UO{*B~w +AkEaa5qFlV7U#9@EIaLN(y{84uMPJEh~w1-G#vGYH&N@umzP+36KD*5v}X7|RJS|*mrv&{&XN?LZ{NZY0Sp&Z~`^Q_p@h=p+zlW&soJq~*Fx +qMknfqbiTfjn%)HMpm{=SHNvOQX}>pK@J8zIDv|-m7mN`_*r?I>y|tf<)EgZpflDh2K{-xjLb`xa|SW +H`^h8)R5lCc?m>Cp*r&HEbRqXsw4DR@rp&>%wL(AQorOEKDHXS*IPsqDBGX&7LVnty~V@eQ#|;#5oLO{I^Rj|4s!FWdisw}uSNJcsAV9M1MRPUd}dVF91dQ9V9``BSUD-g +LcETq!Q&DmH;cEAs?mRAvYyR>=@Zf@0!Gs4_-aq$&vlu_{9alCAU;$Q&g~APbZ*ffOkI0!dcBuMqlSm +9GU-rYIF&t+2`m0;gAzlsbV^s+GM0C%GuwD!fW#m1hM`VpBE=oWJjNzrd*;DXRrebxBz!aFUW@7kC|? +dkXvn;d2B|Et!%ja5{^qqzb%|@FaoLt71y5z-i@G=_7DG*U=y)Y<3D8v#?nJo0o*mC~s`MZK2Zd)3!vzqgi+i7D0` +$87pj>SBka;HVMM!tguOd%@ASpmas{NO&?*iOW35sri-xotFW=cMlWn06*dL1=`L*C!p07pFk!P)*p$ +J>PuMJ4>1}{u`Q2mOa{5YdO9V?rSdL%mZIWPlN?69OY?Zq_9}ek<(->XPN9N|$I%WUH){*&)jlLuEgI +Sm*tYK-ZF-O4sSk4g6(}2J8>PThXMs0rZI)?vm{FJ_nxMP{_H)u(v_Zr>AHQj>8?snZ^Rd<2pY-{r_n +ufbRTi-g}&Zy}YoWJT5)sVmH`xe8JH_?e_xVxdK>~`%;e?^;~XZmB>->C9suf*NyRePNKJqCIrzT$+s +C$W|mQPyMTJrtAhL2^Rgnhp=I*zuU^oS +O|x3=W>C9NoVD)@70+UE|7v>Far4F@q`5wUleKg6_4WKwG;P+I$o>_S42W3y?xbv^PdL(8*|+ho)+pN +x8)^H!ngTQlsANXjo{o6N3Vo-nJA)PH$it)^h!`DoL`=+t!g33}%F&Ik;EOe*sXRx|Wv;a0cbYQ0tUG +rYXZqc`k0sJ!(G-_mde1p9mZRDZ2*R2^TD+1@$KboYgHccc4c>Y4`e1WxLj!|Iz#6|GHAP@Mr)r&fOc +lV^R~Iagq6N{vqCr|Lo7>>iZvR`?>0Gc3KLjI*zc^judlh=Hjj)0!+MP9CU7l+OI+y4Ml2t4l@7Fju5 +-d2WL8Ej{SbwDK6e{O3Rg@BM}5s2xyDpQ9VV?zyf5BKubvrGV6D +k2PsjA%eF4L~JhNM&r!@Inp0o`>X9DKoo2iVvOI4Mk4YVUaaEX +#U%7lF)LD^`QN{bUrC*qT<*MDdGbLo+ao(*+vMKY5EDda +t&Wo}p#o}S_nX%YG`YVqLvE?`pVa~us%LGnRGz_*m+L~fd7J4~{%o_ln~S%q$*}s>PU0e3{kS+3(cN$gZQ +>&4iv4J-&Sa>h5nx42nxT@`8Y@~X;xb}I%Va}kUy +jUhIxAY{7%Jc8rkk8SDq3>H?rKF#uA%Z-T84=Wpj&J~>2w5?R(q`OIeMBG4KeIQ#IKwUE$#Bqev~Jg5 +5?_1*3!_#)qc*5nb~m8pC8(bctjM7*e_JI;T_nSnqN=Q(?kg2&xfYF`cq*$AxV(to7&0)fTNdUeQu0^d3~S6pKgXDq2c}!pD +jhyEC_y147$|5>MIc0lq9qorE980FBnTH?7Amc#Psia^KpAxBxsM>H%|dB% +RaT1z+F9y@@8k+He;=z)0GuNF)aSfFHF3CjRKKrSkmJc>&Y*nPajOOf}QKS#6G)=9y~Z$EnFJ)e`FQq +@=qikSLWGx=4W;Dj&H>mGX6?GcdpUT904#wVDJQ?3AGpka$EG6)TgU2r^eGt{^HOVWq)YqWE}5@C+g< +-SB^^Gbqcjb8?HP2eJwvg4=b<$^{-^aZhgH=5X|UOZDl^Cn!03q8h@fI{Yo}+A4Kv5Py=#6KbkB+iXh +t!DN{F0~*vkS{18#l-%eshJ%CNfNU}`8$VigaAhEMru|8;5$fkbYxCEc?%JA(2^B44R`~hvBTWr&dfw +(eMNJh^s9qLhj-$ifw4`sT@)#<6==e-OxI87nP|0<>s&A@r+~=Rr@B?+b5vKBsi(F|`N;rFCBx^)!l} +h?8Rt#CSpH3!NbB`+byodI(+OoyUPu;ptxSKtC3QGP^^{npj@U^rp3E>%bT(ssk!SgmXs*&_Sp|Ll+k +MbocOybKj-TP=&3aHuYev8(o;A5LwXLA3z>T?>TI{PKojsa~~caS~e=K7yGomu64p_?<_t4ihWPjUCv +zV78I!(Dow7j)nqwR-wz7?3*Y;O%k#jP012G4l*nH}P{E$iI=4Tl&%T;GGx;6S=Zwnd&HMn%eP>%HVdVy>QQUOK0jso2w59k@$Olh(Rsx3xJkj1WT +1wJ4aEX6HrRly@#9U^xNBV +9%J0-AxjNIHKeuY29&%hFw;$!T|IW}bg6#9qpAkfJ+m9d`+3p01`4XCk^1x2v;Xx;!+D}KH)LYYvwg!<(!HcR +A6j~76FY;6aF8Bs#kt7&N&eO4|jIO{|SbwCax>?u)g8EKmr=h2t?O#iVz4rsNtBf@@qKoqmWt|{Wp*P +n?wI)THIe~sSzFh@8MAyu+BRK`%8_grY5^KG~CtXd&Wgxb0={oqve>_N1nHdRL<6D_rhrJ*fSdRPY?|-ivJe~>N)7W?4I~%*6w9@x=fpVU(OCdtaZ$J0kSDe +RT!TfI(LEBD;nzwd5rGnc44tE$@)z>L!U&tg&B9e8HBHlr~1qLaZEt|VmuwI{jnTjcWlS)snm)nA!~7 +zZRPBi4Ge{8hKm1GtNx-*o?w>HgGO6Zq7hNW1*SKvTu%{plh(-8sn4x=o#9TH`b%)2nw2QvI4z>n^31 +U-IL3X>_h&jMKTUuZK-dW`o}73`fKGCf5Y{0*V>R&1*qoYw8XDmPDZGPjtgPpdQ|XNPE=_w4P=D4c~9 +CLAkZMSBtHXz#f01cL2K)C+Y4mgW>)?YE;?;L2Nl`x;o_yPOWS*RMPUB8fAnNBrqr4{UJ@7EExG$X8F ++(*Cs<%C0c?tp^3HS7eWm8*V4p_-n0B8zwBObs#w+|n>pzziyoP)Gh=ducA(XK0dEglKW^RimyMFN8>2fbJhm +aXIc`cT$< +*CCAUz&#=|sl6WS+q9r7sE`FN~_wVJpiBRe?>HS0iAMaxgTS;iI3?cQ=@a|evvEPplQVx(Bquht`DQK +$lpw|ncq=T=DmH*OGZ-UchKbCE7=)pS`!eHuI?Qd; +tE~e-9(qx_VIUZcCGG2=&B29SH>JitOMrJ=&;Jj_4MsC$JJ6BnQg5J|LSR;)4R;nH_=O#JVPjZtQZ`T +f7F{4kuCA)Vg2dah9G2(YqaKK7-&t|XIL9XV+Hr#SGY7ebB4RAM{oE$lBesw2qTy^0RrEpKjDGdJwDa;uwQkZqA;}j0lU7139X}BR$C(~u;yW- +(;PtKlryfsDfm!~KUrA? +%2(jvPx;XyLOts{c(w7@{iX9-VqAPs+KEEL1v)xG)fm%2^g;qNaQL&OUD3ae^IU(S*zuh5rcf3jnJIUBoPp)W^_A-c +9meK`+TdPVxzN*{eWA>E|DoQH(1a(k=COBEgI%Mt6hYT&$kNR;n$<)zALdX=F%ErO;X;T2P&_50Ie$i +dSUh5&0#nh_Sf*CJ1(keXhiuhtfG`I{XVF1f;$FDo<_JQE>~5h>vXnDdqn;jcqS6+F@Q{sxWc3_Hwve +MNn$r;GAeZ*XN?g?!pF)_cdaD8?uiA*5n}JJ +;)cX%8n+#Ko@?Qy`QA}wC;7vmRBD9X@;vRmdo{vl`Schl?v?*2X)pl;dKx2)9`!Rc?(F>dyQd(&~3-HGaYw!r6r=y=H!8{!TeQi +G|dCVUDpM)Dp9~s>C-5nOuPm`Pgs!lpbvAYsk^z}GA6g1YY>0b&hRo4;%`p2weZ#GM!6a--emo=;bjA ++r1c6N7@#KYK_>1lnBCQMa>`V3LAN5ol=AhmI8twb1XP_e{I-@f2?dLVJ?-#G#V8RFL-j7!+*MqgWlE +!Ch&g$Y&S`XW3u3}hc@00W?|svvf#%RkUb&_{^a@UCRPV=Es`rYKqu{|*LubJE%Y#q#oDH`%K#jUEQd +|zC2ckVsaXtJ88_Lm%UiK!L^87;4P@~+vdUeLey +Rwa5au%~aNGgsMK9Q9rjAW!NhBq6}MUFY34d_PwYyu@^N4;|ZV5sJ{G&+sBrOr}Lb@xq+VQZ|(eca;y-r|0P*2ZXyC*M+a-cU +J!D+#)}w&I9dbN!9xnp+0Y`P$5COF1b?ZVBefVqecU#qB}nFNwlHV#O3;XLvbNUw_3G&n~M!hFXC)!V +^khn9j7TA%L#k6rlF%4V7OJLH9umopi{MyE<9H0=7u=A0%8ap+&->Vz;L%TQaph4~b3LWw@t{AMK8e_ +Ln<7hqRrZX*#*n^NP09^PJe}F;wp2I}LLTm3R4x-JYp@w`Zfa+cS`#^el=o?;K9ez?hjaMTV-IX?v+@ +Zz=}*fqYBhjNVYu6hPMtm&MHUF5xyr@dp$;rC03JXI4}BK^~0Jwu%xsMG72R+TE~|nQKbkeuxg6nrXu +bV^Yt(X2Z^8i~9?{0OqN%y8E6g7n??ZKPpx?-7O9CsS#@4%Qt-dEuo)|L0^~d?zc_s8?|`jwp4yOP5EAT;QoR{Y_l5#P +FD>M2p#(gjs$bZ9AG*&y2BU=9W{-n~6$5J#8L6bfA=8kg+WdrLaYwfc$DpowerXI*a?qhUN5rnPoL6Z +}InRU&QDRHBF@|4$(GLox73N6lvqhw3F7SX%b^?cvRbnqE$j3C}r1*{o4ygf#JIpd_!t4EVh?O+sEam +R1V*i`V)n8NheZtyuC~qs=fp98q;4rR)|!joTNHoB}HCDYtDN-Vd~L*^Oy+QwW{^2Qfb#}kCo?c!=Er +c*0!Y1i7hFy9Yu}74oaG(rqF1qJhOCJenssxdZ8d@9&JyNcyICCrtMFiSvrmTHiv%Z$xL@&=gn~?xJ6 +3TP+1OQ6g($^_6(?x=Tf*ggSM|=|EK!<0W2oGQIU318^m_6bsZ +Q|yt4S@MK4@zIqPShBtlUX_|7uc8t4H5WtaEyh=bKn(+HPV6n<~yUW5zV~l9{$X#2(hsj`y&P?e1auo +3u@=w=#KCUQ=~c>|$B@E*5gcT=f~s|3$8KGT59PXQ=e2_FR1vCEvU{uHidW2UldiIiicam$*rkNLJ%FzsY5M6}#5J4anh`?V%yJ*#ds6QzPl?T}ZQjkSc|Mz2A2#!7^v>S+Kfo2mJ#A0m-8m0kKs!iP=UwRG) +D<~a_YWp_Gc`h@;mO1tUNl4)M`LL4&9|aarOO8^2GfQ{87+p1^aTKNiR+cTVliZ|#n +$yCoEFQYvA){U&uaw7|#s*abosI7^c +v~f`nD3Uky@v1)cV#~KNU9fb=2w_g<-l*Fm0%$vkGQ@(uXomEa_sXsckkZG2ih_XgET5C`}bV4s&57# +2ZVVU|#d6{!%YOkBz%8!N$rTSmFCpTVI#^Qr3nOd>xeUOIb-DBop+mHi^d3ho0P`q9Y@aU_kQ;z9U8I +)4e-YpsVdvl`}D(F{SKrURTjF$T@0zoXD_2+lLFJ8!z4|yF@0<22s6d8jJyPNF{p^3qJ%QU9}}ZtA}374L_R94Y9Xm%uGa~pwjkGdbMh=c!pz#FZHn%;x@%~7OH< +GB*M(JW-9zU3#)Km{TL)C+>p4-2r8Ccl%?+65LZ{m6l=MEt{6tcQcP+~2nI)x7JD +#{9nSTORwI`b3r6wWI6ygeoSg?qtgp*0sXvf+fI`Qf+a)j(RqLTo=Wv0P;VyU{9geEe;>#O_cZc6+zO +F1=R&$HAQ8ACc5Bf0c8*^>#1Ehi-3&V@;Q}TxW_>p1NJ?zw`$5WP$aODd8>a!TMF!++!H!6Mp$2Gg>@ +sGDm=ObX@@vo<7PvNhzt7gF^~P&^?+xD|w>~r7pVDSnX3gkz>wQ-El0M@-Y{jy~Fy>0CnHsE|M(J +5E%)QWfCu&;BR}SK8ppOswUNt9%@!^Z|0Q5LdNJn#1nqFt9`V&d#E(l|sNOG-%#6uPXtTj_K;Vc{|l$M!m3UvG; +o5x>GlR{c|yXYPB$iEsjbf6%OIX^e|hZ#d#q=-CC*as(Tbz){s;AiU?n-T{`w>{w=@rv@edxW*wlj;5 +h*%*+HoZh8O$n>vw@84A)X!ft?T5UX}vuzI1qWw>VZ|Kie$bV+2qW2@z{S6*8%i^tqi~~xy7irK$7qU +q6qBWP^Y_=m*dUZfuMc|FVjOp&MI=br31+%NP*S=I*OikFA8XQuwAPm)_b`GcDd3V?6fiy(IU`#4;kl +Gv4-2t`x%zC}feN>tIBjuC9j3MUd~a(FR+ +{Nky_UcIw?t-Ifk{27X_N{!b+>9x2$eX||EZJJB3U0_D){+OPl>};i*pa+!AHGEu4J3w4U3ow8ZPgNd +O*1`>38IhBHXjzP3x7z1^$K*aFFI9etp^B$R+zGBdrp9{7VBN(p!lNFTcm0GmWw{1J?|%8N!;liP^X~ +66-Cw&u6mM}nTIB6_h5>E(o)5YPWRY?lQb+j;Y0V)OX>}Pi1XK8Ui*D6rrqqiSg8VTBepdJB7jLIg>y +IYG{rjycqyGYvtAsQ%eu;ubIwd_fS<(Niwbn76UEis-UKONt&zHP&FI@AZ6O%WqZpw#I!$L +%Weu8#Ns&bqBUqm@f18fN9_AE?pN?7RxsRiJJBY}8(n|NlF-Zl6%Ew6l6UT%Vhzq +PjI;4};h1PuZ0E#8<61r9Y=F@0*F??H1s%|pJEXMHgZk_=c^Jjj?l;fGy-l@*~%rQmZF=t=2=-+{qPT +kM%9aK~IukPcHE(MK_rZADTW7Zie?&Cra-%>(bmpt7|NjONwT^sXnP;IbJ +~{!3Nv&V=>6*!YDfMNdWLIa}AF4PvosajV}5yA{5%4INsCHJ0&$A9!y>BHZ+Qo0nV>LKzrO?Yc~_($#hllT5+Dm_%d?{6 +AS?h7V&qq2F5Sig>?^=nh*GXK7={wPXOd`;VTJ$ukT`N&5g-#ut=W!qQrC@JG{A2V&|uk3-%gAES#^7 +lWr;ii0+F@!e4inB2Mx|NRk1SxCKN_gg3E55H^l7<3dScVyj+yNlf$Xs)1CMMERgZc3!Ugt~31a^f#p +>DWmF|U+y)`}nM@AwRUK#$XY`Wf}0{I?4lg0I=cBglWBCT_ge++QnaPlzU%cJQ)c=SMHzDo0PyXcAWAt!UKaPS6->9W~5q6sc +%5?WB#?n%St$2Q2RWYSa(WBzbDcT_cs><$E7N{7pXT`0G#|uXtJG6vt@Mto +^Xw`M%g+46|+!oUG{WIi=i~PtS!0xc*8$!@ +fR~ROwA +{I*A8a2j0F-Cl%aY#x1lQAL-}K#x68j4D1SoB6XFj1W+~*O^W78I=hLnPody)Uo(s78)NjO=r%P;kQd +RI95DBTR;r0BW)4w8EmCu6Q5v7dF^LhU}myfdYtnOL#fN#BWdXm`vG*#TyjTx%wn3iFyC3(Bb_&(Yl8 +Pr2|A;lBnyy>8NR`Dye2cP9?4X$zuX!-IM=4O2M-RN!Dy#4qBe(nO466i7FtCVLDqGtX;Fm!D$9Xnm# +VyLvW+2foA^Xg7~KX$)AZ#xl%p)!hl^X_yu1kzTWEtZ+wQv$3t7OoFDSsb{@tg$3(2j|2SB2F67z1Ce +Q3a?lmixekv71^hpkDJ;!D4pB8%D6uFivgv(en4o+kdp& +V7ubc@=b4PjnFxslW7t8^ssWDzll-H%or*EFO|_W-3o +^z(7jSwd&AkDP7aN!=Vw@nj3Unq5lEJSk8qMXm#)RL|>tY|AzVEF^nrz2~%5R6_tQLzaw;CBH0J{g@} +W68YR^%&X|4JmB#gfBe*8Ty;kjAj_|%VQ4ndD{lX<@CpD^T7w#o?k2<&vs5MYq|lH +NvT_Z)hV3WB(KPpeDC->5-AGa-iNf6Qs)CqaZ>pj67x3BIA>lAzq$mM(?aPWw~J+?;j;LB7Y_dZpo!b +{G;GnFqGzLj(-J^#-bFFGezUWlEMWU`{>q;Ijqok>&l~n?6p5E|U;flBN8qy`W0r_%@-mpKp>953WiM +WUSV3|1LNF+K+!qyR7l36WVj4YN>%PZ*XqFj2Y;(cV+e +i^NVr+TmnE!|@FNKuB@7rKU@r-;k#M?%1rn~1@L>tJNVr$Rw1_>A=VX}mo66Q;Ir-Z8|+$7;P3F{?nlu#cdV6=ooButXF{@B#am=m~f7gs(_gC*cLkp?AH1_!Y$lt;hO=ZDmu4Qxu3? +$X;^ko$yPl=9G&Yr)xvhh_STS?5Ld0leMtlzZQM^X(Kb(bdI1^N+vKjdE^`p5m*r$W?|)iO(z^VSO!9|CD;^vPcy{?Fy^HW{Z8vAH;XayKI05*{nL+3{E8 +4IwCwfJ-`0rJ%YPwx!%mK5qkE!8@gkxO4EBT(BiSB}loE(<|csMapt`%$l5r^R$sH3*pBGo{cP)#lyA +;)UM*vqmq#8<;ho`IqgcSnDa;_D3|AsgY)9JEToz9l!dT`Je_Uxdz3f7ixI-f%SJJm)*__Uh#2e$n=A +8IP%i=$snv2yxGeUOsBhWxjc?@7l&>rE-R2|rG|-tT^T*+J5t1(9(xbZi?%CfFO{|{%91br%gYmS +MHF*6hj~6_r=xzNExl`hhTdY?3KsI3=-|}zylup79mb>4|7Xh2R2@~)7PpM=JXVjQNI=Gq^GIarz(NV66)LYgC_dCT|094XD&(%eOhNSeD!sy4mmo(d@xwl47n)_(+Hw$w=X)ciF{#txZ!fe#yljZ@^ocgUWmud2l=A~ME(tM}J-`|D#q +BNh7W>uQENplvj`wl)Xq45Ug#SOfV(^|bW7KcA0a{BTSWhStN2uY^1mY1HHw^Cx3*}O$4<|8a$mznVGYnR2_z*ZkKIG?`e9G)%_uNI$1U!$kd(ZZu#S;sD3Jhs$Zpz`p$+L(o(k +&vbM3HfKm=jFuIP3LinXbi|9~z3d3gPI9-ms98PDFqflayOM%N#>NP= +Lw!C7SkHt)vFlCh#bITbn33Hr8hr&}B@<)Eio%#NBe*OW0or3hiA)#U6oedF@UAlIQ>fR%|XRqFU`u6 +K@958TD%-|tIW3L((clGcQ@d+bGB_@r&=Gx>jV^hYBzivXRX=0k$GHJ3kJ!48{*7Z}fr%j(RbJh*B=i +GSH+<72`TwG$m-BIdv-La%>>792iTfSl?`~UrCyy7p``*)?=m483-p#Z}_`?{``L7pBC2mKP~?M1-~ovwBWzH1n64-e(CSB5}<4S^ZSK=ttH^U`uB6`r@wCa +^ELUp{o*9cbYE`%rRi-=cUv3&=(YD(zUuCZ%Bo-edUf?0_u86u_pHD7zTe#c+Xo)p@X*7LY<%>0zu)x +O<4-*Kho_$2{LCN!^z5Ji^4BfTJ^#XsFTK2V+xAypeeG{McGm9Ny=U+1`}Q9=_{N)u4j(yMckK9EZ@= +^IdnevMdFq1?KRR9i@h6|2Is4h?O2ZePbLYSOs`2Y@{{HQEP0cMAzW?FkkC)W{a);1yga3;HeKqC%=dQi^UR1ztIV +pf00LHa`v1cJ-ap`VRm*9x+^13u6{wm0{k!`wwK|jhYuFS^m;ul5$IWvCX-I(<-aOlRgMV!e^vggyUV +);1|o*4sw!l3LPB|V`D*x%9h#gyyBy&WNp?1AUpK~YtU&aKF^Ie?6%NctHi +3&EGSSQu}2*&Is?ix(O5Ib&D2m)e|8A7@tT%tNyBT=t^ET;W4=5kI&?7#(|nyUpR~*u6Dfxk#APX0(e +^ZgiCr8$$;dl@7gJj*Dzgh_TRV%q_{Y8B6lD5Q5$az6RMkzmDf~aR=Z+zIGKaSKHeDEM<07AQ6Me3D9 +4>I0qPVgIIwWhK@k~4JE9!z_u_4mPLidwy{Pq*&&@J1%*yqsXZsxX3WWV+8oBA@vc%w{KCTGcw6xuL$ +$zd%0X*6q1fQD&{0yn*jDV+{I|wqb1W__&f%GctU!q2x4TLpNaSf7G95CF-%KAeBK(p7aZ$7P%-xOO3I%JJ2!|<{NE`?arlF{d{~2QIuq1$pNFeRBg1v%7wDnwzxztB@ASP(N>o +N8YO0I$Bwb-Gt4udDgAEtH6wnL{`|sQpPzfx`chH_ls0xA^)IFKZa^k2orgY%I-1gXrG<;_MYj1xvb~ +#^S6J$tx8$0n5%#==S5&TcetZqLtDbeu3u9fALRr`8hPv?DQ2PgoVy$>oAJhqaTRsy0ZvtNIW7c)@W1 +U9%CFl$R%#hTH8AgTLBm0D~K6wV#C#f^**OKk+FN%8sjN1R5+-q2`-__2^tof3Ku4~a`oe$TQ9bK>)J4@s@-zn +VG-~0`U(HxEKK*GKzMGzP%fmM_2>f&+e(aImIte?3C9@Vb5?zXMgilxl~Izda!U^H`WPb6V2b#BN@va#n|}M0_wv2SeP!7>5O5_m>0>6Gc +o5wJ{ui<8hh18*LAP$X4mxz6ZtBj|pBfjHWn63e+7eTD+D1$f5#Yv1^HMuoR3UJ3{pD$p4-H_Bhnnclc-d3cgt7r-8Rl!ai{VIqlK6oC-e{kDkLuAVa?jwE+s4I=9l=+irJ+wK>*I_@{p*4 +H*PZpzbzve5Xi<3w9h7rfIztv{bRKmucGS^IN0gf|q!VccpGae)R&IFT;6&ZPw@UiIfDY^)n4i=5;B~ +Y!>S#FXXc+5uAJRzme`W~ke=x8Ak&&HPBxpyDx}2A(cVf(n@3xP9+s06Y3*q5J9)yE8@HbQP=ZLBmeS +@BtE8z$EgSNLP+T)(6Ybg7*9koHXRH4pPwYEXJm=G3|)RV=0)2lJMzI$D_+Aj9U1rgbiKK+jt_5voZe +K1))q@|s;!k+yQ&wZiw!F55kf%bp}{@H#BRF19WHay(Y-`NHE8;Nof!Mdh(zAvOvU*D-NpjPYitlsoT +g69ZkI38-}eWfg$Jy15gCU$nT4VT~zXF#~l%^&1gS^uO +w)?arMyS!%=aUAf|`eV_K{Z#p?evYxfJ=a>kdR`OC1}EL_KUkOV-yUsa@1HKOhqp7PZug-#K+n3&G@$ +-=W?dY-$5`N%1Jxlpw&;zqMQ@Zx)aPv8E;#%WL^_{BIybhP&bk08%bBhHvuJ}*zR-X4%=4D7dX2y54> +R@_zNn9V>r-d=MY%=%D6jRt_379V##->+g(Y{qrJ_cLvt +Kb*zav!kN*z1Y?vtFh+4Uhzm+NS`olQ?HljVlnP-KxXys4uCs%j*@*`yJCs&D0d3g@b&2|2nB{_LgN}!NJ^7KijpyXiZm{~5 ++*(CAlEUl=dR5MMnOuycesjY`vbTga|{7aur&vs_cHf5)ChkmVT7vbRkCY@j)0hJUMI}y`+epXwKo$? +NS6vs`pgu(10Z4Ttj%%ye;xwcK&FtJ;OpB#tNWhYV2W=8_Fb*t7K_#|LfaRHA$&r+6avy-%u6%;vpfz +schv!8!@soA#BwP=yekqrS-5f~CM-C1-)A)?GFnpM1{us9E8nCvo3N^W!6C%KAqiGrorNeeE~hRCs4wM^ka$40~a5T8RsM +ehIq1ay|~Z7ulRw5H$Ig2uS%R-K3&Yi1mh?BA1QLCDRPebR(H~R+W?7d`jAzKDBFR0j)@FfB&Cc$TE +eJWxW*>+=Kq*2WBx;su1t81keav7VKJF)Z__Q=PBWGQu1w?A1D?cBZMkn%6Iqf+Pn^)pC3gsi28*&_l +v`{&lo#e4kw~4}$BmCt}%@?^d&98NLi~KQ`C`ymyX*T=M@4x!f&fkuD{PggL;xLD~*?2tvZB;u)%2F4 +I`$}!imz^qzU_bk#cyvGO>vI2oKkMs1zyJLH^ZThE)j3kjq17jU3F(Xjoqeah9J>v{TpT6MbdsTqmylnpJApm_z +uZyC+WXj^1MpIyQO=Dbgz_jNcSF{SoobZKPLHkQpWeRwBIWEJ0jiRlkU+$LKd3LeC6IYAAaihulE0sh +W~fd|3}0B|N0{}Xujt4_lbKP|0?+J{Y7;66YjA3hZB9UqSSpXK{s`TPI947BAH5}uK;UcwI~JR#xR64pt0NWudW?v=1s!q+6+CgBzdH%WNEglpT-ua +t0^giZ+yBwQe2wuGq?CQFzkVXTA^5;6&c11=vEv@l`cD4`-@y@V$utdsD7gxe(CEa3(T%Oxz3aE^qj5 +++NSAYrV8MhT-OjF3>zw0W_BEvo2W8zodEte3D(!fg_6mT-g0E~CF%n#&|CkT6@qR0(4xjF2!u!i$$= +{1VnmxLLygu5nk)_{-M~{1awFqwoFMCM;7`Z@f93ac_f`Db{QTul3$Mx +R6Dbd==~pekQgy(8>8Gs~jgX&~e{~WbnDMWHE9LKPN%zoQKsgI6z16+x38SrwzC-JR^AA%2HVx0hd17Kw|+BDzF_yOEFNbpZ^dW?{j9gv>S=mR?Q +0H4NZ2EGOGIKFJ)Zv%#2h5Q8`2KWL#JMb3)kKvma1wVjehY5bh0sb&d#B~wy`K!@KlYhXl;poSS4&V- +a^}uTZ$D%-eOJM<i9&jm!LK}cD16(&s<`Lk@MD!uBr?VaJk48 +NJer7b+nzKICLD!9nzZsc-MIJWx$sK{&~EhvjwpKb&xsije +yr(C*-plaPxJ-55WTxC)jy{h>PB4H{&aS|7?Qz?7;1Sx8rjHF9%$OuMBu4pgtAl892dvQiVJ>1FkcHK +J3>6zHO3a39uR8Yp`ztjG8ETumav`#`p~O_XF-X3x3`PykM632>6@@`PUu!2$(!c&?Go-lJHOPp2_Iv +;b%Qyq*d5=1Dq}KIe-h(krw#L1H3C;&|e1lV!EJ7@SMa64$Khv7QnCZJ&CZ!DU2=8LS6zd2i%h-=Gm-zHOkk^3a(-F3}j>GR}GIllWTL9m^0eK4i1RyQ!5&eWYj6H +LsD67u``rjn$KHyS(SQo`ZA&Hv)#x`Q2#LHNYXcBHma)S036-*p~smVH5lx0{p57IP4n%LyI9J3 +JW-@Sn!Yp_-e86{~F-B+ZoG)pY?!49Kt>pFsKx1hrJ$fRjIJA1gt9+{1bf534Y+`0AQmF`AzWxR^B1v ++5~7@0{+o<6#zb3CS70Jls0wMu%5PxLPYzr_)Upz{dd&+l0IZel_5RO``oL`1oVO{z<^V$7TCQ5 +Z`Lp*8@KN1mXo=3+Q?h;i+v0-0`IFUkezCx%o!ecLRLp4?=Fw0^YR+^FP=x1B`r5TfbLfW{k4FeS7iH7_-l|e`~>_B^>+u_Sm2d_2X}}z;SgZgodWL$IAy1xlL`3fPQm9 +Uz_GQ0&vAecyoq$d{{}$IAyM9}fZyPI4ffvx7918l5DY(paTf6jm|BN95paS%j-l+LzDEP@I40^sE#O +`6pbo-*8DR4}Vr&!kF3SJAqTba5=D#QK0$TWgAM<1QA$SDeX5e*z>idERb`rEtLAJ0bc;b{Odjv;*fc +_NrNq~DkL?1?e0LOeJ+M;oQOYofoUIzH^N3u+QB<`n_foFnWN}M3wnYbFf5u`g7WKVFsv?n-M+7rA(; +so!PIKk&7PVlhA>CFCli4*j%7dV~0A0=^uSrR8$AaR1LBu?-diPL%PLlP%Q=TV7If^^oD>X +H%zF604j(z}ru)ft?`#aR9z*ckYlW-s0YOXs7b407T>?HgLw3_Qb(sA8Un%R0<$8Pe84|&dvjMl@5OW +zytSN=wf7{Mk_p3G*?p3Mpi3z^I15*bxqj(_EB!-fs)>8GD&+qZ9LwY9bEz4zW@mo8mma%-!cdxoKrO +kwPvL*-%2uz$&tquh8@{pwU#W*K9#s!D!+AfRs{tq2Gx=&a +%bNZ(#eql!Zs_H&^h**Oi@ptj)h0`!Kkvr%A?u%;W3LEh=~B@+T6Ca3=p;@A(Pg%;|I9gfr8xmOtUlF7~foS?^yy0Y#v{& +*zU%SI$I3)4`{c{(Qqt=-^w4Pc3IUeE#@?@EP#+SE-yw$g=)(e)-+}mw~MO-PyUS`a}NmgJ);Wnzb`OGwDx&^KZ+zeX6RyG+$j&J#^>XS@YRS^@*J?%_4f+*Ae}ds(Q +Y;c?;vE7~}F4{rjsCLH$+cFF*DZpXMh>eg+{Yl2Iy`lfGji;Wv2jU=|k_#}X0}*!c0|naN~g>FMcQcG +IR!V>jGz1H19Y8`;e_-^^CzO=61{En>IcdMjJJcrkN09K8KlzI-`*%r$}i>CW-&g%v5RVv&Wdy)BL1U +t(g9I8xcGtH!cFm#4FbS1n{)H`v*}d#13uCvIc0J5+Y{Zk3JPr?LrqRW|w!m5n>1vU!J9miD&FrkqsS +w9_gp#W(8{mCgNJWx4e#TX;@ot5&UI)z#JP-h1z54?g%Hd+4Eu*v5?;*``gK*dPAz2cExMwrpW9z4Q` +q%U*l!HTKq?E$r^ERrXS&%3go{b$0OJL3a4?VRr1;G4}S`Z?lspPqGg`{E&Th_5^$D8D2eR@G)HAm;^^1F%+V~t( +n|#7|L->IRpMdb!A$%6XgH~f9!Y@VmH3{xo6`qZ+# +~^*V%~hwyhI{DTPpGQz*@6P|Tu*{lcZ>;Sf&#i80>!;YflH?nl5M&88Kk#?p|`xR4f-^kQ^pJ(cG2bg +;7v`=^=!e4{%nFzlS;mZ(y9l}3}@Gl_z4us#2@QCx?4-oz=!Z&)uUkwUVK%o#6ehmtL0ENAv@G&SfMy +l+akt+Lkn#!7PS6TDDD!cHU%6>Sedc*fd_~8gY0pX`3d@jP@f$*yl{vm{a3gKTw_}vJ96yZNWc#ltby +_7%{!uLk_0SG??;jc#c>kxhp!rzYYYZ3k_gx`tqCw;KpPKPu8r2{dW=f_<|9wtvVO81PcG)u+=khi3nCQLNVznVM@9z1Y +>bWhJpHD#F6%xMTue2us|F7CSdtxRTQWoW-iy`y`~A2C8uh#5G*IA}732mOqU^a&aB`*!Ua4R?5ml^% +x7NB9XQ3Y?ZPzjxQJJ%u~xF=n6*BKK}x`%aOpWe%el5PtpyQ` +Yqv8J3Lsy@){1=pH?~hlPdp$)p&_J&XT9zt?3R=93u6JvPwLMT(RY$89uvlzOr!h_fe91lXU)$_w@5C%8eP-Vk|w6 +b2k1hsmkuPWbhF9pK7UMnL~tjaF477PiN&mp2`EUd?xt%;CnN^@>${}GF>NBsa#B)STC4l~`4df3Q#u +C)UIR33K2c9Mx5hs|jl4`v3HJ+1CHJ%mD6Sc-)t%&n0+t#Y*?H>xw5$m!C~J)Q(icB#MC6z(6Xclg<4 +p9;+!^-QCZ?sNU+yf*59pgw5YsKA$F_0yp%2ldo5r?rW*L|Nvf4PSYVFDvL-~Yy3?yp*HRHLJ?R@Qy< +;vNFHsiUU9;ayIx#`oV^YO?E+hp(9N*y=(H+u%rJFWzloTOMA)u04P;1=>05dn&u(6ES8e1AO3t +2iPNzJi;D*^ilTMV~?>XpL~*!6<&DZ1wI~p<&{_XSmB-8r`aPIZ*0L>Vej6(?8uQLd~9&$lhf>zPd;I +1&YWQ$kB6N*caDAY^;djs@ZERcu^)f@k=@&@vgcqv_JdD58$W>YjTJlU<@#K7bW73E-Gh$qDHf@|$VR +F=*fjM3yIp;Y-K&1Uo>R}F|8DdNj}9>#GkQBZ+x1r?{51%litrf-KNsO|NBCbO{G$l}Ji;GD_||^zKj +W1Dj8p!vj#D%}?!9{T8bGioSM=U1dT@MvJiRa3%h;<|bgu!!`bTu`+z;if=fK#(gNF`|kBl%}6&_Fbp +$82e3cryN{o~`}<5-`8!(!w6hQvq0L+9}DetiZEj*SluiR~vXjKl>;MA&dBk{!u}?pn>u9>l++M^t(s!GN;&}S{;74aF2Mpjww$i}ZI9i1BmtRNAr#c@$ +$iv?~ame7-;#>wm}ZpIJO6e(A`6RR8|{NvQOZO28q(!NF)*_%oKI?w_6rKuf`|4QLYoSN;4Y-LPNipX +5s2BNcz+?|=XM+30s({pzc)KKt^^FF!}$^U3-1=g$J3{`T8%zrwuq%m*KQ@ZA3W``tR7E^geoaq%)u( +UJ~bp&&W@Bl4rXrjEJGkRd|`0g|jb|H81*bLY;Ta1DOId%ySId-q@-t?t~pQ~mt&&sFrN>bvj0OAA!$ +>C>lG%)eD~M;cW0vmYvo(txyneEj(F-|gD9Yvsg=6BC)pC%Q7ygNZ90#0%wXi2MlGuCUNmk-p@2@#4j +aEiEnIGinBZIsZK&@1v-LNkrq?Yp)$b{DCjd{~K?-p>E&4T?K#Ywr$%u-)GOBRX_XeGqtX+PCa()823 +kEFh(HzGYIqh=bn3R`PQvlmt)9gsi>%!YPZ|X>(;Hy#<-ezqw6ejJ$m#=tgf!UY1F7uB)e#{*&IuB|5 +5(`{`bGD7|Yx{Xwab1km0&7zW73|t*!OS`RLK3>ih4%&-q0DaNY^8udi26ojS$MlqT)Nn1@4@xo^Mz` +s)^yyB|PP`TqOw)o;G}=I`&k^Un59KmGJH;<`Zokj~$rzKsSC>nQ9$%0I?a6qolS{CkZPYnvAB1JB+MdG7su?dkhx_}{Z<&syZ;K$M9}O2h8myE*?M)0Iz4aF +VsBTbx5Ttygx5_KpO#EQ}0rnTk9d&rrKf-@gQmMl0W6g!Gj0+N4y_6aDdm96DLk^oYFvT0F^hYCzMCT+sj|7s_mqzPB@~fNe5Lm{& +iK2+oh@_YE^am8>;%pv#R=CQ`1|hD}8>Jb07Y9?AUQ{OiavZjN#Xzy`=o$X&`<{<|J2259I~%PB`WLM +<0E}Kf+1oByZxE$^oT?_$K*N9zT9gRn70JYU*)SO*yKn*B(;U!~;mfUR522Gz|Hhst$ZbRo8u>suwR_ +-1v|1kG9_X5&zn!<%RbBGxdb(0hO28AF1l(6RMi_4&+a1KptH4rmBuY8j9aj)uxN8ntx1H6LxsFCVmn +B&CShJme(dGCJsbdsH8L?AFfCX@j~T@cx*2nBzKZIoDyl6__q50+B?_isH! +ZF7t#!_S!TBz8LSv?QVb18r6c1joy*& +z|GV$L6ZJE#CK&9rI3n>R5{@5!_(9%$c9pCx9wN)9Cdd<05)Ba}{#)ekzlhw~Byt-V-gEU?WhU0@^B) +|2#wK01%hBgvI~|=?iyP^8fDQf1=kn{WyDnPoc^UL0C*e4dd*nJChsA=dBS#;W4mKpb%PAzas?Q4|D&E&{XbwX +^F}24)!rNVS6!TV^Lo@PPsHlww$`7;2_D^yeQF8U2M~XcoEWuZ})rlZJe +7TA#sS^%)FSpRq|jcbLokEu4Pz4F95WR?7r~o#8kl>4?R`*fy)5Y%1ACY&zcQA +}n4EKJf7(Dts#MS4dgN{w=`?}+wtxdXIF8R-W{=`s~ISm+y*9KlZ}PfB*jdFM}6$qOZ^mZ +P0G9VEeK6$<7$(ZWG6}aT|W)q?LIIvMe`I9#aezis50!@Sw`k?2JK%P +;63?C&qZ@i^%pL`mOvA7%<>6Xn?-?^XIo<2*=SLmY;t5Q9jwbT=tg_l-+at$_`hbH+l4Vjf-K0i{Vj~ +ql(E%vLMsJz%Vg}`sblKSAAyu@2kFFj^Dy_^}kE*yz|Z>IXOA6Kr8x)4wRIX7z|$dIulPgqEq2HR;2O +nzFT}p=H~xWsc%Ph{3?F2}h7Bh6B9>XOV1X1C7Peq$4@Y}EVPKOsmvlg%6+;9&)7JPc`?P +rR;=O7+xUN8c{9 +f}7e_@M0+ZdzD)#t^k3umH#=gyrMX{_@*OMkCky{;cWetgcjapS&FJ8Jk)TU#r4+;N8t8#YWHdE^m!; +)y3@>C&Z!9`bwW1p~eSKVfl@!+-&MiX7q#S!3VALGo4|^nWX_tSLMlV-z|u2KtOmT3&P;R*6<1s#8e1D$pab3TPB7RRj)j +R#*=u84Utcvwc0QP>{@IB!@Xs4(4wP+=O^^>>-74RnJb6(0-QoH}Wo4z5m6d(7WXTelGiT1p5hF%OR# +ukTcg-t}EP(;N04KD8BOD7g2>dW|kB>%Is7H`T@*FV|yaP*wq42-^h&?*n`VS|o?pEjK=6?LZ0}uQRo +%h^xkD2JS#c<`7SIYG1(+wZ+8Md}#aX>Hh+nO)A0Y~%!9YG($^&Ow>%{|DUeP>yJL${EBm8F{5vuD4J +o(>r@M2d@x4IjV&{Wsotqok#!ndjjF80-Xt&3nnkh_8`*=;VkDfz2yh#8kXrZONmTTyn|vn>TM>L=JH +-^dp;0WQlq+&p{V8=YoO)qrU?O4wS^iMCskTx8Vb?b51ypNU~*h!yb_%>;ZCxJ%)F-zM(YHZtH0O!qB +g{%dfxw`e@z5GW7ZR=btwi*dOYKsvibJdV0DH9Xiy=)|xeI4E^jid(QvRjUHfsc%Il4`61Ru56}U0g6 +m>~mG+ntC&&prz$Sa+A^zvO@Cbh3&lNA-4ci-*geaI5B&SQK4wA +=oO#d4%!X<-uzd6PX%&`4+4j+_hUb>b@(GM4)%8I)~&L9`En!AR)?A3wzYZUCLSX*wtt{Dv#xXJ& +VLW>E%bZ+qBn-|#y0Kogjro(ZO#W5?*|+7B3sx_uvpqPK3#W?^8O3@p+)t}$iMpUGMj(3hsD-BZT}A5 +@Em-wJvn%WEuxn|4+<>Mu4|l&ooSbTZ~e#SQtk1C_@4NO$Mofx$QH+!UV6#cUG@NdMc$zwJy3aEa~^3 +o^n2@{YA0IiKVZOj62D;okOTY?zLPyB=Vb5UgRSqv2OeYdv9;JS%_&S@LouIk+7124ZhLaxmb`my5wF +|21^Wy}WL@RxXN?h>l~?%He?8B%Gx++6icb<-&!mjUGx70oEIUn@Ta*yI1JGsZs?y;+TyvRNFaE}S@ah7`&=h%s3>(A{(`OaZ*e@|C;c +JZ|nD^l;%`3IffhUJSqrlS&G4{U3&R(FkkW7Ovl$;imKQ{(+XYV)}bo7>Kax&PVckyEby;VF^A!y?J= +I6XFM!SodV>qU`~Z-~6}wV|aw8o>H*UAlC+L36vQs?(>iXBu;!RD1im+NJ+dyY#-s=d~K!PSO~d&oEr +0Gg{+~V-r4g`ef8X>GKV6Yq@WKBl5?uL=yIy^}lRq{eM>*?$dHd=1UK3kCcVqsab$+8Z_n_L%=eR +IEQ~Hhcx#+J@6Q>sYrxPNLUw5e2+XFj2XU?4TrAwElLIbfA`2+qDyN)lyRujt-r|=s8Gwy9Z-7loaL% +)-nHvJuH^7Powv_3h2=Ab#6FHExeJ$Wwc5=XNqHs>L3@(%iCBR+Hbee}vUACFYJXf=+7$%9$nd+$T|J +rC>&{_E&p-zfPa?X)Kzm1wI{RL{mTbJdYv1fSXdyzb)CGJh9*M?5e@A +R%uTrp$DjGS4sW=-<;UZH`y346hyzD}#ji-Cx;p>O@g +2Q{j@PF^T1k>-LS42&d+PIZR>f-cQ=uMa&m%IMVaW|W_Zt=)t+-t4*PfWI8!GiRaD_5qXi{$&n=ir7G +_JHGC{!G(1q+dl{b)#F`UhVc5&?UT)NX%Yy<&_iN=Z=c26yJMfu)H6ExLdf)3=+% +`e4JB@`(KCKw|5$(F!iDKiKKW!Sy&>Xp=&*UUy>AdY*bD3tuQBM~2Jb(u6OrW6BWn@uKQVT3adFPPdG +oT_heeAP8M}ww#rI+Vkp=bxS!8W*&*{scC|K0f~1#KgoI;3z36nKEX~n3rQ>Vr25<$)*lmQBh% +P7dH1{&pERH_TEPJBitu5xTe1EEtRcyn?ldqnI}ebx86pAYD@R%?EK)aQI;<4mK6t?_dWVmtPmS +}rn3EuFpw`r+*(zys_8=Rpg5f!)StLg((?yBGO7)}t``UtV6GUQ<((YIAP*3=I<|OpvRtx=L=p{dPl} +t^3*j5br~7ti9mA#7&zv)%cuTp(DfCKkU!kxpOCRJ!c$uCGal2w +zc@}H8tRG&(^428qM|pX9#x`)Ts;w)+FZLST*yMu;53W1QwaxmhqqfG_|44M$82IU@pO#gtR+(Bcwvn +2X?J1t)+Gc&$vHllX0HO*JxUXrI<@-jE%QvD+4X*Qx8*#aGsC}sJNLg^_t4#z}2f)Z?3Ja{ +Z?(%muuIqeRSQrb*=19eSQ5gy~dQMo_fkWukZPd-|rt>U0uB^5C|B4S|0|VRj1$ao=-n*@7}%CS%1)L +G^zZZKo7}{k=LN+Aj3Xz?t@Cu_!(aj>es9WXTjKHXQ5bPUMf|ujC5kDlwWXRViKcTFJ?w9r*J5e6Sy{ZS$+R3@A=qi=;k`?1-&9L;j^hHaV~i_zI)%keXY)Alyt36>Za4z*`2<2rhQ +LWcV5KvoqSz=QBmE@w>|NVYn}Lo67z`fTf0DCbG|u%Z(Hl^<5x;}#CNUz#upRgSSP+|t&984DDypQ|K +Pqe%6!XOS6^&;ett&wn5-F5McG+7`Ek(&c{%;_$4<=1PS5X^ojEpdO8%7b(|V1alHET&Kf8C~HPKPo= +{cF>GxF_kUB*RU(>o?Q{-6FaDk^qbUO~S3Rm=`v?ONwNJu^RJY(ZY;v>EPWeI_qsYJskjF)k%9voJF& +V?suL%ZuKZZz|GL`3cUU8HE{HQCa+ri%!oUoKrYuaz2Ul`~f=o#o6NDib0CI*TE^8=NE^?~hy1A#*UzSyx*uMt%pQ(axRzOJEed)=P819gpchw +7T@n(LzKWAw~KJvT+q9J>`$8jJNR)q0%fQDw^tvk?p_m9)3+wECb=f +1Caq?4?L@Oz&9%qPeqHGA=I`#0^7r)j^(Xq1{VD!5|7f#|i~W`UwxX9`$FJl6fBY{{O9KQH0000803{ +TdPQKvO&$A@}0LYsF02}}S0B~t=FJE?LZe(wAFJx(RbZlv2FL!8VWo#~RdF?&@bKAJFzx%J?otq(*NW +3JMUOS%p`kchM^J`*z>?GILaT!X2Y{nAFAt@_L+yDLT2LJ*jNXfptzP@?o+{F?FEP%ygv0qs1dZULUZ +<0-u^lHyrRy@XznO_emPBz4Q1}l7~?2butlYDW+bPdDXS> +PS@3SmU`#etXjo|@LpxhbQ)I)yn_#-@M35$t%_v4tTOm^RS2;VX@#)Ph45YnrDYY*=VFR&(u~*bEkqS#c~$m}{66&F9KJnx +dGPiidUf>r@c7`(;n4f($HT+dQR@c@3X!A01lZS;9OfUWYlx%(F~~{{BqFK!o)1rvm8&KE{) +4G2HRm&jf#&MtP9|z-m48u0$2l%Ls=#gei)rk@$=)mqVJ3X;KViw|GVhW33hNKx+RT +03n4n03#=W9(7Njl5?!5-Gmi}-30?|Eqkc!S>wB}Z>gqtmm)S4V$_mi#>Tcf=eZ0;DjX$JGo*6~Zh70 +#-?N9r&N(+jx6;pVkg|-ah;?nJ50XP!j4@DfS${P2jhk_lIZE`MX#AO4D{o(@7tr+qejP11)Jb%_@I@ +$V;=zs{!nJot?5;@gI~AO5b}xBQueGvG??H=kza7m=L=5y+=mP9q2v(WDLV9uyb(s;z#)1W>hp5g}`7 +C76QIZMBtBnnDNLr-h}cEKze@Ei;wdYD8Wd;qR5WnuQlD1ocR3+rkrrVAhDEgPZt@|Yz&O4nu?hh!Fo +(?MHG*dKmx%h$2I`e1=blF2)NWmm~1-we!7lc9zK8fgKxmpaKkvyMLG@qDRgHma6cWr{V_WI%bSDOuT +Ng|!(40&6T0~B_~^yS%fsmW=&y(V015wDALyk4x)8AYrJnDHpRyzksNleu0}HPb+jH~n&W_@v(b*wXC +JhvSK7{;X@K8b+ +C-{^65*PS|3t@>5;p%$+n;mEzS!;Oo!|}=4;fsUwL+>B>9cbYB$@w7=E_E8do*$hY|8kw*rseY=51$_ +#|Ili5T=*Z#hr3^0{Ov>WA-#ME6Qzp2gl+5SwX4S80;&^yeet)iFCTsVj}PaM27?dfqab`Z_>BSK^e= +CJJUNEyV}JK6UQK@E$DgcUS3a@*tPD$$6FdFJXS%Aghy)GXTjIrd8hhEEml;daT|lp920284fQ_BWJT +6P`4aj(~l?K`PlbBQkV{HS+OR6XeN->`qiw3`jurH$c2748>4$b}jpZ4z{q{!DAUOb%=sG)}&I&OqR4 +`dM#K!LlKy$xKb8kYdGuG4NZT;?bf1_s=^1BF-syKnTtXt%C}jJ4H?FwgQpSJSnCXL~n8@77CF1A@&6 +U^;K`ciqpumc)YVTmO7={_1)7vv<*=0 +||KcC(uFkW#qpLmrgDsY;boQ_=aiMBn_H@~70QdiX#20Y_LhljDc_hIBr%vPXT%b~fxUXlG=9&cqJuY +{bfp9`X#&iv(l1WfcSv|>mEG{5n6d?dnfQrYC)6CZP-HW}}G?}-Bms?9u}+@ +OMljZ%e+$Cq8R9$jbI4U|(Hq~<9<;exR_%GY0iO@Cid0YL3|narmomL#lccqDmKRn$yG=>?~Ur{1%tz +Z--a1bv|OsH8pUK=4G58TGj624@ZUW_cYy{q1*tO`jG^BmGAp@@NIY%p_Oo{wvTu;WGeFW^4Xt(5@N< +K1Tp50i^(_Cr)_~=|p(T5@dc*l!IINZ9346giatt4cIVFGW==$aGfpZ(}+6*CHR9~hVXbx3I}YR)=&A +G-(Qf#dTIX%LIg=@DU983{#Hz`>Bl%-H-7^qiB{G=?oc2VO;*#ul9|+iy`&_jVN)BykO2JYa1qeo@Npq`;p|Z;ESiInc2$L%p|kbeDOV1e|PBff*dvhzq+0RrxPvI5OlgMr>0aHre@ +ey{XB)GOj6~wl`elpg$(rvh+}y0REVQj_3r2`lpFIn{Z6NKSDc%Rknu@x;G4kb-)1Yr1f0XIAlEAMc| +!LfbrTW0Wa$!yPjlG-pE5Ugco^n33%GX`f6G;Nv~}yY3bMx$`P7#M(RJ*Q*o^Zn$m{~_)sIqX;O4Qgr +gziX6W%yI|xX82JTZf$p@FWvEXa8Y2Ilu-PZV2#iYa{q@Z;6po*_r?W0V~ldt4t`exG%7Q)F_Mc{Lrj +Zq;a09^{cxVhar5wK30n3LUZSZ;OimDSmW!3Nvh9*bmR7*=jn(c#HQT7Xefa~PT%tk1S!rC4$7Y7=v>|cT}Gn*BzZlSPU=E5i +8dnC=-CR1$b6o^Pe0244?XqQcjL#eQGuUA +SUq=iqtNzavK@ZUnFHoj@daV$pV#JX*s}cif0qZW6)yfO_PdaDYNqW#bkm13NCgh`t)gCHTl}z2$P7h +lVi5XQ~GvM#BF+c1CuBvqDcUjB?lXJ9vs&%y6fDL%Ui~}P29bMkYG>~7;RKui*cM@Nh-qH#-LE=s;%T +w<)SjCRN7Fn1X)`aA$mFNDUoe)Gf_ONM4{S8Cm8NIdr<3=3tYg*J)6t!dZ#cBQQV@9Weq~Y)e_?kKwd +;xBuyu1d&*(ZqG&Gsv9B!ZB$9B$;XGTRv8v4rWPyk)8JLh(`Ykq<4Io4eIK?Yvz#T>>)j(8dg~)dB`e{9JAe{j!X(k3LzR>gR%diXlQNoS+hjyw=e@>{@^`E4 +IVyy4|N*iyHDLh(QKo;okm69h1-TR=@D08Ot%;tzO(iZ +G>RJQeOOyb9lnFwg6g#2nFdzkM*4*=){=0r2<=VK846{P(Kbd$>iLx0{6WP*C&IDWciD1`kPL$C#q+D +I09LzD_8CWenzwQqe6-Ky31=KH;-;BSM>Vpi7!44TyC<~zr5D*l|uLEGEi}*%R1XsQ$A+-cdCC1v!QIMAaz7g_ +x58s@>$E*`)Gx2k2r%F~@h5!A66|MyTU?%vNY4BqTU=(IQ(ROP4^~Yl`cI{3lxl@c+P#+EU^cxA-BTY +)s+{YNP0B$BvXv{>PQ}Th5_$J7kt}L4{a75hLkRS}?q$ujM1gRRW{@LM+le3q`@}cfoD@3o +2T+O0km2y&cQ({$(*w!qKcWV&&z#u2G8AV@U%{SfKU1ZcH{;gou$S}b0uScgK7QA|W@b>VfQz+b)MDX +F5G~h<#yf|;`Z(k&`1Npl>bYs{UNEcs~(xGPg>6%-O!)(eG*igzIKo +r|@F-c|#uyok~T344P3xxHL*ldko456E%NVrH+bjP8f$QJ$?eWr#wt*!{mz5CHGbyx$THW}ZDwPLp%Q +W+T07dQsl^T5Y&0;qt@5#zn^<6tl_eXQuLl@RyqLJbFZ86hBCurqW}Hbe$7i(w~;wD*sr(k`8aq!;ku +`BBI3(i4brYrQ`Ax=U5D+|;9nKhn{mrd!h0C+VHEnSyEqXA0R81_r_#z_`_m1}ouK>pJk=s9~A7P5*& +W0bZCjYCEu`5#AMu5H5Ivjh^3AeJ45FP~YLJQ*+-+&3AJ>-s$vjyWXp$Ansi)XRwi8Cur_1b(jV4h>; +8-s8=IJ$N)h@fxxFu0{LH)Hece$asu*FRW<|jFlYv9NzfgP4a3osbZJ}Qq)DBTO_*-Lt!?Ij6*if>&D +lkkRk&pp<*?>RP^P}*Wqe-~HVcTsJ)+=Q|IjT>hae$3U)!~qs_U>a&InfK@!N)Ignu +)--@~`*f#8nq8${mOO#aJBp?x0R4&a{&SjlI$7ywnbh*Ie1_B-IWe2@YQ*)6{J1p;LE=WxZuGwr49UB +;Stp2XHs3zbCJAIL~{pjj(8`9&l6!Nf)l&|Z)B1kc*vSJO2I0#puN)Ksq&hRLZzheR0$mMp?$BhO%FI +!e#Dn3_UxlAewt(yy+R@kp6ntWU)7>#$}gf(^ny-<-%>G>KE+<{@|?to8A+0fj!RkY|;ixszR*K_m7! +c-m@MX;jvT!h|1SprGYiL9~kWw5h%3ipjtT7R;Y%Fg*hT&HTc4U{$n +7(O~ae|zxy_2C(QIsftC?2ukd1AiOw-CJ5san5aRD>cnsbF-p`Ps>?)VL`IppL^beY4~7Dl9(NEh^7< +LKh3uTJ7U29L8N?+X^$os7_0REnCH3dDrZ20qoZ +95mONV_4K>R9)O4rMr{4XXo1fa~&?w6Q?OqPaJs+)0baM{ccg1-lDMxV!*DvBZ +8Ytgs$6X;kU_q-tpHI3V|@7VW`$mb&Olp^4_5X8d04e!7zn*1kS!68_wghAf#vt{BP^bJD60Gr#RCql +MIIY_6M&8p-$N-fHB^Ve5tqF*GV~jxN{Ud>`gv}&~4(KKseAsx7Z-ug)8*mI90tH4WfDs +nGx1iMzNg$&hNJGXq(m)~i9~h^hbjtIiLp^k<^8vB3=+Ev5`neWBGW#W +YITc~3`{&3?l;~0_e0BzjpwyyzFJo@OjzkNCYJk(^RT@HpPQqPbVypV^gpN7ACG +zfQ$853%?++z3vPxc-K(C>Y8p1%EPM46|6@0zwhe$3=dx@L_Gd`Q?6Jl|V68vghZ<@=8xZIf872Ndh5 +SfUtAD>jthYerAY4Swcz%q9_jX>13oYmIX1H3$_PZeP#R#5J#t>U|_ogZyQ<;lGugMh8)Bip6L}G8sF +xwbyQh)Y{>tzh+}SZNRTv-XbP$qrJQU>8g)(g$WkS$y>tg?!;JU!7`qjQmP$h +oLi_?JsdLOi_4Xs`ccA72gVK$^#pSD0)*Gs*{ztbzp{a +4zzL;de{o3_k(8L3l1zi{`vy+Pvrkwj>_LfdRAi2{Uz$FDd{$X;!z)RpBncNcQ~cbpjRGD-~On?C+P*j6Ti_sUZxY6QIb97;X0T$(<;gJq?q(tmNx|SB@1F@1#8Eu#KK6KEsKee`=%U=qZoHv7H +b9VI-_zCm0w6Gg_R4O0zZS%4{~PxlE5w$TEOcvGq|Sr&yzD-a6#`!qw9Pe~I4IiI +{R6UGN<2Cm2Nlza+N{KaweOX$`F#By8#(b=uR`p|3C^|mUOgG->sfmVl5KB9BW$4+#HIC8C+Avo%!v1 +b`O_v1n^Ck=*Ica*zy5>x4R1_1T*MpJcB~W|&P)i0~#&Ue@I1vSYkDMwwuE__um2V&>e0o<{Qbuxz+V +=uyw`=L5-@itW@*lbw0{aoWG3abvW2zfb5kmWWgKhFLzsux~ZgTLbz692(Tn)ciKMX?sbb2N}u&YN4Sfy-r3(E(}FsJx5*c%ao*)h{9FGIzTX< +4b><%&bc;0Z>*rjM39F-;6%HPxc>&BLGebhk(BT-#DwNv7ByL9zTOmR(RpUge9)7-uT}@DJCV +wkq$ucTjMQP=+jpA>Hxo#6AwtLdE6I>_O%I!KflC*~*(>x8Epx&@U}VG?VKe3|PUhuioa}nzC1svOuL +aH^sIu2_UXrPX*Z}B9?O=%JBX@S`2?+e>uI`Abf9FX8Xizf;&T_-Xh3wE}r|q~2vwzr;Qd{ov-=Gf{a!8=)M<6;)mK8e2FsGBy +sW-|k_BhI!G&QTV>KO8?8_Qk7C_67u8bvj}LrX>Dxl7T%17m%LePQPXM~oJe2tBTm?+j +T6qQ2Mjy%(sWy3*790tk2$}Slow@+>^@*onQ@B$HDh3YhF2P_Z^Vs9?4;>nsV`{+l`Fd30t_QXo2CTD +Vsfx1H-2*jshq~?5Slux5!=vv(Wjg_tFvJl}@pat5EaP)FqhsJIPh +^Hvbf<}N&fKFHV~31Mph(~H|s$d-{4}!Ea*h +edBuv;+Ub}o+hl!-&K779_vChnmz`#Sh*!zdi`bv=g78?MX)+n9+Ebp6Fv`;az^!X^a&%54b2ZeHUZ! +ajrCuKH%de-jC8O>p?gm?hlfNiNxAkL%|B-o&-h;`VsP=jY&>I?;#kp&H!wuU2 +7#J&mpHzw_z^^O0hJs7mDW+kZpiQqhryY)mmRxK3XmPLAK%#$7K^G7LfMdvW6u%o4r???P| +BcYZlJ4qHjd|f1&Mx%J2YMT;XGN)>TOElAm~S?sN&3vZ?j~|k-V^>V-)GxqI9#;IWzlmfz5Kxl$~hpAY)BAEO1`0k&;*b!k|rKVSqeegLS8JkVt~=sSFB^9 +y+?DM6gVW4|eZoatR%2_91P5PsdF3pI8PsNdIv?VC?ow;$^;I9W~&Zs={IU3}zq0_v<4lQK=0U1wuTM +=PCUM`F9AjQIYuWIXRp&iqm)1R=Y;I!u&s9%imBkNV&NiDgO#bJ+1r1L>k;C6_KnZ# +f}{+LSp)LMYcBx>U!Uab>mI38yXrW!H>wZVOyL8%7T!L8S$CKkk*BnH{#utHIQC_grhMyt+R7(L;j-j +Euu$3HEsGM<(Xn>{)7D_E_S6B+STqW8%hu=6Eb4SS`2l`suj)D6&?#ts5f?W+VU&(u)%@B0(P)>KrnF +Dd+YU46O+4oVf---GZ(Mt$D?0B_;hA>`#%nd@-A!lFDCSS$!@1U~$=XBYBPM7@)PM7U^Z%J#N +D?<>!V}9`6VUY1l~El*&Cb6ka^@Nj~~y;;rI!NNZL#CXWPaU{>x9nc;wwR&m;l38Ez~>a_8Dq&44&wV +kO#rZO2Z2a>KGx|k43a|{t@dl{G6d|5H;V8Z~HHU*xdF*^PN9HY#$bV^qP%A_&aTq1PV4oa{^1FmH-H +E@gqECfYENdH+AgDQDQ=}}-CB>)-X0nA#u6f4~%Ur>c|t$KwQT>!m^I=C|AoFX9FTxV0tlToVz((Z(f +Lj9y@_eE!FiRn;jR^U7+|JjgcO@ph9Io8QSQcA}`sYcjU7*OnUR+gacuO&4ai^-U7XqCh3`Diicdc|< +cj~^Aaa&`o6)STl*#M)?Sa2NYXvC@YRtZ{Bu~JqfSLjBnYoK3C( +MwAu_=+K~txEigfnb|Kr$s1_b&+Q3$jC}+e4Uh<99Vz$y3@M +&lL#ICfNVco*%pMDq}9ltuETv@Ui7sy_4av-WeJ8P&tZhh+wR@f)2uTsn!vM}daQ8^T_q>Xr^XLhMFgnnJPq!SZZ;wZvq-33h +@@^^DW8yvXp6r=-_I3ID@dDe?lS>S#e6mG{RoJI;aVB^1lh>Etfrw?QQhf2Q)ADWHSRm)8!w_zpYhG| +P8+RVoN=hd=<_Vtkqa;Poo;@CH+WUP)&JQpm5VO8=|&pgXy+?`&dG71`VlTRS>H`K|^IlW-VIwz +sV)oFNZ(hkpMjCqqZajjH?RwB9od!uEBPX +`-2) +&odNIQQ={gWs3PRh0JU#?|Z1l^A-SUWr-|-=#F@hy=;IY4I^m2ghkUte8+0v^$w;}46c^juYGYXj1Fx +~cwak@yW^yNL+*19w>_F&?7h)#g@B-n{|Wu;DeK| +Re29B6w~YemHlwX1cdBG(+TXOVHWb|TwWNk{%$i&1wbmbC!X327y+Hdfnu70A#}Jkm>E7u`VH4Jnm7# +RPYDP@k(K5+b^7SrUyhf}L@lc7|n@RJJdo!GfeSjDn){{_re1fA{Lu(VtlnTEw3+l>h4Y%D;i)(;`VT +y6w3@{uCHNopg}<0`#Sk_hcylF)!!Ud1qDXXsPjBP=g#(O3(+FD(4D}(6}y(R5@ZKLo}8~*o$P5lbw{ +`+voN03UqpHrf2c-x|XKB9NSUdQdMdf*wX=wYM?u0-a-aV96Uclvn$^@Q-h_Fb+7`IG9V}nr1cSGGg6 +Za!o+g&w)*-U91;4>=WzwdSkS@OX7 +l6^s!Q7It0HYtfT#m6FstNT+CO8Tcu)wZb+w90K@PItx4-|6E;`C5F6V{>q!Brbn{s|L^x*CLZD*qIB1VGJsnnFXE|JFfJaWXzcqTH&c5cSJ>@+iQmzlF-DS22fANYgJ3J{tmiPGH2$A?`HXv~V*f8rLX4G8#I^ +*~Awf}33+=AONX0A{2L@6qD|LD%n&Wn>brw4D3p1(ef-X8pL&PPgZsRV_UdGqxSi!gQ+rgTH-YyBirb +fPV7E|CQ(5XHRfkaUxMe$RylJXtYab>bzJkN!H#Fr&9pa(t);-S_gzJNX)e)|1@69mBpDBcWI>eF>tx +K#mqVuWf#fU)1V1-oiK6gt`LW>&tlTK<57eP)h>@6aWAK2mmD%m`)?_XZ*te000sJ001cf003}la4%n +WWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y-E^v7zkHJm@F$_fS`HE4_5CpyP2R$J12Pm6(yN0 +Y&#SYc}Jubb?j69>~7~@B;vyr0oD^tZf`i{@Twk|k9ElbU#qVY2FVA3b7eSpPiNN$))=+cf9!dWW+a- +E)*mQ{Vz%UGur<1X$7d3k!qg8G)emRx?WeOTIAO9IZmDwS%OnlA)aSVwNRd?WOm6nf@}gG#1N7yaiYac~8Wy_KJIwl^N+HG={s2%*0|XQR000O8B@~!WuZk~a&H(@b +%L4!aB>(^baA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4gbb7L-Wd3{sCZrd;nz3VH81cjX~F}9w +D0y(Tf1_T(=p-E4}AjmSEXj3FZqPO_(C)rW!rr2~5P4YcGKFL#9yjy^@l`@ArXsKR&iWxR#Q&`!ibLw +y;$X7GC{qXS?_D6(o9UZNKovrDQa0p*)Ybrs?nj(O9i12l@T5osjg3biORIqy3?jJYzPy2_*T}*~PHk +nNBh5Xf6M;>bHK$%MYR#huBNG-fa-(&06$jI%BfM86WA_A;Wk?%ZXoC~cvhb4T^q>xACwX-MgZR;dva +|lVTMXCF^_GrSunEhakk?ZalgcSi0IN`$khKAu;VneX$>ucw%8;}*&Z@crRD5i?eu<_bJ1OggvXgd>&xe9~%-gPm#4Rf3IX88W#oe~#2%q$sb +9Ct+k?pFiVgugtty9AsHvq_3pxGm%qeOL%2s>dWJ-CdeP1uIlm0sbLOfN9ad=Bc-Y7#c%yD7EkW~9K} +Uhcx}Z2DW*e6cq*A&L?|O+c8j?+FqTviP56kr4{`aeAKW2uK +)(LQkKG-CuySl2n-d#PX=J7X=&8k}G<@TBB+Rfwtz+X;IPfpE?YJaHn?R9IC7c+DAS!e37l!+X> +FUTt5+5mxiPR%1;5s2XWI<0&kT_C=WGSw0JD>me7CRa)>MstY7YKmo3$sKy4u0xbf2}?Mjm9#2EXdKO +}We3mHWD?io!C2`jf5evSLuF0%@}vi9I=K>%+4X1Ap>h`Q?nhE`I;lv&H+5Z{NOo_u=LD=G=U!J9}b3 +uk5}xuW9Vdx~}SH_3@3Nx(T5QTT%;@a+3Lox5de-J^`-_(^oHRx`XQhu-6XCnu{SYZ^oJCojuSd0mw|Tk?+1cuV&%LI?JFd29}7+`BAq?AqL3+YG{# +#DP-lbJDzO}D8UiWyAGSD=Fp!73|I&~A@{2Jm2TW*SC=Y>3Rw3`iY3-{*TfBZU{zbbB9&Y6e*Bc4(GX +RadNO^`$iyz;v*F0QsHG*1rmJDb~-LRaOez8h}JFaX0IOz$GOE{v1QKmf-;>Z*#C-XdRuUrKv~|3j}V +2%*(+5Z?e2-2m`P6Kf?Z0w+$hon*IZDH_-ENh|~48-IzeflTA~v=4P{Q+PNugxoxk{pMLwz(O$Wqr?11eW1;#}rtsxYQAzrJI?{?)ea> +QY@&I$YO{mOXm&KG>li6mb%a=<}iwXSpx37EMO;%&e~M>V_OPu4HgcR4JxHpeP9`7?Ry8YpnZ0JS8GG +o0;?T2#0%TAvLpEEJ1z#!e+mSg+)Xo5QO}W{UI_?eZ<^Nt{yd4q!|1G0u0m}BA(omd1O3{8S@U=vnfq +pnhSk&dB+wuEr=lyi|#Dhln>jnQ-k)^>?)Xz5?=t#6{spoto;m%8;vIO?7+e%_km$B_2YGh!A#Y)vhS +e{&m8g!b_{t4y9heS>ZUS@qh)TuQS2$r?A;|Z6)8TRW!j#d)5&UmowE$2`W6f{QIo(M8lw+#sMdnVciX8DmpG;PJ5($)tS;`8EY1!H~ZC-M`vC9q^$7D +W>lYxPbsI|`<7?i{od94ygBmP$9qSN}z65Iva3U(|fp-%T4;ZU1B)o1sT-BTAN{qesV^|3i%>U%MN@{ +NA-jCdtkHn=~aA7WD^slzZ6MO<0oWE6R?p-trzq=rka;Nh6DAJ+32+uP)`@b`KkTf+H##pvY!G{FeRa9 +a|JN-x-OwnW7{NxGYbQ!J|SK-iMhIIU``IZA}?>6a|+nzg4#I-*mD}c(4xpW3HCfzcv)thm0JL_UBuv +mJOa|0x`A8-f(r`4vtAkIh`{?nyAEU*4OmuSh<)JDgrmjR8?k^eB?0GBtzfk|WoM{ALb~?mc19(hmanu7Ig)x_xSjTN}TW==q{^pi% +V^IJ8q>r^SD{8c9|xvC{ZQpi_MIo2cA68{`qfpcK7( +Dtm?FjKox()wRbz~Jl!sGooCTzSvzzEzQG=Ybz3$ey#KuKUraEtQBOM +WW^0Ov(HSY+9D*A_MxOC%^gj@vzO%{7*0TybdW^lD_sBa?Y#;~A +M?Gu+Mv*`@WaNT(WK`02Xu59n5MZzDzpWN#M~@9EVr{PZ6Yr%;@q{$SAG+bytV@ +>8t1$tJhc8;$Vm=N8KBb>CwAmTs1+hO<@!SrFE27tZTufOQn)}5Lk0|E!d7*eOM^p$lAM%u&PHlv6>g +afBwZ6IVOhRY&YR^Y=raVCyxu$W?asURK#kP?c0mxBQWDo2x>r9iE02SOWEH@ +!%3$#f01s9K#IGqY#(WO*n3y5C#-!u5SbiocE1%&>swbv_2WV0RJizai6^-XKYYU2Rk7YHlH!)mfE_k +E4x*QDE#gBaFZONQWdFc&>&f*L~0s=7K*RVeYSCeV5WI5{eO@gY#i5n9MqOica1D<^0K{q}pgX%ooelQ +sEZ<$Qf*u!nibWSTu>?2K5r_b|Co%HM%G1PFmRx$E!aa4A;yCiahk>_<5jgE)Bv`s)!#RwV_mj(Ou?{ +u|bN_fC*f7TXXvK+i(AKxV##MWb%Sf3sJsAH{=vF%ws2GMkT0@3bir*bCJJzXJdQLEf->tEhI;Q7MSa +*y3u&PR}hIpOo`wkZjOYX#LkcocxI0h;#A`}5qE@)o31FvLONezx+A8O0yrYUM>_&+rZw=sml+ZgfO! +&1m^)?p{`I?L<_+uIpDymFkx66{6>@2n0rD@6|z{F#{-t0c5E3CcT;) +dcxsZrrtdDC>Z;i6r>gUA6x5MFv)R80fVkY7DV4_q%6dz9birI;!w*&dc6 +L?sURkE;Tr0jF}a1v@5loqpd_oS%La|Zo-}#t|gNEgiSN5Gt?wkuTro=4Q3mWe+c>!0Pb(S1j54*0Jb +~b0{}4?0U#c0O^4xG-7<)PQtWZu=IbP=gpg~JO0a=vbFRJPm%8fq6oREeO5j>cC7d@dw(E!Yf(5j9dG+oFSF#YuyTex}mpT`!0_y5TjY +QqINT0+W`plw`m6iFW`;KP^-pfu-`?U#H%nHz8}%c`;GPe6_8!=mm=_&6{tpog~*Jj!t@$(ejEs_oYH +D+(__m#K=7?7@fSOFAs&h3$HVjolndQI!kRGk+Y|m21mYf~jIX74J7y7*h^bz)3L`CSkWt#{sjsnJnS +gvk4{qh?veN8m8par$oavI{bbY52fu+2ut`r(w8*`?~rB!Pi>OfFw +roa0x0w3r|qOvzV^kcdh4^4&xTEsoUSF`7Llgg>gW#WB9)4v}*te+5YX!!TO63_PP0airX`N2HgHKowG=r>GT&Gu0t1qLo^offFY_Cao2v(Ulgx)F +{M49UIHlics6wd!*!xjDGif6g!+)=)`celn6|Amh$iVM%W`yv*$5rJxszmnKBibJkU{m)J-}Zfxel@G +m-zmY6`eK!F0(ZxTkxH5^qN2$7NX33>;!%?qQ>$!@#X7h=I1BBOj4egC@AgQ)CPRX_?^sw$W2k=Q1(I +^QZR!K$Q(9%7J&h64gxv&MzK=3$jt5h$k|5#CXQ{{3XR)N{Nv{-CAgCnS|`-kM|fc%gc*V)$IcdU(8% +V_+@i@MN)9|_z-)|99)M?vRbN=g9frNGKpKTc?vxQz*IVo_=o_GGE +ruvybAm~{!~Q8n>T^oJp?w>)*XS}Y2gV;?mI^r6v@wE1CgEQdb22{R@hMbuqXC^F*<%UFfjW0@{aNr% +t^ELI`RINo1o4^&inb`Yd|(eV5}hZvwFrWp~0xVNb9@lJ$;^4nO=I=a+B7!w2d)MZL6tEh-MfJV@?k=Z +{&4D2Qw$v%~Wf-;5&&kDvV<3-9pKr>~OV2a;KZ@{%i20?MubA9`Q|1l~LKc*}%bRO(AnmP%Fm*ze1gs +i^SgeETj`34;kXkpIkUK#F=rqEvCqB=XB+%X9nSkCA~$$!PIWE4jR)2YF` +(-gSb^vN^Wd-^@T&&|8j*}T^R>1r +~Tr#fOstoZEYL3@jef3A#4|C;Zy_alixPHyj5-Twsv#JL0b`t9QTm#_Zx9P*g}Bm9$74L;`(t!U;h-= +dydki6ThxN(~?QUnZ7@7&z+o*=4odQHTOW>h1KYpseB>E^HnN*L;km}JIB&UkxVmOFwB+n-+@0e_$P^ +#3Ap3WR4ewiaSD7InqGYVrKti$A>n%ge>9H}C%Z{KI?9Te-Bb{esERGm}I$n7O$~!d#7W+}Y)v3l~!? +I%M@@@)5JSR6QOBi4$1@#UICDF(h*jEb^Y0bo1F)XWS2!9H_#?@CpNAJhG3Mk +CrTJdX8{-Lw8Y4H;ld;08w$}!IUObw#%fF6+F9^Hu5=Ol2)eHDgL|Q`JRga)wB$2)-+pOw*?_1T>z3S +rUz!M&-cbG5EE@w{T{mRk_Pmrh?HLrY +V-P>CI8Z$3yd((7mtvV@hadq-!MRN(Ea-Py^{Sv>Apk4m)VNi??lK|%?3>?ES>&w6i~Z_(xoKvd#t`9 +BXKV&`pOI>jBK6D>W2t|(~*osL{2{ZTa=b?fBY~d`S`=z=P&;F4`n0^dI67ePzw1;NW)n06T}8M9WRk +&^q#iHr8pA7m%>{R2BrN}T3s>Ff&Hkl5H9y^bSyRLdqCVgK(}@UFEIst60q>-q7nMVscpo)W9*8o5Ux +P?`FJ;a*G`7(UBE}wOBTogh%^S|L6<-r`S!*PAoqHIxl(?&hC-s7~PwGDmu3kd~XVH!77(dOue<5$DcsQizWpX9SCl1uj?9xWPBSNpC*i)y7^*w@4QX=$az@&#wdU3T%HQ{!Ye +(=_2(tT>{S~aSm0}KSz|E)ztW*sD3@2k@T*9o{*eaj65DiD1%Bw+S6R>Z(D!P{M- +!ycKvILo@%b95^Irgp}V^f1*(9}Hr9le*!Ow)9#*UHAOcFXkMV^7hvA<*&MEIMHejfFI0Jl0>af8(WYaj$WsYNe&+&{LUtUmGXG;CL@Dcupe6F`sa^!dP1k;^5GO*(i9(djeVD +NJQ=GfUIO}yjivFCTglgA702R?%9y&1;w1IGn6MD>D*o}c*oM9=46qv;-2ZnRh1*(Nt_?D`Pr*W?p|@ +BWHG{BrDZos~j7)7mSIPrF#w{^X{@@VN +u9$(6FpJh=o5MDR0M2)MbWjJhG)BOI>B3xOZ&ASY6GS_*fF-B`h7JcsZ#L`YYKKv&tE +dWOafLVowf%4_ZIb88oHZ=fI%j=EU9^%yO@(@_kE|#QhTK#|}#`*q=Gn+DIiOr}11Ca0ctqW(`D>d^r +7L9Ga*A{-`Z^?MYTepeu%?ze!PRwEF0Psd6!d1;y<}`E*bXsZ8lFIshN5#CX#mD|P|rLaqvoMm0Gp_Q +peB6MkX*#d4KbhPwl`YPbp+`x6}6ufa7zk&jW;+~8o%8E#7UC9+n=u90E5H5@@%`<(2xtiu;@EW;t^< +or#Qh4BNRIc))nubU|XMh~A#6F-{_xFy`hHo>EfizIb9Kk<3qUUzit*sS-!jj7_rneGAMp&y~0$+Uhh@4JL|NmpB+3X0XM&!(!b}w +L=YLbxERXU6bGzRLTS0><+YsxHy$e5bY`{NyqQ`a)sB!Y|)i(WMb6j@x$Be>KLT|Xa4p?$>ZF-A~8?l +QHu3{GgIiRMY9J|=PD%XwtAI*0}llT&*PX76SlY8D|?glF#8Mn`-9j5Hj{ufY70|XQR000O8B@~!W@~ +Phu=^g+8RA~SJDgXcgaA|NaUv_0~WN&gWWNCABY-wUIUt(cnYjAIJbT4yxb7OCAW@%?GaCzN5{de0ol +E3?}z)Hy@l}L2rxW1fQx6iSi*4HHVv)nX$wpXDj$YM;9T7vY)_IiK&%?tn%AVJ&NcJGJPdu=2V7z}{< +o&nrvqh}))WwSWF+-7AlAHBvWYyGu8+sjsWd3?Djn7=n*8!ujNu+s%+$9KgdOW8P^7dK(f+1sp4XJHX +%X#kzZoU?a_dj}uJ2SIULurQsmy`vAOCx>r-IXyZV<3nh-*6a0lqlgQ^icEp@1R#>me67guw$~VZD$s}kG!r~u1wp|Ja|txYCjl1wIShn-O`?~)f2*=Dks%;SWo;gWm9*30WKcRv;8<7Ifo5 +r`8K&aL@-f{jG;sr?`c3tV#R8STyFn&$%c!F(g41z&O-EX}@}B|N==m6-84n}~4ECwkp|{NF&XX0-+Q +$$3%cDYM(rTeTTSV`C$X9<-Z4A#>dOfZy_{EW&BRWy8tw$zd42Zcf-Qg|rktlNT7>B(pAjc0-id{RRi*?3SOBJx$NU<;1B)RdY?W +u1dAMYVpmP!pq+w35E78r&2ZV7U-~sk!J3FkG7Cl0sw~D4^oXmQ_TsFY7(d+GtAjxic?ho9n)*g@+@k +kK_LcUUs5%e!hy%&#zr5y?pVf*zz8d#Xi@ZrO#Mo-C`@{Tnp@;NY4lj2swCmy$fy +@3$fF3P``>zn=bd^kMSmm&14aumr6MK$B>GiHkCW*Qysu3Z9BG=ha(1*UKcE0$Wti*VKH{tf(K>D3bU +Of}D%2%t6s;sXdR=8OUedY#K&a_#A{`bQNB5+$|DmlSz<^RT3Az7kESVasW(S^_oa1&{%%)n_vcYQ$P +(D8Uf430siBAAV;K}44{QqcL)XOkD}@~WOhpsgs{cJtJ>ehpx<=sAQTf(z)CFr0qP`S@7ZL$_tU}qgK +>asHDCE+U{Z#)XLd&mgyznI$=o6<=QqDMb|4rl(ko)iJh +w9njkuXqWnQ%a8e&JCu4F&&wJpeG)K4@wqngs$>AmNFryMvSP#?32Eh~j +(_W_{*c&lYm!x*si6NMG+x_pG&uHRbXM85~IS>a$)0KkSlQc^;L%~sfJ$gabrB$`rv?XLE+$UeRraj0 +N8=&d!PdMKw@G$AM~qlvBT2620FrdcVo6S|%W7efIY7)B6K91G^W!i{y^MW}*G3tYNm` +IY^i5ECm#<^#)n5AV7rV +Cfz(c0N*;VV*n6NYTF# +TI19*mS4}ZjMLLvMiOZnR5m+`@gHk{~*b|A{BD98;WuV5&7jvgqI03Y#C@*Ai?IW>ybYPl7bKC_!hijAb>P;fdG7YsO)>f1 +B`#=8Uz~qwMTL9gPdz{ZH=kZc&lGGc$Oyy5ZFkbUdMTsI)T)$8$ddl-gw!`qSEuLG-|Wie!kM_&h8V9eUA3YCErLZ)yztBy&_(ZN +(!AP(vgu)0%IhZkzfh-fBz(Kip(Ay)|MW7AE*xZm<#(7^U!g($zp&kD?wNOeAeZo(K-zQKFe=z)8Z`s +e14xby=RQ>{eN8Hw#eC;WR4?=4E1oFNt{b7#u6%u^$}Eh%tbA)Q(x~9v|=Tp6>PrsJMIo+cU{UPu@u? +`lTUoJ6cu?fz81sm*zuH%}m9+bl{E}Y%;qA%p`-5MPPJZrL6km00S>^7 +@-8Vt^BwZ7Qb%c4oi>G;*-(l!MV*yW}&Vr}29(&pX()=_ntF!Hmi+au4=)2Ii(RHJ#LoAvLWB^nLXMG +)Xi*@@bt!09VJvln#1E_qvPQy`07y$1To +VHhGCT$u$U6yzG?+L*pJDK_M7tGjS{`~Dg91{fFWUjp=OaNg{{;q3ogNB7?i#(j)Z2iJqwztXIzAJ7vrTxC8a$W}Z +x2#%*Rt+V4%S_kAE$H=+Z>4_4)T!sbbA_`Z$N0Fj=jY0yhE8;MxFcJOo4a)%^kZp-CEE55r1OjZILLg +$k*Y`*=s^@vU@&}}%9*Phw(J3)@IUoh9uo-G`t-gnB!}e$K?X||ldedj0pFHu%e*<(2o& +(Q(#s{dpuWT_^ELRecQq{f(T|u3g;UT*05L0Y00|9*v-aFxhpwNUU(3()7iUrWx<$~2gTGf5L;!z9>8HLI%l=86 +1m<$0*DAjz)kfERgsyZ;<`87`!sF=Jk&$p>ZXR1Hr=_xLumRC_hYDYrk#s+fq8eT97Vw1Vas#Fl=_n&==x=FF`T098q+3( +a6hGO82;3-h4eYuwh(CHH;jx&E{c}P^LsuFLg#U;l5QcqXHLe_u$i_(~iZRGanmT`UQDwIz7#3XAF-YIvG=C~YL~DyP^!qQ8vbJ7THlA|?mcrv;~(*Lg9zsZCBKLV&z7* +!n5DaLw$=PE+ioxA{`mt8GZF&NCAh9lR~nSsbgzviU8-PsiVME&a_0&56X!td(BGQRc5VO8@Y%A^q5G*j9B+RfC~p9sp;415=ofmR$1Un)1; +Ss>-tp7)9Dfdf%_SSAfD?VkqPo9#}DH^NZv>Ins|SLJvYp$H3*-(W0)*%eOXc@kb)>0K3@nZ@};5xOT +Ijh>39!edXF-%8{RDcYf-xe~ygP@4h0dNR5|%=bhAKH$_F44YtJ3VMoO6#$9T7&>Ci&~K(@;sWg9_#b +k=msDDUo@cmP0j&dh7BVb(d^A4%gi}IF3+li^l7%zsO2n2VU`*@b;RhY{`0MyKq@y&pZ{-VOiax +GOI;1Nl2MA=x{rMN^L8mGW_ab4jhQ6%SO+bHuwADulFJ=jM*lF3M#J}}USWgIwOufa@mK>Yu6)?@xtF ++gafEU0}=qG1d^jl$Z84ukH6T;1tByBthc@YxZ=#l1^Ojur(Wbn|9l0Y7$ypg;fDFSH)(|9_#6Qnq{e +X{b_z=m*|_J$y+rhYDYD6OuT+;#ge+arGa +mDBPz8Bi9s+tCaFzAZ>FV6`79dbxS|Wbbtpr{%QB*VBeE!2OqtupIHJS&C)+66h55RfA6 +*i$4YA{{0`sjAB;~4y|y?r8ooLF;BJd?bw~Td4}0%^**`e`YomE=RWHf5<0ES11*^N6XFNanbf8}FTW +-EkqMcrLUb=z6`}OlG{UZZ47_P9Rw-~%#Rnc4DPGe>TwXucW6dGUEvKC8? +^c?@J;H%TO>WExE!goRIjaSztjXpvgZ2uBGW=*t7pdT|lORb`+mLE}8L$ +*tUhtW3)RpSeyMZ};eRSf{gG(K458Y?Cx3?gtIBp$yb2nj%0b7A3Vi85MO$;lfqyQ9+g4-s3x?p3+St +MWx@1ZJL+(D7yn9dT^F3!T3P*_qvnKgS+%#GP +6{>FuG+I2fECay)inf26RT@|f^&p|CyHWoFV%9M)ZOf=61(>z`8kwV;1gHnt*1x3jEgIJ_?IjOWfhiL +hq>8{8MYz=ov$pT}tp@jNoX)ZvK?gtHhY>p(1F?FT5L}kgf{7*e!=l|np+J*%%^2Ak=Sn7ykcl1{-;j +lbNtRvVc9ttic41V*sY-^eqj2?{It&+mI>M-^tW=0uW!W-p8a0^8z>y;B16Ea`aXw?JmO_xGl9?}DC! +?H`oQVZIyhAcwgxCCA0~E|^9%99wbYsGtt3pla5atGave%ZGpbe*U8);RUDM8^8m$HZxv7!8hz&V*SP +f1H@NK;j6M?+&4vb9mj+6DWrIuh3~)F13H5erZ~Zu|b>&S^HwTAiI$yKYce-SUVfL2j#?K4LxUgBKcl +!(hNq%LKH6Q~|LIRllqs)HaH=3wObHkHN!r*@k_qC#bYL(m>N%9$-!lq>vUUB6uuHo>xbLn-!61ftl1 +yY&7d3n+~uEf8YY=s^O~v-3J7Z-xdW*7EhPrQAq<8jZArx-AK`bvzMyG;!se{^D>o35-8C}5~rlno#p +{mXm0eCS|=_>x_@9!%&eII9wxUDY&EB5t$Bqz5t3C`Xsy2|PYroGyl+Ce55DTwO{Q&2xEp}&W4qfKXy +dW!^co8-}0V@hi4?Bju`NlbT!XuRRk +s0vK?hT+HQUPd=F=>zGbu`VyOb*9+vO@|Q7$CUZX3gaXtY+l#aJCk8FnZNAd0FE4VzoHFeTXBtUq~cW +MPWls*#hove#y2B3b9 +qzMJG`{QNCJHzc4WY200}0A%M6(z$eWmg`4p36hgse>Q*+}j% +V4UZM%9uda5cz%BK{9NFG4E|?i3?BgCRpi9Z{>ILWi)W93(Lxmila@h;pRR=ZZlWy~Gyo{81C)`+GwD +0ve83%#3M{6R*b)u7$UQa7ma0v5QS^tS(}QhE*Rr@SMB!NE;Aup#!_zyqyIN6wB5>g+r0H**BEFAoLC +y?x5vX{>MCD!Rz-X9Wmf< ++je=U&nH0kAIr&Od#^#=hz3!qySK7mu^mT(9WfRgi-03E%4F0 +@Dm7dHQRyWaLJG3nC19qp%uOl7IA_MvZf&b|s9s|Et`mQ$%}bo0%-~W-TuHTvwdD;`Ma32!kVp^TWn~ +o#{Dfx&9zYxp}QEfb{+I@$&)nlK|R%AFkWQkCu-=c6Ti8GI?bl9C>EoQU~44GbhFei;yk_`eG|Mge{XG$wt@|vm62&2%raIP=M)*OLgFS)M|7PR^S3sqU}xw) +Fju+{40iP@WVf%kCR^ZJAEpIQ@XNvbt)5zRD;YDaC?>&U#t-`J)2C17>G!7m_BgE|+>_LMG7{nJ9+Z;~i>IG_1S>Gfbz) +(xG)jh~wC_zY&2^p)GIS!+RNX5XAsj_4Y9kAAwi1%&@?my&3PXAB{milHAY3RG@#PisPA&ywE#F(6~e +x#up1!O(W+(C{prW5mj|lEbu%=Yyvf7u2;9gU80137BeuV}pm;io*q%uhy9HiHBj|h?iT! +mV005(ad%Bolm1mfIfXR+V27vh0>#YV6v}jF|5*r`yo=AfEp-C{T_f(8zm9DQhULl|>GTO5NZIB6LHt +}4O38q26hZf)TwhfN!vvHXMIede?$5O4Z4T~wO4eKej(`)c7fyeiF0fEF9BfRyv0}$q~DtbNJ*uF5+a +&&-BpA-c$tJ26e#a7frc*zqQ%>OLN&BtFAC`tokcCR%m5p +EI>g6R>iB`K({2&=>nJzJNo +PUgAb>Z)7_IF4@im&UKoIiERdEp=4+Jwonf{lp2kUB+yNO>^o-)^2hW-U-Zyqgh+%g +GiDZ)R`ci`Bd{CHbB&;x@R18$&!|6uFh*I7iA8+Mgb!9QKZ@qY;PQZ8$?LcY>e|GcacuOPIxFQ!*HKh +RCq*p7|gPW%8B@_0SIQSoI)2V`dFbzey8d$U6gs�T5_$T7GC6d9)BCC?vG?K?-Eh$lq6^)U^+uC94 +m-vja+^ZYsnWuxAGRCA;AA7c?u6Ry_byLEhhE}psXWw1X0OnTwp`@ypx2H&l#Ul@f6WT~X%_&d-j_# +qwHryxo)!5ybj9~Zu}NZboNnGLSPd1iW)?&@g*=*#8p+`D?GEWSsqBu8yGSxyR*8ZoP%tIxeWTB|O2n +Tgw8E5qyi#v(k&MHo;$490u|&zVJ%=>y8>xZ^TbR8}9Zbk-DLth^y6DZ?p`fQnbYB#(!SsD2H2K>F3g&;cqy`%1W`JO4K$WsT?io0DAwm`{4OQZ+o#)Zuk +e0jJ*c_^RRw><&eNRieflwM5-82LLKn9aC)`oYf+;e26OU|ycKwC5d`?gvuCe19^5vyzxON_C7>vxaJ)yU9Q-<|f(tIv +=(FP(G+`($cUmi5H-CJ**Ac6$JL6w#k^94<=4E|DwXB|1f+Gd8W +7YkhSeSV)DsV>T|Z0&*4>q4Ad%@b-Q%9{u|2)B)}pPr*{o@k#O +1P<&U;95$O9KQH0000803{TdPDDZfmJ(TOIWJ9p>)zuePU@$QoyT@I>880VCDAfBGO0sSaopY +g?swh*;*FG?wCCRQ({5vl1O@|OFqjz(W;VCK{j;$dRdI2d&Xd97c4PC8f%rUM+!pEVs*1YLd(rOB&Te +!Z7iIKnSypi}PUg`MbNKyVGxd8gO@4%W2lIJE^~$J7%B1+5Oa~jA@ZwEUT&HE3=2;Y_WfWZ{MKZpPW< +{J;$+RCumqn69QGOXsuHs^rz>_MEqBy&a7D-X&8NkTLRh(vNHjCmYngE7aJgTk$UYTE3H*t|*jcF8@W +j;w`031#8$?`hMs<=uC296Un->t5oZ0B66b$ZfXG)>|;V3;9XC~>agMmK47l`kuR0X?gVbb=83SavdB +P7y0rB$}t!DYqzKWJs`uWtsE=2BP1OuJdVniGLI7@?trjr{z^Ynx@#ocv->25+6>I4C-O${+bt2nat- +5BgM|}C>YrGc^I&{1&(_a$sm^8%bTnG8fyTIx`Q|?m&+mp1Yq2#+!X#RbASdo{3DrE{FIuy%;)p`26| +0+WYZLTTkg?ZUqFF)oPSQJmrO=cmRHaV#tUbRF=L95cjZ+Ky-qPLE$4;`3*RfbhYy<3n +znI{f_j;OKQfdU5dj;MF15Jq2ih3KnIg0mi$Z4*4lGe*hR9JijKRvlPgWr7^g|mwq!n>pML+ +J0p+0i+m4=`SyokB}E>`)B{_5|ym95N`J5_{^P2>yP1j$d&+34<4h2gd;K9IKnfaqce*An?)Xa#<~lW +HgG>YowHDQKVS~PcvG(8ylTY=PZe*5fw+uyeZNuK_Ul^3M5`!$5j*;ldJS|QVy{A#>Qy$8I}@M2eA85 +=ReMp&nf==4|peUBK*L+ox%5moetE9m%tYasDMv3AN_T?vy(hRUfT6|X%DMSfrDWss`ei*;MX3o;^A< +6XLoz|aWwpH@6qnw&MP>7KD&L{FbSe)_}$`j~qloPa`kC+k>3Cx%ccVutW9&jIid+F&4 +)5)OU8q=2bTMQ_>U)uFY*fYV-Ug1XJew5@V8A!ijpWNDSyY12VNv7-m +xBV(V<-Xtp5z&TfE}qEl(*OOH2W06w7*NUX?{~8nE{^yDta>5iHbNafpMMW6+nc6OmM#=up3f!#4RG> +>_^>$N;p52>4z%zYUDRnqx2%`4j&F5^lLDAJpaUE?y2|HM+65TUdGfqSfX2> +mug5v;ILCn6nDAEJlWM2|+}Wje1?T)=S|$&Yda$TqPG>Ngvse3 +9Vfs3!yZO@jveR1$6B?=9Rx1!pR-@eRTl3w5}&(q3173#gN~$B299*PTuj`fL()WJ}y-VU@;{Dk(Oe9 +iKk``TXebhfwwLa5qqCo@BG?3U}T`kxvrX$w34f&-2Nra^vjq`RUmUsa}J+51huUT_lsdn3fx_PTr1S +?>Tx-$Rb}UqR7B`6FAZ=okX*2Nn?W&5{MtLNglm-EB^Xr2RaYj>e240|Y|QE)UA#Pcj{qJ&URfRIX;CDX(2+}Ev(pV2=vNoNyg8(vho% +>W)!A~6yBXlUabT7Y(1TO__~d6@dKiRGtgj18BAq5`HTO2oe|fFz?FQ?W!ej`*#`B-fboqzD@|rNCa* +<3>^qa!IJ4t{}YZM;^s}f1N)m|LcEj|ubo2EdRRbJd~ygYh&stZ5y3!_qTnY%5ZG^A^N7pet|yGm!vd +|C2n;|jnUqvO+)S3;HJ&T+@60wsuq=Xo|GDl)4GC5}5kH&vm*R#nbH+&t$t&N~)js!F*4u_O`X-v9JM +cjrrR#AqcBhT9;F45Q>r1^YZ~K35=M0Y7>F>R4Bwt*$iT +u--@cX5Hv5NcCm_Egtm<|Fazu3n60!ncE*B)l?QNXDee(u%fWsFfoUe0~YlQRkqXYd-*h_!IAE!uI2q ++}HQu~owhQZ=$we=(6CH+V^L$J8J()y9RkXozp(&=pk#zKi+70FU)iU6i>GSva{Y}E1EhQ@Ea?%*0op +gs?4w^DnCO{4=NYu);t$0CRT>_(;NQPA`kS$~X94kB5B8$=w5AQ#0-${p~MIXXOkLD+N_adm}~9r7ym +y-a^6Y3~}v`;I$0on<=3w=@2;M8-(J>B}1U;c&&5m%#2}!p67J)wICtb&jU4G2Xpm?MBl`}L=yg6#xa0lkb39)rG-UatisyrGY3h7*^zxYY#hrY(i&A0DifthTOT +zl&k~?-uODe*Gz+9-{&J(*J3mYN=U_oGCT=0=yuof?{6fi9=od?a_-Uq +7sjGOsRAeNjJi`psyuglF5>+AQ$JabcNkOg;#!szg@hS3PY!YGWr4@Z_f@7UT8cbyHrdIEx*ZNkG^>O +?(FE|P$6KIWP^-R^zi-RbKSI6lo3q+S|(_*G3vak5rJ6CoKt$@C8i?# +X3Xcdf04Ql7va=gTL=`m<*%_`tgzJ3U(oM4zZLjI?Vp9KlSfH@yNjF}i);~)sGVR}%6`D#WIa=hqy>IO6c@DS%o4Q=iBV{)HCgEvgnp^@O&$__yS+DCy3f +n%Kvht#o-gi2k=XnNOC+ri#`q8Eolcv61q4hkAdB>{IGENryfvU=88XTMf!B4tgGgPEVs%4Qy<%c~+= +VSCB>Wap>jVN}@UJn%alefo=JV=j-{5nXtA +t)2{~Nke}H|FqkHEpEiT2QhYw+v*BWC+LNZBpq^~*nm6qO^()uG97~yrdlmg*m9uufuAaCTM9JL13__ +~-wad-OEgzOA17Bumsnx1?yI)=sSnztU?=X%e01V+lBOgq(b-g|hi4_79eDDzrz?s{?r*rk8a6rgA$w +tTl)(m^PJbdng-UfhDL)hGMdqYlj0&M0{R?}a;<7H{Y?gGHkbt6wJ+~V_{IDNAb)G%g2kfWa@1 +qw+rf~_2$v9Kx21lLBNPsU<=St==Lxd8A2r2F*#{Vv1U9`<_M!+{pQ?DUW1D;Qp0BjE$R0s$*5wCG+cu8RN|BEzGN=H@B|(F~@+(DTwu1thJao0!a +lb9hB_TEb8#C9K&An$1NhFqQlgrXNb^xh_$LsqoOTd%n!*nDZogf6=26;C>253_qP^&=#VvK`@fav@u +OVS1w@b%E6LsgQPMmbq)p;$`C{a1Rr0eGmt}}SEyTqbQRqs1{%1Ls^Nw$ZJ7x!fU@okJ+WD|DkrlU@n +U>{^U`%FcKGP&GoVqx?!z8@|A_0|De~~~6IEpR_{rYm;qJ#C)6ZR68Lw_-9BxIZ)ag{;Ze2(?U)-Y53 +ldegEGDoSmX#7K_wk6*-2E1}>L7vnGTB0;b_BJNjMPtnqZj|trK*>fbne+_*BhKppnVoYdXg1W#ThoU(%SOcv_qbf$h8+Lhm-R+9Wr_T^zQ| +bvL>xzj-z1gRM`!BI)PD2)C;et(zd3q&s@^O*J$NP9v0X%7MIDf(`%(|zk>0QB-PrF?( +f=2jcTmc&Ta!l$;<@pL>gcwWNBad2h7v55@AT|y`U(g-@`}EE10l +>U)ZExFDGIsDe!#Udui*n-{S|?B;ov@wC@5hhCe=E#Ks5lVgakMi@KnN_lgE +hfCv|ueWjEL`86s#=#{cA?D%t>&I$OWt_;E_Xs**>8|NrLUat#YPU?UrbC{D@d?+)dX +@IglPd_D!RD-RVwgJC2d-kYFk(QeW{_uKH-I`#H?@j$ku#SKZ0tNXYLlt&UyVGE+jg*YYpc!SbK$+tB_a$gH?G?EnqvQPMIQg8 ++kv_X@Ppnagm)moE%L6TTQRqA$PLru!bp}NXZGeQ&QH7$YoJ*Az8s*7r$2|X02230n#vZ+i1VB7Nqe? +9a(-+)dMkBPFk4D`xnO}k?8($~n{+$@|AMt5*lBYhfBkrM@{B(5o;`HSB7h8viJyG7iJHxlpzxda4*i +pJ8&5TIGgb4KC3&GH36&Zrwvv! +k;{O(yIq!GSAC|M#5+UD%Q^dmQkMMO&&NrgY3E51lHAMpsEzB0k8-u5bQSVS6or=Pa|fj9(_Hhw`4`5 +v#yd1exO)S;{}@9#z}RPB$?u$ruG_J3|3Jl`OEt+fFI9qRn06(retTlia#erkkDH)@iP8B*&BF?mO_V +#ZkcqA8xXt)B#R(b&wfuA2w)6#T#ZQ{si7BauR%W~^ePtjMRuhd;q!yUR}(T|mOKvdyl9MnljYBql}ScPpE^V@qFgIH!64^?MT@Y}k-<(d%>GZtV#Aw_2|wCR|HFiomtQ +tygaiBsKU-VOcX(R)+mUv9hd*zQY>rmBVqdg^J{Fo;sG>Bta2`!ut3(&0=5F)J>DU+tGhbLy+Z$prTr +AN#!!Ohi7x^woPGN$X=5Ggw;c-HwA6vcD<4ac0sx{c)zYGyA>c3-w+tU7H=8f1jsg?|qZ|yZd1^-V<# +*2o#5WiK+`bnrmUUOJM1z|za +4Y^i$D_KyRuXr7LOkqd~+k3CUe<`jQz!sxp;@_FvL!ec5saWs +1F}=kIXcRfRm|NsPrH7=^DjJt#}Whlr`zlG?9m#H#CqBJb?4!CzwQnn{<<^V!T&nZ0|WE}^2guV{q^B +@-*qg5s^0JhAO@8)(c;IeY!pvqgVd|aVUlBNdFX?Ps@9i;Et@D-I; +qQ;mAOhG1mt~ccWi +#0pf?RhG*=PKtdm`$duG)ecJnQcN;C$s8r1GLg{!}1pwi!zF|k6n*z!IZ +r{AFFw)vJ&<3s{4`BW2`VK1I6H{8A7{(1+Gc8UcOZ_p9fa$85@Ud`Dlx8S^^&=la=tpCUr;oiwSS4n=6y#lL +%+9k2ULvQFDz2!9H{BhrP5^V8KvFr9N@y(t_$4k$1S ++QoOHo*sB)nx*%Bfiqle8D`|?8sO}W7s)JAk%gX_NO)YPvhh{X9=dClutGpY&BF&IcVmWru$S#HHpY& +is}e*&}y1tj3dE`c3yUczcfIY5ZLwg@bqP~#3>ESgzxi0HrUDx06;r-a8}(&*lRQUeZ*(ctRJEElwK~JoIf;IVe0|Ftq*e +2IH%Gak#nNaFwUJtw@n>3DFHajRm!5E;PMQtzY8qE@C%{#vq88!&nlC3oVla@NvL1^1XHd$j3yIRHu? +-Q_S5cHu6LJlGDlYD`c%dE1$Wk`ws#u)yRZ+fgxE5tv1obuaq-5Jal&Van_Rh1{G=_9HK?!f);HR|GK}`TYa>t&eQhnA*fH^nhvmn)2d^& +tabXXck~df;8tv{7xReEw~wpx1B}Q}vE|b?qq;Uwdl!#DK7FQ)Zt4HMm$ +3h1?yuZ5N@FZsAj6lj4Iz3=q@vI7O?cu9-eyugD|nITQ>b`;$lXT8=WPhN4`)>$Lsj^ +iI6iRQ(YKmyTw3-!?ydH_hnputXtRc#xC+TZYvA^Lsu4tHl!*w$!m +K8$dF&>#a-Eo5yyqfxij%oX~2qrzsMh0s9lHTILoF+dD5Q+l54f&mjHO=LT-4;b1TiBZ~D#(HlE1C49 +ZL~Ri*K9v}!lwF%iurRiS<|+amdGb*fbfi4M`+>E2U3P>RLqVh^ogJI(8n-9aG1#^~r&IKd(_v`vav! +Z7c9z4-rBGxkJD95IUSeO#*7M8D5`D>V0rYuqz_@>|R=*CrXHaPKqc8SL*>HSMA7w%!=4{f2#wDz!*R +Mfa$BT-@m_C{&UDE;WI$p3Pm&Xw1;rFD-WixcnXQAu}tt(%A4Qa-ac?<*B%`UlsV0+$PYE0 +1XyHS|8zawMT;$?ycb|S6u{H)ATb0GRm&A_`PQ&~I)IcUJG3dr$;c2#wme)+E^P`6gyo$qvXf;&I+9p +N?_h{cIe4!*NcG;88W%|f&N&p2fDUT0$}Lrn#}#VQUE6-M>(~)vwpi5qd2@rUCOyS{G$-12216AL2xD +CJI?cLFV~s#O0mPK@Sm>f^Ke~qIHtQmGA1{f+E`WdXgzwB&g5%*KYkDuzE#Nwn~U9DHT@v|H!9nYz~{_x|gPBBeBLU+a?# +W;jyao_!zM(p%e9R*9xaUvN)t7Gq4|O~v$9+dv};8XsvucK8vk)w|Rq3cXVW3MlFb-l9#bG8ER-Dj<3 +|Xt?%seU{J8($+f}XcJS%6TlMOtT$qOHICR7zYp!j<}PXJEG>l%@9ws3e%;M>&8;Y|qU*e@f=3!eJI= +wCIkOV11y6E01^`>3=X2iRmRXg~@w`er%#o3@`!!qoCm+lSp*1fg{XV +ee#R*O)~x6O>ug6eAaVc=#3)AMa*Pa1jmszbJ5B@r2vIl*8MsTrF#U?$mT+SW$hbB^_iP^7>mBdGahGBfO7tkiSHKo>LDX-UDE!qjLoLE=#dGUO8B-RqlsHYQIGvZ6XKsmOsW7+o^=Jm)GY+$fQCd{cJ`^+b@T! +>fj0Q)n3@P`sq++PuUf-x|zbm_ZgU@&&N~pX5=&JIvq=WZpBBB2pZ?um_^TU~X)+(EsV!p>Xa@7 +rVLBUBC{hh@<7LItr`P@N$5Apq0l^L6}>yuecUJgo&kH1qdK=Qk!g|K2=2N)Gj#-m89t8UQw~2*rClYl@-{*8EMTfyveyOF@h{^5R{kAs-wd +w?ih7seX1akb`80)uTmIUW=0BU +Of3QOpNNnNfh3DYHd(bkh7xf~-<_Qp|ogmHM2%qb^K82Q~Wuc7l)E403w1sX}Q~V1DD8Z4E9!FR(ZsE +EOodR<~W%W?us{`5C-ac(x&>vx}LCSrz*_1DT7Uv0yAPs=AA;dfvAhv6wIhdG_TW>_ +#BcgKu^z++)W);_aPVu +Q``-W852%Jr<$0ga=k@T;0&BWjme{d4;@OfiAy9h5^`FEfTlq%s~N*bj2&R)(OfkGdW%BQJkROwwqxX +}Tk%@JfEJ-e$r&{}AN%$qRkvs;aVY2>b5JPol?^^@IUC80ShH@@e~8fB=`?8bn4!<$nXaUjS^lMT ++9Q=OZ2#gW^c=h!@M8X5h@nKehx1Qc8b +di*m+WamhSs>_Hl8J<`UVND()K|$Ev@kGhs2$H+`*EWe&_Wa-v6ANA$oE`gglwjg{CwB#BUuT%;zV~l+RBM1L5^g6refF +UqwKiZGO=3&AO%IQ;gCb>(i=JJlsw2bsNk(dA|XWjqm%!|NS|a?lDmsNf%1>c~k@Lg(d+gJ +b{j}Qs4%+-5X;%pVMa2z`L!CQRe2_IP&IIWMiM2VQBVrqV_AJdOwl`&+AFZfjB5@ZmzZ@Rv5X=9 +7ug}$4<)qYa*}EVdNPL&7`<6*)5Vdta$T<_o=G>M#q~#)^KbVllj2j$R_+P7K_eEP=3)^{ScYp3#UV* +7hRM-%`X4^+C6U^kEjs$(ns_B7+%L&(&sMSzd$Mi4IXirL^qvyI>5_a3Cgl+}fBmpMqzrnXT|4d&3bK +^jgMu~L7`C|&$ac9<&v0~TuP@743c$6N81AlBLv5C=RmS@40!nTgDb8@e_cUY%EN6vs`r-hzXTy|2 +*PfBO2PE0|O}W0cwWZnA!`+oF*|lePtZk3BaT2=zq}E5Kt(9y%#Ymw>^zq|1Q`JXTO}8Sh-J6zZY}Z% +)`?!Znf)-qB#x($aNatqD`>?I6?|r0%e|Cd(Z*}|OlSh_>ID1` +rwRph}Xi*BM2r*CN_9SvyFwVey><=dZbexONfT8C}y&&?cbNh49cCyLDr3W69&`8mj;KZ^w+FZGD}=U +k88vuVd)-F>o)}+Mw+J_Bk`ZBOd)xJUD67zl#}dQv^y+-hROSbgl0J(eExsMgaS(ufSMxBrhWF$ZA>% +$eper>{3kwwGh7_47Yc8cAnOw0hD0N$02$lJrvb2SOBH+9R)GtQ*wI)YqZarE8vtC6!;=>Ray8b35B^ +sgDe6%67H3Bv$d9FM3L4A=(86y2`CDwlq_?6Yk;Gmon>@2El7S&s(ntZLaCxbG%xZA4so}~d3Zp*4ja +hEDam8*T^Ow741%pI57H_Dj_&A`L8A#(*L<6_h(Ewwq7nB3snc8A-?>OI=V|HNof(Sjr2b~fk@)J-Rs +I0{e4NbEEHje0@u1iS0M#b?oOgDI{#5;%84BoE4!Bf-j>$KBoIN+bP=C44Vje3Jvc<5zS)|a(H)kB8LTE%@JqXltMT{WaUNK+r8<&;HYP(*bMDr6sh+ECTl{DZleRK)%ZzRzxFfBvO=Kq&;o +hAo;2jVa$0&YWQFuAMhwX;QJEh#`KP|?VutU7gJ7c&b#EB_zNcu>xd};Er4`-FwHIdppiq12r)~TfH< +W(B7J?0XXb`IX}x{A#^7r=Y8kQSy*hY|scmG2E%AYj{x@#b0V~wno3-vt^L~w2p3t9wHfQ*?58dOsUDMhctc%dF~R(gMV{wFxH;V +8>7LXEGzLP-Rt0derdI)4k#2Cm$^oq!jy?G-WEc(Fi0B?2O~7*6mFs`1UYRg5e*I&hkpIu2{v}*#pJ> +W1F6dmBe3F_h$#IJ^g4GVh`224D@;U#3?hg%M73F4R;?oWyC2}7utQaH+<*-(?xXeIaFtVo1!eYjq1>wBS~~T1pFG~%{eE@5nOpDs@Ae+VglUjYp4-g0+EG(16!_j~l4O;F_l(bp7o+@-`BKpcX^eq6i!enNh0yZz`u`3a-ot*E=rL(7l +SEy9l6xzZi2uB%GQPAhWi>fK>E>z`!UC{QS+q*}22g +_}1XVr%xP96gk{SUR+@(I`pH!(NtreEA6eUs10uxQXrmaxckwUl<}# +Obsys`s^UtUeOqba-&MIC}DlC9nl&MLJLQ820Z(SwE*h2JrD^MR;&}y?=o*424d!C@h$u|1n;bMKlqi +I;SMKq=$A)hy5A(bECaS;5g-nar9MgnUWoa7P;3s3T+J!W`FWKs!1?P#6&QNcUHmP9hBI`KWcXst%~d +2b&miI0RmRlVlY`bl8Z&}-9el`gRMqU~BF3Jm6e8IjzTQo|*#`z_gh@AzSO#F#I0jQ>tfAVs3GWV5PK +yZ*y$;tD2ppJ$4w3G@33D7nc)AYo^M?TDiGmI_$89828RJc_3vhyj% +Y5ip?pI=(?Uhz`7m(QD8R1P*4kVb7?_?5Vu1(|7O5li?u33S1(-&I3h*$*|yP;h+w1>g@>G8qY(fLT;tn3BaHv=ts4$)r4@iLuPm^Hv+G4;%=_bpTZhG!Z!At@|O +q2QEMpR)W$9?_CF5ki8+jp*0Oj;ElE%I$I|Dg@WKal>-2yl7BJGO;HHa+WeLdC+J +FoLc~6mSh***mlXZML-D8k0pw|Ow6NN7f7e6409O +kr4g5L%RBUT-j8#p?YbbZjqo5!jk}z1l|t&G{CLuUQWW%3Tk#b*#m64P{y;V=-S+aQi~JA2lAty~BiN +oXm0pEDNR=I0dQTo+^#(Pf5duUfilEY0pJl!P1qd$vj-ZK=C=_6+nmx(LM2XSuLL})X0UrAJ&#&3X2fbgj4juG +a2TKe<^3wScBh7mRof;;chf>u61-j@CdzADdblMIArQ|iDQcd52vpI;QcPEbrO;Hqt8pQjU?K9}+JO-m1YL--;gs&_Y}Q8!;)VgNe?M&Z6PYlSfY?nARO0Xo?fa@N +eiKou1ZM7__=?d2^6&rZH01Xq&b6b>HkE*L1z_$zLr?(x}BVV2i)FpM(QwptVVkt1%;RDYtiEH22J5x +;KsPmHYQfjG%Zgl3>q$$Frq3(3jO%x3RX0O|?>Wpi5~NR@Qt;$djne5ZEs#t;oOwGv_Q0iKIBt-V3R(4^@LKV{{wx1&{u +?s5m}zavnkGsc#1jDR8f@aB47d2x#avt=;NfqV=f#v%x^3fy7JQinT!J{`4S_Ykrj;&8h_Z2hJ)RQNS +tEEQEVAk8Ez6~eYw>ErkHV3vtnW6ihp;PxTq@Fc3{Keix9-r96+A8n5@a(z$y3+(JC;0Y@rw!4p+^`Y +OM@MlXh0L#8MEno5X>3NjXMi*n-8>jlqnzN_$4EF}LxlNseVA=JsSyp_SUzoIpDQ^539L-K4qVC)Hk> +$bvDb0xHO(mq&-kFV6jCqNun5EqZO9MSD7J5W!VQw!5FTGk3e +o`9prX=mJq~}z|I2fVdYafg_O+Jt|#YjNk!{N$T9(}Z!P^}d!mvO`Ew#BZBB9ObZxNbkpHcVRz +BkOql&Wwn_;#Rz26>C+S)%qK=;iH=zt|D7M-vreSF_jD}x_j{?w&kt(zvN;LJ#bcYv +Cy1%CjF&CDWy|8(9hfTBl?Grm}IDJ$Yf56^-;cF#d9KP_u-90}J=yrIw)9>^?t{MV<@?mdp_hVn$`!K +{`Z9_3^A@ns45!M-#VH2^7A&6sF21d%g+qkaHo#FQD8<8@KIl$3fjt)3t$U0rAht6C^T;E+jcQS2%6SX;8E|Z!?WUH<;()Opu-HBP`ntjioJJMTTC5qL;}FDU_l|6{V5QxDGJHh8{;5YKF}bC|ALjTkS{~41fIwFk9mv--u|Q +O-g4#M}7PH+2L7Z1^hIgn&C&Ojvg$n-E{*auW?`RFwAVok6Po5G0k@vj(yF_^yqX;+Ed_I3*Cf4)~Q0 +%X#%ZYPqk+Fp0bZt4>Wp=LXQHg`USzosFzT7uEHIuCLYQbUaF89yc$zxfdnvOOlLBNPi +B1U8AGM@YM%e{fI8MIJ}M0`Yspf1BKUls0f&xY+~?p)6i=*uF +Rz`7^X$_)6^~DTb}CM;)bb#9AbQtb;iAdn+CWymm+WoMiL;u0kd^q!3imCmB{Qeuync=%&Q@|VwM^qSL*(a9< +@vz@4$<v#CIQN;Om56MpqSC^dOUoUOgrN2+qezYz$$T$?2} +QIkAMKqfDuV&SzaU~48u{nm>7tZpVCDc@%=z_V3EMMvgpm@qh>@@)V9*__7yCMh0c@D30@l>x)lM79p +twt_A#^N<4F{EV?>5$XAKmtF`C*8Fz8|qSDMlvVNQD#ck@SVh2gIO3Qxfnm~UmO{I1FAom?t-qrp>Z> +7NQ>9NF=t1r$5fQwactr#hGph{IIaNm12s)rXNP4z+>Vp?Zsg?9=Tr9=WKf2=yslJ?=^o^SXFw9#`<) +Dc(A9Dn-c?K$390>Tq%oV2IYgc{fuNo!RL(s&xZ)LvmfLJdBkeV`*a3)Q>K)K(+Xh71 +UJeQc?^uwY6>75ia)~-A;7m+;Dfx>-gO##C#{YbY3G^#-AMH0w2dJ38!5=wVTc@B#NDYIvCwCFb+f~` +UH8}@$-88o}fL|erc44;W3J+@vT(v(k@Ht^HaERFp>qX2Z@touz%j_(Frx4zQ*Bl46!DFtPx$ffsDcW-0;9)s +$+OdOT+-y8G5)b%jO5KfI~dcyQ;hMjEvByz==%+RzZrM_{Q*n*Vf$n_JpI{db{`??nE!b>Ky_(Av{81 +QK#A(3V+CYDI#^QW^&@{&p;m8lybc5U;rAn5U~HGD6GV^aRW`~O5|^lN)N>3r^gQ`e)m7~{GX4Rm4!z +2mXK8G%;*!)qm4jN6WCX@WT#uEh$Mt+C=NS(eh3N|bvqnRKwCJRvk5#p_Zp>?*;Ly?YIJs0ouh^N2RYWIwiTbp~ZZf*$CK +6@336n^x(YNNnCPTKoYseVU2*6xG>U2e*v>J--5H-yRenp4z6TWm|v~M&{`e-u-EFz*GKTC)h#>(=*$ +B#umC~A6=rtVD5DC*R#AyBPO5!A;zmbsd@#z5dML@{WG2hbXGl>ZYuf3{b)_C)Yu!A}(0O`u7Zw^mJuMaPNl56y;`*_I$TA-ClPV*)AGOt4xs3B5btuX1TA! +r``Ue(UT?%C916K!-e2WVDLpxGjsp&mpzB2f8>@$}_$oX&Az1m2i7E)w;03<2pKE_S0=R3R9%gXU95t +zBVffhB}zh5KiR&ri=@a6shy_dngl#jFfjH7qNJp}_aG`i@h!kaz(qbb+~6Vp9K#d{Lx0={7-HObT(f +mMR)YP(LpA?r%{yEfWH}qM`3H5DW?@2C>*s_O|p74+^l6IZ)PT^lLWlHx7i^?^{g}2#?wC>7oUJ@$b7 +^ZPmw6eYdf`mR}x%J`Q<859ShCW0_{WA+?q&hW(ccr?IsU^rtGJA<+gkefBTWsJX5f8CBWLs+{TAr +Kui&53O4`pR3Q6)TWpBIiq2z*!LsCwra}sk+1`JHTaJgUe?0GDTS&FKE!tdtWwB+};ePhJC;{<{Gp`a +4dm+SEpoZ9CN2iV-K{Dg6tKYc;q+2l#TxZr^`V#(BfkH$LMv<(_vI83aTe2?x$zkL +i&tAj=B}23`_c1ysnU~Pix7R6j?$=F(!T0>Sp3v^j;x+K5_^Z3Enf@bq;W(BNZiW_vfs<)e16;UeB$@ +WIoaFq2tj<>uW5yiz{(|Y&-Xu5bz}nRD-c_!uZbq0SoDDI7ENW5*y_$5rW6bCB;9UpqB_QDyJ +G*{7qhKF98ho`9H7%!q-=L=3L^!d>VXR$`mvS!+QlKaF90aCVYagCoVws&gB2=YbXC-{{xdROUgdn2x +*+F&o}C$4O_Efw!a^Z&gq*sf(k=pEJbRy`yS*+6~}|~fO4x%yeOng*0=^0L_G#JPOS$ER7YaxIaJZC- +W!3HVY-a-jn(w#&(RVj#&QB$V~WZdpE0zk7OFubCq|QE(V|3HqKBzZ@ZI&`so?+j=WzA7uQlGm@tgg= +?(nG*;xp#&TgTIt#qK<$@HtT0gW5UeM)}u{``w2~?ezlHZ|t!393Ko`!9OoeyR(uej;NN%69?) +TilvDVmj13lBMb;H=lX<5Ywp%=Zm#u!DAL@sx|-D&gVZpRC!Xk9l%dJSVTBR}b4>=}4A{|Wz*H(yx6w +nCz1I@A+U#n!$QG{evsF*-q8Z_ZfZ#kw)Blma*m%0Ezy9H}l&XbefZFtDunbT6`d`g62J0{l7)g)NYs +Ro19{?EZuz_{-keV&n&Ru +W6=KXHmC{Rra#lj1J~=t+yz{Ia<>VgDl?3WU|%z1Rhn^gp88$9{nN1L7xD-f=pd}_B)iuKe{yPL;gNp +*MNz{24uZ=xJGE1Qk8%InE{2xvTvU;C_Alk*xfVIu+wZhuEZEwcCG@;O65Uxlo2OMwwa`=n;fP#OG~o +KaQ-=QV=XL>&&JK#zf=2Q8qJx@&p56LNzeY3=w^94a7K0V_Bgt4=AXMC?e+raMfGWwQ`S+GFENv7ggdr(bhJW#Zn%C;7@#6Wtl)*vamPgSk}i_iZV>(G=j4`8e)0SV8Qhd0#R@v6Pbf-CZ +DsbyB+v8zWJ(R{NZOR1cz)-OqBp +^7l7p=c@l~86&~s9*4A{@j{b|4Oa1P@zV0=vJ5a9BmTT{1F_vDI6Sd(v~j#^=oHk%oyuKFY@QNvrc{? +IT90bNo|=|;$0JHZ)9r=Ho)78w@cAabxk;iMOhM@3kt1Ds#4B8%;|UAO>qq9WNX6R4xyxtdc{#Ym@(zGiccX?l5U<#iDRw@SmAQ@I`80tCDwlU95%Z|&aGDLMG?-41aC|4qhcD=HVsB)v@e5|DCYuoMx8 +q4AOC9hV>O>{dXXcj)kK$mxQY1pAN#q*l60?NyE!ah)8k>&W~e$6o{fvt>Hhq2Z{kjJs?WO+AL1@dQQ +ksm@_Si67`MdTK#HTeC`|Xl&dirw5J +8M)0LMsv#d+Yw}H%17iyQuq90keasA@+a2A%6{HD*6S3_7EqpW$sU8r@U2-7*-3;Vg*QEG|Rh}WAGG% +CQ_3_+j#+Mcpc&!6&2#0lx~7tNdaHE5WZz$QVMBj>*zxF!WGKfg#%sMvvxm +Fl!xqnP;@dLX@ykjVB(a+J8XLm)KkNhs6hD5)Y93`!wn=6$j?O}4=HzJ$*Tp-!EtRe7#C~mpnYfL(sft&2<~{sgP0L;Gi#C_5+ly8}rVIxSdFGijCM0caei?FquDivx(7?w<~3~9R648=8SfmM_{@sM9q>^}Euj|TGb?5WKC`d +J$D8}m9ezJvju<*7&x3Xm6#LD=!xpI@GfPy1QjFhAp=Vh{wW+6 +9#7N#~sZ&p0_&M(!?e$MrMi_J~*WyNM60Yf)N$Y3z{bS#!@JA{M-<4S-{xhsJ> +S|!i=L&)Evv%EfVX +4~to#t7G1b0k=gC}wVTTpBHS)P|`6$Mfi!l{r#JfPl>|40pH(oqN;%y=kXG+HyZem(?ohd!*fKLp?0q +*qD*c%;dgnOv!Zn-p(%n6X8F5`k&^$-J=lpgLysyjU2vpEymvau=nJn(ej4hthN6=h*1Bs=Z2DK@_o` +yr`H6mjZ!Ue7%ZlJUblbj^u4WRT}r}`GVS0+PF}wau4e=*0=d;NBe@o&B0*a*2-*A0KFCvjYS@>mqzI +Uo4yIGje&n2@sK?hFIwj6-b#_SC#MIT}JnQcE=@1&}XixQhD$c3Cc?Cc2iKk>cL}e-l{`5%eNT@(9GF7Te +}yp?k*-5!Uc^ojUsM;vAT9Xq}RqJPS)W9ekGZ*dl6^Ti3>9~qnXmz<2cr?O`+%P{0EX??qC^o^pV?4mQ!iHq7R_YJL7APgS=sLF%#| +3w_g@R+(4hr^OI0f$$$|NP_Vmydf~fAblTP3sY?;XiCI!7Wr>d)t7gi*hD6BBDGld4GzD}E<-99Q_5Q +{iyTd~2p>6FQ?ZtuvuC-)YA_l*H_B-iy-TwxUQ<=}eo(_}+*#~UR?GUj3E8XMC@@>am}5nu@Drs)k#h +bnNlB$8F6{H2ckr5v;Dv9#^=(fresm0JHvQz7l+uVU(zgSdsGm;o|5dlfn{J95yyZwTdvBGRnQ+#*zK +TthdQ7zaY!5pug=#-O6H}X}*7nk|RlSA?)!*W!Q+p=aPC71xP`uH=Xg9?k)kT{^IOye12~a0hJfG`O) +z#I0X8?+o)D5tJL#|}SKXIi}9UM@Cm)zvVC+DPEYc~@2ri${L3}b)OX?Qx340WkoJzQWYGI9_toz&=4 +Q#H8+hKQ%HCCK^M8SBU!ieA#0PgS>W$^E$+5%`Kh*tmBb_KbYM;yGU^7r)q;Gs!4F3KP~>cu1HXp>Xi +#s?e@5A&H<4c4HrKI>sp}=GmuOH&Ohc?9bz3;>eczsEjX@hWKJe>6LLrTDe+7VP(?a$-mpNBTsKeFLF +8Tt43&4Elp(l=*NQIKd5L;b4hWvEXV@{wt&oEc0w4nfWqk@HTZo_9%c=s#Rtz4bOr;Kk4lg^FroP$U@ +1&~wLg!q$J029_o8@Ui*si2f`Qw)G0zjceqCTGy|(mvs_(32VQd`QG0NEV0WWYU3>O2EZ+Li2%hVcI$ +k@g33XrYGS>T6)fJ5P>X)s$=cyeX1`G&$OlnqaJTPzu+q8XvAevF0<_jJ8`71UOv5wby-VRLWdb8unb +yucM3@0jH28|F11S57Z$GVz*sT7oN!SLE}woQum&bfjFM%p<(CRA^&-juP*+E(=O;XTpOQiyRpKc%Eo +hT-(iR^A5!=adfhflNIj+x8Yqtu;(pf5Rv<};ds^Mdl18Yd(5`qAIKs~Csb=d{Q(G*C6Miy*5Ah>kv+2(t(@V-55QXfzVkL)64c2 +6)YuZjbyC%t@>c-5PA)z_aI%TsxCpm%*+(YIkL-hGr~_>5lx9{A`K+DZb?JF^k`=U}>mGtJ-9_E|M7q +YQk!LJ0U1O+UBbZte;a%B$h=3koY(uuB(}_Y6v>Wl4*v2l87&YIm*`tcxUOy6tnZ*2F;tz^V!6)%f9FG45EPItL&h#c1D4x;j!{6Ci<1I#c@FN +jKULHAVD3ELztCBz#Z2GGe53ey2-h8h}2T|l!(JFw;^+ookb#x=H$q^o0_+0a5Ei+oK@vZqp6xkkbXi +!~}1A_h})thr5Ig9kN$Evr5f1WJv}LF{({JPj&v+4Nw9nfXi!Lo1MNYsxZFWjR}^;~&t;Ax`#W-uW3%NRyIN_p*dMUsD(-@Y%V=?RTc(qE?(Qp +`@L_7S7Zz>JRKS7j7WkN>)>y7)>{&fV_k1b>ti4Jz)*IBhqq;a?GWt!|?H)U!?6|cfd5KbOjIkQ6lPK +v3+e=liLJ6oE%Zi^o6ehV7+6f+x(dEMh8W}<=H@$*4r6C!^PwaEIZp^yeR99&T8m|j@@wEge)1pJ{3B +`T{gs~vqn?shfK7&!oDGURhP0Zw+_9;Oe3~U;9uJ!n|Ey;o4x&340xI!_Zc*;bpXS)g2wp^^e&9dDUx +@(_ig=TNf^D7yTy6zoFD(5&@;GH!ID?rERY39@ox{sr#PDnRJTsKcxxsz&Cx +t%sX*j6`uENf!aTB0go=>e5?y*HL~h@uU}$iIR-M76pIT}{c9I%{8~fKOblCaCr0gGPTQZk+HGhbDO6 +ZMrveq(x_G>8sZ3j~%8sTW@K37a=}jZTG?hF&ibZtg#ET9%~vFF&@IDoCRt}u<2*GcAbQLh2m=XA0*kCAQM8H_BSc1SAn-!Yo*NQHV%dJiytMyOmh2>6i`Rr7!~Ec^yUK&t +z%eSLN8<+J0TTjt6u{`{x28WEcLjAa(hDJhnXPv}a;s3p(Vdja;8lR$a5Iqxb@>>eME_%kgRP{f7;QU +*IEna;sot)9-)Yw-{2Q6vf2;!*Ip76Jo?s`M~@XLahji(7^T&U6_fwt)12_cECdL;(~Esol-_ZW8F$b +l2GnExS?xMTM9zO6%#V{q>t9(I!LEd6LvJoo^rld>jopboA8V!AE|629{=(cA0tAX-U9#(_*e#<77&G +f^3ncFB$WZ&db^2_|Y(PSU+^SAFxi`>0GTw-Z|?t--gH3K*_D%!fTq{4gQ>|X{72^7Yjpde3_|)9ui% +ExehG(bgFGL=1#^6u%dbOVX&|s%2LXRU`%^L}(gn6=ULIxVlSSmGzNnCg)66LIfH+P7DairKd2>LF3wa +!~yGg=Egw7GbjG9v_D0o`&z*k(Nv$?oS^^Gom$)A{&tIFp9q4=Qj+aD>ZKsI_^*wcFG)YWMNdb9ZZj^ +eLd3{WxB2TH8zlS$JZX7&Yxt7!^xv;daa?wu!Ih+7YHwQ;oN*fTb$YHi#q+UIMN$oa8)uRIWv>vIktm +%5&U#q*mYd2V%yLnW}P~lV56z!x;6so(pCWvR3L$&oasBkdbh>BXAQ8b(Xv-(E;n=6b}c2Z9sQ= +g_(iGkrd#Ox8R86dy9)edLabb=EbZC{9O@D7vpM|S-j?*aVx5}5qz_SXT+xh?~imlb(+S7q&NI`wSGU +m1%0@yDP19H&(UjOr?xV}d>Mx3xDe$|Z&O->nq3XaVC}@M!KG=T(JH +ZRr27uoR9XYxL#X8oM$rOE#=hn9K^ZCxU#k02R4v@`^aj%4H#*K;aa^JQsC+`*w#FAJg1Oj?s!_I;xZ +jc9(CWV94Wu)U*y=)y>Pd4||Hr@B-5pO=NDydzlX#niGx?OVxLn?VBrgEJnHBFcl9u*O#HWwHp6XQ^W +i^a6=)i;MmZN%3drDF0yad2=D@t2n=sNqIe268xp`sSSa%4>`G!-S7~7lqRhmM}9Aa3;B>k%C=k4EqfNnnDdd6FK;qtemFDXc1N&=S79p +*-u-8Gqg6}@MSw#`dn2mjpO-dtq#P>_=qPMI?ZCf{W=4jFT-Oo2Lr#Y0HFj#X8fnDY1$&%K;w2sCYjeAEXBq(g11}%O^-+KwFwzbW+1T^7`ebeU__0 +&28{4vF&ZkY8V3@lyc_LaQt~IXJAJSD_>#x-MsS58mM|V<acxP +l84{Fu;Bd)5LNFYc4dvcHA_l%k_0tf$=4+1VlgLOmv?yDNP@9%1)ATJo#jR)?xP=!-2Rt3_=U@AdB<~ +iHh|<9iTOuuKAJ)1_d>Nr533JCB^%3XtI&RJG%Id!Kk+L%Wb{jCF2HOT;Sx>-eKCGmqdLtvXX9ZZ0Mg +vbxiRxx~ksE{@~tE?==%$#PnE;t*zx@#h)BsyPjS(D0UA#tANoBf +)kRUJWd1yeYy*YQe*&_K*6BDKNRMjvS8T5cfLq6Z6Dq77MOLebR2ssnBTM%BG64nu0r9sX{TRkQq +NyTo5SJG&ZFJ$(aQwm8x-Vdmll)dHQ$LSocZmQoGwl(`CVTLq!lVL!xua8@hDBP2Y*=zmTWV>!Wz}tpd~u}u+`@v^G{;fHN(HM4I(Vvd +gl}3;7{kaJ>%@va5wZgi>F#SfXBYhF%`MPt7VQqcY-|KA1;B@rFXDlsTq(6;ae +TrEZbt&GEJ9x=S5p3#ju(PZUM4lOxqD;Kq1?j-n$MtBUtcb8d3{tnZ`&{s-uWvI%#sv}+zeTSra+4}&CmiJ40tF4nUYQt5sDP}u!eIkOgYOa6tCvs9)i+2;H)1VYSqm?XW*>U*M^`KsQ!o6~ +<;Hf4-Vf^Iy3AooXCpCMkPaGjveU%s4O9rV8Ajr$6v8BZ&u}Z9j~0?jYl3b-&ia#74T!iNMuh`v?_ff +u?i*}nWJGI?1&g)WAer~%g^{8XwnMeMmV&`FXmvF7=FLb{6;#$tBy3&YTdSXj6IV^Z8WJ#)H +P-liV~6YK-MhY<2LHMRG-!;Wu{m=Ee3RC`5hE(&~>r?lhhyQF3j}n|Ni=HMHgKsRIP+_*Ra^1pXu|0D +MqORbt+b|L%*c;=Xw1PZW8M447N(k3ly~yafh+86iQLhC-}ur{^CR +>YsZg+$GCB6hG)l#qlaHOi0Gpje`V}u9<`n(b-t;>rzwk9Md1cjM&=NDGtt|JF&}qxja)j&ZVLE9SJ} +!c#J>ojD;e7WIt&%Hlj7`mQY8M6zt0~y`wLJ@0|XQR000O8B@~!WbsBC3B@_SvK|ufjApigXaA|NaUv +_0~WN&gWXmo9CHEd~OFJEbBVRU79ZEP-ZdF@+mbL6&>{;pra%*N#zucRf1uh3;L;cHc@Y$xZJiYt<=1 +4(c-o6(HIp>}m=`@bLXGy%+;v}-$;e2J>I2WT`J-47Z-li+s!`p&tz=^loMUfkR`i@W=EKRCSJtd|di +xS{%~(=OgEHjDM@)OlDfnsqB~mWx63e7QL}8T<4?m)`S!wOGB8O`TGI-mF)ffv<**R$uUef4<&q{z8H +$CpF)Q{Fe95YiBZr2oZJPchzzGlz^N36^i(6K(lVZlUY_q6jvo-GG#n +b;3lgoz3sP`mE0d6(+&7%O0H<;dry|W&X!KOjGxuUGGY_F>o+gHqW#HtnP?r288oT=m-0_ptH05J2KP +l0a8o&J12PZG}=zf8*d_oMRR2OnxD91wSYCYu~y((Yp30&Y4xVauHa4~ui7@UKUWI`(wl1$hy&^x= +W<(S=QDAySF>x|8-BFej#{^PDVI0|MifHtx@JCalBGkfVh^Eq*%3N@m&qiV97o#2)0t6PBkYEW3C%NT +R;4l-kj3I1TYJ#7ou$g799wM7-;VhyigEK2~aEiioFKCF;nn7T)%5YNhB6U;CL9f(vwVu?2Vd>n&Mmm +RKsc(!={W)=b%OTCa*%MMfA&#**4H-BTt0cmL} +qQyXoyVDX_^&dL9I&Y$q2E`uEC5D%RHkwBg8U`SVo9tzCkr3#4?Lm=10WQqi4Q$FbgrcS!gCV3u#arV +;SL-C8_0Ld1f}oGDd?kvoU6j5l8QA8Ox3E*xl?c8SQLYY9=L16XMuGQ|gtOJt50t;+T2Q3Bw#1o)8DU +a*JW^!PMMhm=lJ%MJ%Tn%Yhi_i4ftrg(W9ga=Y|$f+e@GuN?)HBB}G)}oAaU!(7g=IT$BlQPv*LN5}2l#niA +6_52+IrbR3op2W!d9zFJcJlr~7pl!i$4E?TDHs3(n$OiD7D?Nt!R_>~#IXq}dr3+Ty=J+z0H_8_as@?gHUO|N@R>)$#jr-B~4suvJ2S@oXRs(S$PR@^j7IrbCLj4%MNV%t5T?pa_sIH2WEt`%mbwkHS9Rc?iI5;nP(S5ZJ#g>N||Q)I@kl4MHTt0K*n)m% +}pYBXc+&BvTpmed-QKbdJ7H?%qB*z!jwT|PY*_%72szwf5Rsr1h8)4K4zxwa?GF*`*pw*vKmak6N|`c +2R8Zx;sj*3hHQX^c6e{>}QXUZ`gm_0+-}`6#sY=;G4@hHp1JpLS2*?w&z{11#9eI +2q-jsoA?jI^;roT!r*t5N3r=VY5m%<0w5M@>hdzh>DO6Ke1ocTC`SfG6+7WAMgZT)Fr9u?9cCXUSlX;M)Rqm&(va0li)*3&WwzME +;EDn|K_=sx_yYf+ZX0eqOk`;5p+fsIe&;^G6ws(OAeMeUu{g#?1J1mil_@k~31!nO+)BmD8DCl08c?j +AyJAn4G^|FILk_{nqf***eazXD25woWCrF+x5fX47cKB#qY#kPg18|YswHfmF$TmXNufNa(K9(o;Zhp +8Y4NP8lqbCo8gIZq*`THuU~TZ;#>}LzgUWCKY8&uy}W9FOwX$8AA-~1r`cpSN`A#xZ^XX%)#X8lvjfi +6wNxTQTy#z&6@5MQ(w%SCpD#AUR53QQ3%JziQ8sdz%f%q>&Nou_emZlyb?+#KvsgiFbH2G>E`}-mn_Z +)O|4wzI^1eK&y)eji>xWhQ1s|GQ*{9;mjo51HrH^mKQoIr+YwuIqv +T@atk#3`<$5J94yLkych2wcp!jr(zW9f6rI26*AMrb>Fj!Tphgb16su|f?()pLo;j~yJ +Ko_~G@g=B)>Gj#XMP~J1J*bFgE)|=d%^!^xN>mipzXFhG~aAQKfpfnOj&obBeI3Ux^GDgw$1EJuh#t? +UoL3XA(r}gW3w0@`jwO#gYHnW84Fv1r>auxX59~>wE{<@Nwrv?Mt_vRr9|*QUsKUNjLL;9x+uNBmFq{ +=e+L-$%u#=D9ReQETrwsCm9ekar>>11F0*}0gW-0{bo@rFm*v5+faQprELDSDCKQ0 +^9+joeLWeeVOggMDW`k^cWi&cwwLd@tS8Z8;@+=6Kgzad2uvL98C`M9&9dXXQdIx1)M>cu1^IcQN($M +%lJ>oCRs^78pnM?{~pCTb-_tuMN2@hHutiVe66`^K%G3zY3()W7w4xwgCajoj^+XMH@Q?I*NXh8$W)OTw>E0AVfJtIhlh(Q;?{BK@+0VM4*f+9JHkh#6*LNfEw~X0F*(;RVDP*FkuMQVVHnYON160G-Rm2uMil +8wNSJHzwtp~Qiy>=QKKSI>3mg*=1Ms7(GvNpB?_qpct#Nhjv`cQ%uZA@P_UpmY6C?D_(DJkqeSEp1Bl +F3Qp_iouV7~Zgc*QkVMrB)1&aVbi_}E2*hM9QSOPUkODyFwV+bh56c&stGg$3`!WULUOHCu!7`ayPGs +1^q${0-Qf~Et*N5=a1Um3PnpT*%1rK~iw{{p28ERz_;6oY$ +pg|DM4*f+928b^1PMoA@(@dq12`VTKMvqHfa6I63WER`2Vfk4@ftFO6bDiq;BcVA2^EfY!Ueel2zZAn +sxi|we6QV>SZb)6e6Qhq4c}|{Ui$#D_Cruk6*X`jPz&6y$?Y0$*W`8`qEDDm1${ycM!P@_3~CCVI>Bh +bpiXLHDZpxm28M-Lvjh~n7@9eC$2zNdNR=3rv~Y;ku#$kQ5nOeHX{#Gp(ZFTGuSQhW6jilAh45>DUjz +IaY&wmn%xi#HgE(mjqz19k1R*Gz36>^=6zv}kmT^OXGytR_KpFtj0FVYqG(e(3I5Y@^hWu&ZPXk99IM +R?K4HkYw`)Pwcv_Wh%f(ArvG~`>0<x-AC +xD}vt9C)Vo51cSaI^^8PX*S6NPN(cSP>`#rH)uJBEk5AK^S2oIJ)xy6#Y2t5`a)}^y3&18?>lN2ewWD +I7JhKQUi8V(ZaaSi$TYVYU$=wK^Sy?1e$=34GO$20E>3+E><>nI1jr7Cr^jds$=L5M>>w-yBe}JSeSW +FZf%M-5h@KTU5tu4d_7OisiXmD0?I*KMLo3wB&|Wg^3g5u&=8;@Ktq6rkQzcCG@=UhV#?%?P&Ar@V%R +7Gg-}F7Q3Kkc62rt8vN3677?DxCTFjC%s=#{QPz7SOi%N}Q)Y&H~>~6?Afi8l&2zb$v7aeTE8R)gZOE +8EDz$&Okpr!L*8fINmK^3$F)Doa2pcbIj0huo3pbe;kr;AA_hLAe^ByB*m1kXVPF9ojp^nj=B|E@osInE1bwf;Ll*-D%7e((9*c|ULd*QLu +k500auiSnyW)rP*%mfMf|6SdwwJ>;pkoe8X)A#E)j8@;rb#N{naMPNU2=IOUyL +EE^TnT?DMGY9%npBjD%gOI3EyFk_fJXaJ}x2KNwq#IuR6?_K9nA9XFR(}jt3fSr#jI;JIR3!HQ9iW*w +1(hk@u4*1mn9R2X#`T}y#zw13BMvic;S4#xVvA9-WhK3pB`k!@aKnm(czLyEmYV-NJ;mCttS +`(R3L4FE>xh-S^_1G_+Vh)JswD&27HEQ6H&A2OflMCfeyAkN+(PogAyKG}9$#U5;13iev|On4GTMAs8-$KBXR*4nV&a@ +>ZTH@6DqAAYi-+pI<32nF7vei#Hru%oWxiEi#?$Jgr4ceZn9^3)uvYdh8Nd^7NV*t}m1x6{d^lDU}d- +9PL9;dHJF(}}TR<1~DwE@Er(X0dXV3I`e{r~CiuY4-woe2K4&-MWpD#!in0k2G~Jh>gSQDrj;$4EGnW +UcG<+{`|dvzV6?=n!B$13Z}gJ1Z-K6#37sST=?fKQ;U0AQgCX0+x~IPCcy{e>e=?*ZYui-&e7F-_`)AtK4jA*i^_ZY5*#vK=C{031F!44n8azqGnl<8(=?fGZOLaie_W|=C +HI%0pse_mXV5*#7HXm6IM1p&%4$8;>4&o+tBNS*$JbFA#jvkx$f7Dvl6Sl|zI`qVUdB2CUvpNJd_)^4w;X)X1OOh^^*hfhUiUBI{Fh_GF7NjUKfM6~#0Ln`0dY +0hGI9DX5Y6!loIaFq2B;wbNLq9CCR?QZ2-bbWYXliY#($YJO?$6)}6U(U`>>EE+2pAiauSAU7NeciUN+ +aBw-$GYu_ZhNBJp6a%zy6u^6d#2l->$c~*?S*c8q1#^SwwJo?jc$9R+m3YGk#0NIZO6LpM7N#jwo~19 +s@u+V+nH+H+f{A!*V$E%v2B*+zeR9lbIG3Lswt4Ys!5t>ygj!{u-Z2J3=9KL7>KqqVpYuxWU3^aB_)r +M>sge|SX^>E>~=U?CH1ug!GS!+z@Ig6AFwMhUs72RR(X@oprtPJSrc=B$dWYWizt;46kkg*3=3jK8r4 +AD%L;Z>Gr0?dUN!MG!_COC?V85a5>>$QHCsotm!rKab_kRUD8t>Y>kD$R$?86I9pI2Xn!_DXA|I64cU +dGU@2{Qw0B3(ha31;~X8Sw6FJGFI7rVeS@LxFS-p+tM!mStgDIoP=mQ>L+<%igN1Ojlj5p3Mi7EddF@ +Q1eqLL$qv$#hvvR5$EX#C==t^UrC@4=<%Tv`tOurepXKKtd +1?9PFd9GSsY`(e|YRpRo<)vzQqgviVkCy#>`YXt+fnbSVuO}X(*g>!rb*ezXMKzn{B$ +=+GTh6As8^}(uJ(7~;t89y)TwJT?EFs$}_ifez18gT9I|> +5Bs6q%^|zIvL6(AmC%~u(P$6I;R>Y`?Tls3a>~mgY;_Lepj}SQ)0CECECJvEh+X|%94SIUL#$oG<$*Q +rq6_q^AAXo)(Xt9I9L{xiAjDelGCH&_{@oZA`gg-Ij|gd +iNrWde@w%2NQ;caIXat+Ss2YHLRzxhEJHhU$JW_{OCv{n$D144fMwCe+}T)odbgs9Zs6mihyH+(R&sE*j7$;x9oMrU^h{BZ<+LpJN<$U&Gu@JzbNhfq(Lw?W8VVxzMI199P9lzbVH$WzV` +b!Z>o+9F77*BK${0AKi_T-#BY%thz8Ft$1jnU%hm$w)LK(77E#V_yPW< +^sg*^@VA%!ll!pKexBxlpXT&HkE~H!Lc_ahkF7`}!KrV%jX&_CC7T2STIl4p^M#6|czNiSsNI&f-|Yz +>wL&&p*SsYFrSEab7NdPQWnY1ZPVkpr3%*gAt&Z>lGRCw((ysF3vyls>rj74_IF6jc&6yX_bRv!Q&ee +yU}cxWOD$KvQ-I)Lu1Pvtw)BY6j418v!d@9fK4Nu(NbC7!126Tvs_baC1Aq}FZqz2MX6j4>CWq@it4) +5Yw00|dmUr_CCKv_w(-q@gl)3uS{T+?buxNH3q;2+kvZ=O>vyQ>1OefoyD`vfh0%q6Z=$;Q3|56c8j3 +^iQBrYs0c)UOV!wABWx_tGG31~|QRo6JZxwV%kfevy>&LRker&<}T!AbgH?@`%0{Al^98vIiJpkpPbj +;{FD(7W>o6LA+>`U74qIInn1S;qM}iV +)!Cs32|Ox@P}mDsN%mhFcKFB!y;t5LM=DW(`G4ROlgvFR%4tJ;K(&;&t(DvC~DIB7|r-kuxcQnz1{sM +yWNfrq10dkfb|wSBoVk=QtUVqZQP!Bm#n)~C;)4G^qRfT%O$}39lSY-Zi;n_-j@G@f$8Zzu=+B6ih`n +@N^}NnXXwarAWpz^#O7drjKnd6>dNCNrKT)ea>RHfT|fg6dYU;ojnG#gRRM>$;LJbvuEC% +Z0$W-)*88v*&*jw;?3LYo(gwKXzjKNC6{luu#&>;0iRL)XfQGg!Z)uRu;;G)wA*D>QjWhKP~!0g9xUQ +|*1n!!3F!}cae*aGd1tLuY4v8~ElZV=AOGSO?2Ei +~;7F7l3(-fPB{h`6qYXiJ80(r1GNO~CC&7Y4yJz3-5d<(q&_Efgn +I~mYe0U2|^%ZeBqC?SrUR{0Vnc=(QEZ;EyoEd@>9Or3eo2A?Ago6koJ$w9-y*nfMZX +^$?B29ouZn=upm=Ma3xkh|ELn6#VBR^H52-%7k1sh4p3vnSGT&?is{^)~1j!79>-gx +n|rB_TO;=7j0zD)-eH2Ry|b~)hButf)GKzR+B0hN@7&Rgp7qK;%~`XKgtxnQM1gR?0m^~hHO_uGQ)5* +5f0MMxJkEw)57kh>))QaxHRyNnE(RH_Fn9N45_iZFi@BsXAtV)k~`D9HmWX5{ +5#?y)s6i6PsyAzy***l;|<=r&4HOmvNz*sO*9(+_8;ax(e@6fg`29XuO%FeA+!k$MuutY;>7K+TUv1_ +!xOfxT|hlPAw#A3EaSrVTSvid;=*Y=7VfKqM|<6I(X7*#Rq~$>nCG6InFwoGa$Ci +d*=yJEMVX2b;Jg%3Yl`x_OeZ_RN!{(9pfuUN!%R9wN$Jrmd~|YjcILBUHzw3{-VljydX8!SE$_gBmi4 +9HNjCnmc;xeqrXZD9B@AHp9VBO;O!;1s|GGB63X+=U_Br23unS%!-l +it!nH%9zN-Y^V=wm7^=3M3#^Ra2vm!-%0Mn=NIM3=NYxtJkC@~;;i)I}!%DgH1 +1DnA_o>p|I>Zq*y14j~^!(rF=DAqXQ0{*S8sTc?iYgloVWf&!(sBXougS&F+-zU{4B^uA8L~QdC=0Bi +BF5ABf=+agYMTXyA!0;b@RKO8W0IRSc9Z@jmyU33fS^`sh(2{uz5YDT+IL2Qzel{ggZ=9eU;w-aWBv{ +*neSN6pAk}v1b|DPU&dvgPR(;+EPlIW@7r^_sEI*tM3bMl2PGhmLtO`+Lz>L9RE2S^BW +HF{)wNoi0z*MlFe5=jwkjZt(?&*5?+u$52xO-Pwu4#<%)hbSC}VdTSVYVlfgMzekemvD(K>dLYzKpB* +ZE8oxM5ixnf~N+Cv~eH+DU9v*^p3JA_((Qbxn@;--6#26iP;^Llc(#w2``R>xo=#9|d2G^%i^kFWkJ{g7V8MJ$Bjq^5yQw-Tgb +v9LQmT*?iLkjVHCqkRKqY`OhCKgiPQ62o~Mas~@YYM;frHoo}5Ol*oglOmWS;Gj;kYC^!!ENt%FS&Ly +8G_HvhMsblJ8Smr~|vi5Mb47(3v8E*-f*P=A4MyGEmiJq;ZD%(N6i6e}^uQ*x_EN|M1E5E*N8@Gfpk- +P}WboBCA`|LFf6X~luP$j?_63}9Qgd6kP?6)~*^!2g7}DfLCin0b1tkhb+B!LNdU4fRB77@*9}z$rgECqiYI +mgawBq#2G3m1JIOm`c<>UI>!YZ0kq7~7ew7RZ%T@(#)xPDN=vfC1`$n+i1OJ!#D#}m)r~w+1dX6@E?5 +hwsT!p~$h(nqsxq1JNF;FrkjRr=VPyl^v6$b6Q;cpYs60(X&I2FI=-Rxbv}c{(2Y|`d&_ +2lq(?Wb4==~`lvR}~v0J)0fM)379v_}ONL2gF;LK7p-I!rd@(b1|Ng@U_&cXIQ*N|_F8&ONk|I}SgxT +51hPQH`I7Nf}9UKdBy0o&W#InRh0|hhzqp08Cd{Q0#7qpt1_>Naukse5+{5CwZAHl57H61gOo0l_od9 +WDf$85x=%yZv_H7Usa>M{iplAAqr)TgUon+h*royGy4C>GWzOo(09>_$&Bqtpjfh{Kw2eI>$E~~4~~= +v=7B}+H^!X-%NklTfSyCs@u +BT|FY->E)s_Rt)U`3%i85myU1-P^)MB%MW89Ql+5mf4_EMlA|QQy}SOb}Bc-vT+Rq`ex0O>os+-Xz&h;+27=0Fb` +II2d}kpo@u$74TG&+Yj(=D!eaY-@8o^HlJ(t)Y%T4tkqjaqW7&GVi7x)r +uOPhzPvL8V29;@3Mn)QiE|o_5**?`u@-H*J9IMEv4v6BM%|hb3#z(X8Bi)(c-7>)LWp==I(=? +bWdfzW)LJYlHSYQIr&RL#xilopa`19r6S`e!RD#$f08}=JCB9Q7WjheXq%9_25K4uww}wZwWC!g=uQg +pz!S?(h!w>ZA^Xist)}H1tPH`EKU^=veS4L3{bZdD{j=r$ynd5bnW4AU{t-@puK$|0IREW!9gWZ#Y*ak#cBq*E{oqLj&$V=0aJJLRrwS-V12?QV^bNN`rEy +)xBJlxmsK!yZ+jNXD(f4-E?z;CJ0CSj&vTDUF2(XKGrH}w5!mB>mD0m+d(Uk9Y +u(b^Wj)?^xS7`W#A;l-z73GEkI2{#E!CLPy2td1*Rr$)9d=bZ?|Sa&Q>-F<_gs_BhAm$ifH2dQ)GCV< +V0QBm!W#?;PyEL%O$q5{ERK=RdZC;mKjnHs}2`17ZvBAMpVii1`<5d^) +p2?BKHZ}T4!KxqtpuI`IJFDJi<`#L%`N?0OS~JBg(#M4LG?UcV;iN*<_e)8%5=!u^7O<%)s#8k~ImSN +lp@YtqinoS*WP0ASc!cb&Pjz0rRTYP}8CtMcZk>j6Yd^G)%i^HGWf*TI +!tJ;#*kw7LH{2aN3tGIpnT5l%X|u$eNo4m=-YPZuU4T>uV>+ +`=R2$-2*<^@Nfq7!cfR$h)qdtC%e(+da^E-hHZ&1Gu(p3JYI9J)u3=qK^rB|5-*aXhaohrPR$@$J%#Q +`tMt-9@48082R^Okn2Aj+t^JR5vfT^Q3%jkvLA5mYY7D>TvG76C5N9w}7h9&}Rh4I!UhX!IfT}$=mQ; +dp`R+VMAfqGw`T)i$TUSd5c0yHDJ> +zbDU>USdTUGG11AtFCPs84Sma!B<7y2CV*8s2m!w-6Jb++XMTxSr!-h28X39XZRCni;^xF1RWprU4t3ebzpNf)vR(gVC+5-i%`KQzM0a>Xy3V>q6wrtP4eUA*(uH#0RrCv3$I +9PAI%%UHfvQOgeporsb@h$T?KkKuy@!#A#v?lc_Nh)65P`EBK4~ppLDqBc14}NneWSpe5)B8;mT{&J= +!k9M5}hQVh>_Icq%1V|r@dD{j7B|KK?Xk2Eak`flIrM&UROkv-Iv^9zvIt#FCdL70axTSn_WbUK>r`? +{v_}M-Tq~>ZsEy4q42`#TeRxip86bYD!k#mKq?bR_b$HS@EZ=?DDOf6ARFI4XDJpWacbx$028Ru$4@W +|8eX87Jdp8HpYAN2OoLhsx9POu`*YoM%3zxTB#=vW?jINiwOyo!^ly=EAVfqqrg$BU=wsQHCTuzusez +`w(de~#!LOzGF5iNNn?|#=5JP6LE94U_ixKxpiO*>4JePMPrdWAJVDMG}RqG@E*dkAyJ2)ZvYFSYxX1IPtZMQ5KJtPh+FMwy +->X+SJ?OD0UF0Poed&QJ${b&VrBc+d=-jMcUFh)HO}%{!OQL-f20t5G3&Lno21BJ6 +iCbcY5Yqn5ol%PaZtTCiK5xt+p4xhBfmi6Mcp-BapI!xL$bm#e`!;1`>Qnp}ne%Ef;|MG>R)T5k8W4ByF^g)|d}8ar6Sl2pIr@o#aX +gp@jpUXK55*5ksad<+CbNaCka#mE#8~9Bz&mWLv+@Pfy1Dy!aQK^VuidONe%yD$tNjgdM6Uy6;0Nu(t +cj3Rb!ptDQ$tW6a0@J25aU9+-ka2YZ4qJksnv+cCDm(dUD@}!O}9S?TCitcr!O`{u$--}ilYv|IF-nO +0gwSsgljeUb)-Gqq#e97u!TV(}&ciBn|JRHsUD|Xb2CH-GDGTvoq)OwIZ?U-R+_;#Be)0MGAcqwE&ib +AZ4$+(Hr->s tTWB6@3X*F$*POByRRP`UG^m`DPi!%{9gm=q +K`kk8{-O`SpYrd^$IT_>I@>lQsts9gCuHpq#9siQX)l`~!mi!}o5fF_&YTRSJu0Nx +Jo?eg>&QpAuF0h_>w!O~AJXeq9$zO6w%O;57CRFqaDN;fov9X^k_^Y$Ep7Qu7~42Gvn}5x=)Ix}NjZ$ +A2UqC5A#cq(tP%|RRj00UVV$lu7A$^4r*4O7LVlc9wIxJ=6}Tu`>6e>tB +@vOFt&0rG9()%J>!bbrRi(C2G*H1M`QpT@=dK1DsH=z^y~Cl;y!&WZtSI2=iCn$Ko(THQQoYI+*all4 +wZi=ZEO&e*;iU0|XQR000O8B@~!W#71fszZ?JnBr5>`A^-pYaA|NaUv_0~WN&gWXmo9CHEd~OFJE+TY +h`X}dS!AhaCz-rdvn`1w*Nn$0%c}uxwTZMyW2-vXD5m6X=eM#HtyZ*bv?c`2}!IeQYA<`YMbwV&jAP$ +B*B+Ny<&1YjVu8NzpSY%elTLrJ4pyjPXl5y0{_HCE#Gyi6#_LTi`n$|h{ivUEchWby)gNe%}tBGoSK +1YL7S|s81+IYbZF`CCbJypdm18*Bk|WS^EnMZ|K7i+L0K)^nK&VopVD`y@yD~D&dW-N{w?(`7IO;4LU +VGF{8?5ZpmP^SH-pYABaBO5JKj7BSr|}rCM$e*@x%A8@as4H>!fHHI8>IofX|N}Nq*p8_FrPJJ8yx&dBzchHb +M8jZ-?w{LUAIO_zp*S>@DfJ!;m62Xj-N@p*io3YSiRS<%=VDurivt(370%FM8v_J&LJILto5wCSPN(6M65 +gOQ5EVNj|Gg=P+-A_TGgesX6$0Ab`0K#LVwEzF1#P$g=heRwgT~OOtVQ~oIH1MOzloQ}g0xk7yr0S7- +3e@f>sBNfN1wp+FKzso&v2dtsD@JlZ1^5JkM+`_Q4MkwaE-&ZNcVUhqj3YoiWg!}oGR!P%d8L0xG(st +H03KXk9jaOtnt&x~t0VFs90;JFXu`Cn)K)d(-f>+yn5bXX}m^rI>UO#)e$jJpP@vN=xFZG2gir+%X*OVv# +j}CF(l~Hai}UO`iE#ne~e}~G&n=BUc?~duu9n +1HRsM*vRcV^hnS0c=2N@N=g86P!~(8Q7nREsV%3aH1~r!6$-s2Y|uGHwJOWBrcT-?$wxheki{$44hk) +J*XAO`$N<;3FH}7PW}KJ1ov&D4s-XM{1BKn#33i-$#H5KW5LF(fKm#HkI(#`5c(o*75NGFVciONR22Q +CkRVdca-Ip7hwjq>X_?-H#_BUOZ_%h3gkS&y3N73B4ni_@pcc2glm(WA-&jSlmBC@oa4c*{jt&jZLUy +8HfL4|V$#|q}ti$Z@`u4KpzM~icA@K(!&n?uS+Ll1_6qdm1b-M9#^^Wj$%CX%hetvN+4 +i6@6UL`BGNDO41)vLNKzuX>rpiBU427TzzKV>2erZcyCd95Xb(U541bqtlp?eGfO*%2%A%^2~3}S|3K +Nxzz=D@LrJknbjN6lzqyLZqP=-r=2GA#Hj`TYKUsu9!$P7Vgg?@qruJ|^FuC|rd<;A?=MLjaRp+k>>& +Gbr`s_#Dd}Y8h_)8X6yMt#-w33^an(2G#p&={=PWEs^{ +lt@xSNz?-Tw-BLU(gD)5@0OH!Z9Z~oSn*572!ze`$wm*4!OEvnr)q*K +KKiEo(lPw4TdvUbLn4Le_jKX}y%+oVKNPDr=reT4(Z`^R~3k6Ky({!~~*U;SFW(`|C +G9tdI())lQS2|w5QD{M^qocLAxv+mjll~ezr1`i{G7aAzziQ|jFIEo>_DWKz+dfs^zRQ~c({_?SajKfU +ub1DLGKBjNf2%P+c5zoED=nyib1T(>(|UGcz*`uSHgY4-N~997D=0jGV|vCm8TQ-G) +ofYUL0`>PO*_(V1iUuJ0K+%~E642qNte1KM)D+8 +>iwA^`&ekVz?^ZALBx#8HS60UHwu0nZm1%LNAIGc&~5bV4XD3=IF+D4BH>!|^LsTxs}xd3=SQF_%Tfx +n91=0OkcCm~V|EY*+7}6_&`^1agMYFVx>oPBP^4n5YquS~?vwk2NzL1 +oBq||8b6zOxP%i1g^vWY>tfx6c=!A5*FP6&oEnqOCVF4qZI=>j)2L2fiDP^gl$Rz8~}K(31E~!f0pg1 +$l(lfwv^;=G{)qJted*-Gn$(0`j#%(HM-1e2ouK6J57c~Lk*uBP>N0D4)%Qj`A@$tTYZFkI7t)bJOo)r6=;n~xxCXvAA^jY!qic)Xh%Y%VrtUwdus|&c7Vw_iKNta+uz<1GDMc4pM +#2qS5VTue(Sd86&lPzsD5Mic%S=APDPChCti()wMl|{ce1`=`SD=%SZaT2Oo|BLrL#0wNGo&rHwgg#2 +dKq^h1!{F=nM#b82b}p>Wf|bwt$uLe}lu-e)hA$QAYu4S>0XVp$V?sR)TOl~`Y!?C}90Sq`MT|gkPYp +}gAsJPc>XJow^x%ToFzc~!?VQI82e`b?|B*?hG0qR;^>}EKL2+dnowr-If*!^j63TYF@Q}y0$ori02DsS{yho<(_=0!ndkR86{f1$R!>ecICbXP7v{vc()#*PH +R_Iid^_JR=Rc-YMmBUjfJJ)9as#b{}XDkijOI3)PIf;aZjn1808W;gQsl(>G +&)C4%=2C7jJ@CvmIwxj7P6%IW;vXR^GY{C#-R#wrney9el#3n&T%+=24e-U3SD7}QspB%E8fRg!j}QS +kIZ_zwN#^HgxySdF_p_C;<+jK#djCBH+7}R +BzHug1PM~vu>m7@9EPPv!-m&yfpmzej6KL!N%0Y5Pf1m(;jYlx=L;5c4z$G-mZ_!pm0Pn%J25h@@a;< +G`ugr{Dfin+FW38_BJZ-L5_2&KPRlV$Kqv~_l1QB+E=zRpeK~2wV;(~7yp-kNnXpsb%5;Qk1nj&GncVkO`yZ$Djpx@=Tc&51u12HCROb +L-ag?_Fw7s4YpnuVEzU0j}^?N#j{z+uz%_Z^lxeroHCfq(uJYC0;Y}0{Cw@2#aEH|J25j|~c85JFu6+BfWD{*=q9`k$e?DO +O@HcJ&QHF>y_4|>r(K>eD_>+je^k?|mS)T31{dM@3`z~-~9lF^KKO4?!3y8kFSLz1%QNL?Ok+DKl8Sh{j`nI*_5+tf)!ui;zM$XYD+f&{_D_d|5&_#B~O7c`@h|wOSH7AYF$ +f${hSAL{aLnU?71%4;(eCqK3t2mZhjL!VRe)HZ&5QFy!x@xJU7tW7^$S1N!E99No}1Fav1m?>{ph9EV +!E?q?5zLlq&Oo{N=pu$A$*Lo96#V6 +qoZr4LN{z+_bp^?}J|0+Yr-T(RA0H-eM2gXQr_?Iwg3-Q!2~IY_0O{ODzF^7|7<*$oSJOf$eV6~(@Ebx1a8|nnjPh~{b6yr +%9*rzdn6{=zeLi!A8lVEY3A0Jdu3#}Pw$PCEAj_pmc422m}xd-as^{Mvgg&668~9sWXC*~sx5cGB!KM!YSo-yu%+rHj4|>}Gy^X9Ntz^~ud{k6>Z=lzA+Sl(Hb@T +ls5`;r5$$9VKHvXdWc$8X$8ue#)y6j{D^M}tsYsACe_vGV69$5&p1tHopNtSPndHb;Kj&XkI)>Jb3oc +f1WUh&;v{MGMMNl85R^I~C3Glk!Y{-F-HcQnVne9*r-4(x^M$|I}iGLx;|7f6-de^1?BU__WZ~oQLnu +xwqlP<^zBnPAtv6E`3`&?TJ$x4aVP{H(QEps;|fw%46j7EEe)3I|CmW2>6EAy8*vpG!r@^7kJg%l=GG +)xR;~G5CHgzp`7O^t>k()pWLDMVf} +c*f7VsrC7~O5s_}oBbaI5j%=gvFMHS@;5qlGj2opI_POY#jBQ#gHOr+1CJJCp7{2wd^x>0O)I_uKR|swBH{}8;+ZQA%%>0ltY$t9;*WJ&547J~&x%9q#CjN4tDU!=gVl^D> +}Zu`-(aFs9RFXQI +zqYiEKUzWinGbF(V)31)4@vpgG4kbfzi|C;Ug;l`AIw`yOybddVu^zB1_j*1HF54JaYAA;u|t8Ft}FI +*CGJEa74a)l@#nDet>#Q2FeYpe2W<4i`V#*8HN7L3>^z7D;J +1F=-dS#IFO$CC<&0#@+E4M5sQA)yx^K<$GkF{Gc(Ncjo3~A+JpN$#{5oL_>oI1k;47dv8H^RhyyIpl9Ldm*R7XpD*BZHRufv7Fh7VqS72czZRbB?Ptr$!e1-XZTPJq*>*PuE_++qBdF2~s>n^HFPgJG=chU&J#1G_ZkY~8zTsp#hZT +oschn#;#!)jqi3Pu6fcK&b<(J62>rlVvqovMp|_aJ(3&hp`kIzJOmC>PqMAZ9Pl4g~2z@BsN?`x0W*S +bshnt>z?KX^bf?mhrNCG_Pwlqg8{|ob+5t7H)-4t(tmINU8r5x?|2EU#d>_n-9c5VuBu<}&boGIm3-K +FB+5)f>6HS$DcIy-B>}6mN(`bEpImjk(k?b_T({QGG>-zqxH2TsO0u@38N^Z>flAe;;sxM*o%JdE+ ++<9n$h+{as#cNfUsT-{mELC$D(+|_jo*c}duZII+fBsPz}uFJs>JXWdVU_+?b#74&A2{AOaOn+q +5O>|z9+b*h-24sw9Y-Y**Q=P+4G!(4Vm3#)d_t)F?VNpzqB^ziQmt;SOHE?lO`FO#=e(KYJm$E{_B#L +GB|a6q4)H1O`ZXe?^^1WUb&VVR{6c(o@$>ga-L7AJ28M%$Ux|tqetv1_cKhN}ulu@TH`?KwWkC6+MSO +}I7vttiH!tE-?ag2FO}PJ}i+exN90VjE-JV!{a%Z+MK=^gB&1V4#>SY?K4N`(j5NreE7eBY0Sr3ivy@VF@qa(LirJ%$ +?GC9e)0EZ@c7UIDcfO|8Q9eRhWMVl;8oEtvru^(Wrj0gJaqKn*+Kl)PL2%H$IJ%9vqhmGNAECqEa@)6 +yPThiOpG67XZb4h$CU4&v4+(D%)IH-Nq|+{AAG8AzHc6x6p?CcS78?{CQy-Ot1`c};IWxw0$aM{eN1mESh}+>JoQ-kK(Vk&RqL~{O&$M6&P?o~q=%9oN;bl+H9 +$$N32!!o65dnlWxDg+v){yLKFEHt4rVo7ul^nw2irFL_91U_m`0oFW?mXAO@AK(gPP38d;IICl}k-4T +S4Z7S+Fk!9<0`2gedn$=bhGLhMQ~zU88ph~12-SpYqAJf9E<|omZHJjKdp-#$D2C$!INX_mgI^8NdJ{5_$tg8ma +_@vw;zh1YrZk`=F!^0R;neixYh2>qiKHHued$MD7>|2o;UCG>MHz!n%RVE=*@5DVg4ftYV1k7Wl9HO2 +`qmo+c!Jc4cm4Z*nhabZu-kY-wUIUv+e8Y;!Jfd6iaeZ`(Ey{_bCKP*GIM6gA0;VKbHiTUul7(5* +mI?1LK!v~;%F$fQ70vE8EoeRrg6OMYoHA&4yA-NWO(Jjbcg3&`_n;~Il`4suaz<3LQTt{R7V_)eje57 +J7lQfQPcbcuN-9U4*D!C=Z5Ze63@n7`F!Q{gQwwbEMFS^j{k)F!iXwb669a=G(r&a8(6pr;kB7FCAMA +ZEp@3Kyu{Eq#EnP~ucHmCLU^p@`L5D#w-!ADxjXoHpzBbzokz`!=t%!h8#6qdRi-3B0R>n`*PLptOT +lS*jVZI_%UT{@A?y`QqZ7UZc?{0Xx@CRl)=bq!7()?qIS8H%D5k^pX-{T?Vfe%usQ5NhB>STO$x^4Ry +OWAvBiv{BS!uzx;_~DxC#XR2{smr<+m%>kO^flsqfuq)4W3))Y~d!7by{-vr4WiyJUP!fNUT!eR+pc_ +&$ea2bX$cIQmVvywFovW?QPz+x_xv{aZHrj214pe;m=8}smGvt8-sD@s2;h$?;-eGHL{o+SWJpk7y$y +kRM=m{fSpI_Km}8A@&H(?I>9tP`rhIA5i^+D?Ys)INcK5fozC##OpGG*PrYJ)LdtTs?gLeA3Kp_9+BO +o7r<|ZG%@AKmM}C>Nwl{A8+{))}r}_$8A>)kAO{t!Sf*YaHlGjoEs54P=nIH;rCQ;O~XxCROA`#cUxS +_!nIM1qUa@kh0tArt+9|)rnS*Eok*e`4!qt!3Z#-w3g=1d9@my)E{NHvL@H?=S0hrrY6GsREAoORg;o +!Q!wJ$JXF)t5NgNQY22m7fecf|2aJx~`xHgFnsUKx1RBhx;Dp7e1-tN4T_q06ugyg(IVq0as=7P`2aF +isDf#0;GkQ_weOB_wLW&)ucM9Gj|pQEoyYccl1JGj0EF9=A#Z+I@i!*VXE0}G+Jo9X=Ig3&|+-j$82a +MZ68V*hLt@&HD18WkMYJde3Q({SkPIO)~+2OplCv-V066wd{!GZZDqs+5LeP_4NLpV|)b*7nz};3tK%m3 +|(>8#VUw`Idm#&!sI=vM1V@`V-iYo=0f}c@Q#C_Ry7J=U=W-?bvx;vg1X1#R1TD# +_+oW=K@a=@anH5$*69S!=+_I@I4HKb=gN8OWLsiws5X0XzQWxR+I!LV9V?xNsVS{`=HQKZ5GlNdd!?5 +Nnf=MLpNYijI_OQ18@;6dlZ9YPrwblvqIXYrbd4#90YW^E-N@o;c(>sQDmQ|tm?HA!>#kaR#xdVl!Vy +w96NYa+XJ_|I{?)1AK4I*x%hYPzhk2g*3w0bt`&7YVav;i|+Pw8Jf~TI{W}hendd|r13T^QrE0HfJ8>NI4tHY)xEpuTcl6ud?*GDd=W4%s2#V+AHh7-G`us-&mkE9Ph~(@;Q +v{e`@;qy5DqoBlE7_<0i1&=b{jYbpL)JYwd8ng(Kz8OBV6b@vYzXLa@Nm}C@WJ-coAk4GxaDKbNbf|g +3$B=wY_7xc!-o(obFkbCEMzjkFn*tx@v2anMpEB$xJE_9iE;4eStjieS +ri?xw`kg?boj?Mg)LBAP@)y0?0*{u6w`zwkV4-3xE5q7p*sGR`k4ip2lSn{#O5f-V36eD38+Qd9O?&K +Mlg);;0BSFU}u5YRcqA7A4C^kIvq|>iwzrE=@x9xBBZpANAD#9w%iSANVUT^L$nC@wXMU!n{+Mp275@ +ME!qLRuzWc`gt!4H?il3LGLyyR=v;v`s&rI(-)7Q*VRVJjTcA3f#zwGMoGanpV!EqLF&ruYN-N0&9cx +h;`@WTodebPC@6ET=~E5rJ^kick4p3!&Q!I9x9rw=;AaO(cpFDacn~H^v}NUzM>Dw=Y=q+HLHn4fZa)!HJ=!o&}snRa|HQT(ULO_&u2s!*6kzN +4LYHKyTPiMot~@3EA9%7HL`*2YI+w^C3=?9Sj6fC6O>`M&ilriK#Zc+b9K4N@vwSS9LGb;vh^HJ8EuA +zv#VA>ju(AZxO|z(#X6By)>hIyfk`oY@Et{zhRzoYiv(>IrIFM2^5=6X133gzXdS` +Ri^>W6vNTU{tCece|6;@MWl9>7ALuES!b>kQ-EXnCi`cBpjC50_;-INFqV#MwJvCaGTGdQblCn?E~r* +43spd)+O4hK|q-epmzAR((|qFvCy&H5wf;NN&=l}{e|h=ShqEUy)Q+>T7Bb?0?x}^dX1&oP-HvA8PuJ^EZX2l!|J1O4aG-f_X}k638?{&aBMnpqcQrzL +$!Z>a2Jw15lkXI#~KOn9rYS?RGRT@x@_XAj`HolhogU)PbdDP>c7v4j +y#RFtq>FVE6r8RB$3so#KZO^UEUf5Cc&g6WT3TlJ*L6K`>qCtH8LX2{X&Tz%iaHznTF= +GZL_L(;z{3Xc0kwTqMcq!C-X_Ba|v~KPoOH-k;8raiQDA$p&d06e17EzY#Ag8DH%1$@CR +iyn&dbUeRNyb-6dg~tYEK8FxE%WUvWOJhjV4MG<1yL)H8K!&(V_Vy(gtNoJFv9CS{g42`+BI5M>3m1=+*RHww^|+ZJ;Ne;RsDF^NRPsVO;y|l_2;{XaG?)ysx +9<3`y&`g)tVP2UffpQyR3`%yu7En9p2Um(`2BJ3w*B$Ozv%=mE4QoX{sZkr4CCL|Fm0-wT^y8-L_VnO +4I6ODG+nsQ*(1A&)D3PMiCpSJl?5YZE1Ua+NO&%JqW!lwvM1WrY#RcwFOMmUPVlHr{cJ6aeMW(rTe;` +xoq2m`{Np`2lUGxFE2@?M32)b4r<=MA~b&oRdas&sFoT6TuEwzYRKPlNlvvr%2e_Ll3NNVDYCZQi75kfvYZ_U +iUXVd`e}@nCqT{fO##zOJ;lP6HiL6vn~h +6l*c>2Ur1@-vF_a8BHM^LO&$hjIKM?QJSo&X@yPW;4W+O{)|4yr+YS=F3uW0Y#?d;suC@bz)hN1pz+vKW{q)<&$4ZLbcXgF4thGf^ +8(AuV*EVOA|J2=>5OZN5AR9&Q3%Iq1zI-BC&?%#s$ZG8J^%2szYRVz%hD!cl<&py|B(=O}V>?!eNZ24 +B{OP)Hy_&SdE%4k17)uLQSS9TbYZA)?Gp;h6P-Nq8K-`mtyrF%yD^)+qF5YhuIb<0k${B$VX%N1FWF +*zs31*Jj9VU-#V6b=o#`&w%%O7v1`rRdY*)4^Z50l}1Omap`B#rodlc$8S|+E5B+os0HI7_LATMsWHr +SU9zp159DsrC@}7e-WVSgnHR-6H15drzie>52B-AD=y`FR-s%`-VjP)PXGw_1us|Ma#KNO&KX&%ym!_ +qyxp&x(z@t{nCa1kYXNU|)o3~GbwRjA(6LWke-(!bJo64bm{>1z}EOlc9_g@Lx#|MlpR7HY*&j%zga@ +alhy&9~otb9;OH;&${R&6eK`rqk&+cNM-p0`iL04(j7?-YSCXKW{JEGWpHYU0~Sn_rKBDhVV{JldD~v +RQQ&78yi2qy{K6+eWfBvzJrwt|IK49r`%6BYR)#=sD-u2(l246tk~1PRkb~ZDF0TA@Ym_`li7iZ3)-A@e5_>c2 +l^O#h{aPp6#Y^>jBVfwWRDJDYEElPe&C^n(Pr*v8Su$<7d@?=W11my!h)!I|#Bc-_zfRm?bX@_h^oCr +z3x#sqpe>pMK2MPGvvEel3|VbDdGRhbT_{t2+03H=PcO?55bGb83@N>@({Rvi-hNfN)P^e!5406~Qt~ +%gsKj_1fDf!eAdhER>78M+JjuPmhA=W)H!h9tV5WC0x(LJv~`OVI1W9X38R3mf0S4TBPaTG1NAG4~5= +2J%D5{%d5d2{BRF`vF%{>jbW7?JdKea>1KyXT7;A3lo +c0)?J@_Jg&U-sJh_jB~2ym4$vfm>5WObscvQIvW4egJy+YuUR0Rdk=i*3v*(X@@v1r6)1CF6)vG#R*+ +Y^?YAbTLn<(D1qF0{%9*Qcz?;qe3D_NKOD2hExVdCvER!RB*bCaa??A=GzY%>3DPk-N?e`$|Zljdo_Pb$)UR(aqevI&Y?Wx&~>>$}=PRl*& +cDv7`x?8(7a?9qc@}qU(bESgItlGeR(C;xk)T#deWeZq!q-N$)sl-2^JO7_;zpD;;8Ft`s%kf(6HIjWoTk!%R|Y^-n=IAQz?SAi^Ro^8d9klEaWq>0{Z{ +|o;^JttQT;5FsHkF08t_2@K39O2st)nh)~)5a0e-50%y&zz&67>6VN4rDi$$p{Vwxy-L5GA5=w%CPD8 +pbGw!P4Qb1&53gjwRnYDbxtnHsz{EvF)GkRMy*#}?U?RDO~TxfLl_ +eb@2i_5$qQXMZcFUc#%`C9-l4bY-Ct+fEr-j(W37%T0}qB~7g|9)Hl7Bsq^I82txt{OUB)kO_6wD;BX +FL_OL|DpZ?Y`)R&@wDhq%`f1KXl<~U)!z-SZo8f^8ejiDseiXL(K^x|l2U=t(>IPQ!Um|6AUvsn4Yhu +sBg|HzzPzOg>)&tc--5=-u>L6|Sc7h(pcYL1^M~rEp~$Zqou!KMtCuy*sx7|~L;{(np2n_5EZ*Zb +yIgV(bUW2Aq{(b-fUb7C{ofL;7FD4}uzT9~0#9$lc{ +m`Q`0PXB&e|88mYQFXdlR41#=&-e9DLlFewO;kAnHA!%4ejA#o@K=RevGSTk|GcbzwiIQy&}*_vNA)q&Wzo?n#J&F6BofDb6&EZJ1Jf;^yPx7mlbnXhyTESIbx4=7o?*rI3+dPv#Y3FD%b3%0Z5I{vl_cvt20Noo@S +w@PUTnak)2$YrYEd&<>@HQ=(5L!w#pmtsP5}jzMZRs%YM+`SMkubbdM=d7c7+ZiUu|KYK27r +Hy*O3o=-Kn$wXW!yPQ{|ZxS$+PZIHoki?%wM0FUFSqVr= +d&WxwBl+5YMoaQ3*`<5X7hTvd`4+Rxsxb8A8jtr@I>3GI(+!{7c`(d%SI(~OtTAKgdd!uArzX;cim%eG=T(nm$h01++w5n-nNT1e&vKq9*vl^PeM&_?W +^Vit?HF^9#LweM?R&L5r2Rf65^Y!fRILrhY}P?WS*RijK%+;&sy1JH8xVM9Q2 +Fdk;*~|ZiM{*B&+F)bT0+TM-$X(9btT%2CQ&5NkGWQUL4Ke3Aa0NTB(>^QLNsa=msu28MC&pxqD{5%J +`SQ>TR##-tKYIrefLb1(0y2i{#E^_;?q<0qMlV|RiOr0ZKP>ns^fsJfbw##HaZ|PM}wANh!5@8r%8N| +LiN4PhZHfPY8HYjUZ3H9O`FXz^!6gUcZ<|7Y0T>>{4h36NJvyAhrv?YHVySb^@}=t)PINllb5~T+2@b%d!NolGO-mBgZ=a+AKZ{ENEYt!U#Xqr51nmp_EPTzn2Zda4X!%^Rq8`tHAlb)*h0VSzY(h>6 +ZTeZ1+#J@oHNeOf~KAQ2j|OtLdQ8Lp8KoNUgw}YB)GD#o8I8MEvpm^_$)0hDHabqo&-;rnyGp+{Ff_S +UX!z+vawbL+{$zqS*cJvr@NKD+j2$nIHqj+1Wd#`JdjjG-k3+n;9}tY@EFX&Cv)dJ8kC1sp?s61uoAo +PHP1@K0HQU^(+`@mM%Y@oSs#j^E4Qt&UP9Moc6^r3C56gI|*RZD#<-)7EHlHI}1h@3p?h(bjKVZfwgn +s%-Oll3>Y0vdZz5FrtI;S`SVj<`t4Tf&tS>meLKtg97@H|udni^d82Ys`fI`N~-Z>S}3)` +i};6&w!w2D-><=x4Qi9|YsR*_53uGqs{Owe%%))&cA2dRzTy3dYx-pMh`CCqV-pdSkOAJV}>n0&1|5Z +We;e(Xl~oHu3$dGN}?E+A8}KFrc@#4Yy+foOPhNFJy5z^?}NxrKx^624_VS2d$7s5<2UE%Q{nE!44TV +vw`2Ky<#4F`O367m;jgE7}14C1ilT8Oh2;FDwz65V_>o*E#o-KTjXHq16j~08`b*GRwC5 +a8M&!Ju}TjEGos&_VUSIi>rHrV7(O&R>z8k+heIQfm+wFPRLj+yGHliX(v;I$HvwW}nhS;mjS4S5jTY +5MJ&H*EZP+~=gG_C5?@5Lxknqy?GS+e*h%ks+1v!$?Sr=^PxUS?F@HB~%0t0KN+{+*>P{4#QUh3-OW> +oLysHjT4J#EX}&C&ECb9HMK8O`uOtGJ9qQ;T9~I+eJ$QBvl>P9*k2%*e4sRtLktqEVgbd>d5<{zY15P +1Z;Zp$v&sk(F6|e_Fj_`yVQ_>4zzG2;HH3gbO=PU%*v3)3Rdf-9K_**5Y8SAF&)f| +Q^SLWLV>e1D1B6lHK00n472@WGnVXSmgYwC9_)!G`@)Z@CPOa;rTO5E*pdBXGVVV{C@@)SBWU5M+!&9zw?bBZ9KA1+{H#Q6f@{t#Vm>FFq +kRVt(i#z?4+Bcj_e2^WlVT<1h#ugs+W5@V_0{ORR*t0-s3MDV%_zPfR*3t1%3xoh4-sRBNrgV}g8RFb(^A38{g_n|Gu&l{_PfsJ +BD+!4Ny(-OZ5l~1m66oA6ghGPfrx|woR+ +f3Iw+GCABMKm9hSvy?bq-heplMF5lF%8Z%OXW*r#swx9LFhFCpkCVVz7fSA~8Qe4W?yy@pvlk +09wa$2ZXF+EjaDDWIRSFof!5a(#-xT+s^yR`&%E)GBl*fy?AW`$uN#=n}YzhZxxw8%!(|)$eBY0zK@i +bFWSbXnD!g;MyzQ~Y}Q5?;)s9ZzW(HQSn;BKGg(HadI{XF9}-Dva~c7}6?%{oB+xHEj-KI(09t@Oo7E +Sjc)SFAKuY|-6__c5WjbvV5 +YS^Fgb0&X#>opC@NWcSwfZy<1#$pD>0KcZ4nnDbRK=58|fSTAFM8iCjhejf=?XfcQeZ7QZZ3gglN9f? +QdVDUE&d+4*LSKY%^M}FQB6(HDu~o~FMbi9ZCW1G#2t*4Dc6vx8;`*Rp;@L0d4>TsCPIVj*0)Y_rU8I?8H!?4$) +`t+BFtGy1a;IKa#bqGYPr9VLpVs%Cs;@q}Bhmdv3YoM`M=d8GJ&dv+oK@NtHQhCMtGy&YKr3;45Y~Ww +SbR8W6PKsmL`-^RVjZXfh(^WJ4f9cquF;HQ~{F{FLMfS_E^;Z$+H1+&dta?T#{_1TuBxR#`f0c{WXaW +TF8sv7b%>e(k(`%y>f9>?zv~nT1HNw59*64r3&zbx!L$rt?UwG?zK;4`Jk(gES2)SApUiIB)b}QhrUT +}~HfvXGYv%`70utbT*S(Je4-M7AY@?HIbAh35VNaQxO-@(ylYJgq7K|40wIF-^=FT?5)t`PspkzC4dCa|1R^xC$k5I2~_S=dF~l@fZmj)XIVs@$=@v5j|y?~a(rMKE +E44to?)Z1LTJq*$URauL7`be0)RRGs4NFqu<9;Ib3oQTQAfC7iqt=Fm#%LSvP`pzVa|*;^cIOmXn=mX +`)ISKg|Hq+E-gKp)|@w_&Udw%7_A8N9Xh34T*`t|pGpu*H1a5vrM4Z^hmkB}y!^hV6G^F*iMbCs%6>* +gLtBB0BL-uB15ddB@^16YO2M^z_9$m)Nl5X{jz(k$?37qGTV9j&$s%%Zo5@Z+vN=S(DiYhBW70c#FNA +xnA+k9%-X~@6zv7V^@YFSon8oQlZpxPfXu=L_nKN?BL$vz{CrEf;!GDhm4k|d6R%}JHqf2BI`sNr;L= +gyl5-ND|~iHxXy?zx=6{u(V$D=iivdC*s3GjC}osn+9hxXO19NzElxb_TcQD-np|Ol4w2 +Ipf-`PWNN;FoWwK?Vp>j@z7RDOCzJ>1i1IHGDHDeu2Zt)GAl-4+~GVZb^p4U}uw^31EONa797Ak8?c@ +xKd2Uha$b%&!R?DlpTa)lqm8y$e?Oluyq`oO89DD!P3tSLdi!UCOlMU$b +dYUye<|Ok%b=vRsvI$)#oJJu_h8tekX0Ouwo2dE8T!Bu99TKra|g=}p=-EZ6d?k_%{6%?4UN?XH}71|&`2i^g0hr1h~w;coHs~da=wfLzdz$BEB00IDV&O9(f1rqB{0I +N*j&A*a4JK|6*G4AeK3zb1krF}{oZz0z#s)x0}DFqfJOZD&<9*OWkxEH>-%-&XMFN!7V-BTpVzn@?>A +wxJqOJ1kXZyqt>42$BSZ9kM+rQj;_92}RhN$?bk+g0#*8I&<^WT;)R`+pyRA +Dl5fk#0HN3o+3q81wa!PBWdt1w4?DV?o-&=0Fp+RqS~Tpw8f%&2~_)y$~&2hK+{-TFX4qpNzCL}`e3b +2IbwyESUl5^j{)qeB|-EBt4pg&&{@^ErUl!h7V|D0|hl@eb>IuD&{2B`BBwzx`mL`fRM5u^nOPuvxQ%Z8hZqSX+5hOUVdVAkJBs&Cv2p%*_PW_7g#?;)U~-p +>3I9=qp638_3SpnYMGQ8Krhb&0WklUR%FXhaO3?WL8i3xylx_3M<~D&V^T8(iym63Cv3>f;XKP?#l|l +>5gsY=9&M5g*(#VL;u!|IN@^Kg6jT|8dv7+h($|VO|BIQRGkteS5TO@YSI&|WNsHJMyqt$m{MR6$*Z%aPpM`6UEB +>HV{>ri-#&Fe>3s2n3CLYxGq5GSTz8HcA~?A_xk$#h}5{^^apYcU0a!NyX3djIN@5oQ=ZS+>)d>rbsK +sTNL9OG}8b&nL?ghCuMi?wD#KZcL{?*^7!%|4%Em!tKfptq69V+EoNQ4OT^A=Z@k6)u(7l=}9=Hs#31 +%YYlqsbb +ndVY95B+6ZgIN|jlg@uRtovUlP(-sJ)YHj%yiCj9Dh<+&F8PguH#2rYl&OB)Qe_wF{zlE4w+h2Tt`mv +7#GeAjG3LIIq0p!y=MnJP%LyA);!UAq+1-VDa2*Nkid2sYX{@V&Im4KFXA^&g~MqvJt-eSimhuosgFQN1X|}*CnXj#(9Q55dBbF|6y>H9!bG8J&F+Q^pro<h807UFx`06{37sb^;R_nnc3Y;L5CO+!BjpB{&0Kj@dcA!Nh& +4>n_{sl%92!5=z|nX&)TuFvSok5GSP4gT0^#8}85JB^sJ{D~iFz&*pCIF}jsJ%195g=zXHUi|_Iopr! +ctP{YgYSY!9Y$2HW^^@IS90mN;>8}~QpUhO%jT@!>nH@RIgP-NL5$E7POBW3eF<a9 +ME5>5mVLP0%#M`cV10{aBc<8*^d!dM0r3K!WCkD*ZZ5Fup+ +HFZp}QIau0LB7t3|A9n!9_l)_P;;QB7Rm?8vrvd#VV!SK#J6vu7C;3SY6(&xFP{4}^vf@_p&8+P$dixjphU-VqY26Z!q9AtE%C4s@irc9mOMoNy$!h)7^zJJjlf +2*dWA`Yp8&GS(mN*`8o@8ZpmMzVgTTK>Z~hRpV~$~J8tMKI0PfdLfoM20g0Z7BTO@XPd}d2vY=5|vN5?1r4>IU~fwM +q`P9C1TV(GwG1D_tfA*pwOXhV&DY};ta0K)N~!o&AfV52|XW6gzLGbd8lte8{0d@o@XBN#)@QLJ@Q>Y3-tFirX;6J{!@BxxJj4xjc`SKG_5uQfUPI$l*8?MJR}f-Mm7i0cj;}Flx+(w)q|wP>qt +Q4SnVzzoxc4TnW=C3hz!xQ=(}c`DhP6WH+pb_&*upxd8^bRXcqxd`Nuv|{4Grl5(^SV&sOXr85;F%W$Tg3z217$X9Wwk7@BzU`1g +CmZ-_$=wHr%|~AOA^DS}Xwyd|gI2m+xHo*WrcZINrf)?r8iMTBy(giS_-kn~Uj^N=84 +gU!EA;V+9Ck)R3CqD1q0NiJ=$-o&;xSBVg0iQBF0G!!*Qv%NHf2M8)45w~+45x1S45w}}Ki>m9U@*En +;cC7II}?`9_h4tj;`x3B_?+Qj6Q=F)QH +vYhS=er-C!6-EWR7CITY*=o1ow7hi!RZah}~M*Qs_Yk?B!GXB}|IKgKl9!*yiZMR;qz#reyLO?Le9wC +V0I48qP2dm9a3wgoG;$Pg!I4+To&eqp_cDH1g8EHnwm-iHgf^PEO5NC>04en;wk=$HYGH=`lAD8Y9JA +|g6r=QI&s)x&9 ++zz%pOX_wG-364Dwun>K6Ye!C=_1VbkCRHknv;HNwt59Z2LIJ%NJtS8mkD3})koyN6b=1m`4v$AhO%> +(^4jcApUUjm}LOHgf@UO1y(wWSnn+;DpalsvZ%2X9b1~X)W~dfPe-g#*33+1;?s@lqC%&atOL0c@9ZO +%Ru!2Da*LlQ)8gL@J0MG+|VWckl;BcTtIEaLP`^fz|Cs-7aV24J39)h)=yq0iCejTP8h-KCs)QIIp(% +;xayHomb|Wd*1B3sO*oPWqz1q@^!4qN@OqPlzEhYLHZOg*NEKFuBV<7Vu9KdmeML7 +%}0OCa?#uwz6EU?@w7Uh54k*9!$WylF-ehe!16ZeVwJKp5&49;yt~WXZ9nczE3{2%GRcqMZsf>%#a2W +JIe1+wTG^iztUyO_BK+*xnS1tUMSqdZR|eUHSMyU6(UQG(H&uT5TtS3OuzpIn7wj +iQaazYR#0|s`U1{29pNGcmEj7S#%UqK6^I#VjTbT4p+^VWgZ7=C|W| +^+8vABU6+;tAla3l*P1z}SYoXT`@l#jC~WJ?^Ywe;Y1@Ooo74rX3jMT3|01a!SatgwDEP#1xS5qoBOi +KvFi|@%QiwQK%p92{UB6BA5{(Xf?p5JdCN)F+oM6s6@WNjB4~EY2<|?uL{md_!jEMiO4sDky-n3#8n{ +~%h7FrSD^%#DG=h=kW7ra+ +utZ=EXF96`miiVChTe=Lj4rIR%>=GQ++d33^ljrbG6LW+gJT-nEA0*>!;c*xfauWu{?qvcG@S_qyE;* +~-Q`9$HJU(@~*AQ4HLX2abk^b3zKRneQYA +)fSh*~5jWp9Nb=C!6fzf-SC@unT1_P~8ME;Kd@sgA$85m|QFboC?GOfhKH&jH+Z4X3!VExA4X91{Qnd +F9!gND$v`wNQ~x>u_IU{X}jk4>DJw%V?rR;H1nKqk}HIXp$_pdh6W>d4nF5%qaQP%_#b@QMdtZ~VXaP +c3p#UxjqM#^3RQ^1hTNCXnG-xlEn|V005KJaV<6^?7!pH=0zqv|7%^%&4JCBu1XC?X0znLkz8zADV@8 +arZ=OI(%-I2t>4SA# +rKFWpC{5QXI43D)N#825410S#RbZ#gh;*K7YvwLOO`iAOq?Vi%6_qRXS8#fKw27|LbrL2wwD +_;*0Ta6+05-V#dEQAZ_Ay-)WnD*#Q7{{*LF(I}wkcHQ=`%@AXP9W +L*6_=<$pA8@+Kc7zvC;<~4ZO1j +0+)f0Ys0wI7R!ryzJQaD4hDlP5U0FHgeh}I9a7``cpfBA;V$TOXV*dVpvAGiuzD$cb7IeTvgnh(M1hP +o`UsE4n^q`o;D`wv8=vW+n}DjAbSN4|h-TiQ$*;?3X>GDZZ;F*#K&)&Ns)mAJu$>$`B*r-gK-}7~Lux +*ELpcg_OmL1JBGo9iV}}C^gV+t;O;afDnq>kMl4FNlD!1b_V@8U2%!D!FHJu|0VQL&Bc~w(LE_NiU6a +g71v6Yeq-CS(>x>sy_7cihpSJO+1TSC@4*5aBm3SPQqiiX2z<6cj^n#XjT5c(xN7qCbl{y-gKA*9(?W +kVrHgYuzb(Sa!fz;VpkE%=gBEWZYYgS~j2mI(5V<`%;9SD_2ZK{6=4h~-WhEVYnO6c9Zk==B!xwX<0f +%f-;A!qf2y&ha4(e#&bm*W>(@)!4?nzEpL@L~C!8W9lC*d`7xT6AS64n>b5OMT?iYTOPGQsSi^!107e +I#38aDhJ>)*kB8Q$w|s$OK)t`6+wa81=@+A@$W*iLFiQ*`;lMF_+;;3KLl9t{l0g(H)wD)s_C$lZ&S; +V6B`cE?5W+!fcAxeJ8BNO}_HJ?Ru}ebkW@jG*+vWWHSiHr)$}@+6;j}X$hOXz9CzuPT=~%$YX~H;JA3 +_5!RSe?a@N;JU=9P3pU_Q@)go-W8SLGwP+yl#RpqkhKPigJ2Pe7=yOdOg}5i-BXuGC<9zT%MKNIFESW +n5-~bT2(Z$;?Bv-96kmwp;~qxM3mJoNPG6=2OQVE9f2Gut6+R06BGJNMJmGjx=};4)N%Pz|hWYLQpcE +9fWX!aT-=5rPVx?NOFyFgsE@D!61xrg>3Efw~#$}A8X!;7`wZc+52cZ^zt$b1M5{JGs)MsmxJM0K?n# +bRUbB~2Lw^r3OMUR>9wU1K|4>{C>YN@1cVeqO}?h$BMF^#!JH?J07V7Ib4R%ET_Nbzv15rSA$$lW_UZ +D{9AI2=r<164vT=X;aGeH}UO6N+>MWB`h>feFj`>En^P+vmsOlXm!t=s#JlCZ*TXZWJ_q*1m8=k!89D +rZMrgCZT}iV55t{CLQOM$vodQ +7QfH1Sr@qL>wt-US>8g6OLrpzi*JJxz5F)l1PE~x^hm(vRZyD)zTJo6Wb+Qqm*yS(Qm_Yt2}PtCEQNf +QG{p&&Mo@%Q6mY+`n}jkE*6Ny-yNk|+`kWmcPzjkqYu6_;R}Uq^^(D>3Ue}DRPDJ9H)ez;1AsIN~v@i ++2-c?m6J*-2K??4Ja8?$3cMr=XQ%mo&CBxEH;q6ZnK6>Z);+}}#Dr9c)*64B9`Pf%DEgar~(2dY8@FF +-6#O33_+lMhQ?GRRML@yZM_k~4(Y0~1G>)DuWoc1B1P*X~+H4A5r08w%`Da56Va(#x~B7@P3Rv +kc~g6{_0t*dwn|j3@qSv2s2I$n}leh-F%AKM+`c5F +!emK+{#LeEe6oBiGYk`k&0Ij~Pjel#{CF_k_8yJkyg4&qHpphSsj1*MhU8xe7B! +jKF9^0qT2~+Ux_K_qGtdfLgm@UckBs+?ZCb%Nzu!0^D3W~f2*PG%p6#pj4Psf*qkt2fX>X`%Zr$W%V)R+;N@JFJib +@OZ*Zll-GnG4JsJDf14xJ5D<9GT6!Ta8}fL>vKZc1%8%DwCiwks|?|b)b~`XrO$vc_`p?HbV>~XU@hsA&dF +l$`UFt|vah;4!@GqUl>hS_vtF%Swp-2xwfQzky|1P$ +Wawyvh}YxhO4>&{#<61kQGi}nAy!>*a)*QHm4nf|sVJ$D)~R!nIs*JiH#y8!WHAPZocDDY#3%p@q2_b +29nGk6HF%yTya%H;hC!$c-7MHt)49}*po>TuwIkm6I}V;}-tTBHwIXPuiABcM22aLQo17cpcwz4A3?I +Nz6`ipEF-{D+wFp+HuR!Z#G$wcAGu@D?!*8P6a%3A*}ReXoaPe;8MJ2I%P12;2BQuoE|fr(+#G +`OHqbKrW~V?*$xfhD&&?^W~^U67s4<-phH-sSm!=%X$}G99nCR;d0E8vRi5O+Ld%0(f{I0S0R-Rt9#b +{E@tP2r*`$ujjn@~#2vxwTLuK9_HM(@p2=n?au-+bdtmPqIu2L0|}`lPfS1s +2!oreARw_A|TML1B;gQJRH&#D)<73p+MX?5qyqEP?2Hj5rR?{Mhw1o!|9FQkiqmBrar;x8Lfc9bO&%j +a7xoe=BR?p1?rG6@^LH3Var|ie65CRmsYO5d<9E^eOSJ>AEgBsTXbU`VcR)kINd_`2udL}pTTt5+?O{ +*@^n$K%A#0v$nXsT=o4Ls4CZJ*#-igcpv=Y#z|#bWQ8hw5Ld7`O@j-sgAK1dhunJBm93!jW{Nd0ce2o +fD#SZOaA{%BQ;LtqWO05tg8)RXlXr9P&#Ghb*vQFUHR|sy%Dq}T7wmsyS{Zk=x@E^)DDq0`3+bBUH}eVDl)H1OR+zL+@auOn1HeER)+3S35^*Nl+&jO%yt$DFfyTP! +eA~ymcN|qnVPu|{L~!!c#714a<)U!>!79ODjk|VtiVs@g?rQ{n +O(_sf@pqF*qQ29sE&a~n#4#f~hZ6x~MOqpoI)@XUz>33(i9l^}NEK>}-&q1WAT_~uazYD!xf#?dKA$p +d<^Z-Y9uFBda{xyTY{amc1Bl^gC@1L=Sj?o55n|+NusEUbh{0lx9TH|mr}0PrRA9Ifu1(%eB}LlE8Os +vl8S68gIOdwfjP*&etlUJ2;Q4iAqpsajw&&%%gS&RKF6JcG$9V_;>MO&CFok|-c{Hi +SvU_5`!xOB^+UMSOXy0?urxT6C5W{Rrz?;UVJ@x+T9`53sc@9s?mZx(Ln)|IVlsU$ySz5D?H1ZjE`U`u{9&EA +H9V#>aa6RFb_{o9r~EtscSJr23*(A}cg#d?U7DwJ43M$AS|8^M6!1wTxIr@M-56Ml){V~lX^py+G^ri +3E91&tCR76c*-`9uYt^(t;7goB1SR4H!LRp9;4r-IQcdTQgYt0C!w=0m{%!OJ +r{37h6LxQ{qcTDNg2s=0i1QABy(^rzxOu=Tx2BUzGf-U5y7H$x<&|Vbuk)Ja?!WqPMDVjRj1r$kL*w%OCSyuVkq(Uao=lphN2KPVWWdBDvpB*oJC@bVopNJoItFax_!b? +;dE@%f9ErEZTc7xZoJH2~F~K==XUt&pnCb}mC#AJ7=Mqid=$H_avc6;&NCb~2qr_-}Wj-(*AS7IhGaF +LLj)lYgmS3}j_Q}_7aSUIIW1%sF>G;PiHl;8iBo8F=`V5}i;kf=f>srL48>#5J>+~FLJAozsg+tS)@gw5uv_z)j{(2dSq7NPqgqa0BW8 +IWWm4u3ePx*N6aM7(3`P)XlC;J!F7kj;k<3VA^cd;A+t!A3!O*$QwvSA~6 +ufeyE8;+JUo#WQntipy2E;?Ne^a<^f?+a8?q%8y(lnYx0LDolZhC|iGk$I))>K{j^wwlg3oGV-D~5=mUo1jz2&+##`rieB^;m%bomss!^IdyTeA>cl_AJ5ggV#cC+ZA#5?-3qM2HEv8 +d!2a8U^wrKgeToy9xxIEGQ*JHGwqLACBWV>Kld?|AUBy1P_tY;axVE)!iqP4e5XX5qN&3?+mu4x~JsR +os=5t3x2fuwgjG*VNGo>vQi$BKN!{2_$sp0MiD+Xx6=)mPddSwHcdx^L6<#fo2_;t$#))_x$k@q($C$ +#@1-&eMj;}5AVgEhrq^3S}<&81HZ`B7+hNTA|rL!?C>{(k$w4vA9Kb1g)d=P;IL|dMed6Tpc&bGv89F +vc;gIVTAwN&;Da1rI`T9__@yIH$m7<0DXfo#+b_2Xfpzcx>(L|S%&GljxDJ!zr7|6!ufLkx`%~{ft1| +t&entQ4)vME{8U+gK4)ptg9rv4hPhJ8xXz0u%017s2=msZ%jT(uYqe%rjZ0XJb8#gc$MOLs$3+n@R)W +WFU+y0VV&RT6E*sGTAm4QwB4Qz^br-N1o$AB66ftTs1g ++caHBR{k|HSz<`(^h^aGfKf)`I(zo3f9W+l-iiK6N2h9@`LQBMt&IcsgWPG+sbcBJRA8z52mkL*m14H +MS2w`m-m|xiu?F9^$P`2>fUeEAL^}ug9i9%qm*A@hApO0j`F3a4;DrZ=qw3pz+nr}mmX@+xNRj}>$#* +LlLqoZ`SjtL+8FESK94GXz2zmdyvX$Hyvpl;`ZsjtZ{Xn9=RJluZ2Vf+zvX|TK+EQ@zdn2P=+Pz%7tv +kSauE5d(Wf`hdsokTi!|$9J@4K0qNJC2>oC`{$zMc8xXzzGQ$^c?e|x+tip{s*d~L2SbvOHEz`mvYiy;HC7F48>zL2U)qKJe-1Jj|NEpM6^k>+$1{UX+JH?{*a?J ++;f}`DKl1*9k0@Z}7q^fMA+B9wd_OZ(R3D55QaHB6PJT-qc +ZCB*~7f?$B1QY-O00;mj6qrt5)^6wxL;wJ@&;bA=0001RX>c!Jc4cm4Z*nhabZu-kY-wUIXmo9CHE>~ +ab7gWaaCz;0YjfK;vgr5x3XWWRBcHXDWHPh6;}hqeB$Legp2?$P@1x4cm8p~G~ak^NRMVYg3ZoVqBYnH}8v)rr%rP<{&P5`QCbgVuaUxo#fW#5MRbrZtHvW(@J +#}nvk8Kz~`-{FG*KE)!Ouvb@M9!>y7FzT?F#PQ!23zmQVW42=Xfhfi%ahSYL*qi~3gW!sVQJl`|2a_l +)!}@2g|0W<0P#l=@0O2hG+Ukm>1Q@_6Rjorm +#L@sK$9B_<`cxICaOZPQLl>@psYX@eEi*gTq~{xQGIJJBoIWd +vgjgWlMME@EUzV#;dGgj=pmK^Jq*6*1z9viF-5$>4+6WmNZIP*Vu&yfcm?eHL4ZO;A)cV*qSV9B6zC? +Do7_99QT+tct?P|Jz?v6BqdI=#Da>n3vd4rCtJ()#ni{_mV>#73t$ykjj{-UL8qofOMy0A(XIkISp?> +v1t0X21do=b(l{(KA_F?w;d?*COc}2~HDj`ZmjZMG%jH@1xu!!@gBX)QWy>Lv`KmN283eP&U_VK4tNUHm8*jQMC7C3 +csH2t9N=Evs5!#~=+*8t~bLh}(vzb_sKJ)v4Uw{#!B5LLzb*#BqhOH4b0E1WP#&e3{AJGnd=Zv{M$}U3GHw!-1)J +4-BomFaU@R+Slez@cfJ=gwYE5a1Njk9s>j_C(G9GiA%n82KAh5*RX1<$7!xgGOeytuI1rHYqAP1{F+_ +cFGg00blHNox$98#FTN{rUXnQ`d+sjakEH|)s9&jQ4vCZQ1Dm0&m%J{w#zV6p74un!N;9aR8-z&A=PB +PPqXc4;9VQ%P9$NUJJyXrQG*y0k`d@QXD_a^+zZ7bt8T!M?|)K+VzUCd^}eG(rK-b9gA8#vzW)Smj~C +_X?7H59^AFNt@Se*v!$aY4S6W3{Zn0sTGxbX)mS +SKjMNd%CTX=*%8QMsJKO3*(d97wV7r0HgX7>!Qua6$N!h40)zpyhtgcc0Q?;B8myTiqsZ@21&hM?QLP +bs=EI5r9~%0UP*n&|#B>s5}nfvp1#f!Kpq!@4@Z-12QRu{&qEPdB*~-^%RVIvbJ(a?VBJPl8`8-U3JwybhVe47s?1qcDk{7FQ(WX+Wt!r;VBLlUyE+cqgQ#)!jRMlx3ftG +m=NPEX6xLP0u&Yw#9IvYJXujH-9TUuq!p%}p5)oe+9tgtI+K<$h-R0}{itOhW$vM2~T8wj$nS?GA-Ba +>9@_Bg(QS0#r^6DaZw&JXHVQFk5EV~`FC;BCMBy1#FQs#1s*J9g1c3}BeBbZDQ(eH_?hb=&R0d$q~b@ +PGw{%cQK|wm{?EXyu+tgZs|yhXWhRsnI!4YbD`nJsTj&49;mS!7`ra+0U?WVM1WfoF(hU749{-sAuUs +%&%bw-ESM1pecYfG}z~Xm8tHxgB!ZgZrj`22i#aVo}z_5uzpC^QH(7XH?u+ehy`U>z7o@8SkSgX>js +#9T~KFsleR_uUX3ck$_7pH+PxZ7MV?KjmsjuAq$)UV(4?rYHfh>!+zeZhT+Rl#I$kANLAr!kQ6we5 +e`6R>;;E}W{DcJ>Ra7H~*l>AgY9*#2LL16VQ|PW#a=q1c%#z3u%L(LACCWPBNVlf{2ilbzK^6F^11pS +>A`v&SVo5UMK1U@o06)@W1`VJSun~9xBNI^+!ulzlfz%EFzholhKwnU&P$VNeb(qw~7AOhShW3~FvM9 ++7D8X|ZN*ba1%yc6gHYY)hgW!0|quQo1iw=0bssZ7UBxBBjK{~TAj}oMvYzpgk9lU)17KewHfE=wpNy +xW#*zT8;D~uqC(OHQ8WWyB6mFKaEMd?a7L>xn}(u_Z<+<^ph8vH+ysZaPDG(2&4X^^D~Ja;$;e(t~nX +elw?CXNa}JBpyzW)P^f|nc|i-0v5H +b!fo+WYl1mfP#WFUZGIR-<~4UU*gXOXc +k6YWu{qHc9fZfB;1I8iXUc~EScrmav=(3$#S0lKo86Yu@$93^L^cCTUY8)+ulk)J1_A@{xVxY?kZHV{i951bXCaH9m=mps7VxdL~s4vNp9vL=&t;xsd?RvjmR>qGYYR#-+>2(W~ +z2Maqn_LrSKtPUSv1g%BT3ltzB;tWkSF}Tm<>rvy_kxLO)fI!MexOxZuB!uuxDEt;9Ee%8>^F97G+Qb +;M$jIX>VC4X+B`1J22odt(Rua0zw +7N5H5Kv%tszwdW8KRk2(ig2&%p~eevkyi+`NH{^u!4U#RAU$qYDpc~wh7Vu}@boM1#vqz +(>iuy6F9rj&;%$q*&ee2Sh;1u!~PBwR~m(q>_2jxeWQfphx607J7F)Xxu1&xw8hGz!2Tq9^3RfAOQ5< +2jpW&>|fGF{5P_Js`-c2m%Xt~i0HDiBJz7qlW}`0wy0 +Oi%^7W@{ep3ttWbde|QBTZ_mt%vYIg9K|X}eiaE?b=yA#amWGV0S)Nj#RX1QUKVJ?9uCC72IM*;`Iw- +9to*pSBBf~`ivVYDzBglPt8S#z4CN562^=cuI^%-!Lwxe^{QTEObsm0e2TNK{<4vV^2%yB+)l;+XKGt +qY2?BpVwD{aq(GbW=SMtPjV|i2)(CsL&wZcv97Z-Fk1ZHtVXxjj2kdl8@#I7ZPL1;hK=_ET%8#{*0iP +{s8C@z*#y(Iwecv~G810h^J)?R(Rz*h7KJ*}uUz^vt1ngO_l>ni81c%Qvg8Gf3Gc;Zk$t3TAnOYHIhx +uoXo20r%^c_0Uatn7*<3p_u=t&rR}h(<3F{S#Jf6Vx8TVAKeI?YM~Lv=t|Ke(Gx9vh7qBv4w6es|qMb +I`oDVN0p(g5q8Ol@-8cnGXTeUfVMpQMT5faSO^nr9+zlbiwgrJnM-&m+<1&`1-UlxRMQPScXf4NU +l{TvZY_Hmwz;+gxL8p-rJV|{66f3!_t#OAPTZp0LA`XYH2VP{E05!0C4SV&sIUiZ@;%^~A3oqa3jJ>! +o9?{|>0rlZT-KZONvHg#9FGUz>q|)=#PTwUC&y7;NIo%-psWiZI<=sDViXkHLtRchFr&aQe1^LBm0a2 +AJgfSngay08?5ZxQWs!4KFA#KinJvr1gw4Xqdc;q9*-RSly#YgSQrpHLMxl1u5yf01SrsE}lpv?n5pY +yN!jV~6q0*B4s+?VD98s{$NLE%eC?ixV9<0ukbw;W-6?M%iZVv~4eDtV@lX;lO$)iV68IiXUi95J?oI +iOIJo)asKRN6B*)j)%=XCRwmB2w4NtS~;j2xl +YFuWn|2oyQeJotPku%|m8>C@ef^l6WgLd9YdE->lUd_G25VKMGQSnm2_CHR5K9_B1gk~PVDAc$v^7{k +2!ZW-NRXt$3*+k3KOcsWbLPrh(*_I_GYfXB34g*g)tvl8uMTxR;y`0?Q(MnpdT)8i+Hhqai3N-eehO` +oPLEqo(d_%q04kGE)Hv7Vt$W{3t7GadkbGOAX+>?fTS%QWDNgA|5BqvovqS9lY8lA{l#Ui7_sI#Kt06 +otPXJ$^d+`kUT$K{|=@aO%NxniW08nnuM9suY{`5-2W^Aqkt*CG9Bo-O=>=Xf@1Z)X#zRV21wm_|H#z +4_yNS`p!3Bd&nRah}BbXg37cSevWo*|2k(eyrzE|=wKmX#w+%2Et034SyznCIQh;9R4t9$ui{9 +VL<;mEp{Xfhvaz&GUpi9cZUJq4zLBKD~E?wEKno4=tN+Mrd`aCGKc>SuGX2uVqiV;(2sIp$)2;-O4pK +#b*97%gP}-^J7*WY90<`ew`|0f8R1Z|D}%+k;>BF3o^{d*>^^|vUfFbYQVlT*U~QBVBRdz6DwP>wEAR +6KZmmEy==tx?q&p?ysFWE;o==u!MYT-ErWLPcizv>Rj~%awyX%1De);#r4%5ZV@07>xWGEK?Iu+vn|u7ba|it=P1}DNNr;bc;uR +Z6~cO`^$0q@3Oa)afzqK^wOvJ&{iBn?YLU6!mml_D-`rmi4Cy++x12!fqT3cTR3*P%0@^w#V7f@&?JC~My+UzLHW- +hgbLtfU0aUQx;|ji)nKW%*V!JIglCo4O@;CJe;!M57lixf;m>GGae1;~W1;6M`U?+fr(`Nu;p7_cdnCS>tTA7NI8NNiPhZ1CJ{evDI)P^ef8*C{iu5`M=oq*q6|GO5`h*l!WSp6j*myha=~zFgH@ +Ja7h@|3O80-HUDP?2=zF=w6b>4#$Rw6y-sEtwET^Ntm~yTBR0n-D@C_^su@iO(*vO^CgQwMx>0Tp#_Ypj)j%*QaRvD5;;wV|vJn`<^b#eUI*>~Pny +Maz^tIpokZG!9Sl3KaNbmq5lG}OGpJ}Pgi{qLeNqyJUL25u@Bdi`r*C8kS(gIQJve<%jQ9~_xDe33|6yUjpiDg?KP%uOv +1P0Kl^K5sQA$cDX~*~(Pgtu6Z&BZXYE{|3g2p-Yt~{T;KObM4#1Na3N&*A}kIUSUE}@o#{*XIi^ya^b +LA4KAd-D}_Nv?;hf<8R%_>z-&5-Q_?I)^%U(^jqmirwyM~i&zYI6Z5sA2f=f`8-Vs7t9I)Q5j2@UVfo +^f&c-JNme-lKX@%kEDJfu;N%}R;c@!YO@i8bww$Eik-UESCXvFhyYjsz!#$JWAAmCAKj0+ijoBw6$qJ +6HEmCff^Mg-Iea4)gpQ)U>!GmI6k;a_xZ?@ij!bnl)?U+zTlg{~JhhGAKZo$>5o_aFvMAs321kZsh)H +l^Ml4wwPjsJPC!k=d9Cf^d`^dE)U6Fd4L+Vy+z64&>p|xFmrl+?EarSl_r1p>=?~q6;JM~UB9Vkb*+l +_HvzS8c_O8vwd;}#?A|QZ-lr-dsp!$X9@am-A$=Sy=}#en(4rqhsdke-z+ +&SenehS!+6yv(akt#^X!HV5scmRZshIUfj{)_MDuMdj{nYZ*c-tbFCK|I>PF~Dd$hOUiDE~1H!COvI7$Ve45&!fBmK_}%h$mq4}V_kSGC`+* +t!>-;AJH|8y9s>3JF(SXs{sFYI3ON#`^YMmVU_DJ+OWD2xqE9TdNRTDXM+N*$*5+-1hvrMEfv`a?A^h +mn!FFJmDh`$lY#?}HX41m4=wzsM +OUvjW|o4XZdTl^^*l`;=$-yfNMI%-&WK({vDBM@n)G39fSk#vXsD;RDIbPF5)RHov2N-+Gt-pv@cD=JuiH@EK8y(eWlV<$ +Ff^2622IK1bAMys{+_biUuu@CfycT~|NXUlxTxhm`+*Uc4z1y87ub)*zfVvh6}AKI-5jYp4;1@U7*nn?EyOrAjVo14OGS+b7n+nhCKpV-k_k>IH9NZ7IW +hGd2@AqTzqs?$*L^|zVS`Nto+_JK)hDDQ5rAUu@|SCjm^>AIA~kh`zCy^Qm>Ja6F6|Hrs9f~1G>KDK; +D#cKsUA=$jepi74znpK(0zaLc8CQ(yAaN?DH-$NRb>Ud}364Qp|QhG+DnO=PhPWp!MLbL-(7ou5D=qy$Ycafl-%s(i`rRXhaaA~f78-j|DkzIToA`J;J^7Kmt(eM1N&yo=-DfYX8Ac}jv +C7o3#YA`q5GpRl9v^K9{st&%uxk1s#T=B$kI;-ewY?VnA9XCO#CKM0-)x#KxM;P6ap +F3$s!pkP_7%MrbteuhCDJaC_<+13k}x$KW9%48>f%(c^i+yd$CfGQmh+~rxFFj|g~UzJ`0((O!$) +<>(Y{thD-dju2oaf|XT)No!SIVIwT=qBSK+2)Be*`b|TNlu8DAn-HGO_EXX#S}xaU(MNaipMXW0zaEy +6C+UMaaGKd?yF+japt@(#!4f;Q5&1kN##`9j8^W5E^JpLRit3K@WVX4X{Riyg;=`}&A``Q_W)J3gs}h +WDo!E?2G2~fA3rOoz&fRluiQDh+?}%o=IVuad_=A*;)griJWdW$=Y-IGoSsZzP~5b16Xr1pnMcxY=i0 +1<^{E+@u&_oUcwE$~?;FyA_eG7xHK{%UYnzDTiW1`Baj>)dVi08|5nQ!VDmMowM9ZdEO1520=LS>Sb6 +WM{3eG&uN$TuKJM89Rk9t{9Vd-A$x8Z_rlTBinfiwJb-mdne2?9%UOGFfPmye9{zuJ3(NKtxaT%G2$E +9C43Pu9D*y!|q|+O~iqhHTZtpg<8ndTvDL=uLX68pRVARM&M_-)^+y_h1Par^`jcdk;%04rNxtwyX|8 +)1;#LXN2zrslLsYcsqQxFM=(LRYU9c+lq|3_)Y98zGv2}Ae0mRqH!~h^xo~ZZb?$L6&W6@-R)g%5zG3 +tb%=zUkm`$;sR*a+#cPWbqnZ_`T0aN}4HPTTw!@vsgje)SU5%e#1_b1tkQvC82texJF6^7mza~+IHh! +#++O3jq62`3n?$@x(FVWSBF5if=Lt9&ftS-7XqE;sA77bOsyM+O2x749lu1Rk2&GIJie$h#vyt3}-k! +$Jc`?=+aA&#wCSGf$iWJOu<>(R?Rp3N}rj(P$3PHpX*Q3j7i+;ms;6p!v|hU-WiWsb$e4QE-7up@7_` +l2hT&~Dr)JuEI=_V$)|(mOJ@d!^>3&R{WE(hx5|7~Un_IV +wv&!Ef2T$#}vq_l5Khu5Zfw|UklAxjaqV$<0Ua~nY +0)jp*c6F=*F`&pQO6y#(Fo)gnl3Wx(qT}E-`Mvn_;F_&hSsoQY!%i$I(QAz+f8qPMFuR_@cc8Jl0<7$ +SkK|DF&R8MtG~ysdFV;=Fj7s)xaVHT=wB*@V>NaMm4?OF%s0HLDVl{Kvgyo6@eY;v&_1D|sxULbpv=Y +9|Zh4iv8Yiyh+9u?|!_SwrIG;o<35&OkJ8*T*TLhw*mK|pPF%D98Sble%YunMfTCT+crl(eE>$!yQ?) +YFJjsAUby%$U~gnz~p);nRqX{=blppR;1xrx*iTEm&Wk5|`ZQ0{qLzzIy0rgVKDx)iH))8H1k9E|#Fi7qJg4iGP(+->t+L0Mc-!2!1@{?9^a}#1EouMb26_@mvK+W{N%BS|r6}@?6P|+vTRUH8U&vA>7k8C?Axvp|??AvW11MXCqK +WyCaK-bA#w?sdewv3Xe05X04a}C@yH0}D>Yx1wCI(rskjsh~(pVuL$Ae%3zzeSp5)fUR$@glKU;H)QR +`#KAD0`aVt`I#Nzr!pPt%LtSw`vBL;pCe9QkW%$BxK;mrI2_j4K9vaOUf%otBELN-^08QE*80?WEC8t +_Q-jTYpq)i$B_WAwavkgb8CI^k0h1rvCOg&3-e^{d$OTzfIHflJBH-jl7(bD&O0`sDxP$QhW1l9;GGa$9yjdV%d#2hla3=xUIIgp>_ZhQ$&vCmC4x +%`O*+IO{>a|Hg2&64;xgX!cPg88XKYQ|>Lr1CfM1{ZQHfniqbd^*lMK2v{&=xo=&+0jLTrX6~zcQs5f1K$+9o8>u2;y#qQ5nywE5p)6L(0c8mb7}BU$alsC(q4C&T^fwSVT#2Z6@) +WN{?VuPp>P<~MZqGx-*45d)O%IV#G~0GqDTd9GPLq{8UqY*F)M$bD*}lsTvlkrGY~>{Vr&&+{F9~>lR +d@_+nwyLPfHG5u1fr0h4R;3&B)YD^uW7TDd|C48_3pp8=QM`BD{hGR?E +OvheInr!iSgB$Z8ft+pa5T(*mQ~gbRHxiMbWkyo?3YY=?mOBz +rc$7p!8c+GN^5AhMu|6t`A#&mZt~nZQUfDJ=o5#5!QK78omdR|4sXQB3}o+^<^)^(c+hYDr6G8`Ah$X>NL=$OKCT6;3XTEf!h9h9|R?T&XX?k1jHN2F^K4ia3SXk= +JW}eyZ-mrFvY&f=(7>~fcV6}mUCRYjv8fSGhMkMcQq18NnMwQR)aD|7ip{DiAw}l@ccaf{^B!fklE}J +}?qmPr&_)o1vIO@eA?FlEf=9-H{G*^?ZL9{K+ZLquuWx*evL?ycU7whXuf(}={w#M`Wd+gx(d%;IWfv +X&oqzq7<4R?sa ++_0SEzMP7H_9-=HH=tqj(v1Di4AjAo@7(y!iw(R!;wrtT8c`_kUsYoF>X_>~_|9dqJjKG +%N9@!CApy5s0K6lAwE3~Z?SYT9<6$dC=&s|!yOKu*h<5eq%N>^zg=6_d1s#78_Us*?5SvNFwClOOH)t +V}bSw>w)!kMNzY<3BsP?eEAxb|&$)40625Twn!1tbnQHYl8GkK4*O7npISciXMpTi*!YsJ+dF;QFQ +Y9MTEDuzq*f75BNS&}4g^H_Nr(x9Z%eB?Tg#xvvZL+#&?&cJLSH=HPQ%K+DM$xj_-(YBj}y4)^KZE^a +UG4x?Nju*sa}G1nXg(nXLGh86vRjKUvZegES0#UqjTg-&=3f_HFac#pH*v +{B)j$CeB&sia&wD7`7T5_bDCkY^DIh}H2c$OyX;EHq@z|+)#6J?Vn$zbSeX2B}UuZvCg=3AmDg~y6yA +a*ueMM17sD>VudH;e*fAxAtIlKaj^ILt?TaXKO;{(drR3&*6Rcn1a~cxJs5zCLZPl^1Di>{aUH=z1OT ++*Qd^-d1$zG?nZd06u1`A6yL%=sI6}$e%DG?mvU9MOMbZ5=DqchpoKbE>9>-fTB +d1F5mkE1D%G_3>@Iu3KV*!C7AFDQ;xioU^B^uCQh-i%4=IIasZ%Kg3_2!ina*~h&+`Pl<8n`@$e2xQ? +E0Kw^1gVr|7G(nLV&h++s-)mk_3#@W+;tY)A*`s_RJo*MW|+7$8c>4Li%VGzX_yt;6u@u+=!s?suiPL +MlxFt2E2)z(m_-O&W93hikvDPDd)B)vUvmG_dIVAXN>c37Eiuv)#%>j*_`m!l{39YGe3^+#)EHjEm=o +}NY*7?JNJ>D-@?*AJ!3nmR;dyl;}^UB&JnQ7A*gv8ox|uFL1V-Xi>fLCx$LU$TnVQ9e4jC@%RYII{gBE{gy$7L3Hd-NPG@MuF1?`nc;mZ8qhEGLrYQd_2V< +#az?_2ZcDyeo`^2)9oX70lkFdme|E00LGbV-I4D8H49AAaf+gvX3dcJk09)JQj%$aj)px+9f_2f}a=E +=0NRvv9{6_e855dg~qCz3{z}eRU&#Md%ydWLcDDzMhlMAf}nDz_&4rkfvBOHcbmG8FiHpP!Qo=CJN?F +ZkzgqJQjTupD07HrNFbjAa1k4U;NdPS +?gB#U$5+LE7FSLhC!Y?x83uA9WZrhx>X&#l&>AW^g6O99CTuqT$H_4}%W$nz+8K%jyxH8N!M)y!W!^B +2|@xNdL9-d*Uk4m&tbDG$iY$jd{(=~@t1@jxJ;8c*lG7Y +B7BJn}pGv&dPGl^MkIKOuwD78xVnW7EZ33sV6;p#bJw&8Y*D#uapPxAI))A{`vbQw*+CU+pU{jc=~Q{ +V{zMrZr{^B>~LhZWoEZXnpOvHx68LiJ(w*3#VACS+C3G;x^ApJ4|n-z!d4x4E9%XvN&3Ta)4Uy7AFWHx+BSx5gU}wB4Th#_Mc}wWhzb%vij%$9Lc9?VEOutkXyB^!ok-4V3`q;wx9lNDGA^%=tn7JHtRvp9 +7caKnxMSM_I(ewXRqO3f9x*DGdpx{2s4^*A+P^j%=~koMku>cQEz~38#z$5W8wi%~f7f2u*760;1Zy& +mcIU2rJfBSjQww$7W6;wJ=_icZvAKcZlV&!7hxU@q1f4I48Z}oO%3!x}!0EAu!r#mZC%W29H;?8WCx) +!{RJ^ZxJHxJdnyITccJR+}Hm +JXS$a{~wMM+(ufl{2y-P+tPefORAc7I=NtNL%Wx9d|decJZ5_;&{Xw63~42yq9d=n8JHHlFS5L=%8et +*w#&EuUVIO~%%0i4$*4|Kb@^-zCd&XUvP!;6=K|e6e8>WNC1fts*q6T4k-NH=y8`u4_~`M+bX(?d=Bw9D6g$E;E2vd%=@YpPLkEhY4;kbNK2tYxNo{c +rv`clE8ruO$vD-7TNDQ^LZWkd7i_Q!3x&p`d%KoCw_T>s3^YcfzUXB}xjXgLTS~fz+9_^oI}UjSh`&+ +&^o|cj-FuzWqOmKy#;vdSPzJ58Zo8`Ld3lWv5EC-prv7NCfmu;Yy1nvk*sP-M?6#7sn_M?Cxh|cTZZp +g7vh^!${WessFX1>>rDs?TXVHod7l`ca_)Yb7~rc%zDqkdv~e=(prl?ehBu?yG0jS@Zfvm>DK%2-wh>C7($ctu~MDv6_{83UB`0OW#xPFc&zyNs59}!B}m?7n&MsZc->IY +db{F%w-;#6Mo-t4SKy?6J>Wgowr>psYS8N~DAk*KuQ<`(jsMDQtB(h3yLHbaCIm~j$$HAM+8#&xRKDa +XfZuZLnTcXwr_nCa+hDT2k$YRgK)q(FeYSRBfo?24w+;GDma}-4QVd_}utk%1CtFH&9P@@x^Xz8^JA6 +4j8(boTx{PP^C&?z)KP|J8n49Enm;PA|2NQ-jukhH3h@eEo0i*ba{!my&$&v@_PTYSxL*wqyy;sr=jglGKzA#}u?DRrg{2rP}T%9OpNubnjrJ1AMe%| +s29<}F-ECu4=V`aI7As(N~$9|9sm}dn7{q(4r-ek!Q(+9zy`Hmxsr_&{@f_QdCoQQyY&maCMA9_G3s? +{ae(KZqwU@kwWWSfMjPf5-H-v&Nj|vc_Bb>Q@7;3rekbw99wa%<{z*EY8_lRIPt^*3G6< +5L9@*_xyWjodsS1r%)kX28&Ssq3)FcqxHpZp-7bkxUUVWQUOPkifRe1P1W@H_ +2Izv`xf+JVZI2|N>_3KLCLLN9)#l|Iv6Ixg(ly4GneCS1|nLCO!aAUAV&Ib!%_%d!lbY55G*4qeH6nTnUQP(FDxe3}M1+wo=T_}4VrxE)EP!eb2n*CrDJZaSH#n>xvTk9Ru-4W>io+ +q!UU;MO%k$d;tFFc$d8m06SagjbO<=Ie_kb_ISmIoOdn-@XKaQ?!4ZG|JPwt6Uc>+xXZjcrlujjA0Nx +V6@`g_XD5?558|+X_Jn!3lAXL-mO^fLLp#Y;{3%XS>T&e(VAL_3{}V!3wdycQ2EwcJu0NmG0yY-Le(i +(Sf2xoGzOKa-Ty`anYQ?&Z}JA*pf**Bz)EA{$dLB-3w02Y(et +?8<_TL0VJ^DovVAnDQBe=0n4J`l1;)TuphcN7b9LXcogsq9Xv!9x$QGV#`8c3;|4^!DGkO>LMBwesA; +<$j(-AZVpg0 +mebr`-8)~PdNtd0as?2&{iR2HIhaIkRRywP=b6BK@C*fgZ=u39mXns36oy=sfBT8x49jp$>=w*` +Pxq3$l;k4Br@HVtTn8~(~P%b)_5nL-yf;K13?^Cg`Uo?--hgPt7nU<0e`;JMZVj(-dpPyC?{(3TbkTp +@8ISqYvXd=e5sOzI&C{Y=HM~m+ub428H4PB3psoh6`KeQo`YbL*1Tju(MqH@F2kh*0zNH!1 +>s(c+22it$;*l8sCnyI1SGM1pO%&(D2E&=}>;chC+aMSo58&UotXF{7~6-)*w}*jqQh*uu`~ZCi}8$r +9h(Y65CQpx$x*X{Wwckv}MIm&9Tj|IIe#+3%(NPy0Mt}ZYh){%X#_(Pm_TK>)(#1tD))lj%x)mZ{?wKDVN?PUhr +|KCPmj?pNJd~dL}|kkz)l{+LLAl{WvMru$(Y8r&)|tSHg6-Qtdl5eSsz{rDRj6FblshTX%NBqVOKNM3 +=f64}hb(;(yKK`0IlQ59&jS7oid4d7vEw5UdD8KZ*-pgAAod!A;Co6wb|g$3qMUd3cVY-PIcn5W&HaD ++5%`>oh>n!uvd8IRgP`QVum(;~6W5*9XD%{y}i#j+j$F7~c;yZtD1c(asnTI$}(^z>0aA8d)N+<@JIc +4LGL;;i<;i5eBo_c`dSS5lnhS2Ll8y0S9$`v`-_58Vkz1qu`fcH7+~Aen@tG3g3$}d~%M*b~z*G-R0r +-hYBpci&_lrq1sa<4lW^osCSyzpC*haXyn}-3Hn!jWD^Pk8QC +nG#-KLw$mUnU!_iks>O{aElvlDx0h=e566v+~#Y;|Y<`#lE$Nq~eX*}F5l@=%t@gY(9D0MI;7S0o7LW +l`oV2nb(gXc$$nzneZ@;SP=7qI!5)jC*ktVB +K;OyXqa1-qLP6@=3oZa*!16rJN91u8hfA90Y@V|$rXf=ggdRK&(?k?BDQX1klt-5_TQRsdBC|A&8BN| +6Mb2j+2iy`FV0i~PX$W-0HavM4(SkOZ;GGv75dce<`imZ1OPMqFK;wHrJ0d|@@JcH%WGv_-Uh-}=fQg +WzPJ-Xdv|u%tR~ZYDLqVp*^TxlWJn>s>56RcWyYU9o^NTyrH6DiM48&SxJZ8T4#e)G`$pEffZ`eljfh +}mbc^aYvvis%TJidAb*9lywaD4;Uw{X3N>pQsq4A+~R;wJI-#WsU0yvgC6!8N~mJOTVCfd2&Wp8)<7z +<=_3UwkLP#R+h6@&>N&;i7N>jgt_r2ri&8qRagL#^h`w>|ao{$*AfnQC&F~pjc@Q1^R))=ldoW=zVsRhxT%MNM5hyr${HkB(P +1n~h-M2~u%9W~Lh|>p_`$HSsA;}=Tg5F-n#TiN0` +02y-nG|2}6_05iZwT7tC0%7_Bl2=lz&k6#v4y8g_RIPfIK2m7h}fJgi&dq=4)qBXP*^ +{)qUWRGzt%$S+k^(D$x$nur**CvTeu${EJaFSmxpv}RlPr2|dL50JoEeG_HnBNC!ASyHYbzZH_5aXR~ +rg~b>A2u$Y11V2HxyKU(d1VPM`&ZKeDbGlWHDv8)54B-%WYr1V>+MT$#G9AifS)!S&Ad`I2JdZT$ugU +4{uq}Y4vpxK^L&?CsO$pa|OVqBXx7k3i4{d~vWydtjKrX+&GqfxkW@yg_+@{1($c_h(7p(BZY}nSfgH +3R`iUEiOU7?NVtosyj;_PK;81cZ1rSF}24x6+oowX>rRcP^c`1nGcdE^E0m+TRR`*J$D9S)7T12tem{ +HpSR!NU>JPNTqVDtf@SQcccphyiwK=X;%a;ElG%h@p-lg5{jX{14{yBrBmF#gc34G5qIYkp}kT$zuAq +G+`t1r$5#3d5~s>&x@Vk1R*&k`a48C{VQ0?|S~6j0vqIcJek;2lUr6Php7*olO+5EN; +{t^tlXG<1y(VM}2`Rgx&k>RT7CCEx_2_J+VGDA5H%XH>}lfTgzAB->2F7#>XSP~Wd(J{vc9#(%y3=|i +oa{0@fFg1|fwBm}t%7HRUz?4psSVJ0F}5Q>TbrWN?*BP5R)yheVzxVRv)GOihrA2O&RK^wX{mfyC3H~ +d!6jjpQ^(i(xb##Ev62j__6;(V4yn~U@8;;;Ox^W*H|{8-&MmQM%68cE}ECb|(xSG)+6qG=oybRniPs +H>3`l_jGQB9;I8Ngh3Y;fb;v!^mOcRy@BP +K-}XG=O`1rI?lme>t)o}k5p6)UJzxnPB<7K{N|@UVo+T`Is<2~B{ZKbo7$96EeWAqRCl1fsmx*cZP!% +}oq_zn463;#merRLCN;Jbl3YHDgP<<{*fFcUOh8yE_P<4@;J~kVP +2ZWT^q2Pek)bj>Nh{jRRCPexMs6@2ijaq*oOUWw$y|ofGm&FtXrlC|i^onl>71=1%zTr+9Y}uEaxB#k +nCYq^y)&!v##o`Np5+erd;b^J7B`F?o7d_>^fgULuCN10bA}W^=(mt{;04piDDD8 +=ZMk{PnI8xa_XYNZ~A+*q=bc2Cn5qNXtA_W#yP$!;Q~BeZX}Jh($aBj5Qv)Xn`vd7Baa~L0+P +Jz(1O$;tZVx9FWfE5LBue$3Z8o*y-5rsM3y|Ed{L7HI^?cn#k}RZy<_6WJSLfwh0;(W8z;UQ@Gp;Dir +A3Fq4e*38-o1{qm0O7LOszipu3OiycJ|eGRQF98c +Ysa>FHdxWf2z?0zowOs!!g94LW0>FkoyKhKr{g*_HDr!wPvJQoZxL46kPM@u^Vq?tVB_Nh~5S-gC1A3eBC}PQQOfJWZF-ELqetcmGu(z>$3z!M{89Q;=&`B5M +E11(9Ize!0HO8Wd(xXx^IVzQ49F;<-o*F)D5=4_wGFVuoJVXjaeoO<>MdZooAV;TfR7vqP8= +BSD%fYJW=mx`0b`^&bcU@dKV#C$#vmfWo+xJ3{^F}l*kdMRb%3QNv;(01KOpL`!q?R&IWq2HWjfZqgS +9Y@3-K*vxT62cUMB;mg6Vd>$<%7H@6{#mkSw4$fGF1>A@^+a00M%R7bQ+tGI${dxTppog^ydJ9g;(fs +XCk-MwyE?A>I5Rs{dHo5|VbP10iN1Ci$=2SNp9Uzl&iCitowbs$`0Vc$-u$wt-9@Mg` +MyVEsjK%>b49h`h&BDI|88y4cw(1lU)dE?oo>t2j62aJ@Tf;+t(_MJ%+ibB=wq?4K693morVQ{Lahhc +=B}=oa)LKgcow +J$f(-{C{2cnt`gi=^@-0{ohB|QKs~8Pyx!y<@rolxlrxHU@KWe*eqb^#kF&U`{Lm@@74kUSrp8ac<<9 +tLUi}lBJ~7UtE6A6d;NBcPjr;#TdZ^kZTF2XDwUpF82jyTg*_ruS{0QE2X7y1y*6S)=1q}ZYssjDUw?Den;75;c&_0y8e;%lrnd9%VBm*J$|6Nra-Dde^y +J|n2#)P)Ti0p{2h|(kMBQD$XlrH5SOYBM48D9iDjd6*gdGErtgGUR}hk`{Txo4cR&V?=+QUg-aR?=aT +f{Sx4#Msz1ccP{rl>~Tj!XsY-mvf5DUvJX8v%9KDIq$>_Fvt4Wcdf>eGTZ?MWO}+2q&^pOR{`2Q|?gD +BO|z8cf^fNA;5Pq=&lPf_efm$H8EjV>Az!$T^hEsAX&;pUsip)OtQo>QwWSx$4W?_)^P9|A&m~SkmQx +h0Ea3f2f{rLiRdS+q}Gia)!Z(4A3wGxiL6U8X5F>7|!_hSTAW>!buMYe#ST) +9uJ$pku8<5b!8^SJD{&mFY5f%SU?}J?I;>@;g3_!C7wg@lJA7}e?97*(21utSiX8k4M7LF>hKwe>9I% +^A%i05J?Za=r?=!a&Z`XY4Vh3#?cDbjw1O2u*Y!<;!8gCx8{&y4Ht&6?bF^VhmH!#hrm~$sP=lLf6$5bTnHlWAyXOB*IeonU(O?ns#U5>OKShpQ&88*Yn3O#6?rl_o(q*x{}Bpt +0YQZtM+y25ufM|?dYhtLvw0CGtl((h~x>9esy&8LL41k7^^o`tJdp1xRLN&@409A`zi_gHSx}z%Pk0_ +1Al$gVt=hD{>Teep- +`0mK%vRVD>?7e05G|TL-x1mSS@%dHX2GneNspLUZWu!`(Ahy011JrCSFTEjgy7WYFs91b0Ok81X*>4lST>V5wFnOy$z% +g0~HPnTC$Z~ym_{O$7c{pEYl+J;0ZJR`;@6aWAK2mmD%m`?B0uMegG001EY001Tc003} +la4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFJE72ZfSI1UoLQYeU7mXf@S +O?43EZY-GiJ^89uJTvPeH4W#5Er47sv1@GhC)9r1K-AJXHqf$@J>+!-IIitym8 +1#ZUZbdd|?}6b@jSo;u0|XQR000O8B@~!WXpG-gfdK#jq5}W`BLDyZaA|NaUv_0~WN&gWXmo9CHEd~O +FJE+WX=N{8VqtS-E^v8;Qax|uFbv)GD~NQlaZZ7*0Wx&BTZ(q-RuqC_Qz>zZWRUV*g2VmyN|w_&O^R} +p`1n33Sq?kU+75AG)Ea2l2aaGi65J3`mvaLh{UM>?8yGybp+oH`A{!@4+04-f=dg_lB1e)()A!`JN~z +Wv5qM_8YPzgf3Q{c=i~Eg4Hf@BB5rl%YfgvWeq`n$~9a{K}2dM;|ZJ=kgv|m33j}ud_8|V*?d|Y)TX5 +(;ecsuOSM_G1cE%FC4Q^6W!=#i`JtAR{h-;Nr!`T&xhw15P%+(|7LW7?Zfv$4vPv%#tJZ$E}f=`lHKle!E=B{X-!)B(RdBBS#ztUUd$)yW^ixR)_ +H(OtEcy)aRqRvuLo?w$is=Edp`lD<30e6=POY>#5q}S_G7jh$ZmeNrAeh+x~$sG77_Elb;KL75k&~A# +nE^qQ_Q%B}crmAVGe8iXO^jfQTP)h>@6aWAK2mmD%m`)^BovEe)005c<001Na003}la4%nWWo~3|axZ +9fZEQ7cX<{#5baH8BFJxhKa%p8QaCx0l%Z}SH47~d*h@51=@CPighxBpiWlwu63PG{yM6E0tBAw0t{f +br+JMkh#%M&Hej5rj#7<$mU8+nYVHQ0U#k-_XJxRFuka|NwETC%}cFnZgB7PYgC(KsrKPBdD>(c*>wD +!C!}wv{X+20PUHh`tT6CVRR-8BeVFeZaF&t#^i2LfbE2C#9ljoFSU-)%mh~Dj-FRU2ndr= +oU0Pe!9;>*AY@fuZ@UoT559x-6TVJ4sRc{IcHjd;8i6M^zCo2x)!h3XTp}8qY`mu8_ZUM|o2_&54naQ +>!w!Mc#QdH%pEz#Y6I#C$Bb}`ggE?f>OCMUBS_~5wG6UpY|*Bv+m +DC`IW>cQn8qN6Fi$Vo9pBgaG?@0t(U({dDdG>IP_=snwV;8W|d2tY~d%oY4|UJfAoXH9zA25zu|_wM; +6DAyS}qO^QT40#35p5PtPyG<0FB*TN%7)`b}|G(mye +0kvmP)h>@6aWAK2mmD%m`+PiZq6M7008d>001BW003}la4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFK~G- +aCyB|%Wm5+5WMRv7Cup^Ahg#2I;2H=?8&zvAZTe7FG`aFNhQwTcd3U($xiw}QJyT$?r>%~gj;7%AZ6Q +!-l3F0r_Qfo*J1IqEcfQFvQlQjkOhHBfO)D+Mu?Xxygbkvpd8BJqd>FGT41Uv^BUOUXjvIBXn!;F +q!Qezt?yp#v!amM$K5R`}e&tKxtEX!)GydU<(w3**!z^lQQZIGcLrSPa*maKxB(731tW7(P3f}I#2l& +Mjii$!A&t#!cK&Cpx^z*jHwgd#4dSTyXp{Ht@;iQT={5G&!-d$xq&gCq0gcX@VcjDkuTNue6JH^|Umf +oId$i1hGHVXf*T@&R1D+ug!COD04v@v#7nW+2NaDdUi8Yl7kdTn5EQB_ +m#)>xF)?rUMewc0Ckzaq-dDWzJ}~~c^beyP8#{+BovZKG;5r&30OTQJz&V(9syONR9mBKS)+Q9Qf*_W +X;IU8$NztlIKb4Z(*BK5d_6@}@@S_uthZqyS1raAhK^=}gOM@eEY^t*xi#{WEcbpyYOO!gB{O9KQH0000803{TdP5=M^00IC2000000 +4M+e0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;MtBUtcb8c>@4YO9KQH0000803{TdPJplk +5W)cf0G9&*05$*s0B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;mkojAIOAw8#X4gFeKZ7Pvi%$ec)0-TG6J>5uDHf-_zS5Ihc)Mr;ZAj +0~;tj|61-Oc4%;Z^6^y09qK5aQ&%)-;`?!bR&c?j2M+I-*XUhi&M($c_aDG_Prd;Gw?i8sznbxlhFKy +BIiQ4E*w-o4I|IjX3*Q1xGC1N=YL!b$hPc0>}9CF&1PG}n)`WRKDzOYM`HU +&48a#~)HiZ8i0rg>%~xXdZjGrDx&B&4L-8D*$bFHlPZ1QY-O00;mj6qrsTfcwOi0000U0RR9b0001RX>c!Jc4cm4Z*nhabZu-kY-wUIW +@&76WpZ;bVqtS-E^v8ejzJ2;Fbo9meua(+gg&6qYri2JM-D2ERV=yhuR}~RbZ^?#jueX=fEcUQLWsb} +TZ(~SRZ=y=YhGaE4=YPvpk@xT5hgY&KB;pqB(DljPR*HQeNnLa?x1O-*yx@6aWAK2mmD%m`?M+KNl7Q004mt001 +)p003}la4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?fZfa#?bYE>{bYWj(Xkl`5WpplZd8Jmta+@#^z4 +H|sIvK-^U@1NHw6Q)v@sJJdbqVcyl38aR;kOHG9(2%E7rd3_VFl8V +OPa#(>qKkS_0Y}h`J8oY4an7ribDlHI!0j2T2arsoaV&PMHz6AP&6Dw9Mu^u9+wME5m<9ElHS*iOzy_5*)GSV}Hyc_?rC~^IP_>|lO@xQPN% +AA{ia(&L81!j!LSo3^a+9B7B>nKAkBY3REQxq$S<^)78qgUn(!k{13DIk`*y73n#a50Aa5{TGFsa)Tp}G%t*6X)AN+8yh2B-GT{NoI1mPck&9K +P7x3|HGp0JZoRdLU}IqTy?#7d?P-{KuQ*FtKj8pGzU0-7H7#v1fk3&<1p(#*hlXV{r^SUPjZVLB$XN# +wkr*4Lu~w$rT>&`z$S0=~4RYbxZ2^L}|=k7OZ}A<@Im$DPe~){KqzChSKp7TXiQ@4?0&AtCnO9KQH0000803{TdPLk1NplkyG06Pu<03-ka0B~t=FJE?LZe(w +AFKBdaY&C3YVlQTCY;$TyfLbdO=#keM +2n(5zsR1sx&DoqbKjt}TE)3E>+~0pP2DK%Bt{me2J_=e%{y)Wxf+D1_aU2@VvpE=5=>+GX@nKx8$BI74=0xwg0bkBNm0-9#p +LbEg`3v8Q2hE$X+LH? +)#{{J_F}w;#@yg(9J`#EvS=UWH9lN9(=rED5%H2f)3BckZaLfcsVkX17cACGe=r-nMm311zYHfpz>%724e@Lc>t?T7z!1hr$$VL?-)#Hc%clTT8;G%vDO%eNxO +*7hQwEB@$hC}1lvPwSh(A5cpJ1QY-O00;mj6qrsIb($*W1^@tDDF6U00001RX>c!Jc4cm4Z*nhabZu- +kY-wUIW@&76WpZ;bZ*X*JZ*F01bYW+6E^vA6Sxb-GHW0q=uV9^n)_~w5Ns~j66exn^*h7;;fHW{@kzN +atM3jXW03&=oiG=H@0VxH0TwUI5iCzFWBa`I{RC$80wHOP1(so?x=IM;^#X1m1DNu>-_;E5FlZOm(FyeBF-diq1Gopo>LA4GktK<*cTFjY +$-ksU*x3UrX>kOY}-$J80ns;pW$#QK!^SfE!qCj?AGZEbK**B(ikEl7&2qaT(mJNuO2AMZJDqeyhsiz +X^GN1P+Zq3(soGg6lKU88+_NYX%5}`aK#Z)28AOaor!MS~NpiC*o7YfibN6WT$BRQN`f^Hgjf+xDsgh +p{35gf_JmPOK)@EQA~V)!1Um!+(1Vi*a816j%UY$cg0b8Dp_b`bXKTpRel$*a47S6&%_9ufIGn{eRFY +RNj| +QEOf`Pm5sCmoH!5um{N?Ju8}u#IDf^BB7?NN|AFbi#^7D1`j +Yx!#)(tpR9w9hmA5Y19Ar2ZMXs3!8%%7Z!rv-V^KBe`;P$JW7s*eg0$cliX2lY^__7S0j&Y#J$i*fcm +QPuPnvXzunRrW0TBq52v#VGhUIVy3SlawXIC7F*{BVys$i=IpscUtYXk +qBx&T|0_Gz7BQpwt0~fl53XryO5m=zCOrnSHQ;&xVASH!8ru~ba0Q&h?7AHX0jN54LBnl4{1H(pGK93 +4c5A3S#8w{zDbNJmj)K%pkRk^zQq1R +etzbYL^50%1VKyWQ1tb8@QX|ZF+k!bQZJ|tE1@HIij5`tFZN{NIB{vO;ev_l +a_FqAT?LlPuZ(wuHk@noPpA6%fkk0JCEtCMq)-+39W@Ns())c4n`>Tg|HpVoD5T9;Y#({+9Wmw4Ry#H +Ukwu)02VnNM~oa?~EI?v}}vyxO+|EAr7sXi57CV^IA%IeTM4f5%YESmI%&(zr-emL{s)ngg+0*?18`- +fR>dtxPjuxS~9zQaEK;Gk5hoQ!_7fpH!(Oo$eohfw;DVMrQSaY*eFqd_oF$Y_vd831qsdqaQSaN>w3Z +fgI*!CQcGA@L +c#y}aUZJrgd`f@BBLr<;>m3{wbrz{X)XY)?y0=w$GP_RRThiMc{v!zBLY&T?Psk3kS3grjy?BH`ZeFaRe0m*ZEN_~LV_D7V~9- +v$FL6Y{^3>``9AHsX>A-X3YP2mOJbOZ0{hsvkMr*uz#oWc=3PDR*ry1t<6OS=9>*H?6XJ%y*k35}yGV +g-KzA5`fSQ9BV_nFH_1HAit=X@urLC_1?xj%q?&6kG9{N +y6Ek%^ca^ZtTK)VW}L@$SB}~he$o8s5TJ=Q1)1JPcPV;&)uGR-I&c`ss<)3<|2aj*FKqg}mF@8rxfEi +pr=KFXOly%IcS$o~IKfQa0|%T2cEmqPYo7j>q8=#z;S5;oYl{8QsFgaF>UWW-<2SA=`HSz=Yc$ebL+Q +{*8fcZ&J+{%iP@lTrD>>C}3%iMt9dXbzJt2-yeYrT-FE2?Ye~Qy89qG1?P-%Dt4tP!1q=}dI4=UGY4q +CBZ$P6a>TG~+ob6H;g>h)BqmHI7`E>86FJ@!wwdvwA^!u5YJ{YPMG(eWgOqjhO}6V2HZ681T*AsmI0Z +XUI4^!SfhcYaPaE-e~cFFyjPI+^BQP)h>@6aWAK2mmD%m`*^!0Z{T5004+)001cf003}la4%nWWo~3| +axZ9fZEQ7cX<{#CX>4?5a&s?pVQy)3X?kUHE^v9RJpFeYH;%viub5Sul@wb_+S}WE=fufNQ@5LUX_FV +H?e;83rDiCJ^?Zfo$X3qxzaPN)xnuTFw78&6LTp;s&Ep$KJ`?h_AD6iKd> +he&dtG*XK&<{ly?A|FW+iR>`R%7Ydg4?&!T*Pn_^dqnZ6cU5SerH5%kmhPBGxnR0lco~7|aF0Nt@C^z +5%tsM>2{tk-avxQaurxYM6fw;Vj2!4-(eTh@nb#54S?ZH0lO7#xIg5P#Y`^y4zwzMz&4d4&2mkLL{N +Fuz&-jD~op>x=qxe^SJ-6#K$>$ +~-Y9<+s`wnth#Qh4vaimg{@0C)qushlfS(i!8a!HvUxT(_yrywPJ}!OvOY0P!%MTp+~VQfy~oGk`+Fa +zt19I03NFZfNxA%ifdm_8Zuf>&{2gaK~z3t(`@C-Wc4bG_8t`ATlo>5kmuf9p=p~|8l`e&e=_-^W*K~mC68p#JR}_ +@Y{=wx?J964?EV3=s&KbQnT67S6?>R&{Wb!uAjhDv2{8XQ$zdNP(15v}G8i-CknxPnFllf_eLzzY8pG +1sSej>lkz=CrR%Q95=vB5M;>EWr}=D;ROgG~i6^Kd9>US;uszxN1#%m!mjkMe_LsT!&*hU;_p<2eX}nB_>kwd3P-PIlQ!ud4AltL-LR~H5a+4+vNu?3AYbc&XhRLcI^?NgS-P?E(gvP6q9H7VI8QKvxa}Ggf|X{Hpu +ZtNgz+ZqmH=VQ)XsD!5Gx!nhYW9N)9gmNvyA$3VGuX9ACvh|ra1itxDnlgmQ#IAe~+U}a9+yalt%%-&qCG2qKt8ar`Lx<)K{&Y7MOQ(a@+*#b;V +_@m^X3L)K)Df!L;VNe0nrx+h$QbU2uNXNv6Ylp0thP&YZ +#riwhbcJ3=Utj!{gxHEGg!^X`&G>2@Hxygo|y4S!gAIPz&@K~g!eyMd4vU(!U7OqR}$kZ92g~M~lq@e +oRWpUvKj2*dp>}29N!;OgC$YuqQZryU*oW8YMdJy~wMdpF3#1svb4$0AnIH2@jj>7tt$`AoHls?x;hh +qe_lcO`po^mqJGGNm7A$YL3>W0KoabeAg0tdHL$Sx3ZL*_GN21Tbns5`wC;dM%QWK5bGZs-k{X^17$c +tjXWcbEKws9P$2K^UjNnclh!6KI+=o<9L6Ev<~^L$RNV^Q2nK-Sn96+*Pd%M?`t9c+Mo#uCkSuT!&l7 +Wa*G#0j-z-1HP^SFGaA3hJR5RLU0a-wbMFfA0@mlPNXq0au=hebl;Xr* +W5zeSOgsG6b2H6Pw6X9bG@&geP@si>@D7%I0%Bxl8EPE@yadVZGGovAdnIDOIAY}P~`Uc8zk)PRJaG1eSVS2V^iEtBGgQ +DVCi70(|05`B8%m(79!40hznOlQ9T3ZSj#iTXO7) +daT8&0$i0P}v>GglxZLrVDu=cHJ*YM7len1;U;mSU{pP~3_I*X|wv?#v+>lt8zvs6Q%JJ&IoA*={-vf +g}5_u6P4N+#ASh=NJu)Bq0OqIe=2s$c8pi`ye$GUe2t*WddF`IXT36484gB?mSS+0t5;+Oz%!89RYrlqca~$scLrlN4V+#eS}8)lo!~d$y4fVYzOxcB +F@eJ+fzzeK^>!e|ymeH4OJA;TO9K|_V(4;5hf0Pr8#tQ%qGIJ9T<%lP44xCyH4nMrf_1?`0xLbB2*`T +UndrSUDSOBMKWAC;GL7DqMXNcxhLUCp7Pu5@Sx7;>4^<~y#6C8$r%0U;(udDO#|iZQ^YE6$&`}$C#6_ +PSSR3SDYIMDMMy;ydX4z=gTn|u7Xn#PvhYPe>P8XJ8Ar*1zM%OlkQhWDa?ww~I$WF*wpae4Kf@2ipmY>dtx@yy&85{{rq)8tcUar4BTRBvrOtdXW+t4XNjdONmCB&u +F&RUi*>IhRBG8?w;<+a%sz{xfF4Uu9bc^yvKnq~Qq0N=6C?^?F~e(Z4%i{Z15FZPj%!Fvn;};4@|HsV +U}4Ist)3zws~x%qQ0_fck38l(*2S;mjOpe9-+=0TueS@jAhS(i0n8Ra7gCr0U07A}SD>x+6mvA5S-p8 +#Lov6p39&L-<2h^foU@{x0rN0pYqVVpwBq0rEt$EM)qSWEp$a5LxHZXC^$cYYyS5%?)k|I$EG-gz4cP +|fMQXB%j=llGO_#dq5%*Wx{>r@5?E7{h5f3wIaWY^$sA@G`XLc(Qi5j*;XMj*;^W0@3yL}6n +No!Trv3utxpm$P*uT&At3S#7XgSY4dDP*arJ;I`MU_#isoGK@*ddGt+V%4^;9v(@(Z#@~ +euTLXcWxAB&g-!w#F)W2+4%clRKJoyhTcY?>bWeDqS7qw8=Ru%PNHFkL-kc@8ndMD*v6pCRnIm)GRQyJua2pI^?{?DNane?OW1 +=ltsUvHdu`zijC~!0VMz{%{$lFTbT3ygQgYO+dKn_I0|5$hY{cqFh3%_7NaMy2 +iu!sBbd=R`;3KqCPZ+U=wf`L#0+JLv^$^4O*<|{7+nA3@m2+Z%7^Y`Dry*Nh$H3wut`J*5cRK&deK0P +&jMx)UMB>ox_G8JeDS80H$1WST!9sCn7aUYkrCXUSkC(J0og}J2=n53<9=n1?G&j`wyjMt7X+=46K?mB|DgPM__O!3_moo}@psl@(ozdU}?VEMv%z+$|xEnyvNGR3X-aa|&J +yX+6Zw;Icz=t^Wisds3SQ#{azz|=74dbf`tTO$h26@Wl#<8+f6R^Ovo1eI)jO)W~2-293DH`(%BcQh +~r?-}-Zxd0?omF0du21=e-^buMa1_40-vRe*6#%FuEW;2Jlbw@aQ`+uCFT(R1RrxcVTvf%Tr13#1!4n +^-hrxN)Z(r@(YWrzE2hbmMM8!Z{Izplu`XNKOz^YEpIa)CrKk^rI&n0~@G<@#!tqJD65>h)18lty;|NI +o^39vKzn*`$Jb!ck19`thkk-9$RLGHmy6B-)sN!!-w~;zy0~c`NcfA=w+c5J9J_5^Lml#1VS +37>r&uNa|{sRwK)&PTEOFK-*AStYWeQ{+jr;hKfFG_=!n-P_^aBAKt!t`{n`})U3+>=jCGs1Ou!m8z*KmepX(|d>%yEG +G&muFO@FV>&Y~D_P9cgr%mJF?0N9lSU(+Xgvh$xV3*89)w9tbY{yDkh|NWK4WV=TboBfc)UMaT79zW` +?XSLm^5ofL))(U$8zO8xrf1itb +;pOp`nBYYZNH6*q7lvFTnlhFkpD}7*_(Md2mPow%zlgL6}KPChzpPH={h?LMz6p;K) +jL7Ifn|m)2!cd)oCX*qD|U;+a}qWq7mkHBh(WScQKHtcBT#Kl|!*K>Nhc7PfU|JEYoU&`%_)o2f=%j( +x4Bm%)5a7s9Ar?m1bFHK*o+c{mh2a6Jkmu9^1lSHf*mP;mgl_|EOEHJ7tQ~4;#B!7fydWuRgd~O8RWhjy>EK +X8A+Nj)gRmEyDy8L}{`{c=Nar@1a#qEEr;R}1RSg5OGh`aaLJgYx7>(Zev@$c1iI!D`r#funLHH_;0J +ENy|qRJ_5#ceU(aaqsviv47?fMs|c;aW0srO|Tl8m<|Y$$0A@9-h}ZX#ASb-4Fuct +S-Qi%8VgC0O96x4-OXlV^)XBIj(0EEJ&EA>#A{hpQ?4dHs?Lw^W$Vv;*>A3ZLIRY5u=<{gm(hEZ|1>93s9H&kjuliJf}r7hJqK^v{9p^QD+x?ZtKxyE?mI$`o;`l3o +{xfu10_V8^VW@e31^wy94um*(uGV_FRz?PFiBNa4x9wLCey72mT6XrD`e@vxf@=r$B=w^^fCUrs}HczH-*xbb5HQN6#LrN|CnjVh%CKGyc+srrmO)Ul&kJ56n$HGxH6 +k@guaHS8;~FuhlOS`+V&L`*im8Rd5`P9zP!)9rc=&MuwuiY7&qRRVQ2T$wr&Iid_gyT +#3HadS7mT&Ts()$#alRDB!WEhd+X=mb;8#dP}UD`4S{ucMsKLBHEQhT_TP3>m|>)60*iPp=+Lp2GLLu +MBe^>jsRM_)^=^(8+Lj^`tC#(8ZwZwMZk-Jak@ljCwpZa+uzy1ASJ)8&uFQLQlrC@$~Y^Rab_~?ltO@=BKjC+q;|Qp3awi#`P~RT)Cs +bX{h$cv3DbRB^(jmD!tVW$aJi`508uc;-I{Jlbbxa1QTbo^~>4!SI2j9vjW$Ojvu}_SwxTE?+f$KV*2 +845&h4TlW+caF@I5gn}o?7hyQNxM0%GbcX@c1>%08+?&00Z-2!h)pv6|QO;6DW)9lmmC5V;e?Ak3W$U +PkV{QnGM$P9a@g@4)%`(Y8HQn@A=2GgVe15ir?1QY-O00;mj6qrt6a{mwY0RRBL1ONak0001RX>c!Jc +4cm4Z*nhabZu-kY-wUIW@&76WpZ;bcW7yJWpi+0V`VOId6kq+Z`&{ohVS|ngo>gz;u+g@Ko3LU?OH57 +49EgQvFTNvEE$sAkNx^lw%kTeJ778(kw`v#Nr~yK>7lN>(T^7E8e~5h>p>iyQKQFt-WSly2kE5I1&mr +Yro~!Gk5(whSd6jASQl{RLOBYD@u+N!c3x=j7Nc!i;YFpeM>;LQ4WhyAov@-Iuw$z|Tm$Fjy^%UwS#r +j9H($2ZuKr$qtA3E9MM~EXQenpTm+r9PaJlAF6l;`l4!%l72U!qX&cE}|3}|uAw?-*3ICSuMNA*q&z^ +4WW4^qQmu>g-xURV?b2;G8ftRy4Gx`;8crpOzM4($UjMUzzO&L7kceYWRB;|1`A#}BXpC7sXGR^=o;A +Y1I{=E5!1b>>iYQFd5E%tRSJz8rSOf;YcW2k9r}mhVx*^3Ow{OmTZ2cKnby$S(TO1?@<^*pYj_h!q@ERKi9JvAK1) +=wF*JVR0iQ+F@QGD0|XQR000O8B@~!Wo;h(^X8`~Jrvd-~EdT%jaA +|NaUv_0~WN&gWXmo9CHEd~OFLZKcWnpAtaCBvIb1z?CX>MtBUtcb8d2Lb6Y63A3zUL{X>A@9jJoO^#p +&(djp$DOdQbKlj)L_h{Nmlgjn{3ot@U)rv{$^)5=PQp0s#Pwc4`49Di8^S=9?(Zvd)fn8gqUd|`mTwc +PbGn}6u0OZTO8Hi8JsXCL=v|6R2yn`lL@#}+>&Jspcpyrggl^a$%EcIN&(xrH_t}b_c-DLikyC(@vPj +S4O`utx75H42Gh)+PityV^QC^6j{Dbi+_wjrn0@L_n-+Z%TkpvjJ)vpQc+8l6_GOkl-BT%@6aWAK2mmD%m`+lR5h+vx006TF001ih003}la4%nWWo~3| +axZ9fZEQ7cX<{#Qa%E*2$U2)D*4{VHg)z5TuoAzCj(*hUX_ySQJiqP5*D?-$$0uaW0@8O +y=Qq*3>O(c+n@VCI2cgph?4M}|RzQH)uj-8E2m;W^xlsy#HCGcX6{M9mpBYV8#9;w;6Bw6)DmYeq54l ++ZKuVDmRpfy_I1!V;ssE-v>s?6-kA>|%GyC3<^i0=Vd+aRLWDRm?)2d`Iv^;eg(=}*apkEkF7e=UWr?Z+GZf|0)_}iW|z3u +OO*Xn*R4g_Ep_}_hsfot0w29P!9vk~0HmdYb7Y8H%Q=q>CT#J5_gNxjn^7-uxYh%P@tW +%f3sE)y?2(BgPy+V!2YTK4XB16Eq>hl-j|6k=R47%AgVDF;)FWym?^Fo#-6NX%SROcZ#DCB!BFJnC_4ujkr-G+=~e>3k(ek-aqzz6tp_ppj)@Z&%Yj?+wjZnQ@8=KZtgA5cpJ +1QY-O00;mj6qrtcX{nb)0ssK;1^@sk0001RX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7VPs)&bY*gLFLPm +dE^v9ZRZWZAFc7`#R}4DY;Q9vy_OPV8&_hEZEfkhuwDverBTGh-vsp_2dq=jTwevyuu+?F;o{#t5%t% +UYO#?+ycfPY&6d;?{SP$aa8P$0#hVKk2d5}&Tok6E%X(}v~^k{{0jMV|-*r?ozV@|t8QK3CS-Ft84Gh +w;a`b*QQF+R^rqn#JpyGUC7>YRTx7UfpIr3K0xF2-7mwLBJ$Xj`eba0kEtu-aG{>=`Ii3bhgqW}xY>Y +ek75^)0UaAXJAgNf!)g$$A6==|CF~E2D96g*7LC8a_89B2qENDy+eqf_js@2(?F>!A|H(p&dy$=S!g! +tnYt*QgV+#jq#}cDGZ*4!wQTBZxII!7&g`eEQH;Th6VT?PUF0R&SBVsA$o&>Xbwnimwo~>axQ|JC}03 +#C$;@P`f?hf^`A}IH6%Gnd*5^bv#!q@meUDpVy`bizxBaihuGu-FJ+O-n?34)KQ4R=a&s?VUukY>bYEXCaCx0p+iu%N5Pj!Y3={;B44FW0F9ICEb&R$^;{u7Bm!gnX4EDS1)g;622OpnTI*95^8dYBNx3f{EDmi&pIFX6`3@=FE)w<$1(`w9a>-Gm4|fmk7E +8`1AnA%r)ZtqPbAstWm?D{-@7u(>j^a?QS?rpggu=~;kE9k~~M8-w0k6&sJjo=(x8Qf!F6DWdbjEFjW +xqmz)o)gveq9Bi?#0!xNd0hD!glowKvTH*K`^@g6(6ubwK5jKfQ +yv}MD(>*7dfP*em)YeyT^9$Ye{^Wtq(0kfyJ)+A2qFeO=r>uQpcvTQb+Wtr%8z1}svyX!S?it|+EHaJ +5{T&M3#+VrCiB>5#H6hvlibYv?FEk>TNo2X6b5K7#s#>6$IF2`Q}H>w~aSMc{gS(Z^4&=?2XG3U^G+2 +!%tUfq!xmT+eR%rgK!99-bTl^q=2x&=?+(&&$aTV_g_NhaSf21%fI12lD1+NiB +bn(s5l3GDQvatuYLY9#zJ)jzDroUxYVFSayH%II3R)eSh%z&ZL=_@sfoPR37GFu!R$--m{7t;4}+4Ba +|*t>${t%w;jU!$hA8zKqiQN{=jE8wn5deg1S$&Tv%e(`_D-PkXe2YfEg)QgaD(^}0ivGZ81E0iBFt45rd;xd2A8y}4A%0D-IJ7eSSwc!Jc4cm4Z*nhabZu-kY-wUIbaG{7Vs&Y3WMy)5F +JfVHWiD`e-5dRH8@Kg${S~Z&pwcE^;uiaeFm-6tq%$xFL2PUVT+g6Sl*HzARF1qTYS;gL?>&-tlcOC3V1wYhTj+BqST@?mw>2!QSzr1|a=f92^e +DLj@O#sm^0@yT@j_9T{_7V<6OlP!wd|w-*%JH!+?B5KZ-b`BA-i$Y9Ta0gK4S?zGv%G#U*<3K&H1UCZU5T;S{YR;=QEuW +KV8g9Qaph@MDlTAvqA*5xr)1$}Fqr_$|`nHzR(}zHyj$T!QmMF +2EO65{wpbICA>33f6#M`7J_%R*gIJjVzXq*aTl0uq`#)*05TZc~JwayeI-t-qA5Y1Y6*r00q{(lEr~3 +fLB=oVPpXR7ZFIvUlHyFySYsgxRn~+H7|v#f%Sr~LB<&l>q90&+ZIQ|ACPv|~L1FVO6jtC-?>1hou-qe#(-w=&K9Ns|27Dx17sQsv;wEom*`2G!Ehj#c#f*z9T6I3S%_m!@dx$pplY^<#ID_D;|sFY +k{x>_{Gd0a7&-t%LN>aBH0~pTzn8>CmWf1vdfoydLzK$F* +OaW=3%TeWGK!(&&rWOa^?9$D5tS>~14s`ui!A-|zD79C~L4OPJAgX}qG#p3=9(rwg#?kMr}i~VbQ9y4 +)?EI<_eDDg;H1EY;h6jJfrg;;{2Yh?o(re`j;Emip?luL#z39X827o$mhp~gkNL;-F{9`^jum7Av`)| +hR}iPYX*G#nW5Z!43~29Gn2kcG1+@;q-Xi5|QDWKn*JdL|LVIpNa3=$Z!%i!;Fg(!eP +8!wCA(}JI3vi>9A$Ot@sUZa>4lDroY7dgz9g-&~GsuCs{k=&`b(nqHKph*p=X$xExyDSWD; +Zn%D~;CX3=xiZd6HwO)y0yV8jWoB$ej+ipEJ>Y#PMXm(-HaGIUc-d6Pz9^iaCv@bsQ9kV##Jido&s9x +X_tP-JA@aXiFk3apDuT-7l25NrH}m<~`E9(+LGmjXX<+_y4;9bb)P9?};L*K6Y9|g}kC*Th@b&uzJ5Q +1ou)bhlr{NH8>)|}!blw?Lk0+4z<=!e&z)t)A-2V4fz!M#WwTE-c-mYuV1|*nPwvUpjBL)0X8dzANcx +dgjQ^2{Wn3*&>c@2*AyBhReRK4o>JFaaZd~X+EYs!k0W8P%}|E?(zpA*0{>lf&E@S3%5E6ICh4Agf@J +AVN_gg3h#Fn4B0Vg2p;^6$(WkK5-8$D{jvaoN(1h1St6ZjBy!nb7}_*zQnB2oOuDvE#9TQ##ARJK~p- +Tk^fHn+d2@q)1Y}uVt5CCn?6J0+zPCO%NjqJp@L?ek8AlKxri67-~frLwQ;8b%*_xd(>Y(&|#ql51w| +@%1g9dKsJFACmJt3D0A$BQniiMrlPF6S!lJ(SL*4Yj&_*@92p_GBH)bIg?ZJ0Utn|1?B-9N?DzX@|8= +IS^^@~w&z?Q`Kz*zu_2m%2s4LZMVbVs;$T$qrQUyM*=}tzS1zT1R#4K1k7|y1x)O`8_(G){J2w +hV$wGn*z!iNRy7rQSpa$NOVN$gf9*~E>V_wfRowZDYq`I>syi>^zwBK4NKh`*DbhEjA|aZz4jgWV}A) +R}8xuwhY2DA9aH8;Iay#rD{b(%NT75QF!a{h542No4t}YUR+^zxa$@Z*$8%JZ{mx|d09;7wUq_F#sJ%snTZ^1g +30ypjyZrhF2QgTAa3yMk$8{;F@pZ0ifrHKhEL4dex$?LNo#@6t;D7r#!z{TmoCjp)~Is6MG9zz6XL(x +nVrHwoU=(uk%4p-xgCXb)6QecTJLf35=YOq)YvNjk(!T&8)*0sW;?lzU)^+@=NR0}zS>=@mN?SVC=7`U_MvMpm*ib)jK*?B+; +T9hm42WgptKW`Iscv2m_=N#H{BX2`?-5y_FU>LTKe5o5+=1Hvov3anE;!QYkO*KS@bIQ3 +vUqC-zJPf_uw4z*OLr567A)945{Q9}YY(dMjePfQWXC6{G!K$&B-;n)C)ni6eQlqBz2$B&9I_S=lXku +~{sjFE0UXX7h0rE9((KjeOvf-dYP`t5DPLw8dUjX=WVm9qwJ3_Hpyy4i&?ZC6WNpBrlS8a*XBOS56Kc@^0x4DaWdlNsHhvCYu(1P5oy{U +Pll)q3j>a8e44Ue4}743dfXkr%+SAV|$)oYtYMN!mbZkBdP{NDBj2B>s%3H12J`pDM%@9O(P<`>I$fq +xP#(g(z3LMFhy$7%vJOb3 +BBSdUY2!lg|o1^GjRfo=*eN;i0rS&D)vA4G_!Cho|*khU-wn>hja~U)+XhjCWd=kXGS-Rgb +9a8qNFXoQ79NZModqg7Y+F%sjs8I!kUc`-sfy;b5R?%rf1b}oJke`=`j^PT@_}u34tGdjo)bWFN?ihk +2^7nl?cw{9VL0g2!buBHU +V0Sbf)7)f+Pp5q^^vFq5W9)%B{7f=`k!z>rR_Q-|&2bQs4CsoMm +NPMGA4;`_h0oixi`eQs3oIOzUV#Sg-cNUfB{I~k{4jnzuNjrjv7t;Z#O60H)2XjFu8mIRJhwQF1ki&{ +1eYjO-p*UIgRFsN_07DaJy0TK06)pb~p6fwXw*X^(RD(4yyjCBpq2lV90VQK1>?S)Nj8%;*~y%_i3-F +3Ae=79~wW7q#1$pOj0agl*?;PAl#gwyZUii;6n;vJ$}1-fF$*+*x +UU&{-Q>I?(WvPaC<$G!+t3nitFq1*9CZK5+xb=GlpyyPr`xG9ZTzRhAH_y6JD2h&Dq!A#gtdatd%i8W +MYRS1GyN0@%V~i`D`92@|Jp(Rj(^NI3!akoBfm{qA0V=3lhDLAhhDL_KJ9Q~{t(jAGBr4*_#aS90|XQR000O8B@~!W2IIcL;8~uWYsBlTx24|!PS+$%N{eD^JZ9(4Sj +MvSR`hYX#WQ}eKKdsAmEiH1=#PHt_<)$DdsW=wroFB~)Jg|-yXtX<%n^}PwL&uyqzf#6yTO*2qcm%uE +3Y5WDtC*2uogmT?Gl0Y+_ENP4Y}Nl}E+MduBIMvV1T0-40T7$CQVcTE8?ZS`zmX>v&*v^tMmV6Ay?{c +q3A)EcOB^P2jlf%^Auso$QW113`(%hQ9o3qIjyr+e#;tyIXT +v6ld{acbW(W`pe8>@AOT%n34+&vC6-);6{MOp0_=xu;3!|{olQ{^&J{9ehwR!@9`nUC753OkZaq%&A9 +;s5$E4-DgSdytN%4O<1c)+y0yEBtAgaTah?c2XcuAD$kyAf-TEX7M=q_ywPJJwf%}rBpNW-7v0+%;Am +bgdg4l{8;%kL5t^@v|SeTe1=SNTX$)?;bRL`HQ3TB?ZSw-Ap>m7m;!>a@vi%}MEnJ~p`N4ky5Zhfhs{ +5>M;dxz`l~9W2QsS8Q|4aiW&rk#*gWg%sD8gag7ZaZeByR*VJN`N)3_E@Q{Dh?}6X;BLz}oX(`+cj%y ++1X-_o6x+cr30&><#n?b$kxdiy*nX)!R<>knNLk;LEv^FEHCZZpf+yN1Aq}*4!D;RSsVev{#fcv?7BX=rVZe|){q^iC!m` +a3w^=8WKcq$vwN|2GwN8T~)ja3OAYt~k93%XqFN$F!`MSthqWZ($EtJl|n3l7Dl8-?M;^H+-tx~3!-n +E(_VYYN|^=qQ4}^7{|hV{7WiA0noBD3U=O%dbqUTzu}tdvl%GM3d=M5_r0@*NZxRsGxxHq#S0k-2)CD +VJ1||uM^uf9kJKzGtGH!D>?+P!m>(guhc-_Ih18K#Cc4Q*TeXbjhxfRl;=8 +4`TvY@og0xR>Qrukku&L;IFVF2(HlC|`LYEh@&})K*zjL2$RU4nei65Uj*1q%(METQ3=XYLzBb8ftby +r_*UCCN7vID@Ty(wt+As>MBiUY`=7(`AJP_INra**=XB?To+YQ;g2#{dL{>ga4K&e+{zEnL#e<4IlGa +8{l(@1kNjAJuhoAhFP+6;DgiA=(wAPThcE8%bTx!GCn)-@Cl8LRIO+x`?7|S4_wnw}o{7EmyUYB~ve& +(&)k#OEE7=_$>jvLWUgquOwY}dfQll1rr&g# +Zx?`UMnTLNS5S|M9w~{H;da5Hh7=E&HK&L{|mK-zkYrySw5XN=mZ#qItM_ukjW7n18z6&GvMeKkN_ad +pn{#EC|WA7fxILUmM`?80AK0f*72;rirAG&U{l0`ITU7-(zPz`3iBYlFA5F<)-ZMXDt)_bs$L{Q!x}zFT~(pW(DH`%^EM~*%KZWH2bB>ugKzt3AhrdTJg7m +cC4!)If%5=eL|+QMOwxTtWN{)Hy=QDjXYp@0~kZKfX1vD$ +d!LEBqnN96aWpbZb>ZOyLn!@O-#qsi^jmqwU~wzy;7Nc!x+?;e)KEI;eBM7F6*fpUNAY{n<#P&NvB<} +V%ObZGcD>27k&rQ&-Urwv$SJqU3ph*PQ{$AO+TJ#Dyti)AmiYC)_ew6J^)wVXA6-#4+d|JJ9kFkqc?N +=mAKQFE3gH6W33DEy4g7h)=$>@DVXo|fKw<*U|l8+Ov44$YeQ42&56ENQTk_1tGKyWyZSA#FtZ%S&Gy +g|>V2H?78j@_7+jFoqK`sY{fgq%tozBtx%>u(_5HXawtiMIpZyC^O9KQH0000803{TdPN995@G}Yk0N +gPE04e|g0B~t=FJE?LZe(wAFKBdaY&C3YVlQ-ZWo2S@X>4R=a&s?bbaG{7E^vA68{2N%$n{-cG0VURm +8IEi9)p#EjW30Pu47~!Acf)zV{s(2rAUD@a_nyN?>%!PXNHFq-lSqb(i7UF5kCKGd~W(Fg*Fn5$QbE~63?UaysMFEI`ydKtM(DeIg#qW?eJ4_Nw}LGxXe|N&!c;>DWcoNF@%TDAQDDU49wU +|PTk(pS{qS{i&%Mi51}f3&jDtBi$JUjx;78}=x~jXMo17G;|$0IkX%5dViAN}$VG{MKjL4Hctnm!?3h +S?^xauAD1T*(8z{$_xB?tUv1f$33E@va!kZMs~OqQCvwLKg&zWzaq#3D6Uj?b0IwKRB?SN; +Pp93C%vgacKL?Ckj88%yXt86GU8_DWf!0JV@el$EU&!i+fLezKwE=MEZ=e**-#^_>yEO% +^G!8L9#7lLfGPqVRN?JE3h#ap45!l8;62t})gQrdH-W!8$neWD5K*oyeQ|owi{uWy-hL#iQYP+a|pB0 +y$=6icE6Frf&tikuBaSb=W*#d<&G(sF)NE5dutSZkvGy9-0UITr>dz1(-$2M1=`t#4;@KYS!DX9O +i5Lknw2lI7xIzO*y!0W#3{^GSQwJ5?k258H(9Pw3DD`)RFUX~WQ;DbuLLREmG%rY{6BITzLMNxKGouu +qAOCclN;)HyZeT|!-ooO_V+%}I&pT}y`JHdsGGFB^Q=!wrZORgwXkAm7q_k)z6J37{VXq8<6Y?6j8)| +Beb4&&;-nC?ah8urB8s>+7U-T(4kRTlq29l%)*2?IWf@J|&Aic_mKi;AEj+!?h1%Osibr^BRVR&ei)IfC +N^3wBLbuc7>^KOfCLECNXZtjlS4fA>p3QLn_*G9*KO{s$xfoo{API4Bom;s_4&w672H9;r-`a5U%ivV +I=PjBhL6yquq|N@{b5x~oPg4oT6RD+x=0Moo~#Z^y#Mv6*emBZBYp<>b9uDZO#O{;4b*ZtRxuUz4f?dosFPKQ~;TD +Q*{9@TGb4TpDV4afhUHLN&^Cmfm-V-jLy*hA2N{Pq0mX7Smc2U#y_u_i-;g`S450j$LLaf@N+{01*k-DW9fukqauY|CXE(t<~Vt|M&A)0TE8%<2kgbjJPO$a3Zt7qlC| +vv^9{xknJvJ>x1T(*{WPwUljO_Anhlt{?1hAc|Ub$q^@!oSVrXC-8(E^>)Adirqqsmh(d#9{kt=scBD+&qi=BXXVf~;`Qug{rQ2iogsj0FM?4{BcCEH~4plc^;9GYe#5Ytd@ +8t%uInPejEsx3s^SQ&5gS-P&P-Im8)P2{z$*(z6q3wy?&>RWRE$!~`Qgq*WB +)F{}&puBszuN0L{ZX5Pk3mcf!cs&oP5UN?L$bG?Bv(p#AGAO)AYJlMykTC~lKnTm!i?6kB2%) +K|T2j9;2x}RVSswby-2V|_?GdT6h%3~KhMn)#K5GD2nb0k8XS-W*XGx#1+3GJ~Y$U%2S`HWtTVOFFawAS7e2d}7>w2=Gb$;7@I`>Xo91c*264;13y +4-Tf2{{m1;0|XQR000O8B@~!W8c*uCUkv~NDmMTCF8}}laA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWny( +{Y-D9}b1!9da%E*-YL4s+CzcUk=Ds0TSD}21wH&ajsXmK4ML-EY=jM&8SYDL@P)}Z0rUCnuMRk9_yE80!nwSb0<)(yQbfd7VOHyjXd7|A-`) +?30#wq;d2tLT;ipABuvRm12Fxnk`dV-;xtf^x>CRC#?@aS)9N5kRs+A>9E*T2*xm2)l-Hq)E%tNJLOW +{#U|xEGyPU2JiMliFI9;^&JXHLD!oK7@)ctMTK`w4Y*tWd^S60pIZXv%jzu(%u!vW449lKgETep*BYJ +H*?tE)p(RLF6Vz}v`*j04(Q2pEKv`(Em}g!DQ)Rnkp5TNQ~)uHqG&c-H(;|gU3YEQurw +vb7T1!{D_)mf%ToFGlH|p0!Hc?DlCCPUI%jEFw5*{epB<3h9;9xc=LM&r-3pX!S=O@rh-Mk%d^S^5?< +8lg|8AK6#`j#wl4udGV3E|LB&#dlQZ$l!>Fc84^lJm}(Ufiph8ADatF9<>)^Hy^Ex-d9__2}Pa%zn|1 +A)7;JjZ7%a^7@o*3#>=Vb|>Q4xTg&#NO_}OXKLz_~M^mF27xTiIZ;^(PB1Ji=MWyq5vxhCMWV?98sP} +iv*|vkF2De6IlBW-<<<|TwnbG=3P9W5%}b64eM7_MVqEEXXSb+9Aim#9r#lACSRg)Tef|ZD-8S~V1jV +KT=g1~8pY+A71R*>&9-F+e-^7r)Zh^vS4a>+*Dc>j`<12JnOF^!=o=KjX_Yzp;@bBu_(zjR>OpF`KY +1=kEXap`BS#Sz=2&ZiC!{XcnkgtP?`r{+Y;7Gfs3}~u9d7G!a#Z`=c{O0tRlk?x+pOHiUA|i(af@rnW30RjsXAj~NIh;s +z$RqK;7w`tS#*b3c$h3SEnlb9*&@7V%@htcF&ml*}K%Y68lW$2ZU737Go-LNz9E%|tOa?j!U~*Oxn1n +GvxZ7YYVxu82#$Hi(JYHZ?fsTbqExbM+%W+Z<;C(;0L9pBCI^uZefJ +IQ~-PIn_VK768(y4&5N7R9$IP!sDCxSdX$rC&&xrN;ys+tsC>*Dy5tXAaNRK@|9`aQz`EVq*8>Ng!<^ +-xSgmQ#{HJjoqtWdqp`>u}cxDlN}fa{;l4dYvKDqp|Ed#%1Ih?Z~W9}bez1246*;^8s&in4isdo}A*Z;9C-@%>}qop1cas% +N4l08(SadGSgT&ViWV1;}c|17RTm5_V`O&IU%KKmnLUX=Q`wCtD_@`*%EphMfjo-wlJ7^fU~AyN&e{) +f6@&qTH(zPE*TGJ_-G$89_=9)2F{wEBZK!-4=i_Z3z{L=_LpTgf=v>AK4${1ml%PtYzLTSV3R``(71f +QxWwXIUQiBuCt%50|;9qgGfS&c})=i%G!i?fm}eB<(Vq+A0*BzlEa_L=!f-DGoM7fueW9|Kp~l^*wU+ +?YE}!R_$1sUiG8V?^TriQ5RL*+?o!vmQLgKmQeSbz7tf?Y=t&O%a#2q(Z#kk6kd`Fj*z5EUQ0eETT+c=&f%r07rI8jYY0u*O6F>$G#dljuIh0U5Jz-=tVk_~gP3tF}X~Yc@OdmM(qY7Eq$ASt?XaP`u +{oG*`m2>LxELobKwernhcYKk-!C*klBmecaM-`Jj3LiQ^&>6(biAh$|}^?UZ(ZUGU(|_;N_hRfmK$64 +DM!HO!n$}&)y>G}2QHH8qda;|Dn +h7Aj(movnW$3L-nYthkPdPnsKm10KvwWgQ7cdBXjKu0y+9z5^;P%i#UQx3&>k+t6T6R@c9SrP6lT(v+ +U1x~Kg0iP(8CCG~W`6Uo{*4Vn=o(6CzbmEC9Qx_&D9_v&6BI`uXVSV=AH1Ww559^Gs0nX3i6I +!_iqbUn_iUWO6FII{vPnTdm{fD?kWqUY?{1+$|eRP@8K@n}8l_ +(;x4=dlnvbrMq)#_fANqEjS{MzXYQ~`O6nxE05fgOt$a$yM#l)W$Bh(l9Mmg@Ic@1 +uJ$}VtZyDV*5pu-gPByfm8T<{~G(g=SR}T;)ApGz^S(dv)S$%$En0`*uNBtUK{e6E<5^6urW{TCc!4# +CAh$K?bC-Dl#|41k=bKq&uN>B?2n~~(cFtaIoq@<{hzn=&@P1dLbOE2Rz0frRo4eZ +3^Q;D7C(arxazX!jUYyw+Ji-ezijgAIsUP_9-oc$6}INpC%T1JXbj=A(&+sk!gu47CM_YN2!&WCZrEM +U36?P-{JMiJ~WmYpXA*cvgVgN%t^b(`osUZUdeBBoot+dvUF!Wm`zS@V=1RVO$ILO@d$qj$G-rzc{`$ +{A^Xn#|N54cz`f~f~N>o7QAn`7eP*gZhn-L=;=KZn&Vz$Ch2#l(s7h$wDk?EEPJV4Ts*#r@UN&hn|0S +o0q7?dkagcl0qG~vr8CmN=@l|?b=3FX68sWJc$sW)xsb5!uHEY?LbUX+xcT$HVYrMtpv<}XJ86eu3x0 +1o2b$S5zF7s7e6XU}e&UM>Ro&cd)U>r0*)q1I3f_2|GMXOkdcNf5FsE#gO|xIOs6%1-Qg`}z!JvQQgu +ahBo)e#_l +@Bh<@~Hsg9c=Qkwb#ieW8rRMv2CbhqkFv53>rNncXe|E^>fjJ`!Qb4arxO+ +jmP`D#kEC^iYXZeY_pZ)K5^f<6}OkAGt)JK;1h9gZbQ*9tU}>A%M**(Io`m=vKKD~S4>XkJ1)s#<$*I +HiPwm0%MGI~Xwsns?yi17r9p~0IMHb62sI8ju;^Nw +C{rZJ6(e(yk-UBNo#9=rVKAex=RLJXD0M$&jr-hX=a_RWdBg*PXMqf;yR#G}dkeRoylBT7IniX#7(M8 +M=m`jIw=|R)`5HsD#XeDlEzT)A8}~v%kzouSkS+p17B3d||H7*ad+n%r&h5m>=?aG)ijX_|hUV +kH*65MdZiNAi%Ina7wNxmJ2$^iJv`Ck{9bW6FZb(0x8PR{Zp%KXNdEk-h50y{`AYIx2Ng5v%jBxNMF8 +xfA;c2D&z6(Z{J&53I_V3KF*HRF}fsZRV)YOrPz*zSSn?j?aHd*`(J*f!b<&o-P_*%QqF0+><%+_=v_ +p(e?{JLBdUS--OYv4O!xh6nk7=R=onNQFuMD!SU(|De@u=?Ee}-h^;CLT!GjT^K +ba0A>Rw+gW`JAx<7E3Yz9o{tRawT9GSk;5>239(939$TR#s4ZkFDN=4=t2 +7A9HM2tQ!0xpwc6&&~cFQ%F77jut1{DIUIiJFg%UV_)xHKRV6caH^aRK#};gD+tk9h)jM_l1vQvA(z; +H}PsV5K0|oLLSG2pJw&df?i*!$9%}u*aN}qu%aO6}XC!Xe3dA$nunDF9gfDR~)Kz9gSSibS!r4Z1&nsOF%2Bw5=5~s{~7Tz;0RAJn~o9g7@LD)Uq6(Y4WA;Af7E>Gxgp{<;hmRVT?71cu8b#E4Ftfw3~9_#aX>YR#MrW!Lv)bpK~jM{D1GpWyYb?b?`aDqZmko +IA*E=XkF9K=+q8~ezsar0uriXi*NskF1H&_WfjSI+b|2}4ILlf`){T^M;@d*A;agGr`1pL+I93~;x8p +#UI&nqUg{Bsk9)aa~D)2a6hvL;~)Od{;PlUgToaUi>oap5te1yR+Sp*v0l6mCJl6+rzh<=znsCzd`J}Kk^uRIen(OL?a0rajdF|Z;Cr#!yPP7X)iLzi{plJ@vD= +Ix-PY@ihjaMkY2V4uD*RH<=upLVT>b%#J}r3(=5i;xN`SzQuU@Yp8jVKJrDdK6ZxLo%pPx%O7;kDvwicHz1cU{6+6(q-|oS}O +<1wNDf1SHaTTBnn-`WQ4gzXlUG0m+8(EAaHw~WNOTappIDyl+xrFbB6g@-vPWX?b?>o!1U9lZy{U*!p +kv{iW`xM9Hog23LR4fh9mLcYcYnQo^^H9Rz0d2)+KEi)`N#f{G_;!f +89_SD2u7f&+7|6QO6x;okfh!Zj6-1Iof=01j=BG`TFde;)kY`ZUM$p`kSLTJY7ea_rnrGD10ZqCVOR{ +~pgdcjx&2Z`zclelMAToYRCMr@gg|VcB0}_t5a@R#9y;gpFH|ySX2ou$Ln?kDa`OWz@^@BK_us0bwv^ +hQvWhR9S9A`b7htv@$F-Hf$K6QH;IZ98(8Bwt}JJs4U8R}l3cdas-J$j16vUxI_VZvcH8>^n~^*lLc>y?WA +eRif#p6_*eahHntmt;(8#P85~{_4&3>d&_~VDhY+l_+FHq&6MA${*z7b!ou&5{at +hP^8r5B{lqX@9J5Xja$xqVz_EDG?m6u6d0vZzrcIWn;7pXyDPh}>eg-uYSP<{2Pv2;*bQJzBtKW-gl( +gc!Jc4cm4Z +*nhabZu-kY-wUIbaG{7cVTR6WpZ;bVqtS-E^v9(8QX5#HuPOz!Kn|9SJ&7c_983+io|V$wNBBv>$)JY +X^FPk$dVyZNwXsVzH@kyNZstD1%~Oxyqx=uhx95-w`4wF6{5)4d`|dwmu7;{WuC@`U~@Gek%-^&oTtf +%6bTR0h|OazSVrUA^HxaX>oy)o@T&<-0Yq(#$6=b}f+iw2n+e^rd`Cl;kH~Gxqe;xR4E9GvuAXjaMnj ++uwC8gg#~{}+x$@60PCvezOlSUx;CS}={RD@z$zO75@^)f&PcPn?A^e=rKI7=)^pEMqr>Q^kNcH)%jI +mENzF`@{Ow;583yUo0x6InP_B_KJBthNAWRyuBFoJs|UEx@glcdL<;V*w9wu0E +@2^aJEQO@GkNXnz7)R3ncqk^HVl{#Jt5YTKbkpjgP)e$MV12E5~QjU?$Sb`l(XwQ}e%%>%>WXLGb88} +LuZ+9xtSv1MAG^nq*yEse8#lS)iQixKcPTUW7nr$sisf`yn1%h*bCnl_^iwV5I^I7>9gWpqMTSp%{yp5;bH??SR~E +7~o_C9Fe2~LsBLgU>aLf0p(b^YRN)c!1BfnoAZTEtN@5GwCN&7v&=x{PW2UWrk;-r%6q(Lk^ +!o#_aJG)n7h2<7<(m<}9i$%k^6uN?C@SV|(9mnx6^KjBO%%?)^^(*CdtMmUl(u`d`qBad8a^#6I_RoU +O6Pk-KPB){Ru{$MyX8tUOtRgxs?bX{MykZAwC%c_iP6{y$d3grh`+%ljRJoX`p>82Iz!AKyVjY`vC?SOp8Iy;)92SSkPsNTnN}EN&zt!0eL> +X`0(!K+w;FC^G|QiXOqkKFHa}ka_kYq4eScB7yxe<_b{~mdb=r(h`LtQ3I0b~P_BDt +BhEsvs@>D6(ZL)qUodwByLvz5@WS3%5@Bbnsn1;Mc*HLQFL=Pe?%9kf>UcX?TDAL2gLg;z{E#LxDKpY +ipkl;09LaAa1C{Zh9ItPq`kLvnno0VJ|jT*GvWN5BE~m6B5h+j>e>(Wfc4#a;)2-cv>6SSsL;r2*zMz +*s4Mn+p6Djxazy!>Jf-Vm)vRE42q8cfy8!|OtSR~x$1${rVkoD;5m+Nx%>es;STC6K1V9 +2Khw=aaUFDu6JG0`u2K_iE)>!zuRKWm0Vml}&LdidtoB(^FabGVLk*-4cIn;4Y{wVZ8m)Q^cx60KKVb +!8mYY^3FAkN`GE=uYdJlvxwtUcK>N`PgOq*F)L#$cqsuYrp%pYuU6-`F_-=K`X7E&r-O<+;x-hp;Crc +9frYTpF^dN<+DVOj(u^apNV_p)^sCP&h$}Kugkpz^}%%*J@Yu;r05!PmKCf{rpuyr@BX&qwUCQ2&0O4&adn2$ZyM_J)6} +oG0lao=<>Yp6_{smA=0|XQR000O8B@~!WWr}a9_W=L^g#`crCjbBdaA|NaUv_0~WN&gWXmo9CHEd~OF +LZKcWp`n0Yh`kCFJy0RE^v93RLO4JFc7`#D|nOuLLX4T2SZj0qYV`}a?_$H1X>y;M5qNMWyC1@?=u1hk(cx3)Yc?UPQ?emVm#y0I`##AXG(F*X!_NTu<<1+zoa>|Le2fwrgYdYE* +UGe~zaB~MehJZ&^xA52`wLJ@0|XQR000O8B@~!WzQyt_>I47)#t{GjDF6TfaA|NaUv_0~WN&gWXmo9CHE +d~OFLZKcWp`n0Yh`kCFJ*LcWo0gKdEHoTZ`(Ey{;pras$Zl|5$blIvU)(5I7NUZDKZb+U}OR#ooyo23 +rNb1G4#Lhj-nLVmhw_yz&0U(W%BO1=N{gXjF+m+S&}SkQ!7XkCi1FOhVffn%GyBEe2-WrHbRTCh*({S +w9Fup!hqsZd)|^T(o#xD4Vvf{laK=+ps;&F*Ji}Lsf)(6XY>I*7w9G3ZA@KhS7Jq)dc@usO;y0lmdY+fTlC8kZ<_h4aT1e +y_%p~Mc7#cdytL6)*{K8|8;nSN({88(D+mkZ4ubAPkTkK{6pXzxjxQ +4V=T5RB9E<9%JHLJE#6y`V+n%_#8)GcSq^?pe9CxXuVENTj;~VkwNKgm--3$Lu54A5ZVdlNTvytfSUlKNx;bhD*s;%r|gv{0Kj +}kUm3eT$Lt3k%^QWq|%UR8B_WU733Wn$%ZI)<_89-1}N)dM-h^++g$b%XTc=wuV(k|>iH5ePk{h*pg} +Gp8^zUc`yfN?>;f~#lmjw|nzd;En6NCeRIBnWwP +p?jXy_j9jlk2OiIc41qoLztXL@z@Uxb&OGZ#|;DSRnh+rc>sBc!jp}KR(ZX^qQZ5j;-Lfpo9v&fPE$YwAuBf=gAq~~!NJMxR5Cm +`;vQD4yDT^QbASW9~lXI$Q11X4G$3Os_g)10%PXRhRTmV3NIZKQ}vD6Fa>og!Vk^qSJ05@$kbbF#);& +o>`)rg=Nqd7pp8IJplBf0!CVJ9bvkM^CJgG#W+&Nh3Bbn{yj! +00$HEs=^C&XZ#Evi?=A&+a8g@ULUXHzEB634NU15fhR(-`WMyFAY;d*L7KYN7+mQ8%3?h2(XU#%QSu^ +d1b8)djqz=TOrFDqjF#+!RnVC)jwUxDJ7SYZBlV0I1o0i4+}N=6_Ro~=XNyU<<^NCR;zhQN{G5e-xso +GEKC>JfdsL(CpQ@||ZVN9+#Qi__{5;&H(B3}!6&j~yU9>|X$vk;FZZv>n{|#+%_9gOq5VB0UqzjwZ{s +?hlf6<^D-M~*9!QM|5q4zgXO9KQH0000803{TdPL>UvM`#8B0HqiJ04@Lk0B~t=FJE?LZe(wAFKBdaY +&C3YVlQ-ZWo36^Y-?q5b1!9da%E*-Y;edmz6kP>CLTVICxA(6#%J|2GON^eB5Cvm)~R3%s(6TUACp$J{eBC8aO&G#8e`GHG +bV?@o$n#u+@YG1~DM`71}HknLPwjnH+crvL(Aj6vpfe+shNw_4BMb69{{0IgVamLqr*+3>gciR3@BHXJiW2@I*~RurbM~l;nL;sGwN?!4g$tqwR6bbFShzkSyEGf +G}%cd=;^b?OCogUAM6At|mL+Q?MMCo>!B0O^H(nQ}e-8lokokH$}vA@M})9`{lhWHo%Q&S%Sxd`yxS7 +jFkhGvmeVlmI(sbh;zDU;WvRRt98bcn5W+cPM)M<`?wNW7=|q%J0`4DiWT@i797pj+395wWHp?NqU?Vq%G37v}&B| +_p@~l~~5(aQMdZ)>mPweDLR@=U35LtB)jUgyA)a-AUvAo`DC_8VnyGf8s32x#Z=$H|V{uyZ_cSh={gC +OqJfL00EXrEmX1Vf_XpS#fF!)p8NinRNJNc;S+oOGUH_e`Ca=Bt*@2SK-3_H@z2KjVxx>V4Ae(%8U#5 +E!Y#)(pv}5ayBayhU4ikN;0kY-D?9YmB)RGMidHM#^Rc#LvZtBkhWTCJ4aa_BFJH9hFomLkUXE$V)uz +%g~eWH4ApXt+n)$Rm+?vc{YefOaPAkCK&R)Ccx5V6Gm$an$U8tJJZ08wUlM3mb(}Ql0)9*TiHa=F!nn +-(j!XM3ec%jb~JD{V<`0#fyxv#k|DV!bN9SWw$&2PsPsLVug*|3QUbrc;sPnXVjIWnqR2)oC@!{qx=f +Z7i22egEnDY#EVEn|+Dgrw`_+o)dV=;!r&K5X66UuLH2Vbkjx%ip_P=LIB_uzvZf(2>;QVLpbw$b(cv +an`T+(&MZUqA+p0o7&Kn2HF*Lo(mgQgpF5p6~?E|o9Gni6u?RZz*4R&u+0J(N1d+Lao~!jT=k=pNKF3 +`RcQ+%mY~8H~Sx+}F=Hy#=mE;6NiKXaX9Zb9m$9R@7w +7a!v;iZE4rG|8lc|;7`eSQSL5ie*rNgC*mrN=X#NK9rr}<~U*u4^Pvh_a{d)Ov1pRq_b3I>S4C7_CB; +WlwIg{8B={v43-4MRjo~1+;WX*t62+fq|RGdhCnRWE`R3$seg6>CvNWTgOHqmY9RtPw<79Czqm_4j5t21!F_MalOs; +AkvpJ*p8rnHIy9nf**LC`S#4ufyH?+hq7gV{~-)lu${JMfZ_Lug^UiVhc7>hQ-l`3E=&$tQDJq02!CF +B+Gmfj8leCDKOyL?XS%)X20(r$udwL$v$1X)4_rvo-~3&puJKrHM!JVv=Xdmgck=dvGM)6HI?HUU00l +c3mNZx0a%C&*ujEY?#4dEMwb$|}{`|_lZ$EAAfRquIQb21FoEAsU8bVEKflF%GoTuCT|WU +8lK<0I2*G*h@MM)Z^<1u!701Ue8C!@RhHdYVwgYBcwJyHkW=0>CJP759OHUo@S{@wvD5)~9JB$DedPz +xJ2Mv$g+wtD}L(L9Pdy)^@(%jQUZj-PuJk-tQ3Kt6xXsJAJdjwD>;+qs3>hVH-beXqK&M@(H77nipbE +vneS>kuV7)Y=F`tU${(qoLk@V!pYxIO9KQH0000803{TdP7_~k5Xb@m00jvE04e|g0B~t=FJE? +LZe(wAFKBdaY&C3YVlQ-ZWo36^Y-?q5b1!FQZgXg9E^v93Rl#oCFbuutE7R1(uwy820ZIZ6}s%drft*C6SMOO5#;-p=Qz516E1#)4A$EfgWJuwXuH^~Z>|^1HG|dFGW>Pze!}%__ +;>Fi-3@3?R@%q0&XOjy7E$~q9`yZ(`KEnRRKkacPLObr%MdwiQO#=m=(YhN=alnF)^Wtd2G9yV7_TD3cnXv+w +0zxlg>Rth9P>Dew+$OX=KK_Y5k9Hdd#3$I8k4fQ7{*YGeKR+pAl~;6P<-jQS;VWZa!l9 +hn#dXI>rn5h3(~-UV5kAA_u=G`)8T9eOAz&44~fu&JvKw1IjleXmY)?^xemKH6Mf-UD|ns*3IC`**-O +#{=`deGd69@W|0G>!-;E*^CSlIB5-BMEc%+yoZZ9U2|^bO+e)Qsd9E2dE>bqZbEHc(RXSn?0NL3ZC_A +&C&N+tJfwR%4`&F!G8E-N(NYuQEXnLE~1AP>zqOc#AOVF9>-U2JJ;(PBpBMtBUtcb8c}pwG&sESXNKDR7OiztZN +i0cJ$jmLsFDg-pk1tCtD$dN$i;w3@1FK5TFG_{UYH@6aWAK2mmD%m`?LZ)ae=n0083*000>P +003}la4%nWWo~3|axZCQZecHDZ)9a-E^v9}S4(fxKoGwBS1j(qwrZ>tBo2{$C~Xe`!GWsc&{WaZ9w&= +7yVgEb3gW-Buf&hIMI2gD;X|D4d^7XSc<1w`5qyh^iVHww+j5~0u!`4^qZ<4jQ+x|FM>^aW=buk6gy1 +3y4i;9)-7f)Aw9<^&)m6=vT$#|NSvE~^WDi!l0{KPv6Se{MooR}!u +`nRQH0D@Lla1*5@=(XVuf=AmXj5SW;G>jj +h6Ax*{@|B7Y!F%tWqC4%LWMm>e~PVVceV-NvP^aXkk&iqeeLc+v{lQldfwcW7nUS|%1 +`d~}lZGy7P>yn&E6UB5oL8JZ`8CPi`pse$%F49q}73fKF?=tt-yK#N+g%wr{((tD(t!4kPK4R%4zf+7 +^D4Il>JjSLyo-%xm@{6}i+ZCM-E6;Lo_HWj*kmRjrNC_qtWLeurtUM##!tjXKji6h9+ +&7Onp(BfBeL$< +vCA(At@b;@9%4nE7uIAxjT=Y$0`dZ^M^!x(2e!$b42A)>@)?ln_vw6gQ8jOKr|IoZ(4NvzqFua8_AvM +EE-VL=o8I}IPofYByzc+hv-J8STf^NV%f%cxFJUow0!hNIxJV<;8m#zbMu6Jd>kzc!Jc4cm4Z*nhbWNu+EV{dJ6VRSBVd0mV<4#F@H1 +^b+0mC8_{hzij~K;b40aDWiMNS17`wb|UCM2f{{%h`D|3P(B&EFd2ZSh%P)h>@6aWAK2mmD%m`)X!*;e)n007l3000;O003}la4%nWWo~3|axZCQZecHDZ*pZWaCy +~QZExE+68`RA!FoT)Ms3516Yn*s4`|bL+r4ahXwzbGX<*P2m9UW|9Vz8yi~a9Ae3M8@a_rvjUC%%qiy +~*9dF2eHm}P4;L3EvGtUxqMafA!p)7LA?Nm!VxGNoY_5qkn7<`;k9y;u^XX~A%MMR-Nk3@pPeEig@cz +2z-sc#UCTy`m{iua;qgIY$fhthdAoUXf&(GZNE#7+MAQ>3AIUmKwk^$_l<@1a2`h0TMY)$e;`^K9|$! +KKWeE;NRymj;BO?&-X5aVXsGHfpKz67^hjfq-mU8OfS)5fo4ZN1RqTusPckUBi9TD;JepT2;aUsdvU^ +8#s(kNe0eccB>Me6dWktf<*}cxM +eCXLMdQq2qDT*$+u;D430wXx8h!06PJsSQc?rQ(|08?L_0x5Bu2h34#HeBy#)`je1B3+94H47Gly~}_ +}H!RsHs}0hXf#deTvt_URqBUABG|5&?lUf%C!dlkLgXC-KF4#nBlM>ObBKX>?`Js6eUa1trmy!B@Y?R +3*a$A>ZfLZwJDSgGJ!_;H3@H)B6JM^HIfu;A=eoUKOm6|5GxbNt^7JG69~67c|a?IaGob3s702OG9 +hhKj^3Z2)~>@PCBaOo7F@f=CUVt)M)!aq9||WUX}Km00@)zjvqY;>jTatH5)$rY$AYzJfr7ww{U6W=g +*~A+1muE114-qsf>BED!1HzbMp=w>{%r{!H*W?eek@qDco6a_6?~okj&OnUj8lp1>t5}SjO0vPT|~wG +utORkb`iV}Mksi3D!|hA&4acD;(S;X&Cb +~@MqVaB_hMR+h(QLl<~sOqP)d1}Q0*OU;13=FUs9WAaAO%ieiZc!`HP2Pddhg}5`RM-W@i7v|tYgB(uNe;RBDq|1z&Zc|2z!tm4?OJRUhmK^K-83sz32Xo8K!Jj8_EA*VnA?4oqAlZV#v)lI8~|S9k-^YqrKK +MSVtZ6W<2^I>C~vvl%5Jg1(7*!;u&Y*(M)HU%(m32`uvCOdLVtr!;q3J>xVo;a!B^$4?I1!$0Qxx7w6 +OH{*Kmc71GkOPE#Mcke}mc#urOcVie?M^U$j3;S8)GwSOKr6Kx=ouKb?k0&R!0)p(U6e`4Qb{DIErAj +P@>vLqW9TIHVUU^LF7P5;xvHDTmE_#3|o?+l)jMy#b?C`zHtmCTsph)`fa;I+fAoWL7#P3_gI&#uWm{)CY!_aUKR+WJ`-i}u-#avhTdnbXx8wj2&oZ?_8G~(a=2jr-m&bx1L+Ln2C@R{lTd=9R?s +CDstAqSsruL_tROB(vTQjwU><7b`F+*ID!Mh&#M4O+Y#w0Rq}`8Pqc3M$F2QBqM3m1}|1usWF-tR4yi +c}e`kjNu1+Uoyu}^8X|v>ZrCX;_=_C0dzYVt7Gd{N3GwhPh(`RZ9k2 +%6(T1MjL`QF{vE7r{S2y*PdQD!B9D0lV8t&Zm=oXL+6>nrsCFLVp* +``VN39HCX_FmTS48l9^TogFu~XT`iQjikCPwXGM;ACY@GKrfUxBS*L~Su}1qW15@Q?VRE}sgzn>; +X}qBVv!Z@p*ml!>-v3lf)jWpUsK3W`XP;MS7SaLA76;ILcidhZsd_ut*}`@kblmC^y(V`NIBeh^6HVm +#4i^VI1J?{)MZ<-t4*aQ?RvWbiS{rFqgczl?AU9L2N6H&Gv{|^|2lFK(Yn%_FYz;Yigm@9nmhw^RLey +IFsc)*14o<3GP7v((`|rsZ)~c5Yswb)D^#c986^9|z9O4&jJ0H(K9L&Yr9UZWf81%eMhoq*_~i%kX%^nMEg-+JxBY8b7}78( +SUqmXrlft#o_p%A_&1#6B(iYzxvS4iw4S}0v=hE+yDVg7v2O&?Fnq};;j~Y*8ZibUCodzUuWu}{8^SZ +`l5khwLtw(eb7v61z^v5)vun;+TJqUX6>wATf3edvIU}CLiNv*ET?$7kal;=CQ)~IWCSBYO0uwl{IZp +(t#G#zR4d6*&_;1A;7zGC;U_@&ZNIzFiO9W5`;9Eqe(2mkdwtv=X%Itu2d!x}_7=ZvanSU4Evovhg{L +lPsyI<4jX3+zMU4*ep($VVrou-u4~2zFT_Y73=E6#LdZabmwRDyIku6U|DmNLrFOzt`+G8XJcdng^xe +d&PG}LL&dbwudyhOvxL=0VA8eU3zZ`V@jc%D!wGADZ9aQCTdp8s~CUdAhFs*;IU&s3zxUj)v3675a0G +Mo35hF8yItmB*rcE0+qRa-c^sE%4mDpL<{xtjolbC`lQc47H}$naM*BIh_iB{=4vWoZ +73ld~zUMg!#8f_P!QxysOoT@RiiRUrL*|)^sdsH{LCl{^xO{Q0yEqDz$e6&E{a}h#(VbWff| +FcGT3wL~Q(ZG1J-1eGf5H2Cny(jj;IxP)h>@6aWAK2mmD%m`=006_E000~S003}la4%nWWo~ +3|axZCQZecHJWNu+(VRT_GaCwzoThC>=QGK6Z(FzYkBnaDgI}#5F5LXc%BE;LMeA%JN&=buxkO<|!<8 +!>u*S*%HAM#0`ESLB3URADLE_+vb|H->w{>S?t-reuNUGH{j|NZg1|FVzohkg6)@811teOTYy$2H&e- +@W_z-FM&q@E7mr2mAABAMLBJzWL^V*7rZW|L(&#-@NeL-)q?P!Bzj_(R0gG +CTDj&m(s=8J4>p`fZuiKWk5@>)oA)bcHPs}Dfd-G$lA=m`Sv@gd(#UR}F>gsL8 +R{wteuMAphPuX2*kW9}5v&oArL0V_b5-aH4-Shgphr;wT0=t|-U!dPiKSQ%iFZ2Mq+&AV!PnYoe{(Jk +CeK4I4t_W3WY@Dw)58e2Q?2m_H|99v3iFq?+{&IZlf7+AQum8}k4Y$5|0=VvTYsbbrz`6!6bU#67V-U +{FaD~9ea@&q0qr0$H-^CqzTgvj2vj^*Moc;c*|NQR#hxZ?T_07lM{bqfdbg$p;&VT;yH3L4Xj;o%lfv +b_LiK~^XovMD{H`h;9zOR4W*MF)8u12mVu4eAJaBJn(#;wM!ovVYZldFrXH}xDYt~#zVzadapA#ycwm +H7>YtITg`TxEU(^Bb7o!2Aa0H{4W>kMS*^s*YPdSDD|){6^+CGQW}ejg=%Bncv9#W@aHX3x&t1@E8@= +$->VQQ$G7qLHXh%`_8TFAPYN?g&oK;xaYw=v#BqGduCH#2KUUSzObn;lO;J>b0%xfWJykzNAUt(~ibtCOpXt29QHt#@VXUDX4gKMDUy_)o%r68^LBpN0P{{Ab}m3;$X8&%%Ee{5!|5^CY!haV2i|}8B|04Vs +;lBv~Mffkme-ZwR@Lw;s&(%p??0*eXk5W&c?`-UPmb&1nibuwy%6L>6k1FF)Wjv~kN0sqtG9FFFqse$ +Q8ILC8(PTWDj7JmxoABR+|0eu5;lBz0P55uZe-r*q_&4F-gntwMP53wA--Le?{!RGjePDlG<8%Gm_4& +Df;jib$%V+KEt?qh}dX;+nylyf-naocn^OMQ^WHLXQ%ugoslga#KGC!HjPbTw|$^2w8Kbg!=Ci9cY{A +4menaocn^OMQ^WHLXQ%ugoslga#KGC!HjPbTw|$^2w8Kbg!=Ci9cY{A4menaocn^OMQ^WHLXQ%ugosl +ga#KGC!HjPbTw|$^2w8Kbg!=Ci9cY{A4menaof2oS#bmtj_bnWrGdMCO9Q{B?KizCD11KgOK&MMX#uO +Mbj%x30;3OlrTT%{y|vU$1Q|;DZwehD?#NkRUW*1^&n&=6hX>+SPw!|f+?XZVJKlL^rctaLRhLFOXVR +;&P`AqTTy?aNS7jAQwfT6$;kC8NPBg9h1V;BUJ;d$l#sQLqJ*l1rhS-R(UmatCsVIjdWFiPsXUs>!xW +gA61ox;m?K%+%E +PHVoXW$gJeK%+%EPHVoXW$gJe$-a|znzYlTo${W#+xCKXY&T&rVYQ2S*#xHquY{n4 +sDz}1tc0S3s)VKlQ$kn5P{LHgQo=0+r}A(r52x~QDi5dfa4HX{@^C5-r}A(r52x~QDi5dfa4HX{@^C5 +-uk!FJ53lm@Di5#n@G1|l^6)ATuk!FJ53lm@Di5#n@G1|l^6)B;pz;VRkD&4hDvzM@2r7@D@(3!Apz; +VRkD&4hDvzM@2r7@D@(3!AsPc#^kErr^*}~s{HNKncH{ZSg@bR1Rt^M%BXK~nH|Lec~)j$8k-)Ke#qW +C?hGa)}AP}V{|c>q_T==6ykjho~8ksl-JMwbJbvx=?&GAGAeNbb2LN2P#VncP6;jGwE6%n3Hv1ertIu +fxr@>qK_I?HIQMZpXMCa7)gU18&E-9dJ9wjVOEP7`Fp%$(uqdfb)#o1Gi_~9=JW@_Q35Kw+C*|xIJ)l +N{#ct?HM-|&9S06WcX}B5;*{OVB7%!0|P_~p9_u21~R9rg#q$p@&cK&I3lt*VqkIvnbWXNvdJbFCgW* +{3@}1ekwq0DDoJ&V5LIGPC5S4qs1k-a@en6SFtG#^Bq&*Q2}3MNbP2d6hYlG*PEzO+aA(F1YvLrqFav +jH+!?qfT`dE5X51OLGvm&{of&rqZqD6u8Mrwq#ueZ$jJp6gXOTK&k-EaT3vhFCsY7z9V+-pFG`6tD7H +Di?jXk<{xypHZ6#y#(tN>UUAW~6XWsOBDs;exjhKHo_L(=?6Skhd`sgF@IB(w6Cj*=S$Qg)k +LR6DQH6f}gdB0GI$)bW&;1)kS3uDQ-$!=jR7c;*wmW#)7;n`XI>?{a&@iV{h%rBPrg1i^wM)IP&S+H+ +e#*&nbTi%jmj9cEC(hIU=5}#X24xfjoBB!F%{Vo_!yW(*bA7JeRTl)ZOAK2OlSo^@%KET=sw)O$mK5#OBxB-yQA_!R0hPyEtx4cQ&BGf9f*BjyWM)r +Cmyxz!OZ-mzy+3St)dLw(i5ngX(uQ$T$jqLSCc)gLm-UzQZvLZ()a%4r0P~^yp9O3mw_Ie}qJF+y%J#X^1$0CGr6*u>yBx+;E0tWh521tbEIgTe8<1D{k5NmN+gUHoj%UEgOppK5}FqIW~x@F ++jM^k&n-a4Y=8(jt#gueLptf=7S6(9PP-Cc7&rH+0l-0v?Dv(5$9J#W84PZ#<&f*+5e94za#tK(SV!h +hS-6-Gwu%DopE>ImV-SyaCgRyc_((p-GQ5(_y{LHcE;U-n~%nc!-E`{96?S@&L9^iSCAW%4dl+`0W#Y +vtTOhLOymi{^6VNX1j{Gc#0kOjNi7lcPULwfV%~{7??lWyk>{O=c_;F`6EW{Zo_8YVoyhY}#Jm%E-ie +rZ;*yhIfSc!?hL@eb76VMJ_W6Krf^8=J=K=%T> +n2r|oLKqi0WK}Xd0>m^Bcbalp&PnlO4`5ZQMWp)#DJ{CC_nglXDrOc)`!}R7knS21|MH0;G%ng~XPre +Vi@WWkR?|dS$Q?Pt1Jn3Si@+xeU3hYT?dxDM1tFrpw%)G1e_A<`QyDFbNR}Ey|eyiAitE?v#lUL=rp< +-@my#L*B%f@bbJI5tmjeX<>SvB5aZP;OLe0*Pn_t<#(*5D>K-l=TZscgLW*t!QfFc|>ZZE5`sPh;1jL +G2s+5N&jjX(8D#p*Nn;+v{XBo?Y7l5}woA4J5p1YWD(}ZfTfcjAs(VOk!7O@)4{#5|zQMns^^urX+?vBnxS)>vZ=8f)y98{BeZjWuYjv7t6-tPQ>z8f$}b!+sm@mK!wISYr(uYiu434pe9J*rA +%8RkK4i`!$(-B-mLsJ5;l?YIdk*XVvUb%^vucP|eOd*r9`REMAAQbyl_xW$UbL9dmSN^Vsobud{jVP` +1wIvBNxe-a^3fg^$=)CW9S53$^3W)6Q12;{{abRdmO4xi{{lK_-ny2R5wpy0~Kj+>IrOS4!QuZ>UvgM +eZGBc0@W>b)8Lb$MUVSB4c@ZbynmKi`>~FcPMgaMaB$$4OY!@9e{&XbGRee!Kyi+nuC>XgoALfvJLE+ +4pz1i(FrTtz$@yJ3X?0yByR}t8mxl@IyhJdv0AL&CXCW#g}}MR*JOp5c;h~K+i=1tP1chMJ(+wo=xpeOo#BZcsL8uT6OZv^&lE3Gug +M!c6C*!)Cua_D$?tS0-sw(Oh>3T)lQ&8xMt<_hPaIr2dBb60s$1+5Eu59RILc;VIqxs^EsFbQ{YAp3==~e?#r>&N +As>r}HhL$Tur8b|)T@qZ0M`3LTZBi{HXN`G{qQBbJ>8tU^7Vm(V?bCM75DuRn!QvR>?Z1zq|{=tqL)J +c4t)1Yr4!>m>r~Ef`aRll)n4?NVYoJMeUlEb@rw@k9C<=x0bj1N}%8kv~(83q14hx(8iCIPpDzkR(_W +=kf=M9>j{?m>v`$m@Wi^jgnr|Cemjia;YSdm#O@u>$Q8#ySp^| +na{Rl)v+s(;a~9}H5xz=B|ApmW&JA`c{Xm|j3mxAxDDvHcauyxClnBP-$Lx~z^DS0U!m}{(?^5WHLoE +`3_=-#9WtYR7TUTY=5hUT79M1k0u_$56*v#0a(2sBGngogBJ?$=eyc%#e2`$8%TGx2%!r@izE}4$qO= +l7YZoqFzq9vgZCb6P+-j6%0(m(8mHK89DW|us^cw@WEFT_SlEHhR=yX5}+iAr!?^sqy2ot;ky_r?vL` +5kuhcWFXDc4NqQJH{){Qeq^>36gX}V)@=8Ek#eJ$M;SoaD9djx?F$U2q%k}$9Gf?T_Spdf}0{%QFG*QUWi}*4QILl<5xmCG%o +A;Fr{k<$z!2m*s$8k}sA6ez8Bx0lz$V%K^XSUn~dwl7O*1@Jj~9^1v@C7|R2{REOCH98J}=Sd6@XtdF;)QnAov6DONzz{z%S453cw!(Kc1r{&(R9N9|V5@{wVk(@JGQPfj +kN>p%sBY3jPTEVt-ZyezAuOc4>*g{Hj>m#Ow +!~ju_)gLiKW$~;mo$%+fnV}GRtA1a^jI1ACDUVN;Fna71-rT=*JEYimw9}_4_uP%u?p}@y2mQOFZ0(b +z%L0Os{p^)`2{<_ir_E6Uj%;vewo)6=JzFjEOu6QDflb!OFGD^z%ThA*mK#X;IF_he#NT5Uj=^!ep$b +)3jE^FuLk^0@HgOZg1-U3_%rM5`R`Kh+i+j`st-1NoP1Pi*KuFTJHbwnlbs-ktso~`LAwsQncy_YP5e +e|675p(8}N6*-+{ji{to=&=dTX@vQAtb_`Bfmz~2Rb2Y$(KSsnPrZ(R6p+>-CctpWT)@DJdZM42^!U) +HB<0RIsD1Ng-cUjz7u;2*$01pfg3DflPwPr*NdU)ED=0{;~JSZ6I+XRQhRvR+sd_~muZs3>ol6B&z?=^~iu)lFHxqd ++oqW_=1*T~=hb7!5nOZkrDc@?rt{w&}?p3mTY06&i3wM)&INuU>@SJ0c#4fHPb0XpZ{jDq_Xx$p6pb} +9IeKJ1dygGNO^Rr;yuhy50hSGc>(LNB0Kp*PS?=pA&$GeKWMzYm@LmR$$_CiolhH^JY4zX|>Z{7vvT; +Fk|+4tz*+G{N71zX|>Z{3iGf`1PZb2K*-Y4fsv)8}OUpH{dtHZ@_PY-+t>5L+}saAA)}X{}B8G_=n&hz&`~40RAcXC-6& +Z-k88Y1^)#8DflPwPr*NdUp}llCh$+eKY@P={t5g`@GszBf`0-35<9kF4<+YtoTNiPZt3SnKk~ub*Ks +UUGE3*#|Jh{~`UIW%LY%9gS*}0pL@yx>9_ih?RC)!S=NBYu>{71pxW3EvNXeA&hF!u7BlrN*XoxwY=|@51sexb{+U7E;lFOPl7)Ie-iu&_><=UHFuQur$1tIG8id{yDAf-eby&J}!B;j4nLDtuM&RfVq#zN+w5!I#8X=L- +By@HgO>;OpFgzX|>Z{7vvT;BSJz0e=(x4fvbjKOrENm-LSq@yzp`mGl0^3cnxO^#FPldICKQ{nbwudI +Q~r-a#KipP(}L`CSztel*v|s{S;T%8*v}&N +v%r29v7ZI@vxxmHu%AWjXMz1JVm}M)XA%2ZU_Xo4&jR~d#C{go&yody27a-tr2s$g!|b|&-i1CupF&6 +fVuuUta1lFPV26v?;Q~8c#10qO;Zg->1s?HF%8BK+B6hXFt`@PY1$MQF{VcGbMeJvR{VZZX3+!hR`&k +;srOCK7$jt<&0jCL015OjU8RTYy-+yA=}~qzrgzExBSC7HN^hVuzun<_C)dBy#=O!i=+Y0yrE@%? +Av1E9tS7HTv%ci|v##GI%K`buyOb2PGhS1k$F0pz!QIC3ExYbOmr&Xh-?Gaj^!w1g^yATwmwr6@@zT% +nqjt$5)7>4Mo#W;1g=k_~N8fl4e(QViBZlYT4{eyI!D}S%b0~Ky=XG9Z?fod1Hr%HnYD2=!lQvW|X!! +5h@OM8to$Y{n99YXC&<+~~yOcxto_i3_h9wQJLvDk_2yMc-d5HRp=OI*&Qlgs?Wpf32Epi3G4I1|x05 +`~s(@i*H5Ap`{iWrZmT_N;YPjhjPLq1M}y!?6##+K6t+=VEXD@hp0h1XD538E!Mx+8RSuQigrlNW;a0${@*?c27{My%U|tn^RXHQ;L5OIOd%O-rZcZCK +8YJrKYPflm*ZrHYPJ_IszYq_t$=MG=LPODpBP(yj*{LX@MFr9qdvLMt0XTFV8*B^p=L_0^;$(g)R-RL=8UH!U6B2l!LTiXLmb^sdta8f@ +gzhi95$TKT3g%=u)T0{JIl}|0wkr6~7pI^P@hyoYDXW^{7>Mf`1>S`~oon&g=2y=h)3%N>somEHvEG0 +Jy#uZK!By+F)o{+HgkDH*IKWFzu@2=8{~2Q^Fsm4DIXu^&r+~6A~JxHk_MlVu}lpRq%o;_`_fb`io~K +{-e~J2i!a;+~+ROF6G$pO(y3|VDWa1ROMa0n{dkBJNvqGxw +$+OW_d3KyYpQ3AI%p`bzdKm@Imv%~hYiLR2wux-N8-6Tm(E=@E@RFs4J;j(ySn-I|;B0=1$%gT8Msw` +8gI}sF*QhxFJOh9oW-Qvy&%4Vj+;p2}|x`OZX`0%nc;O2GdFYfbvG)W}Di=|zv$uQ`yNoX|A;@+jim^ +!OR;WX)F6DAsDJTM76lk_U&g*?h1HJqn*hy(e^AUO>>w1^4I0j%UA2S#lx;6|nENwVLJ9VHCd$>!zc}9aoV{bx1L(>MJs-h)`SKOu7hJXg`%J2(WX1Mc8 +-92LSsNpSFGl*XK_)5N%Xn!2ix~(g3AAI_}LlzGp`{1S|pzHQ$C>hyPpp0m(0J8OrY*%m5ME(U2?43Cg2xC77ZQAue)s0(9j^7*iRhRqm(?b*YWzY(f +1(q(;&0+v}dZpqs-Fq+$4RJa^Sx;bR}Zn1a}%ViX1}RWzmLu8eEfxr{o{`W}0yJ+=+UWNgFa6SnLZ!y +Q;X(pK=H!>G<*GtY7?qT#OzhhmB&Fwek=`{J0Z>6seNq-{qz)H +|Mf5a<(Gf^@4x&<{U+0OmUp{cfA9ytkRRai+KWAmfK!+Q>qkPUaAMO0z2{eqSgA@xh{*P~g6*YhkCj$?Lns(B5KD=j+D_S(`r|ue8$!@_bAb5cJ-_#6oY`!a{F +HxCfq+(82l@z7IXt1UIdq~%7Oy1FE{ratPx`KYq-hD2l9r*M{{fd#1w~`g=g@sb*(k;SC~vB9&j( +MxLY+tvC2>20Sf0gkNc^Pw9i#on=Kbqbw5H_1ZYtOS0gSq(+~I5$c4tIvU+o%#!j?l|3au58+-emOh9 +PNE0Q7q*5J_R{~oAN5|FDTdbB>&s7Ma;uP3+4t6*+WJtJ)E6*~XWf1U999;WOyR=1$W5fkw39B_tuRO +iv;K6FjLl%iAd-3uDl{)AeYqnseI<;d#qe@t<;Ois&WiFDawBx;Q=v%bKC7nQPDOaq0e6WtAn4@10sn +F79>&LC2rL&RLGiz9sevY+DE}-9>wy4q@+AJ2tCqf07mt^vO&$uOSyII`GEv(nmnR&Tglv5Bt)Z|X80 +j~>(!5C_Q$}58@$!KL>J~87J6-*bR?Pbi%kWIh0v;Wt&7ML+l3KU{okc8jj0C +Ur$f-<@7BVBZ|P=I%lEK5nkgB+}xoIJU=rc=hrXP=H-QA;U(W+EzVO&mC{U=$5_Vu^&K6WPAcSr?Rd` +)j`Rt#%%DLlynIGt7g3As!t1W!4rCr5K}E?-jfWGLA;n&E2Zq~UguklAql?MqktA$>fHP7f3~dd2Qr2 +}?OW}~No@h|iEJ*|a+{SysO4mRPmu*yhEjiuTmn`KOmSgL&4vI#e8ooex@q2k2!cbRax3_>%%p6V#@M +$~8lD(SP%@6c#`LDA*Hd582uaMr=R@5D?-K2`6gX$CYA820(?VoFo;~%26nEV4!O9KQH0000803{TdP +AHI~LKgr402KfL03ZMW0B~t=FJE?LZe(wAFKJ|MVJ~oDV{2h&WnW}rbYU)Vd5e!POD!tS%+HIDSFlx3 +H`23E=i&kYP)h>@6aWAK2mmD%m`(x%+*C4@005K*0{|TW003}la4%nWWo~3|axZCQZecHVbaON|WMOn ++E^v8#y;qYR*Olk{u1|qh&rDO(uF@Q*8BI^-$;^m;nEP`3-sp(#z8Z>Nv?3`xcWwY>;SB*0wm^cggfA +3)Re=$r0~iuP7>We>f&y5MQb*_`+(bdb{{7dg0|i2i+P};^nQQH}_S$Q^zg+fD&p!9svZtSW;i+Zye; +@zp>o33f`0LL-@%Rfb{BqedPrdZitB=3_)RW78^vh+hzx?tGul@aVPrmf{-#+>H>yLluFPHu7xfj2`? +6s#}U%dONm!5d}$>&~r<_AB0{pr7LFZ=#?zVqGhe)k`X|07%WKOTSOl^QJjr^kO(|H#v?zWm~{|LdRr +&$Rh>^#$Mg&Ub$J!=F9%>TA!v{L&A9xaL%n$n>``-7zv#kE#t53c +D(^p?w_AiTnJl6M%zQ0-aSIJ*}?{EJ6cVzyK&EJXnJ2ihd%->D(cgy_UHh*`_-yU*w(^Kwjj-~Ftvq5YkJ!p1w( +^LrJYp-4*vcce@`$ZGVk?jMzC8YK7L>NY$|LDBS0s@wh;2b)3sPIqumw$9(6R+>ThOruRvw9!M`GoX* +!q#!`jJ?9q_%#f_vP_F{_1a*{q(OMXL0G9u_~r;`CwhlPqpLEPjf`&4u$r=-G;5ZO==-Pt97L>N2G +6fwgkB*f`$I7E)<j+IBp%A;fD(XsOASb21;JUUh$*#i%A-f9C){_M<%tk!3J|(k0CA%-9e`JC6DOrV=7zD_zZ^^Bc^3bNmEDmj&^bAt +`&i6Gad64z{`&b?Vi1+uiJjnX}11t|A#QO(X9%6|19}1YwY}~7v?S?Sp{lk1>P|f@AvOMVK{Ua<7k= +^@8Ssrxs{xOyZ1-*Zq@;4icMzTk@op)X_K()yj!`km5x=hAxT(t798dgszQm(t3yv@uO- +y>e+|n$kLw()#1l#(1Um$E9@@m6bc~n* +&QD3mk4^{}Uf{FTqQGPHWz)C3U3-tZUBgl2D04LW7a@{7t$u)vpcL;EDjUd-u0-RhU$aPeJlWPRIz9 +qoPHHKXG3UG3bA=iBZoLpnb^?(2;*BEj=B*4ivhFsqj;N%)Zu15ukTp27Ry@G`(hUAaS!<^(}NdBY%C +;22u{<+_XrMfI(lmyW~_hSJN^jQH;&rJC1w80--7GT|Kl!UnF +gU!a$Pa!f?zG|R9+HC}iaTvMvqxs|Lvg1KR~wNQ{7~F!!_`LQ1V0pa+Hhu%gy4tbP8&|H4ai +m8X~W620lA7hZ8*6$Ay;vyE?XEiAy;vyO()kT3$?ZYuib;9i;n_1g&i+-FA@f)hz;oxBW=GZQFU< +c98DXHwA>sdsSRbI|%uswE~=w+o7s{EZ(9WM0!=6Qzz8etKy0}L9`#eA;7g@ozQ|^eVB-0%#!wuSvo= +ZSH-(@obWpkzW9Mo5dPJ}0zwV{NI%+nj!tj~SH;FVq1s+OEx=XV4rDB5ngtnuB;MBLOrs3-R^;K5r%{ +G_E8f;+QKKw~?vv#LP;W(anX9)Mq6D$1%z1?@2=gQHt(o(!S*Wm|h~Z>Gm>)596uFdYl!u!7$!Y;Xn4 +d`ag6!%?X9T#A3yIZ_&IxcKS004C)J}O;rN1t;m8lZq#)GtkJk%uw +H&#=k2ew&PBBRHeJlbgoC`sQ?_=?-h0_R<|FAaRPdh?LsgKFn7m8)MHM78A;3wff`r67xD; +SiK|=awRzfjyfmc=tur)76F7V2L09*57fR;StG#8HAXJ*%E +Qhp1DHmy048?X!Wh}YD;oqj$s=2MWs?9Wd1MQ(Y!=`ok8I(Utpc3nkuAKkO@Na;vV~W62yl`|w(!a>0 +Z#JB7G4<@;N*&I;gz=pIJqKQ_|YB#POiunUfCzW$rahcD+dHPxguM5<&Xd;S7ZyXyeq)T71_coM+G>! +A{Th&xBw?t40Zy(+1zs5!;N+Tw&$>G%f<@Nu%A^3>(#FWzeY8_RiKibF;=T`AyQ}> +IY`_vDYxmJ|0il+BA|49KyHC~%K*vVhU+O9g=J{RKhr7yx+}%}ie=c_yBX@Uood8!^kh{Ao&dufS;yh +HAXQdoM7JVRG|FM(@QNJqX=sR8%5F~wdLIC+2sWkL9hX5lFGzXN&1+H~bn^=-hZRU09Ck^1}XxBxe+8mYfex90_j8(~<}>=o7|Ej!sP +X`!;Jyjs?wB!8M@c>mh}BITj)cuhXs%{ffky=FQk?FNX^DH3#_9up7@Tn1{AcCheIj|&JL!cR{K2#)p +BlLG8)yQCc)>$SB4?6kWCnY(N21VCo&nkOAs1(CA*RH|SnRJc!13kY`esVD?_xlhjsfYqE80MVZl5Jd +l}h#u*=PcI07=%uE0Ao@!JLZI;Jgn*y{nHQHJulMPcfS`y^FAE5Y_>?`W1nIqN;=r_v4X4iHIa7$k>$L!iJ0nYzodfBy60XCpZ +kfFNvmH->jB?ua>?G@l!ID`w=_6cyhMWk@;fB@IRAwzZTkN_uFWT>vaE5OMW8LDeX1vt4PLv>9W3zwl +vkfFLJt%S=^B^4^Mc(tmR|EM5dF&#H)EkTw`4Wa7g$lWZq1X-?Y`V6;VtLpT6Ge}uHw99fORdCI})k} +j+e=E+s3jX1@bml2iTh})V2%^2dNk9stf_9bDfkAk_5hZwd&ixV +}w5sPNaf3kVvyzC%FJ$n~89f)BsGOF*dp*LMpD8oNF!AZYCR9sxmP*Xedrq{KcuB_L?*voQfdW1pQC5 +cKicxPYLK&&~)4`uOaufS`}h&It(m`0TuZppVZk2nhQ4?4p36kIya%2>SSJLO{^RXOjYgK0XtBKo0G* +%L0NvK4Wl`B9(T1xd2$u3IVX7egUwL0Rga&K>@IjApx+DVF9p@5dpA|l>%TNs|3J4RttcAtPueFSStY +bu}%Q&W4!>_2lFhcTdSL5F3&FGyW;w-Np6e$C*k(CJhyJ=a9M_>w(V@RCp2l_PQ*`LBi;Hm``V<}d>*8D7T%Htjd9 +I67acc-`#1vC(ZirWNQ*2VKM!X?j&8Dq2viUox?CD!TM*)J*965f;`r)x7jDP|Sjl<3CIDoT;axhameaMcnSoSWik3s)_Xy16Niw +s6%FIh&i}XkE@GMb74?I9ivpNs+U;DUR0VY*OTGZi=IIIhzzYo15ZBUCt&&&gQ1LQJ1qxk+ZoeZq(&$ +QsiuIiW_w~n-n>lo8m@Y&L&09=BBt&m$ONcv$-j5)a7hatZUk!rcMRe+N#axAyD32<^na^={b4he8_MUv#!y8@hCksY~pRDhE!(jvEx3vhBp +KIGO(0Zy)o4Y(Rf2)I5MNnsA|S+MpNle*Ao|ab2?(Lt=b{r#m-_sKfRK^;TvUVk8=s#N0DX)JfIdzOfIh|rKp$rWKp$rXKp* +D>Kp*D?Kpz(bKpz(cKp&R`KpztVppQub(8rVj=;N{g=!1=F18XLKw_HHb$M2+V#nQ>&^$Q64_}zejpp +V}T3JCi6owTD^Ncp>A0d}9GhFdS$!0e6B59lkp1y&6=4Wr>wKn=I2Q^O^68eKaDrr}mNG)nhdE>vt(c +B`jmpW7QPvimYMBk3Z^rffa;Ic>Ir^uIiGn}*UvGV%6GgMxIw9x*7`#O>7vx!u|dJE^7VCZ4tW?DkTv +$ZfxtTA{YwJj7ORXHc}d?m3lvjtfoOvD^O3CD_}E-2tnex@#J4qp^nl_IATPr|F*4bUT=3?wZ`~rRLT +mwR87fu6Nun-8OEnr`N%v<~#eh-q}AXumkv}g&E*B3vVLx~`2CJ6-qAT^spzx^6E$mr +dyuZd*HKLhc;gd*`4i3Ogj-Irxr+Zu7bVNXc6DZjYl*%T!*Tu?WtB5SNl_yKwbKH);8G_+Ehfm)*JSot9klVQXf-{C$ffhq8Yv7;Wv#K=oJrdvk+eK@NPh9{(El9nl+rX8ctetk%y1k7jRY +EZR47?oFd)0UFLje=6q-7Hr~vf@66oBnwj&Rne&~Q^PQRVotg8US?=E1ja_8UcV^CaW?j3HXXboo)^* +QuzBB7O`MB^iE8KTEmzFt~mN}P}RZh+>HJJC=kU4j5FL!P)cWy85vsE&8ZZCIkFL!P)cWy6tZZCIkFL +!P)cb+YGo-KEdDR+)3Pi>o-JExO7r;|IUlRKxAH{2ec4clhsjG2z@y>m?V0A>UgJ?>T)mos67c$ +lZ#8yzOM|{6g;hLhib6dD}Yp+{IM6+ms@A8|vn696WdX7UjF&qfl)K(qx6l4o*ZGcapZ)f(^Bvtt>V~w +Xy?0)9?xpM8OV_!DZelx_UFR0MZh2AHxrJ`(e#^OquG_4t>ryG*hOJ`Vh7+^v`gEPScb&O+Teiw~-Tv +iW*FEYwQ|>xb?mAQMx+cEsn)t43zPqmZ?mE-yy5_sz +eqkYvQ}kyt3RmX~S +LX}2O095BT;ZCy!ZmS)+uFV8xOa95uENc_DRP^1D%=#7!X<(VmnbW`?tNT+F1prl6kQu86ou25+mfYl +b-r+Wu@t3~v#ZaAtIvho!MAXk*V2WoC40RW*WI~rTA;mOC?{Z2SF +{ZS^nPZbM}kQI#$sUb@~`*^&2=R4K%wP3bE$Yel7-pjT!#z$@L%yfSm|<64d~bLw +&v>`E*_zcaD!&LycOZqumJH8iE0hE_VmES+JNt}!ZIV^lihE#364(lth$~7$&<~7`zTqDHoaE+0|J5&94E}s|ZcIr-TJ*eD<2^EIm?o6$t|L +O#d*+P?kXB)8Q-~l)L!l?T26UyG!-rPd)K>)<~plY*InbLhgOAc!lFLsKcYU@vP6BD1AF((Aw^bIby0 +zsQS1Vgx=5ZSkwx!~LSq-9M6ufeA&On5H;P@VH+rxSjJe8-A$RJDT@zgw`CoJsyz3(Wi>{fDViz1ov +EQjMab2gn$o*mxxnE2o|16gdsEb@hOs6SbI=$hPq7KlQq73M?q8w;k +5iE4W8ASzE^4`X4pFO +NBlD=`t-j>~jJn9bSIbr8mOE;%F7m(VD__gyf9fK)A85-B5JxSSPN|DrMQ*tRWa=V!RoiQ*-RG)%+n; +dKUK|VlM=f%%+ICZA>LULVUbXF(t4!@B_R@CQ=cw&B+iiRM?fB2`M9z11{Cjm`+x3b%Zu(7Kbec}89e4g?UE~a=*#7Zi +lx>qQ0FM_hrc?ggfxzpNl=L3UoPNzlS83c_rzR|Q}W`s)gUE`F*Y=;G%Jk{-1NbI`Bq#^;!XeszT`#Z5D4q(4h8r8)J@Eh2h+Ofa$t2))uT>f61r9$OhVTqg$g9pw4z`Zx +}LgGU>f@LnKuE5?hMMCRsJ<^!&=K=T~|MhWw*!rc)E +QmwSPY2(Rjq2iQpA2?aP|WUCUK`uVV1ECE-~4Ls|caTJcTO0!*KsP!tsOiP|9cFT8qO36clrh7<)Aeqy8mpE;%kIy|KW8zyU&#tA1^wMt`;hO +270+&lTK5@_gxlAxhav&KCps$`ofSRf7S;UF;8C@ +QRI*Nz&hsX3#%0Q6F;z&dHTW{MN7y8joyWIiu}1BSkOFuVS^%nq)J42Z&Kvt9Z}w!6?u6_l=oIeUfvP +qy-ksqcSL#bP~_zuQQo^0d3i^a_oyN-?}+k#OOcm%OnK`eHvXK}GN!!s92mtfqkG1jVvX(LBttZ>~E@+uh-eZcqyc5cMT#=V|LV2H6=OEf-%*v1NnuRu}J&j4j!Zyr?eT5AKx>%3EE$KRC8*Qr_y~{n&N +cq`cL|`{QHFCgrUz-k%^_HYsm)@%|9mvPpTXi}&ZqmQBiAUA*rhmQBiAUA#X{wro<~>f-%@vSo|%Ru} +Kjlr3A7x4L+LtZdn$yw%0~lV!^m<*hE>A1+(AC~tM~zS~^3C~tM~Zd=N_i1Jn!?{=oFizsh(@qWOgMB +aV+lKO8ymRlm@K7C33w?AmMM6P}MlKO9d)@+IV`}8IC-)c)tkC!d6Ddyv!Tvmkn1jgyP1w(aF5Ws7% +De>Q*@%#1B{&d(f)QJJy6J@ls%CH33~w7z?Zb0S$K)#bXqF{3h +Ll~kAO51B19R!McaZimdM%&8J}xo(rpx`--Km+NNiM`ccxsLOThRq7(DL|v}iEwe77O4Q~0gJ#Q|@>Z +AYCM(xPl()KEe==>EQ{L)w-OicOgL%(?x_UxgZr97Z3wckd%XJ5b)J2f@gu2|WmvZAYcH69rC~tMSZcCB6i1JpK>()QjM +U=OO%x)23T|{|n$n19BjLL%Y){xn4z8P_@`}Bl{%x?e9s4OUN4VjlX*tev-)x|Gywr@#!tBYUac;Axp +Ru{j-3BM)ftuB6vLw-xjTSMk0&iO4VZ}s0x9Q9jL-s-=XI_;P8R{!k}{4FcWTm83N^Hvv8-s->I2Ay> +g<*okP9~)d&l(+hCw@qhVM0um8lgo&D58M$80*N*yQ=(jy^3kl$+s2pQ}-(3r@o_z-?2{-zhl25e#ZetRP;ebRJ8cM%Fj8hn4z3JrHG$8r +ih<Wa<{8Vu}m7h3SrM^xx891dDjY%leQ)_lb@)z$Gp~*+Fp~NslCwBlgs7s%!n)B>c-eYgh7-27AAlL79 +u2?9JCPAuqKBrM0hkgY#}CmOpaLCe$;n%9`&8sqrNkL)OU6t^_|6|zO#JPcUF)1PG-j@-?otY+-o8A` +HqFu=ROOm&;1rsp9d_YJ`Y+*eIBx~{iyHkJnB2MM}24hsPF7P>N|@^eP{Wo@2np2oy_)4+3&>ktJ;rS +2z^f3@5Cgm+Ls5&crxy}ZESr%R6b=zf!SKM%eN3JpR%IhoUJJ*iuR*K(Rq|8vPX#`Us@CoVE0kqSv=} +H%SU}@^@#8E>lZ4f45v=n>(QW%S%$+rk6Gr{tWo+WM})pW-E9**q!^t@$I(+SJGn%tfabrIC`o^3Ihcb +w8*2F~#@(Gb&*Q`*VEi9RMOLKf10q-g0k+Dqt`0=1ve6;&Cb`_PGpk-TR +O|P&H^BVil=iO*2uvfx!gmS^%4v&{Q&9?3ITe)C79%IWY_TdKC$+=Uhr&$my{G+&l0wn`1e1JImlX93 +YMJYMPx}ldg|pHKrz{1kaLOQ@|0%$23{)4mnMm^|ws;OP +S-_)ccs6e|4NdNhdqz+Wbl~hkfb`4(qU`K{OU9G^bZmo;%ztDrj-?iNKY2rSYhO3K0q;z-rMn$%ZSQo +YM72}F*PcH6@txu_oY_7I0vYCatsOs_gF1=J2CHR2T^*^Plq3!~kYOaf#xaVyBPif0gTp&SW&&`GFXL +wmHX09H5@?ZRg5}Q=6i&&Y46xpP5+?NKW{lh;fX$PV|x|o~#)9aXfY$rVKYqY$Ot(@K77e}}dgi!q@0qtHQN7f`#5L%U3K``z_K`)K8dugQIOC#-G8fo{^NV}It+PyT=?yZq +_FO9T&X{6mtBW>T1AnWnCf~8m1)?n$igEa`c_=N(jPTHX)DC1cLK^f002+DXtK~Tnv3OYTiA<`MIC#z`E^mS|6eI^u~me{B-d6c +@q)o1sd=#2lSExTx1p}@3gUcT9~Z>={sASyBm77~$Z)CA#7k%(R6=pJ5q3Awik`R-Btn?03PFUcH4WP +ue6dkUP{J3Rlmtut;teH17hh~v5~{CSQsN@T2t&6|KmH3v=vOUQf(6^-N~&J>VC~4=mHLft?MPh|MD? +VCRu9!-SXVz9gStOf;H7~D7t!4ngDr)Tz>dOLVAQ8H5t=9r^(FSOA$K+uHswwOgQOA8y*bTrutO;UJi^wokb2V3tl +p7E<_6zf{9K@iYENzIIz5FbO$kk*qK(3Cm)k{0Ap4w^k)=sOZc3Qo()9R_6R&VXJ9-*C9PwljNX{Xgw +JFVW@Y4y@htCx0Ky|mNnr5(3ZR9$2@_O6S342I5FpYvyK2k*Mb=9S~fZGIWYX!!50JX-%#S{Ujsa8W> +vDB$kO6ZJo#NuQza0@rFi*djF1q9v{>-BoU)NSt8O*}df}6=guH6xrF4aT?pL598ELl&XvD9&K?7=NT +yo=J_x=AR%ARJ=E)ag8?V{&|to)f?&N31;Kio3WD*r6a>?4D+qSmQGlkfPf1WhWW<9;Fjf-kaAdwd)Z +fT_elXm~d_NjK6#yJ-q!NHa%n?zv5`yLjVGiXNceHRx&sOS$RG"G7wyMoZVJfk2qF3&0mZOd~CLenCB<`m1>o>veWmK +PL+cI8C{p;>uJL67`N+6@iexe}g<5dMgAFnA0`gmPI(8o^|EWP7h4T3&?t{~{+7Yc$teyJenL +-KBE(PK0rEutPZvFMR^PB9ZjYa*7tX-zB|J!&GBzG+P?T0LrFu|)PpLdu?-=hyf4NbsaZkMv@SIWAgR +u~JSeD^7&b%8J!;T3K;8vsPBDnA6HyMm;JkR?TT;#iSUmtXMgxm9<=YcfuMpdsNo4)uXavl8shYOtI0 +*iU~FvN4hn1an@(Md%jPXxh=Hf3=!$~zyAY8!Jq%YkS2&hE(e~Wj@&&u`kM<1-7Dp8i}$+7&ZUX{iJo +|e=(HkC@;EiF2s1oRol(>PI;#kCJWiccgxL(I&MRsIT~ +O2kx~M1vx}*r>!lxz_LGh<16(Rj_YD!TFbXgG+5U1V~gu$@8W6KpmUt=p2L0@D2ilDEt0Y%W)*q|clY +ivjn^fflD2>KcuQ3QRBtyBbkjjd7yeT}VF1bvOIQ3QRBtyKhljjdAzeT}VG1bvNd5EN5i8x>Jsn-o!B +Zz!U^HY=jOwkV>$wko2&-c&?=ZBs;jZC6Bn?NCI0?Nmg4?NUU2?N&s6jVhwP_9*gx&`($Ex)TNBZj;* +FtH|Z^x=3kVJ*ost7tX3%KvwIjA#RMe+oXaHD{_rQw@JkuQREtnZj%Z*rpPYXs*A7}tkz}Zsjg}(f;` +n#H4Wsct}eMwIPQ7qLVdH>M2q&Mjgs3TsxG3jXp7?;=q^(3KUNS#@-qcNB3IPABjLSWpop8s?yF+=a^L1zP)kT!II^B+! +cZc#;XWQ}e?oi%uDf05pC~x(wZbzuPi1Oa2$jdvUybmby^3EvlLyEk-Gs^p2MPA++<*iME+wQ3@qP&k +Q^776o?~{tWymQK1-Ll*6sV<_t)qlF}p5ks!d22B5wtK3JC~pno-F8oP5#_DHyW8$5?&g%Y2JLRUr?{ +I_-rDxM?Vjo)%3IyI+wLjuB0qL_T>ZD(?x`+ZD(?x`+OUvE>m-LvBd$2aL!zBlv +W#1Op-@%P=cqL9MRJ1E?_g>{ira?x><3JO2}`oXyt<|@};d2m*QUgg#m#}7_mFjx6!xzp2Pf1p8K65GqS5!%)R7hrnJ&wLBh;?1B!x5XIH9qVlTPbm1@&ituVVvzYEJ1X1APF6alFWa +pcA9nS%EU#_Trr_gEw`yG`pMmPyR+I;AM+Yj(HF5WC;a?$%ZvyWhkTRxGePQLs?8z;Pps$l^uvoP*YrGDYY|NfA4}`vSfV0AKjky)-xv^MdZsie +0Eg-F;Sg0|#azarDNX;CJH0D-mJ;V}?xm6lZVS&cnDkG?%uesI76a{_FtshiW0ZCS&!Vt^cW^KALy?A +c(K}A7db6d76N`SOE#aPSS7OlOQLp--d%>lEB=ib!HhVhuWH{VbMeeFsy!2C+By%=bkU#Vt}btm( +y)EqG2G`~vYC~O2Uze?){2A<}3tWyMi?NC3D0jT-C8vkND#QDAY$ry;5->Z_x#sKpN9vYE^t36Mnh`C +qd{6RG)>>n_HNNX0xuI3NxM_>zqd7X{JJrd`2P6&5MoY$EN+#hj%Of`V51m<-pihCo@pVgoV+X>8{Ri +}=zt@(3WRk17L{3TT>#<=Du)ZCF~nZK-66=PlVm-RKU8{+(B?T};4YoTAg4t7FZ7*fN<*w?~{N*-GrE +{tfU!x-4Yi21FcuZ69uWsHR_ys32qTN^HH*H#^4VhcOf(PCS}g`MiuF*dfaOPg+NX}BN43!|Dcz|ph|Z>bSs%xvMUa0rMd4NdPJtaiO1P!jJ&Ed)K6j>Q(#I@|))ZQOSV&)9rmh=LWR25zw%!HYN2i@Bk8Mn!}z@cW-^iooAvy&7TLkvBue~M$kI&@E?0yt7zbA +`FX*OcC}Z9zL!J+c6FfD8gopgAXf-gpfT?pT4lANcM-)M&gIc+GhV9^9MNsMBDn(G~;A%xw=^8~;=~ +_k9*E&Ve*Wh|Z(AVGwMbOvaMn%xq;3h@T*Weq9psyhn6wkaJdPfoTHMCC=^fk0!5%eX)a|w4|nI1Z*2 +>Kd2qzL*NI;;r#8hTd|^fjcOfX8;oC}G0gR;Gv46Y%(sA@u}2BX{V8BIs-Aq$22RNNt(Nc?_v7^UT~K +wdE%DrMAqobBENHIca)GZMkWOq7!bgGCjCO5$$TLBIs#E&6{VDjHr3@ERqp5Ii5u_qISizNJcg*f}Td +UDT1Cxb||7rWWKd8 +pTGkFKqcv|#>YCJrfcTkO|ML(!!z%zOW&nco^X;8t_PKLCK@~o2~t%p46WJC>>=bVh_8}gKsA+3iz<7 +8;NBKkqCqCDSZcu*1aHLSq|&o&uW)8ok|!`jU7T$5pKW_YT}usR2xX)>%8na?^P!HNr%f3mPFHM7k?G-u=I*})de2*c@?cO&@%3T$szxY_)Pxzj~h_K(lm~gac;(=N~SfF%bIv_W>im2> +Sf@wWcOS(C5EzwX%gi|FF-B5BmJW_Wgf&+kR>({NHz3?p$>oLzlH<*6U;FvUbe|#=O(mNeo@q?%BYUk +2Q*pq05<};|4bQo5ml+E#7(5K6Bm4}sd+IJxiDg^ +8s`o?HnaOJg$eXIyX}C1(C6&iM+}VlLPnnn^f|ZxvVqX&%*J&FLZ5T1E*c1Z&Y#|EAoMwRz^E*NK4(@ +N*(T8EHxv5|gg$3B84F9G&za)~4TL`DcG<^5pWjTHI)tMT9-ALG4NgLRt~2J4_E8AN98%inq^Tw;^f^ +Cbl$|Do;|5}`+|~_>5OrOgRD`)#GS90Y2MGv +kI5Y%kkX5KRy`c%*n +CT5o#l}o;gk-A3ygkn;sqbdbdRQOKp0(CV$%L#@)HA~vH+yCnV`f4$jTkc%qG`mKnGj7Q#>|9h8Zl-j +MAL{dG9h(TrzmK&j_Cv;6H-TXih@e(curAJX&uce3M&1*OcktA&{rMFDGK_k<2Xe@Uv(6xDCnz>;S>d +Z)e)ScpszZ9Qxx=7M{kOPzUtUbQ5Uaq;oI@Il?Ij7aorzA&AmZuf7p3SkzHw&#K?n~&UB1Ci0MqnZFa +%6#v>16I@2-oAa$&!2#tYeTjMsn;A-s1gXsE?8lek*aa0k9^j0Y1L|mM@qiisVQh +T23Qs0j4wB4h*qqc+GRNF!BtLXg_4b&?bgy5Vdu&B;uU~yBHsHM1e^OB!XiO3IqVHEKe(2nU-i+#Aqvx`e(4_9%kB1~h=Is4w +kTRMeM7ZWZ;VR#{PBYLylBrB+!{Uuu;V^`+riMSZEkR@9doY(;%(FR`M&)RrsiOKrKLzBCl9s4q41iu +yXO$Ys-$KJkP11~%Orm^Ai~^hJ8j(Yj*Y>))%_#Cpy6y@8#^u_k?qUNdPVnDo(6?yn8({&V_I=`{_#X +56@gq>p~{;JyBL>udA^de6hP=c;|^;>)bk%i3~TeL;Wy;gfm|UFwm=x4ozrWO~7*F@~g%?)B*67ah?H +x^lrl{W$|pL4{s(yncv#Rl40{i`N*jRC>X`~KRHn8_W&9`+jYPl;mwPnd)?Dz{7e@?X!vBI3ZFMP_6HC~BoV +W{AO);B_o3YA$DVq(a*_bWIYSY-uK|urSm#APoE@)uGVwD)w3)qk>x^XK33H*DW? +o&UhYoBC)imlJa#S4x(VXzt6a^K(Aj@Fx3TH)ZwMzeJ3dR_+3QLW4Er;Dg9iFJKKh^1$!9hs1i#yGmI@j^6iCCSYl#dcowP12I3r8gk6Gjg6+#` +*w7%|FruSR+6QH6b$S3%^8E|aiNZdN)bDT!Cl9YtaA)Ug*q1W-gGReyk!}NdE1T!MRy#-scB9y80w9j +WH6E&IniJ&H*&JUXl~?$gYn$RNe3gkkrNM(y7TfuV$KT)i8(K!pvl-vD5x^_5(>JEy@Y}?V<#bu@WxI +;7~_5RmB$qYZ9Zv8Q03!4RTA|0qsL!W6twvA&y)lezVd{UpuZ|4G +G$N-jJZY=YOOmDDOo>g7Tg*1m}M}{(_>QyyqPY+I!_`B|&>H8PbIu48pnHlg}s$I(yNOps(j266p~1J +e#SGCW9iM{gpfxgTc>Rgd@W&3YvVzqM*vxEo$JqRl*nye$fzEq9H+<&l?hS`LtRu27+HQB*)7cgyX0T +!8yN%1Vuh?2u}Jn4g`b1PgoT6WJ!!)G6)7|91_NWpRg#X$&x01%Ala87w@jz`kKPFLi3hETgJ;^82EX +Mg1TO`2nX<46!i7#<4-CoiTo#27VAe~Jopv86T`tT8A4ZS5Hx2b#p;$Z;ziMn1ruW +sM%kz5xc0@3CTgSyZBQb|zEvuY9;&VBY3B|$OIy`&`Q<@x88^mKa|%6_c$o39MY +`B`1l%u59QJnmr0$rL)BEGape!ZJ>#u#A%_EaPMf%Q%_BGESzjjFTxW<4g(5WTu3LGE>4rnJHl*4<%XlJ&V~W$9u^My +^WTI@~OEO<0z?4g9m_;+Tb8)kJpq+Z`(u*)4JEq8L{XD6$*>)I}+-9#UjCqN$6TxOzm9-6p6mYUAovi +tHvmby0?^*C?{v1Jy-cT)j?_-L8pz +UPwwoR*xC~x%;?u3`RD9HQzY9*mbzrI$9J@+VUR?=mV(5dI4Qd!G4$}P;X_;&X`MNaB1%%}Kv_W?yt> +Mcy4_;&XpMNaB1Oqlp~_q&Rm)LWPz@$K%Tik#G2nBws5?&FGFEpK5i!?(LnDsr{Fl~97?io669O7N^A +FTsQoJg>-0Frfr5D)JIcD8UIuUV;fFIHkx-FrftBQ{*Mc$Zd3mBIhSsjNC>C6nS|wavL2|sWmk=y87ioCoTxsC2s#l`r|Y5)uD+zmp1fTb<+yrMkv+_?F2XYCv ++9vs{3LaeZb5CqjhpsJ*cz(NQts*Zj40T@By4-dl +P>a#!9`#}xT}pJ+^NgtaE=o-uoew};3@P`h>+&IGiy`G6bzMHBY%!$Vqpr(`lr4mm-|kV@<+kRni%{? +OsOxe^KWD9sLRQ!1j()C-C_!~y?&#;bi1kj@?T&t~izsh(UGC`Tx`^^t*X53Wu8V@auO3tq>hIOvN`l +m{8o{6zA5#)!fAxqGFM5m-ezHeN$i04|7KkyzPqZdri16FvTDf!TK|@k^By?RwJ!nYkj)bm@?9fJC<3x_kb(VBzpZi}yzNtmZFeMVUF2S=o%*Xv$oaE&;eXMcHkx%Bc +0;?m$km-r%cWX7{=GU~dpK=f}72S>lqrnU`voy7$T&{;Gz1udLyklx%VIRj+bK +D`#2d-Ya)o#n(kkT;(cr-sdEdNB&une^%_iF^`wH%I-&07x`cGH9BX6tG)3YlQX|Pc3u%&)=?#4AmQ8 +NZwPAoUvD}a$ho=g`nMHfm!9=|6=9d2_3tRcE-Q_d7Ch?@D8d#z>klfz7Ch@!n%vxW{b5 +Def@l4^im(OG`iG5!#4bG#465(OESp5mkCo5mkCg5%o2pi29mTM14&uqP{LGqQ0c3kt2ql-mqK|^ +tEAyBIs*Fzar>s!+;{_Yr~)-=xf7}BIs+wup;Pd!-yj2OV0hR5%jfTl_KbC!)is)*M>EUpsx*U6+vGc +)+vI%Hmp|!eQl6rPM%R;8x>Jsn-o!B>Zvp8YqKKiYl|Z4YpWva>rF+}*EU7e*LFqJ*A7M0*G@&$*Dgi +W*KS4B*Qg@uYmXx8OL|m!PJL+;ms4Nb#O2hNHgP%irA=H;eQ6VyQ(xM|<h_7a(|VZ0Z|v(kh +N%4wi{D*u(*GIY^5UX;<2jVzgIk~Dv+!gAyA{Pyy5q4iQo&f +9BXLoN?gxw9#sw%NYeQwR9BJ7qYYvXH#-PbM;E5dGh!{-%Y_q8>u6s#$q-K-S=3(9AYZdQb2kXNcIv4 +VVV*C9pFmmC*dBb>pyUB3(Cyz@KM`C)1J{P~lLaOU7{b+lL!zHr>!1^YU$UI(kd=iXVX2)pGSP&bB^- +*e~QR)pR1HfR;aQtySesuYX|>*0(wg3CPmrXuWaxKArKR&~!zn%}~))noedSjIiS;<6(6!&UDnfc*P1sJ!5{XUyRduch*}C3RnLrQ?Zr6r++lMU^mR_PjPd6A4cZc6`SijLZEi5`Jbz-jqM)zYH7e +c)^`&(K*}3_n<_&|szPWHw5&Ypv^-&m)o?Whz$Fk|U^%^u`TzYQnDMhfawc0vhe0px*gd)U=m(|QMPC +av3LoKY8{^o+Vl^Cy{9oGtgb<(q2HJ-w__1qaXBCL^~k!(hd5O3_&<_7Dd=XProfN|{kP3jM^HhTVuH +ls+C&Yn<@jYO#)S6w5-8>cnMMWS?ejn*h6O6S*TgpNe%?0R*TNR-ZPHFrT@mrf``yfLI&Mxu0P2oj~U@2R$tD4pA{l@5v0g*P?+MWS@!U2_*gl1u6dkSJZ4(1;I-(wWs7h9glryGw&6ZjgOkn;j%d=cm +-Bktm(Hs6AmMN@s^P;^PL{E7hrUgX}l7Ipqe~llv4Qgd9>&fJEus8wNpNhcviAqIB-Oeiss@^DDGsBT ++g(c~DW%*ZgKRTqH^tmYeUwvDNF$8^UF-)Vje9vR9i2LSJuaClZO$xdHWXNR-a+Q~N@q)H+&jkUgQ2N +1}A*J+);dN@v$;6Ng0U>d#7KBsL95~Z`tHE2Sj +bZ))&Jdh}z+oVoCW0piM1&Px66>8>4lrF5)ij73+!Y)nLAW^z7s&xa2(uKD*pw1bRXyA!N>D)n8B@(3 +z!{!a)4|i(Zfkf%7?2B3>oY{BDNCWyBFfxRFoiuL<`#Pne780eiZ)$1>iBcPrVs-S~h&pquj-K0L?m| +{;v*rV^N_t_1K|B^-BR;H?p53Wh#zN_Z?J5myls&Ur%^a(xXGhhRv0QrgEp3;(Oo3>;fd$jEm(+-`Vt +Q_)c@5atR#ghtOwaArG*XvcG;P1IYI?zht5`Ozhh)?U?bk|`A=XVV?9hshh0`<3^$oFddghFN7gkQso +>#YwmDBT+1|ftr28$)svqReH#}ewMLn}}$ulw2p63Hq9jvsT*{C5T)>+St +X<&_2*0bBShmS?pv!iOASYti=&S6CeA;-;cAtc$TpN<9AbK5l3!usmDDQ%Ikyn240elk{9&+k*eh{e? +lriYKE)eF1KYrti$Rp*Cg)w7qh^~0j-nT?~0V1grRXIM}@_lCADSWZ2^O@9lEsTX!?_=Ba?3u9VUv5< +PLYVHd9nmeZ5Ld?sXJFVR&tc#voqX9KmMbGuClfatj`Qt{s$Q +nK6WhMrj|O35&qHnVa>5nSe_gNk5ZYc?xF$Upw3BDl;GLy9(_y1EET*r9@n>^$VUht9#I5~ +*tJ>_EMotpB3Q%$^INcp0|ykrA`Wg)ghpvpD;37Q=1yN$1P^w3N|BubT4gbZFyBz*g^zKr`J)#UdEsL +aYhk&$8WG%pzNA||SQnuI*mqJ9`lS0*9~_3-e^^lv-@-YqL>Puz7*H)@7;0gsBqcHoLw$4kgd#YUfkT +SWCmm9o#4yy14gh8thMJM%@@j=L(S|^8Dbb}X0IAKhM{KOF?VrT!@N8k%9 +xQMhBf-PC_*1+$ov*_J`yTr7>1f1Ijsl*)>bu03`5OoJd|M=YIdhe9>Y+x?`Q*nVW`=&TBCTP>4k@0Q +Nqri2maJ|2bIoFnm2_98&WZ2q-t*EQAO}z8_febvS>aX-Jt#IrZ7@9cR(vRMylp?3P;9~ssj?9WgMwG +pxzQAReFkCjWF_YP)!gcRdWZm`e3AL?p>|>7^#{&vO*DBoRj7*v^bjK%P>+kcR>Y(k*c|i=C`1)DXri +bshVG|^${ag^CQO +IhFdQ|1`J5u;eoXs?;iv^UV6H|8wBCA85!$i0HFCpn)a;70ih@%9xPOgWEXJeeS8i8iC%07@2AjUQps +_6mn`Vaf_gieG)Wc%1>6^=1qcPYtGo-Z)gH1ET<}S2SYcw#&VAISR4d*%7WZE_kHf`Oi2(6T6$1-lkY +aD%xgM%8aaueQn#uXtAa9~gox+w>=ZR1GNyZRa&Njj!Vk&z?~>3G!Ygnlwcl4hpfRRn!qRY2Nwde*M`9$&3^!*ONivDf3?oUi6XrFbuLPmvD2yb{ZGTGz1yGqQwA&+4aRu*n8e7;KuG) +L;~YO*SOLVAK3MHFpd)&2P|}g~6uzQ8hsfHq9SUJHuep{6Vc*7;Li95(b;*k7&Sw!6w^Z$6(XEX8ke@ +Hreni?>S#7!(h|=QEeqK*kpq?3^vW5(E5nMCL6SIuxV1iO9q>?Dd1q!u(o~}Y+6{QQ6LAKc4&qHgH1L +H#9))n-EI;KSHmt;8)50;Wy%=mVlkzhRHvRFPy{Z+AHq}g9O$;~vao+}wws_ +v^3H5&%Z~A7r1`!x<`ewP-9E>;p@xUtW7-7Kaj|axJ-+>XQKOQnUO$<3LObsZ4)-G#c;#N^tITFlIKd +mIl=;`N_1PML;f|3MJGdHC`=B^;1*Irj*SD{onRvvtQ=JRvPQnCZe8e~V61ucAj**>$y`;IHKEAQ)~P +>;XZ@w+q1TuM2|1phBi|4tGsIWnGKyrU$j=8KI=f@;3ltR%?oi!Dlm)V|oIB*^TG-AaPQz8F;!KEJXgvYfT+qOvY)`g_U>s@<@X5; +KfeXB-idskg_J1iQLDp(M!i_GKmEtG`;VB)s2k>5k^e0p8a4M#k>8N(uS3ul6emzw?zOzPRVaSA$Bz? +|e0&1iv$^1ivHcD{h4F)jB1iR)4it3Ep76l2HG?TB!u@wp~f6LtkxDg145`54QvO>ZB69+qe?Efz}=L +(!Ww|qbL5A)++Ryzt*~gzVX-E5}_yimDWUbD!-O+n9I4p)+T0>aGtX?2>DOUqOZ_hTeVC;3wb*L6k8kOPX1*PrsxOb(--G^++xLY2j@$d7zZ3SpjLf_X^moEO6Z#vs&n(EyGfOhnExL7I +j+@^@x9-cc=9%c&eR>f52>^Y+nD@deAE;*0h +(q2i17KB)MTy$>qBWbX?qzP-ZUSCSdAR%9wxbOmp(Fu#YcV9nIj&=stini{%-xBJbzpeuO0-~L{M%=} +)H%=})^-|YcyAiL-j)=XuFK4HzwduC)tW;xjHL1kSs^L+)G`M#3Od>`~TXubix#G2_hpqE%P{RT|Cxj +ks!6Wzs{>3gEPSTlW3%)GfhWZ$z%X5O|{c=oMgY2|2hUi8cn3+? +vVP$PH)l^eLd(~8vfvSDaoXor@v}glkOwXyAdC!u}yk|wG@7ZFYYTgsGcxtBaiA0ABj4_X=X8N9($m4 +=$%;a%FGtwt@&}`nbMP}X;`m+HwX7kj{yk|yc-ZLjN?+GtzBZn5F7<(VQsEq(Hr^iJAnAGDU0LOz9@knUz2sVJ%N9X6Ea8#-(#?KjZHng+H*7i${W4qdEi +U^~nX*>A|nMwHRT+IOLgweLa~Yu`m&tiB7fku}qI$;8F#yJU2+=3O$nSo1EKxLETp;$qFa(8b#Opg)^ +K!2BSWL%;+fmqS2a)#VT}<^t?}(4Wl{WReRo_en0md;@a1Enq=nppg)^Kz+@oi5FRk-&n5wKcJ%FgLVq?1kh7z2?}Pqq5+Ik3zPV32`uYuBcJz&0y3*0t-@ +~*Z*O~9Kqi^qH6KUQPGlN{m8&iW^$GgjpzG=$4?C9HfK@({^(3l?NI?$LO(WXutAApqtGxy~-eS6pWovxHn{7t@4X+mC5NHPdg$sEzB;Vw#Za&|*xdX4>`_>?qo2 +=49skx@6}2pg$WIU_7X1=KJ73ZChM&EW_M~_2;hL#8{GRH%sYanERytGxx!N+BU9~_Rri0|7qI*j9=B +v+z0=8#@?5anfo4*Xe%F)Xe-733|l%;BO!6mLyzj)tKQWcgKDnYR8jA0g8{eO%Uucq%hqdZa|jratEo +*QVDb8w=S`r>;kxrCP{s1~y5TbSwaLtVQ1m5xUq)u`%UOBMeH`?#_Z6%>=Dw25+y_HFuJ;ujbUd#26& +!RtX77v1%zZG_6ZXE8%-je4owfHh$;^Ec=$QN3Wad5^syfqxgN|p^nHC&$JfqIE;Gm;1{(^&!XSCy1^ +huy<81#46Fb+DNvn=Xq4+RGujXe|`bi8QqOMBWw!9mAM_P%CMdnlq-PkSh$c29dKqE1hHD59*VJro>t +wD!P3M{5rpbhP%sK}Ty39CWnyz(GfA4?5^*?u&cdgA6*_`_kU_z(GfA4;*x~_P`NEYY!YzwDu5pdfNj +>6shEB9F_ckM?`n#C8d7m0Nb2R8|{ +m$me5+}HOrKVf`HZ>jyl9X_{=Q&&T1EkThYHVs~V1FFqJm;Dv4(FV6Rj(xty%ly#-HE+7RjSp8!!sA1 +F>!$AqJMH*seVyQf@gPcrqsMuuGBo4!!ce~GU(!DCBrWEt=c;Mz|u&mzB3132AzI6{4!XZni_-*vbZn +Op%nW?GGO9NoI@r<{)=*@=8L+d);(}kWXRQ=w&aCQ*te3*kp13{_xT+5xc@3@cpaG`V7*O8<_K7obMR +x>35dfV!%nFf0J)!xviEkBntM5xe5r+2g-RhcxVyIl<9IvYBaH^>=k(!#-JuHf$W6X>!NjtH +T@iUQTxO_j0P>$LSb&s0a|t#bWcL%WZ>w|L}Rm0F+8TQS$;^xKuRx}!QU +VkuLz?svP%qrSJxtbzO9uH=2(z1nlJziWJ~p>7>$!LBS*kgO{zF~#}b@>Pmh7uPDn-U!RrDN2CWD@uVj +C~COMkp@Nli-Mqte^U^ak1zYpkfNeT1!*i{tPenMOKf;cZ1gg?MyP;lqK#e#*9hOOCW^d_HH}86M>TI +`J*s&l?@`Scb2Lj;^G4CLnm5Xx)f}^X|55;E_WmaYVOH;dRuE?N{ix|akW}_tKna%iL2Gu)Hkc$+dLZ@%2C1pU@`lpvtnrv#zee +kBOP4k+QoMkUC!9#X}Mq$+Y-WF{c$DuofAs%J13QJHG>ko!I%=rK&G^ooQgND +gkxDs800P$4mNt99aeI#nruf?cA0}!f>*hqgiGp_a88^M&VJHXkn@!Km2l~o5~dP_l1~PRzZkn{!T%NW&U0OW< +~TV2z4q_5CZ5}L2$E)f)G5X3PSB{C%K_CBBK?u=*pdd8B| +4l*AhlJ2o93rIut{~{+aRosiKT;6%@q~h)k0%ubeLSTg=;LVxK_Aa32>N(dLD0u@3POkT#|nbKd0s*2 +Y`&l%*vE?sf_=QCAo$jo1z^^~D++=>exe}g<5dMgAFnA0`gmPI(8o^|1bzHWLD0v~6$E|!LP5~SFBJr +R{7ONvkAG1R>_dAMRT2#3-xLG``F|7y1Cd^Dl?DU(p9*>zNZQLl(q0CV_A-#Pmw}|c3?%JkAZafHNqZ +Sc+RH%FUIvo(GLW>Ffuu_qh(vt7kKd}&UN+R|WkZc#Hq_{4LycZG)aYeHjb1j?=w(BVUN+R|WkZc#Hq +_{4L%nhs6>=E=uYzDg|64&Yq5n@o(8t|_5|~yvD&Veeep_L}iG~nOCeGF>V&ZI_A|}pOC<>anH!z{73 +3OT!lDhqS6(OnHzfTboo&5(CA<@}?ND&g9{qHJ5qI1Cf7P3tP=C_b-8Zf_wMCX8XJu0k1zBe$b2&umQ +cN9Ti{reR`U;PIaL0|oc6+vJ9M-)L{{YMp1U&j?uUndn&Ut@}>uW?1x*I7l-SO0lM&{zLOMbKBjR#7B +S?)A&5N)_@a_xj&c1bq#tIbhn$y@5eR(AR*PD^?ue)3bZ4HtlP*BHGs)MbOuPnmJY*-y2XfN5babzOYzS +Ku`s4q3x4)vu5+o8UWDWbmAmOIp!+H!~bQiJW#zIG_0eaYD$Rp!$NNWD!DE>{!-smWm~&GfJe2=i#B2 +m2K@aF+@QGiauVRX~_NGd-yO9dl=<2i5YC9-JQ3HXO5NriV`{%7N5-V!q7uu(qs7D^3rqo-k8pT2E%K +kaCq!kqe2kCszk4|8J@g!Vp+tHSJ=X+7?w%BfN{SmZ#b2UjVAN(a@8=2WSA(VQw(FPc- +O>P0b8W_nP)C}zn_52_c%6q)J4jf$Ys!A**w(n0mTx!ZKO!jzWjA(b8GvrG@Ev%_ST=^+i0km{WtQa^ +}kEYm|8KVc5b^pLtpKY^vf65i<{jkd6YcUsR`s<41}dPp5Aa?R62>MyW-cX~)2Dpv1K52?Q>yeBItX> +}n5C4E8>C9UqaprqAL6qL03iGq?=KT&u|7nHQRj)Ia_*HKW?>N*OSN3O6?_Sag?kbwWS)-o)T{k2NI# +5PL5QJ;$yvcJ|khJ607wPIp*>|N7SDBbXDg*CBvw`k*nfq}cjYRp&>dv{ok84F_X4y!R^J?!1#&5A;G +zWb&IH&_jOcbmGl(t3xeudmNekhx!Ghkx&v*@;PYS#0HVzpU-ATTDBd>lQOk_BuP$>3*3#jI}OHm$+Wd +8K$C`3ow#4toh5y~ST;jUQe@C)}oRiqgFNuBqOH!}5WQlr^w3fJTiSJE1UM@+;*T1B@#QSx9y-yaMv| +g8DE%F~XZai#YMEKAdNd(pNn5g^r$GrcDd3Zv2)WDSRn1Kz#;|4YfPZ-!DJZWH?@RWfa!Z8Cg!qW!kg +yRNw3C|c<5S}%#Bs^zeMR;CeBr3mPps4(!fuhe#28uo>3>1A%8YudlGEnq+*+9|fdj?XUoBsd4zN9;D +B)xX;U*VcemZPyX@+&YPa1hjTALf6g7*IC~*>1nyGoJ&0D;cv{iX&GLy+ +&{se{(J^M?q;c+MXt5aT(2gg}hv{80iip7X~D#CXon5Qy=dKkk +At#&dp_K#b@72?8;m^Ct +JT-LUN%Pdui6_ldLnodzPYs=T(mXYE;z{$=(1|C_Q$r`7G*8t|JZYY)op{nbRXg#dd8&5eN%K_gFQw8 +tFzy7FjwY~lG%@dRyK70{KI{KoWBsL`$#|O|4Q$}=X5PE2x@&3RKI1P5GaIqj@O|#q#aWEXcSh}fEbu1-yT06euh!l*KNNYO>vH4os`A3$Rpn*izRC}69@w?yt-tHbzx +>FF?+di=%g)lhuZVmq7m@$GMdDAPMW9~_uRKI|EwH;ODxXqC<;SD&l&!sM{BoaYP!9YQDhK?FioI)oY +Lo;2@0L;E`=Y@2dG9^kyH@!31*lvmerl8fb)pRPbD8>lE(5#G(gf}cqFlM;66`<+PmiSs%-uH +s=$y@1^Q+GU3zq1Am1wE_g|Iy`B7zo`wIR6%iguX-wmh^RT;Q1kiWyg^9}=X!|Kx0bDIYV#Hnuc5P>+ +=Z5}2Nr@GA}1meene@dV~ +I}HP~>@cv(+pllw-d6`U78jDKJ2KX1UhiK2vmKe%_z`uC;YDk_TnRbCWjf&2VbcN7 +i%ehzptQPlYT9DQ*|>Au!~jyUkVvG>FMy=(l7%kG-@n&R$S;5p*lf8IFvR(ahuKW=gE*RiwZLX87&0lg9-fz02s0@q?W$KS_0Rc2BbAQS#bAQS#OTT>q +0W>OGe~Azf`l6xlaYRGk-_^9?hqG{nyXGtVq4YKz!p91 +^!mFZ7fpL+X+lIcGG#9vhVC;p<^*UF>)3a@-$;P3j!F`_!KJ8FEdD{A~yiv#LGoD|;o#er39oLcXB+kk$U`b?4-^;Y6Z|~aDUqah}_tRbT`mej@sU^1b)fZd(O +Kn>=UJBXL-_>^4JU-iiM`SC1=(CldYTY&eIVyjbVk_(Mxx41^+3x#BbYJEzd2Qtnr8c0h*{1M@ARAEE +Z0m0sY#Vsq)>rFn>#G*l|D98J&CfTxf6CptFAMNF&sy)kJiya#$>&X}Rp9%oDDs}8iu}B+0w;E>z|>p +qzxkK$3w+=Hn_}rcKhLY7uOd}Lf1Ip_{y0?a`xSKGmw5aQUGv70I?z}3z|WaFpfJ{ve;U5K=1tpm1a< +4CH;!HI{$HgVTD;+ke*^pm{C{rf{(nd}MWLG>(M@sarpI(s61wRL-IRuIdP+BWf>Is%_HlR38$#*`m) +tjIUi-a*%kCR9Zvr>e-Z%K&hD-2Yz9n!|8~P^dTRa}ue-q#2NxXIBOW!p~yw3VXzN?}8m_Lr!fs^@l- +1@l?P&?~=C5`U$$K7s)=syCUeE)`!o~nOGNYBq-6Vj9NH-z*|{4F8<9`o-B={K1FKuEv4{2d|v*76?- +>GzfYL`c7>{AWUXdjFn~p4ZErW9Li+f8Pe>o19|-B=^Cv?3`1~6 +oeSH2*NFSenC!~+he-P5g=P!hmilcA}oj3|d(21jP{+u`phtG+laPpiu3dhcgqj2V&I0^^OiKB4ZoHz +GGv)uxD}P;QDi3iYOlqfl^)I0 +_Y~h@(()iZ}{2r--9abc#3%Ri}ufPnm7uDr-`FbcbYf~Wv7XwP<5I(3 +Pq=hqfmc}I0^-*h@((}iZ}`-sEDIbgNir`MW~3QP=$&(3T3E>qfm#6I0}WRh@()6iZ}|TsEDIbi;6f3 +#i)p*P-==e3bm$)qfl&$I11IKh@(($iZ}}Orii1)+XZ<YRk=n<92XwJBmJl$#=ULcJ+sC%oN^*a>e +o`^rvdX((&{?|ryd1cnU?5g2wRL}1vG5P@MILIj4*2N4){97JH)W)Oj)CKVAFN>UMlp&}I#7z$DmfuS +B15g5u*5rLr^6%iPUQ4xWm78MZ~N>LGkp%N7hvQUVMXbg3zh{jNcif9Z~sEEc;goTjP=bmES* +Soo9EAc@#8Id}MI43lQ^ZlIK1Cdb;#0&?s69m-h0;^RQK&pc9EAhP#8EhnOdN%y$iz`NhfExWL&(HYI +Dt$Yh2zJ>Q8;@{9EF3EhPOdN$H$HY-MZ%iD8!^Xr>IB85Ag=5CVQ8;5v9EAhM#8Eh1OdN%y#l%rK +S4{u6J&`X} +Ci?@zn|)1P<)jz94R?0y>C!0RXWfYDFvsXPI>#vj_!s8)G$c#S`kXPKP1M1Xh@8MAJo!#2E +V4I@eF=S8>|Uy7fDrNUWDg|n6lXDt=ZS}L5iR5)v?aMn`ctfj(PONFzM3TGn~ +&PFPnjZ`=rsc<$@;cTSB*+_-6kqT!c70yN~oQ+gC8>w(MQsHc*!r4fLvy}>GD;3UGDx9rUI9sW3wo>7 +2rNY@tg|n3kXDb!XRw|sWR5)9yaJEw6Y^B24DuvSwl)`BSO5rpErEr>oQaH^(DV%1Y6i(y+5Wc&nv`s +Tm+NK#OZPN^twrK{Q``ukr+NBvN?a~aCc4;D|U7AQ~mnKr$rHPbwX(FXvn#kA2Or%sx6DifwL`tDs-;PkYH1RsTAD!jLqp?b3G*)Sh#wv}`Sfw!QaDYe6i!nqh0|0@;WU*}I8CJ#PE#p`(^N{~G? +h{~%}^|R +5)v?aMn`ctfj(PONFzR3TG`9&RU(}G_}+@YpHYAQs=Ct&RMH7oTgT1I87~e&|2!CwbVfyse?9B2W_Md ++DIL=kveFj&TyJWs-cZkLmR1vHc}03q#D{tHMEgxXrs<>nnr4(jnqV2sfo5y6Kw;UsI!#RZ#?KeEM?P +H%BHQ9OwtnrJIE(N=1rt<*$Ysfo5q6SV`SiQ0kEMD0LnqIRG(Q9DqYs2wOx)DD +y;Y6nUawF9Mz+JVwU?LeL6v;(D#+JRC=?LaA`cA%6|J5VP%ZKU*38!3I%MoJ&Gk-vebvTFU$wD1$!TMyvf5awtTt9EtBsY)YGb9c+ +E}TqHdZRDjg`u3W2Lg%SgEWwRw}EFmC9;krLx*ssjN0pDyvPD%4!p(vf4zctTs_9t4);3Y7?ch+C-_W +Hc=|8O_a)N6Q#1+M5(McQ7WrVl*(!orLx*YsjN0tDyvPE%4$=kvf5OstTt6Dt4)>4YEz}M+El5mHdQL +CO_j=OQ>C)nRH>{sRVu4ZmC9;UrLx*osjSv0mDL)hvRb25R%?{XYK>A^tx+ngH35~?SxV~n6?7j~Laa +4Ph_yxuvDPRd)*2cjBy1wnlrKJo+gf%y2!g}^WR_?n>PUn|i%OH2KlhVIjSNIxB;FYZJ7X@;Oaq@Rux)Q9xbtP6p~^ +yvgaeMtXnmc9{OCT2L;Ow4fbnV8{VG%>@$X<~+h)x-=3uZbBx)G-COi5U)d6EhtACT2JoPRwv{oS5NY +IWfb*b7F>r>BI~N*NGVpwiDAB+@()P39^!-;4d*p!C+#Jg2Tid1&fI}3Levc%^oI9kBne5F$2J7;xL2 +J#195e6ZdbUqtfUsYIGJgI*S^eMUBp)MrTo@v#8No)aWc~bQU!_iyECpjn1M*XHl!OsMYambrylM#Jv +I55+_)z6Rgz<*6IXnb%M1z!CIYQEhZR$<51EUOeUr;xJ*o6u$hRy8Td>@-wccQaWn&ai +8z{pzeF6(z+fVdX5cXKB#=dN*vr6VVg`WA#9;=T$$PL;_HU%463HyeBAG>5B(o@sbQZ-ri{elgIZIak +GLY`mI?-aCXt7STSSMPn6D`(>7VAWdb)v;O(PACaSSMO6R~{MIQ=Egb&cQ_IV4`y{(K(pt987c$CYXc +#jaD)oj4Eb0I91GWu&S8h;8iih!K~tW0^BO5Z=wSReihRf3@fHDI95zwu&kKA;8`(!!L(xff@{U}1>1 +`03%(W87mO?BDEL#%Q81{Oqu@|6N5P_Ej)F(U90ik#ISMY7H%}NnGJ;XX3;?H!!wgmxKNxsb+`mRg#p +oXux1*?kb3tkn|H`4(Fw~FZtb`{eX{3@m|7*T`CQE;ewjyfw={jQeo)48NE*jU~?k?WBWoGc~ +@SXs=3Tq?R5m|0#3bl?h|XoXI+LMK|G6RpsRR_H`4bfOhH(F&btg-*0WCt9Hst4wgCxOPzzI&cQO2gTFvJ!AeXp{>D<$7hN!-FS=kvUv$BUzUYDxebEIY`l1U)^sRKj&; +=v0XS0B2Vh81AAlc4eE@b8^#Qn +1)CXWjQ6GR8MSTEP6!if(QQQZm?1M`7!BF-=E&HJH`@mU={(s)OlYvb|-2^TbbrYCW)J@<~Q8$4_Mco +7r6?GFBRMbu2Pf<64Jw@FF?i5i4%qi}JQuaY5`(P;hpq72m$UbOA9|Yd1R+qUyyq1Okf~qo5h`22M*E +^M!cV82D?^t)uD=gGq^IqH83?lDcOWifEea#^D-XYgr^WMSNUGvHxb=SPtw|3XOs&`GG|C)U0e_uZI- +l5s#wg0>Yn1s`tD|ZNt5L_lOMsS6|1i@7TQv}xtGzhK}Xc4?iV20oZfjNTr2rLl%k-!qc`vg`9J|J+2 +;6nmy1RoLDAo!TT7QrVj7&-BLN}vGJ|obH=W_y`c)lReiRViKop`-Hh#&h*Bff&!#BLsRcK5mNCA5jYbEu7souVh_!&3k)lQ&@ +kb9cJE$+zcy!glb^q`Mge0|6HH%64bNw^L>JPj(&bbkXLEDyVeu)=UIY!T7G^?P*2Lw4+!ch`S~S5Jt +2QSNl;J6pN|mKlkw-H1oc$>`4~Yx5r3W`sHfrQO@ew7es)u>fg$DRLj*yfo)gpu>gU4*L7<)x)DI<}z +YampvQWQqr~7mt($Dwkiy@>x5(FWANDzedF+qJuKffTT59#Mu1oa{P{DvS1DL11J>3{O4`jGzTZG!rc +{!IB0`+3{MI_YAabg}okhwfS*#Gj876c`9%ol>#)w&L!Z&ZSuAQmk_+*0~hxT#9ur#X6S~olA+%r9|g +a66pUVltjNkIztkjA&JhABoLuQr-ok(wY#QsBJp+xO_ORerh(2#HM{)R-FMeCyV5}0Q%$Qh)OO9MRP! +m-d@_MVHkwFA6UhYn&S)a}Z*uFdX_}ZoR~t=}!1|*xnkFXD)kcq*#(S50cTEqLfkjSZ^A^D7S&#*?Ak$fp> +2*Y=lOfaV2><2q-8H>{$h_jwO_S?Yd#-aL*Ex}gR_(ar%k(RBx=-uu$@Tg^*X#RS=U1-tE7$pz2Zpj- +&luJbF``BmurDs+AoI=>3NurG9)6*|odoo0njvqG=h3!QC+&bC5lTM?LgN}UL$PJ~i#U(3M +uwbb-3HN8ts?^4sd)buU`^e#2MOHJ=m)4SC4E;YR?P47z6yVCToG`%ZL?@H6V()6x0y(>-cO4Ga2^sY +3${r9moP3sFrP3uYDZ9sBw2eJ2k?H~!P0%`w4R!eN +nBFFWor!-vq^9p@^a6D-<)7euWZ-%vUI7$bN+kL)llzGL(OXGKPw;P|i^K6)G6=43h4exBh6OFY40%R +~-1}SA_LFdf@LE>$~*8uNmw6^uTWz>pS(pZyD=*^}ydV)_3cHe_*Wd*8{&}tnb(Z|HxS1vj_f(vA$~$ +{4--!kNuvpVUK;wSlwg)!dTN||H@d~W8V=LL;U{07{u?7j6wXqXAI)^17i@sKYhiV1*3kAPWN#L@xSp +`Lx}&(7=-xW8G{i22V)T8zcAJh$y*06e7|+@BH{hG{A)t`Y4neT^t0%%e?t(|+WQMZt)HwQReeKt(;=cpPKSsZIUOQut(;=cpPKSsZIUOQuDB^ev=v}xkgye^vU`%VHtd +GgRmU_-U?wo-^W*$2?ld1kY)-%x!`AoqJ7KAHVUt3xxIY8=t&LSRcRf8OHkfZNEB5SP9q(!ut5_9y&=F#P +8)AVKsc`1HvGFbCi?dQ;knkKEUihc~1Qa^Z)q70$~upwL^sU@!Q#WLm0&G+$>>z{KjvnKVc;>UZnnnw +ZM3hzcUA(QNO@?V07XsVSW5YmtGJC@jLc4SDdA(erZqlaesV|VUq8bh~vfkyhw~;vhVKbIOX3FJ9oS} +?cb5$9ixYV??~~Eox`vFJB-uP6AS(w*7=U>m;F03ryZwm_;=*aU%43g4)3sD8^bSEM;~ay0Jm&3_lPi +G)rhS>y>Gt^4&B%IQ?m6{mv+AhiF;ob_`CZ*?xXwiz^$w`UrO)TM+OM4Ox9&AB9&wdN-rueA* +t>7Iugd?ed(G>=xTzYBZ~RMs{Lke3p0Eh8SA_MW^7iXPgu!XcrK5KUgq7<1CBphac>BXc!Yp8K34@jD +!NY|0L+M_9ko**brdFgRqnbcGuOOPyn92x|em;9{`V7#&+73}%O8FA0M +Kvr88i34|&2{A^bmMjcIo0N0wIJmmkEOq&hQh$V)gB5!XSh*_X&d#&O9d!4$5vEzeO +PIHjeWLA%wF>2^6wou-h1&_-ZUUt1|iio4t?2hSFIK?qLaF#17byY+blW7zFv$al$NMCk +TTWpQ1RzhGcY#G6OawqtnL-gBYKlAq--CnmC0Uk~7>+2=SSD!XU(Ft`P=VdS=tbU_&xGL*p!LNJeLVA +`A|vFWn^)!_H#o&||_N5OXI9gFws?7hz{HU3#!gAVgyBN5UWyb596^NSvc6f#5je0TU$0(K(udKy)0< +&k_can7`{{uqPRvr^yL+Bcp{Egh3`{*#6l1 +pN0(`$1jTW*c!@BG(G`jxXpW;r$}$igM^`D6Ky(~kedc1gk!34<8j;=czmTB2 +zS3iOO_(yRp)dPYk$y25e7(GukY)aV)Ap`?a$h11&$G)zL7p3yS@K?vY74d+m(XS6~AgrkP8KDdWL09 +Pnk;LPD@l`tsQGrfI{G7wH5PH$hoM<9f7ow^1p_KfacCk#S(msTZEvuCt^g)j)=#u{O;p}$U4v%Hzxy +9TLupN1q5%}4h?5C#j5+w1&62+t#0RKUT+(Ib8^2+t$x5ICARdPHMHhS9lCUkaxaM~`T#g7Q40$HXyj +3%_>_qVkyd0|ykhZqoJwPAHC^&<+A>^NgNQ#NepnX!9Up5S^zq0Kj3z>Ft-4kZ@da^qist6?(c461U* +s;^;ZI6hil$hIcr@IC}n$Fc=zN-X;tp_mX-W4l!;mJt7S9>Lo2);Edwv6(u6?OUT+Wv64` +BTCk%~uX1?~evly0d@Y(x3IM%nh?_l(NLu)BG)i`=X=>o?ZM{j7!0OuMlEK1ORMI63Kmt^|x99<00>{>~v_w1j~}lw;oM!zs$~3=L9njBTGS_!Pw*j#G}$a9bb)@7$*#!HLT8X&Q +y$NagqxjfQZha(sqHc6eFE_$*C%P~~SlM*)N~Khryp_~{{n=V+*aNoTt$js{M@5Q*@!+&v>2|;85>pYlD`xQ1EAbk>o_E_%pu9pM#%*FCV1&1zuh;zD#2%yuD(4o +d$GxeZ}}H2_sN6XzM<0Nug}e_!@2Xpm5L@uZy8{(AJN{7$_bznxQEY$_I^RNT7lOLgPhR=|Ksh@iiKk +p@`7r@B_m70B+CGvqK@FF>isPl+bvQh6*SqG+w0j8k7?n-=HB43JQ&HklX+zg{I4Ml%7ykXzKw57wQU +)Z_#)Tm4(JPDFdOl(D*h5391W?@9^iqC0L%P-i8uG<2y8gK#`&G5~){EW@x-ZgD4al+ImQ-3#Ep}t0a +s-v7zxAWfGJd8n4q%777lH@6i|vC5NWV*Z4~z1%D*UK;5CO$FwR>I`37MS!{@IE +gBZRzMi`hu%g=5S2+N&k&j^D|ef5Yi$kf*l34^`gvrWPvQ{SE<39e>h7Z#PFvX!r<`IL23;cdOHXC4}!&T@H%0zX?#IE1V3-*&`HAJ@Y138gcX1hNAd6=P0v +o{o23h@1oko9IYvap!Z#}?mI>@*xHGdz7@w->u7Q!aGkcdXI5s%@oG>_ccH$giFi);rnI#ZHck&=%5W +15W34`=oS>)Eh7`n1_fj|h}nKy(%@Xk^m;jabW+$XGp&r$5asM~r&0}PmPJM)yAV8-ptQ|Q2q+nIkt7 +=-COaRpBYE)c2Vbl}!IN)#~hb}p89={;a!Ut(IPcTYP&l3nyy7-tdM@73uAmrE;Vj{SB)0Gdm +2^=CwfdU_Ix_am+fv}|c=^bHx6t@o&_rb{9xlXeL705fmo1^cBS#SME!r;jKQChfw=eM&#!#G%eI~ +zm~u>5v5xGj*7tE-e(2IG8hoxs4%28Q1D>|w$%*&fnkgP*tah?od|-p->FguywnS!$rg5I&{;0z+?Sl +ZHhw^tMkf5e8|vNpm+Cdpn!NQZV**o^e}X#9aNrPY?&!O-k<^J*AucN!+HNT_6w@(X+Jb1BZ{ju>u^v$tLoXpW$2yDU0 +9FZ4o!8P6{lsJ~sfq?>i!Rgv2jR{~3ZeQRJLI@X#PhbpA7Kl$^3{Ec4$_$Lb>AKf95W|bKO#)|dy7rF +tk6;aMUnD|-HMo6|_AFoxPS-xrBZ4G0l0?Sm#OXG8cuH0gbuFZi=?S7|l?-*EdHtpva~+`dk0MDPtK_oz$3H=O)P13vhMlZP~rfNwZ?LL(mdhST+@#6K_& +Cr^ogU>r_1i8E*%J|po5jKc}5?qD2F*Wb~m5S+v5(h@C7z&f0~qy+?6hm#jHFN1YBc}Xivv<{b;ZD1W +v-jXH=*5TwGNk3p6PVZi(VHCW>4x|W!dALibWC}13caPA(4c_7IQCfF_cR0PfNc;x#aQ7%h5zNEgS$@ +Pmio2&Mfx$f7J#~e!K8Cv|C{AD=?#|ID1m@xHIifdshts={DD%NQ+`UAk0rPNsjlL9|!QD$l;TA*4{0 +3)mdz}Uha0Yj;)0P9A!O;uas(>@NyGY|KID^v-R{GHz+?b_(99V^8%?kyU=&=}k}M +`IKigWLD`5g~{h=V=KA&fxBn8^jXazulz`!XQu^mtGJExwd?Vus%@R_csZHTwCEk2!UE#Ck#?;{V-vW +YU>{egD^chOBjro8}}a*2ywc9o-oL@CkF|GT-$t47)*Ja+!&bhHXjhyr`qmw>KJtY?j4~o1@~`z^A%y +B(%d_Gj6j(5?#=SI!q(y*ZB$F}|90QJB@BL&`TP=L5X85y34`&HPPdle|Lwlxr+^r~nS8GF?` +3*0I7EG3I*T$0d6yhzNFaS1XslJl~3KrTIaXM-N*j)!}qEE%{M=M^Vk39uYdT{cfbGbfiK9HZyFr<)t +7(#ul;{U?muJqpNad=)cvP%|7qQSX6`?8_n!qdgPTR|il|``wJf5hMbx&48W&OPB5Gbl?Te{>G4~s_F +Q)dz)V`S77gPIUYF|w4i>ZAHwJ)LeB^+34UqbCmsC@~wFQN7&)V_q;ms0yuYF|q2OPP7pzLeURQu|VB +UrOyuseOjpXQ+LK+GnVJhEs#uXQ+LK+GnVJhT3PTeU{p1seP8(XQ_RbbC=p@seP8(XQ_P|wJ)RgWz@c +m+LuxLGHPGOgA289Z+!f#U;Wj815ir?1QY-O00;mj6qru)nInLL3IG6`Bme*)0001RX>c!Jc4cm4Z*n +heZ)0m_X>4ULUtei%X>?y-E^v9pT5XTpI1c{qUm>KJi!+zF-NhcT7;K8|URz**-J;hQ?1ye)D7G?D$F +@>Qo=pDzk(6Z1d7Jb)hc$|su|!cM^^hXzK4G)V87ovNo0}`v+U4wL97&SVXp~f{xLwLhWa}-Pv9}esO +Qq|XY)Y{f@T0Memv_=Ay=6$paDmB^I?^#@Fj=3xhvprCctP-(eMO +&!l0cY6OD?oUMhP*_9T&WD9O!N;bygn_BwWwN?dkq-ognqv1E=DoLI{e@=q1IYZ8`L9ldeR4q`%@r35 +B-d-hHmN9&gIO7G0oK9$1+!tbP*^3GV*diNI_6ycpg6cibDI0@;6;Uzn)@0+D5edS9_B5A*H-G&#wrn +9hx4@+`VsGJ%vP3mb!e6ACnVs}YXPQilN^pbPo@K5hJYRE=iwHK-u4ulK@*y!!vOG(uC+ +ylHX4Ea;GOHZD-N-_)rB*ewE5Qt}1#>V0xsHf>004f24=dH)tXQMKL)yj)jr-lgflirG1Z6leI4{69Z +eF*Qm22<=D{El_o70-UB7jKM7=SJc^Ga)_!QBAXf)y19goD>H1?p%IC!{7?e9%5e*6^yLebKoNti)%4 +aNzKwaT|Hp117=EJg(VFRiz>0669iLJ<5R-zObcxLt*grycWR7sHR)`k*s$@2WQ@gwQ!7RcSH=^a06# +&gD(x1yixWKQadL0%NMPsb&DJ35>G9jep`LeaG7J1HOy;d5+;=-t^wIX-#N#e(sZBt +mKDia1&_m{!FZFqBgfy!ZE!*v6%CP|*KKb5|9IDY%;?az!iC5YS1=;cmmgZ9BV*)d_YDqD!-iCmImD{ +i>8I_(IiY~;1f-PmYyMds=#vf(^9=HAo?8aTQ~=H_9m8)5SXJac~&N0J4C!7lyW8<;3Tn +81S(wDX4W@&Q~?wH99oSRYSgIE;JfB4va~dF{+uL<^8*qj?IMM@8sZOs|8_c1WG<|9w;sN@z^A!{mBhRo_4ie`S4_W#Ee1Q&KoGLCd`dr03n|F +ixt0deNlpY{5%t;{4COu+cTwgc9lE{u^uWPy)4>BK?RfT@yu-~(wpoeB-8KaP3avzO&X7w=OkP?8`AG +?vRRiRZt4Kw83tkK7sNzM~Ri=~Ze1!&(Kcv$8J}M8x8}k_ro(~=a<$({#KG^LMr0<>bkm&A$!O%T8hG +W;wIfi$eJ%Z#>06E(o%yED4>Dt-;5N-dR9?^xqG~#*KBX|>JM(otQ6ezk+jbO43xAQqr>h|50KN91cv +~V%|d$n+QLu_H8f@yh|Ts)|cli*SG$=|QI7A2x6Rf{j8uwEI6IgpLWM%p}2ji{DWSZG&%79SkUa18EE +{FQX;LIUiTSr>!mZ$Qy#c@PJm7l)%XK9}rz8CXz`UP~})$x;A2ahyUzBQ1ho++pm|TM9HGi(iT8c8u_ +{$NM>ZHpSJ4ZVhrRyW$p(vDt#=g=$Iz*1cXv+&gL?r^Wr6N>|LPLf}IcjFmo}7LdcxsYYC)uzgI_U*; +(5fk+8SV=YR_t$?anF5_LJ9YX%So6N>1(qZkohBBmvoD3XyB*P2T(9E<8!q8~apM0nW@#K%3^}E9n2% +qbL#8JXM-Sy>16*|w6QhS^q5&Pc?XzmFB{04Al+BIg=hXogxBKHWQeNse +m^bN2bA@~jefZ>SL{MRAF&HYG+CaL$?_cj!dyDfr@iw}26rsQktnA0k#XmqT89>pS&Kq0W#Q8xB!Gf9 +C~_nUO?`?X$~m?H&WbTRjR2A~ZUmf17wt@C_vEncTL=MZSnjMf$vQ=x-3AARJLUxZIaG3F*$hfQ{O!o +uKiP<=c20PujP(VMtNXC534`g*E^Apj{y+nNN7HiIDb|}0AA6`i^QBv~9v|#-xLThs5^S{fZM&Z+3<| +C*3CJy#uk7x?)3N=x!wBm=jIU6iLjIyvOCgloVdYILK|avN6^Kv~(%5K9lc9uUgkY}G?Bbq4?% +4c;J-c7}r(fmzWyg8+rvWvZ9}MT`N7CT|Px^TG1hN77wH1sOVv+#o29cXDFv`ab1D{Gysi9D}#zs5iy3;X8UB%uu6@rItMLotd#LeusPKIZVs~*1xg9El%nwNU5^N$0>Qemab^+}yEUTdYspdaA +N5Z>UQtO4Yg`{@z?bcl%(vAUe4TLx9if>kkGVquccCKB_14Dtk2xE^jDMu0RjAi3y9;jNF7V4GaQKjR`Uodq%RU14l+fZk0ZQe6 +M(*=Mwaj&Sk>8KLB;3E7F?DH&=p4PhM?cGSoO!VU5I;p%hPsuB(HpRoCy{op&~mf>0VJK@`>QAnUhpM +ej3o{G>4cu9vy@tBIcz3Cw=fhWBNv(cx~U~$L??jUV(4XOnkKH#jxE4&7{%7v_?-TK1nrAxJ1gMed=* +x)x>Jn(A=ziIf=fP#ciWZic!ViC}pRY1}~HGBz(y`7e2fn!V_+ahwKm?VoOfK=|_wxeU7d(gOp*7@IR +U6SMh^VUf74fY+-A2INNCL2f*n|MI>Z8jc$jrd!Q>_mBFE1Rz%ig>`xL!xXbNNngK;kQ}Zr#-#`-Y3ano{)eaIe^2(79B2>W)3to#$HNUJ+!JO%?CX|&4zy$64BBDr6^)@yH +Urqf4H!PZDuXzNP#iwC9uM}I2;^1enxmaN&S`8A<&(a?J`vi8U44KZj15Ctl7w@J{=Y}^Urc!Jc4cm4Z*nheZ)0m_X>4ULY-w(5Y;R+0W@&6?E^v93R?BY +NFc7@!D;6q(NT{nOIR>zc7HEI~c^n#`M}f9hHW5m6NUDzizDrV)t(TqXVw&O(XJ=#5g=q +@B*h*!9EwvPt!PNf`f_mQY0-LeaL6F<Mb=x?@~mHiIW=?B9C$xVL}&iWh>Dm6-+5eS +QjsEZh62I0%B3U|PciFJB!n;kJ9lw=OyiLpuX(wL)5IBrwQn9aNf^YhXqed<9!2x2Vh>WDbJRqMJAgT +>N6O0AT^<-EA(lEYJd7#vfca1GBO8F`M5pK?ECqexnR?BKcNvg^@;)&zz{F!u&~=O*Zy1YJb}ihNzb= +B&kaNR$*GQf}{?2%P>w>LTZfSHUQsOxHWM9{97rhxk02^o8d34!2I8!G@ +{K8N^D$P10FED2ywPPMo2J^>H)SGO4vk+~w=5^!#U}N}ifEndil23BFDVz$4o)5q5a_4qJ8pKi!n(#T?4EfdaZ4jj5YhE(pRojY+deBZ&#qMieGY3NC|Kg>>39Pl0& +WCH6jIK~fCsjFkWnDH!@0p0GowdAWmxM^ +>jCT-H}(XyC!#-g!jn+LC-j=-Qu$-yli@DoEi;?xRHv)gJU+qBy%2>L+7^cSN$~#vJioIHU9q)5+(zd +Pr0;NjMXdl=$#t*MM>FiVx31{+!pwEJYm$@gP`5&Rt0)vm7oxM+(LG{&n7FzmxlX-IQ9O1fv^RC5tqp +8-9n%R#4NnfYZxVdx+UTLpC${rn1I>1#{!CbslooWkhXN;d{zyyp)*Kzet!M{Dda`+SNAnuRNm=2LsM +jW-qJ9aib;d4|lR{1fojKaw*?YuyNuGOkOh){2I_ch5$)v{r0Z>Z=1QY-O00;mj6qrsSCcJ)g0{{RR3 +;+Nn0001RX>c!Jc4cm4Z*nheZ)0m_X>4ULZEIv{a%^v7Yi4O|WiD`erB>f-+b|G*_g`_igxV~4?Q0>0 +ZL~00w?X?b7{e&BylAndRFc=`zu%o?D{*XR3)4#^=kB{--+^gFg(pyR_R@aLQc5gCFVs)Ve>pOye +j9gWp+IWyC%!LSUl+l!?51L#b+fuJFTs-zrDSMiVQD~{JS)&=H$&~dXDgc5BIFX@J6k6!DlC<2m$OtE +?}P}VMz&u>E#IEYsFR^K{zy0JU84+OID+bwCVs$*esj~EAtAulU*QnGIA*UrG#`2W)yr*aD$ppu6Sm$ +nVFdwX5c~A%2=}S?-;%1F#a20D~c4UNoQgcTRk_J!nO<(ylFpUX1bjy_ge!}Ss)eQSoqdY|8IccvdHO +Mi{buH_T`N@5?CDoMXz{}{+&4p206GY=LEKm4-0yKf&KpN +6QkF1iusx}6u!O6%mmFmrR|il7o(()=0$F}=4 +DZc_J( +etuwo4b4^DRGe=Us=`ocI_?Yjpqi?Xm)76DJcR4&Kvx_n{G^eL%&2iP?pfjA4@q3QU*bZG>hFS+oj>Z +M+HyH)u{p#q%Q($el`@BuH2CBDCJcJbD|Fru`h)gF;#1=|bYXH|p5&;1eQe=9)YX&}Lp{gp!>bnlym1 +lC`8QW*u4*4+OKda(b%SHVG8$}TCFEvk>rh75W3xEqY@d*$toh`QhBb_0 +Lm8t03!eZ0B~t=FJE?LZe(wAFKlmPYi4O|WiN1PWNdF^Yi4O|WiD`erC953FqmMFA(sK?;U2Hj-=?DQLQ#>Ef{lYzV@aqG +Xs8p7ZC#7ge*%1!be-I*m)*Rw`Za+%1&6XpGBkaI4vp+r`YO^PK4SO^pmrS%R5L#4->mu#(GCki +Us%I|<+669FLfQmX{KfdRw_aK^zo!@6B?Fi!GwB{lG4J=0!>v$HcN!)Zr1`$iQ48QLFz&Ngxnd`U$H9 +s+#YI35|1XA_2EPvCeot4L3;c#dYa&P1oTstks}hmrydS;4SWmHU>NYUy0ZgD|xenj&NZ@y&R?;%kG> +o`@C_orG4T@C~F~KSuSY;0jSM&s|o>H5KlOs#5-3i5QIy%AqBsYSe(|#UKqqwnRjK`;)LP^wInn3AXK +0QOBoIx8Yq22)(j~j*%8$kZM%(Fm9NTCeA5j`nZ@1W0}mF!@-r4N^5Zce9aajPrb8*XWH6`p9692#h7 +m>ebO%R3`x~&VDyNi46z-#{rz&pydX&+06tX|;?Reo7c0a@i>G_y!LZqEsw**@1(Xd6jIx5;WFg3(YV +xuw=8)HoRTyNl?C2vJydX7++1O`{l?YYwC@gx-n4NmJsvW7N4%?la5=~kYCk&H7u_ds2cQ-E|Jyi?gDMr5^5nvr&WEi**Wz&5lhSN9xh3>kgH&28xjP9^@s{ +8x&^&NmzO_XKTNlGl|wQpS$_1Ip$ +^&CM;QM{(bwBpyQOT*=i0W>(D@x2ja*SU&F|v0AKB&1c5%%G)a|}faPL0#WjuWDMWLQHvmWrKH^{oVu +gjv(gS~YkRl+HBq4KS+tHozKTjBQ2a?sU*(`wxS2Y*4r+E@BC+5vCZ&|Ubhs}A_NZ?~a=b=iH*3bErT +O^S`Fh{Fjlwk30Lg!jZtp9SCIS1LFj>yzyW;!0abk?SYGkg!LuP(UFrp*7 +3X=gKV+{5OYbuAL5)24lJ1H{JA;baCXj8Wf0(B`TTS|(i}Y%ot!=KToSL7z|?Gpsbn^5@g4Muz5OX=8aKqW%coZqe23<~?C5R6_O%~0e8IfFqk`F@h9S>w=% +kN5=zmZpzG$E%SATwB$I&<7!3kAG_^W4K)Yst?*N3_)TOchs*8>xyMFlM<=*56zY>r+s1!c)hLT4z;4 +*B`R#r5@pC=-QtN<|`JZk#|t%5$}HVaD?tt=W&a{HgxUn}20&I3^aG? +a4>N3__tKKP@idia7MP`R&1`qnH7RN6H24j5$+$EcM|hL7Z1sa%ZJP5#S=td&G#kBl{gvmH*l@6pleP +RcN^)gHXw7{Hz&D>1dYi!=IpIg#TTA;|E(jxJi2wF&z{d~&0*a3x{$1Y*Y*eWl1(ON!hu(-90Xck#vj<@uETgVB%6pDu2~`;Yf`w>N(qH*^Jr0gxT3-+ue;przJ0Lkj^-P +cmo@oHQWgHnk(o(hhM332lG1?=AJknPG46g&E-svH`nNy2cRC951aVn5q-4(4ctB=+E`@>G5wSHUEdS +D?%r&Lzp7m-!ai$N$WUs!t6=`SMo{FeQDsxJA;d+*5ukYMMU0({lwo(Y#d;@`@N1IUqt(>?anfa+j|1 +VcLG~C5JZ4B=dI=slOJ{lc-7SD9oVw6hE*X8)hMYjbf;!4w6k;twGtse`fBOYSSX)#PUs9<=?2c|iKt +G#0=+t=bal|KhP%ec9b@C|-R14{h0M0yfm3%l_#aS90|XQR000O8B@~!WyM^$*2?YQEf)xM&CIA2caA +|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)0m_X>4UKaCz-mOK;pZ5WeeI5DE-St*YA1E$G_lE2qRon +*c#k6arV8^%ADUHA#8B|Gq$tb}$hR1j#ndlwKKb;WW~KmgA-B@kAAY6^5^^WB`2mH +Ue%zTKiCzDUenpKD{lq2EV%LZTL6CE*6#4YW2d2S%e9t&Ut;M+U9{viYsL(UjU_`%L;#xsCO0nub4Ff +BsLFrN4!nok9+5G7VIon?^%zDmf3>UBc&+C%}x;Es)Af2=?q&MiS}bO>%c=ZH#$QrX{W@wJ|ow3TC{%O08$-ur`+p7?bu+$=rxfz!{rHlqAZynl~3C*H9RvtSZO +|`67Ct+os7D2O6IF0?mG?5A8RJT5p+*aai2|5xfwF3n<`QXZFyreYm#xRea=;pnQzX9UH9_aV~@hec^_DV|&sBQuZHuS$<6`Wt)i|(?PNcQ*J-NQ}XksaGh%24wc5RB-wE0mdT3KkU0 +j4r;&!Z@QH!0UQ<|rf0dP>mJj%d*|cdV0%coRWSNLDGpN@JB%+RMjoAeo|$eu>Yky=3xrpD3^4G%vRa +xsAi*nCR%lNG2ym98XN_W#J6IzpMelM0^y0*_SOAtHd6*1|llHYp`AmUVuD~H#$a_8k@ILOh`Dp9A|oFoN3W;F*Z_7XHh`u032zczr?|%=)g}pC_!F;7PY7 +NuEdW!{=77VK5%A?WP!M0X<-wc)scYr>uT63XC +3@s#N8Ma@nW&Rikpov0NLg$Pu`ATXy+r{Ey3We)}rP`b8=9!WTtCZ_hY<|9FOiaMf$a8;xvBG#N;IH< +GK^16quoj$2?Q!Q=$yX>%EYo&`nxBQ&a9{aS|hmDFs_?D?B1ER7fsPRI_DZ-WBK3YS4z(RCQZwF?Bq^ +3m4w#pwj6f90rfWD7;W+i)i!F9l@B6ALytSz5wS55f60NFr9O9&#)C9tO&d9iUVvSgSmI3lgLASds%{ +bSA&!84oybgi@43E>Mj$bOlFN|w9MQycdz~Cncdpw?)|;Q3Nm(6!hbGQe5@9xouG*$+pb0CGPR ++24dVD+Y$*AX6X*QicCe=%zMRg>^i%j$2s}?@A;$I_ct~#_ojyq`Z$s|ivPa)r%%5x>e +o*Eq$BM$(>-=aPax}UxMO*II(T_Oro52xgTLQ1+@cii7orVBKLZ*y`Wuuef{ih75@TIO +9KQH0000803{TdPLU%C**yaQ05}Q&04D$d0B~t=FJE?LZe(wAFKlmPYi4O|WiNAiZER_7Yiw_0Yi4O| +WiD`el~!AC(=Zf%&#yRS8YH5GjmJp^fy4w7FeE1NfKcS5C#zLAF1AC-zsJW;+~(3wv#Qo{&gDDbxww^ +*TgdaOF^$4J2fp1&Wq=i0ipF5>pQETdm%85>zQri2NImPdk}tB{d|(EpwYa30PVGtH)&=iBd4;$%0 +|pvrMm&xN^Ug?b0%65H58LmlJLdF1kQ +1S^bVzhpmQM8Xyt?g>~iZbZ>(RtXDambvE4lqaaS$WA!SWzlE!tLDdJ7F9WV92<+EX##D+!r3-u3I=f +x$jB-*)!Aqdb5G&kd1D!#J`enp6*laiW57<#9hyGh(_V9&Ur8A&tKPlfobsp*P+{4^F^13ppRC732xdQ$Op +Ci>+A99$kre5r|K<`2Qw*wgVniqIua3&dU0C*(C;U!9#TSK0Nbn`T2C_mFN%Dr471KkMImzZz0#`M@?jL5;)&zI`=${yUY_D?(?2pQVhh-5rtx4{!AYS5B_gL??H6`9|}t&*(qAs;t6 +MVmNoTZlpPJOz`-HF5euHIaEo&Nh@Im|=1nD!*czvchJaO}YMqmZ<#Og~3xEo%w{eJO@_Qc1jlX=kHX +5Ekch|=N+-X|>15ir?1QY-O00;mj6qruu>Q|wG0ssJw1^@sb0001RX>c!Jc4cm4Z*nhfb7yd2V{0#8U +ukY>bYEXCaCx0nOK;RL5Wf3YjJAi(Rv|51Kr4DcPys@~st+Vi8z-6Fx^?Wx4v +=JPk7XM6y)ZiHG+p|^_{Z`i`<7CO-t^IxbMZHktb9j|Y^ZAfSZqV2S?kj(uFcvoX*T?h>+hb%_dT1u> +UT#C2Y*uIm<7^@{Gg3~*DvFb3}xUzBjH_l<~Xd^V-^6_LcW#FFCXq5b5uro-gECJqGu>PM=Fi>-mA)~ +X%5p!#ids8 +$x~DO?}A#tj+wk&of+NhrvFU%q<%5abUo`vm%x9Npr?a0IpT2(^r?U69)PhS{xy8^mGq*;QL$AEM%Hc9B&@hyQ5zLy^rtFJE?La&u{KZZ2?nD@!dZ&dkqKuvO47&`~heQ83fw0sv4;0|XQR000O8B@~!W;;RoyV*vmFAOrv +aApigXaA|NaUv_0~WN&gWZF6UEVPk7AWq4y{aCB*JZgVbhd9{+ePQx%1hW9+hQ5MoFM51g+EU0B|m$E +QKu5*%F7{~IZEpN}sy)FnUB)r)2|DVfuY%ZC#uvMDzx7CTGcA{3vc$z&#Kr4>pC2E75IV>`Otwk6;Ae +42;3UD=$f$xDy2{_7yH$qk5+ZuGrC|eXoysiA?%M#7Amom9%qA#t>6`td12Dy%9z?*# +-uQ5KX6W_0W<(uot$B3Eq%#ZUB-sG#n%iD>ihU*WrtunFI4^ZQGM5g;rWCM;1M_o%>qXoR|?j)KG +~u%lbyZY&&{6piN9sAk@6aWAK2mmD%m`+?QZwEgc0029V0018V003}la4%nWWo~3|axZOjXK-O-Yc +FPDY;0m-V{0yOdF@?obK5wQ{+?ffRVrsGBda9YNgQ32tvGQuuFH$pac*WRo0BOKvbmN>ElJtdUEP1b? +gj_~1V~Y~a+8@|RV9|lMg#qz(dY)iW~0$~>&<3kZ*s*J%b2s1ReBkPESN85e9ptvO9S{BP1!uTSO8U{ +(RlCx?nZISl2xL$v?F}9<_?-N@$A;`IUUK>wgy|? +7-WB4~untn@EfuESC%Q$3yN8D;X;IoA5EdU +e}y9rJB(PpzKyl54gvJ~Gotvk-@CulCc#7on-2@ti}&SJG#jdY}TB$J11@;QwG(Bn@mNLVt9ZWwgR$? +9a)X8N6}mp~OA#@vY{C2_@DLW?mqd1P@y1Z>(Up^my{LAR`*(v-v{Br#M&C#i@T$7oXBnq%* +H2yoEq*_N|KaK$TARUdG37<{dEE$e>b~F-F5YTD!3Vx72Ya&!?G_E=0VKZs9DhqYI#e#=E&>3X8qSmg +hWk_^`I+uxKixMP3n514f0h%_O^LZ4nt^X_>9s +do3YiML%#+<|c7GTu!Gve!HB_+VuO=GW|4t_0_!(uTHc(cyI5) +gR@^xjz-5HJ{-L{esy+aR!H}VW3e$kaSu4!4eg72r>}mt@9l|uhsPi7d;8+v(JyEAy(bSIyg7RN>dX5 +x5asok)6Ykv_s1WO&+t~S2e^?vnOyS86-_83n7&|^K)cgsFs3^xvFq-gIGi{-fraR +V*LIl7KNZ^OCriQh!>3~(%Fc?N7A5>w4iZB|J<`LDvHu7i?K&;$45TS0rQB?}o`yujRX~dQZXET1`O; +$`)!xnLrMw4iUV)i@F+AK;hd3+N9Va#`9FOUOKA`wO@PSfU4x7(!2U>cRoAL-ziW@8Cv>VicxKWh$*U +l=Ohgi~v2kg-R}zq5vAxAIRTy#zF8-1C#X6!PVWLPE2|ESTUGpaTee=7oMW%bQ>}V`Ic%9$iBL=vI$S +mnk}C(lKbTM|pp?E0~=w!!(%lpM~f-9`<~a!wqdlAcd0zW{mv_MwO;cNXT+i(`-z<5c@_#MiynhoTb4 +o+IA);*oLTE>LT)&8YoINVN`H$-e!*H_~YW8uE{u_&>I=004U0_* +WQxP#%e=fcadMI`2FnqEqaegqgLBNi<$+Cs#u&4n+>GGo=2_ZVYIxs>`46!rdll* +Q92?ZuxFaBB434K6Pnl7%WBFUWjSSC)0*0+~u!#`F`5jf{7;MpkPl9QHdZv0XCgYVrP~y#CwEIGzh4Yh=wHhF&!8v +sy@Rh(W6K_1@9iyS>0wKQqm5Q`=-eFA`4IY?{0Xqk1n!Trwd)@v%IHTUJoR=hN%c +yc3!2|+^b%ajXKo=H*QJ%?}4SGhdD4J>+;$o>BqEFcbq{`)#H2dn!#E8Ptme{*l-wYtqSkpLEoLlwU1 +NMeB$#jWmlwv`;({BMsFne$rR6;Sk3DQgUK(PwJ`7| +5psfoqz~f*Rq${a<_<5WO^jMlJuzSJe(zN~zX45zhe1Mu}Z9!=&Fit3_)^b#hE~Drw@6Dglm}+APTAo +}+OLQT)Dw?C1jeok82*98VJX$7DW1V?Z@H;fuA=8n$x5#-l(Le*X5kwX^+5J6k{AU>>9ig`U_sWXEs3Ak`)sAI4x8W(E&@fMf-p&K#Vj +&K$%C8hot9Bg{{K55Ez3~0VFVnL8J5Hzrt9T3YNeWPs5G`;ixB6JXe-{-T|jI1`7cgCebp +UI3^jy01z6@cxcHF_rN0$F92jf0jPAN-GBUeueaMPK{W_#a0IH_9BI0#!IS7}bA{nlgC`C;Cr9a3c{u +naMA9A6hJxscX~E4H405CE@&VNZ-$qRz(qc*;b&xxW@l00K3_&0sobV)RMy*Ynm_)#7ZNnU`fhhu*<1 +B7A1I8A*^S~Col*x4y-H^wR`(`jH<58fsm$k;w)+^(x=>|g~li3l)RtKM3S&v+ma*$|-Vc75OKifapd%FLu +%^s5e_jh~lB68&GMcjmHK(8m2qjWtXie(bEG;Ib=Q|_8{y%8}}MM~o2?9DU8gFIcnRW-vORwp_g{&4FCvlbrQiR +qI(U7Wy?E;-4v4SVT!6+#2ZAEC3SWu>T~ZAC#ssk%nygsjU1^{{WXEDix22orqbr=uqQxSZfxp4dBCtT +9o(V24-f*e*xwpr>w9u$Y6w}h%Jfek)HkP{du4&N}<2Hy8(a!~ay^L-|RVz{xLmM8lx62qcWFEx;3VD +L2$U&G%$(re7(g`M$O*rrJIvu8P`~y%^74CE184dAp#J#7h9oOF;QDye5kbr+KP)b& +IYxaT)VMYc{GlrXol`s@vfSphHAbmP*@X(d7(%xJsqTzUkenOoD6OUKM@3Y)q|zsBxYVTF5k7d5}esn+ULQwjPl;rm^-Ch)Yw`pHnxb|KZ+k)! +6B>h~pxzWPl` +ONUbz7AaFzLj`#AoK3fS(CfKnkiYz`qNPEM`m3;lAc!aXbA+}>@Pe`SRDB1;Gp|JKHkEM;i|kMxOUW5 +Sze!M0e>16B&!yzL@1qwCV{!NRggnJ9+TDnf?4XOv*VkvgKpJ%55DD`$b*nae#BTRVRfJ@91~UV1 +sm2I(cl7TM;JH$!+<`iL~@dpRr)MIp@tdkjnCRTfT-4Cuw5gGxAH&4TCNHdwR@S^z}Z2?k@yLTu3*?43)XibI`+P&rF#M+8-Iaa7QC5KuGJin<_#hS07UT +8h$Kpt48Z3m8K`8GT==`CaVPES_Ai^2&0JF5y49e$fVhpHG%4AL<9^G*gkT7PzKm9Dq|dLsGHq7kE(c +8y&C`qu0w39T(O>3^V<$P(E`q@JO8o;F$dz>yCR}@xe3P1%(t18f!~4d8uA6FQtCDitqNo{58kyzgYK +nI&IZp)^#yMs020K>fy&6J2}j!uYR_a+iYF9iOOmm96MSYBB40AuuwPaNxQDkE2aJL>ZDp$YoBdHNo9GLobr|>B?@*sagGUNj2q;A7k +Pe=*`nWb(HB?dpAcEf&><*A?8Bi1x}O5SX3JUj(>Pwog_- +vOSzM&Ee(uF*D7rM2$1fne)vw;JC5?-$;ucZ7GpCcMX6fOr4*3-7Z5x;qg1v4b+4kA69;ug34&Wl--N +j(65Wy_p)nH*l8Al6S^gmRC5xZ`;h*;rzY?=L3av@9Euu-m4At%Xjxidhhp(^mB#uUjJ@LKdF!O@x76 +L^7}>FbH!05_E$1>S>WkbEwItTaa9WsYPZneLJJSvEu2)fuvgwO_wcZc`u(c<`?V3;u9IT4(7Eluxt4 +8ro;O-J-Hw+1^}A`A-`!lx94#Dgp@D8S^n2S;!^`ichJJrLY8ZSsHT3tkqlW+ZermW+Q}Z;qB|oU{&=v$m^Kf@XhfX!bWnb8izg`}an3&yD6&9nJlFqPf2{H +1{_}^T{S??%x~DCvG&K>1fuDEKATl*czG#o1*!A6EqL*jplPVng@p6tQ|j=8P2EMvz$*i1+@2UBis4( +-jMd5xiNiSx~^2*Dfo@nJb%Fb2!Wh;N962T^B%#(eU>|aSY*d{M7FrrS&D3(Am~0Toj)wHlTu{u9kCx +&Yk#wSIf0;mX9Ry3?fi`qtX#Mdg@Tl46Q5yZQK#Q +h-nIh@6eh(DB5b)ly!xc +f}JD>Y|_# +~+={9Foa%&w6S5V6WEv+>4@g!ZNpm`&kK{n4TrFh>cupvUL4{Ajq<3V%BPKdAhc>%*e_4oJNadoT_l9 +60)IG`1q6*FBdqu3Kr7Aqy)F(2smYw(8RB{*1=RSTQ|i*<6J9ro@JdfvMY2b@fkbsq)l-bpYis#p+;#3OYH=1T!z@g|D>vW%Q6*$5B +pk`{b}(sChjoQtN??1Ml_-!=y20dJx!QQl4VunEdd`6{haeZ#h=-O +d?NK9_b`!)$W-fR%7UrMF!L-WJ4{3lndIC`rDg2<>dUCv~>n0ST3Od93cpP4tAEMr{I%D4$9Q +lS8yu#nkYQF=SOqn&lq$m^&Ex6HYU*wYL_iIPZPGY-0XW3aM|!Ah~ZvSgC9x(CK6^f6BhrT9_FFQpRc +>}CF}mSJignc-v!nQ^T~RyI4lEm|9qIjo(V2bow-A6}BiW~QsX%+8l%P{?~`Prh2h7#R)bF^CmJ{=pK +YsrgsoC$=@z&tmYC$o`VqaP%%LkgA>pQuW=zF6&*%G5cAd+;&zUIok~L7q}Q+o0h5A?XeY;gk&jCYh- +}ScvmET6K%{0hgoy92we-j=nW7dPtp;t!>2>%Yb1(_Mpl2AKR?}O)~h9k_S+`R*V|x|MwGas_>`bpw{ +cHMssT{Ys>7h7b>&Pijnqr_&@^Z%!;gFwMviM)s!r@p1t5D-d=xqF#*@OniQ4R7qNvzt<9=ZeMdZVAk +5Xc8XM~V0=eY5=+ez1EN3e;Pf8fmT&^u9Q>B?eNeS3xaY82^LHc`C=%iYc{dqInGi2Ut=1N`a+$Zc2} +5{<(KjR?n5GgP$Oz3uCj-K(Z?RZS>|s%S`0pWja`lnWo^sFve-$W9>!HvsL&JWOf8& +QuDD>uhG_vaxNYhyz^fKj|U +%1I!XUSn=BH!rfp5^S_vx=?1g45_E!cXJ1hxvDjD_8MkLQd_VBKutBZ1 +=z{RyO?{~BdWgclN7q-r>rfY+Jtio#w_1_A|yRl`69lJ_*#Q!#0HWv03|BVRBYyBL| +W$)xcP>Ezp7v3u3)T=kF4k44+h#oSZ)v9nqs8*-m*$!y}%>{s}CFI7;avU2pxd)!fWJne=bm)F1Zw_A +UI$7V&l_Qb42d&`(TsbuDO)~Slw(@JKJM}4Z8J*#BqdeEhcTk*7k#;r0^Sg*q}MtIg{?;S(ItmE#rND +uv>tQOa~i+Y@;AN<_SxlTMrvu~}U?s4EgYNZYSe34;OZ$~q_#@?>O?AAS}mb1hvzXsp*bs)COdUp`eH +ZAxdynwiM$;(M#ty;airsghs|j(2URyWnu!FZ^(N+SY2{Yw=Rc{ADwbVtS^Hz;0=WDa;kU +s#7;+w`-39(1{rrtz)&59`%dj2_D$h7iN_Z>WaSSEr*bLX|l0sT3Gk3*${0-4|q6Urd*GYaVXBU3tdo +Jfi!)$j`%qATM%Xi{*c%>PMn11K1!Ki>hecjke1oKKN5=8X_75tsPX@UB8X@6D4ZAg;aA}X)0Az385s +_6PKqA03t!DJXT)M3hF(2_X?O8*$Ib>%>rAQ$eDC$2xhl{DGDV)h8?n0!Qo{8YiBl%EnD~F)b&v+7YcahY>>EqRQ7=C!pqaZ=ZKT&d@y2 +9hM=#;m(IYX;-km2YV4*`M$~CJ=9;(yTS^qNCl|ZPjvSO`rvy4&A%_u(>g%E!8iD>$60q-L+OOB-}5i +`Yi$PtL(b+^n_c6Z>qP~nLB~~fn5j`-+mr?AwAI)uE$Xc|XAbr8it3|1QDPiDq4(p|Hpr%hI}~;K&)a +rYrMg;MNxf>Wci}Acb6n)?exA3Wu{)=pxxBn%b*Z+b?C#Pib@V~SV5?ZRH}SZWrO7&QvcE|OZn~fSWY +d1!bo2P>-MaHI2ur&&KO$cJmKHtKP=&=2+Ct&-0OS7vP)h>@6aWAK2mmD%m`;BT0T+k?008I$001HY0 +03}la4%nWWo~3|axZXUV{2h&X>MmPUteKjZ*_EEUoLQYbyC5K+%OEi=PN{(y``DirI#%f+V1Y5u$01- +UP>{ZM45;>wvpw9{C#aF)B3VG*yu%1dV1Ck{Fo`gLZJ)95=`11Af`P=DvZ)gj~&dF9gDPZ(2kT_mby~!~QZt(^MVMNhnLf= +g67Eo%65*d{OTD)TceGbk3^?gkOENmPMn +Nn2e^jXA*4~N5rWRB-P8GG=n*N3V>Q%#jAcMtuspx41N_~fiMBb+2ola%Kso4qc}GdL?u=a^owbl>OC +ys_{;g~IE}mBRn*$QgNM(hzSfSYEGOva)M)VGrT{c=!HYIv(IQv~UamWjB8TP)h>@6aWAK2mmD%m`-I +I5kwRL001%q001EX003}la4%nWWo~3|axZXUV{2h&X>MmPUtei%X>?y-E^v8GkWFjDFbsz8`4ytQY!J +fOeTRMYFetlp>@tRN6QvQ@R*>aF|NYz~jq8heAIYyiw(vbrgq|Eij$N`29JLrCc924c0y-clijTnkBw +k0`=CGg3YWP8k#G%^4bMsV#4c%1scKEo}G;lzi;QsS{_jTAU4a3BQS!eG&f#ArIl;x8BdKPHej}8@~L +$%~$Q}x0gjOmjmL1TdY$f976kzGChx6W3Q$samrp`PoaX~x!DChB{w`a?3;a&`&H8y$-@s~L(BxR;>RHfjtwNS93Rw3 +j=x+H8|EhmbO9KQH0000803{TdPG*YQH!u!lCyp%6-8OQDn^Cib{1Doc(u-qe)-_l_iINlL4Wq?z~Ld~ +V>=$wU~8C6K$H(SkJ{xkx?CuBQNeB47$*1V7}@n+ZF)?h34d&lIBZPHkY@GU5`IQXjwU;E>+!xfG&}8~oR+Z*VxkPTbf3cVDZNrNtlgdJoP&plA;ul)VBuktOh +V&C5hlL~8jrTSYd~zy0?Zsn`UjR8Ipu8b0Y!O7ASjSf^J5uQG63M5?OF_e~&_HX$S@WO!za<-%`YFg9 +iQfgWZPBm<$EJPG15VOVswR1MVI27dkCsy|Rm0|XQR000O8B@~!WYmXe2asdDUhy?%uBme*aaA|NaUv_0~ +WN&gWaA9L>VP|P>XD?rKbaHiLbairNb1ras-IG0UgD?<=cYehwSwNzw>R72mKT;`DlqFGD%YievGB&l +3Ncs0Q5ZVNkqAVTa#rS;B`Q`k24%B~#Q6GpKcj7N|fVw50telG91qlO%o;;oZLh#$Wt=2q55Ar-7E)7I3JD=Y;!?RJ5Z08yn5 +e0?$Qa17GM0evoKZC)>(()3axWWUF;rG+@_RyLsEOe;EG +2RS|{!9(Co}2|INWook5otEVrf9bxoq~#vSPaHD#E$8At{k2rcr}7wQ;6@DcEojxVVe;{lb$fvwu`Yd +(RxyW_Sbq<$$YX8TU(#~Q$8tTNNCJ2-q9L!PI8a^?Rum1pYZhSmgvVoL*RNN-Tk+dhW(f}(vY|XAB`T +zw2?;0Ursu4(9k2^Nh8}t!8cG#0|XQR000O8B@~!WBJ^Gp^a%g}Dj)y=AOHXWaA|NaUv_0~WN&gWaA9 +L>VP|P>XD@AGa%*LBb1rasr5W39+&1=ozJgI6EWxVav|FGUWCBdG(}htdcJ0(y>|h|s6314e5ml11<8 +{(+-*b48NJ(QmTR(Ut^4xiNZhA>R-jsrD%Zd{CE!wOiRhiRT(1NseK{=5(lt{{Vg0QW6SvFY?KPMV2C +YO|plGU@9Yz)k>P`_m~vrZHa=#q~T>P0in(%3OX|wtf4#uR^7X>Pfe9cV7{~ +O;$F-&-==Jm^p@5I<4JShWT1L|ZACbPSGxL=(?%-3>iwLGwvr+yLV_6A7cxWP^vkL)o!Ze=!`rD;}Ga6${Ro)P#949xqCf2KT$_2M7kX4|r+#XIEBOTp^V)~dcOIjeWHmLIYmw +fjCHfX%?vDeZw_YXgGhRVD=SxQCZn)zTH`j7M{g9|Y=mS%YUPNU~F)r+DYSRbqkTl6MKFeYSDQ%X~%Nt(hFnk!A?j!oon0Ea2zO# +e$qEV5EiFoZnD2#02ZBf`_@jC2VelU-FbL~A)_+E3EgHgYI|+TTm&AOPiq16S*w;%W1Dq`F+5A1~jYt +l%6&1$Pn#r8R?cdu@;(>&VD9wc!ru2-|PlvWT`nB`@#^`n#+Z?YeU#+JGh +wB5SGsWjsC5>jS1LM)htU@D1}wFyDBmQwM!KfIq&0a5r)0X)%nHo>4)^)`!n})FB +S_px3BuqKE3IlUUyF~x~IQ-xDE{58+g25p8vKwPfwA9%TK{zN-ArMflodBQwl;*(~5LFE|({NV3cy}t +S~rGFJ5m2V{l{+KSJ3;L3823fs{6mALFWsN;{T_W-5}#n8b#B)!=Vd(`vD +MSMzVxMo!^^vT)seDy&K9R^W?RS2g-gwgEW*^2xv%Ww7XGt|eFvSBC3^5ZEg;HvZ0sACv*;wut|L^F# +#!mnQwm)@aMMTf@N9+^%qVC_`uBVK*sKAWimB4?E6G{r)jLc+jeKh!_M`XslHWV)E0I)xrk=jk$nGk5yAj&-2e?&qQE%*v{u?s#|*iT2+r4T0 +^g9UzFl$S5)Any6Xbz%A!DVvbMh#=?RIGf8R>sNQwJUjw9NmQ>QNF1%%GmKWYK{nISJ@Rn-}{l;6q?v +}k(iB*D$A{1IE&^%Nkvqp(+>@4}c)2uZ#2fK9hfH1I@XN_xmMPOrGnyTT+XqM1ZZ6G@BKN{qjdl$X*czTw;q_(_yzZ)z5og+m9^B!x40i7&cVL*qAV^Gl(tW_t7+{WmbFWc`0|wtR+8(2^0YQg +q^{~SgtFw|4e~)#{5TN%=AVf{X5+)Xa=^VPo5Z72w;Jsb1Hyce-g#bP9>EeLsb^SYO(b)3o;MnL95%SQAU-jLU^{^UF+(u5ZZ_?Y0Ac4aLuBqCa|`A{jT6O?X*G#Aq& +_Vg??rpgnV2}JiFRhxuhC=4%{Wu&CvP=3@QcO9&4|qvy!bh{vFBc`!K7j5Njt>KB_9JH +h4C8m~`(BMIha7nGGF!2}}n!89Lif3_=+`m38-&bM~#fw+dIGelBYaR=ALukxE5xX=P)K+J6CrA&O*` +qoCz^xKJ=q$><7P(Kf+5^5TK{7NIqo7zl@bO@5P!OyW%H9vnIt&L5nD=vF00jC@qkD{= +}7-QnjL~1kagQMUHk~m#;O!3fxPfo+;Q&i%;IQ`TE<#FKbC?9@I7&Ikxj%aUvG>hpuFJ2OC^iTOaSs|iRf}~YY +7|LrrZk-sO)8d?Inlp|3L;go5BVY8~?-YZc%d_YAe6=v_l?~hv7ZcwnY;9o<*@=}4tbiTr +K@hAAFtqGis-(}8=bAY-*;kCgZLNv=Y-sDd`daN>LjbYm70Ir#QkPw4t@6aWAK2mmD%m`)W^p8Vwo003MP00 +1Qb003}la4%nWWo~3|axZXUV{2h&X>MmPa%FLKX>w(4Wo~qHE^v93SL>6THW2^LU!iax0%O8lI_XU2( +(8rzNb8ATwS9Ti<1jiS`;=ltC2@}?`QN*e01KNmslOPsyT5&EcR4|e8!FI-W(2{1TH*|4bWL(WQdH(C +;Yi*PBnjUM#5VdRD)1WqhK4ObZwVKa<<1HEDLf4j&Qs0yYJOSsglJBPJ{%7E@pv9r3UhtN8IuMZEa0S +If=b380B^%MTC-h|5lK)=B&L}NoegI@lq8!{mYgIBqPv1|iSV^xSt&_k-UF1siIoQP66a}v7^hpB<7`3hl->*rbb$%cDPr +})Rj~IuLzGECPCt4I|0h*C5xerjE?XGD~egJGpA!U$DEYJ|46O^;R@v)eo_u-D+5)qa>%jk72t-y$qg +=76(MJC)~{ugAs<{L$`H}Ncq-%n=&8fjX^Cun=gF-{Op>GxB#y +IoXk1dT()7l9+SG{WAx_&vjk>ALUR?njO;E@S{6$VZ%z5pHe7W#0@Jm#j{a`&CoQSqMuKnhYgtHM8oO +t(fDeF&UF?%lj9JJHKhp@qEtA&D)nIsS(n0hoZ+ik)PEB%Ky2u_OVBmAsZuxxR^DHe__wJ4p#eI$V?PYn;7!IV*av2QL~V5 +q_b3{Fuu`fok&VK5 +(swQ-OKeeQ$LHo-r@3I&n6VMlsGcp2VZrx=LbpKpo$1bM_fI7c +I;yrjW3f%s1;!ArWpo(pW6cJf_L!g9&(w?;ysE0(f;_Il8{;=6VOX`^woL0%#k~S_=T;SYdC! +E5Kf3jcbuVmazG7f>R{$2G*RCYeG&Xg@N`DmU@K|4BY{dAu18UTf(ykI3xtns1PMVCr?kG*+zwWaGSg +3x%bPJs@ZC^+B211eq8v-jQhj8xT!DIkd%p +6wB9B}WbI&6D?QGuD?V53rT!|qfrOh)7lmKW$!zvcu`APQO;-U6zSddW>x5E58(TWET>)@DGM?ntH=H +g$MwcIpfC4!~ixWu<|s7O;yh2Xlyxsu;6rD}DR;>emYsmy~Q^eO3jQB%UDICa~R2Of0K{&_?oy{fqhm +w;DO$sI?BPMw;k-_+U3yK9d6tsusF7z!sPKJvLQI)KZ8bRPN`~NBpaMhCV<2`Z!eOf;*%tFAnTnk}zX +yXmsYkhn}wjc;1Qa5rFTs-r}uShokaZ7j(^eGZ>_-m%T9My=DFNC>{K#_Vz46ht?|0m +Y!SlXUFV4><&-bo$k;OR3I9+drLklfH^!U-GcWoPCRV%yQB$9n%ffL?K35)gG}JQXxIRuAz!gp`+!>Z +-X?gR!w8;+e!mA!~-GIS}G5!mr7anrj==vtv&)*r)ncsfb{?XsAY23Cd&D@35bz?0%U$#o5mhg`*tQF_uVr)Yqx5JDs(YDx&V@r& +X?G-1o@6aWAK2mmD%m`?JDM$>N?004q)001 +KZ003}la4%nWWo~3|axZXUV{2h&X>MmPb8uy2X=Z6;&vesH(`o0%@oFgwmRM7ymY^)Far(F4`v5=y1ZCMxueaT5Cb2~V4-XIT3-1BXhtYS7Tt-)UAtLxWT +c<@-L{z0t3os)nu#XO3z-~T)zvbZOs>|=x)zg3lrL9R-9+h +BR>isz6aGGmX8BEyh>fCEotF)CD6<9;Jup2o{VTnzszT}qIZWAkP>TZ|Ihi0zX`{!L4M3kyn(a!+QMA +dM#bgPnW<@Hc>T$yq(mfQxM$uPdo@QI~b(Pi>bk1q(}M^;gT +a7)z6QwLIFh<`v`JxED_Fu&w3aYJBp21Xn87@*a8ax1n>XJ?fBy4HVnFGEKToA-M|CGO1eztUKmX!y@ +L&{G(;r3F#0s6y@Exo|Q>R%2Jr>oBp3lS;EEhbUOombvSE{)^1N?j|U_DDoECG#?6KWwv*`&B=hCvKw +z^B(jp^y+88&GPhQ{e!)5t@Tr7kliCPY0aC=n@GXBmy74<8RK +vChl9F@lXKj0c0Alv$=twg51sfG4$>i(6phw9Xbo>>itju&&6F)V}SGpE}K@=o-qwxo-_mqo*HEK0X~ +Jpn(An4-g-;oJ%<1Q$T1)BPH{?TCau!J>x-~prv08<5A=^P{zG|Z^1o`-a%K<)mDxTQ06MlGO=oGl6m +-9ZvaiZowW|ACA+2x8sp3y>Uqoa;p9pEv851>XuXb|uCOFslweLcIb3F^u_$1XEHSX?QYazzExS1q5FXdphng$v`u3M +@!kHWhRF7cH}sZvCG^|y>%bphq@V|(S%`W?h=Vx;wE1>x**l8-d4>ydfH1cuwrIfi9(5A0Cxum5Bo4w +pOm)Tjd^nX)u!nVhv5&J?xg9HKAO%&V^p~&?W)V^&@62l-D1ESAJ}t&6nP?Q?7~I0x{Pg+$SP51VxqL +9_D1-dyOJJ7ZuGWj=xvkKFR@1*y~!H$K1%nG{Yk0k#)!t@FkLR#fvmW49fKGeHvE +Y}icfXnUAll1qz2$#qsc7TqPNHvf_qQrLufoi*U`f_puyXyd@zEth};tkTRT8zI=)QdqET|GRbUd_Hs +}x1)m-{Vg7{IM73*#(u#jWSfg(268c0M9|MEKIBRJ#bryQ>kYd31FON{)Mb^9U}+DKy}s}2wfN}J9Q4 +r=OeheTFmGTFbb~vUqM$V(T_bg5(Cm|NjbW^`+`^X00!LdV^2SFzNqUl46RcalYWH29^uOAmX4@Of*js2TNH5T+#{aDPEVq}#XW#vNA3FU1El12_82)yS1VD@x=uhl%QrdseJt9{ +xb6x7KCQY$r42e$lmSS*ar4zEg?^EXr(&L$CA{tu4=Ej0Y&ag@JsID<9N(S6|959`%c1Y(k< +&+EbLJp>@%PbxznAgl5r!B*poQV%G#V6y@1T|1HYua07UCyd9o{>U)dmOQ$F;;PNwvmh)=aZey20Y4U +T|u|gbT4*03XU#nxSq3L0{&_SyfaeyS|I_qb*8oMKP~lNN6XR +EGZiPWvXE1%~PbIW*aGBAY8GQ58IV8AwyntTyT+~7m*iYSP%XVD>;as*(~u4SOT8@X)wa3-@p0x^RM5 +%iSF>r`Cs3D{q37CUcY-2hhlB*pyM$Z;Q>Xk2Q8%rPv|j7$fWb?CA}&HY$?$#>oz!}2J>2=eduZP(t+ +Xh_B*SWA3y0X&~dAKw|-8mAx4SxAiMX03Q6AH(%cn}urWh1!t4=;HM{#9s|iLig5HB4DAGfj^?KZJPa +Zg&#{-WW^yLEw?ef**#yxxNWFI-r$ItSS^V>P#0gYAz{qowp)T0ltv`BnrGTF(dPFE7&7-aFuO3d~^u +Pca7>#!I)8!hkQRX4&}(pquR>1zceqKJVM?;uMyVc)`0I;1a{kZ@`4UQC{_JeYId=F<7c4d0p3x>rG#fEdHl*fZ!v`s)DxWcf|8f +AB`?tbNNPfi?`Ad;kD``8iKVFt@xv-@0BSsG$Q<4^6AhkFsM+z4jx +{8vv^(YN}iwsg4yTH5!r-@3lzvQn6d#(7*tH7YA7bnO6b@}W`{K_6wtST$%sz2Nm`n*s0*Z7E9tDQv% +y8kFryY}8bG|utleRA2wmSCoL)4S}h&hFA;wSX_8N$&t4{=3P=rn~384J9GaiQ{`WL9i>R=A5VnPN(!PN0>0W2SD +x!*fPBq{J2`-$)q%(eM2&;o~!u*Lhejkt~(@b@1f%RXBX-5Pnr!Glz9>(xWgX##?M{w>HFmU5h+1KJh +?5K^cD?JaxY&zPG|91x||L}Xal009FXlMLLxMDv}cyj^G1gT1JHE9Ns2jU#=?5#XIH62J%%KJ)o-R*o +;kCNhCk?F3+yJ*{A2h87ATDZ((>=2cl^))ksb=bykEF?NcY19=ruTZoV{)hEjb!&@zY4IrxZ8_{@9@B +8J3(rzhPD-+W*cdQ3Bn!I_c9Fh;~$L*M%rS!Z_ceu~Y%StNbIY1k5gK=VH3FNvabFkeT+^i~}Y7Z0EP9%RgEq^GFPp3S7>-gl)6ijR_s2wW&mx) +~}YzcN+PxGcu>#ZBt{H!k+(~S+a#MmSBau|KldLJg0qVg-a&B<@l0vsH4Ql@!nPRE~($vqv9aX+5gdG +=g#+~Mc(i{u4%!$)UUbMTz$7|@oQ8_CN^| +VW6dg2)d=#l^#)!G8BywL7pbj~6|M+d4aADGSeN=Dcb4DQC9jEN2=+eA-R>uHf^v4_JuWGB8LgvT2(F +F8erv{9*PK&lax>14sH=~7!t7q0-Eb@+(k%`n7`DZ^$XL<#<~w}({016zE9^HB%K18fgW{o<0smEVeG +b;Fn7z?kF(5)C%hy)(3Fq$9t3OxT0xPX7@T_TcTYoIVwr+Fsc>?o1g^hl#Rx(!7J9MNgN&R-&9^G)5X +e@KLPv;RnhGd*`@>bv;6#xj{x|8|Hxuu7P)^t4jdu+r=s3%L?$)pZGUu8rNh2DZnA~nUEZ7`bhu`GZW +e@O~J}>kkin@gU6KVa^}cipjA3^vP({bR_3~gQ_wXjp(o=^T(1%pd1)Vm3<<~g-TYY#_S|2ZSta;Ljt +X@+%ETOS>KJH-h6$9^+y@FRVp_;5JjOo!u99PckyYj+W}JSs4NqUX? +g7|*s-$y(gC2mzC(J_sGDIGdmJSGGXGbR4glGP=A>LH=HR%(_v5vmko +muP`f#ToJe;Eswm$)yBkp4?yLywE{mvPG1Pv-8T(d}B|i4S>!nR7BzytZTF`(G$XZaX^C35i&2!55Mk +rVE8+86jB9~aI)lOC`~1 +&{%#-Nle2}cW_xosE0>jWJA6W$T2qmcU53B8ItJp^hiKj-bKuUtdwataN#Y{jS;ZANw9_F +l*7Ea@HMq_>ayl9MOZ4FHR +s*R?{;MdVv;PN52=@AWY9R|osMkZ(kOhhr(pjsJ95r;3;80;b^n%~*P(<*0mnLdo|8}bAO{o$IF2PkE +$4RRA=Yb4)oyBztJ>uKr6bcmCqErbTTTVut(s0h*(EW~f=8T4Q%j0*Vx`XQCA==x5MVr)zX>UhAn`ra +??y0}UPVg37JtSJwMQQA%A3oy3q28aFaEiE9@dW3vzi3Q>6XyyFs!t0RYpM0)is_X!0SaiLfFQqIe_bi2ex!ti*%#RoqKvF-C?dlw9WmlGqeI0p=_0DFl{HUL65AH%5+Jzjepxy4p~(ML=Vxi~umT6_gtBO*`HoZ~QQWw(T_sw5H;UBI0Q+J +6Bw6gkfmJmuRQW@2-d=ep+g%-zc2cjic03xbb_nKzY;ku$7GG(u2~{MP)zi3MidvxmS#L`LhC=9TkDjtmxI|euKnbXapN>!a90uPe$%N19)ii(`O}J7Ib=JPr*My9eL>7 +0DK9UJj31NHH#Iu#E+np!!GW--)JE&PVH&K;a&?j`x-C(YXpx&*V8y!H2qzM2b#kIm>7H4Th?%{YOc6 +epSAcFF1pmwml~-pQ9kCi}lLJ00y|M|6y!Ydji|tJ}Scwk|%XF9zJZ1ddNx;D^)Za#N>47wwJc=@C_f +AH#6d^2hOEBzRXM~y7OALXM%9w=n%@77QD0w_Jy+0Deq=e|9+vB`(+f+82}+Pk7-60VXc|%QSO9+CLk +%p_Hu=R5I?fwi3QcaE@{KIH?qj}EVMLB=imU*<*KfJ!b^UFx8X9qQ3r3$U1n?bjk|=)&pnZ93_MVhiA +J`JC0FR<177GEp?eDJ$XBMldH@zMJl@}_+tf)C{qE~GIl6{0`S9E+etYfaEOcBk +=>l;{x08=|pz#0{x?9Y9Fc^o>{se<{oLH)V*VcvYp79xc!M7s#te9|^LFJlpS3-2+(54l&A9TTC34t2 +()QS7Ds}tH7pCw$Musqt{vekv!bCd91=%{^ogkM>FJB6a8S02r=7@x2{+P@i5pY#(I9QI!OK}R}z%m+ +H>y&ZF1x5w@I@L-(2g@*-6RKe45ST0&tGv%$e5ji^=l}f1(nZT}ju1};}4D^XZa_6dY6rO=MMMGNO&l +J9~TcE+uz(phVbQp8&uP(9uMcPx +RQ}ouhtGrcCsvXZ6Bxe5)%as*orYJJwT(9Qt!l`0m4w)?qS%a`khylvvV%E9nb~7`pdbQbZ3VzEKS8D +?^(4_m2%^F;(fK-p4L=DJfrBcE#*#Gwx_CMlxk^*uuH23ISkq4*}6z;RZ%R$oRAZ_$2}0<8^W{GUYf( +!!*pKzTB^IzPNmznfKs4H+^-9zl%_8`2agsW>$0K(#@ +1qE|Ju&j9TEh5|33*&JR!X$u=hen42<7FfSW5Csj>+?5c091=WaCP8wTjvFChv<9W0(nbxUYP8#(N7S)DW1d!P1;(`D|x0ynl(bK2n~lZk7_LfTI}Vj+3Fj5tqJImoXR+)#U|ZKSJ9iQ +PnPuu?>wI)`)9d(z(Om3z(%@i)K!#r*kG4ocw8~UKeXE8w3_Ai`7V=p9F~fxXp6=L6un#1hnhHC-=6C +!V4xH5Q%uDym#M=#beAA4qStS~jM8OQ&YhGlb!~UFUGFjAFX$fG#8aGEYl?I^{lX-^*{@U!buA1 +_6X>Q~bqUej=GUjH6=TBxBArLbJE4F?nT1cU4EzAJq7HX{VrDBsnJD#m{w4+8UyYZRrS309;zsBAsoS +k8uBn9Bp5rP*rh)l`}(A->byv&eDzw5Sb9g_u)qP>8&UFP%hC!x&57{)>$SdS6L~y(keORDh@6aWAK2mmD%m`-6mt(}Jg008g>001 +5U003}la4%nWWo~3|axZXUV{2h&X>MmPb#!TLb1rasjZ{r<+b|5h`&Y2efZ9kZ1RHiK(8IdsP#`FZb= +ajV48@`oZMI}ca+++|e=j9lNk397h8@`y$w$6NWdz?>(n2L`1X@MMYp7+3%A$Zy2{hnV2o6nSL0949O +Up}I=DphlexR{Zt7HTp*>nP2iQsm5cNKjY+#v?z{QB$c=596ss$er(yFNEnV6fFzI&HR;uhIre-Ly42 +1c8pr+OniFx`CpoI@cL23Xn~!jRU^0y6zkn{r3cfTuWcr1X?4NqX1PpUuZH!7)<(PY~8mIQ(dbyuca6 +o+jp2GMah*`vZU=lSQuR51}-QO^JP*`nMv=@3idEgbMh8g!HWRJ8_fJqex3kbqn>`c9si9ALN&LuTlh +Tv#Da%G>Qcc0TxPpPmY$^(2nkuOAJJq7VTbmzVI9EJG!1Jkfp)iGWg}}&s_WP_D+=pOQA}XbIaqO;1B +F1~jwBSas?eY+(S}@)(yfB1k9-T#yDL$n?RCZ)xusBCHmDri6%k&X+4g1mE9!9(i`bPOTyRrj`&y=b^ +a$p-wm9g1>)A2BBuHE?41QR?(NCH^RvUO!w#^l<~GjC9?GI +^xsL!Dv#>27h!oGQ-6C&%wWB_Jny9;_GL>H8XAA8mT=0Zr`8L!>m_-EOB3nG!=%|yHqFN$Xi8H5u$2A +MQe~7g+vMSZZTvZml?@u@`{Hg5o(Sus;a5@5VdwXOY0Lm@^03ZMW0B~t=FJE?LZe(wAFK}UFYhh<;Zf7rcWpZytnKebKAmvNy{`dXP0YDKXrL~a6A-Ip76FG&VI6cLUAS~FTOk +e@#y62$PmnVO%+9@af1UTmqnRYg}Mj6S)oK+ES8z9q)22HrCAvcW~x|-$z-;wR!UALB3&#CRf%X?7TK +zj6a9NAlJq7e#)e|4(!2sd9#_QZz(B-BmPuYJ?NSO!tD?y21tkZXU^po&wTg*mX-OXEvoueu`@vu^nM +7FzW)8%;w~SONy`k`oX6Vm%avsI^jfLag*_ir?=U|-|*JpMkVXKb)}dLwgT +b_u8@&F5@(C83^N$P~Mjh{S%JMP<4Fn_=!ZQA~e_2#l_1Zg8|?x545|nJ0uCWYSp=?X+ZEkziel)1y= +I%{SxvG1JHxw_OVznJRU!g`|(+-f&TCfuGB}ST4!nO`~-{9WmAj1_Kte1?_)~vXwkis!%OWzlC6WYc0 +ubghN{3Kn}&K#F{9tid9A$pV1L5tmtd;EYZmi@Bm9vE7p)BgHI+`QF%3)_@&HdK}R5Z$dAIwwY-NUYq ++d3P(x9Wxx2s`j?QnSq|cj%B8wK&BoZZ{_C+aPi^9b!zX;ZY7Fzkomq2^aMmzr^+#Yt&ei79kwy@@3g +xMD@X6^0<;-Of`>Z(W@1aNqB1bKwxysV-;uCX`0v$4Oy)JahtQwCVbypqYF&9f%8_EE!w^;dHU+=JOe +RI7-Bd99?I4p*AUO&yUD`P?Y6-URB{FwwDR5-*lm@Ev%^Ho&y;3_4IvAf(F8P~K}-=0C@O1&3aUjJk* +_pFn+LpMe9z%lAuFERp~2Ya+|l6xG1v8S7%0Le+N9=iuR-wgJItZxfVBfE(aWid=4#Ts;d4dG#4!NY2 +lI;^h4dxU`%=y6vj@ca)V|5kSz-!vL8dg(f068p2XP*aK3&ou7v +X~#1*mke3+2@hznmQfU5q#lSrl`GnJl6ukp8LDC{;`Q!i&9O{re`Bx6ay#exVGEvXNa`TpJ|@$HTGUVZ(|KmPfzZ@+7S?qFZSGUls=RB0@93Q0>G{^rK}RHDEkq~RyD3z`4zI><` +6#(vLk?<-I2GK}VIN1**c#g5W3LWhtoucE(C(MS9}M!A|M5!wnQFEN$iM+&y$poxuFJZm&Jn!EX7NBk +;LE~z9g5+KcWz@oNhv?q{|&;z~g)TiJArEPW(z#9N*7=v!EB-o?&E8;>{{z1JND!p;2d$wEXM9A5UdV +(7XB+FH$d#q;Q9~yMGS1H&*?O5_2$P>jtM%g$4*PxKjNm$@X*XdSF?-8ESXmC$taiJD98pHm!P^B(Gw +fF~hY~ImKm*^Z9+-g?QH41rdt(MnwxM*3dR4mKTIT{V>)WsE4>l%D%^|BOEQYurI*7Q1>Q_GO0 +Qx&Ou%?%$g>dh{@C#>%%+GZguZl&@Aw~}F(gyOLA7M+d{rwiIXuH>SCNf8}tRf%=bh46C+z+go=Y<cZ9Xhs$E=Hx9eQX{FFyliof_Rg~H;5`8`lpi;@bzdf&v%)zpqwXy +m1@Yc(hUW}I1{P{XSHEpQdUjAi(Y}-jLH#F=G20P*>2`7*W#|U0caSfH{6>O2vF(PkaBQnPzWnD=3vq +RdmfRDn@fC^SiaTv*QzE)bmd%;H?+myt)8noJXN=>$*yLrQ3{+qQ1@VEcw^fmK*cs?F|cexw92;TG=u +Qt^>JZKE3uZ=$$1i*O_8eCrmeHg6&m2yr8+`$F+JlsOQgA4md2A^Zs^U>rYynN%V8T^y%(2pLb5AlPF +A2=F6P&9tPqX&~)gW%D~a;vxXNxo+ZySzTMK|1ceh;72um3$v{0Rf)zo|p((1sY6eLWRk2$7W&#=nBwXJEE+EBt*cv#nV;|@QLpalb +BYsMCf`i5mRs&Omqd*P<7aJnffvGJrS)r1vyI=`B!D)Srgd77pwE3uaB;-R{Bc&hxIQ87R3GKMs&obw6L$z$1vDXFcYP)fs>Z8B`53p6d7@PW-ls +bF~|Ro)Esx!R*em*7tl-DI&O#dUJMrAu|dW65G~hbmPB4$*hb?A)=NC98AzBMI+zs4{qyu61`~kY-Qu +vD&Ez5)v!GxxCpk*q8>9 +S-a1&f5!O~0yC^94g7fj^bEfS7S26fWC-yOe?!ItFpx +gtuQ!{HUnNa=%hbI7p?JzM<*_CW2h$jB$C%6%HKzdPik@}WK*oa?Jv>72M#ELaX+*O{8lItn37t-ac_ +Wd!;oUrga}HcybMnM2{X`7j8*xfA<4Kj^A)bhdL-N@gR&NA8{f8a)4K^sEEEZDS7Ah&NHZnlvRA!b-n +bGi!n;E`;G#k;VHL&sfE(O>iUP^HbbP>^kBXHdCC{W%vWd)Ya@1!0Q%xM@EeBs-@IkM#>C=BDIw6CxFF!KC!dDrz%0zrfN73)aJ_cQamYot(VTfK&IZpSFA+zPVb +k8{g`C0sXQ`WOfh56kV%%MELAujkkddM$Gl=O!&7dX{<_itAQ5cb6-&T5M9H6Bm3%4mR>_C(>UA3LlXQ;sX}W#V(R!L}KkjAQ2ECa)+)Dhl+Dxx#= +Fhh6qf98H%PR;cw(4x6<5xQLAbl!q6W!1BBfLb#mCGix)jOG3Z+Jdp*@pLUC3A%}eY?+siZv +yACs1%B&&xFgjYwi(7*atR!o6tGr4x!!0KR3WjiSY{*fs)25;EdK#JYTYa*u3@%O)nlAXCM)9@w3ECD +Hh-)$3HYVn1nxQ+GWn=T&s;uRti##$K#YNM>Q415E7rA4_%>gxm#MV=K{fpanO9KQH0000803{TdPEG*>pj7|>08{_~03HAU0B~t=FJE?LZ +e(wAFK}gWH8D3YUtei%X>?y-E^v8MQc?;pN-QWyEh<(h$yZ1!&CE$r2&gQ{$j?(KNKDR7OiwLVC@s#+ +OIHYR4Nx#OG*`&T&(ALAQc_al;);(i18U67&x?;&uvJhu&@wP)h>@6aWAK2mmD%m`=xVxPWE +{006BQ001EX003}la4%nWWo~3|axZXYa5XVEFJEbHUvP47V`X!5E^v9>SW$1=HV}T-uOM6$k~>FPI}8 +K7c|g)QYtS|=vIfQGdID|HF&jzLNXm{EB0OH +Xw76X(^H@<`QJb*@{b%r7Y8AMJ1=Rgbm5Z@yG99{tz8sp1nJXj*niy9iN|!KtyiBT<}Z}6)XnY4O@pi +%L^TTRU#XDgdC9D-t`(6?+wXq7>0Luo_E1ikysy_nxfE7wbYbM7cz@hGy!c?_IkaZw~!(wSBaPrp5{V +o^S2$f0|~FD?5`*lagi{u92Ck*3l-*6FP-dHfe}|E$3L8`thCg!&^)QWHp=s!5r>&9j4I$Ymps=4k_i +o8cHIF{f^ZG!Wxgh{fCMV!QOU-d7fj{*7MjD7^oxvZF2Ei==182^PGZPDPW<e!rHkJ-lL?YApl!8q@}?hnB!7SjHZNBgy_OxMV7V6-zAEOU9A_l3~HGBE_`k*_En+IWrZ +(AR-L-G}&v(WL1jQi^-9qNKt16=wQ`#UIV$?sKXM*%1Vc&kD`%qh{ +kZvE*TiVy!t`u@$K@y18T!dlsbtNlZ0uMYx)PdIM!r$c-t4d!t@O{2}W$;K0U&VI9S4uz-4vu_3dK%_ +Ud?hAl|jc$m`gFT?Sm$B&03LTHUr!x|LPGO*=}1JV)Ut(Icz4VuINHeYNEm?4TEpg7c%BxVu{iQ+MwZR +r(h>^=t81^BPHQo3Bu}At`p*Eoq*AxQG8NRkt|H9o-YIGPyRUk@@4wXLHYYj?ZlyPOH#j51=6M4RSY} +`X`UmaYEck_@m9oP%zACAYjqX{y>rpA^@S+1*zN_k-g8;{0F|mW_i<`>)*hQ9%Y_?HGj^jTo!i6EnIg +7b(4kG*Q{z<+<6_h&;GlbC(TY%RmIqR3Dou3|8$#m4{de? +DoYZF(=Ly#y`ln@wQewxz+D>YKuo +$5V57-L0)Iwe-VO)-`{eqve95KgcFcEHO0sV+y>ebc>rG;bO~BBtX6)1XXId+1k$QnrcZt*FL$h!!X< +}8GtjX7BPlYxGw}t7j(x_Kbj3v>L*m~%B>m4EZhGdr*QfyD4$sWsGpNTv_+&$1s9v+l=*sPy!_E3)sk +XbgbXDRJI?&mv;@y*?2)W;xmPPk$QDwjy?@n7;z)cDEY*6=iF;$l}02Qvvs)FGY`3CP@5=aCUOD`#&U +{xQ6PTH_;)QR^ +JC4G7`v1M-nC<1eXV8^K`IopEt89>SxAvCWA!6MlN09ur(DUp%8M~#%ga9jxs3dF+x1BIny9!t9Q;=toFWG_H4|nNeG0qI(camt0CQ-eKmEi)XL_;EF*PXyPUert~0T=xj7`yR +gXNcP1Np`y$elL(4SQEQ?K^dJdlEzed`PHT#4|_v+SZ8egk>x*HmnDj1l~ZgfVgJ7d1uvAzot?1j?`9 +O<@oZ=({%Iota5fdJ0BO@puT9@%mxU4hAKgohMjqG4~m!;-bD^n%ZCX#E(HM5~ +~S_9G*)W$=z54RmS-=U!#y}}9$yod~9QA9=~;ztn@IEsAhk!7>@H&9Ch1QY-O00;mj6qrt_^9=w%1ON +bw3IG5b0001RX>c!Jc4cm4Z*nhiWpFhyH!os!X>4RJaCxm(!H(ND5WVXwSOAkqy+==hL{ +azf5xp#H3SS$)PjK+E)?S7QjQGV~ueh-iQYFvJ5jrR1>_i9`0tQo|p#=3bR-5D#A$$0W+=(B@69KAZf +k+s_77f-{uQ#}d2umPJwgFlADw$3bcdv!bIN$JQxZEngG@AKw8m$6F8gU3jjRanGKjQTUt`Apzg7A*{UyT>Bj@jsic<#y-yCdUZjr?k~PNTH*ps0#lmpHHD9 +(AHSAqLeZ)Q(2<8|hY&D-+(M@`tHrLOPUSqJ6@AYfoViyh&Kk(M38&7ugOq$!?Lz%=3Su_3U=d>4Y|! +hHgsuvHZSUiOeWBj5*piY#UdP(jV#%MrpRnuFI#*HJAsgqTlM$Ep*bfw3Utlsx#6uwx`;eIzok1UIRNhMENJuT{V@sn~Mhk^;IuQH90di#QNyy%k>`pKPp%9~ld_7 +T?{L$(VHlKGDRO}}{O#Ja?V=a^j^~cJDfe7$kv-*f{)=`G)&F0TnZ{AK;d|C)U(GW`#scdlcd?MGs8% +>Fj@swruNuB1d<=LtZ@>s^W1JswicpnLs;pF6#tHZ)DYkz~WsLrSG5bUPp&Kpf9y~LSOrt99wuG&T9X +JVt>(NZXvfEvOwl!_f%lyplXm{U|YrpKKeW6i*;mCH?ZcO;MTGfctzX*xF&ufvJGeTcNiDmsk!i2uGs-E +6auw61eq1kJ&ZZ~aSW@YrWtV-mSQTG_zP;VzPO>NHU3t4r@UjhKx-K1{sqywmX#+zbkG)_20)?Zm0mr +Br*!{1-=IC#k3%r;MMt%m{NGFPn7LNzj9)h+z`4D?Jwh?--hf!EFSy2JVR3*U!m(@(-o*_a{c2JrUYA +CNe-y2EG!V>;x;5UdU9IBuSD^Z<$rF1;FL4X2$oleI@2d(6#SP(&ALa_Vf{CFVhC+B22cTRXuoLR~Fe +t~TWAh5&XPJJFbcm^_8I9>+tVJ&ck2=ad?vBq84G=Z_EDI*@!mrBS#p@@7Z{sT};0|XQR000O8B@~!W +AOZwdbp-$b{T2WK8vpW;~NPilXy1&+iB&rB-ivZV8 +o)ENFhm@x3F|TD~c*kSk&pSyZB6q%zpOy0{|Wo_SZ2^(eX}Pm%Qv{)FXkTcp^bB^P4CQb-!%o=GtSc*uT9c_3U +}(;b2^!96QE+xu4?0zi+|Goir5eH2I*<_T1r3`!hC^ZPTj6FW_2M*Fh0?%4Sj{C}6g

N-wJ-QsNERtvU9qf56U#+zPGahRd+*UemJVx-sI4m*9$@z!T0KJ(=K+^T2$%;`S9ZxlXc7(hbkD>0~ltd`WV +2f9Ceg3=_sC&Yv^lhju2@{Le~gZl-4w0?)kwpY7vHrbs=Yuh-yX^{(yU1G6c3G858RK$#5e&|44SQz4 +fsiC@+doDq0ik^4Agyo8wGG8f#$tt@}Yc{$|Rvjg=Uhm-h{3RDgO?y)^;AAB^om6qg^77*^^rh|b7+) +*DDa7JTswp6;u{=4^MB>bqX#}kCl$cc$(PWgfL7w#pLJZf~MA&MnAh6pwQl^J4~U+ap0l>Pgz??WDQH +rqk0{u|zY)J8|lW#C(%1(H^vHR)RKdI{7Ki^MzsSvDPK?qC2P%rAJ1n~>^8kYzKnA4PpQoz>nVpyNaX +l%TjTeLST4x;s(z=pY(r79X)B5<)*fgA~aO=Aa}_AuXq?xAAlsQ0?x6DSV>Kz~G4?OmQP)OV)JDiPs5 +mEtdw2jmB6xj@nhWd0oVuONNzzadq8GP+-Im$87Ygs}oKSqUI04s{wRQu>#q`aOsF)!6bQN<%*|;T7R +523+zrs1sn9$z(au=>6LO`@jW+ZN=Q~cTYX{8ewVYUuFNaQ +gdJ>HvqzdltLO5$AT=IZ#17x$e#Z8^QzJxi +*xAASqp1Od6L=e7-!(eA!xGCx`t5y1$&f3-muN=G)AJq9V>D=u6%y+Ie9r8`|Qf_G>_O(T$N%GKDF71 +N}`?n~)p!4?lXm-^+Q+FUWdV|vc5Ob;fP@?yl*h++m#)BF5>RW$LwSS#vYO7$K>JOvew8J&rX5wp{c<=q~kV3ptYr~;LCQRzS4nCWcSlZa#BqLg58PE!K4wmnd&LQ +@})Y@=^3UA35@W%j$ZwighoVV+CfWHuxP6{vrm~hWY=71*4Fha8|u0>q9PA7i>P)h>@6aWAK2mmD%m` +)9`R?vzD0006I0015U003}la4%nWWo~3|axZXYa5XVEFJo_PZ*pvJXD)DgeOF;`+cpsW?q6|mFhpKlB +~3qU@Rk8y;2|xF6S!98R*Tiz!sW&LOSokTe^lz +<&I!&UqD0#-7wYd{RUfALBY0&B$b8AaD)&BGLduOPYEwA2#MYnWiF +UZxDUoQ_%VF(5TG6{6B3aaMThTM+YXp@4zH~(2j}OT%_e5f(OBu#c?j8@PsZ1y>3sAKopt69GUvvC=K +obfW0;RyU?uvJut)STXB$u&*h+Jpvxu|LN}G956;ao@Xu3W411|Q#+5z0_it +i=^KO^^n%w9Xhh}%A-%<`RR3H*d6^%-}=84j&iQ#_TXv6X+ix75$48wByQ{-IhndQ +>SnMSxw7tLtBryFU}neq}1$#X13}jjvYXi*5&80VeXO4o(okI( +3zb&b)UY;U??Psg^7F^7buyP(<(jyV2kXnNT`Tz^#!hKPUNc5S#hA{8G8To8CaDQ^>0rIvpbw~Wlv9q +~HE}i0A2(`zjNLFz1(mx#Y_R_`X;C-_D5|n0BA{Fiuh%wLg<5q!K!jO~WPO0JQTpGoq>_U4*Z4pjVJF +3|FHqhr&&{z1VNuk>oWk;j=TA)P!d)LwWuB)?7pP0U)aCdAioa$d-8GN9mB{FxZMIs}JtAuN7IZr5Vj +p4|ww6{#9X_wE@k>yrN8KyJv%KiR@2)Kd-%zia!XcW&^8TTB+{Ic>(jN6|AG(;1Lf}68F`=ca3{v%73 +83(u-uL@VEG#d~p_b`sC&$+S^)2lFDit*iB_37FKia(4a`Si(Nr{^W=wmWh`l8$WQJf|rM#3V>dK`#e +*@TMYMx-doD_RpHdcmHyPf_pd`){w^Kd^9bgls`^y#5T{^8WPnK!G+pZ%=i<;-o0we=EnGju_@0Sh!Sa +`P&yp4VSaLU?y+0sCHR)RdporOPFwDW%kI7ykQg8A*&fPST +N`H$WcW$J-KB2fue({5FML;tTtHXt`)m*-Dm~3Pc~no%t>&!wcHuH)gX=YLR30|XQR000O8B@~!WNIu7c@&Et;cLD$a8~^|SaA|NaUv_0~WN&gWaAj~cF*h$ +`Z*6d4bS`jtt&qV=13?Ui@ADL4JnXh?7ilj=s7DbGDyS!sGIcWDsoTslGwaf~ce8_4N+|`+B?%<|m;6 +%7TSdA?@Tjz4RJaCz-mZExe +a5&rI9G4P>~jgxhI2eelN$Op$!Ho`f!VJo){(uE*PRLqMksw9=fINX2l3`NP3lk9Gbekh6t0W6W6XI? +n38V-jS70*+6-Z7S|A5_YfR{+3`!EiVn3^;9R5U +P2~#lr)F3^FP9Q1a4?o>-9z33k6cXtB?m(`r{~p4W#}wJoJcm{QHzWXF=nC_%B>^9N-QA5b02#zXWuJ~BCqq9We2C>jq2 +gOp_uM*2B8)#S3&Vg?E4#^`@5%4BkboSPG(mM5GJ?c$Pvl$k3_K!C +drZp6q}txCuhYdBO@j?lqE_-|t{1%7f$&I}M{`3_pGN@Yl&tAAbA`ggZtkD9;nih4G1zVhpCY;q`L8@ +iZzyj#L}@JBzkra?h3GC=>GCG08B59%PJ4r!Hg?0YrxW8_NggnkXs`K;TFqwmRko#Yl}6qgv&G&g&h5 +DUs>tSTZC@(G8SHc#No!ilicw#G1I0NGPe^F^e+XSi0fZFicsTlYQ|7G+V|OMWylfm6kjqBo_}Qd6gd +JX%6Ll&n-6sF~&0)p;D+5$?U>jq&%ZvW)v-}ZO+xswMdj)B;QsVw-jxet8q!QAMo-NLvKJFj+z+lkCK +`*$jbtiWNvK@Xk>WaQIL0aL(^sG(#W2r#sC6MY50<79^{-DL{|C4FONAr;G3omRB%c+`%uw;{;Um^4qR?~GD%x>q?HLPyetL4T=Q7$d*Vz~$wS8L? +x-}sBrLkVyV{9o|}HrLbn+_1F~NV3kBtGjjZ@j8U-<^0me#S7np&4cO1+^^Z9va|U#xN+ffdNcj#8`> +pet<5nj>8ESoEFsq^{?Ec-xv*epvDtDFu5r;t?bl%o@G02%E=dZ&=0u%Z|6s%q_B`3o4p`!@%RGwiZ<}5C%@;sCk8y{;1ZF-U2L=5}Xg +~4pXq{TUw~{N>y!O`)9BbpaFg#2L4ASS&qWWMbrmZ7#2qeJ7)z!Jm}l9(jxheZDGwVv%Kz +1=CVe0UkN4X?TsaWR3A#R0m94#e1}O=uL|rLJMIlQ>3ur*fS({3he;TfJ!!%dpNJx#(+%|!+I?ge~D_ +FIIm!^rc)JeJCac!--V}Gs`KAlI{I_ASmT_tqg~wocA3Ze{Ud*Lt(Zt&Y7(F;&%I;UZT&a$W+x^;>+w +8V@V>VEXT)sKzX#jRC|2T2AE$*OYyJD6_=0|F0J}2x)ha8=a=s;;Q;o@HW~(m(E;U#54%8Rq|2pxh7J +u*2pZZBh%6IOib?Pq|^61-S&Q`{+O7a$)Z@s*?c^+@dc9_KCm~*hximduJdtu+HI=KfMw!rp@*db!m$ +%=$(CNHq0o2rWv(7ck^VTF3Px{YkdhoKDXqRb)l5AcXH7ZkM~Z2U@u1F)Ankxxe@ +2LF0x(lG#-KsMzF%U?EwKDoib84SuK>FS*x`JwY-e*;#xlk^UQ0OgKf~tt1OcV6;}Z0zC&eY>t@DI!?hYAr6l~1VVjHOk;KfZ!c10nE`8>hJ!Dn9 +m8m)j<~YNH9mT0zQvER&z3N2H*A8`h;2eJc!;bv*gzq*Q;MNzuUKkp4V|ecL`$*4cESwEQ^S$HM_W|= +o1O4ZY0_5sv;**Mm=V9)F2RkAW#sHG?kR`%y6N#gF-X*0Y6K`4{4+s44 +y%0;m=J?Eu0)g(h4h?f>KFec!Jc4cm4Z*nhiWpFhyH!pW`VQ_F|a&so}b +JJJf;Bc-ko^vhE(Ie;nQ$d79eE@)?C2qg0BvcRPBsnEH(ui%}WZHoYMS;iQ-bwTgpqiDp`DXm$S-nDZ +J^Uqoa?!EXj%yMY(1L;o#nuk(HZEaw>#0_}$@y62eMsrMw~SVnI)5_EPA&as|T) +CcPrEV`eK0BG&}z#Kp!sv{$r(MFrHeKHz*%32_8gd);X+tH#F@mNT&1hYtqQx+-98@jwE?h@X2x_v?V +a1m`W_uaEYURWF{ud<#)|4bre~x%$L%(=YB-=R8%i22d%{vQ|06)B{PW8e$}d1Os8no-8O$Un1YxtO4AT*$vD(B|0?GxVSTz6~dX^fwD^shj4YN~adC-mNisgwd1K_!LCLuOy52;ogw@i>+F-XlJtrLRDE(Kv=q_M}&L0c2QVH(<nJJ49e8d|AV&B;wB4D%HG7+@~)6RWE9n@A> +Ka>$Y*N!J2hDF^)~Z?G7*~tWP+MZWvWm4`fRQO}m{-^^Gk?-nh?;q*F#g7U%Vt*iM++b=a*N^!&# +W=b@lZ$ukWp@TaZ)(~tAyk=#oTlJ5bY*$)qqZ0O0<)dNgC4Fl0){5@=gEpW&+0hJc&FD(<_aF7WY9y> +P*1JPBBfH{4v-^x9}GsR=v%^RT+kFS!uv{5!`{@fI!@_O{;2X(i=F&7tn&D`GN +W>3{d2Qhd;E(BRNaOf7~H~~r{l{@-g3Z6^I0U&A(X#s_Z=Uc3oxm4)%99V#-8y4vECuz(VNN=rOdG1f +t_K>9Qm^+>lZ4_pOGm?^zp*E0#PGrayPF;9g0f{bcX{a^+fA!bv^K%l9?oQlc%&QNSm4F*lP#Fro;gH +SPk+OuO_65-0QoH{_2^#FAup8k~m<8=biND=5(Ci~Fs@kL|8I2NQ`f#lHW^p{94FsQ%_jPbhHcIKqPVd0kHJ%v0!bq??me&UF +@)9z-q8y}`DXyok1t~O=II8=r#b|yqaot`e9=w0NU!{=kBJS5Xy+|Dh`dW-SuOjy&gAx*5&;9{WO9K +QH0000803{TdPA{ayR7P_E0EVRj03`qb0B~t=FJE?LZe(wAFK}yTUvg!0Z*_8GWpgiIUukY>bYEXCaC +y|d>v|ih3PthUA2Y?K=Bs-bO$U|ooNlCQFmbfL^o(#l{Kt +_CSPv%lH=5{vAvUUgfwYTegSHf!cpefcEYZWhPCKR7%*JUA_8*TrR-t;@FAu4iTT^z`MyapLFT;Hhs^ +wONrZo6BleEVD(mECF)8DXO}hXSdbns;c4rib0RFX6;)awA+h$wJv9yX1&WcSLM2F7I~JvyDIgAU@Te +rVFis_|FAA@%JyK>WLL%e5+PJ;_;Pav|5-!3wuFC+jSM84P9ILEd6Pl&Y}=Mu)8^EoS(VVBYU(zFo^Oh}T5XpA%nj>+hLv5Eu)Z*owuJ#yHMGU9U>^CwLGKh{HR +okpUE=D&7q`v&ng?Gu>l<0%cGqso8~wf=ALQlbCBGSGMLo~9HNFD~{sm0sNZxr%wYhUvo^X6<&hYStT?+;nA_98xoYM) +A=klT4G<=i#dfn@my=0W-Oy*nMcXX5n{vW`9~{VYn56#NxZkQqf7?_yrT)HlzioD_(lv&8;55vi(uF* +@E!H*ckZa#=3iocYtpO{WrF*%$zT9rAr5h6AK(ltQ0Ra}UL;CluSuO!p5lMWLs@*KB3;nyiDXJx4)Ve +Jlm~y?Y{S?caU;>-+!{&BftlVO3%5^Zts&4Uo=%4il(baX|wABZCKpP?R(Otl8<6mJg2b=Zo$w3A`@) +lnmlpkj0YLmUBM=#dvX3cGmveO-GbDe#je+Kiufj+8>YFTY|76km06)i*Z@c#tUd+`C*r6qvc$16BLr +iZ9ic9Ok*%k5<@)heI7FY7rTTG`9$L+4!%5A&PmJs`HU+OC(dA!9hht1+THP5uZ@$qI24F&d6NoWhG8 +p5m;9^Kj980GwgijR!>N=%y9Dy}1S|HwH9Cx-f>*xvc7IYWUrom+xLo-hOj>`ufc~nAf}Yw%oJOH5}Y +EY`dPhakg4F7sbVL2SDLOW`BPAA_@0TaOlf}c+`NzHEv4NPViTK%~VeJt);QIfW4b8V(>q(hWSk~14> +^49WPq{c;X(*42s#Tgq18dn{{;oryf@q&JA88vXV59dATfhNHt{v%h?r>+4iQ*P45Bxd@{k+olJU{FY +ytq%&Vr>g~_$M)$a4hjL5zCRjgL9E^Y67rp<^c6FFCt$#7ti(Y46o5^8}^3`X~8iwC?~RPe>Uny-z$H1G)D{dUAlzAh>_KyS7+ +9uL}z;h`fIzeQdE?@hdEGa2dpa6~=eQ9b?ZXNvgmt{MPzv4tZFmlp3ZUBCq#)20UepO*{bIN-JRK;NF +0>zk^@0V?gF9miL%n$6Sa%6K8n+85=f%LVD9kUd0^rS5}`ly)CCk0#f|EQA50n8 +3BNF6geB(8-U#AQF&*gY1nw#=B?&Shn6xRt?O&I~JT(3J%_Icyc>0N}~As80OM4&A@TO$`b>kFNxs-E +G{QNC+5raE9IBmE*}tXBUkg=-#+?|xq+cztNba5j0_C^`wg;kw^u+miCZP!w}$_=+macjB9r5Q$n6d* +v5-hnmOETCVzUT2fuDk|bJxeg0bo@|Ji$Z&4d2Tc9POo(Rl*HbXB{Gvf9t-Ywn7ZM?OxXJi)A&J=Jx> +nRe4#=b_P5U2;`Vxpam`WPe04>CvtZ9^$=bo!S$`oMGn+(ly6saYy@xUg#oFr=GAPIBb~i2cP% +s=X996F(heuUzVL^Wq4Yq1@~Ego_|JA>vTN8+=V;lrP@SKKJ*vbp$M+1F{faY5(uSzq^w#U+Hq9&0$T8Cwly` +H~c`jsd7G1Hh$>O{Tm)G$g!>C@&_%jj326-?Tur2LG0C&azLLVy+RHf@EHD^V?Q3cNON#+txN2>r7Pp +6stKk5;<+xeuZtNlyxG6Y_0w#ZbG(1_#zYqC0m!Eh;IPBJ(bByLeBpdMgO?Y(Xf#>&$L)rs-|QBMR#9 +)5pv|tz8D2~w3y%~I;9u9xEe?@jISSVqT1ofugY~vX+W7!Q`3B_8C49VXQPgb~PHLr3ghl~#Ijc6b8h +lq4SzX=&-Ar^f#%^vv9%Vr`7};#Q1}1xBKf`r>{Z{tm<%0Kd*3|QALoH_TO-l!`sCQX|WZi9ZOw!?WR +-2X}xh8xKg4|7jNo>TX?Uim5ZOR;W0$AT>jVhPr&J%ovg(Lwm1UVdwh4daTYhYQMR*3Ig>JnJB&FpH3 +ZMhk6O*gn*c-J6;lk|=Znj7oMNp?6d*0)uC=m|@3t(f5qsLKz>pS1A5LH0>D9OQ%iZ*aK}C;WXu +=6NUTXltO>rDffOh*$v|*!Fos{Z^`xDxtJMboq9eO*-dDhC=-(FTV9Wqe8)A7MZOe~9whSL2pRAvD*d +~1uu~{^@kb?^zDHGNCT)3{FF*8=dBVzI3V_DP}_4{hw)F?I-OH${pn2*>cW_-7A4tAj)4E +m%kzOM(-{#~mhDq0nxWi(k8zU9m--$l6`0#8F70hqt(Dn5xe=0XYiIM@J2fOx~PFv +xq&|qHXoZg=?edRf%|yM7~odYi7E^NAukC4od^6(PW7{9*7Y2|?T{31%1Ces9PgRD+jVu<79_|nK((jzRNpXwa73v-nQ^=Fw$Dq%3|juqfz)^9{NV+3aa*kC5l4pV4w)caS2smPr|#+dqFNSkhMt +Fn_2Asexe@IdI@;u!-KQ5VQIqVVXiMUX=H&|6mwL9NOP0S!J$18gNn*t>S=<3uc8%P4xm=7o0wq2Lu3 +fZAPFn}U41Pu*<;a|m+;AhhIE;oLN#;+{umShte0N;oNn0*~r_dJEq +}-@Ram7jQ)<#OMJd~VUT}bZP20%@(hq3w1wW3K-b2E->9@?p-Px@&kOMPUMTH7EPIYZy#D^(r`Z5RS$ +`UI<$fOQL1k@pCrW?jiDZiP>L)!<4IQx@Ey&d@h%NB@~v8 +Ex2*!P1)9i4Ld#*z-$r^oGr=%O_ztN`nas#mo>RbuzJ~XS`%Opft#&LRo$Ncb@KJo|MB__k|}T1IeYT +?`GGR4@appe!>z*KpB)%>75;vF5b&$;m#0>l +_<>2bmS7(+<}?ozh&0)XG=_s-D>1Gc!rlVaJ0sdQg2eWYDkIz`%4Ap)jz{uw+o|k29B%;Uby~LWc;ax +@zfW0J+HaG`9Rw_v9EILyio6Fi6wa5Gjd$H$obQfC5dIjFFL@|7g$5XXm1tBn8&LmAgoNWh|+-ua5-J +Tf@3PG>Ho=AXXm3fOMfYFHr20L^A=QY6VANnAr5OfF21%r(3t0J64;VoSn;J3%%vXeyYkqoj9c@8v7B +%&@CO9WYQ3Q~;cs*IrSzEm8af@El4^bJ!C4Gau3N%W+RPm8Mv&r$D(a9b1@*b35Ur>&UHJjF6zkd5P@E=0BhF8Q)8@8ZpFSHr$p)*{4 +DVTbGJ)+!m$&vx-~5aw5QTy+Hw?~@pIG^QmkCC+RETW)^jJ);vw)Xsc|HF9-~T;(#ukF*j-d(7Z_)k? +{MK~3*J^{#gD8_#Y`3V(a^A9oz!hLUUo&4-_4Wf@2ddW&DKt5Z08v1Zw7RtJSI&j(fbq;31tN0*dPnq +V^{HPx!}u}>5)0=KMXRAI^DS0)6#pK*LIr=&NcIgH!8zL^y$34r+jHb;mIV;>!|ZUJ9Zn9zuLNBV)uu +4dKbaqY(jKB&p?fmxjbbX`;%FQ^cnl9ZUnCJVZ1xdG30z>q(Ramy{JiKAB0D0U`3MZUi4z}O-t +sDZ5O40nYd-9HJ!evKk|j=PXU*)#f;#+tmt&ZFT8_liHx(o8<58DCq4E0f4nJvgq0qe3?$dD=JoqdD3 +x+p0%-%oIVF)_-5_)+2DF6HrvHSa8md8T*eJ_;X9;TTldj`UdLcjQm1ZdeN^hG2OC)tYB^(9`k9!kMZ +!aL7I+!TLnyxW3|mo7|{zXGfljCRYK{pKW#Ryw^l;fJ4hKm2@@)RJ_DFWir#H$WSB{Orwxt4p*{X%En +%U0WM@;((@Qa?lYnU$wF!ylT&Xb3<;S!U0gO9I_Dj9J7TqiGx86S+nXSaamG)`D&g;-uNt((gnG +HD`)JC>v@LmsWK#oSD&UmR*R4o`=ZjVf$zzLv +jl0aE@YhM(e*-1YaIkwpcV<>;HA`oWmR-mg+YGM?_j**1pR^nnM$>^2ZJCU!~z0_+V?C7jSplqV)qjn +3Z1-h79zCl%#@MTI>j`LY)YT7hKaCzO56yI-FVaM?#M{exR7^7WyfRC$T`W_VV{u3qbvWF!I0r29xIR +A@otMPT;ALen%r-=;ZO)*ca-S4bC1=@aC8(VDW#vSYu0;&jtjMN2;Y6rg +3sF5`dRlzbxy=L0f!aB?NC&uaPv*dGE@FphFhH}5*18~-ij13eW;f@GJF1mM4-!^l3+q+@CpB*|SYi~ +5>=1G-1_hrqhq=&Q1rliY`y1JhZmJEChdfvVH-GZhO3eRdo7fsyPv^Swhb$W|t80wYQ!N?88cnC8bYJ2?mgwy(Sxnav +M?DID__$8fqXO%6*Lz2)zeU*fix1_Df`{B}`77-l9eS5lIrraZ=*$c_T&#C&2$8cAYqE!((_@T%?(QP +}yIc#c`W%9YA4hby9USg>>Jmr@K?klQLmB_=JUp=am5E& +`(AiRCXL8nM^uzHXIzgrVFYM?K^ad*4lCm-hjEilu4{rFqq7~<~D^WXz5}O}~j@5sQN1FL949??*;n(a7Fc*$+NdHy01lmN76!*)`I>eg-ZM?(TvJDs6{eHT +}Xnnp2xUpUNwExa6PGYvSitUanTw>Kx{_&CO6ZL&*Bsb=#`v!_dy9s~Qj8aFU`sEMP9Xgo_op1xL_h`CezUZ|A!(p+izUv0 +$4-VhJhY&WXIZ`I$>(h>93#V#WQj0XJSy+FQcSO2M=+C8Y;y +&kCm>Py~G&b|eI6$AUCsMV=%beozVGAsa;TOU-IWx(sB*Is?)NXHU*~t)#C$+(cCLU3#J)`652WRbiT +r5qsG6bgHn?oPdUUmLhiD+Xo}+71(sz4U6EZj!7W~mmU)4ZOZ{)*f_FrDx_Jn21Hmj+_4y*+_keCtF! +8k2nI|NmGtGTKn?kHs@nmRniZj7No +rK|(g$MJ5Sc5yGPbE_rJF!78g+OIV0+F$b%Q)7Pw>#N6MU18l2jnNadV(7LI-q{?D@4fx7ywXZS4usV +|d5Tr>{~`L`XwYa0XszvZk%$S&WWOX7^4EVxsI3b#Q`LqS2y~6Rt31;_b><$2R6V$k30U=kUh}HTSHo +(y@{Ej&t%2hx8}J>mux&>>!BCmWHFb&#>VX+2mwgd0t$MXW}ZL4&84{<^{o!Sr;%(48zh=qVadlC#Y7>kU0S##H#zk!F+9dJ8QwcWW(|upX1mHQE)eC?fSy`6D +hKAGK^>NKLjI0CHoQe>Sb!ZvVJf_`e~l`XG(N~mhYlb#tB@BrlrnIt*O!jbAexiXeLp3~|L(B5r +f(nSLa8V^y&G1{Gz5KVDyP&+!`vRAjGi75>BM+Sv0LPo|sz0>568Wp%RiR8fy3xiM|zb%bp0C7gjKiw +%+wq;p|;x^xzz!VDJrrBF!pP-S@wTRE?vcg9+lwwU$0Yye0dz^rz(-b*?s@@s{s}2iQ1KrNfa3JSNPf +7g1jj&8O9Ox39LCbUU15dT!oiP^xH4iv$!>kB%bHbDlSebIYIYFKU4;*=$oiN+eVabJ|k^Fg%%z?Do% +qo))ka^ya;5t4y+t%(*ALIS+1V6zEU>4E;AMus>Pwv*^$7@VgREY>mjw7&b8?q3XZUQ_j(aOEBC}%Ki +GiXDecgW25Z9$$45d%KTjdbBSJRw{lR8i^EzXdaHg$}MT&Gum;FysVMKx~gEuUmGhE7;%mkSDC5T-lAWZE5t<@rU?oAgkdtmfI$R=_&HC_ow;h1@4 +Wx@OD*si-;+{PyJ2^m6+77C>hahJesq@IzZC@%*fqO{!^7aHp9(#zJKW8{M-EMrWN>@5znaJw`e2Xp8 +Uld68-Tq_YGJFk`e$Qn2+YMjOesbEq0XS5dGz+^kPFL1`PYA$MZI<+1kxcF} +t!cT5i0z-g25BXNCw(D}~k4r;4 +Uo7nq@NmKw0LqSCiYT5f9XdRdEnbqm>ojkxxejq5{8gj2hvpg9!6V?^~I$+w5h}Av*GQ68EO43}IcAG{s+?0_a4K?(FA}84dC@4jBqU>op`5LYtBt* +?3q$G`wKBRbIXmz#u!hixST5OlZv2k1}!lhiC#RZxxT<(KBUQ>#iKe4Hbb0NHx`3**5#tay?4ADF03u +Hxo#t4+CE|BtVu8zswC1MhO$WFrZvT9btM;#d*8?yC`H!LL+y=0zbwwu9J*@u1(Gzu}-4(FaCl8^A0o +z%3b6AaEk^wVoP5hRudDY`F2q_omY`c=hOmxJVql719V387?g#}Q4N6P*;!{-#)UK-^ae*E1$u+hL@L +lbkZ0o2Ms&?p9gdJfVj+GNqKeU71w$j_)ApMyj7_$A)VUEux9N^H~6`ix&)^O8ZM%uUSGCq +lC$?tnZHSdRDE}4KQXGmG~SlRI1_;ZxKZdNU)_&CI^In3H7TN +E7>EKEM2E@_ch=#2G4xEQ$o=baDk(#hvRT9^R*C?v0N`)u1Q7kU#g4UJY_2pJ3ffwq%~!61Q9wVOm1h +0;fShS_<(yg1L}Fb3HfsLNcC9IQxl7sN7k^mY+&+|Rhb?&jKUh+3bMArU7jsvcHcr$ER}*nz%`)da}Sn0&)0y>hyXU_Xfrug)?F@`nt +7c;Sv|W$HUK;`WOV1qOU_64WP8x~zeNF_zR?=%f%OJV;NGz#G~v{m-j)Hwt|ep(1h%0`${mbsbn@!iR6BDBD8fWb2oR>%#iDdq#6_$bun+x5JkYC*(tv3`3&hmyp1x$1(9h1TdgXt +P7^)w>}cTKQX_qH&)GsaO^15%vz)fzzQ9a?Lb8{n%?cf>GzJrFK1vmDH=RT;~$MJR^rhK;7-8feRPw? +!ZcjN*dLv{vwA}3@qWSS|uQ?wm>DKh?*#gZ+0sIcT*Oe-UNL@);r_BX_$||HA7V^EhX^c`X3FQ|%m!^t4SIwPQ8td-Kr_*e)EKqiulfkLQyvW3dfe_3)>D3||%mqYDoq)} +n<=iJMmc%iFMr`<}l*a8Q$nH%0?=(jOYM$FO027vdaH(Ok&yF`+peIkV;WSvYDH;~=7*Tl0bcDNQO3mjV?g1?ySr&R<(^Z=SDlfl-BNNLCo8y-&e2bd2ku?^kwC31d$+B1Oq +n~%!5|vq*;Vu9iO0Mo(}K8wd!-9ihoGTT#%NS!0O!9Yebcbj({hCLiQnC$-TCujUk$@pRTsZkfYI2T9h&5&NdPxp%TRDc +@r+3Ps;IIs>kX`aYuzE3tpgcM5OFU+yGFH`Fen~jm_F!uKIowK!i;?n!^R3b_7O1N14-9wgnHje_V!^*=cIFuc6A}jT%A2RA9wslxB}2PF +b&AFE+98r0Oj6>Sy02_0S->CCl?bNy5pQ{u>Wz!eU395q9z|5q-K$wWPU!~7A`i<%r0!@g5-kP_8=5m +%Iu^y`p}s8=G`>QUl*%{!$1=llIbESZwd;ssNz)N6pd}oPtNmXkFSW=JW0I+1tE6AAF|>Sbq*UI9NUy +bH!nLN_wIVXJuufjvVq8f@PniM$1uD3eiKEIrJ+#Z3RcH*F%Gs)Bpdg^17y +l13aM2{@tH%8qSIWif=6Z!qJ7A>te3tO``$tt6C$)*y=;an($?TWZ467YokaXIl67$*|gpS;pBcBa%A +YFI)as=J(3H5HG`;fgb%O_q6hO=&bAn1JI5%a%M4j6fvCHiuvFj|ls^GnFf +zU*28Qr(p$%zHtf1CKR;bJ9|Win{_a~vX1;Gl{nu6uX=4ZYUQc4h#x%)Q9#eRp%|B;rX08B-Tfbb+9H +GNj!d{XZJZ5DBX;BHVqQ{5QKjFchF;enQhaY#j&bT4CHBoQL6|aTSNLfQc5T;nHS4lDAK&GE+^fV{L= +JBo98E#kGy{ChU)D#qSedK`AlU$vF6plOX~#bvl;|TUm}b%`qzP+D&L)4&sZZ7MwBHeuIv(m{JfucCn +%+1xALg`HZfs7Hwj{b4s!?z$t0gwWATl5|_h;NBmwQ)?6K&qlB9&>fZk(RDjGK +)BN@Hqh+c8E}L+FcZ{1;jA~ZiDt+FD4EL(C-#4jd~+dEV~A`lI(!@uqt9MFp`RpxgVEFFk@iUvyWfE% +sN^*IYKpj@4_tHG~;jyH%t3zyZ$er|=;#E?p%j~Donsz)Sa8gCGJq*u&2Cl$O0|$`mUQpZ}>sN__tANbj2`TJpXVI2DtpkOsZxxQ@P*5Y`4V6)E(6Rk#rwrFjUcku!mS$~I8X +C7@79L~y#OKw|8JMCzV#5bDX|r5s&Df83m{aeyjJXuxE6tkhpk{BMF(@2|8}ft&pGB2zQ_H_4mggab}R+iKu4YPN2jxUGVzB4qv2gJ157}qoG)!eY`Hm>;LW*KGhf6TL+ +KHcqFtB@nZWnvFUB9or1MBTsaz%@nS(Lv$_VZ*t$AYI6|rQEny9lwV)cUIg?v}n{@uyN{H&l07ueNL) +`+Zjy)gSdPiU0nmhE=kv0IcXst#`DI7(5xlG6KyuEGgd6{Fb|MK5b^L#K02lkr|rb(~st?BG-K&hMzY +%UjA6o~Zw!*}~K1XG8xUuMZDPRuA87>rHi2#CQ%)QO-l5K7H334Cc04qY7HKa%Y+0@~L8pu_xiS%Y%GCPS%Pcm6vyC|2Z2RSd<=sAjwJG?tF}%$ep$h!6*BG^b>^)_*KWCMtEjL; +=9PPnz{4U?J|4Lp4fqN^t*>NJtapd{1{c%J*b&?ajjai>J_&qqX*yb)T*Emrf`eYjo+Fp&2D+ccLz>@ +h_h1-MNmve5GK1>73IUnUf;*eHTEICI9;A@6Vw8U$h1?`d_;On1K1$u0VH&adP;-$82$=ziPIcl=v4< +m(n`K>82B>-Nz#Q+5@gb{N5?w*iA=OV{wH{YBv`&4So7ED&#i+8|HSp{662r=dc46^{8AAcC!zB*!@{&gpIyZ +(qNW{Bv{4~hZl9V$78vqiCNvw;mw~mAFPqJJ;cgGQbYd8*6#JMVn9GTjM>=!u#ep;@tidBnd)-~D+n= +N|YX+~p80YPbXO;&tjj{F4`fJ1{XWdOY@>PyKU5smkPM!8XS(dl2`{pIzm3DzWj_Vn3bUIgGQcm2LtS +DLVZv+pr~%>%1gw3AN4%3Od5qkKu#9gLD3HWc~Uh<8O?O4Nf6KFgJ5jN+d0Re;S2mJ!>8Y#^3i)S0V$TiV{>N&CK!0N#X4t +)y@-6`RKFk5+VMg(wlH){{W^60|1<_%KEB1y*S{WL|3JZB=hua$H`yr3#@^a8x)?Bx#Cw55sq9{0*9g +D+E<$m$ivYl71wM$BV72-KNow6dBfG;GAV#_YJn17@W0LkZLNveu}Tr+!nS=ML`(Xt(UaWryNF;`)|U +1eB*eZ9w9Y_|C&SA&As6l=Om8G@EOpu+JMdU%quPqV=>(1F1?dq5-KlUROou|p@m3FmO1xN|WyJ$Ka5 +FT8kaVZ{^VYuVg$tSkU&y`F6Awpf&tXgPvO#UEPP?92==Oz)?Gx&FN*cSq;XY8GdA-!~W=NxV5W7(tGre`D +sa3Dk5{7|d9y2N7A6iY+X{y802*=N3CuDCgOCg;a_HaotPyXoJeG>*m&v+YsQ6FWTGEWDY2^qtE~8cQ +jTCpqQ5%bi(ZQ2mtKXbf<%QGw`*85#>$o;0BYW)3tgwxW(Ye_24{G=^bIJ!|&i-gXtPp<(jg@ix<9}> +m{WD!m+Zk3}}yRX9SAVdzUvW8)(ZBgD^T|F6dUj(C|WBK+L?_#BlhiandPRZ7ivoP$j!ZH&|?z4n3kS +V`GkXR(NjLjoSS`7=yaW-%ehB_xjymGFtQS@t@zEhKqF5UUnRhXj?v^+)#F6l(qIDO-}+Zwo6qUOk>6C}xldD-6nXRP8Eh6(fAr!-EX6k{;l5#dmF&aL_dHB#qNl0meq}s^uVDs&0D)>`RFXKP +^4sSb%v`mtVvMF7fHWpASy8S?@Mi&d;=1@;xhn=1t(N-MQMO*^K>EJbUo^)mML&0=E*Fh4GUntDe=oq +ULw4skOKZjsx1U2jHvM@3;q~sI_Zj>`NK~to)o9&b_k7`rEpN)nvZvK03rV&AM3cMggyeV8k@7dmCga +cf6g?CKM+sQKORem4Rt^r-nK_z57uhqEhaIP{oLpBeYP?kRR^jreAME7|9X$z~RwklbyyTUmcAZW>~MIcm +x5@Jn*q1>7Y9?{QNtsA62iljw&B+lXsNm+v_Axx&%JF2_M+8aeeP*uW_|Kn%Y_S-|28&e5eioK9o%HJ +v62*qCV}{@H9z-nkAf(V$dxE5r+(?Fu}1bR27DTUROG-R=&a-twdFxtH4IX8qCFYcEw7T8T@>)7-ACF +G|glE%uDTskI&sQ{YVNjFfQG7NU<>&yl9%f-uXuM*Q1^k~p|_^R2IPk1^aP#Wz<%(`->WnNro(sHL +>^afb=#2hWU2gps%jl#JNV7FXba%LShdS=*D?Zo@oc@ZFGMg10!6YD{`*F3AwWa`nh$FfgepqF`s>_R +M(bZt#u;2@Xx&K#M3!6K)Vg}dLMGcJWY>xi-pmb~HI>CyNlz7&_%amHLk!B;yc8dHiIO@M=GP|U3>Xf +}`Xhc31?FJP!`qm0>rAap6tF#9*4-%JFY#^;uGz&tx1X#;N6Un?PA75?!0^XFy-a_Vx6iHGUDXUG#RO +U?h(^+K_p(_vZ~9?2IGEvPm&AcPF2l0%DYv=lbSOtHb7>u`A8dT~&Q3kH$$X{t~lpNV~wBi`A?j!B}- +BodK@+?L1=ua__~&=d>4_nkr?a%y(HMqKnWia}m?>O|HRr+{Sc=8)CG$1g4~+rvB7~=WvZ`jKy)ZrBam*fwe|Lg84$n7)k$%ljp|sBZI@HE>ncT)y&Sa +3L@*K1$YjILL6J@~=fuyev1z;kyXPP|udBwVG$Hw9(~#m?zdtV9S+QcGcjH$D_8?vWZ$}E30*0BK80i`u798`0bOsg +U(S!qPhiILP&dIm<9)p?j9b1D>Uz}#Yd-VH&S~7qyv{RetiNI8@FBe4SlV<1rhf2eYgAv-Z@pcDn`Uj +WR#yFmpxidsWKEGv-g~ID5elCMA?ecNF8?RPsFoGJ^i&iJ%;=uPUS#B?;BD-iBydyOsni}9F;8~Hn8= +fU#h(okXQfVMNr9$T&$kly|v!gFdFY0Vt@!J`!c9>HG`X8Xkx?S$uB|GD@^TVm8a|Ws +UG5owx8GlDEDIj{ZMkoOH9%*(AveSGJmGf}q*S33B7MmXV+#xL3PiaQ;PBuOu)$z73hkSHUPpJ<{tn` +u7EGP`xY-@c{ +yw5aH(%Mi{sx9Mx;WhKIEr={hWNTxm9{96TAW2z57Z2@upoKEJchgNw>>;p{M`gV-eI%#`d|VD@T#pT +G`imXYsp}3_Z~9HBI};FP>=FZx<2od1iVBa~IZ~nX+-6dW>NeLR7h|uvnM5#Haxv{eXXK9}col?Ptjo +6_N{T92r9S?vGL&CUj$Ox&NOS$Zys^QztIps=M(EY-5)LnszN}3IC%oo69Jg_=FhfldOA`WLBO@|9<^ +_jh8R{w-<{4%YN7QmEnZ@wp>QxzI0o7<{5%>-?Kuro2HzFdXI-K3nHin*)n>D5pFDin!r)dLkmB2%%P^JHu4*2Z^+R-|Yc~& +9*O%U0l3#6ZmPas|YIdv-kJ(?=v$S7+`6W4CQ07alKwN!*H2{*oE@$}MoL_B9J{m2_w{X}g$pLG^qPF +kXm?6o^$bDNKe>NN}n&#m}vCcOiHW5_RV+?u3{zaHO$U({ThaU-uiduBnrc+$mb@8h^aMOjs!vFp&$B +MlyKCTZ@Qt6-K6~=;4TdoSqcfsmIkXwuD@@jLuMPIL$0+OxSONX%@eE)rV(cZ0r_EQ?o;Y~wv)-%+fk +kx2e1Sv`KJhx{{?3Pccep9o6*JQ>}uV=P<)h5o6AANsNX|@s>Y+|&}p8Vf1-ajsj`kLi336ta|-5Cvj +!M?w0>SIy4n=W7^i4_agM89y2o@&getdo5g*tSLW8}mX+{{chMepc1u2uVbrym$ETay7D<{PD-X1th) +@u{~~7Z{il_8gzqONQxO6V=^_Zd&d5RhaZOz5jF%h7@uBVqFWc$k9FtK9pC_T8;rO!Gw(~9TA4dM31D +79twhR}YlDr)M7F-598=qkb?rUsfu`?6f5BiF(C!QiJb@T^$feuR_d^0J)O^5I6r|S-O|Nk8=ZB%N^} +JjG$`TtSj)+nITy)-Cmaxhvza1MK2y|U()~q6x6=_I~8W#9wvNnVKHi#G32-@5@*QOB;{@u7fQAd*@2 +P4{>V+zk3=pN*6s>wKWAqVhu +#L&JJ{Wt=sF4aG&ZA-H*JXR{o-*b2#Mw-(n0T)Wp)5ExVe}Yna77GmJi;KFMT76yA)dCkGmB#+ZYJ~@k8e|vSYN^$u+=?a9mRb&JU-xJ_{)nx@dR}dHQ!R_NsyCo}QF +S`EJoh!JIVI6jRhcNPb +}MwYR8~4ImrzRyF3n-EcvzL2ZnGcpade4dD%zwuBuBtBDY8p_)H8t4ZF9eB_|95 +|Dpms`-)Mz^mDTfWr@`~kVqP^Km($P!`83Mn+Bul0<5)v#6=jSy)Lgqdy)4it(DPefki=mpBj4~v5Yf +UR$&E`kh-0L*W)v8jGbG^n=$9z`O$V;U$B8y{IXDl_@tkJ8hx*5u`{)+MvBQzJmdx$vuUyEKR7fCn2C +QL69Au=un+C&~V~V3*IF0baa2g!wm6WatHPgvW2dj2z&36B+v{n0P^no~9iS+jVn +Et4ygL@lY^m&~YwS~*u+aUqZDD!S)?x_`C7q2fCEjhHw3M5U`xpn?Z}m!kt0{$ +m>@hX$-{olMWJ4*L2)dgW6uwJu5GX}H9(R=U9MUQMim0dyLuvp{3? +fLwA_|ISTR74;#!ii6`Hewqy*k@LdwV~a13|M~Zi;FK;fBvE;$xz$zS#{lX +EO^^6{eshig3?1aovbitDG%Z7AJ4+dzI74|Yt~i`@sboP?C_ltGWG!w4&CV1+A~`CWOdQsB#+PLM-Ea +fVnf9Sxl<`+_33y$sAUrdSgiBHH*d>@uJ_p_18Y@cq^B5wb-ZNAh)-BNJASQF)y?OcW#pLZbr>C#qyi +1X}m#>+$4GtSLq~oaAM1X&9>t$76AG-V$o~R9yYs)_aSK?KqPNRn;clKyyilx#l*_%Ad@06wyO1zaML +_{c}v7vOia9)WM3G*1baU@xYXdhkU5N@;GVD<$HK}S8x%{6K$SBZNg{|7;v!>-&3$Z--QitDh~`HlK- +bIQFiJ(SvX6G)7@xV +SrL1%wR66DIFGmsmIr3q$7v&5oo91@lTfCB*Pgmva8tdL%H1Er_wt}Hyz$-1L6^OeF7U5?amP=91+v8t6Nv=rXxto3HfwY|Dvx1^bj~DBztmnYNg=vZLN6~s;TB +&yGNt?2TT(7&jjk>^e~qfQH`lJeHGK6$cZQ9Na}f5K2euB;GE?ob{B_pD4tlao>&E-KWe +>Rr;0oYEF>i-qJ~h*GPEZjk~CQ+^(lQUgI%JYz*|T8!#3Uw1|n>s&gc*#|ka-SxpHOGp4B_aRrQE +~z-N?I)1yKO*R-qwEbMFHl>xF90uAll*;p-XC+6b`f&=;@tg)!m3g3d&4GL(Y{u)8CXBP(qG?aS8%Cg +&aVYuoAta{Vr8Ave`8+}_Nd?``36&4KQVHe^U*m8`#gMzb9=aH9x9l_k%@VBw%K(_W=S$fbLfwa{8a< +B(n%bl!efS*GuUFrB}t)+LCI1bVC)^*B(-gvYn*voR<%g2GfGlx(#pzW^;$0?bf?{w(;YE+zaW$|gm8 +D*rpY%ze7LR^XSs}cG1tRKhgufQQF-tw^})ZDJE=7Ds_{E28|iSXGWD|$4YN!E>KXlJJhebQSennHY&t9kq$#Q4-JtcX6K^oC-mY9Wc}Dj)JN`nPh&T8%URrU5)dZy3HyevOiQTBct$rjdV+L8W87zv8Ga|oH +5ys}wN2ObAAI1FcxZb|A{`8NR*vFjyQ>@EL_C0T3~pbHYXW!-FS@g0ck6=*5aT6?G-M)zD*)Y!;D!vU +QBSbyCkV19KmDv3h#a@cuiP|2w;#BvKu5$@n;(YGS+cLxHAeS3xqlw`ajZqIjEVC7YipSB^bm9m$(98LWc@lCF?sxT +B`H2o?~XIuKJGs9QDiqn+rVzB4`>JT|nD(7=Emtguybnuegzx9SHGVlh)oGoO*2IbO#=q)4>u{UTlg` +j@Ii{m4QQF%g+>6R*%m{UOUT82=<2s;wZcDQvJ=Y~#AYiNPa`CJ +gw(J4dz)enzq~GlY9d*MOck4$D2BA0{WLElJ@R?R_?_g?D6)==uMq}+Sgl0>N_Ed +7;xub0^DpbYt=rs49MN(``3~H>!{e^Rehq&|+a_ygR5`txOVrRU4IH#h2Vx(h*9q4F;-t?$v;=K!~k2 +vJtlk#Y;(p2vnKW4#dSCfmKX5s`6p`F3*VW;FD6cM#QQ$l7=>x);d9zd7%7wHL|4-W|LW+gcnJD*{3d +vk%Q_2@Z9yt-hGi-O`a7EOcyNQP99g!9LbaL=NLpV2c1W$#?5)!98k`XS(e&b#A$>(U4uKZb8Uzj&5x|cKf_PnF^IqN2Y#RQEdSt&+hlUZ*#h8lX3fE88f(N#T^({x?#PRz +>S@xour6Ex%oG(t-f+?zYOgFmCtP{%BH$}2kH$b-3Ty6kf^x7?cEx_JFtJuzRB}YRvn&khU={_J` +N)F=0FJ=z~(#ebtI^*s@@#ux__;)ZH1jbYb=gEp_bg#MVfRu;QZ?yA>|1rE2pXU2?6yC-zC9VBbN+^;RQCj;O>oBnl3d*sVfdeSzjmRs%dtac|8mPug+6jFatipp%xx`f+empzHH#jITvG+c0pw;22kt8^$ikJ0 +G(*+2RMOx+AGI=zI&up{Fr(d?ls7U3jkL2M84ND;VsM%XIvF>oeED4Nlu*e#Iai@hEMT7QwX*VQVVQ& +eWJ$GpJ)2L^is#c-c_-L$9cac`1{J0)FztY|QDA$bK6CU(JE(X;a8`HOE~eD(Tt^8Dr7cVkBpai?nZd +8EK=w!9_C0duBUUVvAS8nTjKEb(6Ds^5g^1!ChaWnRHzS$H2uq5Jswg#O9nn#Q{0RqWR0mkZxH{djn% +q^72VGjSmtH|B1Xu|h~NZ%FvWH;NP9ElR9sLnSj|H-kR>OS=D%i%KrKG^Q?n)1btOXOWUe21mRIxt=w +ZD(H+sPyqi+ObV57Y{_ANHSAvO<7iv~H&LU+W}uJ@P(s(Sy1oQx%lzfd>Sd^B5m^a7GAVd0tDbf$+ziLBu;u)ln2&sJJR&lJRshzENZBLeu+ms>jw1MxV`At0cqM>4H1dtk2RsE`vYfzut~)#p30>mMbWK{FHmdF9KPP0!a+ZIiHSs6m1((F)!rz$ +bz-1NU(&m_O$VR++nQQ0@I*y!0`kodpWAy2|R?B|*%qvH*{VPhlrVcXMd`qQkjvm90zapLg%nUu$C;F +$2rAwzIJtUqCov+-@85_vi7Rfkc7u73)CK~!EEVjj7(j@T^IMo#JpP&MS^;6EV~$hvTf%f%;{3jG^7*5t~B2@ +ui0pGTjIch|R6QHXo)KOc=r~5a7}J1+UeGyJL%z015mjiBoR<*Ci#(z(zh_+MYqHqE(DNLJm4mnsueF +Hv&rCkL+FGbujdK2UVz?9@hpcHe5habX!FA(Ig^b-K<#y+51o?gRlT +qYWiX#6S^lfqO>JKiX;Wm75=IwGH6_rpx*UmE{!3xo3pyT+nQ5Qf`P&w%W>Q~zApUvbi5eqdml4wxV9u*Z%Oz^gwmX23E*ZB+ua7P*{wEiK~@h +{ZmJzTVy9jTE4SDmVp0x1SD_LHDUqnD7*nFMc8Z;5t9G!bhm1wEFETE$2*Cp-r9Jt4^fkzBHGW!>0wq0SgrB@ +3k78FkQMk=k!`l0lN*Yp^;n30d5N?omYfipMknav%bac2{Clfge?;YrwPE@)oL(hb^p0oLUL^Ng|YI7 +MfmR5gx(vB0v!N~_B-`uJ`}pU1sG`fojh=zK~RV?Cd0aQ(1dB^Jk;Yj`?Qu|X?Itk&gwtbM-R9n0~VC +uC_AG5m0y^m8Bb!5g8%N^(P)t!7d%9QAtVbeAz$Li>^D3cE+Bcj@E{$83#0ep3Qr@&25w+ns04%?eX^ +!`Z6aV_h~~0=B35w6PLWM;ghF+wt9AO_tn>PXSO`AH(Qw%z4tn9c +6S4wM4>Rz;n_qW-*wUXg_O=cp(Yp!h3SJekkKLyR(^KoFPVb6vGq9(}t8{*ayh%?NG6MJ)5{l*^d&fM +u^ZCF5kayS%MPi8?bw8aWeVPlG39Mq3w`H^mc}*sOUU$xzRln(Kvvz;*ii?aP19K6~`&_h@F%o)N?`Y +H4P-^KAI}NY!1fh+j9Tw)cKWZJvG8YT;>}LUBQXs>4xs3lbDwX(U6DS_!~@(ANroPU +p5KzHZnbVMiVG@8zaf;Ubb#oMi^rZ^NHoza-vpeN06J<*yiM75cY(oJZFN~|35cHE(Sf_QB)X1Fq$K5 +`&_Q1I0ar0}4p_1$9dhGqS@9FpSwHFCS~3!DbLI+kF&Sc3O~VGw%@DN)vMEJ)PkK>0?vX#x;rHZV*Y$ +c{ZqPnkQ$mePGVBlyM2@Oh>vD5uz~oBPGADdx(Lrux2GMbw`lSQen$V~_>f3iGkJ7$-9mR<5%^^QF5u +hXQ9-$fkdvs?!#Yj4iZcDx>IRecD=BpGLr6_P|3E)#J>$(Q5n5+|GgC_3oQzhzzf|$b1+W5^zM$L!#8 +&D1k_G1Gl*+Qf!3?+{JVT%?t8wKFSVgx=W4-Wo<^xZc1Ir*uRvI1K2n(?q=4iDv|q~-I7jMdo%6~du! +AIgB+pdFG0SJI@lX(Da09z-oo_-xQ=Ch$YF#N;mzaScXdG^1K&p#cR({hZj;A-iSdMT0?Ta^meEs%C_MiC2%Rj$*{pQ89r*B`34|IkubPx4yr-1$&hnuh2z_c#K%#0Waa3nR@`B${zS^-Ir3DJmmZfIcKRTt+_ijJ$=AHO*aMiIqw3 +*87DhHY@2yf=S^&1gz!LZGzQ^jFjaPt`TyKchAh0m}Y=emw#IyFOe93bU-9Xiil(k8x+@Ve%t4-uUc) +3e@lk7I$?t(YNh_;2ES~WM`kW=K~niU~J*UQRP8G4P*I(_>W2-n(f3hCo+*>K~lTIg&2_Zl%CNJr +6_Mli_0s1ERH(v5~sj&PQ#wg6x&QGJ-^c2xzB$iQ7yxr?ha;m_&yr6&4r@2b{B7~m^5eb$#-kg^I;=ZR=mc{ +7anse?A$nC576%jlyBg~H9{m7#Q-WTs!?ezH>$s`rIz;K~v5r#IG_6pd0cK6zsTidyOutjCLwupaL?< +0X0&rLwfEp~j7EJ=40B^DSKV;!8I+2f3T$JgLLvJSVdh?PQ6Xi6@>WXciXG=1t)PRo3rMSZ7Ea$P&cG +1m(6=&oKl_mWtBF=uku +bsz2cv#*}B@l^hgF^@QLGo$`m%3^U+dvg($5+j9%x+l8nq?271m +c>1iqloxjKtHrDEU|3Lu5Dw08q1u|zryA}b)XV}ZMdd~1s(7hp#|5JhKR4|6VmaQW_EuuW(H0o-G9N3H^?2m|Y&iYINL^qbgNWV$!n*+0C}4v^O +B83@B@fECch3IVKL2{YQ$?uVh!C3My%qC7{La4#{tXoXkem3CW2PRxi8CZIae+ +^$ja{y7?rbH-?YX#aoX4;A!KZa#?ZjjG}uhc?AO})aKtOSa+x^CzzMXt27w!4=~v`p8N?zI +rxD5uk9t`T5^0C+gRhxN~n^45R!G*31&A|o-F-3W@-Db16>D4nZ8Ugp(07q>wC*k)LKO-{?v0Vc%=rJ +Carh1mCotEQJ>|?oi<#2Y@%3Uo5A4A6^m#U=K}Au#@gXO2RW-kme{V$p<7jf7}<{j_L;mvouNqsa{Z=Zn7#}~m)K#8niR +X&$p(hnM?#!rDp+ZOI7u+NZ}A5;>{Y!j@3GtFhH4$E`Zu9s~_}@N%f0;y03-NJyx9{NS(w +@=tb9)Yi1awb-H>Vr`@GfgNz?4mH=D(XP(8Phs8kl+O5u4<3L?Va6n$VzU#qHB~YoLFqV4P9CEc8)mFyO +C(Kb*fK6UWGCpv2Fz-=S{8)+x~EYZT^{)iemd!So@u +z@Z+VwN81Xy&>&2*dpmHnN2}UA!9xeg{=N_gvIrFdJRg`WKfVj$#($c<7`s4yvo;4+I5F$x(8wM=;2ebl-T5Ef( +7HFj8>0Q&TvtMroXgnj`a-O@2hu_S2aciP4)nggGlz)6sa!Ohj5{nY$U^cO}R_vr|WX^}g-9=b4rbnv +Rb+*x0tw5y`Mn%%5=zU-1izK>mx<3s~@5)&`4%U$?1$&Li)f0XLOQy8RdgH#j6o2WrhDiUYkYem49L# +-2lixhmi^p-2S%X^Y6%ct4Da4Y>gfK+}Qq?3M7mmfE%FZV$DxIulnXHex2y`VI3+Y2nzLQ5-6h#*fUo +d~*@&RZ;C704x)9Xch89mwrQe`7`;mgGoH>15B8>N{6QmDmo9MqItS0!~me9B(k9Lv_R`h7>>UcnX-D +rL>v#oDHYm2_ScyZGi<^KHSz=jhy}Hm_u6bB#JE0vSF2%`IvJcbmN2pSh1raBZnX%B+57FK~udt4g)o +R%0>0oV1%>&aRn^k1EZL_)3@4v1Xlz9x5E$xsY#+fvA3R)hcqrx!Ndk;F&Z3B!jBGPhY76}X4FN@i(Z{%Nn>zrb2o~f_sqi-WF4I~7HhOv6ag(NYGF+lESW6mPQX!Lz(e{nTLSrvuB!N2|OBhOOsxmd#C!U|E>Xsp;+i;FulGdv=!;fCK(R72IWR +zRgA% +uL5WfU4Q#UG;pJY#BxHA!l2)Gmwb>FqqujvFd=7wtgjN(!Jg0ypj*1JbnZ4w^YSnDJ#N728SK5Iim~c +QuU}5F!>{0$Ghf65ra$8s!c6FL_Db<_ma!s4lIDFJX_RBIg_BI?6EZ|6GWM5?d`x-gg%*NM*z5roD{P +(b)Ob0-4hhe}d#3tWMxO=F_e&QVqdG{dTMyM>c4wz?hgS8C=)wGsSqjwyrpd7{o76e5bSVX>+a@7cQi +~q2NCM{wdevPSh08ayLry(33hct}TW3O_2fUdlYDkdKjhumhWE?1ShBAeZ=NI%#hbpWPQ{xd +opTY*SbQP>w!1gyU6Ctts>)=f=bp*O|)n$k +nmbJ6u>;2sJg^rg?pNJh?gBs!Zg6E5EZ+#D@RH<`eW!G8 +?CAR4A#;F+nM#lusx|@haGlsdVXV=$?yO~bYgzfwezUaZJ^E^T9S{Ej{ofX=E~S;1<-*vG%$5(xfEFG +u3Kb@ZqFAjEl)e9aPW78CHO?=2lK~ +}JU)iQk(rk)GbQItcw#0aVMEAg2L0f_qo`h9Z)}BI*{;`C`fmNCrF1oQleOE~l@OXmSx}0SPu9+RmA0 +aLLc4oeuHx#H`l*p~F~RGV91GbyH=%Mp;waa$=h3CxXQnG{ +)K$sC{6zb#t|DwwIF3pL8oA6rrw%90eznt}8!P3{H*$#UP|-7-Uqv2Z9*#t^qfuLrw5yl0@0aEPvr_L +_SkvR_2#EqAx~$Np3{XSHKK9xj>Kn;$ZF}RH8^ZgXCQN$OV;OXx~W=WN_w-Rn1F~Q8(vS# +Eq$iyr@b{vt=mMW{*N5z3S!603^HKtWDw{P8i +;7Bdh|I%%sDWe@Ce<6jHRwz46Y0X1s$KtLs +Z&O*7cAK_Z5`zdEkM@o`IOzl%f$hih9~4P(K`7}=FHgqq&EXv64GbFIkr+*f}h7DIB7U6cV=s&6UM;T +Zn6+DWiOc-J*PCwNC!2;y<)z3SrbG(o5}*R>0?Uj!D3c&laX7!YxcPGv#k__X+7NnPW&0Qf; +gvi5q#c>7wFkwzPC+UQbz>@eB2hY5o+lTY_mzjBJ`4lN{2J5ezBE4`p34aqJ~lgcc(!GRL?50X#%qm> +V`FBL#=cQ#HPM@tCxU;3X#c!KrPhWMSZr(57+uyBufN(}EUOuPLJ}-VetD;CSwyO^dEovriH|gMU!h= +3fkz#7$!>zbv}G1{n!sH2TFpo(jE>7@2-h#jN|CJwzt0s~RA=Qs>9Y>eA*W!cJFH;b1r}XI*DQ71T$nHYv6l=(S@CY#eWN5p# +dsg;1es;r+tm`I7gLJ^C@*OQ@(80JX*Ox0w3TVA2{0LRaAuE*d!8HqHR|XY{NRDKA$iI&Q9k!CQZ--6 +x%6*YK^5gZINdV}T69qxiEIV{D#VZ=b5iXJOvWHMw58kvBncD*#11TzGw=nx~vQcW62#@ZM$R@%_BZsuF3^7BQz#;oywfQS1 +=E_T+NG@Lnl(31tqun9-g8NsXi2gmDS9t$Fe(24vRqY{s83m~t7ctocC1)2^B<9FeYMyz+7B +reklX#ah9$HZ&D8^iE6!@Pt_(5RHmX#?!!z@yeIdhq?9_!JLLST +QOD^v$cUUc7y)4kAnuF0gVIZnnjY!%{Q7x(Tpf%^}B-;uE6eUz9~`e3X~Lg~&YU4NyO7A0s` +u+w~F+?HB|c`byu#41p;FEVtfV;@&@vK+Kq@_p*wRY|K%ja;4X3FhR*{Qx!tv;8JbGJSdy{OMAT^x~k +v%7|O9&Y7pd-x3Gus`yQJX=%i<{Nh=ro*nN|Ws#TPNjC6qRgp>Yh-(0`m7uE2_Z91YjUN^QI@XTbEUr +P+xm?;6C0dznNSuZdB+Zh&>Q$SWeAdk=)}w60O9V)?8dXyrZkpAEazmulxJZWdd&!z>bh%jw9j2J1Ct +<6EHaej@P6py}wtWRO90cVW&_-X+fu75ByzfN#ewV-boDbF{f!jrCYQrcS`K%IM$V^>Zn8vb7kjyp5G{)~hS|i5 +;5bK%JHlwNy06EWRjS7#ZXdA<7v=Dq8hsOpJ*Q)G2-FW1;Ns(!5<8Q=-bix|9a;inh}ae>)F{R4YM1h +8YPT2drrK=DtCQ-P?0}*b^(AZuP>S1TJ*ON#aYb3Gu^Yr^sbbn#6Ou*$1mj02cYS +N!BRDNgsB`CMbUyqdhMx_T`V7XA-nGv`O8obSw4{CRXvXuZtH(T>m#ksIe;p}QA1*A7SHflFvXot3zN +{CG)iVc5XMul@(3!A$u*<5OS}6Y_eYZ``lCUa&v9>hfex-spAp^zupInb-4GBi>2m1Hg=r(;;XRKyJZxNY-4 +7>e(~<<^QZ5gGUa*kKVSUMI6>m@?EB&P9Fy4$zn|w1C=br?Z2bM`e011*_BD_ISpuitOXsbaXC#7Wab +z#;`CeyH1s>lx`;@AtHe$!iVxRwT*dw|s-W1i66|n1^=7Is+^fy{g6=w3{iiY2}hCOb2|HnLNXPg0jV +*N|gF*hl{S>;Y+&&d%fg`k~$Lzc@0cA#qr2$*Ijb>#d7~|B#FjTPIacl7=uBw^{x|{>s$ +>cK8!#2O2zKV*PW1%f%n|IsyQGs2C+d6cGsbk7bRP-e}|zA2Pq;m}p%M1`w5waDK^mto$i6E$uP6BBq +zVO}XB(*Rduo2->5QB)2-JObF;0-8VPhl~Hz_b*5o_P!BqR*od;!l5;&j2}2+K8!o2(B*hGAD_?W_N% +FcGAN(xoGeYj$IZ;*4`6BLC@q>#N +p)={$4pD2nc9hz)-DQzVjT7@_Bco@>dSo_ +doEoOZ1D7bS-v&xTcf^-S&)#G@?r8uCJ0C>)pTr!XUiGq{43%9B{O!lsMLy5XHx_tDd6~bmsUp;QkvWGfiQg9UsGJFe2FGndI6l7;?r*+=}d*H(v$ubc5_@pui(6^M!=Zo=^rAJR(E@IKj$HjZ)l1sT4&UtY**)e<#Goc;#Yr8Yq4)Bz*q)mv!Ep+bP@69%jJuKh*6Zxm>v!3+r(b=Qz5C0{x7jzZ +p1*$f&DSqpy?gOI119+|ub+QG)TryCG5XD3mX%$k%xB(1N`{yiT+F@o%w00H8Q@Xrd0KMvxJZ*CO7&{ +)JR&dK+GU$j{whd#-J6=mHH{O;bUk4>useLQH^Q5~qTGAP#|0B4Cz%|%XCWZ?r~24%s(AF#Q4T^VUAa +CFfkz3tiSu?$!q~Qn7YymfGfXXzO03aIjS&taeCL@9+g?8zq+Z@^uF8}7l?RFp06 +Mba}f~=(sCUBU?pQG$4rdUP&pwzfRqnIj+b*6A+%GSf7BV0txM@Bab1C3-W_DIYzE}9*hHe7=Y +t$6B#owa~U8wsrAJg*w*Y`{^pd@-ACC3$#KSLpCO*Tt80HIpKrj{E0tF(`ch%<)~aolYH}j`kE^ya4V +GW0&V491>CF~D)Hm^n`SvbCLK>E&_Z4da8v+^y+~Rm982 +jrrrr}**dWWByw-UHrG>e;6c)y6E^Nhkb^%3$JGILe1$(!UyH;~CWy8i)KX-mwRJ;T|Kf=`l+yP|Tpu +h*KplQ%yv}6hrmGodtpTpCU2FsEBKie%>p``1YXFC +C96j9{{v7B8cZo!k5JdkFR#0Kju^eKlC4$tEz(oBa%W%Xz{`!sVgT6CKFS&}sP_z5R)?TUlR`8#}1 +dYAMkleQ=ZXmQ9HO7}U~OV`emhXq7@bCh9TnryqufcPUWP@1`eJ!>FD@#Y$9cCHe7FSt%8AW76rhVi$ +Qx(h#U*2TKQ5`08RKnfxXY86xhfIv+gC|VxzW(F`wvGUY-7|Y^{r$=ly!x|H-?FRkgERZ5^|u-qjDKo%z +~nyz4~IkU6ue!KbDFYKwH*JU>4b`+AJi~h3enP5fu%Iu`eJc<;Ju~Wq#n4b>X+eLv|qoghN-YOQ7{9! +BUK6c<%ZAt)o)%pX +sG60Y{lbV^@8J$-4T|LNH~WLyY0h^SG49rOl-<5Dgbq+*r0e%UbE4JI{<_^7-jMR|p!N?cS)@%X;ECN +61)$%mL6ksF*$oHe#|gIB6Nm(c;yRVNcTyd)2sTGDN{tvwfplb`E#$INR5;>9iSz*T!4UXW&q0X@Fsz +W^~c!w#>lVADjSiD~M?0kiYKs2eCJ=650PTAnJd5JOLy_oDP+_p4?Csb5HtnWIC#G@LFEPoNJn-=OZq>09VvrD +xcceFKN3fW^xQ_{0^A|8C*xSqQ!i^{TXkDG**bJ8Sr@2KnUqoH1PTX~d@;~CV`njDH6n#KIL~#YogcI +gdqOmakrMPnC2$~1w_ESH#eMu>(fksVRZbk3O9MYzNgKh=}G(gBY2Gk6j3Q}lfUe?|1ilD{GW|wu+xK +1;Vl)4=(N=lYk8hvKvl~|eJ7V{5=5G#tm)JdF%!Z!5F(a0ixWP|OtV5k`a1z@ZnBg3G<^7Bz`y|#y|A +#uRw8+<+fonkI8@ +6aWAK2mmD%m`-6N1J+9c001%q001Wd003}la4%nWWo~3|axZXeXJ2w-~!TFDP?d6Wv!2BC~#TiW3S_30(d5lr8_P^bj6s=6-dO;4oMe|(+jQVBt3%XE& +2#w>s1IMrMY{#k!T0j#p`sC7QxegX?R)=+o!A5@8|mG#_A$yVw8PH5U^^&S=hQ-bZJ8s#TGVr&?l04j +g3@6?F>qXWil9~OERH?wq_9LPW=%F9T1GD*r@HkLX!$(jR=PrJvhH$8y}skIP*@6aWAK2mmD%m`*}z6H9Cc008+C001BW003}la4%nWWo~3|axZXlZ)b +94b8|0WUukY>bYEXCaCx;?TW_046n^Jd95oNdDRq-deOWc#QisH79moQ1Rc$3iU~JD813NR0?SH>#hK +n)AY0}m5kl-`te);Bb2IIWgF}hd^(BmPzySRJ@w=`#qoWmD_2hk78;lpG3`f0I>XgZ4X)kp12JA-?|R ++Mv^XCQJ|b7DY@`V3g*37zBrC`%xrTrm2u76il+mGOKoHW4E*&lxi8P*1UDMa~Iqs8|A0<^OywU``02 +#F8-bu!9AQGC>jp3YI_8ge0gh68MKe^pHOiR1`PSWVxU*Q4T1p#opEWs3=IpfMyV-sg$IIk5pK}!~); +F3BH=11-1|Op8LhVwyxoo>ErKLU^>@|$(#if*Mn=@A5TsD&IfZk1(fnkC$KFaReiOC33%46>7j&+La1 +)9+8Ix0*S2%35yp?WvO0@bZqnen3@1j)?WAkUzK*n(6x +py#ied#vLd<#vOfhmPCf9SAppqz#7dD3gskq(Um+jS&A8V)>Ddf`~NQ~TC(#+DRy6@TD*$T;&W0Rv3W +_N7gC7L-YHl~UB=Sfx&tc$o|IMEPKOn1nl1>Ag8D#7NWTEMGww&evkiNEiZL6*&{wyN^`%jO;m@2|Uk +Yfxjz(I8Rfe2)vOX|Ex)QnnZ#Kx+3+Fd{0O!qVjkZVY639F`;Qm<-0}|7YSiZ6KwaJ2KcD+w!&48t(< +2x*2p#{g#cU8Eyi+oLPWhsyd|n>VTj``qr|wcU~oBlKhU%ZHhegqc|PV2iQl)E4}bms?tMDY{E7Ru=V +XaOTAW6lgPqN3Mg`IHhrcmB!^#($5)`PSk`%s*!VS%me1r7M3#gwn@X=l5zQZ}s7GR=((L%z5yoKzLD^sY`H^K5bt9*pb676ls0QVIxC@u=v0I38e +Wx$Zz2QCnEK^PE(sU4J|cbi#neE$HQDaD27sIzMa-}EBKN4OjwPeTiM_c^?H7M6G_Zs*p{d>(TJSkDJ4{p +%g0dh+nFF>0HWf9=p7L2l>!)F7OioeRbp}hFTB&eghhJAs)Fv5O!<^F(_|J)-_nSa3*(^`3+(QB1M{T +R6qn(|2b-8iz}X-JA6Lx=lIMz*2`%d7VIpT@C7lq1}rNOy;5!Egz{eLF~2ZCnkxUW-~kUPIQWxm{6gz +xw{7ZKPM9e3E{cd%3V|<)%W#aZz@ZqzP>MK};p;;A$rL)yS%gxx3?)fHmx^(t(O?Yj?zDI~2QulyA5j +RiuZm@~Vr6&0>7d@&!ZW(CZDklIU4b&*g&FzniY{TGne-hB7rAHR4^t&UzNf(pBppt`+(KDcH=H7Z<1 +ReRZLq+9c$si{9Kl=cO4&RuTG>Erw5NefcIKqLcdYS4^^_%cnhdMU^x365~Cos4h~!rWMWfOQYTWZ=2 +Mfbgs$ADWx^M%lf=&DL3F^_>=4P#K0{O59)!Fn%X#;#qtBG^uBHFP^X$C$@`2kZaz|bx=mhHv;{8J$7 ++Bh)cRDdpZ&HVpZ^OU{smA=0|XQR000O8B@~!Wm&~=erUU>0CJO)n8vpFa +%FRKFJfVGE^v9ZRnKqZL=?W~uXx(3N>VwYTP|n?E8N6MEjf0uovv1^Dstm-GT>i~?Y5EjzyU!Q77!rq +isP~ejvP7izw|HR&5VB}AwWSQQu{J9@B7|2Z{B-3fZkCL7Ku;eem0^H>`DRKx10Yt0_BbRGfGB3`FuRzL@E9w&;`Meze5%4aPD} +qFe`ZjTr(*+R%MAWpAS{gHJB^vTrFF-U_4YlIXN%^sZLhI*r?|nS5FNMMwX3Cs`(V0sW#A6LqXBDHgFYWsJ@;i)dYXXMlaM>_(Gz_7-DhFf!P_UyQPD6P%SFM^{(7@F#llx +;}*H*a-QyUxlSThG2hg!nlwQO{pIVC^=)z%#z)0(+5NtPf*7E_a)BJn&Is6=ScY)ryL6}+SEhv>Ij0Z +Ss7&x0Z_7@5z3Mrp!wC}N6TL*^mP3G>3N)hZ9NbykAZ!JPE%iz>woociDs0H}Brao5q2 +k`ERSY|~K&>LL04?8sW$xYXP=dcrbXxqZ!(qr?Kktjm +eJ>}SjD$fctMVlNJS6c_NThKtT>4V;5r{=v-KWOMur+K0(%a^2)sP4Yyd|l;tL33s)?Rqa%0t}ZXoqe +~K;^lSgrhBKwR@d7;a{$HLWeZw>e}u8#|e!)&q{@g#59khaFL3PvvDX%m6~q%BhN3I9Ll6IEV3}}@Zj +CLhz2WsJYG!ZA+}-}PT{L&EZrinx5pJRm=hFgbcgE#xNGoOS@V +)wZm+$SL_y&|M!h7<){&k1%^^1m2j~9$YmSwvf@{Iq)blTT6Zg2EJy7DrTA +$6y~6e&=kzrZOiu}VMg{L1OWZMljd7#zLDmoG+#^el{7D;;l%&Yn{gcmi&=K1-0ALV-|Z&c>Dz`f +C`1x@n>X0*{(?OKvxqJUgCqcfTi{b=+es+7Hpp-Qh$vkYQQn}-xu(J$sqo!$LDi_*YUXN;NUeXXO5&u +f|2}7=$Y;HW7hE!rT6--D#;~|{JcYU7B_?z57>-4O;OMx=e8NHBIaaDm_r&9tak}0Ab6}N0s>$`&gKB +4@{j13}r8h*h;&x}2WxdfjcW*uuo$%&!X}*x=OJUxY<`-#xljiq!6USM3{`x*~$_D*jnjfV3v1!6T08 +mQ<1QY-O00;mj6qrtU;JJbE0ssJ91poja0001RX>c!Jc4cm4Z*nhia&KpHWpi^cV{dhCbY*fbaCx0n& +2HN`5Wedv2F)RMp%_h1MbQ?^$h1vBmRwR!Q7jgQVo^2`TNFqt*&Mh3Ko3QM-R=AJNp>jNak9JUp*r{z +IrIGtZTbjK9-hEb7phu4g~pX9Py9|096_Y(8>3ch2fbw<9zQyL3}dCuN?SOWSjaDxg=bgY>o2Qqt~P_ +E-o6NqkUW!StE^SJ0;i#|GDMU5CWI|om56y&K%uNN>Y{NH+#1EKF5Pu*B$V1)`zJ3QeDg3fT|$hY&=s*J7 +~wsCKNjyxRVcSIJ*(BvKWFm?Qn+hOt49Man$ru$V^@?Q^;B-tlGEyX=+ +(9~t;`xvzJe@+E3LhKhf}#b +P{fOaEyA_!P2)rY>?Pdsc4B-L8N9a&T>wuQ=0I2dXOM@BRLL(L!HWy}jR0$r_2*x +WfN}JJQ1C%gcYu*6Z9#3(ui<496iHfB*ZB4&HR|wu5&ayzk&c2Om55bc`N9j#%B=Y-H6X>~{LMEeeZU +RrU6*CvY0#&2_u(U21r^*XsBG_W%ykzpCF3v(J?5we$aX?C;+`w{v{^vxBc4{MEr19PS@bO9KQH0000 +803{TdPA}lyx(WjT0AvLK03QGV0B~t=FJE?LZe(wAFK}{iXL4n8b1!pnX>M+1axQRrjg!re+cp%1_j- +zp3<{46kK1My1Wi$nOxpxx$sy?pf+R3B7G)EaMS+rLGC-dpXp%*iMdJs^rawT_wC|E9=_O^)OuA{b;1 +S7tzI#Z^M{x4x39L+}%k_O|oBZUSTM2?A2u*cm^?K95@v0AZzy9VfOti6UQ^T3Ujr0dy!?zdR>-Xzzs +*B;uY`+VR&^%XmtLs{u5*h<-tp?bnx*EV1Tji)}nL(!O#_IF7QP6AJr2ripW!3o=tZiC0DjPs$&4tcXhP<@FK|y+ME);@R*QY5>qgToY@Lj8$sE4hpQmF-9LRu8 +gsZ~An$C6VDA{om^gi~Mw<~%uLBRYaRMBw}mka*;a$U;sN4kISQh_IOe5=DS6PGZTZK-429r@-liaC9 +VSLfj2H4x`10#S`yivw6g@$&DY9F(PJ^hf`c2rz~Rfv2Q+RGNwWd5dm=m^o+(5#MEJK)GF7$ ++P_Bz_EHPD4hb0fy!@lmjFj-p~;yv7iqZNW&T!kr|n|7~EU;Q+KK@C6jA^fkk-UH`h$FJ4-`XYBW%=x6=w;B&1G+4uV2=udhd-~8bce|+|&btrT +bYEXCaCt?{K?;B{3`Ehrr|1F1TX+NaCD;@SjVY6e*B48Ro4~8UO$QaA|NaUv_ +0~WN&gWaCvlZZEP=NZ*pZWaCwzcI|{=v4Bc}IbxI5-2MBcR1xoi|Ql%LDDY7$}+`V$i&xIDMLALdzrz +d$ZDg?NBYc52dn(O4Ew)lRCt^&3@j?nko>Dc#8Kr>3P7=n7B1fw1M!5ayqHt3Yar7GKzto?^#W5~Jfk +_zXwsDv{CWBDin=Hxj0GQ4(SY`s>8K|`cPUQ*GRcs1gxyzE95Lt{OjtvQ) +KRWJTlTMUde|S-f*w*@8!@lJgP)h>@6aWAK2mmD%m`-m;y(8!e0034f000~S003}la4%nWWo~3|axZX +sbZ>2JFK}UUb7gWaaCzNYOOxBU5x(nJV3h+%n_@{jsa<=@%G4gbmsI7F&1EH-MN!}kSA3`dNS=vj{(H +IsJ^&J=39S;1y0uL=?-6=x*VZGWqZ{4?hjuj +|e-%SBVk)8y{%?qh^NrtG^2EuSoXZRfGnNZxeaDZp1 +4~I>#Ro6V%7927mm&vg*Lhs*4>6Gec@D_so?HS_?f+njj81XJMf6lv$Mqpgq^~hKlV@HkD1lfZX8`J( +kZs8YHTV*cG|O2T7i|5=WGp4uB2xTBk=&E|;`@H5h46&YkABjY_#6E*ngPw3$VwsOGGU0nf00bomG}t +YQiKPVR0rnKvrHEsD9F@Rfv9;5ed(5OOOS=azjXs%RTA0^1n_)SE#rO8#6$y;R3`@Yh*J;A6L^pQS)I +8Sx22;g=$^5_fumC-!2><$b(2+Uv5{|vUh5U&(V&9InP8nyV=Z`YCBQHB|Epamkb!mLRl<9PHa(RqKIYkM17~o8=J&Tvf?(AD#5UM +D^jO5%T2wNJ5o1eLl50}pl#2xO5x+~Ho>%H$4;zH@jBeJv)UUtMeSV*LDd=X&UXc>kzM*COSqwPs+EiSXP!ii{>2^hE_0RDB6c0T2cvjWA`J$ +gNk)2gU5P72cnBRy-U=rXL`iDazV1>=tmPSa4o`Br3YB^*k3%k*iN0F6CZbZ-d +35O`~IB~_UM0kXe@wqXpSYkvU4i7%thYlP-aj~HNOpX;Tpeo~PrUomb>M}D^a;q +oiiLIGtvm}p&Xp+VI*0d39CNddCo?v+jdl(~$L?fEHFEj{MmTP~CbVlZ_0*LfrYE0N8Nw5FvU*+@DoG1(gGyT)mp<&&-1^9g)dEgi-r0f!Ukf<=dFAQ?^## +a?etm>lT_VC`WOQCC|@Y6lP>E_%Px!r3lAsk-l=gjK175)5NkX`$4m%WvFB +(CTl$#xSu4YB+|zss{FPsL@OjmtoDlhVUKwh|a{|?bya;%ElL_tn4)I&4f6VxW)$z>98qp_~2%cC~$+ +yLbdj35JO&ItGG^05kB(jeDaq5BuB*rM+St8tm38#;8yUe^FTM~U=S8Xtdxw`A+{e-dtt6iTofTe7oU +2N&qmP3jHBK3AQ(eb+fA{}$ja;z<5ZozsZGQ{yvBypK+Rqbg@Fx6cOquES5ahx$m4>>wrbz(0~bS8Lp3W<+fz`S(=>Z-cno<8J2HJ{VTBr_)tW3;uCQ4z#^Vx`_ +e2MvtLAlKL2m)BelDdJFQ~!D!jKLO5V5ZUrh<+JVAB)u<8kUe+;7NM?q2`0`LZo{@3v)I`u%lV`tLwt +Mb!xb+DIzGZcf(7IEHfwg>T@D!L%q$B=Jd|ynQ2dPwxrc?(yWVR7G`&$5oMIQL3WE;v9=}8YpbK-Kv@ +`)}*SKQt}4)`&eX&klZEfm-%+PT`rf4?egwtC3Pg8DlVgQnK{~@z0Gp*FKj_OuZh=me@9v(^7#kEO8dyXu0R);TNp8!@ZV` +i)sO*}MBS3~-aAm3ya?b3w?=`F{5&f=prt<2cn)4JF91Ua;QU}kqVjpq~G23XaGsrrYJz(j_Og(|acb +X&m$Tm57&Vle3P`S4-6B%jvM?-RT+a3RN*B2<}de+g_k#k&FTG93r3iPt*LIAq;s)6-+=*V~smDpDH$ +QDr5plqy)@uFc_&%6I?$%i{M%w0qyV8MJPvG$vfc$R8VlJ(!qAEY`>0F8{Rr@)}GN()*4BZboS@Ei~) +w+D0Oa+&q&gM3JK$Eo)9=Xhg)Eu-w=HH=&Q|+$29HuC|>4I*Zc0ilxh-?-#oVSOS)>o7Lju4ocC(_Ta +zsp|lORhwcNm+OW^NriWSQKj4i@XE#NeW1*SPq2~{C|J97Ls}=m->2Rx7n~s+r#C-FGVkc;izdzO?df +s($4LpZ|;pdgU0*R=E23gc7&B#9D)b6a$b;bBaNRt)dCbrIPYzLDNHR&)%rTePNF?*@!VxYpSIu>_;q +_|tS2}SKIG>ijhK0XoVbJsMuIx+Q}7;)D5e13HveAm?P!4Ic`x@Cf7QvHmO@c$kTu5+OFLG2B8Z-?0U +(g3!(JqPS=4>!CJ_X>Yv*f#!*j5<^p*(tia+lU6#&b(y^R&tLphkhWYyDK{a$WH`5|nzkH>?_$p>xc@air +~l971&vJBMrQ>#u<5n<1t0DD~e=>YL5Rz!pVxO+wdi$l?P +i8@L0`GiuG5-Nb{l74vfKZPiP1qix!xRpr*GWH{H{&ro3ug5Lf)P=DE&;=h4)_I5bcGq9b3lz8*jNW) +U+nrjkg_mLfH2NCuQm)y$d*cm@AIwp5FQ@&vA)29SzJYaT7zu?#^f^r(rF49k{L~=g>v1>gF#k{wqIh +L_c0YFb^bX{!F44P`Qp^r-}2KcTlJgX8eb3>A&xvs_4HY8uvamM7IptF?g_P!^Vb{M_qezRT*2-MphX +s8|oP8HTu(%*_yY5sw)O-PlY4R{sT};0|XQR000O8B@~!WtpVJBZvg-R{R0318UO$QaA|NaUv_0~WN& +gWaCvlZZEP=eWpi{caCv=`!ES>v42JJKg?9=_2yNg@n9gYcZe^B9>0`#{1}%I-=;9b!t#VUfYNL}19_pgTs&kNsjzQoGns$>vjyF>~ +?63MfOL3FZe#~ZovjOz>}*TYJ~X6jY51m6#eYvV?tUt_9g>@mOO3MRMvPK^%+QA)Ro4g76bo)vK-JR& +XYxM|xqT~J)|-TD +pmXKTt~p1QY-O00;mj6qrup7In>U0ssJk1^@sX0001RX>c!Jc4cm4Z*nhid30}WY%g_mX>4;YaCwbX& +u^PB6u$FUcn5?@z)jPsThY2+d+9FCWoavfz;2N+j%+8|lI4HjvrWLHs453+{NDGyU!SS@Mo5jSLQ`FH +8r1Gv(jbtmyt=x&$t6X%a6n4IH+4g?jPP@H_}vo42q)vejtil51IHIMJ`UAF#*pXTYy*d9l55LA? +*O(7M{ySR84X90qToA7-ugcrJe1EaOo47Eaoi;#$uS1Gm|yok}4TeNdv^GK?KSrP0XH6_uKGBALVDc(}|K%VTy}nk6ExYuLFY4sQ$ +Z_Ms6#U+Iq63AiS`yIMP$cW;jumZ~D~xLI9+_j3yJKjR+XOv)P>#b_KDJBSrx=ix`UqoxMZK@yw*?eE;ck9?KL5E?-N1Ztar +EO{S(2&=y%_40f1tDu=Be?`{Qk~Da(kA7ZRQ_$bw-EdAtN9+_wGdp+zEPviyjC60Z>Z=1QY-O00;mj6 +qrsq6x-5&1ONbj3;+Ne0001RX>c!Jc4cm4Z*nhid30}WY%h0mX>?_BE^v9BR!wi?HW0n*SFjEil(3HC +Y|;W7G{+Vw&~||~=*2b!TB2;m6lsu@6C?0{?+htflI3L4>fns1;mn&iUnz~QNS2kgs}0XGBC4G>j?_x +zy5N}^{oBL)?O +UAq4|p?NM3w&alN1yU2TGLJO4r=&nXEb3h@yv5pxGZx)4^;94nbyNMfRe2`|Z_5;w+9XGa8w%c)4#CGnL9>g+< +y3amxK|Yh);6Qj^D7|ci_j^M&G%m|Pn3i9;rkKc*sWs(M#z)rseEkAEDkKOQ{X@UDX9YSwHyFkV2;Q06R +_`c%IVALkQG(o`PY-ziMS>%`eyuE>=lF_HjfJ3XOEVZl{4PEM%$i43LjSFMo1P#pWDw}CG2k^UNTY$e0sj^o68os#f<8TICAQ0p8khU? +XzLa*428N&`>CFrF)z3a^};1TuDh91uyZdd#Q7iroir(-Bjx{-lu!^!Bg6C4jM*M`|_yN5HMuc*Tc^ +@Egk0EPkW+dR#;%Q2%L)cY7vyP9I3#m^+(PN9hQZ3&%Id%1C8Ulafef0>kVPeV5lLVJeh{16U*bz?Zi +lsv)c4_1m`WejYO6ZKE6E@c0TteE8m(TY_1SywAfEy;CNapfM!#<`t+xVeFqxv5tvoZmQI$!p2f+DkX +W+M3&&+xwrcyx3g5{_^AO_UqmK{YT|C`i2j^@^eMiQX;x1O=_rG7}kwt&m~ND$#NdFUI1KJ553AA45P +DT;d3f5r0+j=39cxZe7DE<{GAWK{r3?JTkDib_0| +XQR000O8B@~!WiIdf4I0gU!>JI<_AOHXWaA|NaUv_0~WN&gWa%FLKWpi|MFJE72ZfSI1UoLQYtyf=f+ +cpq?=cl;350(doj-6sFj5L9Xq$~Bsw5RxE4t6Vqe#i}p9CE+Bdy5e-SO_nyW{aG +9Q|?xu}nn1oIq(7N6#&Vkf#6;MfNj{q5+QUKXCs?5Do1ImxmDGC^&*(SpOY?<;K-$Q0wr&AtAk9k6iP +wCD%s7+u7_2F2r0hRgr%V{m6z{XkfV$Nu5XtYbA`~IfxvtDzlP#2n(rTRc6RK=je{6@H^8YhCj|`q|| +K5CxoCWr>CbNvO+2Y%J0yS6--+iU2+rjSH={2G90egYg*L%P^p&vK`TMEVW!j(LdY#~e0oDn(X@Zh(vpw*A>efEr +{j)wU4IIxI}X|JT-4qS?F#Bhm|;`DO{=0%A~%7ehJQ0P@jIyx6m4{a9>SjWCJh}4))pl6oHf0$yD(}O +MmyL7Ej;?#MHaC?<%Z;-JgI9vn~L2sG#Lx%G|};xmOeWtu`F<1#})nGrH47JUORtiR~ +CJHw+^4BbDagiK;tR7xyYW&%Mxz*8Lk2J;I3+y;y)I|Jr%~Wn9+woKWE#`%FQaAif%Dmf +w1@-8vCMNWvGWkH>cyt672I%tb0p6?hwPXQhSBBfn`w7)bmZbx +EFk6iuCoJ}PGLN0B6QCsR#+T^{xSOGEqG-iY&W;(y#=S+En{D#3IVg-esDEj?E_}D`2bP6Ln9??+NYIS01Jyxp~&ZustRLEdaQx{7WLn!NtdL3xT+0opW?#N6+kQ*Ny8+#J`|iS>W|by8a1{>QCknY +!~yXj2QTX|L1K+`*g@R~z_w4lCPizctaUzK>v!H>=ve2v>$Mndem!r_lU{@FPn#beQ1>{>FR|O +o&|xEi=WL$xrr7i~++3bFriM1Gu%FNZSvuDmhA&q+OKEBBt>{p1Zmrw%%h&I3ZwQL!vYk%$lVtarq>a +P2g;HYPC@d<8K4_h`k}ZXb{0onbHAqHYJn+SRtGso?+5@+3#}wR{zy1 +-gx&uDWZduOOYuVjgtJIAaPcoW7vp?hsdi|2l4vENa&fvu4x|wCSP5hD&b&1XFxi&}xZ_PdttH +-Iz`jE(Zkr3ibG3V1BNl!_>S}d^6%{XQR;C70xm?<-YsK;;#YY8JFm^8m*3?Vc5*M<}lisFSHyyVZcJ +4Qt{MscxHr_gULj0P2HD2HlGa-s{mSL<6C`%I07j$HTL2c@ea~hTsuT?Cf*3=bm+@KHTn_tI-+k?q@6aWAK2mmD%m`>oWs#pI2006WB001KZ003}la4%nWWo~3|axZdaadl;LbaO9XUv_13 +b7^mGUtcb8d1X(_YQr!Py!$H_a!@Z;Wc83xD75qv$R(8Y7O+)k6N}igqDN_pKfaO`HKVp+m75QArr)>#thJ=)qx?PRZ#xVg +BdSFqY{H*n|;tb8YwrP1q6n>>wk`e{Dbqcxx6Xm5_u_Jzj&#c|3D$|C*gWxF3q_RTmi7z?EEA;Ki<8k +IuVz&lF!LvA8=LSBnId^shTiKeNsl{G4R{oSh;b%VfDYu)RMk;ld*@ohSRvtkK%m9;pf7*BSdFZdF6A +B?f$@VH=*7?S-0P)h>@6aWAK2mmD%m`;ePIlB}B002k?001Wd003}la4%nWWo~3|axZdaadl;LbaO9X +X>N37a&BR4Uv+e8Y;!Jfd1X?;Zrd;nz3VH8?9gOLeCTN~(8I8GLk|OrtvkDlP1o9N$)l*IzUZt6_(;CTcW`)rfZ8?2K9vx-J$#4}r8b+5BK#B3vo9)R8OiFt3T%3>{=PX%-IIGZ4SI;rh9_u)t=T +y1fjiBh38jYhVZa6!u6}~!1mEWx>eQLKg9b;m4LA$M^hr6lOEACWw4eGs_z!aIzbcd233k{ +h7NAuz+}NIt$Ar|Uf&gX!7W$}{ajew0!Tw!p5kn$0uD2T@_0KYKu%Wx2W1zBcA+S1OPrb-oJPf`*I)c +l?Dl?}6}1Q`4jO;DmP?F~&HM$e`ulNa)eBj=~5cu_bwC9%JQ-kh@uenP%w)w20H-d^vSUm}o54QdZMc +z(Z%GoR3<2`1s?~-5ms*nqt?BvQmOh#$&NelfI@Eos9LYZH=o0uOyqNkH-auo4LOf#NOliIZ;K)&!Nk +#BF%%_Wvtzbd`tCTUK;&%UV>(kBXagMSQBxT^pU*VhS}V+ho4avYA_aKzcYR{)XLV$zOoiYW)163ldd +Jl7rAITN??d7u&|exMC>FF>)!=@3!dSK3t*iv`e_}*{luMY#Wg%i>SOk%q-cH#N9X!CW{JC)7JD^p=^ +!n3R+DKu3%R^6!Y?bm0%i#xDCFMorN)urXKwd4W!(}vDlb#MXt7NF15ir?1QY-O00;mk6qrt&IW9zu6 +aWA$Q~&@V0001RX>c!Jc4cm4Z*nhkWpQ<7b98erVPs)&bY*gLE^vA6JZp2?IFjG>D{%G)Npmtc$$Z!? +)hJbti6s(fH2U3*CXd<4cPDI-Co;R +AvbtKH{0XlN21iFngF^hX7G+gNJmH&46y@N*+MmJTZY4{$&XYP704J-s%t}_R1gi?3m7Bb%n3)cjdBt +utR92S)F6Ar{OPPrQ&l0wV*$4q4WnxjuJS!u@WgyoCD=(uBuU6(~nJ*qhH5e?5e9bm;6UC1rOY$PBi! +_z<@1sqgr)!?^dr>ew=Pg`%qb^O@rpQ0-Vw@hslzupcfW2g;FhG8~yL)@1ul3KWE18-Z8(x%R|03@2J +GmBl4a6(W*IQmMKC>2}Srt12;s$^8PY|CLVnZZ06VB4S6baJjyeRVGNmCWWG^$UYj^w0CxZl|RdJ2d) +{1a{X$rG={_RNaglV`t00cuchem)UMl`p=4>^FiZUrO`a+sg)T^W$lYEBSx&#LIla@xottTI<l0Rr6a ++CQvozM*fxXp>ssaDjQ<(WCEpaSzh*-FFXL{5GE24HaC17xA_~I(j3^5@ZX2p)i4{Aq$tFngp4 +Z^#)gsj>dz5k>c^@y*ax028L;5g1(+g0E+^?Fp-tIL;9L340WUT<&IfMJ-xVv=D_Egz5z(re6+Xfc-5jSAx_Euq`6du?kZJh +){y-0@TGACUaw8K}=yDUmH}X3`sR5icUYaq5jai@bV*@3lsy`Gr(+tRGXf%QBFF`(=q$&N&*nc31`bR=fEg*E^Jz +e<@Do7hjeCnpE-bhV(yID5BggP6shV>Dx5u3yNzhJKV#O +9H(NfW^$iabZHF>u}L-J5=s568R?edo7OD-k2HlcT}oKj$kbq)NP3m8JdtOquSt7oTdUS|n})bJDHMERu)M|CbU9$Fi~{%b(TnS3LJt5C(7k*h^5Yj>4bU +^i26kRXwXcKAlY7Z`N5O$5L=L-s(Hurc`qD>q_++W`uSbr~JFj<#nQQyP2bm>%D#&1;!fC%`ToZEPCp +g7Fp#@3)G|DCzei69rFC6l-DKV#ybR=GaUJ!jqERERc+Hq=kxj8P_U>KW=f2lFcc6S9?H}LK1h(Y_m| +rC;?M@+{!d1cy(Fx6j%ftUw~=>F%WL$*rHp768k}a0ZmgdK|qjQISAqV5WG|m6Ul3)SWh-PhsWCnPDG|Bt7( +s2?X(72~pZ~YTWkAmoE*XhW^f-5<(+e3eoBU5lS2Fz5c{oW1>`d*1#LPk_kCz!&Pl}9;C`Ffr}KwW12^!6K~+N+INgI04vH&&iwWfU$}0b+qRg4 +EDobSM~B^H<|tVSkD3WEkZp9oQ?-xkqshRWDu1VLilkPgi`zw;vZjC+`vLHcgoJOV#XfCZkrbn0~Yr+ +M&fi@kswCWGMtb?PBY7DM=)H~#!bLr;1(%}D(#T&V$IT1mXNtV*is*0q(k=EwK_9bc1OS$nqJOA8Z$d +kOIzwn|5FhMl1f#mX=zxazn&e7fovus!Rs`Q281+I)oL1*bjowKx^XWbL1GBT??6v!A5)vR?^HfPRN% +dI2$lkN2djf}Bz2*+ftKy4!&G4b;JlJ*a~q2~Q=4N42e~RGwP08W?um)-rW(QSj(ktQJ~#oMfgGjz7U +X{%fdee6ax1IVXh;>}VapAo7-W2nMMYpCQEAq#^N(~v|B0Bvy>4x}qisqVI+qP*GmBz(rbc;YzI2B)C +ZNY{cV-ytaELn(JMiu}U(vnW`{HvoNgvkugw_|ooH72%@xfg2R-bvl{xyj2gm>DwXwo<(JyBG#Dw#R~ +7oByP0{w&r`4;;xbO&rzt9BVZ!6G~5jh1Ep--?`+K@J2;>g<5QGWkMMjSkI>DrvyxJBArRC|DW|nDFl +AvNOySy?;-YZrpXCpsjEXhh36_)1V#4S_{~55)MtRfrlB%FX)0j6LW7Kv(pryl5IHAC23#<&S9xO*p9 +pzfQniMMG@r|W1eY8&74&=6WUO4t{Js=e&}es=Nx>zcNOF={?=_bk@zG*{zvBaxQm58-@K;k`{?M*D( +g}Lxj|BDSz#1Tf&|=mS*j#q!j3vn{m+q9$EPGyQ^;YDB2elzuNuT!+d{RA=q4x+dV=BE`3;tZ{`1|%& +H3wLkO*eevP@*LZ_f%kk8ubE?0Tp-uoC=g+L~i@a3kd>SHYKht$Jhds&i +Ud2aYcPbQOA%*4AJFM9kVWD#SNtRb_JWkbFD(~(skH&Z_X5z(NVP%Z%^1z-5lzQvWv(Y{vepiI4}x2k +xipkV3{U42{d($TFdIeuDBV9u>ecd%d?mGV +=RSB@^94hm*YM2Jd0fw0-9>ThN+esr-mfA_m%+SVSBIBER+F}y%``e*R!xIlBFn$#cbCG~aY!b4AP2> +M$hGvs0KwsChRF_hIP>;;1J#9ZJs~tF0r%@(f+V&Z;qIlqse*w +Z*w8SIuusEiSAU>)faD`iW=ad&R4l*+cXhbk#LPPF5rRbE!T;e_7&aTT3fb4AH{w%I+rj)qkS!4Dv5v+zH6!@9&wL%TYt#zG8Qaz%80EC& +TYQ9(6IgvTozXsg{5UL2qI=ZsbQHwBeJ;?Ce%tQgz|S{#y_O}adWlNHvz_W^0*%rKjt$hax+p|er90h +#LjX&A^kNFx$XSE~CK@fRTQ6p49#Q>my+*HM)1T=NGb;t-hwd9CfS04^v_Vrx-iPYfzn(}N0kioCvGf%&I)HEj|IT% +D$5GgllB>MS@APc(KByT<5iE3rX$YlWArJYq-Zc@XO}Y`URhm_maJS{B$>1=z-mIPCw;y~%IT_G`V)Y +0I}LvruA%#(YI8peduHQ)@8GuBXA)_>iCn-HMSJ-@RDfP}a$@I?niUq;5OTsEieeBu2*)H*t=#q_hVO +^WSF7)avZ~8aWr!Nla|8RqgL~g?@Jzcac@*Tcc^Jg}%)Utmr}u9T7GAwUH;01Vx@60dtV;qlih(JL^v +aCf$3A#N$B6K-&lyZ4FNn8~(R!P2kxD5ETrV(R7-$MFk6{yR@;S5j!R0{`ew#rYtvhBU(tXu@#E^-05 +4K*W}kzu~hBn*mhXRL=Qt{*G~`{9k$Ti#?~)X;QuqG2CMGCL&Lv7oNJDL5peh5*Jema9`jtlXdHH&)Y +xf-%|Cc^4)XhQ4&UHWpk~pgUEm)OMx!!lKpmklzDxO8#bVgaL#Ym0Oh&Wj_i}-tAoErS*&IEe*kRj9l +fL8-h%73M$H+6P{#)%43$D9Sd4>@HXH^Y~K;mO?lglQixxTtOKf7yuEqTm;VOew<56~QGUMXYQ>`>>6 +`!XP8cuo#_8)Y! +hLy!F+npA%nbkYa~>@&d&LAl$I73t`A$oXQEaA;@8}6OfdHb;T)2!`-;owHi}EkOM(iy;8N@~&p5y*w +#3M7A2x&|VEDmNuSxBy9{atcF8l;8)-v|y}sJ2L8Zz7bis?F~PwQ_C2ONc{{4NdRYtHX?Wvb#3M>Il&1PE9X>tJKwP<3#1$Vl^KRQvg&@aUGg>x^mj!r)<{KBezCDEx$5D? +m6_yrjcOW#RQhE?5?A_r#iyc2^`Y&FDdAY?^OlcWi8Yo6(Y4=#2&AE})>zbXSNrb)`2wIz&7}pI&hde +aZ*9iTMJ}sXcY2a6EuLelYA*^6NZ>(-Q3P^EiFmRg*>@(4NKZG>{MDWB1@GUEEMT4?u_#n3ec6O2K%@ +@%a6V=?8T>-JIxlO=}p;eE9d`@7eIs;qsfnZ4Z5hWA*spgkwmS7Q&qW+D3-fNpo1S`@~tn{SkQZb_c? +nu@})FCsbIU*UP0K4-8p2746N6WiKT3!**MsdbX*?0@D&3nyf>GJBVwYx1#hTtX|?H=Q5SmP8DMG9=? +yh|M#ck*h6*gtK8RgsfRML#tQjS*m2R!e&t5%MX^)=kR~FZ8Fcr+JKT5RC*(hZgS(tkTnh8%7|(zpd0 +WX!or)FtJOu;8uzd!CWy}TfH4Lo+Zx1X;jVSzA(NLMIa@rP4SebcJ5+U(LRr8eDcMyf)S(dAV#IOj`Q +jHjBi5z(^)iRIeM-+{YDV{BgP~y{i1rkPa`|=;Xn)mjxK(y=!f2LWc{eC5y9kA;_*6Y{TQ?MlKoD2yB +-4ZqCS@diQ7DTY)7k_&GJmj=neVWb6-PfM=I24a88qxhZ;l2%fFAeK$Eo^A{Pj_g`^nA +8ZGT-DP_igeE|mcuTq<32Fy>Sci(1&NdfG^hm0nJ8XaZ?np|GoHS{+K6F71*cK%6etqA4JUxfqon1&( +Cd+vYm7VQ=&v!bVXV0E>H2z+pv1TBavh(+iPp30kNCSn+svJQU%Nz?VtpU40coTNP;pOR|(}`2HTx&U +B*cf_gANF2+vj@{P{DftRc0tRf{V?dnxlFM%7{lRGqzl}Oz#zie>CxzXJc60h=9=F +Zb&_;TQD8UTptI{8nIxfYnpXVTTHbPY!W5~w_WUh+-s| +!T=Ol7YD1v^HMDXpsOCso|s2H*`f#pd!omd?MEnIvg@B(nlC!pGrI1I~tow=1$tdK_y)Hol1#^t4eB_R%7OsO+NMD +;4v{)ra;{ZMa!p2_w_tv78f;hDR8q1cFOEBQn{@;~8t5#YvBBm#!0h2oZ_A*oaxU+lQCo${Zv<&k(-@qzT{IXY+1Jt73VsR_`= +sQgb`BGJT~~j-njE$klC_N#pAG<7hIxxSX6`oR5c>7vstB@`}EPlcSU2@#t(c84XWHhsRJGC2IpX#+j +fla@9(biLR(iZiad*jwv~BodR0@ahH6AE-%D#$t9&_R;4OuKMV#RIDwaJVcmk4V3Mu#U6OC5Y^w3VjwaC07nh+o!M2lWsUHZZ+nXePX +RnICPgjF@8_cS4B|4i4%OtKM+q3EhJIjiq|(>QX;&tP5+GCLRv?e=5s?((~aQZMPpxG!eotdoN!6dQg +vL-uZKQwI(QQVeRtC*Co`b=7mFo*g(o*D*Ex%aw8y1beb!J86#K`DKVH6@0HAeIP9dxsPr0%9%_jjve +9@z^XlC3oq|)9PVr}gR#Hp^;z%2- +MHbk2erOGXpgh|H>TSC_GBBzUn+9XJ@Av_{<$jg*8Hof(&I4k5@0oq?Gg9?Hlx1Xc^k5f;Uah@n#`;E +C52Q!NkXc0@LF+==CgNFi^o2kfkB&jN$PdCw4Hi|^~twIfWGM^ZkX@_6VUX3w^8?%Hod!Ec5Z-OLO7~ +EGvZIL^r4{L?f1t}Z=S^-DmH|J|7)Qma0lz%mF7}@tjtSgf|~K*7_^Mv0Uwq%p2a?M@xR!YV7}p^``0 +GFKwfS0gt<`j#Ib>Y0vq_}4)#>H$#WlLuD%lHNfD;Hi!ZlGB5b;N6ixWu?kiEA5>c1}pFouibF}#2vF +~5|pZ>wWT}EG?+ei67P)h>@6aWAK2mmG&m`*n6ZD(%_007=6000~S003}la4%nWWo~3|axZdaadl;Lb +aO9Zb#!PhaCzk#`)}Je`gi{oJO_oO)>a;CyCSGDWKDK0+NMRC;d>%HsEalk^@LJ{*#XnDSzNOe#GaKEpS?UccY(N%pm3N~@GsdeQr5`04d77hI90m{vIh{6bS ++D54jPATTR5pHR(3K^C-_=1eLw6OvqbiiUoVFH0dc5z0SF=ASfQ*3S#77C9f+OAE;;3hZC3s4U>C>h) +$)EXkNE_Vh7vi{qz{Spf<%x0+7GvZUHCS28cDRBS+$mIH$e4@lfYi!08Q2WK~0(uvO8>r9L63zZHwOT0w3_<1=E!T$5Zk%B9Rk7B38}RxESH~NdFZ$sQ_z3hzL?v8W6^OJ`{Nb!LwXKyby> +LElMJ0grkqCcDRb(D)SxwK*){Rf?jh`NdjM{)pAV6KyJlI!PwMLmkb2HW)2;QjoE~P5~O6JglMIbL7? +TgAR{v6I_*1H_zcOL>WV6A-?;ae3m|Fm77YF+mu3L3jvJlJ +hG@07<39WYCJ|IS2>>EyXn`0JMHc58yw8%4ehy5UUE3OVeV)0%tU#>fC`Jp9(2H#Pw_At#eTfEdudW9 +REU)ToiLAQ4&>^7?M^NpRlCgre$R$?{fxHVE$h-lbMW&@fSAH#i$*h7nV~9h;0GlY-55{>jHTGI*CaswE2tYBP$7{;)kgYb2JxsXpg +itvK#T9K_y5*7IPBC#l7w^@%A! +9bZyS+QN95EnWtj7-p&qFvwy5_U;dfea3Ifln63s=xoS3$PRl;IP*0l%QH>j}Hz_I@LI}lg1U#r?B6` +z;!z=7k*0yNd@g2_ECWWF<|}kvDCLEJH`gzS`YGx=1Uw(HY@rmG62!%8o}FjD}n(C5Wd1jX)AaNRXUC +UBx+Ke<}g=ry|_axi&g^$$fBf>y}K|iRDg!tcGwBep0%v+LbwqKVjoxA!J35vM{iG`G!e&gbr*2`oWi +6GUQL3W%jt4FrLbF7s)F)i-R}-Dl-b|e?Kq?$wevFWNON}0@=*4WpOX&9TzPk=C@C-pzR*i=F(M=$6u9fwCxo^I9?7QU;h!2cVR_0sOt_sQYWW_@AdyXp)4zd>IwZBu<-5WCpiQ2Apd*tKCkM^9P+18L-rW*$o8WicawK6kjf;hwYGs+lyQbYI{h8x^@DdG- +lhn3{$Bwo1VfnQ#bqo;>Y$!ftT3owSL@~II8_D^hCy7MW+4JnOkrm6W3HLbtj4-HVS13!7&*505zg5d +cHH>_>Q#vCVySkR4?;s3}Ox;>&amftR1!2j@n*!-FRcWYsR3R!& +Nu}fmsgkXka@Bs0O*1T+`e%>yAn822Zvoq(UtWS?+ABW;rJy)%i|8#u#^m7ur?SAdI8yM|Sgw=u7ap1&Ay0M{g`0D1pDs2Y8KD8u*GUBK~&?QL_0zk_Q +ad?mq`zA9$xF^V5SV~oya~P`z-8tS69Gk(t?}a~Z_^lOCCx8nauh+nFGm^D%k{!Bv{>dEyZHu10`Z4E +2Ltf}~cd^{H@i6~(YpbhkIIiJ^25h3-WT#A>vzH+-$%&tuLo+QV=nzK7rs)4s_D}wC=-L|BW6szjME!SM^*NrpvRuVNtO{IPl60#j>D-~cUC57B6s58vKFZa8*m$TnPgKg*+l!3lmU785btQ_s=cqfV2Wwd-Y%L_$ +Ru75c`_;u_kf_JOu4F=?5^jX?dai}ys)}U)cX07UNIFMulNuoK#FLI7nasZL$vh3R4&FK4bsMzej8ig +@?JP1n>V$4#$c7*qQ{{P^QhXkJ7 +9;D9_Ifu-@3q*57XGI>s(931=`_6`x66R&{dmg5Ge>iW31M=sck7q;@uI8-_S=jQAS-r_MB)O0a3%VR +M$7ltdmK}pdx2Qh+9Yfb~ns5w5g+jYD!4zB9)1UQP?%`UPrWI +B>1ljdTDdukJBJFWhl93A(*%~6lKp2Dkoke!)pd$4gVom5y$W;va!5iGv?>-oEjvlk~H&XQgH+)>log +?kK~QdN!P2nbtk2euB34#Oe9`s@W{0UjaXFCXyo8toyOy>B!3Y?9A;0h|D!fcgMI(V>9n!8w?d;8k|P +R^H<_4k|}S;V~yfUN;UL-|pL7z%HR}f>N^5c;AQ4M3lE3n9aXxh!HjQF9!_?^GH|gd{X>FCG$9K3LPV +wwL8x5jqf&{)2&T7hElx|z%Q+h5`HpiY|wZk#Y{8u1;w_5k}fzN2H&Q%ED>6+0eGK{4BOtO8k5O8$D8 +eSs$HXY+zmi=uFsFdBW-iM9Mu1|D4UO}lXlHtK^>>p&{`lE@fQkij8Rv-G$9Jo@2H~NHcfY4-)wcitX +(bJe%9R`>DKdOY3rwEc^+uXZYHeM1QY-O00;mk6qrtevZBu}0RRBe0RR9U0001RX>c! +Jc4cm4Z*nhkWpQ<7b98erV`Xx5b1rasRgkex#4r#&uE{9o9CG2Js +PmAzwn03k6%PN1E}xy}a0$r28Ywp5zVvkeevx61(di>gZWcw^Z9R#d2 +TqNi@vl3rCd}Jazp5q0;!URr{GGPaes#?f&P? +nIR_4*^3gaHIPyj_vWZwB3TLQ?*5i3WrCQ@&V5&D<4bdD46xm$(ZHMcnj7j9ZBBKp|um#jgu42pN|ME +eD(#rPmMQM$Z;ValM?k#N33=*OG7^aFOc&gXOy1%%D$2KsMQ}5cYV}+jx~k@tQFUhwKyEGwzhLD)~;_ +2#_5$MZn=bl?MO-9smFUaA|NaUv_0~WN&gWa%FLKWpi|MFJo +_QaA9;VaCxOvO>f&U487}D5bdGKkQhU983GhLbUXCWbwD@lFbsxb(}_AoQuWcsm;Lrp@@Lw#TQ|diN$ +Qb)BA;{$^EY!SbSczk1;JPIcQL})$;k<`co)!lmlb+vxM#l(AI83Hg@c_ggGAVJRZ4Uqc1BwdO^R3xD +SQpWIjRI}^bd#%KG%M$6)b>qSnDja^iNhH%*7~k?jGe-~dB|$&xKWJEn_79k +2NyQnW{gT&IFG3rSx#t`3sq?Xu6j<{{yh^eH}!&$lbG@S?GHFVhsAV^TlTo+Biu6L;FI>af^T?sk3fw +mwpfA=M4RYKymeH<1(S9nRNOB$r{KXM2oJ_0ZQjSdG*2)a%j1m3`SgAh)S?HM5zyOu)#AGj4N&eNerX +-|1sV^N%Y^x8t+unaOUapbMNY^0rKagA?R(CB7Z$Tf*l#V-06wnN*XcHU+kG&k#y|7yCXl~=&aeR8f)NmW8-Ei&v#2~1_zSTk{!x`#UvP!Hh-#p&+qAQhh^R4$L +m%@2AQbeKkPk{s;k}p!I16*m!mBZ?dwu$aC2SlNz#KO~2>W}^fmy)j~@xS865T1?9hrL_q9n?CL+#8>d2synzsX?C~n +Xmfze5(ZnZ*NJ`q~>&m-(K_9|f>pL^Ec($9?lK*#^7-{IG>{Gq6BxsA8X5rsu;*2LX&IurU;3LDGk7% +t=M;;+^ClKzgXF@2w^Z$j3rS)9J0zdtE&%6cM60%+eyxQ@!E^cYz$*F +kT_(IhC39gbd#eM4Cl9}Uiy`!G_$b-93o&n61%&)tGZsEs&4v)xO#adingqp?NapJ-PM2MliBRz;$o) +c-+HM#ofU2SP)R-e``|O1ebw&vc~{+5b=4h_juc%hZl%a?Yx>%2DK52a7 +tM9x&fXZm1@&)LDHTpqv`Rsr`bZ>qd6RFY5vAC-bya|tEku> +cY#~Ys6n0f3#o=CdpaHNr)3wMO)C4WNh1kMIH87_nl4ZNgt453V4j)d`G(d+QrattgK +^+afSRawud2M0IP(u}PekG2EvV5^9CBC$kz-yA#SO~q4un;LVCwde*-d9wp-rqo-K%cBPC+g27M5Y79 +{9oM*;xVu+{uDQN$GwEd))-PlErSR1Oc%hL^lQQO;{fUvECD3ZtHu+IN8God)zc%Ur)^|c +w?#~ZcYF;jo}))(+??~61b82C8LA$ReIdRBb+IH^|43D2qQ$$n--wE}5`3Z(_j%bQ9qKSW`??L}{lX} +ZdjJEQwzE5wnO(pIrU{Nrf>jK;U||HbU(qU#qO3}qzUojLz}3k|uvRt}uu@oer}~1I$F>dH#Rlf6p?F +}|hb}W6tn@vv@@64q!@*{iP_Rknjuh=*c}j(X^}ijg4J8ZC@L*R7JWQyEam?xaNKibf(a#03v#<}r+u +sL2RKC;hC)kHNE~ZG`seHQwPvP2b0_~~vx^Et(s_rTb3MZ8BTJ?eE-{;zxow3{|-^uYHe2TtyAbId`g +QmcY2j(@LgnUZg*WK#dwwai6N*#IJXr`de(3}Ti$;&dH{XrfV;xVs-Il-5?sDm;AgAldcRuJI9R}#)Z +XH3Co2l1jUe}{BYp>Olz0Zr)G_5yrlDS(>{eWT+iuVDDMZ3nTpmbiPeqyU^=aC~#lT;I2ST@t`4OVCy +VA-Md$QL?NQ8Hwd(elg&2s#7R#;JB9~j~s~cJ@&f+8=;=@_J!f)j8hx$|Nmgbk*Yg7a?j9FqBT_K`6+ +^*=yZqOPtyGq4;~>TcFU(B(tX$M5#D@#ef{RO)EaQg6iUiqSF7f(gSQpKXxiFEbP*2 +2zeiJmBK%Vr50}Iyhi}*l*h%abOElbYR-Z+Q=E^Sc(bAEm8ypjVw^$ssiYd3xnFV>ogB3nT0L +|Xsl=tjToi^2LHxmc#%uNI{#bRWT!2`0K1I_t)$?k^R82=rLYjm+5+yigGO@%90T;iP1(5jXwT{A3zF +uzH+Xvq-n!CkMPS@}u)R=M2W)Ue2cdxCg{hPU%VxGc06-9-L2iM{Q#c4ToUqisM@WJJ7+ZEgc4?;3ZW +`l{&TyXX^p@ubb;t(VhyzItt+tL5gh)}ndeYxFsx5oS)F7)0(hm`ZKEc4wWcM0VA!61hlaPRby(3Prx +~mYtFL7KnnK~z0WDNslymX_(#>iDRN~RbH^Li620ws4X08&Hh_P9oCPWdMZ!@v;&w1jXF-F5dN*nvgA +1KD@l=bpDmGZ4NQC?i_*+TiM4`bpakw6qZh#}#khMJ>U1%onJd-=)nwi$p}N7*J6^-rvwOPBdu+ph%7 +jZw_E|Cc7oL_a7@-W}FrPZiY;=m*F5@GA;yd7I~-Do5w)LP~`_t(?hmL)aaq7g+HI5WD7vUso_GUcNLkQl-uiECWt_rTyq;LBMOHK5{E6+6+u0#(1xm-ir~{IcrF9i%zj0AS@E!OmRCN+*rp=eCDeAtIcE_B!bG6k`@#Pks4=lyZQv{H~Fg6Mv= +|t2Smb5&#gJK|({2i)7J{7#cfWR*@GQuupWul0y9Jw+LmXp|p`_Okl!AW#efgR$O+lWSj0Mfbw?@1yz +1tQA2Nd!khMz2AFAeDA!i#(7(0N^sor1QUa_iVH>wB2(AWBr~>b-;^2s0z}6v4#;VU08!;`{)fQr2b* +WjLVYs5yaOeT72j=F~{B^k}^4Ahz2yk7OAjKmx(Xx+Dn5XP_69!m&camwi<{fJK77Ie +-m#ST$I%UXtWM#JM^K@@4}=t7}@dBUZjke>10D1tW+ZZio_3=Dtsa2}A4mu$U|23u(>GGHUG<1LU`-< +<_UH)sb^n3;NgAj}jM!@fVAY73(y?$X?@9^t0YuP&{&!cECghX{`-T0gjJE>EvgF(t>mpC6`Sibyvx@ +p9qCxqP=d~b=d>hD!@>68U|bzqA%;1;`g8AF{peG2%8=8Tc!tFMp^MfynOj^KzW|p9sU1$ccw)B!nu~ +f!kL4f@rm_9;0?iWs%?W+3^doAqcDjkLJRZ+_Zr)W@}7cDk#Vp&u$&ow@uOsJ%p+{V2g!Usv8S_eMIb +rjXi~G2e26kAZWe%wcGQ4L7%!3s1nN}lA@+e$95L*WX`P9)LhW#LTKFcTk3nS_L->O{jw&ya-nmXj`I +rnw6l%&l2w$*cxGwUv_Snr5b9v(jmm%T@tXNBlnhaKqgoq`ah2Q~#i%#wkCQs^Cj4ZMHkO}-8DU%9dm +goIRz9)GWU?|-byN*pq>}CS(wqYQ+BZ)*|w358A}4D|;& +di=hAr5wfM@GL-?0l-@XMk9kwobuRYD?jC>%<7)CaCVcJlO6h0l(s?;gDwB~#pi9`kHgS4FjPE*zMbhf2$^@NSA~w{2TbY +Vt3sMZ+S_p!JM?h3A<6wBE54xVEbZsN!V|0@Hp8AMiGh-659zQBP55p=WDxfosUJhM`mIjbeA$dv3OUR4IxIMA!EU!t`LRQ~-!v7uF0xSDP@8C1SXmOuTAXlZ +#wSeog#hj}PnJt5ukA^bqdZqP3zVyutWc)oh{XAD%61CiQ-w +T%>3){Y*@{DiFaq^zd|XEWU}BaQ@B%K9lal(p<+a7@D2@^YgieEzYSyf?T>ynHsB>C(d-3y0Hte!fyM +kBUV$mFIT;0jWRc{gYLrif-S~8D{8g79!DIt~!nT&F7bqGs=8xnp{kEfavF&hbJMv-@wUbNxHd@}v*5Ks^KI2BzBW+Yw{!|ar?-~SpQRKNZq#0+qKl{y6ue98(AUMm!#k?+LdN$==)e+uhB<0BK +^4D}BXrPdIL;hRiqxXE`2-0ASxyq6Gs*KL2)9fSVB1?x1CmeA=LaXbtErP*)9={;Z9Ljgcm_n99*ZAa +2OU)#sF5z!*@AwWAQP)gtURc-=P+D_9bH`Nh2)-Abr-D50`i2n +Xl270o85Zq(yuyX9;=m!iac6t~MoNv_r~QG9S4*21-nD%I`t5)zsCyz89+pJ$!%0!z6$~$FckJ@PQw` +Fwf5Ha4meXvAt*9aYwzi2Px2y)4{1P+jv)d8mrTbiKzK&ooDV&@RKWy<+wR_h$p-NSA2l!#+P>HgHD8f>Gdj +}oG#Fr-}6!D0QQe|kGsSbw}9{@SN`748|vw9lTaAVPG;~-*IedXqhxHFXYSpa*&%Ep5O2J7&#Q4q^UVLaU2B@QZuP^P)H8Q;Cg*WvyfjwAJE-om?<3(Q#?qVvb@n+dd{OAOl +0Aal2ku1fpeZh;IK0G1`1$}Ypi8-hap5tW>cuaWJKQ(tKmcUQg7q3siv(LhZS{A)R%2X#08sx`)1*@J +QUg;uNB{X1}F=!~-9hRHNBTNIn>o#tLIdI62$=6-C#~0sBm!HBucg5$w`SpLrtNe*K{x&b^TFr_oRYs +G<75!qV&#l>-u3o35Lfc4U-JFXp-l=QcyJ`>ecxYAW3j2B~E_E`9+SkWD-`Y%(=p`Qlnh9-G=H*z=7+ +w_NmiM%sYp3N2mZ$NICJoz@n|KUw_PJ3;9j3?O%NjjlMyIxee8^?Z-=J{$&` +tqgSCw3L1OF6sn`VL(X#kYkzdf^0H+}pO{>knaaf)Dc3(5 +1OD=Q3(B;+T?bYQE;_~a|ggj?iFlJJOoPVknB0`Rf}9zVo;Y-$Zl`gyAhgHj$taOneplNOX~_$U +)k{_znslXC^m+yENW%$OwD-SPsVfhhm@zW0yS$Hzs1awc7}GgK4D+V%Cazy8r;JF@E!bssUd3ec?NpY +75?HJYasf!noqC{jEDD^(cp{!swYlS1v4(i@BO`x&&>5Aa2SA?(3z0)@ECbagkGNtY9L?u +=ST)$5)I$Z>e`5g<1V7{>dr(o1|^s&nBx4Xs$oxe{5g(EdF26po4N66&v#>78N5;D*E~YHzG*reh)Jy +Zws}wzh!kJ*wllTx$o14KDDgc5_l`xdf5Qrj6DevRK}wry#S54?4R*6eaCQQs2J`bvv-7E7=3(wms;z +XdQ@K`4D8RU1lx3hRf$-z20YtDo^-5o$nZelzN5iLe(mZCvu-D(!BqjT%@-wxJ_Q9XSjO1|YEQTYVkB +4dUL)+8;r-LqSkT3?8ns~(=&8QdT80OPDKINezO>soLs|q;r{)$XEh_zGeIM4S8Rd@w8XwmA=5IcMUd +1!UpcT@PmTN@6aWAK2mmG&m`=I4Y;ijT004aq001HY003}la4%nW +Wo~3|axZdaadl;LbaO9dcw=R7bZKvHb1rasl~%!W+cprr^DB0ogC&p5OD-MH^pH5t#4~Z5vDNk{LBvW +#Oad$bT2>GF_U?iNMM|_Z)yi4&l!^$h8UGn +Srmn8FCIVg>+3nVPwsKL2rNt+ +5~+d=?J7fh0+?LO2(B?&93Z{huLVdXoVCh;W{xMc5L8&>+f{+SI0Yds(DfkmM|@twjmjTv1B7(6XQff +}N>tKx$Vejj&00khq4$LTTj}i;2TxJ%cM@H;(?Up11te3TbEEQ=}4w`VWtk!&dnmmMzbc)JlGH6)gxZ +!K{8_MulPO2pGS@@6eE?m8m9|arklue;AF^E}jLZy-D%$Fd!&60u7@_m}(7^4w8C88y_NqetsEX(qK0 +;{&L}j_qIcsK}R<2t=@>fK|XPOpG;k$og6OnEXV7+~nq*hHa75$4utO_i +f*XTf^0rx1Tw^SW!m4#4|Z6-S+dd3ySO4n%X%DU7))(bWD#QndZz-T_b15-2`xcF(QwS_#M@oS(y&!B4nO)Zp +){U7)4rf>7bQAp<4aUUS!aaSTOvVz=ENEq#Ugd#n(ry)c2U2(eN(XhKD2(^SElN}C +VC$UOpaK4R{LX?EHO9%#ej(G79L*kK+ZmidDV~X`v)4g$8S_Az9#K*-dEconGmJ#~Z44eDJt*g>0#8| +vr5Let~dAy1D6`^W +OfRKtkZ|%o+&576Vpw*eQIBMb0MZ(C|G4eZf=Av*CSaFXXEr#|S$^G63!m`K-YmSh%++N+NVMInG;5^ +IbJosTMDET5y++DO{Ecf|fgu3gAO`A=5dxqPMm4bkk#lQs|&C8r#6srP18+jJCvq!E9 +xe{`vL_9CIIqII>Hqc}*D?$#eAK)KhHGOu6S4h`>n6&?UO0E>GNf-^Q6=!spv5Igyyswnv163~K9pKO +43sz)Ng7Z4!`UGn}F}MPzLe2e63E`{f%Qjt&xCOfLu-Y;;l5vexUT7wGl6dl?!k55O5xo_%4)3Z{{ZCaT4!L1XmOoQo3K^hT$;sKpR#p| +;{CIY~*b`Y&?a{M9&XG+jv=luc3O)U+rAn(nO%g4;>jdx_17}`iW`ZTzrVl_T8p@3$^tGUkhFeR&ky1 +#9)N{ZBmV#4DTp{V<;kTGn$ga_1CrPvK0-aWhIux(Y%f+NvE=iJ-ZXw5|iq;gDISkC>J;nTSAW +*VG!wb`U(0dB&PVWVWp%@Tef{#p=ScJ6{&#a`d5nhm!np!^d;(0-A&x1NwTPcxHbs$@A>Mny{F?aNp7 +~VOc)JHG3e2eidHM-MlNIh#hhtykOs8%q2^M-%fGXLAx|M=EICRPO3W7bOBDQleReRA^CF({LpLi`Cl4!M +!TOlwym>snz4GqC81cu${LTp9*rcznRY$%C1fs39mYphX6h2f&ZwnvhSLtI_)9K(mMIibd{Aifc!)oB +GL*zZA4uT*CLQn-RC&JR@6bbTu`z7<(b9)+CuSnqt!U@`t5Vii)%4nA(r@JU)xqVVIHR`4DAyk(qJQF +JaxD9s)Pt!FW0i`R3=h$wf4@KT%F4(bUpq?Sf!t0g3kOEX;s@3o}n}+@=>T{x-;JidCR#jrQ~ba+K+8SpKOm +jF{7tV%9eoJiigHqD}Ch*wRP!tPLkP-jWjoFlag+dxqEV=)E~ndctNOofn*M{#F}kx2t8o{QCKqoBMG=#3z +)CA=pt&ke1U}0NW-q(rohSY!C-LCcX>QFkS+)U# +cw!4>n)B9R)L8}sG4Xg+y-#@Y~PG;3{k1~b!10)jTfqDgs(A;y8FRim+X1Y4DNWG<89>bVYTe1xaFLh +dsJ4ob)%+kPr!{EXMO%eJGJ;CTRbZ>USe7oA7*%#OR%!?-0VJhzcIUHo*O%`(w!mBsN`=@O9KQH0000 +8045ZeP8&*d;duc70QCX@0384T0B~t=FJE?LZe(wAFLGsZb!BsOb1!IbZ)hk-+V35Eah&q1ieqm!es< +5@x`*9uuMN(br`&$g+lp@y^q&0xGI?krQ+Hhyxl|V3DDFq{U}}JmJ@>zO6n_9vO9KQH00008045ZePS +ZAumN_N>0ON%K03HAU0B~t=FJE?LZe(wAFLGsZb!BsOb1!XgWMyn~E^vA6J^gdrxRt;AufW-p6XnW`6 +Yp+QZIw37N7wCcl8K$$ndUMQEkZWe6seMw9d~E%Z@>2i5CBPkTszZt<~*|-i3A>ihllt5pgnc4f1s9S +nic0$wQW`h&+y64&hGB+PNo04)pb+H>oV1Oz4Jf*-_FkIMOG_#xy?1eD4HZIYSmn5wW+doQr)QX>?gf +!@LAHRO?j;=^}zt8A$GF$rmPy3CXH^gwKm`Dn|fzwPaX3&UGNN5QC?3}Q>x^u%u)qy^K6+lN;>5Lq>8 +zl_u@KhF0ukQ;$^vhY_QmV$m$wCJU;sR*Uw_JV6((J&e9^;*;!TPT +5YmTJipRKT2}G4%3)4N@ha0ftURw|SFolB$`n%4!W;kPL&^Hd$`ELzi05 +;mvS!{bi{)O;#3mrqPaqzgHSZCWKF5@=1CMn_g}kdGfw0n{rv^^7Z?2nIMq&I3PV63udy?!2MX%+YNr +w>AQ`ts6DrdFJO1=_^Dncu--X6lm>NEZI{iq(zeyhq}Inpt&2KqvMc>6TQ)LcoNSv5)9ky`)AxT!>TL +M}9?JVA0M1%S{Pm}#n&azv3Xmr1TsL!mF~5MtYgi+E-`tpo&|IJmArMCv?EC<91Qc_!ywK}pqK=EJB+ +t^1AHJWcmlxaOQm3zlsJH|5e+kD_7Y*%$eS=R6IH)k3JUD6KsI1{}ybf& +Wi+bHV3Q%dKA;m^8$H_ruJr2ln-?FyKb_lUeSiGJ@hL3p=y2!d +ySJyW-=5B2e)sY1pXVpXe|ZhhpB$=v_}|m7c8*V9fAHUZ{p9J+&dxGV>e_I4bCiF`zGOwja&HQu +M43lea=o|1kAayu9Kt@rm^Ody1KajY80D?(bMnfY7+ydn($ikS!v1tjNVIH48w@)_k-Own(MP5I4-Xp +k~+Qj(5KFwAjvm1KZPQz(FdOY$5jp3w#B#H2~0~}BQvKXP$Cl@?D@L@Y}M!y@4hu%?7XOK#RC@9ou6# +rBLj@#w^9tl2Mt~JQ{)FOEquwAG171{Q}R*Y71va# +Iy^5bd(K{1*jcxkQ0SsMS=2?C}eT~)q;C^&}`w9*RgsBtfE3i1{Me!8g$KgaC~Mv+77@|8kJOMS%W9S +MYS`Lq|(S6ff(GG#P0HU+^!i&D%7o(nh-TnQOnxKV}JW(A4nfD&wyX9)J0M!O;ZVk5h`<||6||zoY?- +n+rI`Sfl1$e4hoXGoTw|>!$7ozTi?IztJ-7GxM_GY%)IdR;H=Ca3=cEAsy}z$;{2{~ZdY}GSD4Hd?l+ +G4wk&jis}=?3kPJ4%zvwb%8jVI|I*i7_qAy8=jbRHw*}k0I3QS$y0qn{Jb~PUNZM>D85iet+(z4cnot +;)&J$5Lf*28pjk28;|N*&SvC#rk$TPAx}rZ==XiL%=EW7M_}=m3gIa33x}gFS=+Jn;Dc0}nsy3jz*Jt +ux*7mZ(+o@Ds?f@kAXBznzd>2}1W~aowFob^R`G6=~bOGq-HxBp7=Et??G +?i<>QH2}u7f%Lt~zz&Re$3DyH@I2@E-!;T5+#ebNrv;-VihJTHwr`=Y=VA|f9LqlI<5Y;fpMM!Ujd3; +Iw)|Wgx2@p;fd^)oY8!Ak7!U9T#cDvfUtZ_>?twgsj2=V?i+Ko{XIwVjN9oyz36+|nP5a*V?tan)H|dD3<jnhMgrrVa6bqfx0ct>~Rf0C+7Zu-!< +B8D>qxWPmnjSM07>T*7S7@I`nE*zLMobmqije;O6w)#G3YNzV+<`q12-E0wJaCXUZf3{-QZZJE;EfQH +XTU`V?$|_zbmyX{p5*Y00}SwPkhzrJ=v%nr6G{SA1@Fk_&S`XGe=nq?hnx7L +w4wucD80y>8q^V*3O0jVrj!{pASStwL%>mXM}n$%}#&84uJPJ35o=kivu=d6B_Yd98?8@ovzuf+N=16OvN1H)#q_!NPDOK +L0Ff}a-)#Hdl;CyImBq_)kfNGd3}m0HtKiiskH*E(wT$ +4pFT?OO}`XmR6@s1OrY+a<1(eh0oKeVM))QKR2Fm6S#BUz$1{hHb81P$LNo*Pe;JmO&AdWJ&E&b1w<_Tz^XOj=~tfs;OFOt`?NeABu9}o^EoqfkG1i+pP@oTu>|>KloI|%WGJ6WkD-r&hZd<%+Ta +e$N7)kt7O^Uy@hH&8@w8>^U|wpIt8n!eq0;bL<(*l^gRnuQffg%? +%5ifklfQ%y+MgJlyfIVEf2duM0nGhoPvW9fV_$-VhXlwC!6#2c5hqrK9co78Kd%)FcK4Vhs)Z6bN7Hl +MqF<6~E0~Gm{#Nw3sQ!<7HoRGyns>{-iBJL#)wjvpxPU&@0(xZ#U@$anl)5lK;Z)Lx631Nuk*p5vl*e +@Q<0HTK5FOQLE$xIp{M{fZy69_^AH;oU}v-QI2|L&Tu!@g5gt&FxL+f_$*DTq^Q>z;l-F8@cK%$tgMM +$&lMVM0R)F^HkQNmu?S~9{?SLSVK&}>W4MUB|9%VREG+@}Z;97f67b&<`><5d%ZwaS@ZS@Evb5m8GYr +e6h+tL3#M*<{z8!~jv9a1>i1ofe-K1+jwYns_N!i7_-Zm5+eE^NHK4l`xlzM~G8r1>)B>~1t<~c`aQG +}xpaZr8yqb@LW0(4Xg2kQ)jrVh;xs<$Yx*GaL(Q13rWj52_Gi&Cd+?T&q->8wRA>^iQ=?6xpJNScBA^ +z`uXPPy!GgFR8o0q18%hYq*GwDtM1=hHG^9Od29Fq<*}!<;*W;cG|)QOn +h7rw)-wNQC2Ah&BNU$RvaLEeIP1(Y^&7`SGd((k5nzvj%T$sUw(ZlaVGc~*mLHAK1eYD*n&G)9%{~Xq +wYA^usqWc)ndw2EU9yo83^>PUbK6rE)GMO?6_rH;h5SP_RZb%Wew9@%b(8 +xBpPy$}6b3UUk?%ZWAtAKH3yh4^?rnpa5|m`bs~Bh{IEhRoslSyhIFf${TH$s@t>>_2bPO~`bVelBl% +I032ir`C4U;RK#x^ts+?yCa*x^V*_zqFZNp-5m#4$%RYqJ~QktqiqugmHZqale1Dj6m130xvifCKx($ +CFcaUIr%`M~=xrl<~_7^M|&1s**Gn7vKQe>Fm(|#}ClnI^6#bEe^BrLST34R+dLQAf4CDdkq_QUbI}* +WwJ3%fr2U??{xxLY(IF+YU8rQFqbg$_@z5_;d_<`y0a7J)p9a-u#nO8u%8~4$zVA+mF$U>y%=T#eB2$ +UmZt&VYQ7j`%KO1!pbsR>WprsK-flL!ipIC+24MyxCh|(cKni3`CR^P&>kPAJjiSUEz@}BlGm21PlGw +^buJHV8)M$yBIf@JP{ZWrVY;2k90UJBZvm(uJIK(R%qK^R%aJ7O2eeL#6YIZS^%90h!e4DaH) +5e5N!XsMcXQPoP+2L4hC?i}Q#b3N>-77hK1B~|Z)2BzzTpD(q{Dj-SXtFiZ-M#m=z7zM7E{qULc;mq^ +$&`5whNMHG^MU;EDhK{V4#JBJCbLPFu&qSVF0*SVl_Tahkq3zb?YBXq +&w!q6;7c0$X;;)ZA(lNwi}rV^3)(i__8`cvA&<>KeW35v@u0k&ZE1;wvwngOOtI^^FCq!8*@E1M|h6b +N-fJtv$%33^DCoUhS9oVEG=y!DoTn00iM^6|uk`BcP1+LZKYU&l#xUi%?7@_p0v{N9?N&Q!E35QsQ_K +KzgBmnkrB?vvOYq*%Sz)kU(Y)lInt36Q`l5chD@em?x=ce~?W;Ph{d&hDg%Ivk&lnVg^?C4<-IW#30y +iW7pxA-3;8jJL!`6|Ijryjk5YC@tX;JTBBZ+3YaMYpt#mG3>!!L8jgo%y2BOZYbO-u{mL3reMbbi^uK +7$;;zoN-$5Bq+7FI2b{CKt||J(?szxL8x!^k^s=llF`6dfz&+EzxwCRx#p(^P +e{NnV#|K4+^N2Xcn&L)XYg=;X1DkRb0)msrOW?T>+7YS?DYYcN>Z79yH0e&TTV!UBd+e)k?X{1XYyy3 +sAFfKQivyj;24h1?;Z5t7XXCgBypmY9TDsv_8YG!p}EivG +2>jghV29|;F)-B(T_A5dHAQ-{`92FuV!lW`%wr8o|0PPz(6iH2m#pmuSmRMD{nD>zz8j~S;}=p;<87y +?oi47a@(z3y)9ABuxd=B>h3+iMY^I7VK&w+aCzB7aP3a;hX=rA0n!iE)C0gj4}d7bs2`-M0-%2%0Mv- +KA-Im{Gaoz92edKqMcqnfTt*EVaiar@SH+0E##D1Yb9r-*Cydtgc)GV$_WO4wl^C}!=*I1;w&A{EqYV!~EyMSH@qUV%e#`)=-OZ-JV)tH#|^Pbt#`$_DVdEXTpXrw;uhi +1BC47(^)D{U9$FZ$`)0b(ibU*&FgzP_c}+J0Nv%!6x*JZrO=wMGclPVrmtBa!fExk^q)HQPq~Jfy?dr +1v~%^FgI0dao}ESvSNf=0GeeBsLyL0B;vIWSRoD+6%_VFot?s*gU*OOC1td9fHFi$!o0v6aNgZO)^6up~6Uy?J{zrsr96>Y>lW6XN3RX8tP&Z|X{uoCed94LMPMsmoF7myc4rUyd%E^ +dB`O*TKP%zA+>p7Q)qI!|%(I?-3GE@rWyR?I8N!e1H#?DE^6D1kNQse2ctIy+GoH)5I&PhPp3R5m43a +zc^6fiDDxi4VW8El>T-dFlO9vG%Wj}}MMzO8EuVVo|Y$r9pthenOg^AWS{@$G5$=raJ*fMZq5E!YSJC +wI5O4pGr7b}Dq4o4A+BCqsHXm?CHvR2npT^dJ*BD)QHy+t>p_A}Xc?HEhtU%i~{vjD=_rkq~vctJ%Hd +cd}RSPPmAAs0M*nmu9P#M&x8kW4tL6QZc3ruNqFCkDkPS{9~&Ecqv}Xpi!txMR_#hGIN+KjFE{ygVRP(2VZX+iYy~G^KA`m$}>A;R3`Brb=j3&BdL +2o_?}viP-;1~(-8x?kJjUZJ;gK)*s}u@_9w`rCD-4#T(JvlPyK)ykO!0kNyN)}kac`dv_{>m?Qy6!cI +(vcu|i3_>ZepUaL`u)+uP}mVkor!?or$6{`E=QzIMa46g^NpsrKdI`uh5Sav^O|VLI}uFNpjxFeWA1o +q$;P)QdDVgC5YJh?z!RC*;8}buScXlcKVa7`!RtafwDQz>%LZ-%)|RnRgBc${HeIzZAghL1GE)(~axD2iqVFiVIG@(K9(<5hjX9BzqaS_rP1qkJ{!$HEk5V9s#?=Vf~I>Xx +=t~GF7&JySW0qnNJD5gr7L{|>|U7U-2J#IKl2*M`SeE0grtI?RS>4hIbx<}z)x{3IYhh!?x>KMOh60$BDz7kvrg=$K9iM8;(YYqb_|?D4nU&2GnPx(f#ZYa# +Z!%A!Jo>`ZJ)b=M;lw{iQ*tCLVT@>XNn%yuGR$&!vUWMTEur(JI&C#3b;&AXyI5?LPB)yd@A(WuJ5gK|OfA0Tn(tJ@*zXmIrq;P;KrB6S#@ +`-;1`nad;&KDWxVx%3AeS{QaCTh-TwL^1v1g!@v!NTR1$B$y3zFC{1!y9d0bI#%K_`{GFw=Mtf3l=mB7Hsu_G;YFp0%yp*o$a2NC7B+Xd8C~iRhoY +nZE;7a4xQiqi<7Qq$*E@_#>If1tT>j1I`&gIH24D2C9`iXeGGG6XJj2z_=F>U==ryENi`AeS)A*D*nb!Wgh3<`o*V`L)~U6OLDGF({1ylrH0 +O4QpjZooDw?1qas}~&?qd?t1z+>e?CVurJm2R?!>NXWY{z+Sk7fyl*G*Rgdaif(vu9cU~fjPziDIwwj +;KE(4z*QgrM=G&XWxg1iz<=v2pqN?%ZQ@IB0?}Z7zE3eT)Cnjc)_Z3eaOZ&ZNDmI+kqKm*_t%SAtIrt +`aIw2qT~c#pkj5>hLS1mZyh@K@zKjx4tpZ{eFtf6vgrS8 +IImEt7=!uL{lNrp&Nks!a_#+$rxwjHSVULMq*utnQ%*@9dkFYg)3g_ +hD!HavieH&@^u>Zbfs{H1Z_nhqx5BHnblAeFslWpm6ga~eJn>Ytp!vcZWGf~~I;Ujp_U2EY4J6ln+x; +fP>}u4JP3YL&<>54U7shLw22m#ODgZdd)SZXb|e_#zx)j^0R$AG4#M2&u +0y{27Kq^u=3njNVc&iC=iPAI8BQ;Dy&BM$rUumJ@N*#x+S&ok+Z7A%9vivVFj>PKxi~gkV}31hSvUdB +wZ`jU0p%uPMDXQ8NW_7fR8@vo)W~MG$C55bLddDko5VkobcoE=eWnDM(`i6yt+z&DpowAOZ4pi@q$x5 +cDRR=zgmqK)s}@;(K@|o`Romns;g;&yTUkb9SL~GE76~byh?pD2BBI5LtkuXD)|`8pCbl=c2H4D{zPZ +MrKvJD=Ddrv=K-r6#y&O2Un2Zj)TlrwUoDu~|E$|hnDPN3L^|Km-(y+#2K1av)a7sEp^;&;v>vz>Y<; +DdfdzqKDj=ZFI(0ox!>Yf54C6~3L-c{Y;eaGkDIy{cEvv`XV6GtL@*)IU7wAU1Kf6kEPOmE-H0{%#>2<#J#hEoAig{Yi~YIKQCKo +lPxdFZWLypmU6chXecP#cKX4MItT;R&cCHD=m4-xwCzDvtfpekFMx2AEf3sTS>|1Ep#Fxpd`xN677iS +`MnDWxP@=y=1|B%Qk3Vq+L>-j|f&nK^PPlX52xmvOC!$vS`>_4{`#1?oPw*z_vdfg#wpidG@BX}4^c&|6_lV0&cc ++T7_?xcE|KF^Cht0}*MFUmEXB?{~^tj|}Td*E-KBR%(m^Yr=34h${V1 +BwBc+R7lPh`nkMx@(9$-DY~(y3n|M6wW}`kD{bdjF9xpilx0REV>XV$aA+I)ay<^v$iI?&@DyPlZ|5% +Xd*chec|!aa3g)%fRG~sSC1sEN7{Hb;6IW +9VnQ%jfzqrmez`JAf&KoN(1q3L%7 +sx0R%lCV4g)Oa-%D)GSfF#V!6X2~t@U5;e~Wj2iq=9%h +^_z=XMW&s#O*s(92JrfZG_~4{bLKpcNG~Gdd4SZFTF9av;?klZ@6R6PB107Pj9ZaATNlon4N)DbZ1Q4 +Sz;av96LDTUnAW(#W)3s?x_MQiBmrAgYvdmoPNph8BbWvejs$|nXT$&!ZEfCL=iTs6T+nze%ShJ#7Gx +;LrS82R<&UK8&4@u5@#8O}C(O`BUj=bVCe$_50j>{v<7qi`G>md203P;9@R0HO(Fw#_sFT!#^~o36JxE&tJhc^F5FWzG~=_+|BLJUc`#82^-TrGzj6)k(@9IJApjOMtv!YE!X? +2|7$8P#H9(^4rtz=(xEN8VY;+d{Q4q#*NDJW~9kyBGjWy4RO4xW6bZ@dieIlY?+RQ%FY`)K!vdc~V^)4934Z^A?Siho2?NYr%yW6_rp&e8& +3dJN#s{o;PoY{;~7t(ML;haCCwogc{4S<~;_?d@kInB0<3jYBQL<-*;}`1?d2@Q+2whi!qpfTc;VxE- +B3W)GXLnUfqsPAADPvtIiyEp?L_X6g`a2pjGmysth?)#&84-%^v{bUQP@Vb$dU-QOY`Q~o`42@<^rwT +pI#ICa-l=vO+|sBz1diNf|RxqwCzM&kQ5$jBC@+!M*jNUyQ@@gmvc)!_t-lM?M-y1oD}qSU3?rr%w08 +^H?O^Nk*xbzqGZ*}+L`z8J%YerdrNJ{HJgAdvDV7z{dQl2C&SEA +6Jh1Lj$}Sd_MdD(Cei+!Z3d@}+36rmBaDtXjh!J%@}JiN4z?mZ=rcc< +6eiplsR|5}7M=HfuPFynwdMX0mMFmZ=1h9nl;j1o+@{rIEJ>T}7A;kCa=sqhxvjRt0ehYTGi> +kO1Le2kRu3zfajwCt2kW@bCFaI0>GbW$Q`!y8)6ZB*S&xD)RkY5qtf*xx49iQ(~OFNsm=|KKjPn!>Qh2(?fz&3@+priaxu6 +`H52hS$z0N6Cp*}>7%7|t$o3L$XG00wjLTZ0hhB$O3b1<0_IqsOvkK-X`?M9YPzNQ*}+-HKi0c++~vTkkQ%SD +GN*7+|Id2u*$g&`o2FTc8r>O#MwLP1jd?Y>n`Qd@z=HP&z@fvU|3}d2Rwd<&J*B`IcZ +5|Hf@qYkO}7_2|+1n4x+6!qyseOXLuWFXl1#l!|$SD?xJl6#$P3F{GeGF=HQ0_Xn!&d6QJF$#$<~V!F0YvGjef*Zp{yMPxEm0F6F3UVt@6fz&9G|DjE^U +o8uEFE``BMCyIMfqN)qHby4(~?)d>}Yy1^$&0kxx8}GYI>s24`lj +({9A}@WHX`2v*{R*yP3xkht3!Cfd%)x^&s6Dx@VEq3DP)h>@6aWAK2mmG&m`)Nr-hpcY006fF001BW0 +03}la4%nWWo~3|axZdaadl;LbaO9oVPk7yXJvCPaCv1?J#XVM4Bh=Jh~6N(4YYI%5Zv6}+ASyy#bRP2 +isU2Zr2h9uIc||$xCs1skL081G$hU-lT_6&_~=QXOCABgNV32_G3;D-yg2qHa~fQx9R^<@B914JvF +mj)m*?%sYo0QpRx>V41EV0H(L>GncSP0HF3rR)``YKy;m5fSQN%eVUxW#IiCPb2)gJ@OqD3*<&qbTfq +cT^#mFzgnMep&jt!ibgxnV0dMjd%iUs^UZ7m{tjSl{d1tUvEyH{)&1ZRO+EM*H4(DOb5AD53Hj|4{T! +KV1qdRXB}@eg#a2KL4)%0Z>Z=1QY-O00;mk6qrsw=7ZQnAOHZAasU7z0001RX>c!Jc4cm4Z*nhkWpQ< +7b98erb7gaLX>V?GE^vA6J!^9tHmwW-SMY^jY()hTyS<@t|#QLDOC>$FHOv`UMm+UUw;rdCGRH4F>w7gcGD8%_-uW +qFlpGgfI+Uyc#*XZSiwXja*JQ&zPqjs0Y{?qi*;_1>x~*J_#88ow#;%~I!ey2tMm1Z`i=&Qp^uX834k +>PlKH%Jn9#Z5y6bo}G_XW@el1v$1+tEp?@rud_uxR!x=vSY`!%*rb)wWA#J2*}wuFI9im2H{4V3#}9u +@s~I+$EeVwVTvzF$o=J~cUCyAzSe*!h4(a*7;G?y!F0^epl97NOI(Gv}ud#YxX_%N^x(Bb1zCHNx=4^ +Iy^!oVZ=GXZi5FddAgUZqW5&*hobYU`F9rA!>tYx|ZOt_ZcpPjuw;AeY%tLIrG +^Ov=rHB~lN7rLJ5;ySC!VkXSb4+~va%%@{zF3Tog&d#@+)EL){fMHW&W@0K}$T7gb$qHy)F1LH$veLR +Sz&^`%Vf1Bh?}1vC6>wL+MQUV)UaCuAb_Aq9Z%QNIv6VVc7gslFwN$)gvhys@>TN$WT2?zfJ2*SWVSp +=Fx&pRTi@aQ1jR6`02jOvZnJq5i1MFdxF)&!VSTq%EYQP$dnXXiQn +HKF3cMU*a_5eMa=eVO8NwvK_po8ppk(@)3nD#sH1k2s_0SXiV1{^Z=q}7Or18MqN!`jwBUXa2Y;Gs>G +A%3MlQP(26vSOo7ukao0_Yx_B_+boRYQWGY&lZ^z?no)XN!|9w698M<23a9rY37MKUa6G8xdwQk;5y) +ST5ZSJe5-D188!`=Q8%U2t9q~EJO;%ZD=v{hUW=oak!1%Zr28Jx?5 +n|a?L|JH);xpdK1wfqYer@cLo +9^v~yGSC6-a3;sKMZY_}Z%s&0dEnB=X#MgMuQx0r3cR +eh4aq?I88Tjdh5YNef;zb?dz5=)On>-XnE=nrQm>uLp|RnZc|5lTC^6%w*pKDFA@+E!*<*e&g0{!o%~ +LHI@`W8MDXICLj=?661OAa@1i8^iaq*Z5oXn&AF|I`F=Ra)NW8~9wjvdwk~XtCt#H~#=PNwm&Bl`ffa +DV(DI5VPhfic-34Fro;xh|IeKeUmM;2M>Db6ci5AoEw}{QMW5| +5Qe}Apj?g;uOpsVYSEY))SWe=8=0dqbSf#(2bN$P(K_<-B3pp@P=hsu+e4+x>$IrBE-D-20fcS~n2Dx +UxH*7EK(YuXDtL6W5;H4BYQPD84RX{2ms)kDoiwqt*(6}eSoo9Rv~Yt>xuIy{9|!iu;8W24fjVqJaVc +sL8#uM5SfU6)A$nQY8*3s0K(L&E0a43T0yF{y_yZj-E1rNV*wjj|H(8YdrIkkO5-Dt&iwoiy68qd3aS +jLPHUd_qC@z>9HyOw=5V`vYr-#SKYH^w3=|Gx#L0Y<-_ENdF)Ok +f#)bAqhz$5l38<6_J$~gfyiU!_#P&z;qo6cFgLmRHn?YnYYI32Kiy1I}-_9|EzyPzyoZ^hLn$}Z$Bms +c{pHDgHg~)WLIqL4Q=nS8Z`Clh1W}ZprmMpl9)8uc|!(_h@=u8k`+_v8~hN8CotK7G4Pln3LHQ`*!q9 +GtWnq*!xxXo#D$~IF2Eihg(8S%5I1ljpFe*lFh{-Q{5A!PZ_ius_k2i*+k;2~L_>cW +NePtlOClj`d74GLY>;9FDudK#+F4=9WcaAl)2>T(u^0B{hn}X&P8u0`82D&N4e9_Cti%XM(xH_T&1eV +3{BiH1Szn)f(&SXOitMtgELp)>!$A+{cfGibWm!N9(1XI|v{DWTigMeXyv9?!@c%!7o>#+eT2E^?}S+JAY!taAl6%@j=cCmh>a`$}S32HXvKByxx-kU +JpR@PvQz;_(Zx9J$r=QH(m+8R#npMFAlU2ag^NdWga@cUJL^^|l?%F;Ix?A2%F)Z6;qEMBA{VKYAeL2 +pLg;rL)+#WwlQ8?60(oNo0$$SEEU1#e#BT0sU%ByrF0~Pt+fhC&|-rmR;?xvk-tJhfOPUU{S0cbmY-4 +ticch1$btYrwcu_U8Wr%;RJNvokGtrJ(4l%6!c-*NQ(=U^m&)XzD*aX+o9Zpollfgt%ayu_y!GAQRiB +fvSS~y_jB+FbjHg^b@>R-$);N9fkMwEz(OfXy4U2rp3(SFE`fe(+KJbv*!#v`G{i#icvQDvs6Q&MY;5~bDF3C=Ocqc9Y+P +79!vd($I;zHENap8xT2cbhciS{2SkwRRu})czY?T-28XFlFtNv+YLX_p>T3%t}}L_GlY)WgU8b#TJG2 +hQoAM(o10L2iTOGA%EUwxpcZ>*bf%dTHE%oUFfdi?p6@cW$pY!9Gi~3L!trvtKM?NtVakM6Z4w&-lG9 +%W9J6-jFAXT|&2~B2@In_B;D8nYkPYG6<}~6Vf_}{@(_Jw!F&{xRq7p!QD`MbQlsTl(ZqIU-=p192 +k%F!YJ*~WR_U%-by5S+#`}~9>{KKMn0o^%CZBsN;7mH*E)x@4MRsp%_%|-CLD(K%VLhqHD~wga5NV;3 +HlIeD}?~B)4b7ek{HSpm~+HEJ0Q}ONwy)6wm~`I +K)`QE1=rBuX67RsOuCisnH5TLgryfDtF+@TGygNO5kHC5~gjo8T^h~1Ho`gR}X(fO_I +Y2hBi+|RQ;R5lwxQ!P889M?+Ma)Xr5A(|MJiFlF61(qPYT`Kqyt@GfAKg>o=r@$21j5W@C;;7Mq(`WXyh$N0L2GEXd)1m9973X+zEkLk|Z8jHi9RSs5)LDO)xO!Q3)4K$`88B$>xz*2-6G +Q0lqlrmVoTvkXIjdFFVV29CYPU!)cWMMrI8M{sC!q)fm +c{BPpqZvzaV?f#RKJw|n}W7DQv&{@(s(mv47-S>)^b7H+z5b?mzy_97C+KV>XF;hjF)?4 +Bf~#oPx6k8_OowFn+Nc=i!jVg9YQjL)Zcf@q2+J!QDz@ZP-(gI=6*~crpKymKZ+%KzyLKKrR$U;Cmc< +zc(sK^1)*^$z1V3PpTS>ya{Dm^h$|ViM5~58)H9u+7of+&%gW^ix=C(1#tpLRUERR$Vfb4>(6$L${CZ +ZZ9zFL_W8iu243dDGFugV)(APfcPYgShM3XMSTktF=aKeVkQtu9N@$1+{7lCrvZbXl+SN7ZV9?%M~3?alq)C(o1T +J^`J^;(Pk0Q*q@Pt!E`=Y9M`OQooz3!S_c8uLmKW-INF49i0vQ3BE2tdZ#rZN|tZbvc%c}v&rf<)xji +*pRDyQrh$$X5&YTXr-q{|0Nr%5qjoQ0RW=x0_&cV5s^JV>vK^q_zdJp{vqB>Md@_@(I)yntk=bUoq+H +`{{Uy=ycMjZN!SN|90NNBh#BA)8a`%B-j?wL@p8VnQ^DkH_=gN31#n=YU_ns@=!D`UZ@?4m;CSOdPx&89xOIyGYrK{i@Bfffyb +K7-{{04kp*gb{+o@WJZD0tzV#oyS-x%&9@@#9Y~dGvP`=k-x^^K&hQR8=@RVwUb4u%|mFupR#W+Sv#R +c-YwtvkJ{@hGBe1?SaT;bc&0;j2}@7&ybU$kgeEjTibiIl82K(_`JGV6EkNRLH#M_g(FfHPgKD? +ZB7qN~r)7QynK7S)0Ue4QnOZrl)K}PjbexMEjzLvD2gV3m}n@vvn%WaXKgiGu4ev63aBZgXdp5yo}=G +I(jfZ9%7F3KE-cb{=fqWNbX`e-1?QApa650hhsKXY!^L=9GDnVhH9ALNNFm=9^KcB~MDxR>pdwc$K`zy9hd^{o4j|Y?6s!BZ9)a9iYUiS^((ujrtR +c56j#A5Lm(h1j?t30W9(i2S=g9fLuZz9n+_TbJQPeLbWlubnyXUZ*oqnVY1Qd5n0}6xYNdJ=mZ)V!h; +b&%BpCF)V*g5{g8gn*3DWK&H7wdK{k<%tkX!I+DQ7iUYd@4$+LBaby$u$;>?!0a;24|m0)L^I08O>f!jZI!V4#*s%xN;+*`&MCpy +hi7XP3YaXZ>+`v*flge<`P`-X=G|b7?>Se~zG~;;&%cZUy08(UwMzFMzl5)UG-csl|>MGRDMZ1o{R{P?6emuR^ps)+Tohz%R$X-WhdAx~sn2A!dirFINF +CL@uKYP4^F$!Qv6oRCY;2?lQ+4M-q6Ny<$WJO9r4Ag2WL!3VcM4933`x(%%C!t{#EM89vHKQyeU6JI! +(Y|74Hh`&~Mk8t+uhN2yR%c|z{0X7jwi6h=V4{ql3@C1PglJyV3C3BjR**1BZE<0n>QRxqjZm8DzgeB +amBxk?`;8QRbxnm!_&amG1(IMAZ6AchbXDkt0!EoP~H!3f=cmA*?J9gPirj4UY0inGGCAv93A51T1u>a +Nt<^*Cs)$EyJ7gC3Wh$)IA%q7(rJO2nBvc%42Fzs*19TlUz0?iQL!Y)v>8gV#1iPJAR_0l +TSeTws43Uf!bvMQ9-QhT)MUD`9r53=!kbmy+lEJ~cXNqhQ{W=2|SuV#9SO3LbIkH(2Alg%rPJq_@$Z> +@APTq5h$x!Pdv1S$R$S}lVIhoDfaVB}FvTImJ^d=wJgT>N!clyquVktSF=yDE*9Ef;@Q?6H74 +{5VtYrTJ$ +%KDdwf04;e)H{(X3cfbT4{~wGd@i$_&+$$%eVe^Ai9P&UhM3T#Rfh$7GR;Eee@=|Xug|66qVzi! +#y4e@`L^Ln|6GKG8=A%CK$2let+vx~Lv;-?S4vC}^i@jvv@zK`H|o64^w`N7%Y_rDSSABgBkko%E+sd +G)L@_o}-uty(qS%Y3y(df1gHZjppBD%GMI6YiO +&#jHyq)0!TEU$qY;`d|OaKG?E0 +pO+om%dwH*J}ls%if*^|e)7P(;CHMf!dvZF_Q}69nR8d{` +1DnbxVw3%z_VO;wcRR<$WK6!q?NwX0_tGf9Y3FDyk +aEh_sakkuKu|lD3yfz!1P|6^jtQ$b4w8A{e<1Bxh~7BfRw_837qS1}w!_Bw6{C@7lYK3*X~Uv~X7tV%7X`6yT5Yb)wK#Fw6cs?vfc*; +7_R#e|Qh}if&QllnBRj(Irn@8FyNjn`3*U{9Sk8$WkN*7U5ZdqB`cT538}MM--x}z<^sQ5GN&w>H<_(Bvk#bU9<&!q7Jx4<0)$1ws}6+rFNSakQ}lcHq(EZEHZq>5e( +rrs%P^0u-A#ceZ@W2FGVEoyUavXgFc9{!+qBmrks^Yy2VK14nSp$NY=@$47i6Bd8!u*c +yh9L=v +K>TB;#O{5j)qDPtSn2?9hsp6ysNY`u{5YCHB|A%~HY+iS<#}!Ah+`8^&!gE%>E4>bg5?xb#fkmH{)Jw +*^LKzZ5gBG_3ZY6m8L|N5bF1yrbq4}^WvAh6NX}B-mBzxg!ANgwymiUo7d}>Xl))Sz&q$1OA*tnmQx$ +0oa-duY%Qs2-A208LHP45R~e5fH>!+GIP%2+kp(E~L)co9@Nz^=u*VBIZrpvM?s$3oBvZg2b`RKkyPI +U)as6nu9}bG4(t#4?Cr`oo)W_%XNeW?_Mk<@U8qfb^e{(7G>PhlAdE9?*2^LYDYh8F9l*zDeK`zVZ&a~Y!!_E}Cir=r{*m3oKqTcEoD(JR +%|KRn7b}4^z;!#%b3W(dZKfI=Zta(motL0j0>6l=x=sK9k*4DIOqiv05 +TC|{B8_T}?@ZlHcyzsq~uJDHWtyGrjzLi#0qG4$Fn2D;A&Z$)+nN)zWOn`Ckty=XSY#9{Ps`AQcVRwb +{vURhfc=zrdv+_$Xop&=d_OS$2XDpz&m9?_qZ~3WMoW6bnJo8d?#uv-8%O_1;n^!P*etKFI?@cSoUA7 +f>lC^!~RR<2^Zea_$W-H^jtnWH$PjK9rd-$w`lk84f2fo8r)&*=Z#zqsK$YXX +f_iCXIgnA&kIuk@R8*c>yEfoVC(*1{S7B=ix`!8SG?Mgsc{rubK0Fm_=m6`|fLqbWw2H? +pyYIQ84&DXWwhcYAY}c%?yQSr>9qJQdUNLrF&T(PmiPgEXdux^3@h9gm>0>Q<=tPka>WB0<*6-nP!1T +x3aqJjM6@7<~XOfihE;tW5O&}#>DYGd7LsQ56x`=hIobl5HL;>`byG`F?IO94#|iA|NQ-DvV?o8tQ20 +>qfc|%M=0WMUyi%bMsv~ot+5JHq3$GC5XNBoX-y1pT69TPc!;sgVlh8G4;sjx^hwD`kfvW?kcIV1G&w +Aa67Y2ZVqJ48nt&SW{7{5r^$4Moxl0U61Hr1pQ4Hmk2WO6csg?sbkT@3EukqAE45-8wl)!PFYHJi!%x +G#sX=%-!tT`OMR%qB_gBe9(Oy@~CPQZk%O|R?B3TDem$xWajtQPzj0WlGtw?LL_CG*Lc3fM}h^M_rgx +Jbv~kq#sN1Yg0@Njh#}6eW)^#^aVV1E{B8s0Scis4d`Uh@Y3SNI)2T2{8wj2a=ix;#f(bL0pq5%@(uM +AunGw3f5rXSZgdLW=V-ziJHd)7%anZaBxYP>2<8~-?ES`mR$eRgYPv}Cd!hP1*OZbR9#D*nHVz +?bIHn+l;$NRrIoOD%>ycOEuFnI9Pt-}IXcS%E~IR+*O9Frc6e&RL%732neID30`^A|5zw&8a~vchiig_ +k*QWa0x5ofGZgnnXh2E!3>we%E1HKGNVJPLR>gMYb4Vt3AUquVT0!Eaj)OJIZ@ZuSSBX)s7-NFq +cEeAqwYL^!sD<8>*nakl)rIyLbcpqnoH&kIBC>Yp#OU2|9`!3Ik{V4c+6=1qH_m0EO3VDmSt;LoHuiF +FRXlEeFJ4hI29jJ~sasyzvJsr3g4D1Vr$!~}nkehkc7a) +;wr=K7lYp}&U3&xzi{NmAiv38bBs;W;sUxE?mpFx`t?riz!Xy@RWqXM3lTOT%#jCM?=XTsf+-hPU2#J +hs|&zy~r3W^-+_i^Y5=tP(oh2+nXVHwHQ*pS2k0ME(lcX}wkz2HSbKj5BUKCzf78dw#EKAm2u{3JCL| +lCmZbM%}nPF?euQKKO7jv+xmQ-(kCC?}HF(tYm(!wvM;?QwLHWt +_3LOeBx}ZH~z)4MbGiXNe8NSB`+<-+?01-SX!w*{2@W7kI7a&58(fo7|r`8OjLwb0xK+hU_sqJJ^QaQ +dVr_+7Q|7CrKFSE&XSOq7AP1dGDU}lG&XKz_pVfGnbAd~Xu<_KQEB|Bmocc;_#KZd`blHWiRz16II!H +()HcI3jO2}KSK$F(<&S-~5ab8vuj6vb~?c`|&ygx*z`?B(GegOpqw{U0+FTyt3W6Y_96J)9149ac~dL +;Mr4ACnFAf#C~$jL9$l1yD-^1QY-O00;mk6qruwi#d691ONb~3jhEj0001RX>c!Jc4cm4Z*nhkWpQ<7 +b98erb98cbV{~6cETGhttT&g?y7l4*ev%|-XJ?7Q#}=)#xpk&3U2D)L|2+RB$y?zBj39 +7Z;h@obH1J37!+T8DM(-dm^{yd=+%?)b_{~&kuzD*?H-}$E(@-w-rFCMZu=|}PNvVXja3d_fuPxSAI{ +Acblueq!Y~Ia$@}U|tasu_F?=9xC?@LQ+?o~#8zrsF$Z*E^C{T~{z@N3DW(w996S+k}g12`m*Gzg_U> +yc9y(bxY0u54c>!G7hLbbl7g3QyK&g@-pMpiU+4apNBIG@vljWCr$8yF?qt=@Y{1O(J#hp;EHY9lwYC +dnU2RhkB|pNF6zN-~H|8%{oNn@Tuj32;@9tx(b(z)!T1#8C)04h$=KLw%`(u>ES-3Q~i&WsiOkSU`3@ +RJ=mMNQyubXzL2svgX9P!43)1Q&=u#E!}dNSybyeP-^1pqppePi;IW7FdN&g1O6~3U-}|R3DMe#^di^ +Z3CCqWqp^?3Cs**--&2=?l8jHIxN(v+cRVITo33NooH)@e(t5)`b%eMeAtyN_2c3ug +3P>uua5pu6~y*zf?x`sp{9@{F1pMH$b=Jo96F~-TqdfHCP&)-LdpE;aGlSlbL0uI>+~`y)gq5qsaDG(zfNLZDr}lmcWS=MW>u1BrK&EYN=1cMt5V16CaEryOdSj8t@>@0mN_<=uTn +M73#D%>U1U)T$Ytefu|!}2p|zDPmU&Sj)_PVp-?9q&q{-AgNpkZkuUi$`d@A$Vm9FY6(!zQqjm(>wE`S2ts>;JGs*-CR0vZ5Z0bN%ak?T?yd +ZebSO8UqnqR=#&T>(0A33Fd80l<_uN9t_>opt;&nN`pvleQPS0v@_epc#R{FL&YeZW)y&L0V-7R#a- +neWY-X7rF?myCuR;%5Zu2unQp6*>zIn*+OTPJ(Ty(Ix7<-^~yi2V9Z`9tUIBZ353K$ZbKXduWre;;vN)Qi`rACdJ1 +mO47;bI7IXpdn5xzQleR!fK%J+gySH;X5DKF$t(B|dgtLJC0Ps10_!*9>tynKBa{_y;XLdT*8+}j~@QI1^aQ1J0@7BQ3ZUtP?L%B0Kta`-k2u0ZN!6$oMln6F%g+H2&X=#>{pIj);fu55oY&$Dp#hUa_ld +*|{Nn6NVkUY36=;s$jy3?biUv9~Apv6p!W{Ga8OLv&cF`jHvsa~O47 +Eut&j#PE +AzMkIHHAv^(Ve8FOAe=7&;D`{qX|Xr{pn!G$On&q6+nD+-wrZ?m+dq)U#xs=(rIT$Wj*11vYZ_*6z1v +{9*5QUS||BAsP|WQGR{>T?Gtw0FoE&q7aNs!xw%mnA9`{!I~*!oYwq99YF;}u)S8xII46&w!X~rGAg6 +0D*PC%j|6OTP)rSiG4NU(&||b+EPP|Zs$4C>N=$X;=hCmrD=>}W$whSu-QU1Ar{^JvG^2t&k__wXTi>^`P)A@!v03g_!zz~ZhBSk?IPz-p4qBzsgw#r+8;K(;mi +UprAD?E)-zZ)>iaxjyi%W8=-bea%b!BJHQZ6V`LYf+mA*rF?2%#km^55C_kj0fgGi%Zo^#wah~_N>|w +N|CleYzO_Ig=pvly7$nk-zQ#iWK3W5gXo6TxwayG-V7ho(CYmTe33O0f-Ute*vJPA +tT~K#uhP{V@Vn;x92P+ogGVul{l|8H0!EuQaz^SKp3aEzxoHB$t0k1Sgaa-s`ehsLv!waa2Q!Smjfx7 +9pzFMcMPMcxxrmu9GZrpi2;v)~RS9b^cV!^?I?=2tU#x4FPx`KrRC@f*waAIY?00!4d5d$|=E84Souw +H?sf~S#7oz?8of`;}j98;q-y+hL$H4eyM;*MCCvm#kmK*BTu`>w3O%%UYhK5fIvV9$cYri~frnOCVRG +@WjE7n*$w;{jedYC$mnkt;sw0$C$&!Amu|Wn|@Nm#gdw+v6y}O`ZMf$Q+mw?p+k#-EG^m6n5tga;>%K +rPf#8kWJCn==~#as}nM6kKR(JZ_)VypD&|pAT0nRe@;f;F0#g1UUtBAn5%(LP=KTwz=J^OthV{f18nK +TZaNtDHt6Ub;nhv!qTdMz7XquA!0=2q?V9e(sHhTRzyc)&qP;^5mrp-}s3cdD`;FZ*VYI3){Z)~IksBqY4mILkPRM@k8d12@YJpj;mcT~{fV4}bE| +P1I1OSX}P8y&ws2t8}8W{HmeHp1Y_|FgMbR!BjJi+KLqsDS_PC|1ORF*TUWi<40H5`W6fIy&uzFoq;f +!$H~-amJL`PB>1t%Qcf&|Pp@?7!%{p0hCiZTG+=i8_yxl%?hGzI*%qA$we5IY?)>WfVg~L;Gfx#MHM8 +)QJYQijJ`H?(TF2=E3p~6lfOY#l>z?mMeX*xBvK&`h5>5)9nIO?rMrI)LkP1n-2t|+}(fj=<%B4&Q@D +$HIoIyy!3&pJ#6o+9yIARn8N0~vd{d_r^ppLDq!RCQK&$72}*ug{6<8hqoD!bD<0d37YQI?{KUxoLwj +Hpqf5m+xmrwhQP$iFh>PLD+VDd%4}t(r5}?yRd{8lJC}rucZLv3jKYyTg0wd!9RM=$#nlsKd&BmAE$UmH&Bq|tIFj#0 +&+0BDA1q&^_x{01}G#z4kfb))P31H_{mhbd*61FV=>x_z&jVP(Rb;TaFZ9^JwpvbTw#B&0SlOu&Q<$e +=`9k}mzDzH{m67Zc;7XnT4HLwIdx=M7Y_v${bCNZl>YA(@gFH3gM +NA27#f}HQ%f|Nti6QK?4S=DV)zsp=|9kw=5-`Cz24d9_s?vLT{z50N`y-@#s3(U42OpTOy%%X0%mti` +=<11_gGq(y_y-|kHVJhAZ*8nQH)%$DGgLXYiAC62M{~FR~auT+ct(SA*mG=G2N9NN +hSt%1}P`V9{9>Xi5SA#xVf?o-AM4z0DwkkoZqb#{j8|K>>f$Fep3uNMxAFT1g_JdERUpNfv0#216iy)#% +^Oe2}ukj>-6s5?6C6Xx`V{-uj&V3KQV}u$Wc|%LNTQE1Y>WAvFqOgo94$RRJ0q2HOV@uH-JewpHe0Q +)z=c)3Zaeg7R#*EglpNl(_rofDavE8&Sk~y~4F`|X^&8f?^JgL`6`IKoPSr^khPbpPmXzxcdK^nsN-f +tj`=kl&SVP;U_-zxwA$Gt~Z>xM%)IEkWz5Z}n3ZEV-`UHi>OFzeXlHv###@pRxaAOiot$a%eEn*^R_E +S}1Q|Lu(sS$qjhyRBZ~`Emhgtkq?5mG9o@;_8!LT`0fKUb9XK!+_YllN!}#bUK~TP^F^q0J>YJ0B?Gy +j$ge{2YZj7s1r@htPW&}jxzR_%~okdY6D@+^2H+BDK&hHa4RrOO55SUVyZEoR|3nkg1nUYJi6zTY?iK +o!jy6q?=VZ1fl|-iN1WI}{n1MwCAg7jWNHgG?+&+Dc6(Ol^r94dia;!qI0iMS)L;1(E~)Y5!$B!uM0g +k_uk;*_+vZ$ms8FHpFAd<7c~!DqJ;nsX@dqY-sSV{nunA1OL(9!5z~s?|9u;b_N~;8&WmU33WI*Q3;0 +&NlvKHnpCK$m5VN+b!!QE3bCW&L}?Sc6r&_60-HJ+tlb&fwEsXvHV!EM~-46n+sbT(20p&&sU$i6=3w +laNX2G>NC9Sl@-0gE<5mq)z}La=zXSk|;MNt#9|AXhDT%yFIm!b~rclzRpuLx><_ +ckIpL1;`2u06X%WMXg8Vg=bimAeenjZWD0^iF)4-uG9-{b_1quB5pie +ai_hwTQ7 +f_(XuOVi+GMh@ryJ;mir+*DKcIf$mLKpNZGfN|Tht +T*5A +`=291?~TduZ`}Xu5uvLr(-CT +)QzXD3LmQ^Fkbd7)j{(92pCfO~T9zQ$91NZ$DZUn)R?=xNLJ1r>9I(?puT?wE^~JE?Blq3WzO +rEf52WVW$sEK6nB3+3P_9-Y)cxM)ljX6_ziA27_TOk)&8762S!HAS0RH%7^{zvCyL|H?>eH$Kog#o*S@OmyqWjWlbg#<&dqPNjt49P_KXkn}Dvj$kE)) +IP(Bj8BX9JVd$jDsxwZ?*{U@6S2$d_eQ@yjaiDxuwiYadu}L1zv$Q^t<{r476Uv_^Xv-qHSVWtEF{K39*ER +6XU~d;`56pi&efJH#0jOp2z$mO22xVK9 +QFbO4DYxlOMf^rkHGBSs>drWVNUuGk9w2@PWc-XH303U292O+0wkGqw`ZFL|D{&5 +31z<=4+YWn=GJVT!D@$8!veaa@DPOKnML#c}F2%s)AWa%9BqSPZg$%SiLWlWbOyyE{tdwcp?{^d*1N6C+wg9T}ROW!#5KagCQr7@A4WqUMemDz5vGFRr)NftY%zDw8Zq +Cn%fh5VH-a2Eq%4xP@h!%yj9S`_A-La!Q-!Iigv>q2n3|#638>DiAz{pa8Q9!+Pk_b)D!k5}m;%a=b +FWwpA#xxM=|01-0S+dp{t=&Q&7@5vu_g7BXMW6~S9YlEG?Dw0M@oMk(@oJC|+-=WubhFl_#j9-f4nGs +E^sb*3Gtj}gVT}exZ-Eob&k{yZEaHL?9>5C|p9IDVXlhkF9lu??k7VQhAy=nZIaXh;$@B+MlIa2$N` +}6g!)P)WR&JJkGVfX|2yl!pA%KM`92I>oS*}Ap@)0rVTT%PL=X^4Ty11HtAIT*ipvF|MjVfBWUu=;PU +@3*;+vE3xcj~7tb8O1rVbCI}we5^SpZ>8Y^yVlWbyc;R8CQA3!rP~m`75VA{oug*U>@vLB-3+7Uxd_d +2MVST^URMN_BKH|-){-+};Q@!Q@8RV#nrjNTg|fDIRQ!+a-+l3W&mTVcaNm_{+x22_l5F_|93Y&f7v1g1I>!Yuj@w2K98S>!N@n +oBqw0|#lLl?#Yo^Gb_HHZNF~8{D~r}Np+X +a%2|dm$%z%|%q(%_-aOez5)c#C}f+O`;zc=_eZbl(M{gSkwZ^mgJn>dS$BfYA5=mjTUlw4ke4A0%$Tg +6s0vdiu5ZD9Ss#VwdpjU9mz4<0qVXjcE=tFHp{|GmwkRhDG$b}oPFAIjfXPoJuX2Wm(0Ja^Q-O$nQLS +(Qh=P?+ia?8xJluDzuR?5E}Rqfj=Noc7>ZLyyg@=g8;I(ly|0Nhi&8uTk36y|L?o)Yy`Y3};DP7~rzX +Erfs6blILlv%K@=3ITRCi-IMsDr6two@l{n_T2e?_kPq +mW2?WwkKw?lY9F-~eSQW!^DkAgTDPPDwab`SM543H4`Y$bn|e>dz?qaWIDkVNjT14C;6&WlKnwWkx?C%rb{cibyCWgw`L7uF!uta8)f+`M#s)ebumjrf#U{wdj$xLPi`k@N>VXqzr_8GI!OPz1!{Na))W)o-<5M3sZ1Q?tcPfNgiYtJEdyyf +@{!6TDMRS-KRzm34O4XcavkIFvG?h8nrY6os5-0^0GMz4INF{Hh@}d((;&4;FI_zS=tEnR)BM@71M1^ +5sRevfYZWer0#*zUi9`mDn!+0yUC;myRKHrk-Zg`bots8TEH+^iq{L^Oa&s0@4QOo7vur5x9S(&N(wv +xF_Abl0Fdww#Zh~E^i8rW+i{9=;Kq^wllIixT1H-D<1Qsyz`mR)Z*0}Iu==)qSbZGZ%P=kMKxoD#4#* +e$m4In*Xf;^3c&98MIdPP?GiEmO1z!s%@+8#tfNr8}T?rUGGB20nfT=YY7aGEmf_s;Y8jvWkO|?dRjv +T@4Tw`u?uiP!;oN)@K;x+TSni6M8vLDR==@_}9j3;hk!L}%98@GP#S+5VR7g3^n>K4@SEo&Rrn;&=TK@j&ZXQUHAZ>5#HtPUnT{ia@P5qEjsnAFCKcL>G1{$V)UkT*=If{u1lEF0H}jFa?Ku_m$ptA +?;0_(lewo;|pU{TQ1c?pU7K1E+dB4GAu!=n5qN2T3_hK|h&Py-CiyI=bnEkKx9R=cQm@NS6OOSlKyXf +=oAT(Onsd<4T-rt?@;;-);-0bTJjV`9^BbkN0bFk>N!PRuOrvWW5&+8uU*}~d=OCD?;NwzXJo_4`m`>=y*OWFm86*oJ%r3qijHDCw!pO1R3BP~c>9XPCFnyqzSwVQQt3wLIW28 +&H^9JGvaqs1FhLh9YslmW^O4?$I#%pp4p%KMC>*CHM_28-JdT#Kqqrh1|n4~Uf-Xupl7m)7pr***KVW +KhSXeqIdKC}aNf&a?1y{FHJFvDNnDr&79Nh@RXGXk;QoXF-@)o%{Tw(5bI*-(~Y-_pI`ys!>Q>YN7r( +!QBZ>$|nB-mEaa0fXdU+qGs2Etl~?(qW=brgQ{`8(tNzs}zMFOORQsYQ7a_2nBCq-0tmpQYoyiyM@+a +oe=_^IWTWm3u6EWnDWKK)x;mk?8a) +d94Nq>J*9xrQHd3&6nU79K0q|t)G+rJlcK3M#8KRp*zVh{n!JWQfqI_Sqk_!(_U-p0)|I4s*i%)=iJpA^sYYuw&Lp2W%JjHlIV{^AXcE>p%KcxF&F4QOe0H +5rX$%WSjI8xuAz&hLk(mv)m<*NcjVmxdQbnw1sQu~j4CIt`IPHO-0+DYNs(duCAiw2eG0Wn`AFq>vh> +Yg)GuebGqWBZti;mjt&;s;~GZNKDd9S@6`D>T3>M?Sby+L>yv2l9Rg^tL+4sQjXOgr1(yfSg*8x7Evp +OD_p;9!LQppgFWvwAFVgIi?-&Z&Tu7FC`u}*tUL4#O2Gi^ZnfZ8)p?+vwC>YKPy{~avn2VA|Q%E*oJI +YhsiudSxSipcn;Gy@}`khf1*@@h9uD)X#r+nnL50gEj^w5yE76hq8Gol^1kx|MSaAA?eOPj6U>wY*fw?!CC9^BcgNX3w2#{CFAw +tz8V3*U6U>VnPT_!UUSd3IHD%EpSs*Lh!yi$&o=ziasMXL%!KQaiA29z5E5NLee1e15?4VH{UY?V4Bl +}R-uZKH}GSx#w-USu>-Wj7wqW~b(-n0)^?(RyfKFT)CnoN5X1=$zVNIXq#r$G53iiCPLT6#;u>6*{ox +u7F+WfbY)8r5HR8&z(R7hu);hpcyXki&R$v*0y$_?gD7xCc8# +Ev9mz_&xm?u|yb3W9xEthdk+*}_f%Pn2Zq*09HQw!Q9}s+|rgzKww`Ck>+%uyXwPY^kw?rR0y#5!}U#;>mKqvK;)>sT5{zs}r)ZoPEr9uv;f20 +%ld0n^QUsXAtH*6AS@u%{_X&&GCI2kZ1<4}B3&7z>#WM}^}rxFi!k$cReLWx<#RPIV@B$y)ZO!C~RQy +0Zt{Y6pcR-9nr0C%?|G9i`HZ>r+9aSO1K`SF2Po!q9sm7CG7o7(|MG^oqZw|+ZulY^ul?mn2^D2J3{9 ++_V&>lGQjzh~$Vo@b^s^Nece$6T+S+p@Qle@6aWAK2mmG&m`;(515G>x005#20018V003}la4%nWWo~3|axZmqY;0*_GcR9XX>MtBUtcb8d6ia +KZ`?Kze%G%UY+y(mtOca)lK}&D)58X0V-auAM}aGic3D%T!owTo*LO&YtG(QyelR@OH`k}3XR}%6v=D +s#GhD-JtC2O=hP4Q_k`imnm4sd?!Q}>+Y(V3+GbEJRj6${N;r#El(SL2V_ +H(I8RN<+hfk4$iwx-JezjVD+}oFAU+neImkbkF<46z@CwJnBXlXSpE1uMVfmI`)FqmiB|% +9Ja@nA*w$#j_+42sR+oP{amwW>0FbY?YJ +EY`^3(ZG8-mDHGCYdvZeD$M`I(D(37~Y2wi>Ge7UF}MVcAit5;5E|pV&L +P$%IjWfPM!=w_o4jhm-0g%atIN0k!JZh&+^4&dA@8qSovOcu=qoSwArK!15U!YjU=+Bsf?us>&nk*0= +mHMWNNr!Yk^f7d(yv2;G1xlc0|QQjYZtR*L8e7G +ElmhX6lSgUzau=iv0^>3KVtBIY$7|hsIESbCb{K2Q?n@VN7#mrj(yNPDDF0g>4o2UDMDs7(~)sxp( +9UBa66sWd^^^i_^neFehp&KkP_E_XGfMz&7k>v^OVr>6*r5(bb3 +z@kKFiwrpCDQ!4aqY^!{H}XSgR5i>LVX-6(2iaijEbdjRDhuo2|PS2-ev!%W{$x@yzE1Bc;n^usrj&L +6dtikWBs0#Hi>1QY-O00;mk6qrsF_X;Na3;+Q7DF6T?0001RX>c!Jc4cm4Z*nhna%^mAVlyvaV{dG1W +n*+{Z*FrgaCxm-ZExH*68`RALD&eSZFhyd98kc3gUh+iHRxNAq$moXvF1u#o3&O_L~37pxc`37kd#D9 +^4jU$en{lia5!(Ad1koly4jTTG$_ld3#=O+xGHPNSKo{Ln=vQPbcFulkG+*Vy{e2?#si-u2XQ;lb>$0Ba^%$Q}2z^%zp5gm;*@qv?^nPkH#?ILLoa=R2Zx*T&sa( +tSoc&xn9*XfTmpN@^*rz#H%CfWj(I*pY*hv&x)XQb8M82N&FX>ZZ(aDf}FSVndGf1}7hf3I|EzcV~>Y +Arw#nbyqZYK|!=$ASZwaC7eskStU)!V0eS6~mBeGd&q?Wij3#BYU4l-##;5-Qz`gPNNsBNv|E|NaX5F +PA*e5f&HhD*7N&sGlExRU*4A3(aLA>S)fQ?>~KdZ+9ViqH9|BbCc&-Rj&Sk!}m)5DQ<2UDNCfeAcp0RVu#Gx#*A+yA~{Ji2d-!S)e@5-O}UT&HVE1Jy;@|A05IWv)q4gOb<4_}eAA*W +2Ls#F38vq*b(-)%(=G37=uUXZ&sOe!X}Fa^YP$HFtnyjyv5<8zFSmuIjAmZxyB$P&gb@j#*I%(#*9Dd!gLmp6C_JIh5ZMcaoWOx17Z52_M&we0(&T3PS`--tfq5ja;k>dOq9h%ooz!=| +C}C1C4!;QWD>*bWFX$VHQP~+$%;rj5pm)|3Fkzzk+*l6-SMp;A9u15I3zdn7S)g(XDjX@$jCHD4|8G#|03T454u>9g%e|ZY#t8)LI;1v`>nd&`cT;xF@@;rI8<` +r;m(kI%DgcNzNUqgUe;3N*}|$`aapSbP#gJ)POTGxZJJz51ehge1>XqOt4Cf<%MG?eB1^flwXaZ8%Pn +Fo#4`6gUf=rCWSOKW<@s0=il53vY(b9%TT-1gRmOFXw%)k!fnNpykX)*CSyLV*!!c_)bjX&kfHfcd&Yu1l-8dEokmc8^J`COxRn9>2bEaeD3HQ3Z-FZmLjES +KvPzT9r%Qi3z5mrD1CU9@GQHzF}$!PXL(sxPFqyoF!r2A-F{P=&`Sy%_|GCOCnf}|n-pG#qO@%rNOM< +nQMV=DnDmIVj2N=fpvsM~0C;6t<)zY2z}K%|wElDDY7L7N{h*`Ys|g6MYkn={|ne6xl(Q&sc9sjNqm_YiDg8 +}w)_SIK50r(KVsnGR>rkk65IZHZT17sfHc(32^=#cVT$2bf^5)3f(8t*7z=`6>Nd_HjF?14G}8LGpQF +k8DaEJ^}+>4BwU4_jvAWsql>ABSt4`JMvLM{QJqc2SIWu=|YShA-6IQIn2s%cdP4-xV+a=V8thBK +p8NqEK^6Au#rgFYz(KryvfPeBJ;2IIqB**V}r-=R#u?Cs|e7z`3ZtE7DskalQwg4n*Z+b+?FVRaqMz< +Qk~TZaFsEjVMp6exraf0*(H7=)e@X#8MG<`Bd=_^T$uJ8=+v5IF|}pJ>h1bMHt|U*)ACe8o|~FIp3LO +rj|I*0y0+^Xz)Y7O&ZM4!t)(G0aV7?Yzw#3}+DA4cD~*2rsg({r3CfcLs*HS$|!knnMu!+w!1xd(CbE +777O@4;$ooF1Nuj +mjNreV2e93=bc0W66?ftiG-dKA`=@0Xpj8`=CM+hl1@L3Nll5KT@9?#9E$)H{@-;F8|7+ot@uG^E{LCs0WyK$sZlD%dx28hMXsy; +yJ|<1T}E*>F;VaOyMIy4&@!oeYsle1i=KAoP^b&*>wZC1!l}s +CLtP4pY8wL_3yyl0yDOZkmlfhRLKW9_B^I8eNW=)IAO0;Ang>#ffr1t)qiP^UyBCDg%HOUHbxlK#EB3aDt|3B;9uQUp;Z_#7fZ_Z$9ij?JYZab-Q)8%&u{eWV+V>+HIY}0PfbsPAjo5e6QZD{~VgcB*?jD1^DtQNw~3tuJ!8;;syL)Gunr})8EIGc7ZEbMg*1%-_}b +LC6FwOp`A3uWGt;=Zc71`*(9ovw<3A)-j{tS-P|or@1kJQv6oTriT!wYyfq&Y02CQ^Ny~~a4nY>4f<9 +)W0j$PnS5hvgu$<_gXA<8sNj<~@88*Lhdm)ra)=qVyKOyQV!f8BG?�`$YGM9ZIdm!v1Kg<~tk6{Ux +@O&tqgIwU@+u`mvL?S0nzuPCB|aY8RF(wOp5ZW_&D*Mr6ypOWAQ`Jozu}wJv=^zq$^A0EtMkHg-$&agBa}A)Q9|OAHDj>bthGY*Z^Pvbg(o5PCIU0KsdHzobqk +8QKOQ_$6BWAiR$(0doeo7iz{DV?oZ@GZmpwl3J4tXQOYYhx7FDu;NA6054u#PZE3YDHgr8Uo!+I{&kU +5%PO9Y#h_0cQsJ*o0x>KToO&Hc=Lq)~A*ZgHx2>orMz^yEh`Y+A`U{Bv0#Hi>1QY-O00;mk6qrsR(*@ +``5dZ)WHUI!20001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6ZZ2?n&0B4A+cpyZu3v$Rrz5JR8R +zBFR6Wm~Ys+n>uIe*1{WhqJ)Np?fcGkoFm5W#>IE$ooID7cg%xE&DZul#p=ct|2^{ +!gOjGw3u2S5{65N3ZU3ZHHHxa2HK5?D7@ty9S=0e?BmqYam!Sq_%L(u&1V&K6v2f+tGIb}5W5IxR*Wm +q3jgY>6IEt(kQOdLNjWT6JzZH1_3D$4kEL(DH3rwaHo^ZtBJF@Zlt@P|DZJhV`eNtoR0pG|iKq(a9{_ +L{+>F*FsjPHY1PQ>a$Z`R=CiSwgWShx=J%5<4&aHu)E*$Fot1a$=^xeX~qHXc`0F*>H{bTdoDptUKVA +VSE@ZOIdBZ?GRxA%lQ0%}#qaeuB(g1|BGgbY8QDS^dE$1*>90T~%T$xJH`ot6N_cse#?@#9umc96!6# +Vp>H;2l>4hPxBMgBTjtdvNP{wNxdOK!+kW^#bzT+u-e&o0B5*nU9ed3S)9E}dx>ow0=T>#Xf;l7-m&M +xQS*~xt7GeiKiSTJPV#c9r}tzbJIm6C}i8FyTlB|-xtr4Q7iJb?`XNXfwxt2LPVGa!>!YssRO2%yL8K +H3x+pR#nx<|2u947SSSqessVj~>B)K9bFCIhb6FI!kcRMEQ<5F|c`9bzrxwc!{H*snN`9c1(dvb&et2WwMz1i&A9pVYHe!a^cJb3U*0{nsQ5?(< +&AjL8wL~MtgW@gO;=s&V{rsCj&wATS`pLIDln3|x5aIL{mgAV!wda|Mv@6!Yv3M>$qa2cUx%Brm63iO +Ip7O*S93nlU}1|$dLSfp86?N}D=K;sKuZ8MBitdoy@lz(?zz34vK!8cQX=Ad1J)Xm9^k(zs +d;*7io1rUTbsV9%b16N_y8nQ@u`T9`oi=V2DazymF|QLImC@nC?q!Ij7wv>9i>KEbqD&u2 +dk*!1th_PXw0LVU?_|D+Btpr!45)XiC8|8$3YbmY1{7)%sSI_$1OzybGRYgQLH>~DX%&WG+}YA+Uqb_) +rvDWMF+K^j<^J^&v!6*B|_VC-*OrWw-{x3j*D8k`TH4(dK^7S>!kZZY`4@~A=o0ig?6@m;f`Xa>~XT0 +rAZ@%KHiFwg*RvlisAN>0HM1|;A;Q$#^HaK7 +v=qf`#XO}lB_ODUAZ=s8;!Ayv|y3llbvZPtoDoW(=Kb=QV->ATEWs2&=m2R;eCIRUKn1D^6Y5)TaB*d +<<;w~w30*umaO8Kp@fb#+DWn9w~p-jb-+FjhCH$*Cc)sQ^E{83G?hXn)>6qw+arCC@sK`v;GA&!(vY( +?3go0kS0JPWOi(jRJ7&kQ}XtS~l^G>3+86jxxE0eUA@8>)WCwktI1NEX0Y@sPY9m8tCOO|ohIS=#9Ty-&@_Rt1j7oHLOGq)rmdQG;hLz`P4G@{sU^zU +9?lIlX2QZS&nx&46Kd~1V1Vsmyi-be&fX@h66v(1D4XLSG!6}v<`gDfnrqm_8+hV@^r{j71Zm|{G9{H +y0Bi~{fsy})(K;3pn`>8uF&7y9%x74xJyXU$9ZpX{5!%#>gU#qU?S_ +DX-Q@^=T`BFucP<(a~)Kx$@(aT=SjleMRcl0yc|+kNFz4{LWdmZA-yXMP1$*R +&r~N}eM|(G==2j_Ahe3y;sTR0@vkF-X5&pdEPjg0yIyz=dPcWi@|qHcKDDT>1Q}CUV*Q^ +@i%B7(Xla3!mek#7uLO})_i$o=Gs(= +9v9mfOIM`C5ZBvd&tG_QtRjqeZ#bcXIzk$#E6ySaI(-DWDBDIm$<`4jz3@R`;TD%@G( +`6Z2^->8E&IkQX1htdR{tl|q@*cIS;scc`QAWHjK? +=P;tJGltYX6GlbF6QC<#ZR-VSMwn%AhA9)(xg-}+?;IbR$WPI^V|>CH`>YhMo#r-K!VQC%*2WYoj8!z +)aVKeHTu!*&}a|$iFxkWMLTnK%xm7d=HsY?{Jzs-o9avOCTWT106GIB{Pj!C#Y%So#H|A3* +v3Dh!`y4g|mLK06*bGW94@>f2g#*m~SMejOUpwK^U4c8*nD>9Fk>HR6&2E2X{cSg+d!MQQsqM%#%Vtn +J#>U#Dkh8xI+?6?hm({6$xohoJGMhm9XR-?O^Y0Uzp2>cc2Xr7_y1;ck(!Nv#d_W|0i0Qe#AmH`Ep;X +=yhPpfWc1kJNjZEg>I9iW=5F7ouBx(*v~3`}%8%I?&sfb1%Pk{vS#f=9nJoy0JdUrfSXtF(}JuC1YT$ +kEr_xVt7P4T>Ut}%6z+CI>K`b@_5&zDt82DH69$`5L4M_EAZwPwHk|)NDmLcqeX~`sxKXmN040d<-Z@;l4MhhFwBj +&e421Qh@1Abq?E1IHbzE1`zXpphrK1>I@Og`#=5AcS9ed40e1{E%TvYU3o6b>+y6&}rzLp>Ixf?sJsWEeTChB!>i;?pqcah}BD$#HirrPZJxzN@ +bpy(tc{lsI({+EsJP@P~xcioY3^BeA#d6ubR}|1KByYn0WnXx*MY9IGQkWZ}0X}&BsBNrn+);>+bAj} +Yp#+|GG=CiZISG_^GDlhqSj`<9_eo_uqN*pNxV=Nv2syu5F0})~G4&c53@PNIB@Wn(fHC= +3Q_%;?(3M>W?uvq6;;D5>*cqJizSHSYO3Yi +}Ouy58ku@x1fCKTXho2Qsw2uXL@g|J`eJi5xM-nP1%KQ`4QVySP**|R?f@5=Xjy6fDz9 +q-|S`@=g2Wa@xcx4`1waC29G&?{J2U~(iT$_{Q0rwUdq<&;6FR695+MFc!}Bfhd<=Y0GVM^b-%BHaC# +1D#{xOsoRlKLd7lL6R!OBkub866nyd!vo-;V=MM}{5~EKQw@xAm5q?6AOOCK41gs}IJDHh(9`jRlM~4NXP^H;QMf3 +{hUghtHt6%y+(`upq{a$;jXCvM?i~g9-mHpBG08mQ<1QY-O00;mk6qru1E_!QACIA2#i2wj40001RX> +c!Jc4cm4Z*nhna%^mAVlyveZ*Fd7V{~b6Zg6jJY%Xwl?LBLA+emWX^(zpmTqGSD^5gFIqJ(?pv$eabv +)77cXDiv;A|YZ(A_f5-29V56CBHrWnkPU>-c7EqQc-QKC19p!rl+T0)7@A#^){K$S6$mRYCcbj?XGUx +B)isi*|loUe;>(X)ihOY{wVA9x~SIXPrcXX*W0YA;Eg^yS|NB{FF&a^aWLv8$#il>kI(VXY0?&3Rd=m +>{(&D@==AVNAg1c`QtjHJuCxI=K1$%{RatA5U)FWWaOvS?Q@8apcyzwqwfm^qcPh(ObD1?7=I%eQb^B +_QRcn=dPv6wb3@7j}S=lM?`P=OCd(}4kaQx5y-|t}{S)TXw>gtX6SO5J*rPUHP>Am_(r*!)R32EqJ?50~CE`uoa%@Gq)?d8<5rVSAq&I+-Sa%(QYiHrQzxn`VN7 ++_$RT)Va28^bRP^q6-1PmuH3`yS69?7F_7LdpOUVdbd-#-z6Gft9HIBN;Tiry1+hR+i)J4*06E&4bkm +<$AlYp077(2gFpPY=E%u=bKtxdT~nI3YnT|4%{2Mgl+)z=;G+;bAtydnI)ETQhs!F1pEY^3s*^Dz&G%#YR2<9(&~IZIXarZR;#QlTWD8b|2trH3=fY^5< +JQBL?10nKuqGO0bh>!<>ZVgw%83K@{;ZLzjs=B2H?jim(Spf^~ +bFT66_cb+7^iD15M5V`*Bik1TOzHhBnHRg8-w`Q{c?R^7*D?uv%y-E6=F$=WNz3{cb~I{7L^7kL_^Z` +zBa8Lc1|;1zRWf>{Y53WrMsV<`nT(Q0$++F`6n9Du;Y)pqs}4^Kp9ZZzdm9EaYmT +$y-)^!}9$kBIXwW4JF%L;6cyGAvsD10# +AX;y>p?7(DOoP*CkA5qo_$b2xbR|fez@0O#vc8CvEmgRS7YQP229yPER-Mbhig?TcvfgK3($fr^o|Oz +sj=f?5pR`)b;Y|>6_yEl$8Kze^NgG?enAgbqNoESxXwA-@N|gn|H7N +^q(*rKJfh$JP!YyM#3QC9UnFg@ZBdmTdA075Ho=z$t2HMKLhrhZKE@Znnluq!a_Y-#1T%*<6X&ErRy{ +~hJ|J&c0Qg=39HbjsM^|sGK>eYS{Bz4gIa{MK&p1LxWwak&n%F`;Qj$d3ZPt|HzdQ~Kee-Q%m-%mWwU +{EUM#)&yvkrQ8klo_)n;v{-xL)Q{k38SmLr2hy3_PJDe?U>t41w0K{4n}2lUA-ff*M$E$Z}H`ZR%6K1 +-kZ-G2>E@h44@^bt+CHX|{KD5elmUL1c#Aqu)r +1*ol-Dydf%hoDLT3SY2xAgabf23Z%VK{k9-=`t|{Mp24BVOuaA((@S4^53YP}aJWO +WT_!KWt!VfV66q3dImW&Tg`zL_sv=%}0sF0C8p(RtNI21c)A^2HN0NHL6q@ZHp07nd}H4K39oat)L4M +z9-heURri#)*Rd^AZ-QnL$;aMK;4Mq+l<*JKo56{@FUm>mbe4DBJ~M+?HYB1d>4*touh^v3KlW~v?p8 +m0ro7aW!b?>ZegM%)8+hta@$p<0%2GK@)`q!5Q}Hh@d))97~ryK%Y8U18W@H0MkONym#`|N>OtB&O~gzB>7C9as}VkURv&-CF$(RIDVC4>PGff6Ii +1`AZF}=BC^jHK=AAr`_6k1sMpbr^DBb2x!cIeoCY!`(S5O)fj#jb%f&hh>Iw$oH}kQuYlzPTWRW+s9m +eSQAT%a3n9%s*VbJ%9J{!_*w!*|RBgo`aBtC}dbUKm1p}F;kqh4ax6N7rXnOVjt?Y=|NmfykqQZzP%n +ih1fu39HMDYzqq$zj~3c&{8;cgHBN^~Xr~%wV`ko`Xfe!5NilsV0enFua&JUTWcJF-8M7y|d(rgWpz> +Sz+5wT@qVA;l&-iy^$B%_9B72u81lqEUiog)-n8|JryfXw~+t>%7@chSrI&de+Hz){EEV4JI+aq`R&qgJI%N=EFvzMcJU})4=&ylLR8enUF=Pt +~+x5B)hKJf%&P^aQRiYo%_OZmOSk@uu`S>R?Y>yklz9VatIDrb&{M{WaxgMtxGjRm2q7+z~r~I0PF#@ +Fhw4k-PB-ZplcL#pjDHtw;--b1f~(lAIM(8Gx4daZ;d$vyqHwhB+F5kFv3#2=QSJlQ{2N_+rLq}GGl! +$8lx=G_UvtttUU!iO$Hc`c!ar(Fq$Sm{^a{SDs@YEzsp}B4vH+2AU%s|sPEwB{{1X@W?Pi?IwkTLAA? +EQ5Xr!-*a-1-y78lYa+W;OXOHypkke;qr0Jl~2M^Qn@1OckFzjOvcp#P75#>Q4xne;*#QS9Ai_eIR2% +Q^d`2aW~#yoaB1&QEqykkY;8N%n@W}~0iZnnLai9L+|_I(S)nFS{14+ZI%LJ>U&64JZ46Ri5~+0qv%E +e}EwCb+%wmN_NmnwR-hKQs#!-yN(8=&b3)$) +`rrMIu~y_9bZK}4wJ=P8#0WZC@HN5>;SH=CO|8X&qa`$J9n3^)O~m4S!Y2NWa)GrNC$1bR^yM$FDtXx +g#ereTKIJoHLQXP@U>J<9UcdP?W5fVB59qIN1-tF%H6c+d=mdlq$rIh-mBgNyfk*Kvtu+ +g$CgOAXoz)eDZegX~&5tpjtBNHTMtq5LZVT#`iE*g8O0}v^1a7N4w^8k;^XR@X2+Cbb^jv=l+iwDK-y +r?)j71uV$Tz%dTmV7|GRvsFUkW%coOr$&e^Lb2lW*Q`XB4QQbqo+WV{dJ=-!j=A +bsW=-y$foruyA2sS>$ct3Yd;nPhdFbLJZ6TmA0=88JmOsfWo%lFAv{!=Z&b4fW&=kY=9t6C`zcr)l}hiC7?B3s6CP=gAr6a#Z(vVjV06@tBSzhjr +VZSu3WWu73Y4ck<|Pp=#XW%Vq%&Ggr-ZD|g +4Csag7~BIn!YdF`KvYe!-dJrYvu=4n!4^!?X_8s5ya@r)#shuVeW9Jz4$K=kKWyg?&*}sygJ})0k=Mj +hBD27=BP008Cq$hI_1$pU$#<&U(Lz8X$dv(;JBp6GZ#ewbp^9fNY;(xb7nCIJrm1g(dqF~~j~mdONFyV}jOZeM#Cj3@p3>hqo%jy_uZ^@&5ae3uK7xMqK@#Y_#{v8b{#MR!l7*w3EVtcDv6qF(u|OhO_+Pu6}=M4@%3o;`j3)pH +-gBfIDk-TyMKCrGQKyx{8wJe8#a`+%@A2^x}tCIs+L$@BE9^f!Ms+|xPUW}lSt*Llo+nrzAK9G>TyVV +7v8bk!%7A9S(P&*R6Ul$#Mkmw2Gwss?!3))Qbg`Yq@NEMczhD^{YrdXX%3=UojxP#F&NX@*kKg*gE01 +))9AOL1pR0FtDv&jkU{<$nO=P#^%QlXSU@(i~$)%{a8L!SyKqctT%RBaFj7Zs@kF7cp?B|0IyD)4}k8 +AZ#F3eOw5^9`S7B2k!PuTAwmGC7r%3gbf5?+$VuXVMW(Khg72<(^$`*I41q9cNIZhB7b1uTnAnQn?>P +Z>T}yj$P3@U-umpvEp=Gkk2FEjwqh-N9LTvavUY;pvZqj7?w>P1(aioRDkliYg(fddlY(qN9gy>YD?3 +sIfTztAF^ySY5t#XSo%H#fk4$Q6_|k-83bZxxADcH*BLsw90S$XF48htHcY&Itt_2#hJ`8a~j=8*{I~ +aE|LJgjo-GCBr_?omB2V8TI{oSGS1#5l)ByXwY&>4&o!nKW~#d(g3ET0b(y8p@_>E&*hoLB2YVk$7;3 +zZfiC4`O6lRyKBd_ve}G)*E;HbZu*(2K+d88Xjfy+`yX^7FE;N)d6lXm|rFiNIkD1UJocXQ$DI?`mYM +jSIxt6KR23UVyeHEG+^jp#kQ2WKn3Gbt#0yDc&}Vl*DH&7(zF1T7$M1O{1msN_IoC3P=l~ld75<&p_)53Vh%xkDxkEIl`w~tyF`%4D +=@ff(%>t=IfY>jLz4xh!OK>Y~jt&CleutMbU@-&bw|fXSg?7ZwX&AjlSnq20wS_s3-G$T%*-Xh_$nIx +OQi8xdD~Mx6uCa06+@Xx-H1tlazJ+31e74DfVK6;ZG5k(FEVdUoE-DNz|V6D-0bMj~ +SBccEPe9ZqI2dNRm*UUrKOCWvy$xeIJnsNy95R_iiQdR4A<8guBnHWqb8utKg^}0_S1G#gK+KD1IJ7# +2;W!9p(^~87=&W4ZeonF_`H(61#N=qTVHgs`}y3FV7z +3zoj@#FArt4Fb*EWrS{Tf<@()5K&5?^1i<@`;+OK#5Y0Ty?%Fwk){%ICvL4?jx11#K-rFC(m04sK@(sA=f}gUDvsZQT +>wW)<$s<^o(-_MEcl+A&-0RzaAW^?ofOmGDdv>L6_=Am7K_cWGQBo^-WUzA6T3i`(eB~EJ^pscLzk9}AR{f_DaW +MWOR8hC1#r+^8uqz(j)hX~A$Hz*t>c&j+-+De}bK_~rpe{IEBrskrmJ?DPI_RG;zOXXvo<4gQdQ1L8P-&%)}UN*S`4vE^k +2m81sv2%F2PKOewrn47Tuzv)bkl{nFcL=P5Q{_C123QUHSz&K04jjwxwB+BRag?eDZRQ-j)E$#p($j{ +wHtIal%-`s~%~i96U0OBRH14mtmt=!KuO!8W6}QT!pqVgr +j7P>mGUI-c=)}m|Z;t4H4Fo6#g)A1Hm+2_nbJTGb3q%vBB$S(s?k~=`LZ^HqzJ|cTjTmSl9DN#gGby?C&nL?sCGnhGqc3vNcVzAbiwyi+UiS-dEXrYZe-^@rz<*cz +L{>hw7pTu8emBt81`kg6Bh<^JF0#%>wPl07_4Fq~khq` +oAbtfOS;qVGJ@Sxl^oM`9qGhnN7&o{}raqXcN<5nMK60STw1>CF2Q@MO}ppf<{)BQ|#E6Al}oO3J#Ot +qsegs(E);yoS{YL?I^<8XiB_%vKTl|gO{V0`OBd+p$l@fNR#bI*h%-KZL&(QqL4IDKsn7id1w6X4*)4 +;DXJVa`}i2)YM!tg7Ek9ELA@UlC~n=wA%~bz;s?E+E*X>kC;aDKsjs3GOgR^|?^_EpRcV4i0BksCFuQ!;a(;$iKB!N-D7>Ya@sC~8Mf7mp2w??M +{hYWO;E!&b|0SR=?tUPFbqlBkL*{ELpp=G>-?vrbOrE-*V40^OYT^4)8)itJ^_|s~0qOHQO+415ms}m +10#->sjV{-Dl-#$xzeD)J5DAqeQ)CU{=6P`}IWm|)~(OsutNuTOX_H%uEDo2~6BlRhO{o3<<@2$!jwV3jD0p(QHjbn8|&8LwyfIYx#0L +LVt_Rf;zYmFPXXq)|I3@xR*#fkK`$7oEFYLg5gzGHXOA(fzi0)e&Kj`-$hlp?}-Kk^ZFAF1pOV2D^wP +Mg|i@hTST6Jg`C$+8DiizZ3S9fK{(0Zuw(Hkg#MOYp7lhNz)9R^FPsC=&%FDoAZv_0K1PHiY3`p?oF5 +VW!A|&K&nDZN@Lf&mYjG7((PEzRwyOieCQoje1mCu_0|~Ndv#j?Mo1=`+Ky9Z6eJBXB%^L}n+j#?KRO +WP_nbPO8gEHeP<;s+ +k=1I(}*VB>n)Oz+5t>^dKXam_or7d?*UXNU%HN%R%LOlh580L@$k$-h1Hg86W(&=gzOl2tTpe&X3%EQAZ3 +86RB)EU>Cfbc#`?srCc2xe&BxazyY=ygn#Yr71x&)k{)T#*hlRJ?_*Gvxot +4juaV<0IIcMbUM-=(I_QPL{1Vbj__A{L1-a(&k0X*+c%l!Kl>d)++_VG4Sc(En{uRe;p;qO_OoB*4_#yeTj&N()1X|;h$xH +gaGsXis%#0K08$C$BgKTwU0-yID_9Luuu^`c$as2Nof`*JQchlMRap<=COdaqLxD>t6}`243{COAz)m!OM}d;B2O&|N~N%NjtzCZT^J(XqBllkWz#tck$Q)JNBnFHW@^@W6yTK?I`r0Dvl07so|#|nhjvI)!U($@qZ#IKu;#)2jOh@UNF2&&I59;hC?W +u406^r6XwhS^N#Tzx48be^E({g;gX +dY~C-YLiqCj$2q5=43TNaAPzt`GZIq|;ebx)8*k^bn}d-3!|fBs@}&63f#=O0E#_mj$lwFWZ-Yj61a! +{9y!5hVSQUA0b0JE^Pra2SW%j@NiL1igdCxV`6hv!r562jH=V&t|PS_vx}Syb0K5RTujB{Ga>I>tH8N +UK!X7ftzjat$yG>HaM6j+{@fh1fcGn@?kx04q)e`njKhSP~wYs6S4Y8Cr`d+Q6l6Nk^KGg3AqA*!FLNSbT16gp0Hl-AjorjcowypECh1TUFf!{j$!~|Pjc +Blg%pj$|AS8nXd$IGmGj0vfjr?GU-FChvq68F#-#Oz0N?j4%Go+H&{77HPd6&xeg?7%W@7gDz0zB8W# +T<|x{77KiU`DGGlST{LGL!0@>rPVH0gTSDx1o&0bw-B8f>jJu*xDOi)Is2scbS;TjDT~FDCmsCRsK03 +WGn?ZR?Uo`>=5TDV39kdccqqxUxHkG8N4e*Z9svLLc32z*VU=O*u#%4g#Q{YW>51_1a$(NdZ4@%s?bZ +z(cLEo&I8y`N|2LA%q5 +g)5%qJimu^j3Vk+^j1pRjvIL?X3`W=J2LWMjqE|Z7Y_sKRuy=)4 +8qxaXtrlKAkDpoWAN(y{fGJc^MC$$@&5d^XWfz{He>(|&97ktOBm?9G`|ltk +&*<>UU8*Rbgn)0XOQ<8Vn!luyyVHlYZTqFhEvVfPd +{8clC=o+7RtMpuf-i4$$L3E$`?kM5iNG7G2!lLuB<_+d9^heZG9EF^tV8$Y&U+@R= +$uzS27r$dL|6iUJ;ITa&dWv4Ek_kexgLF7;d6}%=c3L8X*H8e~IeFEo~V&ho4{Z)eirAhoJ^K1mxF!z +T@hD@%tUW`OS;t{=G{710J?ediWH$Q1n&mq3C3LLw)>;K0)bS7W4W(zJFs$3z;3NeRqBv;F!$~6LU5k +i@@b;&9`+e3gY)t7r^4hN5*h?TT~OKKMY@i2ZJ3NkXpLW`r?ltS{I<3zoO!eCrYaa_iyb>Dlvx&L-^v +Wy}zY8+qwh(H6F0G`3Oyh%RqYG#Bb_mX>A*3pf2UOqnLUFAr5Yf&*NQX`oi)~TS5bU+8V>#k_8n!TLi +l~#1Fl}=yjpzH=-{@^gw`4h>Ij@&GE$UNMonqpRZchOcYDxK%PG@VCZrW`*0PY0D?h~{4(WHMqE-H<_I3>ZqK +X6n0_Bs_IvYSgK#7tQwJTSI;hM~T1se(;rvo}coRL-jr`E7!4$zs-l_eo{<^$xuO?y!_}PoWP9-sJL7 +CdM+XgklP<5HyKJ!MX%;&`gPg2hA`1a3w(TzP>2Mp-2)SFQF(a%pb?#dGm2jH@%d<$c&B`siYGE$2=) +NJqlwk6@4{qAVW&rs!Q*yxUy2Ox`zdIXqhQiO)#Y&q}&KE11W~e&si8fJJcDMSW|(Qa{f8Pk_di%kFU +S}+7B^_32G$8vDbCI23d%SAYM^6?A(~*eI|&R?m~g3n1+T1A5dfnn|Vcir~v$-Qan@q4mP{-R!NkBp} +iCgq4pskrzh`N<)f2BJ;Pe99*l>9;1k-fk>nQ<(yt1>^83#wjc^xjg?v->CxZi{uuy7?@d?B{|KcQEu>fG*63SiQQ*F0-B<-pJ<>T-}SzP0GOeuD->F)8Io1VX+qsmC*FDVDkZU^Hlb0jmA^Nb{7l8Jat!7G;nqxTR?`XQbuTe&S7Vy~RumCnWfz +nniyrPJR%}6r<$svu<<+Z;3v(!lY5PURew0rE& +Q)&P}=wJ-oJhM=HlO8{_)NE{OZ+r=WoxihCyT5rAERsOrby2ZT}lkO9KQH00008045ZePQBDyr+^3m0 +L&Qx03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFJ*XRWpH$9Z*FrgaCyC0-*4MC5PtVxL8J(51Fko$FN3iR +XkB*=kh+1LY>x^p(KZ)})JV#XF>HVP?v9i!$#Q{zOp( +koQVAA-Ws=!a~?nPjj&@YpT?Qq!CzbF@+eNFP_8^X=rQ=YRsYqi1J%jSdp;Rfw`@;EYnGmitz>Q%t25?;2+#5sWyY~e? +#EjfA?B(w_2y(zRJ=w_N}#H0@p2zIZ5A35UvEs4N+`BwbwE3A?lx?2-+dQir{ob|aD^7U5J);XC#P?vTs)F-3&(!sOaQ1XLT0fEZHVuqYycqG-eh +bFIXP;qPGu+(P_S2%cD4J^JfPLQI9ddDA72Lw<_-wY;m06t$Oif?`C7yD)53Fo?o(lzBAd +~mT2k#F?*c{lZ#SHHz5Z#Jra0oDH=w+({s5O;jI!5&h2o)$N0a5@;gbS`@D&1k+n^r*jgI7&KsD|ALz +HX4Fzv(yrv=Gh&m(>%kyzIq^-!lFrvm#@v$X3EIy~c<%Qb3$oN<@)}Wb8wIl5@i|%7O{IYdXCmqKQLq +_&pP{Yx3|fgfQ^`hw{ximv!=}Hj()T|gDRn-04O;iomI~G +E1-E_;}8rlPXY^Ur2)?ggy-Y|TeG@)OXq)SfBowN+$#xZLJ~KQv0pmA{qX4CKU`C|6vemVQxRi$TH?hePM`dQV!ab~7~s!S-XYbvdGhlbwWfT!?Zn(93iu@ +0@%6uPnG)oM$|gQi0mTiU_b@QI2kecZypvl6gBCgELbZ!}~b*!nw9i@+tvKS%7PW()2F0eWm!_D17xq +(sg(atFIGKBdYF_ni7$ZfsD0YEhSNApVHx7c#=iOs3p~rV^qcM`;8@UHQ2>kOqa_-2VlHdh#c!CCitG +UY>ZGJ$l9Nr2x=T$vU!+@9EBP?meQw(diItj!OkTr^=@SMTB0!7CFqiu$LyhMoSia@!M=ZTU<}0*<$g +10haWghG^yLPzmye*gkDv-p;1iUpn{yjpd}U5%$vmoSv?x1pzDp&1E_M)<)s-cKER>Tf)G_GK?%6PBN +NrsFwL8>ximlvHBBI@MG%c&;pmbTDrURwR!7U;CW+w$z&*}Z258C71!5_>=mI3OV1UZ+U=bG(*mOgDOjhh`}j~3mfJPxcf@@Tz=+mw<&k%owwi%7(%@IaZszZ+!V%Vf%G+v?;zcP! +37RgKx#on=auKz-@F@M8B8UzO*F~9NZlassJ?qpgzhg9Dt<0{Lo-p=3$BFvETF33Ei;}_*Hyl8g@+v< +Wo2Axnj3f;C@bid<+OgLW%1cI*U(cJ>QN+v#<(_O9gG^z9D4@vd+bjmYiN^TJ<-T0@P$Lxq28mIV2y3(E}O2m6M^h-h +{c?lTxZ177nv@M!Sp%!6U;B1db5+JGOiM^k+V&c=?mn%~P;f*ac93j%PJHvw9Q+B@dB^>m4Jgv|qZ#j +zbal1}3#AD}Qf$$3TVDp<>vIYDm+FF`Yq2~N|;R@bijr*^&8VE{`6r7^;?y)K2EXzrLr`HK2;lrwJ@OB=qtz;9fcR? +_bsjAqtZ^&_{@F(vnAiq@v{$DOX$%vajzbg-mAe!Yq6w+zPBqq>CiW>pna(I{aDtKIpJxc5KD+u?*QozBZy0Aqs2fu?fI_1#b7AIE2#Brm_aMVcRt0!#dJo8KRrCI6unG^dE11kUM$0fC +RrB3$J8SG3guUuNNsk@r}X`%@!&|Ju`x0`=7)t5K~_^=4eYywhx)VH%#z3it|h3MP0(jbReuFxLrC|F +X7?W!bk9H+-o{|4h;@O31x=LYh)ylPIfUlO3k2L&A +g>ni{{c`-0|XQR000O8CKQ-XgZ07=EC&DpHx~c^9RL6TaA|NaUv_0~WN&gWb#iQMX<{=kW@%+?WOFWX +d97G&Z`(Ey{_bBvcnBnKj=CoOP`D7VpiQ>`YghE;!;l0rEl~~|SyV+TjW=w+eRm`!k&>Kr!}KK)#e44 +U;oZ@BEp{YH@@wR?UPO)Jg>090e8<$jVsbXi5i6=_dP}!VwosDa&t| +iX;sEVeC7A*hpS($!aIE)w*+e9k~ju2R;5pPD(MvN@+nP7BY_Az4tn8y7nc#XsU0nWnO+?+Qm^pIol1WT1>K#?d4Wk*W6YWiCvT{d@h7AJ$ +3o9yCle{TYOcGjd00=EJ@}&`qK>{#d1tSKNXiTP9ZFBOD){3W1LF-}ZO7i~oOLB5@`gBRC)Bv*C0!tOk$YyW8o<4t0J}~ +3dv*?*mpD}ebZGaj`n9krOx~^&@3%joX4Dca9ka1(ID2u(v8g0D~td}N`t6JRg3;?MFEltT&kuj@nM4 +3`xKK3C5kCzq_BW&J-`PJ1`eO0!H%1}ch5n~b@$#{Mw=K(n)9uK;$s^0fzvl +_KFMWAnM*c3#&4ys~SrShu$Du`4QNk5ouDRIM3pEO5Pt!V|sw{ZzA(10AKJWy(VB%2Iz-?B3L&#fp&c +$h*C|fz+S$_$F+z`P+HdsQmc3^{(CFR7Sfmsq+*G*D9P8gHV4TAIa%RThH_goYb^{K#=$B3$R_i=B&s +QNp6tpx ++!Cqg<3|uVO7e_|o|tcYyv5ozYn9^gpyN#pKVwx-UE*$7VtTLloNAg(1REnq^C +eT_%{m|Lj?3Fb0GfE5F1{05O%FY0Mqymro|_pE4Ce31U(+&X#qVS`Y(oz5Q{!~xL{@gUHjX-NV03N0< +yMsMw6_C!!zy{I)Q_}1RDX^>{yUECa3;)e1@EGhu^lZctYd;HinrL#Aks1z`X6W=8;0D7-1QkJ)mLq- +80XbEc5|1lO=qHA`&_^WKc=RHhS{W4tSpIpxJYHSD|ZC?7l2q1MH08;LQ5+UbE5;zRD}{4;8oH?pR&( +jBfOhdvGFtWDdq>viaikKMa`;{$S8-75w*Ma~KgD|DszI$+xvi0rLcz*YE{({_|z&|JOPZUM#>C9=1;9Oo__f-%`pt&7;W*?}M?v|yVD~7dl8ZOdN4V +{yUd2!f+ca>IlRDJCZsi%D`MdQM0w9pEgPZpY4%RTHaFURE~ctL{bv*2ZD=-4yYVp!&A-~(iRuXmbX6 +)p@9?BOm!Q0gIgCC4O35+FreUgI9o|*WogZuugFu$z?*Ivw9ObmF3KZ>|JKt@{z)zWTVlGhX( +$zq%V?LeCWxbCcoz3%j)F6w2we7zX3!t%zX%)WFS@eH%18d>ikXv!RR)fbqkoR4~U&|23mU)tQqMakuo3)$oei-*hJc+gLsT+MUg5;K}fNhi9@FT;s$wCIvQ@0G +r1#&R@a50{kI%isPj}v%}9+>twlMz~nw6)7MEyu +Fc`>A5cpJ1QY-O00;mk6qrsVR<$X90{{So2><{e0001RX>c!Jc4cm4Z*nhna%^mAVlyvhX>4V1Z*z1m +aCwzg!EW0)5WVXw23Z7_3Y&`}KvB5JrPwauL)%5Wm!d5sN*cx7P^3yyNqp(I?~tNoTXxb^fMJQ8c{B6 +gaM&2#LY_Ch>kZ~Ph_=(l0WYnVy~BL?PU3PY6t|TS<9DTNtnB!uZIUz|Pv{Zn?araye2nX?&fR6{^-%Vzx`s8+#BK0z;#T8Nv&`DE?xAlS-oClU$4F=Nm642)mCeZd8vCxdkaK$=g7ByM((8Tu;PUpbDTCgu4u{-pG;guxo7Rux@2w7DnD6 +R*;4pm={Ie6u9?^<1sIfCxkznpyjuuu-gg?O|L5N9MH5M4Cs)-hL +}Q56!jKi?TyyOY0DK$xZjFu8++6~zd0Zx{AMq*-*2gSeA0;M`@_Ha_Bh*Vv5%f`oBA!Nipn3^yzQkE9 +XBo~)3)Z0PYI1D_xgiYIFtNc@CF{TCK>!Zpz@1ia4rfGfCd(6g)oKq(}!6381R1c{+&;*E)}&W9Cyp-X_p;G8q3?q+BBdv&HoN7K>*Z6l)j=Ohq1VyeD^|1C=qT@g$A#OYA2xBc>81 +|cG|l6Y%b=*x%NXf-cIQ>fv2$4_Fjs!qxj?|IX6~*F?+`(Sh&B^GF_}zm-d_arWSAs>4=?;z2=|cs!P +3F7X1PyGpK3`x24mF#-{N?@lR-g>me=XKaxkLo!?th;%+wMB7k)!m}CHdz+1Yi@42DosC3(LCrTlO+d +U2K50b+Nm%Ckuvmj>*3&Eb4st4Q+re|4Q1VZEHDc!5p@6aWAK2mmG&m`*SfiEe8X007lN001HY003}la4%nWWo~3|axZmqY;0*_GcRy& +Z)|O0ZeeF-axQRrwOe~{8^^W(pPynNBOvM0>(~z3TmcN=s!kImb^^<}#f57uhs&Wj(Q=pF*_Ff;{q8- +FdG0PH`8E|`nViR&ne+Ia$Bed3y%%}D?b@zUc`o$+P&ciRYg3n9t8)H6vCTzYma1rVT^ZN3?W&@!>(V +!r_0^TGt|pT$lFssIj-&ow6{>2><1a>SF6ye4x>AiDU({8_!w*2!&G_!aho3Ke&(F}aptj4j@m?DED_ +bk0LD@*Mli)(qMOlI_5w +y$sCQ`eNGUPDh~lv@JYeyz2e)Tn=S%Cvzw^!2T3clE~DFb~e3MKtz`cNfruto_vAR8u}u0{0^TdqW3d3rp#|tV?YYg(0rq5o7f8yZq;2oh4r6^*JUY43IdkCt(% +RI%~iJt6*HpUNmSde+=#UjaKanCQ5(_L&;#F5J@(9jh0v`5YS?BLqHbtJS8Y^N9^v#NXqCythn)tEF` +_d}4LVKRbOo3WQ-!T$lbm^>%8fzR&`F6utb=eG@kGG9(6OscJJO6Iom(U$+WU6l&H4?Iy2Dq3+_kWv1z|z5|qmxVgq~+T{+nz_mHh`1hwFr{ZaS +PF(5S6<~2hck0>>O4IF4zsvA{`8SH5e`hIB9q}|sWL_hk1Cj~Ce=c4Tnr83d-NZq8w)8(Zx$Zb?=Bp% +eq5=B4JAH0P|)f}L2%n)D*NH?bV1p5&O&cP^^z}5}zR1_tU9I;TKW5m`Pc(7`++YIR-pcI{H0a;ShGuf!E$l;gl%9gsSy +4lMTbg7wNr_phvviTJ7YG2AoD_9}{h}V`zFe+m +5Jaw=R#N;N;Ln8xYP*Uw@U207Nv}v4u@NSKf{5uc|7Rj)H?D{WZ=EFtgLUr +R(mtZ!zbgp#gDeT2aN(XLYpGX@EZpYPMT0D#x-D7+sMj*7=VxHVQK*}+;3oks%5lB38CSD;AYd{Ev5t +iG3`P6Jm`hqIuedSxCwU#==y}=P*u0$U0ta#FFresT87=t;*LzWYHw!qm;oa7U$le0JhIi0A9I{Ar&u +8^HBvBEn?TeAF<@{zoA&%Aiw=$+PZ>RC5PnJl&&xm`k?==+D-R3{w-B)!7nPzxSf7&kvuBKExIQFM#( +)wFgF0@hg`ozGXxa*ZJ@2C+l4%Hs2wJB3H0$dIGSrDALwo^YjGPd$Wh(w4tTf$(Lw!KE}SM%(})zC3zT%BPiy$?$JoxFK&hR$Pg4(m_2>!oalt&i5LqRoA&a6 +h-5ttlT*ZaW1V5l#o)Zg5vH`M;05=Dlv^2;Jt{{S}JTY~5D0QJ>{dCp8|D6oi +o{P?&U*AR{&1R#?7D_=ARO{&b+<>FxEo87eKkb|YsFh3e(yCIHD#*&4h_Rb{b0_xz#pmY}Pw|^?zH!w +C(8^ekyv&v_=gDv!Xs5VB(QNwHHy_YhqrRR$e|}ZhSK!);djEX-pG@9MU4A}+qukZ?*y5$CW^OJWEp) +$}csrpFoZ80FOu0`Efo+@TGo#AwBB=H9#g_}GB}<&L5M%O>TvuwPS&y(K6}E@X*^nUnx?W>CiA`!bUf +>Ku9+tfB`2mAG)JElqipx^&*BkIH=i-nRB{chZ34fkY@e*Mhf~!#AvXDrz5_uSK2yAPS3X*$@DAkZ=H +=5I2n_DEu90l6(j&$;f1L-%pNIOymU?-&gEV4+l)`eqhGWsr(uevL8%oF(2jVx``I-OnqF8XoP`IT!r#$vu$uaMj1 +9wM38uypI=g3xi5{YIr6YL8T2y(t>Ihv<(vO)vC8!i18ryaAj63sm9+iof}Z}^x~RqDBaj}c~7<*S6p +S$a)@HV8|KEbYU<^7a8Tqz*NXK~oFldKRbbx<@uNrP(v +kj+t`V|P$yq}|thmRbKJtH`;)u7$aNNx>;pz`sp2D=m(pcwTmvGeXYM12rJCK}$Qyw9Sa&UFE`I!4MJIg5C88~+QD~~AI&E;lJ$slBXYSzu^2)^qo^3YLU?DD9f(v2I2=(wjp#H1ELf +wN1joKXx3R!ABVh?t)pRg9Qe2S6@Yl%;w*$~e_+a{#fQ5CT>uIi3It5e}^dRw|$Wo}`AU|K&QS`YL0s +=0z4_&TNwkEaHx41s91@|135qseUX_`L|7Dk9+QdH_#3GO$115LSg^}HAhq@WOmP<$-NKnfM;j# +YOZpdgDUh^1L?EG-bN8OCpP2}*Jjb@`KjqiUD4tO-~(%2{}3pt^bm9byzE_gQ-SN`Icvq)Z-}9$gQCQtK${;fp +q!PE}3of5t8$!gZuGkrP?i{D* +$ym)H%UEpXgQiJuPjC6Ih$=+Ajd00Txf-p&Tr-*dustTj$;*rkW>6gi`V%mHl0i`#`iKN{U}eeKJi|X +aW`D9cFdB@WHc^N}taZYtM@Lqddap~_V2E&ziN?ut-B_|WjH=S$hTW@AUIDpT5s8=4ty7$LhO#{v-gw +f*v|VI_wJ1&X?2rkAHho_8aV$Cual$Yor^V5oC6t{O-T=IagR_7mIgNs!$iQYn8XBg(OD!VG$3GIE0(}3gAW +etFdFTGK0z*YWJ`Fk(1auO5!dZV|;lch}5WoDzX0>>=`NxZI(Tq?9djNekUQ!eD&0H)rCTfSJxHpdQ` +h|LS)$0lQ(L3bMS^WhSP*Y?1`kqjGsKJOS#=Ek|J=b=XcVs`XcnZ^CI&2hYg^`jh|hAzBEXK*P|{Gj- +)>1nbDK!-u6D$R*4j_v@MN~h~vR)26%bg)Bo$X2_#DrNy2Tpwls%MVRQCHbTTpI|n=Gn2-Z;Z7jj@R} +~Os|REw6|^t4il#Q^897h46@0j=3sQCpri`i(vIAN@>lz(}u?;1Z)}2#kyjmp|W^bfiU${;R0la-U4S +3TPI|fw=0n7m)@c==48<_o>_e<{f7EWmEjJo}7=)^TfOzHEWGYa6ZZ$D1$yFG&sf_>u0h3|Nn6H3$_+ +pK?=;%@Wf8$3tDjrruxU>gQyOf0uiWI{Jf(Tfc(DrBJ+cZNCjS-+@f4&cd^z438+H%s)L6x>f6THb?1 ++>IJYNjq|pB{H}2(v~79%(H6E=*{FY&dmp-Q#{1O4~F!2OP24b#s%Ta?m%&7qe_WS`ou5qe`KfRXyV) +Odv|Uhyw4J#@B@b7um3@_#!0pi?8*V#;QhfF0tMokfzF;Znx-tnx=>^pi^og +JRxL45wj%nla?U^03;OEkV60jply%`ykuG%omL!$`uY22-gOPjn!ON4IT5sr)io3(ARC`-D*Yuo)a8<|Ea?)UJf|1YW_<#Wr4xeM;dq;lWg +e=AG^%1jK7-ZuI{`-ULy1L#3Jzy+1F3dwO{7p&LyAi0bbAZBTn3gabiC+`77g +_!+OiW<4Lun!R)%7J~fn5)T}K4F?IyU!|lgl9kvaVny@*lhKgJ!2u&VTg<0$pwme2W$A~2Q-)F} ++fFI%uBc6Q&zt4K%M1&H(%@M%&QFSoQBddG86aCT4EV}>hz1{gUJ{bm){fd5_p20eI9nD$s6$OVC@sk +$N`3CRMh!ocbwz_hU_!nG*r;dxC-o1Ns@xkF0YAL^KMvzUPx$t96IB@#v7zVnKg}oi;XPj9L=MSFfB# ++!|xe0gY0Et2vcd-CRZT&?p(u2gaqDSAMEVZQ*@Wl;1UsXtsW>UPS@co)k7x@_!!-S_nEO_pCgX9A_B +1GX_jSteqg{z=ZPKykrjd@zKgQLT6vg}^n8pTi*d&n$PW1Rg`SEpM4;p94`DQi+>fqDgn1a2MKye@z9IDYBL}gKlf&b0j(C +RKdwfZhtWBf9)f`HR%)=~#cNy;>rscx@83*DE4#>?}Kggncx#1sPCi{w3iK72y4-i6^Qw%r6e+Llx=f +486p}u^yZ|6fMlCE)jMn1@4lIG|H-2pvRgh2}$KM(KM5)OseWzHy0sQQ2V;yZcjV5K>lY@9yf=*9*HG +WMY9{#xDdw0IDk&6cAEyPeSRxSbK^8A#<4ZHNovF^HWitSAUQoDTE-H$Hblk`SYvyQ^z@e8Yv>*Yrq+ +;_C0}=%KI6tHn=TH;L)SHSzV4|4P;XUTQwWJ1-07Z#{C|ZFjxLUcQU)2kJq>szQ)wAEM@l=dg2p5ROWahzO~Vk22m +z|PKO`@6Cey?;q$u-_vp)ERZ7g>eY&VEjS|1Lfh`1lY6`I=1;n~l<*`S_T`}MbR+cATt0N_Re#ZCf*_ +aHYls^1HQ(PoUJ=SPBX~Y6!+xr|88Lb%&3IQQIL7htf0Dl(BOe{CMW)hZq7r%^(QvU`}O9KQH000080 +45ZePW0!lo@M=0p;;6cxu)WPba8homUUayl(q%m_gwQ->eV{h~~(f~{6rV;U` +1D<+FdX~X!YR(WH@%Ke^9GNMZ|nTtx*rX>^QR;6N9G`W!#*JhO|U8LM_PhauvBYzNeQp@M0P)~Sjbe_ +u%-soDiFj#X)lgVVY;&~267VKm6i}+t7YI7^hPNjA939q*~uWL4ZF;$!2#MaE_6Nc;T?9ARTRrw@J31 +Gnr`7BEY=9t|tYPR1gIz1PKC?PJJ7r>gY!HKFwxn_lhj#=GocNUJj-+%1Ws`x +n3^sFT>J3me!1ysog%>OFIf)LOVJk(p&euP9~QAUaKdWg3*oG@h1t+iTi>-%JPA2RZ*ytnL`Bvl`%S) +X{Qsf&9@-d+8CwY-`oUp#%I(!=*1e@+nRq!;?t>ZY +j)C^$C*`hLHELq7f{xU5rh;GI~wzxx0I?ti6!7t71*SJ)3Md#m#D!0?dv%o8(d*k0y2%awX$O-1}Ucd +RO{DlNGYo%M(_ZpiXvMW#y8io`bvK4$hRxCbnaa~)VuXwT|RDUIa0{9R}U**SIzUC+H7c7^Q(PwgV}* +R@+9XjyLaCKce_KrP_EHAl>vG8YJ8g+q0VL3Uve67d?q#B-I)tu*-|31Mv?dOo*mg;}uAk#m(OW)b{{ +Zsb99zq?=F+`a!0y-a*OWJq`t0{Cba+G +@P6)yt<=;|6muJ+GxHtfkbl&S9q_?O`GjRdZo3})3ZyT3&peXK{L +#&INzmupC!*m=Z>#4m{n?~_9a_~Y}%&Nc6HqQVxa0*aY$#k&6 +dIm)agZUZO~P&r+wv0Sz#d15tDr($OVe;FH;61`_*}5sP`;p|LHXRL3%XQAbQGN_BxWhuh_Zk}?A1Qi +hxD-DiISm`AynaZt_~u<1u(DA6Llbd<(CGgw9J +oMlB;)i#}lw?j51bS}>^8M*N8cGaq=q7HF0{@mK-VQ?Bf8bluEwD!w=6gy)4qT9s!FeuqO$r10kL@xor-P+qzuh+);-VGhw!;Lj?}rRxTiu=tCdq3S +7V5bpe9vpgHtli>!Ye&D(7+BRa$)CIB%V8O<}}6fxuhwCtw^i~bd{pSo#a>PUOr`~KS2-GRB!&s#QL_ +Y~{dKg?CWyLSK0en;B)ddE9%ZN1+G#Q##+Sg%j&1UyV(4vxiHOlNnDbo|@ds2wwtSLe&MXEvn@=4Z#g +R24tuil?W`Jj$}6euieDgxygix<`|AnwuoJV|QkY8g@j0N4IJV@!RJ&C#HmGcxtDy+b~{)?!&fSZK1b +?n3Q1~d?*Hmo*H~CF~mI_DN_vTonAkHh_6-?cD*%hZ1 +Lo((k0cyJ*a=$NmRYUi2q4Zu$m;=Y6jW!vnQ8kK*w5iRTS9DH_-{yLkUDK+#(g&@^Z`6L!JE57$ji>3 +0dVn2`&_?DppN%Bpk592s<_hkg)92%_aLVgIJ?P^oz707kicmV=64ITk!67KYXRlYDsm(X{vh7| +R*8p`e3yz0tx!df)J=1wb3E_B9GX&($$Q3D>`)imlhaLcqsqc&!`C03x-CjYXGE18}pk44=@OI+pW^ +t5W)2}Y$D%X$szqBFw{POareFl~z(nUmhu`9Lnkwd$wnXKn#<&)uY)|SWzWth!t?t9J#85ilmo*&s{? +GBBtK2=F-wDZ=1KGB4sxX0vi-5WDVfN@(>RyM;eUjH2HJE=GrdNDTKY;eYSR(SQ)QNI>{O+6gS+}iY` +(-ci<^zaHzYxGan1qQJ;A8_|F_L|=Awo~;Bvk~nVTiI{wMgI>_O9KQH00008045ZePRaQACO8`a010F +O03QGV0B~t=FJE?LZe(wAFLiQkY-wUMFLGsbaBpsNWiD`e?L2F98#j{Q^($~xrARu|M3QsKo;KR7Ez4 +`|+LlXF&b#GxkwX$BCmPOh=OKps;ePw|1Hb?na3t5}a`)j_iA>G_jqXOH(Jx?8jM%(l3RO3l#*E +o!bL~IK%4AD|nZ{e#f2IFxSuR +#Kb2L}hUG%icv@gj{Y$*e90`SfSNad>t>+?~q>h;5Q3)p$H8Wx9YDLVfUOG+rb{S&ge=2gBVJwe()k< +0^(X(|+H30pq}Pl;LPDak_wp5*`kQ_Q-&ETvde{d?XNg3xz_$ddh@qH87A>!v<0_gaU+kS%8v-$nuJw +HV>^4@Wp}O+G9Ylqe01{azKM0ggEu}IS-{@wZJw|-gi#tGip511(1SbL2?~6Y0WOBw3uM0XS{0=*9J?eSU61ME_1&Ax8};xOo}SRt+mA2azP?#=-MZ6mf?RD$m9zfnu>2k@gAV!KLGNs937N%Ds){)vnDkrjj== +=zZ4b!jHYBDdA}P+TpuypTknh!>SCM75HF79kq|dnA4D)Z5%^^#$(x_ys^X(%+_#5r2`U`4)H@Cn;=i +Vi^}x*pEd#Lk`7YNr)s9IS^BbB@7^VM=pcV_Rpnh5htD|QcJy=xH_vr*^M3Dt!NHQ(BmUN!fJ<4U!o? +1OIs_GcXe7NEp38Od%Yg3EHq1QUSE8F`uwCJ>1rWB?csu1qeMwCz~(SBU;)JsQcR`HM7#l02sW)M7cr +2I_`saRZ27=cS?VR5lPJbj(`jV`efQJt9Vm)S7Ra1fT%diNRY#Yqg#oo9iw`7PrgH|ECS_F;xEXg68Y +oB%KF$m50Y6|R&sNPwyplVyl|Y+9DKcCM>)H`;VlK;;%AGTFOPHKbs1o&q!8$@ib2AtY#RB<=I1q@ag +aNBTf7Bm-ZU$SVb-D7jx?^=H=1MI6AlplyA^?2N6?n&`=JI%|Dq;!Cjh6z|JRlX$~?y7jZTh%)B`)y`#BY%{Z_CZfeVD20pB3$|LoHR6R7rpG1i!1U4ty2QHC}88?=Ec3@;_#}zIi6w;{#6$5(;Z +`DexAXLTQ$mXsxjLrxKHb!QSl_qes8SdaCXCi=JoCx4cnj%%IH_$b&(LqEKUPC4M3h +#a7ioR7NGYaGjfH2q$HcAwW3L*#9Bs9>!sM##RlBjG7?wNw*iQI_!hQb!8@!=8m!(Tk!3^B9nBX#)a# +IyJqURv&PdkJCjV6zDUk47JJ(>FMK}0&(#Rfuwji)LsGeY!hJVzutXw=~287Ja1dmghEvr?7)+N6;TM +oY$vz46PqkB#P5v7Y@xakfwcmZlxtZP7f9aq*y^bn`D#ATv4y|)aEr+%cYEL;SUxYpbou?@pUowsvcT +))4&e1A87b$N09iam}`tUyPiKWD|*|ID$L%U4%7mlt>A+q)NcKiytZ+vmq8Bk}zB6#qQOKi}h@-+kV@ +FQP=B_W?SiT%M!HG(!DS)#dr|NZ^J8YY4xBwkY8nwP;&!xM9vJZ09ZIb6!^Ny5om!D6Ive5ZdHd+CQ_Jz4?s +<0Ri(5(4L_khD62W2GQhIXadZWat4+izDk-k()e5FVgNt1e?q%9B8sLPp{zWV-l#Wpf-OD8h#odI-~t +oTFpNUTHaTeNt-+kunvIc+}tcHrvQp*_;oLW?>E)zyY#Ot8qN%iC>;kxf7tn| +Fx2)^PKIw>`N(Enf}&q(aV<0z`eB<}>n{eb-MrBlx*pI_NKn|(k6HKt6ayVNc1K!8+%pRyK!Zj>R_KtQYM3bJxMj)g +58gZLP-E4%L`OB|rEVq-L#7;b2H}To9sS9%YJB-e?I$)70`MP +w#1F-5bh*%@%^Q!FT}2reX#zS?8Q0=C`j+NZJ&#&b5?Cls{KD1Crq^P#zYi^|Sqz4?WAqL8(bzDfGm_ +$OGuRbWCgtDubhJ}+1C6+~rYo7IT}$|Sip~qEpR8U_fv=$WXfFjfXI5)9%0)SQhz=_6{jVsNSTP@IP +?`wyL4=G5~piDu61>nl-4SaDo&rQBSg`pQP0H&dMKd4NZJa8mN4IA+w%u#@zrX{U!3e&291kQ^cRc!z +|fvTxoVC)w?O)@evVeKW|?G8 +nwx8g;Kf!L-z&LoIC;M6oD0a+WO6Wm;np79`ILX_P2^0eDj>bXYDHC>_u<7{3VgMU@hHtb*;SLLuLzEXs=kvGa#p&xDX%^;Wt{Z9mV8BT*5D6I;Gc5I_z8Fu+W9EX|Zg0u{x3yg +9W#uBASXGL>H#!->j0SxdmVAspnux`*r9_eVRTA&yoS8!mH?u~zX|CjgIAKy0|Z!K37WkG4N4BduhkF +d)CIChA_$RrV=RZ_`Iq$JNmd6*Q>joE*;SlO7`gVW=0F&Oym5Dnau<74rIjt2p!PvJL>U~lS_zIk)`; +#J?p)A0YeWq8}+m&S0=iKQ+#NmfVohL)#^)?nNqnbwsgBVD3ej*DH`GB^ZbsN|W}fyOsi_6G9`bstXl +Q371dO0Y{FFt!LoX(emHyEW?e)I8NuCIh|85_u#%V2o%@F6g76Wzrf{J5GMIcyBR`iGDe0J|C{Pw9_W +{=eKMRWXC5yNjEwXf?%mlB(dqSkG9YIbgLP87*-Zv$bv?4xs8>P^<&s0&iiU$dj$JclRl!v>?WpiG2D +G&uiNAZDZx@EhQh?9kn2jZ-zD$J?7QR*GwIb*<_@o5GhNZqc65{+i1KKfF6y1* +n4-J^Sodf0Q%v6{vbl?6&vL9vbvq6`_)TNfqG^>C-b3()BMKL9o)n?KGp|y{R>F`VQK$jHcX?#L{ivp +;2FBLuG>L3D(i5JOgqVEaO=03gaRlu4wb#w5p0L~Y +`zo^FRcIT|k+_a$Xa#k1?gE>D`MCvW@tPH8IRd)5nfUU`))SE^6ENuq}8Ys4q1Mmn~o6Zblvr2R$;J7ZKTNa+mvW@7|o;^X`EOwd2sVL6 +ZM$0%jtl(mN(o7Y!=eRp{#uI7@|-&Xdqp5b2l8EQ;@sPKzlc8&`<>MF7W5EfJHs`7y1bQx1BLcpw(6;=c)3OJ@j`$mPXe +znD#E)BN)u>}%$a!Na4$c-b(2Gc%CUqZ3vfgGN3pnrkp(L(?`#*iGn#{OJkjY39R^=HhIpuZ;(!&a}auq&pW)M`<|641z +`3gb)loPe@icg@l4jaMB%Nl}X-r2~iQFpyzer!D-Z+i;xQ8H+Y4o!3vM90X}xYEs(;(B)crG_+v~m&(gD4F?@6g#6rF$~aUB+*#aYQH&hV2yt?k2oy3T!-nX +|sTWNcCco%ydZ+K@5PyibdEy$!G#zapsB&QDd>n(G*$uOk#dI)jtiqD$hIEvM*cX^23s&AS1NI5`IpN +RAE;Ja$yyV4@|wax;$vgLV5BI-96Kmb>E&?lL-lULnC#6G1!#L2WW2u1qEla+8T=Fsbq|AkO8?8(6gKdbY +9zu~IUPh(#z1I@UU8>d6O({qH`3ZO@(Tshq{EGsHZXB`Ul%*mW3jEy=JU1d$fXi5Q2C&Gbc`rVcnWuP +r*d{EL6Blo3CVl`~q1I2`Z7qr^qeT16$g$PX%!_eNJ@ycVgh)5=$tO*ddlQb|2wT$QhW)L5>b?r??{i +79N2ni5<6NvNC<7>+A#m)BrhWtFPdjr?+5oHrma$!f4^^5Wi4!0>qutbK)Xp+7CA;bfwYa9DT@u0bCb +oalgoClipzrkq%RFh?>BE-9;uqVX6FO|3vcFr?I~%L-I$1#`V&aDFD-^@aVi8|Pq_en`unM{%9BVJp% +B{0gIiA21PasY2rF+AKfvD6~rJ4udQkn| +5}TrKiqeWbM2>`c6@m&=_l>!Ua}*N=ydXx{r_W+AiWYG?$I3oRxHpa*yQ+e!-Wku=GJ>Xt}p-Wl)lYbwH)8msd>A?`HG4}n%n+?ENA@7?fU6sS96TkWf8gWVVeB-dtJ +*^Mn0hdn%d>Bp-KWo%{VtoPCXL$-ZL!o1R`M$wn`1~0%U$LbBO^wKx +kP#CEqB(cf@br-a9TGH;7-tGxG6HxQ2ZGQ3DZ`yl;)qmX?F>QjKKLNpZ5GAM +z|0G>o}1I@&rgh+CCPhN>utbMVca;KOudjI}_nyD*uw&k7aj@rT&aoR=x^q($rYkS{*A1N}by?K#`sY +->Jm&Guu5bRy79YgjOT-W^2Qf_wU8xRE0@<|L5mf9NupXNhVKSRY#9* +R&i3wN_st1>#}j-QINMCtt=j+jfbQM{qv~jb;&@j9wmzZO?q*#jf;w{%*J;ak*;mZ(bQ-ouat(GvN;J +#!`$Ya6H(A~U+>Djxz(iv4lbOH%rk~CXgwHS*ehI-ajV$LhY~Od)&0wW!sjG>+P`o3cDd_D|g=QNgEwDM6!1+fI#GD0tx&t +yws@K=9?xG>eSSysdNhn&ZZ=%>@HGf&JDL}Q<6}#IsaE)pD*2rDe-Ad|$?(&0Q_|TkrEVS0#hPk_0$sm*azXW>uBg{1Y;ansu)<{4z_*x!lt+Q# +15r~}zFJVd5E`OqPxK0=CRG#N#CTeEiBzKHm&kV|J9G!b{c#yD#QN^->~sw!8{$3y30$ +>Q(oM>eJxbRPG(IGA7OX?Ke^+WiS75Kpdl=&W*xv(6%iP>sX?S2O%35zo#XyQ$8+k=p{R5Guk3W|Y1L>Xruj0NIa_h#Q-+SA>S9L!isfJ}d}H=gWt=`=8mM{a_>pMeYH_B!^%0CJ; +yKy=|2;IfhoZSgph-gIyDZA1~q&T3(QLPMYMeAS@T`U+d1*6{Z%gYn=g&$MC?NS}p +Z3L98Hat(&++1aMf28CqaJBScPy2nvUmcZzetW;FgXz0k(1j0;bm>$)S($X%oa?i5H@etFAI4v=H9F-chhS_dC2Mx7Fe|Ql9t=0KT{z3zV*i45gi*aSks~J4fN8J)Z>xVLucU7{y14pRk9 +bNUE$K1xZozO%xISe$Il_2Sh!GuW)zeUyAM0NAer-Gx(?W!g$e*NhgnS44M6^xAp^W;>twmAo@r2+SP +uXJtG&eCpX=OHEG8kXo$a>quAMvgXURXb)4|L=wK;$8sKn`DHJ%4W0n>Xe7)EN3`FrvA>`Y%DgeRAty +h5Jl%2}k*d6guzI2pxTJXKpJm`B!?!)U+}ntjBxAErCJqA&_V7~<9S)VpgvdffWRd2p)^`S(^)4u$1< +PgTQTu2qeVxkRPadCAC)+Jg|SpKjiA)yr0yQe|G_orPr7C8cFZ>E2fh`$k0W+}s!GbTSwApaE!EFV=R +~B-goskxQSw%ZR$u#ri%sKMaV0Cc8ld2vm8o>xcq+Ek7Nde2!XIFm**t?TDg%gW7)sP)h>@6aWAK2mm +G&m`(ry0006200000001Wd003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ7`X>MtBUtcb8c>@4YO9 +KQH00008045ZePVO(B=Mn(`0L=mb05Jdn0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJEDBaAj_1X +>Mg-Wo~w9a&K-faCxPX!D_=W5Jd0#ip3Y%P~3YV2Sb&RL)_rF>7f+k#9K#TYlS46etwmZ65DA?OZO&r +n0+$}f`H`*X`!X6YY?=dURLPeSSkySphAax2kwB7XbnQuQX!z~r6JX#axn|M36rfRp8`tPUzDPu|UGY1ZmyN{;W;5W@6aWAK2mmG&m`((DUlDK&006ow001Ze0 +03}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEEaAj_1X>MgMaCx;_ZIj!!5&q6!fy$GSE~Dew@wb~Q +or`^TZeqt*pWIBR%}^8xNyw1|Lx8$dJMC}pF5U?z3+k%q1;d_= +-K~hq4UXU`a(k*R>+@+GV0$#l3d<%qEbxp3TEvx8MM5|99-@TzS+mSok>{&+1pLbH$;_~7mD|nm7TQw +=pczKc5HC6L2a-NBc`XG0_x@enXgABf1C2^wrUHEe)nJB}0^-jD-t8v+6pEK_pEq!VB68cGSTwfsok3RZ0+i$Gq5ZULx$5tG03mSky#W+0 +bYkqU9S8d`Bh9+=!Yx#MmJOj#x4LY~vjhGvrO0jw2z<$+|Z$=XuLw93%Lf)u>k;$O8B*Ukjb#nLN)eqOpyX5=j^7h@$cjS^xWz*7W6upee%?9} +^{3*1NRR=Eerl5}u7)MW5;l|9k0M*PDXKQyA0{}*O+T@Y7eb3~GA>K-&V8^Qs+qR8TJONiw+5yzSep$ +n-l2($qeaF!RGEAgmaguCW2`Wtz8*tOL;6*EGqQ6IGm~s15@a+~I&3t`Gn+m=P%`cAYG`j~0MJ(83T= +G3UX~@ExM!2{RW4~}#MRpo}%&75YLork4K{H%84R7Y|>rZ+`J@7t#{77YU@MvxuE_ucaZ)nL%3d-_E? +(W{HZ_$|(!9-BI{zv`wJq11Iq9YPD2+FRJ|V)AeW;%UJ^}6=1 +_kNSfw^Z%kY;p`FmOg?-Xo +jRqug*gbKSDTO%PSy7NCWtfYqFkSYnxPl6-3#woHIa6i%bf2;ULs0Ay*^nwFEo-F@9sghs>}n*u& +QUj;7R1td!HeRet#z;xN7qV;b#uY~rIK;URW$*-d-0rFTc_ALa9DhD|*$WlPzd|(k%8`zSEq7jS)D#YVMPB#$cS;b_M%mghqbFu@ +d(nc)M>E{Ha5To|nJ}p=dh)puuNVY-0po=9Wz5~QgaCcsFKtbdP5o1%uWc +{JqLF+GU!M-$5H45cz!VPsu#-wcj(8qhHC8Tct%WxwlJlcRa&yVd4K)k(=z1t_188DB=-+zUR%*wLK! +B3!pYifX8v}odjNB_oc-udCb6W*F^oKVMNNU_#1R6uZ0rdCv>?xalUhRJFV6Z=(dNAlkFokc6bx+>4A +$wP;Ay@^A`dB@Bf5ksnQy>X%+fazEDUC$%fipj5{7yXhYJFSq>sWzfBjN$zAJYk +To-Z&%)WGY4&IU>Cf-%V+wm`m)Az7YZ#|F%~k5cTtde(o!=B$Pxrt%WPVdA(I8YGV+)yfDmf=b+HC0* +6BIQ6Gdf7Kod8cwwfN}@09!k`mF9k`g1i!DMa95WU&1ngJXd3!dhxtmD_NnggCv1E2u1Dnl(SQ6dd(j +y1pFx_EkSg3UgYrg1a0*?U1Kj54Iv>4UM+s7+_s4Y+1{a6Ph;ov>oylhj@r!{Xr!vKlda8OeiPX2=*F +Paf7Q9t>229lfs>jtj-bneKUz&Wr@GLyy^Icxm*gukAz!&P=*x!%QsRYa9gw`RW^$I~Nsn|k8t1!)z- +6v}-s={AM!ttw33Z``@n5`*s7I25>&{wLDP7L$3mxl(IhZo*01ZwPyzcA!8F{s%*}ZD@-9ncC&;e)11 +Ha3gXupJ4POQ)O%ZUu!eA4&P{w0AYU|%}|TKpDjfdzT_{AEawAJa%Kh&uj{0-B)G=nOR|B4bu%4aL@B +)~mU!G>e{WbCTelluBJ^!2-r}dKwxRLmBvp=ErCJAqMcYfE8$OYoQXYgrcCdP5@~NIfq$qTDU;Lw{cF +_?RGZ#Xym~D>MKFczeTrp3LXGF8{p~ZFPMDP4nJ*y6ScX_sDTTr=dkq^e*hf_&i +&Ro4=<*j&^gv%LBBOJKh%BXZ1}09wR!Wc1JP0RA^Hr=?1zWP~93pI}2iv-rH=d;B8#076Wi~PmgL_Vk@df`8F7~tEOQ)6C(B_G9TXJ9 +UPG3J!drPSfnyn?L!fs~n5eukishr}4!M(Yle8AKBYKlr%MI3J%0Lfn831_>ux~DmTE-#IJSd44|G-b +#KnzAGqJ%V|$s0$`%llidTu#;j9hM8mDr#qtlP-j15#WA18Dh)aA9t3#90N-ih*QfrK*=zvR8@#^E&6 +Q0~jT)fhf8fpi9Q9hZ(EHWE4(~J(%*G<1*#R#w9xLd1!N4k9-L~|Bt|AcQ@ppLMfAeA1-?d>o=-o@PU +5sfbffs#B8`MU1*(cT6VnC?}6VSk*{qF@9_a+Qz$JP8L8~?v;CqT#|82OC-tB^f<7Ndi-J(1~MQn;&H +L5`dS26-D5jE9Pdv)6d;>|f+fRh&-SLdN~5k0;*v(~y}MTuqMTW2r0eruW^u=ox|NB@c^&7aDjGxXJi~ +2pY!_4T(O~$tsUYQy>)p->Zh5bGq3-~&1QYaZQMUP6gA{zT0;%`rLKWBtNY~zY2tT~{Ig4*)v%syE-QC*Tgakiq3 +{s&M?0|XQR000O8CKQ-Xgi6!-tpxx8YY_kdCjbBdaA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~OZggy +IaBpvHE^v9xSKn{jHV}UIU%{maBz3A{uj`8eVK6c;4VI=w9quHFz@sVx+WrBtzELrTu`kfgj&f~_hA8CiWMAlQ8h83?HaEk>hDDJvk)Cg +YGufGOE3RZh>&Ql3Gy;e3-rl=9tKc~*%$XRDWIOfQgU87Ru~Usx7T#-kHNuoiqrl4M<}NH(+$W-vQN>D +Kj4*4DM@pN)O^LkXf#4ZB<_ItNm9@q<`Lk#G^bJ$O>sY_e*{M`9TEI#M)d#XuFPSFktLx88B~cEDi|ltdW0KFqI^}gnS*6N`eSUS%)Sl`VPr+DmD`Tp5NE{s)6 +f5*1yJ_FoaF8Pcr28!}}|Oa1cCpia^+SNtHG!1y=~xHki&a+B?z+w25Bzk)fYjwx|SO(N+GLFzfTzw{ +K>b*SEL&t)`x=x!6(Fxhm_{QHkZKxyZDMd7#%sM-!1%iNze2PIr604x&9_hrDzi&@O8Eh+Ag*uLZ45q +On2JOFk*7z~b9Ckt}njeDC(w3(4dl269Z1i`ZGV9N$G%sWUjRb)q$vle@kJvK1p`PHPlUC%UanZ#Z>- +M&5zYWLt7gk8ZK#a!c>Q)>uM{Lv7!8of(mZ?ggISgL1s>Dyhf{$UT&b@Dd7AZ&?mRz@I1_dJqJb(1wI +8>ccLoUD8F6v(^e?;F>vfXQtp0InAt^NtClwc`Chd@2LA73u=2K+H$GFUip +L3-oqBC)==d5Z?EetZ%Vx10m>J%oIQZ|Wp9qTCw7UR+8Mgzg8gL#z;ldb=~&fu{ld`-@Ve+4ESen1kF +OEO4t6bd_Fi8(=%0}rC^AyOhAU=eXa`cFZXPDM?2zAKM88L&XUIop$*IxlC>4M}6a6^3o?pCOT+SBr< +jwr%W_B_6-BAgGV^w``Tciy>)xN{_F6gBnHSOek7xRVJuTw~_c>zZj>K=~ma#VWFH}M=h +KHh1&#*P0q%+?E$imJ+Bwy^bT`^;V=HVYEhdG+T +?@@+!}o02!&7+Tu=>ZfTxFv4KIm>dH5Lnmo|FGKIGMEuFc#YZW*oUhwtBEw0u;?=w?!p%>E>iZLvA^r1DDT=L@0PjNqpGvzKV^fHJV@>U_9?`+>=R0(T$ +0!VjLUM4VIV_H?>3Lf`9M490;J2J^bfs>4kc^h#wk8`XIe$I7x|&~KbW$>4=b)H7sZVnQO`3gJyq;e# +F3(+AIz;y{XCuwg=ioijra=q!zxHqf+?v5$Fr9A&35wkr*~A$_L%M{?a`G3IkO%n{jCqEmWBZVPu89W<({o4J8CI?v +V+4S1fzcdP)h>@6aWAK2mmG&m`)=U^q8v?007TD001Ze003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^K +VlQxcZ*XO9b8~DiaCzlBZFAeW(ck$iFwWeF%E^qKTs!x;Ri{2jZZvglKbCUoHItzz5|UU`1PhW@bT`- +E-rWU2f-kb2o9D~ZdfE#~EEfBY-34@XbmYutS8Nv-8#cS1`p0>hWkMEgB_zAu7aNhX*B-kRNg{Tv*zl +aQIL!-LhD9vWoW(1)7bV+?GKridzUQnE?19U8wP%Pq1yf-)&s5-(*SV* +reV^D-61OL(v`uyDh}`#4?yffh|Uk8n8v3Zf`Rf`SA{k@rMIki-#8avCJSJel)k$Qr9d}C5An*h +%OAexsB@c^a&o*4*FoTJ#%-AM)KuJiR1V#M70bs>*r)*OTGr9-3GW6dpDoo66>J-++$=v$odlGC{lC`7O=%4j|(1_c_Fs(&wR0PwjwGMF +m>>#pkP6|X97ecSrKnJtJi|jEK86(uw%7w&dMAYUMvj7i;;FRSo=)NvXJ{TdcePUOYVD64i(^6Ny;74 +JpLu*S;3~X#zaaX>xHu*&mHF)qQqWX1X|h|Fn?B2&w^Yzu8>>M+Fpf?5y&KBaRF8X)?fk#p_b?R&>j0In5w26UG_ZL0*EvF+We^Gqx#;EI)hoil^Q#zK=5=#epZ}`W3#tn +sEv7#lH@=+@GeAwm_O4O0-eM>QiV)EIx=REM;8mef}j&L|hD=BiLlf(R_bZ79bYiH)a|vbCHw<_tm@O +=JDQ>%@%5+Y!{O^&Y#Axmz;VhG&fAZEqmv?6Iu?QhHWP%+H(Os7lvSrRiZ3Lj3Zqrycv +xXnQB5T4Db(ou;=NGL()L{Z($dKFtPv-A#-j2F+Ak;pbHmA_1YR0c1@D;{ +yh(OYXxgdzm9(Or+~jOKnF8V@`#a2tYnZAB*)GW@)Vz_5HUT5C-#0&Hu!nB2|%>znIIbFm*Mchk$CXkgTYy} +6xFZ?4a;df{&;le-rD-Q<5iOz$Rd>xgz>9{aX$769P6fP?}fih)78y!x}_I1u1qP=`5h&5J8|zn$`SLF;(L#PaW2u>h1g6Jb1h^~+uZYtPXGDav(G>? +o=Xa4O^H@A~(RFjUY&B=WbN=AL5yAsle6sp&)B`M59mwToQn!c*VNaz6neTwdrLC0baO5+j87T1@Ma6 +cg!1)?PLn2wcvFn7d%e?+gr&OosNhp1FM$W2XpoIsImDr1EQi&!kMpoRd99^sj9q}b(bVdWAF>|sE@y +{Dog6-5ngR)-CgLt+tOn*pp99D8A>T;uVnce?lk%?%!cIKliIp+pives6;BBYC06OBO`VMAN^{w53$Fml<#On3C|F-M0}_Nq6}iF%Pjugqk&D&z|>CLIL}oNK-XSqk*dc6>AeTisc?4 +xj^=XD$_!9ORFetzKz$G_f>XZZ(mT>#{KD$1oOq|-(ViJB1*i@S$VO_5q1C`H;}lU-9nP6g#el*Wm|Y +5)r)Y}B9EaLWU^OWKYqcNNIx*XUTF_|WZw4)8?_+w`#jvFj90Xku5nm_yiuY%W{VSzTB5ep=d0v#}6v +?X{&BfQ2*Fp3ENfl6Tv*>z;1tOc3lu(~1kRztl8=}wPn+f&eRMSUpQF##tGWekO=mHcQ$Vhkj_DUI?t +pP<9#-xt=dDTKBXb2mK +iBK4H0+o!-3EZiuQ=xh;*qIO&-EXjUM$HC;FjS($M?>L59Iy}b%j55vi;OF=t6-S}U$^@Y3edj>M+9qxX1^ +Y*tgW`e}wkxqK$QDSHr-)jdp%$?(MU9Dw%(OxTnO78|bt37ew--E!IMQ1Vm>&f7t=G$x>g~pv2iYC$= +h8$E)xxZZwfl554Im*jt>Q1ZS$rx7FFh#r%7HideAe-D2scQZ2Yv(|iD{Ip<_^2C_($3s(?6dQo>su0 +d!e;GC?G8{cM#-Z977rNEwcovwCnWDJ`AMm2LcF%lpIQlQl(=t3?8FkFB{WaDnL8+p)$#WOwW3Ch<2sPy{+mNggbKc(+}O=HhfNrKzZFdXLY@?)cHv +!jjz(x<4>9_+?xM3?g<5#8Vy!mMR&sKSJszA9>WI^KD1cqiZ3z!cUI0FJeml*{0PPBE3^s8SdgxRq2&KqLKo&B|A@#$~Y +t^98J@s17YfQ{gz?ova#ka+Y-OO`a{lSsNCvEjr1_K+3>HV%CEg@aZ&aYXOn0f3xzi$RMfK3D)Wk6VR +<6@9&WUC-Y{Xo=70YYRbmZ}Lo>~{QB)=yN`S)_L$FLWF3MyY52j$XkHJ?aG6{ePNPWue!ixD+Lx?9@8 +B7GS+#YZV0}<2ooBzRij~^~1fk%YOQ7FGPuz_qJ5WB79O~>+5Kay1ZFnf8i;YL4v%^_ZdeNwA)e?8e% +TdFwt`p@yT(hh*%+)_0iTpOUlTwrEh#s8xCqaFD)6qfYN{rLZwMy`8p%5`G->5+XXTOZ8vpvR8xX!4F +39%vHk}N&g0_lE!piz +Ycp0q3c|FtjhoJ*y#2=itwyPk=o4aLU1MGZhC9H3w;@fRDOq=4Fjw*5NeC{w+{tELHmG7ylMGd9c%^$ +kDl-8*I5uHlfj9zhij2R^hfv9$LfR)&_@ZH8Vgl(^`>EE5;>$2>YU~yYz>fHtD_ZH9bK44(O>`@*Rg5U#}s;Y1TXE&8g*j?ino-L0Ur}~T +_oVOi!)XoY50)wfg$)2Y>uvKSi>jq2z-&sF0crt4HL?NKrVx|l3ys21Qvi12!Yu?+k1vmr>Y8kNVVd^ +$78`{HNvV$(=^iOJtH~~Me+DDSg(2HbFs?D*gmuJ47#yVPsaVOdT9dbQ>3v*-x};$3PF25Hzzj51yfF +1<6$DO-mThOhJT!s3gUj)$xkhUJq=i;6c-}Hh9F%tpHV|Lm_qxBl$ihxyx^kJtYfd_Bg)N7zK}co6l}ff%xdIvs_q +2m%O(R0*)I@~R1!pZ2SBPDH#inycVRGm4tJIdKVgxb`6i74`)>LO_4&W +vQEXaTj-oLBzwnlm|43hXHdp^Oo^rq>D@Vv{@{}j&x5xKSYnFkxvJj}XA|J}8IPvkOo<@ugXkk@XBr) +@7GSTt3HVKy5;6g6pZAzwJryuc@w@0Z56-&p$zge?g?G8IIc-1UUOa2u3PlSnjsXk}5bPd%?lJx7N5J +iyqbZ}!QTuM#W;2#p5!w+?16KKBko{u1wr$rC=}E<@9gwCulo(3 +~ArH;pQ?{UNyYnBNkSwIE`Bgscmvql&UFE8QAkOz(2CnXV`ly&8-f=8w&6D36l;!VNnPCKp}l(H$9lJ +R?+~sz|I|(zS`23aSFvTy3}?|8M`GWebU#rAyoZ8(;*x>wsg^7adz+SOb3)Uv_(Vjgyw;y7nR$rv35s +NtqGUYtI7PQ+lhZZyFMLtpsfa`wdgMmxPfj#56)P3IoBQFooaz ++$1XEEY`R@zhkvVKa!j7=#HQO_f2KC+0Rec6bUdR{@mVy4Tw|%U&#MI;#~3A9W#<1b<6n-?{9bpSC(B +nG}TxMbcKQ`Hp85oy&q|@N>%)!s1Ko%Ak>H1Lv?cP3Rq|)9#=jU(}7#M%Uxd>X@b2SDa}yk2OKeQW}M +Rqoj_@UPL2C&9;u!*EHA177allQUm2G9ES*3SM_{!iUY(SycqbYUXL1s7N()@Z2#H%*ygmo@*!>wKMK +AXqYvIa{6x4uHv_RD5sekywi;|^=Dz+lg8_&9Wz*4YleXR&Ev)L75Jt25tr?u-oPO_-hTPTTBfMPgp& +3)RwUzv7AZ!(?r|MMOKG5xwtDt>6oiYnq#3mw$3@3DaXBlJ|VEh_me;Hqp(dq@WO?qiErKZ@O=@t`#j +*jZ#APa;F7kmsAjgR%iGo;batD?j(*dl>ib_Yp#3bp>-fUEEf+hWJ$#}79_oEm|{2Sv<1-&?ZBE6F<{ +qqe~7^&xGrb18+DwnNt-ZE$8VK8H6nB7z5smu?blmr($_+ZP|Ily$M8(7w&UW_NK2!~!W2**&Wk>C*) +gtk1@QS4F928gF;iL{}oi9Z`3KwYcyF>qYvt5B>&9rM}(NkWdJJ1DjmFfo<6rsjo9(N(LV3+4m#UYnl +zCt(P$E*`9RX?N%~S3^X%tD=4(q=mdx7q%H^OrD~w@rQIvGUBm#nTN7{4oJQs*c5A8Q?ECw0zFkH +*&zfVXf;=OW^RnQ%W@t^FY*<0qeWZ%?(#UsGFo*N4AkiV9{>Plb^rh_0001RX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#PWn*=6Wpr|3ZgX& +Na&#_mdF5SgbK^FW{;pqvcxub?MCOjiNjBw+H|x=OGOnH2KFhOHd#MydQIN%$BD8$5MtgPt{rUwU0g# +ksXSeS5PL;}7B+zIy8r_Y?188q=Z!nQ@mCM^a%2p~bMNzHj-?_>~m8WSkJr)m1B;s3J#qEcQh#sOOji#v-rK$;3h0F_~GN>0{O~g7W7pf{nxsU^RCDdF%18TWSQke&WT +7dteOe9NWCdz;x8I{1Nn94Z9I#5?!Z-7oFuA}%qx|4&8Y$iWr#ie>kvO8n|N~@&=>cHB=QSkau<%f&p +ZXt64EIr741g*@7*i6o&DlNs;N@kPEhe5fBKpKl=RS>_Lb)cT9QpC}U`UsrQ6t<=5BlGYyOE+R2ZIFX +p7Ak#^K#n^FkM2-bOpXNu9gWgb=30zUp(+#T7?efMR=I+6>B2Pswk;fx%^v|XPBr7Eh(u{`&ibMAkRTUtvRA +qOEAcLjXeWEeZ5*EK^K0?-SI00wX)5G{%*qP5+6WT4&>}A?$=Y0i1WU1AB=KUff>DFNK +|CP*T$ac^m5)_c=E)RvXjY{%5N|4Eo5rD7;KV>4M_4nH)RBQ{Oro|z_ek}S-kga-n?P6VD*X3j6k9U@ +Ufm}!u4+E;o1Um32x#1(wJ4V;Odf2i#>GaWfM%i3JXJ_XlI&L*L#yS<$zUMhqu=T280dzAf^?=dIzvS +tDHAa55TvIM|Yq0=@N$YPazL#bFt*Bp=i(E!HJm$e#M)$d#517{=sO5yz_*v-pf11z;7pClxq(-wZDL +13~ud&LCawNtom+w@S%_3Ck!9gEcm`Y&^8l1Xx!>E8MQihodK>!NORT$&MBp}LR5{gd4pdA{naV}{$tGgY|4NdhC%Zf8zj +RxOJYgcDuhO7ox>yq0z6ih9|a34%M#3Dg2 +oXFMK3>3|pK8+!P6I>}2(rZ@qKCK*nif?EL_I#bzx3IB)A +;(MTlLN0#4h6xKUQZs2}Ua&KVB8AFOzGRB;6qJk#sE_WiI3bqca|B{5jh|boqDZu`kQ_Qbiau)I3hY +-#k&w#fDb(g5Datk&6A@n|d?2ca&1mDDQnM40%yB>#Q8SFb^x^&fOw97AD3h4IItUzCUuQs#;v$)&g^ +5ry)F`>{8TiRCuC*)#17E-_)V4nO1podeN-O!c?lSlIk|n5*RvBRa=$rdD& +0N#b<9-3NXNgi{)q}YOJ^*5Ks_&0yWls7`zhV3ax7xGh}sy@iKa8XhlZN!CGQtU~d)_MPqCL +t%jd&E^g1mHy^IXf1X_Y$2s)i=$qqjzZzKLR~5u&5Uo8#DYyibTVtQzp1(W$_~AAjUtGUGznL)e^7AU +9n2q8U1*FgeJ|r^;wM3k(D3-2J8i74EXF7OuLQeQ^q1I?@-Dnkp<*dY*4x>D7J)C@mzD&@TJ06z&Y5; +*ocy>MsUw{2g_`~?eaPs~P`Z?+;Ievcz|Gj<{USECq>(TM6udzH-?JJLzk6wRkC~qlwK7RZD9REK#3q +M`lzJCH!T=nL;6}>i}!tTw}D`K^`lgU$AeP$0^t?ka_Gy2v$hT}Km=Z)d675m$KUV~2>23_Z=gT7m}= +Wy89)RX7I<1F^fgIz23xB0vVpQO;w7`NT4J%_`-ruynU!yr6kRzE}EpCRg}>UqC>X$|rwDs-%4+$AmU +xV(6HeT)$Tgt{3<6BJ)Y0s|y9M{kemD2f*#Mu#W?{d}FGdIz*%shPua48vNP7LpP +gt3>BqqEf)?0)in3r63$HRjkqw7E;S3gXPv|aLWHl9fYVM@VGh=L$}-a(C)RSapbL!-IuQqMuYzv3?M +XIL`77V`4H%j#Gc#2-oXhkAUhcQsm;*Oz$~w&+aq!hB~0tDTddhHiNL`ltQ|j%wc}k`JKo0H@uRHKxb +Myy72nF*&I7s|YvEIw3wLL4JAb<}_ynEP6?SH@t#;1aT^M{4bI90^Gv^pg(qJa%qBG^kZDOJi|NT*A_ +i}T%ib`0yo2);r2)#)E5Z89FLVy+y^;SdRQ0mH-0M8y7lSZj)G$|RAjd6)>d4B=l&&MBc&TntdE+^Ml +H@7C`=eYi2;9gn661m +_vJjWop;__|twne;8;My|M&Y!Y&vBcEzQB_8u3UtayqCErTYpXIB+!}_IzHhn+vL{lUC5$jw}-6|u_- +2g(7Q^V0ig{5POLet>YP`o6Qouu6Z5OJ31}7bQxw6SEL{N{)Ri$=;?{?LU^@+c{4m3wJ&}11Dshp~_E +K7xpGJjjm~p8GI)6842$P7Q01p7v=opTlUj5uuDU+qdgh7iobW^_@HXWqgwkZ8B%#=k+$VZv +RzAi(|KfmZ{-U3lmhne)LCZv0X>k!?YJE`8rBqx~rVjcxZ`qWC$H}6QS-!Nl~j531CQj9Kre7 +4`&ybBe9P(DDAR;Fldp<L;t(rWe&_U@v-5B=-a`CdEc@U5hi)OQ27R9i$57z7yUv6v +fp!FnPRM~x4B!8E{g(bEim+=ExzoD7-4NDyos0aMZQ;TNTP*bL|F0plF8?sx*u79SDQ&q^>58w&pyh= +MMOreSUM)!IDWN2%`0cMyzHq9K70dIvlFM)S{uM^Ou&lvvm(=Seity}Gmbx&tft=@61+dQqQkFPE-Z_ +X#@w>X#lm)959=iMTGRGep1vpwll!x_}bVV6GGCe_lPFWPfxXVdx#cSqh}!q_&LRQ%Pz8sKyK2lutzv +F$YOW(++;=bF+`)+9m5e&bu+fOfx>#r|jcUn2f&2Mm!E@8yFhE+|vY`vaLQaZ~93pA(*LN?BmU&T{Q_ +!S-~3QrgBBWe!F(jLM-isxHxkf2jYaQQO6HQ^D^%UjE4*o7(v2x@^C;_CG8Y+v~xj84XLj4wY`ao3u@ +s`RKhJSRevxOWuJ=!EK9Jtu|)glJ{~h_Ln4!qT-#$T<#Yg^p+K@;vR6540q)en3!c!5Uho^tWmKLei3 +xK5v`d&H7uVrO8LLr*^zwx(*H7U&eaZJo0JEnv29}g-*apZK;T}=6)HMzK&}x&f$Qr6D1r5pS&UoxY4 +RXxKbrQv!Muqd#``liO|;pm5mz#6dAOK>5mAZYo3h^Pj|48}8NsH(UqED@14}?}DVHkWFs@FlHL@ZIf +@%T(n?|!h{8dJa5mntU7*?Tjc>D(54crB@8Gn->0ij@8;0DUP0~UsE>4Smi?|Z6$!a`i%Ef4Nt5T_AX +mQOrh6B@1|OVx`8&aN*G5eyiW$uvoUv>xP~Q`rOs+OPM^J?MxYsDKskQi0Zr8s|fvdL+VGu2#bX-W7* +uFiOJ%gvrt1^lSUuaF%rVYHr(uiJ4+`IhtHW^nieixdx}o2ZnGSA`~RKgB +dcby|M<^X3zkk9!h1A`n$|k6Bf?UiW{`Rnz5_E7UIK@$~*_&W`wvfpreJfi0KwJ*oWaIsf;u-)9{0A= +s*&|tGUrP?kQls?Xu>Z` +-MV8hyFk$tc%_56KQ+KgqnOJmgZYp*8c!Z3gm{-@8l-3`yqO#{s|`+5Xd>J>1kp|4hl$`H|)ZY*kqndU*V>ofaDXfmi(X=hk$7<95w~-_;ea*HZGm`CM +y?^Ng-B8!x)C+U?{(EdGXr4agp6e>wyFO_Lhw*gL{Y=vbv1C%oB9j^r(nB)nLr0|TzPY$iZelxj(Ka;9W~V?^x1x*^K$P-i2}6q<*TSgN9=rL_k2M>&S~H96yy4Z4fgjvBm +IAFRMQ2NPNNAVVP9k|63`V$&kRl%pMJjOpoa-55pcZ0|%A{@eqWtYDyqNmpXcQka;pkOl1zQVbzU}t4FuSoEBN5wA=BuDT$(L!%-)y7eTIiKVb%|}v@!2XR?r;s3?8CPpml@@-HVS_p%-oEJ`= +oe_k(M)K%e&ZwYD^@R}%?X%Dl?JwXKwH4_>RO_BHjqpZEjK{|98(ia7UAv~XjChQwmvWrBn8G^!=B;5 +4{cg1m;g>8SlZ{)eOjr`+lxE9Bq-%Pp#1VBjF+o-4c3=K#b)Wd>DoH(WuR&SWY$t@--JbE$6tE?k-K7^ +xFa3h4DW4Kx6VtiIG&;_xur34>O2}F-ra+e{l+5@RWyyq!IN2m3$gGoLES*d)CQ1E#Ifr>1+S0hUackI(|Y4j>fH>P3Svwu#LJSX}azM(g_Fn)gA +(Ocylvux-tx@}6AI)q(A{6wvoCmH6}Pkc4$Q4#kLQ!svaBQZviMn8QrmU-!o@wU>nRl~CT#_s52d#O_ +Qe4;NZ^^qBpGX$^Jda8;c{s!;pAad~IW2&4{{Fv!;OL8{az1DTEVodY2hs6k2k6yspRX!8h@aQ?d_RM +UFa4&9@TzgMg&EV`E>C7Y=sT1+L*`D}akK?jg^0casZ*a|BETVfI*mUGK`8;h1YojuYAjs?}qNAaXH; +%9Ec#kM04N2^L9ev*R+RAHed3`TCS!>>gE0|ZSMGhL;w>&nRR{CfPJ7PQ*UCXcWC3yudsDhv>G6!6y& +C<-xhq2S*gIE~cPwONXrzdmI6}d6lI~@(`s1etLNtr~cm?jV)kRLPd79&mwo$M4UJ7VI_@sT*BGi>u3dK{(LxlQ +|28LE;+k3xD%v?m!T%Mw=?jB3M-UIpJ$WPY9y8X5E8qF6Knt8 +b6L`RWgD6i*wAx&m~--{@`oqMGK3=S=Jy^xE1a@MV1jm&jh@a2c{x2h!{pbbdf?)cWyMJx@MrWldJgT^EP}mK(XigXaE%`mU$rb +Rx`Tc_wYliC-(2IBpRCS$a~jmyWE|`}7ie=JDI0Ug33gl)+Ig(@IYZ1`VbV&FtD|`WE_gwNC~<43@dg +5=J1uf%d26yf);c?)l-mi`B7?Z5Olgf`0lHCUXI`;cG?PhYQs{;3Nrw>3!A>#s2GxB-HG$|7M&XLmo{ +vnI*4qwmYLk0|^1R9>B+WDERhvQ$rZ%6a&o4(MI3y#%cWH$!MJx1kMdj{^jYQ`jS;w^s-qNmrK-6@6|IV6Ts9)&`H;$j*NJrcq-jjDz2iV&ewAou>{D(%HB7&T7Q;q5~yMFh3@6>M61ha_GTq +*pMHyx3*VD^P&d)?6tu=GJUl9X4Z@q9`q{ZteX!#K3NtkU4_&7~p1*DwlI9!py4)D49*8Dq4_Q4?`e?DPLWi +f~s7;9X?>cImEvK3}gfr`nfN3=^lD}Jg)hKKO!lorpsBwDycBpGLl?cg02OIQ8SQ|0z*U^|Pe*M!)L* +i$DTnKyVFwd0h9uWPED4e46vAXj@AnHV4kp$y)e)TTcO>{M+$Z>wuNH@Y#zdNNcj=8dCem}aM>uG3vB +Vej-YOgSX18P4DO(QiG1dfNzzB+z(He{Vf3S$2i)r2{=?{Sej~n_IfN1hFxM5Y+78MAAF->n3%N +D`nb!+~Z5W@J1Yq6!ovz3&cd<>x1FVNbiYb3%*?)xs_WG`H_L{)o(7Hp1CQ8ywU%^koX$bwMu*PQ^K8!}hLw3Xxm<(vJXO)@$J0*CEU1fdYM5?i1A@)A@t)n@5iLijW3(M2^m5oWki +K&CmoaM68gRa~XQ@iOA_iB&FsvF@Gt-Yx=tSJJ5pw%;F=7#p#fH@cJd6Cl#7=R>$< +zHIgGDpZk3*(NL#laK229NEEWt4p-yg+22L35z8RCgX2w-W->+7gc!|*n~Xo`p!%vxg- +(w3s;8dLH(PZ~VGmL?2^B{*BBbj?mpZM>3&aALRAMs52DD*abO2%h< +v-(YKk4w5*1rsH@*^lVgPCo5xF7`MNj<^;vwV@{r<&!70f!Khc6Z*gZCuOh;`iWm#O<~mPT)@%lv-mN +pGDx);44@uO@L5n8q<#)|6`Y~tL00hkuf}fh2Cl-+}MaT6}Kf42O7q`*m)RRS3;>}zBgxOh@o$Nl@rH ++*wwiMSdo#^uR>h0BuF)|lutm9OI|22$}`TbtJRq&GXpr!i$u{FSV;;3s4P$O_#X$wO~bNz%3O}Ddtw +QZ|M*)G ++gb!UYz@CLlX9lOs*;##$r@`-7w1lw3E$hW=(}>Q +V5pl#8_zKqp!sc6%{c36C=vcoj5!!aV{bTCF-y32G!CB$=-{{^pVGxC+g$mHzO$xl*1wE(>>|WUEqr>0_>nBETF027dY*g|Qx@RIbGWW<18iAJmxd)UfFNs?{);D@pKsBTWXE`R8-MLA*5E +m^1YfuT&OGI}5K?GLLAx5+a9csd3>JR<^!sdhIQf@fJ~A(Q$7~@^zNP?_c<8d;n8bPp-W4xN| +Yg|g^bh)r5RG7htK%eSeZHw-L0(S;=;#py$m_|l^*Ks5vzlmMhd+q%>OZ+f^3(8lIH0%|nHkcQ4qIhJ +)M^E!@p;qP52$UK@_mZ&II{;!Y8dm*k(V5;|ZSz)qf&!5xJ8@%WD5++Y_cbCYH1v)z@SBggV_2n9^ad +M6E7>jlF+gz+r)9UKU8E&gZl+55su%uf{7l?1k>U&_hhjqs~at+|Z=&e%s--~(!Ap3szKBL!oytmr*7 +_i_gx63@XM5+%JTN?=&ski4hoMvj{Z?)#z+<0dGEtD8yOPwqj8ZH~w=};ivilC4rboT=l7#b1>Z4z}F +wU5Lb=+$+Z_tCJX@b(kv7Q>I@6HQ}Jgc7#-`v+hhO@7Ao)H(~mhY`IsOjp?Vr4#n?iN@XbFS^$*za{v +@OUA5A*>}1c9=SHObfmgeGif#<x6B8!o?EM-!vJXg^cfO;MMlycCC0G;|O>ULf8_o$kic>dC~H{!#DT&d>o|>tt<5S4VuY#=lCBaa8*TQmb +WOvhI^iQ?S)A!MoRn6LW-(QPQ{?*7FxPChNNs2pb387G}ExXDwRQ%3gkzxvHl4qdDgVW-b%5n%2@=X4 +MjxdUS5nw1a0H&D`=*0Q|#D9IBcnA2v#dhj;}{CV6f)0-;s>$%jp2pIjrq93hMgmU0MV@;CMLnI*pe- +cvTm1n8mA-+Xnm2c)fMW?Vk52)YJipC+)N;NNYSss|sMZJ8Y_uiaJywm~6!lD_?vA`QmpH@D%<`M-a> +xH*5@L^axg(Gjh>*yYvbxo*uO?)TPjx7}mUM&h)^mg{YaHebYtzM;~zgUC&NuvgOx@hoA7-cJ-COs5^ +k?tIT$CU}{LyLrCWxdHV0c1nR@ev96e9{&=XjI{QStRK~AZe^ga1Vz)lrz+-+X^RqH$)%a6*n@6N$}} +3X{lgBC6Wrh++vNC{t(rqQ^~5&G5Srk0O5eIXg^q5zP<3;jS`Q(KT_4#45%Wn1+`PwxBxkK~U!RJN=x +jR__F^rQW(RAE2>7+WHHmUPGRnc9<AwrEY$0P@gV#51jkyC0DY(Iva^Z=*)B& +k3Z8_F6uA14r~LLuKrA-GQW6}Hd!xSg^WJabtOgAx1e#KCl`G~m*xONGyWMR&^OsF6Z~|Be9SaD9`1= +JLJO6ug$EC?#z;U!XUP#28*d@qHljP+^ +^F!Yxa^ML|o-5y>9!Jq`2d?oQ4^spbX0>Lli!Bxoxbx`nmA2Zi@uc(anuWs&`tCaFVEAnjojSy%^;Eq +XXT=x`Wqd=`sjIpU29M4%-47C3VURm68M8Ptk%=eA}K;u!Noie>?Z^8f@LSts;0hoqd1l>OH|lJ$#qi +MS0q*{9#zQsj2-6ec>?b_$*$lcN30V|syS(W6som>L$%r6%@1&MI{eB>5Lbx))yIV+T`k*&Ir(d*4GW +Xiidki5c&ZiXFU+I;Qu?tN!@1vjgSbMZ`J|xowqK*R)THF!;ym@Zi4zP)h>@6aWAK2mmG&m`u=mP692Bhf^ZP*uCb +QyksJ;S_(R|(XwY73oSpW9B2c)}te1#HswCyjqUisAGkoZ|a-BB&!IsFGALq>(J!2Q=7c5tWkoOzb*x +kjyX(c&3J4^2N!mvseO$kULEf>3Wa!5+18`Z-Dp#kPeY|FnhCZ>SR{K8oS~gT^D<%V?ajl#7%vJG-H@`c%d22oigaAA|c=Nu68ty_DowbBEk1J@GGY22DSDNQ|#6FyLV12xD3WPbeF(n)-}!|Ak*2+H2|(WL-`?HbT(^5`_kP}*BIr#y8}hivuGkMsqDPXv#2V$ZvXgB&w7|;qQ +4-SsSFA3v9$Z)~#Lh1LoRYIF`+sOOy&ea>GNL#o9G#5%#9oIs~Ui`JV*?^E^B`|BNg8<_D&W+5h5vT`gwSh_ +n?EeEvpb0$ys%2@BPl%ly;cH+-jHM7SWu1-XX7u;kIps71re3%0u^PC3o`y|LbH_7%GH|@`JH=%hrjS +zPqIX$!+GZKW|d463;bDEcSPVt30?U};MlKn4=>v*w^ba>_)Z9!c)zZclzBF!F3ykoYgw6JtvSFT^$ +f~y)zVxx87M_Te1=@1VC1DjlblMlynQa9olLi>w~5XzCK1dF#{tC( +zj2Lvi^|K7>bB2!qp}4|!?^5hb+mm)+TEeRSE6btC6Axe?l^Z}meJFRAHAYW_gfAQ3NDIMd}c(;4i}N +l8Da_eG*1y(bmT7;Jm=J)fV~{bvM(tAI<>H9e=rXsn_k#eY=@)h@`v=q6A5?db?&+Rlv#LOG&qZ`kKf ++xz8oDR6g-*Cn-^qeG{_wCn1<@d(2F}hYF~B9nPDJ&7A4iLqgN1ygfzwd#^1Yjt-%T(s+}$ofJ(u>-Ia0f1Q>p*;E +;+Vy^!Fw>9PvFVKL2_x!xGjw8Z0rgzi18LU8!+hJ_k%CQBQ03AsiOne8qfQ{c0_6&Hl}QfBfJ3? +C$-|>nwaP>+?{HiKK6M*=um1eB{vm*E{u2H%~kC#h*I!#b49(1^;@djx-(L{{B+@iI)w`T!v@w{Fhz2 +x4?p~utJ0a5e0IeEBrm!=E7X(??<{wMe*EnbTp%x|F;3yXtLW3tuxH_{t&l`=622BDKa;$wPf@*B5Oy +oO_x6-pg44G+PoT3xY26k+|zD!qyMz_{4)N`@gWAlbolOl_vqLD$(N6TL~Su_E8*!P*nI;WdvoqmmMtBUtcb8c>@4YO9KQH00008045ZePPbW$eOC_v0GLDo05|{u0B~t=F +JE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT49QZe(e0XLBxadCgmUZ{kQ2|DR9M +m(?mDF&u;>lUePY&M{_!mH@(JvZK`s8EAqp#_jVX3H#}yAO)DzMi(!nR}!AAFP99xPy4YuKK{T)# +sWJ4&9IVUZnmDKWWR$7L_(h7up@EcW`rqA%1U%4`Icg%UhU4B)1oM{VCUEbG8|)sV9UQ5(NDfbeh*%# +KTa|3IEx=5Y|O%zY-WroZbngb&ti!vPv(Wq<&8V|sK$Ua0GVXfzyEa-uB@K#ysYN7J&%EweZ09%0_vJ +vd;1Wv*PqJ#>g-6KXSe&jOEZ=*mao>=k5!_MN#0F)mqI#vi8r1hUaJu3=idIPf}T$Xoz#_{61#$LzMC +;Q+iH3#<)UQEn`_(iKv9!3+PkV*ZY-4kU0b0MtMC0N0w@=t;m16%pQZ@25tCz>mtDgKIwRe9~OE$VIn +z^#T4|Cq|N=U*Y3FUsv$CV^jYhf^SCMz3Fi$0X}Tz6}lN(fNt6l6_ld$);q&}qHRQJ*azZ(ThXg4-!N +@-fWc+00fTTgi1OIhf5mo3#D?dwwP}D%vSI6B4}oA{o0F|+L9{lpanAIR8TrnhSoh#(NZ3VbN^u#h)^f +Ce`G9U9uB;9QVmf(>DaMJRdr^6r8T_CuG6*xj)`(sD_$Rp7F1;M$;CM8k%G3%TZh(Y22yD1OT<=yPZ$ +#LmX#{U(e6?5oBK0*KosV!>uUz!p%jQJkc;!zynF9TG!NIFMq`5GG2dxd?-IOX$7?J2vmH8IwC9jysL +$)8XP#nQLUEli7Uwbu`ch}qsgF6v|nd)P1nhE&c%)HXXB +9u<)eu@ei)1E1 +BA-$SQF~NKy|E)?%QOb+$&!+&NT%|!cHU=NXg@!hQ+8?fnRkonoiIpbvjwh;cFW#o-bnd$C0kJi83GQ +09lwhpMn~6F>p<}AmE*7LK3<^-AX`$-yd`>jcK4MW00w%0GXlFID@eVhYYe@ZUY}u{&GpoJw^t^pvNr +eHB0fm(Fn^O%kUvP?ggJ1r#gWTIWr{K!hp35^RG-4)i*_wS-voHvvi>QE=}9-U*HGKPol^(|Da1BKdl +bfbJxotrV1=(Kj8=dKa{p&%xbiX^r?gKxJ_o$(PW{`+e95cOw`4n$1V`tXsj9doPXsht{8|4M8lXSfm6g>3 +sqWR8MbKD{T#P>XKz5eQMcLpt^0da56!n_K;#FGMVouWX+lf2qcOYVIhN@+&pYR>76+c<`k6F)-8Q*t +$*`dVbI801f6k{iOg5%E`IYp#og1D9ZTd=GJ|Xb}2hGHB4o&#c>-^}QlOIXKk3X_n0N+j*^nQSyI=v+2@5D&{iYk(~zmCiSoRSTZmq2AXga4>TqOl=o>Gm3BIHZg21K(I#w4i1nhGYzvR5@>(bkPF3TfSs85Ewc9uxw7ZP#E^brYLJ6G8 +himhR<9<5KC%IbsYwOn7e(B@Ng{_P~vP5!SE9IdambfO?sKP*eYpkEWG +B5u^kJEfLtbi6$VYI3g2K227e$4neqG}$wD +*@>YogHnA?`^#aQ;a3QaqI>?%LO=63VOS2s6P-jl8KGrFp4hq3?U8CW<2a#Q)gw{zlK?jxuV!ZrJev7 +kU+{fBdQQWnX!pJ+hz-m>}MDZn2mBmh>oXQAF3zY&WFDgj~A=B?wp2C%iaD9}P8aZ;Q6Mmt-$b%^t=Q +R|vB)Xz(n%5O|$GVF0^mVj=1M4bCk=BtdnXbYL+ozAP>chw@i%NN*Xy>D~qz%i}Bp`DMv>Gj}&B}4+W +gW*A36$LyS(Rr5YCaI(L%%nksOXu+V4_$}+!g275>&;)Wngh8C=bfS(UO&A%^J=P+T|WBP6Nq!)GF(~ +m2m3x=qP~*3B?w~OBbmmT(IQ4o|J^MzA6&QSSgW}8JmH6igg2O(K74O%8%#{1=Z0#`$g4z7bg!xsd-m +rPA`F)(pw5tAJ3_=83y*6hkUqdY{uP*Waj~GX;GWZ8pKMr)ry2Z0t$MP)I=7pgz8s>Se+M<)}h6H9;LsRVB!hm@7weTHeXBD1pCYP-W878n +hs{hH0l3QdwuYi{*I3d;sY!BIK0&~RwO3X>>>VUj6?2WfGp6h@sQJjdVqY!)fcXC8N1 +;>f01S(fv2PIEC|1+3EdmWsr#k@b!bb`H(BA8xJg8d5Dwc)OpSmvIV6zV#lTw6`7-vwoQEnl#(tYOBx +41lhz*|_EN*T6rXNHW?_3Xo#te@S$_59VL#+7nE8r;q6q^Z7}rVEi8NE8Lvbb~4InU+HVOEB{Wok(gR +ovpQ=fQdoQ9@X5Ey-iI>Ty(>eRR#IoB!YQFcD)t(tL(=@HEN&AJwI_*{TK*hJJU>C8UQMJ`GsL5MYD3 +jt3@a#~X%_*@H*&PiTDI0pYpRXyOKKLZvcN8j#sp>+f+BhHh6+FJsf9)HIqgYtC#2Vg7pXX5a|}8a-* +X6i=4sn^nSJk)H37DAS%*&PmSCsmUPU8pYTx|S^-7BQg!NTgY27tUI-A~`C&P^-R4iQbI^K!SC=1Za8B_`;gQ{bsY{g!$etm^y{Lcza&FlgyrxPaA<;QuHZ4(Cd?I$5!sA +C}ITq2D(pg4TGAkQy^IIg@%OzE)%OF&wyb>8W=@6f0e#ru=@XYyiv}sKV(#R7vVV;1o$j5wA^?l4p*} +yLh74zZgN!7X4DIt=bL{=#)J;W?z0=vf4e)4xm4uOs-Pvn$Lt;@J>4?eAk!TRbWL2~m%H*|{m;9RIpYiF3?hcNSibplf1|l*`aF7xSttP#lNao62CxNUNOgA6HUq#=yBSgO~3m6mAe55mYzRMO++ +lxB^| +f2#ud_cU`WeKEf#X&5vI6QJ}r-zyFElu7XHExxUS4J&9aE;BR_9(7d%x{GB+w)ABuJVH`HI?dV9Jp`3CxPxI)5MIe +HN%Dru_72`p48>jcBr1$ecQXabt;JqL0x6d0`YUyzsS&XdaQ*S7dn46PSade#LsrGn^~1&0#dTjI!R< +BhKhNKyzAwcj)Qeaslyebp#PLm7;^8i=*CCG-dOW0A$An16r<^bgg`^y~(3!<#Y8^6&M?nTYJ`GbYB) +O%g4(>Gkt1C-wUT2JrdCSn5qNY8DRo?@0^%z_L9U +9SYz?JE5g!!b*`-A@%73Lt@oi*gNx44<^)ZKB?)nKrpR)+TwDo7#Fpj;>NuNl4$jtafflotS=oTitwl +2BnsUkUGp8$HYg}NBo10mjMJ$?H`NTJj=)0dZKptR8vXR4i!OO014dsu{y|e442(n8Y0j3Yl)AjlMYm +)dk%_;i+h?{E;(mnzd~}J__*YV^6IGAkW$KRB^LGi-Cl~Oz(qil_*1=8;P;}toK45ypynzgt>5?$P)h +>@6aWAK2mmG&m`;LoOO106004q70021v003}la4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ8FWn*=6Wp +r|3ZgX&Na&#|jZ+Bm8Wp-t3E^v9RT6=HXwif^2pMpy>SB1vy?(G~_RQLz?T) +F>&g_v!C>kRmDD>Eqr2TWy&6hdMYon7r2Oqe?xfN-R~?DAS5U8__M5xKUYe)UAJ>q=d>uv2#QORYPRmquk>wGl>DvQxR}G?8AGcT0Qf*}Kbjvgqv|m8rI +sW`hgwRELXK_<60(eJbGCjVSA^>T@_+ABw}Kn*&t=$P(J8#AY3VV-_l8q(GMl6Z6 +X`^+?W#dK)>{@D*8%D;H~W>92_b~8LOU5=PI2XfT7A2TS2z!m*?(V)@>Tqx^HEtOs91t(u|)0VjpgE0H=23;R2HK-q0(BGxE;e{~MV?k1DT6VM!J%BZ`(l18X6jX`yT+Tkh4NH)JSav|Pb +yb-Wp3RE1}OVSfCUtWQTbNDhpzqr1=nO|RsQy`dTdes1T$wa{4;@}AXe!KYn@~yyim#;3*&u%a1>8Cn +LpZ+@iRMWSMw=cI=9L$j7%d6Y7*RLm2;5%1^m}kWtIhv#R^Tno9Z9@O=45(pxLIpe!) +y+Mv*x|A1_I=#b4m>g0xwZQ-KoV-&Q@SjRaEg%e4YmK_x9VWcy53l`?5`uu)xa>X8Xjrg}~cu!it&wC +Mi))mc^POm^D5RE6xTZWakpsXCOH=tSBnDXbwPSw~&pRG=jOXODs^@MpBIO%1%(>#9bV*I7yV0HhdBh +@}orZp(iZcm(ol51!DHC*lL94C`W?ErNaGUTruCA7s_5mi&$)TZvY#l+Y%3x~8S4BI!OJf93>8EA45x +!qT8M&-SbVg*if7*1Cm2y#}p59ZNP%p5mr~f7rn_Q*jfm1pc +vwK<0%_)TW_?YHmxHy%IQ7y2>#_q@~dzAiDRCdBZ_gIOuyGvYn361^8(*iW0emZ`9qp33X{XWD~?{+18iF16)w6Un*-{Y*LqI +ApV0qj00c7Cpatex1xrrxv~jpC6$C5gV@sK04l{PQGj$D@~7{w>!~{4&gmpPHKU`_G%}KJ;jC!)UM&&Q_ +&wDdI1M^`opW6n@)CpD}HVd#m_c34a$iPv>k-w1*Zrd)0>;u7oHCL>u6=dEcpD3{vnN#7DO~^mB4>or&D{AxY>+iWD<=nUwJ;i%paIYH<0^PxBg@p}F>A{9c|SSvp$$BVEQ +87=T#eS*p=qZx>W5BuHX;LwX|yZg9e2bee@KEcPvbP`4bLY0PNIzN~TI^S#2HvmK=b@?)hz|NLfejTxi_16&(91qlP6L+NWWscq236cC*8+6%}Nt#%{1D){s%Sj2J~?$f~u&lV +LBcN6LUuj=B<>rv`uqY|aTTh9}}c%fZ67b1{NxBgG(KA@S&?e88Ac{)`5Cj#g*)%FY8>cc2iY1v>uIE +<_XI90ySa2Ek~2GqW>Fgp~LM!Saa0ONb40(a0Yp4-*i<*!gRCAj4u5yj!|a;UKjgnc%b)=Z_3~blt(; +7AH|7bo0K3zx-KHAZ*jSIfYkSRN9CrfooQtt>g&-V;)IejE`^Ev&{T7D1c}-KIT1N}eBcSP +x>I4v_KLFRCWU81DXf^5XM!XEQeh(AOxuIQcw9j^9|1C;Tj+w>{$K7Oms$aym?v)75>BpA(z*om%GPQ +6v?9O8)|TClQg^Al@{!91W}olRv#4s+o0_Nc&~is;Wq%vqwoYh%cKiTW*+kFB=cdB8faU#X+Uh?$kea +kNlHY;A6pP4BM|g2-lqyqS&p@n|U8p^oM+)3`9)lk#1%fuugXkb$>XrEnHp+$I!Nb_^pwtT&<|I%;#8 +1TE?(wz{KxC1?_3{@M;E<9&VTkB-0{D<@9FIWQCCLRy$zS1=M!1PJbAl?i#~X721{R#x*@?ceub-2IIX +!3-&~u4TBv!wtP@fW$fiCReg*R60=igrSj6jA>MBkUPwY5+M7$N!F1U?;0*PpGt$;>muzf)3m=- +TjW0sw($)cRzl(FB98G7iA6AFi7mcL8$Ba?7cmB>>yw7*?r;;F+dWQ$53U{2nJ+T3Cnow%Wb32Do?Sv +jc<-$!>+i5(n}h0vrv39YwzFcezkxW4WbJ9gBI}*jvJiDLO9EcsOiG;OYeLP>BF`|bbVJ-cja1U@UNK +Gx8Qib=oe7i6b%kY1<*;8M +3x@D2r!nOz!lc>C0BPRZ76G`@*Bp%jjqZJ(z9gB)*_j+ZGhv +B!Vr`EW$e8P=_#}R89e4so{GiA1p2EQ5&dZAaWN76Z*!kVargDo`}Yj56C%eja6`kuOxxQ#F~?M@O)@ +(;ZcS+cm!jpsAgS{$%?i>b6*7A?ojBE*w{M2@Dj8LZJ%76Skm0hOAz*Im`3_B0kVUZ@K`>Kwq(65LFL +F&+x9#ifK;M;gZQqP4s8Rs;oS)4P!J)m*yTlbwgRUew!xb$mfV&WKQOPDSZosAnUQ?ALtLDoFF03>d5 +H4Vkv2!mX(!lG$7NAWCO#kMbw?Pom-`1JgtZ)qu`L%|?V4DwB3h +?>ZZ?0G-@(32VP|D?FJE72ZfSI1UoL +QYWsE@zfG`XM?|DUTRS;^3%@6aWAK2mmG&m`<5kOkqPUB>o26yX>S>A{pzkc)jd-(4M_JK!#x|;y7c*au^M}t=Yea+KNAVdIU0>Rci<;y +L*OWi2r{+O*&&RM)--r7y?_?TreRJCOZ;j?&|xj}@ixxieq1#$qJt$~n;SJ|VRa^lPtBK86oC^A3x@( +qtNH^UlNK?rTMvNdPJg~Aw)s2ZQUAoM~KB)-fu$P}3A@d&Y?E&mDqA$W+a0S)XSYH`USL18@!3N}-s5}5P2 +jyKiT1jy4WPa~+76P6!?=&05|xtC!MBCO&tj31>AM1Fwn67Q+|ZlKg%#t)pDB)dI|GvHYAfqjvbU95` +4+6_athlc)i23C5<_~uDkxefDVE>q1o{ib`_v`s|v0ztoAU3K?0j}Hy8 +*H{S5&1UHk&Sx+{JW$`U#Sg53}>x%^zbR^>KD{iF7|+&Dn%qPv$qX)6eIVIlKNmzrI>bfrT?5d^x-PI +EQ+s7t_ld8|sBTHvJ6}Z1HJwevXv^waI5_!yLI}r&rg1%xAxTx?!KL&d;Wh`C$s&O+K7YWo6K`)APyf +V$9Aa7n5J7gmndUu!RUHd1PNcO)(SeoWQ@+o7vSRHs7lQy_ntEv92Ona>s|mXGtR3v4C +|7I3bJ3}9YPB^?xcwQm3f)1Md9f+RbePR@ba0+D4yHMl((tWr=}$64iBo^r=w!3H$}G)}}J3=c=92Lq +MA$|Em}<51{~04z-Y4?Bs+UL-E`0; +T0WQ;Tf;mH8Qe$|ze> +p}b`fx#?EtF1Hy<84E5Zzb|J0J5|hX+$RzIiw}4xcq>;+S8$ot&YXqZu`rJAMlC#A#H8$G`xJ|A;BnO +8I*$UJ=UO<&_Q;A?#BdV28T9GK1}l|j0!_a){L_7Kha<^9{=H)VE$2u#d~~-0t-oMzkAZY1>;kHk1hm +1j-mss3VsGD!*!S#>?8|8b(z*IP&6qmzxwDoHx*cPl1C4; +&XI_~-K#47-qnHd`>=tc(`vzm&t6jF{rJD9+Mt6&8qCzgweGk;$Jto@DF_v~vZs$}~;mw2JZyB=kK*X87hYP^52+X6b7e{~#>`+B|1i_WJZK{Rn0R-*L<71o8WRH(T&g_GaG)Ux2a<94z^#!%8swW1OXI +Shu|gctxQHI&dl+GkBd{*JTP@Lb0pA4vxi}bEeiwo#20jm$3MQf-7ew-|Xq83m5SoAv|?mCBgeBqGpKEaQ(o1Kj|GW*80Cid3^>N^rHor>Tr;dW*eR +2n!PiC579gxesobW4R(^IeIt~rG|o+wTva|sLnOzR)?$VZ8^co1kG^!k6h|xgVv5tmW?g!nMx|%)&*w +eevme&6Ko~U&tHcM1H5&3#H!%=wg&fi0K_M0VbG((6s{g*^&3=C$JK*J+|~t0WF%AIXy!{|7Yv4gWn1 +VoKu^uq(Q6@&GeV-3}S#+!V=9IS^%pUf|k?SrwX_~7w~HTRB5M~%JyafwiE)Mf8#nshE$_K+o6py&TVOn3Y)SBo +-P3F+RfI|2jO*RK>HXIwgEtxma?^4prJPs>&2P~o@^XMf_4PJ@5Pn9@;huviKb#%FCc{+T`8QHucy~< +Umvqo5cxn7(ZkqtO?xqbp3*&=W7VrtBZ&7El<%)EWrd$WrSf+D(vfZ;J+X4O(c0606h +W@zkKIF!xdX7^z}3Bme$Cqc(Ifjc%jOp)va#EF43mB#a8t?CE?oeFaR5u2$;&TC)0gHnfNEzs7~dBi3 +jzgw9%pAr0D`L!VbuSqJuOdmUrarn=>W;bpeFS#4DS26uIik#OBJ-PPEJ3)$WJvaK3cxpn{G+ZKl|bp +yef9A#8&4QWJ3We0yA)Fp~DhLz~SZi>`!RuJX+Euno*57yT>B3x(~l4)(Lv1E8=BP(93G@;66Foa*W$ +msJx1QG58dfcKxVfdl7b*Ur^|F=0|O>0hoj+AoY!<1vTt*vU9)WlL5Ie~Bz*SmM`dU`;cPW+oo8d;iy ++6Quf6TyAm)wD)YB<*sY{sq7|S9`2rf!8tZ;DR*4Af_p9--?8LOd4%LX0bq4=JBoljsce(E$zD>jK#0 +XplamW6@_=&(QD+o;m8Ho%}`1N#Z8r7dCco0Q_AMAJV@~*ATR}sA}J;c?wic^aEE%%9{?kV*72v!p{NHf_%JBX4zlS>Z8n_PjIjHd3RQ^3iGPHIqJ)IttyNf*w>P5Q;80Pv@S1Zbc4=p#@p%Kv3< +UOx7tFWd3Ur)3v@>PB~bhYX(zAo!Klj?m7Uu?Cm|`9BC+Dv +`&ImmTV3AGziuw2;i#o8);Zqw*9T=YlPtO96G|qhX;xOd2t=P#bf}ew9(y9!8O47a*NP%D(t?b8&uMqzFCf?ik5@7(fl0<4VhANgF2LxIyS_0+{tTIp_*hLL?~P +zL;H1FPhm1ZkOOY=tgnWK^lCRF6tGe9TngaS(WfjC5H$S&<;X)idQA{p^`&{2&jz^!hX8BxnA(}L3Ud ++hq^<^WE+jsUuRW>M#e4*3-UdyIBj{m=y=zGcQ5BT<1vv>Z3utmJSUj{p@%k*lqaduOMGmF5wUmAGg0 +zR=|wlAhMh1hMvtw??#UHGup9N*1LpXF8^&bw&Wa~hW~;J3biBq>lK2RzCK&^!kCgCIoalV5?+caI+O +Ek};Ccy?UX|tt$RCZ4xxHA~J%OtqjRna*ESSCM3XYH+SxIUdWoB;=N4}(?9*W+Ld +KCyb2;M4#)T@I`H!`~Bj4etlX_bc#?p)!p +KKHQ#5CLFC7ef;OUHb?&iZ-@kT=2JbEn0s8InQ0@vfw<`Xw_bM7(0-kc29rdW%ayuB9XM_!!>YkB4l` +Z#SRyQN%0d4zkWU&oon>+gwV<=SscW{eZMgzQVB9D6vKAI<*xUE#r8w}+6%1L!AsiAel( +V(3#D%Fe)N5<(U9c9Q<4JdNVA$Q1L6>Zz=^PuVg#zANm5FihwhAz6ID$56etfo4A%TczVeB1@4iN6_}ft@chLEfZ}y5%yxXPmR5N4LYX39n;(n&vVrDa+R;!?xvc#TE07HT=GD_*^Ddw*~*MdS^LkppX +cY(s*`-&>n|IqxJPm*?kTKqV5Hu}@nWq{?OI2DL8V=9+grPz-V*LXdP|tSdfU#|bM;m!OPAhOMZ8OIi +?vW2iJf|zaxhOK`(~P}=v8%BW$v%NfEOn`YF9vAMdukGxc_13AOYT?!#haek%9jb0(j7ioqG)6t?Iu6 +AE1skjYIJ7c$TE`liG@ZF7{j%AJXzG653gS*BiPl$PN-{f6n;I1#h41$0s-P!vi}4Y0bG$?7WnYJPo- +{V~-1QVA}xuY5NjJXgmFd4Y>w`@EE85#oafd@g>OCs=wyk4L1kToGe9_x?TqD3%p65tzX*6Z$gN=>zh +#0?K=zb*z#L6@Y_(L7JfUXUW&hX2?5-*eG&f4_&;^MHGd(E&kmbfX)2+ZR#5xpV6*w|FIT7k<0{+U4===fNuMgM3(p+v~-4araz5ws0OhJ=vO|cloj!y +zb2wWcKi9MG{BfaPw0Wtb4RFcYl`_#Ho+gThvL_(V>rk>xHr4Yw$o0C4lc3zXZ42lP%G^#zKdz_8klo +{lL*6k#`J-4hEk;9<=iH42Y_RYyiyu>atgBN9&E<#nIE&eJ*+u7`y +^b*`jvnA(;2{hHUq>9dv3?B#C#YaU4MRKaRbbd%eqh@I~~f(D(Y+|4+18=6K}?M32xI{TywoUhM*E2>(VHH<)7xwj^| +WA~ExFyC}_@TC|B?{;HE7Kff3XK0k6lF2fB!ZKM%kmwTSDVOCcQJ_l*d<#St!&9})mpc| +hmg`g%<}QqvZm2+10wKybm8wk$HuTum0w}`At_GOtwiXnLt|nA6I@(~Samp_A!Sx^T!i0mjt}*xyy=( +iF4OI7ELhl*_%G)I~})yogumg_c +$*VT260h-pkinBMLb~bfA2b#`4V{Q&06PQhBtD^T>B}y!+8l|i-UB;Pfo?7+iF09TV +HLctO=76PCSE9-wPBG&pOqaboi{^O4{n96)Vjf83xBQMQEzGqOaGNY2}UmvLPsU?Rei)zok6{><3bQpbv6Qju#*nQ<3|)a?#9Glz!&b+Xwyg&Z0BSgf$?L|`KsDUb5_Y31m^KT5M(dt$g@v +zu|Ly*<&E5eW-zFe}F!UMAC@9Eod%VdJ#GV +X-*Z6EZ7&3-AkNEG%jR88%-A>U7hsjaMK|I+CRwlvLYx(IQSwW7|j50`_!tA6O>_>2CVeQ_rLSRkD8D +Q$^DfEv=UMPuTKOm^H-vLeckc%tc$?ia{9|Pj8J51N=`JIx0w(=AMko7DU-Gh6R){_8`|@(2q6z`NME +zs0ZJnZ`4~VHtR6@GP7+5 +IHPGKg^rhnybh%RzHPkPeoE_5YaKWGTX}fAs#w+$EPVe1RdL9`6HFG214Z*=;OHcs;p4EDX%BkRumatQvgs#V}^yr`eJQ_3nfd>pwp +kN#>JU7wX7loF}hq_u~R@nxnch<6ngE;je|Lf~p(-apfXf5;Am<1hZ`RZ$MJ8I};@p3X=7Q<+`R`K?# +jW36f5qo56ZAC#1-7R%hXI6E&M`dX*z);!eY2#j+SlGJd82waamW5>4LUKTh@|?=?jjT$!+Hk2gLB*W +-o15MVIT7NM>VaA~BnjG(!pN#)SL!mFdvIk2ja{|9te(yq%t?ShanCWr)yX{^{n|4~9|27JpK{u)v9d +%>X=9cxTcY>KIC!m*v2=*MEU`un6j%r0?FNo^0HXlQa5&krZNo?+V6c-C$I6yQ46G7tP%}@|a7*syfX +vWa7mf`6A#gKxj0JlvkZ5c6HXe22LClcIV=_N%43 +acV^yQ7e)@{$gu>tt}krQ&kKF5E%7AgdTPw)(hdfjID&NeR=LiUiZ*l>=GBJBYBCe#t(q6c3b9Xq#Ly +6!M7-g?v1E-%=lvb8yGhQuOfIk>1*SJ!hABO<9;qR!hsB*b-SXN|J45^ye4xxktt32-t&SV+;)vm_xE +&gFz5Oxm_~CE>S2Ixncb>zhR&%0}f-(NBr@7k!?dRG0NQx^c;%VZ|^Af+p+yaWgxB+U{w;flQ^LOGk5 +@s(ifQ@=UK%90eGvbOFLWL*}+dGaLacyx3;x|@esje8E=mv(AWrS-4bFML8MbGNmc+}v6+k&h1_FsCR +_)QkB$+t=HHp=!K5K`dCq@G5`QZe-}lMZiIVqf!crih~bBdLc#0G2RV)Ap()^rDX@k%8C?OO +WluB(P~+z&&8smd$@0{clSqn6lw18LhdyqBsuLOHbd!q=BQYYY`0WN)1#cf3;nyO+)^bj-f;U=@fP1z +aK)-d%iR7LwM^5)>IaDH>-R71zvq+fRf8dnD{vlG;`LdN)~xH8(DKGke&37e3C}(O<@ +8|pD_0ksQz1~+`Ts$?Pd}Tc^E`S;B-Kg@D6|Z=rn<@DN?0u_+Ju)%t{ +5mM9O#H(towpT(5tDNk;FxFo(NhLnam6@Q-wyVc>qravILb3HJ2!cgd{bb+E+bB63jCJTISxN@+8OdbX*QWoHywtP(|w>wL6WkOX0m6 +l^)Au>L$X%{}YT;2=4xorP3pIl#0=gwrYnEiT*A9-2SFA?O4kDn)MLHc}sHo2KD47uw{F$#4 +31Zh>-FX&)xtg9OVeia=SS_+(Qwy5V8w}&-Csw$QYf0C+iGNhKXv_iwc!E|J1;S+Q>`9tLehT_@|=Bv +Xsa%EgrpccNJ3hAH9n2|cLe~inzBy=PCHp6>znU;9vo&`R4QGLL=ZrppUg<@bSS_OR?zG&S;{s0Ri{2 +G-y+Et$?QlELE%R{v5BrwV`o^=%=H(yb;u7{x~4bG`dQmaa$eqxB{fRB!2d7;qp!!hh9MN@(tf7Irh5 +>0tGf)#+~76BeK+M0C1z?dCn95<5i+b5KBG-lRl%>MmbRN5%T4rq&RW6F;<%SsfaL^hj<#EEYy+XP=VtdReddj-q+hg;4T+I*ZY+oZmWX}_cW<`V2Ca +~VxlEJc)>H8$pT~46aoPpX&D^VeW?cABh1PvU$uZ53M2be3Rhl&8Y@wg4q>t&T+t?N0Hlh@k0Uw9de( +Q!Al=q|RaxkFVrUDEB_INGD1ORAQ*g-SLm%R&7*xbt0ZswNNG_IqMC`Mf_ZGkCp<^hoK>>BpalA>C(1 +vOCJ9b(zq0jF^wXcJ1A1j`qsLF&P1^N;Q?o3k9@gxbi`okba)Lf)QF_XWXBs0pss+}yb+#ml8Ff*PHU-+K%qj4VDz|A-`Gehq^xN==Ro-?*^{l?rWAWZx<-ERP2N4^T@31Q +Y-O00;mk6qrr`00002000000000o0001RX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVqs%zaBp&Sb +1z?CX>MtBUtcb8c>@4YO9KQH00008045ZePO^IqgH8ef0I&rB05Sjo0B~t=FJE?LZe(wAFLiQkY-wUM +FK}UFYhh<)b1!0HV{344a&&VqZDDI=W@&6?E^v8uRNIc)Fc5wBSBzY(1T93Zs!A2wJQNiqq^i5xOOg5 +lhD?e}Vk6sWimLY8>svyAY#t!-oH;XdeC$^+em#b*%((b5fy(6Lk8XufO38+8_XnwrPD-}NoEJ#`T|I +xcun97I%b@40C9PSvBnpG#2>?N||9w6&=B*%5zkN4M&-~nQqhKIKaRfDj+A097C}fSe5wKhBdXH% +y$h1bQM1!}8Zgj&1Q%A?Lx!`BDXS9)4mdMeaK7ii%E*e@m)+We&t)jA<c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQb8~E8ZDDj{XkTb=b98Q +DZDlWCUukY>bYEXCaCwcA!A`?442JJ{ieK!|O{#jCc0q6ffy4zKA<7zei)iC2aX0$*r0EziY0`3vV*C +F;+i_jbK@i8Nl!WnKA)N(2hJemUz1Mq=;!Q_r249O~4;LYOLYy8=#JbuPu|#AX3GCYuN8<&;Cn+~OOe +I$p8#pNER|c*}M#A#hmUy_&Y&n))-*;6UDTA +d8wU-K|uvYXWzOvHhWZrXa3ywGqk^oNnJXE!(fluWZAH@Wk3tJ%Du=eG +!dN9LeKD|GAt$wKpuhY5Gmw7#Pf_V))lx@Z%)Fr+oz(*GEbv5@Y>Dk4uv`z5kn=knr@f|c(g!{`OO?_ +(ZAfc8Vp&{@7bS}S^2JJh15ir?1QY-O00;mk6qrt;ALDAX2mk;?761T30001RX>c!Jc4cm4Z*nhna%^ +mAVlyvrVPk7yXJvCQb8~E8ZDDj{XkTb=b98QDZDlWCX>D+9Wo>0{bYXO9Z*DGdd97G&ZyUK0{;pp!kP +&F*$m=-nBe&NXN*6{uaxV!R?3BxPCs^?ioiSKIOB+Eai;;mgc3GtazG!{P91DQP8qw +wx`E^IEKAGN#2^XI>di3u{(%vGq%QKTPpwLee>@y%Gg&mQvH&DSb_sm+#Zza5xz3(3$aaN>@weXrT&8 +_;;;yX~{#=#pOFHR3^2PBwSd^OwNC;q>I{ktqd9=%=x@f^OT5|-j~z;{oG_OjoYcQ*ZYV2mAG{2SH)n +UR;96?tgOGetz%TG6nSoeotDr$mq0!j*$p3&Ie9}b(^t<)X{at0^qnq9dB(1^^P(tl2rd9N2DNowt|l +;D@*!Ma3Z28$(~ILu$)&Wn(jFJVp^g&I?$|&xP(YMo+oBbFhv^SvGLURH3IdHTwv-!sdv+P)0`~$>@F +#GXjl6$*-bV$FJikv&1nR&*g$D(e)uHhkI_Ty||lJCkn +anD_A?BT`N~Yg$z1^;MA3c@`)X#qj3em1_Y06)k3fvPJMn6QFbN9jf3fzh^_G{w(9F?X4cv#quoj@jB +Jnn)DJ~#_YR#p2MX>S{P@?`FQz1JjmjyP8l}ULSs)Vj7P(9FEdVWI9a$Mj>)Z&Xjk*M=RxuwiIB1(e-u_duGu}m?&3(407N7Rv9nhmFiuaZS{E?X&_(U6J?wKM>mwqX^V +tq%y@><5m3QgDyncKn4j%-TyK&6&|t8q#yFoT9gvX&WI5Olc2`W(^aEcwAbK6)b1Q0 +&hELFA~)KTsPI9m!UGLKU*xwLRH>K+whE{j+tBPsX}^K&ooJ8Y-5D_Yv42JMczl>8^REUa;57Y&h^g3 +3EtEGEo@fIX$%~=6cXZb +w_2G>mx)p)wL8bPi=FKH>AY^JlMwDEq`C_Xe#vdcR=xlS}{(bYGaQx2cs9`J05Xa8U2=y(yvD8gr$t*(!T +&5hfn{0cK+ey&GF^Qc+jaBIGD!9TQhT9_hoNpYpr;0OU(RhMNcqXxiBp0EUZu1!DHB&^T3qWgMrcuLw +}>>aMIy5jstl|D59eA9j-eX3707atda|?I~sA^GC%5}#gz(NGn7VoIJ~P +<2Tfy?C&QquS>cZ|=P^xC^!uT^pBQrB#b9S9wpnd}x;vWJE4mYt9 +~qAbvbVRalyD!(F)U(quQ%r`OV>Z(6<#Tut(GO77MQcheZ%m#+_A2a?vIj%KV2t`^ACh2f!F<`bGDcw +LHwZEm}mG%+7XY+VJBLia}mu9snW2rr5S0=z~R(z!-lA;_UbFwpu5*72%iZQ(u8BTm))+1gIu593KYU +MIuY$Dm)E?gTQq7Z*@X=G^;+y-}w388S;<@HGqM|M81M-uch~NUG4NpOWzAp-$U<)m{os?Z=lwpU0`QS0^K18C7pR~{D}JSTOZkajkDO{a);bJ!os(1;E`T($5gRLwHh3ekBI0$}FNPC8a>d{-SEvg5KAY|NeMh6&ZU +Hz=_Bt9lxi}8LN?x1YD@c$07d1uEHT@LZgTZMyRh2K+9{!y&*_=}Yf!)!oI`Pn504ATZ`O-BgFsTa~_ +j{}OW`W@E`e~f$IwnqrCopERJy<8kj<*98lw{+Vc>*(Wg8T0g(|^5`SzTiQW;xZN5&uK5>;mIK^|@4@LO0pVF#U^v*wFc__Mjz +;}oP)h>@6aWAK2mmG&m`+l4;lHE-000yO001Na003}la4%nWWo~3|axZmqY;0*_GcR>?X>2cFUukY>b +YEXCaCvP~!EW0y487+o1niIw2>J&*6h(#=7}6k44?7WxO*cYpOC{-K{rgF==-SDAGT$SqM?Ti%TLVz{ +(h~w0*9K2w?16pL3&IdDzL}q%%)yqYi=~Q9>Dyq%9bDt&b7cbgv#T&yvyr0}(=%2^yg8sbBH`nrPH#P +yzU#0Q=R1AOF?@kgkq-f@oK5)ABa5cC_JnXmTOsk7!NGTolWui@vhh4NVQ$9B9u_8kMe+ODcY=Rqb&Y +>L6;NzmhTx@u?Vs1}dK0roq*y<{?biF<)27(I?)C$2nUMr)*S#YJa$Rm0HTmX@P$o8xz;ih1ImZd&xC +4=Z3)ukd%M->X-?MUYE&5*O;>(^0JAp(F_4^?$)s0&b`qZ*r3Nq1CGw=3}0!PnTd9cI?F)0fR(cm~AD +gTxjRd=!OMp{Ck_7sP<)oKo1$O$He0Jdr3t^LSF%e?*NP_Ufte}dgOpv;$*id@IlAg@Nls9%5Y%~NK& +V8#A>q!V(yImL9Z8jqV*V0z1n-5t&?F*zNjCLWE@{GJq^xpN0z{aHqX{sB-+0|XQR000O8CKQ-X*VSN +XF$Vwu9})lnCIA2caA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFJo_RZe?S1X>V>WaCx0qOK%%D5WeeI4D5 +p>!(Hc9w-Atnn>vlr#5Q83Jru=?+NC5W6uBk2QntUoGkokrQVO&>XeBQB&HJ0-%IGcR`Korc;du^XTW +RBfEv=Td<9YZ$ipy3PU$`5s=uoz2!lnK9`ghjM@k_Y3+C2Gfx5j953A8O=X_Fhy%6K#@v~or))A5{D6 +<2Gac+S;M7_CO5QOQ>zY>rzMFPzXSFO9~1<%E`|Gk|k=l*}Ra_B&hgLaanF0{onvo%!cSj#eoPb5nB= +D{vbQ9UOu~L=5|+3}YRk)PY6&HRF2EF`mbw%9mVNwLh{&F7DATI2=j#sq-D$Pl +?jRAi%`d#Riy#WdqUM)9etO0_@kEX}TbtA0+@Gv!z6T?>7QrH{5X8a&!_1H%1wptCSOmG6s1(Aqy~SV +#{^yUO&s81vl}p1+V_49R8=Q--W+)#h%YD}fI36%`6Is~Ql>r^jRCHn{CY_5)al8Ny7780b91 +OaqQvEaqA`p21C7B8t=K0Si{F6(cGj0a{_wECO_{E0Sv$8Nxg$4y-H%tuP5&U6K_nDdslJ!5+8lw7_~ +2s`R<2;qGyF4VIf7Hx^+^VGE7FQ9Nq>^Ziq*QQKI@w@_+s)!1Q%?|3+y%x6-#Ci4tYU^tMcy7Zr*W`< +kaMJGBZ|Kw_|DZ8R{UZy*=Xy6{zRkG#bWyJ@&F!@wtO`3U9f^l4{#B^bpf95x +Z@`9k&T2C-(yzvfrX;>_p9GD^KwW`a;4>^rDXl;8@I)d|d;c#Q*YURh(W!{^9fc=)rFR*|#W=ecZZj +GGF`jm`=!L&dn~bRN{h#B=U&i1oO6wry96q(_vSSii)YA=HBM{LkB=Af@yG +9f_*q+ka*^MrAuHVx3vWNGA-o`t=nxr|_mFS4hHH^1gj^N+VTA9{gctFXZ}6;exOw9}VRFonuv0pdG` ++MvAlKy21NJZWvv@p_x0m;9g#Ne&pb5-GO=!1!6!L{-9J6vz6n!NOXbw0J%Vqr6*qp6XP)#dX9g$JRb;uqebm%FEhffl+d#`&oyfcU+j(;8yPK!{?(w(l +&Pyi_1RY1c)D4?b3^&Z?qS{@1hU?sR@_H3VH)OHcB2}~?R8e+#@o2d$3Bk2E^U~@$O~w#L<8~gTp@I4 +y85Yg3-bJi%HAcE2Fm&f%wRSAdD-liA+a>lJy=u?-Vb!b4{k%X#1)pgqz(61rQIZcWO*%OFr{JH5UPH +~1C8kuI<5kRB*`((5#JRt<*xA+98k<|aMAq0|)kfkd{<3`vYin+=p1*o^og#O9CC>0N+$~x(c&Wcmri +X>ncb`ahX34$%+fnQCRKqR?vWT~bJ)>L3wh|I+A@%0#3Y2n#)xS>}C?VXlBv3uP52eQ;qkqU?ULBJ14vELVBk|aS`@Ot+3Y#ag#Q3gO9KQ +H00008045ZePV_8$F#G@j0Pz6;03iSX0B~t=FJE?LZe(wAFLiQkY-wUMFLiWjY%g(jWp!mPaCvP|%}T +^D5WeRr2KLeg30l0kuvbqjD0>i3r8JXeFwLZ$M#ZN$NxQVDfk62F3H5=;2|9KTyNTF~vLpAPb!fZy_J +RU5ON73DQ#xU~=Z{r1M2x5u*(}%3Z}mYzIy-pD1khE81}u+BWDwBWR4u?Bp3d+}-tebrIAhjJa_#E+L +6@ARWe#fvn&_jTX?ix%VKd{Y&GXP6;PL+UPAS#7Rs>FDx$srlsLOjl&ogMDAx~2!=B0R;d6c@6*oBLDyZaA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsZb!BsOE^v9JS8Z +?GHW2=I{SWHjYb?-ijNvv6c6o)B>b(c!MT!`x0#{i +}xv(PHJUa$xq7QPO40-3w)!q{h2Y^1i{Ja>Dh;?`<;g2w?g{j*w|0Dz|A +=N~7=h$%EreTDB%hMY^fqoUc4u7>54u#|>GYR?b4M4bYQlgd-+k@b3z(gNAw>c=1&!jMzeN$ExFYp2P +L^m8tOhn(WFl3sI_-B43b?S6*f5RiXxS3_0;ck9#T`@lSx*d-HUBm;A$0gSg&8dK3dKE#Hen +=H^Oa&diqQJESz@`Uk4=-tsoi{#R8%}ANZ~Zh`t@?Fl``AWcXfvzijUrcvKDFM%|!6r7rfhzL5Fx!lX +NCrLs<_6sJTM9NzhA)VVnF-2oQg(dR0k08C`K6EC8e3wNqMAG~Andnl6*-$^&__~U^W|01OcOwju4Pz +UIM1|epQUba&|)LJ|BLH4lvFn>CLL&ew|GOVx~uf#iG3WC*Lw_1oE?@o{&AW$>_ +k!;E17-f>B&PU}P&v{KdOr?(K+T}*12u?2T1Ql?(ads-F3Ba~mfA`tKU>q9K*Lwt$ylYnBcPR{H1DRx +0=D`Nfl+ugxs7lnM+-_lZ!T#rn4PrLOm-O2z!A>jwsb6O$XIHd16*#M_1?sp6pt8iK(ytjm3F|BzxPA +E<|IshU_sE8C5=OR*EDyL!=j-6kA-AoV!d*lkcTWj}{?;|)KNJ>dg}3^u$`deCi?8V +_B{zmtcVaWV|3f0zaNtAG@Z6H;{nuBm)5ax081_Vwz)L2s8cgPEkXpzTc%5RozxC#xEx_pW_M{#X|B7 +MnG-PC#3gyZ~EDaJ(I>Q)V)q9^pfqe8iZ=`7crCgdQiLx8F;=nkE#Vwh7g>txkN9Vcx94kZ656S?TAG +WMYTgDgWzSG=d89@P7xh@I(RfC(vnH845_9UbXCSkq#ej@kf3_pAmJO>-aw9(C*`KP@}Ci?5;t24vPF +S)}Is~47!SMNTbHmTkvDd!`4vGKCAq4CytshoXR!T-$hYj!>_Y$TQMS~YYrUhHtvhZNQIm))VM*?dQY +4B6B~!{#OwD-Fc1C#P)h>@6aWAK2mmG&m`>I^X>l|J000^a001Na003}la4%nWWo~3|axZmqY;0*_Gc +R>?X>2cYWpi+EZgXWWaCxm(OK;;g5WeeI44i`{z!8e((y9m+!Pc#F*fuEAVsA1njVv}2sU;~p#-jhd! +-pPzV1WYl#g@n!&dm3qD3jumfgk2=--J#FOy^$<`S)8$3O +QBbgUj}6~NLm<8v*cmRx7_dQBqIzLUbFp75B~=tfC04+7UfEPqV;Rfc-$@n$eHM#_`~FyC@uuNeqp48 +=gFQc>fQmPG-|#mC3c?YCKA-)()_5IgBoy|HbUfDmFzPe~-uW_M%XKI;*-|E@%?h +}Hf@y@8lc}Y6fKs9sO9L7WZ2j(SI?MFy2A;L<5$=Bc{)h3sLIOnCn$qbEx9Ud;PsS*|BZ%DWrqVj5^* +1U$a0WCukX6MC&YG$J`_TW9ozh!n_#*y?5_sh+7;$1yNMRTkgl8oQQz0F;*U;3=%+l@AXsWP58g~g&P ++c|awWS%vnC?^9yuQBtfx08!VREyps@n5Xz{hoO7r(nAVEqzKfs9I`gWT`(T@Ntm@ +rc*LhCa;|m^3F>k_K*64_D^o_jQ33gVJFn=fUrYSf$oa}wXXW6Ie|@R>2Jf=??$nL;!zZ`7gQfj3~k{ +WoJ1`m3U%KYq6UOoh7*E>eixMWC>6<%ChYkQ59j&{5n0f;w(~fk;#DA3W=ElP*&dR?AF0CUNql6eHh~#7~8oiIypkR$q*SFqO3oYs-~WjQ1njMch3#l9e}OX6s{| +3+#nwXkIeID0CDd4Q3XUohyDk%Nj>vdSSBs(Er? +1?tcimerNiXWK4L7kA3b=0!_;L`cu1lrJQ8kPs}W_<7q_AiD>GF!<@!;BU7y(R&jQz!OF%%mMR1&_p$L=6Hg9(u +&%e)jI}z44IaOset7ByhL4kKgU??VdJev1f6-Y3imFam>>Fp(ty{S5=WUwTR{SBlWmW_d)T8pwSip&hC`FnA@OEW`J?0K5$FQqt=^P))Ht;NBk9UL+ExhV1+7 +F_^SMN`kqvM9&&;s<_rCF=6tdGxj{>H@fQ9$g8Zbmv})>HsSV=h0<;!?QGb1>*%g3N>E`zJAZQ!f;ik +cSlD@pcgjN+KINJehnW*8N@MaB#uKE^N79RHD^^_HfvNo+Y}{8d?-aF@*3u`dMDUk)I7m)#Rgvfrx8_ +M!3&PcshX^2Y0fx&21%o%D>>j*TGd5)4;)zi2P6OGXw2Rn1Myvv9FN&?Q)c*|K!J~?#GmnVT-Cg8Dx^ +?~BrU-paaOE3+Uxii6n35Qs$yi2pjiDI282^u<@oqmJ_h*Yn{?ZhG%Gryw{yPUN#Pi;Yq3An>^99Zwk +`#)1qhytTQyx$h1d0tH3v|cNEnz5L>{xMAZnmbScd0pC0NBbBD)9LO(hbw8WKvulxj#KHfau2cm)f=7 +mn&iBXM>B3{R&=Mo*=hIa4C8B`Rmn#_)!l5heJZcBbR00Xd{rUcgM^1rYtvUGLk_@2 +n~DofVnnW(BG7XrMr;*61;)b^SK)2P@rZ%8~t)UZ(U)M9aZ;3Wr#nS+lkYMxDv3Ksa4<;{L2O6e8k!g +axTmKC=VTYyuo7&wx(NJPFCWNKEx>Lu*5Cak)34ZBc+W6Ty*Ug^M6L{9No|`-!|tSK0l^F5T|rK81IN7GD!JLSvJQy8~<-FpfyJ +f;3qXGyJAV(PFSoA+RVvkrle{dhi^}CD|)3^4M%`HKA) +lrHcHr*v0%nydhAbeBljSTVbtsE9VBTHn^RZ-_)Y?RCLRI9Vz7iM)9lTb>#3pzX$!m)~Ep3Ct|Y!%l!_leNuV}rydRHSEL2->0tAH#9pWS)b6j&u +8>muXk6H*hxj^B<#;|I=2KlKdugtpHq( +;9ZCjwv_wbLt-c)DK!Ua$1S)=;i+!V>ov?YWR^?$HU>kkMFy#vVfhcj6Cj?nB~!f^c6&|hOua>bKm*~ +gMBkc71jq>tw!=y#oZus>UD0GopI>@@uTzLI4lHs?u9PArtxEYC)Eb5r*hA!A3UFSA4m^ZJy2d>j?15 +SeVcaIZghtw^kk~R3QGkRM695MN($Jzos9+IBAf{kbNFvMWk|KEYV*c{{r`L=4hxy{wn-}rVuPzt!*O +%9e9s_U(fjU-M=@2}qrUA{jEj)F0UL|!8xD?=PrQ%)0wG~f9biPjpaCb320~FxCPbre58_(M*lhP27s +11qb(#GFBQ8Sera6zo+KL}kH4}?wlXR10e!$q)VD(9 +`j}8T&b|_WHjt;hH*|u10s3$wgn+Z|4XSJpCnnS$(!58{XJ!-Ia8P92&`BU<-vhW*rYKXnDih*>rg9T +k{Q2NB|B*dr!Bh4aet)p(9A$gjt9)c9>{RE>1Zm<1vn**^Us0&!Npy-D2UScrO}?HkBjRW2@MfrCdi8 +D+O~6-8qNnuxEBGBn(Jw}!iWAK1B#B&LCIIx= +H9mV+BVN*75XH_VZ3)B0AP^cT-~>E>r7s#oZ24@EWso+{H)_%6y>&? +tm=l<{|b~7-H8DyE9(G-sCx*`HQ}A28SRgVIy%}cPwSd?U{lE=x}e7KG2lf(U{N=?q?|mc>^8hF#R!P +RtONIPhVWBIMt@}S+@j76ioIh7$i-J^(12}PDdv|9q46>4hxQD5?pD%hKv^C#4;k{$gy% +wNW3T$51UR9Dc0+zgvBCRUXT;PYv62PO_nP3A<(ayEc;9f+Qotg`QMn_PQ0Tsk+qqEsKgWvmxY3pbMj +JhIK~ps`P%}7A>{3^tNG&UAMyFi#r!J1UYsv}x{fd2yqI4v(fW|X4+JE6yi+_@-d=J7ABasy$Bp8ya! +!U+`||Q=^fwl07H4^qVi^d4&Al{JV$+^mAe+HK=n5oVIaDO=96ZuhBPrWZ5N9)F@>e)ziaK~_h>Tv%& +tG7jK$Q#L{zU)1n7^Jc=J@H&+r{OZAFuJ_;_CcjKKex$ECzJ#FZ9(ZB*b4m{btObP0sXG&EwVl#pTuf +Vi6+~^Q-Il`D<{HU2aF`4aAu;{goC=gv0|;Vqj0r&;gImouV;Ns +&r<1Whdd@Hmt2&kbsFG;;RboD`gURsXqCy>9{*1Q~58H+n6a8AGwa+-FB43%HW1P=qFQ8WHVvLCjN`I6< +`F-KWejSUUyEP4!afzhH>W+Fp0Y%^k=rw1~c1_{0XfDY1RT)i}4--JI@BD7!$Of_``RmG;e}oDMMvj( +qWX6T8Cb?i3|akhzz~7&LbDM%5OY={QfqyK%tm|;(~*(0}m$B!&s>M8%lc}7w^jZ7>qkE$ODw|MGlI5 +>K$*?iyD7U$1U|@)SuIGQ9V!_KfHBj{eT;o<%->U=+Dre&IMbG=CCjO1Y``Eu!Vw1_FDn~h}#jte(j1Hj=~ZAvq>L`?tcE&NW8 +5Z)*~6HD2KswQnL4g-hQj`hEz`hI&{e9L?vx0(Q6g5&HaNa0ayaf`F+r1|0?3qoQL>Z2!0%(nPR?o_B +slM^d)bOQ*4qY?83`5Nq%XltO~%QDXw=5^Mk$TYO|`%(Xj&rfrm~pe5;LD4v7g~E$7SVL7o%j=3Mm6L +sb~+!ZCLKc6q75R76+HxyeMs=T7|Y0)Twf5vj|;^CUcZGLvKNaJt7L6ASrD7`hFeqM7+6PEH(G1#(_HfGB(-CIxzIugoC>%@ClIQ5o5S_aq`vC@@YcAP?M2&+ywK((B=9IjSdkHy(mx^ +|j~R3cjE^W?!(u#qG+N_2QXj|DJYxo276-RStm@Nr0w@o>$ewzh#pll~0b^SX1wOkJJYyd9ZD{rthh( +DO61uj>@ib(%e?-%z4$SL)Ir}hBV$1*(qH+WRAmDGH>S&MJSYufZT{MYLn +DFB2`))}+zlfIPk&WM$%E7}QEEObR-(I_DBP1WR$06KRJTeV%qW_o9-=vK|aRa?+=JTXeD_s5x!*enP +1Tv1=+OyTw>@6~^yJ0UA_&pQ^OF%*0hsb5ybA(!muL_jK{Hb#lNYLe{Y9Vu-qtqpNl(l`h6$4UG!X++ +;uM`qG%CHt-TdjV@8bns~p7XIhg{t63o0MSiSmBUes2uOlrP-6`Hjt`=KcNQ&KZ5}7#E8UStVccH6j( +X1W^DuLji#aa+_un?zJZ0`Zc_^6-(pId;?_g1jtb}L3$JL72yc}vw$|DV@x!#)9zjb_2SASvDH=ybKI ++nv_Bn5^zbnGTn)NMAxXlLb!4eYf#ia^mssw@FB%P_4G7agVnYsQL`6msHCKAxuTwLRsEvXlrF9wg5$ +SlL52IwEiqHgU+=<|88N}5?Y-+`a5-Nh5Pk!kGl9SfdQ=ex+QUgRAk*q3!#*fQM>FH@WXXMqNL*;T9Mv}{xR@mBlt7)t3FRN>tR-f6j)xwsZCYO~R0sPLfZjb#Ja9J=^@)r(a2_YiAVBdD= +Y=mK~Xk2#cg%q_cI1C_%+wZ;5a~=jxwU(%VqAcgyL;ti8N_2ugHi!BPt}6l6nPywxN%6p7oGfez+)!h#8&!93s*|(qJGVrMA5ytG_QJC%#dQL +>O0h%&%8UiN&8q2f(P;Y|8cr#Xw#1h>4eONcvKB$}6spg$YTIiyO%G)F{>h +(%~R0G_P{e9ZBtvc)dr&u#_7V2DsHB&Gk=_~TfHm7rQua)!&469E)eO@=DkKIdT_(OFxbAv_q-+85Tn +FKvB2JlUjW$yjWsT2}bg^E{cFC@HDUk}GSzcE7lRm$P<_K3Z3uJ}@qQ)Nsi^6-pI)4a%6KfSC{EcVdn +fC{8EGE~U(VC9_tblb?X=`wHl)+NZ+af)7_%-E?VXq!#$&UdyLHJgkd=qo>Zp24QO+P~oy-kIw!?ApA +cOWdO-f1ek(`KUD+UU_xQZf$JVI^%*4B+QJf?oF$us@v97d8^!p-?g)Rt*HKX+3&QgI~@X(w@SYaU7P +uqr1?G4JIQvx+?dA>2uJYwO>a`qYWIn|HOEKnQpYFs)GHy`EjFg4pb(d(@9_fFv&jTpVT(j>md43D% +Cn7kB@rKY+qkZ(yg$r}zMua%zq-7L=T}#6uDaIgvwZvZuQS2(S`V7ks#J~cn0A=w>$mfZ%a@wzNcNzD +hnGmitR+C$neb^7+t#z!iT)B#v+f8=ix_tm4&*fbV3@H0^RfC?;d;p%0I%pe_bv~Hf;G<)t4_;F6(b(#PlL +veZN8y9m2WDrscP!5w)Ss4rIr$Q_w$iO$=C^tSKy!M-GxcX3aBe-hIgP#nop|@Y&EM*sg-8DbP)h>@6 +aWAK2mmG&m`?N|IJ5o{0049|001BW003}la4%nWWo~3|axZmqY;0*_GcR>?X>2cZb8KHOaCyyJZFAem +k^atKF(*|W$t(%UqV43EQl%K0KB>x>MDxz+^G)6>( +_FHiT(uJUZd!f>@Kcew~dCO6wGFBxAJS+XldsGmFLwaD`{vk!Zor!svk?DKlVBm29^qHm(?bXLTEDN| +lVQd;I~@tnxjVZe5&`KjsFyjUl4X~{P6y8$cK{EhnW#k=>0T@Z-pNNh`)rG=%P&p*xbJj(~{IxR$mwc +I7VTxI#@M=j-m&2O$h%c8(<^U8AD^5`3X6pmLRpF5onI8L*)6wf8QWH(tVI#-i<2qt*^$df{JuIJ(1* +W0_<4M_c$^V#&v{p{g>ax=fXy?=0@I;ZS2-xjP~3zmrVv0Srk#W;&4CNEi;;rBL!gv&%IU9iu`q%bOZ<1U|q>COOuw{R&MxUIVsDG!Ll$HC;2vX2G#9wwivFnm4Q+#=fb;*qgI%?4V`;hMhlPje(HFwvc``LVceS7ob953;}PMkl +#IahxM_<5m!dSg89ida!}$dT_3Gg8fx94lC=;_=*m +Z(+jU`u-UYckfxK|wkuhL``vkq`mBf}0-%B`8$`XyfGG$Y&P3F7zYCmn%*{)6J+_SWt1R&ImvNu)6h) +9kb3*>R*4ot#9yaKNCV(sM(#2#_G6Q=o}Nj|jBa77aT3Ltn90`X`7*l*OXgRcWc)uhAM;b`k}08=9YL +hQ1cD#o9<)Hth_Ht%&4GMq^4I+6?}or5Q2&ts!%xkb1v#+_3P7_xO)Zj15R*)mw<51^H@-N9v-lk;a)6LG6Qfw`@fpwjy7Vr$K!HIx*=w7tw+BK +3vVtW>fsPKkyl;S1f~|jDFAtEJaxwPP7Lw(b@=}9@u0yAO83Bv&v=DHOJqJbIrtlo&It90y7!}eoUJI +Hmb(ma#qY7>!pY|`7mi2%MwE#MIwO$OA*r$MnNRoY_e1{i)FzHj@*3t^oj8uygkJ}DRUaI&mZ2g&y#7 +Pr2jCVD>L_1)F%ehwe(j=RC1Gnw{&QYPQUF1;BINn&6Vl6pA5nv8z;*5p +F-eR?&)-;49%-R-BZZ${_uhzbMhRK(@Y#qTT^?>p_#5BQ8PwO5v}eR)LHLSuP(?2lep8c0*8u}}B&Nn +1DpRzB73xMp2Cp!v$qy|m~n0TTePZF&~^ev=-n(~csIQ@tY +6Qf26H_#s?%OVLJB5GmE!${;nsitZ;BFIeTLKyLQG={EZB3>N*O&nhRZsMc;UfYKx=5D0ESEwLEOuM+21G{St1N-{82c_x`t_w1$j(Odc0uYXRC%R!5pJJ+$~spMgd46F&gqQkOx +Nhmye*KYFO?}bCbk88KtFm%8tG1e)po*<8rs{fBKZ@S38e!AQITnY;;<3jV_pUdYF|XXvXYNT3n*Zz6 +5(4o^){EtI)Jp4JvRKnbY^PdMY|1qRYSol6_NHJRLm<#6tJ(^PNUQ9W6t5Es+3N}9vjxe&cqR_JWaR) +eUT-A?*yU)_OS&#k#<{!vq;7)I6%~iktX9T0&>jGM0$oO2`qHR<0s16@o-o0N1>ol3%gSSId-F3YQY! +U8#TH*p8W=HkA>?G)Mhh&+8x&%_;}W?b$Uzbf<_CeaZg8To?qY^=Hf4o){C?)eOyONHREXPaCo6ZJ4&wrE1>znp8y8E2CB!zWXh);1Ro5 +W1z{QXo_Zbl-Jm)r-YhebbWh7BvA)qBvzg3PdC*NTjOt>_d@=Foc-5htb9 +F**?o*1k~$0T&R$^9gTvf>O#GVmsRJ~pDeJv&7{h`T-V92SJ`7f(C>SO)aazOv()qW434GgzoqhBOzN?Ak^NZhca!{0t!=CW%2Z(F6+9X1YV;nz5=;q@mjwv#U84Mh-^p7zn_ZOC)xw(w?5QH_zC? +xhleHsQ~=+O@%l_|_<*FZcZR+8E>t^U9<9Q&j#et`JQm;uK3yeIm;F +$2>^Fs`-mc$`c9aco@bc)3{*cIT;@ExuaYZ&8#{VwrbaMT3Dve;Jr3el9qwuM!WKYAkrm-s2&#(3PO@ +U|!8rb1gL)d^xlDH^U=+?6eD&+IjIVP7v+Fp=hUvnJ|i!!MJpw9!LxrTnD&V +`{i!9GKM`Mt1d!h2{ZX249bYw?72z8t_659APi#0_7k*fBU;csJDoQ=m-snzUB2NufjN||^EC7~M;xr0G^9lT%!{U*ID{r~fl{hu1 +?oknPRzB&mj%~#9tbi;bZZdsJFgpk5U0gl +g~}>%n5BMXcpo1wjiA5?j2_>7K6sroMF4Z0+m8kZmqY*0fiDkbAJP~JTc-(B?+0;`xpx2u8jF+Gct-N7)78e_L^t(2;AA^C7ezimJh(o15g0FU +kK>UCrE$|EVFjOQ?GY{RV!#;h9Ld|W>&+jB!TTv<15tv-Y=rFE&?J}qhCPyi+t-*MzBP|gNUPuBi0t`Vwc2d@f3RFL8jsQ%Z0&o!SzJd>RN@;HV#w+Ez +t)BB8emgvUcTOJ9|gYtQD-7~P*lwJX)SII5GSK#7n2RI{K|~>g(oQDQ_wvLkC~MU(P*Bz!yu{c{wTe@ +(oeVW$@sDcPYrCMIxVgX?ct`z%bP&=7Fz)`fgV6{pnGQ<_*xM{;eZ7a}J{q&T4Y +jrZdo};;aIVD>$355AP0S1^cz2BYS!~R;><|4tzM+NdI*aY8f)6iyUN?t}8xJa|>I?yM4DcXO%vi5W} +ph;y)ob9&V_2J61mE|aHjCnGDr2NuE0^#$^@ZA3Hroysp|tM0nvu8 +n<1$t83iqm+sD1t9G0_<-+E*no;dujVJ628|d2bKDR0X+5_QR)w-h~^1ZZk5&X7ZW!Ia3UM)@6rA8x7P_U0MVVJ +?kY?sD*GF=X!o>8t3lH0lZ;4#oxSldBKcMatePsoOMX+k%V=z0=mA03kDmMTGkTrPK|Xs*$4|9jRr3P +#FWmg115ac#NSA`$4BE-&?z!R+RCcJuJvvqsTBR-Aexl2(MEHq;f_>TIPACHSU{&{AgV#1+eRXjP51t +>(Rew_%MxN))~Og7s|eqt{L~`*8((EQ;4bwz+!TKFm9LK0b4{AR8fmFYGP1Mm|z~!IWL!*_&^)+q$ep +ZZZrook$fpG$DZWvlKd3@F>c11%RNP`;XJnySMLw>viK}6uhZ=^?ESf>!ZWC>Y5vtsq-LxatERecBaw +-4KhsJyz0~wV|aSl^8*UUovP`*WwfOKz$&%ZYte$;b7h?LAdAplSZfaG*Ub%c9bZ!Rx^9@$-ryweugu +h2_ER}T+&b5*KSuYgL8rGOm}d>E*mFc!gj`sNzDA;Ig%3f=28Hn_O&*$ +noDu8cJgyva{gdf1v!5j5H9JDctlyIv$yy+Xl?(``>!AZ33wPlJh<|NTP-%~G8==@ti_decqb)|2lBP +kRvlFFW=A7oK>(dfI(_U*CS|*ITkL7@R!=s=0Je)&p{cyu3Lm0G3%xN$s)X98$eXXi$Z22< +r(2rNixvKx*-04P)h>@6aWAK2mmG&m` ++tv&LDFO0012(001KZ003}la4%nWWo~3|axZmqY;0*_GcR>?X>2caX>Db1b#yLpdDU85bKAxhe%G(qk +wznO27%PLZdx?z#I+UIGfwOo%jqMz1Q+DiAQr_gM6(b5?LFu01-k?&%V|5)>LDhH-E%+Rxgb@ic5Jbz +dee7ev0!r7s?IRJ(yH!_SlI7p7wmp3*jiM)uMN|x{3HxBawk-8GS+LcW~&3+8q?Nt#f)OIS<8|e!OWH +$)+m3N?YRbOx)r6Yq`hWMcY-WlzkT=T7jGA@?tXmn@$LQM{>@K!?>^q2xyMNL%-+j$@wp +VOk*d-D_Pu5L!GI)pU8lM;;QfMW(HPl?nmzEk7he*0T3EOOwEC_Fg`b@*UOCg;GPU}fD9vnshP*y%L8 +S7XYLropESanrf8es_t6Jn|W#4rm%>oa><&6MQO*g}@89NWR&NE8}|AUmvnrrRVn^~6g;*7!H`T4njz +)ICra?^Jlt&*S7bN5WMk~eHcP6b=687Rtwhbz^=w^pgTDC{--^G3N1oPj|DtZ%=~Z!*>izP|k~znO;% +7!Yv!J<$1yH+&h*Yv0TQ|HEMC%`gq)#A3y$EHXT$NSYpH>xq{>b5e=`4z~p`_K}oe+K^R$EJGmHd)+CiD33=Ioej +wr>>0JCQklRZz3fM~{!YDdN$x(~Spi3ELd&0&Tv1?7v-Zc1opd=n3vusAMl-WW+`y1YrC?L1`Fy4tF( +=$d1fC7%9|B*{5mEHpKfS3V6oIbn-Y!vH!@TtQL@;Um=Ju1wh70$?LFac?kv8q1oeHvt^H5%B;A+jn5;L371)UzP%-XYY2>#%>a~R!g5_v2(l`j2g(Hl@1# +C`5PH)JGFxJIItx?-PG_cqUUJH##M*BJp^jsyCB|f;8(K+oKxNAy0o9KD_M){-`zZ0{dWEQ56`}P{`> +2J^#~kkq2^UU8@ZSAf&DY2yLVhK?*e8*l;@Wo_EQU{D)EYRnA)pvlpU4E?Shmkq;tDdB +`aRaL8>XtXv>FAPC80T|D?R@y;WDjdRxLr*&qa@PFvk#Chb8$32(lfXGI~2n_}9z$#uE)mhBvRYeJ~6 +&@^7Z=z>h|A2<<1himHAO{5ga)19mcrLgNx5Sk;J;YXwjY5<)j34go{a+ySiu +In`JvTJy1Y@TCii5PHVikS4y;k{+@t>wY~%;8t$7?B)B94D1G&NMH4yw-z2DCN>oGebZ101b@KEJv@- +AljZ1&lS!4$kR| +kWxv^PS-OHHS(@X}u6^`0Mef)*v$P|&fjb-b81V96cYPgug>(hjmiRt9kkKua}i5T1{!KN#rS8-Kv2E +E%$s8%jp3>A+O=5LB@N>7?PG2CHf036|f<1_l`_vfi?B09EXu`i^ZB9F_J|kA4DeAfG*XULhEA3m?Ii +d+guJ8lod<5;6j2=sY`y5sN|YG-Bs_Zb}H|a}eGlX~d6d$b-o1#5(s)y_NZ*i02pE_`}f_VuXI&B+af +544QN3{?Qx-jp3;Y>&!tpOos@Si^WWfy2@-kyOz^8pnm*uO{o7mFCuT$Rle{|!L9oaa>+G}UB1!u9WA +t`?$g!$hy+>fG(m-lWHHmHr)Z)rNN_5`U-!)Mo@<=xqPu`pcXF{S!%;9vPTwa=%$Y!XhMV7UG(@1$Iu +?SJm1Y(ZH7rS&K!VhLVuLwnu`vBp5Cpbg%RsQD;ROf)qA(Os-$I15Rf4)-vWV2gJRtlF?PP +quZz%8#n@t89M3{)$snb7e4bhGt%el= +=^inAwy-g~xUc&eosHAFGab4%!SqEaot!M_uXV_}iXpFI8BQZQS%mE2hCzB+_s^ndR}0aE0zhjFD^u!Tn*VCN56=m +^vLM6b@mmM2y^TX}jcJuEksWbkB=_)I)@qGptow;v#)$zd}78*d%3l*5HOIbW>qs3vbEoD~>Ve5ScI2 +cO>KB9QwhG6*vKhLUKHGEk|9!R1Dc2$aLt$DV(?`3BsfBL$0F-^utqz!a=4{PrH*A9FF%L$&OtOFMJt +*$u5#V3I&3GCl_af38~^_=9KD;%k>7+KA<0+qjvV?ezN)3(;tNmcy#XSN!tCxhAVm664-@2jNg23m3!;`3XE{d$yC9KT89^*ZU-}{NMQKR0^KHYL}`{;*uPl;&Qa@x +WHF5_<~^arSQl`QE=r6ov*2a6j?ExC9mEP)nvaiKiRd8j1+Gd>Jb3PmVToDCLz?R +@Ko_*ne<~7fK2u;P)h>@6aWAK2mmG&m`=kUZ4nF!0037R0018V003}la4%nWWo~3|axZmqY;0*_GcR> +?X>2cba%?Ved8JwVZ`(K${@s5CQKOKJx=J6wqGw#1J~q8A(Cv29^bWWn=h6~w6Qx8gNhS6E_4f@)$&~ +Fh_b|{{rsmC=Z-(s3=!z{CtJbwfEEY^wjW&+)rPZo+ViA6iRzy~4r9|PRu5CwG^GcMiZIl=VnmiZZ3( +*XSKInqe!Y6L5I5$R{(P-2fwcySf%TC!NVYc+JGJIW$+GW?H( +U|>1FkP!HyXCcGPP1B@iYxi2U{GY)t#lj4Yxc|K<)_K#DGT~?Fygh6%jZniD*tg=3p-oso;n$ +qK(TIxMh|W!3myF`hIF$7f^g=Ehj6_WUm|e#!^#EEZO2XO +U-!6oNu)rC4FT7PpJVq)>JijX9;b%^0Oad?d@_BPB)m$U6crE&cdZiDX^2_@6Pz^pPts!Mk2-=YQnZa +pNpy!6ZA$5^DN*@>7Nv?2-SG$_lm*8DelxyQEY4Rv37nu!W$*gh(rEb}YY!ay`?j|2mKvGr+bDmXTvK +hR{y)BXJHP4$%#P4KY0o=N%s(6{XmQ1CHk~y3#kIoaVd8oPXyP`p%rq=cB< +^zI^$TeL?p2hJ{8pKRH=zy;dSeRi0E_D&XNEV@}~uSMOv#+lJpj0h2*b +Q$QQHKl=RpUBDvTTARf5L{9*SDr0!Hy!>iDZvhhA3sJ0P^u(c25N6R|8g$E%&i{L`ax?KHtZb%{@vwG +dXZLK=(cT`wjeFY*ssL4zQds_uG6g|CsnY@*~Ku(%A^!p=a*_Vv41neniB!LDO8Uq_J*-7GDY_E4w#S +{td%gO|z}f7Z3TEBc&6DFBKqi71(HjrUa6R+1lff7mSG#;2G_UggLti_Mp8)mWF01FP%6m?vPkz!Vx@ +tzw(jtB4N`4u;7aY!}T)JoP1S$+qakhXrwlctL#ucY}h2u +TKE&usIRtjkF`C?tCISN3F>$%UpPNGk^8O=ku6j5Jca4b1VyP{ht={5^QnnO+7B$E9~m1M|Al*hN2x= ++>|1k?k7kebtG0#GcNv(5sFWwQGp@cSj|)G+;;RJaCk3?hkzE_2_V4lY=sjU6?x`i`6RNo0o+72R|!6 +ECc~GnQ6*w7mlzwdnbh|1F&FXxBVW+77c$rOWx(ZlwPD<2w4U<^k&E@$}Z +Ubbn~ec0AeP;Vp}DX4KB7cWK{=K!ZN6GdU(6(TLe0IV}EA*9mGE^=s}`bNn>w`Lo#kPYG92-za(f16u +t?Dmua-p$lCK^mNNGu^GkVSZZCV#V&CLSA{(f#ax3!1 +1~)B~8X$sqHMNCmDiz5f3*vr3Ok_B-b_>Ign?%akAnn3PM+S`)TVoy3YF|rSycgyJ{S>a~eh{0=XpsKqL;7Ui>eoVNKTYsp3^*puo#}q!A#5Dj-;H=-R>R-icY}$ip0TIXPS`sc +dmTZ$M2)l8a6=n9#a;>nVBs#_#f;e`R+G~jwJn8P<=U)IHm*`9W>wJD$=HU=w#U!&XCZYw&XBK**xCu +Plh)+lUu7r0$Dfza +qULQ+@nX~W>Wi>-;leKiQ}`%gDNbsCA5QXAh_Pp;W1rm3rJr##Hy2b*;rnqqm*rUf&8q|I8+M&F?*7bc +vx8wykH7aP9};$Ur?3ulQ%Prur2oq`Kc20H^Yw +IOI{TS!%8>%1^mpTj7vQkkI>F1~B;5>dLHdk|rZ#!(R&==+XPhSQ?l$S!|9{E90Z>Z=1QY-O00;mk6q +rtKr?zmu2LJ#Y6#xJr0001RX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlacVTICE^v9(SX*x!xfOobuVCc|% +c-om4HgTeQ5PwYMT6biLE=Ro7J)#`oRL_~kh3JmV*&l~`yF0JBU#R-Z>^A67xH{O_w#X7(;DjqS*y*Y +vZfJLrweaP?SzVJt+ZardXm06s;Th9x4oNqyMH|qcm;W{8p@)L(Z(CCiU~ay)Oztg{Qk~bW1kTTpQRg +#PF5>f*Q=FSieIO<=Cj=2AnJaYTwu%nmMoOVf8QJ7_boYLD)IKidnfj$6NS{Gb0nZq08n}}!g +wwG7Hd)$dtf!DB#SjKJyl&DL29)lL9MClm%HCO>S!*cE`yw@u|ICF2^J3fffYmclI0exTmlYZcMI{4 +&a-!ouJ?i-h}{Hja8~xW6b@diDd{03{sm!RF@9lfyAsHNY;wpB6EPRJli|!x$V+$oHHfOe3AMesx;cgQ$6%GIm{6sx4F*)z2_8-mq#9+GdXHrs36HEZN+DJlhjmgEYnT5qh2In +o*hW8t=_rBET}m3jmopB5a6lasb=Yip^ZV{gE;&q|l3#||IL1321b&>570;x$R<#fQD$0#b~CvVdddmA^u=bv|fu>BQYnhukxx;|Awtz>v#+s~mgwSy%o|w6#>DNcG0<91PbKP5NYBkIrGc +$LSC&l5=<82Yac;YTA@MBR<2b+8H(o=ZiHbD4aVSiQ@}7>}Qub(-0@s+L|5G2ySSU<5E~mCaU5#yugt +T`mdC(jQIOf%wEmKcd3hAh=0X?5`8?6`C`dig^YnT`@xCz9(hp7uJ%C+pT&wd?NT5oSzep4+4<}{^i1|jQa(mIKW>et!&(HAB|=FU6IE@bpH1P2>D933pwJnKVcNjkf6 +nJjhTZ*^OXS{mCkVsj8^6vtW4sJ^d*D((q%>1!3GZ0+i +iapY)$T%E(n8ve`}O9_B@zvt8jX-!NXm1ZxHf(}Xvu*a13y7TU|00J~&7!M^9Fs +#%J(y3j6X9vFmZf&I*mv<&C&G4}1)M^G7(#}cW<&S6 +>7+!(Mb +j!fdB5H#oJQIp73e_Z6Rd+=*R&XqEz@nb^Mv9?Fadzdgoe3`lABT{kg}eJPTxw*E@8Nc`Jhr&7?Q+<2 +nfN(tV3`>Ld!gBs7II<83N|>ERs0X!aAi6#x_&NjwdGf%$H +?!oD%|8y=#Qs>W1WiMVV#b0i24$U=X!=P;foIFXDle9`_A95=vjPA}P%nKe!bMfNEuIEol-x%@dFMm^=N! +T_0)~N?s^JPdrfJJjtnC2r_OeI%5Fi}>~B?HlV+oHB0h8s+9bZ$cFCN+v%Bw_iZDD^Z +oF+M6elTW(4y=pkj2bkjjq(DvvG)Xw}>nY19C_ER{DZ#KcR)|HoAtDf%wJyBop77{L78S4Fw+}F+1Wm +UrjuIodoMBx^r<8H)g`})`NF~!BgTbiE2D0l%c$%=n*?e%UpgbBHtGO3+~4y)p8&2W!!kd?TRfweWH`TI%^`h)#*N!xWxtigS +nC&W5{rulT70!haIgqim8DYCa(a9g_~wFZ{Zx%^Fki#8bHmJ)hG2IuYUla;8nENC6G^Rf!wL!3jhF9DF6T@0001RX>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2 +ZUtei%X>?y-E^vA6TK#U@MiT#DPq7!HpoB_{lU#c)5gV`_r7`L_LFBZ!O9E;|t}NEnQs6Ev>xu?>jRW +ppE>ChZ`#~;0cM;GrAaOqi6 +HQYl9wB~$T&%stCTGnmsBS3HJcN;U}XB!v*XL3z9(ZNjtEJ4O!HU?dAyKv72LmXH}l1cMgDq0<@(Cc@ +~ittQ=d#2Bd^BCPo9s-Jj+SUBu!G`Yc+x>TW#{>Y9Rx1YCn>P`wt$H*@jG#C8#o?tAuOnG>I4&EFdS7 +Cqp7Y^7+~6_+ru&tt>Imvn2_`c_E9Og(03W%Oxpz0@|`LO(e@{DtbM$fKMY~`23X4SSl>j`SHp4eA4U +nejLA=oV~aphs4|WzwsY<@NADvvLz#&E*UWJ%2+gqrLx{QKpz7Z> +5h@$>Nng#V(>>m?!^9UOe~-RNMHc!B%f8)}N%(UL}^2n?5kage6=-B7`^gv(4UECC#ma=W@tc$}@p=- +_XE#r0@~AAariPLEHYjZqo++>6H$b9N({hMWJNwjlX`Rl#7H|tA9s;wt|WKdzKpXYnUTW=5v-qtP_QG4D?{ha4O}B+)`2fP%nC0@(S;Sa<-ay&cix+I87wZG;92wky2D~qqAqa%B0z+ +vH?(CF>OFF%aWe>}S&le6zHe!a@Gg2!Hsg9^bQW(}i0OMgHPQNoNy*LU!^2siu#@|VM=tesiyo?En5a +xhup`=0iXLN&<>iBU0QWKM-tfS}ywE?;7-rBpJbijD<~eFZ+&_n;~qcmu1m582ImY(hHCvg=~iS1>if +Z1p*ZC51iMxWqGLgZ#gMen3W- +>O_s()nmx-LEyqnZ>x6bdvE1i{&xO0C*DAV0_ +zbl=+fnbC5@NWVlvn3;5a-{Wd#Eze5jt4o{Uc6!>N*c8 +zM<)NQhgO!-UVXk_BAO>H=1(wua`&ZZR$O9g<3G``QDiZ)(gcd1A0h0*tC`A)ts@WJMZdJgQ>u*ThsR +!sfb-@J(Pjva78fn_8q96)Q;})wTLp#Dxc|?4ngzKKI_{LVU~woVSXH8$Pt#Py5q*W#y&# +d#kUD6OBLJ|H^@s3bhi}m?aY>xCeSVgBw)7@6e#!?)P)vR_~**R<2=vuogxz8xS)bcnYWEHgubV=y*F +sZLyMu;j1J@Qwz)qYC+djAIZoeuZO&0|Bm(kP?vbzB+6=b9L7BD!nKo<%fL8!*=wl?_1ImhB?I{YZ?} +EI(d^$SNbzDV81cru4D7z|ESrlR_W@CHbCus0wR!9~EDg>+YeoCQXNFti*G-2)>mHHh5oNQ2v!M+MKF +F;QBEyhY5mMj$D7^lgs1mAlTwx{@Z2IA`|#1~#GKv_>YxN;qtl-aKIG4|L{o+WmTSevlZrxH3 +_;613|@2RUOwih8RJoxr}+*o_?ZOUL-ub#A5XRPc^Ov94!RRI-vPSX^-w=%O03By1E`e)@51UAq}6&lswH#BFl0LILj$YaW;q7aDYUi_ov1Et-s!5q1Zcskwnk~zR%`VXF +8YMg92zXJ-ISH~#~T#~uj(teqh-sHfV_I4Y*FZ>I?I+0IXv7Tnc3E&%C#{PoKiyaYx0 +p@o%uz#hK1_&N=Pe(- +s1qP9SN`lU(3khl^qfyZl_hH^#H#YJoKZ13X{Ct*G80SxH(m=yz~+l`}OYRe2U8yXtyinOA!Neax1aa +M$=8d5zumB`6U!5dB#Rcg1#nrf^p+tZbnVtqIF2=3uBXe;YO!YXwlv^Xdgu_wBGYW2iHBbxz2cUQz)Y +D%Tm0a@|Cyx`oQywXuvf#e2m#s46q$4xN|_%LN;KW|vmAH`EQZukSD8h}-X>v +b+-W>}^MN2SMA}bqWh$<@P&cHyds_DawRl)25B;vIm}w~RC~hZ#a0B@~y2hUr8VSbiZw2->VKp*S}oiQDgI1R&V1}kowh~ZL83RSEzEL8ueFzJ)0#bi7wXP#7qn0lJ1pEd?zBnH42Roku6gR2=R +rD8I86^P^TL_0{FZZm;*47?*?DY@*WUlleXUJ*GDwH8njoi8enG$U@x#BdN`CzCA5$l_tj;>wtdFhWa +X9{gR)68vX=r@EgLy;P8vX!u}BQSy7=!XC1Y$ +IYg`QFBTR4JNv{xd#F1DxC_`oLqz +FP;=$B8jRt$4Q<43YLYLt!Cq)54&R$=r@VfX7%)Q#^WTS()?(|GqTKb=VC{10E +C$2>pvMi#|z%fwwjoij7O>;Q^CDBYEK<#)~ZM6|9EgCNL$T9sRk`Kr&!WQicB_w_{ox;}+f%Z9-~1n%AZSbz-L$ne7j;h +t9m3yFKDuL?*HOuLx?42DXUjCO1JLZ#A;fGiTc!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZY++($Y;!Jfd5xM)bF(%OfbaPgYI^V`%2;4N?3o_=ejGZJ_L +3gn8-uZ8E5_gf+&JyDzrBDlNV_Y*IV4^lR{JHf?BwzB@!^5hpAWf}S(5KmwlAO4cq`MgmH&r7w;O(s& ++L8&yWPO5oK**@3YNtu`F!IxNq+t;)c#Oy*w_1?%vlPDZ9mzoI^`LAjn68((Wy#gR>}?g^7`$Gl~S^o +-@bnTDEN+ofcezLvHWD!? +#*DQTH-mHE;e?C0C{QBkl%PaeZ{nMJUxMZq!O>$BHT&g!7E;g;W{qw0~db$2V3`PJG`aVY3LTyjYl@3 +bI6b7NP`@R{0D1_2f=4l!V%Dc-cn#R*TxRqh;&Lz*i{XE83YA4 +7gZMgIM7RxUvO&h2l8F#tx(d-h=6CJm4!M;0PwbA>c{<5J>BTzPV`ty&lvqQyM*#8IShbgPB=b!sEfr +c$UmS(3@jpG}p!sq%+flaS?A}aCERg!{hRl^I#d;Y%~x1M&wI!D-fWX0k*l;ttCL2oZ@=NSS#E|x%TN +e5+K*S83)xQ*i?@bOfQX190AdDngXM_UUwk<-dt|7gzLtGRGxh>=e+^#*SU#6T1QD#EgYXYRVYY +0>5&d`Wg9s#X|8=}n2Sh@r0GrR}?QspI1XT)(xA${V8_1T3ZNuFmKn&$iFjR>qyqC;u;qycra1J^hD9 +~;@E(z9#{gTyMwNE0N86RuDi=i9tQ9&W$~f1UH);qgfgnnDJ&!g$4C<-$x4;nca}5k)J5 +ZVCTHPzP~||j7lBgq1`@q;N-v4Fpcpei5C#a^009gTb_04e&Po+s-RBh-Yro$+I@*t6;xbWq50YrRJR +a@PXejWRLZkg@O4gr_HWNFnmPY%kCTkU1rmJJe{IDKtd|Xh&i6?dYZCM8%M(A +tOuM0i_KGo7N)4<1P(#2?Jc(02del2YnRUf_VI+p+uwLSxOt9!fRU%psCv`oP%Peqv+Zm0X$NhWow5v +^|~hNbr`F8Q}t?2;1EuthK#I%6{rC?nIRL~fTIR@gaICHfCmhKBQ^?cLENZos81N+(+2p!063+g&=w5 +F38#0YHofsV5La_l~jzz38)wgaII60_HmJ;~3*l&-+!Lr +{vu7KyILDXB%3vXC>f3oQWr2!HVfe-`_%}1v}-~pIPbjKNpxlUX;rNvxDgi9B7k$3TZmh*S5h(nijaR ++YIo;ZwdVh!PkW0{nOE*(iSPAD>wl3L0@uKY@<0b1lGIUjd#r|LaE$6f6#Y9W6=-=XdsT*`#5oWcOqm +X@=09D{4~*hn=}7mbriSsv6|^{&itw!)~9-d~f-=on}3u>C+>E8sw#jf-Y*5V3IggTfW>y2psSa!MoS ++SDG=OLUWvV=+K=9eVy!Xe}Xvx^Gne2dHl?%qP1E9rHpOZ=WPoMoHAz#C4;_ptTiheH#x!4Mms&&^n<86n}2=~{uZ3*gV?}OU~l3SU@5I_z^?pK%7X9YTm3ZIY0oD^{Pghe!~alA0|X +QR000O8CKQ-XP=7HWL;?T+83h0UBme*aaA|NaUv_0~WN&gWcV%K_Zewp`X>Mn8FKugVVPa)$b1rasy; +Dt(+At8k=T}Urke!NV+dU$2=Kw?p3k^#JRY}YmdRJFf-{gDK*RC}x=C64{(jpsejU@*us@ +Z*4Ml$ENv+}fh~DcBl?jXQt;HB!)b+@fTLIRv-EOOC_pP+AlN7-g1~I +8m)KY0?oP`N22_a9Z&?~pz_9_K@Wg5B&XsvN7xW)}g*8C5L-os+CfCmLqIl!8`cYf)|j$7Dpf#APv?^ +MGaub2?0UXD7X?yh8^PgyqmayOmLy)3^ougfZ)r7g-!6@SB^2DPCVK1EcX7a|C+DcO^J)Z-!IJDHXw= +t5Q(;JgQi0xN&ItuiOzGG09IFsm(X?@6@L-yv4hyr|K$A|=dLoWJJjo$)*!=aTdew-t8iSVMrGPnwD+ +s|0M=u@or17Jf$ktS$Q-J&K+Ojue@nFI#~}hq9)9N)lc}J04p99z96{L!d1S@y`dKUBZuWPL`(}`SsD +?O3t(n$;lsb(I$ix&x%VLLAh@izJam~G-VkYjFe@=xGYQ3wvF#9NBe#vJLmNH=B5*@uo|o4uw(A9EtJ +{boSP}w80>igP)h>@6aWAK2mmG&m`-OnaHqKi005&I001EX003}la4%nWWo~3|axZsfVr6b)Z)9n1XL +B!fWpi|ME^v9ZS4(f(Mi9R1S1b|)qykBhTqLms_+Z5nU_fyS$T?XCv7}b^HZ&=4m$7{5q5UJh7AVl(d +vp6s`b#?dB9|}gVMnk`ayj2OkDZ+vy+%R2q|wa?rF_*rZoPW-s?|d9xhFn})H~MWgmEU9f3AF#_$l%+ +qX80DLUX*Pk&+H+Kq5v)XgojbAVvt9oqwE +M%qNn2NjRn<18QmXDv9rq=dDtnCdBg)y<5i#M`=XC1mcBYQi4OK1$*Yb8^-b1blpL-)A3|B?*Ofk?;z +#&&!l+LvDaiM#M+n3>2bT&YAwkMVa7`7V-Z +H&L`m7Lkx&@Ey6q21FUUh$ABQ?Z*dx3#Ug0xz`xs$KQ%5xOPwHAJ5Ox{jE5&Y>fk=4{JG=b0uk;cTb~ +be9yXrqjyKOR#FyskB{FCyMw)8A?7sN4>CKwJijp_;`hU#Gl-Jal5$Klci#uF+e~V009qCVZ4}SJ6ltuC5!UteWax)$x}Jlrag|RxP=1$)rL+lU^QJN +oobAQ4ne|jc|B!nWUr)QdXBN(S^Rj5)J8PJ5|}DCc%m!1_b#ShRAelBn|*WI3eg84xv1&^g}$3^8}QK +1QLJ|?y4N@fp7{vsNJq)qfR-2$&Z(~+KEmhsZAw&vB;bDHj_NEapY~*cNUw;bg>za;S1N`hs6dD!C6N +$I_+&#rc*or{Js~i(Alr9_l6q1`$6l*goDu8Kw+V+4bd4~Y`0ljFE+=05iC<_RekyImp}3nlf7#{#ZV +DGgel*2)m#;a+|FXx-AW*btHa?AW&x#{0lz-l9Qs`oNqrU<32RIe=U2`t=$`UhH2(al)u3QHfiIBv`- +=_PPTn27_lc!o@V+~q5-%y9`DpFS +Hh}PYPl#_pbc_qF+nVrn?8G~3+2gUtcmmUfOCvcMu3)hBaq!hMV}~_1WYc3dk`$-NMvBr8Q<$`RKgBd +MbENHNy>YS=+gt27JAlMcdl*iJvVw)s?}WZ3VHj88YI#QnM@&%9rwKzz^gNm@=c^GBjdVwjnl^f1gtK +%i(mEY|KK0G_QGjzb6?VKxr_<@#o+=zOEX$kxpB=7eyHxVz;B%okYOMJ4@$X$ZO7qS$JSt5!&);qx=V +^5>lp6i;a=LCaR&&@l-4qDAP^oD|mgclVW__3p<&iB{_}cF1n;KjA6>b|{_^J6Ms#r$%z(GiAkd@}#q +&55HC%-StWSaC-Eq7lwH8H;&pKtS-{=Stj%P>i&6UVSOC7D(uv$33H8&Al3TGr&5Qny3`cGLm;0{Hri +%>aL1Y?i~FR^vfQx1kcSG@CFo_4b1Z?77^Vufhst&VMoKH2 +V;o!L%pO2`O$khyK8K{<1Yi#`wP)h>@6aWAK2mmG&m`>XU{MMxe007ev001fg003}la4%nWWo~3|axZ +sfVr6b)Z)9n1XLB!jUv+b3a$jU+W@&C^WG--drI&4c+cXr0zvowol#+y{Ax_se4hzur1qx%7bueHrL6 +(jhgX09*p)D`_?I`w9^rT%s>>^+8b1X|b_p#io-V$oA)BJKImZjMlHk!?5qaobyiW17}v7&c9Sr%j`n +oOFLuEyWq|Em``%tbm|WHh6^lw~^4#oUN;O5%EFwb%|XCj2hFdfG_M7dJM&oR%YTLXQ +7P^p&G_UW@Qbl<|Bk}m+xGM@G@#O62ybaVgrmb}KTEvu`zCAZ)#SGIn_*-2Ha_5HXz!du_h8+ +RIHHa>Ozr}ym3YMI_W&3V~>{jOq<>Aqrl1d4rESKp`D&5mvqd#kNj>_urw&R*EnnQT{wtLqoWA>MuAr +retPjHJG2YCW_$b#=toFT9w|^)jQ?X?KgRrcTn_%*9yXX+Lw9+SMAloYA>D6hM +o4YYor}a=89!NdIj_)3*JGa&=Y~0F^v%a;c>}_Q~##Z3)Rn^xqHo4pAaEFfhfr;m<2j;Gc^P6(&{v_> +=T)g^|qg+A4%KVbrgT4LENGxocm+jVSgKgUq+d@s}clU?|9)B9}Z6{p-_%e!tUcY@Q3(_PW +ijSJ(Z1YaK=*9E5N;gbzcw7sCAz9)xh{!_o(N7)(N_d}zZp3ZYqtQK&Qul}4e`C{!ASN~2I|6e^8ErO +_~iaR_AyL$#3#p$=iFH}drg<_F9sbBp;QbDQ~5&1S1v=WV{;VSdbf!0a-2m_6nvOy4ZuDc>gFBi|t39 +p4(?7vB`$krDG#<|F2q`5E(b<`>LE=40j&^O$+UJY{~#{EB(T{F?a<^9l1?=2PZ(%yZ`V%xBCC=5yu` +%paLAm_IRpX8yu_=^yng4qh|gFel7knf@I4L*!48KR*8K_=9uFoHA49Z_MAB8FR+;Z`Yi;VE)1MuUEn +JujP{YC-aJV&Aeg$#r&K35A$E<+x0teuzqKk=3v;zB*J8X$u1@jG1&iP0xUpBQ~4`bhMV=p)fbqK`x$i9Qm2B>G77k?14QN1 +~5JABjE^eG>FZ&?iBk1bq_pNzf-jp9Fmp^hwYsL7xPD67)&XCqbVCeH8jA^ik-e&_|(y_`e^jg=%dj`qmM=(jXoNEH2P@t(deVmN28BMAB{d5eF%LBeF%LBeF%LBeF%LB +eF%LBeF%LBeF%LBeF%LBeGK{-^fBmT(8r*UK_7!Y27L_r81ymdW6;N-k3k=UKF0ZU>VL0K_ya^#|Mxa +FzvaT$hySulmT9Kjx4%vQ15ir=0u%!j0000803{TdPMH5nbQb^s02KfL01p5F00000000000HlEc000 +1RX>c!JUukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`-N@Pvb`c003_S000jF0000000000005+cL;wH)aA +|NaUteuuX>MO%E^v8JO928D0~7!N00;mj6qru3qg%Na1pojx3jhEa00000000000001_fw%zx0B~t=F +JEbHbY*gGVQep7UukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`+Sf-XSFk007_|000^Q0000000000005+c +1qT2CaA|NaUukZ1WpZv|Y%gMUX>4R)Wo~vZaCuNm0Rj{Q6aWAK2mmD%m`V>WaCuNm0Rj{Q6aWAK2mmD%m` +=ssY!O8#002vg000>P0000000000005+c8z}$)aA|NaUukZ1WpZv|Y%gSQcW!KNVPr0Fc~DCM0u%!j0 +000803{TdPCc!JX>N37a&BR4FJ*XRWpH$9Z*Frg +aCuNm0Rj{Q6aWAK2mmD%m`?vr(~s&d005Gt000&M0000000000005+cw_E@KaA|NaUukZ1WpZv|Y%gh +UWMz0RaCuNm0Rj{Q6aWAK2mmD%m`)#5(^qZ^000yl000^Q0000000000005+c)r$ZCaA|NaUukZ1WpZ +v|Y%gqYV_|e@Z*FrgaCuNm0Rj{Q6aWAK2mmD%m`?PpF}N2H002lc000{R0000000000005+cdzJtIaA +|NaUukZ1WpZv|Y%g$Sa5OSCbYW+6E^v8JO928D0~7!N00;mj6qrsy2IMbE3;+NmDgXc)00000000000 +001_fy<@<0B~t=FJEbHbY*gGVQepOd2n)XYGq?|E^v8JO928D0~7!N00;mj6qrsZoE7Oa5dZ)fI{*L} +00000000000001_flRXi0B~t=FJEbHbY*gGVQepQWpi(Ac4aPbc~DCM0u%!j0000803{TdPKD;r=fp1 +n0Ogc!JX>N37a&BR4FL!8VWo#~Rc~DCM0u%!j0000803{TdPR@ +7gG-v<-0E7Sl0384T00000000000HlGf^Z)>GX>c!JX>N37a&BR4FJo+JFJE72ZfSI1UoLQYP)h*<6a +y3h000O8B@~!W@a4dpS_c3C!xsPmBLDyZ0000000000q=8WN003}la4%nJZggdGZeeUMV{Bc!J +X>N37a&BR4FJo+JFJfVHWnW`&ZEaz0WG--dP)h*<6ay3h000O8B@~!W;z+Y?y%_)i1zi9D9{>OV0000 +000000q=8Qh0RV7ma4%nJZggdGZeeUMV{B@0%X>c!JX>N37a&BR4FJo+JFKuCIZeMU=a&u*JE^v8JO928D0~ +7!N00;mj6qrsvlkVAv3jhG3Bme*#00000000000001_fg&ma0B~t=FJEbHbY*gGVQepBY-ulWVRCb2a +xQRrP)h*<6ay3h000O8B@~!W+pKr?eE?y-E^v8JO928D0~7!N00;mj6qrtZx0!e20RRA&1po +ja00000000000001_fvhV>WaCuNm0Rj{Q6aWAK2mmD%m`)kL=AZ5e002}U001Wd0000000000005+c<39laaA|NaUukZ1WpZv| +Y%gPPZEaz0WOFZLZ*FF3XLWL6bZKvHE^v8JO928D0~7!N00;mj6qruxuqb~01^@ux82|tx000000000 +00001_ffh*t0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WWN&wFY;R#?E^v8JO928D0~7!N00;mj6qrs%F_c +F$1ONcL3;+Ni00000000000001_fm2Wc0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WW^!d^dSxzfc~DCM0u +%!j0000803{TdPWghuS=<5u0Fed&03HAU00000000000HlG$Q~>~RX>c!JX>N37a&BR4FJo_QZDDR?b +1!INb7(Gbc~DCM0u%!j0000803{TdPJvxS8Px#*073)+03HAU00000000000HlH3R{;QUX>c!JX>N37 +a&BR4FJo_QZDDR?b1!IRY;Z1cc~DCM0u%!j0000803{TdP9#6m=@bc!JX>N37a&BR4FJo_QZDDR?b1!Lbb97;BY%XwlP)h*<6ay3h000O8B@~!Wg?DcI+6n*wwkH +4p9smFU0000000000q=7(h0RV7ma4%nJZggdGZeeUMV{dJ3VQyq|FKlUZbS`jtP)h*<6ay3h000O8B@ +~!W4*TzM92IC005H<001KZ0000000000005+c-iQGJaA|N +aUukZ1WpZv|Y%gPPZEaz0WOFZdZfS0FbYX04E^v8JO928D0~7!N00;mj6qrt22uDzd2LJ&78vpbYEXCaCuNm0 +Rj{Q6aWAK2mmD%m`>FkRK%14000#P001EX0000000000005+cSd{?)aA|NaUukZ1WpZv|Y%gtZWMyn~ +FJobDWNBn!bY(7Zc~DCM0u%!j0000803{TdP9q~7==A~s0Llme044wc00000000000HlE{mjM89X>c! +JX>N37a&BR4FKusRWo&aVW^ZzBVRT<(Z*FvQZ)`4bc~DCM0u%!j0000803{TdPDbJ@7s>$u03-we038 +4T00000000000HlFrngIZCX>c!JX>N37a&BR4FKusRWo&aVX>Md?crI{xP)h*<6ay3h000O8B@~!W^i +}}3kp%z%uMz+N8~^|S0000000000q=9Li0RV7ma4%nJZggdGZeeUMZEs{{Y;!McX>MySaCuNm0Rj{Q6 +aWAK2mmD%m`(ry0006200000001Na0000000000005+cG@=0jaA|NaUukZ1WpZv|Y%gzcWpZJ3X>V?G +FJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!We^K*hO9lV{^%DR9ApigX0000000000q=9&%0RV7ma4%n +JZggdGZeeUMZ*XODVRUJ4ZgVeVXk}w-E^v8JO928D0~7!N00;mj6qrtuuuJP7~*9RL6T0000000000q=9C}0RV7ma4%nJZggdGZeeUMa%FKZ +Utei%X>?y-E^v8JO928D0~7!N00;mj6qrt??u(Tt4FCX#EC2u@00000000000001_fq}^Z0B~t=FJEb +HbY*gGVQepQWpOWKZ*FsRa&=>LZ*p@kaCuNm0Rj{Q6aWAK2mmD%m`=CJ9(H>W005FT0012T00000000 +00005+c=hguLaA|NaUukZ1WpZv|Y%g+UaW8UZabIR>Y-KKRc~DCM0u%!j0000803{TdPFd}F5g;c30E +Cc!JX>N37a&BR4FLGsZFLGsZUukZ0bYX04E^v8JO928D0~7!N0 +0;mj6qrugT)mY*2><}J9smFw00000000000001_f%^^u0B~t=FJEbHbY*gGVQepQWpOWZWpQ6~WpplZ +c~DCM0u%!j0000803{TdPLSc!JX>N37a&BR4FLGs +ZFLGsZUvzR|V{2t{E^v8JO928D0~7!N00;mj6qrtLDn=dl7ytl4S^xkd00000000000001_fwCL|0B~ +t=FJEbHbY*gGVQepQWpOWZWpQ71ZfS0FbYX04E^v8JO928D0~7!N00;mj6qrr`00002000000000V00 +000000000001_f#@{?0B~t=FJEbHbY*gGVQepTbZKmJFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!W< +93tkC<_1pwj=-m9smFU0000000000q=6?k0swGna4%nJZggdGZeeUMb#!TLb1z|VaAaw6b1rasP)h*< +6ay3h000O8B@~!WhmVcyK@0!@XCVLp9RL6T0000000000q=Ab;0swGna4%nJZggdGZeeUMb#!TLb1!3 +WZE#_9E^v8JO928D0~7!N00;mj6qrsJog%or1ONaC3;+Nk00000000000001_fd@_k0B~t=FJEbHbY* +gGVQepTbZKmJFJxtKa%E#-bZKvHE^v8JO928D0~7!N00;mj6qrtg=M^V00ssKQ1ONaZ000000000000 +01_fdf+l0B~t=FJEbHbY*gGVQepTbZKmJFJ*3HZ)9n1XD)DgP)h*<6ay3h000O8B@~!WLO=oM%mDxZ- +U9#tApigX0000000000q=9i&0swGna4%nJZggdGZeeUMb#!TLb1!CTY-MwKb97~GE^v8JO928D0~7!N +00;mj6qrs`wKH691polj3;+Ne00000000000001_fqYj20B~t=FJEbHbY*gGVQepTbZKmJFK29NVq-3 +Fc~DCM0u%!j0000803{TdPP*~=1bX>c!JX>N37a&BR4FLi +WjY;!MYVRL9@b1rasP)h*<6ay3h000O8B@~!W{Yh&&H4Oj&mn{GQ9smFU0000000000q=A=W0swGna4 +%nJZggdGZeeUMb#!TLb1!UfXJ=_{XD)DgP)h*<6ay3h000O8B@~!Wm1T=>NhSaQvVH&n8vpc!JX>N37a&BR4FLiWjY;!MdZ)9a`b1rasP)h*<6ay3h000O8B@~! +WkubPZ_y+(0>=pn39{>OV0000000000q=E340swGna4%nJZggdGZeeUMb#!TLb1!dobYx+4Wn?aJc~D +CM0u%!j0000803{TdPHw<{yS)Pd0JjPN03ZMW00000000000HlE>paKAJX>c!JX>N37a&BR4FLiWjY; +!MgVPk7yXK8L{E^v8JO928D0~7!N00;mj6qrsHqVh_+0000M0RR9e00000000000001_fgq#;0B~t=F +JEbHbY*gGVQepTbZKmJFLPydb#QcVZ)|g4Vs&Y3WG--dP)h*<6ay3h000O8B@~!W5!tnt=LP@(+Y|r* +9{>OV0000000000q=6u%0swGna4%nJZggdGZeeUMb#!TLb1!sdZE#;?X>u-bc~DCM0u%!j0000803{T +dP8$Or4_*QQ0A&OK0384T00000000000HlFLtO5XVX>c!JX>N37a&BR4FLiWjY;!Mkd2nfNXD)DgP)h +*<6ay3h000O8B@~!WH3&C`j1T|-^fdqg82|tP0000000000q=DV80swGna4%nJZggdGZeeUMb#!TLb1 +!viE^v8JO928D0~7!N00;mj6qrsc7of>T6aWAPO8@{J00000000000001_fuO$v0B~t=FJEbHbY*gGV +QepUV{bYEXCaCuNm0Rj{Q6aWAK2mmD%m`)JBSdf$i005s1000{R0000000000005+cA=Cl@ +aA|NaUukZ1WpZv|Y%g|Wb1!0HdSPL5E^v8JO928D0~7!N00;mj6qruy$E*9H4*&q5G5`P=000000000 +00001_f$rD>0B~t=FJEbHbY*gGVQepUV{=}dc~DCM0u%!j0000803{TdPE9@4;ZpVe03H +AU00000000000HlG%=mG$6X>c!JX>N37a&BR4FLq;dFKuOVV|8+AVQemNc~DCM0u%!j0000803{TdPU +nrvePap$0Oub703QGV00000000000HlFb?E(OBX>c!JX>N37a&BR4FLq;dFLQNbc4cyNX>V>WaCuNm0 +Rj{Q6aWAK2mmD%m`?Rsje!{k001r$000*N0000000000005+c^!EY)aA|NaUv_0~WN&gWUtei%X>?y- +E^v8JO928D0~7!N00;mj6qrumUj{Tl5&!_>UjP6W00000000000001_fkOTQ0B~t=FJE?LZe(wAFJW+ +SWNC79E^v8JO928D0~7!N00;mj6qruxZmG*9CjbERr~m*J00000000000001_fwm9>0B~t=FJE?LZe( +wAFJx(RbaHPlaCuNm0Rj{Q6aWAK2mmD%m`*N@iz0qI008Va0RR{P0000000000005+c4mbkeg=WO8M5b1rasP)h*<6ay3h000O8B@~!WFobuJ|K7ytkO0000000000q=CY70 +|0Poa4%nWWo~3|axZXsaA9(DX>MmOaCuNm0Rj{Q6aWAK2mmG&m`)*kyb8|=008tR000*N0000000000 +005+c_gVx1aA|NaUv_0~WN&gWa%FUKd1-EEE^v8JO928D0~7!N00;mk6qrtEzg*Go9smHuegFUx0000 +0000000001_f%{|x0B~t=FJE?LZe(wAFLP;lE^v8JO928D0~7!N00;mj6qrtk0whkX0000k0RR9b000 +00000000001_ffZgg^QY%gD5X>MtBUtcb8c~DCM0u%!j0000803 +{TdPD-13rvd^101pKK03ZMW00000000000HlEjg#-X_X>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eUt?`#E +^v8JO928D0~7!N00;mj6qrtU7M&J|1pom55&!@r00000000000001_fk%e~0B~t=FJE?LZe(wAFJob2 +Xk}w>Zgg^QY%gJCVQ_S1axQRrP)h*<6ay3h000O8B@~!W#$vopG64VpB?ABeApigX0000000000q=68 +P1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zE^v8JO928D0~7!N00;mj6qrthmShtW0RRBE0ss +Ia00000000000001_fq{+$0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPPZE#_9E^v8JO928D0~7!N00 +;mj6qruhwv5__4*&pyH2?r600000000000001_fzyu!0B~t=FJE?LZe(wAFJob2Xk}w>Zgg^QY%gPPZ +gg^QY;0w6E^v8JO928D0~7!N00;mj6qru)(f%6x0{{T!2><{m00000000000001_ft{ZO0B~t=FJE?L +Ze(wAFJob2Xk}w>Zgg^QY%gYMY-M+HVQ_F|axQRrP)h*<6ay3h000O8B@~!WlqGFmuLS@A<_`b>CIA2 +c0000000000q=DR{1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7UWp#3Cb98BAb1rasP)h*<6ay3h000 +O8B@~!WxKRxc*$4mtDjNU*B>(^b0000000000q=C<=1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7fWp +Zg@Y-xIBE^v8JO928D0~7!N00;mj6qrsFuAyD$0001=0ssIb00000000000001_f$Opa0B~t=FJE?LZ +e(wAFJob2Xk}w>Zgg^QY%h0mVQ_F|axQRrP)h*<6ay3h000O8B@~!W8NawNHvj+tRsaA1D*ylh00000 +00000q=6H(1ORYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1z?CX>MtBUtcb8c~DCM0u%!j0000 +803{TdPV&hS!4U=k08tPC04)Fj00000000000HlGFv;+WfX>c!Jc4cm4Z*nhVVPj}zV{dMBa&K%eV_{ +=xWpgiPX>4U*V_{=xWiD`eP)h*<6ay3h000O8B@~!WsK-IyX8`~JSOWk6E&u=k0000000000q=E0c1O +RYpa4%nWWo~3|axY_HV`yb#Z*FvQZ)`7PVPj}zb1!mbWNC9>V_{=xWiD`eP)h*<6ay3h000O8B@~!W5 +m;ebHUIzsGynhq9{>OV0000000000q=BNm1ORYpa4%nWWo~3|axY_La&&2CX)j-2X>MtBUtcb8c~DCM +0u%!j0000803{TdP6_W6?=t`Z05t#r03QGV00000000000HlExy#xSoX>c!Jc4cm4Z*nhVWpZ?BW@#^ +9Uu|J&ZeL$6aCuNm0Rj{Q6aWAK2mmD%m`?o{2Bzp%0sv-L1OOfY0000000000005+cg}np-aA|NaUv_ +0~WN&gWV`Xx5X=Z6JV_{=ua&#_mWo=MP0Rj{Q6aWAK2mmD%m`>kP>w}sA007zm000{R000000000000 +5+csT2nQaA|NaUv_0~WN&gWV`Xx5X=Z6JV{dY0E^v8JO928D0~7!N00;mj6qru%&ks}N0ssIP1^@sb0 +0000000000001_fqWGQ0B~t=FJE?LZe(wAFJow7a%5$6FJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!W +IlqJu?>PVf7J2{x9{>OV0000000000q=B6n2LNzsa4%nWWo~3|axY_OVRB?;bT49QXEkPWWpOTWc~DC +M0u%!j0000803{TdPRr+KW;_D`0Nn-v03iSX00000000000HlG*QU?HVX>c!Jc4cm4Z*nhVXkl_>Wpp +oMX=gQXa&KZ~axQRrP)h*<6ay3h000O8B@~!W;8`d=JqZ8+!z2IzCjbBd0000000000q=7_M2LNzsa4 +%nWWo~3|axY_OVRB?;bT4CQVRB??b98cPVs&(BZ*DGdc~DCM0u%!j0000803{TdPKjA0h;jq~0Lu;l0 +4V?f00000000000HlG&Uk3niX>c!Jc4cm4Z*nhVXkl_>WppoNXkl`5Wprn9Z*_2Ra&KZ~axQRrP)h*< +6ay3h000O8B@~!W;Fn=qzXt#S_7eaABme*a0000000000q=A2A2LNzsa4%nWWo~3|axY_OVRB?;bT4C +QVRCb2bZ~NSVr6nJaCuNm0Rj{Q6aWAK2mmD%m`+^#H%O!f000IK001cf0000000000005+cfNTcZfA3JVRU6}VPj}%Ze=cTc~DCM0u%!j0000803{TdPJD*tWk~`60B +!^T0384T00000000000HlFyat8o#X>c!Jc4cm4Z*nhVXkl_>WppoNZ*6d4bS`jtP)h*<6ay3h000O8B +@~!Wy+WEXXafKMKL-E+A^-pY0000000000q=D~r2LNzsa4%nWWo~3|axY_OVRB?;bT4CYIW#$Na&KZ~ +axQRrP)h*<6ay3h000O8B@~!WLgTaCuNm0Rj{Q6aWAK2mmD%m`)%!#Ly}Q0 +05;9001HY0000000000005+cQilfsaA|NaUv_0~WN&gWV`yP=WMy008PV001BW0000000000005+cyo?6`aA|NaUv_0~WN&gWV`yP=WMyc!Jc4c +m4Z*nhVXkl_>WppoRVlp!^GH`NlVr6nJaCuNm0Rj{Q6aWAK2mmD%m`)8T)3TWo000g)001KZ0000000 +000005+c)e#5)aA|NaUv_0~WN&gWV`yP=WMypj00000000000001_fv+S80B~t=FJE?LZe(wAFJow7a%5$6FKTIXW^!e5E^v8JO928D +0~7!N00;mj6qrs1c_nI26953aOaK5K00000000000001_fdEwq0B~t=FJE?LZe(wAFJow7a%5$6FKTd +OZghAqaCuNm0Rj{Q6aWAK2mmD%m`?C$$;u!L001X4001cf0000000000005+ciD(D_aA|NaUv_0~WN& +gWV`yP=WMyc!Jc4cm4Z*nhVXkl_>WppoWVQyz*d2(rNY-wX{Z)9a`E^v8JO928D0~7!N0 +0;mj6qru_yRRu~2><|)F#rH100000000000001_fjEE&0B~t=FJE?LZe(wAFJow7a%5$6FKl6MXJ>L{ +WovD3WMynFaCuNm0Rj{Q6aWAK2mmD%m`;yotr)!t002=e001Tc0000000000005+c<%tLYaA|NaUv_0 +~WN&gWV`yP=WMyc!Jc4cm4Z*nhVXkl_>WppoWVQy!1X +klq>Z)9a`E^v8JO928D0~7!N00;mj6qru6GQ(uZ3IG6JD*yl|00000000000001_fi|iL0B~t=FJE?L +Ze(wAFJow7a%5$6FKl6MXLNOPYiV<6ZEs{{Y%XwlP)h*<6ay3h000O8B@~!WAWpXZXc~DCM0u%!j0000803{ +TdPBwKIP2B_l096eD044wc00000000000HlE%ya)hrX>c!Jc4cm4Z*nhVXkl_>WppoXVq<7wa&u*LaB +^>AWpXZXc~DCM0u%!j0000803{TdPOZ}ssB!}U0Ne)v044wc00000000000HlFD!3Y3wX>c!Jc4cm4Z +*nhVXkl_>WppoXVqa&L8TaB^>AWpXZXc~DCM0u%!j0000803{TdPHFbx59JI10EuG&0384T00000 +000000HlHP#0UUzX>c!Jc4cm4Z*nhVXkl_>WppoXVq2mo+ta4%nWWo~3|axY_OVRB?;bT +4yaV{>P6Z*_2Ra&KZ~axQRrP)h*<6ay3h000O8B@~!W){$p2AO!#bz77BYApigX0000000000q=CNP2 +mo+ta4%nWWo~3|axY_OVRB?;bT4yiX>)LLZ(?O~E^v8JO928D0~7!N00;mj6qrtRfJZ%W4FCYeFaQ83 +00000000000001_fgR)s0B~t=FJE?LZe(wAFJow7a%5$6FLiEdc4cyNVQge&bY)|7Z*nehc~DCM0u%! +j0000803{TdPW8XMJw*fn0L}^k03iSX00000000000HlG_@dyBLX>c!Jc4cm4Z*nhVXkl_>WppofbY? +hka&KZ~axQRrP)h*<6ay3h000O8B@~!WN5_!Yxc~qF@&Et;9smFU0000000000q=8rV2mo+ta4%nWWo +~3|axY_OVRB?;bT4*ga&u{KZZ2?nP)h*<6ay3h000O8B@~!WlLpr^0{{R30RR91BLDyZ0000000000q +=8KL2mo+ta4%nWWo~3|axY_OVRB?;bT4CUX)j-2X>MtBUtcb8c~DCM0u%!j0000803{TdPWL9XpP&Q) +0M-fs03`qb00000000000HlGC_Xq%RX>c!Jc4cm4Z*nhVXkl_>WppoNY-ulJXkl_>Wprg@bS`jtP)h* +<6ay3h000O8B@~!WZAzfivH$=8?*IS*AOHXW0000000000q=9q%2mo+ta4%nWWo~3|axY_VY;SU5ZDB +88UukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`*+wr(cT$007(x000~S0000000000005+cWBmvKaA|NaUv +_0~WN&gWV{dG4a$#*@FJW$TX)bViP)h*<6ay3h000O8B@~!WBk*i@_ua4%nWWo~3|axY_VY;SU5ZDB8AZgXjLZ+B^KGcqo4c~DCM0u%!j0000803{TdP8)AUa)SZ@ +0DA`j03rYY00000000000HlG^3<&^mX>c!Jc4cm4Z*nhVZ)|UJVQpbAX>MtBX<=+>b7d}Yc~DCM0u%! +j0000803{TdP6!(e5l{sH02~zn0384T00000000000HlGH4+#KpX>c!Jc4cm4Z*nhVZ)|UJVQpbAcWG +`jGA?j=P)h*<6ay3h000O8B@~!WqA1qp?ganOV0000000000q=6t62>@_ua4%nWWo~3|ax +Y_VY;SU5ZDB8WX>N37a&0bfc~DCM0u%!j0000803{TdP8*_L`CI`207U`-03QGV00000000000HlFS8 +wmh#X>c!Jc4cm4Z*nhWX>)XJX<{#5UukY>bYEXCaCuNm0Rj{Q6aWAK2mmD%m`-Ne(&;ZN006w90012T +0000000000005+cc!Jc4cm4Z*nhWX>)XJX<{#AVRT_)VRL0JaCuNm0Rj +{Q6aWAK2mmD%m` +Md?crI{xP)h*<6ay3h000O8B@~!WOp>%zMKb^Zbjkn#9{>OV0000000000q=EH~2>@_ua4%nWWo~3|a +xY|Qb98KJVlQlOV_|e}a&sc!Jc4cm4Z*nhWX>)XJX<{#JVQy(=Wpi{caCuNm0Rj{Q6aWAK2mmD%m`=90h-L!@001Kq0015 +U0000000000005+cAkql{aA|NaUv_0~WN&gWWNCABY-wUIZDDe2WpZ;aaCuNm0Rj{Q6aWAK2mmD%m`? +5gg%biL008Wq0018V0000000000005+cU)Tu%aA|NaUv_0~WN&gWWNCABY-wUIZDn*}WMOn+E^v8JO9 +28D0~7!N00;mj6qrtq-GmaT3jhEPDgXc=00000000000001_fu8*d0B~t=FJE?LZe(wAFJx(RbZlv2F +LGsbZ*_8GWpgfYc~DCM0u%!j0000803{TdPEX#?6S@-s0RBJ#03HAU00000000000HlG02?_vkX>c!J +c4cm4Z*nhWX>)XJX<{#PV{&P5baO6nc~DCM0u%!j0000803{TdPHv@lC#$jm003$M02=@R000000000 +00HlF>9SQ(&X>c!Jc4cm4Z*nhWX>)XJX<{#QGcqn^cx6ya0Rj{Q6aWAK2mmD%m`=6@qPy500000000000001_fl8AL0B~t=FJE?LZe(wAFJx(RbZlv2FLiWjY%XwlP)h*<6ay3h0 +00O8B@~!W_Gl<9P8k3IUt0hG9smFU0000000000q=CQE3jlCwa4%nWWo~3|axY|Qb98KJVlQ@Oa&u{K +ZZ2?nP)h*<6ay3h000O8B@~!WEr?>m)UE&k09*k88vpc +!Jc4cm4Z*nhWX>)XJX<{#THZ(3}cx6ya0Rj{Q6aWAK2mmD%m`=Xn)X%de0079F000~S000000000000 +5+cZ(0oiaA|NaUv_0~WN&gWWNCABY-wUIcW7m0Y%XwlP)h*<6ay3h000O8B@~!WBkyPY!vFvP5&-}JD +F6Tf0000000000q=8(34FGUya4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mUtei%X>?y-E^v8JO928D +0~7!N00;mj6qru0iZ5l(0RRBY0{{Re00000000000001_fo6dX0B~t=FJE?LZe(wAFJx(RbZlv2FJEF +|V{344a&#|kX>(&PaCuNm0Rj{Q6aWAK2mmD%m`>tiJZ*p`mb9r-PZ*FF3XD)DgP)h*<6ay3h000O8B@~!WL_!}!Vp#wH)M)_#C;$Ke000000000 +0q=9q64FGUya4%nWWo~3|axY|Qb98KJVlQ7}VPk7>Z*p`mbYXI4X>4UKaCuNm0Rj{Q6aWAK2mmD%m`* +aR9Nk3%004>v001BW0000000000005+c8ygM)aA|NaUv_0~WN&gWXmo9CHEd~OFJE72ZfSI1UoLQYP) +h*<6ay3h000O8B@~!WbsBC3B@_SvK|ufjApigX0000000000q=B9t4ghdza4%nWWo~3|axZ9fZEQ7cX +<{#5X=q_|Wq56DE^v8JO928D0~7!N00;mj6qrsHH}m9P9{>O-e*gd^00000000000001_fdVoP0B~t= +FJE?LZe(wAFKBdaY&C3YVlQ85Zg6#Ub98cLVQnsOc~DCM0u%!j0000803{TdPQ*rP7QY+-03<5`03rY +Y00000000000HlGUQ4RobX>c!Jc4cm4Z*nhabZu-kY-wUIUvzJ4Wo~JDWpXZXc~DCM0u%!j0000803{ +TdPTF~la}ovs0Iv@K03HAU00000000000HlGTZVmu&X>c!Jc4cm4Z*nhabZu-kY-wUIUv+e8Y;!Jfc~ +DCM0u%!j0000803{TdPSy*C?^8$s06sc!Jc4cm4Z*nhabZu-kY +-wUIV{dMAbYX6Eb1rasP)h*<6ay3h000O8B@~!WU)FBu4MYF{v(NzmBLDyZ0000000000q=A9G4ghdz +a4%nWWo~3|axZ9fZEQ7cX<{#EbZu-kaA9(DWpXZXc~DCM0u%!j0000803{TdPOt+FBDoL%0FFHX03rY +Y00000000000HlG>0S^FhX>c!Jc4cm4Z*nhabZu-kY-wUIb7gXAVQgu7WpXZXc~DCM0u%!j0000803{ +TdPVdvN52gSB03iVY044wc00000000000HlG)5)S}yX>c!Jc4cm4Z*nhabZu-kY-wUIUvzS5WiMY}X> +MtBUtcb8c~DCM0u%!j0000803{TdPH2qZRe=Ej0HOl`03!eZ00000000000HlGk6Au7zX>c!Jc4cm4Z +*nhabZu-kY-wUIUvzS5WiMZ1VRL0JaCuNm0Rj{Q6aWAK2mmD%m`)^BovEe)005c<001Na0000000000 +005+cbQKQ(aA|NaUv_0~WN&gWXmo9CHEd~OFJE+WX=N{DVRUk7WiD`eP)h*<6ay3h000O8B@~!WOHXd +j9RdIV?*;$>AOHXW0000000000q=8%)4*+m!a4%nWWo~3|axZ9fZEQ7cX<{#5baH8BFK~G-aCuNm0Rj +{Q6aWAK2mmD%m`(ry0006200000001Ze0000000000005+cw;2xraA|NaUv_0~WN&gWXmo9CHEd~OFJ +@_MbY*gLFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!WfUpD*!T|sPmjeI*HUIzs0000000000q=Ek#4 +*+m!a4%nWWo~3|axZ9fZEQ7cX<{#CX>4?5a&s?XY;b5{Vr6t`V_|GzbaZlQVs&(7b1rasP)h*<6ay3h +000O8B@~!WB7pnEl>h($9svLVBme*a0000000000q=6M24*+m!a4%nWWo~3|axZ9fZEQ7cX<{#CX>4? +5a&s?YVRL0JaCuNm0Rj{Q6aWAK2mmD%m`?M+KNl7Q004mt001)p0000000000005+c>>LjOaA|NaUv_ +0~WN&gWXmo9CHEd~OFJ@_MbY*gLFKKRSWn*+-ZDn*}Ut?%ta&u*LE^v8JO928D0~7!N00;mj6qrtu(P +W@(0{{R!4gdfo00000000000001_fm0w40B~t=FJE?LZe(wAFKBdaY&C3YVlQTCY;^X>c!Jc4cm4Z*nhabZu-k +Y-wUIW@&76WpZ;bZ*X*JZ*F01bYW+6E^v8JO928D0~7!N00;mj6qrsx!2wY6761TMtBUtcb8c~DCM0u%!j0000803{TdPEw2!DO3Ug +0J8=F04o3h00000000000HlFfMh^gRX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7VPs)&bY*gLFK1?y-E^v8JO928D0~7!N0 +0;mj6qruL)uOES4gdi2H~;`C00000000000001_fgMo~0B~t=FJE?LZe(wAFKBdaY&C3YVlQ-ZWo2S@ +X>4R=a&s?YVRL0JaCuNm0Rj{Q6aWAK2mmD%m`(`lF8JFA004s`001Ze0000000000005+cT3`A4*+m!a4%nWWo~3|axZ9fZEQ7cX<{#Qa%E*=b!lv5WpZ;bWpr|7WiD`eP) +h*<6ay3h000O8B@~!W8c*uCUkv~NDmMTCF8}}l0000000000q=EKw4*+m!a4%nWWo~3|axZ9fZEQ7cX +<{#Qa%E*=b!lv5WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000803{TdPOWC#2$==|08$nJ04x9i00000 +000000HlGUfDZt0X>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bUtei%X>?y-E^v8JO928D0~7! +N00;mj6qrsSE!sjC2LJ#x9RL6*00000000000001_frW<;0B~t=FJE?LZe(wAFKBdaY&C3YVlQ-ZWo3 +6^Y-?q5b1!0Hb7d}Yc~DCM0u%!j0000803{TdPGyR3srLZ@0EGnr04D$d00000000000HlH9jt>BEX> +c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bWN&RQaCuNm0Rj{Q6aWAK2mmD%m`=XM@-6BF0071j0 +01cf0000000000005+c9+3|KaA|NaUv_0~WN&gWXmo9CHEd~OFLZKcWp`n0Yh`kCFJ*LcWo0gKc~DCM +0u%!j0000803{TdPL>UvM`#8B0HqiJ04@Lk00000000000HlFWmJa}MX>c!Jc4cm4Z*nhabZu-kY-wU +IbaG{7cVTR6WpZ;bWpr|7WnXM~ZEP-Zc~DCM0u%!j0000803{TdP7_~k5Xb@m00jvE04e|g00000000 +000HlEfoeuzTX>c!Jc4cm4Z*nhabZu-kY-wUIbaG{7cVTR6WpZ;bXJu}4XlX8Rc~DCM0u%!j0000803 +{TdP5?(-n==3a06G8w02}}S00000000000HlEvpbr3WX>c!Jc4cm4Z*nhbWNu+EUtei%X>?y-E^v8JO +928D0~7!N00;mj6qru)NYv>X0{{Ty3;+Nb00000000000001_fq%008I!000^Q0000000000005+c(W4IlaA|NaUv_0~WN&g +WX=H9;FJo_QaA9;VaCuNm0Rj{Q6aWAK2mmD%m`)X!*;e)n007l3000;O0000000000005+cn4}K?aA| +NaUv_0~WN&gWX=H9;FJo_VWiD`eP)h*<6ay3h000O8B@~!W%rG=tL?QqH!=C^E8~^|S0000000000q= +Ce*4*+m!a4%nWWo~3|axZCQZecHJWNu+(VRT_GaCuNm0Rj{Q6aWAK2mmD%m`=B2^s?px007kn0012T0 +000000000005+cLedWaaA|NaUv_0~WN&gWX=H9;FKKRca$#;~WpgfYc~DCM0u%!j0000803{TdPAHI~ +LKgr402KfL03ZMW00000000000HlFq)eiu0X>c!Jc4cm4Z*nhbWNu+EaA9L>VP|DuWMOn+E^v8JO928 +D0~7!N00;mj6qrr|1KdMz5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mmD%m`))kynb^7 +000;a001Qb0000000000005+cNq7(daA|NaUv_0~WN&gWY;R+0W@&6?FKugNX>x3DV{2w_0Lm8t03!eZ00000000000HlHcdk_F{X>c!Jc4cm4Z*nheZ)0m_X>4 +ULaA{<0Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mmD%m`=Ne@VyBI004p&001Tc0000000000005+cT7(b)aA +|NaUv_0~WN&gWY;R+0W@&6?FLQBhX>?_5Z)0m_X>4UKaCuNm0Rj{Q6aWAK2mmD%m`;%+3E4dZ001}&0 +01Wd0000000000005+cr-={%aA|NaUv_0~WN&gWY;R+0W@&6?FLQZqY-w(5Y;R+0W@&6?E^v8JO928D +0~7!N00;mj6qruu>Q|wG0ssJw1^@sb00000000000001_fhmm;0B~t=FJE?LZe(wAFKu&YaA9L>FJE7 +2ZfSI1UoLQYP)h*<6ay3h000O8B@~!W9n}zr761SM6aWAK9{>OV0000000000q=Dy;5CCv#a4%nWWo~ +3|axZOjXK-O-YcF4RWpZc!Jc4cm4Z*nhfb7yd2V{0#Ecw=R7bZKvHb1rasP)h*<6ay3h000O8B@~!WTr6(~KN|o5J +B|PV9{>OV0000000000q=DR#5CCv#a4%nWWo~3|axZOjXK-O-YcFPDY;0m-V{0yOc~DCM0u%!j00008 +03{TdPJavm7l;7>0O$e$03rYY00000000000HlFftq=fkX>c!Jc4cm4Z*nhiVPk7yXK8L{FJE6_VsCY +HUtcb8c~DCM0u%!j0000803{TdPGuVrL=*u405Spq03iSX00000000000HlE+uMhxmX>c!Jc4cm4Z*n +hiVPk7yXK8L{FJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!WW{TS5%>e)aVFLgFAOHXW0000000000q= +9p=5CCv#a4%nWWo~3|axZXUV{2h&X>MmPUt@1=aA9;VaCuNm0Rj{Q6aWAK2mmD%m`-bt9F=kb004*u0 +01Na0000000000005+cezFh%aA|NaUv_0~WN&gWaA9L>VP|P>XD?rKbaHiLbairNb1rasP)h*<6ay3h +000O8B@~!WBJ^Gp^a%g}Dj)y=AOHXW0000000000q=7QD5CCv#a4%nWWo~3|axZXUV{2h&X>MmPZDDe +2WpZ;aaCuNm0Rj{Q6aWAK2mmD%m`)W^p8Vwo003MP001Qb0000000000005+cWWEppaA|NaUv_0~WN& +gWaA9L>VP|P>XD@PPadl~OWo>0{baO6nc~DCM0u%!j0000803{TdPV$IG({C660D^1)03!eZ0000000 +0000HlG8#Sj2+X>c!Jc4cm4Z*nhiVPk7yXK8L{FLQ8ZV`*k-WpZ;aaCuNm0Rj{Q6aWAK2mmD%m`-6mt +(}Jg008g>0015U0000000000005+cJl+rhaA|NaUv_0~WN&gWaA9L>VP|P>XD@YhX>4;YaCuNm0Rj{Q +6aWAK2mmD%m`?FCa_fE#007D^001BW0000000000005+c|KJb+aA|NaUv_0~WN&gWaA9L>VP|P>XD@b +Ta&u{KZZ2?nP)h*<6ay3h000O8B@~!WP5}d;RR910Q~&?~9smFU0000000000q=CEc5CCv#a4%nWWo~ +3|axZXYa5XVEFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!W$8flSW(NQOtrq|QApigX0000000000q= +8KD5CCv#a4%nWWo~3|axZXYa5XVEFJEbHUvP47V`X!5E^v8JO928D0~7!N00;mj6qrt_^9=w%1ONbw3 +IG5b00000000000001_f${bb0B~t=FJE?LZe(wAFK}gWH8D3YVs&Y3WG--dP)h*<6ay3h000O8B@~!W +AOZwdbp-$b{T2WK8vpc!Jc4cm4Z*nhiWpFhyH!ovvY;S +UGZ)YxWc~DCM0u%!j0000803{TdPDnn-g7N?W0Cxfa02}}S00000000000HlH52N3{pX>c!Jc4cm4Z* +nhiWpFhyH!ovvZE#_9E^v8JO928D0~7!N00;mj6qruMj+S)K2LJ$r761Sq00000000000001_feHx`0 +B~t=FJE?LZe(wAFK}gWH8D3YWo~w2b!lv5E^v8JO928D0~7!N00;mj6qrsC+V+(O2LJ#V7XSbr00000 +000000001_ffW%E0B~t=FJE?LZe(wAFK}gWH8D3YcXDBHaAk6HE^v8JO928D0~7!N00;mj6qrsgq{LK +4a{vH_r2zmX00000000000001_fmaw20B~t=FJE?LZe(wAFK}yTUvg!0Z*_8GWpgiIUukY>bYEXCaCu +Nm0Rj{Q6aWAK2mmD%m`-6N1J+9c001%q001Wd0000000000005+c;ENFeaA|NaUv_0~WN&gWaBF8@a% +FRGb#h~6b1!gtGcjXtZE#_9E^v8JO928D0~7!N00;mj6qrszX%kCq1^@v05&!@o00000000000001_f +pCox0B~t=FJE?LZe(wAFK}{iXL4n8b1z?CX>MtBUtcb8c~DCM0u%!j0000803{TdPM6HJxTXXE0456n +02=@R00000000000HlE$lo0@MX>c!Jc4cm4Z*nhia&KpHWpi^cVqtPFaCuNm0Rj{Q6aWAK2mmD%m`-@ +$xqFa%FRKFJo_YZggdGE^v8JO92 +8D0~7!N00;mj6qrsg;N7|k0{{SI1poja00000000000001_fhU|10B~t=FJE?LZe(wAFK}{iXL4n8b1 +!pnX>M+1axQRrP)h*<6ay3h000O8B@~!Wc*ke+Q~&?~e*gdg9smFU0000000000q=9aq5dd&$a4%nWW +o~3|axZXsbZ>2JFJE72ZfSI1UoLQYP)h*<6ay3h000O8B@~!WOgs63z5oCK{Q&>~8UO$Q0000000000 +q=EjQ5dd&$a4%nWWo~3|axZXsbZ>2JFJo_VWiD`eP)h*<6ay3h000O8B@~!WZ%4f&=m`J-Rww`f8~^| +S0000000000q=EFH5dd&$a4%nWWo~3|axZXsbZ>2JFK}UUb7gWaaCuNm0Rj{Q6aWAK2mmD%m`<$$+<$ +KY008|1000^Q0000000000005+c7ON2eaA|NaUv_0~WN&gWaCvlZZEP=eWpi{caCuNm0Rj{Q6aWAK2m +mD%m`>srbc!Jc4cm +4Z*nhkWpQ<7b98erUtei%X>?y-E^v8JO928D0~7!N00;mj6qrunt*Tf50002A0RR9a0000000000000 +1_ft0!t0B~t=FJE?LZe(wAFLGsZb!BsOb1z?Cc4cyNX>V>{UoLQYP)h*<6ay3h000O8B@~!Wh^aZd6a +oMMNCW@?CjbBd0000000000q=D4C5dd&$a4%nWWo~3|axZdaadl;LbaO9XX>N37a&BR4Uv+e8Y;!Jfc +~DCM0u%!j00008045ZePMkR|M2r*w04!7h03ZMW00000000000HlE}z7YU$X>c!Jc4cm4Z*nhkWpQ<7 +b98erVPs)&bY*gLE^v8JO928D0~7!N00;mk6qrr`5iTeQ1^@tU7ytkp00000000000001_f%no80B~t +=FJE?LZe(wAFLGsZb!BsOb1z|VX)bViP)h*<6ay3h000O8CKQ-XHt20c!Jc4cm4Z*nhkWpQ<7b98erV{dJ6VRSBVc~DCM +0u%!j00008045ZePQ51=I=~YE0RBe+03QGV00000000000HlFa=@9^MX>c!Jc4cm4Z*nhkWpQ<7b98e +rV{dP3X=QURaCuNm0Rj{Q6aWAK2mmG&m`=I4Y;ijT004aq001HY0000000000005+cQ2h}AaA|NaUv_ +0~WN&gWa%FLKWpi|MFJ*XRWpH$9Z*FrgaCuNm0Rj{Q6aWAK2mmG&m`<%dNAF4m008<8000~S0000000 +000005+c%K;JqaA|NaUv_0~WN&gWa%FLKWpi|MFKA_Ka4v9pP)h*<6ay3h000O8CKQ-X8%lHGc>w?b^ +#T9@9RL6T0000000000q=8Qc5&&>%a4%nWWo~3|axZdaadl;LbaO9gZ*OaJE^v8JO928D0~7!N00;mk +6qruaHj0)xCIA5Ag#Z8^00000000000001_fddE<0B~t=FJE?LZe(wAFLGsZb!BsOb1!XgWMyn~E^v8 +JO928D0~7!N00;mk6qrsDJl=t80RRBE0ssIY00000000000001_fp{(w0B~t=FJE?LZe(wAFLGsZb!B +sOb1!gVV{2h&WpgfYc~DCM0u%!j00008045ZePCw>@*h3%y0F-h703ZMW00000000000HlE-FcJW8X> +c!Jc4cm4Z*nhkWpQ<7b98erb7gaLX>V?GE^v8JO928D0~7!N00;mk6qrs*x@LBL1^@sd5C8xq000000 +00000001_fuc|n0B~t=FJE?LZe(wAFLGsZb!BsOb1!prVRUtKUt@1%WpgfYc~DCM0u%!j00008045Ze +PU(v|d36K;0Hq5603rYY00000000000HlFoR}uhlX>c!Jc4cm4Z*nhkWpQ<7b98erb98cbV{~c!Jc4cm4Z*nhkWpQ +<7b98erb#!TLb1rasP)h*<6ay3h000O8CKQ-Xk&FXPJOls$q6z>29{>OV0000000000q=ATm5&&>%a4 +%nWWo~3|axZmqY;0*_GcR9XX>MtBUtcb8c~DCM0u%!j00008045ZeP89bFCi@Hk0QxBa03!eZ000000 +00000HlEdh7tg9X>c!Jc4cm4Z*nhna%^mAVlyvaV{dG1Wn*+{Z*FrgaCuNm0Rj{Q6aWAK2mmG&m`)(m +1?V{u000j*001EX0000000000005+cJ(CguaA|NaUv_0~WN&gWb#iQMX<{=kV{dM5Wn*+{Z*DGdc~DC +M0u%!j00008045ZePOvU|YfB~o02zq@03`qb00000000000HlGnq!IvdX>c!Jc4cm4Z*nhna%^mAVly +veZ*Fd7V{~b6Zg6jJY%XwlP)h*<6ay3h000O8CKQ-Xz0_N$fCvBp%ozXxApigX0000000000q=7@r5& +&>%a4%nWWo~3|axZmqY;0*_GcRR$V`Xr3X>V?GE^v8JO928D0~7!N00;mk6qrtf^}-G;2LJ#!7XSbq0 +0000000000001_fdbSL0B~t=FJE?LZe(wAFLiQkY-wUMFJ@_FY-DpTaCuNm0Rj{Q6aWAK2mmG&m`)^C +wJClB004vu0018V0000000000005+cY1z?E00000000000001_fh6A&0B~t=FJE?LZe(wAFLiQkY-wUMFK} +;fY;9p~VP|D>E^v8JO928D0~7!N00;mk6qru@=-vpN2LJ$P7XSbr00000000000001_fzR?10B~t=FJ +E?LZe(wAFLiQkY-wUMFLGsZb!BsOE^v8JO928D0~7!N00;mk6qruQ`1mF`8vppk00000000000 +001_fv5Ts0B~t=FJE?LZe(wAFLiQkY-wUMFLGsbaBpsNWiD`eP)h*<6ay3h000O8CKQ-X000000ssI2 +00000CjbBd0000000000q=6h3698~&a4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQ7`X>MtBUtcb8c~DC +M0u%!j00008045ZePVO(B=Mn(`0L=mb05Jdn00000000000HlFq783w)X>c!Jc4cm4Z*nhna%^mAVly +veZ*FvQX<{#5VQ_F|Zf9w3WnX1(c4=~NZZ2?nP)h*<6ay3h000O8CKQ-X1b1H%a0~zdx+(wwC;$Ke00 +00000000q=Cd2698~&a4%nWWo~3|axZmqY;0*_GcRLrZgg^KVlQEEaAj_1X>MgMaCuNm0Rj{Q6aWAK2 +mmG&m`;RB)A_9h003(d001Wd0000000000005+cdL$D7aA|NaUv_0~WN&gWb#iQMX<{=kV{dMBa%o~O +ZggyIaBpvHE^v8JO928D0~7!N00;mk6qrsU6!e&@6953uJpceG00000000000001_fov)h0B~t=FJE? +LZe(wAFLiQkY-wUMFJo_RbaH88FK~HpaAj_Db8Iefc~DCM0u%!j00008045ZePNfXg=>H!80A+Rn04@ +Lk00000000000HlFkJ`(_NX>c!Jc4cm4Z*nhna%^mAVlyveZ*FvQX<{#PWn*=6Wpr|3ZgX&Na&#_mc~ +DCM0u%!j00008045ZePN@W-uzd#r0QVRG03-ka00000000000HlGaUK0RtX>c!Jc4cm4Z*nhna%^mAV +lyveZ*FvQX<{#PZ)0n7E^v8JO928D0~7!N00;mk6qrr`00002000000000u00000000000001_foEnD +0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT40DX>MtBUtcb8c~DCM0u%! +j00008045ZePPbW$eOC_v0GLDo05|{u00000000000HlGxW)lE#X>c!Jc4cm4Z*nhna%^mAVlyveZ*F +vQX<{#5b7f<7a%FUKVQzD9Z*p`mVrgzMn8E^v8JO928D0~7!N00;mk6qrteb4!hL4*&pyF8}~J00 +000000000001_foygY0B~t=FJE?LZe(wAFLiQkY-wUMFJo_RbaH88FJE(IV|8+6baG*Cb8v5RbT4dgc +VBE}c4cfXaCuNm0Rj{Q6aWAK2mmG&m`;yfpnOmO003VP|D?FJE72ZfSI1UoLQYP)h*<6ay3h000O8CKQ-XnOIF)NF4wGl63$8BLDy +Z0000000000q=C$a698~&a4%nWWo~3|axZmqY;0*_GcRyqV{2h&WpgicX?QMhc~DCM0u%!j00008045 +ZeP5=M^00IC20000005Sjo00000000000HlFcq!R#eX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVq +s%zaBp&Sb1z?CX>MtBUtcb8c~DCM0u%!j00008045ZePO^IqgH8ef0I&rB05Sjo00000000000HlGZq +!R#eX>c!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvCQVqs%zaBp&Sb1!XSYh`9>Y-KKRc~DCM0u%!j00008 +045ZePWx@jc!Jc4cm4Z*nhna%^mAVlyvrVPk7yXJvC +Qb8~E8ZDDj{XkTb=b98QDZDlWCUukY>bYEXCaCuNm0Rj{Q6aWAK2mmG&m`VP|D?FLQHjUu|J@V`yJ!Z*z2RVQpnEUu +kV{Y-Md_ZggREX>V>WaCuNm0Rj{Q6aWAK2mmG&m`+l4;lHE-000yO001Na0000000000005+c@UasBa +A|NaUv_0~WN&gWb#iQMX<{=kb#!TLFJE72ZfSI1UoLQYP)h*<6ay3h000O8CKQ-X*VSNXF$Vwu9})ln +CIA2c0000000000q=DA6698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cJZ*Fd7V{~b6ZZ2?nP)h*<6ay3 +h000O8CKQ-X^elTY`~Uy|@c{q;ApigX0000000000q=8Gj698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2 +cXb!ByBE^v8JO928D0~7!N00;mk6qrsyVUX7W1pokf4gdfn00000000000001_frh*j0B~t=FJE?LZe +(wAFLiQkY-wUMFLiWjY%g+Uadl;LbS`jtP)h*<6ay3h000O8CKQ-X);no&Gz0(u8VUdaBme*a000000 +0000q=Cr6698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cYWpi+EZgXWWaCuNm0Rj{Q6aWAK2mmG&m`)&1 +M2+te0003y001EX0000000000005+cKE@LOaA|NaUv_0~WN&gWb#iQMX<{=kb#!TLFLGsca(OOrc~DC +M0u%!j00008045ZePV^x-v;GkP0CY0|03ZMW00000000000HlFz*b@M7X>c!Jc4cm4Z*nhna%^mAVly +vwbZKlab8~E8E^v8JO928D0~7!N00;mk6qrs`QqCZA3jhEeCIA2<00000000000001_fvD;e0B~t=FJ +E?LZe(wAFLiQkY-wUMFLiWjY%g?aZDntDbS`jtP)h*<6ay3h000O8CKQ-X!yauB3<&@LR~Y~R9{>OV0 +000000000q=8)a698~&a4%nWWo~3|axZmqY;0*_GcR>?X>2cba%?Vec~DCM0u%!j00008045ZePHv~R +aJ~ls02>tm03ZMW00000000000HlGX{}TXkX>c!Jc4cm4Z*nhna%^mAVlyvwbZKlacVTICE^v8JO928 +D0~7!N00;mk6qrtU&>wL!3jhF9DF6T@00000000000001_fuRQ!0B~t=FJE?LZe(wAFLz~PWo~0{WNB +_^b1z?CX>MtBUtcb8c~DCM0u%!j00008045ZePRFeXiv +c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZY++($Y;!Jfc~DCM0u%!j00008045ZePEda_A4CEG02u`U03-ka0 +0000000000HlFh8596;X>c!Jc4cm4Z*nhpWnyJ+V{c?>ZfA2ZZEI{{Vr6V|E^v8JO928D0~7!N00;mk +6qrtDIB=)A1pok}82|tw00000000000001_f#4ey0B~t=FJE?LZe(wAFLz~PWo~0{WNB_^b1!sdb98e +qaCuNm0Rj{Q6aWAK2mmG&m`>XU{MMxe007ev001fg0000000000005+c*dY`EaA|NaUv_0~WN&gWcV% +K_Zewp`X>Mn8FL+;db7gX0WMyV)Ze?UHaCuNm1qJ{B001)qGXYg!006}%6aWAK +""" + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/mis_tests/misc/printr.py b/mis_tests/misc/printr.py new file mode 100644 index 00000000..2d76dca3 --- /dev/null +++ b/mis_tests/misc/printr.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +""" + printr is a module that allows to emulate the print_r() function of PHP by + printing the objects properties of a class instance and its internal + structure + + Use: + You must get an object of a class instance and then, you can call to + the printr function + + Example: + from printr import printr + myobject = MyClass() + printr(myobject) + + Documentation: + Please, visit the www.python-printr.org Web site for more about + Python-printr :) + + Developed by Eugenia Bahit (www.eugeniabahit.com) + Under a GPL 3.0 licence + + Thanks to: + Mariano Garcia Berrotaran + by his idea about using "obj.__class__.__name__" at the + get_human_object_name function :) +""" + +IDENTATION_CHAR = " " +TAB_WIDTH = 4 + + +def get_human_object_name(obj, is_collection=False): + """ + Convert an object type in a human readable string + """ + aditional = ' collection' if is_collection else '' + return "<%s object%s>" % (obj.__class__.__name__, aditional) + + +def get_human_value(value): + """ + Convert an object value in a human readable string + """ + + if str(value) == '': + return "''" + elif str(value).startswith('<'): + return get_human_object_name(value) + elif isinstance(value, list): + if str(value[0]).startswith('<'): + return get_human_object_name(value[0], True) + else: + return value + else: + return value + + +def printr(obj, tabs=TAB_WIDTH): + """ + Print the object properties recursively in a human readable mode + """ + + if tabs == TAB_WIDTH: + print get_human_object_name(obj) + + ident = IDENTATION_CHAR * tabs + spaces = IDENTATION_CHAR * (tabs + TAB_WIDTH) + + print "%s{" % ident + + for prop, value in vars(obj).iteritems(): + print "%s%s: %s" % (spaces, prop, get_human_value(value)) + + if str(value).startswith('<') and str(value).endswith('>'): + printr(value, (tabs + TAB_WIDTH)) + elif isinstance(value, list): + if str(value[0]).startswith('<'): + for elemento in value: + printr(elemento, (tabs + TAB_WIDTH)) + + print "%s}" % ident + +if __name__ == "__main__": + class x(): + a = "X" + b = "Y" + def __init__(self,y): + pass + + o = x() + printr(o) \ No newline at end of file diff --git a/mis_tests/misc/thread_hilo1.py b/mis_tests/misc/thread_hilo1.py new file mode 100644 index 00000000..5745c5c2 --- /dev/null +++ b/mis_tests/misc/thread_hilo1.py @@ -0,0 +1,24 @@ +import threading +import time +import logging + +logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-s) %(message)s') + +class Hilo1(threading.Thread): + + #def __init__(self, group, target, name, args, kwargs, daemon): + # return super().__init__(group, target, name, args, kwargs, daemon) + def __init__(self, nombre_hilo,id_persona,data): + # super.__init__(self,name=nombre_hilo, target=Hilo1.run) # no va! + threading.Thread.__init__(self, name=nombre_hilo,target=Hilo1.run) + self.nombre_hilo = nombre_hilo + self.id_persona = id_persona + self.data = data + + def run(self): + self.consultar(self.id_persona) + + def consultar(self, id_persona): + logging.debug("consultando para el id "+str(id_persona)) + time.sleep(2) + return diff --git a/mis_tests/misc/thread_hilo2.py b/mis_tests/misc/thread_hilo2.py new file mode 100644 index 00000000..6a841bcf --- /dev/null +++ b/mis_tests/misc/thread_hilo2.py @@ -0,0 +1,23 @@ +import threading +import time +import logging + +logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-s) %(message)s') + +class Hilo2(threading.Thread): + + def __init__(self, nombre_hilo,id_persona,data): + # super.__init__(self,name=nombre_hilo, target=Hilo2.run) no va! + threading.Thread.__init__(self, name=nombre_hilo,target=Hilo2.run) + self.nombre_hilo = nombre_hilo + self.id_persona = id_persona + self.data = data + + def run(self): + self.guardar(self.id_persona, self.data) + + def guardar(self, id_persona,data): + logging.debug("guardando para el id "+str(id_persona)+" la data: "+data) + time.sleep(5) + return + diff --git a/mis_tests/misc/threads.py b/mis_tests/misc/threads.py new file mode 100644 index 00000000..a2932f0d --- /dev/null +++ b/mis_tests/misc/threads.py @@ -0,0 +1,14 @@ +# https://www.youtube.com/watch?v=J9wOU5uWrjw +# Hilos en Python - Bytes Código Facilito +import threading +import time + +def hola_mundo(nombre): + print("Hola Mundo " + nombre) + time.sleep(5) + +if __name__ == '__main__': + # hola_mundo("eaf") + mainthread = threading.Thread(target=hola_mundo,args=("eaf",)) + mainthread.start() + print("Hola mundo desde el hilo principal") diff --git a/mis_tests/misc/threads_hugo_nept.py b/mis_tests/misc/threads_hugo_nept.py new file mode 100644 index 00000000..a9536b3d --- /dev/null +++ b/mis_tests/misc/threads_hugo_nept.py @@ -0,0 +1,28 @@ +# Curso de Python Intermedio Hilos o threads by Hugo Nept +# https://youtu.be/zVguVMZOOrQ + +import threading +import time + +class MiHilo(threading.Thread): + + def run(self): + print("{} run.inicio".format(self.getName())) + time.sleep(2) + print("{} run.terminado desp 2 sec".format(self.getName())) + +if __name__=="__main__": + for x in range(4): + objhilo = MiHilo(name="Thread in for-{}".format(x+1)) + objhilo.start() + time.sleep(.1) + +""" +tiempo |-------|-------|-------| + 0 1 2 3 +hilo1 |---------------| +hilo2 |---------------| +hilo3 |---------------| +hilo4 |---------------| + +""" \ No newline at end of file diff --git a/mis_tests/misc/threads_mitocode.py b/mis_tests/misc/threads_mitocode.py new file mode 100644 index 00000000..50c914e4 --- /dev/null +++ b/mis_tests/misc/threads_mitocode.py @@ -0,0 +1,52 @@ +# Python 3 Tutorial - 15 Hilos +# https://www.youtube.com/watch?v=3Rlh6uUuQqA + +import threading +import time +import datetime +import logging + +# no va este import +#import thread_hilo1.Hilo1 as Hilo2 +#import thread_hilo2.Hilo2 as Hilo2 + +# tampoco va +# from . import thread_hilo1 as Hilo1 +# from . import thread_hilo2 as Hilo2 + +# importación des de la misma carpeta +from thread_hilo1 import Hilo1 +from thread_hilo2 import Hilo2 + +# https://youtu.be/3Rlh6uUuQqA?t=457 +logging.basicConfig(level=logging.INFO, format='[%(levelname)s] (%(threadName)-s) %(message)s') + +def consultar(id_persona): + logging.info("consultando para el id " + str(id_persona)) + time.sleep(2) + return + +def guardar(id_persona, data): + logging.info("guardando para el id " + str(id_persona)+" data:"+str(data)) + time.sleep(5) + return + +tiempo_ini = datetime.datetime.now() +# t1 = threading.Thread(target=consultar,args=(1,),name="Hilo_1") +# t2 = threading.Thread(target=guardar,args=(1, "Suscribete al canal",)) # python aplica un nombre: Thread-1 + +#https://youtu.be/3Rlh6uUuQqA?t=663 hilos con clases +t1 = Hilo1("Hilo_1",1,"") +t2 = Hilo2("Hilo_2",1,"Suscribete") + +t1.start() +t2.start() + +# se ejecutan a la vez, esto hace que acabe en 5 sec +t1.join() +t2.join() + +#consultar(1) # ejec en hilo principal +#guardar(1, "Suscribete al canal") # ejec en hilo princ +tiempo_fin = datetime.datetime.now() +print("Tiempo transcurrido "+ str(tiempo_fin.second - tiempo_ini.second)) diff --git a/mis_tests/misc/threads_multi.py b/mis_tests/misc/threads_multi.py new file mode 100644 index 00000000..d91a3085 --- /dev/null +++ b/mis_tests/misc/threads_multi.py @@ -0,0 +1,26 @@ +# Python: 3.2 - Multi threading +# https://www.youtube.com/watch?v=xz3KgbftMes + +""" +threading.Thread() # create a new Thread +threading.active_count() # see how many running threads +threading.current_thread() # current thread number +threading.enumerate() # list active threads +threading.lock() # create a new lock +""" + +# https://youtu.be/xz3KgbftMes?t=740 +import threading + +def worker(inum): + # print("worker.Thread {}".format(inum)) + print("worker.Thread %s" % inum) + +lstthreads = [] +for i in range(5): + objthread = threading.Thread(target=worker,args=(i,)) + lstthreads.append(objthread) + objthread.start() + + + diff --git a/mis_tests/strings/__init__.py b/mis_tests/strings/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mis_tests/strings/palindromo.py b/mis_tests/strings/palindromo.py new file mode 100644 index 00000000..40348b0a --- /dev/null +++ b/mis_tests/strings/palindromo.py @@ -0,0 +1,95 @@ +""" +Detecta palindromos: + +http://www.estandarte.com/noticias/idioma-espanol/qu-es-un-palndromo-ejemplos_1723.html +Ejemplos: + +A Bali su flan anal fusilaba +No subas, abusón +Oí lo de mamá: me dolió +Sometamos o matemos +Yo dono rosas, oro no doy +Isaac no ronca así +Lavan esa base naval +No traces en ese cartón +¿Será lodo o dólares? +Logra Casillas allí sacar gol +""" +import io +from pprint import pprint + +class Palindromo(): + + arText = [] + + def __init__(self,sText=""): + if self.arText: + self.arText.append(sText) + + def __get_cleaned(self,sText): + """ + Obtiene un texto y limpia los caracteres mudos dejando solo letras sin espacios + """ + arVocals = [ + ("á","a"),("é","e"),("í","i"),("ó","o"),("ú","u") + ] + arWhite = [" ",",","?","¡","¿","`","+","&","%","$","@","|","!","#","*","{","}" + ,";",".","-",":",""] + # sText = sText.split() + for c in arWhite: + sText = sText.replace(c,"") + + for dic in arVocals: + sText = sText.replace(dic[0],dic[1]) + + return sText + + def __is_mirror(self,sText): + """ + Comprueba si las dos mitades del texto, que se limpiará, son un reflejo + """ + sText = self.__get_cleaned(sText) + # print("some text:",sText) + sText = sText.lower() + iLen = len(sText) + # cociente i resto + cnr = divmod(iLen,2) + + # pprint(cnr) + # pprint(iLen) + # pprint(cnr[0]) + # pprint(cnr[1]) + if cnr[1]==0 : + return (False,iLen) + + iMiddle = cnr[0] + sSideL = sText[0:iMiddle] + sSideR = (sText[iMiddle+1:])[::-1] + # pprint(sSideL) + # pprint(sSideR) + return ((sSideL == sSideR),iLen) + + + def check(self): + """ + """ + arResult = [] + # pprint(self.arText) + for sText in self.arText: + isPalLen = self.__is_mirror(sText) + arResult.append((sText,isPalLen[0],isPalLen[1])) + pprint(arResult) + + + def add_text(self,sValue): + self.arText.append(sValue) + + + +if __name__ == "__main__": + o = Palindromo() + o.add_text("Logra Casillas allí sacar gol") + o.add_text("A Bali su flan anal fusilaba") + o.add_text("No subas, abusón") + o.add_text("Yo dono rosas, oro no doy") + o.check() diff --git a/mis_tests/tasks/log.py b/mis_tests/tasks/log.py new file mode 100644 index 00000000..563351ed --- /dev/null +++ b/mis_tests/tasks/log.py @@ -0,0 +1,41 @@ + + +class Test(): + _prop_string = "string" + _prop_int = 1 + _prop_double = 78.653 + _list = [] + _dict = {} + + def __init__(self): + pass + + +def dump(obj): + '''return a printable representation of an object for debugging''' + newobj=obj + if '__dict__' in dir(obj): + newobj=obj.__dict__ + if ' object at ' in str(obj) and not newobj.has_key('__type__'): + newobj['__type__']=str(obj) + + for attr in newobj: + newobj[attr]=dump(newobj[attr]) + return newobj + + + +def var_export(mxVar): + from inspect import getmembers + from pprint import pprint + pprint(getmembers(mxVar)) + + + + +if __name__ == "__main__": + o = Test() + # var_export(o) + s = "esto es un texto" + # print(s.__len__()) + # var_export(s.__len__) \ No newline at end of file diff --git a/mis_tests/tasks/phptopy.py b/mis_tests/tasks/phptopy.py new file mode 100644 index 00000000..63fab10d --- /dev/null +++ b/mis_tests/tasks/phptopy.py @@ -0,0 +1,88 @@ +""" +mis_tests\tasks\phptopy.py +Traduce en lo posible código php a python +""" +import io +import sys +from pprint import pprint +import re +import os +from os import listdir +from os.path import isfile, join + +class Phptopy: + + def __init__(self): + currpath = os.path.dirname(os.path.abspath(__file__)) + self.currpath = os.path.dirname(os.path.abspath(currpath+"/../../../")) + self.pathfrom = self.currpath+"\\prj_mysqlhive\\backend\\vendor\\theframework\\components\\db" + self.pathto = self.currpath+"\\prj_python37\\theframework\\translated" + print(self.pathfrom,os.path.isdir(self.pathfrom)) + + def __get_files(self): + arFiles = [ + filename for filename in listdir(self.pathfrom) if isfile(join(self.pathfrom, filename)) + ] + return arFiles + + def __get_content(self,filename): + with open(filename) as f: + return f.read() + + def __get_intopy(self,content): + arCharsRm = ["{","}","$","private ","public ",";","","","self."), ("self::","self."), ("//","# "), + ("TRUE","True"), ("true","True"), ("FALSE","False"),("false","False"),("!===","!="), + ("!==","!="),(")) ","): "),(".$","+$"),(".=","+="),(".\"","+\""),("\".","\"+"),("NULL","None") + # ,("!","not") + ] + + for dic in arCharsRep: + content = content.replace(dic[0],dic[1]) + + for c in arCharsRm: + content = content.replace(c,"") + + return content + + def __get_in_lines(self,content): + return content.split("\n") + + def __get_not_emptylines(self,content): + arLines = self.__get_in_lines(content) + arFiltered = filter(lambda sLine: not re.match(r'^\s*$', sLine), arLines) + return "\n".join(arFiltered) + + def __write_file(self,filename,content): + f = open(filename, "w") + f.write(content) + f.close() + + + def __translate(self,arFiles): + for filename in arFiles: + if ".php" not in filename: + continue + pprint(filename) + sFile = self.pathfrom +"\\"+ filename + sContent = self.__get_content(sFile) + #sContent = sContent.strip() + # pprint(sContent) + sContent = self.__get_intopy(sContent) + # sContent = self.__get_not_emptylines(sContent) + sFileNew = self.pathto + "\\"+filename+".py" + print("sFileNew: ",sFileNew) + self.__write_file(sFileNew,sContent) + + def run(self): + arFiles = self.__get_files() + self.__translate(arFiles) + + +if __name__ == "__main__": + o = Phptopy() + o.run() diff --git a/mis_tests/winservice/winservice.py b/mis_tests/winservice/winservice.py new file mode 100644 index 00000000..40c6d238 --- /dev/null +++ b/mis_tests/winservice/winservice.py @@ -0,0 +1,49 @@ +# https://stackoverflow.com/questions/32404/how-do-you-run-a-python-script-as-a-service-in-windows +import win32serviceutil +import win32service +import win32event +import servicemanager +import socket + +class AppServerSvc (win32serviceutil.ServiceFramework): + _svc_name_ = "TestService" + _svc_display_name_ = "Test Service" + + def __init__(self,args): + win32serviceutil.ServiceFramework.__init__(self,args) + self.hWaitStop = win32event.CreateEvent(None,0,0,None) + socket.setdefaulttimeout(60) + + def SvcStop(self): + self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + win32event.SetEvent(self.hWaitStop) + + def SvcDoRun(self): + servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, + servicemanager.PYS_SERVICE_STARTED, + (self._svc_name_,'')) + self.main() + + def main(self): + pass + +if __name__ == '__main__': + win32serviceutil.HandleCommandLine(AppServerSvc) + +""" +Usage: 'winservice.py [options] install|update|remove|start [...]|stop|restart [...]|debug [...]' +Options for 'install' and 'update' commands only: + --username domain\\username : The Username the service is to run under + --password password : The password for the username + --startup [manual|auto|disabled|delayed] : How the service starts, default = manual + --interactive : Allow the service to interact with the desktop. + --perfmonini file: .ini file to use for registering performance monitor data + --perfmondll file: .dll file to use when querying the service for + performance data, default = perfmondata.dll +Options for 'start' and 'stop' commands only: + --wait seconds: Wait for the service to actually start or stop. + If you specify --wait with the 'stop' option, the service + and all dependent services will be stopped, each waiting + the specified period. +""" + diff --git a/mysql_crud/components/__init__.py b/mysql_crud/components/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mysql_crud/components/mysqlcli.py b/mysql_crud/components/mysqlcli.py new file mode 100644 index 00000000..48f49695 --- /dev/null +++ b/mysql_crud/components/mysqlcli.py @@ -0,0 +1,84 @@ +#python -m pip install mysql-connector-python +import mysql.connector +#from typing import Union, Optional, Dict, List +from typing import Dict, List + + +class MysqlCli: + + def __init__(self, arconn = Dict): + self.__arerrors = [] + self.__ifoundrows = 0 + self.__iaffectedrows = 0 + self.__ilastid = -1 + self.__arconn = arconn + self.__connection = None + + def __get_connection(self): + if not self.__connection: + self.__connection = mysql.connector.connect(**self.__arconn) + return self.__connection + + def close(self) -> None: + if self.__connection and self.__connection.is_connected(): + self.__connection.close() + self.__connection.disconnect() + self.__connection = None + + def query(self, sql: str) -> List: + try: + conn = self.__get_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(sql) + result = cursor.fetchall() + self.__ifoundrows = self.__get_found_rows(cursor) + self.__iaffectedrows = cursor.rowcount + return result + except mysql.connector.Error as error: + self.__arerrors.append(error) + finally: + cursor.close() + + @staticmethod + def __get_found_rows(cursor) -> int: + cursor.execute("SELECT FOUND_ROWS() n") + result = cursor.fetchall() + if result: + return int(result[0].get("n",-1)) + return 0 + + @staticmethod + def __get_last_insert_id(cursor) -> int: + cursor.execute("SELECT LAST_INSERT_ID() id") + result = cursor.fetchall() + if result: + return int(result[0][0]) + return -1 + + def exec(self, sql: str, ismulti:bool = False) -> None: + try: + conn = self.__get_connection() + cursor = conn.cursor() + if not ismulti: + cursor.execute(sql) + else: + for r in cursor.execute(sql, multi=ismulti): pass; + + conn.commit() + self.__iaffectedrows = cursor.rowcount + if sql.find("INSERT INTO ("): + self.__ilastid = self.__get_last_insert_id(cursor) + + except mysql.connector.Error as error: + self.__arerrors.append(error) + finally: + cursor.close() + + def is_error(self) -> bool: + return True if self.__arerrors else False + + def get_errors(self) -> List: + return self.__arerrors + + def get_lastid(self)->int: + return self.__ilastid diff --git a/mysql_crud/components/mysqlqb.py b/mysql_crud/components/mysqlqb.py new file mode 100644 index 00000000..5912baca --- /dev/null +++ b/mysql_crud/components/mysqlqb.py @@ -0,0 +1,282 @@ +from __future__ import annotations +from typing import Optional, Any, List + + +class MysqlQB: + + def __init__(self, table: str = ""): + self.__comment = "" + self.__table = table + + self.__argetfields = [] + self.__arnumeric = [] # campos tratados como numeros para evitar '' en los insert/update + + self.__arjoins = [] + self.__arands = [] + self.__arorderby = [] + self.__arhaving = [] + self.__argroupby = [] + self.__arlimit = [] + + self.__arinsertfv = [] + self.__arupdatefv = [] + + self.__isfoundrows = False + self.__isdistinct = False + + self.__sql = "" + + def get_select(self) -> str: + self.__sql = "" + sql = "-- get_selectfrom" + if not self.__table or not self.__argetfields: + return sql + + comment = f"/*{self.__comment}*/" if self.__comment else "" + sql = f"{comment} SELECT " + if self.__isfoundrows: + sql += f"SQL_CAL_FOUND_ROWS " + + if self.__isdistinct: + sql += f"DISTINCT " + + sql += ", ".join(self.__argetfields) + sql += f" FROM {self.__table} " + sql += self.__get_joins() + sql += " WHERE 1 " + ands = self.__arands + if ands: + sql += "AND " + " AND ".join(ands) + " " + sql += self.__get_groupby() + sql += self.__get_having() + sql += self.__get_orderby() + sql += self.__get_limit() + + self.__sql = sql.strip() + return self.__sql + + def get_insert(self) -> str: + self.__sql = "" + sql = "-- get_insert" + if not self.__table: + return sql + + comment = f"/*{self.__comment}*/" if self.__comment else "" + sql = f"{comment} INSERT INTO {self.__table} " + if not self.__arinsertfv: + return sql + + fields = [item.get("field", "") for item in self.__arinsertfv] + fields = ", ".join(fields) + sql += f"({fields}) " + values = [item.get("value") for item in self.__arinsertfv] + aux = [] + for value in values: + if value is None: + aux.append("null") + elif value in self.__arnumeric: + aux.append(value) + else: + aux.append(f"'{value}'") + sql += "VALUES (" + " ,".join(aux) + ")" + self.__sql = sql + return self.__sql + + def get_delete(self) -> str: + self.__sql = "" + sql = "-- get_delete" + if not self.__table or not self.__arands: + return sql + + comment = f"/*{self.__comment}*/" if self.__comment else "" + sql = f"{comment} DELETE FROM {self.__table} " + + sql += "WHERE " + ands = self.__arands + if ands: + sql += " AND ".join(ands) + + self.__sql = sql.strip() + return self.__sql + + def get_update(self) -> str: + self.__sql = "" + sql = "-- get_update" + if not self.__table or not self.__arands: + return sql + + comment = f"/*{self.__comment}*/" if self.__comment else "" + sql = f"{comment} UPDATE {self.__table} SET " + if not self.__arupdatefv: + return sql + + aux = [] + for dc in self.__arupdatefv: + field = dc.get("field", "") + if not field: + continue + value = dc.get("value") + if value is None: + aux.append(f"{field}=null") + elif value in self.__arnumeric: + aux.append(f"{field}={value}") + else: + aux.append(f"{field}='{value}'") + + sql += ", ".join(aux) + " " + + sql += "WHERE " + ands = self.__arands + if ands: + sql += " AND ".join(ands) + + self.__sql = sql.strip() + return self.__sql + + def get_truncate(self) -> str: + self.__sql = "" + sql = "-- truncate" + if not self.__table: + return sql + + comment = f"/*{self.__comment}*/" if self.__comment else "" + sql = f"{comment} TRUNCATE TABLE {self.__table}" + self.__sql = sql + return self.__sql + + def __get_joins(self) -> str: + tmp = MysqlQB.__get_unique(self.__arjoins) + strjoins = " " + "\n".join(tmp) if tmp else "" + return strjoins + + def __get_groupby(self) -> str: + tmp = MysqlQB.__get_unique(self.__argroupby) + strgroupby = " GROUP BY " + ", ".join(tmp) if tmp else "" + return strgroupby + + def __get_having(self) -> str: + tmp = MysqlQB.__get_unique(self.__arhaving) + strhaving = " HAVING " + ", ".join(tmp) if tmp else "" + return strhaving + + def __get_orderby(self) -> str: + tmp = MysqlQB.__get_unique(self.__arorderby) + strorderby = " ORDER BY " + ", ".join(tmp) if tmp else "" + return strorderby + + def __get_limit(self) -> str: + strlimit = " LIMIT " + ",".join(self.__arlimit) if self.__arlimit else "" + """ + * si por ejemplo deseo paginar de 10 en 10 + * para la pag: + * 1 sería LIMIT 0,10 -- 1 a 10 + * 2 LIMIT 10,10 -- 11 a 20 + * 3 LIMIT 20,10 -- 21 a 30 + """ + return strlimit + + def set_table(self, name: str) -> MysqlQB: + self.__table = name + return self + + def set_comment(self, comment: str) -> MysqlQB: + self.__comment = comment + return self + + def add_insert_fv(self, field: str, value: Any, dosanitize: bool = True) -> MysqlQB: + self.__arinsertfv.append({ + "field": field, + "value": self.get_sanitized(value) if dosanitize else value + }) + return self + + def add_update_fv(self, field: str, value: Any, dosanitize: bool = True) -> MysqlQB: + self.__arupdatefv.append({ + "field": field, + "value": self.get_sanitized(value) if dosanitize else value + }) + return self + + def set_getfields(self, fields: List[str]) -> MysqlQB: + self.__argetfields = fields + return self + + def add_getfield(self, field: str) -> MysqlQB: + self.__argetfields.append(field) + return self + + def set_joins(self, joins: List[str]) -> MysqlQB: + self.__arjoins = joins + return self + + def set_orderby(self, orderbys: List[str]) -> MysqlQB: + self.__arorderby = orderbys + return self + + def set_groupby(self, groupbys: List[str]) -> MysqlQB: + self.__argroupby = groupbys + return self + + def set_having(self, havings: List[str]) -> MysqlQB: + self.__arhaving = havings + return self + + def set_limit(self, ippage: int = 1000, iregfrom: int = 0) -> MysqlQB: + self.__arlimit = [] + self.__arlimit.append(str(iregfrom)) + self.__arlimit.append(str(ippage)) + if ippage is None: + self.__arlimit = [] + return self + + @staticmethod + def get_sanitized(value: str) -> Optional[str]: + if value is None: + return None + if isinstance(value, str): + return value.replace("'", "\\'") + return value + + @staticmethod + def __get_unique(array: List) -> List: + return list(set(array)) + + def is_distinct(self, ison: bool = True) -> MysqlQB: + self.__isdistinct = ison + return self + + def is_foundrows(self, ison: bool = True) -> MysqlQB: + self.__isfoundrows = ison + return self + + def add_numeric(self, fieldname: str) -> MysqlQB: + self.__arnumeric.append(fieldname) + return self + + def add_and(self, strand: str) -> MysqlQB: + self.__arands.append(strand) + return self + + def add_and_in(self, field: str, values: List, isnum: bool = True) -> MysqlQB: + values = list(set(values)) + strin = ",".join(values) if isnum else "','".join(values) + strin = f"({strin})" if isnum else f"('{strin}')" + self.__arands.append(f"{field} IN {strin}") + return self + + def add_join(self, strjoin: str) -> MysqlQB: + # to-do key argument + self.__arjoins.append(strjoin) + return self + + def add_orderby(self, field: str, sorder: str = "ASC") -> MysqlQB: + self.__arorderby.append(f"{field} {sorder}") + return self + + def add_groupby(self, field: str) -> MysqlQB: + self.__argroupby.append(field) + return self + + def add_having(self, field: str) -> MysqlQB: + self.__arhaving.append(field) + return self diff --git a/mysql_crud/etl.py b/mysql_crud/etl.py new file mode 100644 index 00000000..827a578b --- /dev/null +++ b/mysql_crud/etl.py @@ -0,0 +1,140 @@ +from typing import Dict, List + +from datetime import datetime +import uuid +from pprint import pprint +from components.mysqlqb import MysqlQB +from components.mysqlcli import MysqlCli + + +def get_db1(): + db = MysqlCli(arconn={ + "host": "localhost", + "user": "root", + "password": "1234", + "database": "db_anytest", + #"port": 3307 + }) + return db + + +def get_db2(): + db = MysqlCli(arconn={ + "host": "localhost", + "user": "root", + "password": "1234", + "database": "db_anytest2", + #"port": 3307 + }) + return db + + +def extract_from_db1() -> List[Dict]: + print("...extract from db1 \n") + query = MysqlQB() + sql = query.\ + set_comment("some comment")\ + .set_table("app_array as m")\ + .add_getfield("id")\ + .add_getfield("code_erp")\ + .add_getfield("description")\ + .add_getfield("type")\ + .add_and("m.id > 10")\ + .get_select() + + print(sql) + + db1 = get_db1() + r = db1.query(sql) + #db1.close() + + db11 = get_db1() + r = db11.query(sql) + + db12 = get_db1() + r = db12.query(sql) + db12.close() + + db13 = get_db1() + r = db13.query(sql) + #db13.close() + + return r + + +def transform(r:List[Dict]) -> List[Dict]: + print("...transform db1 \n") + now = datetime.now() + now = now.strftime("%Y-%m-%d:%H:%M:%S") + + #pprint(r) + rows = [] + for i,row in enumerate(r): + #pprint(f"i={str(i)}") + d = { + "code_erp" : row.get("id", ""), + "description" : (row.get("description", " desc") + " " + now) if row.get("description", "") is not None else None, + "`type`" : row.get("type",None), + "code_cache" : str(uuid.uuid1()) + } + rows.append(d) + return rows + + +def delete_db2(): + pprint("...delete db2 \n") + sql = (MysqlQB())\ + .set_comment("some delete")\ + .set_table("app_array")\ + .add_and("1")\ + .get_delete() + sql = (MysqlQB()).set_comment(" truncate all").set_table("app_array").get_truncate() + print(sql) + db2 = get_db2() + db2.exec(sql) + + +def load_into_db2(r: List[Dict]) -> None: + print("...load into db2 \n") + #pprint(r) + sqls = [] + for i, row in enumerate(r): + comment = f"row "+str(i) + query = MysqlQB() + query.set_table("app_array").set_comment(comment) + for field in row: + value = row.get(field) + query.add_insert_fv(field, value) + + sqls.append(query.get_insert()) + + sqls = ";".join(sqls) + ";" + print(sqls) + db2 = get_db2() + db2.exec(sqls, True) + if db2.is_error(): + pprint("ERROR in db2\n") + pprint(db2.get_errors()) + #db2.close() + pprint(" === ETL end ===") + + +def index(): + """ + por más que abro conexiones en el listado de hilos conectados y procesos solo se muestra 1 más + es decir, 2 (1 de yog y otro de python) + """ + delete_db2() + r = extract_from_db1() + r = transform(r) + load_into_db2(r) + +index() + +""" +docker exec -it --user root cont-mariadb-univ bash; +mysql -u root -p + +show global status where `variable_name` like '%Threads_%' or `variable_name` LIKE '%connected%'; +show processlist; +""" diff --git a/mysql_crud/index.py b/mysql_crud/index.py new file mode 100644 index 00000000..f7e37d08 --- /dev/null +++ b/mysql_crud/index.py @@ -0,0 +1,85 @@ +from pprint import pprint +from components.mysqlqb import MysqlQB +from components.mysqlcli import MysqlCli + +def get_db(): + db = MysqlCli(arconn={ + "server": "localhost", + "user": "root", + "password": "1234", + "database": "db_anytest", + #"port": 3307 + }) + return db + + +def select(): + query = MysqlQB() + sql = query.\ + set_comment("some comment")\ + .set_table("app_array as m").add_getfield("id").add_getfield("code_erp").add_getfield("description")\ + .add_getfield("type")\ + .add_and("m.id > 10")\ + .get_select() + + pprint(sql) + r = get_db().query(sql) + pprint(r) + + +def insert(): + query = MysqlQB() + sql = query\ + .set_comment("some insert")\ + .set_table("app_array")\ + .add_insert_fv("code_erp","un-code-erp")\ + .add_insert_fv("`type`","borrame")\ + .add_insert_fv("code_cache","uuu-1234")\ + .get_insert() + + pprint(sql) + db = get_db() + r = db.exec(sql) + errors = db.get_errors() + if errors: + pprint(errors) + + pprint(r) + + id = db.get_lastid() + pprint(id) + + +def update(): + sql = (MysqlQB())\ + .set_comment("some update")\ + .set_table("app_array")\ + .add_update_fv("code_erp","xxxx")\ + .add_update_fv("`type`","yyyy")\ + .add_update_fv("code_cache","uuu-5248")\ + .add_and("1")\ + .get_update() + pprint(sql) + db = get_db() + db.exec(sql) + + +def delete(): + sql = (MysqlQB())\ + .set_comment("some delete")\ + .set_table("app_array")\ + .add_and("type = 'borrame'")\ + .get_delete() + pprint(sql) + db = get_db() + db.exec(sql) + + +def index(): + delete() + insert() + update() + select() + +index() + diff --git a/mysql_crud/qb.py b/mysql_crud/qb.py new file mode 100644 index 00000000..74756933 --- /dev/null +++ b/mysql_crud/qb.py @@ -0,0 +1,56 @@ +from components.mysqlqb import MysqlQB +from pprint import pprint + + +def pr(sql): + pprint(sql) + print("\n") + + +def index(): + sql = (MysqlQB("table_demo AS tm"))\ + .set_getfields([ + "field_1 as one", "COUNT(field_2) as two" + ])\ + .add_and("field_1 >1").add_and("field_2 <100").set_comment("this is a comment").is_distinct(ison=True)\ + .add_join("LEFT JOIN table_aux AS ttwo ON tm.field_1 = ttwo.field_1")\ + .add_groupby("field_1").add_having("COUNT(field_2) > 5").add_orderby("field_1 DESC").set_limit("15")\ + .get_select() + pr(sql) + + sql = (MysqlQB("app_array")).set_comment("some insert")\ + .add_insert_fv("code_erp","x'z\" un-code-erp")\ + .add_insert_fv("`type`","borrame")\ + .add_insert_fv("code_cache","uuu-1234")\ + .get_insert() + print(sql) + print("") + + sql = (MysqlQB("app_array")).set_comment("some update")\ + .add_update_fv("code_erp","xxxx")\ + .add_update_fv("`type`","yyyy")\ + .add_update_fv("code_cache","uuu-5248")\ + .add_and("field = 22")\ + .get_update() + print(sql) + print("") + + somevalue = "'xxx''x'z'x'''x'x'\"'yyy" + somevalue = MysqlQB.get_sanitized(somevalue) + sql = (MysqlQB("app_array"))\ + .set_comment("some delete")\ + .set_table("app_array")\ + .add_and("type = 'borrame'")\ + .add_and("fieldy = 22")\ + .add_and(f"fieldx = '{somevalue}'")\ + .get_delete() + print(sql) + print("") + + sql = (MysqlQB("app_array"))\ + .set_comment("truncate example")\ + .get_truncate() + print(sql) + print("") + +index() diff --git a/pdf-to-csv/.gitignore b/pdf-to-csv/.gitignore new file mode 100644 index 00000000..202ba41e --- /dev/null +++ b/pdf-to-csv/.gitignore @@ -0,0 +1,8 @@ +.idea +.vscode +.~l* +PROYECTO-BASICO-Y-DE-EJECUCION-EL-CASAR-19.10.22.pdf +proyecto.csv +splitted +merged +*.csv diff --git a/pdf-to-csv/files.py b/pdf-to-csv/files.py new file mode 100644 index 00000000..45a3fb7a --- /dev/null +++ b/pdf-to-csv/files.py @@ -0,0 +1,4 @@ +file = f"./PROYECTO-BASICO-Y-DE-EJECUCION-EL-CASAR-19.10.22.pdf" +file_to = f"./proyecto.csv" +dir_splitted = "./splitted" +file_merged = f"./merged/merged.pdf" diff --git a/pdf-to-csv/pdf_parts.py b/pdf-to-csv/pdf_parts.py new file mode 100644 index 00000000..ee3774d3 --- /dev/null +++ b/pdf-to-csv/pdf_parts.py @@ -0,0 +1,410 @@ +import re + +columns_coords = { + "codigo": {"x1": 90.72, "x2": 127}, + "resumen": {"x1": 166.4, "x2": 407.23}, + "uds": {"x1": 411, "x2": 429.4}, + "longitud": {"x1": 436.12, "x2": 483.84}, + "anchura": {"x1": 487.87, "x2": 535}, + "altura": {"x1": 538.27, "x2": 575.23}, + "cantidad": {"x1": 590.01, "x2": 636.38}, + "precio": {"x1": 666.62, "x2": 700.22}, + "importe": {"x1": 735.84, "x2": 776.16}, +} + +empty_row = { + "codigo": None, + "resumen": None, + "uds": None, + "longitud": None, + "anchura": None, + "altura": None, + "cantidad": None, + "precio": None, + "importe": None, +} + +table_row = { + "codigo": "CÓDIGO", + "resumen": "RESUMEN", + "uds": "UDS", + "longitud": "LONGITUD", + "anchura": "ANCHURA", + "altura": "ALTURA", + "cantidad": "CANTIDAD", + "precio": "PRECIO", + "importe": "IMPORTE", +} + +page_sections = { + "titulo": { + # if x=90.72 && text=="PRESUPUESTO Y MEDICIONES" + "codigo": "PRESUPUESTO Y MEDICIONES", + }, + "table_header": { + # if x=90.72 && text=="CÓDIGO RESUMEN UDS LONGITUD ANCHURA ALTURA CANTIDAD PRECIO IMPORTE" + "codigo": "CÓDIGO RESUMEN UDS LONGITUD ANCHURA ALTURA CANTIDAD PRECIO IMPORTE" + }, + "section_header": { + # if same y and in x in codigo is regex[\d{2}] and + # next item in x in resumen and no more in other cols + """ + {'pos': {'x': 90.72, 'y': 84.32}, 'text': '\n'} + {'pos': {'x': 90.72, 'y': 84.32}, 'text': '01'} + {'pos': {'x': 166.4, 'y': 84.32}, 'text': ' VIVIENDA MODULAR'} + """ + "codigo": "01", + "resumen": "01 VIVIENDA MODULAR" + }, + "subsection_header": { + # if same y and in x in codigo is regex[\d{2}.\d{2}] and next x in resumen and no more in otherscols + "codigo": "01.01", + "resumen": "ESTRUCTURA METÁLICA", + }, + "chapter_title": { + # if same y and in x in codigo is regex[\d{2}.\d{2}.\d{2}] and next x in resumen and no more in otherscols + "codigo": "01.01.01", + "resumen": "kg VIGAS METÁLICAS DE MÓDULOS 1, 2, 3, 4, 5, 6, 7 y 8", + }, + "chapter_description": [ + # if only in resumen + {"codigo": "", "resumen": "a"}, + {"codigo": "", "resumen": "b"}, + {"codigo": "", "resumen": "c"}, + {"codigo": "", "resumen": ""}, # is only description + { + "codigo": "", + "resumen": "TITULO 1" + }, + { + "codigo": "", + "resumen": "TITULO 2" + }, + { + "codigo": "", + "resumen": "TITULO 3" + }, + ], + + "cantidades": [ + { + # if in resumen and in cantidad + "codigo": "", + "resumen": "concepto x", + "uds": "2", + "longitud": "13,64", + "anchura": "22.40", + }, + ], + "chapter_total": { + "codigo": "", "resumen": "", "uds": "", "longitud": "", + "anchura": "", "altura": "", + # calcular por coor-x y si hay 3 numeros: 15.545,91 1,58 24.562,54 + "cantidad": "", "precio": "", "importe": "", + }, + "subsection_total": { + """ + {'xs': [ + {'text': 'TOTAL 01.01........................................................................................... 39.008,61', + 'x': 351.52}], //resumen + 'y': 659.2}, + """ + } +} + + +def _is_title(line_y): + title = "PRESUPUESTO Y MEDICIONES" + xs = line_y.get("xs") + x0 = xs[0].get("x") + text = xs[0].get("text") + return (_is_in_column("codigo", x0) and text == title) + + +def get_title_row(line_y): + if _is_title(line_y): + row = empty_row.copy() + xs = line_y.get("xs") + text = xs[0].get("text") + row["codigo"] = text + return row + return None + + +def get_table_row(line_y): + title = "CÓDIGO RESUMEN UDS LONGITUD ANCHURA ALTURA CANTIDAD PRECIO IMPORTE" + xs = line_y.get("xs") + x0 = xs[0].get("x") + text = xs[0].get("text") + if _is_in_column("codigo", x0) and text == title: + return table_row + return None + + +def get_section_header_row(line_y): + xs = line_y.get("xs") + if len(xs) < 2: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + x1 = xs[1].get("x") + x1text = xs[1].get("text") + + if _is_in_column("codigo", x0) and _match("^\d{2}$", x0text) and x1 and _are_empty_after("resumen", line_y): + row = empty_row.copy() + row["codigo"] = x0text + row["resumen"] = x1text + return row + + return None + + +def get_subsection_header_row(line_y): + xs = line_y.get("xs") + if len(xs) < 2: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + x1 = xs[1].get("x") + x1text = xs[1].get("text") + + if _is_in_column("codigo", x0) and _match("\d{2}\.\d{2}$", x0text) and x1 and _are_empty_after("resumen", line_y): + row = empty_row.copy() + row["codigo"] = x0text + row["resumen"] = x1text + return row + + return None + + +def get_chapter_title_row(line_y): + xs = line_y.get("xs") + if len(xs) != 1: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + + """ + {'xs': [{'text': '01.01.04 m2 FORJADO DE CHAPA COLABORANTE DE MÓDULOS 1, 2, 3, 4, 5, 6 y 7', 'x': 90.72}], + """ + if _is_in_column("codigo", x0) and _match("^(\d{2}\.\d{2}\.\d{2}).*", x0text) : + row = empty_row.copy() + codigo = x0text.split(" ") + title = codigo[1:] + codigo = codigo[0] + title = " ".join(title) + row["codigo"] = codigo + row["resumen"] = title + return row + + return None + + +def get_chapter_description_row(line_y): + xs = line_y.get("xs") + if len(xs) != 1: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + + if not _is_in_column("codigo", x0) and _is_in_column("resumen", x0) and _are_empty_after("resumen", line_y) and "...." not in x0text: + row = empty_row.copy() + row["resumen"] = x0text + return row + + return None + + +def get_quantity_with_length_row(line_y): + xs = line_y.get("xs") + if len(xs) != 4: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + x1text = xs[1].get("text") + x2 = xs[2].get("x") + + """ + [ + {'text': 'Perfil 04 - Chapa L.80.50.2 (P=2,04kg/ml)','x': 166.4}, + {'text': '12', 'x': 417.28},//uds + {'text': '3,02', 'x': 462.72},//longitud (x2) + {'text': '2,04 73,93', 'x': 512.0} //anchura cantidad + ] + """ + if not _is_in_column("codigo", x0) and _is_in_column("resumen", x0) and _is_in_column("longitud",x2) and _match("\d+", x1text): + row = empty_row.copy() + row["resumen"] = x0text + row["uds"] = x1text + row["longitud"] = xs[2].get("text") + altura = xs[3].get("text").split(" ") + row["anchura"] = altura[0] + if len(altura)>1: + row["cantidad"] = altura[1] + return row + + return None + + +def get_quantity_with_width_row(line_y): + xs = line_y.get("xs") + if len(xs) != 4: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + x1text = xs[1].get("text") + x2 = xs[2].get("x") + + """ + [ + {'text': 'Pilar 01 de Perfil Tub. Cuad. 100x6 (P=16,70kg/ml)','x': 166.4}, + {'text': '9', 'x': 422.24},//uds + {'text': '16,70', 'x': 507.04},//anchura (x2) + {'text': '3,00 450,90', 'x': 553.44}//altura y cantidad + ] + """ + if not _is_in_column("codigo", x0) and _is_in_column("resumen", x0) and _is_in_column("anchura", x2) and _match("\d+", x1text): + row = empty_row.copy() + row["resumen"] = x0text + row["uds"] = x1text + row["anchura"] = xs[2].get("text") + altura = xs[3].get("text").split(" ") + row["altura"] = altura[0] + row["cantidad"] = altura[1] + return row + + return None + + +def get_no_desc_quantity_row(line_y): + xs = line_y.get("xs") + if len(xs) != 3: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + + x1 = xs[1].get("x") + x2 = xs[2].get("x") + + """ + {'xs': [{'text': '1', 'x': 422.24},//unidades + {'text': '3,22', 'x': 462.72},//longitud + {'text': '7,71 24,83', 'x': 512.0}],//anchura y cantidad + """ + + if _is_in_column("uds", x0) and _is_in_column("longitud", x1) and _is_in_column("anchura", x2): + row = empty_row.copy() + row["uds"] = x0text + row["longitud"] = xs[1].get("text") + anchura_cantidad = xs[2].get("text").split(" ") + row["anchura"] = anchura_cantidad[0] + row["cantidad"] = anchura_cantidad[1] + return row + + return None + + +def get_page_number_row(line_y): + #{'xs': [{'text': '2', 'x': 766.24}], 'y': 1101.12}]}, + xs = line_y.get("xs") + if len(xs) != 1: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + + if _is_in_column("importe", x0) and _match("\d+", x0text): + row = empty_row.copy() + row["importe"] = x0text + return row + + return None + +def get_chapter_total(line_y): + xs = line_y.get("xs") + if len(xs) != 1: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + + # {'xs': [{'text': '15.545,91 1,58 24.562,54', 'x': 591.68}], + # r = _is_numbers(x0text) + + if _is_in_column("cantidad", x0) and " " in x0text and _is_numbers(x0text): + row = empty_row.copy() + # cantidad, precio e importe + values = x0text.split(" ") + row["cantidad"] = values[0] + row["precio"] = values[1] + row["importe"] = values[2] + return row + + return None + + +def _is_number(s): + return _match("\d+\.\d+\,\d+", s) or _match("\d+\,\d+", s) or _match("\d+", s) + + +def _is_numbers(string): + if isinstance(string, float): + return True + nums = string.split(" ") + for num in nums: + if not _is_number(num): + return False + return True + + +def get_subsection_total(line_y): + xs = line_y.get("xs") + if len(xs) != 1: + return None + x0 = xs[0].get("x") + x0text = xs[0].get("text") + + """ + {'text': 'TOTAL 01.01............................................................................... 39.008,61','x': 351.52} + """ + if _is_in_column("resumen", x0) and "....." in x0text and _match("\d+\,\d+", x0text): + row = empty_row.copy() + parts = x0text.split(".....") + row["resumen"] = parts[0] + total = parts[-1:][0] + total = total.split(" ") + row["importe"] = total[-1:][0] + return row + + return None + + +def _match(pattern, text): + r = re.search(pattern, text) + return True if r else False + + +def _is_in_column(name, x): + coords = columns_coords.get(name) + return coords.get("x1") <= x <= coords.get("x2") + + +def _are_empty_after(colname, line_y): + xs = line_y.get("xs") + columns = list(columns_coords.keys()) + for i, col in enumerate(columns): + if col == colname: + break + columns = columns[i + 1:10] + for x in xs: + coord_x = x.get("x") + for col in columns: + x_range = columns_coords.get(col) + x1 = x_range.get("x1") + if coord_x < x1: continue + x2 = x_range.get("x2") + if x1 <= coord_x <= x2: + return False + return True + + +def _is_index(idx, ls): + return idx < len(ls) diff --git a/pdf-to-csv/py-pypdf2.py b/pdf-to-csv/py-pypdf2.py new file mode 100644 index 00000000..9d051a71 --- /dev/null +++ b/pdf-to-csv/py-pypdf2.py @@ -0,0 +1,56 @@ +# pip install PyPDF2 +from files import * +from pprint import pprint +from PyPDF2 import PdfReader +from PyPDF2 import PdfFileReader, PdfFileWriter +import os + +#reader = PdfReader(file) +#page = reader.pages[639] +#pprint(page.extractText()) + + +def pdf_splitter(path): + # fname = os.path.splitext(os.path.basename(path))[0] + pdf = PdfFileReader(path) + for page in range(pdf.getNumPages()): + if page<638: + continue + pdf_writer = PdfFileWriter() + pdf_writer.addPage(pdf.getPage(page)) + output_filename = f"./splitted/page_{page+1}.pdf" + with open(output_filename, "wb") as out: + pdf_writer.write(out) + print("Created: {}".format(output_filename)) + +def merge(): + input_paths = [] + scanned = os.scandir(dir_splitted) + for item in scanned: + if item.is_file(): + input_paths.append(f"{dir_splitted}/{item.name}") + + input_paths.sort() + # pprint(input_paths) + pdf_writer = PdfFileWriter() + for path in input_paths: + pdf_reader = PdfFileReader(path) + for page in range(pdf_reader.getNumPages()): + pdf_writer.addPage(pdf_reader.getPage(page)) + + with open(file_merged, "wb") as fh: + pdf_writer.write(fh) + +# pdf_splitter(file) +#merge() + +def get_text(): + reader = PdfFileReader(file_merged) + texts = [] + for i_page in range(reader.getNumPages()): + page = reader.pages[i_page] + texts.append(page.extract_text()) + + print(texts[2]) + +get_text() diff --git a/pdf-to-csv/py-tabula.py b/pdf-to-csv/py-tabula.py new file mode 100644 index 00000000..8f6cbced --- /dev/null +++ b/pdf-to-csv/py-tabula.py @@ -0,0 +1,44 @@ +# pip uninstall tabula; install tabula-py + +from files import * +from tabula import read_pdf, convert_into +import sys +from pprint import pprint +import csv +# Read a PDF File +#file = f"./PROYECTO-BASICO-Y-DE-EJECUCION-EL-CASAR-19.10.22.pdf" +#file_to = f"./proyecto.csv" + +#df = tabula.read_pdf(file, pages=[639,650])[0] +#df = tabula.read_pdf(file, options="--columns 0,1,2,3,4,5,6,7,8,9", pages=[639])[0] + +# area (top,left,bottom,right) +#df = tabula.read_pdf(file, lattice=True,pages=[639]) +# df = tabula.read_pdf(file, stream=True, pages=[639, 640]) +df = read_pdf( + file_merged, + guess=False, + pages = 1, + stream=True, + encoding="utf-8", + area = (96,24,558,750), + # output_format="json", + columns = (95, 95+76, 95+318, 95+346, 95+395,95+494,95+574,95+639) +) + +#f = open(file_to, "w") +#writer = csv.writer(f) +#writer.writerows(df[0]) +#f.close() +#pprint(df[0]); sys.exit() + +# convert PDF into CSV +#tabula.convert_into(file, file_to, output_format="json", pages=[639]) +convert_into( + file_merged, + file_to, + output_format="tsv", + pages="all", + columns = [0, 95, 95+76, 95+318, 95+346, 95+395,95+494,95+574,95+639] +) + diff --git a/pdf-to-csv/py-textract.py b/pdf-to-csv/py-textract.py new file mode 100644 index 00000000..6ab8319d --- /dev/null +++ b/pdf-to-csv/py-textract.py @@ -0,0 +1,7 @@ +# pip install textract +from files import * +import textract +from pprint import pprint + +text = textract.process(file_merged) +pprint(str(text,"utf-8")) diff --git a/pdf-to-csv/py-tocsv.py b/pdf-to-csv/py-tocsv.py new file mode 100644 index 00000000..79b6b7c2 --- /dev/null +++ b/pdf-to-csv/py-tocsv.py @@ -0,0 +1,129 @@ +# pip install PyPDF2 +from files import * +from PyPDF2 import PdfFileReader +from pdf_parts import * +from pprint import pprint +import sys + + +page_coords = [] + + +def visitor_body(text, cm, text_matrix, fontDict, fontSize): + # pprint(fontSize);sys.exit() + dic = { + "text": text, + "coord": { + "x": text_matrix[4], + "y": text_matrix[5], + } + } + if text_matrix[4] != 0.0 and text_matrix[5] != 0.0: + page_coords.append(dic) + + +def get_all_pages_coords(): + global page_coords + + all_pages = [] + reader = PdfFileReader(file_merged) + for i_page in range(reader.getNumPages()): + page_coords = [] + page = reader.pages[i_page] + page.extract_text(visitor_text=visitor_body) + + all_pages.append({ + "page": i_page, + "lines": page_coords.copy() + }) + #if i_page == 3: return all_pages + return all_pages + + +def get_line_by_y(y, lines): + by_y = filter(lambda line: line.get("coord").get("y") == y and line.get("text") != "\n", lines) + r = map(lambda line: {"x": line.get("coord").get("x"), "text": line.get("text","").strip()}, by_y) + r = list(r) + def _sort(dc): + return dc["x"] + r.sort(key = _sort) + return { + "y": y, + "xs": r + } + + +def get_merged_line_with_same_y(): + page_and_its_coord_lines = get_all_pages_coords() + + transformed = [] + for page in page_and_its_coord_lines: + #i_page = page.get("page") + lines_coords = page.get("lines") + new_lines = [] + y_processed = [] + for lines_coord in lines_coords: + y = lines_coord.get("coord").get("y") + if y in y_processed: + continue + y_processed.append(y) + by_y = get_line_by_y(y, lines_coords) + new_lines.append(by_y) + transformed.append({ + "page": new_lines + }) + return transformed + + +as_dicts = [] +pages_by_y = get_merged_line_with_same_y() +#pprint(pages_by_y); sys.exit() +for i,page in enumerate(pages_by_y): + print(f"page {i}") + page_lines = page.get("page") + # pprint(page_lines); sys.exit() + for page_y in page_lines: + row = get_title_row(page_y) + if row: as_dicts.append(row) + row = get_table_row(page_y) + if row: as_dicts.append(row) + row = get_section_header_row(page_y) + if row: as_dicts.append(row) + row = get_chapter_title_row(page_y) + if row: as_dicts.append(row) + row = get_subsection_header_row(page_y) + if row: as_dicts.append(row) + row = get_chapter_description_row(page_y) + if row: as_dicts.append(row) + row = get_quantity_with_length_row(page_y) + if row: as_dicts.append(row) + + row = get_chapter_total(page_y) + if row: + as_dicts.append(row) + as_dicts.append(empty_row) + + row = get_subsection_total(page_y) + if row: + as_dicts.append(row) + as_dicts.append(empty_row) + + row = get_no_desc_quantity_row(page_y) + if row: as_dicts.append(row) + row = get_quantity_with_width_row(page_y) + if row: as_dicts.append(row) + row = get_page_number_row(page_y) + if row: + as_dicts.append(row) + as_dicts.append(empty_row) +#pprint(as_dicts) + +def to_csv(): + import csv + # csv.writer(f, delimiter =' ',quotechar =',',quoting=csv.QUOTE_MINIMAL) + with open("./in-excel.csv", "w") as f: + # using csv.writer method from CSV package + write = csv.writer(f, delimiter ='|') + write.writerows(map(lambda row: list(row.values()), as_dicts)) + +to_csv() diff --git a/platziflask/README.md b/platziflask/README.md new file mode 100644 index 00000000..0089c381 --- /dev/null +++ b/platziflask/README.md @@ -0,0 +1,1528 @@ +## [Platzi - Curso de Flask ](https://platzi.com/clases/flask/) + +- Actualizar pip: + - `python3 -m pip install --upgrade pip` + - `pip install pipenv` +- Ojo!! no confundir *pip install* con *pipenv install* + +### [5 - Hello World Flask](https://platzi.com/clases/1540-flask/18443-hello-world-flask/) +- Entramos en nuestra carpeta **project** +- Ejecutamos + - **pipenv** es equivalente a pip pero dentro de la carpeta virtual, cuando no se tiene activo el entorno (haber ejecutado pipenv shell) + - `pipenv --three` crea el entorno virtual + - `pipenv install flask` + - creamos archivo. `requirements.txt` con la linea `Flask` + - `pipenv install -r requirements.txt` r: recursive +- (env): `pip freeze` +```py +Click==7.0 +Flask==1.1.1 +itsdangerous==1.1.0 +Jinja2==2.11.1 +MarkupSafe==1.1.1 +Werkzeug==1.0.0 +``` +- Dentro del *env* nos vamos a la carpeta de nuestro proyecto, cd + - ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/630x62/5ef40a10608154f818e43e5e202ecab3/image.png) +```py +# project/main.py +from flask import Flask + +app = Flask(__name__) + +@app.route("/") +def hello(): + return "Hello World Flask" +``` +- (env):`flask run` +- > Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory. + - Falta declarar una variable de entorno (dentro de env) + - (env):`export FLASK_APP=main.py` +- (env):`flask run` + ```s + (project) /project   master ●  flask run + * Serving Flask app "main.py" + * Environment: production + WARNING: This is a development server. Do not use it in a production deployment. + Use a production WSGI server instead. + * Debug mode: off + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + ``` +- ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/630x91/dad81f743939f0d21449746f9ad4d744/image.png) + +- > Cuando se entra en el shell de pipenv, al menos en mac, emula estár en otro ordenador pero con visibilidad sobre todos los recursos de la maquina +```s +── README.md +└── project + ├── Pipfile + ├── Pipfile.lock + ├── main.py + └── requirements.txt +``` +### [6 - Debugging en Flask](https://platzi.com/clases/1540-flask/18444-debugging-en-flask/) +- Cada vez que hay un cambio en el código no se propaga al servidor web de la app. +- Hay que reiniciar el servicio +- Hay que activar el debug para que se auto refresque +- También mostrará el error si lo hubiera +- (env):`export FLASK_DEBUG=1` + +### [7 - Request y Response](https://platzi.com/clases/1540-flask/18445-request-y-response/) +```py +# project/main.py +from flask import Flask, request + +app = Flask(__name__) + +@app.route("/") +def hello(): + userip = request.remote_addr + return "Hola tu ip es {}".format(userip) +``` +### [8 - Ciclos de Request y Response](https://platzi.com/clases/1540-flask/18446-ciclos-de-request-y-response/) +```py +# project/main.py +from flask import Flask, request, make_response, redirect + +app = Flask(__name__) + +@app.route("/") +def index(): + user_ip = request.remote_addr + response = make_response(redirect("/hello")) + response.set_cookie("user_ip",user_ip+" :) ") + return response + +@app.route("/hello") +def hello(): + userip = request.cookies.get("user_ip") + return "Hola tu ip es {}".format(userip) +``` +### [9 - Templates con Jinja 2](https://platzi.com/clases/1540-flask/18447-templates-con-jinja-2/) +```py +# project/main.py +from flask import ... render_template + +@app.route("/hello") +def hello(): + userip = request.cookies.get("user_ip") + # return "Hola tu ip es {}".format(userip) + return render_template("hello.html",user_ip=userip) +``` +- hello.html: +```html + + + + + + Hello + + +

Hello {{ user_ip }}

+ + +``` +### [10 - Estructuras de control](https://platzi.com/clases/1540-flask/18448-estructuras-de-control/) +```py +todos = ["TODO 1","TODO 2","TODO 3"] + +@app.route("/hello") +def hello(): + userip = request.cookies.get("user_ip") + context = { + "user_ip":userip, + "todos":todos + } + # spread operator + return render_template("hello.html",**context) +``` +```html + + + + + + Hello + + +{% if user_ip %} +

Hello {{ user_ip }}

+{% else %} +
Ir a inicio +{% endif %} + + + + +{% if user_ip %} +

Hello {{ user_ip }}

+{% else %} + Ir a inicio +{% endif %} + +
    + {% for todo in todos %} +
  • {{ todo }}
  • + {% endfor %} +
+ +``` + +### [11 - Herencia de templates](https://platzi.com/clases/1540-flask/18449-herencia-de-templates/) +> Macro: son un conjunto de comandos que se invocan con una palabra clave, opcionalmente seguidas de parámetros que se utilizan como código literal. Los Macros son manejados por el compilador y no por el ejecutable compilado. +- macro.html: +```html +{% macro render_todo(todo) %} +
  • descripcion: {{ todo }}
  • +{% endmacro %} +``` +- base.html: +```html + + + + + + {% block title %} Flask {% endblock %} + + +{% block content %} +{% endblock %} + + +``` +- hello.html +```html +{% extends "base.html" %} +{% import "macro.html" as macros%} + +{% block title %} {{ super() }} | Bienvenida {% endblock %} + +{% block content %} + {% if user_ip %} +

    Hello {{ user_ip }}

    + {% else %} + Ir a inicio + {% endif %} + +
      + {% for todo in todos %} + {{ macros.render_todo(todo) }} + {% endfor %} +
    +{% endblock %} +``` +### [12 - Include y links](https://platzi.com/clases/1540-flask/18450-include-y-links/) +- Barra de navegación +```html + + + + + + + + + + + {% block title %} Flask {% endblock %} + + +
    + {% include "navbar.html" %} +
    +{% block content %} +{% endblock %} + + +``` +### [13 - Uso de archivos estáticos: imágenes](https://platzi.com/clases/1540-flask/18451-uso-de-archivos-estaticos-imagenes/) +- Crear directorio **project/static/** +- configuro bundle.js (no tutorial) +```s +project + ├── Pipfile + ├── Pipfile.lock + ├── main.py + ├── requirements.txt + ├── static + │ ├── css + │ │ └── main.css + │ ├── images + │ │ ├── favicon.ico + │ │ └── logo-brain.jpg + │ └── js + │ ├── bundle.js + │ └── modules + │ └── root + │ └── root.js + └── templates + ├── base.html + ├── hello.html + ├── macro.html + └── navbar.html +``` +```html + + + + + + + + {% block title %} Flask {% endblock %} + + + + +
    + {% include "navbar.html" %} +
    +{% block content %} +{% endblock %} + + + + + +``` + +### [14 - Configurar páginas de error](https://platzi.com/clases/1540-flask/18452-configurar-paginas-de-error/) +- Tratando error 404. Not found +- Reto para error 500 +- Creamos fichero **templates/404.html** +```html + +{% extends "base.html" %} +{% block title %} + {{ super() }} + 404 +{% endblock %} + +{% block content %} +

    Lo sentimos no encontramos lo que buscabas

    +

    + {{ error }} +

    +{% endblock %} + +``` +```py +... +@app.errorhandler(404) +def not_found(error): + return render_template("404.html",error=error) +``` +#### Reto: +- crear fichero 500.html +- tratar el error con `app.errohandler(500)` +### [15 - Flask Bootstrap](https://platzi.com/clases/1540-flask/18453-flask-bootstrap/) +- > Framework: es un conjunto estandarizado de conceptos, prácticas y criterios para enfocar un tipo de problemática particular que sirve como referencia, para enfrentar y resolver nuevos problemas de índole similar. +- Las extensiones de flask nos permiten agregar funcionalidad a Flask, por ejemplo para enviar email +- En este caso agregaremos bootstrap4.css +- Agregamos: `flask-bootstrap4` en `requirements.txt` +- Ejecutamos: (env):`pip install -r requirements.txt` +- Una vez instalada la extensión hay que incializarla +```py +# project/main.py +from flask import Flask, request, make_response, redirect, render_template +from flask_bootstrap import Bootstrap + +app = Flask(__name__) + +bootstrap = Bootstrap(app) + +@app.errorhandler(404) +def not_found(error): + ... +``` +```html + +{% extends "bootstrap/base.html" %} + +{% block head %} + {{ super() }} + + {% block title %} Flask {% endblock %} + + + + + +{% endblock %} + +{% block body %} + + {% block navbar %} + {% include "navbar.html" %} + {% endblock %} + + {% block content %} {% endblock %} + + + + +{% endblock %} + + + + +``` +- **NO FUNCIONA BIEN LA EXTENSION!!!** + +### [16 - Configuración de Flask](https://platzi.com/clases/1540-flask/18454-configuracion-de-flask/) +- >SESSION: es un intercambio de información interactiva semipermanente, también conocido como diálogo, una conversación o un encuentro, entre dos o más dispositivos de comunicación, o entre un ordenador y usuario. +- Desactivar el debug para producción +- `export FLASK_ENV=development` +- Con esta variable de entorno se rescribe la de produccion (FLASK_DEBUG) +- Objeto SESSION +- Ejemplo cookie cifrada: + - ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/630x528/c044ca9baa5cc57dfee333db2feb6a60/image.png) +```py +from flask import ..., session +# con esto se cifra la info de la cookie +# esto habria que cambiarlo a un hash más seguro, para el ejemplo nos vale +app.config["SECRET_KEY"] = "super secreto" +... +@app.route("/") +def index(): + user_ip = request.remote_addr + response = make_response(redirect("/hello")) + # response.set_cookie("user_ip",user_ip+" :) ") + session["user_ip"] = user_ip + return response +... +@app.route("/hello") +def hello(): + # userip = request.cookies.get("user_ip") + user_ip = session.get("user_ip") + context = { + "user_ip":user_ip, + "todos":todos + } + # spread operator + return render_template("hello.html",**context) +``` +- Aparte de session Flask cuenta con otros dos objetos: + - current_app + - g (con cada request se limpia) + - ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/940x494/e7b03ccfc68f03adf4f75b927c1aad81/image.png) + +### [17 - Implementación de Flask-Bootstrap y Flask-WTF](https://platzi.com/clases/1540-flask/18455-implementacion-de-flask-bootstrap-y-flask-wtf/) +- Instalar extension Flask-WTF (What the forms) +- WTF es una libreria de python que permite renderizar formularios y funciona en cualquier app de python +- Agregamos en requirements: flask-wtf +- instalamos y arrancamos nuevamente el servidor: flask run +- Uso de validadores, existen también custom validadores +```py +from flask_wtf import FlaskForm +from wtforms.fields import StringField, PasswordField,SubmitField +from wtforms.validators import DataRequired + +class LoginForm(FlaskForm): + username = StringField("Nombre de usuario",validators=[DataRequired()]) + password = PasswordField("Password",validators=[DataRequired()]) + submit = SubmitField("Enviar") + +def hello(): + # userip = request.cookies.get("user_ip") + user_ip = session.get("user_ip") + loginform = LoginForm() + context = { + "user_ip":user_ip, + "todos":todos, + "loginform":loginform + } + # spread operator + return render_template("hello.html",**context) +``` +```html + +{% extends "base.html" %} +{% import "macro.html" as macros%} +{% import "bootstrap/wtf.html" as wtf %} + +{% block title %} {{ super() }} | Bienvenida {% endblock %} + +{% block content %} + {% if user_ip %} +

    Hello {{ user_ip }}

    + {% else %} + Ir a inicio + {% endif %} + +
    + + {{ wtf.quick_form(loginform) }} +
    + +
      + {% for todo in todos %} + {{ macros.render_todo(todo) }} + {% endfor %} +
    +{% endblock %} + +``` +- en este punto ya se ve el form pero al hacer submit muestra error **Method not allowed*** +- lo veremos en el prox capítulo +### [18 - Uso de método POST en Flask-WTF](https://platzi.com/clases/1540-flask/18456-uso-de-metodo-post-en-flask-wtf/) +- > Flask acepta peticiones GET por defecto y por ende no debemos declararla en nuestras rutas. Pero cuando necesitamos hacer una petición POST al enviar un formulario debemos declararla de la siguiente manera, como en este ejemplo: `@app.route('/platzi-post', methods=['GET', 'POST'])` +- > Debemos declararle además de la petición que queremos, GET, ya que le estamos pasando el parámetro methods para que acepte solo y únicamente las peticiones que estamos declarando. De esta forma, al actualizar el navegador ya podremos hacer la petición POST a nuestra ruta deseada y obtener la respuesta requerida. +```py +from flask import Flask, request, make_response, redirect, render_template, session, redirect, url_for +... +@app.route("/hello",methods=["GET","POST"]) +def hello(): + # userip = request.cookies.get("user_ip") + user_ip = session.get("user_ip") + loginform = LoginForm() + username = session.get("username") + + context = { + "user_ip":user_ip, + "todos":todos, + "loginform":loginform, + "username":username + } + + if loginform.validate_on_submit(): + username = loginform.username.data + session["username"] = username + password = loginform.password.data + return redirect(url_for("index")) + + # spread operator + return render_template("hello.html",**context) +``` +```html + +{% extends "base.html" %} +{% import "macro.html" as macros%} +{% import "bootstrap/wtf.html" as wtf %} + +{% block title %} {{ super() }} | Bienvenida {% endblock %} + +{% block content %} + {% if username %} +

    Bienvenido {{ username | capitalize }}

    + {% endif %} + {% if user_ip %} +

    tu ip es: {{ user_ip }}

    + {% else %} + Ir a inicio + {% endif %} + +
    + {{ wtf.quick_form(loginform) }} +
    + +
      + {% for todo in todos %} + {{ macros.render_todo(todo) }} + {% endfor %} +
    +{% endblock %} + +``` +- ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/527x436/fee65f507cbae50b3ca133acf430406c/image.png) + +### [19 - Desplegar Flashes (mensajes emergentes)](https://platzi.com/clases/1540-flask/18457-desplegar-flashes-mensajes-emergentes/) +- Mensaje de exito despues de iniciar la sesion correctamente +```py +import , url_for, flash +@app.route("/hello",methods=["GET","POST"]) +def hello(): + # userip = request.cookies.get("user_ip") + user_ip = session.get("user_ip") + loginform = LoginForm() + username = session.get("username") + + context = { + "user_ip":user_ip, + "todos":todos, + "loginform":loginform, + "username":username + } + + if loginform.validate_on_submit(): + username = loginform.username.data + session["username"] = username + flash("Nombre de usuario registrado con exito") + password = loginform.password.data + return redirect(url_for("index")) + + # spread operator + return render_template("hello.html",**context) +``` +```html + +{% extends "bootstrap/base.html" %} + +{% block head %} + {{ super() }} + + {% block title %} Flask {% endblock %} + + + + + +{% endblock %} + +{% block body %} + + {% block navbar %} + {% include "navbar.html" %} + {% endblock %} + + {% for message in get_flashed_messages() %} +
    + + {{ message }} +
    + {% endfor %} + + {% block content %} {% endblock %} + + {% block scripts %}{{ super() }}{% endblock%} ->>> importante + + +{% endblock %} +``` +- Ya importa los scripts de base() pero sigue sin funcionar la x de la alerta +- ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/577x235/eb2176f6d1f0c21c2b1e642ce3202ed2/image.png) + +### [20 - Pruebas básicas con Flask-testing](https://platzi.com/clases/1540-flask/18458-pruebas-basicas-con-flask-testing/) +- > La etapa de pruebas se denomina testing y se trata de una investigación exhaustiva, no solo técnica sino también empírica, que busca reunir información objetiva sobre la calidad de un proyecto de software, por ejemplo, una aplicación móvil o un sitio web. El objetivo del testing no solo es encontrar fallas sino también aumentar la confianza en la calidad del producto, facilitar información para la toma de decisiones y detectar oportunidades de mejora. +- Instalamos: `flask-testing` +- Hay que crear un comando para que se ejecute cada vez que se hace algun cambio +```py +# projects/main.py +import unittest + +# se llamara con: flask test +@app.cli.command() +def test(): + import werkzeug + werkzeug.cached_property = werkzeug.utils.cached_property + # todo lo que este en la carpeta de project/test se ejecutara + tests = unittest.TestLoader().discover("tests") + unittest.TextTestRunner().run(tests) + + +# project/tests/test_base.py +print("test_base.py") +from flask_testing import TestCase +from flask import current_app, url_for + +from main import app + +class MainTest(TestCase): + + # metodo obligatorio que tiene que devolver la app + def create_app(self): + app.config["TESTING"] = True + app.config["WTF_CSRF_ENABLED"] = False + return app + + def test_app_exists(self): + # self.assertIsNone(current_app) + self.assertIsNotNone(current_app) + + def test_app_in_test_mode(self): + self.assertTrue(current_app.config["TESTING"]) + + def test_index_redirect(self): + response = self.client.get(url_for("index")) + # self.assertTrue(response.status_code) + self.assertRedirects(response, url_for("hello")) + + def test_hello_get(self): + response = self.client.get(url_for("hello")) + self.assert200(response) + + # prueba de post + def test_hello_post(self): + dicformdata = { + "username":"fake", + "password":"fake-passs" + } + response = self.client.post(url_for("hello"),data=dicformdata) + self.assertRedirects(response,url_for("index")) + +``` +```s +# ejemplo ejecución comando +(project) ioedu@mbp2014  ~/projects/prj_python37/platziflask/project$ flask test +test_base.py +..... +---------------------------------------------------------------------- +Ran 5 tests in 0.079s +OK +``` +### [21 - Planteamiento del proyecto: To Do List](https://platzi.com/clases/1540-flask/18459-planteamiento-del-proyecto-to-do-list/) +- Se organizará mejor el código +- Se instalara extension de login +- Haremos uso de app-engine para el despliegue +### [22 - App Factory](https://platzi.com/clases/1540-flask/18460-app-factory/) +- Restructuramos codigo en ficheros y movemos las carpetas dentro de app +```py +# project/app/__init__.py +from flask import Flask +from flask_bootstrap import Bootstrap +from .config import Config + +def create_app(): + app = Flask(__name__) + bootstrap = Bootstrap(app) + # se pasa a una clase de configuracion (config.py) + # app.config["SECRET_KEY"] = "SUPER SECRET KEY" + # con esto se cifra la info de la cookie + # esto habria que cambiarlo a un hash más seguro, para el ejemplo nos vale + app.config.from_object(Config) + return app + +# project/app/config.py +class Config: + SECRET_KEY = "SUPER_SECRET" + +# project/app/forms.py +from flask_wtf import FlaskForm +from wtforms.fields import StringField, PasswordField,SubmitField +from wtforms.validators import DataRequired + +class LoginForm(FlaskForm): + username = StringField("Nombre de usuario",validators=[DataRequired()]) + password = PasswordField("Password",validators=[DataRequired()]) + submit = SubmitField("Enviar") + +# project/main.py +from flask import request, make_response, redirect, render_template, session, redirect, url_for, flash +import unittest + +# from folder-app import __init__.py.def create_app +from app import create_app +from app.forms import LoginForm + +app = create_app() + +@app.errorhandler(404) +def not_found(error): + ... +``` +- Despues del refactor: +```s +project + ├── Pipfile + ├── Pipfile.lock + ├── app + │ ├── __init__.py + │ ├── config.py + │ ├── forms.py + │ ├── static + │ │ ├── css + │ │ │ └── main.css + │ │ ├── images + │ │ │ ├── favicon.ico + │ │ │ └── logo-brain.jpg + │ │ └── js + │ │ ├── bundle.js + │ │ └── modules + │ │ └── root + │ │ └── root.js + │ └── templates + │ ├── 404.html + │ ├── 500.html + │ ├── base.html + │ ├── hello.html + │ ├── macro.html + │ └── navbar.html + ├── main.py + ├── requirements.txt + └── tests + └── test_base.py +``` +### [23 - Uso de Blueprints](https://platzi.com/clases/1540-flask/18461-uso-de-blueprints/) +- > Blueprints son módulos con los que se construyen las aplicaciones Flask. Los objetos Blueprints son similares a Flask, pero con la diferencia de que una aplicación sólo tendrá un objeto Flask, mientras que puede tener varios Blueprints. La ventaja de su uso es que para aplicaciones largas puedo distribuir el código en varios ficheros, en lugar de tenerlos todo en un único fichero. +- Son módulos en forma de plugins +- **Eror** + - > runtimeError: Your version of Flask doesn't support signals. This requires Flask 0.6+ with the blinker module installed. + - Señales es lo que usa flask para enviar mensajes a traves de contextos y/o librerias + - Hay que instalar blinker (requirments.txt) +```py +# ================================= +# project/app/auth/__init__.py +from flask import Blueprint + +# todas las rutas que empiecen por /auth van a ser redirigidas a este blueprint +auth = Blueprint("auth",__name__,url_prefix="/auth") + +# @auth.route("/login") importo funcion login() +from . import views + +# ================================= +# project/app/auth/views.py +from flask import render_template + +# clase LoginForm con el formulario +from app.forms import LoginForm + +# importo: Blueprint("auth",__name__,url_prefix="/auth") +from . import auth + +# blueprint.route("auth/") +@auth.route("/login") +def login(): + context = { + "loginform": LoginForm() + } + return render_template("login.html",**context) + +# ================================= +# project/app/__init__.py +from flask import Flask +from flask_bootstrap import Bootstrap +from .config import Config + +# importo el blueprint: auth = Blueprint("auth",__name__,url_prefix="/auth") +from .auth import auth + +def create_app(): + app = Flask(__name__) + bootstrap = Bootstrap(app) + # se pasa a una clase de configuracion (config.py) + # app.config["SECRET_KEY"] = "SUPER SECRET KEY" + # con esto se cifra la info de la cookie + # esto habria que cambiarlo a un hash más seguro, para el ejemplo nos vale + app.config.from_object(Config) + app.register_blueprint(auth) + + return app + +# ================================= +# project/tests/test_base.py + # metodo obligatorio que tiene que devolver la app + def create_app(self): + app.config["TESTING"] = True + app.config["WTF_CSRF_ENABLED"] = False + return app + ... + + def test_auth_blueprint_exists(self): + self.assertIn("auth",self.app.blueprints) + + def test_auth_login_get(self): + # auth.login: blueprint de auth, ruta login + response = self.client.get(url_for("auth.login")) + self.assert200(response) + + def test_auth_login_template(self): + # aqui no se usa response, la comunicacion entre client.get y el assertemplate + # se hace con signals + self.client.get(url_for("auth.login")) + self.assertTemplateUsed("login.html") +``` +- Instalación de linker para las señales en los test +```html + +{% extends "base.html" %} +{% import "bootstrap/wtf.html" as wtf %} ->>>>>>> importante +{% block title %} + {{ super() }} + Login +{% endblock %} + +{% block content %} +
    + {{ wtf.quick_form(loginform) }} +
    +{% endblock %} + +``` +### [24 - Blueprints II](https://platzi.com/clases/1540-flask/18462-blueprints-ii/) +- Ya no aceptaremos POST en hello +```py +# project/app/auth/views.py +from flask import render_template, session, redirect, flash, url_for + +# clase LoginForm con el formulario +from app.forms import LoginForm + +# importo: Blueprint("auth",__name__,url_prefix="/auth") +from . import auth + +# blueprint.route("auth/") +@auth.route("/login", methods=["GET","POST"]) +def login(): + + loginform = LoginForm() + context = { + "loginform": loginform + } + + if loginform.validate_on_submit(): + username = loginform.username.data + session["username"] = username + flash("Nombre de usuario registrado con exito") + password = loginform.password.data + return redirect(url_for("index")) + + return render_template("login.html",**context) + +# project/tests/test_base.py +print("test_base.py") +from flask_testing import TestCase +from flask import current_app, url_for + +from main import app + +class MainTest(TestCase): + + # metodo obligatorio que tiene que devolver la app + def create_app(self): + app.config["TESTING"] = True + app.config["WTF_CSRF_ENABLED"] = False + return app + ... + # prueba de post + def test_hello_post(self): + response = self.client.post(url_for("hello")) + # espero un Not Allowed + self.assertTrue(response.status_code,405) + + ... + def test_auth_login_post(self): + dicformdata = { + "username":"fake", + "password":"fake-passs" + } + response = self.client.post(url_for("auth.login"),data=dicformdata) + self.assertRedirects(response,url_for("index")) + +# project/main.py +@app.route("/hello",methods=["GET","POST"]) +def hello(): + user_ip = session.get("user_ip") + username = session.get("username") + + context = { + "user_ip":user_ip, + "todos":todos, + "username":username + } + + # spread operator + return render_template("hello.html",**context) +``` +```html + + se quita el form de aqui +``` +### [25 - Base de datos y App Engine con Flask](https://platzi.com/clases/1540-flask/18463-base-de-datos-y-app-engine-con-flask/) +- >Bases de Datos SQL: su composición esta hecha con bases de datos llenas de tablas con filas que contienen campos estructurados. No es muy flexible pero es el más usado. Una de sus desventajas es que mientras más compleja sea la base de datos más procesamiento necesitará. +- >Base de Datos NOSQL: su composición es no estructurada, es abierta y muy flexible a diferentes tipos de datos, no necesita tantos recursos para ejecutarse, no necesitan una tabla fija como las que se encuentran en bases de datos relacionales y es altamente escalable a un bajo costo de hardware. +- Flask no tiene un ORM como tal +- Hay extensiones como Flask SQLAlchemy +- Usaremos **google firestore**, el mongo de google. +- ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/970x306/bea4651d54b32a930cc7b3f67feeec27/image.png) + +### [26 - Configuración de Google Cloud SDK](https://platzi.com/clases/1540-flask/18834-configuracion-de-google-cloud-sdk/) +- Para Windows dirígete a https://cloud.google.com/sdk/docs/quickstart-windows +- Para MacOS dirígete a link ~https://cloud.google.com/sdk/docs/quickstart-macos~ https://cloud.google.com/sdk/docs/downloads-interactive + ```s + curl https://sdk.cloud.google.com | bash + exec -l $SHELL + gcloud init + ``` + - Crea entradas en el fichero del terminal: + ``` + # The next line updates PATH for the Google Cloud SDK. + if [ -f '/Users//google-cloud-sdk/path.zsh.inc' ]; then . '/Users//google-cloud-sdk/path.zsh.inc'; fi + + # The next line enables shell command completion for gcloud. + if [ -f '/Users//google-cloud-sdk/completion.zsh.inc' ]; then . '/Users//google-cloud-sdk/completion.zsh.inc'; fi + ``` +- Para Linux dirígete a https://cloud.google.com/sdk/docs/quickstart-linux +- Resultado instalación: [Trello](https://trello.com/c/87odm7iZ/1-instalacion-del-sdk-en-mac) +### [27 - Configuración de proyecto en Google Cloud Platform](https://platzi.com/clases/1540-flask/18464-configuracion-de-proyecto-en-google-cloud-platform/) +- Creamos el proyecto un proyecto en **firestore** +- Vamos a la configuración: [flask-platzi-todo](https://console.cloud.google.com/firestore/welcome?project=flask-platzi-todo&folder=&organizationId=) +- Usaremos **Modo Nativo** +- ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/667x452/0a274c774dcfcf20ae633008af109d62/image.png) +- Creamos la bd: + - ![](https://trello-attachments.s3.amazonaws.com/5e47170d1f80943559dbb587/771x297/ea0ea71775af54f6b884811ae02abfde/image.png) +- Ejecutamos: + - `gcloud auth login` + - Nos abrira la ventana del navegador para confirmar permisos + ``` + You are now logged in as [XXX@XXX.YYY]. + Your current project is [flask-platzi-todo]. You can change this setting by running: + $ gcloud config set project PROJECT_ID + ``` + - **API:** + - Para poder usar la API necesitamos otro comando: + - `gcloud auth application-default login` + - Pide permisos en el browser + ``` + Credentials saved to file: [/Users//.config/gcloud/application_default_credentials.json] + These credentials will be used by any library that requests Application Default Credentials (ADC). + ``` + +### [28 - Implementación de Firestore](https://platzi.com/clases/1540-flask/18465-implementacion-de-firestore/) +- Instalamos firebase-admin (requirements) + - `pip install -r requirements.txt` +- Parentesis: si tenemos seleccionado un proyecto en gcloud y no es el que debe ser, podemos cambiarlo con: + - `gcloud config list` + - `gcloud config set project flask-platzi-todo` + +```py +# project/app/services/firestore.py +import firebase_admin +from firebase_admin import credentials +from firebase_admin import firestore + +credential = credentials.ApplicationDefault() +firebase_admin.initialize_app(credential) + +db = firestore.client() + +def get_users(): + return db.collection("users").get() + +def get_todos(userid): + return db.collection("users")\ + .document(userid)\ + .collection("todos").get() + +# project/main.py +... +from app.services.firestore import get_users, get_todos + +@app.route("/hello",methods=["GET","POST"]) +def hello(): + user_ip = session.get("user_ip") + username = session.get("username") + + context = { + "user_ip":user_ip, + "todos":get_todos(userid=username), + "username":username + } + + # devuelve un generator + genusers = get_users() + #pprint(users) + #pprint(type(users)) + + for objuser in genusers: + #objuser: + print(objuser.id) + print(objuser.to_dict()["password"]) + + # spread operator + return render_template("hello.html",**context) +``` +```html + +{% macro render_todo(todo) %} +
  • descripcion: {{ todo.to_dict().description }}
  • +{% endmacro %} + +``` +### [29 - Autenticación de usuarios: Login](https://platzi.com/clases/1540-flask/18466-autenticacion-de-usuarios-login/) +- Instalamos flask-login +- Implementamos un login manager +- Proteccion de rutas con decoradores +``` +Exception +Exception: Missing user_loader or request_loader. +Refer to http://flask-login.readthedocs.io/#how-it-works for more info. +``` +- Agregando definicion de parámetros en el comentario: +```py + """ + ;param user_data: Userdata + """ +``` +```py +# project/app/models/user.py +from flask_login import UserMixin +from app.services.firestore import get_user + +class UserData: + def __init__(self,username, password): + self.username = username + self.password = password + +class UserModel(UserMixin): + def __init__(self,user_data): + """ + ;param user_data: Userdata + """ + self.id = user_data.username + self.password = user_data.password + + @staticmethod + def query(userid): + userdoc = get_user(userid) + userdata = UserData( + username = userdoc.id, + password = userdoc.to_dict()["password"] + ) + + return UserModel(userdata) +# firestore.py +def get_user(userid): + return db.collection("users").document(userid).get() + +# project/app/__init__.py +from flask import Flask +from flask_bootstrap import Bootstrap +from flask_login import LoginManager +from .config import Config +# importo el blueprint: auth = Blueprint("auth",__name__,url_prefix="/auth") +from .auth import auth +from app.models.user import UserModel + +login_manager = LoginManager() +# print(login_manager) +login_manager.login_view = "auth.login" + +@login_manager.user_loader +def load_user(username): + return UserModel.query(username) + +def create_app(): + app = Flask(__name__) + bootstrap = Bootstrap(app) + # se pasa a una clase de configuracion (config.py) + # app.config["SECRET_KEY"] = "SUPER SECRET KEY" + # con esto se cifra la info de la cookie + # esto habria que cambiarlo a un hash más seguro, para el ejemplo nos vale + app.config.from_object(Config) + login_manager.init_app(app) + app.register_blueprint(auth) + + return app +``` +- El error anterior se resolvia configurando el: `@login_manager.user_loader` +### [30 - Autenticación de usuarios: Logout](https://platzi.com/clases/1540-flask/18467-autenticacion-de-usuarios-logout/) +- +```py +# project/app/auth/views.py +from flask import render_template, session, redirect, flash, url_for +from flask_login import login_user, login_required, logout_user + +# clase LoginForm con el formulario +from app.forms import LoginForm + +# importo: Blueprint("auth",__name__,url_prefix="/auth") +from . import auth +from app.services.firestore import get_user +from app.models.user import UserData, UserModel + +# blueprint.route("auth/") +@auth.route("/login", methods=["GET","POST"]) +def login(): + + loginform = LoginForm() + + if loginform.validate_on_submit(): + username = loginform.username.data + password = loginform.password.data + + userdoc = get_user(username) + if userdoc.to_dict() is not None: + passdb = userdoc.to_dict()["password"] + + if passdb == password: + userdata = UserData(username, password) + #user = UserData(username, password) + user = UserModel(userdata) + login_user(user) + flash("Bienvenido de nuevo") + redirect(url_for("hello")) + else: + flash("La informacion no coincide") + else: + flash("El usuario no existe") + + return redirect(url_for("index")) + + context = { + "loginform": loginform + } + return render_template("login.html",**context) + + +@auth.route("logout") +@login_required +def logout(): + logout_user() + flash("Regresa pronto") + return redirect(url_for("auth.login")) + +# project/main.py +@app.route("/hello",methods=["GET"]) +@login_required +def hello(): + user_ip = session.get("user_ip") + username = current_user.id +``` +```html + + + + +``` +### [31 - Signup](https://platzi.com/clases/1540-flask/18468-signup/) +```py +# project/app/auth/views.py +from flask import render_template, session, redirect, flash, url_for +from flask_login import login_user, login_required, logout_user + +from werkzeug.security import generate_password_hash + +# clase LoginForm con el formulario +from app.forms import LoginForm + +# importo: Blueprint("auth",__name__,url_prefix="/auth") +from . import auth +from app.services.firestore import get_user, user_put +from app.models.user import UserData, UserModel + +# blueprint.route("auth/") +@auth.route("/login", methods=["GET","POST"]) +def login(): + + loginform = LoginForm() + + if loginform.validate_on_submit(): + username = loginform.username.data + password = loginform.password.data + + userdoc = get_user(username) + if userdoc.to_dict() is not None: + passdb = userdoc.to_dict()["password"] + + if passdb == password: + userdata = UserData(username, password) + #user = UserData(username, password) + user = UserModel(userdata) + login_user(user) + flash("Bienvenido de nuevo") + redirect(url_for("hello")) + else: + flash("La informacion no coincide") + else: + flash("El usuario no existe") + + return redirect(url_for("index")) + + context = { + "loginform": loginform + } + return render_template("login.html",**context) + + +@auth.route("signup",methods=["GET","POST"]) +def signup(): + signupform = LoginForm() + context = { + "signupform":signupform + } + + if signupform.validate_on_submit(): + username = signupform.username.data + password = signupform.password.data + + userdoc = get_user(username) + if userdoc.to_dict() is None: + passwordhash = generate_password_hash(password) + userdata = UserData(username, passwordhash) + user_put(userdata) + user = UserModel(userdata) + login_user(user) + flash("bienvenido") + return redirect(url_for("hello")) + else: + flash("El usuario ya existe") + + + return render_template("signup.html",**context) + + +@auth.route("logout") +@login_required +def logout(): + logout_user() + flash("Regresa pronto") + return redirect(url_for("auth.login")) + +# project/app/services/firestore.py + +def user_put(userdata): + userref = db.collection("users").document(userdata.username) + userref.set({"password":userdata.password}) + +``` +```html + +{% extends "base.html" %} +{% import "bootstrap/wtf.html" as wtf %} +{% block title %} + {{ super() }} + Signup +{% endblock %} + +{% block content %} +
    +

    Registra una cuenta

    + {{ wtf.quick_form(signupform) }} +
    +{% endblock %} + +``` +### [32 - Agregar tareas](https://platzi.com/clases/1540-flask/18469-agregar-tareas/) +- creacion en cascada +```py +# project/app/services/firestore.py +def put_todo(userid,description): + todoscollection = db.collection("users").document(userid).collection("todos") + todoscollection.add({"description":description}) + +# project/app/forms.py +class TodoForm(FlaskForm): + description = StringField("Descripcion",validators=[DataRequired()]) + submit = SubmitField("Crear") + +# project/main.py +from app.services.firestore import get_users, get_todos, put_todo + +# from folder-app import __init__.py.def create_app +from app import create_app +from app.forms import LoginForm, TodoForm + +@app.route("/hello",methods=["GET","POST"]) +@login_required +def hello(): + user_ip = session.get("user_ip") + username = current_user.id + todoform = TodoForm() + + context = { + "user_ip":user_ip, + "todos":get_todos(userid=username), + "username":username, + "todoform":todoform + } + + if todoform.validate_on_submit(): + put_todo(userid=username,description=todoform.description.data) + flash("tu tarea se creó con éxito") + return redirect(url_for("hello")) + + # spread operator + return render_template("hello.html",**context) +``` +```html + +
    +

    Crear una nueva tarea

    + {{ wtf.quick_form(todoform) }} +
    +``` + +### [33 - Eliminar tareas](https://platzi.com/clases/1540-flask/18470-eliminar-tareas/) +```py +# project/app/services/firestore.py +def delete_todo(userid, todoid): + todoref = db.document("users/{}/todos/{}".format(userid, todoid)) + todoref.delete() + #todoref = db.collection("users").document(userid).collection("todos").document(todoid) + +# project/app/forms.py +class DeleteTodoForm(FlaskForm): + submit = SubmitField("Borrar") + +# main.py +@app.route("/hello",methods=["GET","POST"]) +@login_required +def hello(): + user_ip = session.get("user_ip") + username = current_user.id + todoform = TodoForm() + deleteform = DeleteTodoForm() + + context = { + "user_ip":user_ip, + "todos":get_todos(userid=username), + "username":username, + "todoform":todoform, + "deleteform":deleteform + } + + if todoform.validate_on_submit(): + put_todo(userid=username,description=todoform.description.data) + flash("tu tarea se creó con éxito") + return redirect(url_for("hello")) + + # spread operator + return render_template("hello.html",**context) + +@app.route("/todos/delete/",methods=["POST"]) +def delete(todoid): + userid = current_user.id + delete_todo(userid=userid,todoid=todoid) + return redirect(url_for("hello")) +``` +```html +
    +

    Crear una nueva tarea

    + {{ wtf.quick_form(todoform) }} +
    +
      + {% for todo in todos %} + {{ macros.render_todo(todo, deleteform) }} + {% endfor %} +
    +
    +{% endblock %} + + +{% import "bootstrap/wtf.html" as wtf %} + +{% macro render_todo(todo,deletform) %} +
  • + descripcion: {{ todo.to_dict().description }} + + {{ todo.to_dict().done }} + + {{ wtf.quick_form(deletform, action=url_for("delete",todoid=todo.id)) }} +
  • +{% endmacro %} + +``` +### [34 - Editar tareas](https://platzi.com/clases/1540-flask/18471-editar-tareas/) +```py +# project/app/forms.py +class UpdateTodoForm(FlaskForm): + submit = SubmitField("Actualizar") +# project/app/services/firestore.py +def delete_todo(userid, todoid): + todoref = _get_todo_ref(userid,todoid) + todoref.delete() + #todoref = db.collection("users").document(userid).collection("todos").document(todoid) + +def update_todo(userid,todoid,done): + tododone = not bool(done) + todoref = _get_todo_ref(userid,todoid) + todoref.update({"done": tododone}) + +def _get_todo_ref(userid,todoid): + return db.document("users/{}/todos/{}".format(userid,todoid)) + +# project/main.py +from app.services.firestore import get_users, get_todos, put_todo, delete_todo, update_todo +... +from app.forms import TodoForm, DeleteTodoForm, UpdateTodoForm +... +@app.route("/todos/update//",methods=["POST"]) +def update(todoid, done): + userid = current_user.id + update_todo(userid=userid,todoid=todoid,done=done) + return redirect(url_for("hello")) +``` +```html + + {{ wtf.quick_form(updateform, action=url_for("update",todoid=todo.id, done=todo.to_dict().done)) }} + + +{% for todo in todos %} + {{ macros.render_todo(todo, deleteform, updateform) }} + {% endfor %} + +``` +### [35 - Deploy a producción con App Engine](https://platzi.com/clases/1540-flask/18472-deploy-a-produccion-con-app-engine/) +- **App engine** es una plataforma de google cloud que va a vivir en nuestro proyecto al igual que firestore. +- AE soporta varios lenguajes: Java, Go, etc +- Creamos archivo app.yaml +- Creamos un proyecto de produccion en Google Cloud + - **flask-platzi-prod** +- en local: `gcloud config set project flask-platzi-prod` +```yaml +# app.yaml +runtime: python37 +``` +- `gcloud app deploy app.yaml` +- Hay que quitar los ficheros Pipfile +- >ERROR: (gcloud.app.deploy) Error Response: [7] Access Not Configured. Cloud Build has not been used in project flask-platzi-prod before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/cloudbuild.googleapis.com/overview?project=flask-platzi-prod then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. +- Hay que habilitar el servicio de la api (que es de pago) + - https://console.developers.google.com/apis/library/cloudbuild.googleapis.com?project=flask-platzi-prod&pli=1 +- Creamos la bd para este nuevo proyecto: + - https://console.cloud.google.com/datastore/stats?project=flask-platzi-prod +- url: [https://flask-platzi-prod.appspot.com][https://flask-platzi-prod.appspot.com) +- Ejecutamos: `gcloud app browse` +- **comandos** + - `gcloud app logs tail -s default` + - si queremos cambiar de version + - https://console.cloud.google.com/appengine/versions?project=flask-platzi-prod&serviceId=default&versionssize=50 + - `gcloud app deploy app.yaml --version` +### [36 - Conclusiones](https://platzi.com/clases/1540-flask/18473-conclusiones/) + +## Errores a tener en cuenta +- A veces caduca la sesion en google cloud y hay que ejecutar el comando +- La ruta: `/Users/ioedu/.local/share/virtualenvs` puede perder los permisos y lanzar operacion no permitida +- `flask run` puede dar error de module main not found y eso se debe a que en el virtualenv hay que setear FLASK_APP dentro de la ruta donde está main.py \ No newline at end of file diff --git a/platziflask/project/.gcloudignore b/platziflask/project/.gcloudignore new file mode 100644 index 00000000..a987f112 --- /dev/null +++ b/platziflask/project/.gcloudignore @@ -0,0 +1,19 @@ +# This file specifies files that are *not* uploaded to Google Cloud Platform +# using gcloud. It follows the same syntax as .gitignore, with the addition of +# "#!include" directives (which insert the entries of the given .gitignore-style +# file at that point). +# +# For more information, run: +# $ gcloud topic gcloudignore +# +.gcloudignore +# If you would like to upload your .git directory, .gitignore file or files +# from your .gitignore file, remove the corresponding line +# below: +.git +.gitignore + +# Python pycache: +__pycache__/ +# Ignored by the build system +/setup.cfg \ No newline at end of file diff --git a/platziflask/project/Pipfile b/platziflask/project/Pipfile new file mode 100644 index 00000000..5207a700 --- /dev/null +++ b/platziflask/project/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +flask-mail = "*" + +[requires] +python_version = "3.8" diff --git a/platziflask/project/Pipfile.lock b/platziflask/project/Pipfile.lock new file mode 100644 index 00000000..cea3f553 --- /dev/null +++ b/platziflask/project/Pipfile.lock @@ -0,0 +1,137 @@ +{ + "_meta": { + "hash": { + "sha256": "992e2ddfa22a40307ca0bcb5b22ca3b546fa966aba0f526978a109a57b99c7fb" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "blinker": { + "hashes": [ + "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6" + ], + "version": "==1.4" + }, + "click": { + "hashes": [ + "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", + "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" + ], + "version": "==7.1.2" + }, + "flask": { + "hashes": [ + "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", + "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" + ], + "version": "==1.1.2" + }, + "flask-mail": { + "hashes": [ + "sha256:22e5eb9a940bf407bcf30410ecc3708f3c56cc44b29c34e1726fe85006935f41" + ], + "index": "pypi", + "version": "==0.9.1" + }, + "itsdangerous": { + "hashes": [ + "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", + "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" + ], + "version": "==1.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "werkzeug": { + "hashes": [ + "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", + "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" + ], + "version": "==1.0.1" + } + }, + "develop": {} +} diff --git a/platziflask/project/app.yaml b/platziflask/project/app.yaml new file mode 100644 index 00000000..a0b719d6 --- /dev/null +++ b/platziflask/project/app.yaml @@ -0,0 +1 @@ +runtime: python37 diff --git a/platziflask/project/app/__init__.py b/platziflask/project/app/__init__.py new file mode 100644 index 00000000..730428d4 --- /dev/null +++ b/platziflask/project/app/__init__.py @@ -0,0 +1,53 @@ +# project/app/__init__.py +sc("project/app/__init__.py") +from flask_login import LoginManager +objloginmngr = LoginManager() + +@objloginmngr.user_loader +def load_user(username): + pr(username,"load_user") + from app.models.user_model import UserModel + return UserModel.query(username) + +def _get_config(flaskapp): + # export FLASK_ENV= + sc("... getting config") + from bootstrap.config import Config,DevelopmentConfig,ProductionConfig,TestingConfig + + strenv = flaskapp.config["ENV"] + + pr(strenv, "flaskapp.config[ENV]") + if strenv == "development": + return DevelopmentConfig + elif strenv == "production": + return ProductionConfig + elif strenv == "testing": + return TestingConfig + else: + return Config + +def _config_loginmngr(flaskapp): + #bug(objloginmngr,"objloginmngr") + objloginmngr.login_view = "auth.login" + objloginmngr.login_message = "Please first login" + objloginmngr.login_message_category = "warning" + objloginmngr.init_app(flaskapp) + +def get_flaskapp(): + sc("... creando flaskapp") + from flask import Flask + from flask_bootstrap import Bootstrap + #from auth.init import blueprint_auth + from .auth import blueprint_auth + + + flaskapp = Flask(__name__) + + Config = _get_config(flaskapp) + flaskapp.config.from_object(Config) + flaskapp.register_blueprint(blueprint_auth) + Bootstrap(flaskapp) + # carga configuracion de LoginManager() + _config_loginmngr(flaskapp) + + return flaskapp \ No newline at end of file diff --git a/platziflask/project/app/auth/__init__.py b/platziflask/project/app/auth/__init__.py new file mode 100644 index 00000000..47c4540d --- /dev/null +++ b/platziflask/project/app/auth/__init__.py @@ -0,0 +1,11 @@ +# project/app/auth/__init__.py +sc("project/app/auth/__init__.py Blueprint") +from flask import Blueprint + +# todas las rutas que empiecen por /auth van a ser redirigidas a este blueprint +#bpauth = Blueprint("auth",__name__,url_prefix="/auth") +blueprint_auth = Blueprint("auth",__name__,url_prefix="/auth") + +# @auth.route("/login") importo funcion login() +# from . import views +from . import routes diff --git a/platziflask/project/app/auth/routes.py b/platziflask/project/app/auth/routes.py new file mode 100644 index 00000000..5326acfe --- /dev/null +++ b/platziflask/project/app/auth/routes.py @@ -0,0 +1,22 @@ +# project/app/auth/routes.py +sc("project/app/auth/routes.py") + +#blueprint en init.py +from . import blueprint_auth +from flask_login import login_required +from app.controllers.auth_controller import AuthController + +# blueprint.route("auth/") +@blueprint_auth.route("/login", methods=["GET","POST"]) +def login(): + return AuthController().login() + +@blueprint_auth.route("signup",methods=["GET","POST"]) +def signup(): + return AuthController().signup() + +@blueprint_auth.route("logout") +@login_required +def logout(): + return AuthController().logout() + diff --git a/platziflask/project/app/controllers/__init__.py b/platziflask/project/app/controllers/__init__.py new file mode 100644 index 00000000..b9067b55 --- /dev/null +++ b/platziflask/project/app/controllers/__init__.py @@ -0,0 +1 @@ +sc("project/app/controllers/__init__.py") \ No newline at end of file diff --git a/platziflask/project/app/controllers/admin_controller.py b/platziflask/project/app/controllers/admin_controller.py new file mode 100644 index 00000000..91fa3bc5 --- /dev/null +++ b/platziflask/project/app/controllers/admin_controller.py @@ -0,0 +1,35 @@ +from .base_controller import BaseController + +from app.services.firestore_service import FirestoreService +from app.forms.forms import TodoForm, DeleteTodoForm, UpdateTodoForm + +class AdminController(BaseController): + def __init__(self): + super().__init__() + + def index(self): + sc("Admin.index()") + + user_ip = self.get_session("user_ip") + username = self.get_user_id() + frmtodo = TodoForm() + deleteform = DeleteTodoForm() + updateform = UpdateTodoForm() + + context = { + "user_ip":user_ip, + "todos":FirestoreService().get_todos(userid=username), + "username":username, + "todoform":frmtodo, + "deleteform":deleteform, + "updateform": updateform + } + + if frmtodo.validate_on_submit(): + FirestoreService().put_todo(userid=username,description=frmtodo.description.data) + self.set_msg_succes("tu tarea se creó con éxito") + return self.redirect("todo_list") + + # spread operator + sc("Admin.index.render(todo-list.html)") + return self.render("todo-list.html",**context) \ No newline at end of file diff --git a/platziflask/project/app/controllers/auth_controller.py b/platziflask/project/app/controllers/auth_controller.py new file mode 100644 index 00000000..1c56cc86 --- /dev/null +++ b/platziflask/project/app/controllers/auth_controller.py @@ -0,0 +1,89 @@ +from pprint import pprint + +from flask_login import login_user,login_required +from .base_controller import BaseController +from app.models.user_model import UserData, UserModel +from app.services.firestore_service import FirestoreService +from app.forms.forms import LoginForm + +class AuthController(BaseController): + def __init__(self): + super().__init__() + + # no va! + ##@login_required + def login(self): + pprint("Auth.login()") + frmLogin = LoginForm() + + if frmLogin.validate_on_submit(): + from werkzeug.security import check_password_hash,generate_password_hash + username = frmLogin.username.data + passreq = frmLogin.password.data + passhash = generate_password_hash(passreq) + pr("username:{},password:{}".format(username,passreq),"los passwords") + pr(passhash,"pass-hash") + + userdoc = FirestoreService().get_user(username) + userdict = userdoc.to_dict() + + if userdict is not None: + passdb = userdict["password"] + is_passwok = check_password_hash(passdb, passreq) + pr(passreq,"pass db") + pr(is_passwok,"is_passok") + # bug aqui + if is_passwok or passdb==passreq: + userdata = UserData(username, passreq) + user = UserModel(userdata) + login_user(user) + self.set_msg_succes("Bienvenido de nuevo") + self.redirect("todo_list") + else: + bug("La informacion no coincide") + self.set_msg_error("La informacion no coincide") + else: + bug("El usuario no existe") + self.set_msg_error("El usuario no existe") + + return self.redirect("todo_list") + + context = { + "loginform": frmLogin + } + return self.render("login.html",**context) + + + def signup(self): + from werkzeug.security import generate_password_hash + + pprint("Auth.singup()") + signupform = LoginForm() + context = { + "signupform":signupform + } + + if signupform.validate_on_submit(): + username = signupform.username.data + password = signupform.password.data + + userdoc = FirestoreService().get_user(username) + + if userdoc.to_dict() is None: + passwordhash = generate_password_hash(password) + userdata = UserData(username, passwordhash) + FirestoreService().user_put(userdata) + user = UserModel(userdata) + login_user(user) + self.set_msg_succes("Bienvenido") + return self.redirect("todo_list") + else: + self.set_msg_error("El usuario ya existe") + + return self.render("signup.html",**context) + + def logout(self): + from flask_login import logout_user + logout_user() + self.set_msg_succes("Regresa pronto") + return self.redirect("auth.login") \ No newline at end of file diff --git a/platziflask/project/app/controllers/base_controller.py b/platziflask/project/app/controllers/base_controller.py new file mode 100644 index 00000000..8ae98ae9 --- /dev/null +++ b/platziflask/project/app/controllers/base_controller.py @@ -0,0 +1,47 @@ +sc("app/controlloers/base_controller.py") +from flask import ( + request, make_response, redirect, render_template, session, + redirect, url_for, flash) + +class Session: + def get_value(self,strkey=""): + return session.get(strkey) + + def set_value(self,strkey="",mxvalue=None): + session[strkey]=mxvalue + +class BaseController: + + def __init__(self): + self.session = Session() + + def get_get(self,strkey=""): + return request.args[strkey] + + def get_post(self,strkey=""): + return request.form[strkey] + + def get_session(self, strkey=""): + return self.session.get_value(strkey) + + def set_session(self, strkey="",mxvalue=None): + self.session.set_value(strkey=strkey,mxvalue=mxvalue) + + def get_user_id(self): + from flask_login import current_user + return current_user.id + + def render(self,strtpl,**kwargs): + return render_template(strtpl,**kwargs) + + def redirect(self,strurl): + return redirect(url_for(strurl)) + + def set_msg_error(self,strmsg): + flash(strmsg,"danger") + + def set_msg_succes(self,strmsg): + flash(strmsg,"success") + + def set_warning(self,strmsg): + flash(strmsg,"warning") \ No newline at end of file diff --git a/platziflask/project/app/controllers/home_controller.py b/platziflask/project/app/controllers/home_controller.py new file mode 100644 index 00000000..da4b5fcc --- /dev/null +++ b/platziflask/project/app/controllers/home_controller.py @@ -0,0 +1,9 @@ +from .base_controller import BaseController + +class HomeController(BaseController): + def __init__(self): + super().__init__() + + def index(self): + sc("HomeController.index") + return self.render("index.html") \ No newline at end of file diff --git a/platziflask/project/app/controllers/status_controller.py b/platziflask/project/app/controllers/status_controller.py new file mode 100644 index 00000000..89ec07cc --- /dev/null +++ b/platziflask/project/app/controllers/status_controller.py @@ -0,0 +1,11 @@ +from .base_controller import BaseController + +class StatusController(BaseController): + def __init__(self): + super().__init__() + + def error_500(self,error): + return self.render("500.html",error=error) + + def error_404(self,error): + return self.render("404.html",error=error) \ No newline at end of file diff --git a/platziflask/project/app/controllers/todos_controller.py b/platziflask/project/app/controllers/todos_controller.py new file mode 100644 index 00000000..0845d1d2 --- /dev/null +++ b/platziflask/project/app/controllers/todos_controller.py @@ -0,0 +1,17 @@ +from .base_controller import BaseController + +from app.services.firestore_service import FirestoreService + +class TodosController(BaseController): + def __init__(self): + super().__init__() + + def delete(self,todoid): + userid = self.get_user_id() + FirestoreService().delete_todo(userid=userid,todoid=todoid) + return self.redirect("todo_list") + + def update(self,todoid,done): + userid = self.get_user_id() + FirestoreService().update_todo(userid=userid,todoid=todoid,done=done) + return self.redirect("todo_list") \ No newline at end of file diff --git a/platziflask/project/app/forms/__init__.py b/platziflask/project/app/forms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/platziflask/project/app/forms/forms.py b/platziflask/project/app/forms/forms.py new file mode 100644 index 00000000..b18cd714 --- /dev/null +++ b/platziflask/project/app/forms/forms.py @@ -0,0 +1,20 @@ + +# project/app/forms/forms.py +from flask_wtf import FlaskForm +from wtforms.fields import StringField, PasswordField,SubmitField +from wtforms.validators import DataRequired + +class LoginForm(FlaskForm): + username = StringField("Nombre de usuario",validators=[DataRequired()]) + password = PasswordField("Password",validators=[DataRequired()]) + submit = SubmitField("Enviar") + +class TodoForm(FlaskForm): + description = StringField("Descripcion",validators=[DataRequired()]) + submit = SubmitField("Crear") + +class DeleteTodoForm(FlaskForm): + submit = SubmitField("Borrar") + +class UpdateTodoForm(FlaskForm): + submit = SubmitField("Actualizar") \ No newline at end of file diff --git a/platziflask/project/app/models/__init__.py b/platziflask/project/app/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/platziflask/project/app/models/user_model.py b/platziflask/project/app/models/user_model.py new file mode 100644 index 00000000..20601aba --- /dev/null +++ b/platziflask/project/app/models/user_model.py @@ -0,0 +1,33 @@ +# project/app/models/user_model.py +sc("project/app/models/user_model.py") +from flask_login import UserMixin +from app.services.firestore_service import FirestoreService + +class UserData: + def __init__(self,username, password): + self.username = username + self.password = password + +class UserModel(UserMixin): + def __init__(self,user_data): + """ + ;param user_data: Userdata + """ + self.id = user_data.username + self.password = user_data.password + + # se usa en: project/app/__init__.py + # @login_manager.user_loader + # load_user(username) + @staticmethod + def query(userid): + userdoc = FirestoreService().get_user(userid) + if userdoc is not None: + userdata = UserData( + username = userdoc.id, + password = userdoc.to_dict()["password"] + ) + else: + userdoc = UserData("","") + + return UserModel(userdata) \ No newline at end of file diff --git a/platziflask/project/app/services/__init__.py b/platziflask/project/app/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/platziflask/project/app/services/firestore_service.py b/platziflask/project/app/services/firestore_service.py new file mode 100644 index 00000000..6a18dac7 --- /dev/null +++ b/platziflask/project/app/services/firestore_service.py @@ -0,0 +1,51 @@ +# project/app/services/firestore_service.py +sc("project/app/services/firestore_service.py") +import firebase_admin +# from firebase_admin import credentials +from firebase_admin import firestore + +# https://stackoverflow.com/questions/56676296/initialize-app-the-default-firebase-app-already-exists-cloud-functions-pub-s +# credential = credentials.ApplicationDefault() +#firebase_admin.initialize_app(credential) + +if not firebase_admin._DEFAULT_APP_NAME in firebase_admin._apps: + firebase_admin.initialize_app() + +db = firestore.client() + +class FirestoreService(): + + def __init__(self): + pass + + def get_users(): + return db.collection("users").get() + + def get_todos(self,userid): + return db.collection("users")\ + .document(userid)\ + .collection("todos").get() + + def get_user(self,userid): + return db.collection("users").document(userid).get() + + def user_put(self, userdata): + userref = db.collection("users").document(userdata.username) + userref.set({"password":userdata.password}) + + def put_todo(self, userid,description): + todoscollection = db.collection("users").document(userid).collection("todos") + todoscollection.add({"description":description,"done":False}) + + def delete_todo(self, userid, todoid): + todoref = self._get_todo_ref(userid,todoid) + todoref.delete() + #todoref = db.collection("users").document(userid).collection("todos").document(todoid) + + def update_todo(self, userid,todoid,done): + tododone = not bool(done) + todoref = self._get_todo_ref(userid,todoid) + todoref.update({"done": tododone}) + + def _get_todo_ref(self,userid,todoid): + return db.document("users/{}/todos/{}".format(userid,todoid)) \ No newline at end of file diff --git a/platziflask/project/app/services/sendmail_service.py b/platziflask/project/app/services/sendmail_service.py new file mode 100644 index 00000000..7e288583 --- /dev/null +++ b/platziflask/project/app/services/sendmail_service.py @@ -0,0 +1,69 @@ +# project/app/services/sendmail_service.py +from flask_mail import Mail, Message +from datetime import datetime + +# https://pythonhosted.org/Flask-Mail/ +# https://myaccount.google.com/lesssecureapps) +# https://accounts.google.com/DisplayUnlockCaptcha +# https://mail.google.com/mail/#settings/fwdandpop + +class SendmailService(): + + _recipients = [] + _subject = "no subject - "+datetime.today().strftime('%Y-%m-%d %H:%M:%S') + _body = "" + _html = "" + _sender = "" + + def __init__(self, flaskapp): + self.flaskapp = flaskapp + + def set_sender(self, strsender): + self._sender = strsender + + def set_subject(self, strsubject): + self._subject = strsubject + + def set_body(self, strbody): + self._body = strbody + + def set_html(self, strhtml): + self._html = strhtml + + def add_recipient(self, strmail): + self._recipients.append(strmail) + + def send(self): + #https://temp-mail.org/ + objmail = Mail(self.flaskapp) + + objmsg = Message( + subject = self._subject, + sender = self._sender, + recipients = self._recipients + ) + + if self._body != "": + objmsg.body = self._body + + if self._html != "": + objmsg.html = self._html + + #bug(objmsg, "objmsg") + + retcode = True + try: + objmail.send(objmsg) + except SMTPAuthenticationError: + retcode = 2 + except SMTPServerDisconnected: + retcode = 3 + except SMTPException: + retcode = 1 + + return retcode + + + + + diff --git a/platziflask/project/app/static/css/main.css b/platziflask/project/app/static/css/main.css new file mode 100644 index 00000000..efbbeeaa --- /dev/null +++ b/platziflask/project/app/static/css/main.css @@ -0,0 +1,23 @@ +body > *{ + margin: 0; + padding: 0; +} + +.div-container { + display: grid; + grid-template-columns: 1fr 80fr 1fr; + grid-template-rows: auto; + align-items: stretch; +} + +.div-row:hover { + border:1px solid green; +} + +.div-row2:hover { + border:1px solid orange; +} + +.div-container2{ + display: grid; +} diff --git a/platziflask/project/app/static/images/favicon.ico b/platziflask/project/app/static/images/favicon.ico new file mode 100644 index 00000000..fca7cade Binary files /dev/null and b/platziflask/project/app/static/images/favicon.ico differ diff --git a/platziflask/project/app/static/images/logo-brain.jpg b/platziflask/project/app/static/images/logo-brain.jpg new file mode 100644 index 00000000..dec77639 Binary files /dev/null and b/platziflask/project/app/static/images/logo-brain.jpg differ diff --git a/platziflask/project/app/static/js/bundle.js b/platziflask/project/app/static/js/bundle.js new file mode 100644 index 00000000..46eaacaa --- /dev/null +++ b/platziflask/project/app/static/js/bundle.js @@ -0,0 +1,5 @@ +import * as objroot from "/static/js/modules/root/root.js" + +console.log("objroot",objroot) + +export default {} \ No newline at end of file diff --git a/platziflask/project/app/static/js/modules/root/root.js b/platziflask/project/app/static/js/modules/root/root.js new file mode 100644 index 00000000..56004c9f --- /dev/null +++ b/platziflask/project/app/static/js/modules/root/root.js @@ -0,0 +1 @@ +export default {} \ No newline at end of file diff --git a/platziflask/project/app/templates/404.html b/platziflask/project/app/templates/404.html new file mode 100644 index 00000000..249f2d40 --- /dev/null +++ b/platziflask/project/app/templates/404.html @@ -0,0 +1,14 @@ + +{% extends "base.html" %} +{% block title %} + {{ super() }} + 404 +{% endblock %} + +{% block content %} +

    Mi pag 404 - Lo sentimos no encontramos lo que buscabas

    +

    + {{ error }} +

    +{% endblock %} + \ No newline at end of file diff --git a/platziflask/project/app/templates/500.html b/platziflask/project/app/templates/500.html new file mode 100644 index 00000000..c095f0b5 --- /dev/null +++ b/platziflask/project/app/templates/500.html @@ -0,0 +1,14 @@ + +{% extends "base.html" %} +{% block title %} + {{ super() }} + 500 +{% endblock %} + +{% block content %} +

    Lo sentimos no encontramos lo que buscabas

    +

    + {{ error }} +

    +{% endblock %} + \ No newline at end of file diff --git a/platziflask/project/app/templates/base.html b/platziflask/project/app/templates/base.html new file mode 100644 index 00000000..aa963c18 --- /dev/null +++ b/platziflask/project/app/templates/base.html @@ -0,0 +1,52 @@ + + + + + + + Home + + + + +
    +
    1
    +
    2
    +
    3
    +
    4
    + +
    +
    +
    + +
    +
    + +
    +
    + más sobre nosotros +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. Corrupti aspernatur ratione ipsam libero impedit a, vero illo inventore? Doloribus eos quae exercitationem adipisci aliquam molestias ea, ex alias asperiores commodi! +

    +
    +
    + Redes sociales +
    + +
    +
    + +
    5
    +
    6
    +
    7
    +
    8
    +
    + + + diff --git a/platziflask/project/app/templates/base_orig.html b/platziflask/project/app/templates/base_orig.html new file mode 100644 index 00000000..ede7519b --- /dev/null +++ b/platziflask/project/app/templates/base_orig.html @@ -0,0 +1,28 @@ + +{% extends "bootstrap/base.html" %} + +{% block head %} + {{ super() }} + + {% block title %} Flask {% endblock %} + + + + + +{% endblock %} + +{% block body %} + + {% block navbar %} + {% include "navbar.html" %} + {% endblock %} + + {% include "messages.html" %} + + {% block content %} + {% endblock %} + + {% block scripts %}{{ super() }}{% endblock%} + +{% endblock %} diff --git a/platziflask/project/app/templates/index.html b/platziflask/project/app/templates/index.html new file mode 100644 index 00000000..0d253267 --- /dev/null +++ b/platziflask/project/app/templates/index.html @@ -0,0 +1,23 @@ + +{% extends "base.html" %} +{% block title %} {{ super() }} | Bienvenida {% endblock %} + +{% block content %} +
    +
    +

    Bienvenido {{ "xxx" | capitalize }}

    +
    + + +
    +{% endblock %} \ No newline at end of file diff --git a/platziflask/project/app/templates/login.html b/platziflask/project/app/templates/login.html new file mode 100644 index 00000000..b50f88a5 --- /dev/null +++ b/platziflask/project/app/templates/login.html @@ -0,0 +1,15 @@ + +{% extends "base.html" %} +{% import "bootstrap/wtf.html" as wtf %} +{% block title %} + {{ super() }} + Login +{% endblock %} + +{% block content %} +
    +

    Login

    + {{ wtf.quick_form(loginform) }} +
    +{% endblock %} + diff --git a/platziflask/project/app/templates/macro.html b/platziflask/project/app/templates/macro.html new file mode 100644 index 00000000..584161df --- /dev/null +++ b/platziflask/project/app/templates/macro.html @@ -0,0 +1,14 @@ + +{% import "bootstrap/wtf.html" as wtf %} + +{% macro render_todo(todo, deletform, updateform) %} +
  • + descripcion: {{ todo.to_dict().description }} + + {{ todo.to_dict().done }} + + {{ wtf.quick_form(deletform, action=url_for("delete",todoid=todo.id)) }} + {{ wtf.quick_form(updateform, action=url_for("update",todoid=todo.id, done=todo.to_dict().done)) }} +
  • +{% endmacro %} + \ No newline at end of file diff --git a/platziflask/project/app/templates/messages.html b/platziflask/project/app/templates/messages.html new file mode 100644 index 00000000..e86a56be --- /dev/null +++ b/platziflask/project/app/templates/messages.html @@ -0,0 +1,17 @@ + +{% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} +
    {{ message }}
    + {% endfor %} + {% endif %} +{% endwith %} + +{% if error %} +
    {{error}}
    +{% endif %} + +{% if msg %} +
    {{msg}}
    +{% endif %} + \ No newline at end of file diff --git a/platziflask/project/app/templates/navbar.html b/platziflask/project/app/templates/navbar.html new file mode 100644 index 00000000..e8cf683b --- /dev/null +++ b/platziflask/project/app/templates/navbar.html @@ -0,0 +1,25 @@ + + + \ No newline at end of file diff --git a/platziflask/project/app/templates/signup.html b/platziflask/project/app/templates/signup.html new file mode 100644 index 00000000..d949d91d --- /dev/null +++ b/platziflask/project/app/templates/signup.html @@ -0,0 +1,15 @@ + +{% extends "base.html" %} +{% import "bootstrap/wtf.html" as wtf %} +{% block title %} + {{ super() }} + Signup +{% endblock %} + +{% block content %} +
    +

    Registra una cuenta

    + {{ wtf.quick_form(signupform) }} +
    +{% endblock %} + diff --git a/platziflask/project/app/templates/todo-list.html b/platziflask/project/app/templates/todo-list.html new file mode 100644 index 00000000..8492a9fc --- /dev/null +++ b/platziflask/project/app/templates/todo-list.html @@ -0,0 +1,29 @@ + +{% extends "base.html" %} +{% import "macro.html" as macros%} +{% import "bootstrap/wtf.html" as wtf %} + +{% block title %} {{ super() }} | Bienvenida {% endblock %} + +{% block content %} + {% if username %} +

    Bienvenido {{ username | capitalize }}

    + {% endif %} + {% if user_ip %} +

    tu ip es: {{ user_ip }}

    + {% else %} + Ir a inicio + {% endif %} + +
    +

    Crear una nueva tarea

    + {{ wtf.quick_form(todoform) }} +
    +
      + {% for todo in todos %} + {{ macros.render_todo(todo, deleteform, updateform) }} + {% endfor %} +
    +
    +{% endblock %} + \ No newline at end of file diff --git a/platziflask/project/bootstrap/__init__.py b/platziflask/project/bootstrap/__init__.py new file mode 100644 index 00000000..d937e255 --- /dev/null +++ b/platziflask/project/bootstrap/__init__.py @@ -0,0 +1,2 @@ +from .builtins_ext import pr +sc("project/bootstrap/__init__.py") \ No newline at end of file diff --git a/platziflask/project/bootstrap/builtins_ext.py b/platziflask/project/bootstrap/builtins_ext.py new file mode 100644 index 00000000..b7d1433b --- /dev/null +++ b/platziflask/project/bootstrap/builtins_ext.py @@ -0,0 +1,217 @@ +# builtins_ext.py 1.0.0 +import sys +import builtins + +from pprint import pprint +#from colorama import init +#init() + +""" +http://ozzmaker.com/add-colour-to-text-in-python/ +The above ANSI escape code will set the text colour to bright green. The format is; +\033[ Escape code, this is always the same +1 = Style, 1 for normal. +32 = Text colour, 32 for bright green. +40m = Background colour, 40 is for black. +""" +pythontypes = { + "boolean": ("bool"), + "numeric": ("int","float"), + "string": ("str"), + "structure": ("array","dict","list","tuple","set"), # file + "function": ("function"), + "primitives": ("bool","int","float","str") + # import types + # types.GeneratorType +} + +class CheckType(): + + @staticmethod + def is_bool(mxvar): + return isinstance(mxvar, bool) + + @staticmethod + def is_float(mxvar): + return isinstance(mxvar, float) + + @staticmethod + def is_int(mxvar): + return isinstance(mxvar, int) + + @staticmethod + def is_float(mxvar): + return isinstance(mxvar, float) + + @staticmethod + def is_string(mxvar): + return isinstance(mxvar, str) + + @staticmethod + def is_list(mxvar): + return isinstance(mxvar, list) + @staticmethod + def is_dict(mxvar): + return isinstance(mxvar, dict) + + @staticmethod + def is_tuple(mxvar): + return isinstance(mxvar, tuple) + + @staticmethod + def has_dict(mxvar): + return hasattr(mxvar, '__dict__') + + @staticmethod + def is_primitive(mxvar): + return (CheckType.is_bool(mxvar) or CheckType.is_int(mxvar) + or CheckType.is_float(mxvar) or CheckType.is_string(mxvar) + ) + + @staticmethod + def is_structure(mxvar): + return (CheckType.is_list(mxvar) or CheckType.is_dict(mxvar) + or CheckType.is_tuple(mxvar) + ) + + +def is_primitive(mxvar): + return CheckType.is_primitive(mxvar) + +def is_structure(mxvar): + return CheckType.is_structure(mxvar) + +def has_dict(mxvar): + return CheckType.has_dict(mxvar) + +def get_strcolored(strval,colcode): + strreturn = "\033[{}m{}\033[00m".format(colcode,strval) + return strreturn + +def get_dictcolored(dictvar): + lstret = [] + for k,v in dictvar.__dict__.items(): + strkey = " .%s" % k + strval = "%s" % v + lstret.append(get_strkvcolored(strkey, strval)) + + return "\n".join(lstret) + +def printcol(primval,colcode="5;30;47"): + if is_primitive(primval): + primval = str(primval) + strval = get_strcolored(primval,colcode) + print(strval) + +def get_strkvcolored(strkey,strval): + strreturn = "" + # strkey = "\033[0;95m{}\033[00m" .format(strkey) + strkey = get_strcolored(strkey,"0;95") + strval = get_strcolored(strval,"1;96") + strreturn = strkey + " = "+ strval + return strreturn + +def get_strobject(obj): + # strobj = ["obj"] + strobj = [] + for strattr in dir(obj): + strkey = " .%s" % (strattr) + strval = "%s" % getattr(obj, strattr) + strobj.append(get_strkvcolored(strkey, strval)) + + return "\n".join(strobj) + +def print_format_table(): + """ + https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-terminal-in-python + prints table of formatted text format options + """ + for style in range(8): + for fg in range(30,38): + s1 = '' + for bg in range(40,48): + format = ';'.join([str(style), str(fg), str(bg)]) + s1 += '\x1b[%sm %s \x1b[0m' % (format, format) + print(s1) + print('\n') + +def prtype(mxvar): + print(type(mxvar)) + +def s(strtext): + if is_primitive(strtext): + strtext = str(strtext) + printcol(strtext,"94") + +def sc(strtext,colcode="1;30;44"): + if is_primitive(strtext): + strtext = str(strtext) + printcol(strtext,colcode) + +def pr(mxvar, strtitle="", isjustdic=1): + # https://github.com/shiena/ansicolor/blob/master/README.md + if strtitle: + printcol(strtitle,"6;30;43") + + if has_dict(mxvar): + print(get_dictcolored(mxvar)) + + if is_primitive(mxvar): + printcol(mxvar,"0;30;47") + return + + if is_structure(mxvar): + pprint(mxvar) + return + + if isjustdic: + return + + printcol("type:"+str(type(mxvar)),"6;30;43") + # ya lo devuelve con colores + mxvar = get_strobject(mxvar) + print(mxvar) + + +def bug(mxvar,strtitle=""): + # https://github.com/shiena/ansicolor/blob/master/README.md + if strtitle: + printcol(strtitle,"6;30;42") + + if has_dict(mxvar): + print(get_dictcolored(mxvar)) + + if is_primitive(mxvar): + printcol(mxvar) + return + + if is_structure(mxvar): + pprint(mxvar) + return + + # ya lo devuelve con colores + mxvar = get_strobject(mxvar) + print(mxvar) + +def die(mxvar): + bug(mxvar) + sys.exit() + +def diefalsy(mxvar,title=""): + if(not mxvar): + printcol("exit by empty var: %s" % title,"7;33;44") + sys.exit() + + +builtins.s = s +builtins.sc = sc +builtins.pr = pr +builtins.prtype = prtype +builtins.bug = bug +builtins.die = die +builtins.diefalsy = diefalsy + +# print_format_table() + +if __name__ == "__main__": + print_format_table() \ No newline at end of file diff --git a/platziflask/project/bootstrap/config.py b/platziflask/project/bootstrap/config.py new file mode 100644 index 00000000..32c0b358 --- /dev/null +++ b/platziflask/project/bootstrap/config.py @@ -0,0 +1,50 @@ +# project/bootstrap/config.py +sc("project/bootstrap/config.py") + +class Config: + DEBUG = True + TESTING = True + + SECRET_KEY = "SUPER_SECRET" + + MAIL_SERVER = "smtp.gmail.com" + MAIL_PORT = 465 + # MAIL_USE_TLS = False + MAIL_USE_SSL = True + MAIL_USERNAME = "aa@gmail.com" + MAIL_PASSWORD = "bb" + # MAIL_SENDER = "elsender@gmail.com" + + DB_NAME = "production-db" + DB_USERNAME = "root" + DB_PASSWORD = "example" + + UPLOADS = "/home/username/app/app/static/images/uploads" + + SESSION_COOKIE_SECURE = True + +class ProductionConfig(Config): + DATABASE_URI = "mysql://user@localhost/foo" + + +class DevelopmentConfig(Config): + DEBUG = True + + DB_NAME = "production-db" + DB_USERNAME = "root" + DB_PASSWORD = "example" + + UPLOADS = "/home/username/app/app/static/images/uploads" + + SESSION_COOKIE_SECURE = False + + +class TestingConfig(Config): + DEBUG = True + + DB_NAME = "development-db" + DB_USERNAME = "root" + DB_PASSWORD = "example" + + UPLOADS = "/home/username/app/app/static/images/uploads" + diff --git a/platziflask/project/bootstrap/main.py b/platziflask/project/bootstrap/main.py new file mode 100644 index 00000000..b5c66490 --- /dev/null +++ b/platziflask/project/bootstrap/main.py @@ -0,0 +1,51 @@ +# project/bootstrap/main.py +# export FLASK_APP=bootstrap/main.py; run flask + +sc("project/bootstrap/main.py") +from flask_login import login_required +import unittest + +# from app.init +from app import get_flaskapp + +from app.controllers.home_controller import HomeController +from app.controllers.admin_controller import AdminController +from app.controllers.todos_controller import TodosController +from app.controllers.status_controller import StatusController + +flaskapp = get_flaskapp() + +@flaskapp.route("/") +def index(): + return HomeController().index() + +@flaskapp.route("/todo-list",methods=["GET","POST"]) +@login_required +def todo_list(): + return AdminController().index() + +@flaskapp.route("/todos/delete/",methods=["POST"]) +def delete(todoid): + return TodosController().delete(todoid) + +@flaskapp.route("/todos/update//",methods=["POST"]) +def update(todoid, done): + return TodosController().update(todoid,done) + +@flaskapp.errorhandler(404) +def not_found(error): + return StatusController().error_404(error) + +@flaskapp.errorhandler(500) +def not_found(error): + return StatusController().error_500(error) + +# se llamara con: flask test +@flaskapp.cli.command() +def test(): + pr("start test():") + import werkzeug + werkzeug.cached_property = werkzeug.utils.cached_property + # todo lo que este en la carpeta de project/test se ejecutara + tests = unittest.TestLoader().discover("tests") + unittest.TextTestRunner().run(tests) \ No newline at end of file diff --git a/platziflask/project/requirements.txt b/platziflask/project/requirements.txt new file mode 100644 index 00000000..9a23932e --- /dev/null +++ b/platziflask/project/requirements.txt @@ -0,0 +1,9 @@ +flask +flask-bootstrap4 +flask-wtf +flask-testing +blinker +firebase-admin +flask-login +flask_mail +# colorama \ No newline at end of file diff --git a/platziflask/project/tests/__init__.py b/platziflask/project/tests/__init__.py new file mode 100644 index 00000000..cfb19c9a --- /dev/null +++ b/platziflask/project/tests/__init__.py @@ -0,0 +1,5 @@ +print("project/tests/__init__.py") +import sys +sys.path.append('../project') + +# esto lo hago pq he movido main.py dentro de bootstrap \ No newline at end of file diff --git a/platziflask/project/tests/test_base.py b/platziflask/project/tests/test_base.py new file mode 100644 index 00000000..fa41ebf3 --- /dev/null +++ b/platziflask/project/tests/test_base.py @@ -0,0 +1,60 @@ +# project/tests/test_base.py +import sys +from flask_testing import TestCase +from flask import current_app, url_for +from bootstrap.main import flaskapp +sc("project/tests/test_base.py") + +class MainTest(TestCase): + + # metodo obligatorio que tiene que devolver la flaskapp + def create_app(self): + flaskapp.config["TESTING"] = True + flaskapp.config["WTF_CSRF_ENABLED"] = False + return flaskapp + + def test_app_exists(self): + # self.assertIsNone(current_app) + self.assertIsNotNone(current_app) + + def test_app_in_test_mode(self): + self.assertTrue(current_app.config["TESTING"]) + + def test_auth_login_template(self): + # aqui no se usa response, la comunicacion entre client.get y el assertemplate + # se hace con signals + urlresolved = url_for("auth.login") + self.client.get(urlresolved) + self.assertTemplateUsed("login.html") + + def test_auth_login_get(self): + urlresolved = url_for("auth.login") + # auth.login: blueprint de auth, ruta login + response = self.client.get(urlresolved) + self.assert200(response) + + def test_auth_login_post(self): + urlresolved = url_for("auth.login") + dicformdata = { + "username":"fake", + "password":"fake-passs" + } + response = self.client.post(urlresolved,data=dicformdata) + self.assertRedirects(response,url_for("todo_list")) + + # si no se está logado debe hacer un 302 + def test_todo_list(self): + urlresolved = url_for("todo_list") + response = self.client.get(urlresolved) + self.assertRedirects(response,url_for("auth.login")+"?next=%2Ftodo-list") + + # prueba de post + def test_todo_list_post_post(self): + urlresolved = url_for("todo_list") + response = self.client.post(urlresolved) + # espero un Not Allowed + self.assertTrue(response.status_code,405) + + def test_auth_blueprint_exists(self): + self.assertIn("auth",self.app.blueprints) + diff --git a/platziflask/project/tests/test_mail.py b/platziflask/project/tests/test_mail.py new file mode 100644 index 00000000..8fdcb099 --- /dev/null +++ b/platziflask/project/tests/test_mail.py @@ -0,0 +1,47 @@ +# project/tests/test_mail.py +from flask_testing import TestCase +from bootstrap.main import flaskapp +from app.services.sendmail_service import SendmailService +sc("project/tests/test_mail.py") + +class MailTest(TestCase): + + # metodo obligatorio que tiene que devolver la flaskapp + def create_app(self): + # bug(flaskapp.config,"flaskapp.config en test") + # flaskapp.config["TESTING"] = True + return flaskapp + + def test_raw(self): + pr("test_raw") + #flaskapp.config["MAIL_USERNAME"] = "xxx@gmail.com" + #flaskapp.config["MAIL_PASSWORD"] = "yyy" + + flaskapp.config["DEBUG"] = True + flaskapp.config["TESTING"] = False + flaskapp.config["MAIL_SERVER"] = "smtp.gmail.com" + flaskapp.config["MAIL_PORT"] = 465 + flaskapp.config["MAIL_USE_TLS"] = False + flaskapp.config["MAIL_USE_SSL"] = True + flaskapp.config["MAIL_DEFAULT_SENDER"] = "elsender@unmail.com" + flaskapp.config["MAIL_MAX_EMAILS"] = None + flaskapp.config["MAIL_ASCII_ATTACHMENTS"] = False + + msg = Message("Hello", recipients=["eaf@example.com"]) + msg.body = "testing" + msg.html = "testing" + + mail = Mail(flaskapp) + mail.send(msg) + pr("end test_raw") + + def test_send_params(self): + pr("test_send_params") + objmail = SendmailService(flaskapp) + objmail.set_sender("wow@gmail.com") + objmail.set_body("some body to send") + objmail.set_subject("un subject") + objmail.add_recipient("hocet81487@remailsky.com") + is_sentok = objmail.send() + self.assertEqual(is_sentok,True) + pr("end test_send_params") \ No newline at end of file diff --git a/platzigram/README.md b/platzigram/README.md index 3157c64c..309e4fb5 100644 --- a/platzigram/README.md +++ b/platzigram/README.md @@ -1,662 +1,1039 @@ -# Platzigram - -## [Parte 4 - Clases Django](https://platzi.com/clases/django/) - -#### 3 Video. Preparación del entorno de trabajo -- Entornos virtuales -- `python -m venv .env` Crea la carpeta del entorno virtual. Aqui se instalarán todas los paquetes necesarios para Django --
    - .env (tree en windows) -

    - - ``` - D:. - ├───Include - ├───Lib - │ ├───site-packages - │ │ ├───pip - │ │ │ ├───_internal - │ │ │ │ ├───commands - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───models - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───operations - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───req - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───utils - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───vcs - │ │ │ │ │ └───__pycache__ - │ │ │ │ └───__pycache__ - │ │ │ ├───_vendor - │ │ │ │ ├───cachecontrol - │ │ │ │ │ ├───caches - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───certifi - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───chardet - │ │ │ │ │ ├───cli - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───colorama - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───distlib - │ │ │ │ │ ├───_backport - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───html5lib - │ │ │ │ │ ├───filters - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ ├───treeadapters - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ ├───treebuilders - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ ├───treewalkers - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ ├───_trie - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───idna - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───lockfile - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───msgpack - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───packaging - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───pkg_resources - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───progress - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───pytoml - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───requests - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───urllib3 - │ │ │ │ │ ├───contrib - │ │ │ │ │ │ ├───_securetransport - │ │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ ├───packages - │ │ │ │ │ │ ├───backports - │ │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ │ ├───ssl_match_hostname - │ │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ ├───util - │ │ │ │ │ │ └───__pycache__ - │ │ │ │ │ └───__pycache__ - │ │ │ │ ├───webencodings - │ │ │ │ │ └───__pycache__ - │ │ │ │ └───__pycache__ - │ │ │ └───__pycache__ - │ │ ├───pip-10.0.1.dist-info - │ │ ├───pkg_resources - │ │ │ ├───extern - │ │ │ │ └───__pycache__ - │ │ │ ├───_vendor - │ │ │ │ ├───packaging - │ │ │ │ │ └───__pycache__ - │ │ │ │ └───__pycache__ - │ │ │ └───__pycache__ - │ │ ├───setuptools - │ │ │ ├───command - │ │ │ │ └───__pycache__ - │ │ │ ├───extern - │ │ │ │ └───__pycache__ - │ │ │ ├───_vendor - │ │ │ │ ├───packaging - │ │ │ │ │ └───__pycache__ - │ │ │ │ └───__pycache__ - │ │ │ └───__pycache__ - │ │ ├───setuptools-39.0.1.dist-info - │ │ └───__pycache__ - │ └───tcl8.6 - └───Scripts - ``` - -

    -
    - -- En una ventana de cmd: `platzigram>..\.env\scripts\activate` -- `deactivate` es el comando opuesto -- Instalación de Django con pip dentro de nuestro (.env) - - `python -m pip install --upgrade pip` Actualizamos pip - - `pip install django -U` -U: última version - - `pip freeze` Comprobamos que está instalado - ```sh - (.env) \platzigram>pip freeze - Django==2.1.7 - pytz==2018.9 - ``` - - -#### 4 Manual. Como instalar python en windows. -- Solo lectura - -#### 5 Video. [Creación del proyecto Platzigram / Tu primer Hola, mundo en Django](https://platzi.com/clases/1318-django/12402-creacion-del-proyecto-platzigram-tu-primer-hola-mu) - -- Nos posicionamos en nuestro entorno virtual. -- `django-admin startproject platzigram .` Creación de un proyecto de Django -- Archivos creados dentro de platzigram/platzigram: - - urls.py: Mapea rutas a controladores - ```py - from django.contrib import admin - from django.urls import path - - urlpatterns = [ - path('admin/', admin.site.urls), - ] - ``` - - wsgi.py: Es la interfaz que se ejecuta en producción - ```py - import os - from django.core.wsgi import get_wsgi_application - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'platzigram.settings') - application = get_wsgi_application() - ``` - - manage.py: Nunca vamos a tocar pero interactuaremos con el en todo el desarrollo. Es una interfaz sobre djangoadmin. Es un comando de consola de django. - - settings.py: - - BASE_DIR: la ruta raíz del proyecto - - SECRET_KEY: hashing de contraseñas - - DEBUG: muestra trazas - - ALLOWED_HOSTS: los hosts permitidos - - INSTALLED_APPS: Apps instaladas - - MIDDLEWARES: - - ROOT_URLCONF: Nuestra url raiz al proyecto - - TEMPLATES: - - WSGI_APPLICATION: - - DATABASES: - - AUTH_PASSWORD_VALIDATORS: Todas las contraseñas pasan por todos estos filtros. - - [Más datos](https://github.com/eacevedof/prj_python37/blob/master/keepcoding/README.md) - -
    - `python manage.py` -

    - - ``` - Available subcommands: - - [auth] - changepassword - createsuperuser - - [contenttypes] - remove_stale_contenttypes - - [django] - check - compilemessages - createcachetable - dbshell - diffsettings - dumpdata - flush - inspectdb - loaddata - makemessages - makemigrations - migrate - sendtestemail - shell - showmigrations - sqlflush - sqlmigrate - sqlsequencereset - squashmigrations - startapp - startproject - test - testserver - - [sessions] - clearsessions - - [staticfiles] - collectstatic - findstatic - runserver - ``` - -

    -
    - - **`python manage.py runserver`** Arranca el servidor en: - - [http://127.0.0.1:8000/](http://127.0.0.1:8000/) - ```js - Performing system checks... - System check identified no issues (0 silenced). - You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. - Run 'python manage.py migrate' to apply them. - March 17, 2019 - 17:09:02 - Django version 2.1.7, using settings 'platzigram.settings' - Starting development server at http://127.0.0.1:8000/ - Quit the server with CTRL-BREAK. - ``` - - Si navegamos a esa dirección veremos la página de inicio de django en local. - - Tocamos el fichero urls.py - ```py - from django.urls import path - from django.http import HttpResponse - - def hello_world(request): - return HttpResponse("Hello World") - - urlpatterns = [ - # path(ruta-slug,) - path("hello-world/",hello_world) - ] - ``` - -#### 6 Video. [El objeto Request](https://platzi.com/clases/1318-django/12403-el-objeto-request2427) -- [Gestión de petición (request) de Django](https://docs.djangoproject.com/en/2.1/topics/http/urls/#how-django-processes-a-request) -- Las funciones que reciben las peticiónes (requests) django las entiende como vistas. -- Creamos fichero `views.py` -- `from datetime import datetime` -- `print(request)` `` -- [El objeto request](https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest) -- Uso del módulo **pdb** -```py -pdb.set_trace() -> \platzigram\views.py(18)hi() --> return HttpResponse("hi") -(Pdb) -aqui permite pedir trazas sobre el objeto request. Por ejemplo: -request.POST -request.GET -presionando c + enter sigue la ejecución -``` -- **Tarea** - - Queda recibir por GET numbers=10,4,50,32 y devolverlos por json no por HTML de forma ordenada. - - [http://127.0.0.1:8000/hi/?numbers=10,4,50,32](http://127.0.0.1:8000/hi/?numbers=10,4,50,32) - - **solución:** - - `import json` - ```py - def hi(request): - """Hi.""" - # request.GET = - sNumbers = request.GET["numbers"] - lstNumbers = sNumbers.split(",") - lstNumbers = [int(sI) for sI in lstNumbers] - lstNumbers.sort() - return HttpResponse(json.dumps(lstNumbers), content_type="application/json") - ``` - -#### 7 Video. [Solución al reto - Pasando argumentos en la URL](https://platzi.com/clases/1318-django/12404-solucion-al-reto-pasando-argumentos-en-la-url/) -```py -numbers = [int(i) for i in request.GET["numbers"].split(",")] -nsorted = sorted(numbers) -data = { - "status": "ok", - "numbers": nsorted, - "message": "Integers sorted susccesfully." -} -return HttpResponse( - json.dumps(data,indent=4), - content_type="application/json" -) -``` - -```py -def say_hi(request,name,age): - """hi///""" - # pdb.set_trace() - # con GET no va, pq realmente no hay nada en la url como: ?k=v&k2=v2 - name = request.GET["nombre"] - age = request.GET["edad"] - if age<12: - message = "Sorry {}, you are not allowed here".format(name) - else: - message = "Hello {}!, Welcome to Platzigram".format(name) - return HttpResponse(message) -``` -#### 8 Video. [Creación de la primera app](https://platzi.com/clases/1318-django/12405-creacion-de-la-primera-app/) -- Se crea una nueva app dentro de: **(env) ~/platzigram** con **`py manage.py startapp appposts`** el nombre de app procuremos que sea siempre en plural. -- Crea un módulo migrations que se encarga de guardar los cambios en la bd. -- Archivo **admin.py** se encarga de guardar los modelos en el administrador de django. -- **apps.py** aqui se de clara toda la configuración de nuestra app de modo público y hace que nuestra app sea reutilizable. Se puede definir ciertas variables. -- **models.py** se usa para definir los modelos de nuestros datos. -- **test.py** archivo de pruebas -- **views.py** -- La app de django no es estricta en lo que a su arbol de carpetas se refiere. Se puede adaptar y escalar según las necesidades de cada proyecto. -- [**`/app.py`**](https://docs.djangoproject.com/en/2.1/ref/applications/) - - En la doc, define que es una app, que variables recibe y como configurarla. - - Nos interesa dos variables: - - **.name** El nombre común de nuestra app - - **.verbose_name** El mismo nombre anterior pero en plural -- Despues de configurar app.py tenemos que configurar `/platzigram/settings.py` - - En la lista **INSTALLED_APPS** agregamos - ```py - # Local apps - "appposts", #hace referencia al módulo /appposts - ``` -- Configuramos una vista: - - Actualizamos **urls.py** - ```js - path("posts/",posts_views.list_posts), - AttributeError: module 'appposts.views' has no attribute 'list_posts' - ``` - - Configuramos **`/appposts/views.py`** - - defino `list_posts(request):` - - defino lista de posts: `posts = [...]` - - interesante **\*\*post**: explota el array items de forma ordenada y se concatean automaticamente en las posiciones del string - ```py - contents = [] - for post in posts: - contents.append(""" -

    {name}

    -

    {user} - {timestamp}

    -
    - """.format(**post)) - - return HttpResponse("
    ".join(contents)) - ``` -- Se muestra el listado de posts con foto. - -#### 9 Video. [Introducción al template system](https://platzi.com/clases/1318-django/12406-introduccion-al-template-system/) -- El template system está inspirado en [jinja2](http://jinja.pocoo.org/) (a full featured template engine for Python) con lo cual comparten mucha similitud. -- Repasando el flujo de una petición: - - url (se traducirá en una función) - - vista (que es una función definida en el fichero views.py) - - La función (`def somefunc(request):`) procesa la entrada usando parámetros y el objeto request - - La función procesa una respuesta usando el objeto HttpResponse (del módulo: django.http) -- Los templates los definimos en el archivo **/platizgram/settings.py** -- Usamos la variable **TEMPLATES** que admite diferentes backends. -- Creamos una carpeta dentro de nuestra **app** de django (appposts). -- en `apposts\views.py` ya no se usa `from django.http import HttpResponse` -- se reemplaza por `from django.shortcuts import render` -```py -def list_posts(request): - """List existing posts""" - return render(request,"feed.html") -``` -- Como hace Django para encontrar el template?: - - En la variable settings.py TEMPLATES["APPS_DIRS"]:True se le indica que busque las plantillas dentro de la subcarpeta templates. - - Probemos con la subcarpeta **borrame**. No, no funciona. - ```js - django.template.loaders.app_directories.Loader: \.env\lib\site-packages\django\contrib\admin\templates\feed.html (Source does not exist) - django.template.loaders.app_directories.Loader: \.env\lib\site-packages\django\contrib\auth\templates\feed.html (Source does not exist) - django.template.loaders.app_directories.Loader: \platzigram\appposts\templates\feed.html (Source does not exist) - ``` -- El tercer parámetro de render es un [contexto](https://docs.djangoproject.com/en/2.1/ref/templates/api/#django.template.Context), un diccionario, son las variables que se pasarán a la plantilla si es necesario. -```py -return render(request,"feed.html",{"name":"Eduardo A.F"}) -# en la vista -Tu nombre es: {{ name }} -``` -- Instalo bootstrap en feed.html y retoco la generación de los posts -```html -{% for post in posts %} -
    -
    - {{ post.user.name }} -
    -
    {{ post.user.name }}
    - {{ post.timestamp }} -
    -
    - {{ post.title }} -
    {{ post.title }}
    -
    -{% endfor %} -``` - -- [Documentación sobre tags en los templates](https://docs.djangoproject.com/en/2.1/ref/templates/builtins/) Los `% operador % {{ mi_variable }}` - -#### 10 Video. [Patrones de diseño](https://platzi.com/clases/1318-django/12407-patrones-de-diseno-y-django/) -- MVC Model View Controller -- Django es cercano al MVC -- **MTV** Model Template View. es el patrón de Django y tiene similitud con MVC - - Model Define la estructura de los datos - - Template Presentación de datos - - View Recupera los datos y los pasa al template - -#### 11 Video. [La M en el MTV](https://platzi.com/clases/1318-django/12408-la-quotmquot-en-el-mtv/) -- **settings.py** - - Configurando la bd [Doc. oficial](https://docs.djangoproject.com/en/2.1/ref/databases/) - - **Migraciones**. El mensaje: `You have 14 unaplied mig (...) to apply them` - - Detenemos el servidor http. - - comando: `\prj_python37\platzigram>py manage.py migrate` - ```js - # settings.py - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } - } - - # despues de ejecutar el comando: - Operations to perform: - Apply all migrations: admin, auth, contenttypes, sessions - Running migrations: - Applying contenttypes.0001_initial... OK - Applying auth.0001_initial... OK - Applying admin.0001_initial... OK - Applying admin.0002_logentry_remove_auto_add... OK - Applying admin.0003_logentry_add_action_flag_choices... OK - Applying contenttypes.0002_remove_content_type_name... OK - Applying auth.0002_alter_permission_name_max_length... OK - Applying auth.0003_alter_user_email_max_length... OK - Applying auth.0004_alter_user_username_opts... OK - Applying auth.0005_alter_user_last_login_null... OK - Applying auth.0006_require_contenttypes_0002... OK - Applying auth.0007_alter_validators_add_error_messages... OK - Applying auth.0008_alter_user_username_max_length... OK - Applying auth.0009_alter_user_last_name_max_length... OK - Applying sessions.0001_initial... OK - ``` - - ![db_django sqlite3 - SQLiteStudio](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/254x239/77c0d9fa7babde5f35cda87397a64b65/image.png) - - Django usa un ORM para trabjar con multiples sistemas de bd. - - Cramos un modelo de usuarios. - - [Doc. Campos](https://docs.djangoproject.com/en/2.1/ref/models/fields/) - ```js - ERRORS: - appposts.User.first_name: (fields.E120) CharFields must define a 'max_length' attribute. - appposts.User.last_name: (fields.E120) CharFields must define a 'max_length' attribute. - appposts.User.password: (fields.E120) CharFields must define a 'max_length' attribute. - ``` - - Despues de corregir el modelo - ```py - email = models.EmailField(unique=True) - password = models.CharField(max_length=100) - first_name = models.CharField(max_length=100) - last_name = models.CharField(max_length=100) - - bio = models.TextField(blank=True) #permite el campo vacio - birthdate = models.DateField(blank=True,null=True) - - created = models.DateTimeField(auto_now_add=True) - modified = models.DateTimeField(auto_now=True) - ``` - - Ejecutamos comando dentro de env: `python manage.py makemigrations`. - ```js - Migrations for 'appposts': - appposts\migrations\0001_initial.py - Create model User - - crea fichero en platzigram/appposts/migrations/0001_initial.py - se ejecuta el manage migrate - - python manage.py migrate - se ha creado la tabla **appposts_user** - ``` - - ![Tabla appposts_user](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/200x276/da4d0d55a93673bc80feb7c2dc272cac/image.png) - - makemigrations busca los cambios en nuestros modelos - - migrate aplica cambios en la bd - -#### 12 Video. [El ORM de Django](https://platzi.com/clases/1318-django/12409-el-orm-de-django/) -- Por defecto Django agrega un id a la tabla. Por esto no hemos definido un campo identificador en el modelo. -- Modificamos el modelo. Se crea campo **is_admin** -- **makemigrations** genera un nuevo fichero 0002_user_is_admin.py -- ![Nuevo campo is_admin](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/600x158/c5b3f5c56f579cf2a9554d21b569181f/image.png) -- ![Nuevo campo en sqlite](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/226x286/9fd63243c39be16b12a71c60ed55c665/image.png) -- Cargando el **shell de Django** -- En (.env): **`py manage.py shell`** -- ![shell python](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/784x68/d060e5f39142641f23268f476378407c/image.png) -```py -from appposts.models import User -eaf = User.objects.create( - email="hola@gmail.com", - password = "1234567", - first_name = "Eduardo", - last_name = "A.F" -) -eaf.email -eaf.id -eaf.pk -eaf.email = "eaf@email.com" -eaf.save() -eaf.created -eaf.modified - -art = User() -art.pk -art.email = "arturo@plzi.com" -art.first_name = "Arturo" -art.last_name = "Mrt" -art.password = "MSIComputer" -art.is_admin = True -art.save() - -art.delete() -``` - -- ![Dato creado](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/600x150/4160147625ee0a5944a32e37605c8816/image.png) -- Creando usuarios: -```py -from datetime import date - -users = [ - { - 'email': 'userone@anemail.com', - 'first_name': 'User O', - 'last_name': 'Ne', - 'password': '1234567', - 'is_admin': True - }, - { - 'email': 'usertwo@anemail.com', - 'first_name': 'Usr', - 'last_name': 'Twoo', - 'password': '987654321' - }, - { - 'email': 'userthree@anemail.com', - 'first_name': 'Usuario', - 'last_name': 'Tres', - 'password': 'qwerty', - 'birthdate': date(1990, 12,19) - }, - { - 'email': 'cuatro@anemail.com', - 'first_name': 'Un Usuario', - 'last_name': 'Cuatro', - 'password': 'msicomputer', - 'is_admin': True, - 'birthdate': date(1981, 11, 6), - 'bio': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." - } -] -from appposts.models import User -for user in users: - obj = User(**user) - obj.save() - print(obj.pk, ':', obj.email) -``` -- Obteniendo usuarios -```py -from appposts.models import User -user = User.objects.get(email="userone@anemail.com") - -users = User.objects.filter(email__endswith="@anemail.com") -users -users = User.objects.all() -users = User.objects.filter(email__endswith="@anemail.com").update(is_admin=True) -users -users = User.objects.filter(email__endswith="@anemail.com") -for u in users: - print(u.email,":",u.is_admin) -``` - -#### 13 Doc. [Glosario](https://platzi.com/clases/1318-django/12410-glosario6134/) -- Glosario de: ORM, Templates, Models. - -#### 14 Video. [Extendiendo el modelo de usuario](https://platzi.com/clases/1318-django/12411-extendiendo-el-modelo-de-usuario/) -- [Doc. Extending the existing User Model](https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#extending-the-existing-user-model) -- Debemos añadir la siguiente info: - - website - - biography - - phone_number - - profile picture - - created - - modified -- Vamos a crear una nueva app -- Primero borramos la bd: `rm db.sqlite3` -- `py manage.py startapp appusers` - - Nos crea una app parecida a appposts -- Agrego la nueva app en **settings.py** -- Modificamos **apps.py** (`/platzigram/appusers/apps.py`) `class UsersConfig(AppConfig):` -- Modificamos **models.py** - - `class Profile(models.Model):` Aqui se configuran los nuevos campos - - La tabla asociada se llamará **appusers_profile** -- Definimos relación 1:1 **OneToOneField** - ```ssh - Applying contenttypes.0001_initial... OK - Applying auth.0001_initial... OK - Applying admin.0001_initial... OK - Applying admin.0002_logentry_remove_auto_add... OK - Applying admin.0003_logentry_add_action_flag_choices... OK - Applying appposts.0001_initial... OK - Applying appposts.0002_user_is_admin... OK - Applying contenttypes.0002_remove_content_type_name... OK - Applying auth.0002_alter_permission_name_max_length... OK - Applying auth.0003_alter_user_email_max_length... OK - Applying auth.0004_alter_user_username_opts... OK - Applying auth.0005_alter_user_last_login_null... OK - Applying auth.0006_require_contenttypes_0002... OK - Applying auth.0007_alter_validators_add_error_messages... OK - Applying auth.0008_alter_user_username_max_length... OK - Applying auth.0009_alter_user_last_name_max_length... OK - Applying sessions.0001_initial... OK - ``` -- Antes de ejecutar `makemigrations` hay que instalar **pillow** -- En (.env): `pip install pillow` Es necesario para campos tipo **imageField** -- `migrate` - - ![tabla app_users_profile](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/810x367/3d4eaf0b1aefdd7d9dc96182b7cc4d25/image.png) -- Se publica el modelo **Profile** - ```py - """platzigram/appusers/admin.py""" - from django.contrib import admin - # Register your models here. - from .models import Profile - admin.site.register(Profile) - ``` -- **Para entrar al panel de administración** - - [http://localhost:8000/admin/](http://localhost:8000/admin/) - - Hay que configurar la ruta así: (**urls.py**) - ```py - from django.urls import path - from django.contrib import admin - urlpatterns = [ - path('admin/', admin.site.urls), - ] - ``` - - (.env):`python manage.py createsuperuser` - ```js - Username: admin - Email address: admin@somedomain.com - Password: 1234 - Password (again): 1234 - Superuser created successfully. - ``` - - `createsuperuser` escribe en la tabla **auth_user** - - ![tabla auth_user](https://trello-attachments.s3.amazonaws.com/5b014dcaf4507eacfc1b4540/5c8401cf1c6b4163c9b2419b/90f79aa8eaeefab392d3ae3d06e082c2/image.png) - -## Notas -- `django-admin startproject platzigram .` Creación de un proyecto de Django -- `(env) ~/platzigram con py manage.py startapp appposts` Creación de una app en Django - - **8 Video.** Tengo que recuperar la **subcarpeta** borrada platzigram - - Hago copia del proyecto - - ejecuto: **`git checkout feea6ec -- platzigram/platzigram`** donde `` es el último punto donde existía la subcarpeta platzigram. - - Reemplazo los ficheros con el backup. +# Platzigram + +#### Python 3.7 - Django 2.1.7 +- `#!/usr/bin/env python` Con esto se le indica a los ficheros .py que si no se le llama al fichero con la aplicación asociada, entonces se buscará en la variable de entorno y se lanzará automáticamente. +- `py --version` Para versión de python +- `(env): py manage.py --version` Para versión de Django + +## [Parte 4 - Clases Django](https://platzi.com/clases/django/) + +#### 3 Video. Preparación del entorno de trabajo +- Entornos virtuales +- `python -m venv .env` Crea la carpeta del entorno virtual. Aqui se instalarán todas los paquetes necesarios para Django +-
    + .env (tree en windows) +

    + + ``` + D:. + ├───Include + ├───Lib + │ ├───site-packages + │ │ ├───pip + │ │ │ ├───_internal + │ │ │ │ ├───commands + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───models + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───operations + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───req + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───utils + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───vcs + │ │ │ │ │ └───__pycache__ + │ │ │ │ └───__pycache__ + │ │ │ ├───_vendor + │ │ │ │ ├───cachecontrol + │ │ │ │ │ ├───caches + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───certifi + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───chardet + │ │ │ │ │ ├───cli + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───colorama + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───distlib + │ │ │ │ │ ├───_backport + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───html5lib + │ │ │ │ │ ├───filters + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ ├───treeadapters + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ ├───treebuilders + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ ├───treewalkers + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ ├───_trie + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───idna + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───lockfile + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───msgpack + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───packaging + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───pkg_resources + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───progress + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───pytoml + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───requests + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───urllib3 + │ │ │ │ │ ├───contrib + │ │ │ │ │ │ ├───_securetransport + │ │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ ├───packages + │ │ │ │ │ │ ├───backports + │ │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ │ ├───ssl_match_hostname + │ │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ ├───util + │ │ │ │ │ │ └───__pycache__ + │ │ │ │ │ └───__pycache__ + │ │ │ │ ├───webencodings + │ │ │ │ │ └───__pycache__ + │ │ │ │ └───__pycache__ + │ │ │ └───__pycache__ + │ │ ├───pip-10.0.1.dist-info + │ │ ├───pkg_resources + │ │ │ ├───extern + │ │ │ │ └───__pycache__ + │ │ │ ├───_vendor + │ │ │ │ ├───packaging + │ │ │ │ │ └───__pycache__ + │ │ │ │ └───__pycache__ + │ │ │ └───__pycache__ + │ │ ├───setuptools + │ │ │ ├───command + │ │ │ │ └───__pycache__ + │ │ │ ├───extern + │ │ │ │ └───__pycache__ + │ │ │ ├───_vendor + │ │ │ │ ├───packaging + │ │ │ │ │ └───__pycache__ + │ │ │ │ └───__pycache__ + │ │ │ └───__pycache__ + │ │ ├───setuptools-39.0.1.dist-info + │ │ └───__pycache__ + │ └───tcl8.6 + └───Scripts + ``` + +

    +
    + +- En una ventana de cmd: `platzigram>..\.env\scripts\activate` +- `deactivate` es el comando opuesto +- Instalación de Django con pip dentro de nuestro (.env) + - `python -m pip install --upgrade pip` Actualizamos pip + - `pip install django -U` -U: última version + - `pip freeze` Comprobamos que está instalado + ```sh + (.env) \platzigram>pip freeze + Django==2.1.7 + pytz==2018.9 + ``` + + +#### 4 Manual. Como instalar python en windows. +- Solo lectura + +#### 5 Video. [Creación del proyecto Platzigram / Tu primer Hola, mundo en Django](https://platzi.com/clases/1318-django/12402-creacion-del-proyecto-platzigram-tu-primer-hola-mu) + +- Nos posicionamos en nuestro entorno virtual. +- `django-admin startproject platzigram .` Creación de un proyecto de Django +- Archivos creados dentro de platzigram/platzigram: + - urls.py: Mapea rutas a controladores + ```py + from django.contrib import admin + from django.urls import path + + urlpatterns = [ + path('admin/', admin.site.urls), + ] + ``` + - wsgi.py: Es la interfaz que se ejecuta en producción + ```py + import os + from django.core.wsgi import get_wsgi_application + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'platzigram.settings') + application = get_wsgi_application() + ``` + - manage.py: Nunca vamos a tocar pero interactuaremos con el en todo el desarrollo. Es una interfaz sobre djangoadmin. Es un comando de consola de django. + - settings.py: + - BASE_DIR: la ruta raíz del proyecto + - SECRET_KEY: hashing de contraseñas + - DEBUG: muestra trazas + - ALLOWED_HOSTS: los hosts permitidos + - INSTALLED_APPS: Apps instaladas + - MIDDLEWARES: + - ROOT_URLCONF: Nuestra url raiz al proyecto + - TEMPLATES: + - WSGI_APPLICATION: + - DATABASES: + - AUTH_PASSWORD_VALIDATORS: Todas las contraseñas pasan por todos estos filtros. + - [Más datos](https://github.com/eacevedof/prj_python37/blob/master/keepcoding/README.md) + -
    + `python manage.py` +

    + + ``` + Available subcommands: + + [auth] + changepassword + createsuperuser + + [contenttypes] + remove_stale_contenttypes + + [django] + check + compilemessages + createcachetable + dbshell + diffsettings + dumpdata + flush + inspectdb + loaddata + makemessages + makemigrations + migrate + sendtestemail + shell + showmigrations + sqlflush + sqlmigrate + sqlsequencereset + squashmigrations + startapp + startproject + test + testserver + + [sessions] + clearsessions + + [staticfiles] + collectstatic + findstatic + runserver + ``` + +

    +
    + - **`python manage.py runserver`** Arranca el servidor en: + - [http://127.0.0.1:8000/](http://127.0.0.1:8000/) + ```js + Performing system checks... + System check identified no issues (0 silenced). + You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. + Run 'python manage.py migrate' to apply them. + March 17, 2019 - 17:09:02 + Django version 2.1.7, using settings 'platzigram.settings' + Starting development server at http://127.0.0.1:8000/ + Quit the server with CTRL-BREAK. + ``` + - Si navegamos a esa dirección veremos la página de inicio de django en local. + - Tocamos el fichero urls.py + ```py + from django.urls import path + from django.http import HttpResponse + + def hello_world(request): + return HttpResponse("Hello World") + + urlpatterns = [ + # path(ruta-slug,) + path("hello-world/",hello_world) + ] + ``` + +#### 6 Video. [El objeto Request](https://platzi.com/clases/1318-django/12403-el-objeto-request2427) +- [Gestión de petición (request) de Django](https://docs.djangoproject.com/en/2.1/topics/http/urls/#how-django-processes-a-request) +- Las funciones que reciben las peticiónes (requests) django las entiende como vistas. +- Creamos fichero `views.py` +- `from datetime import datetime` +- `print(request)` `` +- [El objeto request](https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest) +- Uso del módulo **pdb** +```py +pdb.set_trace() +> \platzigram\views.py(18)hi() +-> return HttpResponse("hi") +(Pdb) +aqui permite pedir trazas sobre el objeto request. Por ejemplo: +request.POST +request.GET +presionando c + enter sigue la ejecución +``` +- **Tarea** + - Queda recibir por GET numbers=10,4,50,32 y devolverlos por json no por HTML de forma ordenada. + - [http://127.0.0.1:8000/hi/?numbers=10,4,50,32](http://127.0.0.1:8000/hi/?numbers=10,4,50,32) + - **solución:** + - `import json` + ```py + def hi(request): + """Hi.""" + # request.GET = + sNumbers = request.GET["numbers"] + lstNumbers = sNumbers.split(",") + lstNumbers = [int(sI) for sI in lstNumbers] + lstNumbers.sort() + return HttpResponse(json.dumps(lstNumbers), content_type="application/json") + ``` + +#### 7 Video. [Solución al reto - Pasando argumentos en la URL](https://platzi.com/clases/1318-django/12404-solucion-al-reto-pasando-argumentos-en-la-url/) +```py +numbers = [int(i) for i in request.GET["numbers"].split(",")] +nsorted = sorted(numbers) +data = { + "status": "ok", + "numbers": nsorted, + "message": "Integers sorted susccesfully." +} +return HttpResponse( + json.dumps(data,indent=4), + content_type="application/json" +) +``` + +```py +def say_hi(request,name,age): + """hi///""" + # pdb.set_trace() + # con GET no va, pq realmente no hay nada en la url como: ?k=v&k2=v2 + name = request.GET["nombre"] + age = request.GET["edad"] + if age<12: + message = "Sorry {}, you are not allowed here".format(name) + else: + message = "Hello {}!, Welcome to Platzigram".format(name) + return HttpResponse(message) +``` +#### 8 Video. [Creación de la primera app](https://platzi.com/clases/1318-django/12405-creacion-de-la-primera-app/) +- Se crea una nueva app dentro de: **(env) ~/platzigram** con **`py manage.py startapp appposts`** el nombre de app procuremos que sea siempre en plural. +- Crea un módulo migrations que se encarga de guardar los cambios en la bd. +- Archivo **admin.py** se encarga de guardar los modelos en el administrador de django. +- **apps.py** aqui se de clara toda la configuración de nuestra app de modo público y hace que nuestra app sea reutilizable. Se puede definir ciertas variables. +- **models.py** se usa para definir los modelos de nuestros datos. +- **test.py** archivo de pruebas +- **views.py** +- La app de django no es estricta en lo que a su arbol de carpetas se refiere. Se puede adaptar y escalar según las necesidades de cada proyecto. +- [**`/app.py`**](https://docs.djangoproject.com/en/2.1/ref/applications/) + - En la doc, define que es una app, que variables recibe y como configurarla. + - Nos interesa dos variables: + - **.name** El nombre común de nuestra app + - **.verbose_name** El mismo nombre anterior pero en plural +- Despues de configurar app.py tenemos que configurar `/platzigram/settings.py` + - En la lista **INSTALLED_APPS** agregamos + ```py + # Local apps + "appposts", #hace referencia al módulo /appposts + ``` +- Configuramos una vista: + - Actualizamos **urls.py** + ```js + path("posts/",posts_views.list_posts), + AttributeError: module 'appposts.views' has no attribute 'list_posts' + ``` + - Configuramos **`/appposts/views.py`** + - defino `list_posts(request):` + - defino lista de posts: `posts = [...]` + - interesante **\*\*post**: explota el array items de forma ordenada y se concatean automaticamente en las posiciones del string + ```py + contents = [] + for post in posts: + contents.append(""" +

    {name}

    +

    {user} - {timestamp}

    +
    + """.format(**post)) + + return HttpResponse("
    ".join(contents)) + ``` +- Se muestra el listado de posts con foto. + +#### 9 Video. [Introducción al template system](https://platzi.com/clases/1318-django/12406-introduccion-al-template-system/) +- El template system está inspirado en [jinja2](http://jinja.pocoo.org/) (a full featured template engine for Python) con lo cual comparten mucha similitud. +- Repasando el flujo de una petición: + - url (se traducirá en una función) + - vista (que es una función definida en el fichero views.py) + - La función (`def somefunc(request):`) procesa la entrada usando parámetros y el objeto request + - La función procesa una respuesta usando el objeto HttpResponse (del módulo: django.http) +- Los templates los definimos en el archivo **/platizgram/settings.py** +- Usamos la variable **TEMPLATES** que admite diferentes backends. +- Creamos una carpeta dentro de nuestra **app** de django (appposts). +- en `apposts\views.py` ya no se usa `from django.http import HttpResponse` +- se reemplaza por `from django.shortcuts import render` +```py +def list_posts(request): + """List existing posts""" + return render(request,"feed.html") +``` +- Como hace Django para encontrar el template?: + - En la variable settings.py TEMPLATES["APPS_DIRS"]:True se le indica que busque las plantillas dentro de la subcarpeta templates. + - Probemos con la subcarpeta **borrame**. No, no funciona. + ```js + django.template.loaders.app_directories.Loader: \.env\lib\site-packages\django\contrib\admin\templates\feed.html (Source does not exist) + django.template.loaders.app_directories.Loader: \.env\lib\site-packages\django\contrib\auth\templates\feed.html (Source does not exist) + django.template.loaders.app_directories.Loader: \platzigram\appposts\templates\feed.html (Source does not exist) + ``` +- El tercer parámetro de render es un [contexto](https://docs.djangoproject.com/en/2.1/ref/templates/api/#django.template.Context), un diccionario, son las variables que se pasarán a la plantilla si es necesario. +```py +return render(request,"feed.html",{"name":"Eduardo A.F"}) +# en la vista +Tu nombre es: {{ name }} +``` +- Instalo bootstrap en feed.html y retoco la generación de los posts +```html +{% for post in posts %} +
    +
    + {{ post.user.name }} +
    +
    {{ post.user.name }}
    + {{ post.timestamp }} +
    +
    + {{ post.title }} +
    {{ post.title }}
    +
    +{% endfor %} +``` + +- [Documentación sobre tags en los templates](https://docs.djangoproject.com/en/2.1/ref/templates/builtins/) Los `% operador % {{ mi_variable }}` + +#### 10 Video. [Patrones de diseño](https://platzi.com/clases/1318-django/12407-patrones-de-diseno-y-django/) +- MVC Model View Controller +- Django es cercano al MVC +- **MTV** Model Template View. es el patrón de Django y tiene similitud con MVC + - Model Define la estructura de los datos + - Template Presentación de datos + - View Recupera los datos y los pasa al template + +#### 11 Video. [La M en el MTV](https://platzi.com/clases/1318-django/12408-la-quotmquot-en-el-mtv/) +- **settings.py** + - Configurando la bd [Doc. oficial](https://docs.djangoproject.com/en/2.1/ref/databases/) + - **Migraciones**. El mensaje: `You have 14 unaplied mig (...) to apply them` + - Detenemos el servidor http. + - comando: `\prj_python37\platzigram>py manage.py migrate` + ```js + # settings.py + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } + } + + # despues de ejecutar el comando: + Operations to perform: + Apply all migrations: admin, auth, contenttypes, sessions + Running migrations: + Applying contenttypes.0001_initial... OK + Applying auth.0001_initial... OK + Applying admin.0001_initial... OK + Applying admin.0002_logentry_remove_auto_add... OK + Applying admin.0003_logentry_add_action_flag_choices... OK + Applying contenttypes.0002_remove_content_type_name... OK + Applying auth.0002_alter_permission_name_max_length... OK + Applying auth.0003_alter_user_email_max_length... OK + Applying auth.0004_alter_user_username_opts... OK + Applying auth.0005_alter_user_last_login_null... OK + Applying auth.0006_require_contenttypes_0002... OK + Applying auth.0007_alter_validators_add_error_messages... OK + Applying auth.0008_alter_user_username_max_length... OK + Applying auth.0009_alter_user_last_name_max_length... OK + Applying sessions.0001_initial... OK + ``` + - ![db_django sqlite3 - SQLiteStudio](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/254x239/77c0d9fa7babde5f35cda87397a64b65/image.png) + - Django usa un ORM para trabjar con multiples sistemas de bd. + - Cramos un modelo de usuarios. + - [Doc. Campos](https://docs.djangoproject.com/en/2.1/ref/models/fields/) + ```js + ERRORS: + appposts.User.first_name: (fields.E120) CharFields must define a 'max_length' attribute. + appposts.User.last_name: (fields.E120) CharFields must define a 'max_length' attribute. + appposts.User.password: (fields.E120) CharFields must define a 'max_length' attribute. + ``` + - Despues de corregir el modelo + ```py + email = models.EmailField(unique=True) + password = models.CharField(max_length=100) + first_name = models.CharField(max_length=100) + last_name = models.CharField(max_length=100) + + bio = models.TextField(blank=True) #permite el campo vacio + birthdate = models.DateField(blank=True,null=True) + + created = models.DateTimeField(auto_now_add=True) + modified = models.DateTimeField(auto_now=True) + ``` + - Ejecutamos comando dentro de env: `python manage.py makemigrations`. + ```js + Migrations for 'appposts': + appposts\migrations\0001_initial.py + Create model User + + crea fichero en platzigram/appposts/migrations/0001_initial.py + se ejecuta el manage migrate + + python manage.py migrate + se ha creado la tabla **appposts_user** + ``` + - ![Tabla appposts_user](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/200x276/da4d0d55a93673bc80feb7c2dc272cac/image.png) + - makemigrations busca los cambios en nuestros modelos + - migrate aplica cambios en la bd + +#### 12 Video. [El ORM de Django](https://platzi.com/clases/1318-django/12409-el-orm-de-django/) +- Por defecto Django agrega un id a la tabla. Por esto no hemos definido un campo identificador en el modelo. +- Modificamos el modelo. Se crea campo **is_admin** +- **makemigrations** genera un nuevo fichero 0002_user_is_admin.py +- ![Nuevo campo is_admin](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/600x158/c5b3f5c56f579cf2a9554d21b569181f/image.png) +- ![Nuevo campo en sqlite](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/226x286/9fd63243c39be16b12a71c60ed55c665/image.png) +- Cargando el **shell de Django** +- En (.env): **`py manage.py shell`** +- ![shell python](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/784x68/d060e5f39142641f23268f476378407c/image.png) +```py +from appposts.models import User +eaf = User.objects.create( + email="hola@gmail.com", + password = "1234567", + first_name = "Eduardo", + last_name = "A.F" +) +eaf.email +eaf.id +eaf.pk +eaf.email = "eaf@email.com" +eaf.save() +eaf.created +eaf.modified + +art = User() +art.pk +art.email = "arturo@plzi.com" +art.first_name = "Arturo" +art.last_name = "Mrt" +art.password = "MSIComputer" +art.is_admin = True +art.save() + +art.delete() +``` + +- ![Dato creado](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/600x150/4160147625ee0a5944a32e37605c8816/image.png) +- Creando usuarios: +```py +from datetime import date + +users = [ + { + 'email': 'userone@anemail.com', + 'first_name': 'User O', + 'last_name': 'Ne', + 'password': '1234567', + 'is_admin': True + }, + { + 'email': 'usertwo@anemail.com', + 'first_name': 'Usr', + 'last_name': 'Twoo', + 'password': '987654321' + }, + { + 'email': 'userthree@anemail.com', + 'first_name': 'Usuario', + 'last_name': 'Tres', + 'password': 'qwerty', + 'birthdate': date(1990, 12,19) + }, + { + 'email': 'cuatro@anemail.com', + 'first_name': 'Un Usuario', + 'last_name': 'Cuatro', + 'password': 'msicomputer', + 'is_admin': True, + 'birthdate': date(1981, 11, 6), + 'bio': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." + } +] +from appposts.models import User +for user in users: + obj = User(**user) + obj.save() + print(obj.pk, ':', obj.email) +``` +- Obteniendo usuarios +```py +from appposts.models import User +user = User.objects.get(email="userone@anemail.com") + +users = User.objects.filter(email__endswith="@anemail.com") +users +users = User.objects.all() +users = User.objects.filter(email__endswith="@anemail.com").update(is_admin=True) +users +users = User.objects.filter(email__endswith="@anemail.com") +for u in users: + print(u.email,":",u.is_admin) +``` + +#### 13 Doc. [Glosario](https://platzi.com/clases/1318-django/12410-glosario6134/) +- Glosario de: ORM, Templates, Models. + +#### 14 Video. [Extendiendo el modelo de usuario](https://platzi.com/clases/1318-django/12411-extendiendo-el-modelo-de-usuario/) +- [Doc. Extending the existing User Model](https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#extending-the-existing-user-model) +- Debemos añadir la siguiente info: + - website + - biography + - phone_number + - profile picture + - created + - modified +- Vamos a crear una nueva app +- Primero borramos la bd: `rm db.sqlite3` +- `py manage.py startapp appusers` + - Nos crea una app parecida a appposts +- Agrego la nueva app en **settings.py** +- Modificamos **apps.py** (`/platzigram/appusers/apps.py`) `class UsersConfig(AppConfig):` +- Modificamos **models.py** + - `class Profile(models.Model):` Aqui se configuran los nuevos campos + - [appusers.models.py class Profile(models.Model):](https://github.com/eacevedof/prj_python37/blob/master/platzigram/appusers/models.py) + - La tabla asociada se llamará **appusers_profile** +- Definimos relación 1:1 **OneToOneField** + ```ssh + Applying contenttypes.0001_initial... OK + Applying auth.0001_initial... OK + Applying admin.0001_initial... OK + Applying admin.0002_logentry_remove_auto_add... OK + Applying admin.0003_logentry_add_action_flag_choices... OK + Applying appposts.0001_initial... OK + Applying appposts.0002_user_is_admin... OK + Applying contenttypes.0002_remove_content_type_name... OK + Applying auth.0002_alter_permission_name_max_length... OK + Applying auth.0003_alter_user_email_max_length... OK + Applying auth.0004_alter_user_username_opts... OK + Applying auth.0005_alter_user_last_login_null... OK + Applying auth.0006_require_contenttypes_0002... OK + Applying auth.0007_alter_validators_add_error_messages... OK + Applying auth.0008_alter_user_username_max_length... OK + Applying auth.0009_alter_user_last_name_max_length... OK + Applying sessions.0001_initial... OK + ``` +- Antes de ejecutar `makemigrations` hay que instalar **pillow** +- En (.env): `pip install pillow` Es necesario para campos tipo **imageField** +- `migrate` crea la tabla **app_users_profile** + - ![tabla app_users_profile](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/810x367/3d4eaf0b1aefdd7d9dc96182b7cc4d25/image.png) +- Se publica el modelo **Profile** + ```py + """platzigram/appusers/admin.py""" + from django.contrib import admin + # Register your models here. + from .models import Profile + admin.site.register(Profile) + ``` +- **Para entrar al panel de administración** + - [http://localhost:8000/admin/](http://localhost:8000/admin/) + - Hay que configurar la ruta así: (**urls.py**) + ```py + from django.urls import path + from django.contrib import admin + urlpatterns = [ + path('admin/', admin.site.urls), + ] + ``` + - (.env):`python manage.py createsuperuser` + ```js + # datos de acceso + Username: admin + Email address: admin@somedomain.com + Password: 1234 + Password (again): 1234 + Superuser created successfully. + ``` + - `createsuperuser` escribe en la tabla **auth_user** + - ![tabla auth_user](https://trello-attachments.s3.amazonaws.com/5b014dcaf4507eacfc1b4540/5c8401cf1c6b4163c9b2419b/90f79aa8eaeefab392d3ae3d06e082c2/image.png) + +#### 16 Video. [Explorando el dashboard de administración](https://platzi.com/clases/1318-django/12413-explorando-el-dashboard-de-administracion/) +- Registrando el **modelo Profile** en el administrador. #registrar modelo +- Para hacer que aparezca el modelo **Profile** en el panel de administración hay que tocar el fichero [**appusers.admin.py**](https://github.com/eacevedof/prj_python37/blob/master/platzigram/appusers/admin.py) +```py +@admin.register(Profile) +class ProfileAdmin(admin.ModelAdmin): + """Profile admin.""" + # esta variable configura la visualización de las columnas del grid + list_display = ("pk","user","phone_number","website","picture") + # botones de enlaces en el listado para que vaya al detalle del perfil + list_display_links = ("pk","user") + # permitir que se editen campos directamente en el grid de perfiles + # un campo o es un link o es editable + list_editable = ("phone_number","website","picture") + # campos por los que se desea buscar + search_fields = ("user__username","user__email","user__first_name","user__last_name","phone_number") + # filtros + list_filter = ("user__is_active","user__is_staff","created","modified",) +``` + +#### 17 Video. [Dashboard de Administración](https://platzi.com/clases/1318-django/12414-dashboard-de-administracion/) +- Se adapta el [**admin.py**](https://github.com/eacevedof/prj_python37/blob/master/platzigram/appusers/admin.py) con las siguientes lineas, estas permiten interactuar en la ficha del usuario con los campos del perfil. +- Cuando se cree un usuario se podra ingresar datos del perfil. +- Estos pasos están en la doc oficial de python. (link más arriba) +- **admin.StackedInline** +```py + # configuración del detalle del perfil + fieldsets = ( + # Profile es el texto de la barra azul + ("Profile",{ + "fields":( + ("user","picture"), + # ("phone_number", "website"), + ), + }), + ("Extra info", { + "fields": ( + ("website", "phone_number"), + ("biography"), + ), + }), + ("Metadata", { + "fields": ( + ("created", "modified"), + ), + }), + ) + + # para poder declarar los campos como metadata deben estar en readonly_fields ya que estos no + # se pueden modificar + readonly_fields = ("created","modified") + +# sirve para gestionar el perfil en el detalle del usuario +class ProfileInline(admin.StackedInline): + """Profile in-line admin for users""" + model = Profile + can_delete = False + verbose_name_plural = "Profiles INLINE" + +class UserAdmin(BaseUserAdmin): + """Add profile admin to base user admin """ + inlines = (ProfileInline,) + list_display = ("username","email","first_name","last_name","is_active","is_staff") + +admin.site.unregister(User) +admin.site.register(User,UserAdmin) +``` + +#### 18 Video. [Creación del modelo de posts](https://platzi.com/clases/1318-django/12415-creacion-del-modelo-de-posts/) +- `# .` para evitar referencias circulares + - `profile = models.ForeignKey("appusers.Profile",on_delete=models.CASCADE)` +- Una vez definido el modelo (en .env): + - `py manage.py makemigrations` #crea el fichero de migracion + - `py manage.py migrate` #crea la tabla en la bd + - `py manage.py runserver` + - ![Tabla appposts_post](https://trello-attachments.s3.amazonaws.com/5c8401cf1c6b4163c9b2419b/326x269/08875254125365aef5f6db7c57af9445/image.png) +- Queda registrar el **modelo Posts** en el administador (reto) + ```py + #platzigram/appposts/admin.py + from django.contrib import admin + # Models + from .models import Post + admin.site.register(Post) + ``` +- Queda corregir la visualizacion de la imagén del usuario en el administrador + - Cuando se hace click sobre el nos lleva a la raiz del administrador + - Django por defecto no esta preparado para servir "la media" + - Para esto hay que usar un hack + - `] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)` + - Hay que editar las URLS urls.py y settings.py + - En settings.py se definen dos nuevas rutas, que le indicarán a Django que cada vez que se pida un archivo de **media** debe buscar en esas rutas +- La imagen se ha subido a: + - `/platzigram/media/users/pictures/bob-sponja.jpg` + +#### 19 Video. [Templates y archivos estáticos](https://platzi.com/clases/1318-django/12416-templates-y-archivos-estaticos/) +- Vamos a juntar todos los estilos y templates +- La barra de navegación se va a mantener mientras se navega por la app. +- Mientras se hace login se mantiene el contenedor con el logo +- Una **app reutilizable**. Tiene todos los componentes dentro de ella y es portable. +- Creamos una carpeta que se comparta por todas nuestras apps. +- Tenemos que inidcar a Django que nuestros templates estarán en dicha carpeta. (**settings.py - TEMPLATES.DIRS**) + - `os.path.join(BASE_DIR,"templates")` +- Carpeta templates: + ```js + ├───templates + │ ├───posts + │ └───users + ``` +- Movemos **feed.html** dentro de **posts** +- Descomponemos feed en plantillas + ```js + ├───templates + │ base.html + │ nav.html + ├───posts + │ feed.html + └───users + base.html + ``` +- En settings.py + ```py + # ruta de donde se recuperarán las vistas + 'DIRS': [ + os.path.join(BASE_DIR,"templates") + ], + ... + # se configura la ruta estatica real + STATICFILES_DIRS = ( + os.path.join(BASE_DIR,"static"), + ) + STATICFILES_FINDERS = [ + "django.contrib.staticfiles.finders.FileSystemFinder", + "django.contrib.staticfiles.finders.AppDirectoriesFinder" + ] + ``` +- En `templates.base.html` + ```html + {% block head_content %}{% endblock %} + {% load static %} + ... + {% include "nav.html" %} +
    + {% block container %} + {% endblock %} +
    + ``` +- En `posts.feeds.html` **{% extends "base.html" %} ** + ```html + {% extends "base.html" %} + + {% block head_content %} + Platzigram feed + {% endblock %} + + {% block container %} +
    + {% for post in posts %} +
    + ... +
    + {% endfor %} +
    + {% endblock %} + ``` + +#### 20 Video. [Login](https://platzi.com/clases/1318-django/12417-login/) +- Vamos a implementar nuestro login y restringir el acceso al Feed +- Como autenticar peticiones web + - Se usa el middleware de sesión (el filtro que tiene que pasar la petición) + - Este middleware nos proveera de **request.user.is_authenticated** + - Se usa el módulo: `django.contrib.auth`: funciones: `authenticate, login` + - Recibimos en request.POST las variables de acceso y las evaluamos con la función authenticate(...) + - Si todo ha ido bien guardamos el usuario como "logado" con la fn: login(r,u) +- La pantalla de login está conformada por dos templates. Base y Login +- Se retocan las rutas y se aplica alias con name="" de modo que se les pueda tener identificadas en caso de que cambien + - Ejemplo en el form + - `
    ` +- En los forms hay que usar `{% csrf_token %}` +- Para poder hacer redirecciones se usa: `from django.shortcuts import render, redirect` + - En la vista: `return redirect()` +- Para los redirects en caso de no estar "logado" se configura en settings.py + - `LOGIN_URL = "/users/login/"` +- Para hacer el redirect según la sesión se usa en la vista de posts + ```py + from django.contrib.auth.decorators import login_required + ... + @login_required + def list_posts(request): + return render(request,"posts/feed.html",{"posts":posts}) + ``` + +#### 21 Video. [Logout](https://platzi.com/clases/1318-django/12418-logout6923/) +- Para saber como "deslogar" un usuario se puede consultar la [doc how to log a suer out](https://docs.djangoproject.com/en/2.2/_modules/django/contrib/auth/#logout) +- Creamos la ruta `users/logout` +- Creamos una vista en el módulo de usuarios (`appusers.views.py`): **logout_view** +- Se hace redirect al login en el logout. +- Se usa el docorador **login_required** `from django.contrib.auth.decorators import login_required` para evitar que haga logout de una sesión inexistente. + +#### 22 Video. [Signup](https://platzi.com/clases/1318-django/12419-signup/) +- Comprobamos la doc oficial [creating users](https://docs.djangoproject.com/en/2.2/topics/auth/default/#creating-users) +- Se necesita: + - django.contrib.auth.models +- El modelo de usuarios (`appusers.models.py`) extiende usando un modelo proxy +- Django tiene señales (**signals**), que son como triggers, cada vez que se crea un usuario entonces creale un perfil. +- Definimos una ruta `users/signup` +- Creamos la **vista y el template signup** +- Configuramos el método **signup_view(request)** +- No sé, si controlando la excepción, es la única forma de comprobar que ya existe el **username** +```py +# try ya que puede fallar si ya existiera el username +try: + user = User.objects.create_user(username = username,password = passw) +except IntegrityError: + return render(request,"users/signup.html", {"error":"Username already exists"}) +``` +#### 23 Video. [Middlewares](https://platzi.com/clases/1318-django/12420-middlewares9277/) +- Qué son los middlewares. +- Cómo funcionan. +- Qué nos ayudan a resolver. +- **Definición** + - Es una serie de hooks y una API de bajo nivel que permiten modificar el objeto **`REQUEST y RESPONSE`** antes de que llegue a la vista y despues de que salga de la vista. +- [Django doc - Writing your own middleware](https://docs.djangoproject.com/en/2.2/topics/http/middleware/#writing-your-own-middleware) +```py +def simple_middleware(get_response): + # One-time configuration and initialization. + def middleware(request): + # Code to be executed for each request before + # the view (and later middleware) are called. + response = get_response(request) + # Code to be executed for each request/response after + # the view is called. + return response + return middleware +``` +- También se puede usar clases para su interceptación +- Tienen varios métodos +- En **settings.py.MIDDLEWARE (lista)** se definen los middlewares + - SecurityMiddleware + - SessionMiddleware + - CommonMiddleware (debug) + - CsrfViewMiddleware (token) + - AuthenticationMiddleware (request.user o anonymous user de las vistas) + - MessageMiddleware (mensajes de django, te permite definir un mensaje para una petición sin necesidad de mantener un estado) + - XFramewOptionsMiddleware (seguridad para clickjacking) +- Crearemos nuestro propio middleware que: + - Nos va a decir que si el usuario no tiene una foto de perfil o no tiene biografia no puede usar la plataforma. +- Definimos ruta `users/me/profile` +- Una vista **users_profile.html** +- Un middleware **platzigram/middleware.py.ProfileCompletionMiddleware** +```py +"""platzigram\middleware.py""" +import pdb +from django.shortcuts import redirect +from django.urls import reverse + +class ProfileCompletionMiddleware: + def __init__(self, fn_get_response): + self.get_response = fn_get_response + + # __call__ implements function call operator. + # de modo que se pueda hacer un o = Foo() o(call_arg1,call_arg2...) + def __call__(self, request): + if not request.user.is_anonymous: + profile = request.user.profile + if not profile.picture or not profile.biography: + # si la url es update_profile o logout no se aplica el redirect + if request.path not in [reverse("update_profile"),reverse("logout")]: + return redirect("update_profile") + + # pdb.set_trace() + # get_response es una función + response = self.get_response(request) + return response +``` + +#### 24 Video. [Formularios en Django](https://platzi.com/clases/1318-django/12421-formularios-en-django6487/) +- [Doc. Froms in Django](https://docs.djangoproject.com/en/2.2/topics/forms/#django-s-role-in-forms) +- La clase utilitaria para formularios de Django nos ayuda a resolver mucho del trabajo que se realiza de forma repetitiva. La forma de implementarla es muy similar a la implementación de la clase models.model. +- Algunas de las clases disponibles en Django al implementar form, son: + - BooleanField + - CharField + - ChoiceField + - TypedChoiceField + - DateField + - DateTimeField + - DecimalField + - EmailField + - FileField + - ImageField +- La validación en el formulario se hará de forma más automática, usando solo la clase forms.Form y el objeto request. En forms.Form se configurarán los **filtros** del request. +- Se usarán las siguientes clases: **ModelForm** y **forms.Form** +- En la doc indica como crear un formulario +- Se define un fichero: **appusers.forms.py** que es una clase tipo: `class NameForm(forms.Form):` + - Como atributos se toman los campos con sus respectivas validaciones + - `your_name = forms.CharField(label="Your name",max_length=100)` +- En **views.py** + - En el método con parámetro **request** + - Se crea una instancia de la clase **forms.Form(request.POST)** + - Para validar solo se usa el método **form.is_valid()** + - [Doc. validar campos en forms](https://docs.djangoproject.com/en/2.2/ref/forms/fields/) + - Para configurar las validaciones nos podemos apoyar en las restricciones de configuración del módelo +- Cuando se envia datos con **enctype="multipart/form-data"** las imágenes no llegan en **request.POST** sino en **request.FILES** +- Otra cosa importante es que cuando recargamos no reenviamos el formulario esto es gracias al **redirect**. Esto hace que lo que recarguemos seá la última petición, que es un GET. +- `{% load static %}` +- `` + +#### 25 Video. [Mostrando el form en el template](https://platzi.com/clases/1318-django/12396-mostrando-el-form-en-el-template/) +- [Doc. Working with form templates](https://docs.djangoproject.com/en/2.2/topics/forms/#working-with-form-templates) +- Se controlan los errores usando `form..errors` y `form..value` +- Los bucles y las comprobaciones se limitan solo al metalenguaje de jinja2 + +```py +
    + + +
    + {% for error in form.biography.errors %} + {{ error }} + {% endfor %} +
    +
    +``` +- Se crearán elementos para evitar repeticiones innecesarias + +#### 26 Video. [Model forms](https://platzi.com/clases/1318-django/12422-model-forms/) +- ModelForm es una manera más sencilla de crear formularios en Django y en el caso de nuestro proyecto, se adapta mucho mejor al modelo que ya tenemos. +- Lo usaremos para crear el formulario de posts. +Aprovecharemos para refinar la funcionalidad en el navbar y conectar el feed con los posts. +- Se crea el model forms: +```py +# appposts\forms.py +# Django +from django import forms +# models +from appposts.models import Post + +class PostForm(forms.ModelForm): + """Post model form.""" + + class Meta: + "Form settings" + model = Post + fields = ("user","profile","title","photo") + +# diferencia con appusers\forms.py +from django import forms + +class ProfileForm(forms.Form): + """Profile form.""" + # para estas validaciones nos podemos apoyar en la configuración del modelo + website = forms.URLField(max_length=200, required=True) + biography = forms.CharField(max_length=500, required=False) + phone_number = forms.CharField(max_length=20, required=False) + picture = forms.ImageField() +``` +- Model Forms está pensado para una validación directa con el modelo, un tipo de CRUD estandar. + + +## Notas +- `django-admin startproject platzigram .` Creación de un proyecto de Django +- `(env) ~/platzigram con py manage.py startapp appposts` Creación de una app en Django + - **8 Video.** Tengo que recuperar la **subcarpeta** borrada platzigram + - Hago copia del proyecto + - ejecuto: **`git checkout feea6ec -- platzigram/platzigram`** donde `` es el último punto donde existía la subcarpeta platzigram. + - Reemplazo los ficheros con el backup. +- Me daba este error: + - MEDIA_ROOT error : _getfullpathname: path should be string, bytes or os.PathLike, not tuple + - Tengo que tener cuidado con las `,` despues de una asignación pq aunque parezca un simple string se transforma en una tupla +- Me daba este error: + - dictionary update sequence element #0 has length 1; 2 is required + - habia que pasar como alias de la ruta el parámetro name="alias" y no solamente "alias" + + diff --git a/platzigram/appposts/admin.py b/platzigram/appposts/admin.py index 8c38f3f3..ca853cbb 100644 --- a/platzigram/appposts/admin.py +++ b/platzigram/appposts/admin.py @@ -1,3 +1,7 @@ +""" +platzigram/appposts/admin.py +""" from django.contrib import admin - -# Register your models here. +# Models +from .models import Post +admin.site.register(Post) \ No newline at end of file diff --git a/platzigram/appposts/forms.py b/platzigram/appposts/forms.py new file mode 100644 index 00000000..da34f673 --- /dev/null +++ b/platzigram/appposts/forms.py @@ -0,0 +1,17 @@ +""" +appposts\forms.py +Post forms. +""" + +# Django +from django import forms +# models +from appposts.models import Post + +class PostForm(forms.ModelForm): + """Post model form.""" + + class Meta: + "Form settings" + model = Post + fields = ("user","profile","title","photo") \ No newline at end of file diff --git a/platzigram/appposts/migrations/0003_auto_20190330_1358.py b/platzigram/appposts/migrations/0003_auto_20190330_1358.py new file mode 100644 index 00000000..26ec2aa4 --- /dev/null +++ b/platzigram/appposts/migrations/0003_auto_20190330_1358.py @@ -0,0 +1,36 @@ +# Generated by Django 2.1.7 on 2019-03-30 12:58 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('appusers', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('appposts', '0002_user_is_admin'), + ] + + operations = [ + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('photo', models.ImageField(upload_to='posts/photos')), + ('created', models.DateTimeField(auto_now_add=True)), + ('modified', models.DateTimeField(auto_now=True)), + ('profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='appusers.Profile')), + ], + ), + migrations.DeleteModel( + name='User', + ), + migrations.AddField( + model_name='post', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/platzigram/appposts/models.py b/platzigram/appposts/models.py index 6efa2b92..3c858c34 100644 --- a/platzigram/appposts/models.py +++ b/platzigram/appposts/models.py @@ -1,21 +1,30 @@ """ +DJANGO /platzigram/appposts/models.py """ from django.db import models +from django.contrib.auth.models import User -# Create your models here. -class User(models.Model): - """User model.""" - email = models.EmailField(unique=True) - password = models.CharField(max_length=100) - first_name = models.CharField(max_length=100) - last_name = models.CharField(max_length=100) - is_admin = models.BooleanField(default=False) +# video 18 +# appposts.models.post +class Post(models.Model): + """Post Model""" + user = models.ForeignKey(User, on_delete=models.CASCADE) + # . para evitar referencias circulares + profile = models.ForeignKey("appusers.Profile",on_delete=models.CASCADE) - bio = models.TextField(blank=True) - birthdate = models.DateField(blank=True,null=True) + title = models.CharField(max_length=255) + photo = models.ImageField(upload_to="posts/photos") created = models.DateTimeField(auto_now_add=True) - modified = models.DateTimeField(auto_now=True) \ No newline at end of file + modified = models.DateTimeField(auto_now=True) + + def __str__(self): + """Returns the Post data""" + return "user: {},profile: {},title: {},photo: {},created: {},modified: {}".format( + self.user,self.profile,self.title,self.photo,self.created,self.modified + ) + + diff --git a/platzigram/appposts/templates/feed.html b/platzigram/appposts/templates/feed.html deleted file mode 100644 index 4f482792..00000000 --- a/platzigram/appposts/templates/feed.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - Posts - - -

    -
    -
    - {% for post in posts %} -
    -
    - {{ post.user.name }} -
    -
    {{ post.user.name }}
    - {{ post.timestamp }} -
    -
    - {{ post.title }} -
    {{ post.title }}
    -
    - {% endfor %} -
    -
    - - - - - - - - - diff --git a/platzigram/appposts/views.py b/platzigram/appposts/views.py index 66d504be..3ad88906 100644 --- a/platzigram/appposts/views.py +++ b/platzigram/appposts/views.py @@ -1,44 +1,42 @@ -""""/appposts/views.py""" - -# imports Django -# from django.http import HttpResponse -from django.shortcuts import render - - -# utilities -from datetime import datetime - -posts = [ - { - "title": "Mont Blanc", - "user": { - "name": "User Name 10", - "picture": "https://randomuser.me/api/portraits/men/10.jpg", - }, - "timestamp": datetime.now().strftime("%b %dth, %Y - %H:%M hrs"), - "photo": "https://picsum.photos/200/200/?image=1036", - }, - { - "title": "Vía Láctea", - "user": { - "name": "User Name 20", - "picture": "https://randomuser.me/api/portraits/men/20.jpg", - }, - "timestamp": datetime.now().strftime("%b %dth, %Y - %H:%M hrs"), - "photo": "https://picsum.photos/200/200/?image=903", - }, - { - "title": "Nuevo Auditorio", - "user": { - "name": "User Name 30", - "picture": "https://randomuser.me/api/portraits/men/30.jpg", - }, - "timestamp": datetime.now().strftime("%b %dth, %Y - %H:%M hrs"), - "photo": "https://picsum.photos/200/200/?image=1076", - } -] - -def list_posts(request): - """List existing posts""" - - return render(request,"feed.html",{"posts":posts}) +""""/appposts/views.py""" + +# imports Django +import sys +from pprint import pprint +from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect + +# Models +from appposts.models import Post + +# Form +from appposts.forms import PostForm + +@login_required +def list_posts(request): + """List existing posts""" + posts = Post.objects.all().order_by("-created") + # pprint(posts) + # sys.exit() + return render(request,"posts/feed.html",{"posts":posts}) + +@login_required +def create_post(request): + """Create new post""" + if request.method == "POST": + form = PostForm(request.POST,request.FILES) + if form.is_valid(): + form.save() + return redirect("feed") + else: + form = PostForm() + + return render( + request=request, + template_name="posts/new.html", + context={ + "form": form, + "user": request.user, + "profile": request.user.profile + } + ) diff --git a/platzigram/appusers/admin.py b/platzigram/appusers/admin.py index 6b67c185..b779b719 100644 --- a/platzigram/appusers/admin.py +++ b/platzigram/appusers/admin.py @@ -1,5 +1,67 @@ """platzigram/appusers/admin.py""" from django.contrib import admin -# Register your models here. +from django.contrib.auth.admin import UserAdmin as BaseUserAdmin + +# Models +from django.contrib.auth.models import User from .models import Profile -admin.site.register(Profile) \ No newline at end of file +# admin.site.register(Profile) + +#Para registrarlo en una sola linea se usa el decorador y se le pasa el modelo +@admin.register(Profile) +class ProfileAdmin(admin.ModelAdmin): + """Profile admin.""" + # esta variable configura la visualización de las columnas del grid + list_display = ("pk","user","phone_number","website","picture") + # botones de enlaces en el listado para que vaya al detalle del perfil + list_display_links = ("pk","user") + # permitir que se editen campos directamente en el grid de perfiles + # un campo o es un link o es editable + list_editable = ("phone_number","website","picture") + # campos por los que se desea buscar + search_fields = ("user__username","user__email","user__first_name","user__last_name","phone_number") + # filtros + list_filter = ("user__is_active","user__is_staff","created","modified",) + + # configuración del detalle del perfil + fieldsets = ( + # Profile es el texto de la barra azul + ("Profile",{ + "fields":( + ("user","picture"), + # ("phone_number", "website"), + ), + }), + ("Extra info", { + "fields": ( + ("website", "phone_number"), + ("biography"), + ), + }), + ("Metadata", { + "fields": ( + ("created", "modified"), + ), + }), + ) + + # para poder declarar los campos como metadata deben estar en readonly_fields ya que estos no + # se pueden modificar + readonly_fields = ("created","modified") + +# sirve para gestionar el perfil en el detalle del usuario +class ProfileInline(admin.StackedInline): + """Profile in-line admin for users""" + model = Profile + can_delete = False + verbose_name_plural = "Profiles INLINE" + + +class UserAdmin(BaseUserAdmin): + """Add profile admin to base user admin """ + inlines = (ProfileInline,) + list_display = ("username","email","first_name","last_name","is_active","is_staff") + + +admin.site.unregister(User) +admin.site.register(User,UserAdmin) diff --git a/platzigram/appusers/forms.py b/platzigram/appusers/forms.py new file mode 100644 index 00000000..ee401bb0 --- /dev/null +++ b/platzigram/appusers/forms.py @@ -0,0 +1,13 @@ +""" +platzigram\appusers\forms.py +User.forms +""" +from django import forms + +class ProfileForm(forms.Form): + """Profile form.""" + # para estas validaciones nos podemos apoyar en la configuración del modelo + website = forms.URLField(max_length=200, required=True) + biography = forms.CharField(max_length=500, required=False) + phone_number = forms.CharField(max_length=20, required=False) + picture = forms.ImageField() \ No newline at end of file diff --git a/platzigram/appusers/views.py b/platzigram/appusers/views.py index 91ea44a2..e0bbab7d 100644 --- a/platzigram/appusers/views.py +++ b/platzigram/appusers/views.py @@ -1,3 +1,108 @@ -from django.shortcuts import render - -# Create your views here. +""" +platzigram/appusers/views.py +""" +from pprint import pprint +from django.contrib.auth import authenticate, login, logout +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required +from django.db.utils import IntegrityError +import pdb + +#Models +from django.contrib.auth.models import User +from appusers.models import Profile + +# Forms +from appusers.forms import ProfileForm + +@login_required +def update_profile(request): + """Update a users profile view.""" + pprint(request.FILES) + profile = request.user.profile + + if request.method == "POST": + form = ProfileForm(request.POST, request.FILES) + if form.is_valid(): + data = form.cleaned_data + profile.website = data["website"] + profile.phone_number = data["phone_number"] + profile.biography = data["biography"] + profile.picture = data["picture"] + profile.save() + + pprint("profile") + pprint(profile) + + return redirect("update_profile") + else: + form = ProfileForm() + + return render( + request=request + ,template_name="users/update_profile.html", + context = { + "profile": profile, + "user": request.user, + "form": form + }) + + +def login_view(request): + """Login view.""" + if request.method == "POST": + print("*" * 10) + username = request.POST["username"] + password = request.POST["password"] + print(username,":",password) + print("*" * 10) + user = authenticate(request,username=username,password=password) + if user: + print("logged") + login(request, user) + return redirect("feed") + else: + print("bad loggin") + return render(request, "users/login.html", {"error":"Invalid username and password"}) + + return render(request, "users/login.html") + +@login_required +def logout_view(request): + """ + Logout a user. + """ + logout(request) + return redirect("login") + +def signup_view(request): + """Sign up view""" + # pdb.set_trace() # pausa la consola para meter comandos de depuración: request.POST + + if request.method == "POST": + username = request.POST["signup-username"] + passw = request.POST["signup-password"] + password_confirmation = request.POST["signup-password-confirmation"] + + if passw != password_confirmation: + return render(request,"users/signup.html",{"error":"Pass confrimation does not match!"}) + + # try ya que puede fallar si ya existiera el username + try: + user = User.objects.create_user(username = username,password = passw) + except IntegrityError: + return render(request,"users/signup.html", {"error":"Username already exists"}) + + #despues de guardar el usuario en la bd + user.first_name = request.POST["signup-firstname"] + user.last_name = request.POST["signup-lastname"] + user.email = request.POST["signup-email"] + user.save() + + #creamos inmediatamente el perfil + profile = Profile(user=user) + profile.save() + return redirect("login") + + return render(request,"users/signup.html") + diff --git a/platzigram/db.sqlite3 b/platzigram/db.sqlite3 index cc72cae7..e8aa8701 100644 Binary files a/platzigram/db.sqlite3 and b/platzigram/db.sqlite3 differ diff --git a/platzigram/favicon.ico b/platzigram/favicon.ico new file mode 100644 index 00000000..cec7f94b Binary files /dev/null and b/platzigram/favicon.ico differ diff --git a/platzigram/media/posts/photos/calamardo.jpg b/platzigram/media/posts/photos/calamardo.jpg new file mode 100644 index 00000000..ed02a34b Binary files /dev/null and b/platzigram/media/posts/photos/calamardo.jpg differ diff --git a/platzigram/media/posts/photos/heman.jpg b/platzigram/media/posts/photos/heman.jpg new file mode 100644 index 00000000..e7f03772 Binary files /dev/null and b/platzigram/media/posts/photos/heman.jpg differ diff --git a/platzigram/media/posts/photos/simpson.jpg b/platzigram/media/posts/photos/simpson.jpg new file mode 100644 index 00000000..f90ecbd0 Binary files /dev/null and b/platzigram/media/posts/photos/simpson.jpg differ diff --git a/platzigram/media/posts/photos/viking.jpg b/platzigram/media/posts/photos/viking.jpg new file mode 100644 index 00000000..ac87525a Binary files /dev/null and b/platzigram/media/posts/photos/viking.jpg differ diff --git a/platzigram/media/users/pictures/bob-sponja.jpg b/platzigram/media/users/pictures/bob-sponja.jpg new file mode 100644 index 00000000..cb61b5ef Binary files /dev/null and b/platzigram/media/users/pictures/bob-sponja.jpg differ diff --git a/platzigram/media/users/pictures/imagenes-de-patricio-estrella4.jpg b/platzigram/media/users/pictures/imagenes-de-patricio-estrella4.jpg new file mode 100644 index 00000000..64b110b1 Binary files /dev/null and b/platzigram/media/users/pictures/imagenes-de-patricio-estrella4.jpg differ diff --git a/platzigram/media/users/pictures/imagenes-de-patricio-estrella4_FwEpg6q.jpg b/platzigram/media/users/pictures/imagenes-de-patricio-estrella4_FwEpg6q.jpg new file mode 100644 index 00000000..64b110b1 Binary files /dev/null and b/platzigram/media/users/pictures/imagenes-de-patricio-estrella4_FwEpg6q.jpg differ diff --git a/platzigram/media/users/pictures/planta.jpg b/platzigram/media/users/pictures/planta.jpg new file mode 100644 index 00000000..7b19ffc9 Binary files /dev/null and b/platzigram/media/users/pictures/planta.jpg differ diff --git a/platzigram/platzigram/middleware.py b/platzigram/platzigram/middleware.py new file mode 100644 index 00000000..05819390 --- /dev/null +++ b/platzigram/platzigram/middleware.py @@ -0,0 +1,36 @@ +"""platzigram\middleware.py""" + +# Django +import pdb +from django.shortcuts import redirect +from django.urls import reverse + +class ProfileCompletionMiddleware: + """Profile completion middleware + + Ensure every user that has picture and biography + """ + + def __init__(self, fn_get_response): + self.get_response = fn_get_response + + # __call__ implements function call operator. + # de modo que se pueda hacer un o = Foo() o(call_arg1,call_arg2...) + def __call__(self, request): + """Code to be executed for each request before the view is called.""" + if not request.user.is_anonymous: + # esta linea evita que se redirija a la pantalla de perfil si es del staff (auth_user.is_staff) + if not request.user.is_staff: + profile = request.user.profile + # pdb.set_trace() + if not profile.picture or not profile.biography: + # si la url es update_profile o logout no se aplica el redirect + if request.path not in [reverse("update_profile"),reverse("logout")]: + return redirect("update_profile") + + # pdb.set_trace() + # get_response es una función + response = self.get_response(request) + return response + + diff --git a/platzigram/platzigram/settings.py b/platzigram/platzigram/settings.py index e8219bc4..a2d930db 100644 --- a/platzigram/platzigram/settings.py +++ b/platzigram/platzigram/settings.py @@ -1,126 +1,145 @@ -""" -Django settings for platzigram project. - -Generated by 'django-admin startproject' using Django 2.1.7. - -For more information on this file, see -https://docs.djangoproject.com/en/2.1/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/2.1/ref/settings/ -""" - -import os - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '7b=+k1hav%m+_42bdi-+3h9==wgr0k+=uc+#&#)4ism&4e_)0o' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -INSTALLED_APPS = [ - # Django apps - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - - # Local apps - "appposts", #hace referencia al módulo /appposts - "appusers", - -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'platzigram.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'platzigram.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/2.1/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } -} - - -# Password validation -# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/2.1/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/2.1/howto/static-files/ - -STATIC_URL = '/static/' +""" +Django settings for platzigram project. + +Generated by 'django-admin startproject' using Django 2.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '7b=+k1hav%m+_42bdi-+3h9==wgr0k+=uc+#&#)4ism&4e_)0o' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + # Django apps + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + # Local apps + "appposts", #hace referencia al módulo /appposts + "appusers", + +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'platzigram.middleware.ProfileCompletionMiddleware', +] + +ROOT_URLCONF = 'platzigram.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + os.path.join(BASE_DIR,"templates") + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'platzigram.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + +STATIC_URL = '/static/' + +STATICFILES_DIRS = ( + os.path.join(BASE_DIR,"static"), +) +STATICFILES_FINDERS = [ + "django.contrib.staticfiles.finders.FileSystemFinder", + "django.contrib.staticfiles.finders.AppDirectoriesFinder" +] + + +# BASE_DIR: /platzigram +MEDIA_ROOT = os.path.join(BASE_DIR,"media") # /platzigram/media + +MEDIA_URL = "/media/" # midominio.com/media/ + +LOGIN_URL = "/users/login/" diff --git a/platzigram/platzigram/urls.py b/platzigram/platzigram/urls.py index f7c02179..a6142060 100644 --- a/platzigram/platzigram/urls.py +++ b/platzigram/platzigram/urls.py @@ -1,13 +1,29 @@ -"""urls.py""" -from django.urls import path -from django.contrib import admin -from platzigram import views as local_views -from appposts import views as posts_views - -urlpatterns = [ - path('admin/', admin.site.urls), - path("hello-world/",local_views.hello_world), - path("sorted/",local_views.sort_integers), - path("hi///",local_views.say_hi), - path("posts/",posts_views.list_posts), -] +"""urls.py""" +from django.urls import path +from django.contrib import admin +# sirve para poder dar soporte a datos tipo mime +from django.conf.urls.static import static + +# imports de la app +# settings es el fichero platizgram/settings.py +from django.conf import settings +from platzigram import views as local_views +from appposts import views as posts_views +from appusers import views as users_views + +urlpatterns = [ + +# PUBLICO + path("", local_views.hello_world, name="home"), + path("sorted/", local_views.sort_integers, name="sort"), + path("posts/", posts_views.list_posts, name="feed"), + path("posts/new/", posts_views.create_post, name="create_post"), + +# ADMIN + path('admin/', admin.site.urls), + path("users/login/", users_views.login_view, name="login"), + path("users/logout/", users_views.logout_view, name="logout"), + path("users/signup/", users_views.signup_view, name="signup"), + path("users/me/profile/", users_views.update_profile, name="update_profile"), + +] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT) diff --git a/platzigram/posts/photos/Bob_Esponja_Calamardo.png b/platzigram/posts/photos/Bob_Esponja_Calamardo.png new file mode 100644 index 00000000..d1625649 Binary files /dev/null and b/platzigram/posts/photos/Bob_Esponja_Calamardo.png differ diff --git a/platzigram/static/css/bootstrap.min.css b/platzigram/static/css/bootstrap.min.css new file mode 100644 index 00000000..34b8df3f --- /dev/null +++ b/platzigram/static/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.333333%;max-width:8.333333%}.col-2{flex:0 0 16.666667%;max-width:16.666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.333333%;max-width:33.333333%}.col-5{flex:0 0 41.666667%;max-width:41.666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.333333%;max-width:58.333333%}.col-8{flex:0 0 66.666667%;max-width:66.666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.333333%;max-width:83.333333%}.col-11{flex:0 0 91.666667%;max-width:91.666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .tooltip-arrow,.bs-tooltip-right .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .tooltip-arrow::before,.bs-tooltip-right .tooltip-arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .tooltip-arrow,.bs-tooltip-left .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .tooltip-arrow::before,.bs-tooltip-left .tooltip-arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.popover-arrow,.bs-popover-right>.popover-arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.popover-arrow::before,.bs-popover-right>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.popover-arrow::after,.bs-popover-right>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.popover-arrow,.bs-popover-left>.popover-arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.popover-arrow::before,.bs-popover-left>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.popover-arrow::after,.bs-popover-left>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/platzigram/static/css/main.css b/platzigram/static/css/main.css new file mode 100644 index 00000000..e69de29b diff --git a/platzigram/static/img/default-profile.png b/platzigram/static/img/default-profile.png new file mode 100644 index 00000000..f81f4844 Binary files /dev/null and b/platzigram/static/img/default-profile.png differ diff --git a/platzigram/static/img/instagram.png b/platzigram/static/img/instagram.png new file mode 100644 index 00000000..0462d391 Binary files /dev/null and b/platzigram/static/img/instagram.png differ diff --git a/platzigram/templates/base.html b/platzigram/templates/base.html new file mode 100644 index 00000000..f8d1edfc --- /dev/null +++ b/platzigram/templates/base.html @@ -0,0 +1,25 @@ + + + + + + {% block head_content %}{% endblock %} + + {% load static %} + + + + + + {% include "nav.html" %} + +
    + {% block container %} + {% endblock %} +
    + + + + + + \ No newline at end of file diff --git a/platzigram/templates/nav.html b/platzigram/templates/nav.html new file mode 100644 index 00000000..58a4d77b --- /dev/null +++ b/platzigram/templates/nav.html @@ -0,0 +1,56 @@ + +{% load static %} + + + \ No newline at end of file diff --git a/platzigram/templates/posts/feed.html b/platzigram/templates/posts/feed.html new file mode 100644 index 00000000..5f002fc4 --- /dev/null +++ b/platzigram/templates/posts/feed.html @@ -0,0 +1,35 @@ + +{% extends "base.html" %} + +{% block head_content %} + Platzigram +{% endblock%} + +{% block container %} +
    +
    + {% for post in posts %} +
    +
    + {{ post.user.get_full_name }} +
    +

    {{ post.user.get_full_name }}

    +
    +
    + + {{ post.title }} + +

    + + + 30 likes +

    +

    + {{ post.title }} - {{ post.created }} +

    +
    + {% endfor %} +
    +
    +{% endblock %}} + \ No newline at end of file diff --git a/platzigram/templates/posts/new.html b/platzigram/templates/posts/new.html new file mode 100644 index 00000000..3f497cb9 --- /dev/null +++ b/platzigram/templates/posts/new.html @@ -0,0 +1,57 @@ + +{% extends "base.html" %} + +{% block head_content %} + +Create new Post + +{% endblock %} + +{% block container %} +
    +
    +
    +

    Post a new photo!

    + + + {% csrf_token %} + + + + + {# Website field #} +
    + +
    + {% for error in form.title.errors %}{{ error }}{% endfor %} +
    +
    + + {# Photo field #} +
    + + +
    + {% for error in form.photo.errors %}{{ error }}{% endfor %} +
    +
    + + + +
    +
    +
    +{% endblock %} + \ No newline at end of file diff --git a/platzigram/templates/users/base.html b/platzigram/templates/users/base.html new file mode 100644 index 00000000..289dc76e --- /dev/null +++ b/platzigram/templates/users/base.html @@ -0,0 +1,26 @@ + + + + + + {% block head_content %}{% endblock %} + + {% load static %} + + + + + +
    +
    +
    + + {% block container %}{% endblock%} +
    +
    +
    + + + + + \ No newline at end of file diff --git a/platzigram/templates/users/login.html b/platzigram/templates/users/login.html new file mode 100644 index 00000000..55d8af46 --- /dev/null +++ b/platzigram/templates/users/login.html @@ -0,0 +1,27 @@ +{% extends "users/base.html" %} + +{% block head_content%} +Platzigram sign in +{% endblock %} + +{% block container %} + {% if error %} +

    {{ error }}

    + {% endif %} +
    + {% csrf_token %} + +
    + +
    + +
    + +
    + +
    + +
    + +
    +{% endblock %} \ No newline at end of file diff --git a/platzigram/templates/users/signup.html b/platzigram/templates/users/signup.html new file mode 100644 index 00000000..97292e48 --- /dev/null +++ b/platzigram/templates/users/signup.html @@ -0,0 +1,42 @@ +{% extends "users/base.html" %} + +{% block head_content%} +Platzigram sign up +{% endblock %} + +{% block container %} + {% if error %} +

    {{ error }}

    + {% endif %} +
    + {% csrf_token %} + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    +{% endblock %} \ No newline at end of file diff --git a/platzigram/templates/users/update_profile.html b/platzigram/templates/users/update_profile.html new file mode 100644 index 00000000..a96cb2f1 --- /dev/null +++ b/platzigram/templates/users/update_profile.html @@ -0,0 +1,91 @@ + +{% extends "base.html" %} +{% load static %} + +{% block head_content %} +@{{ request.user.username }} +{% endblock %} + +{% block container %} + +
    +
    +
    +
    + {% csrf_token %} + +
    + {% if profile.picture %} + + {% else %} + + {% endif %} + +
    +
    @{{ user.username }} | {{ user.get_full_name }}
    +

    + +

    +
    +
    + {% for error in form.picture.errors %} +
    +

    Picture: {{ error }}

    +
    + {% endfor %} + +

    + +
    + + +
    + {% for error in form.website.errors %} + {{ error }} + {% endfor %} +
    +
    + +
    + + +
    + {% for error in form.biography.errors %} + {{ error }} + {% endfor %} +
    +
    + +
    + + +
    + {% for error in form.phone_number.errors %} + {{ error }} + {% endfor %} +
    +
    + + +
    +
    +
    +
    +{% endblock %} + \ No newline at end of file diff --git a/platzigram/users/pictures/Bob_Esponja_Calamardo.png b/platzigram/users/pictures/Bob_Esponja_Calamardo.png new file mode 100644 index 00000000..d1625649 Binary files /dev/null and b/platzigram/users/pictures/Bob_Esponja_Calamardo.png differ diff --git a/platzigram/users/pictures/Bob_Esponja_Calamardo_dIQqiBM.png b/platzigram/users/pictures/Bob_Esponja_Calamardo_dIQqiBM.png new file mode 100644 index 00000000..d1625649 Binary files /dev/null and b/platzigram/users/pictures/Bob_Esponja_Calamardo_dIQqiBM.png differ diff --git a/platzigram/users/pictures/Bob_Esponja_Calamardo_fYifh21.png b/platzigram/users/pictures/Bob_Esponja_Calamardo_fYifh21.png new file mode 100644 index 00000000..d1625649 Binary files /dev/null and b/platzigram/users/pictures/Bob_Esponja_Calamardo_fYifh21.png differ diff --git a/platzigram/users/pictures/bob-sponja.jpg b/platzigram/users/pictures/bob-sponja.jpg new file mode 100644 index 00000000..cb61b5ef Binary files /dev/null and b/platzigram/users/pictures/bob-sponja.jpg differ diff --git a/platziventas/Pipfile b/platziventas/Pipfile new file mode 100644 index 00000000..b723d019 --- /dev/null +++ b/platziventas/Pipfile @@ -0,0 +1,11 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] + +[requires] +python_version = "3.7" diff --git a/platziventas/Pipfile.lock b/platziventas/Pipfile.lock new file mode 100644 index 00000000..9a51a282 --- /dev/null +++ b/platziventas/Pipfile.lock @@ -0,0 +1,20 @@ +{ + "_meta": { + "hash": { + "sha256": "7e7ef69da7248742e869378f8421880cf8f0017f96d94d086813baa518a65489" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": {} +} diff --git a/platziventas/README.md b/platziventas/README.md index 49bf2417..dd9871da 100644 --- a/platziventas/README.md +++ b/platziventas/README.md @@ -603,6 +603,33 @@ Prueba de concepto con Python 3.7.2 python ./src/main.py mv ./src/.clients.csv.tmp ./src/.clients.csv ``` +## Historial +- 2019/08/26 Retomo para hacer una app terminal y deduzco esto: +```js +1 - Si la app no está instalada: + +- Tiene que existir la sentencia +if __name__ == "__main__": + cli() + +se ejecutaría así: +py + +ejemplo +py pv.py clients + +Muestra todas las opciones + +$ py pv.py clients create + +Permite la interaccion + +2 - Si la app está instalada: + - Para esto se necesita el fichero setup.py configurado + - Que se haya ejecutado: pip install --editable . + +pv clients create +``` ## Errores diff --git a/platziventas/clients/commands.py b/platziventas/clients/commands.py index d0613925..97c2d0f5 100644 --- a/platziventas/clients/commands.py +++ b/platziventas/clients/commands.py @@ -1,3 +1,4 @@ +# print("clients/commands.py") import os import sys from pprint import pprint diff --git a/platziventas/pv.egg-info/SOURCES.txt b/platziventas/pv.egg-info/SOURCES.txt index aed61701..00ebfd6b 100644 --- a/platziventas/pv.egg-info/SOURCES.txt +++ b/platziventas/pv.egg-info/SOURCES.txt @@ -1,3 +1,4 @@ +README.md setup.py pv.egg-info/PKG-INFO pv.egg-info/SOURCES.txt diff --git a/platziventas/pv.py b/platziventas/pv.py index 018b9a91..2dd2954f 100644 --- a/platziventas/pv.py +++ b/platziventas/pv.py @@ -2,6 +2,7 @@ import sys # framework de linea de comandos import click +from pprint import pprint #del módulo clients importa commands y llamalo clients_commands from clients import commands as clients_commands @@ -15,9 +16,39 @@ @click.group() @click.pass_context def cli(context): + # print("cli llamado") + # pprint(context) # diccionario context.obj = {} context.obj["clients_table"] = CLIENTS_TABLE +# se inyecta en el grupo cli todos los comandos de clientes +cli.add_command(clients_commands.all) -cli.add_command(clients_commands.all) \ No newline at end of file +""" +1 - Si la app no está instalada: + +- Tiene que existir la sentencia +if __name__ == "__main__": + cli() + +se ejecutaría así: +py + +ejemplo +py pv.py clients + +Muestra todas las opciones + +$ py pv.py clients create + +Permite la interaccion + +2 - Si la app está instalada: + - Para esto se necesita el fichero setup.py configurado + - Que se haya ejecutado: pip install --editable . + +pv clients create +""" +# if __name__ == "__main__": + # cli() \ No newline at end of file diff --git a/pycmd/.gitignore b/pycmd/.gitignore new file mode 100644 index 00000000..3668d65d --- /dev/null +++ b/pycmd/.gitignore @@ -0,0 +1,54 @@ +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so +*.pyc + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.rar +#*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sqlite + +# OS generated files # +###################### +.DS_Store +ehthumbs.db +Icon +Thumbs.db +.tmtags +.idea +tags +vendor.tags +tmtagsHistory +*.sublime-project +*.sublime-workspace +.bundle + +# MIOS # +###################### +*.swp +__pycache__ +servidor/venv +venv +src/pv.egg-info +.env +.vscode +theframework/translated +theframework/tests/debug +/nbproject/ \ No newline at end of file diff --git a/pycmd/Pipfile b/pycmd/Pipfile new file mode 100644 index 00000000..b723d019 --- /dev/null +++ b/pycmd/Pipfile @@ -0,0 +1,11 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] + +[requires] +python_version = "3.7" diff --git a/pycmd/Pipfile.lock b/pycmd/Pipfile.lock new file mode 100644 index 00000000..9a51a282 --- /dev/null +++ b/pycmd/Pipfile.lock @@ -0,0 +1,20 @@ +{ + "_meta": { + "hash": { + "sha256": "7e7ef69da7248742e869378f8421880cf8f0017f96d94d086813baa518a65489" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": {} +} diff --git a/pycmd/REAMDE.md b/pycmd/REAMDE.md new file mode 100644 index 00000000..bdca4e2e --- /dev/null +++ b/pycmd/REAMDE.md @@ -0,0 +1,75 @@ +# pycmd + +> La intención es crear una app de terminal instalable de modo que automatice tareas + +## Historial +- 2019-08-26: `pycmd regex matchfile` +- + +## Notas +```py +ioedu@HPZBOOK15U MINGW64 //pycmd (master) +$ pycmd regex matchfile +find pattern +Reg. Exp [[\d]+love]: abc +Path file from [/path/of/origin/file.ext]: C:\Users\ioedu\Desktop\temp.php +Path file to [/path/of/destiny/file.ext]: C:\Users\ioedu\Desktop\startup.txt +trying to write +writing... +``` +- Creo árbol de carpetas similar a **Flutter :)** +```js +pycmd/ + lib/ + src/ + services/ -> vacio de mom + helpers/ -> vacio de mom + commands/ -> módulo con todos los comandos + main.py -> frontcontroller + setup.py -> pip install --editable . +``` +```js +1 - Si la app no está instalada: + +- Tiene que existir la sentencia +if __name__ == "__main__": + shell() + +se ejecutaría así: +py + +ejemplo +py pv.py clients + +Muestra todas las opciones + +$ py pv.py clients create + +Permite la interaccion + +2 - Si la app está instalada: + - Para esto se necesita el fichero setup.py configurado + - Que se haya ejecutado: pip install --editable . + +pv clients create +``` +- Me estaba dando este error: **ModuleNotFoundError** + - el problema es que como src es un módulo el import tenía que ser `src.commands` y no solo `commads` +```js +// Instalo +ioedu@HPZBOOK15U MINGW64 /e//pycmd/lib (master) +$ pip install --editable . +Obtaining file:///E:/pycmd/lib +Requirement already satisfied: Click in e:\programas\python\python37-32\lib\site-packages (from pycmd==0.1.0) (7.0) +Installing collected packages: pycmd + Found existing installation: pycmd 0.1.0 + Uninstalling pycmd-0.1.0: + Successfully uninstalled pycmd-0.1.0 + Running setup.py develop for pycmd +Successfully installed pycmd + +//comprobar si está instalado y donde: +ioedu@HPZBOOK15U MINGW64 /e//pycmd/lib (master) +$ where pycmd +\\Scripts\pycmd.exe +``` diff --git a/pycmd/lib/pycmd.egg-info/PKG-INFO b/pycmd/lib/pycmd.egg-info/PKG-INFO new file mode 100644 index 00000000..61cfae33 --- /dev/null +++ b/pycmd/lib/pycmd.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: pycmd +Version: 0.1.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/pycmd/lib/pycmd.egg-info/SOURCES.txt b/pycmd/lib/pycmd.egg-info/SOURCES.txt new file mode 100644 index 00000000..cd7005ff --- /dev/null +++ b/pycmd/lib/pycmd.egg-info/SOURCES.txt @@ -0,0 +1,7 @@ +setup.py +pycmd.egg-info/PKG-INFO +pycmd.egg-info/SOURCES.txt +pycmd.egg-info/dependency_links.txt +pycmd.egg-info/entry_points.txt +pycmd.egg-info/requires.txt +pycmd.egg-info/top_level.txt \ No newline at end of file diff --git a/pycmd/lib/pycmd.egg-info/dependency_links.txt b/pycmd/lib/pycmd.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/pycmd/lib/pycmd.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/pycmd/lib/pycmd.egg-info/entry_points.txt b/pycmd/lib/pycmd.egg-info/entry_points.txt new file mode 100644 index 00000000..60d80ba3 --- /dev/null +++ b/pycmd/lib/pycmd.egg-info/entry_points.txt @@ -0,0 +1,4 @@ + + [console_scripts] + pycmd = src.main:shell + \ No newline at end of file diff --git a/pycmd/lib/pycmd.egg-info/requires.txt b/pycmd/lib/pycmd.egg-info/requires.txt new file mode 100644 index 00000000..d77b06d7 --- /dev/null +++ b/pycmd/lib/pycmd.egg-info/requires.txt @@ -0,0 +1 @@ +Click diff --git a/pycmd/lib/pycmd.egg-info/top_level.txt b/pycmd/lib/pycmd.egg-info/top_level.txt new file mode 100644 index 00000000..39f0cb88 --- /dev/null +++ b/pycmd/lib/pycmd.egg-info/top_level.txt @@ -0,0 +1,8 @@ +' +[ +] +c +d +m +p +y diff --git a/pycmd/lib/setup.py b/pycmd/lib/setup.py new file mode 100644 index 00000000..8d1bc5e4 --- /dev/null +++ b/pycmd/lib/setup.py @@ -0,0 +1,22 @@ +from setuptools import setup + +""" +se ejecuta así: + +pip install --editable . +""" + +setup( + name = "pycmd", #como se va a invocar a nuestra linea de comandos + version = "0.1.0", #sem version + py_modules = "['pycmd']", #se llamará al módulo pycmd + install_requires = [ #se necesita la libreria Click + "Click", + ], + # punto de entrada el método cli dentro de pycmd + # https://setuptools.readthedocs.io/en/latest/setuptools.html + entry_points = ''' + [console_scripts] + pycmd = src.main:shell + ''', +) \ No newline at end of file diff --git a/pycmd/lib/src/__init__.py b/pycmd/lib/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pycmd/lib/src/bootstrap/__init__.py b/pycmd/lib/src/bootstrap/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pycmd/lib/src/bootstrap/builtins_ext.py b/pycmd/lib/src/bootstrap/builtins_ext.py new file mode 100644 index 00000000..371d21cc --- /dev/null +++ b/pycmd/lib/src/bootstrap/builtins_ext.py @@ -0,0 +1,214 @@ +# builtins_ext.py 1.0.0 +import sys +import builtins + +from pprint import pprint +from colorama import init +init() + +""" +http://ozzmaker.com/add-colour-to-text-in-python/ +The above ANSI escape code will set the text colour to bright green. The format is; +\033[ Escape code, this is always the same +1 = Style, 1 for normal. +32 = Text colour, 32 for bright green. +40m = Background colour, 40 is for black. +""" +pythontypes = { + "boolean": ("bool"), + "numeric": ("int","float"), + "string": ("str"), + "structure": ("array","dict","list","tuple","set"), # file + "function": ("function"), + "primitives": ("bool","int","float","str") + # import types + # types.GeneratorType +} + +class CheckType(): + + @staticmethod + def is_bool(mxvar): + return isinstance(mxvar, bool) + + @staticmethod + def is_float(mxvar): + return isinstance(mxvar, float) + + @staticmethod + def is_int(mxvar): + return isinstance(mxvar, int) + + @staticmethod + def is_float(mxvar): + return isinstance(mxvar, float) + + @staticmethod + def is_string(mxvar): + return isinstance(mxvar, str) + + @staticmethod + def is_list(mxvar): + return isinstance(mxvar, list) + @staticmethod + def is_dict(mxvar): + return isinstance(mxvar, dict) + + @staticmethod + def is_tuple(mxvar): + return isinstance(mxvar, tuple) + + @staticmethod + def has_dict(mxvar): + return hasattr(mxvar, '__dict__') + + @staticmethod + def is_primitive(mxvar): + return (CheckType.is_bool(mxvar) or CheckType.is_int(mxvar) + or CheckType.is_float(mxvar) or CheckType.is_string(mxvar) + ) + + @staticmethod + def is_structure(mxvar): + return (CheckType.is_list(mxvar) or CheckType.is_dict(mxvar) + or CheckType.is_tuple(mxvar) + ) + + +def is_primitive(mxvar): + return CheckType.is_primitive(mxvar) + +def is_structure(mxvar): + return CheckType.is_structure(mxvar) + +def has_dict(mxvar): + return CheckType.has_dict(mxvar) + +def get_strcolored(strval,colcode): + strreturn = "\033[{}m{}\033[00m".format(colcode,strval) + return strreturn + +def get_dictcolored(dictvar): + lstret = [] + for k,v in dictvar.__dict__.items(): + strkey = " .%s" % k + strval = "%s" % v + lstret.append(get_strkvcolored(strkey, strval)) + + return "\n".join(lstret) + +def printcol(primval,colcode="5;30;47"): + if is_primitive(primval): + primval = str(primval) + strval = get_strcolored(primval,colcode) + print(strval) + +def get_strkvcolored(strkey,strval): + strreturn = "" + # strkey = "\033[0;95m{}\033[00m" .format(strkey) + strkey = get_strcolored(strkey,"0;95") + strval = get_strcolored(strval,"1;96") + strreturn = strkey + " = "+ strval + return strreturn + +def get_strobject(obj): + # strobj = ["obj"] + strobj = [] + for strattr in dir(obj): + strkey = " .%s" % (strattr) + strval = "%s" % getattr(obj, strattr) + strobj.append(get_strkvcolored(strkey, strval)) + + return "\n".join(strobj) + +def print_format_table(): + """ + https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-terminal-in-python + prints table of formatted text format options + """ + for style in range(8): + for fg in range(30,38): + s1 = '' + for bg in range(40,48): + format = ';'.join([str(style), str(fg), str(bg)]) + s1 += '\x1b[%sm %s \x1b[0m' % (format, format) + print(s1) + print('\n') + +def prtype(mxvar): + print(type(mxvar)) + +def s(strtext): + if is_primitive(strtext): + strtext = str(strtext) + printcol(strtext,"94") + +def sc(strtext,colcode="7;34;47"): + if is_primitive(strtext): + strtext = str(strtext) + printcol(strtext,colcode) + +def pr(mxvar, strtitle="", isjustdic=1): + # https://github.com/shiena/ansicolor/blob/master/README.md + if strtitle: + printcol(strtitle,"6;30;43") + + if has_dict(mxvar): + print(get_dictcolored(mxvar)) + + if is_primitive(mxvar): + printcol(mxvar) + return + + if is_structure(mxvar): + pprint(mxvar) + return + + if isjustdic: + return + + printcol("type:"+str(type(mxvar)),"6;30;43") + # ya lo devuelve con colores + mxvar = get_strobject(mxvar) + print(mxvar) + + +def bug(mxvar,strtitle=""): + # https://github.com/shiena/ansicolor/blob/master/README.md + if strtitle: + printcol(strtitle,"6;30;42") + + if has_dict(mxvar): + print(get_dictcolored(mxvar)) + + if is_primitive(mxvar): + printcol(mxvar) + return + + if is_structure(mxvar): + pprint(mxvar) + return + + # ya lo devuelve con colores + mxvar = get_strobject(mxvar) + print(mxvar) + +def die(mxvar): + bug(mxvar) + sys.exit() + +def diefalsy(mxvar,title=""): + if(not mxvar): + printcol("exit by empty var: %s" % title,"7;33;44") + sys.exit() + + +builtins.s = s +builtins.sc = sc +builtins.pr = pr +builtins.prtype = prtype +builtins.bug = bug +builtins.die = die +builtins.diefalsy = diefalsy + +# print_format_table() \ No newline at end of file diff --git a/pycmd/lib/src/commands/__init__.py b/pycmd/lib/src/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pycmd/lib/src/commands/cmd_prueba.py b/pycmd/lib/src/commands/cmd_prueba.py new file mode 100644 index 00000000..6bf8b96f --- /dev/null +++ b/pycmd/lib/src/commands/cmd_prueba.py @@ -0,0 +1,19 @@ +# print("commands/cmdfnprueba.py") +import os +import sys +from pprint import pprint +from pathlib import Path + +import click +from contextlib import contextmanager + +@click.group() +# pycmd fnprueba +def fnprueba(): + """ + Prueba + """ + pass + +# funcsgroup son todos los comandos (funciones) +funcsgroup = fnprueba \ No newline at end of file diff --git a/pycmd/lib/src/commands/cmd_regex.py b/pycmd/lib/src/commands/cmd_regex.py new file mode 100644 index 00000000..ccb7b5b5 --- /dev/null +++ b/pycmd/lib/src/commands/cmd_regex.py @@ -0,0 +1,73 @@ +# print("commands/cmdregex.py") +# ejecucion: pycmd regex matchfile +import os +import sys +from pprint import pprint +from pathlib import Path + +import click + +from contextlib import contextmanager +from src.components.component_file import fopen +from src.components.component_log import lg + +#clic_group convierte a regex en otro decorador +@click.group() +# esto se llamaría desde +# pycmd regex +def regex(): + # esto se mostrará al ejecutar pycmd + """ + trabaja con ficheros y hace busquedas guardando el resultado en otro fichero + """ + pass +#def regex() + +@regex.command() +@click.option("-o","--opt",type=str,prompt=True,help="") +def matchfile(opt): + click.secho(opt,fg="green",bg="blue") + """Matchfile""" + click.echo("find pattern") + regex = click.prompt("Reg. Exp", type=str, default="[\d]+love") + pathfilefrom = click.prompt("Path file from", type=str, default="/path/of/origin/file.ext") + pathfileto = click.prompt("Path file to", type=str, default="/path/of/destiny/file.ext") + + try: + with fopen(pathfilefrom) as f: + contents = f.read() + except NameError: + print("an exception NameError") + except Exception as e: + s = str(e) + print(s) + + # print(contents) + if not os.path.isfile(pathfileto): + if not os.access(pathfileto, os.R_OK): + print("no access to "+pathfileto) + return + else: + print("with access") + try: + f = open(pathfileto) + f.close() + except FileNotFoundError: + print("File "+pathfileto+" was not able to create") + + print("trying to write") + with fopen(pathfileto,"w") as f: + print("writing...") + try: + f.write(contents) + except Exception: + print("Error al escribir en "+pathfileto) + + # C:\Users\ioedu\Desktop\tmp.js + # C:\Users\ioedu\Desktop\tmp_2.js + # C:\Users\ioedu\Desktop\temp.sql + +#def matchfile + +# funcsgroup son todos los comandos (funciones) +funcsgroup = regex \ No newline at end of file diff --git a/pycmd/lib/src/components/__init__.py b/pycmd/lib/src/components/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pycmd/lib/src/components/component_file.py b/pycmd/lib/src/components/component_file.py new file mode 100644 index 00000000..f7bfa30e --- /dev/null +++ b/pycmd/lib/src/components/component_file.py @@ -0,0 +1,21 @@ +# print("components/file.py") +from contextlib import contextmanager + +@contextmanager +def fopen(pathfile, opt="r"): + f = open(pathfile, opt) + try: + yield f + finally: + f.close() +#fopen + +def fwrite(pathfile, strcontent): + with fopen(pathfile,"a") as f: + f.write(strcontent) + +def foverwrite(pathfile, strcontent): + with fopen(pathfile,"w") as f: + f.write(strcontent) +#fwrite + diff --git a/pycmd/lib/src/components/component_log.py b/pycmd/lib/src/components/component_log.py new file mode 100644 index 00000000..b5d02557 --- /dev/null +++ b/pycmd/lib/src/components/component_log.py @@ -0,0 +1,54 @@ +# component_log.py +import os.path +from time import gmtime, strftime +from .component_file import fwrite + +global pathdirlogs + +pathdirlogs = os.path.dirname(os.path.abspath(__file__)) +pathdirlogs = os.path.realpath(pathdirlogs+"/../../../logs") + +def lg(mxvalue,strtitle="",strtype="debug"): + global pathdirlogs + + strtoday = strftime("%Y%m%d", gmtime()) + strnow = "- "+strftime("%Y-%m-%d %H:%M:%S", gmtime())+":" + + strcontent = "\n"+strnow + if(strtitle): + strcontent += "\n" + strtitle + + strcontent += "\n" + + if(not isinstance(mxvalue, str)): + strcontent += repr(mxvalue) + else: + strcontent += mxvalue + + logname = "pycmd_"+strtoday +".log" + pathfile = os.path.realpath(pathdirlogs +"/"+strtype+"/"+logname) + print(pathfile) + fwrite(pathfile, strcontent) +#lg + +def lgd(mxvalue,strtitle="",print=0): + if(print): + sc(strtitle,"2;37;42") + sc(mxvalue,"2;37;42") + lg(mxvalue, strtitle, strtype="debug") +#lgd + +def lgerr(mxvalue,strtitle="",print=0): + if(print): + sc(strtitle,"7;33;41") + sc(mxvalue,"7;33;41") + lg(mxvalue, strtitle, strtype="errors") +#lgerr + +def lgsql(mxvalue,strtitle="",print=0): + if(print): + sc(strtitle,"5;37;46") + sc(mxvalue,"5;37;46") + lg(mxvalue, strtitle, strtype="sql") +#lgsql + diff --git a/pycmd/lib/src/helpers/__init__.py b/pycmd/lib/src/helpers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pycmd/lib/src/main.py b/pycmd/lib/src/main.py new file mode 100644 index 00000000..c0a837c1 --- /dev/null +++ b/pycmd/lib/src/main.py @@ -0,0 +1,34 @@ +import os +import sys +# framework de linea de comandos +import click +# mis librerias +from src.bootstrap.builtins_ext import * #inyecta en builtin +from src.components.component_log import * +from src.commands import cmd_regex as cmdregex +from src.commands import cmd_prueba as cmdprueba + +@click.group() +@click.pass_context +def shell(context): + + x = 0 + bug(context) + diefalsy(x,"context") + pr("hola x") + # lgsql("shell","titulo",1) + # lgerr("shell","titulo err",1) + # lgd("shell","titulo debug",1) + #click.clear() + # diccionario + # pprint(context) + context.obj = {} + # print_format_table() + +# se inyecta en el grupo cli todos los comandos de clientes +shell.add_command(cmdregex.funcsgroup) +shell.add_command(cmdprueba.funcsgroup) + +# pycmd regex matchfile +#if __name__ == "__main__": +# shell() \ No newline at end of file diff --git a/pycmd/lib/src/services/__init__.py b/pycmd/lib/src/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pyprint/.gitignore b/pyprint/.gitignore new file mode 100644 index 00000000..180cde75 --- /dev/null +++ b/pyprint/.gitignore @@ -0,0 +1,8 @@ +.idea +.vscode +pyprint/.env +pyprint/config/access.json +pyprint/logs/* +compiled/linux +compiled/win +compiled/macos \ No newline at end of file diff --git a/pyprint/README.md b/pyprint/README.md new file mode 100644 index 00000000..40e92909 --- /dev/null +++ b/pyprint/README.md @@ -0,0 +1,35 @@ +### Guía +- Intento seguir la estructur de: + [Upload (php)](https://github.com/eacevedof/prj_upload/tree/master/backend/php) + +### Compilación +- **linux (Docker)** + - Hay un alias **linux** que ejecuta `/bin/bash /app/pyinstaller-sh/linux.sh` + - para lanzar el compilado: + - `./pyprint-linux` +- **windows** + - nos posicionandonos en la raíz (a la altura de docker-compose.yml) + - ejecutamos: + - con gitbash.exe + - `/usr/bin/bash pyinstaller-sh/win.sh` +- **macos** + - nos posicionamos en la raíz + - ejecutamos: + - `/usr/local/bin/bash pyinstaller-sh/macos.sh` + - para lanzar el compilado: + - `pyprint/compiled/macos/dist/./pyprint-macos` + +## Error +- root@py38:/app/compiled/linux/dist# sh pyprint-linux +pyprint-linux: 1: pyprint-linux: Syntax error: "(" unexpected + - habia que usar bash +- Me daba un problema de recursion infinita con fastapi + - habia que desinstalar pydantic que viene por defecto e instalar desde github + ```sh + pip uninstall pydantic + pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic + ``` +- --data me da error de binario + - https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile +- Macos: Can not find path /usr/lib/libSystem.B.dylib + - si, bien da este error el compilado funciona ^^ \ No newline at end of file diff --git a/pyprint/compiled/.gitkeep b/pyprint/compiled/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/pyprint/docker-compose.yml b/pyprint/docker-compose.yml new file mode 100644 index 00000000..c8c3c0a9 --- /dev/null +++ b/pyprint/docker-compose.yml @@ -0,0 +1,34 @@ +version: "3.9" + +services: + python38: + container_name: cont-py38 + hostname: py38 + build: + context: . + dockerfile: ./docker/Dockerfile + + volumes: + - ./pyinstaller-sh:/app/pyinstaller-sh + - ./compiled:/app/compiled + - ./pyprint:/app/pyprint + + # debug vscode + ports: + - "8080:8080" + - "5678:5678" + # mantiene el contenedor en ejecución + # command: tail -f /dev/null toma 10 segundos en parar el contenedor + # tty: true #toma 2 segundos en parar el contenedor (si se tiene entrypoint este no va) + entrypoint: /usr/src/entrypoint.sh # da un error y tira el contenedor + + privileged: true + devices: + - '/dev:/dev' + # read_only: true + networks: + - pyprintnet + +networks: + pyprintnet: + name: pyprintnet diff --git a/pyprint/docker/.bashrc b/pyprint/docker/.bashrc new file mode 100644 index 00000000..012617ed --- /dev/null +++ b/pyprint/docker/.bashrc @@ -0,0 +1,4 @@ +alias linux='/bin/bash /app/helpers-sh/linux.sh' +alias dist='cd /app/compiled/linux/dist' +alias build='cd /app/compiled/linux/build' +alias pyprint='cd /app/pyprint' \ No newline at end of file diff --git a/pyprint/docker/Dockerfile b/pyprint/docker/Dockerfile new file mode 100644 index 00000000..fef94be0 --- /dev/null +++ b/pyprint/docker/Dockerfile @@ -0,0 +1,14 @@ +# FROM python:3.8 +FROM python:3.8-slim-buster AS base + +#RUN: ejecuta comandos en el momento de la creacion de la imagen +RUN apt-get update && \ + apt-get -y install --no-install-recommends \ + procps + #vim + +COPY ./docker/.bashrc /root/.bashrc +COPY ./docker/entrypoint.sh /usr/src/entrypoint.sh +RUN chmod +x /usr/src/entrypoint.sh + +WORKDIR /app/pyprint \ No newline at end of file diff --git a/pyprint/docker/entrypoint.sh b/pyprint/docker/entrypoint.sh new file mode 100644 index 00000000..4e0109c4 --- /dev/null +++ b/pyprint/docker/entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/bash +apt-get install -y binutils libc6 +apt-get install -y binutils libc-bin + +python -m pip install --upgrade pip + +pip install pyinstaller +pip install debugpy +pip install fastapi +pip install uvicorn[standard] + +# arregla max recursion del compilado +pip uninstall pydantic +pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic + +#pip install debugpy -t /tmp + +#python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m uvicorn +#python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m public/main.py +#python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 /pyprint/public/main.py + +#python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m src + +#python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn + +#python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn main:app + +#https://www.uvicorn.org/settings/ +cd public; uvicorn main:app --reload --host 0.0.0.0 --port 8080 --reload-dir "../src" + +# python public/main.py + +# python -m public/main.py + +# esta llamada permite reconocer src como módulo pero no me sirve ya que es solo para debug +# python -m public.main diff --git a/pyprint/helpers-sh/linux.sh b/pyprint/helpers-sh/linux.sh new file mode 100644 index 00000000..2770b692 --- /dev/null +++ b/pyprint/helpers-sh/linux.sh @@ -0,0 +1,29 @@ +#!/bin/bash +PYTHONOPTIMIZE=1 + +pyinstaller /app/pyprint/public/main.py -F \ +--log-level=ERROR \ +--log-level=TRACE \ +--log-level=DEBUG \ +--onefile --nowindow \ +--workpath "/app/compiled/linux/build" \ +--distpath "/app/compiled/linux/dist" \ +--specpath "/app/compiled/linux" \ +--name "pyprint-linux" \ +--hidden-import uvicorn.logging \ +--hidden-import uvicorn.loops \ +--hidden-import uvicorn.loops.auto \ +--hidden-import uvicorn.protocols \ +--hidden-import uvicorn.protocols.http \ +--hidden-import uvicorn.protocols.http.auto \ +--hidden-import uvicorn.protocols.websockets \ +--hidden-import uvicorn.protocols.websockets.auto \ +--hidden-import uvicorn.lifespan \ +--hidden-import uvicorn.lifespan.on \ +--clean # Clean PyInstaller cache and remove temporary files before building. + +#--upx-dir=/usr/local/share/ \ +# myscript.spec +# pyinstaller: error: argument --log-level: invalid choice: 'WARNING' (choose from 'TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL') + +# para ejecutar el compilado ./pyprint-linux diff --git a/pyprint/helpers-sh/macos.sh b/pyprint/helpers-sh/macos.sh new file mode 100644 index 00000000..be96d6bc --- /dev/null +++ b/pyprint/helpers-sh/macos.sh @@ -0,0 +1,21 @@ +#!&usr/local/bin/bash +PYTHONOPTIMIZE=1 + +pyinstaller ./pyprint/public/main.py -F \ +--workpath "./compiled/macos/build" \ +--distpath "./compiled/macos/dist" \ +--specpath "./compiled/macos" \ +--onefile --nowindow \ +--name "pyprint-macos" \ +--hidden-import uvicorn.logging \ +--hidden-import uvicorn.loops \ +--hidden-import uvicorn.loops.auto \ +--hidden-import uvicorn.protocols \ +--hidden-import uvicorn.protocols.http \ +--hidden-import uvicorn.protocols.http.auto \ +--hidden-import uvicorn.protocols.websockets \ +--hidden-import uvicorn.protocols.websockets.auto \ +--hidden-import uvicorn.lifespan \ +--hidden-import uvicorn.lifespan.on \ +--clean +# para ejecutar el compilado ./pyprint-macos diff --git a/pyprint/helpers-sh/win.sh b/pyprint/helpers-sh/win.sh new file mode 100644 index 00000000..8835157f --- /dev/null +++ b/pyprint/helpers-sh/win.sh @@ -0,0 +1,34 @@ +#!/usr/bin/bash +#.\Scripts\activate +#pyinstaller src/wsgi.py -F ` +#--name "pyprint-win" ` +#--icon='icon.ico' ` +#--add-data "src\data\*;data" ` +#--add-data "src\data\*.jpg;data" ` +#--hidden-import waitress ` +#--clean +set PYTHONOPTIMIZE=1 + +# esto no va :s +#--add-data "./pyprint/config/access.json:." \ +#--add-data "./pyprint/logs/:." \ + +pyinstaller ./pyprint/public/main.py -F \ +--workpath "./compiled/win/build" \ +--distpath "./compiled/win/dist" \ +--specpath "./compiled/win" \ +--onefile --nowindow \ +--name "pyprint-win" \ +--add-data "./pyprint/logs;logs" \ +--hidden-import uvicorn.logging \ +--hidden-import uvicorn.loops \ +--hidden-import uvicorn.loops.auto \ +--hidden-import uvicorn.protocols \ +--hidden-import uvicorn.protocols.http \ +--hidden-import uvicorn.protocols.http.auto \ +--hidden-import uvicorn.protocols.websockets \ +--hidden-import uvicorn.protocols.websockets.auto \ +--hidden-import uvicorn.lifespan \ +--hidden-import uvicorn.lifespan.on \ +--clean +#--icon='icon.icns' \ \ No newline at end of file diff --git a/pyprint/makefile b/pyprint/makefile new file mode 100644 index 00000000..c2074766 --- /dev/null +++ b/pyprint/makefile @@ -0,0 +1,33 @@ +# 4.19.76-linuxkit +build: + docker-compose up -d --build + +rebuild: + make down + make build + +restart: + docker-compose restart + # make ssh + +down: + docker-compose down + +ssh: ## bin/sh para alpine + docker exec --user="root" -it cont-py38 /bin/bash + +start: + docker-compose start + #make ssh +stop: + docker-compose stop + +remove: + docker rm cont-py38 + +logs: + # docker logs cont-py38 + docker-compose logs --tail="all" + +remlogs: + rm -fr pyprint/logs/* diff --git a/pyprint/pyprint/config/access.example.json b/pyprint/pyprint/config/access.example.json new file mode 100755 index 00000000..0e0dcd23 --- /dev/null +++ b/pyprint/pyprint/config/access.example.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/pyprint/pyprint/public/bootstrap.py b/pyprint/pyprint/public/bootstrap.py new file mode 100644 index 00000000..b60ae602 --- /dev/null +++ b/pyprint/pyprint/public/bootstrap.py @@ -0,0 +1,35 @@ +import builtins +import sys +from pprint import pprint + +def pr(text, title=""): + vtype = type(text) + if title: + print(f"\n{title}:") + if isinstance(text, str): + print(f"type:{vtype}\n") + print(f"{text}\n") + else: + print(f"type:{vtype}\n") + pprint(text) + + +def pd(text, title=""): + pr(text, title) + sys.exit() + + +builtins.pr = pr +builtins.pd = pd + + +import sys +import os +import pathlib + +pathpublic = pathlib.Path(__file__).parent.absolute() +#pr(pathpublic,"pathpublic") +pathroot = os.path.abspath(pathpublic.parent) +#pr(pathroot,"pathroot 2 debe ser pyprint/pyprint") + +sys.path.append(pathroot) \ No newline at end of file diff --git a/pyprint/pyprint/public/debug.py b/pyprint/pyprint/public/debug.py new file mode 100644 index 00000000..36d4c4f1 --- /dev/null +++ b/pyprint/pyprint/public/debug.py @@ -0,0 +1,15 @@ +# debuger.py +from os import getenv + +def debugpy_start(): + #if getenv("DEBUGGER") == "True": + if 1==1: + import multiprocessing + + if multiprocessing.current_process().pid > 1: + import debugpy + + debugpy.listen(("0.0.0.0", 5678)) + print("⏳ VS Code debugger can now be attached, press F5 in VS Code ⏳", flush=True) + debugpy.wait_for_client() + print("🎉 VS Code debugger attached, enjoy debugging 🎉", flush=True) \ No newline at end of file diff --git a/pyprint/pyprint/public/main.py b/pyprint/pyprint/public/main.py new file mode 100755 index 00000000..10d36d7e --- /dev/null +++ b/pyprint/pyprint/public/main.py @@ -0,0 +1,11 @@ +#!/usr/bin/python +import bootstrap +import uvicorn + +pr("public/main.py",":o) ") +from src.routes.all import * + + +if __name__ == "__main__": + #uvicorn.run(app, host="0.0.0.0", port=5678) + uvicorn.run(app, host="0.0.0.0", port=8081) \ No newline at end of file diff --git a/pyprint/pyprint/src/__init__.py b/pyprint/pyprint/src/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pyprint/pyprint/src/boot/constants.py b/pyprint/pyprint/src/boot/constants.py new file mode 100644 index 00000000..e69de29b diff --git a/pyprint/pyprint/src/boot/fastapi.py b/pyprint/pyprint/src/boot/fastapi.py new file mode 100755 index 00000000..b32a764c --- /dev/null +++ b/pyprint/pyprint/src/boot/fastapi.py @@ -0,0 +1,3 @@ +from fastapi import FastAPI, Request + +app = FastAPI() diff --git a/pyprint/pyprint/src/boot/paths.py b/pyprint/pyprint/src/boot/paths.py new file mode 100644 index 00000000..001169d8 --- /dev/null +++ b/pyprint/pyprint/src/boot/paths.py @@ -0,0 +1,10 @@ +import os + +paththisdir=os.path.dirname(os.path.abspath(__file__)) +PATH_ROOT=os.path.abspath(f"{paththisdir}/../../") + +PATH_CONFIG=f"{PATH_ROOT}/config" +PATH_LOGS=f"{PATH_ROOT}/logs" +PATH_PUBLIC=f"{PATH_ROOT}/public" +PATH_SRC=f"{PATH_ROOT}/src" +PATH_TESTS=f"{PATH_ROOT}/tests" diff --git a/pyprint/pyprint/src/components/cmd_component.py b/pyprint/pyprint/src/components/cmd_component.py new file mode 100644 index 00000000..aaa33c23 --- /dev/null +++ b/pyprint/pyprint/src/components/cmd_component.py @@ -0,0 +1,17 @@ +from subprocess import PIPE, Popen +from src.factories.log_factory import get_log + +class CmdComponent: + + def __init__(self): + self.__log = get_log() + + @staticmethod + def exec(cmd: str) -> str: + process = Popen( + args=cmd, + stdout=PIPE, + shell=True + ) + return process.communicate()[0] + diff --git a/pyprint/pyprint/src/components/encdecrypt_component.py b/pyprint/pyprint/src/components/encdecrypt_component.py new file mode 100644 index 00000000..118a30c6 --- /dev/null +++ b/pyprint/pyprint/src/components/encdecrypt_component.py @@ -0,0 +1,13 @@ +import os + +# https://github.com/eacevedof/prj_phpapify/blob/master/backend/vendor/theframework/components/session/component_encdecrypt.php + +class EncdecryptComponent: + + def __init__(self, usesalt: bool=True, pathfolder:str=""): + self.__sSslMethod = "AES-256-CBC" + self.__sSslKey = "@11111111@" + self.__sSslIv = "99326425" + self.__useSalt = usesalt + self.__sSalt = "@#$.salt.$#@" + diff --git a/pyprint/pyprint/src/components/log_component.py b/pyprint/pyprint/src/components/log_component.py new file mode 100755 index 00000000..f998eda2 --- /dev/null +++ b/pyprint/pyprint/src/components/log_component.py @@ -0,0 +1,89 @@ +import os +import socket +from datetime import datetime +import sys, pprint + +class LogComponent: + + def __init__(self, subtype: str="", pathfolder:str=""): + self.__subtype = subtype if subtype else "debug" + self.__pathfolder = self.__get_pathfolder(pathfolder) + today = self.__get_today() + self.__filename = f"app_{today}.log" + self.__fix_folder() + + def __get_pathfolder(self, pathfolder: str): + if pathfolder: + return pathfolder + pathfolder = os.path.dirname(os.path.realpath(__file__)) + return pathfolder + + def __get_today(self): + today = datetime.today() + return today.strftime("%Y%m%d") + + def __get_now(self): + now = datetime.today() + return now.strftime("%Y-%m-%d %H:%M:%S") + + def __get_fix_folder(self): + return f"{self.__pathfolder}/{self.__subtype}/" + + def __is_fix_folder(self): + logfolder = self.__get_fix_folder() + return os.path.isdir(logfolder) + + def __fix_folder(self): + if not self.__is_fix_folder(): + try: + os.mkdir(self.__get_fix_folder(), 0o777) + except: + e = sys.exc_info()[0] + folder = self.__get_fix_folder() + print(f"fix_folder error: {e} creating {folder}") + + + def __var_export(self, obj, resource) : + temp = sys.stdout # store original stdout object for later + sys.stdout = resource + pprint.pprint(obj) + sys.stdout.close() + sys.stdout = temp # restore print commands to interactive prompt + #return open(pathfile, 'r').read() + + def __get_resource(self): + pathfile = f"{self.__pathfolder}/{self.__subtype}/{self.__filename}" + isfile = os.path.isfile(pathfile) + if isfile: + resource = open(pathfile, "a") + else: + resource = open(pathfile, "w") + return resource + + def __get_remote_ip(self): + hostname = socket.gethostname() + return socket.gethostbyname(hostname) + + def save(self, mxvar, title:str=""): + if not self.__is_fix_folder(): + return False + + logresource = self.__get_resource() + if not logresource: + return False + + if logresource.mode == "a": + logresource.write("\n\n") + + headline = f"-- [{self.__get_now()} - ip:{self.__get_remote_ip()}]\n" + logresource.write(headline) + if title: + logresource.write(f"{title}:\n") + + if not isinstance(mxvar, str): + self.__var_export(mxvar, logresource) + else: + logresource.write(mxvar) + logresource.close() + + return True diff --git a/pyprint/pyprint/src/components/print_component.py b/pyprint/pyprint/src/components/print_component.py new file mode 100755 index 00000000..b66832d2 --- /dev/null +++ b/pyprint/pyprint/src/components/print_component.py @@ -0,0 +1,57 @@ +import os +import ctypes + +from src.components.cmd_component import CmdComponent +from pprint import pprint +#Common UNIX Printing System (CUPS) +# https://askubuntu.com/questions/416995/how-to-list-all-available-printers-from-terminal +# libreria en python (python-escpos) +# https://github.com/python-escpos/python-escpos +# https://stackoverflow.com/questions/24225647/docker-a-way-to-give-access-to-a-host-usb-or-serial-device + + +from src.factories.log_factory import get_log +class PrintComponent: + + def __init__(self): + self.__log = get_log() + + + def get_printers(self): + cmd = "lpstat -p | awk '{print $2}'" + self.__log.save(cmd,"cmd get_printers") + r = CmdComponent.exec(cmd) + return r + + +def printit(): + print("printing....") + pathfile = "./to-print.txt" + printer = "Brother_DCP_1610W_series" + # os.startfile(pathfile, printer) # error + cmd = f"lpr -P {printer} {pathfile}" + r = exec(cmd) + print(r) + +def show_printers(): + cmd = "lpstat -p | awk '{print $2}'" + r = os.popen(cmd).read() + print(r) + +def show_printers2(): + print("show printers 2:\n") + cmd = "lpstat -p | awk '{print $2}'" + r = exec(cmd) + print(r) + +def show_pool(): + print("show pool:\n") + cmd = "lpstat -p | awk '{print $2}' | xargs -n1 lpq -P" + r = exec(cmd) + print(r) + +if __name__ == "__main__": + show_printers() + show_printers2() + show_pool() + printit() diff --git a/pyprint/pyprint/src/components/print_osx_component.py b/pyprint/pyprint/src/components/print_osx_component.py new file mode 100644 index 00000000..5fe80293 --- /dev/null +++ b/pyprint/pyprint/src/components/print_osx_component.py @@ -0,0 +1,16 @@ +from src.factories.log_factory import get_log +from src.components.cmd_component import CmdComponent + +class PrintOsxComponent: + + def __init__(self): + self.__log = get_log() + + + def get_printers(self): + cmd = "lpstat -p | awk '{print $2}'" + self.__log.save(cmd,"cmd get_printers") + r = CmdComponent.exec(cmd) + return r + + \ No newline at end of file diff --git a/pyprint/pyprint/src/components/print_windows_component.py b/pyprint/pyprint/src/components/print_windows_component.py new file mode 100644 index 00000000..34888f5d --- /dev/null +++ b/pyprint/pyprint/src/components/print_windows_component.py @@ -0,0 +1,77 @@ +from src.factories.log_factory import get_log +from src.components.cmd_component import CmdComponent + +# aqui salta la excepcion queda comprobar el so +import win32print + +# integratos +# http://newcenturycomputers.net/projects/pythonicwindowsprinting.html + +# https://es.stackoverflow.com/questions/4185/imprimir-datos-en-una-impresora-desde-python-en-windows +# http://timgolden.me.uk/python/win32_how_do_i/print.html +# Use EnumPrintersW to list local printers with their names and descriptions. +# Tested with CPython 2.7.10 and IronPython 2.7.5. + +import ctypes +from ctypes.wintypes import BYTE, DWORD, LPCWSTR + +winspool = ctypes.WinDLL('winspool.drv') # for EnumPrintersW +msvcrt = ctypes.cdll.msvcrt # for malloc, free + +# Parameters: modify as you need. See MSDN for detail. +PRINTER_ENUM_LOCAL = 2 +Name = None # ignored for PRINTER_ENUM_LOCAL +Level = 1 # or 2, 4, 5 + +class PRINTER_INFO_1(ctypes.Structure): + _fields_ = [ + ("Flags", DWORD), + ("pDescription", LPCWSTR), + ("pName", LPCWSTR), + ("pComment", LPCWSTR), + ] + + + +class PrintWindowsComponent: + + def __init__(self): + self.__log = get_log() + + + def get_printers(self): + # Invoke once with a NULL pointer to get buffer size. + # ctypes.wintypes.LP_c_byte + devices = ctypes.POINTER(BYTE)() + pr(devices,"devices") + pcbNeeded = DWORD(0) + pr(pcbNeeded,"pcbneeded") + pcReturned = DWORD(0) # the number of PRINTER_INFO_1 structures retrieved + pr(pcReturned,"pcreturned") + winspool.EnumPrintersW(PRINTER_ENUM_LOCAL, Name, Level, ctypes.byref(devices), 0, + ctypes.byref(pcbNeeded), ctypes.byref(pcReturned)) + + bufsize = pcbNeeded.value + buffer = msvcrt.malloc(bufsize) + winspool.EnumPrintersW(PRINTER_ENUM_LOCAL, Name, Level, buffer, bufsize, + ctypes.byref(pcbNeeded), ctypes.byref(pcReturned)) + devices = ctypes.cast(buffer, ctypes.POINTER(PRINTER_INFO_1)) + + printers = [] + for i in range(pcReturned.value): + print(devices[i].pName) + printers.append({"name": devices[i].pName, "description":devices[i].pDescription}) + #print devices[i].pName, '=>', devices[i].pDescription + msvcrt.free(buffer) + return printers + + + def print(self): + tempprinter = "\\\\server01\\printer01" + currentprinter = win32print.GetDefaultPrinter() + + win32print.SetDefaultPrinter(tempprinter) + win32api.ShellExecute(0, "print", filename, None, ".", 0) + win32print.SetDefaultPrinter(currentprinter) + pass + #win32api.ShellExecute(0, 'open', 'gsprint.exe', '-printer "\\\\' + self.server + '\\' + self.printer_name + '" ' + file, '.', 0) diff --git a/pyprint/pyprint/src/controllers/debug_controller.py b/pyprint/pyprint/src/controllers/debug_controller.py new file mode 100755 index 00000000..508b395d --- /dev/null +++ b/pyprint/pyprint/src/controllers/debug_controller.py @@ -0,0 +1,10 @@ +from src.services.debug_service import DebugService + +class DebugController: + + def index(self): + r = (DebugService()).get_index() + return r + + def get_test(self, slug, perro): + return {"slug_1": slug, "perro_1": perro} \ No newline at end of file diff --git a/pyprint/pyprint/src/controllers/home_controller.py b/pyprint/pyprint/src/controllers/home_controller.py new file mode 100755 index 00000000..816e8b98 --- /dev/null +++ b/pyprint/pyprint/src/controllers/home_controller.py @@ -0,0 +1,34 @@ +from src.services.home_service import HomeService +from fastapi import Request +from src.factories.log_factory import get_log +from src.factories.print_factory import get_print_component +from src.functions.system import get_os + +class HomeController: + + def __init__(self): + self.__log = get_log() + + def index(self): + routes = [ + {"url":"/","description":"routes"}, + {"url":"/printers","description":"all printers"}, + {"url":"/prueba/{slug}","description":"prueba de slug"}, + {"url":"/debug","description":"debug"}, + ] + + r = { + "os": get_os(), + "routes": routes + } + return r + + def printers(self): + r = (get_print_component()).get_printers() + #pd(r,"r") + return { + "printers": r + } + + def test(self, slug: str, request:Request): + return {"controller": "HomeController", "method": "test", "param":slug, "ip":request.client.host} \ No newline at end of file diff --git a/pyprint/pyprint/src/enums/os.py b/pyprint/pyprint/src/enums/os.py new file mode 100644 index 00000000..bb4a6b2a --- /dev/null +++ b/pyprint/pyprint/src/enums/os.py @@ -0,0 +1,7 @@ +from enum import Enum + +class OS(Enum): + LINUX1 = "linux" + LINUX2 = "linux2" + MACOS = "darwin" + WINDOWS = "win32" diff --git a/pyprint/pyprint/src/factories/log_factory.py b/pyprint/pyprint/src/factories/log_factory.py new file mode 100644 index 00000000..6e0e42c9 --- /dev/null +++ b/pyprint/pyprint/src/factories/log_factory.py @@ -0,0 +1,5 @@ +from src.boot.paths import PATH_LOGS +from src.components.log_component import LogComponent + +def get_log(subtype: str="debug") -> LogComponent: + return LogComponent(pathfolder=PATH_LOGS, subtype=subtype) diff --git a/pyprint/pyprint/src/factories/print_factory.py b/pyprint/pyprint/src/factories/print_factory.py new file mode 100644 index 00000000..ec28f9ef --- /dev/null +++ b/pyprint/pyprint/src/factories/print_factory.py @@ -0,0 +1,10 @@ +from src.functions.system import * +from src.components.print_osx_component import PrintOsxComponent +from src.components.print_windows_component import PrintWindowsComponent + +def get_print_component(): + + if is_linux() or is_macos(): + return PrintOsxComponent() + elif is_windows(): + return PrintWindowsComponent() \ No newline at end of file diff --git a/pyprint/pyprint/src/functions/date.py b/pyprint/pyprint/src/functions/date.py new file mode 100644 index 00000000..b6fe7635 --- /dev/null +++ b/pyprint/pyprint/src/functions/date.py @@ -0,0 +1,5 @@ +from datetime import datetime + +def get_today(): + today = datetime.today() + return today.strftime("%Y%m%d") \ No newline at end of file diff --git a/pyprint/pyprint/src/functions/system.py b/pyprint/pyprint/src/functions/system.py new file mode 100644 index 00000000..f4b609cb --- /dev/null +++ b/pyprint/pyprint/src/functions/system.py @@ -0,0 +1,29 @@ +from sys import platform +from src.enums.os import OS +from src.factories.log_factory import get_log + + +log = get_log() +log.save(platform,"platform") + +def is_linux(): + print(platform) + return platform == OS.LINUX1.value or platform == OS.LINUX2.value + +def is_windows(): + return platform == OS.WINDOWS.value + +def is_macos(): + return platform == OS.MACOS.value + +def get_os(): + if is_linux(): + return OS.LINUX1.value + + if is_windows(): + return OS.WINDOWS.value + + if is_macos(): + return OS.MACOS.value + + return "Not found" \ No newline at end of file diff --git a/pyprint/pyprint/src/routes/all.py b/pyprint/pyprint/src/routes/all.py new file mode 100644 index 00000000..9d592e53 --- /dev/null +++ b/pyprint/pyprint/src/routes/all.py @@ -0,0 +1,2 @@ +from .home import * +from .debug import * \ No newline at end of file diff --git a/pyprint/pyprint/src/routes/debug.py b/pyprint/pyprint/src/routes/debug.py new file mode 100644 index 00000000..ac1e14ec --- /dev/null +++ b/pyprint/pyprint/src/routes/debug.py @@ -0,0 +1,7 @@ +from src.boot.fastapi import app, Request + +from src.controllers.debug_controller import DebugController + +@app.get("/debug") +def index(): + return (DebugController()).index() \ No newline at end of file diff --git a/pyprint/pyprint/src/routes/home.py b/pyprint/pyprint/src/routes/home.py new file mode 100755 index 00000000..849b9b94 --- /dev/null +++ b/pyprint/pyprint/src/routes/home.py @@ -0,0 +1,19 @@ +from src.boot.fastapi import app, Request + +from typing import Optional +from src.controllers.home_controller import HomeController + + +@app.get("/") +def home(): + return (HomeController()).index() + +@app.get("/printers") +def home(): + return (HomeController()).printers() + +# para que llegue q hay que enviar todo con cabecer accpet application/json +@app.get("/prueba/{slug}") +def test(slug: str, request: Request): + #return {"x":"y"} + return (HomeController()).test(slug=slug, request=request) \ No newline at end of file diff --git a/pyprint/pyprint/src/services/debug_service.py b/pyprint/pyprint/src/services/debug_service.py new file mode 100755 index 00000000..71fe33e3 --- /dev/null +++ b/pyprint/pyprint/src/services/debug_service.py @@ -0,0 +1,12 @@ +import sys +import os + +class DebugService: + + def get_index(self): + paths = [] + for p in sys.path: + p = os.path.realpath(p) + paths.append(p) + + return {"DebugService":"Python Print","paths":paths} diff --git a/pyprint/pyprint/src/services/home_service.py b/pyprint/pyprint/src/services/home_service.py new file mode 100755 index 00000000..0375cee7 --- /dev/null +++ b/pyprint/pyprint/src/services/home_service.py @@ -0,0 +1,7 @@ +import sys +import os + +class HomeService: + + def get_index(self): + return {"HomeService":"HomeService->get_index"} diff --git a/pyprint/pyprint/tests/__init__.py b/pyprint/pyprint/tests/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/pyprint/pyprint/tests/to-print.txt b/pyprint/pyprint/tests/to-print.txt new file mode 100755 index 00000000..4be86b53 --- /dev/null +++ b/pyprint/pyprint/tests/to-print.txt @@ -0,0 +1,4 @@ +Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, +when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap +into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum +passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. \ No newline at end of file diff --git a/pythonexpert/README.md b/pythonexpert/README.md new file mode 100644 index 00000000..8a05c481 --- /dev/null +++ b/pythonexpert/README.md @@ -0,0 +1,249 @@ +# [James Powell: So you want to be a Python expert? | PyData Seattle 2017](https://www.youtube.com/watch?v=cKPlPJyQrt4) + +## [data-model](https://youtu.be/cKPlPJyQrt4?t=471) +- [Doc python sobre data model](https://docs.python.org/3/reference/datamodel.html) +- [data-model.py](https://github.com/eacevedof/prj_python37/blob/master/pythonexpert/datamodel/data-model.py) +```py +# suma de polinomios +def __add__(self,other): + return Polynomial(*(x+y for x,y in zip(self.coeffs, other.coeffs))) + +p1 = Polynomial(1,2,3) +p2 = Polynomial(3,4,3) + +# py -i data-model.py +p3 = p1 + p2 +``` +- [metaclasses](https://youtu.be/cKPlPJyQrt4?t=1334) + - Se intenta que el código falle antes de entrar en ejecución si no exite el método foo + ```py + from library import Base + + assert hasattr(Base,"foo"), "you broke it you fool!" + + class Derived(Base): + + def bar(self): + return self.foo + ``` + - mostraria este error + ```py + Traceback (most recent call last): + File "user.py", line 3, in + assert hasattr(Base,"foo"), "you broke it you fool!" + AssertionError: you broke it you fool! + ``` + - Otro caso, como nos aseguramos que Derived tenga el método bar? + ```py + # library.py + class Base: + def foo(self): + return self.bar + + from library import Base + assert hasattr(Base,"foo"), "you broke it you fool!" + + # user.py + class Derived(Base): + def bar(self): + return "bar" + ``` + - 3 opciones. + - Metaclases + - Try Catch, esta no ayuda mucho ya que si no se usa el método foo y despues en producción si entonces dará error en tiempo de ejecución. + - + +- [self.bar()](https://youtu.be/cKPlPJyQrt4?t=1779) + - El creador de la librearia `library.py` asume que el desarrollador que vaya a usarla va a crear el método `bar()` + - No sirve el [`try catch`](https://youtu.be/cKPlPJyQrt4?t=1902) + - Python como lenguaje en su totalidad es orientado a protocolo, quiere decir que, desde cualquier punto del progama se puede utilizar los, hooks, protocolos y valores seguros (safety values) + - En python todo se ejecuta en **`runtime`** + - En el siguiente ejemplo se intenta obligar a que exista el método bar en todas las clases hijas + ```py + def _(): + class Base: + pass + + # dis: disasembler + from dis import dis + + dis(_) + + >>> dis(_) + 2 0 LOAD_BUILD_CLASS + 2 LOAD_CONST 1 (", line 2>) + 4 LOAD_CONST 2 ('Base') + 6 MAKE_FUNCTION 0 + 8 LOAD_CONST 2 ('Base') + 10 CALL_FUNCTION 2 + 12 STORE_FAST 0 (Base) + 14 LOAD_CONST 0 (None) + 16 RETURN_VALUE + + Disassembly of ", line 2>: + 2 0 LOAD_NAME 0 (__name__) + 2 STORE_NAME 1 (__module__) + 4 LOAD_CONST 0 ('_..Base') + 6 STORE_NAME 2 (__qualname__) + + 3 8 LOAD_CONST 1 (None) + 10 RETURN_VALUE + ``` + - Usando el hook `__build_class__` + - [def my_bc](https://youtu.be/cKPlPJyQrt4?t=2225) + ```py + py -i user.py + my buildclass-> (, 'Derived', ) {} + ``` + - Comprueba si el método **bar()** existe en el hijo + ```py + old_bc = __build_class__ + + def my_bc(fun,name,base=None,**kw): + if base is Base: + print("Check if bar method is defined") + if base is not None: + # porque le pasa base + return old_bc(fun,name,base,**kw) + + return old_bc(fun, name, **kw) + + import builtins + builtins.__build_class__ = my_bc + + λ py -i user.py + Check if bar method is defined + ``` + - Hay que entender que este patrón existe + - No es la mejor opción para resolver el problema + - `__build_class__` no es la opción que se suele usar + - Hay otras dos opciones. + - Metaclass + - __init_subclass__(cls,*a,**kw) + +- [class Base(metaclass=BaseMeta):](https://youtu.be/cKPlPJyQrt4?t=2459) + ```py + # library.py + class BaseMeta(type): + def __new__(cls, name, bases, body): + if not 'bar' in body: + raise TypeError("Bad user class") + + print("BaseMeta.__new__",cls,name,bases,body) + return super().__new__(cls,name,bases,body) + + class Base(metaclass=BaseMeta): + def foo(self): + return self.bar() + + λ py -i user.py BaseMeta.__new__ Base () {'__module__': 'library', '__qualname__': 'Base', 'foo': } BaseMeta.__new__ Derived (,) {'__module__': '__main__', '__qualname__': 'Derived', 'bar': } + + # con esta condicion: + if not 'bar' in body: + raise TypeError("Bad user class") + + λ py -i user.py + Traceback (most recent call last): + File "user.py", line 2, in + from library import Base + File "E:\xampp\htdocs\prj_python37\pythonexpert\metaclasses\library.py", line 10, in + class Base(metaclass=BaseMeta): + File "E:\xampp\htdocs\prj_python37\pythonexpert\metaclasses\library.py", line 5, in __new__ + raise TypeError("Bad user class") + TypeError: Bad user class + + # library.py + class BaseMeta(type): + def __new__(cls, name, bases, body): + if name!="Base" and not 'bar' in body: + raise TypeError("Bad user class") + + print("BaseMeta.__new__",cls,name,bases,body) + return super().__new__(cls,name,bases,body) + + class Base(metaclass=BaseMeta): + def foo(self): + return self.bar() + + def __init_subclass__(self,*a,**kw): + print("init_subclass",a,kw) + return super().__init_subclass__(*a,**kw) + + λ py -i user.py + BaseMeta.__new__ Base () {'__module__': 'library', '__qualname__': 'Base', 'foo': , '__init_subclass__': , '__classcell__': } + BaseMeta.__new__ Derived (,) {'__module__': '__main__', '__qualname__': 'Derived', 'bar': } + init_subclass () {} + ``` +[decorators](https://youtu.be/cKPlPJyQrt4?t=2846) +```py +>>> from inspect import getsource +>>> +>>> getsource(add) +'def add(x,y):\n return x + y\n' +``` +## [Diferencia entre función "add1" y class "Adder"](https://youtu.be/cKPlPJyQrt4?t=4064) +```py +def add1(x,y): + return x+y + +class Adder(): + def __call__(self,x,y): + return x+y + +# con __call__ realmente se está creando una función +add2 = Adder() + +type(add1) == type(add2) # function +``` +- Si del ejemplo anterior sacamos una conclusión es que una Clase sin estado es una función +- Una función es la forma bonita o limpia de representar una clase sin estado +- Una función generadora no es más que una clase que implementa **__iter__** y **__next__** +- La clase generadora no es tan facil de leer y de escribir por lo tanto tiene su [función equivalente](https://youtu.be/cKPlPJyQrt4?t=4665). *Uso de Yield* +```py +# función generadora de numeros uno a uno +def compute(): + for i in range(10): + sleep(.5) + yield 1 + +for val in compute(): + print(val) +``` +- Supongamos que tenemos una clase con unos metodos que deben de respetar un orden de llamada +```py +obj = Api() +obj.go_first() +obj.go_second() +obj.go_end() +``` +- Como podríamos asegurar que siempre se ejecute en ese orden? +- Una función generadora no solo devuelve un dato por unidad de tiempo sino que permite inyectar o interactuar antes, durante y despues de la devolución +- Entra en juego el concepto de [**corutines**](https://youtu.be/cKPlPJyQrt4?t=4894), es un trozo de código que se ejecuta de inicio a fin +- Si lo vemos desde una perspectiva de "user code" y "library code" las co-rutinas es la interacción de ambos códigos de manera alterna. +- Generators no son más que co-rutinas que permiten el solapamiento de codigo. *La verdad que esto no lo he entendido muy bien* +```py +# la alternativa sería +def api(): + first() + yield + second() + yield + last() +``` +- Un **contextmanager** es una clase que implementa los siguientes métodos: + - __init__, __call__, __enter__, __exit__ + - Dentro de __enter__ y __exit__ hace un next() + - Existe un decorator **@contextmanager** que convierte un generator en un contextmanager `from contextLib import contextmanager` +- [Explica las 3 estructuras juntas](https://youtu.be/cKPlPJyQrt4?t=5851) + - [contextmanagers](https://youtu.be/cKPlPJyQrt4?t=5900) + - Es código que mapea acciones de configuración y ejecución interna, es decir, las acciones internas solo ocurren si las de configuración se han ejecutado. + - [generators](https://youtu.be/cKPlPJyQrt4?t=5914) + - Es básicamente una sintaxis formal que nos permite hacer cosas como forzar una ejecución ordenada y el solapamiento de código. + - En el caso del contextmanager obliga el solapamiento ya que tiene unas acciones de configuración que se deben ejecutar en conjunto con las acciones finales. El setup debe ejecutarse antes de las acciones finales. + - [decorators](https://youtu.be/cKPlPJyQrt4?t=5942) + - Necesitamos un adaptador del generator al modelo de datos, hemos llevado el funcionamiento del generator para que se acople con los dunder methods + - **Nota** + - Debo probar y jugar con este último ejemplo porque de vista se ve complicado. + + + diff --git a/pythonexpert/datamodel/data-model.py b/pythonexpert/datamodel/data-model.py new file mode 100644 index 00000000..d83dd4de --- /dev/null +++ b/pythonexpert/datamodel/data-model.py @@ -0,0 +1,20 @@ +# data-model.py +class Polynomial(): + + def __init__(self,*coeffs): + self.coeffs = coeffs + + def __repr__(self): + return 'Polynomial(*{!r})'.format(self.coeffs) + + def __add__(self,other): + return Polynomial(*(x+y for x,y in zip(self.coeffs, other.coeffs))) + + def __len__(self): + return len(self.coeffs) + + +p1 = Polynomial(1,2,3) +p2 = Polynomial(3,4,3) + +# py -i data-model diff --git a/pythonexpert/decorators/dec.py b/pythonexpert/decorators/dec.py new file mode 100644 index 00000000..612f6adb --- /dev/null +++ b/pythonexpert/decorators/dec.py @@ -0,0 +1,5 @@ +# dec.py + +def add(x,y): + return x + y + diff --git a/pythonexpert/metaclasses/library.py b/pythonexpert/metaclasses/library.py new file mode 100644 index 00000000..31ee2600 --- /dev/null +++ b/pythonexpert/metaclasses/library.py @@ -0,0 +1,16 @@ +# library.py +class BaseMeta(type): + def __new__(cls, name, bases, body): + if name!="Base" and not 'bar' in body: + raise TypeError("Bad user class") + + print("BaseMeta.__new__",cls,name,bases,body) + return super().__new__(cls,name,bases,body) + +class Base(metaclass=BaseMeta): + def foo(self): + return self.bar() + + def __init_subclass__(self,*a,**kw): + print("init_subclass",a,kw) + return super().__init_subclass__(*a,**kw) \ No newline at end of file diff --git a/pythonexpert/metaclasses/user.py b/pythonexpert/metaclasses/user.py new file mode 100644 index 00000000..fe2e565d --- /dev/null +++ b/pythonexpert/metaclasses/user.py @@ -0,0 +1,10 @@ +# user.py +from library import Base + +assert hasattr(Base,"foo"), "you broke it you fool!" + +class Derived(Base): + + def bar(self): + return "bar" + diff --git a/qr_generator/.gitignore b/qr_generator/.gitignore new file mode 100644 index 00000000..159bde10 --- /dev/null +++ b/qr_generator/.gitignore @@ -0,0 +1,126 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json \ No newline at end of file diff --git a/qr_generator/logos/chalan-full.png b/qr_generator/logos/chalan-full.png new file mode 100644 index 00000000..271cc503 Binary files /dev/null and b/qr_generator/logos/chalan-full.png differ diff --git a/qr_generator/logos/chalan-head.png b/qr_generator/logos/chalan-head.png new file mode 100644 index 00000000..852af768 Binary files /dev/null and b/qr_generator/logos/chalan-head.png differ diff --git a/qr_generator/logos/chalan.jpg b/qr_generator/logos/chalan.jpg new file mode 100644 index 00000000..43caf814 Binary files /dev/null and b/qr_generator/logos/chalan.jpg differ diff --git a/qr_generator/logos/chalan.psd b/qr_generator/logos/chalan.psd new file mode 100644 index 00000000..e1b69510 Binary files /dev/null and b/qr_generator/logos/chalan.psd differ diff --git a/qr_generator/logos/jasmira-logo.jpg b/qr_generator/logos/jasmira-logo.jpg new file mode 100644 index 00000000..f7b43489 Binary files /dev/null and b/qr_generator/logos/jasmira-logo.jpg differ diff --git a/qr_generator/main.py b/qr_generator/main.py new file mode 100644 index 00000000..aea021f6 --- /dev/null +++ b/qr_generator/main.py @@ -0,0 +1,65 @@ +import qrcode +from PIL import Image, ImageDraw + +css = { + "background": (208, 31, 47), # chalan rojo + "color": (255, 255, 255), # chalan casi negro + + "background": (255, 255, 255), #jasmira blanco + "color": (4,87,98), # Jasmira turquesa +} + +URL_TO_QR = "http://elchalanaruba.com/la-carta-con-precios" +LOGO_IMAGE_MIDDLE = "chalan-head.png" +IMG_QR_GENERATED = "qr_chalan.png" + +URL_TO_QR = "https://www.facebook.com/share/4NMKZ6KEqasfJQKr/?mibextid=qi2Omg" +LOGO_IMAGE_MIDDLE = "jasmira-logo.jpg" +IMG_QR_GENERATED = "qr_jasmira.png" + +def _get_qr_code_with_url() -> qrcode.QRCode: + # Generate QR code + qr_code = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_H, + box_size=10, + border=2, + ) + url = URL_TO_QR + qr_code.add_data(url) + qr_code.make(fit=True) + return qr_code + + +def _get_qr_image_from_qr_code(qr_code: qrcode.QRCode) -> Image: + # Generate QR image + qr_image = qr_code.make_image( + back_color=css.get("background"), + fill_color=css.get("color") + ) + + # Generate mask + mask = Image.new("L", qr_image.size, 0) + draw = ImageDraw.Draw(mask) + draw.rounded_rectangle([0, 0, *qr_image.size], radius=20, fill=255) + + # Apply mask + qr_image.putalpha(mask) + return qr_image + + +def _append_logo_to_qr_image(qr_image: Image) -> Image: + image_logo = Image.open(f"./logos/{LOGO_IMAGE_MIDDLE}") + logo_size = min(qr_image.size) // 5 + logo_pos = ((qr_image.size[0] - logo_size) // 2, (qr_image.size[1] - logo_size) // 2) + + image_logo = image_logo.resize((logo_size, logo_size)) + qr_image.paste(image_logo, logo_pos) + return qr_image + + +if __name__ == "__main__": + qr_code = _get_qr_code_with_url() + qr_image = _get_qr_image_from_qr_code(qr_code) + _append_logo_to_qr_image(qr_image) + qr_image.save(f"./qr_images/{IMG_QR_GENERATED}") diff --git a/qr_generator/makefile b/qr_generator/makefile new file mode 100644 index 00000000..7596a664 --- /dev/null +++ b/qr_generator/makefile @@ -0,0 +1,13 @@ +#!/bin/bash +TODAY := $(shell date +'%Y-%m-%d') +NOW := $(shell date +'%Y-%m-%d %H:%M:%S') + +help: ## Show this help message + @echo "usage: make [target]" + @echo + @echo "targets:" + @egrep "^(.+)\:\ ##\ (.+)" ${MAKEFILE_LIST} | column -t -c 2 -s ":#" + +gitpush: ## git push m=any message + clear; + git add .; git commit -m "$(m)"; git push; diff --git a/qr_generator/qr_images/qr_jasmira.png b/qr_generator/qr_images/qr_jasmira.png new file mode 100644 index 00000000..dd406ff9 Binary files /dev/null and b/qr_generator/qr_images/qr_jasmira.png differ diff --git a/qr_generator/qr_images/qr_url.png b/qr_generator/qr_images/qr_url.png new file mode 100644 index 00000000..375f2a02 Binary files /dev/null and b/qr_generator/qr_images/qr_url.png differ diff --git a/qr_generator/readme.md b/qr_generator/readme.md new file mode 100644 index 00000000..e69de29b diff --git a/qr_generator/requirements.txt b/qr_generator/requirements.txt new file mode 100644 index 00000000..edaa3497 --- /dev/null +++ b/qr_generator/requirements.txt @@ -0,0 +1,2 @@ +qrcode[pil]==7.4.2 +pillow==10.3.0 \ No newline at end of file diff --git a/selenium/Pipfile b/selenium/Pipfile new file mode 100644 index 00000000..1a75195f --- /dev/null +++ b/selenium/Pipfile @@ -0,0 +1,9 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +selenium = "==4.7.2" + +[dev-packages] diff --git a/selenium/Pipfile.lock b/selenium/Pipfile.lock new file mode 100644 index 00000000..281860aa --- /dev/null +++ b/selenium/Pipfile.lock @@ -0,0 +1,141 @@ +{ + "_meta": { + "hash": { + "sha256": "e44d5a1d855950b0b3045b2517ce964eb43605dcc687634689c6aea82e7cb975" + }, + "pipfile-spec": 6, + "requires": {}, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "async-generator": { + "hashes": [ + "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", + "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144" + ], + "markers": "python_version >= '3.5'", + "version": "==1.10" + }, + "attrs": { + "hashes": [ + "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", + "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + ], + "markers": "python_version >= '3.6'", + "version": "==22.2.0" + }, + "certifi": { + "hashes": [ + "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", + "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + ], + "markers": "python_version >= '3.6'", + "version": "==2022.12.7" + }, + "exceptiongroup": { + "hashes": [ + "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e", + "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23" + ], + "markers": "python_version < '3.11'", + "version": "==1.1.0" + }, + "h11": { + "hashes": [ + "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", + "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.0" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "outcome": { + "hashes": [ + "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672", + "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.0" + }, + "pysocks": { + "hashes": [ + "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", + "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", + "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" + ], + "version": "==1.7.1" + }, + "selenium": { + "hashes": [ + "sha256:06a1c7d9f313130b21c3218ddd8852070d0e7419afdd31f96160cd576555a5ce", + "sha256:3aefa14a28a42e520550c1cd0f29cf1d566328186ea63aa9a3e01fb265b5894d" + ], + "index": "pypi", + "version": "==4.7.2" + }, + "sniffio": { + "hashes": [ + "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", + "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.0" + }, + "sortedcontainers": { + "hashes": [ + "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", + "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" + ], + "version": "==2.4.0" + }, + "trio": { + "hashes": [ + "sha256:ce68f1c5400a47b137c5a4de72c7c901bd4e7a24fbdebfe9b41de8c6c04eaacf", + "sha256:f1dd0780a89bfc880c7c7994519cb53f62aacb2c25ff487001c0052bd721cdf0" + ], + "markers": "python_version >= '3.7'", + "version": "==0.22.0" + }, + "trio-websocket": { + "hashes": [ + "sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc", + "sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe" + ], + "markers": "python_version >= '3.5'", + "version": "==0.9.2" + }, + "urllib3": { + "extras": [ + "socks" + ], + "hashes": [ + "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", + "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.14" + }, + "wsproto": { + "hashes": [ + "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", + "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==1.2.0" + } + }, + "develop": {} +} diff --git a/selenium/README.md b/selenium/README.md new file mode 100644 index 00000000..90c225b7 --- /dev/null +++ b/selenium/README.md @@ -0,0 +1,47 @@ +# Tutorial de selenium by Pablo Sofer + +#### [Tutorial Seleninum Capítulo 1: "Hola Mundo"](https://www.youtube.com/watch?v=N-rdcdWmYck&list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP&index=2) + +- [Driver](https://chromedriver.storage.googleapis.com/index.html?path=75.0.3770.90/) +- **chromedriver.exe** +- [Site demo](http://newtours.demoaut.com/) + +#### [Cap 2 - Dropdown](https://youtu.be/lB9pypRYev4?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP&t=88) +- dropdown.py + +#### [Cap 3 - Localizando elementos](https://youtu.be/DXSgxIgoZ2E?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- distintos métodos para navegar por el DOM + +#### [Cap 4 - Localizando por Id y Name](https://youtu.be/YLYNThOaP9w?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- google.py + +#### [Cap 5 - Utilizando FirePath](https://youtu.be/H2okGWszwo0?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- firepath.py +- instalar firepath addon en el navegador de modo que nos ayude a decifrar el xpath de un nodo +#### [Cap 6 - Asserts](https://youtu.be/sZqxadW_E6o?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- asserts.py +- vamos a usar el assert de selenium pero despues usaremos mejores herramientas +```py +assert link_registration_form.text == "registration form" +assert link_registration_form.tag_name == "p + +File "asserts.py", line 20, in + assert link_registration_form.text == "registration form xxxxxxxxxxx" +AssertionError +``` +#### [Cap 7 - Unit test](https://youtu.be/k3eq4RnVCDQ?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- newtourtest.py +- Ya ha pasado los test, es necesario llamar a: **def setUp(self):** + +#### [Cap 8 - Más Asserts](https://youtu.be/BXEDlUobvV8?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- newtourtest.py +- test_dropdown +- assertFalse en lugar de assertEquals +```py +newtourtest.py:35: DeprecationWarning: Please use assertEqual instead. + self.assertEquals(link_registration_form.text,"registration form") +``` +#### [Cap 9 - Page Objects parte 1](https://youtu.be/cHWt_gFkU2M?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP) +- newtourtest.py +- pasando lineas repetidas al setup +- pageindex.py diff --git a/selenium/poc/asserts.py b/selenium/poc/asserts.py new file mode 100644 index 00000000..66cc9c4b --- /dev/null +++ b/selenium/poc/asserts.py @@ -0,0 +1,22 @@ +# asserts.py +# https://youtu.be/sZqxadW_E6o?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP + +import time +from selenium import webdriver + +driver = webdriver.Chrome("chromedriver.exe") +driver.get("http://newtours.demoaut.com") +time.sleep(1) +# user_box = driver_factory.py.find_element_by_name("userName") +user_box = driver.find_element_by_xpath("/html/body/div[1]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/form/table/tbody/tr[4]/td/table/tbody/tr[2]/td[2]/input_data") +# pass_box = driver_factory.py.find_element_by_name("password") +pass_box = driver.find_element_by_xpath("/html/body/div[1]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/form/table/tbody/tr[4]/td/table/tbody/tr[3]/td[2]/input_data") +submit_button = driver.find_element_by_name("login") +user_box.send_keys("test") +pass_box.send_keys("test") +submit_button.click() +time.sleep(1) +link_registration_form = driver.find_element_by_link_text("registration form") +assert link_registration_form.text == "registration form" +assert link_registration_form.tag_name == "p" +driver.quit() \ No newline at end of file diff --git a/selenium/poc/dropdown.py b/selenium/poc/dropdown.py new file mode 100644 index 00000000..c821710c --- /dev/null +++ b/selenium/poc/dropdown.py @@ -0,0 +1,16 @@ +# dropdown.py +# https://youtu.be/lB9pypRYev4?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP&t=88 +import time +from selenium import webdriver +from selenium.webdriver.support.ui import Select +driver = webdriver.Chrome("chromedriver.exe") +driver.get("http://newtours.demoaut.com") +time.sleep(1) +driver.find_element_by_link_text("REGISTER").click() +countryDropDown = Select(driver.find_element_by_name("country")) +countryDropDown.select_by_index(5) +countryDropDown.select_by_value("11") #bahamas +countryDropDown.select_by_visible_text("CONGO") +time.sleep(5) +driver.quit() + diff --git a/selenium/poc/firepath.py b/selenium/poc/firepath.py new file mode 100644 index 00000000..06fbbe1f --- /dev/null +++ b/selenium/poc/firepath.py @@ -0,0 +1,19 @@ +# firepath.py +# https://youtu.be/H2okGWszwo0?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP + +import time +from selenium import webdriver + +driver = webdriver.Chrome("chromedriver.exe") +driver.get("http://newtours.demoaut.com") +time.sleep(5) +# user_box = driver_factory.py.find_element_by_name("userName") +user_box = driver.find_element_by_xpath("/html/body/div[1]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/form/table/tbody/tr[4]/td/table/tbody/tr[2]/td[2]/input_data") +# pass_box = driver_factory.py.find_element_by_name("password") +pass_box = driver.find_element_by_xpath("/html/body/div[1]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/form/table/tbody/tr[4]/td/table/tbody/tr[3]/td[2]/input_data") +submit_button = driver.find_element_by_name("login") +user_box.send_keys("test") +pass_box.send_keys("test") +submit_button.click() +time.sleep(5) +driver.quit() \ No newline at end of file diff --git a/selenium/poc/google.py b/selenium/poc/google.py new file mode 100644 index 00000000..68676199 --- /dev/null +++ b/selenium/poc/google.py @@ -0,0 +1,11 @@ +# google.py +# https://youtu.be/YLYNThOaP9w?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP +import time +from selenium import webdriver + +driver = webdriver.Chrome("chromedriver.exe") +driver.get("http://www.google.com") +time.sleep(2) +# searchbox = driver_factory.py.find_element_by_id("lst-ib") +searchbox = driver.find_element_by_name("q") +searchbox.send_keys("Perú") diff --git a/selenium/poc/main.py b/selenium/poc/main.py new file mode 100644 index 00000000..789f8d8f --- /dev/null +++ b/selenium/poc/main.py @@ -0,0 +1,18 @@ +# main.py +import time +from selenium import webdriver +from selenium.webdriver.chrome.service import Service + +#objdriver = webdriver.Chrome("chromedriver.exe") +service = Service("path-to-my-driver_factory.py") +objdriver = webdriver.Chrome(service=service) +objdriver.get("http://localhost:3000") +time.sleep(5) +user_box = objdriver.find_element_by_name("userName") +pass_box = objdriver.find_element_by_name("password") +submit_button = objdriver.find_element_by_name("login") +user_box.send_keys("test") +pass_box.send_keys("test") +submit_button.click() +time.sleep(5) +objdriver.quit() \ No newline at end of file diff --git a/selenium/poc/newtourtest.py b/selenium/poc/newtourtest.py new file mode 100644 index 00000000..26867620 --- /dev/null +++ b/selenium/poc/newtourtest.py @@ -0,0 +1,39 @@ +# newtourtest.py +# https://youtu.be/k3eq4RnVCDQ?list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP + +import time +import unittest +from selenium import webdriver +from selenium.webdriver.support.ui import Select +from pageindex import PageIndex + +class NewTours(unittest.TestCase): + + def setUp(self): + self.driver = webdriver.Chrome("chromedriver.exe") + self.driver.get("http://newtours.demoaut.com") + self.page_index = PageIndex(self.driver) + time.sleep(1) + + def test_dropdown(self): + self.driver.find_element_by_link_text("REGISTER").click() + countryDropDown = Select(self.driver.find_element_by_name("country")) + countryDropDown.select_by_index(5) + countryDropDown.select_by_value("11") #bahamas + countryDropDown.select_by_visible_text("CONGO") + # self.assertEquals(countryDropDown.first_selected_option.text.strip(),"CONGO") + self.assertTrue(countryDropDown.first_selected_option.text.strip() == "CONGO") + self.assertFalse(countryDropDown.first_selected_option.text.strip() == "ARGENTINA") + + def test_register(self): + self.page_index.login("test","test") + link_registration_form = self.driver.find_element_by_link_text("registration form") + self.assertEquals(link_registration_form.text,"registration form") + + + def teardown(self): + self.driver.quit() + + +if __name__ == '__main__': + unittest.main() diff --git a/selenium/poc/pageindex.py b/selenium/poc/pageindex.py new file mode 100644 index 00000000..3a1f7b9d --- /dev/null +++ b/selenium/poc/pageindex.py @@ -0,0 +1,24 @@ +# pageindex.py + +import time +# import unittest +# from selenium import webdriver +# from selenium.webdriver.support.ui import Select +# from Pages.PageIndex import * + +class PageIndex: + + def __init__(self, myDriver): + self.driver = myDriver + + def click_register(self): + self.driver.find_element_by_link_text("REGISTER").click() + + def login(self, user_name, password): + user_box = self.driver.find_element_by_name("userName") + pass_box = self.driver.find_element_by_name("password") + submit_button = self.driver.find_element_by_name("login") + user_box.send_keys(user_name) + pass_box.send_keys(password) + submit_button.click() + time.sleep(1) diff --git a/selenium/requirements.txt b/selenium/requirements.txt new file mode 100644 index 00000000..c7d20569 --- /dev/null +++ b/selenium/requirements.txt @@ -0,0 +1,7 @@ +selenium==4.7.2 +pytest +flake8 +webdriver_manager==3.8.5 +pyodbc~=4.0.35 +redis~=4.5.1 +python-dotenv~=0.21.0 diff --git a/selenium/vue/__init__.py b/selenium/vue/__init__.py new file mode 100644 index 00000000..eff8b632 --- /dev/null +++ b/selenium/vue/__init__.py @@ -0,0 +1,3 @@ +from dotenv import load_dotenv + +load_dotenv() \ No newline at end of file diff --git a/selenium/vue/db/__init__.py b/selenium/vue/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/db/application/__init__.py b/selenium/vue/db/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/db/application/test_db_service.py b/selenium/vue/db/application/test_db_service.py new file mode 100644 index 00000000..28fba05d --- /dev/null +++ b/selenium/vue/db/application/test_db_service.py @@ -0,0 +1,11 @@ +from vue.shared.infrastructure.factories.db import get_db + + +def get_users(): + db = get_db() + db.execute("SELECT * FROM users;") + row = db.fetchone() + while row: + print(row) + row = db.fetchone() + diff --git a/selenium/vue/db/infrastructure/__init__.py b/selenium/vue/db/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/db/infrastructure/test_db_controller.py b/selenium/vue/db/infrastructure/test_db_controller.py new file mode 100644 index 00000000..4e5fa8cb --- /dev/null +++ b/selenium/vue/db/infrastructure/test_db_controller.py @@ -0,0 +1,8 @@ +from vue.db.application.test_db_service import get_users + + +def __invoke() -> None: + get_users() + + +__invoke() diff --git a/selenium/vue/infra/__init__.py b/selenium/vue/infra/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/infra/redis/application/__init__.py b/selenium/vue/infra/redis/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/infra/redis/application/redis_get_service.py b/selenium/vue/infra/redis/application/redis_get_service.py new file mode 100644 index 00000000..77ebad79 --- /dev/null +++ b/selenium/vue/infra/redis/application/redis_get_service.py @@ -0,0 +1,22 @@ +import os +import redis +import logging + +logging.basicConfig(level=logging.INFO) + + +def get_all_keys_values(): + pr = """ + ============= + CONSUMER + ============= + """ + print(pr) + objredis = redis.Redis(host=os.getenv("REDIS_SERVER"), port=os.getenv("REDIS_PORT"), db=0) + all = objredis.keys("*") + for key in all: + value = objredis.get(key).decode("utf-8") if objredis.get(key) else "" + print(f"{key}: {value}") + + length = len(all) + print(f"total in consumer: {length}") diff --git a/selenium/vue/infra/redis/application/redis_put_service.py b/selenium/vue/infra/redis/application/redis_put_service.py new file mode 100644 index 00000000..de659681 --- /dev/null +++ b/selenium/vue/infra/redis/application/redis_put_service.py @@ -0,0 +1,26 @@ +from datetime import datetime, timedelta +import os +import redis +import logging + +logging.basicConfig(level=logging.INFO) + + +def put_random_values(): + pr = """ + ============= + PRODUCER + ============= + """ + print(pr) + objredis = redis.Redis(host=os.getenv("REDIS_SERVER"), port=os.getenv("REDIS_PORT"), db=0) + for i in range(0, 99): + key = f"id-{i}" + ttl = i + 50 + now = datetime.now() + strnow = now.strftime("%Y-%m-%d %H:%M:%S") + enddate = (now + timedelta(seconds=ttl)).strftime("%H:%M:%S") + value = f"some python value in string {strnow} - {enddate}" + print(f"{key}:{value}") + objredis.set(key, value) + objredis.expire(key, ttl) diff --git a/selenium/vue/infra/redis/infrastructure/__init__.py b/selenium/vue/infra/redis/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/infra/redis/infrastructure/test_redis_get_all_keys_controller.py b/selenium/vue/infra/redis/infrastructure/test_redis_get_all_keys_controller.py new file mode 100644 index 00000000..90fb2072 --- /dev/null +++ b/selenium/vue/infra/redis/infrastructure/test_redis_get_all_keys_controller.py @@ -0,0 +1,8 @@ +from vue.infra.redis.application.redis_get_service import get_all_keys_values + + +def __invoke() -> None: + get_all_keys_values() + + +__invoke() diff --git a/selenium/vue/infra/redis/infrastructure/test_redis_put_controller.py b/selenium/vue/infra/redis/infrastructure/test_redis_put_controller.py new file mode 100644 index 00000000..a8755ba8 --- /dev/null +++ b/selenium/vue/infra/redis/infrastructure/test_redis_put_controller.py @@ -0,0 +1,8 @@ +from vue.infra.redis.application.redis_put_service import put_random_values + + +def __invoke() -> None: + put_random_values() + + +__invoke() diff --git a/selenium/vue/oco/__init__.py b/selenium/vue/oco/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/__init__.py b/selenium/vue/oco/assets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/application/__init__.py b/selenium/vue/oco/assets/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/application/asset_create_keyline_service.py b/selenium/vue/oco/assets/application/asset_create_keyline_service.py new file mode 100644 index 00000000..fee12e5d --- /dev/null +++ b/selenium/vue/oco/assets/application/asset_create_keyline_service.py @@ -0,0 +1,165 @@ +from time import sleep +import random +from vue.shared.infrastructure.factories.driver_factory import get_chrome, close +from vue.shared.infrastructure.facades.dom import Dom +from vue.shared.infrastructure.facades.dropdown import Dropdown +from vue.shared.infrastructure.facades.element import Element +from vue.shared.infrastructure.generators.uuid import get_uuid +from vue.shared.infrastructure.repositories.files_repository import FilesRepository +from vue.shared.infrastructure.repositories.routes_repository import RoutesRepository + +from vue.shared.domain.element_enum import ElementEnum +from vue.oco.login.application.login_service import login_usr1_or_fail +from vue.oco.assets.infrastructure.repositories.assets_repository import AssetsRepository +from vue.oco.assets.infrastructure.repositories.asset_keyline_attributes_repository import \ + AssetKeylineAttributesRepository +from vue.oco.assets.infrastructure.repositories.asset_groups_attributes_repository import \ + AssetGroupsAttributesRepository +from vue.oco.assets.infrastructure.repositories.asset_tags_repository import AssetTagsRepository + + +def asset_create_keyline() -> None: + login_usr1_or_fail() + sleep(30) + + browser = get_chrome() + browser.get(RoutesRepository.get_asset_add_url()) + dom = Dom(browser) + sleep(3) + + __config_asset_type(dom) + __create_attributes_production(dom) + __create_attributes_measures(dom) + __create_attributes_datos_opcionales(dom) + __create_tags_documentos(dom) + + btn_id = AssetsRepository.get_id_button_save() + btn_save = dom.find_by_id(btn_id) + btn_save.click() + close(30) + + +def __config_asset_type(dom: Dom) -> None: + el = Element(dom) + element_id = AssetsRepository.get_id_asset_code() + uuid = get_uuid(4) + value = f"kl-{uuid}" + el.set_value(element_id, value) + + element_id = AssetsRepository.get_id_asset_name() + value = f"kl-{uuid}" + el.set_value(element_id, value) + + dd = Dropdown(dom) + # tipo de asset + btn_xpath = AssetKeylineAttributesRepository.get_sel_asset_type_keyline() + li_xpath = AssetKeylineAttributesRepository.get_sel_asset_type_keyline(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + +def __create_attributes_production(dom: Dom) -> None: + el = Element(dom) + xpath = AssetKeylineAttributesRepository.get_sel_maquina() + uuid = get_uuid(4) + value = f"kl-{uuid}" + el.set_value_by_xpath(xpath, value) + + dd = Dropdown(dom) + + # maquina + btn_xpath = AssetKeylineAttributesRepository.get_sel_maquina() + li_xpath = AssetKeylineAttributesRepository.get_sel_maquina(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # plano propio + btn_xpath = AssetKeylineAttributesRepository.get_sel_plano_propio() + li_xpath = AssetKeylineAttributesRepository.get_sel_plano_propio(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # descripcion plano + xpath = AssetKeylineAttributesRepository.get_xpath_descripcion() + value = f"desc plano {uuid}" + el.set_value_by_xpath(xpath, value) + + # tipo plano + btn_xpath = AssetKeylineAttributesRepository.get_sel_tipo_plano() + li_xpath = AssetKeylineAttributesRepository.get_sel_tipo_plano(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # prospecto doblado + btn_xpath = AssetKeylineAttributesRepository.get_sel_prospecto_doblado() + li_xpath = AssetKeylineAttributesRepository.get_sel_prospecto_doblado(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + +def __create_attributes_measures(dom: Dom) -> None: + # tab medida + tab_xpath = AssetGroupsAttributesRepository.get_tab_keyline_medida() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + # medida A + i = random.randint(1, 10) + xpath = AssetKeylineAttributesRepository.get_xpath_medida_a() + value = f"medida a {i}" + el.set_value_by_xpath(xpath, value) + + # medida B + i = random.randint(1, 10) + xpath = AssetKeylineAttributesRepository.get_xpath_medida_b() + value = f"medida b {i}" + el.set_value_by_xpath(xpath, value) + + # medida C + i = random.randint(1, 10) + xpath = AssetKeylineAttributesRepository.get_xpath_medida_c() + value = f"medida c {i}" + el.set_value_by_xpath(xpath, value) + + # medida D + i = random.randint(1, 10) + xpath = AssetKeylineAttributesRepository.get_xpath_medida_d() + value = f"medida d {i}" + el.set_value_by_xpath(xpath, value) + + # capacidad + i = random.randint(1, 10) + xpath = AssetKeylineAttributesRepository.get_xpath_capacidad() + value = f"capacidad {i}" + el.set_value_by_xpath(xpath, value) + + # capacidad + i = random.randint(1, 10) + xpath = AssetKeylineAttributesRepository.get_xpath_diametro() + value = f"diametro {i}" + el.set_value_by_xpath(xpath, value) + + +def __create_attributes_datos_opcionales(dom: Dom) -> None: + tab_xpath = AssetGroupsAttributesRepository.get_tab_keyline_datos_opcionales() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + xpath = AssetKeylineAttributesRepository.get_xpath_comentarios_opcionales() + uuid = get_uuid(4) + value = f"comentarios opcionales {uuid}" + el.set_value_by_xpath(xpath, value) + + +def __create_tags_documentos(dom: Dom) -> None: + tab_xpath = AssetGroupsAttributesRepository.get_tab_keyline_documentos() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + xpath = AssetTagsRepository.get_xpath_file_tag_keyline() + path_file = FilesRepository.get_rnd_artworks() + el.set_value_by_xpath(xpath, path_file) diff --git a/selenium/vue/oco/assets/application/asset_create_material_service.py b/selenium/vue/oco/assets/application/asset_create_material_service.py new file mode 100644 index 00000000..cbaa25cc --- /dev/null +++ b/selenium/vue/oco/assets/application/asset_create_material_service.py @@ -0,0 +1,191 @@ +from time import sleep +import random +from vue.shared.infrastructure.factories.driver_factory import get_chrome, close +from vue.shared.infrastructure.facades.dom import Dom +from vue.shared.infrastructure.facades.dropdown import Dropdown +from vue.shared.infrastructure.facades.element import Element +from vue.shared.infrastructure.generators.uuid import get_uuid +from vue.shared.infrastructure.repositories.files_repository import FilesRepository +from vue.shared.infrastructure.repositories.routes_repository import RoutesRepository + +from vue.shared.domain.element_enum import ElementEnum +from vue.oco.login.application.login_service import login_usr1_or_fail +from vue.oco.assets.infrastructure.repositories.assets_repository import AssetsRepository +from vue.oco.assets.infrastructure.repositories.asset_material_attributes_repository import AssetMaterialAttributesRepository +from vue.oco.assets.infrastructure.repositories.asset_groups_attributes_repository import \ + AssetGroupsAttributesRepository +from vue.oco.assets.infrastructure.repositories.asset_tags_repository import AssetTagsRepository + + +def asset_create_material() -> None: + login_usr1_or_fail() + sleep(30) + + browser = get_chrome() + browser.get(RoutesRepository.get_asset_add_url()) + dom = Dom(browser) + sleep(3) + + __config_asset_type(dom) + __create_attributes_info(dom) + __create_attributes_production(dom) + __create_attributes_diseno(dom) + __create_attributes_datos_opcionales(dom) + __create_tags_documentos(dom) + + btn_id = AssetsRepository.get_id_button_save() + btn_save = dom.find_by_id(btn_id) + btn_save.click() + close(30) + + +def __config_asset_type(dom: Dom) -> None: + el = Element(dom) + element_id = AssetsRepository.get_id_asset_code() + uuid = get_uuid(4) + value = f"mat-{uuid}" + el.set_value(element_id, value) + + element_id = AssetsRepository.get_id_asset_name() + value = f"mat-{uuid}" + el.set_value(element_id, value) + + dd = Dropdown(dom) + # tipo de asset + btn_xpath = AssetMaterialAttributesRepository.get_sel_asset_type_material() + li_xpath = AssetMaterialAttributesRepository.get_sel_asset_type_material(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + +def __create_attributes_info(dom: Dom) -> None: + el = Element(dom) + xpath = AssetMaterialAttributesRepository.get_xpath_material_code() + uuid = get_uuid(4) + value = f"mat-{uuid}" + el.set_value_by_xpath(xpath, value) + + dd = Dropdown(dom) + + # categoria + btn_xpath = AssetMaterialAttributesRepository.get_sel_category() + li_xpath = AssetMaterialAttributesRepository.get_sel_category(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # tipo + btn_xpath = AssetMaterialAttributesRepository.get_sel_type() + li_xpath = AssetMaterialAttributesRepository.get_sel_type(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # Forma Farmacéutica + btn_xpath = AssetMaterialAttributesRepository.get_sel_lab_form() + li_xpath = AssetMaterialAttributesRepository.get_sel_lab_form(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + xpath = AssetMaterialAttributesRepository.get_xpath_dosis() + value = f"dosis-{uuid}" + el.set_value_by_xpath(xpath, value) + + xpath = AssetMaterialAttributesRepository.get_xpath_presentation() + value = f"presentacion-{uuid}" + el.set_value_by_xpath(xpath, value) + + # Mercado + btn_xpath = AssetMaterialAttributesRepository.get_sel_market() + li_xpath = AssetMaterialAttributesRepository.get_sel_market(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # Cliente + btn_xpath = AssetMaterialAttributesRepository.get_sel_client() + li_xpath = AssetMaterialAttributesRepository.get_sel_client(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # País + btn_xpath = AssetMaterialAttributesRepository.get_sel_country() + li_xpath = AssetMaterialAttributesRepository.get_sel_country(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + # Fabricante + btn_xpath = AssetMaterialAttributesRepository.get_sel_fabricant() + li_xpath = AssetMaterialAttributesRepository.get_sel_fabricant(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + xpath = AssetMaterialAttributesRepository.get_xpath_principio_activo() + value = f"pa-{uuid}" + el.set_value_by_xpath(xpath, value) + + xpath = AssetMaterialAttributesRepository.get_xpath_nomenclatura_extra() + value = f"nomenclatura-{uuid}" + el.set_value_by_xpath(xpath, value) + + +def __create_attributes_production(dom: Dom) -> None: + # tab produccion + tab_xpath = AssetGroupsAttributesRepository.get_tab_production() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + xpath = AssetMaterialAttributesRepository.get_xpath_numero_de_tintas() + value = random.randint(1, 10) + el.set_value_by_xpath(xpath, value) + + xpath = AssetMaterialAttributesRepository.get_xpath_acabados_especiales() + i = random.randint(1, 10) + value = f"acab espe {i}" + el.set_value_by_xpath(xpath, value) + + +def __create_attributes_diseno(dom: Dom) -> None: + # tab diseno + tab_xpath = AssetGroupsAttributesRepository.get_tab_diseno() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + xpath = AssetMaterialAttributesRepository.get_xpath_laetus() + i = random.randint(1, 10) + value = f"laetus {i}" + el.set_value_by_xpath(xpath, value) + + dd = Dropdown(dom) + + # marcas visuales + btn_xpath = AssetMaterialAttributesRepository.get_sel_marcas_visuales() + li_xpath = AssetMaterialAttributesRepository.get_sel_marcas_visuales(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + + xpath = AssetMaterialAttributesRepository.get_xpath_referencia_al_libro() + i = random.randint(1, 10) + value = f"ref {i}" + el.set_value_by_xpath(xpath, value) + + +def __create_attributes_datos_opcionales(dom: Dom) -> None: + tab_xpath = AssetGroupsAttributesRepository.get_tab_datos_opcionales() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + xpath = AssetMaterialAttributesRepository.get_xpath_comentarios_opcionales() + uuid = get_uuid(4) + value = f"comentarios opcionales {uuid}" + el.set_value_by_xpath(xpath, value) + + +def __create_tags_documentos(dom: Dom) -> None: + tab_xpath = AssetGroupsAttributesRepository.get_tab_documentos() + btn_tab = dom.find_by_xpath(tab_xpath) + btn_tab.click() + sleep(1) + + el = Element(dom) + + xpath = AssetTagsRepository.get_xpath_file_tag_artworks() + path_file = FilesRepository.get_rnd_artworks() + el.set_value_by_xpath(xpath, path_file) diff --git a/selenium/vue/oco/assets/application/asset_create_product_service.py b/selenium/vue/oco/assets/application/asset_create_product_service.py new file mode 100644 index 00000000..478d2d04 --- /dev/null +++ b/selenium/vue/oco/assets/application/asset_create_product_service.py @@ -0,0 +1,48 @@ +from time import sleep +from vue.shared.infrastructure.factories.driver_factory import get_chrome, close +from vue.shared.infrastructure.facades.dom import Dom +from vue.shared.infrastructure.facades.dropdown import Dropdown +from vue.shared.infrastructure.facades.element import Element +from vue.shared.infrastructure.generators.uuid import get_uuid +from vue.shared.infrastructure.repositories.routes_repository import RoutesRepository + +from vue.shared.domain.element_enum import ElementEnum +from vue.oco.login.application.login_service import login_usr1_or_fail +from vue.oco.assets.infrastructure.repositories.assets_repository import AssetsRepository +from vue.oco.assets.infrastructure.repositories.asset_material_attributes_repository import \ + AssetMaterialAttributesRepository + + +def asset_create_product() -> None: + login_usr1_or_fail() + sleep(30) + + browser = get_chrome() + browser.get(RoutesRepository.get_asset_add_url()) + dom = Dom(browser) + sleep(3) + + __config_asset_type(dom) + + btn_id = AssetsRepository.get_id_button_save() + btn_save = dom.find_by_id(btn_id) + btn_save.click() + close(30) + + +def __config_asset_type(dom: Dom) -> None: + el = Element(dom) + element_id = AssetsRepository.get_id_asset_code() + uuid = get_uuid(4) + value = f"prd-{uuid}" + el.set_value(element_id, value) + + element_id = AssetsRepository.get_id_asset_name() + value = f"prd-{uuid}" + el.set_value(element_id, value) + + dd = Dropdown(dom) + # tipo de asset + btn_xpath = AssetMaterialAttributesRepository.get_sel_asset_type_product() + li_xpath = AssetMaterialAttributesRepository.get_sel_asset_type_product(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) diff --git a/selenium/vue/oco/assets/domain/__init__.py b/selenium/vue/oco/assets/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/domain/exceptions/__init__.py b/selenium/vue/oco/assets/domain/exceptions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/domain/exceptions/asset_exception.py b/selenium/vue/oco/assets/domain/exceptions/asset_exception.py new file mode 100644 index 00000000..13cc3c54 --- /dev/null +++ b/selenium/vue/oco/assets/domain/exceptions/asset_exception.py @@ -0,0 +1,12 @@ +class LoginException: + def __int__(self): + pass + + def fail_if_no_input(self, message: str = "") -> None: + raise Exception(message) + + def fail_if_no_button(self, message: str = "") -> None: + raise Exception(message) + + def fail_if_not_logged(self, message: str = "") -> None: + raise Exception(message) diff --git a/selenium/vue/oco/assets/infrastructure/__init__.py b/selenium/vue/oco/assets/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/infrastructure/controllers/__init__.py b/selenium/vue/oco/assets/infrastructure/controllers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/infrastructure/controllers/asset_create_keyline_controller.py b/selenium/vue/oco/assets/infrastructure/controllers/asset_create_keyline_controller.py new file mode 100644 index 00000000..8293ce5a --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/controllers/asset_create_keyline_controller.py @@ -0,0 +1,11 @@ +from vue.oco.assets.application.asset_create_keyline_service import asset_create_keyline + + +def __invoke() -> None: + try: + asset_create_keyline() + except Exception as e: + print(e) + + +__invoke() diff --git a/selenium/vue/oco/assets/infrastructure/controllers/asset_create_material_controller.py b/selenium/vue/oco/assets/infrastructure/controllers/asset_create_material_controller.py new file mode 100644 index 00000000..bf202948 --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/controllers/asset_create_material_controller.py @@ -0,0 +1,11 @@ +from vue.oco.assets.application.asset_create_material_service import asset_create_material + + +def __invoke() -> None: + try: + asset_create_material() + except Exception as e: + print(e) + + +__invoke() diff --git a/selenium/vue/oco/assets/infrastructure/controllers/asset_create_product_controller.py b/selenium/vue/oco/assets/infrastructure/controllers/asset_create_product_controller.py new file mode 100644 index 00000000..b5eed5d1 --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/controllers/asset_create_product_controller.py @@ -0,0 +1,11 @@ +from vue.oco.assets.application.asset_create_product_service import asset_create_product + + +def __invoke() -> None: + try: + asset_create_product() + except Exception as e: + print(e) + + +__invoke() diff --git a/selenium/vue/oco/assets/infrastructure/repositories/__init__.py b/selenium/vue/oco/assets/infrastructure/repositories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/assets/infrastructure/repositories/asset_groups_attributes_repository.py b/selenium/vue/oco/assets/infrastructure/repositories/asset_groups_attributes_repository.py new file mode 100644 index 00000000..446b60ac --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/repositories/asset_groups_attributes_repository.py @@ -0,0 +1,34 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class AssetGroupsAttributesRepository: + def __int__(self): + pass + + @staticmethod + def get_tab_production() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[1]/button[2]" + + @staticmethod + def get_tab_diseno() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[1]/button[3]" + + @staticmethod + def get_tab_datos_opcionales() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[1]/button[4]" + + @staticmethod + def get_tab_documentos() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/ul/li[2]" + + @staticmethod + def get_tab_keyline_medida() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[1]/button[2]" + + @staticmethod + def get_tab_keyline_datos_opcionales() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[1]/button[3]" + + @staticmethod + def get_tab_keyline_documentos() -> str: + return "//html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/ul/li[2]" diff --git a/selenium/vue/oco/assets/infrastructure/repositories/asset_keyline_attributes_repository.py b/selenium/vue/oco/assets/infrastructure/repositories/asset_keyline_attributes_repository.py new file mode 100644 index 00000000..37bc2735 --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/repositories/asset_keyline_attributes_repository.py @@ -0,0 +1,73 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class AssetKeylineAttributesRepository: + def __int__(self): + pass + + @staticmethod + def get_sel_asset_type_material(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[3]/ul/li[1]" + @staticmethod + def get_sel_asset_type_keyline(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[3]/ul/li[3]" + + @staticmethod + def get_sel_maquina(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[1]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[1]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_plano_propio(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[2]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[2]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_xpath_descripcion() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div/div/input" + + @staticmethod + def get_sel_tipo_plano(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[4]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[4]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_prospecto_doblado(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[5]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[5]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_xpath_medida_a() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[1]/div/div/input" + + @staticmethod + def get_xpath_medida_b() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[2]/div/div/input" + + @staticmethod + def get_xpath_medida_c() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[3]/div/div/input" + + @staticmethod + def get_xpath_medida_d() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[4]/div/div/input" + + @staticmethod + def get_xpath_capacidad() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[5]/div/div/input" + + @staticmethod + def get_xpath_diametro() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[6]/div/div/input" + + @staticmethod + def get_xpath_comentarios_opcionales() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[3]/div/div/div/div/div[1]/textarea" diff --git a/selenium/vue/oco/assets/infrastructure/repositories/asset_material_attributes_repository.py b/selenium/vue/oco/assets/infrastructure/repositories/asset_material_attributes_repository.py new file mode 100644 index 00000000..27cedfe9 --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/repositories/asset_material_attributes_repository.py @@ -0,0 +1,112 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class AssetMaterialAttributesRepository: + def __int__(self): + pass + + @staticmethod + def get_sel_asset_type_material(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_asset_type_keyline(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[3]/ul/li[3]" + + @staticmethod + def get_sel_asset_type_product(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div/div[2]/div[3]/div/div/div/div[3]/ul/li[2]" + + @staticmethod + def get_xpath_material_code() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[1]/div/div/input" + + @staticmethod + def get_sel_category(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[2]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[2]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_type(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[3]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_lab_form(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[4]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[4]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_xpath_dosis() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[5]/div/div/input" + + @staticmethod + def get_xpath_presentation() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[6]/div/div/input" + + @staticmethod + def get_sel_market(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[7]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[7]/div/div/div/div[3]/ul/li[2]" + + @staticmethod + def get_sel_client(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[8]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[8]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_country(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[9]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[9]/div/div/div/div[3]/ul/li[3]" + + @staticmethod + def get_sel_fabricant(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[10]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[10]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_xpath_principio_activo() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[11]/div/div/input" + + @staticmethod + def get_xpath_nomenclatura_extra() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div/div[12]/div/div/input" + + @staticmethod + def get_xpath_numero_de_tintas() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[1]/div/div/input" + + @staticmethod + def get_xpath_acabados_especiales() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[2]/div/div/div[2]/div/div/input" + + @staticmethod + def get_xpath_laetus() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[3]/div/div/div[1]/div/div/input" + + @staticmethod + def get_sel_marcas_visuales(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[3]/div/div/div[2]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[3]/div/div/div[2]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_xpath_referencia_al_libro() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[3]/div/div/div[3]/div/div/input" + + @staticmethod + def get_xpath_comentarios_opcionales() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[1]/div/div[2]/div/div[4]/div/div/div/div/div[1]/textarea" diff --git a/selenium/vue/oco/assets/infrastructure/repositories/asset_tags_repository.py b/selenium/vue/oco/assets/infrastructure/repositories/asset_tags_repository.py new file mode 100644 index 00000000..89f365b4 --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/repositories/asset_tags_repository.py @@ -0,0 +1,15 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class AssetTagsRepository: + def __int__(self): + pass + + @staticmethod + def get_xpath_file_tag_artworks() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[2]/div/div/div[2]/div/div[2]/input" + + + @staticmethod + def get_xpath_file_tag_keyline() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[2]/div/div/div/div/div[2]/input" diff --git a/selenium/vue/oco/assets/infrastructure/repositories/assets_repository.py b/selenium/vue/oco/assets/infrastructure/repositories/assets_repository.py new file mode 100644 index 00000000..4f15c335 --- /dev/null +++ b/selenium/vue/oco/assets/infrastructure/repositories/assets_repository.py @@ -0,0 +1,18 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class AssetsRepository: + def __int__(self): + pass + + @staticmethod + def get_id_asset_code() -> str: + return "id-asset-code" + + @staticmethod + def get_id_asset_name() -> str: + return "id-asset-name" + + @staticmethod + def get_id_button_save() -> str: + return "btnSaveAsset" diff --git a/selenium/vue/oco/employees/__init__.py b/selenium/vue/oco/employees/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/employees/application/__init__.py b/selenium/vue/oco/employees/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/employees/application/employee_create.py b/selenium/vue/oco/employees/application/employee_create.py new file mode 100644 index 00000000..e6cd1be2 --- /dev/null +++ b/selenium/vue/oco/employees/application/employee_create.py @@ -0,0 +1,146 @@ +from time import sleep +import random +from vue.shared.infrastructure.factories.driver_factory import get_chrome, close +from vue.shared.infrastructure.facades.dom import Dom +from vue.shared.infrastructure.facades.dropdown import Dropdown +from vue.shared.infrastructure.facades.element import Element +from vue.shared.infrastructure.facades.dt import get_ymd_plus + +from vue.shared.infrastructure.repositories.files_repository import FilesRepository +from vue.shared.infrastructure.repositories.routes_repository import RoutesRepository + +from vue.shared.domain.element_enum import ElementEnum +from vue.oco.login.application.login_service import login_usr1_or_fail +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_repository import \ + TacticalRequestsRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_attributes_repository import \ + TacticalRequestsAttributesRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_tags_repository import \ + TacticalRequestTagsFilesRepository + + +def invoke() -> None: + login_usr1_or_fail() + sleep(15) + + browser = get_chrome() + browser.get(RoutesRepository.get_tactical_requests_add_url()) + dom = Dom(browser) + sleep(10) + + __config_request_type(dom) + __requests_details(dom) + + __update_attributes_material_info(dom) + __update_attributes_optional_data(dom) + __update_upload_files(dom) + + btn_xpath = TacticalRequestsRepository.get_xpath_button_save() + btn_save = dom.find_by_xpath(btn_xpath) + btn_save.click() + close(60) + + +def __config_request_type(dom: Dom) -> None: + dd = Dropdown(dom) + + # tipo de la solicitud + btn_xpath = TacticalRequestsRepository.get_sel_request_type_material_modify() + li_xpath = TacticalRequestsRepository.get_sel_request_type_material_modify(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + # activo + btn_xpath = TacticalRequestsRepository.get_sel_asset() + li_xpath = TacticalRequestsRepository.get_sel_asset(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + +def __requests_details(dom: Dom) -> None: + dd = Dropdown(dom) + + # motivo de solicitud + btn_xpath = TacticalRequestsAttributesRepository.get_sel_request_reason() + li_xpath = TacticalRequestsAttributesRepository.get_sel_request_reason(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + # fecha + element_id = TacticalRequestsAttributesRepository.get_id_target_date() + value = get_ymd_plus() + el = Element(dom) + el.set_value(element_id, value) + + # comentarios + xpath = TacticalRequestsAttributesRepository.get_xpath_comment() + i = random.randint(1, 10) + value = f"comment {i}" + el.set_value_by_xpath(xpath, value) + sleep(1) + + # prioridad + btn_xpath = TacticalRequestsAttributesRepository.get_sel_request_priority() + li_xpath = TacticalRequestsAttributesRepository.get_sel_request_priority(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + +def __update_attributes_material_info(dom: Dom) -> None: + # tab attrubutes -> tab material info + #tab_xpath = TacticalRequestGroupsAttributesRepository.get_tab_attributes() + #btn_tab = dom.find_by_xpath(tab_xpath) + #btn_tab.click() + #sleep(1) + + # categoria no es necesario modificarla + btn_xpath = TacticalRequestsAttributesRepository.get_sel_categoria() + li_xpath = TacticalRequestsAttributesRepository.get_sel_categoria(ElementEnum.LI_XPATH) + dd = Dropdown(dom) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(3) + + # pais + # btn_xpath = TacticalRequestsAttributesRepository.get_xpath_btn_pais() + # btn_tab = dom.find_by_xpath(btn_xpath) + # btn_tab.click() + # sleep(1) + + btn_xpath = TacticalRequestsAttributesRepository.get_sel_pais() + li_xpath = TacticalRequestsAttributesRepository.get_sel_pais(ElementEnum.LI_XPATH) + dd = Dropdown(dom) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(3) + + +def __update_attributes_optional_data(dom: Dom) -> None: + # tab diseno (ya no existe + #tab_xpath = TacticalRequestGroupsAttributesRepository.get_tab_datos_opcionales() + #btn_tab = dom.find_by_xpath(tab_xpath) + #btn_tab.click() + # sleep(1) + + el = Element(dom) + el_xpath = TacticalRequestsAttributesRepository.get_xpath_optional_comment() + i = random.randint(1, 10) + value = f"optional commment {i}" + el.set_value_by_xpath(el_xpath, value) + sleep(1) + + +def __update_upload_files(dom: Dom) -> None: + xpath = TacticalRequestTagsFilesRepository.get_xpath_btn_modal_optional_files() + btn_tab = dom.find_by_xpath(xpath) + btn_tab.click() + sleep(3) + + el = Element(dom) + xpath = TacticalRequestTagsFilesRepository.get_xpath_input_upload_optional_files() + path_file = FilesRepository.get_rnd_artworks() + el.set_value_by_xpath(xpath, path_file) + sleep(3) + + xpath = TacticalRequestTagsFilesRepository.get_xpath_btn_modal_apply_changes() + btn_tab = dom.find_by_xpath(xpath) + btn_tab.click() + sleep(3) \ No newline at end of file diff --git a/selenium/vue/oco/employees/domain/__init__.py b/selenium/vue/oco/employees/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/employees/infrastructure/__init__.py b/selenium/vue/oco/employees/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/employees/infrastructure/controllers/__init__.py b/selenium/vue/oco/employees/infrastructure/controllers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/employees/infrastructure/controllers/employee_create_controller.py b/selenium/vue/oco/employees/infrastructure/controllers/employee_create_controller.py new file mode 100644 index 00000000..1b1ee1f2 --- /dev/null +++ b/selenium/vue/oco/employees/infrastructure/controllers/employee_create_controller.py @@ -0,0 +1,11 @@ +from vue.oco.tactical_requests.application.tactical_requests_create_material_modify_service import invoke + + +def __invoke() -> None: + try: + invoke() + except Exception as e: + print(e) + + +__invoke() diff --git a/selenium/vue/oco/employees/infrastructure/repositories/__init__.py b/selenium/vue/oco/employees/infrastructure/repositories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/employees/infrastructure/repositories/employees_repository.py b/selenium/vue/oco/employees/infrastructure/repositories/employees_repository.py new file mode 100644 index 00000000..4c7d7da9 --- /dev/null +++ b/selenium/vue/oco/employees/infrastructure/repositories/employees_repository.py @@ -0,0 +1,4 @@ + +class EmployeesRepository: + def __int__(self): + pass \ No newline at end of file diff --git a/selenium/vue/oco/login/__init__.py b/selenium/vue/oco/login/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/login/application/__init__.py b/selenium/vue/oco/login/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/login/application/login_service.py b/selenium/vue/oco/login/application/login_service.py new file mode 100644 index 00000000..b48159b0 --- /dev/null +++ b/selenium/vue/oco/login/application/login_service.py @@ -0,0 +1,26 @@ +from time import sleep +from vue.shared.infrastructure.factories.driver_factory import get_chrome, FRONT_URL +from vue.shared.infrastructure.facades.dom import Dom +from vue.oco.login.infrastructure.login_repository import LOGIN_DATA + + +def login_usr1_or_fail() -> None: + browser = get_chrome() + browser.get(FRONT_URL) + dom = Dom(browser) + sleep(1) + + input_email = dom.find_by_id("id-email") + if len(input_email.get_attribute("value")) == 0: + input_email.send_keys(LOGIN_DATA.get("usr1").get("email")) + + input_password = dom.find_by_id("id-password") + if len(input_password.get_attribute("value")) == 0: + input_password.send_keys(LOGIN_DATA.get("usr1").get("secret")) + + submit_button = dom.find_by_id("btnSignIn") + submit_button.click() + # sleep(10) + + # div_assets = dom.find_by_id("commons-assets") + # sleep(1) diff --git a/selenium/vue/oco/login/domain/__init__.py b/selenium/vue/oco/login/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/login/domain/exceptions/__init__.py b/selenium/vue/oco/login/domain/exceptions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/login/domain/exceptions/login_exception.py b/selenium/vue/oco/login/domain/exceptions/login_exception.py new file mode 100644 index 00000000..13cc3c54 --- /dev/null +++ b/selenium/vue/oco/login/domain/exceptions/login_exception.py @@ -0,0 +1,12 @@ +class LoginException: + def __int__(self): + pass + + def fail_if_no_input(self, message: str = "") -> None: + raise Exception(message) + + def fail_if_no_button(self, message: str = "") -> None: + raise Exception(message) + + def fail_if_not_logged(self, message: str = "") -> None: + raise Exception(message) diff --git a/selenium/vue/oco/login/infrastructure/__init__.py b/selenium/vue/oco/login/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/login/infrastructure/login_controller.py b/selenium/vue/oco/login/infrastructure/login_controller.py new file mode 100644 index 00000000..d34a5332 --- /dev/null +++ b/selenium/vue/oco/login/infrastructure/login_controller.py @@ -0,0 +1,11 @@ +from vue.oco.login.application.login_service import login_usr1_or_fail + + +def login_usr1() -> None: + try: + login_usr1_or_fail() + except Exception as e: + print(e) + + +login_usr1() diff --git a/selenium/vue/oco/login/infrastructure/login_repository.py b/selenium/vue/oco/login/infrastructure/login_repository.py new file mode 100644 index 00000000..b40ce34f --- /dev/null +++ b/selenium/vue/oco/login/infrastructure/login_repository.py @@ -0,0 +1,6 @@ +LOGIN_DATA = { + "usr1": { + "email": "email_test1@lacia.com", + "secret": "123456", + }, +} \ No newline at end of file diff --git a/selenium/vue/oco/tactical_requests/__init__.py b/selenium/vue/oco/tactical_requests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/application/__init__.py b/selenium/vue/oco/tactical_requests/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/application/tactical_requests_create_material_modify_service.py b/selenium/vue/oco/tactical_requests/application/tactical_requests_create_material_modify_service.py new file mode 100644 index 00000000..e6cd1be2 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/application/tactical_requests_create_material_modify_service.py @@ -0,0 +1,146 @@ +from time import sleep +import random +from vue.shared.infrastructure.factories.driver_factory import get_chrome, close +from vue.shared.infrastructure.facades.dom import Dom +from vue.shared.infrastructure.facades.dropdown import Dropdown +from vue.shared.infrastructure.facades.element import Element +from vue.shared.infrastructure.facades.dt import get_ymd_plus + +from vue.shared.infrastructure.repositories.files_repository import FilesRepository +from vue.shared.infrastructure.repositories.routes_repository import RoutesRepository + +from vue.shared.domain.element_enum import ElementEnum +from vue.oco.login.application.login_service import login_usr1_or_fail +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_repository import \ + TacticalRequestsRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_attributes_repository import \ + TacticalRequestsAttributesRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_tags_repository import \ + TacticalRequestTagsFilesRepository + + +def invoke() -> None: + login_usr1_or_fail() + sleep(15) + + browser = get_chrome() + browser.get(RoutesRepository.get_tactical_requests_add_url()) + dom = Dom(browser) + sleep(10) + + __config_request_type(dom) + __requests_details(dom) + + __update_attributes_material_info(dom) + __update_attributes_optional_data(dom) + __update_upload_files(dom) + + btn_xpath = TacticalRequestsRepository.get_xpath_button_save() + btn_save = dom.find_by_xpath(btn_xpath) + btn_save.click() + close(60) + + +def __config_request_type(dom: Dom) -> None: + dd = Dropdown(dom) + + # tipo de la solicitud + btn_xpath = TacticalRequestsRepository.get_sel_request_type_material_modify() + li_xpath = TacticalRequestsRepository.get_sel_request_type_material_modify(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + # activo + btn_xpath = TacticalRequestsRepository.get_sel_asset() + li_xpath = TacticalRequestsRepository.get_sel_asset(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + +def __requests_details(dom: Dom) -> None: + dd = Dropdown(dom) + + # motivo de solicitud + btn_xpath = TacticalRequestsAttributesRepository.get_sel_request_reason() + li_xpath = TacticalRequestsAttributesRepository.get_sel_request_reason(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + # fecha + element_id = TacticalRequestsAttributesRepository.get_id_target_date() + value = get_ymd_plus() + el = Element(dom) + el.set_value(element_id, value) + + # comentarios + xpath = TacticalRequestsAttributesRepository.get_xpath_comment() + i = random.randint(1, 10) + value = f"comment {i}" + el.set_value_by_xpath(xpath, value) + sleep(1) + + # prioridad + btn_xpath = TacticalRequestsAttributesRepository.get_sel_request_priority() + li_xpath = TacticalRequestsAttributesRepository.get_sel_request_priority(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + +def __update_attributes_material_info(dom: Dom) -> None: + # tab attrubutes -> tab material info + #tab_xpath = TacticalRequestGroupsAttributesRepository.get_tab_attributes() + #btn_tab = dom.find_by_xpath(tab_xpath) + #btn_tab.click() + #sleep(1) + + # categoria no es necesario modificarla + btn_xpath = TacticalRequestsAttributesRepository.get_sel_categoria() + li_xpath = TacticalRequestsAttributesRepository.get_sel_categoria(ElementEnum.LI_XPATH) + dd = Dropdown(dom) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(3) + + # pais + # btn_xpath = TacticalRequestsAttributesRepository.get_xpath_btn_pais() + # btn_tab = dom.find_by_xpath(btn_xpath) + # btn_tab.click() + # sleep(1) + + btn_xpath = TacticalRequestsAttributesRepository.get_sel_pais() + li_xpath = TacticalRequestsAttributesRepository.get_sel_pais(ElementEnum.LI_XPATH) + dd = Dropdown(dom) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(3) + + +def __update_attributes_optional_data(dom: Dom) -> None: + # tab diseno (ya no existe + #tab_xpath = TacticalRequestGroupsAttributesRepository.get_tab_datos_opcionales() + #btn_tab = dom.find_by_xpath(tab_xpath) + #btn_tab.click() + # sleep(1) + + el = Element(dom) + el_xpath = TacticalRequestsAttributesRepository.get_xpath_optional_comment() + i = random.randint(1, 10) + value = f"optional commment {i}" + el.set_value_by_xpath(el_xpath, value) + sleep(1) + + +def __update_upload_files(dom: Dom) -> None: + xpath = TacticalRequestTagsFilesRepository.get_xpath_btn_modal_optional_files() + btn_tab = dom.find_by_xpath(xpath) + btn_tab.click() + sleep(3) + + el = Element(dom) + xpath = TacticalRequestTagsFilesRepository.get_xpath_input_upload_optional_files() + path_file = FilesRepository.get_rnd_artworks() + el.set_value_by_xpath(xpath, path_file) + sleep(3) + + xpath = TacticalRequestTagsFilesRepository.get_xpath_btn_modal_apply_changes() + btn_tab = dom.find_by_xpath(xpath) + btn_tab.click() + sleep(3) \ No newline at end of file diff --git a/selenium/vue/oco/tactical_requests/application/tactical_requests_create_new_dev_service.py b/selenium/vue/oco/tactical_requests/application/tactical_requests_create_new_dev_service.py new file mode 100644 index 00000000..2cec66e6 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/application/tactical_requests_create_new_dev_service.py @@ -0,0 +1,128 @@ +from time import sleep +import random +from vue.shared.infrastructure.factories.driver_factory import get_chrome, close +from vue.shared.infrastructure.facades.dom import Dom +from vue.shared.infrastructure.facades.dropdown import Dropdown +from vue.shared.infrastructure.facades.element import Element +from vue.shared.infrastructure.facades.dt import get_ymd_plus + +from vue.shared.infrastructure.repositories.files_repository import FilesRepository +from vue.shared.infrastructure.repositories.routes_repository import RoutesRepository + +from vue.shared.domain.element_enum import ElementEnum +from vue.oco.login.application.login_service import login_usr1_or_fail +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_repository import \ + TacticalRequestsRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_attributes_repository import \ + TacticalRequestsAttributesRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_request_groups_attributes_repository import \ + TacticalRequestGroupsAttributesRepository +from vue.oco.tactical_requests.infrastructure.repositories.tactical_requests_tags_repository import \ + TacticalRequestTagsFilesRepository + + +def invoke() -> None: + login_usr1_or_fail() + sleep(20) + + browser = get_chrome() + browser.get(RoutesRepository.get_tactical_requests_add_url()) + dom = Dom(browser) + sleep(20) + + __config_request_type(dom) + __requests_details(dom) + + __update_attributes_material_info(dom) + __update_attributes_optional_data(dom) + # __create_tags_documentos(dom) + + btn_xpath = TacticalRequestsRepository.get_xpath_button_save() + btn_save = dom.find_by_xpath(btn_xpath) + btn_save.click() + close(30) + + +def __config_request_type(dom: Dom) -> None: + dd = Dropdown(dom) + + btn_xpath = TacticalRequestsRepository.get_sel_request_type_new_dev() + li_xpath = TacticalRequestsRepository.get_sel_request_type_new_dev(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(10) + + btn_xpath = TacticalRequestsRepository.get_sel_asset() + li_xpath = TacticalRequestsRepository.get_sel_asset(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(25) + + +def __requests_details(dom: Dom) -> None: + dd = Dropdown(dom) + + # motivo de solicitud + btn_xpath = TacticalRequestsAttributesRepository.get_sel_request_reason() + li_xpath = TacticalRequestsAttributesRepository.get_sel_request_reason(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + # fecha + element_id = TacticalRequestsAttributesRepository.get_id_target_date() + value = get_ymd_plus() + el = Element(dom) + el.set_value(element_id, value) + + # comentarios + xpath = TacticalRequestsAttributesRepository.get_xpath_comment() + i = random.randint(1, 10) + value = f"comment {i}" + el.set_value_by_xpath(xpath, value) + sleep(1) + + # prioridad + btn_xpath = TacticalRequestsAttributesRepository.get_sel_request_priority() + li_xpath = TacticalRequestsAttributesRepository.get_sel_request_priority(ElementEnum.LI_XPATH) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(15) + + +def __update_attributes_material_info(dom: Dom) -> None: + # categoria no es necesario modificarla + btn_xpath = TacticalRequestsAttributesRepository.get_sel_categoria() + li_xpath = TacticalRequestsAttributesRepository.get_sel_categoria(ElementEnum.LI_XPATH) + dd = Dropdown(dom) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(3) + + btn_xpath = TacticalRequestsAttributesRepository.get_sel_pais() + li_xpath = TacticalRequestsAttributesRepository.get_sel_pais(ElementEnum.LI_XPATH) + dd = Dropdown(dom) + dd.select_by_xpath(btn_xpath, li_xpath) + sleep(3) + + +def __update_attributes_optional_data(dom: Dom) -> None: + el = Element(dom) + el_xpath = TacticalRequestsAttributesRepository.get_xpath_optional_comment() + i = random.randint(1, 10) + value = f"optional commment {i}" + el.set_value_by_xpath(el_xpath, value) + sleep(1) + + +def __update_upload_files(dom: Dom) -> None: + xpath = TacticalRequestTagsFilesRepository.get_xpath_btn_modal_optional_files() + btn_tab = dom.find_by_xpath(xpath) + btn_tab.click() + sleep(3) + + el = Element(dom) + xpath = TacticalRequestTagsFilesRepository.get_xpath_input_upload_optional_files() + path_file = FilesRepository.get_rnd_artworks() + el.set_value_by_xpath(xpath, path_file) + sleep(3) + + xpath = TacticalRequestTagsFilesRepository.get_xpath_btn_modal_apply_changes() + btn_tab = dom.find_by_xpath(xpath) + btn_tab.click() + sleep(3) \ No newline at end of file diff --git a/selenium/vue/oco/tactical_requests/domain/__init__.py b/selenium/vue/oco/tactical_requests/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/domain/exceptions/__init__.py b/selenium/vue/oco/tactical_requests/domain/exceptions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/domain/exceptions/tactical_requests_exception.py b/selenium/vue/oco/tactical_requests/domain/exceptions/tactical_requests_exception.py new file mode 100644 index 00000000..13cc3c54 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/domain/exceptions/tactical_requests_exception.py @@ -0,0 +1,12 @@ +class LoginException: + def __int__(self): + pass + + def fail_if_no_input(self, message: str = "") -> None: + raise Exception(message) + + def fail_if_no_button(self, message: str = "") -> None: + raise Exception(message) + + def fail_if_not_logged(self, message: str = "") -> None: + raise Exception(message) diff --git a/selenium/vue/oco/tactical_requests/infrastructure/__init__.py b/selenium/vue/oco/tactical_requests/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/infrastructure/controllers/__init__.py b/selenium/vue/oco/tactical_requests/infrastructure/controllers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/infrastructure/controllers/tactical_request_create_material_modify_controller.py b/selenium/vue/oco/tactical_requests/infrastructure/controllers/tactical_request_create_material_modify_controller.py new file mode 100644 index 00000000..1b1ee1f2 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/infrastructure/controllers/tactical_request_create_material_modify_controller.py @@ -0,0 +1,11 @@ +from vue.oco.tactical_requests.application.tactical_requests_create_material_modify_service import invoke + + +def __invoke() -> None: + try: + invoke() + except Exception as e: + print(e) + + +__invoke() diff --git a/selenium/vue/oco/tactical_requests/infrastructure/controllers/tactical_request_create_new_dev_controller.py b/selenium/vue/oco/tactical_requests/infrastructure/controllers/tactical_request_create_new_dev_controller.py new file mode 100644 index 00000000..ed7bdce9 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/infrastructure/controllers/tactical_request_create_new_dev_controller.py @@ -0,0 +1,11 @@ +from vue.oco.tactical_requests.application.tactical_requests_create_new_dev_service import invoke + + +def __invoke() -> None: + try: + invoke() + except Exception as e: + print(e) + + +__invoke() diff --git a/selenium/vue/oco/tactical_requests/infrastructure/repositories/__init__.py b/selenium/vue/oco/tactical_requests/infrastructure/repositories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_request_groups_attributes_repository.py b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_request_groups_attributes_repository.py new file mode 100644 index 00000000..df28d689 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_request_groups_attributes_repository.py @@ -0,0 +1,12 @@ + +class TacticalRequestGroupsAttributesRepository: + def __int__(self): + pass + + @staticmethod + def get_tab_attributes() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/ul/li[2]" + + @staticmethod + def get_tab_datos_opcionales() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[2]/div/div[1]/button[2]" diff --git a/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_attributes_repository.py b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_attributes_repository.py new file mode 100644 index 00000000..52fbb9b0 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_attributes_repository.py @@ -0,0 +1,52 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class TacticalRequestsAttributesRepository: + def __int__(self): + pass + + @staticmethod + def get_sel_request_reason(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div/div/div/div[1]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div/div/div/div[1]/div/div/div/div[3]/ul/li[2]" + + @staticmethod + def get_sel_request_priority(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div/div/div/div[3]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div/div/div/div[3]/div/div/div/div[3]/ul/li[2]" + + @staticmethod + def get_id_target_date() -> str: + return "id-targetDate" + + @staticmethod + def get_xpath_comment() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div/div/div/div[4]/div/div[1]/textarea" + + @staticmethod + def get_xpath_optional_comment() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[4]/div/div[2]/div[2]/div/div[1]/textarea" + + @staticmethod + def get_xpath_btn_pais() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div/div[2]/div/div[2]/div[1]/div/div/div[3]/div/div/div/div[1]/div[1]/div/div/button" + + @staticmethod + def get_sel_categoria(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[2]/div/div[2]/div[2]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[2]/div/div[2]/div[2]/div/div/div/div[3]/ul/li[2]" + + @staticmethod + def get_sel_pais(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[3]/div/div[2]/div[2]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[3]/div/div[2]/div[2]/div/div/div/div[3]/ul/li[4]" + + @staticmethod + def get_sel_tmp(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "" + return "" diff --git a/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_repository.py b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_repository.py new file mode 100644 index 00000000..0ad1c7c8 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_repository.py @@ -0,0 +1,30 @@ +from vue.shared.domain.element_enum import ElementEnum + + +class TacticalRequestsRepository: + def __int__(self): + pass + + @staticmethod + def get_sel_request_type_new_dev(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[1]/div/div/div[1]/div[1]/div/div/div/div[2]/button" + # new development + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[1]/div/div/div[1]/div[1]/div/div/div/div[3]/ul/li[2]" + + @staticmethod + def get_sel_request_type_material_modify(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[1]/div/div/div[1]/div[1]/div/div/div/div[2]/button" + # material modification + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[1]/div/div/div[1]/div[1]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_sel_asset(xpath: str = ElementEnum.BUTTON_XPATH) -> str: + if xpath == ElementEnum.BUTTON_XPATH: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[1]/div/div/div[1]/div[2]/div/div/div/div[2]/button" + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[2]/div[1]/div/div/div[1]/div[2]/div/div/div/div[3]/ul/li[1]" + + @staticmethod + def get_xpath_button_save() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[1]/div[1]/div[2]/div/div[2]/button" diff --git a/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_tags_repository.py b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_tags_repository.py new file mode 100644 index 00000000..25d9d343 --- /dev/null +++ b/selenium/vue/oco/tactical_requests/infrastructure/repositories/tactical_requests_tags_repository.py @@ -0,0 +1,24 @@ + +class TacticalRequestTagsFilesRepository: + def __int__(self): + pass + + @staticmethod + def get_xpath_input_upload_optional_files() -> str: + return "/html/body/div[4]/div/div/div[2]/div/div/div/div/div[2]/input" + + @staticmethod + def get_xpath_input_upload_optional_files() -> str: + return "/html/body/div[4]/div/div/div[2]/div/div/div/div/div[2]/input" + + @staticmethod + def get_xpath_btn_modal_optional_files() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[5]/div/div[2]/div/div[4]/button" + + @staticmethod + def get_xpath_btn_modal_text_files() -> str: + return "/html/body/div[1]/main/div/div[1]/div[3]/section/div[2]/div/div[1]/div[3]/div/div[6]/div/div[2]/div/div[4]/button" + + @staticmethod + def get_xpath_btn_modal_apply_changes() -> str: + return "/html/body/div[4]/div/div/div[3]/button" diff --git a/selenium/vue/shared/__init__.py b/selenium/vue/shared/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/domain/__init__.py b/selenium/vue/shared/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/domain/element_enum.py b/selenium/vue/shared/domain/element_enum.py new file mode 100644 index 00000000..c8f1f7f6 --- /dev/null +++ b/selenium/vue/shared/domain/element_enum.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class ElementEnum(Enum): + BUTTON_XPATH = "button" + LI_XPATH = "li" diff --git a/selenium/vue/shared/infrastructure/__init__.py b/selenium/vue/shared/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/infrastructure/facades/__init__.py b/selenium/vue/shared/infrastructure/facades/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/infrastructure/facades/dom.py b/selenium/vue/shared/infrastructure/facades/dom.py new file mode 100644 index 00000000..2d605edc --- /dev/null +++ b/selenium/vue/shared/infrastructure/facades/dom.py @@ -0,0 +1,19 @@ +from dataclasses import dataclass +from selenium.webdriver.common.by import By + + +@dataclass +class Dom: + __browser: object + + def __int__(self, browser): + self.__browser = browser + + def find_by_id(self, element_id: str) -> object: + return self.__browser.find_element(By.ID, element_id) + + def find_by_name(self, element_name: str) -> object: + return self.__browser.find_element(By.NAME, element_name) + + def find_by_xpath(self, xpath: str) -> object: + return self.__browser.find_element(By.XPATH, xpath) diff --git a/selenium/vue/shared/infrastructure/facades/dropdown.py b/selenium/vue/shared/infrastructure/facades/dropdown.py new file mode 100644 index 00000000..b772149e --- /dev/null +++ b/selenium/vue/shared/infrastructure/facades/dropdown.py @@ -0,0 +1,23 @@ +from dataclasses import dataclass +from time import sleep +from vue.shared.infrastructure.facades.dom import Dom + + +@dataclass +class Dropdown: + __dom: Dom + + def __int__(self, dom: Dom): + self.__dom = dom + + def select_by_xpath(self, btn_xpath: str, li_xpath: str) -> None: + if not self.__dom: + return None + + btn_dropdown = self.__dom.find_by_xpath(btn_xpath) + btn_dropdown.click() + sleep(1) + + li_material = self.__dom.find_by_xpath(li_xpath) + li_material.click() + sleep(1) diff --git a/selenium/vue/shared/infrastructure/facades/dt.py b/selenium/vue/shared/infrastructure/facades/dt.py new file mode 100644 index 00000000..816c9e51 --- /dev/null +++ b/selenium/vue/shared/infrastructure/facades/dt.py @@ -0,0 +1,10 @@ +from datetime import datetime, date, timedelta + + +def get_yyyy_mm_dd() -> str: + return datetime.today().strftime('%Y-%m-%d') + + +def get_ymd_plus(days: int = 1) -> str: + end_date = date.today() + timedelta(days=days) + return end_date.strftime("%Y-%m-%d") diff --git a/selenium/vue/shared/infrastructure/facades/element.py b/selenium/vue/shared/infrastructure/facades/element.py new file mode 100644 index 00000000..d715f4a1 --- /dev/null +++ b/selenium/vue/shared/infrastructure/facades/element.py @@ -0,0 +1,37 @@ +from time import sleep +from dataclasses import dataclass +from vue.shared.infrastructure.facades.dom import Dom + + +@dataclass +class Element: + __dom: Dom + + def __int__(self, dom: Dom): + self.__dom = dom + + def set_value(self, element_id: str, value: str) -> None: + if not self.__dom: + return None + + input_element = self.__dom.find_by_id(element_id) + input_element.send_keys(value) + sleep(0.2) + + def set_value_by_name(self, element_name: str, value: str) -> None: + if not self.__dom: + return None + + input_element = self.__dom.find_by_name(element_name) + input_element.send_keys(value) + sleep(0.2) + + @staticmethod + def set_value_in_input(input_element: object, value: str) -> None: + input_element.send_keys(value) + sleep(0.2) + + def set_value_by_xpath(self, xpath: str, value: str) -> None: + input_element = self.__dom.find_by_xpath(xpath) + input_element.send_keys(value) + sleep(0.2) diff --git a/selenium/vue/shared/infrastructure/facades/env.py b/selenium/vue/shared/infrastructure/facades/env.py new file mode 100644 index 00000000..804e206b --- /dev/null +++ b/selenium/vue/shared/infrastructure/facades/env.py @@ -0,0 +1,10 @@ +import os + +ENV_HOME = "HOME" +ENV_PATHPRJ = "PATHPRJ" +ENV_DEV_URL = "DEV_URL" +ENV_PRE_URL = "PRE_URL" + + +def getenv(var: str, default: str = "") -> str: + return os.environ.get(var, default) diff --git a/selenium/vue/shared/infrastructure/factories/__init__.py b/selenium/vue/shared/infrastructure/factories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/infrastructure/factories/db.py b/selenium/vue/shared/infrastructure/factories/db.py new file mode 100644 index 00000000..ea234422 --- /dev/null +++ b/selenium/vue/shared/infrastructure/factories/db.py @@ -0,0 +1,33 @@ +""" +https://www.mytecbits.com/internet/python/connect-sql-server-from-python-on-macos + +/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release +brew update +brew install msodbcsql18 mssql-tools +xcode-select --install +""" +import pyodbc + +CONFIG = { + "driver": "{ODBC Driver 17 for SQL Server}", + "server": "tcp:127.0.0.1,1433", + "database": "local_laciahub", + "user": "sa", + "password": "EafEaf1234", + "encrypt": "no", +} + + +def get_db() -> object: + driver = CONFIG.get("driver") + server = CONFIG.get("server") + database = CONFIG.get("database") + username = CONFIG.get("user") + password = CONFIG.get("password") + encrypt = CONFIG.get("encrypt") + cnxn = pyodbc.connect( + f"DRIVER={driver};SERVER={server};DATABASE={database};ENCRYPT={encrypt};UID={username};PWD={password}" + ) + cursor = cnxn.cursor() + return cursor diff --git a/selenium/vue/shared/infrastructure/factories/driver_factory.py b/selenium/vue/shared/infrastructure/factories/driver_factory.py new file mode 100644 index 00000000..1e61c921 --- /dev/null +++ b/selenium/vue/shared/infrastructure/factories/driver_factory.py @@ -0,0 +1,47 @@ +import time +from selenium import webdriver +from selenium.webdriver.chrome.service import Service +from vue.shared.infrastructure.facades.env import * + +PATH_DRIVER = getenv(ENV_PATHPRJ) +FRONT_URL = "http://localhost:3000" +FRONT_URL = getenv(ENV_PRE_URL, getenv(ENV_DEV_URL, FRONT_URL)) + +FRONT_URL_HASH = f"{FRONT_URL}/#" + +__webdriver = None + + +def get_chrome(): + global __webdriver + + if __webdriver: + return __webdriver + + options = webdriver.ChromeOptions() + options.add_argument("--auto-open-devtools-for-tabs") + options.add_argument("--detach-devtools-docked-at-startup") + # deshabilita validación cors + options.add_argument("--disable-web-security") + options.add_argument("start-maximized") + #options.add_argument("--disable-blink-features=AutomationControlled") + + service = Service(f"{PATH_DRIVER}/chrome-driver-selenium/chromedriver") + __webdriver = webdriver.Chrome(service=service, options=options) + #__webdriver.execute_cdp_cmd("Page.setDevToolsFlattened", {"devtoolsFlattened": True}) + __webdriver.execute_script(""" + async function openDevTools() { + const {Runtime} = await import('chrome-devtools-frontend/front_end/common/Runtime.js'); + await Runtime.evaluate({expression: `inspect(window.open())`}); + } + openDevTools(); +""") + return __webdriver + + +def close(sleep: int = 0): + time.sleep(sleep) + global __webdriver + if __webdriver: + __webdriver.quit() + __webdriver = None diff --git a/selenium/vue/shared/infrastructure/generators/__init__.py b/selenium/vue/shared/infrastructure/generators/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/infrastructure/generators/uuid.py b/selenium/vue/shared/infrastructure/generators/uuid.py new file mode 100644 index 00000000..8095e386 --- /dev/null +++ b/selenium/vue/shared/infrastructure/generators/uuid.py @@ -0,0 +1,7 @@ +import random +import string + + +def get_uuid(size=32, chars=string.ascii_letters + string.digits) -> str: + # return "abc" + return "".join(random.choice(chars) for _ in range(size)) diff --git a/selenium/vue/shared/infrastructure/repositories/__init__.py b/selenium/vue/shared/infrastructure/repositories/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/selenium/vue/shared/infrastructure/repositories/files_repository.py b/selenium/vue/shared/infrastructure/repositories/files_repository.py new file mode 100644 index 00000000..f9115e56 --- /dev/null +++ b/selenium/vue/shared/infrastructure/repositories/files_repository.py @@ -0,0 +1,11 @@ +from vue.shared.infrastructure.facades.env import * + + +class FilesRepository: + def __int__(self): + pass + + @staticmethod + def get_rnd_artworks() -> str: + home = getenv(ENV_HOME) + return f"{home}/Desktop/assets-1/mat-arch-opcionales-2-de-n.jpg" diff --git a/selenium/vue/shared/infrastructure/repositories/routes_repository.py b/selenium/vue/shared/infrastructure/repositories/routes_repository.py new file mode 100644 index 00000000..dc1bcd13 --- /dev/null +++ b/selenium/vue/shared/infrastructure/repositories/routes_repository.py @@ -0,0 +1,17 @@ +from vue.shared.infrastructure.factories.driver_factory import FRONT_URL_HASH + + +class RoutesRepository: + def __int__(self): + pass + + @staticmethod + def get_asset_add_url() -> str: + return f"{FRONT_URL_HASH}/assets/add" + + @staticmethod + def get_tactical_requests_add_url() -> str: + return f"{FRONT_URL_HASH}/requests/add" + @staticmethod + def get_employees_add_url() -> str: + return f"{FRONT_URL_HASH}/employees/add" diff --git a/skeleton/README.md b/skeleton/README.md new file mode 100644 index 00000000..48eec085 --- /dev/null +++ b/skeleton/README.md @@ -0,0 +1,107 @@ +## skeleton +- Base para desarrollo de cualquier proyecto + +### Configurar setup.py +- si deseo que este "proyecto" skeleton sea instalable debo configurar setup.py +- [Más info](https://github.com/eacevedof/prj_python37/blob/master/theframework/setup.py) +```py +# setup.py +from setuptools import setup, find_packages +setup(name='skeleton', version='1.0', packages=find_packages()) +``` + +## Ejecución: +- Posicionarse dentro de skeleton +- ~~Ejecutar: pipenv shell~~~ + - Esto se usa por si quiero instalar cosas con pip install sin que afecte a otros entornos + - No era este caso + ```s + ioedu@HPZBOOK15U MINGW64 /e/projects/prj_python37/skeleton (master) + $ pipenv shell + Creating a virtualenv for this project▒ + Pipfile: E:\projects\prj_python37\skeleton\Pipfile + Using e:\programas\python\python37-32\python.exe (3.7.2) to create virtualenv▒ + [ =] Creating virtual environment...Already using interpreter e:\programas\python\python37-32\python.exe + Using base prefix 'e:\\programas\\python\\python37-32' + New python executable in C:\\.virtualenvs\skeleton-k4jCkxmh\Scripts\python.exe + Installing setuptools, pip, wheel... + done. + + Successfully created virtual environment! + Virtualenv location: C:\\.virtualenvs\skeleton-k4jCkxmh + Creating a Pipfile for this project▒ + Launching subshell in virtual environment▒ + ``` +- Creará este fichero: + ```py + [[source]] + name = "pypi" + url = "https://pypi.org/simple" + verify_ssl = true + + [dev-packages] + + [packages] + + [requires] + python_version = "3.7" + ``` +### Resultado de `py main.py` +```py +# main.py +print("main.py") + +from packa.moda1 import Moda1 +from packa.moda2 import Moda2 + +from packb.modb1 import func_b1,func_b3 +from packc.modc1 import * + +m1 = Moda1("x-1","y-2",k1="value-1") +m2 = Moda2("-","-",k1="value de moda 2") + +m1.printself() + +m2.printself() +m2.showmodb1() + +func_b1() +func_b3() + +print("CONST_A:",CONST_A,", CONST_B:",CONST_B,", CONST_C:",CONST_C) +print(CONST_DICTO,CONST_TUPLA) +``` +```s +main.py +packc.init +moda1 imported +moda0 imported +moda2 imported +packb.init +modb1 imported +packc.init +modc1 imported +class Moda1.__init__ ('x-1', 'y-2') {'k1': 'value-1'} +class Moda0.__init__ ('x-1', 'y-2') {'k1': 'value-1'} +l? ('x-1', 'y-2') d? {'k1': 'value-1'} +class Moda2 ('-', '-') {'k1': 'value de moda 2'} +PRINT SELF: + self.x: x-1 self.y: y-2 self.k1 value-1 +PRINT SELF: + self.x: self.y: self.k1 value de moda 2 +executing foo(, tradicional) +executing class_foo(, metodo de clase) +executing static_foo(metodo estatico) +func_b1 +func_b3 +CONST_A: constante a , CONST_B: constante b , CONST_C: 1234 +{'k1': 'v1', 'k2': 'v2'} (3, 4, 5, 8) +``` + + +### Bibliografía +- [Stackoverflow](https://stackoverflow.com/questions/6323860/sibling-package-imports/50193944#50193944) + +### Error +- ModuleNotFoundError: No module named 'moda0' + - Era pq no ponía el nombre del paquete ^^, deberia hacerlo así: `moda1.py: from packa.moda0 import Moda0` \ No newline at end of file diff --git a/skeleton/__init__.py b/skeleton/__init__.py new file mode 100644 index 00000000..b9829d6a --- /dev/null +++ b/skeleton/__init__.py @@ -0,0 +1 @@ +print("skeleton.init") \ No newline at end of file diff --git a/skeleton/main.py b/skeleton/main.py new file mode 100644 index 00000000..ec9c59f8 --- /dev/null +++ b/skeleton/main.py @@ -0,0 +1,22 @@ +# main.py +print("main.py") + +from packa.moda1 import Moda1 +from packa.moda2 import Moda2 + +from packb.modb1 import func_b1,func_b3 +from packc.modc1 import * + +m1 = Moda1("x-1","y-2",k1="value-1") +m2 = Moda2("-","-",k1="value de moda 2") + +m1.printself() + +m2.printself() +m2.showmodb1() + +func_b1() +func_b3() + +print("CONST_A:",CONST_A,", CONST_B:",CONST_B,", CONST_C:",CONST_C) +print(CONST_DICTO,CONST_TUPLA) diff --git a/skeleton/packa/__init__.py b/skeleton/packa/__init__.py new file mode 100644 index 00000000..c89a71d2 --- /dev/null +++ b/skeleton/packa/__init__.py @@ -0,0 +1 @@ +print("packc.init") \ No newline at end of file diff --git a/skeleton/packa/moda0.py b/skeleton/packa/moda0.py new file mode 100644 index 00000000..7413e960 --- /dev/null +++ b/skeleton/packa/moda0.py @@ -0,0 +1,25 @@ +print("moda0 imported") +from pprint import pprint + +class Moda0: + x = "" + y = "" + k1 = "" + + def __init__(self, *l, **d): + print("class Moda0.__init__",l,d) + self.x = l[0] + self.y = l[1] + print("l?",l,"d?",d) + self.k1 = d["k1"] + + def printself(self): + print("PRINT SELF:\n self.x:",self.x,"self.y:",self.y,"self.k1",self.k1) + +if __name__ == "__main__": + # pass + o = Moda0("x","y",k1="v1") + o.printself() + # pprint(o) + + diff --git a/skeleton/packa/moda1.py b/skeleton/packa/moda1.py new file mode 100644 index 00000000..7ba393f7 --- /dev/null +++ b/skeleton/packa/moda1.py @@ -0,0 +1,15 @@ +print("moda1 imported") +from pprint import pprint +from packa.moda0 import Moda0 + +class Moda1(Moda0): + def __init__(self,*a,**kw): + print("class Moda1.__init__",a,kw) + # super().__init__(a, kw) # NO! + # super().__init__(self, a, kw) # NO! + super().__init__(*a, **kw) + +if __name__ == "__main__": + o = Moda1("x1","y1",k1="m1") + o.printself() + #pprint(o) diff --git a/skeleton/packa/moda2.py b/skeleton/packa/moda2.py new file mode 100644 index 00000000..5d5fffe2 --- /dev/null +++ b/skeleton/packa/moda2.py @@ -0,0 +1,21 @@ +print("moda2 imported") +from pprint import pprint +from packa.moda0 import Moda0 +from packb.modb1 import ModB1 + +class Moda2(Moda0): + + def __init__(self,*a,**kw): + print("class Moda2",a,kw) + self.k1 = kw["k1"] + + def showmodb1(self): + o = ModB1() + o.foo("tradicional") + o.class_foo("metodo de clase") + o.static_foo("metodo estatico") + + +if __name__ == "__main__": + o = Moda2("x2","y2",k1="m2") + o.printself() diff --git a/skeleton/packb/__init__.py b/skeleton/packb/__init__.py new file mode 100644 index 00000000..4b81ee87 --- /dev/null +++ b/skeleton/packb/__init__.py @@ -0,0 +1 @@ +print("packb.init") \ No newline at end of file diff --git a/skeleton/packb/modb1.py b/skeleton/packb/modb1.py new file mode 100644 index 00000000..95c1d79e --- /dev/null +++ b/skeleton/packb/modb1.py @@ -0,0 +1,23 @@ +print("modb1 imported") + +def func_b1(): + print("func_b1") + +def func_b2(): + print("func_b2") + +def func_b3(): + print("func_b3") + +class ModB1: + + def foo(self, x): + print("executing foo(%s, %s)" % (self, x)) + + @classmethod + def class_foo(cls, x): + print("executing class_foo(%s, %s)" % (cls, x)) + + @staticmethod + def static_foo(x): + print("executing static_foo(%s)" % x) diff --git a/skeleton/packc/__init__.py b/skeleton/packc/__init__.py new file mode 100644 index 00000000..c89a71d2 --- /dev/null +++ b/skeleton/packc/__init__.py @@ -0,0 +1 @@ +print("packc.init") \ No newline at end of file diff --git a/skeleton/packc/modc1.py b/skeleton/packc/modc1.py new file mode 100644 index 00000000..a0bf3d54 --- /dev/null +++ b/skeleton/packc/modc1.py @@ -0,0 +1,10 @@ +print("modc1 imported") + +CONST_A = "constante a" +CONST_B = "constante b" +CONST_C = 1234 + +CONST_TUPLA = (3,4,5,8,) +CONST_DICTO = {"k1":"v1","k2":"v2"} + + diff --git a/sqlalchemy/docker-compose.yml b/sqlalchemy/docker-compose.yml new file mode 100644 index 00000000..70254891 --- /dev/null +++ b/sqlalchemy/docker-compose.yml @@ -0,0 +1,35 @@ +version: "3.9" + +services: + alchemy: + container_name: cont-py38 + hostname: py38 + build: + context: . + dockerfile: ./docker/Dockerfile + + volumes: + - ./pyinstaller-sh:/app/pyinstaller-sh + - ./compiled:/app/compiled + - ./pyprint:/app/pyprint + + # debug vscode + ports: + - "" + - "8080:8080" + - "5678:5678" + # mantiene el contenedor en ejecución + # command: tail -f /dev/null toma 10 segundos en parar el contenedor + # tty: true #toma 2 segundos en parar el contenedor (si se tiene entrypoint este no va) + entrypoint: /usr/src/entrypoint.sh # da un error y tira el contenedor + + privileged: true + devices: + - '/dev:/dev' + # read_only: true + networks: + - pyprintnet + +networks: + pyprintnet: + name: pyprintnet diff --git a/sqlalchemy/docker/.bashrc b/sqlalchemy/docker/.bashrc new file mode 100644 index 00000000..012617ed --- /dev/null +++ b/sqlalchemy/docker/.bashrc @@ -0,0 +1,4 @@ +alias linux='/bin/bash /app/helpers-sh/linux.sh' +alias dist='cd /app/compiled/linux/dist' +alias build='cd /app/compiled/linux/build' +alias pyprint='cd /app/pyprint' \ No newline at end of file diff --git a/sqlalchemy/docker/Dockerfile b/sqlalchemy/docker/Dockerfile new file mode 100644 index 00000000..9cdfe9e6 --- /dev/null +++ b/sqlalchemy/docker/Dockerfile @@ -0,0 +1,15 @@ +# FROM python:3.6 +FROM python:3.6 + +#RUN: ejecuta comandos en el momento de la creacion de la imagen +RUN apt-get update && \ + apt-get -y install --no-install-recommends \ + procps \ + apt-get -y install mariadb-server \ + #vim + +COPY ./docker/.bashrc /root/.bashrc +COPY ./docker/entrypoint.sh /usr/src/entrypoint.sh +RUN chmod +x /usr/src/entrypoint.sh + +WORKDIR /app/alchemy \ No newline at end of file diff --git a/sqlalchemy/docker/entrypoint.sh b/sqlalchemy/docker/entrypoint.sh new file mode 100644 index 00000000..4e0109c4 --- /dev/null +++ b/sqlalchemy/docker/entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/bash +apt-get install -y binutils libc6 +apt-get install -y binutils libc-bin + +python -m pip install --upgrade pip + +pip install pyinstaller +pip install debugpy +pip install fastapi +pip install uvicorn[standard] + +# arregla max recursion del compilado +pip uninstall pydantic +pip install git+git://github.com/samuelcolvin/pydantic@master#egg=pydantic + +#pip install debugpy -t /tmp + +#python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m uvicorn +#python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m public/main.py +#python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 /pyprint/public/main.py + +#python -m debugpy --listen 0.0.0.0:5678 --wait-for-client -m src + +#python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn + +#python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn main:app + +#https://www.uvicorn.org/settings/ +cd public; uvicorn main:app --reload --host 0.0.0.0 --port 8080 --reload-dir "../src" + +# python public/main.py + +# python -m public/main.py + +# esta llamada permite reconocer src como módulo pero no me sirve ya que es solo para debug +# python -m public.main diff --git a/sqlalchemy/makefile b/sqlalchemy/makefile new file mode 100644 index 00000000..c2074766 --- /dev/null +++ b/sqlalchemy/makefile @@ -0,0 +1,33 @@ +# 4.19.76-linuxkit +build: + docker-compose up -d --build + +rebuild: + make down + make build + +restart: + docker-compose restart + # make ssh + +down: + docker-compose down + +ssh: ## bin/sh para alpine + docker exec --user="root" -it cont-py38 /bin/bash + +start: + docker-compose start + #make ssh +stop: + docker-compose stop + +remove: + docker rm cont-py38 + +logs: + # docker logs cont-py38 + docker-compose logs --tail="all" + +remlogs: + rm -fr pyprint/logs/* diff --git a/tensorflow/.gitignore b/tensorflow/.gitignore new file mode 100644 index 00000000..723ef36f --- /dev/null +++ b/tensorflow/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/tensorflow/celcius-fahrenheit/main.py b/tensorflow/celcius-fahrenheit/main.py new file mode 100644 index 00000000..7c560b20 --- /dev/null +++ b/tensorflow/celcius-fahrenheit/main.py @@ -0,0 +1,47 @@ +import tensorflow as tf +import numpy as np + +celsius = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float) +fahrenheit = np.array([-40, 14, 32, 46, 59, 72, 100], dtype=float) + +#capa = tf.keras.layers.Dense(units=1, input_shape=[1]) +#modelo = tf.keras.Sequential([capa]) + +oculta1 = tf.keras.layers.Dense(units=3, input_shape=[1]) +oculta2 = tf.keras.layers.Dense(units=3) +salida = tf.keras.layers.Dense(units=1) +modelo = tf.keras.Sequential([oculta1, oculta2, salida]) + +tasa_de_aprendizaje = 0.1 + +modelo.compile( + # concretamente, Adam le permite a la red ajuste los pesos y sesgos de manera eficiente + # de modo que aprenda y no desaprenda + optimizer=tf.keras.optimizers.Adam(tasa_de_aprendizaje), + # error de media cuadratica. Una pequeña cantidad de grandes errores es peor que una cantidad grande de pequeños errores + loss="mean_squared_error" +) + +ciclos_de_aprendizaje = 1000 +# entrenamiento +historial = modelo.fit(celsius, fahrenheit, epochs=ciclos_de_aprendizaje, verbose=False) + +print("modelo entrenado") + +#reultado de la funcion de perdida +import matplotlib.pyplot as plt + +plt.xlabel("# ciclos (epochs)") +plt.ylabel("magnitud de perdida") +plt.plot(historial.history["loss"]) +plt.show() + +# comprobar si predice +result = modelo.predict([100]) +print("100 C en fahrenheit deberia ser 212") +print(result) + +print("peso, sesgo") +print(oculta1.get_weights()) +print(oculta2.get_weights()) +print(salida.get_weights()) \ No newline at end of file diff --git a/tensorflow/celcius-fahrenheit/ringa-tech.md b/tensorflow/celcius-fahrenheit/ringa-tech.md new file mode 100644 index 00000000..60e9bac5 --- /dev/null +++ b/tensorflow/celcius-fahrenheit/ringa-tech.md @@ -0,0 +1,3 @@ +[index](../readme.md) + +[Video](https://youtu.be/iX_on3VxZzk?list=PLZ8REt5zt2Pn0vfJjTAPaDVSACDvnuGiG) \ No newline at end of file diff --git a/tensorflow/clasificador-imagenes/ringa-tech.md b/tensorflow/clasificador-imagenes/ringa-tech.md new file mode 100644 index 00000000..a110d09e --- /dev/null +++ b/tensorflow/clasificador-imagenes/ringa-tech.md @@ -0,0 +1,17 @@ +[index](../readme.md) + +[Tu primer clasificador de imágenes con Python y Tensorflow](https://www.youtube.com/watch?v=j6eGHROLKP8&list=PLZ8REt5zt2Pn0vfJjTAPaDVSACDvnuGiG&index=2) +- Una imagen de 100px x 100px (10.000 pixeles) daría una entrada de 10.000 neuronas en la capa de entrada +- Esta misma imagen la podemos reducir al mínimo posible. 28px x 28px = 784 neuronas de entrada y 10 neuronas de salida +- 10 porque son las categorias: camiseta, pantalon, falda, etc. +- [emulador de regresion y clasificacion](https://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=2,2&seed=0.95468&showTestData=false&discretize=false&percTrainData=40&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=regression&initZero=false&hideText=false) +- Si se trata de un problema de regresion es decir que sea lineal entonces se podria hacer con dos capas. Las capas de entrada y salida. +- Este planteamiento no serviria para una clasifcación puesto que los limites del dominio no es trivial. +- Aqui entran en juego las [Capas ocultas y las funciones de activación](https://youtu.be/j6eGHROLKP8?list=PLZ8REt5zt2Pn0vfJjTAPaDVSACDvnuGiG&t=301) +- En le primer caso, entre la entrada y salida hay apenas margen para aplicar transformaciones. +- Solo podriamos resolver problemas de multiplicación o suma. +- En problemas más complejos se requiere de varias capas que vayan sumando y multiplicando + + + + diff --git a/tensorflow/perro-gato/ringa-tech.md b/tensorflow/perro-gato/ringa-tech.md new file mode 100644 index 00000000..f33df761 --- /dev/null +++ b/tensorflow/perro-gato/ringa-tech.md @@ -0,0 +1,2 @@ +[index](../readme.md) + diff --git a/tensorflow/pulgadas-metros/aprende_e_ingenia.md b/tensorflow/pulgadas-metros/aprende_e_ingenia.md new file mode 100644 index 00000000..f5d62b2d --- /dev/null +++ b/tensorflow/pulgadas-metros/aprende_e_ingenia.md @@ -0,0 +1,14 @@ +[index](../readme.md) + +### [Aprende a crear una red neuronal en python](https://youtu.be/cDMoaMnbQUc?t=57) +- Hay dos capas inprescindibles la capa de entrada y de salida +- [librerias](https://youtu.be/cDMoaMnbQUc?t=691) + - tensorflow + - numpy + - matplotlib + +- **capa tipo densa** todas las salidas de una neurona se conecta a la entrada de otra +- **Un optimizador** es el encargado de ajustar los pesos y sesgos de la red neuronal + - ![Flecha amarilla con optimizador](images/optimizador.png) + - inicialmente se asume una perdida muy grande pero con cada repaso del optimizador la perdida debe tender a 0 +- **metrica de perdida** es la encargada de indicarnos el tamaño del desfase de la salida devuelta y la esperada diff --git a/tensorflow/pulgadas-metros/checkpoint b/tensorflow/pulgadas-metros/checkpoint new file mode 100644 index 00000000..52e00847 --- /dev/null +++ b/tensorflow/pulgadas-metros/checkpoint @@ -0,0 +1,2 @@ +model_checkpoint_path: "pesos.red-uno" +all_model_checkpoint_paths: "pesos.red-uno" diff --git a/tensorflow/pulgadas-metros/images/optimizador.png b/tensorflow/pulgadas-metros/images/optimizador.png new file mode 100644 index 00000000..8e4ca487 Binary files /dev/null and b/tensorflow/pulgadas-metros/images/optimizador.png differ diff --git a/tensorflow/pulgadas-metros/main.py b/tensorflow/pulgadas-metros/main.py new file mode 100644 index 00000000..4bc0666f --- /dev/null +++ b/tensorflow/pulgadas-metros/main.py @@ -0,0 +1,50 @@ +# https://youtu.be/cDMoaMnbQUc?t=778 +import tensorflow as tf +import numpy as np +import matplotlib.pyplot as plt + +# entradas con numeros de pulgadas +entradas = np.array([1, 6, 30, 7, 70, 43, 503, 201, 1005, 99], dtype=float) +resultados = np.array([0.0254, 0.1524, 0.762, 0.1778, 1.778, 1.0922, 12.776, 5.1054, 25.527, 2.514], dtype=float) + +# topografia de la red +# 1 capa de entrada con una neurona de entrada y una de salida + +# units = capas +capa1 = tf.keras.layers.Dense(units=1, input_shape=[1]) + +modelo = tf.keras.Sequential(capa1) + +# asignar un optimizador y una metrica de perdida +modelo.compile( + optimizer = tf.keras.optimizers.Adam(0.1), + + # tiene como prioridad corregir los grandes errores aunque sean pocos antes que los pequeños errores + loss = "mean_squared_error" +) + +print("Entrenando") + +#entrenando el modelo +# epochs son los ciclos de entrenamiento +entrenamiento = modelo.fit(entradas, resultados, epochs=500, verbose=False) + +# guardamos la red despues de su entrenamiento +modelo.save("red-uno") +modelo.save_weights("pesos.red-uno") + +# verificar que la red se entrenó +print("terminado") + +# prediccion +i = input("ingresa el valor en pulgadas\n") +i = float(i) + +r = modelo.predict([i]) +print(f"prediccion {r}") + +#grafico +plt.xlabel("ciclos de entrenamiento") +plt.ylabel("errores") +plt.plot(entrenamiento.history["loss"]) +plt.show() \ No newline at end of file diff --git a/tensorflow/pulgadas-metros/pesos.red-uno.data-00000-of-00001 b/tensorflow/pulgadas-metros/pesos.red-uno.data-00000-of-00001 new file mode 100644 index 00000000..0ccd48a6 Binary files /dev/null and b/tensorflow/pulgadas-metros/pesos.red-uno.data-00000-of-00001 differ diff --git a/tensorflow/pulgadas-metros/pesos.red-uno.index b/tensorflow/pulgadas-metros/pesos.red-uno.index new file mode 100644 index 00000000..0a6ebc47 Binary files /dev/null and b/tensorflow/pulgadas-metros/pesos.red-uno.index differ diff --git a/tensorflow/pulgadas-metros/red-uno/fingerprint.pb b/tensorflow/pulgadas-metros/red-uno/fingerprint.pb new file mode 100644 index 00000000..94481ad4 --- /dev/null +++ b/tensorflow/pulgadas-metros/red-uno/fingerprint.pb @@ -0,0 +1 @@ +طۖѹͯ/ ۫ơd(2 \ No newline at end of file diff --git a/tensorflow/pulgadas-metros/red-uno/keras_metadata.pb b/tensorflow/pulgadas-metros/red-uno/keras_metadata.pb new file mode 100644 index 00000000..bbe695e4 --- /dev/null +++ b/tensorflow/pulgadas-metros/red-uno/keras_metadata.pb @@ -0,0 +1,4 @@ + +root"_tf_keras_sequential*{"name": "sequential", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": false, "class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1]}, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}}, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}}]}, "shared_object_id": 4, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 1]}, "ndim": 2, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 1]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1]}, "float32", "dense_input"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1]}, "float32", "dense_input"]}, "keras_version": "2.12.0", "backend": "tensorflow", "model_config": {"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "dense_input"}, "shared_object_id": 0}, {"class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1]}, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3}]}}, "training_config": {"loss": "mean_squared_error", "metrics": null, "weighted_metrics": null, "loss_weights": null, "optimizer_config": {"class_name": "Custom>Adam", "config": {"name": "Adam", "weight_decay": null, "clipnorm": null, "global_clipnorm": null, "clipvalue": null, "use_ema": false, "ema_momentum": 0.99, "ema_overwrite_frequency": null, "jit_compile": false, "is_legacy_optimizer": false, "learning_rate": 0.10000000149011612, "beta_1": 0.9, "beta_2": 0.999, "epsilon": 1e-07, "amsgrad": false}}}}2 +root.layer_with_weights-0"_tf_keras_layer*{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1]}, "stateful": false, "must_restore_from_config": false, "preserve_input_structure_in_config": false, "autocast": true, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1]}, "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 1}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 2}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 3, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 1}}, "shared_object_id": 6}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 1]}}2 +/root.keras_api.metrics.0"_tf_keras_metric*{"class_name": "Mean", "name": "loss", "dtype": "float32", "config": {"name": "loss", "dtype": "float32"}, "shared_object_id": 7}2 \ No newline at end of file diff --git a/tensorflow/pulgadas-metros/red-uno/saved_model.pb b/tensorflow/pulgadas-metros/red-uno/saved_model.pb new file mode 100644 index 00000000..84e0fd62 Binary files /dev/null and b/tensorflow/pulgadas-metros/red-uno/saved_model.pb differ diff --git a/tensorflow/pulgadas-metros/red-uno/variables/variables.data-00000-of-00001 b/tensorflow/pulgadas-metros/red-uno/variables/variables.data-00000-of-00001 new file mode 100644 index 00000000..bbaf1fbb Binary files /dev/null and b/tensorflow/pulgadas-metros/red-uno/variables/variables.data-00000-of-00001 differ diff --git a/tensorflow/pulgadas-metros/red-uno/variables/variables.index b/tensorflow/pulgadas-metros/red-uno/variables/variables.index new file mode 100644 index 00000000..bece1fce Binary files /dev/null and b/tensorflow/pulgadas-metros/red-uno/variables/variables.index differ diff --git a/tensorflow/readme.md b/tensorflow/readme.md new file mode 100644 index 00000000..0db4ab22 --- /dev/null +++ b/tensorflow/readme.md @@ -0,0 +1,269 @@ +[Aprende e Ingenia](./pulgadas-metros/aprende_e_ingenia.md) +[Ringa Tech](./perro-gato/ringa-tech.md) + +[1 - Ringa Tech - Tu primera red neuronal en python y tensorflow](./celcius-fahrenheit/ringa-tech.md) +[2 - Ringa Tech - Tu primer clasificador de imágenes con Python y Tensorflow](./clasificador-imagenes/ringa-tech.md) + +### Tipos de redes neuronales +- Redes neuronales convolucionales (CNN). Procesamiento de imagenes y señales. Convertir una imagen en comic. +- Redes neuronales recurrentes (RNN). Procesamiento lenguaje natural, introducción automática y análisis de sentimientos. +- Redes neuronales de memoria a largo plazo (LSTM) +- Redes neuronales generativas adversarias (GAN) +- Redes neuronales de atención +- Redes neuronales autoencoders +- Redes neuronales de clasificación. Gato o perro +- Redes neuronales de retroalimentación (feedback). Las redes de retroalimentación se utilizan en aplicaciones como el control de procesos, la predicción de series temporales y el modelado de sistemas físicos. +- Redes neuronales de aprendizaje por refuerzo +- Una **red de regresión** es un tipo de red neuronal que se utiliza para predecir un valor numérico continuo, en lugar de una etiqueta discreta. La red de regresión toma una serie de variables de entrada, las procesa a través de múltiples capas de neuronas y devuelve un valor numérico continuo como salida. +- etc etc + + +### [Redes neuronales - Cómo Aprenden](https://www.youtube.com/watch?v=CU24iC3grq8) +- Neurona. Proceso de **activación** y **disparo**. Disparo que activa otra neurona. Análogo a una entrada/salida +- En el proceso de práctica de una habilidad (hacer malabares p.e) esto genera conexiones entre neuronas que no tienen relación ninguna +de modo que la activacion en la primera hace que la última se dispare instantaneamente +- [como se emularia este proceso en 0 y 1](https://youtu.be/CU24iC3grq8?t=201) +- Que influye en la toma de una decisión? + - Tomemos como ejemplo la planificación de un viaje con estas tres preguntas: + - Tienes dinero suficiente? => x1 + - Tu pareja quiere ir? => x2 + - El lugar tiene clima agradable? => x3 +- Asumamos estos factores como x1, x2 y x3 + - Cada factor tiene dos opciones opsibles si/no 1/0 +- Si entendemos estos estados como entradas de una **función X** podriamos asumir que según unos valores esperemos un retorno +- las posibles entradas serían 2^3 = 8. (cantidad de valores posibles en las entradas) ^ (numero de entradas) +- Tomemos el caso: x1=0, x2=0 y x3=0 la salida esperada 0 +- [Como deberia ser esta **función** para que retorne 0?](https://youtu.be/CU24iC3grq8?t=297) +- Definamos un **umbral** de decisión (un número arbitrario) en este caso 1 +- Si suma(xi)>1 => 1 si no 0 `s => suma(xi)>1` +- Con esta toma de decisión así no haya dinero deberias irte de viaje. +- Corrijamos el resultado. Agregemos una **importancia** o **peso** a x1. Sin dinero no vamos de viaje. +- `s => suma(x1*2, x2*1, x3*1) > 2` +- Esta función ya no es tan simple. A este tipo de funcones la podemos identificar como: [**perceptron**](https://youtu.be/CU24iC3grq8?t=451) +- Un **perceptrón** (**neurona**) consta de: + - **Factores o entradas** + - **Peso de cada entrada** + - **Función de activación** `s => suma(x1*2, x2*1, x3*1) > 2` + - **Umbral** (Realmente se usa el **sesgo**, que es la inverda del umbral) +- Si este perceptron recibe una entrada de n factores que a su vez son resultados de la toma de decisión de otros perceptrones +- Así se podria formar un [**perceptrón multicapa**](https://youtu.be/CU24iC3grq8?t=510) los perceptrones multicapa reciben el nombre +de [**red neuronal**](https://youtu.be/CU24iC3grq8?t=516) +- Con un solo **perceptrón** pudimos tomar una decisión interesante si contamos con una red de estos perceptrones podriamos tomar decisiones más complejas. +- [Red neuronal que debe entender una imagen](https://youtu.be/CU24iC3grq8?t=555) +- El **peso** y **umbral** son perillas ajustables permitiendo así optimizar la salida esperada +- Una red neuronal consta de millones de neuronas +- Los ajustes de estas perillas podrían desencadenar en una salida no esperada ya que al ser millones no es factible controlar todas estas I/O. +Por lo tanto, lo interesante sería que la neurona no tome la decisión como tal (1/0) si no que **sugiera** en que porcentaje entre **0 y 1** +es adecuada una salida. En lugar de una función [**escalón o step function**](https://youtu.be/_0wdproot34?t=283) se usa una sigmoide +- [De esta manera](https://youtu.be/CU24iC3grq8?t=674), al cambiar un (peso/umbral) la salida y su impacto en las otras neuronas esta mejor controlado + +### [Funciones de activación](https://www.youtube.com/watch?v=_0wdproot34&t=637s) +- `(entrada*peso + netrada*peso ...) comparado con el sesgo` +- Una red neuronal sin funcion de activación es muy limitada +- Algunas funciones: + - step function + - no es lineal pero no es apta para el aprendizaje que necesitamos +- En el proceso de entrenamiento tras varios intentos comprobamos los resultados y los procesamos con al [función de costo](https://youtu.be/_0wdproot34?t=326) +para ver que tan bien estuvo la red en las predicciones. +- Dependiendo que tan mal le fue habrá que ajustar los **pesos** y **sesgos**. Para hacer esto debemos +- `calcular la derivada gradiente de la función de costo respecto a cada uno de los pesos y sesgos` esto se hace capa por capa hacia atras llegando al inicio. +- Este proceso se llama [**propagación hacia atras**](https://youtu.be/_0wdproot34?t=341) +- Siguiendo esta premisa la función **step** no tiene derivada o siempre es 0 con lo cual no permitiria un ajuste. +- Esto nos obliga a que las funciones de activación sean **diferenciables** [Video derivadas](https://www.youtube.com/watch?v=njoOd9iV2Qo) +- Funciones **sigmoides** (porque tienen forma de S) + - [Función logistica](https://youtu.be/_0wdproot34?t=412) tambien se le conoce como función sigmoide a secas. + - Acotada en y entre 0 y 1 + - Esta función es diferenciable ya que tiene una curva. No es lo mismo la y de x1 que de x2. Hay una variación (dY) + - [su formula: 1/(1 + e^-x)](https://youtu.be/_0wdproot34?t=442) + - la y de esta función se mueve entre 0 y 1. Si una imagen es un perro o un gato. Esta función es perfecta. + - si le damos entradas muy grandes o muy pequeñas la derivada se hace muy pequeña esto implica que en la propagación hacia + atrás los ajustes de los pesos y sesgos en la red seran tambien minimos y esto hará que las capas iniciales dejen de aprender + - Esto se llama el [**desvanecimiento de la gradiente**](https://youtu.be/_0wdproot34?t=478) la derivada se vuelve muy pequeña conforme se avanza en la **propagación hacia atrás** + - es cara de calcular por que lleva exponente + - [Tangente Hiperbolica - TANH](https://youtu.be/_0wdproot34?t=554) + - Similar a la logistica. Acotada en y entre -1 y 1 + - [su formula: (e^x - e^-x)/(e^x + e^-X)](https://youtu.be/_0wdproot34?t=561) + - Esta derivada es mayor a la anterior. Buscamos que estas sean suficientemente grandes para que los ajustes en la red neuronal + sean sustanciales de modo que aprenda más rápido. + - Otro punto importante es que está centrada en el 0 + - La anterior (logistica) solo permite trabajar con + o - en cada capa. No deja mezclar. lo que limita la velocidad de aprendizaje + - La hiperbolica permite mezclar + y - + - tambien tiene el problema de **desvanecimiento del gradiente** + - es cara de calcular por que lleva exponentes + - [softsign](https://youtu.be/_0wdproot34?t=657) + - Tiene mejor gradiente pero su derivada es más compleja y comparte algunos inconvenientes + - [ReLU Rectified Linear Unit](https://youtu.be/_0wdproot34?t=672) + - [su fórmula: max(0, x)](https://youtu.be/_0wdproot34?t=713) + - si x<0 => 0 sino x + - Esta era mucho mejor que las anteriores en la mayoria de los casos + - La propagación hacia adelante y atras era hasta seis veces más rapida que la *tangente hiperbólica* + - Se usó para AlexNet en 2012 + - En 2018 fue la más usada + - Lo especial de ReLU ante las otras: + - La formula es muy simple + - [Su gráfica](https://youtu.be/_0wdproot34?t=726) nos permite ver que tiene un coste computacional muy bajo + - Su derivada también es muy simple. 0 para todos los x negativos y 1 para todos los positivos + - La derivada en 0 no existe. Pero es tan raro tener un 0 absoluto que se puede despreciar y usar 0 o 1 + - Relu no está acotada pra numeros positivos con lo cual da una gradiente constante y genera un aprendizaje más rápido + - Inconvenientes + - Como regresa 0 para todos los numeros negativos va a degenerar en las llamadas neuronas muertas que durante el entrenamiento + solo devolverán 0 entorpeciendo el aprendizaje. Esto sucede especialmente en tasas de aprendizajes muy grandes donde es más probable + que caigamos en números negativos pasando las neuronas a 0 y que ya no se puedan recuperar. + - [Leaky ReLU](https://youtu.be/_0wdproot34?t=819) + - **su fórmula: max(0.01x, x)** + - Similar a la anterior pero para x<0 f(x) tiende a -0.01 pero nunca lo es. + - No acotada, simple de calcular y evita las neuronas muertas pero como la derivada en números negativos es pequeña es propensa + al desvanecimiento del gradiente. + - [Parametric ReLu - Relu Parametrizable](https://youtu.be/_0wdproot34?t=844) + - **su fórmula: ax if x>0** a es el parámetrizable. Por ejemplo a=0.1 + - [Parametric GeLu](https://youtu.be/_0wdproot34?t=844) + - Caracterisctica muy importante. No es **monótona** (solo creciente o decreciente) Incrementan o decrementan constantemente y pasan + solo una vez por el 0. + - Una que no lo es puede crear montes y valles e incluso pasar dos veces o más por el 0 + - Esto posibilita que algunas funciones basadas en Gelu puedan hacer que las redes neuronales sean tan eficientes como las cerebrales + - Es utilizada por la función [BERT](https://cloud.google.com/ai-platform/training/docs/algorithms/bert-start?hl=es-419), [GPT](https://chat.openai.com/) + - [Softplus](https://youtu.be/_0wdproot34?t=896) + - **fórmula: ln(1 + e^x)** + - Una versión suave de ReLU + - Un dato interesante es que su derivada es la función logística + - Da mejores resultados que ReLU pero su costo computacional es mayor + - Aunque tiene mejores beneficios que ReLU en la práctica no son tangibles + - [Maxout](https://youtu.be/_0wdproot34?t=930) + ``` + f(x) = max(w_1^T x + b_1, w_2^T x + b_2) + + Donde x es la entrada a la neurona, w_1, w_2 son vectores de pesos y b_1, b_2 son sesgos. + La función Maxout toma el máximo entre dos funciones lineales de la entrada, donde cada función lineal es una transformación + lineal de la entrada original. + ``` + - Se pueden obtener mejores resultados pero su costo computacional es muy elevado + - [switsh](https://youtu.be/_0wdproot34?t=947) + ``` + f(x) = x * sigmoid(bx) + b: parámetro modifcable. Si b=1 (no se usa) se llama swish 1 + ``` + - En casi todas las tareas y pruebas es mejor que ReLU su costo computacional es más alto + - Gráfica suave, no es monotónica. + - [mish](https://youtu.be/_0wdproot34?t=992) + ``` + f(x) = x * tanh(softplus(x)) + ``` + - no es monotonica, mejora los resultados de ReLU y swish principalmente en vision computacional + - mantiene un poco de [información negativa](https://youtu.be/_0wdproot34?t=1012) evitando la muerte de neuronas + - su costo computacional es superior a ReLU + - [identidad](https://youtu.be/_0wdproot34?t=1038) + - es la básica cuando no se usa una función de activación + - por ejemplo transformacion de celcius a fahrenheit o calculo de precio de una casa + - [softmax](https://youtu.be/_0wdproot34?t=1055) + - se usa en aprendizaje automático desde hace 30 años + - la usamos para redes de clasificación. Es gato o perro. Es una cuchara, tenedor o cuchillo + - [como hace este cálculo](https://youtu.be/_0wdproot34?t=1089) + - la media de todas las salidas se devuelve en porcentaje este se calcula con el número e + +### Cuando usar cada función? +- ReLU es la que normalmente se utilizará. Si esto lleva a neuronas muertas. Se puede disminuir la tasa de aprendizaje o utilizar otras funciones. +- + +### Instalando tensorflow +- instalación de miniconda + - **Miniconda**: version light de Anaconda. Anaconda plataforma de ciencia de datos de codigo abierto. Con miniconda se pueden crar projectos + aislados por entornos. +- `curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -o Miniconda3-latest-MacOSX-x86_64.sh` +- `bash Miniconda3-latest-MacOSX-x86_64.sh` +``` +hay que configurar la variable de entorno PYTHONPATH +If you'd prefer that conda's base environment not be activated on startup, + set the auto_activate_base parameter to false: +conda config --set auto_activate_base false +``` +- `pip install tensorflow` +- Esto tarda como 20 minutos +``` +Installing collected packages: +tensorboard-plugin-wit, +pyasn1, +libclang, +flatbuffers, +wrapt, +urllib3, +typing-extensions, +termcolor, +tensorflow-io-gcs-filesystem, +tensorflow-estimator, +tensorboard-data-server, +six, +rsa, +pyasn1-modules, +protobuf, +packaging, +oauthlib, +numpy, +MarkupSafe, +markdown, +keras, +idna, +grpcio, +gast, +charset-normalizer, +certifi, +cachetools, +absl-py, +werkzeug, +scipy, +requests, +opt-einsum, +ml-dtypes, +h5py, +google-pasta, +google-auth, +astunparse, +requests-oauthlib, +jax, +google-auth-oauthlib, +tensorboard, +tensorflow + +Successfully installed + MarkupSafe-2.1.2 + absl-py-1.4.0 + astunparse-1.6.3 + cachetools-5.3.0 + certifi-2022.12.7 + charset-normalizer-3.1.0 + flatbuffers-23.3.3 + gast-0.4.0 + google-auth-2.17.1 + google-auth-oauthlib-0.4.6 + google-pasta-0.2.0 + grpcio-1.53.0 + h5py-3.8.0 + idna-3.4 + jax-0.4.8 + keras-2.12.0 + libclang-16.0.0 + markdown-3.4.3 + ml-dtypes-0.0.4 + numpy-1.23.5 + oauthlib-3.2.2 + opt-einsum-3.3.0 + packaging-23.0 + protobuf-4.22.1 + pyasn1-0.4.8 + pyasn1-modules-0.2.8 + requests-2.28.2 + requests-oauthlib-1.3.1 + rsa-4.9 + scipy-1.10.1 + six-1.16.0 + tensorboard-2.12.0 + tensorboard-data-server-0.7.0 + tensorboard-plugin-wit-1.8.1 + tensorflow-2.12.0 + tensorflow-estimator-2.12.0 + tensorflow-io-gcs-filesystem-0.32.0 + termcolor-2.2.0 + typing-extensions-4.5.0 + urllib3-1.26.15 + werkzeug-2.2.3 + wrapt-1.14.1 +``` diff --git a/theframework/README.md b/theframework/README.md new file mode 100644 index 00000000..3c4bf77c --- /dev/null +++ b/theframework/README.md @@ -0,0 +1,6 @@ +# Theframework.es + +- functions +- components +- helpers +- dsources: Data sources \ No newline at end of file diff --git a/theframework/components/component_debug.py b/theframework/components/component_debug.py new file mode 100644 index 00000000..3876a62d --- /dev/null +++ b/theframework/components/component_debug.py @@ -0,0 +1,44 @@ +import io +import re +from pprint import pprint + +""" + + +Prueba de componente estatico para debug +""" +class ComponentDebug(): + + _isSqlOn = False + _isMessageOn = False + _isPythonInfoOn = False + _isIncludeOn = False + + _arMessages = [] + _arSqls = [] + _arIncluded = [] + + def __init__(self): + pass + + @classmethod + def config(cls,isSqlOn=False,isMessageOn=False,isPythonInfoOn=False,isIncludeOn=False): + cls._isSqlOn = isIncludeOn + cls._isMessageOn = isIncludeOn + cls._isPythonInfoOn = isPythonInfoOn + cls._isIncludeOn = isIncludeOn + cls.debug(dir(cls)) + + + @classmethod + def set_sql(cls,sSQL,iCount=0,fTime=""): + if cls._isSqlOn: + cls._arSqls.append({"sql":sSQL,"count":iCount,"time":fTime}) + + + @classmethod + def debug(cls,mxVar): + pprint(mxVar) + +if __name__ == "__main__": + ComponentDebug.config(True,True,True,False) \ No newline at end of file diff --git a/theframework/components/component_log.py b/theframework/components/component_log.py new file mode 100644 index 00000000..66e8d95e --- /dev/null +++ b/theframework/components/component_log.py @@ -0,0 +1,93 @@ +import os +from pprint import pprint +from datetime import datetime + +class ComponentLog(): + """ + theframework/components/component_log.py + """ + DS = os.sep + DIR = os.getcwd() + + strnow = datetime.now().strftime("%Y%m%d") + pathfolder = "" + strsubtype = "" + strfilename = "" + + path_ofthis = os.path.realpath(__file__) + path_thisdir = os.path.dirname(path_ofthis) + path_json = os.path.join(path_thisdir,"dsources.json") + data = {} + + def __init__(self, strsubtype = "", pathfolder = ""): + self.pathfolder = pathfolder + self.strsubtype = strsubtype + self.strfilename = "app_"+self.strnow+".log" + + if not pathfolder: + self.pathfolder = self.DIR + + if not strsubtype: + self.strsubtype = "debug" + + self.__fix_folder() + + + def __fix_folder(self): + pathlogfolder = os.path.join(self.pathfolder,self.strsubtype) + if not os.path.isdir(pathlogfolder): + os.mkdir(pathlogfolder) + + + def __get_now(self): + strnow = (datetime.now()).strftime("%Y%m%d-%H%M%S") + # strnow = datetime.datetime.strptime(data[4]+data[5],"%H:%M:%S") + return strnow + + def __dump(self,obj): + strobj = "" + for attr in dir(obj): + strobj += "obj.%s = %r\n" % (attr, getattr(obj, attr)) + return strobj + + #for name, val in vars(obj): + #print ' .%s: %r' % (name, val) + + def __dump1(self,obj): + # https://stackoverflow.com/questions/192109/is-there-a-built-in-function-to-print-all-the-current-properties-and-values-of-a + return repr(obj)+"\n" + + def save(self, mxvar, strtitle=""): + pathfile = os.path.join( + self.pathfolder, + self.strsubtype, + self.strfilename) + strnow = self.__get_now() + #pprint( type(mxvar)) + #print(dir(mxvar)) + ##pprint(mxvar.__type__) + + strcontent = "-- [{}]\n".format(strnow) + if strtitle: + strcontent += strtitle+":\n" + + if isinstance(mxvar,str): + strcontent += mxvar+"\n\n" + elif type(mxvar) in (int, float, bool, None): + strcontent += str(mxvar)+"\n\n" + else: + from inspect import getmembers + #strcontent += str(getmembers(mxvar)).replace("), (","),\n(")+"\n\n" + strcontent += self.__dump1(mxvar) +# +# if str(type(mxvar)) == "": +# strcontent += type(mxvar)+"->"+str(vars(mxvar))+"\n\n" + + f = open(pathfile,"a") + f.write(strcontent) + f.close() + + +if __name__ == "__main__": + o = ComponentLog() + o.save("hello world","Example") \ No newline at end of file diff --git a/theframework/components/db/__init__.py b/theframework/components/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/theframework/components/db/component_crud.py b/theframework/components/db/component_crud.py new file mode 100644 index 00000000..1ca43b9d --- /dev/null +++ b/theframework/components/db/component_crud.py @@ -0,0 +1,158 @@ +import sys; sys.path.append("..") +from pprint import pprint + +class ComponentCrud(): + + def __init__(self,objdb=None): + self.strtable = "" + self.strsqlcomment = "" + self.strsql = "" + self.lstends = [] + self.lstjoins = [] + self.lstresults = [] + self.dicinsertfvs = {} + self.lstupdatefvs = [] + self.lstpksfvs = [] + self.lstgetfields = [] + self.lstorderbys = [] + self.lstnumerics = [] + self.lstands = [] + self.ojbdb = objdb + + + def __get_orderby(self): + strorderby = "" + if self.lstorderbys: + lstsql = [] + strorderby = " ORDER BY " + for dic in self.lstorderbys: + for f in dic.keys(): + #field AscDesc + lstsql.append("{} {}".format(f,dic[f])) + + strorderby = strorderby+(", ".join(lstsql)) + + return strorderby + + def __get_imploded(self,lststrings): + return " "+"\n".join(lststrings) + + def __get_joins(self): + strreturn = self._get_imploded(self.lstjoins) + return strreturn + + def __get_end(self): + strreturn = self._get_imploded(self.lstends) + return strreturn + + def __is_numeric(self,strfieldname): + return strfieldname in self.lstnumerics + + def add_orderby(self,strfield,strascdesc=""): + if strfield: + self.lstorderbys.append({strfield:strascdesc}) + + def autoinsert(self,strtable=None, dicfieldvals=[]): + # limpio la consulta + self.strsql = "-- autoinsert" + + strsqlcomment = "" + if self.strsqlcomment: + strsqlcomment = "/*{}*/".format(self.strsqlcomment) + + if not strtable: + strtable = self.strtable + + # pprint(self.dicinsertfvs) + if strtable: + if not dicfieldvals: + dicfieldvals = self.dicinsertfvs + + if dicfieldvals: + lstinsert = [] + lstinsert.append(strsqlcomment + "INSERT INTO") + lstinsert.append(strtable) + lstinsert.append("( "+",".join(dicfieldvals.keys())+")") + lstinsert.append("VALUES") + lstinsert.append("(") + + lstvals = [] + for f in dicfieldvals.keys(): + value = dicfieldvals[f] + if value == None: + lstvals.append("NULL") + else: + lstvals.append("'{}'".format(value)) + + lstinsert.append(",".join(lstvals)) + lstinsert.append(")") + self.strsql = " ".join(lstinsert) + pprint(self.strsql) + # si se han proporcionado correctamente los datos campo=>valor + # se ha proporcionado una tabla + # autoinsert + + def get_sql(self): + return self.strsql + + def add_insert(self,strfieldname,mxfieldvalue): + if strfieldname: + self.dicinsertfvs[strfieldname] = mxfieldvalue + + def get_result(self): + return self.lstresults + + def is_distinct(self,ison=True): + self.isdistinct = ison + + def add_numeric(sfieldname): + self.lstnumeric.append(sfieldname) + + def add_and(sand): + self.lstands.append(sand) + + def add_and1(sfieldname,svalue,soper="="): + self.lstands.append("sfieldname soper svalue") + + def add_join(sjoin,skey=None): + if skey: + self.lstjoins[skey] = sjoin + else: + self.lstjoins.append(sjoin) + + def add_end(send,skey=None): + if skey: + self.lstend[skey]=send + else: + self.lstend.append(send) + + def add_error(smessage): + self.iserror = True + self.lsterrors.append(smessage) + + def is_error(self): + return self.iserror + + def get_errors(injson=0): + if injson: + return json_encode(self.lsterrors) + return self.lsterrors + + def get_error(i=0): + self.lsterrors[i] = None if self.lsterrors[i] else None + + + def set_table(self,strtable): + self.strtable = strtable + + def set_dbobj(odb=None): + self.odb=odb + + def test(self): + return self.__get_orderby() + +#class ComponentCrud + +if __name__ == "__main__": + o = ComponentCrud() + pprint(o.test()) diff --git a/theframework/components/db/component_mysql.py b/theframework/components/db/component_mysql.py new file mode 100644 index 00000000..3543099f --- /dev/null +++ b/theframework/components/db/component_mysql.py @@ -0,0 +1,154 @@ +""" + * @author Eduardo Acevedo Farje. + * @link www.eduardoaf.com + * @name theframework.components.db.ComponentMysql + * @file component_mysql.py 1.0.0 + * @date 18-04-2018 17:50 SPAIN + * @observations + pip install mysql-connector-python + """ +import sys; sys.path.append("..") +from pprint import pprint +# https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html +# import datetime +import mysql.connector +from dsources.dsrc import dsrc + +class ComponentMysql: + """ + theframework.components.db.ComponentMysql 1.0.0 + Conecta a una bd usando dsrc (datasources) + """ + # data source, son los datos de: theframework\dsources\dsources.json + __dicdsrc = {} + __objcnx = None + __is_connected = False + __iaffected = 0 + + __errors = {} + __is_error = False + __sqlread = "" + __sqlwrite = "" + + def __init__(self,idsrc=None): + if idsrc: + self.__dicdsrc = dsrc.get_context(idsrc) + self.__connect() + + def __connect(self): + if self.__dicdsrc: + try: + self.__objcnx = mysql.connector.connect( + user = self.__dicdsrc["user"], + password = self.__dicdsrc["password"], + host = self.__dicdsrc["host"], + database = self.__dicdsrc["database"], + ) + self.__is_connected = self.__objcnx.is_connected() + except e: + self.__is_connected = False + self.__add_error("__connect.exception",str(e)) + + def query(self,strsql): + """ + sql reader + """ + if not isinstance(strsql,str): + self.__add_error("query.strsql.instance","strsql not a string") + return [] + + if not strsql: + self.__add_error("query.strsql.empty","strsql is empty") + return [] + + if not self.__is_connected: + self.__connect() + if not self.__is_connected: + self.__add_error("query.try-connect","unable to connect") + return [] + + strquery = strsql + self.__sqlread = strquery + # lista de diccionarios + lstrows = [] + try: + objcursor = self.__objcnx.cursor(dictionary=True) + objcursor.execute(strquery) + lstrows = objcursor.fetchall() + #pprint(lstrows) + + except e: + lstrows = [] + self.__add_error("query.exception.sql",strquery) + self.__add_error("query.exception",str(e)) + + finally: + self.__iaffected = len(lstrows) + return lstrows + # def query + + def execute(self,strsql): + """ + sql writer + """ + if not isinstance(strsql,str): + self.__add_error("execute.strsql.instance","strsql not a string") + return [] + + if not strsql: + self.__add_error("execute.strsql.empty","strsql is empty") + return [] + + if not self.__is_connected: + self.__connect() + if not self.__is_connected: + self.__add_error("execute.try-connect","unable to connect") + return [] + + strquery = strsql + self.__sqlwrite = strquery + + iresult = 0 + try: + objcursor = self.__objcnx.cursor() + objcursor.execute(strquery) + self.__objcnx.commit() + iresult = objcursor.rowcount + + except e: + iresult = -1 + self.__add_error("exceute.exception.sql",strquery) + self.__add_error("execute.exception",str(e)) + + finally: + self.__iaffected = iresult + return iresult + + def __add_error(self,key,strmsg): + self.__is_error = True + self.__errors[key] = strmsg + + def get_last_query(self): + return {"read":self.__sqlread,"write":self.__sqlwrite} + + def get_affected(self): + return self.__iaffected + + def is_connected(self): + return self.__is_connected + + def is_error(self): + return self.__is_error + + def get_errors(self): + return self.__errors + + def show_errors(self): + print(__name__," errors:") + pprint(self.__errors) + +#class ComponentMysq + +if __name__ == "__main__": + o = ComponentMysql() + pprint(o.is_connected()) \ No newline at end of file diff --git a/theframework/dsources/__init__.py b/theframework/dsources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/theframework/dsources/dsources.json b/theframework/dsources/dsources.json new file mode 100644 index 00000000..77b5aa48 --- /dev/null +++ b/theframework/dsources/dsources.json @@ -0,0 +1,50 @@ +[ + { + "id":"mysql-1", + "alias":"db-bi", + "description":"Base de datos de pruebas para informes", + "engine":"mysql", + "host":"localhost", + "database":"db_bi", + "user":"root", + "password":"", + "port":"3306", + "is_hashed":false + }, + { + "id":"mysql-2", + "alias":"db-kilme", + "description":"Base de datos de pruebas de prestashop", + "engine":"mysql", + "host":"localhost", + "database":"db_killme", + "user":"root", + "password":"", + "port":"3306", + "is_hashed":false + }, + { + "id":"mssql-1", + "alias":"db-tehframework-dev", + "description":"Base de datos de pruebas de Theframwork en SQLServer", + "engine":"mmsql", + "host":"localhost", + "database":"db_theframework", + "user":"sa", + "password":"1234", + "port":"1433", + "is_hashed":false + }, + { + "id":"mongo-1", + "alias":"mongo-test", + "description":"Base de datos de pruebas mongo, prueba de concepto", + "engine":"mongo", + "host":"127.0.01", + "database":"db_test", + "user":"", + "password":"", + "port":"27018", + "is_hashed":false + } +] \ No newline at end of file diff --git a/theframework/dsources/dsrc.py b/theframework/dsources/dsrc.py new file mode 100644 index 00000000..bb705848 --- /dev/null +++ b/theframework/dsources/dsrc.py @@ -0,0 +1,61 @@ +from pprint import pprint +import json +import os + +class dsrc(): + """ + /theframework/dsources/dsources.py 1.0.0 + recupera la configuracion de dsources/dsources.json + """ + path_ofthis = os.path.realpath(__file__) + path_thisdir = os.path.dirname(path_ofthis) + path_json = os.path.join(path_thisdir,"dsources.json") + data = {} + + @staticmethod + def load_config(): + if not dsrc.data: + with open(dsrc.path_json,"r") as f: + # lista de diccionarios + o_list = json.load(f) + + o_dict = {} + for i in range(len(o_list)): + id = o_list[i]["id"] + o_dict[id] = o_list[i] + + #pprint(o_dict) + # from inspect import getmembers + #from pprint import pprint + # pprint(getmembers(o_list)) + + # print(type(o_list),dir(o_list)) + # pprint(distros_dict) + + # y = json.dumps(distros_dict) + # print(dir(y)) + # pprint(y) + dsrc.data = o_dict + + @staticmethod + def get_config(): + dsrc.load_config() + return dsrc.data + + @staticmethod + def get_context(id): + dsrc.load_config() + o_dic = dsrc.data + if id in o_dic: + return o_dic[id] + return {} + + @staticmethod + def get_value(id,val): + dsrc.load_config() + o_dic = dsrc.data + if id in o_dic: + if val in o_dic[id]: + return o_dic[id][val] + return {} + \ No newline at end of file diff --git a/theframework/functions/functions_debug.py b/theframework/functions/functions_debug.py index d14fd23b..2d29bb0f 100644 --- a/theframework/functions/functions_debug.py +++ b/theframework/functions/functions_debug.py @@ -29,4 +29,210 @@ def lg(var,sTitle=None,sType="custom"): sTitle = "\n"+sNow+": "+sTitle print(sTitle) - pprint(var) \ No newline at end of file + pprint(var) + + +def bugp(): + sTagPre = "
    \n";
    +    sTagFinPre = "
    \n"; + print(sTagPre) + print("") + pprint(request.POST) + print(sTagFinPre) + + +""" +function bug($var, $sVarName="var", $isDie=false) +{ + if(IS_DEBUG_ALLOWED || + (isset($_SESSION["tfw_user_identificator"]) && ($_SESSION["tfw_user_identificator"]==-10 || $_SESSION["tfw_user_identificator"]==1))) + { + if(is_string($var)) + { + $isSQL = false; + $arSQLWords = array("select","from","inner join","insert into","update","delete"); + $sTmpVar = strtolower($var); + foreach($arSQLWords as $sWord) + //var_dump("word:$sWord, string:$sTmpVar",strpos($sWord,$sTmpVar)); + if(strpos($sTmpVar,$sWord)!==false){$isSQL=true; break;} + //var_dump($isSQL); + if($isSQL) + { + if(!strpos($var,"\nFROM")); + $var = str_replace("FROM","\nFROM",$var); + if(!strpos($var,"\nINNER")); + $var = str_replace("INNER","\nINNER",$var); + if(!strpos($var,"\nLEFT")); + $var = str_replace("LEFT","\nLEFT",$var); + if(!strpos($var,"\nRIGHT")); + $var = str_replace("RIGHT","\nRIGHT",$var); + if(!strpos($var,"\nWHERE")); + $var = str_replace("WHERE","\nWHERE",$var); + if(!strpos($var,"\nAND")); + $var = str_replace("AND","\nAND",$var); + if(!strpos($var,"\nORDER BY")); + $var = str_replace("ORDER BY","\nORDER BY",$var); + } + } + $sTagPre = "
    \n";
    +        $sTagFinPre = "
    \n"; + $nombreVariable = $sTagPre ."VARIABLE $sVarName:"; + $nombreVariable .= $sTagFinPre; + echo $nombreVariable; + echo "
    \n";
    +        var_dump($var);
    +        echo  "
    "; + if($isDie)die; + } +}//bug() +function bugpf($sKey) +{ + if($sKey=="") + { + $arPG = array(); + $arPG["FILES"] = $_FILES; + bug($arPG,"FILES"); + } + else + bug($_FILES[$sKey],"\$_FILES[$sKey]"); +}//bugpf +function bugfileipath($sFilePath,$isDie=false) +{ + //if(is_firstchar($sFilePath,"/")||is_firstchar($sFilePath,"\\")) + //remove_firstchar($sFilePath); + //$sFilePath = DIRECTORY_SEPARATOR.$sFilePath; + + $arPaths = explode(PATH_SEPARATOR,get_include_path()); + foreach($arPaths as $sDirPath) + { + $sTmpPath = $sDirPath.$sFilePath; + //echo $sTmpPath."
    "; + if(file_exists($sTmpPath)) + { + bug(TRUE,$sTmpPath,$isDie); + return; + } + } + bug(FALSE,$sFilePath,$isDie); +}//bugfileipath +function bugfile($sFilePath,$sVarName="", $isDie=false) +{ + if(!$sVarName) $sVarName = $sFilePath; + bug(is_file($sFilePath),$sVarName,$isDie); +}//bugfile +function bugdir($sDirPath,$sVarName="var", $isDie=false) +{ + bug(is_dir($sDirPath),$sVarName,$isDie); +}//bugdir +function bugpg($sTitle="") +{ + $arPG = array(); + $arPG["POST"] = $_POST; + $arPG["GET"] = $_GET; + $arPG["FILES"] = $_FILES; + bug($arPG,"$sTitle POST | GET | FILES"); +} +function bugp($sKey="") +{ + if($sKey=="") + { + $arPG = array(); + $arPG["POST"] = $_POST; + bug($arPG,"POST"); + } + else + bug($_POST[$sKey],"POST[$sKey]"); +} +function bugg($sKey="") +{ + if($sKey=="") + { + $arPG = array(); + $arPG["GET"] = $_GET; + bug($arPG,"GET"); + } + else + bug($_GET[$sKey],"GET[$sKey]"); +} +function bugss($sKey="") +{ + if($sKey=="") + { + $arPG = array(); + $arPG["session_id()"] = session_id(); + $arPG["SESSION"] = $_SESSION; + bug($arPG,"SESSION"); + } + else + bug($_SESSION[$sKey],"SESSION[$sKey]"); +} +function bugif($sTitle=""){bug(get_included_files(),"$sTitle included_files");} +function bugversion(){phpversion();} +function bugsysinfo() +{ + $sSysInfo = "DS: ".DIRECTORY_SEPARATOR." \n"; + $sSysInfo .= "LIB EXTENSION: ".PHP_SHLIB_SUFFIX." \n"; + $sSysInfo .= "PATH SEPARATOR: ".PATH_SEPARATOR." \n"; + $sSysInfo .= "SERVER OS: ".php_uname("s")." \n"; + //echo // \ + //echo "- LSUFIX: ".PHP_SHLIB_SUFFIX; // dll + //echo "- PATH SEP: ".PATH_SEPARATOR; // ; + // 's': Operating system name. eg. FreeBSD. + //'n': Host name. eg. localhost.example.com. + //echo php_uname(); + //echo PHP_OS; + bug($sSysInfo); +} +/** + * Bug cookies + */ +function bugck(){bug($_COOKIE,"cookie");} +function bugipath($sTitle=""){ bug(explode(PATH_SEPARATOR,get_include_path().$sTitle),"included path:");} +function bugcond($var,$isCheckCondition) +{ + //var_dump($isCheckCondition); + if($isCheckCondition) + bug($var); + else + pr("isCheckCondition = FALSE"); +} +function bugraw($var,$sVarName=NULL) +{ + $sReturn = "\n"; + if($sVarName) + $sReturn .= "$sVarName: \n"; + $sReturn .= var_export($var,1); + echo $sReturn; +} +function bugf($sKey="") +{ + if($sKey=="") + { + $arPG = array(); + $arPG["FILES"] = $_FILES; + bug($arPG,"FILES"); + } + else + bug($_FILES[$sKey],"FILES[$sKey]"); +} +function bugex(Exception $oEx,$sTitle="exception") +{ + bug("code:{$oEx->getCode()},line:{$oEx->getLine()},file:{$oEx->getFile()},previous:{$oEx->getPrevious()}",$sTitle); +} +function bugconst() +{ + $arConsts = [ + "__CLASS__"=>__CLASS__, + "__DIR__"=>__DIR__, + "__FILE__"=>__FILE__, + "__FUNCTION__"=>__FUNCTION__, + "__LINE__"=>__LINE__, + "__METHOD__"=>__METHOD__, + "__METHOD__"=>__METHOD__, + "__NAMESPACE__"=>__NAMESPACE__, + "__TRAIT__"=>__TRAIT__, + ]; + bug($arConsts,"CONSTANTS"); +} + +""" \ No newline at end of file diff --git a/theframework/setup.py b/theframework/setup.py new file mode 100644 index 00000000..e10d8dfd --- /dev/null +++ b/theframework/setup.py @@ -0,0 +1,41 @@ +""" +Paquete distribuible 0.0.1 +tutorial: + Pildoras informaticas + Paquetes distribuibles. Vídeo 36 + https://youtu.be/Zf9sN-w0BVE +""" + +from setuptools import setup + +setup( + name = "theframework", + version = "1.0", + description = "Paquete de redondeo y potencia", + author = "Eduardoa A. F.", + author_email = "eacevedof@gmail.com", + url = "theframework.es", + license = "MIT", + packages = [ + "components","dsources","functions","helpers" + ] +) + +""" +Despues de configurar setup (..) hay que ejecutar la consola y posicionarse en la carpeta raiz + +Ejecutar comando: + python setup.py sdist + +Esto crea: + una carpeta dist + nos encontraremos con un fichero *.tar.gz + una carpeta theframework.egg-info + Tiene información sobre dependencias y licencias + +Con el tar.gz existente podemos ejecutar + pip install \theframework-1.0.tar.gz + +Para desinstalar: + pip uninstall theframework +""" \ No newline at end of file diff --git a/theframework/tests/__init__.py b/theframework/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/theframework/tests/test_component_crud.py b/theframework/tests/test_component_crud.py new file mode 100644 index 00000000..2ba409c6 --- /dev/null +++ b/theframework/tests/test_component_crud.py @@ -0,0 +1,35 @@ +""" +@file: test_component_crud 1.0.0 +""" +import sys; sys.path.append("..") + +import unittest +from pprint import pprint + +from components.db.component_crud import ComponentCrud as Crud + +class TestComponentCrud(unittest.TestCase): + + def tes_is_instance(self): + o = Crud() + assert isinstance(o,Crud) + # self.assertEqual(o.is_connected(),True) + #self.fail("TODO: Write test") + + def test_orderby(self): + o = Crud() + o.set_table("v") + o.add_orderby("v","asc") + o.add_insert("s","some string") + o.add_insert("i",123) + o.add_insert("f",88.39) + o.autoinsert() + mxvar = o.test() + pprint(mxvar) + assert("ORDER BY" in mxvar) + +#class TestComponentCrud + +if __name__ == "__main__": + unittest.main() + diff --git a/theframework/tests/test_component_log.py b/theframework/tests/test_component_log.py new file mode 100644 index 00000000..4a1471fe --- /dev/null +++ b/theframework/tests/test_component_log.py @@ -0,0 +1,38 @@ +""" +@file: test_component_mysql 1.0.0 +""" +import sys; sys.path.append("..") + +import unittest +from pprint import pprint + +from components.component_log import ComponentLog as Log + +class TestComponentLog(unittest.TestCase): + + def tes_is_instance(self): + o = Log() + assert isinstance(o,Log) + # self.assertEqual(o.is_connected(),True) + #self.fail("TODO: Write test") + + def tes_save(self): + o = Log() + o.save("texto de 11111") + o.save("texto de prueba2 con titulo","Linea 2") + + def test_type(self): + o = Log() + o1 = Log() + o.save(o1,"object 1") + o.save(12354,"entero") + o.save(2.34,"flotante") + o.save((2,4,5,8),"tupla") + o.save(["a","b","c"],"list") + o.save({"1":1,"2":"dos"},"dict") + +#class TestComponentLog + +if __name__ == "__main__": + unittest.main() + diff --git a/theframework/tests/test_component_mysql.py b/theframework/tests/test_component_mysql.py new file mode 100644 index 00000000..e28c5126 --- /dev/null +++ b/theframework/tests/test_component_mysql.py @@ -0,0 +1,78 @@ +""" +@file: test_component_mysql 1.0.0 +""" +import sys; sys.path.append("..") + +import unittest +from pprint import pprint + +from dsources.dsrc import dsrc +from components.db.component_mysql import ComponentMysql + +class TestComponentMysql(unittest.TestCase): + __o = ComponentMysql("mysql-1") + + def get_rows(self): + strsql = "SELECT * FROM operation LIMIT 3" + lstrows = self.__o.query(strsql) + return lstrows + + def insert(self): + strsql = "INSERT INTO v(i,s,f) VALUES (1,'some string',1.2)" + ir = self.__o.execute(strsql) + return ir + + def update(self): + strsql = "UPDATE v SET i=88,s='updated str', f=9.89 WHERE id>3" + ir = self.__o.execute(strsql) + return ir + + def delete(self): + strsql = "DELETE FROM v WHERE id>15" + ir = self.__o.execute(strsql) + return ir + + def tes_is_connected(self): + o = ComponentMysql("mysql-1") + # assert isinstance(mxvar,dict) + self.assertEqual(o.is_connected(),True) + #self.fail("TODO: Write test") + + def tes_is_connected_error(self): + o = ComponentMysql("mysql-x") + # assert isinstance(mxvar,dict) + self.assertEqual(o.is_connected(),False) + # self.fail("connection error") + + def tes_get_rows(self): + mxvar = self.get_rows() + #o.show_errors() + pprint(mxvar) + assert isinstance(mxvar,list) + + def test_update(self): + mxvar = self.update() + self.__o.show_errors() + pprint(mxvar) + assert isinstance(mxvar,int) + + def test_insert(self): + mxvar = self.insert() + self.__o.show_errors() + pprint(mxvar) + assert isinstance(mxvar,int) + + def tes_lastquery(self): + self.update() + self.insert() + self.delete() + mxvar = self.__o.get_last_query() + pprint(mxvar) + assert "read" in mxvar + assert "write" in mxvar + assert isinstance(mxvar,dict) +#class TestComponentMysql + +if __name__ == "__main__": + unittest.main() + diff --git a/theframework/tests/test_dsrc.py b/theframework/tests/test_dsrc.py new file mode 100644 index 00000000..9dbb825a --- /dev/null +++ b/theframework/tests/test_dsrc.py @@ -0,0 +1,34 @@ +""" +@file: test_dsrc 1.0.0 +sobre los test: https://realpython.com/python-testing/#unit-tests-vs-integration-tests +sobre el import: https://stackoverflow.com/questions/30669474/beyond-top-level-package-error-in-relative-import +""" +import sys; sys.path.append("..") + +import unittest +from pprint import pprint + +from dsources.dsrc import dsrc + +class TestDsrc(unittest.TestCase): + + def test_get_config(self): + mx_var = dsrc.get_config() + pprint(mx_var) + assert isinstance(mx_var,dict) + #self.assertEqual(x, y, "Msg"); + #self.fail("TODO: Write test") + + def test_get_context(self): + mx_var = dsrc.get_context("mysql-1") + pprint(mx_var) + assert isinstance(mx_var,dict) + + def test_get_value(self): + mx_var = dsrc.get_value("mysql-1","description") + pprint(mx_var) + assert isinstance(mx_var,str) + +if __name__ == "__main__": + unittest.main() + diff --git a/theframework/theframework.egg-info/PKG-INFO b/theframework/theframework.egg-info/PKG-INFO new file mode 100644 index 00000000..06b8f5b5 --- /dev/null +++ b/theframework/theframework.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: theframework +Version: 1.0 +Summary: Paquete de redondeo y potencia +Home-page: theframework.es +Author: Eduardoa A. F. +Author-email: eacevedof@gmail.com +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/theframework/theframework.egg-info/SOURCES.txt b/theframework/theframework.egg-info/SOURCES.txt new file mode 100644 index 00000000..aa4b8a03 --- /dev/null +++ b/theframework/theframework.egg-info/SOURCES.txt @@ -0,0 +1,14 @@ +setup.py +components/__init__.py +components/component_debug.py +components/component_log.py +dsources/__init__.py +dsources/dsrc.py +functions/__init__.py +functions/functions_boot.py +functions/functions_debug.py +helpers/__init__.py +theframework.egg-info/PKG-INFO +theframework.egg-info/SOURCES.txt +theframework.egg-info/dependency_links.txt +theframework.egg-info/top_level.txt \ No newline at end of file diff --git a/theframework/theframework.egg-info/dependency_links.txt b/theframework/theframework.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/theframework/theframework.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/theframework/theframework.egg-info/top_level.txt b/theframework/theframework.egg-info/top_level.txt new file mode 100644 index 00000000..e89fd188 --- /dev/null +++ b/theframework/theframework.egg-info/top_level.txt @@ -0,0 +1,4 @@ +components +dsources +functions +helpers diff --git a/wa-chtgpt/.gitignore b/wa-chtgpt/.gitignore new file mode 100644 index 00000000..7a587a17 --- /dev/null +++ b/wa-chtgpt/.gitignore @@ -0,0 +1,4 @@ +__pycache__ +venv +.idea +wa-chatgpt/config/config.py \ No newline at end of file diff --git a/wa-chtgpt/makefile b/wa-chtgpt/makefile new file mode 100644 index 00000000..7596a664 --- /dev/null +++ b/wa-chtgpt/makefile @@ -0,0 +1,13 @@ +#!/bin/bash +TODAY := $(shell date +'%Y-%m-%d') +NOW := $(shell date +'%Y-%m-%d %H:%M:%S') + +help: ## Show this help message + @echo "usage: make [target]" + @echo + @echo "targets:" + @egrep "^(.+)\:\ ##\ (.+)" ${MAKEFILE_LIST} | column -t -c 2 -s ":#" + +gitpush: ## git push m=any message + clear; + git add .; git commit -m "$(m)"; git push; diff --git a/wa-chtgpt/readme.md b/wa-chtgpt/readme.md new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/requirements.txt b/wa-chtgpt/requirements.txt new file mode 100644 index 00000000..3cfc7073 --- /dev/null +++ b/wa-chtgpt/requirements.txt @@ -0,0 +1 @@ +requests==2.32.0 \ No newline at end of file diff --git a/wa-chtgpt/wa-chatgpt/__init__.py b/wa-chtgpt/wa-chatgpt/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/app_versions/__init__.py b/wa-chtgpt/wa-chatgpt/app_versions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/app_versions/application/__init__.py b/wa-chtgpt/wa-chatgpt/app_versions/application/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/app_versions/application/services/__init__.py b/wa-chtgpt/wa-chatgpt/app_versions/application/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/app_versions/domain/__init__.py b/wa-chtgpt/wa-chatgpt/app_versions/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/app_versions/infrastructure/__init__.py b/wa-chtgpt/wa-chatgpt/app_versions/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/config/__init__.py b/wa-chtgpt/wa-chatgpt/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/config/config.example.py b/wa-chtgpt/wa-chatgpt/config/config.example.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/main.py b/wa-chtgpt/wa-chatgpt/main.py new file mode 100644 index 00000000..67db6a14 --- /dev/null +++ b/wa-chtgpt/wa-chatgpt/main.py @@ -0,0 +1,4 @@ +""" + +""" +import sys; sys.path.append("..") diff --git a/wa-chtgpt/wa-chatgpt/shared/__init__.py b/wa-chtgpt/wa-chatgpt/shared/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/domain/__init__.py b/wa-chtgpt/wa-chatgpt/shared/domain/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/__init__.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/dashboard.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/dashboard.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/__init__.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/requests/__init__.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/requests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/requests/get_request.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/requests/get_request.py new file mode 100644 index 00000000..34f421da --- /dev/null +++ b/wa-chtgpt/wa-chatgpt/shared/infrastructure/http/requests/get_request.py @@ -0,0 +1,14 @@ +import requests +import json + + +def http_get(url: str) -> dict: + response = requests.get(url) + return __get_text_as_dict(response.text) + + +def __get_text_as_dict(text: str) -> dict: + try: + return json.loads(text) + except Exception as e: + return {"error": str(e)} diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/shell/__init__.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/shell/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/shell/shell_exec.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/shell/shell_exec.py new file mode 100644 index 00000000..87d1c452 --- /dev/null +++ b/wa-chtgpt/wa-chatgpt/shared/infrastructure/shell/shell_exec.py @@ -0,0 +1,71 @@ +import subprocess + + +class ShellExecException(Exception): + @staticmethod + def fail_if_empty_commands(): + raise ShellExecException("No commands to execute") + + +class ShellExec: + def __init__(self): + self.commands = [] + self.one_line_command = "" + self.output = [] + self.result_code = 0 # ok + + @classmethod + def get_instance(cls): + return cls() + + def add_command(self, command): + self.commands.append(command) + return self + + def exec(self): + self._load_one_line_command() + if not self.one_line_command: + ShellExecException.fail_if_empty_commands() + + try: + process = subprocess.run( + self.one_line_command, + shell=True, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True + ) + self.output = process.stdout.splitlines() + except subprocess.CalledProcessError as ex: + self.result_code = 1 + self.output = ex.stderr.splitlines() + return self + + def _load_one_line_command(self): + if self.one_line_command: + return + + one_line_command = " ".join(self.commands) + self.one_line_command = one_line_command.strip() + + def get_output(self): + return self.output + + def is_error(self): + return bool(self.result_code) + + def print_debug_command(self): + self._load_one_line_command() + print(self.one_line_command) + + def get_command(self): + self._load_one_line_command() + return self.one_line_command + + def reset(self): + self.commands = [] + self.one_line_command = "" + self.output = [] + self.result_code = 0 + return self diff --git a/wa-chtgpt/wa-chatgpt/shared/infrastructure/views/__init__.py b/wa-chtgpt/wa-chatgpt/shared/infrastructure/views/__init__.py new file mode 100644 index 00000000..e69de29b