From 7d7300974d0588d694cce063c1e210fc0c0a1ee8 Mon Sep 17 00:00:00 2001 From: Standa Platil Date: Tue, 24 Nov 2020 18:54:26 +0100 Subject: [PATCH] zacatek --- .dockerignore | 39 ++++ Dockerfile | 60 ++++++ aktuality/__init__.py | 0 aktuality/admin.py | 3 + aktuality/apps.py | 5 + aktuality/migrations/0001_initial.py | 39 ++++ aktuality/migrations/__init__.py | 0 aktuality/models.py | 26 +++ aktuality/tests.py | 3 + aktuality/views.py | 3 + blog/__init__.py | 0 blog/admin.py | 3 + blog/apps.py | 5 + blog/migrations/0001_initial.py | 57 +++++ blog/migrations/__init__.py | 0 blog/models.py | 55 +++++ blog/tests.py | 3 + blog/views.py | 3 + home/__init__.py | 0 home/migrations/0001_initial.py | 22 ++ home/migrations/0002_create_homepage.py | 58 +++++ home/migrations/0003_auto_20201124_1724.py | 31 +++ home/migrations/__init__.py | 0 home/models.py | 22 ++ home/static/css/welcome_page.css | 204 ++++++++++++++++++ home/templates/home/home_page.html | 14 ++ home/templates/home/welcome_page.html | 52 +++++ manage.py | 10 + ...34748208_77299427656457371.max-165x165.jpg | Bin 0 -> 5459 bytes ...2653551634748208_7729942765645737115_n.jpg | Bin 0 -> 60480 bytes requirements.txt | 2 + search/__init__.py | 0 search/templates/search/search.html | 38 ++++ search/views.py | 34 +++ stranka/__init__.py | 0 stranka/admin.py | 3 + stranka/apps.py | 5 + stranka/migrations/0001_initial.py | 44 ++++ stranka/migrations/__init__.py | 0 stranka/models.py | 35 +++ stranka/tests.py | 3 + stranka/views.py | 3 + veterina/__init__.py | 0 veterina/settings/__init__.py | 0 veterina/settings/base.py | 166 ++++++++++++++ veterina/settings/dev.py | 18 ++ veterina/settings/production.py | 8 + veterina/static/css/veterina.css | 0 veterina/static/js/veterina.js | 0 veterina/templates/404.html | 9 + veterina/templates/500.html | 13 ++ veterina/templates/base.html | 40 ++++ veterina/urls.py | 39 ++++ veterina/wsgi.py | 16 ++ 54 files changed, 1193 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 aktuality/__init__.py create mode 100644 aktuality/admin.py create mode 100644 aktuality/apps.py create mode 100644 aktuality/migrations/0001_initial.py create mode 100644 aktuality/migrations/__init__.py create mode 100644 aktuality/models.py create mode 100644 aktuality/tests.py create mode 100644 aktuality/views.py create mode 100644 blog/__init__.py create mode 100644 blog/admin.py create mode 100644 blog/apps.py create mode 100644 blog/migrations/0001_initial.py create mode 100644 blog/migrations/__init__.py create mode 100644 blog/models.py create mode 100644 blog/tests.py create mode 100644 blog/views.py create mode 100644 home/__init__.py create mode 100644 home/migrations/0001_initial.py create mode 100644 home/migrations/0002_create_homepage.py create mode 100644 home/migrations/0003_auto_20201124_1724.py create mode 100644 home/migrations/__init__.py create mode 100644 home/models.py create mode 100644 home/static/css/welcome_page.css create mode 100644 home/templates/home/home_page.html create mode 100644 home/templates/home/welcome_page.html create mode 100644 manage.py create mode 100644 media/images/118703245_2653551634748208_77299427656457371.max-165x165.jpg create mode 100644 media/original_images/118703245_2653551634748208_7729942765645737115_n.jpg create mode 100644 requirements.txt create mode 100644 search/__init__.py create mode 100644 search/templates/search/search.html create mode 100644 search/views.py create mode 100644 stranka/__init__.py create mode 100644 stranka/admin.py create mode 100644 stranka/apps.py create mode 100644 stranka/migrations/0001_initial.py create mode 100644 stranka/migrations/__init__.py create mode 100644 stranka/models.py create mode 100644 stranka/tests.py create mode 100644 stranka/views.py create mode 100644 veterina/__init__.py create mode 100644 veterina/settings/__init__.py create mode 100644 veterina/settings/base.py create mode 100644 veterina/settings/dev.py create mode 100644 veterina/settings/production.py create mode 100644 veterina/static/css/veterina.css create mode 100644 veterina/static/js/veterina.js create mode 100644 veterina/templates/404.html create mode 100644 veterina/templates/500.html create mode 100644 veterina/templates/base.html create mode 100644 veterina/urls.py create mode 100644 veterina/wsgi.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..63ce98d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,39 @@ +# Django project +/media/ +/static/ +*.sqlite3 + +# Python and others +__pycache__ +*.pyc +.DS_Store +*.swp +/venv/ +/tmp/ +/.vagrant/ +/Vagrantfile.local +node_modules/ +/npm-debug.log +/.idea/ +.vscode +coverage +.python-version + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..85cdfbc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +# Use an official Python runtime based on Debian 10 "buster" as a parent image. +FROM python:3.8.1-slim-buster + +# Add user that will be used in the container. +RUN useradd wagtail + +# Port used by this container to serve HTTP. +EXPOSE 8000 + +# Set environment variables. +# 1. Force Python stdout and stderr streams to be unbuffered. +# 2. Set PORT variable that is used by Gunicorn. This should match "EXPOSE" +# command. +ENV PYTHONUNBUFFERED=1 \ + PORT=8000 + +# Install system packages required by Wagtail and Django. +RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends \ + build-essential \ + libpq-dev \ + libmariadbclient-dev \ + libjpeg62-turbo-dev \ + zlib1g-dev \ + libwebp-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install the application server. +RUN pip install "gunicorn==20.0.4" + +# Install the project requirements. +COPY requirements.txt / +RUN pip install -r /requirements.txt + +# Use /app folder as a directory where the source code is stored. +WORKDIR /app + +# Set this directory to be owned by the "wagtail" user. This Wagtail project +# uses SQLite, the folder needs to be owned by the user that +# will be writing to the database file. +RUN chown wagtail:wagtail /app + +# Copy the source code of the project into the container. +COPY --chown=wagtail:wagtail . . + +# Use user "wagtail" to run the build commands below and the server itself. +USER wagtail + +# Collect static files. +RUN python manage.py collectstatic --noinput --clear + +# Runtime command that executes when "docker run" is called, it does the +# following: +# 1. Migrate the database. +# 2. Start the application server. +# WARNING: +# Migrating database at the same time as starting the server IS NOT THE BEST +# PRACTICE. The database should be migrated manually or using the release +# phase facilities of your hosting platform. This is used only so the +# Wagtail instance can be started with a simple "docker run" command. +CMD set -xe; python manage.py migrate --noinput; gunicorn veterina.wsgi:application diff --git a/aktuality/__init__.py b/aktuality/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/aktuality/admin.py b/aktuality/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/aktuality/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/aktuality/apps.py b/aktuality/apps.py new file mode 100644 index 0000000..6933f2d --- /dev/null +++ b/aktuality/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AktualityConfig(AppConfig): + name = 'aktuality' diff --git a/aktuality/migrations/0001_initial.py b/aktuality/migrations/0001_initial.py new file mode 100644 index 0000000..e9db3bf --- /dev/null +++ b/aktuality/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 3.1.3 on 2020-11-24 16:24 + +from django.db import migrations, models +import django.db.models.deletion +import wagtail.core.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailcore', '0059_apply_collection_ordering'), + ] + + operations = [ + migrations.CreateModel( + name='Aktualita', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('date', models.DateField(verbose_name='Post date')), + ('body', wagtail.core.fields.RichTextField(blank=True)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='AktualityIndexPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + ] diff --git a/aktuality/migrations/__init__.py b/aktuality/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/aktuality/models.py b/aktuality/models.py new file mode 100644 index 0000000..972ba82 --- /dev/null +++ b/aktuality/models.py @@ -0,0 +1,26 @@ +from django.db import models + +from modelcluster.fields import ParentalKey + +from wagtail.core.models import Page, Orderable +from wagtail.core.fields import RichTextField +from wagtail.admin.edit_handlers import FieldPanel, InlinePanel +from wagtail.images.edit_handlers import ImageChooserPanel +from wagtail.search import index + + +class AktualityIndexPage(Page): + pass + + +class Aktualita(Page): + date = models.DateField("Post date") + body = RichTextField(blank=True) + + search_fields = Page.search_fields + [ + index.SearchField('body'), + ] + + content_panels = Page.content_panels + [ + FieldPanel('body', classname="full"), + ] diff --git a/aktuality/tests.py b/aktuality/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/aktuality/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/aktuality/views.py b/aktuality/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/aktuality/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/blog/__init__.py b/blog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/admin.py b/blog/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/blog/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/blog/apps.py b/blog/apps.py new file mode 100644 index 0000000..7930587 --- /dev/null +++ b/blog/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class BlogConfig(AppConfig): + name = 'blog' diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py new file mode 100644 index 0000000..79a3589 --- /dev/null +++ b/blog/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# Generated by Django 3.1.3 on 2020-11-24 16:24 + +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.fields +import wagtail.core.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailimages', '0022_uploadedimage'), + ('wagtailcore', '0059_apply_collection_ordering'), + ] + + operations = [ + migrations.CreateModel( + name='BlogIndexPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('intro', wagtail.core.fields.RichTextField(blank=True)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='BlogPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('date', models.DateField(verbose_name='Post date')), + ('intro', models.CharField(max_length=250)), + ('body', wagtail.core.fields.RichTextField(blank=True)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='BlogPageGalleryImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('caption', models.CharField(blank=True, max_length=250)), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailimages.image')), + ('page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='gallery_images', to='blog.blogpage')), + ], + options={ + 'ordering': ['sort_order'], + 'abstract': False, + }, + ), + ] diff --git a/blog/migrations/__init__.py b/blog/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/models.py b/blog/models.py new file mode 100644 index 0000000..547168f --- /dev/null +++ b/blog/models.py @@ -0,0 +1,55 @@ +from django.db import models + +from modelcluster.fields import ParentalKey + +from wagtail.core.models import Page, Orderable +from wagtail.core.fields import RichTextField +from wagtail.admin.edit_handlers import FieldPanel, InlinePanel +from wagtail.images.edit_handlers import ImageChooserPanel +from wagtail.search import index + + +class BlogIndexPage(Page): + intro = RichTextField(blank=True) + + content_panels = Page.content_panels + [ + FieldPanel('intro', classname="full") + ] + + +class BlogPage(Page): + date = models.DateField("Post date") + intro = models.CharField(max_length=250) + body = RichTextField(blank=True) + + def main_image(self): + gallery_item = self.gallery_images.first() + if gallery_item: + return gallery_item.image + else: + return None + + search_fields = Page.search_fields + [ + index.SearchField('intro'), + index.SearchField('body'), + ] + + content_panels = Page.content_panels + [ + FieldPanel('date'), + FieldPanel('intro'), + FieldPanel('body', classname="full"), + InlinePanel('gallery_images', label="Obrázky"), + ] + + +class BlogPageGalleryImage(Orderable): + page = ParentalKey(BlogPage, on_delete=models.CASCADE, related_name='gallery_images') + image = models.ForeignKey( + 'wagtailimages.Image', on_delete=models.CASCADE, related_name='+' + ) + caption = models.CharField(blank=True, max_length=250) + + panels = [ + ImageChooserPanel('image'), + FieldPanel('caption'), + ] \ No newline at end of file diff --git a/blog/tests.py b/blog/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/blog/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blog/views.py b/blog/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/blog/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/home/__init__.py b/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/home/migrations/0001_initial.py b/home/migrations/0001_initial.py new file mode 100644 index 0000000..ef46d12 --- /dev/null +++ b/home/migrations/0001_initial.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0040_page_draft_title'), + ] + + operations = [ + migrations.CreateModel( + name='HomePage', + fields=[ + ('page_ptr', models.OneToOneField(on_delete=models.CASCADE, parent_link=True, auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + ] diff --git a/home/migrations/0002_create_homepage.py b/home/migrations/0002_create_homepage.py new file mode 100644 index 0000000..039f0f5 --- /dev/null +++ b/home/migrations/0002_create_homepage.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from django.db import migrations + + +def create_homepage(apps, schema_editor): + # Get models + ContentType = apps.get_model('contenttypes.ContentType') + Page = apps.get_model('wagtailcore.Page') + Site = apps.get_model('wagtailcore.Site') + HomePage = apps.get_model('home.HomePage') + + # Delete the default homepage + # If migration is run multiple times, it may have already been deleted + Page.objects.filter(id=2).delete() + + # Create content type for homepage model + homepage_content_type, __ = ContentType.objects.get_or_create( + model='homepage', app_label='home') + + # Create a new homepage + homepage = HomePage.objects.create( + title="Home", + draft_title="Home", + slug='home', + content_type=homepage_content_type, + path='00010001', + depth=2, + numchild=0, + url_path='/home/', + ) + + # Create a site with the new homepage set as the root + Site.objects.create( + hostname='localhost', root_page=homepage, is_default_site=True) + + +def remove_homepage(apps, schema_editor): + # Get models + ContentType = apps.get_model('contenttypes.ContentType') + HomePage = apps.get_model('home.HomePage') + + # Delete the default homepage + # Page and Site objects CASCADE + HomePage.objects.filter(slug='home', depth=2).delete() + + # Delete content type for homepage model + ContentType.objects.filter(model='homepage', app_label='home').delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0001_initial'), + ] + + operations = [ + migrations.RunPython(create_homepage, remove_homepage), + ] diff --git a/home/migrations/0003_auto_20201124_1724.py b/home/migrations/0003_auto_20201124_1724.py new file mode 100644 index 0000000..408e407 --- /dev/null +++ b/home/migrations/0003_auto_20201124_1724.py @@ -0,0 +1,31 @@ +# Generated by Django 3.1.3 on 2020-11-24 16:24 + +from django.db import migrations, models +import django.db.models.deletion +import wagtail.core.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailimages', '0022_uploadedimage'), + ('home', '0002_create_homepage'), + ] + + operations = [ + migrations.AddField( + model_name='homepage', + name='address', + field=wagtail.core.fields.RichTextField(blank=True), + ), + migrations.AddField( + model_name='homepage', + name='body', + field=wagtail.core.fields.RichTextField(blank=True), + ), + migrations.AddField( + model_name='homepage', + name='image', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='wagtailimages.image'), + ), + ] diff --git a/home/migrations/__init__.py b/home/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/home/models.py b/home/models.py new file mode 100644 index 0000000..67a4a8e --- /dev/null +++ b/home/models.py @@ -0,0 +1,22 @@ +from django.db import models + +from modelcluster.fields import ParentalKey + +from wagtail.core.models import Page, Orderable +from wagtail.core.fields import RichTextField +from wagtail.images.edit_handlers import ImageChooserPanel +from wagtail.admin.edit_handlers import FieldPanel, InlinePanel + + +class HomePage(Page): + body = RichTextField(blank=True) + address = RichTextField(blank=True) + image = models.ForeignKey( + 'wagtailimages.Image', on_delete=models.PROTECT, null=True, related_name='+' + ) + + content_panels = Page.content_panels + [ + FieldPanel('body', classname="full"), + FieldPanel('address', classname="full"), + ImageChooserPanel('image'), + ] \ No newline at end of file diff --git a/home/static/css/welcome_page.css b/home/static/css/welcome_page.css new file mode 100644 index 0000000..ce8b149 --- /dev/null +++ b/home/static/css/welcome_page.css @@ -0,0 +1,204 @@ +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + max-width: 960px; + min-height: 100vh; + margin: 0 auto; + padding: 0 15px; + color: #231f20; + font-family: 'Helvetica Neue', 'Segoe UI', Arial, sans-serif; + line-height: 1.25; +} + +a { + background-color: transparent; + color: #308282; + text-decoration: underline; +} + +a:hover { + color: #ea1b10; +} + +h1, +h2, +h3, +h4, +h5, +p, +ul { + padding: 0; + margin: 0; + font-weight: 400; +} + +main { + display: block; /* For IE11 support */ +} + +svg:not(:root) { + overflow: hidden; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 20px; + padding-bottom: 10px; + border-bottom: 1px solid #e6e6e6; +} + +.logo { + width: 150px; + margin-right: 20px; +} + +.logo a { + display: block; +} + +.figure-logo { + max-width: 150px; + max-height: 55.1px; +} + +.release-notes { + font-size: 14px; +} + +.main { + padding: 40px 0; + margin: 0 auto; + text-align: center; +} + +.figure-space { + max-width: 265px; +} + +@-webkit-keyframes pos { + 0%, 100% { + -webkit-transform: rotate(-6deg); + transform: rotate(-6deg); + } + 50% { + -webkit-transform: rotate(6deg); + transform: rotate(6deg); + } +} + +@keyframes pos { + 0%, 100% { + -webkit-transform: rotate(-6deg); + transform: rotate(-6deg); + } + 50% { + -webkit-transform: rotate(6deg); + transform: rotate(6deg); + } +} + +.egg { + fill: #43b1b0; + -webkit-animation: pos 3s ease infinite; + animation: pos 3s ease infinite; + -webkit-transform: translateY(50px); + transform: translateY(50px); + -webkit-transform-origin: 50% 80%; + transform-origin: 50% 80%; +} + +.main-text { + max-width: 400px; + margin: 5px auto; +} + +.main-text h1 { + font-size: 22px; +} + +.main-text p { + margin: 15px auto 0; +} + +.footer { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + border-top: 1px solid #e6e6e6; + padding: 10px; +} + +.option { + display: block; + padding: 10px 10px 10px 34px; + position: relative; + text-decoration: none; +} + +.option svg { + width: 24px; + height: 24px; + fill: gray; + border: 1px solid #d9d9d9; + padding: 5px; + border-radius: 100%; + top: 10px; + left: 0; + position: absolute; +} + +.option h4 { + font-size: 19px; + text-decoration: underline; +} + +.option p { + padding-top: 3px; + color: #231f20; + font-size: 15px; + font-weight: 300; +} + +@media (max-width: 996px) { + body { + max-width: 780px; + } +} + +@media (max-width: 767px) { + .option { + flex: 0 0 50%; + } +} + +@media (max-width: 599px) { + .main { + padding: 20px 0; + } + + .figure-space { + max-width: 200px; + } + + .footer { + display: block; + width: 300px; + margin: 0 auto; + } +} + +@media (max-width: 360px) { + .header-link { + max-width: 100px; + } +} diff --git a/home/templates/home/home_page.html b/home/templates/home/home_page.html new file mode 100644 index 0000000..d8b124f --- /dev/null +++ b/home/templates/home/home_page.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% load wagtailcore_tags %} + +{% block body_class %}template-homepage{% endblock %} + + +{% block extra_css %} + +{% endblock extra_css %} + + +{% block content %} + {{ page.body|richtext }} +{% endblock content %} diff --git a/home/templates/home/welcome_page.html b/home/templates/home/welcome_page.html new file mode 100644 index 0000000..6368471 --- /dev/null +++ b/home/templates/home/welcome_page.html @@ -0,0 +1,52 @@ +{% load i18n wagtailcore_tags %} + +
+ + +
+
+
+ +
+
+

{% trans "Welcome to your new Wagtail site!" %}

+

{% trans 'Please feel free to join our community on Slack, or get started with one of the links below.' %}

+
+
+ diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..a4ba878 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "veterina.settings.dev") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/media/images/118703245_2653551634748208_77299427656457371.max-165x165.jpg b/media/images/118703245_2653551634748208_77299427656457371.max-165x165.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92e35890214863113e67356ba2a8873096ece7fa GIT binary patch literal 5459 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 OUuMeP*gI3Wp7|e57L*zQ literal 0 HcmV?d00001 diff --git a/media/original_images/118703245_2653551634748208_7729942765645737115_n.jpg b/media/original_images/118703245_2653551634748208_7729942765645737115_n.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a5399958dce7dfdba7544a4841044d0b69924cf GIT binary patch literal 60480 zcmb4qWmp_d&>$|s-QC^Y-Q7L7L-63i-QC?C7PsJTi!APL0fGm}k@vg1=l))8&+Kk> zbyZh&P0dVo_utjOyI`pD(sI&Z;Nak3Uq3%!f3Lu}Rc)Nzo!xAlzmak$CqR7`XgFwSC@APJ zu&^+2h+hy95xyWGAR(ipA|az8BOst+qoQG8Vqsw+qTt|SW8$J?VqyMc0uK4v1_~M; z8X6uG2>}W7{~P`ef}z2IH$jv@f|G+mpn*f8f&U!_BLo8jhyJJK{{={J2qHSUk27QHL;xb(x%Ea05d zrBu7@qS5En#N3zV3Caa46@(^h(tWCe(`ivj_-1}yz|t6=UBe;g?|~jd%0NsB(1E(u z)z?jjq6*BGu4}H5I%JD03x8PTT$O-n4^rzlj1!92G_lDyDPOA|KZho8HmpE9kV zG5D=&VNoY*kt%M2Btqo8xjZn5m|V+f+zhXfJ0p`i4UE>48XK>j%r={}C{g^RN?Zb| zQ7RAX1TtzmhLRmJ&3o{7?oqs!%bZReTqu-IFI(p|3`1mQt}zV5CZt=cqE027YzcnS zM3n5VdD>Z%?BVK(km}NS=JRG|M?EdQdpb0SsLclf+9{h`5*uJT(FW!OP`-@q+34WS zOjtpsXv|~$)pkvlk{&GFlM_3wmE1O)jB_(LfI%$xQ3KO9iBRHtZ#WU2Gi_oPYqL_O z<`*+PW~tkDP_HqPH=$~-R-&O3YOa)xyt0k6PdP|vQE|UY)I|%?n=l7!PAS2shG1th zJ4`Y>Tyt!AFC^+Gc2+RDP>8*OPJYWEFJZ5`gzo90^c=4e_Dhx(%~{az&RH+|wdGvy zStIs(i=bbTx>lc^iq{2_vW1C7Li90m-BR;?QypFSxZO5$u+9x%yeeREV|lmp7r7EiE;HA-q~ zZWg7)fe}Dmj;J zw~)!%hF7Hsa0^8eI#UhhVDraJ#^*A0`&MSZ=ouV|&Jm`!w~`iWE$YSTssU9M27} zb;G4|aQbs?x4z{K%pOwGcAhyTIyr>Wf!nb}_!dMTS7%YTH{|F!N);Y$Es`rwIqY$v zFCWpYVSAKh2$QyQtDe~B9H67;ilknD>m?kGynXzA$w+_s!llP{d{iSpk{3rVB-;z) zfPna``l^PXy?)>G*=iiL&8g>`o7xAc4al0o@*6mH&vcB}bD|ted_~kwTigax%^oQc zUZcBpmKWjw2-ftwzf+L+oo?-zJ3TT7N!xp~x2PY_;a|CCFKr&WR-Z2jc-p%$)={Oq5@+w!!hRN_o?g*sy9qBom>Lw0$^B73EX{xjhA)LBfePZ z8q0<4c>mHymcp^7u3xFY$dI0e%H_AI*VT|%F(fv6k0k)-Z(ga84VqdX`|*m6>u=a) zNOfh&y*iqyV3zlrNB@gZx>`jBvifBjIb#_0cN6AyNBEU6$51?nZ#&oU z_jJwb;b6x!IhqIEQ7e*_?*)aY8!2~rQ^(!?iBhu%KAWLI;%R< zFV=alEV=Hc?DeBOUfk8^$vbJ|c`(i*^1>Yqj!1^lh4&2n8`NKVXbIL4 z6vOC6bOgOR+W229I~a`8X>?MrDW#HxTobS*q`#Yxb&(&qg$8SVExx*A#i7HhvF2u& zVx)6)dpt#UD$7S`UTV8VFAfWZ&CZc-A*6Sq2$Q~zV zK1Ub|q8D}AT7|YJVdX7^Z&Hqu`C7oy5;>%xXbiq-%^V?zv$_ULeIH<2)>qiGz}>ap zr<3{etJu3=MnHzXfBtC2MD_HAX_0*T|4Nzc``m|T9 zBj_yu4;@^xT|xq*vGi{i7u_=zSd|PXafe9gbxy(Jz!I|ty+VJ15gH-x_7qHLeF5(pSZ(%WlZ01jHDS*=aU2t21>?!i?!m=oqoV4gP~X^jYo$Cv za=B8VcMW%fYD8E9Lr;x|&O&;C&~&oZa7VPlu-=s`{=bS{n(YRA(~#af6<~Nx8EjT-k>P znk>`Y&cYr)tAlp1vXiILp?cW6z364EWa`pm8OzNF{`+C&s@#AgQnnec_RB}0HEhA3 z_C(zWbGObrh!f)$oGECO<+&qO7!kR8K|8iNe_NxQeNCNRszZ1dn-8$ z`!hLf7jGq}#{O^8R8)b+_*N$b_M-e;cJrw~{3a^DOC{{$oF%{Qex8u7FW=`K;>vlW zx{6~kHZn@4-%DnC`FZZb?qMw3aLhTMusnQ3QP2oH@M?KV_8*(d(MNymvUjD8J(grOoz0^A77_44=Xo_9f>fp`8tU6PM)fJ z!7f=)YESqUzK%J*>V!x=W(H*B9cAEO0PkL7{oZ(hG6^XB9kn@?YqX*yZPij zT@Kl*tqy5$Q8>pcxL&YMo=*V8FUxQA6N2w<#CS`^$o6PD3MFw0G_~#%g2x~CE=vHN zy4kF(rAD%W_OdD>w67lC?9|%jSu{GHp>0NBwLPnJYhh`I<{ebaf<2h4%5s%B-*UJ^JW6AHgwUQ+p`xNhsSM9{8LpV}Qq5N5edKs_%%M1ou4=>{A3qvnj z0~}8;bovl4UneF{9Zg>}of2V&@)o%(rmEhHb1G8CVf%`&4yO5!g*$&@J{Gs8bSAD@ zlWG~4#5(h6*Kd$eG}MT@W}DfjHH^Ni$wh7^?)@IVvUzzo7O$nr5FRGJA%xc@A}%8=0=q$Wm65Vx z+jStem=V#1t>6WY=8&!(4S6YBUAs6>E_g*%d8``3pn+<6Bk7(9V2fu$k1#^sKNceN z(ZMURaOVt}F|^&XIlo}^`C1CIr9V{D4VuhH9W&HsEg7yIS=$C7c(ZNIiP5ST>k?xY zesOlU-3{&6iX6}XbzJQtY zF?ucgpqkAuQ9onpkx&`PlGK=w$D~ZsUwM+Ae*2@XeH`sbW+lZaPA>+(HdELL{Pe+{ zFy!@TDjbpyRmz>t%^(mS{PkkT){Lp-Lu@x2s6Hj#-w<5^9m`Z`YP`Y5I^+!-Il7j& zFhoIPWokPvt@VJfv$7^Vb4EmjwQxwSw^DU{k*B$Vb5Q2qn#7~WNxwffP`jUraSZR)HT%WQ16UgBNRb=fF-E8%$C`eg_uxY{*W;yF{q2OEy>NWQ zc3NPBpj0SHj?(5NmO#UD#fqpZYkM5D5-!c%Vgj|b{|6qs+k>D;s?0$@wjr^t}H!9EwgY%Uu(l( z(k9hQvRY%1s&AjPO>s#1%ADRQ0A{}VNcOXL9qw4OU=+>XICn4K@Ab|J3VRunrLxQA zNGj%L(gw%iOWco^bGWyVt2UFRK|JUp4Noo8nsP zJsaG(ME~f|3eCZ69ms>)8h!?(I9M{bmXiMo)tHK}B7+B1%oD^2mma zA|s!HfJ5;}O^WP^Jh_HD4;Ql>hQpQ!Dh-`n(6sRKFPPg!b<$RSiM0on@o`Fbwp(|O z9?_)M`=I@wM4Bg>*=yVD>vRb(vcqfln$7U`j?ZWD{NCvkFU&D7?wZXc=q;>-g(qXL zy6Zfs?K3K??pTK-FUwNTC#$6Qm2cfyKd;sK{8wZ{HaVoP6B(}ocV28dU5*-E88X*4 zPS>_cf3lCR&3HPgu1`!p^M9n;r8`(&P+E;lnmo0T=$fGegIF*ta zF_gin1-aL!Ep_S0pMCywXHNZxbgvHscIk+p8X*+9Gl$K0;fSC8`&pm%iTy|S4-5Pc z`$=p2UwgGM59YL`SXs$fhC05OXs;u3;3t6MNPp<--!`Qf1-tgIzN{4DA5-to1t=2yz7?R_Q$`kfZ56w)Ugx|3Q!KC)oe|!}-Hd`+qQ>=N>3O zTN3=+Vn8(0lm6|$p6E+{D)R~cxk^s5FX2k9tb%6t)eI@(k;-W9g%LsiH5B_+ZD13skF(B*i#~;yu zsDH9s$%EM^_ zJu+Le#&jn82?Pb%uz#upDXxJjLjit{Jj!>1KLCIqpX~p~W~A7OxBmG#3UK=V=%t}CyvA0Vn(6}2zX6ZMZYO|B}E{=gL zYCM(w#2)|v(7G=Q$T^|o4eppqZzr)|mii|KL6#J|Z|1Y#-#^X&<9FQ)vB%@5r7wly zWY$!^Rs90g=m}tSp9Lrut8m@a^#70M0>Q5d+wqG%bx za2C&F_wNJAP@@BHvy~=r5Saa3r{4sPSlf@pubWhaFl{?um6^u1vR16k9eBz`_of$M zD}FxHmhARGS;OCT#znB8+DtA{wbjV}8gfdA0>#k@a(cJ2IHq*sk8iFv-Tg^$7lcB+ z!A|diE`{AZfq^eQi%y%@;LsxE+dpw*I5?Id5G^-j2phUZ!}?hdZ3}*g(wIkaor|XY zJOPULH7)M;W@H#nYOSQzrBq#ThB+`}jzM0nJ#I>#@pO=ETJa}fQ;6DN_)db%V3Wpz zdE9K}Wt97oN$JV4xEM4>#M_{rs_qguRfLT-TxTmAqam!7@c^>VrW<+g!_%dV)_qerA-K5$E^qaJ-UT_v9zLgbeazR0o~m)1FDK2i;eI;7tFg z1ODOKEyl=cayf3zR=IYge^Q7+G6yI4(z#ppu6UZ#SMipU+d!G&$~t5wu>1wvG}Sz3 zlIZ(Ktuh&gMMn;wBfJ~a_mP<%bATH0e4_$Xrm2A4JXX?}!WxqAw3ZhzUj$Dk+^@E# z1L#m^>kH+!`t3THcd*VqLX5^-KNybmp9dc(m^c=^-Udu(;RzV23wvCQ*zv9ji)ppm zDX`9X;_xszPWGt*H-59~-w0mJrY9+X*>kLM6>*7S8)S9G8(2f>`f$%bI+4r`85^-UQEJ0$=HHazYSj7K%@Yli?#3s+NnP7~h-p6M_ZTJLH&w&w?O3mk zh8WhF9b~OW4!d-p_&9VQWQ4zQO~-=&1#87HqKq32T!vlK2C0-<1|jp)yRKDkpv0U# zN^w!c=$O1t?DesSxa_#$na&W{ADC0NSqPFqT_FeKdwNgKeO_(CGycC(*4&Eg2olKR z60)0+&G7PB#E_Xs#bwNDH=0QjCnTR8bsvgQ&;w%|!YHTXblQoksJcGX1&BB!?ki}3 zgHdMPvZ4$TT+5iZ4*~)R4*Csng{y=wl%vUpB8jR<`~YpA<8~iB5pBR!manJjr-U7x zlhU}=sP28?slQ-y!tC!!Kk<2G;e~>x2>ycUqBw^>D@8MnOp{gV54)*oTWz54IHY>x zUl;?SR3BaRd?gBy*UG}?D}@%2QMeENVmJ2748p>T?mkDu{t^fZ*;ng$C&A{mF}FCQ z;2n$nohaBshg5Z8LFPU^uFeua?39Lr;VY^3q|K;!*|2C>43%s(1FS!>sM6&olIG*p zR{JwJH_|RbbCgipEid6|fOT{|xO}GcAz$!v&X$n7WXo;);i>nMX)tK0sX^#QKw$Ly zFW9WfL23=9R<_U%3;iXL(n#`G{q<`PAFbaluXZnJW*QmxEU{a1(n5O=Iv>q-WOprz z?Ntfre82!Su?;hyWOfzB17iqp^Am^V)$Cw6raH1G67;~RQN4AUy(sXzzEVp>bIwU| zg#I#-HbVqrJy97;6l|F*671>N3Db7`^(J%NHRDb5TAxYBq?NB}O(FCCVF|fI!z+Km zhF6pbl(D6IFF*7(e{fS-W?s)hM;dg;_a=thQlEHozvd?5>Wn|n&Gwdk@X<24KZ-an zo`*N`V10n~R~oL2Xx~FXn$bWa!Yqt6)r}!@!2=6K5II~g&7KAHGF&XndAewPK`l(y zdK3Ip#Yxi*M*AFcSME$oVknT8pZE2UeWiyP3$E-9TgkH=Wb!3c5ez?J`t+h!D4fAq zqZ7h(A?=NIihn#KTjdP7H+(_ zu%VZbU%K(nmXT}UqK<92nEFRzYcR41jUZAGVsc8ks)RWZ8&~dZl@lJJTqAG4-h<_o zslswCnbX&^6i=^OO?f<5b)Uv}J-VbfqpJ;R6=6oUI^U%{Z+c&S&OF;yUZ$Ht<%OL` z{F%7E3o>uup0u+g`T8dsn6l2(hKs}0f`45RP!uJGy_`vhg-uQG|LXr2+0;oreLdQa7t()7@3l15OzDcH|vUe)1Y+czV$f&zc+b z0`Of1Ro*MH8;?%TPy6-N@QKTrho|*Rzdjit!#A_Z`)|CJJ?haphD-kh?q3TP#FK0z zkz!e8u&%dii97MGr%z*(WHkxg)@>P)-O^KDr;TpfhmT5jw&DNAcfWGmY46j`GZq`p zM&mZ%W)xV`4(0|>7X~|bU62O;e7v(R_DyoeZ8Bb=X}}?oLP$fj&^&SEpXM+%ZR}UE zr~ZgY_&^rE{_@6*SF3>N##zH^?%mucOy(3Xtm&frn-W&F!&m98ujFf!XDV?V@P0K1 z^*D>5K5&!xw^Ujc(av%e8rN%rPOTIHo>NuSqUN`;{%G$t6874%&K&|si2|}yNCmXM zAF5hAOXIG99oX6$&YjBT2Jfsdlm|ygMksqMkqCR)b&q;@=U2e5$97|#_(75O;!<7ic)%{VU?dF1xGEbZ(v!keskE?Nv;u1vu=+x??tVdve?(Y zl;4ytTy~*)n0=x8F1~>wm*ZfXW!1FtD5mlYTt>>`X98QaGXauUYpy?D%x&7xrTN*K zN$Cp5PY)cXw!zof$0J^D9>=?GOiB*O_P<~r5x-=Tt!o39xb$m}s&BfTXel1Jg8g4> zt*B*>+`|Mv&`HMV&o0Mia_;Lrbhp;oh;QQxu~gwL>GV4c!$&56rQ7WG9VFNvggLKE zYRyf0>j535ar^W}oaOr4n(o)y+3oJknJ4d;mViM9H(%VI>kS-eZr9h>{enu1%fqP! z1K7;n9lE}Bd3EBUL2%3@aiF`PM}Q-yeRoMusxZ(*=6VXAA6dmF4xqI|j`itjwFZLGa< z!^7*dzMV9I=pe|HN%@-tfMwFOsjgCIQYcIsQxr@fkmJFIX~yoLdM!i%2hm`|j7l)i zMTB`jP}L`2Sgje4%l*T6*uIG$hxN|Bq?(A*-){xeHxw8o2GL%InY(QnHTA+xtYozU zV)3gP??7IRA32sIDEOd%8Z6bxAX-k%=fJtnJchi1JhWDk!K`-gSChTCqRLA&&+}z_RJrdNE1g zX3V=~L8TsgfDaA-14sse<2s(kUwMHTf3@d|blV}VOOG&ta~5s#%zzLL(9}T+Nl=Q# za@U$>1%W@4?Lu$~EYqwt@L8=R5`CdyJYIfrrZAI^vTz?L9X6aFm9maZdD2u1AkF`- z8$)fMVwmk25=2^8iE>!fim6r9IDzZXNTP@SpoWo#l7E`?W|>uIF=wjy6rR#CgKcad ztT?sDW@3LCdvU3YM`u96?!0Mzi);wUy;f*>-+R)N=32|O58URo(HoX=;@M4o)^(`5 zQ94n&jBhEm%R8u{6c`oGsqVXE)6YR%8FT&%Rvr0qTfJKDkN>1c<@3Cu%{;_#T!R!Q zOw277`85u`I3>tuGGDawoJMBBFnALW#fEr5gQCli;F_yLM?LvkU|9(U`==9LuZv(! z!NW07Jbr3T`8K@n1zVFhnU^ZI>GkVNIxJDzW^VMvZ+BlsKRaH66Q zp**8&yMt;t;S%>!=Xv7z(ZcKKWT@q5wKrm7kqf*P{#>nIIs|5gdugb5v<-2lz)`2aBq!u%3-uBOKY1n@Xd}WUxs;UBXekAlrNiWyW`S6$<+~s zLhNG)zlk}u-)yQJ#jZm;I-*Az+_tv1_CD_<)VjMY)u#*kvnBY_y>rALB@FJLv}(X7 zr0e%9Yh|aQl%KuY^yQ7cUYIB?`iH*@s0-#XD)H1fplw$~mQmTMt;C$;FWU_Tl)46# zD5vOu9nrG%b4Ls(sVuSZHYp!}=Q#3XD%M^QX6Saka+D8*Sx#z`{MdNwPjO9>A_@>i zuE=~U1l#&a6(OMNhg=MluX2fv<&Q+<&kM&hb<2 z1FI`jK8ouPSeDSl-|{t$erTg`L_)(2h@xRRVwLf4kGwfiWucFF8>i+Q{LGl`+%se2eOqw6J zHq0$;VYE1;)(WU^((dkS?2>!!`82wH8c#6@uJMknJmbzD6Q@%zNF zCy?CqDQ|hL25WUixZ5yZm^%&UHtWjw+8|N2BIC3nJ(ya8_kfCbbs-$dqBEFLg~dHJ zeBDKre^{yXCxJR8?I0!qT!M(uwT-R2_P|_mK zzoT2Lv|VvI#dd=sxQXQW@ru(oc}ZygQA_4m<8|r`QU6ZTP0^0^Uog=|HF)PEf>{zt zKH)+$F2E;7UkE)o1Fy7n`7|i93wxuMM+4a8V`ZDRe#pQRauMfa)y01k&j-e^6nDoD zfc2j+G_(Cm4(?WBI z;rOE~Mvw2bT){V2&&Mu9BWaa@An2+|JWI@7aJ|tUi<~ub*G1ha75fX#pTk9M*y3y6 z0qF(w8V%}ZNFIeNAytFz&3d%)B5`C~8SY^7&W!YTB|A?=@h=rGg@3`Sd;?0R>;SEo zh=iOBf5FoFt`Dx_p*tD6QQ=|vJSqydj)74G!D8o!fjv&|?I>?~&aaji$=1vy9cI2| z`+Tj5ZhHkuGZltTW&W>zqwGgHjYD6}@%cD+p9Emx8F&9sq28$e1>3v=H*Wf)dBTkB zk%l2L_ag+VT}%wwqMq%mB1$eiZPD{q|Hj%)lwHRAkEh zYg1`@g3slFP@s=zo3&aaU!?()v#G1+Kmaj*Q`W8*dqmr}YT#)#V za;OIcG6;&06xdn|W3K=Q;?|>962=4IstuPF-F-nxjQUrz%z!XWSn*W~DxOuQ@88x} zLPW0I6YDtLW#HmgNJfff7X(uiC-+jKZl%O~TxC)kM(XV^y2y7sCUduKZ^DblzO`<$ zrNF9SY?!`z9LToYAB-ju;IQ3W>9EcG5d2Vn5^`|y@WM1>z@X5>evIz_5a02VDm^u5 z`#^^c@F=KQeyXwz>1Y>4`g{Q$X!f60JbaXfsDiZikoK^s+X$%x6_Wjaf?dtK<0hbz zFcM=4{?tcv3?Rs7G4efwdHFkdKv55+D5=}wSjdK z5t`Jz#LVrASihOJU`OxPSuH)s9*s9;?$zOYs4kG}gg#o>I3`>}M6v6P7VC8_@&XZb zTdEJ}sQPL#xB?!gTmGz>wpc{^r^z!P=_PtQdjrX}|N8gcz1oKfOws$g8@T?IN+7x- z)wJ88@0>z(G@bZ8wy}+QxdY&vRz>Y57Hd{)?ffJw8#i^>?c-UX{*5+>RC_*=H{(a1 z0KSl+lk^mL_NK2#<={i?VnZX!5^lUWp@eca(}f%oOC&npdyOolIzJ8+zlE})M%=ERpr`}c3R`e^HTn6=vLCSMN2C@ z6}`A|#8pKGokDIVsQ1g&d@yzpqQc_n5d%MbvNnHsF;ZHBqBX^0vEIn$dXalv;?#tR zHMZ)a9_M?~l+r>MOh*O;hAA*YjP>p_k<`M6%$O<KkZre#V=;?_ z1E5*sK%M((9H>Od4gt<5S`~CkQ=IBZZOd5ERMUBKjq+F2qWN#Sn+jbNTRCmBbZ9Rn zOg|DsCl9H|D73ZT8pmQqE~m4NOLjWy51Qz9tQJcR0iDcW>t#$jdO@h#nRx?~@=d9) z#Md=EG+Jpjd%{EBj&;JBU38G0cWDFtEjk4_vcCG{W~XNJ#6ruFxda;%jsqN##tCVBx_K%(4fn?tdaUg(b z2$D2|6BtdcoBc`+4Ps#8H4y$zE`2eU3HRfkm+mlftgY1O@67ntV@9=-h17}KLM6+% z@6UC<*1|48G|i4wV*DH)%E6QRic~UJ2Yy3bz1bQ7`p7W+|z#7 z0G9MtJwp6}LVVPC-jwo42DS-77co*c#T9`3wh~}#gu@Vat5o+3r0nP1O zdIr|dDz=+d^>;R7DU-9Ol~n02kWOolAx*C_=F)Y??mH1Ir zE=gMZ0d?df*En-=OrNt<`v5=`nM1uoGKvAimT%qn_4PyTm6e6>2)&gX2+N)PQ_(Cg zGINvXuBXcO5Z!8RTNEJx#2ZT;PI_#PJ2S$(*0H0kr z%)dq)Ju;g>AI2Bn`cCDF&|5@czk+o>$e6qY5`Y+=() znoZ(spj$ZQmj+~c7BGPLu-~JfRrm?lI26D**T0WmjjKd3QHN>`{rQH}5*$~eq~4Ns z@UwHGABj>ZOk_*^irhc~g`o$&cm|J8Y3i!Wj(_$tOW zgnQrHBGIK$1uHqGva-QCGQKko?N4#iV$W0+iC>@2QbHVK?6sQ+o)=_Ig<)e$mmS zDvzq;5M4KTJWCeO_E!yTWEYZNp`#pMqWrMht<68+s?LUqO_M9&XY2K!G4 z;Gh6px#`2%`&9V_VsozW^Jn4 zv7Q7T{2Jl)HQu0%7AHDKUi${-`lhgd;T?-A4k*Q4a1!t`K=?h>+%s>1&#e6FdTGNkx`Eha zT!Ul_E0?1bb(w@7rAL_Kaye?X<>?om|8vKmnIRe!OsEzvTGm3SJR#C0IR;BDP&X2G z?DDbi#m^1e$TupMGoDj^W~Q|_GQLXK`Jo)iHl4^tggF|zHEJ-afy5_gsjC}0KOFaP z5zW1=mNsiR$+Er^Z*PBuiMt<)La|s#W_K0KqWU4NXAID?3PSU9sgMPsY#0uy1%M89 zAUb~Z31UsiZdvLtR9?<~v0l<9b5szYaZ(WNSdA4Rm2va}jJ<^_q7KT_L>GVUXVeVk zWBGM3njsml?BIahF}`@6g_fnnAZK$}Ay{e^6C#u&vj22Fl+y}1!R!h0YIK3`CL7zP z;bgI{@1qT*kr;35gsn~cX`e&Hm{&LRXN~_EEUR3I(FAkGm6?^!= z*?&(UFu0Wp^mzh>y!EYBO9@yHNNdG%MW*ceS^tbpn{Mvo)~o4eV9E`%TV2~%i(!gq zYz>z_+h1(xPHL3p<|7@{qtTV>8>k7zNBo*Xz zh%^kPG1Of$LI7(VIXCVuXNbw|8Zg9ZUPWkfHOycS$(Tem6dHn!t5;}*LRss_3>1-==yx8 zsrya^!*{Cgn_AbP$A5{0zMfkAq7XA+62&gE?)?K5Teg(Y=<0Ho;Ps!k)rjXBT@FhihVLGymTrjP=9LdK)2}dV`yl zLR2vn4*+41#B9%BFa=rYI{zl6Wz&|cD=(@$K&|Xo+lD3 z9uvc1Nt=?L-4BT&obHy;-y&TuyX*uoAFbnjGm2^Tbo7LtaTR@jH2h(h=)(*=4x+{C zcmHxyHsQu#pM4kvJnUrFH+<}@m&Ky+CETbByLZIf1_vg(K{ph6+C334+1Gm%Ev{LU z0m~;96|VS3yF>Od5+(Ag3{NU#C}h7uFZPKI$}~o`)4HN{&_FEDS+DU6fx$Z{8CklY z!ELI>h8phYYJ^Pgi|_O^J@3cJ@9RedCv3d?hXn?Lf)1$*6V?S2s8HHe_IK`9UOtju zyoN-^e|^5$2Xbm;+#kI|{mNjuW;xXSoaodk>~E(9JqkhvpqVTv-@bc)E{LK-1N&SK z^|=@d;@`f=|MpCRL!hBUqLQ&;kg|)Zk+VXXx&&d0{DPR}**hjxYd|!E z4}-U-D(I@n(Ll{$K?Ir#Sjv zwrJ!N{eKEN!@V>Vh3o_c2W48^NIc{se(^uHR*@{puAXXASf|BpvhritW|Q}7QVvxN zgtakmQUiEAH}abGkrQ0=qY6Hs)J_qtm}*j=1#QtGJlQY}12-kue38(mxUD$iN(4v* z7nhQvP|O}Eu`W9nf|)^XH?2Vk3tqjI5K0NEZ%eSC)NQ)djql^m>}5A}L=KaUF8Fyj zmU34g0mx@`Ym(m&Tdh2>tveJ-c}KepLJN#|BL@Dm#DM%loBZY(Ax=S3E-i!DK9l;>v$)$@rqO47JZl?sZl?dKk|{hE-Nbo8M(mXG;atGFA~l>Q9pv6VNS93 zmf*r1>F$SGlF*waGyYhNa7X{{av5FB5+psX#+1bzDeReo$6_jDWl`^YP+$qeM)k=Bj!zL@Aw(nMV0jnxx%r9(h3gN`F0kb%n?b*>3|i`(;=)4q z$N1P42GH#czhE@gsEPbpFjm#m`~~B*+;)g!OtRRvh|SrTQ=JY|^#EIloZpd+-ETDV z#=^p+cs7O!by?LfJ8(L#;1$RG!vdWvFzwJif`Wol&o6Fuk<6XaOnd6l<$M>QXHCII zhY_8$|1n&!Cg(~s;nj+S(#$DE{f%jZQDxEc%GYi(8-tyL9m6u!oi3ecd~AGQVB4<* zkD8Aid0I{{E=EzUxGG(DHI(KQU||)zmcqw6)myo{>&nj9f=Q_$*C%hIV0*P%ET4GV zmUWoKEiG-OO}iF`n@T1}F>Yls=1^`%$+SpdnbGP{A)XecNB31mO%6TrFIW<$WdQ|2 ztS>P@jmh(sihFo=S~?68vWSDMx3UC1dV`*DI?JIq@u{w?;OF8CW;S-uLcSVyj+tgB zJ%p`0H1G+FC^3d?&1YLST$}$!Rn5B1}%cONb%PK`&NL zI(tTo?337iEuV2reNk@AvLj?bhBuy1Gu^+f{w5?zvBOKfgnr9nU&|wJsQps_&xmWby?(Jn-`a1k z7OncTwaP9n`DY4-jD_PG-3akP;(3$Q#Z$YFu0X&#^a<(PT6&0f#QO9xPH^z zO(g$o)R9k{P33-m3CgY3?(GMT zvhnYy`w*YS)xAE_&0FBK4OEON<6KA%VbS~*Ii{aV$+gqCz;%?`p+okjF!QX{7T*E? z!m%eoM`LruMQ>Hz{&qX7TQy4h!^Erw0gmM%J82%KZW%hNsTGr_AekzYk``H(3YpUt zq6MyY%YeI-cq6gw6c=}iHjE51F1Mu zlfdf8i#z?zqP_T={Fe34Qg&Hw2ImgX3$>ux&rTUfL2o@KXHzdgG(BFjHZ@{T1_3guy_2l%Q0sGlCd=s!w$SE7!OA?LK0$Zt&<3~+V zJrj?&%IOAswc)I(c%*uyO*77>^wOSsED5{3Y8b7-DH3NA8zMMHF`!b)s#@tbmkGEa z9eK@CywrY7CA-c()YEBXjr`&|3_7yiI*IS4krj9}n%iF7&}zH}DNOW;r4ruAD4&tx zn8a*mo-aLM>MG#+K(6RwUMv(|>7LVC2PA*O>Kr1_{mSaq&@ru!NOc<3AoVJ`c44#O}0w@6s?=2a9~;0pH7Q$v3pNi081v; zm}vbso=hHRbIQZ^NeiN=m{=Z1)@CdMB;}RFrVirDc6!P-8Z{%z;?PP<1zD{=0~Etk z)r`;#oxeE?YlswK$26zxysSOELq_>4O3`+xeOs$P{-mk+^rTrfm?(_YNQIK^hV4^y`YY&=31 zVm(?QfARoy-bsX7uNp2kH9ZyAMSPrXMoW=x$DKn-pSOADz)_P8CL9SCX(xCF&~d$G z8d+b}{618vY3!7u&)D%^lnK&XJ@2eSmU9Iy)Z(mc%X8|pshY$SZ8_g#epiHbM^Bx` z%$7_F440+~ ziu`YflasBX(}(GXqeW-twnak?Hj+20*&&3_0E_+j7qsC&1cl5CL4ksTgpP`af`W|x zAB5tCpddnd`O^@RFe~WUpfU=1u?Pr9X38t-+j>`!>avPtwGJ&1#?l#e`F<^Ss}e&AXBpP~P>6gB_XZI(Gd{~NK)`R`LNqaS$wXNH%^RWtDaom1|? zukPpNzk64evy;egU5P6su-@4~+8rfW%Ts2d*P0LZ;Xve;ZMocEVdNjaMuvfSN8eng zaFJdwYj(Vti<&jqJhyZnfv&NR8Ioj#6`?aD|je4G{ zceIrc&0A(z>aR`2gBxoLdtUo;W&HeoC39C3Zh z7utR=Te)XlWFB0@(%d3Pid_pVZNoiJ0>PEeg_$TS(u;-TMNLoh?VaDg*Fb%?Fb38a zDyKUX{hnlVJ9uahNfyGyFb_p7%bo!>RM-xvyrGvT@ac$MFf}Xr;eq=mW*3AmhhZMr zd+JL+efN}!2PJ?&{zefQ{jHCVj5)2F&f|1?^~h{)q8{MA>v8!IHPfjgmG!|Y2P*rW zz0n3;&>4FbYcxYi7{}`2(;NOlv(NgCRyry$r+>@*q|*O9TCCRNJtH)f-x566evlX8Fh1aLh-ZpXqDF*v{^UbrQkW&f!l$`Zob# zO&gWFFsBne5s9jM4(#RdrS{xkXj;L|jb{cWdKDc{d8bn!6ZdW{%Yi#SI^Xv};qn!& zLD#^eVuCX&vwqETjw|I-b)DLy2xvPLtj4O6hsM?iuB4ijGUrnkSM~?LYgvj7s%av$`zsyk-G(VtIIcc;qf9__Z~k)hUxI%0 zqXXujFo<`n@A7N@Row99mgG22VF^j$Nm_ygj$OVY5WZ*JeV3?(-c2A=!LDN^{RtDj z;5f#fbi!=I7qdTezwSyD!+!nk?o`bhyxuA*JuRM>ftq-Ruh{6TNA$HSq}Ih>xTny7irZ1Wu3$=uDy_V z{(Ajj_?PCjfhkPRmn)JFa}ZCPgxzn$fUR@_9o!Rui9Pa{Bb3QV!mRtwn_&%wsO8>t zA?pXK0y%4Ne=~58F$=RP2vBxe-Yo@Qi0+frR8(cC+3lGD`8!{@vrp%P*<7DS zMoNmkLF?;m!)qBIlSlpKWz~AjrGj2l06;>;-V^fg$t16od-57QZ#KXSoNu`#nEKfy zo5M0^JwcGI`3c!?{@&tvBri0nqUmqD|-C_L{M83 z!bwDmvG(&lBF@9y7!u{ z$4QcTX5lA;v7xnrnS22ZAS>&CyCs=7YIYCn;V0cuy&rvJweq4lipckKOK;$cC4%~9 zoS}r@y&GXWZKs%At1Tr3!(696(?k0PHW3njT78VZrtfdmEIL<5@U`yJ`%6K6FuqdQ z7l^@0;cKm9-F~arQf%$$dZWH*O6dfU7b9hI!~%sJLYaM@-CR4ddvjO%T~ztMtdAU* z!%jLd5)}E5$vd`1EfEu*I`|lLdCTLz^9*zJswc0PetsgAEBvEcb#~NWrQAm^x?>oh zJjZE8)Ie6HOEHpapl}sA?HzUvqUmeTdv$iJp3~)L*#b#&HOdrN?Avq~X8Ae`v zWFP3}({@#M7brfyZpK)`+88HZ-H&CQPr&u-f4C|YJ3K0AKrqU3+-3q z=w&A)oLlbAKsFC#`~n9~#Cyx8gCS#)^c1s#bjGZWc^`XzC6z;vsq9P#F32#l+bJstPs^>KTB5BDK1+GM7w^!(l32O9{$MwCH5SdV3ZSL9#om2{%_9H!#} z2L{Gf^lQ%c6n5(i5j5hxL}sIB&~R#}-p0NFBjST4P26#bgPQM3&t6}kV^!sJ z1-5EU!wo3^Yp7tgk726XobMIbT-c|ju=H*qu9)#@l4z3H_%C~$=)s6S9KH2RJ9zXf zz7qC(<@hqj4b#160D(*=I8j_X(pSqSM7)GH?YAF`1&M`aIaw9_LubzqDp2oLYG+5{ z)6_;}fP6y8n*e2-+;m@m0365L9OiNMHHkJc&*PN#9xh7#14F_=$mqnQ+#35I|@>4*QAABlLtufFqp?hj*+9!REktXov|d| z9Wj;4jmpDdvKDt#-V@Tqfu2*&Nw;ApHD>s9={)f|^sk9N{yU|3h+e8QxuiIpkGhA& zr}|=7TfFBnM{5r1ez>O7(Qhytyya5;Q@X{6>w`b37-IL%=lz0VmR;^7-0TxefssMe z;xk}3|KW=hj7}HI?Eo=&2GF>GJOz9eQr!aBOy^(k8g$41Rg{*UYWmX+@|h!r+vWqJ z;jT0C0AEl=D*PP$rE>P?zv}gLH$(}N6<(L!l5mS#!+K+D>VkwaKD4KQ4~;*R;~DVV z^{E%;<15U_cVr)6Y^OA_Z27|i|0?Ei)XjfmU%U+;gDY~E1wN*xTl1~d>0^HG1=fJz zN%4p_l2+j0F^PqK&C*0@sQ?AKTK*%)5!;$3*Rsy3M?!D5Cjn>$RE72fD|>T<4GfV| z+IcB;A>fK6RC@BKn5n~Uj7*7jfg=G8{8e27rHyvUN^j684Pv?4za@CRiDnj_MJB#! zcQfU*B68B+()l2YJXs12m408Xx^e}k>-TH)D(2l3UI1JiZq<^JcimbDFyU+-_IiQ& z=%<`z|9rPzGjz%Y_yveIg|L`@Bl??Hj(V>8HT|dRxRex=pCx``Tv72?H8$Lk7N1yx z>mcQAdIf^G!#R z8GsmK=-OXz4mC_cHq3^Ij>&FVfP1<6mj?B4DN9WC`rbVnlNqL(UleX6V+vQ+nm+@8 z6}nW&K|G(%V@jl;&Ig^NefLXkjlfmcpp4oD>`XO04^mW){xQtH2t7lZ1qi)}6zK zUT^JQF$ejVap}sjku;_X{a+uJJm38)SDbHKBy#got#PfpQyC1^Z3BaV#1r(Qae-$>)u48Nr_cL?I02B@{zY zg|dAxKMSAa6iP9FKa+$@n+8iIQ@WR{y_sM?c^@s{6W4aDCM;9|~ zgTB}8xNuHgf46PzR(@+Vh*J`ikmFG=IKFn#HFI>uUY+^AcB*-&o=!oYFZ4Wk67J5~O-W)4|lIf%<7E+P3x%cv1wK9 zhM_G)6j-5)!EA*>^Bb7^w)m>zO1C)DHr%B zob@e7Td0Fru{O!A!-AxisLMYfq>WY;8@i;=E0DmxD<)S;9w^N<#pt8^SO#9_XQGiX zwV)#{_UBfz*~-JpmPpnCQ4iv+`6LOjmfPX0G!gNbe+4(I zTjn-W#{w%V>R@{E7!u)R?i$AbjvyI9*#tO2Tmxuc(D0j&6-F9-^}b`G`uXYbx7Up}N6SJnJqbtTq^&DO zdCffhY_450DW?zUIu{EDb`l(zl2`mbFotk%b>i{etjTsx&QI+WX7~=bJ*GXE&C8HiXp$PH-DzgTJK(RL0h)^% z-r!)J%Gr$;k|M?TriY0c0~)Dfab=U1ti7q#549|9q_a}qi+c73zph+)=n0w zOpzL!PwRqtxwmHRkKVd_ZtXg;vTt#0CLToF#V&>0Sha%L$JW7KZ0Mw>df;b3zY}VD zU!4#7sdymX%D?44KIpPR?2V|YjHK%`AP-EMuYkf>*Y~l6Y{qza*|oK!a3zBrO`x-m zXJyjxcQ{VafNX)b(wdyY zl{~Ic<`D0@QNxzv+&49d@lnFI5!WiNsl(nSiaV)0N#+{pY^`)Rl9@d>DA63L0(qzpxJwTUV0bf( z;fwvW%l_1mMMHkUB+;}X$5uUqeVkUQl+apr7Z8oKS`!$>@SRMygq7?~mAY4VXcs$eKAXv3Bw3U?+w z!aWbGCIUUIEc_bEIxT z911O{Z%h@ZmeF<+g;y(K9FOJ2c6Nb5EGcjmkYFY0t?_Yr0=LSiSlqB0q!0AJL|a-d zrpdm2WK$dPV{cnK9m6mn;$_B~Ar>4O2Kd3S zr_U(=fM-1^F}8}R{YVzz`T37jqoL_fO>!~8F#)o?ud8lKfFc+c=ZH$#`KRWn8 zCp5@4CohsA$YA0ge{lJvh`&=$D(+G{sXTL12w7~=OH1yjMa)qJ$=^&`B#htVJ2V5T z^`d2I3H^!VFs0aF*c0U9$uQ%|WwRUtj4NCHX zQY%n(K{a6E$F%8aNHD?bE2U33q+54ZDpM}{K6V9~A(6eo99v=J4SG(-ZlO=0td;}# zHJ@QUxM@zaK3WKV7yY+Jv|O3WShJYp(+GlQ1dc19u16g5YB#bVn@;^;GY>_>4utY) zc&vun7WY!#bs1j)g}A06cA#%zh7Nq25$SUt9VzSP9&hi6wY(+^ChQ01#zk zyS|MgyRVl?RFok>9*?bgk%Dt^PB-RERVUSo!>|)rNa&VW9$Eu089xsqg=^Ay*%2po zY0U}L2}ezhiQ8P&!T+&;)XAe#qRZ8ESfcHDFfy8K5lf4J&ZlO^qIwjPirn}QOwGlbH*0U}>FckG5L(kBqZm@Bc{k3ag*d4n?0gflT zCai0mEVb}g-NG`qJ!&)T7utNK$>pxohEQAt^~Pf}%Wm*@N7QDl#V8=PH9k$fFYg3mt6lt< zZ>7oLm!!o2iL2Z~(y~iKMlBIB8^P2-R4qf26BBFKShyQ@RH9lHVC`qV*|MBQHhPek zc(cC7q*)HZXRh`V@YC)vjaR`@R(B$9Ov!0L)5!xPzcJ-Z&#e9OiASriIbrZXWYd|w z#|WSPo5H|;gGZ6b#jkFiS1>=}!GOQ&g7wzZvW*p0#hg+=L`M%FU>^HU7Jx2H5VF1o_! z!+TR>YbN(5PY(4~?DZCXeB_qM*CZ#!T&=&ud6J@ca-G6sujZb(mCQ*IkZ(V)Esy%M zb|FWmsJ;e|p?xRI1mTQFiCrjp5Tdpq@AaKoN0pHr!OQjw^UDa5MgfI;sYZY2b}L33 zM5FH3_?8Q~I+}Fgn@9m70YE;W!ITa1@7h3I%jZ0ElS@a?F=P*fx4l98bI|Un5kCpT5cL!3ptDMT|h{uMzl=8Ru(r>c- zB_yLP5*0hyOZJQeI(fi9aVnSnF8uXp*rVQJkLBO!`W<)5YH#qqRIfo5Y?pR?3r_91 z|0|&zF71bdfVURbN`EwXo%`|)ZuvVIsqjNP`OQh60X&2V53gAM0)GH!)Jo=b8>`(K z`ENSEe_8EtQLfgaraG`z3{6n>ZTtKSI5b=2lBS_@#3MxhsZ6$|)+BpLEDFjq+HsBS$dSf~q z4>C3HagIFeC1{&Y|KR|Kgo;s2eQft#Xw>dacdv?5kT+j@k(MD!eLz3c=-pmW^J7(k zN>h*zZ4Z~+Hxh>ei1yzVnyBvXA=;>~4ha&N_Z-p=)(r<+AVppd72mze9j)xsl8htL zsi7P?BB5F%2#tU)h1*eUR?Vue*m38DOXod(judyJPm3B`o&RnsbuC9Mk#?mi-Iq$zP>u<+@~eaorzuKUcE5ag>N)}JN0ta&MC3wG z^75$de7^EmQf`+RQsq=B^gvtZ2MrC9DVDZc1$Ca z7YHdhIS-BN))?>aD@$qK9{9kWzbno%4~=)|vQ!SS*+~zNG#!v1KBx%M?q?Tj{ML1r zV6UKvP=y0hvrf<~8@+tD$@ESSewrAxBO7{3H+%$&b!*ofo9igfcjT1QPvBeV9mbI< zO=odTXH!rPlcT{o9UVdo|CV4cI3Q1d1rL8taG5k&D`Ru|C+$gI#@@O`L@g=La@K~i zM&!(ijG3Bp{*OTv?v3pdFZe@ziemp-^&u7SR?Yuc71(KdVo=-ZE{MsY{S#Ls3?x{* z^j)jYUtsC0Bbo6D>8cAqxp4}Dhq~Etx@lE8vx{$R!Y-T#%;c{}xv}8d7W8)j5{zjY z(e``z@F2;vh5S?O`~CeE!;dbd-(T&@E)U`1AS;`uJ%G~ZR3{QTC zwGSTWE9R%pAcUOpds`>?!qfQ|`BXb=hU-rC5983{;&X7VaU@OoY-m%X&d6AFYn|7yOZIY67NWilR5UEi$y2bJl#vIEZ!QOIW(o$u4|leQX&11RV? zBuK50e$5K=Yy}YBwrdx^;X%1~qf+*>Ea-=eu);OQi&k7J=USwSl}`Nu;XTK*IpCfn z+Bu<1!nfb7R5yht=$|0R(85q5gdpaX*gSJk10ZIX0+L#=c6?tT(6)1<58QD!cCv(; z1X+ZwL{B&8$r>bH_CM-f5WLTgzA*BD8ew% zXf)`NtCkJNoSJMd^u`o;y|ISN8OxtCHW@C z-qAUgOOxr0oEF;JTcL$b8esUcYqv$;zi2te!%dfnZx%Vj{yuutbvRl;6)h>{FOk^V z+o7YRC<**WgzntlI-<^O$qCs%Wv6JDxUC~1Ty`ao+L(NgVjEfO%}3~L#50_adWR>C z|2BePc$V*Z6g%W%fAT1{R?auMGM+B@nR4DoTdQ3|=%S~d0cXzu`ddH^SiR7F8fuB4o*cEAoPV+1C&O3pt_q*BWWw;|LSYs>= zI>rx&=8hxWg;O<#h8;OtjP!!9t!+O*cuWjL(wjoPOKi1;`CmecFwVk3%gn~T0@D?v zhC1W-DR@5#y|N9l$}s0&0%5|ee+{+)f{9> zwOzEqx}-RI&X34oT5Mw<9HM%cF_g5IYm!aO>iVPXk@OznJcx7gfoY`z>*FanSg+e$67^8 z2N4^1Pa2<#6=@0D5jP|zCCM_)03FUFkwMLtimjN0mkArsfC`jBHqBZ>nHbE#1Z;@i zNP`R{UxTd%7)RA>#MP@@t~6$)msV~(HS?)@(>~BX&^L`J30jJ!>3BeI)y!I@x5Vp3 zC^D1v`Fw6LhM;QjoRBd`uj3VpEUTdnYbhRkDOs_OQxGb;48f@8RG|ht;rM6+-@#x` z%s-eJ{X6)#FOB*~5Owz#~N0B%oI7VR(58(x;t-RtJ*7LQU6y|pE_{fZ!AW=(V z!_ZzlbF%N+nLwNjhccy%xX_O3&phXTq{4qbGR`QS2T+Ull~F#Zw!bkVW>r_b7Z};r z9G&4C=j3jG2N;D4HJoP{$3U>E8CldzX*6X;k+HIH2A78Q9k;tknNahAJ%Pq7m@4LE z$&Uq8kqMcM(0`R-4+(cE%j3EM`rGevoEoR8pZS+pa#%=9}@Y-ERAu9Ce(_GNqK?w8Am?0AU?xRhz%rgPRiIr zm{QQeoJGlm+Ki?tLo34#A+DE~ofzjD*?l`^ z3W=f-?-s@w$7R|kXB_3$66K8nG2ybHQYpt)FlpAlBc9aX!A{mS;RfFsMa*o>f{70d z&;?0`X0d=vFB+QHi@5rY_4=Vvze1I+(z-*~d&0^S-ovOrq`pb9Ut91c#v?vVC+hT8-u2z6QhPjYlm{;;v`n+nu3623h|9M4i%HQ+yM-n;fesMAMB&PvNVaP zxr)r51#Xspnk-N`NPt>M=fb`#aIa*aV|7y?Mgb12O`9HB94)PT5wEpsb zwmmm4#q?i0#&Z1bU`kLMLfwjcWP+24l!bAlge0x>;xbs=unqldmPc7S8tjSP|)F;NLJY1QDM1T zAgNjn(QQH1?Idozaf-@4!8TyrCq=na@ZZIlDN50qpJ{mahxzIT-2v(A@MZR9eyxf2 zBbz)f1*Wp9g*h=wlrz7pv_mDEU%p8qbuwY&Xm5T~mG}DRj>o9D4VwaeccuFNDB|tb zgvf?ncgL+engW|_`5qVSbExY4lt@vUe!EbP1`Hvu(HaYLm`@p1rn*BV@?Mpv>#F6| z8{McV@Tkq0!OB{P8HxNE05Y0!rdIX7--WWR;c^?@Y5E>+wiJ3Wt2Jl?bF&=D;HCAe-A#hIT*urrWF0fMr{={g5E1ni;J7bU6QGc z=Le5fX%B5_qTmAto@%l;X9;_~#pO43e)JVs<)h~2~WVEEQDkqJqI7?t!{}u z^{pQYK}(AQiD4N$=K_rK=bky+n`_(0Y-*URaqKSGZ4XbX4dfYMZ2Txj#K1C+m_;WbA}KTdXw+h{ga(wk2}-RHd+!fj7Kp%@1JoZIqL6 zpRn@tqEQ%Sitp1*hB-lmuoxsb2YC{_-2q2XCM&C^T?+J&j!C9v{bAbOSR_lFdALU3 zP>u|&kca7+x2R&GoZ+$NZ&JoUA4ZEc^51||JpQfX_1(Wb6K-&?h84*NpB6}PqpgZ_ z+0gw(zu8`5%shn8UTgb~ozt1SOt<8#H8;&S1z+326;E4wQ0m4*!hTrgcvGW-mW$ap zr_{Hh@=o5VXZm41qOWbvBR25mCvi7$dN5e1&xh-q8FaNSUBeMGYkvCc2=qH7IMewDQzy6Kg#p9zQ9iPCB&seBx zIp;?f_Z{mQFcj0Eh=N=zatpzx!MZG%!)0rPsADjWnIx4ko^d(2R?p%NF`B712c1bi z493U5MeL**my$N5w^^+GWLPxwI!43M5!X+goi47?U`TXC%(>Ie?4#*l#?h@<{bi-Dk4s7h>!HNg8yhek~(m)AgcAy6~CL_DGk!o$g=t z-9`6`2Xf~+iK57`Nvbo&xQpIW0*(KXa0!9wNw+R32${wsk?We6vY|pX%86nOcZ}{D z4II#7ASUz33|Pq5dX|^rl*}5_bo5;kxh3QjF2ms!Wtx|UDMK*1ojXcpE|J5D(=%N= zC&qf1<8z6`ChDnI{&jFk*GCC!wf=CRiIJZO~D{&pU)w$wUL)*vg5_qn# zxV-m;FtIqjn}a~?ve(_)s8$swbrgD(;3>7|9*M2qdTUbDpN}83 z%=2(1y=|iC+w5`jb_}FL3ZnZiXUbR7E~Y5Jqpk$I;U{Pb!?#}?MCg}CM=S&K`@bo9 zp)K=$8dcNPuJDD`MAvki=J1Y=G$#bdv@}AOZz)mqA|ezwtU@i@Qbw|%NHhY}7lalLX%Z)5(u>k59taqaA3XBh)p`hi(gf0B zx|uLSl2k`AXv!YNUFocTx3X#f#a&aGr(e}3$CS1&58eMKFSl%d!6pNJ$4tep z99|MbLeCGU9B2Wq;Af3Ww4801phj_CJZC|n!(+-{gEAu8Hke$Ln6^ss?RQmA8KRdo z?&}(qUmIbAv?c|8t9(tuJDub;rb!xN*Rm_LMd=#XK zFEj8)Vuv>6Y&S>fxC*B`uzj??O`P_*<$ouY|1#>BPsZe?g5nsF!;qoao$cNRs9sf8 zl|IV;GKWx#*hAS3!&B)!wbz%krjEMhZslc~`Nc>cE>vJhn;Jmxi2}>BpZasTB92(G zX)9vOk*=7ZdpzMbu@=|D6aO ztSyYkRrq225f#k={M6~G(P-vSi9j2Qh?dx^rtpNXRJ2V_@^W%_R(Ld2VE^t>smTk5 z7nIY^_UC>d1z*!v8D$Y^UIivP?cnEiBzey4^oUZU(bf?qZFwGsRc0cs<>kMqxSvHG zbI$<6q5Bc1$X}n81X*B)(=!}}47;hxZ%(9^D<8LyXHq2N61ue1f?$fJ;twF zAc7L_Rlky))8l%+9%gaukAqu&JjspG3{LKwaS9hQJR_-dATC|uJ-|-wDqJk|Kf`v4X03YN@%Z_oR|$FBLCI*4Y?Cm_+Q4-7$a{W#6jsBw3}+fz z#DIMxZOz5QvTyxq}Eg@ERa3$fbaC7qwfyR7_}3Iu5vb;agrTOg7i_dNei zQXqZemCy2L}7$2wb+($fwxJTR|?5@xrFQbAtJJT^c~R@vWiF_UIP7_xGyY! zAo&scgWM;vKy$pHTdoW7K08|f*}tT^rjm>unjUPq6p1nAhbWCx;=J$P19r<4^$Q(# za2Ew2!xuf`N$4bWQ(GF+WPQ^@l&V_en1EOLrnAe6Z;uJO(F4$N$qKStPzu>^rO^9; z`PF`M?;Tog!42Ev#lmNjE4gaTxR~~&7>WLbM=0KPx?a$g_h+@l6^$C&yIslQc#ql9 zYofXMDk#~IRY=r0Sb%0+yxnrUs!#4z7;34?U1ec+Y}23WahK}r#2o>xQYOA~FdasJ zsif#pzN`YQtx@({a~h?izn)L;{rCQtnES{eT`Rx)#c0pMV>+)%Zk3-9@RNMaRVXn} z03q0o1SyNHw{H!(48J!yYc~B4QZt?Fq}dK*m~ylVZA5I%@4@)RRs48V@EMpdlHE%r zdc+frl8h6ZlLQzoiQ$qaqtN@MNSMDDt*EEvOX!R^`i|}xKB2OzIHl%?US^S@CS&y4 z)hpKmAF|=2sMW;~lKUmy@=BicG!JGh*S58}I+0YJgyUPU8CesbC|U7{YcRpVPtwur8UX91e)Hq+0afuJ;iO)uij#| zMW%!r0UP6 za;uaDAH_tP5souhYnb9PYla!WbvU4usLv0hWDx8+5$18y_e7|Dq_Smn%l&$2i)~v> z_0}SwnL~GKz``kE)(r0>geFyTnr5J!a^(+AQ(@#lNVJaI4`iE-{;1azKANE2v5NGR zHbV%?^_VY1K8XMuq2c){6k)Jpm)*!s3kkArE`pM@+yo%^FWDk$?D}F)cI~-$_GrD-c(B*|9(;!_~%7C}`_&caqQ0IaO&8nJD(*$?(q9$rPDGQ1k~ zb2XhB_IkZolaVtkhY$Wnhz-{m`__;u=1?&nq`w=9qwGhBCDAy;zpi-5OdQJROLWk$aT?>O;iSpiuw%9ny zvR-vVGB+8u9}(s?kzU%2*~Er{25IWwSjlcgf7E>ph(M;ux#?)F1Pu{ zZbDh;RHS5FeOlv8MX}(_=OEc_g>jclWys%GzN2{SUZg_`{8Eu=C&PanKZ;Y6w&KiwK7WSi%02`14#LKQ+$CC4-DGP~d#cEdFb(@XNK>8x`c?he1N=$btwzD%1e~#_Xw6`JLPf9fsvHv6nKUtZZ{V&ucq6Ab>1af{nRPi0a<*+vQW*HR?b zeR~uA!3Ocpu2gnqTaxnXAH>A#^l4_GSgFOvfruL_b(7cmxn&mgT|7t*;XBcpH}3k=>N() z71?FiZ4*qB1MeN14?+R+7W3Okdlk3}EBnDG3|EsUg(NCc;>%gSQxfNFnC4J}`b5bl zHwu|4qesZS;n@As)|(QC+jwy`;0DV?5A>SI=wngiAE_f;X%a)X!hvt~ACs~E4tS}Y zTOmS3&91Vq=tgd7YI67-xJ5Npip&!G?eUP7DL4Z1;qaLvPEJ*QUIAYiIb8 zo9#$#QtQFY$jzUXHs6cVwu!<% zPtWMAjdEoVN2=L6_|Iz_a106H(oRvRq1Jw%{^&eVvq_R??MN!0mlk1hy!52GEA5_U3w=UkfCZ&$9rr8<#E6JC zr;c-$DTODlLYUN!g$M@ZdPW)c<8+aj)Oy58USKq0D6Z%;U_#a&-C>WMxo8>JI{^9Z z-)ZKlHSDgQ9@x&;K=(iS(g~08)FHaaC>O2HYB!&s0U6UKR~o71VQ+#2A5c}s42OU| z`rq1%g+o3Jr?Kh(xFw@C?~@2g08V(Nd$;Y5wpEI3&Fs+P4HW`?efS!2cr_zq6n1h$ zG~^r-NZ&}24^?xwRwaDqS|pq5%6jG)p_lv%%3> zNK(~fUa#;+2iNT=A;xc?-+ETrfvVt~e%#%KjL!g0_L`#lkdh-soc7>e{fKA4$4VE1 zr5CS(6rWR!WhkpVar@<~h_qJXjbOpePffL$r!L{);V>)L`v~MYqklEX$z#s|p#%{e zlLQw}u$`?H{al#5>B>eAW|OGYl+m}Z?+&NQd)S9}XhlXPgIOPn{Dz;@m??nby}{m6 ziTv1z0H@yLAp`D2n|9m)ruzM~OH(zv7Q$4xj(!pU3*1<1ewwxfOoG|n&0Zpv&D{|W z)ug;u;csT41{sm0t&G`kH6zgFH9bR87xE7&g(&+b5+%59K0%QMR&4w{E(t=+Llvyp zIQb@i5D8ld<-d7{aJ;4}KnhBiJ(ziO)&Rq_Wuwj08NC)Z=MrQFUkYMiNd(3pP)^x2 z*ajHzA99IL*xK2T%)oNj>DUz4v~$Z3@v2gs5Q9GuUN$Gg;4?N4@S9xJGa5NhE!JGx z>0AVPiRPf-_kWssi+f)7<>U7WxTxf)M_62$&gnSuIUGctBHC1eSNwbbsPdhfdb3X~ zIc_oi5=`D^*W)J8rIq_%qC0uf?%^SPBT5*T&Mcez>qb}SX138%%5gcT8an3_*eiGC z2oiN4mg*xVoq7`(tP=RY!i>?(H42UdbD@sIJV}<#`MmM<2`G8KA(2PC=Bb6dBx||3 zcJYa+=D6tiY!1c-bDsI*$c`za4&ZU#=>(CHMLs+U$G_Qsr;zLXBqmso)*P%w2m52l z=e@8R8~T21enGp*6Xj3%(jy*{T;uyWIClI4ELs#l%4UU)myimhL&j*|rh$N9Bkidb z?7~M*l)~c{V=GxaG$N4(iP_1Uh|J}3!%e!2o>H?Hqu-X1O8)h(vKN_ED?ABlt-!=k zB5uAB@jVWCW-jrJCzoo7E7ODM2(snJZ_KK!ozI-YfX8NR`0c@Svxj)y9Ojo z?-@{-QZ(69yFPdadZ)Oq8`5i#P~+asrJ#uRVQisCOF<|p(ak-}#Nn>j097i6kNcGo zs{gG(+O=-Y#0+y8%%}I5(g;CK)5K42MnRAE%JY-JEi9Q^X_@SovnQ=|Ul~35r_s4& z@z1Ce@YjA^s?G+loD|Xbh+>GHd++2Cc@}-q@sP2U+1Q+?Q466P0SjUDZudcX$z-p@ zSkIZdXMo$JfJA_P4BpU&WGtalz8(?6E#IgrKhnf8Un+GZCdd4f{?y594U0l}tdluS zlbSe`76x$P_@j1Q+$;sODt z>EeNekrgv6bOK%oE9}Q{pbI`=jGi2h44akU4ad+MVsIqmPt|c6z8@<=5Wme(wiOO9c;^v!H8onKC4&?Gqv9wa!5Io6~~Ftv2zU~&n4z}tt$ zw9}1$Ez8yu9wZ$D{ycQeOLpMY)A7~#P(fvfO&Fby{(4z{W?AI zL7tMVbi+^O&;=1oMlV3Jpze_jA(fi9+5&mj+ z$#0t!cchOcUHrTrRKpU2yh)sEgJ~>P$Y(*jVr)$PI!=ZAWDfEr%UoUG`7{_5OoYvI zG$0_^dbK>Cyq#8q9U`i`kF`K_i}Vb;cKvo7Pta%f?Dvi?xf{;Jf8SMpFebI_x_*jDg>Je#8du6)ig+;^f7c0|&8%f;mAtjgwi}Sr`}F3*&|ebqZxu>H)txK!GcoK_ zcbn!yG6;rlR3Q#xpzKF{Z-{o5Pm5%xaOKkR6V+0aO#>c@?!QHCrUr>N0#)GVeHz?y zX~PG0g#hlol^GeKu3>{hgPmP?#^|!1ylkm8RrYTxt9RIE3CB|M7@jT$oM2+$H0aQON$KRBcc~;HJS0k>49J)J;1znSb9n$zaBtntU*4JI3?mdA0hP zuk}m%h{?M$WGP73kWYeS`7SUVc};KdPcbuON<9?u5Uy31c>k`}R=I;g=hAND?Oh7rSmw9=_gi+W$ikg@P0lM6UZXenLB>vWrMZg!82;uMlSq;~%> zy*gsP;VkVu=26if{$P}sen9d)zJfVW4IJ=#pRz|>#S2#s&SsarSNQdh{6b+@7d}7B zP(z%5Qqi2twe_CZK;MD4U^T%}{}DpYTqu#E*vNW2lgCJKM&dzx_JFht&8}>6L}Nnl zLs5^0sqQ!fQZ3!zq6n4d0!1KERGOI|O|eR7Z}wBo2Z@4j7x*H36~Tr!hx;;ad-sQx zOvjB&7#;s8?A<~&pA>s}1CqFM{DYnSHWforcXie9YQ`LDnII)8a*dpdDnpAGsRrfV z%CD0e{OzNC-oqN#M(44-*C3MifIk)>bo)GYv8^8$%0;N`V-!h4+SwCk57Ylv(56xZ zTb7Y;Oe+H()OD=k)S`HPn?KvNtX}ENpBT0}hNC+K*M=|O61W}Q1i!m;dwN&B*x4#e z7tM1jwc+;2krdKBhz~S2%{Z3Mn4d+eXQFkF)vsknlkWxfx9c;>4a`EC8KItRyoE0- z8HUv$LKrCSjj@0(B=Zi-K_&mGhh|PK%U67idDBaY(VInfAsaZR6BT0j>C98Hn>bWc zKt@x3B?ZugGu$<7&DK4FW1pr<_Fn%nViEa>!Y?4>S zsmyLaUcWt(O5Y!=v%bKk6_x~eUVHiZ+?A!hB46P`$GO3fX7X^novv5>>=i4Pf=RV; zb;RqQ(YUQRU2ISJXKXypc$@}32nQZZ|U%rPu~uEylt^I28Vk4aq!ko|jxoh}eM(Orh3$%7D>M--i3Y6FhXO<73OXqO z{(unO@JDm%`EO3XTYCyJ)C}He`2!}as9orB1(03CnM*SMAsIP}ckcMj$Ws9iP}^5m z-T8GWd2!G5huRW*7D%%2x)`5wq-;X?9Lc0?dsRV3-k0}5B1=Ei&1CbK=0Bn&bVhBcnC16_jN>oI{1wZXzcCVuH%O z*803M-JpD!bLI z8=3c|ZB&-JteJ^b!;dFi7Y^HZ6-aedc2b$~RU{`Z24AMtGcPC0Q$j>zb;g+4rO8OM zFsY+2Adf6@EJYe9RI*YFt|}*WJt-?S#&LL*#~c|h@PNNf7R<6n$`s)8GTELm~Whd_?rTM?TkW8v5RrS9Xak~hwxkUMBS`U zA@DmVKm$u3k85j#C?Di4M&YoOq0gj-J=k2`#G*#Yy;Zp%e*`_qnh(g<^s3;ez;DH< zXp!5oq8pDK6P{P>Y!4yZ>mBQk@t;+YLHjZx@ zS#HSR>8zQdF8Q(wdJyr@_qehr5!eZ^7-ojA5# znb>!_E#c<_jF?$#uu>Ev^}pv$3z9*VL#qmnYxo_D3_85?5w zBdN5Lx4NyCbxvH)!^!{?i9k&*LYl zm~d+=vXQ)B`2L(`$1_|>Qr|DD)LOk6?S_RgG59aR!YhI^SWyPVRSzh(rfI^50ahdE zgMATv!-Y&eK6hj}Ha?hTjay4?_HTq`i*T84)y0sblO|7rH6l zhWdc3(bOAzF84!$Y0%61h0#U5W8dR9G}G5ZCVsNTvROEF)izMYp!?ezFF?-K@9p{m z7S~trz~722JqQ}FsFTC-_E8W+UeoVhPAw`YMCYJP4^p2{jYy?G^^ZVnk626slII*0 z;9u=1qV9K8@~9L;J2R`PSsDW89qYy#-yzjz$>g2yviCzuEF%ClC)9!jBb6N-ZIKFpbO^u;Z{*Y3MHg((dkP?Ld@k73t=hki5F6ty$aPGQ}GkFV;Q2TIOlWPgd{{g-N zAKtD~`O4jA!30n4Y-#$LE!n1Ne5jejU*dT}C%Hhigw{Su|5MUOU1sl{Zd0@Ah{jFY zuu4c4{;QW~FBY3SDnMwa7too3M@8zf-(>ET*nb>CM1P%`OJ8#S2kv~8DBDbFr#iVt znhoqL`Ao5^8nIS&U;lB(NUKRf2XOQm$~HoHLkMud+~g+1hY5OsPb#YCZamGveqGPM z?b^$aJh~G3PeNYp(u(Iy2mr6gimb(g)tM}Iew&)Q6z>jYE(rE*oKP?pyfjQ*d+DH? z^0>O-g6mFdb-H{)`U}`xm@(fzABVTl6KU|v6Ty2KR&36;*R1X^8p}YN{}v@ZT?9fq z*WX}DLp`FuD|vhdYPRW+rnWv*GT!5w=s0aAF8$3aOvhGxpFp1lI9{)!U{b1REJgDx z>0Mbu@C33lCrlQImvs-C{<_y4;C7Ta zZJd(kl{)3cE)2TQjFw&=p);cszemDTEY`l|Ix7y3RQMfJx8mIHxh&e9Rvnz@DLlUlKy!3EpR zLvIJV5Yxp(n;(e9j%<(IPyOecVBh$gw+l+}U}_FP?++xe(}~eo@G-+^tcbssC1$-a zZ^s4l83CW%2YE~kA%gx;CUcLr5jvo=!{4kMTBA#q_N$X*!>XJPUsD@bHQL3dROvPX zuQ0vuC3jgWCU81q%L;g(wHqK|(vxE(NL+aL!${3YiuZ>f*9uVSBjC1+#ZT!ijm7w0 zaWTRF01o~40cp!Zea_b3w_-?P#7pt|j^E_Lkphgtmxoa$jNW5(g7*YBQKR=tl4o7) zU$E>E3a%G!_`S|q6OB%m(~`D&c+WUt2>V%l2!f{n>?bX=Dq6jWmuHWu1<5yHXBh?5 z3i{tp7XYOlygdV?QsqyJ#3RXFa^=P(F$|8u(eSx&gn~&-otw?=lE~=3=Yw}FN3a9J z0?e3|Kxpo73!rN?n+g|8bV*st2^gt-dKtA^O>v|o2N^Ip0;Jcj-By30JI)c9O#e*Q zSq4$N>xIZcXCR(#X8L|~dwV6B$Z~#%?>+0+=JeCC+Cs+D)WJYcHhFHId3=5R5m(sS zQ}Q*|o7HU>Y4C;mz|8$LD#Na_FHIHy`A**wgp9R{gEZsX2Oe0JavI;VsO8+?$aecU zTsnduA3i}Q(2@{5r~10LLaHo`YMRonmF=oS$KkPaMhTQJ^L|_1Hwu1>cKOIncP8TZ zYuW5mpgeP@&6Xgvsvzldw@gTUzPjI}qj^yLtWfol*!hve5T3@Dw*tI3o;h6aRYt%} zGh4Jxogxgh$p`6$#hVT#w_>HlSe_c6@YLNm`PmTY+0PLYoRaiBwJP~TQXFP`B_h!w z@XhR9k494p6NGD6OZ#8%$0hdGl3RaEYj)|WLDyc{V|>HUathFuChuaCp`eBNO8j z>T9^hZ)9ImQFvS;jtN$W>Hr5;lBZ@V|BbflhMykV+)Fu5WajOrwWAHml=7Z>Vj9}- zOtFDE=4|%rk+$-ej3yKqpIU!nX;?*JL8Z#K4JMC`{ax2nAeO7hBC+qRbZw!Hi%+L; zo&!ZnH@>qqT7*g^m=S_0t%NK3Q$*ZB_u_2@cVWJ`tN0pww~KNQM?7*Yo%(bzCJq(Tc2&1?+Ck2?vcE;A6ee6*D%$xxcgz(S5OAeTjpe^9+OE znf=0r+3(;#uhkTxuJR=w1VZV*JKq|KZ3ch$=-Xh+zXA_uyRQ)k`H2Dj+3JMw*bW`( zPj@ZN@qB4e3o_QB5JO%t{hTWG9Ilr9L0PU&qgC8H=tx}1UBph`!SOVb#p2#Eio;*( zABZ*PrI+-_X`GS2xHOZpk}q1MYLF( z!&XjgP01LQ-+kdD>OINRv29p8J-#ZJEo8OvKr$WmuBmCKdlRuH#CPgZL3v@h!kfIq zEckhA@;^Wta_w#CHSwd%{{Z;ojRDp2F$2WRw+mdn{uuJuaUj`n3Fa=zCFDzM!i8Gi1QH)Sd+sr{SwN zZ|Sks`nEk`loCHQa3dB+u3Ezi5+$0Rb&k(o_`DH0-=a=Uo@3QIcxGI_EK;8HOzt>R zcTV+z_`zFg$KpA=3PbkM!oOw^SG{=l zCnp(IGxE1FsdM0lxAHDONQ&n)^1TI2P)43N%YE-()K0$Ncq4OsL^tVUc`KdVGo*wu zzQbFxJ*Q4x0Qq8xZMx4MB4HY?+3=ouhbxb;uc91rwxuTM+bXW_@V6Aevq2J)dnKNm zV?WGWo$HA;`)PVwlax5peoZM=*{X4Jt;PleOlUaW?GHcMJHJ(8=mlB6n2c#XGZBgB zawr2HpR4ln6&3#R$jvTFQ9icyl&CkfI6kNMt9<3M6fU&!mlN2Bhk!$32{O$Yl-yT4)D37G?HuQL(ISCQ}cNwR9=!qzi z&#}^jA*K;*G6n*4lw~tdvcFP%@FWcT*QlB{r@KC8~-&Lh0^lipMSxM4U zAud*_hO=rM4XPtivF+FVX!8#rd&0!8`|dF&r$Afm^Y?BR=wI{I3JH$nIwq9J-A_ro zFpAg%*>(CHPkcq>OSrfsrY3(PDFtTy%AERg7k2Mu)!*x#XCITSc)V_jNj9ogh9o?C zIkL%$3it$ag{#>bbDVnLrlOJ!hwcAW9%vN~Ewh)%`1CC+$%!iFKR}*xAtEL7K1_+K z@>SAI+b^y@{MyvBcZ`%_krfhqhvGugsvrAuCXMkP)e!}y1B0I>{;`2*#=l!|rvCyf z5yvvF&^Uhg{01uTTQtkyOwxJmeJW;#9@=QibpDKq478Y+aE%+LOlKaxl;5B~Ot`;S z6$T!TlK4Pa*kY3S7&;k$<)0CS0z*i2?LhTBeP}^YjCv}8xr0k5ocb_eQPFolLi9_$Ki5Nk$a|(##6+Ko2yX-$ zil((o0^_4^ZzoHL8je1q5?j#%qQ23FQpqIiD32|{QMtWMm5MZ$!hQ>;JTsYzPp`6h z>cdRc;&PMQT&G_hih8|((CGNaQPy*RrmReK&R|W#F+D9VtY+j-TSO~!b60K~DoN{r zP8Ar^_P$E7DGEB9sSsw3^%P(0n52?pX$+VaPQ689MA#9z5%c)#Y2E4ns1_X;{eIBv z=q|pZQ9LbC7BtV2q8Y2@4HdVX&|%F)c<0jdvR~8$dboXWE|+(&%IxhZXqehGKnr9` zp>AOy{w#|qlc2|14Ib@TqC22=R8G`ni-A2iv3L=zG|EL2#d`z%A?2v7C8|?MN(p6< zVhgFhCukGlR?UestQ4eEKNQ#3#GSEN={=*2mZx>QDeyw**M!@HUxM?9gJf1J#u7;C z6S`jTL#r%q%beniG2jz*{rmZXUj`nf`uIL&y5Kj_C#$`q%0VSsF0Fh`yqUA^XOPGt z%3nI#Cq%`rv&k*EK4EJ-N}GVPHz(d#XDav|!QX9!z-$LLBQ@6#vIlRHim~hW`xUvB z3@YDX+$1IVZwajyg<0#=nwY#9&bk*B$jfK8bRb3f?NLKT{T0oWvYE{tT%*pPyTyDl z=*V@jXDS^ktvjJoswaSz@kP;h(D{DJVaCXSM0xi;qr{~q;}?`UxI~O0=X86;Y7|8} zWSitMZ>nFs<~-u7ORSt2M zM?P6!XxH$e67PVTROhs(8LJ!0bU=i_j9ct3qJs4)d}#68j(K#sl&tz~m^1zX%zpsG zj1I$5jFn7|fxp6Vp1UXsmKE{M5m$;dtNF72O^z6pu|fD{X&Js=B~@KF+w~s+EqF=2 zfN_iLgDNOSr|{_>>GJ4JiQmjmX4i0#dbFrjb;AYllHHY3Nz{{Vu?ZDWnF*P_a>RiI zFOyWdtr!z^yM9BS&(VgscEp*Jy(YrF1StRTLbEVfXD&-Rivxp1DR$&s#IRT%rETZi3-bQW)r-&%EQ7R+l>Q=t+xgvx;&!}y1#T}z#ly1 z7iK!bs4aAFlnU?y2H?s$ItTt8Og&6S{PlhUdC{`cj;ebvxV9ILgatiRd5vUxR2vcl z_EzoV{|bxKrcbMJ?md0a2;c#!Iy(6g zSIWX{TymREQrBMJ5Cv63bn@?#I!HdZp^={;{i)qz++#J#YQJ-KV~b-cXcjoPSvC{8 zyl|1;eeo z67F@#qp_40j7bZYTbHz@Q)c1e=(_##!J*rM{}j=`-FVSOAhB=A!zt73cWx^24yG1i zs9Y+N$PTgu!2=%*@_-L;NI!`Y&M1-l1e)mBk`40?sRzTSAAuG;`_GmCRLP#+oEy)nI$rGdaT$1=pYt60} zqfc8)q(@~59^CkKcj1f&)|gS#L)T1Oy(la?!uyR@F)~Rqk&CD!q`NAqa~;azOME-S zo+F9j(%P^@M%~tRG-FLN+$*jOyjWz5lBG?#qE@}P=qO0fsrJewQSB6dq+7kAE9i52(tw;Yu z$%l;75{lAY*y^@Af4UfnTLrV#ZA77s59zS^b&~lOS5Uh#@w?NXMvh|{4_jXURaO|2 zyS-bqjwR$jOY6+9lQMGQO!C^UlYFm#!%01%C_O}HeNauxNKU_+YdN9Wt&Za;mRWDZ zNQI&A7RU&j_2eax_{DREwj;L00xP8WM#^|XGTCjKJHx~Az{_ojQUiOqy0C%7Vxt92 zvX9J87Y>8DIgEgNkjPF8*e1`{1SK}1W^ZgoVt_Yh2L7BV?%NVlFECp&diazxe@wun z+^wYVmAHvIpIzc%4MTayZ#^6C&=f;8w=d(BdU)KMg=T3F5wiz=^>BR&QA>h~eL-7C zb*{B*4ECiwJW!#n#;C`L(2}qt?v0S1u>q}Mkz1a;LMrQXOYAoe&IKazN!_09hI^zH z$YbkK)hn^pq{x&drXfgh!R?x6>@}263RjX!m;S=M6d@^Caox~%z2IbIB|~f@ga1CX zo)2=5ZX9Zj;Zv}4f*wrA#W)Un8g~_|@Y1J(D^ka8>(ku5TK=4BjiW`Ea;v*rBpWKgA%Ccto{6YCQ6(!BcbFp zZa8JI_?mrppLJJF#9?1xx3*65GG4hbBDRdtD5qweuINkDpxQ?n^mPhkftv8L|Hk=5 za@Q@k3`Mtu%B7wpE??iy)cNGmMA!9cEn4R;AwxedDVALtN7`SLw2N;ukAEGox~5*R zGghRgM#yCV2R!Blryh02)fq#V=T{~HuT7@CG4|4iu{^vTO)+X}qAJ7AVmvxJCAXm$ z)U>Cbq7%cKG@`>g`Saw=B__xnF(}3M8Ol0Q^d;}-q=op`@%8OD-=%GTF#e@`2+^My zNe;6{mGaQis<1gCOcSaO3y*wUOkhBmrHMh4rw$j=Et)ukF}E{Uy!GyY2>Nr3)S?-zLN%VLWjrig+A}(8 zyh^Mh9)4AwaR!ICMQzttz~-Il51IE$k1i*mS81WZU*|Z6{{V~W;@YJlJP@`3y&2#B z(DbFOhxMlNdi3T=R-RJdaz>LpR;0Qf<8LO~e{{%AAw1QiITfxJw0B=SM`&EZ{w*?7 zxhWch_I`mG>87qHuvalcX}k5vjt(#lP#u7r^MRU)aHRWSE|&*wVkF$&*tjM-bJ)B- zE;(Pdg}WpTAiRg5i?$i^)yQN60hPa6id1cFyC<2ZFL3~SdGbb zYkXqhjJ(z;TJ^?of-GS2b6k4cG|&N#exJ>^Fv_-R`k3PP_1BQ+2ztvXc3A`|(Y}c~ zpHwiq23g@XIpdv3Cbp01>n(Q)FQ54_s#*f7b5S2tSF21j^HjOskBacBRc_fZc($c_ zMoip;9GsK#SYF2mC3L0M6Wh_O)U>ERsmF}nuo@mA0y|d$)#pLZW(irLI(ef53Hii@ z2b65WYML~^t^W}9Rn0ZJPrY?Y6}p;*gm^@FqL7|#h65hgOQ?<9m8c)lZ*z@m>*TI` zcd}@NG(JrgDlcUT?5Hmuqemzc8y>RqKN=IRqM7xU+nZw0qs1JcjrE2j1tB-c>a@YM zW(}>L3%!=AnLglj&{qv8cl>j%kC~vfMfUb{Bri@T75T3qN@y$S+Wa9idYXDGGsUSZFas0`%Ar+_w=68#$)UP#2)6xBx{o57(?K)jIKZO zKGj@tVDQ4O zqYEcy)?-&usnw z=m`JQ;r$OD;s4PQ{%4cSw~J)NuHBTD_iJ z*?20aYihJib^c&wWHnFGcHT8GT<$(tbA0M#Uy85N2F?R;*QR@i@4u_PPY7 zk-K22`i6x6Py%@2(YBdtLRS{8=d=C7&k~K40E;uN_|`!0$T-n%x|cpS3o;NRcUj-u zV_+!`R?7-k;iMv?VNF#Tf0Te)>)wFMS`I$z&8Df=;esuE;J5(=Yc6cKya6!J- zZ6T6R<^i+UOd?h3tPl0RL;|a>TQjjP9BWXVCXk|N-`}8EohC-hiJX~tMo3V>9_Rct zlB#aXg0~bd_=ibbHG2b`>l|J2Jk3J02E|;KM?9XEl-5v@-lbC;!Qs)7&=B8#w|Aq$ z`SL_DCCgbXKABJa=SxVNZ+pA&rrW#=Og+c?jpQ0&UQGCzGOJE&F~XbabeG{-y#)#V z*hiQ3;c1{TO!mS-oqL!x$5W^vMXvoqG7cdSd*vKCn_TJ*si88A^KVp*eK7()Vwh=y z*=JltHM&vVv1lB<m|{bOd8|8RvN6> zhi<|mkU-G}EFt9~6h(f9RFd30mQ8W4XSaBIW%HVes`M4wu=rAv7-W*3+CF^OoVz0* zVH|~&`tVAuj8%H&Y7Azzd5yQcoG3-4CAd#3Dwj26`AT*VO#<}+pEiY5dEl2Yy|IjctU!VI zIMMc7AYn-lI``|u2s1i@gV>b5@GZi6mJjPvgt1lciq9^qTzgtET!_6- zn;?Yqy%;VK9EK~veY;4?jCU+GbB{7KF*CmVmZ0SpOP1+=4=I8p*(W~3&r+m{5X36# zJE0M*Tq0i_Og0r44(X)8!Ogr=(9LfC0v3(VyCD@NzcKYY?PHv@cLMdt4x5$<mxg`C zMV2mB+OpKh9 zhrqSldj6A*p%=8_7LDcy`H=Cab4QRCS&9@52>dm}t^=1U1IX=hx;MmRQ-UcM0Ms$M z8sG9$n(G;3@=4}S_^1tLq8x4fX`(;QOT1kzjbtPv0LwIexDWB$cBQA%i|Hcc_BmAKmj(O&Kt{SEjChIlB} zT}G?Is$raz#F`hT-~$;nX5i#a0`RteP&>~Djf0-m*X5h{%t94(E|aUh!{rv!HsrAW zQf3;R)1c>ubzpi)`PlC`U4kZ>BhWuT9r9a&sv=to7OrBt3sq35)haHqo7D5{sWAA! zUcu9w5|`HN%S?lHiyz#E?!^na82%(ME=`ZF@h9^IY3Q)`3YG)7_&5^LH?)5>?*h|P znv!W-d2b$$*TU-Nsw>ZS1^a)cqJkxEPwu*W+<5_2EetnL-2}Sb;ko7;skf^xM`H(d z&m&XOgsS>jP#t6;@7LD_1~^EWc7M&T5LC=te$sLp)&%a zMB^=<8$#|Z0Dnv9@36{|Q>CW?WQ5YxPA7`e27aXQe4`ilos+dy{+LRaC-rx>n=#9F zT(gIgaDwx79az6kt>cL6+BCB}B}Tw))>qhoYGHQ-00a3BYg0S^=J}$xJ zIPMUoM(+0KG0ga`u0ai-sT@(vQ(B2|7gJX&e_5*>vRBi%o5_B|_VWqQT(L@*YIA8< zK)77eAi?xHPP$u}+TsQ2SVrNJy6F#Vjb%7%YW9w{dH&;t6~S`tR65CDQ*Fgb%stfC z4EvV`Q*P48N`@XZl)14K^yKofutPBZ$`}EeS1EsJ~BeL{Y#+Nk;Wf7 z**|-`!_nJvMMloe3y;yzo(cu}Ghy-VyMV1YZ0?3s>tp5c_c#lLguV03u?!!7qFZ@=4L~9S{<7LU9eK+>^b#Wn6eSxgw&PxtcuRW_#x%C(G3HxHtWZeS;WeD!_hY41J z`8>Ucv-;~H8iQ!y_I$x0LNtTg%GClLwXDp#s*pRhZig>1>t1g@rWBU(|iIvv0- z1kl-1aE3yAluP!zNQ~JVIQ#7woF}7YH^P^J{ZC^;+bna=ELBE?-E;0{oW6-RJ-kne zJd93hjrBIxs|tIYNqE*&DP6ViHt@Uo@DE{*9rmn0W0!VzZH7{ff%pqA5;okGwl5=r z8sDhE&;l58pJ>bZH;U|@7KVQ^ekvEl@z~dTPc}UsXsZ{zp70RQu}|Gs5@XD~uEEl9 zEluiB0s1}MdQTgijx{dL5Py>=j>Xb#m~9ZS9F{`|jf)SX{($2d?UTAq-@_Pe9mhsa zOKIXgPE<9z#O9z1PiZk@Aev1%PP*y-gud%mQ3}e^)T!%>Yn=4v`<{Mtk=+2PQrT-3 zrUQ-dMq4UavK@buxBc1Mtlqs2)Ck~STms3-H)B@rI|Qh3srH(HI5 zy>rzGi|8DxtTv*65prH_E6r6 zWJ@;!+2>)2HjANw|5FUGlC77yq%wC(aVAkUjq%1u8(i2u8e}eKR1y(`W8yxHx-R^7C|&AFQ4M50B(bd5XA_aPNO4_nv=` z7Z@P#NuuLSlu;P#c8Vxry2hW@1Iqs#wfb0jDKdBvItQD9;-dV)k`Yx-FW`#6MRWtZ zeV|!25dG+BD1e1;nY%KDZzj^>T#tV3y}pmwuCE$C z0gZd}m8$)@Jqt2D=y(?=%9VotyD>f4$ntEXs`b0rq6|Kd|F`p}@LUvk#s7Hrmu(!z zjur334HNYEClz3uOj)OoO>$re^4Jk12oP)A@5?>uGlZR@h^J}p?^Ki@eF|jb>G9yn zby6HlYmB!W*Kf&)M~53VyfD7K)6=mDbZ2NizG*~-IO@-{#TZ`=x8R}<)vkgH?Xn){ z$#7|)c8UW_ftzi$zv8XjE0%)D1CPY_m={!sBi9|=DD%8tX-MGl3hmUpq7KTuGdM4qze|a75rR}FF9wKBnSDOA@+2xdGNz-|ZwjF#}ZCaP|>LLK9_&hBM3oeLtlNk(`NI9bD#E(D8GGXl; zxf^kW;?_%5y{yEt1>%J2&Xe=m$VU8nZ3>3V`YQrUnPT-L&t0oSp1O(Y3zuK#P^HU8p^AqBB9N-(9^_b@C6OfOX6-NPD=U zq#GbR3-@2>=?`*H1jlZ=gmhd8K@TLwIul*qZ3|~xF7?YyO*|ES*}_Ccr#S5L0D`>b z4DEUFoCId`_aJY-SrEYPm4u|7DCXO4S`1(9Xsy(x&9HV35L$Nx*ZkZyRr0cBhW*Je z_cq{h2&z+V{vb4Eu$n@z%b4G*Kd6UN-*}ahbYq2ervl8H{O!}IDSs0axwyhR!-&n6 zzY-2^wkw;3D;C;t%1jMh7t2Ecf(I2Cv9epUY}lZva{{o5tZBr|o3PI#%=WgZ67js;YFiaLTES z=|s|~_DQmK*cBbIZg3{lLU|nXN9N-?y-6EhkaoqlSXix>f*UXt#htK(ETptD2%G*i zO&(?=DaJ~O*4M>WqQj%C#^b^j<=vlMMYhM+|7)czT)>Bz*!%p869Ht~7n?rJNoW(m z-SW<3pn?oo3})!W)s8O0*tUxCZh5i*wis~(1m!JO9HP+iP=@bVP{FbPC+3~>ONT;g zEn#^Ij$3nh+kPr7IUMj=&L5EO`|lyV#nQ56sJ;Y#NlI^Td?vi}%F6WzA|phstesML zTl}|_s-wX)MweAD+h9}Nc9As9$=E9TT1xd8KzRb6Z@p3iP>)~|pv0mzu1qJt)BfPS zz@k161(5Tx4S?Qi&xlH?=qss{840)$UL}2iOe(>l?T24?AuN-$&F+~c!u~SeE1RJ2 z*^kD1<5+qfhz)5bA(!z(n{Irw`ZwIpHtzf(RTo?xJ+q2GTa8gRS4y&0nj1<46VthuuFfHgy(ZO(RvJUN| zm!y8GfVlo`I+_5eqv1&t6zM(qn|fq6)vrC86^_9VUoQd)9$N{qJcc>?^$8%zCgMM4 zSnCJVllx_jCwR&XBQD)2aH;RO2MWKWgqc<5GkU2}C(YCAZ-@-!y%ACH{|W)fmIJSa z94ls$qX?Yh=06~jp7}L2Y_~$o`UBB?t(IcHX1_LRyE>z^ZGH2vF--XHp{Knm#1pl8 zMaLHp4c`+CWqExN-Y}kl6w@^4fAFRx`vujknVxvGlem=LOs{4P2Beewjqs?;a}^2t zZQU61boo8Kajxp!65*fY_-duZuUf^l^MHmRBVn^(3T?Pdq)5ggwOv#ShdK~xCucDg zRX8Cpp=6&_3X}*UrWSfn6k*4rYI5HZ8_~)Z7RB!rcAQi=8EC3v<5))}si^9007I+- zNf?DcKoUQF{>NS8_iEO|5X1?kIyk_F@_9aHZF|=~?zdrH!158n!ljLn7^Yu_$`>*5 zeO;2c6r(AOVe5YGvk%zAHNHQ?RI9wmhCwwSJtqAHNeHg@6qF>m|0&UaKK~IZc|(u> zn!cUPE}y1OZb2xe?VBOE^`4Fvt7;|N)OS^`1^H)Tc_5jZK zJbhGifth9O5f5n4B*pmqhT~zOSoNuDF%tt?VXYp}nP=xs|CaYKEyy&JT=j5puZRj2^CZO2wH`SOZ&$tu--lStFe!Qk3g7X6q(w}!fvy~+l_&unjhUcT$_P+laGX5S{A9S55KA?@-|y z2-w8<1ycHw@;mYr$ed|I^0D;Wf8mn!R37U2lEYPzGo6X#2R%b9BMXUL(eKE#BN|`7 z(-%v!|8>xzf4CFBIJL`iEOcW?LA10|X}D1IWYo^^i@!qroyY5t6|Zpg&v+<|qNy() za$9o5_tj>NI_a{_mZ`$}YQ`5t(=7>)~ zZ#png2?BSw4I1>ef4#EvyysTNo2%Vy)}&gC7k?A9m3-lBa9A%9N|pa+eU5Cee#l6b zIZ7?@A0Wn*OB)T4;byV~t{ol&L+QDr3NSQfPXqfy7)!kFme^^coz1vN+vV^M-;OOP zLa}TZttR}sVtrwtIGwzHLCVQF$(NxIIiI0$q*;>Y^l7CdLFMcyo&kg?9}4UGvx^l@ z;c|_QoD#*V$jZB(!g_9Cx~uQXuh&`RH_|+E?k!3H(!WLf*?4W6B-P_Rj2mA%rb{0P z>aW{#J8`^~g9LtX-_3W_K45lb%?)6Gd`+{7}Y+eV2`41Hn!A)~*kV)|)bBn}7 zt$wd!R6eITM8Eh(3f7m!r~z(iN$t0?<(Bt}4;=D@r?crbM1dt+b=`V(2+DF6TnUlq zKgZ|2rD5X9H^>q}&yjtp*O7!`dApQ;G1zOlxUa>TG8?pTm8M)dQ1n0U6Tz`rxzyjJsKCt)Pu=v$`qoBBCoXW<&@|~ZD@oLT z3PhriR@N}qYOf7=Ie>d}=CS!E-4yAqI}>+e>JA`;_#(o{`wfW0DdEQvSo`OdC?ix$ zYfJb_tjCm88d1Ngn?|EsrH4w|nPyo$`8fDAhPR>rH~};*r7%t~gbo;o>XR*r&fKxO zgU@_4WSsA*;CqckdlsdIglawg`y&K>x;>L>#<@N|%&^LNcXs^irVt(X{kakA`@@Wi zqPq){bbhks+UY@*XGY?STD9>Y0eiTZ0#H3m8RPZuX}P~7UQ#H!U)v9xFBJ-ie%x}| zr%(c7YDbThz?2E>9$}h2vTVrP?vjkDjQh^QkgB!5*$<{M*21=A#^v-`o(Cq71}e#I zZOXv`>+Q|svhq}E2)&WiB+DujK%j@~uC;PJ9SF5u?&zjUFIlh{oX%}ydZBIMUUe~U zvA;n_?-<2(4(a4;<*a~GQdnX?swKMuDTVgkx@~p>&j=n~m+Z1ombr7>hJ`)MdE}au z3q=UElDR7@qC{W@7YdQtg*V6`C0i2Ohb*PzFkn_D!BFhrQ|F5#jfYTDEwb>zw4{q= zeD%XQh8vp3i~j+Z^F=dD-RhiUsMqSlIHXSt3}a>^0dfh0Q~@BX0=)oYrIxkpr0RK@FXSV1uCFICDn~&jwxn#X|8?T1R^R=jl}$n0zDEvYx)*i6heenQ;m14 zUk8K*+r*fpK_02z3`b8}(3&w^lMwhKl1Ar96&WYl6^+Vo(z zP}XMYpts$u{Nh>Vm37)m^8fNbLfOR1>t;zUXd^d$HFbF2RFknAQI#x37he+DGU?gMai%_GwMJq#{Bz|N8R zXSB@uZ(?Ss^%XeBFNUcAo<9Sc&_?t|M!?{A6qL0$vXnD7ENr8!5wk+#*jSiF*z&)b zlvrpd-SQ|8t`-D2Ywnliny8eGu(_1W%v{Qyq2v;w8$y~7Hv7(1J0SPBY2Rh3n8#fI)TY_pxn@xk z04nnYE^=a5#40!1HOAi;ft8>4doLY}wyFp!=V#R-D zKobCJuf?m`E%n0v_aXaKthy!~rT9t8{^Rth6N6HaegB)(WUDqv%4gm{C$bt0&53Ry zgN+f$nvkpSJ=Npi&cDjxxS^Mp9uAx%T)C3JDLFQtWyb!Jx>C(I7kbx2dzsBVgwiUC z;iRqC96rQODlzTqZ?)k@)||m|G=c`MnFQ z!VboTm6OzY?vCroh=Hb;wch}AadmBV7Mzg1j(J?;bc!NYih-W216=m$)$#0M%d`)% zA!3acasl2>`B<|OS(fHyn4SeQ#-HuY1}egDDxK|!)iVN!Ju7VCmUQn|BdC48q~K?7 zL>8M;Sfbp_6rk`A4b3x93@u2ri&2?W&y-m>KF8t3JHsp98`_#j?Xk$goE>7*VgEmZ7`7EAW!Yy_0Jv3~Mu5;)mJDL#cnVMpB zO1aGRh0hOk5Tvsr0o?`j^7>rZ_3XOnexVi1=1;5fkU~o_0ZMncNwv#s|HHCX`h>mJ zhig>l!n0&l0z&QCa0ycmk-;u^W~{1$ef+9{pFamNl|y-{QMW`}jy1eHnL>(aQ0mS( zVm?YfFD*xYDQqQv0B>LBmX2Ts_YGV<8SJfIp;Z#6+d6|jwn9U z&e1H4!a0S+8Cf`s^4SoraT>Hh0p%ihox21Dwco1ayB9(YzW_&19u!dPMiQ{p<%v77 z2xy3E*B%sCj98v9-3> zj>(SFpyJ}0Qp&mT6&EYLy#fvn=DmUX;&=b21C^HW_&)(A`=C5;+(EA-` zj)fPUlK=NNzlzc%uDc+}2Nv>ks~}M-)%XzoSLk8joJXoql>Ro%ujcO|SeAoh)G@te zAp2!?6%Q~}i#cQ8biH|ne*Q}K=?mO^GJ7rWU*1~&#Xt*c2~MPLN^Rke=)0go{=pc~ zromJX=Iw!e)0dzx@42%?`aHL&foRV9xHsC`jkRo>K*$c!)hnB}UKu_$Iv6kxc0Ka@tt+mrBWbZj;NeaaNV0Cm}~%Wj+!j*{g^+feG`)`GF<)*sB2 z?R?J+Gq>j_1=w?{bivf|`X&zDPeNG;YfH^Ef0fPVwKaV(fH|AObHYZ=NvbQ3pDa$jPUtfV&g8Xc zMxzgEJ!_$bapuhn?&t`E0fv0oyv$S2PC!ROEr$P0gA}RK?~X7Wq4*xg-Hb$~&)4mA zh>bOUjl?~`6|c-!h`$@t-UJuDsoG(n-1;7jcAo$bSv%g{1*#Wm_57}VN~H)O-Qi0M z@U7e>U@u9^+vDVE@d%Q()k!*(*3#Vi35UPKF7zZ`{)ayAG~St|vz!5h*O(CM3)Yk# zlWxiNxrR#H70=md8&^W)j(%~LY%`2VNDW2AJCt&1sldQcicF`S$PqX9ixwu`)`_c? znF}Y+@6HW3SNHs-6ofb&J#AOQ@p%)aKUq*Jw#!`Y?mZWWs}OEY58gKR(7J+nAtf;I zf1W?m4HRspFpmdL*V+dmDra{RFuDWbFNgI?j!TA!?Q~HBrezEODQTtVo4~0p!c@%b zZDoU;Wb~t_$F*mIr!}|(T^32n(Aqe0qkP5g!(|nH7>riF%A`@+{P_6_*RHOIo%qN3 z@g@|Nw5X&f@`QDBp|bGrB}iq$EaWT;Y}Fl+JMVPqLv_GjV67o~7yZ8-#~_Ue%N`cM z-EIIB6-tdi8`DoN?J0F6fSqITI5YXK2oeseD3HS!zl~{egEhTP-6XC_Cj8^z^zCw4 zlD92PZwnkhs;q91fL&j7YGZGc`xxZ>dATdgr8382gJs{Q+Kt89tubCnd@d2WOaBib zZ#cF)34giuA3$W~+FiDlYTmv=E427tMe2W>x|dzrWS4SciXvMy)p7c|)n4}i9pVK5FOY_+b;=-r}#hVN}XXG~!rVROWTh6%u=)s7B z$6?^E3FE`z)Aknm2M-|&cA&EV6KDrqfv%ie7K!@*++$2D4)`+e4KGr=_PXbfj?8zT3^fv*lBefYB58@j?%i_gcAX z%a^d>PC@|@E*9sCFy5Owre>kRTmZU)fcvr`((Wpif4Ci5b)ibgokw6k%4^i@tMI(G zjYK-HO^(r}Dd5q_r{s24Pwe@-J|E@d{wRoU+e0}i{0h4;zxdy83X$iV4A?Zv5bi1o zoT%%N36f0+`6mQ{w~Io%juwrkqM)F!bIp|5pvF|CdSAx5223k4OGeSe+=cIUPcP#a zdg8O55|z{>w}~(Cnl1O4rnkREg05ZXoY?PiI9c=qJeP*_98!}nm3}xWv4v`B9#mP^ z_ui*uilG+%Apka>a6m=##twS_OffCvhI^Bh9Rg?hKR_nnNp>XXE8B5?W7=_vwb@;upSbb4$yCM) zx9?P+Ue(^2HtY4Xfx;~|Ldx>7wnm4Jc4KHIT*EDzd(6}cG(C&aO|YzI4A$t|BOXZe zE{C`D+gIQPGo)sdBeG=!Ci(wCw7E zOBB2P+iXyPg&JHGpf?3b%sk`^5v+KWU2aYa12)JTs25y!RwKymU{E*5GTrNxO7be_ zW2L(au;5w8W8%&8=PmppIYbB4wcWdwZA&GtRF;rw38Kqs{&3%- z_WI`{Sa%>22e{Z&?| zWyi~o3Ge!_duXC95f(Ep$HoMaI=o9qf^yE1tvC+*?~D=(q&~Unh*MsE13gEMW(FeG zNMZwz*}hB%CS>4v?-T&va)<3uaMai#1`>+4@~z|9^{hNCohcDXS@SnpPR$rl-~nx0 zVHMua+TWQ#lOXUYCE=XLbQ+&BZUO+zn9k%)_T*x7Fb=Lh2d0HQxfC`2fOGA8Ov@gKI#_hmu_WqK)p}SIjc9z#_nQ zlh$ni9|}8#N^6gi?VGdoaIbiGu?Ot| z0szUq+_@pd^aj}1el}jQ->uy!frsSEeY885cin>Wh%xVAnEs)w|L&VB)93g~5dsvM z7w+V7#~)uh7_fa%1S@-93&0*eQJMEJ9^01+XL3F?QvPz^+^|hzS3C(@rT&^al+N!% z%@V7m&^3?b{AwDzmP8M+)sh!SgpWsXo4vrRK$(@)1iJfU)e%W6!#SkSG8-<82~h?9 zsJ#jhJ|F9Yy3=f=pnkL172vulPxPJiCWn+R5E{~BgD`GgE{NpaNb6b7702nkWv(dO zp0Vz4K-OxVm;OPyR>^#t2AEt?;Yf&xuqK39+oaEbrC7lYc^$_&Qsvh_(5jE$+Ix?2 zPUYb!D)#CMjwN0azQ!IADG#K&gyyq;Q`p_nO?0ivsRvx(x>TN7uuh)GgyiFw^V8J# z=VKva!v3l36pOZp?U09LlI*(Cd)B@LobRQWN1|PuY|(0y-_&Gb{5&Br6e35v;MuaSLJvYPnd2i8ZP@Q~K`ZO>?58=F$NR{450%T`@WZZMU zph$KcoY8(@<_-P`ut+_3ChQjc>IGVBs7b#LBEwp%7&`R^^u2EqsAj9KdCX5*{>W&j zRM4O%A!NVHXaG=-L2gg^&@VI`E40N#>hB8tG9j? zhh^5zqN$DG0&vnE3(Gpy|3JW z-zU_sQ@GG%_Y>jP{Am$)a^C`lyg)*Mxcl0NBsG`Ku>iloHD8@L$BCOCi7jsWE+b%v zmALmQY={%##__+BS=};b+c;16w|iSC-Ve75CnxRc1L!wpq9(qOB`rA$pyqV@I(hN@ z|I#T3y{|#Z??~mN&uW`8uDI&s(|KMwbA&i@SLC?g z*iCMW_~l&>t(%*3;ELoX-I5fa)^>kO5fOb^nux}z<4pzn5=*+PF+**7^+#>biPub& z&hl`YiEN37L?OsC4C+7UjYZDnO7RL=n=;Y3Sq^|Xw+_eTH^(2+3BtU)jRv22vS8zs zi7*+8g8iQ1aPd4(=+*7j(Zkq}n7-in$g%OX<6A2{wMrAHIvkW8&!Rpm2$u z0+jzqxyy6~K##8$k<&t`dGIy4%itcX33`%GXu6_U7pmBIEmKlxs~9y?#wyj9tO>&C z^ILkNVOdEW7-;*LlwO{#VoO7d z3(nO>isYbfdf&nKA4L+Utz8@{kNUC|2U%ROVOqKP-qr+QeD!wARP18$23nb;cA41T zdCVDvdNGItKJr#Le;p5h#%ijk=PSBN8DjOiZQI_B*j&s%>7q?tr*HU$=(u8+P_x4m&1w}#U8 zmS z#?kwxN0RE#*A^sO+o3G|!nj&?d9j!NK3a})URE=u{Rilm?B$w>CPIa=N%uOQ*SH8^ zsUOvy=PM6SMBbBfer?=uWN>DZsPf$Z=!SkmPW#uVc%;)F<(J_ZBtnFzYU7JcCx^gQ zr*cWfmyhLebDEX@Fg!-=qLQ8x+<9c2f@{JXdinJdM(=}!#eMGz(o(t;SdOa3slBy~ zfPIXKz({NWH#Xd2qrF`J4Tc=t>rSJFSkI~Zuhrle0w_?dOn@Q!0>AHSKL|MM&X}4Y zdD5S*iSuC z?xM3m7u#@X05X$-`OR{^l)GH+E{dkQWfg6terbuW&oc0<+bnL=ljAwn*&3mRgGMQR zk9}y%kydt(@icY8{*8!J^%h^~n9R~S&E^kf#glrpctBYb4+o#`MoHrzo2l3hvm25a{$9*i5~O!WDg1i^TCk#136VLQnfQqmVKz zdhfuBpI5RKU-US66cr0_E{vZub$~@QZ^@ z;?_t|`3?H>BdMZ(rnzRi` zE9_TN&J$FAiBXGsp+j9EfMqhhabh>>wK*}1U+dLp(jTm$H>?7u?-^PyR0a=z!-?_V zF%8)<=Pn5$T~uqEfWOYRSMzds{jy;%gaguz@> zG;+Eo@uj;zFDv68MQ-Q7V;a=Qg9SW*Ew^g%?iEiXGNr;Aa&2&wfmG;3Q+Mr@y`$ZD@TW z^=YJ_YS!saZJb6!M`A1DY8ioDjeaXge!Bna?|$tHqqAsZmvjFj+;4?CtiwRPXbh@j zF+sAl@4N71a8yXVTRGFFZRD*jy&>?cjRcFjWrgnh9L$My(m1>7yv^2%zD+K_^@1ZR zhPv&Z2Lk;Nbna*9)_OZa6d7_^B_+NKrJro3bcg=MaGFe}Vw}ES@COOWj8e6pwD=xg z5f#qByloolGjY$8j*|X-fO-Z$(~rHGXr}$IHHWxMuw~yqktsE|&md?hSE@&byYg&M z>PaTe^c1tTw867lF?xe`JGsR3dHd*H`bkdL>0qQfKH{Em!Sx*wkb*ykia^4+&YmyBOu4@>xoRGEl2wIKRr6Bp^6f9O72 zpQo0E(=QM@-sDY>ye-*s`MuQe3LqHdhu zR+awl$VfFD`B&lS3S4olkbBn`EhASnViP_;RV$q{t+e{GXSSUZIANwoCH-y~#mqXIp*5b4#j%c~>c$qKuVqyW4~U|$Un zGAw#z)Xr~*KYMo@m_JSdJpTr1_qX~&cdM!$DCq8xK;UN|6e7Y`+;3Eh8}+ctp?6&fi82@qeo z0_8YuEH^Z@J6UK#-Z@cgtQg#~>xBXt9HILu-TRo>lg~xcRXyZp&M5wFD&}sFd(vMzR%^Dv887vCidlJ$#1UlDg&i?>8cGrYZ?Xd~^ z4r-V|O&?{RVgX|8x`;rcwB}=P8%Mk3UEWi@N9KHjbhMR8aRz8&paaqbZy!cebY4lx z!jH$9W^;u)738qXP*pu`pQg-o$`CT1ZIGrU9GC%lwT^Rqp>_|wyJx7!g9uoJ$>{^=NPkvoqf0--_8{a^$>oNf@yk{-##*nSRq^Prfp|b6qm#vjTs> zaPP+COldrfjPf!!U{_FLYQmHT$oLt3$rmhW_-W>^$K2(}FGAo=oQz6i4HVJWz&aeN6Ecl+H6>RykjL>TVsKC9M44*;0W) zj+oL^zX+H~QEq$29w%MjD@e=49r$S=fm2fNZ71Ky!a|<#-Wfi z%E-y&OhO66#dJhCU`pR$GJ-iO;KG)(yIj z5SQdFGcYjHC&^(`@wpBKuwjNtwV}6tkbhNhF)LH@mpf(%tjJ$lvPyLkw0QGqEukVLaD|rc|B)>>Fd} zNe;BZ5Qy+phfL% zp3ts)TE_{q%30^xqDahP=s3DueEfuC`M0XGBI%bTMU=vmlwd zQ=@Uvfxf681G_AKM6DvwSTzml7QLz z5cq;E9|{VcTsu7)>9lsm5TX}F^7}!MJ^ZvQ&+7jFWjn2~vU$&A!zeK^lvt zPO3nqQ7V3j7o$!Q`y6QFHYg55RS~QdW$Eb3+p=Yce5=mHlqQ}(^N!YJ^+-LNXzMHW z{(cQK;YP#7n=}eutsyWcOt|A*(LrzA1Lq7A51i#Fd#zmq-fsNY7Z#`Yhw4y!PJxRLDN)wp#?v(21OohWjz?7KxpD0Bh-Id31y<2AUt|a zmG{fSJJ=2%BVf%SEBM20BX@PPfJJCcQOd5{CuSf}_gwvMk0g5mvzU6t{? z#Xf*E@lbNH<~kB5$4QSx?Jx%Or%vc)JN?oUbGkDcwoPBg6*fhMY2DlQwU%OtZJhQ# zDlUn-fbKIs+4vbH+5t5JS)yCt6~wD%7iC)$imD9PfkxP_;B7!+-?x}3sae~VfR_am z-7Qb<-;>m%6nD;{)9zL|$vPVuC3|PyNj25+d-~!A1sc}mPLa%OOdz8xnlEbR(4(4E zGS@+=TX$-ybY11$&X`3CGH*$OP2JZY#~UALGI4)@RL^7G+mUd<$g!TxR3#zCXN>*> zgvr8H!kWm3<$o6y zjdEi>oC#JMqRRtX_IjFX&L7kmp<`Iv)PgtH{00DD6(i+N!5KA75>)sKC#d-A8oKB3 zRU@JHZro3$0Vd%FF%tsM(PCtj5+8PJ4D6T#m4W{O42&Lvp3kh7KhM&kyy!aCbH?LV zV+KGFOb8Yvh)bL`VR@|j47K)=1;ErFKi7@?Bi;`#0#l_1r_V$%WZZTRjD}EAPe>uc6fV1kL(FXI{7cJ6> z-qtnz!HQ`jr8ia>pI41{!6}->f>0KLQ;Jk6{tKC}Hr$ZsZ5^TMPxR}qV46s5vEkR! z7`xGn!2-ZtmO_i)Vw>8_v$MUCitOhT(ptl0NrIz?*Kzh&57OOp&S06^T$zd&C9l7uFL?E>8|;QgOpOLM$=WkqD}KJCI%}i2A5l*z?Ygr zz<`tqIaOqytSj=mS-=ufSY1I>BeQaE*3j)RQ01}pzw_!#+ak3IXA_Tzq-ZvCb`-)W zJH#6N<=j9MgAj0BsaMfK!HaB)1~dK$z1%cM>iL7DQ!#6@3N~j^uie%~!o>x8*_KRA zM)6MA@ch(?;b@`#u@i3C$$wFPwUPLq6!vAckFvi-j)fa=u?U4mFz?XtntpG4y+avO zH)pbl@4x9#y3Pr=0w5u~rn(1Ey@ocqsV1kHpBZ-0 zAalN*v|sdV(rPi>zF*Obnx_o`g`8wYnJs9^6|DM_O6E6YOGY$Ie+epF8r)+fvlc`@ zRQAJaN5e<{a*itBcq~;+Ndj;by@n~I)-3&jZOM}FBl%{v7?h-aq$sh6f9rwfqh*(v z4tRdVPp_phKFs7N24geb*UALKbHAybK9|JCSQ2}gc@6L zA1JEJp`7q$-^>g}adnJoiuj7$wM6l%+VM{Q>cRVj84c^QmmHkl98T%yXuz9R)@O^H zsr3~uI$p5aeQ=hE#1XuXGZpDIV4-#gO%tmKA*Yo&r&oR)@OPt%7--Yi3zc=TNc)$! z)ncYW{0$#V!xIk#+K{%U12x#AAU3a~|9%-q&BiMi_W|sv)XExAT=nR`*2-ELxhUt@ z;v6EUEmkh@7L!qNq8t928rF4O;_7#GGm!WN1)vkGaJ9tEOtkN;=e?GonUw+w`;)@O zyqOo_Yp`D|nN?jWfLc;GxBQ4`r@Z3;(*_r5@?%biS_+^)wRb9e7x`(SaXjnOPJH2G z#$!v*@<*z?zgPbQP#URb{{h6#*cPc8GZIfXwj8tix3A;=fbyxvfwT0kb=Ac`b^Gt^ zmfJ@E2Pk>Fb7cIV+`ZA?68tCYXPt9r*3UYwe)_G|==;Mn_wHEA7Zd0Iy*m(9)HP}1 kb++R|?##>e`0ZWsINd+mNB#l+HQrm?f95}c_J7O&2b!s@z5oCK literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..574b6c3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Django>=3.1,<3.2 +wagtail>=2.11,<2.12 diff --git a/search/__init__.py b/search/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/search/templates/search/search.html b/search/templates/search/search.html new file mode 100644 index 0000000..5f222e5 --- /dev/null +++ b/search/templates/search/search.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% load static wagtailcore_tags %} + +{% block body_class %}template-searchresults{% endblock %} + +{% block title %}Search{% endblock %} + +{% block content %} +

Search

+ +
+ + +
+ + {% if search_results %} +
    + {% for result in search_results %} +
  • +

    {{ result }}

    + {% if result.search_description %} + {{ result.search_description }} + {% endif %} +
  • + {% endfor %} +
+ + {% if search_results.has_previous %} + Previous + {% endif %} + + {% if search_results.has_next %} + Next + {% endif %} + {% elif search_query %} + No results found + {% endif %} +{% endblock %} diff --git a/search/views.py b/search/views.py new file mode 100644 index 0000000..d9ad9d0 --- /dev/null +++ b/search/views.py @@ -0,0 +1,34 @@ +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.template.response import TemplateResponse + +from wagtail.core.models import Page +from wagtail.search.models import Query + + +def search(request): + search_query = request.GET.get('query', None) + page = request.GET.get('page', 1) + + # Search + if search_query: + search_results = Page.objects.live().search(search_query) + query = Query.get(search_query) + + # Record hit + query.add_hit() + else: + search_results = Page.objects.none() + + # Pagination + paginator = Paginator(search_results, 10) + try: + search_results = paginator.page(page) + except PageNotAnInteger: + search_results = paginator.page(1) + except EmptyPage: + search_results = paginator.page(paginator.num_pages) + + return TemplateResponse(request, 'search/search.html', { + 'search_query': search_query, + 'search_results': search_results, + }) diff --git a/stranka/__init__.py b/stranka/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/stranka/admin.py b/stranka/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/stranka/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/stranka/apps.py b/stranka/apps.py new file mode 100644 index 0000000..8e66cb1 --- /dev/null +++ b/stranka/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class StrankaConfig(AppConfig): + name = 'stranka' diff --git a/stranka/migrations/0001_initial.py b/stranka/migrations/0001_initial.py new file mode 100644 index 0000000..ad3ca9a --- /dev/null +++ b/stranka/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 3.1.3 on 2020-11-24 16:24 + +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.fields +import wagtail.core.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailimages', '0022_uploadedimage'), + ('wagtailcore', '0059_apply_collection_ordering'), + ] + + operations = [ + migrations.CreateModel( + name='StrankaPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('body', wagtail.core.fields.RichTextField(blank=True)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='StrankaPageGalleryImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sort_order', models.IntegerField(blank=True, editable=False, null=True)), + ('caption', models.CharField(blank=True, max_length=250)), + ('image', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='wagtailimages.image')), + ('page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='gallery_images', to='stranka.strankapage')), + ], + options={ + 'ordering': ['sort_order'], + 'abstract': False, + }, + ), + ] diff --git a/stranka/migrations/__init__.py b/stranka/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/stranka/models.py b/stranka/models.py new file mode 100644 index 0000000..6a7da66 --- /dev/null +++ b/stranka/models.py @@ -0,0 +1,35 @@ +from django.db import models + +from modelcluster.fields import ParentalKey + +from wagtail.core.models import Page, Orderable +from wagtail.core.fields import RichTextField +from wagtail.admin.edit_handlers import FieldPanel, InlinePanel +from wagtail.images.edit_handlers import ImageChooserPanel +from wagtail.search import index + + +class StrankaPage(Page): + body = RichTextField(blank=True) + + search_fields = Page.search_fields + [ + index.SearchField('body'), + ] + + content_panels = Page.content_panels + [ + FieldPanel('body', classname="full"), + InlinePanel('gallery_images', label="Obrázky"), + ] + + +class StrankaPageGalleryImage(Orderable): + page = ParentalKey(StrankaPage, on_delete=models.CASCADE, related_name='gallery_images') + image = models.ForeignKey( + 'wagtailimages.Image', on_delete=models.CASCADE, related_name='+' + ) + caption = models.CharField(blank=True, max_length=250) + + panels = [ + ImageChooserPanel('image'), + FieldPanel('caption'), + ] \ No newline at end of file diff --git a/stranka/tests.py b/stranka/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/stranka/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/stranka/views.py b/stranka/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/stranka/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/veterina/__init__.py b/veterina/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/veterina/settings/__init__.py b/veterina/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/veterina/settings/base.py b/veterina/settings/base.py new file mode 100644 index 0000000..3e0d625 --- /dev/null +++ b/veterina/settings/base.py @@ -0,0 +1,166 @@ +""" +Django settings for veterina project. + +Generated by 'django-admin startproject' using Django 3.1.3. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.1/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +BASE_DIR = os.path.dirname(PROJECT_DIR) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ + + +# Application definition + +INSTALLED_APPS = [ + 'home', + 'search', + + 'wagtail.contrib.forms', + 'wagtail.contrib.redirects', + 'wagtail.embeds', + 'wagtail.sites', + 'wagtail.users', + 'wagtail.snippets', + 'wagtail.documents', + 'wagtail.images', + 'wagtail.search', + 'wagtail.admin', + 'wagtail.core', + + 'modelcluster', + 'taggit', + + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + 'blog', + 'stranka', + 'aktuality', +] + +MIDDLEWARE = [ + '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', + 'django.middleware.security.SecurityMiddleware', + + 'wagtail.contrib.redirects.middleware.RedirectMiddleware', +] + +ROOT_URLCONF = 'veterina.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + os.path.join(PROJECT_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 = 'veterina.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.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/3.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/3.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/3.1/howto/static-files/ + +STATICFILES_FINDERS = [ + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +] + +STATICFILES_DIRS = [ + os.path.join(PROJECT_DIR, 'static'), +] + +# ManifestStaticFilesStorage is recommended in production, to prevent outdated +# JavaScript / CSS assets being served from cache (e.g. after a Wagtail upgrade). +# See https://docs.djangoproject.com/en/3.1/ref/contrib/staticfiles/#manifeststaticfilesstorage +STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' + +STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATIC_URL = '/static/' + +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' + + +# Wagtail settings + +WAGTAIL_SITE_NAME = "veterina" + +# Base URL to use when referring to full URLs within the Wagtail admin backend - +# e.g. in notification emails. Don't include '/admin' or a trailing slash +BASE_URL = 'http://example.com' diff --git a/veterina/settings/dev.py b/veterina/settings/dev.py new file mode 100644 index 0000000..b5172f5 --- /dev/null +++ b/veterina/settings/dev.py @@ -0,0 +1,18 @@ +from .base import * + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '5a7p-j#qt+o(x@x!rs7+*_jx+_cw!upbersu_&1%-me63xy8(#' + +# SECURITY WARNING: define the correct hosts in production! +ALLOWED_HOSTS = ['*'] + +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + + +try: + from .local import * +except ImportError: + pass diff --git a/veterina/settings/production.py b/veterina/settings/production.py new file mode 100644 index 0000000..9ca4ed7 --- /dev/null +++ b/veterina/settings/production.py @@ -0,0 +1,8 @@ +from .base import * + +DEBUG = False + +try: + from .local import * +except ImportError: + pass diff --git a/veterina/static/css/veterina.css b/veterina/static/css/veterina.css new file mode 100644 index 0000000..e69de29 diff --git a/veterina/static/js/veterina.js b/veterina/static/js/veterina.js new file mode 100644 index 0000000..e69de29 diff --git a/veterina/templates/404.html b/veterina/templates/404.html new file mode 100644 index 0000000..3a5500e --- /dev/null +++ b/veterina/templates/404.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block body_class %}template-404{% endblock %} + +{% block content %} +

Page not found

+ +

Sorry, this page could not be found.

+{% endblock %} diff --git a/veterina/templates/500.html b/veterina/templates/500.html new file mode 100644 index 0000000..72b6406 --- /dev/null +++ b/veterina/templates/500.html @@ -0,0 +1,13 @@ + + + + + Internal server error + + + +

Internal server error

+ +

Sorry, there seems to be an error. Please try again soon.

+ + diff --git a/veterina/templates/base.html b/veterina/templates/base.html new file mode 100644 index 0000000..630de46 --- /dev/null +++ b/veterina/templates/base.html @@ -0,0 +1,40 @@ +{% load static wagtailuserbar %} + + + + + + + {% block title %} + {% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %} + {% endblock %} + {% block title_suffix %} + {% with self.get_site.site_name as site_name %} + {% if site_name %}- {{ site_name }}{% endif %} + {% endwith %} + {% endblock %} + + + + + {# Global stylesheets #} + + + {% block extra_css %} + {# Override this in templates to add extra stylesheets #} + {% endblock %} + + + + {% wagtailuserbar %} + + {% block content %}{% endblock %} + + {# Global javascript #} + + + {% block extra_js %} + {# Override this in templates to add extra javascript #} + {% endblock %} + + diff --git a/veterina/urls.py b/veterina/urls.py new file mode 100644 index 0000000..d1b8710 --- /dev/null +++ b/veterina/urls.py @@ -0,0 +1,39 @@ +from django.conf import settings +from django.urls import include, path +from django.contrib import admin + +from wagtail.admin import urls as wagtailadmin_urls +from wagtail.core import urls as wagtail_urls +from wagtail.documents import urls as wagtaildocs_urls + +from search import views as search_views + +urlpatterns = [ + path('django-admin/', admin.site.urls), + + path('admin/', include(wagtailadmin_urls)), + path('documents/', include(wagtaildocs_urls)), + + path('search/', search_views.search, name='search'), + +] + + +if settings.DEBUG: + from django.conf.urls.static import static + from django.contrib.staticfiles.urls import staticfiles_urlpatterns + + # Serve static and media files from development server + urlpatterns += staticfiles_urlpatterns() + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +urlpatterns = urlpatterns + [ + # For anything not caught by a more specific rule above, hand over to + # Wagtail's page serving mechanism. This should be the last pattern in + # the list: + path("", include(wagtail_urls)), + + # Alternatively, if you want Wagtail pages to be served from a subpath + # of your site, rather than the site root: + # path("pages/", include(wagtail_urls)), +] diff --git a/veterina/wsgi.py b/veterina/wsgi.py new file mode 100644 index 0000000..fbe0541 --- /dev/null +++ b/veterina/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for veterina 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/3.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "veterina.settings.dev") + +application = get_wsgi_application()