From 5864aa653e4f6f5ea107d4b582b661a4d67f6b0c Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Tue, 29 Nov 2022 15:27:50 +0100 Subject: [PATCH 01/64] standardize db col names and some preliminary work for public corpora --- app/models.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/models.py b/app/models.py index c607dc5f..96d012b2 100644 --- a/app/models.py +++ b/app/models.py @@ -532,7 +532,7 @@ class TesseractOCRPipelineModel(FileMixin, HashidMixin, db.Model): publisher_url = db.Column(db.String(512)) publishing_url = db.Column(db.String(512)) publishing_year = db.Column(db.Integer) - shared = db.Column(db.Boolean, default=False) + is_public = db.Column(db.Boolean, default=False) # Backrefs: user: User @property @@ -576,7 +576,7 @@ class TesseractOCRPipelineModel(FileMixin, HashidMixin, db.Model): model.publisher_url = m['publisher_url'] model.publishing_url = m['publishing_url'] model.publishing_year = m['publishing_year'] - model.shared = True + model.is_public = True model.title = m['title'] model.version = m['version'] continue @@ -587,7 +587,7 @@ class TesseractOCRPipelineModel(FileMixin, HashidMixin, db.Model): publisher_url=m['publisher_url'], publishing_url=m['publishing_url'], publishing_year=m['publishing_year'], - shared=True, + is_public=True, title=m['title'], user=nopaque_user, version=m['version'] @@ -629,7 +629,7 @@ class TesseractOCRPipelineModel(FileMixin, HashidMixin, db.Model): 'publisher_url': self.publisher_url, 'publishing_url': self.publishing_url, 'publishing_year': self.publishing_year, - 'shared': self.shared, + 'is_public': self.is_public, 'title': self.title, 'version': self.version, **self.file_mixin_to_json_serializeable() @@ -656,7 +656,7 @@ class SpaCyNLPPipelineModel(FileMixin, HashidMixin, db.Model): publishing_url = db.Column(db.String(512)) publishing_year = db.Column(db.Integer) pipeline_name = db.Column(db.String(64)) - shared = db.Column(db.Boolean, default=False) + is_public = db.Column(db.Boolean, default=False) # Backrefs: user: User @property @@ -700,7 +700,7 @@ class SpaCyNLPPipelineModel(FileMixin, HashidMixin, db.Model): model.publisher_url = m['publisher_url'] model.publishing_url = m['publishing_url'] model.publishing_year = m['publishing_year'] - model.shared = True + model.is_public = True model.title = m['title'] model.version = m['version'] model.pipeline_name = m['pipeline_name'] @@ -712,7 +712,7 @@ class SpaCyNLPPipelineModel(FileMixin, HashidMixin, db.Model): publisher_url=m['publisher_url'], publishing_url=m['publishing_url'], publishing_year=m['publishing_year'], - shared=True, + is_public=True, title=m['title'], user=nopaque_user, version=m['version'], @@ -756,7 +756,7 @@ class SpaCyNLPPipelineModel(FileMixin, HashidMixin, db.Model): 'publishing_url': self.publishing_url, 'publishing_year': self.publishing_year, 'pipeline_name': self.pipeline_name, - 'shared': self.shared, + 'is_public': self.is_public, 'title': self.title, 'version': self.version, **self.file_mixin_to_json_serializeable() @@ -1024,6 +1024,7 @@ class CorpusFile(FileMixin, HashidMixin, db.Model): corpus_id = db.Column(db.Integer, db.ForeignKey('corpora.id')) # Fields author = db.Column(db.String(255)) + description = db.Column(db.String(255)) publishing_year = db.Column(db.Integer) title = db.Column(db.String(255)) address = db.Column(db.String(255)) From 5491cb184ae8bab63945767c824662f36894b8d1 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Tue, 29 Nov 2022 15:28:10 +0100 Subject: [PATCH 02/64] add all files for last commit --- app/contributions/forms.py | 2 - app/contributions/routes.py | 8 +-- app/corpora/forms.py | 38 ++++++++++-- app/corpora/routes.py | 61 +++++++++++++------ app/templates/_scripts.html.j2 | 4 +- app/templates/corpora/create_corpus.html.j2 | 19 ++---- .../corpora/create_corpus_file.html.j2 | 1 + migrations/versions/f2656133df2f_.py | 41 +++++++++++++ 8 files changed, 130 insertions(+), 44 deletions(-) create mode 100644 migrations/versions/f2656133df2f_.py diff --git a/app/contributions/forms.py b/app/contributions/forms.py index 0ba8f5d5..eb25babb 100644 --- a/app/contributions/forms.py +++ b/app/contributions/forms.py @@ -55,7 +55,6 @@ class CreateTesseractOCRPipelineModelForm(ContributionBaseForm): ) def validate_tesseract_model_file(self, field): - current_app.logger.warning(field.data.filename) if not field.data.filename.lower().endswith('.traineddata'): raise ValidationError('traineddata files only!') @@ -80,7 +79,6 @@ class CreateSpaCyNLPPipelineModelForm(ContributionBaseForm): ) def validate_spacy_model_file(self, field): - current_app.logger.warning(field.data.filename) if not field.data.filename.lower().endswith('.tar.gz'): raise ValidationError('.tar.gz files only!') diff --git a/app/contributions/routes.py b/app/contributions/routes.py index 40b21203..3bc37eb8 100644 --- a/app/contributions/routes.py +++ b/app/contributions/routes.py @@ -104,7 +104,7 @@ def create_tesseract_ocr_pipeline_model(): publisher_url=form.publisher_url.data, publishing_url=form.publishing_url.data, publishing_year=form.publishing_year.data, - shared=False, + is_public=False, title=form.title.data, version=form.version.data, user=current_user @@ -131,7 +131,7 @@ def toggle_tesseract_ocr_pipeline_model_public_status(tesseract_ocr_pipeline_mod tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id) if not (tesseract_ocr_pipeline_model.user == current_user or current_user.is_administrator()): abort(403) - tesseract_ocr_pipeline_model.shared = not tesseract_ocr_pipeline_model.shared + tesseract_ocr_pipeline_model.is_public = not tesseract_ocr_pipeline_model.is_public db.session.commit() return {}, 201 @@ -201,7 +201,7 @@ def create_spacy_nlp_pipeline_model(): publisher_url=form.publisher_url.data, publishing_url=form.publishing_url.data, publishing_year=form.publishing_year.data, - shared=False, + is_public=False, title=form.title.data, version=form.version.data, user=current_user @@ -228,6 +228,6 @@ def toggle_spacy_nlp_pipeline_model_public_status(spacy_nlp_pipeline_model_id): spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id) if not (spacy_nlp_pipeline_model.user == current_user or current_user.is_administrator()): abort(403) - spacy_nlp_pipeline_model.shared = not spacy_nlp_pipeline_model.shared + spacy_nlp_pipeline_model.is_public = not spacy_nlp_pipeline_model.is_public db.session.commit() return {}, 201 diff --git a/app/corpora/forms.py b/app/corpora/forms.py index db46b0ad..12ec1d9c 100644 --- a/app/corpora/forms.py +++ b/app/corpora/forms.py @@ -1,11 +1,17 @@ from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileRequired -from wtforms import StringField, SubmitField, ValidationError, IntegerField +from wtforms import ( + StringField, + SubmitField, + TextAreaField, + ValidationError, + IntegerField +) from wtforms.validators import InputRequired, Length -class CreateCorpusForm(FlaskForm): - description = StringField( +class CorpusBaseForm(FlaskForm): + description = TextAreaField( 'Description', validators=[InputRequired(), Length(max=255)] ) @@ -13,6 +19,20 @@ class CreateCorpusForm(FlaskForm): submit = SubmitField() +class CreateCorpusForm(CorpusBaseForm): + def __init__(self, *args, **kwargs): + if 'prefix' not in kwargs: + kwargs['prefix'] = 'create-corpus-form' + super().__init__(*args, **kwargs) + + +class UpdateCorpusForm(CorpusBaseForm): + def __init__(self, *args, **kwargs): + if 'prefix' not in kwargs: + kwargs['prefix'] = 'update-corpus-form' + super().__init__(*args, **kwargs) + + class CorpusFileBaseForm(FlaskForm): author = StringField( 'Author', @@ -41,13 +61,21 @@ class CorpusFileBaseForm(FlaskForm): class CreateCorpusFileForm(CorpusFileBaseForm): vrt = FileField('File', validators=[FileRequired()]) + def __init__(self, *args, **kwargs): + if 'prefix' not in kwargs: + kwargs['prefix'] = 'create-corpus-file-form' + super().__init__(*args, **kwargs) + def validate_vrt(self, field): if not field.data.filename.lower().endswith('.vrt'): raise ValidationError('VRT files only!') -class EditCorpusFileForm(CorpusFileBaseForm): - pass +class UpdateCorpusFileForm(CorpusFileBaseForm): + def __init__(self, *args, **kwargs): + if 'prefix' not in kwargs: + kwargs['prefix'] = 'update-corpus-file-form' + super().__init__(*args, **kwargs) class ImportCorpusForm(FlaskForm): diff --git a/app/corpora/routes.py b/app/corpora/routes.py index 2e9047c3..a2d14af7 100644 --- a/app/corpora/routes.py +++ b/app/corpora/routes.py @@ -13,7 +13,26 @@ import os from app import db from app.models import Corpus, CorpusFile, CorpusStatus from . import bp -from .forms import CreateCorpusFileForm, CreateCorpusForm, EditCorpusFileForm +from .forms import CreateCorpusFileForm, CreateCorpusForm, UpdateCorpusFileForm + + +def user_can_read_corpus(user, corpus): + return corpus.user == user or user.is_administrator() or corpus.is_public + + +def user_can_update_corpus(user, corpus): + return corpus.user == user or user.is_administrator() + + +def user_can_delete_corpus(user, corpus): + return user_can_update_corpus(user, corpus) + + +@bp.route('') +@login_required +def corpora(): + corpora = Corpus.query.filter(Corpus.user_id == current_user.id | Corpus.is_public == True).all() + return render_template('corpora/corpora.html', corpora=corpora) @bp.route('/create', methods=['GET', 'POST']) @@ -46,7 +65,7 @@ def create_corpus(): @login_required def corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) - if not (corpus.user == current_user or current_user.is_administrator()): + if not user_can_read_corpus(current_user, corpus): abort(403) return render_template( 'corpora/corpus.html.j2', @@ -55,6 +74,19 @@ def corpus(corpus_id): ) +# @bp.route('//update') +# @login_required +# def update_corpus(corpus_id): +# corpus = Corpus.query.get_or_404(corpus_id) +# if not user_can_update_corpus(current_user, corpus): +# abort(403) +# return render_template( +# 'corpora/update_corpus.html.j2', +# corpus=corpus, +# title='Corpus' +# ) + + @bp.route('/', methods=['DELETE']) @login_required def delete_corpus(corpus_id): @@ -65,7 +97,7 @@ def delete_corpus(corpus_id): db.session.commit() corpus = Corpus.query.get_or_404(corpus_id) - if not (corpus.user == current_user or current_user.is_administrator()): + if not user_can_delete_corpus(current_user, corpus): abort(403) thread = Thread( target=_delete_corpus, @@ -79,6 +111,8 @@ def delete_corpus(corpus_id): @login_required def analyse_corpus(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) + if not user_can_read_corpus(current_user, corpus): + abort(403) return render_template( 'corpora/analyse_corpus.html.j2', corpus=corpus, @@ -96,7 +130,7 @@ def build_corpus(corpus_id): db.session.commit() corpus = Corpus.query.get_or_404(corpus_id) - if not (corpus.user == current_user or current_user.is_administrator()): + if not user_can_update_corpus(current_user, corpus): abort(403) # Check if the corpus has corpus files if not corpus.files.all(): @@ -114,7 +148,7 @@ def build_corpus(corpus_id): @login_required def create_corpus_file(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) - if not (corpus.user == current_user or current_user.is_administrator()): + if not user_can_update_corpus(current_user, corpus): abort(403) form = CreateCorpusFileForm(prefix='create-corpus-file-form') if form.is_submitted(): @@ -157,16 +191,13 @@ def create_corpus_file(corpus_id): ) -@bp.route('//files/', - methods=['GET', 'POST']) +@bp.route('//files/', methods=['GET', 'POST']) @login_required def corpus_file(corpus_id, corpus_file_id): - corpus_file = CorpusFile.query.get_or_404(corpus_file_id) - if corpus_file.corpus.id != corpus_id: - abort(404) + corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404() if not (corpus_file.corpus.user == current_user or current_user.is_administrator()): abort(403) - form = EditCorpusFileForm( + form = UpdateCorpusFileForm( data=corpus_file.to_json_serializeable(), prefix='edit-corpus-file-form' ) @@ -196,9 +227,7 @@ def delete_corpus_file(corpus_id, corpus_file_id): corpus_file.delete() db.session.commit() - corpus_file = CorpusFile.query.get_or_404(corpus_file_id) - if corpus_file.corpus.id != corpus_id: - abort(404) + corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404() if not (corpus_file.corpus.user == current_user or current_user.is_administrator()): abort(403) thread = Thread( @@ -212,9 +241,7 @@ def delete_corpus_file(corpus_id, corpus_file_id): @bp.route('//files//download') @login_required def download_corpus_file(corpus_id, corpus_file_id): - corpus_file = CorpusFile.query.get_or_404(corpus_file_id) - if corpus_file.corpus.id != corpus_id: - abort(404) + corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404() if not (corpus_file.corpus.user == current_user or current_user.is_administrator()): abort(403) return send_from_directory( diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2 index 323c576c..7cc8a8f8 100644 --- a/app/templates/_scripts.html.j2 +++ b/app/templates/_scripts.html.j2 @@ -46,13 +46,13 @@ } // Set the data-length attribute on inputs with the maxlength attribute - for (let inputElement of document.querySelectorAll('input[maxlength]')) { + for (let inputElement of document.querySelectorAll('input[maxlength], textarea[maxlength]')) { inputElement.dataset.length = inputElement.getAttribute('maxlength'); } // Initialize components M.AutoInit(); - M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"], input[data-length][type="email"], input[data-length][type="search"], input[data-length][type="password"], input[data-length][type="tel"], input[data-length][type="url"]')); + M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"], input[data-length][type="email"], input[data-length][type="search"], input[data-length][type="password"], input[data-length][type="tel"], input[data-length][type="url"], textarea[data-length]')); M.Dropdown.init( document.querySelectorAll('#nav-more-dropdown-trigger'), {alignment: 'right', constrainWidth: false, coverTrigger: false} diff --git a/app/templates/corpora/create_corpus.html.j2 b/app/templates/corpora/create_corpus.html.j2 index 50cbc6e7..ccb49877 100644 --- a/app/templates/corpora/create_corpus.html.j2 +++ b/app/templates/corpora/create_corpus.html.j2 @@ -9,28 +9,19 @@

{{ title }}

+

Here you can create a new corpus, just choose a title and a description which will help to identify it later. After the corpus has been created, annotated texts in verticalized text format can be added to it on the corpus overview page.

-
-

Fill out the following form to add a corpus to your corpora.

- arrow_backBack to dashboard -
- -
+
{{ form.hidden_tag() }} -
-
- {{ wtf.render_field(form.title, material_icon='title') }} -
-
- {{ wtf.render_field(form.description, material_icon='description') }} -
-
+ {{ wtf.render_field(form.title, material_icon='title') }} + {{ wtf.render_field(form.description, material_icon='description') }}
+ closeCancel {{ wtf.render_field(form.submit, material_icon='send') }}
diff --git a/app/templates/corpora/create_corpus_file.html.j2 b/app/templates/corpora/create_corpus_file.html.j2 index 55b078e4..44e9ff82 100644 --- a/app/templates/corpora/create_corpus_file.html.j2 +++ b/app/templates/corpora/create_corpus_file.html.j2 @@ -36,6 +36,7 @@
+ closeCancel {{ wtf.render_field(form.submit, material_icon='send') }}
diff --git a/migrations/versions/f2656133df2f_.py b/migrations/versions/f2656133df2f_.py new file mode 100644 index 00000000..31947b5a --- /dev/null +++ b/migrations/versions/f2656133df2f_.py @@ -0,0 +1,41 @@ +"""empty message + +Revision ID: f2656133df2f +Revises: 31b9c0259e6b +Create Date: 2022-11-29 14:17:16.845501 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f2656133df2f' +down_revision = '31b9c0259e6b' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'corpus_files', + sa.Column('description', sa.String(length=255), nullable=True) + ) + + op.alter_column( + 'spacy_nlp_pipeline_models', + 'shared', + new_column_name='is_public' + ) + op.alter_column( + 'tesseract_ocr_pipeline_models', + 'shared', + new_column_name='is_public' + ) + + +def downgrade(): + op.alter_column('tesseract_ocr_pipeline_models', 'is_public', new_column_name='shared') + op.alter_column('spacy_nlp_pipeline_models', 'is_public', new_column_name='shared') + + op.drop_column('corpus_files', 'description') From 102772d1a70f30f36c131e15abce4a807554e17b Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Tue, 29 Nov 2022 16:46:33 +0100 Subject: [PATCH 03/64] user settings page --- app/__init__.py | 3 + app/profile/__init__.py | 5 + app/profile/routes.py | 24 ++++ app/settings/forms.py | 44 +++++++ app/settings/routes.py | 13 ++- app/static/images/user_avatar.png | Bin 0 -> 2011 bytes app/templates/profile/profile_page.html.j2 | 42 +++++++ app/templates/settings/settings.html.j2 | 126 +++++++++++++-------- 8 files changed, 209 insertions(+), 48 deletions(-) create mode 100644 app/profile/__init__.py create mode 100644 app/profile/routes.py create mode 100644 app/static/images/user_avatar.png create mode 100644 app/templates/profile/profile_page.html.j2 diff --git a/app/__init__.py b/app/__init__.py index 78e208d1..960d4e90 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -77,6 +77,9 @@ def create_app(config: Config = Config) -> Flask: from .main import bp as main_blueprint app.register_blueprint(main_blueprint, url_prefix='/') + + from .profile import bp as profile_blueprint + app.register_blueprint(profile_blueprint, url_prefix='/profile') from .services import bp as services_blueprint app.register_blueprint(services_blueprint, url_prefix='/services') diff --git a/app/profile/__init__.py b/app/profile/__init__.py new file mode 100644 index 00000000..c8f843f4 --- /dev/null +++ b/app/profile/__init__.py @@ -0,0 +1,5 @@ +from flask import Blueprint + + +bp = Blueprint('profile', __name__) +from . import routes # noqa diff --git a/app/profile/routes.py b/app/profile/routes.py new file mode 100644 index 00000000..5487d417 --- /dev/null +++ b/app/profile/routes.py @@ -0,0 +1,24 @@ +from flask import render_template, url_for +from flask_login import current_user, login_required +from app import db +from app.models import User +from . import bp + + +@bp.route('') +@login_required +def profile(): + user_image = 'static/images/user_avatar.png' + user_name = current_user.username + last_seen = current_user.last_seen + member_since = current_user.member_since + email = current_user.email + role = current_user.role + return render_template('profile/profile_page.html.j2', + user_image=user_image, + user_name=user_name, + last_seen=last_seen, + member_since=member_since, + email=email, + role=role) + diff --git a/app/settings/forms.py b/app/settings/forms.py index 4e7eacf2..1403b501 100644 --- a/app/settings/forms.py +++ b/app/settings/forms.py @@ -1,10 +1,12 @@ from flask_wtf import FlaskForm from wtforms import ( BooleanField, + FileField, PasswordField, SelectField, StringField, SubmitField, + TextAreaField, ValidationError ) from wtforms.validators import ( @@ -47,6 +49,9 @@ class ChangePasswordForm(FlaskForm): class EditGeneralSettingsForm(FlaskForm): + user_avatar = FileField( + 'Image File' + ) email = StringField( 'E-Mail', validators=[InputRequired(), Length(max=254), Email()] @@ -65,8 +70,41 @@ class EditGeneralSettingsForm(FlaskForm): ) ] ) + full_name = StringField( + 'Full name', + validators=[Length(max=128)] + ) + bio = TextAreaField( + 'About me', + validators=[ + Length(max=254) + ] + ) + website = StringField( + 'Website', + validators=[ + Length(max=254) + ] + ) + organization = StringField( + 'Organization', + validators=[ + Length(max=128) + ] + ) + location = StringField( + 'Location', + validators=[ + Length(max=128) + ] + ) + submit = SubmitField() + def validate_image_file(self, field): + if not field.data.filename.lower().endswith('.jpg' or '.png' or '.jpeg'): + raise ValidationError('only .jpg, .png and .jpeg!') + def __init__(self, user, *args, **kwargs): super().__init__(*args, **kwargs) self.user = user @@ -96,3 +134,9 @@ class EditNotificationSettingsForm(FlaskForm): (x.name, x.name.capitalize()) for x in UserSettingJobStatusMailNotificationLevel ] + +class EditPrivacySettingsForm(FlaskForm): + public_profile = BooleanField( + 'Public profile' + ) + submit = SubmitField() diff --git a/app/settings/routes.py b/app/settings/routes.py index 26b7fdda..42400136 100644 --- a/app/settings/routes.py +++ b/app/settings/routes.py @@ -6,7 +6,8 @@ from . import bp from .forms import ( ChangePasswordForm, EditGeneralSettingsForm, - EditNotificationSettingsForm + EditNotificationSettingsForm, + EditPrivacySettingsForm ) @@ -26,7 +27,10 @@ def settings(): data=current_user.to_json_serializeable(), prefix='edit-notification-settings-form' ) - + edit_privacy_settings_form = EditPrivacySettingsForm( + data=current_user.to_json_serializeable(), + prefix='edit-privacy-settings-form' + ) if change_password_form.submit.data and change_password_form.validate(): current_user.password = change_password_form.new_password.data db.session.commit() @@ -49,10 +53,13 @@ def settings(): db.session.commit() flash('Your changes have been saved') return redirect(url_for('.settings')) + user_image = 'static/images/user_avatar.png' return render_template( 'settings/settings.html.j2', change_password_form=change_password_form, edit_general_settings_form=edit_general_settings_form, edit_notification_settings_form=edit_notification_settings_form, - title='Settings' + edit_privacy_settings_form=edit_privacy_settings_form, + user_image=user_image, + title='Profile & Settings' ) diff --git a/app/static/images/user_avatar.png b/app/static/images/user_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..09892098aa943af5fe95e7dd434a07fe03e7ccd1 GIT binary patch literal 2011 zcmV<12PF83P)D!y%g4vZ*x1<2%*?Q`u)x5;+S=OH)zz}HvdGBD zw6wIs!oteR%FWHqrlzLJ$;r^r(7(UGt*x!9s;a}o!>FjJ#>U3Iy}i%R&$YF+x3{;h zuCCtR-nO>3udlDMv9Z$9(zv*|ySuyA*4EqG+ZlWNivR!y*-1n}RCr$O+*gj>NDPM2 zpNco<96RTn9rwSi8F&oCZFlz#Qq{xgJ4+x4LZrx&UjP6A00000000000000000000 z0000000000h)13Iv~gIg9X6)(&Ma2$kko6>k^LchuGJIe1?9VT%ih&$-<6da;(GtY zRygU`V`YKSGPJdX%aOK)>O)}bd#Gv~*uA$6-S28s*y-CA`a9YL;;WKvrF0c*ZKyul z)*h=`7wH^W2Elqsjqd}?Xz*Ptp%PkVVMQxo5?Bs`i9Upe<)onxU}?Eo>Ro7Cj@nv* ze0H1D=vvOYdIRQ`ySe^?YRPg}s_G9&F3o|+E;KJf72K|Qva4ddGB4O%8ki>o6?HI`i*6#+w#5|Y?<y|LwN+|wJ-DOs*c9lZ(lz;YDS^$r~880p|x z??Sy~IVsik0el`?F2Y>=KFtcZ1R zaGELyc&axa?H!NJ`jhg5v~%-y@6vvAx%c&^lgbGsy=v!Q)n20Y000000000000000 z0000001(G=0_9$3(l{U9f4Ydqf&CDSql-`X!}G?Z(<>_@q?M!EmqlnRgo`h=qe`mH zp^F!L#dKMP=0-j66q)X!m2_UKU< z?=gcl`PrjD-Z_UQ!Oo*l-Y$R@ac4on7M&O-j9L_~HG+QG8x@#l(9NwQst~Om6uTU# z#^D0B?jkA@-9e`x4^-yi2NWuOs^gbXXX{ZRZwp;qmr8Y=vc4+;?DuSiV=6Wdp+vB! zYWn~xgnKHt51~MOqTGjPD@PoaW3S(TV1qAdpLGPU;{}n+CNZ&z1&l zAk)yBhI<>K$Szko#25&!NK0f~qZEphQ8{ z3aIf)#a^Mvnrf|~$}^REhB95M)P*|TX3iCPq&kn#$aR|+5*6uFl|Ix;s7M0Ewp3#a z)kYpw@J3LsOsPOxLcOd<@p>5y2p=fiLkJUGpQ800tayqjR`dizEyTFw96Gb|` z!YX_?aV~Q~zz%VD}8+~-=U|TkA>Od+oZ}G}nbJRjS zi+DxREJj@nPrRDb5Owl07n$q)ia(q8)f$NXg*KhY?6EB-U9U5WqIxO65S z|C%@HT<{BxaK1b6FYI^o5WlAp7RhA6Kem`8MTkGt$mX+;7JpOgV>ZtqfL8IK*!Dm6 zzQ>>P{QXCNTMXj=+Nnb$0D%|)f;hy>mx(1hlm3f?BA8dZ4V=5bdfd6DDtbSk-BC3w tPksUb00000000000000000000fEW70#Mag`cL)Fg002ovPDHLkV1gNB=am2e literal 0 HcmV?d00001 diff --git a/app/templates/profile/profile_page.html.j2 b/app/templates/profile/profile_page.html.j2 new file mode 100644 index 00000000..cf724303 --- /dev/null +++ b/app/templates/profile/profile_page.html.j2 @@ -0,0 +1,42 @@ +{% extends "base.html.j2" %} +{% import "materialize/wtf.html.j2" as wtf %} + +{% block page_content %} +
+
+
+
+
+
+
+
+ user-image +
+
+
+

{{ user_name }}

+
Last seen: {{ last_seen }}
+

location_onBielefeld

+

+
+

Inga Kirschnick

+

Bio

+
+
+
+
+
+

{{ email }}

+

Webseite

+

Organization

+

Member since: {{ member_since }}

+

Role: {{ role }}

+
+
+
+
+
+
+
+
+{% endblock page_content %} diff --git a/app/templates/settings/settings.html.j2 b/app/templates/settings/settings.html.j2 index e229a382..a61e77ad 100644 --- a/app/templates/settings/settings.html.j2 +++ b/app/templates/settings/settings.html.j2 @@ -14,63 +14,99 @@ {{ edit_general_settings_form.hidden_tag() }}
- General settings - {{ wtf.render_field(edit_general_settings_form.username, material_icon='person') }} - {{ wtf.render_field(edit_general_settings_form.email, material_icon='email') }} + Your profile +
+
+
+ user-image + {{wtf.render_field(edit_general_settings_form.user_avatar, accept='image/*', class='file-path validate')}} +
+
+
+ {{ wtf.render_field(edit_general_settings_form.username, material_icon='person') }} + {{ wtf.render_field(edit_general_settings_form.email, material_icon='email') }} + {{ wtf.render_field(edit_general_settings_form.full_name, material_icon='badge') }} + {{ wtf.render_field(edit_general_settings_form.bio, material_icon='description') }} +
+
+
+
+ {{ wtf.render_field(edit_general_settings_form.website, material_icon='laptop') }} + {{ wtf.render_field(edit_general_settings_form.organization, material_icon='business') }} + {{ wtf.render_field(edit_general_settings_form.location, material_icon='location_on') }} +
+
{{ wtf.render_field(edit_general_settings_form.submit, material_icon='send') }}
- -
- + + -
- {{ edit_notification_settings_form.hidden_tag() }}
- Notification settings - {{ wtf.render_field(edit_notification_settings_form.job_status_mail_notification_level, material_icon='notifications') }} -
-
-
- {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} + Settings + + {{ edit_notification_settings_form.hidden_tag() }} +
+
+ Notification settings + {{ wtf.render_field(edit_notification_settings_form.job_status_mail_notification_level, material_icon='notifications') }} +
+
+
+ {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} +
+
+
+ + +
+
+ Privacy settings + {{ wtf.render_field(edit_privacy_settings_form.public_profile) }} +
+
+
+ {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} +
+
+
+ +
+ {{ change_password_form.hidden_tag() }} +
+
+ Change Password + {{ wtf.render_field(change_password_form.password, material_icon='vpn_key') }} + {{ wtf.render_field(change_password_form.new_password, material_icon='vpn_key') }} + {{ wtf.render_field(change_password_form.new_password_2, material_icon='vpn_key') }} +
+
+
+ {{ wtf.render_field(change_password_form.submit, material_icon='send') }} +
+
+
+
+ +
+
+ Delete account +

Deleting an account has the following effects:

+
    +
  • All data associated with your corpora and jobs will be permanently deleted.
  • +
  • All settings will be permanently deleted.
  • +
+
+
- - -
- {{ change_password_form.hidden_tag() }} -
-
- Change Password - {{ wtf.render_field(change_password_form.password, material_icon='vpn_key') }} - {{ wtf.render_field(change_password_form.new_password, material_icon='vpn_key') }} - {{ wtf.render_field(change_password_form.new_password_2, material_icon='vpn_key') }} -
-
-
- {{ wtf.render_field(change_password_form.submit, material_icon='send') }} -
-
-
-
- -
-
- Delete account -

Deleting an account has the following effects:

-
    -
  • All data associated with your corpora and jobs will be permanently deleted.
  • -
  • All settings will be permanently deleted.
  • -
-
-
From a009bbe1f941f9adfd178182ae255f804b574e2d Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Wed, 30 Nov 2022 14:36:42 +0100 Subject: [PATCH 04/64] Profile page --- app/admin/routes.py | 16 +-- app/models.py | 5 + app/profile/forms.py | 87 ++++++++++++++ app/profile/routes.py | 55 +++++++-- app/settings/forms.py | 12 +- app/settings/routes.py | 19 +--- app/templates/_sidenav.html.j2 | 12 +- app/templates/profile/edit_profile.html.j2 | 43 +++++++ app/templates/profile/profile_page.html.j2 | 61 ++++++++-- app/templates/settings/settings.html.j2 | 125 +++++++-------------- migrations/versions/4820fa2e3ee2_.py | 44 ++++++++ 11 files changed, 345 insertions(+), 134 deletions(-) create mode 100644 app/profile/forms.py create mode 100644 app/templates/profile/edit_profile.html.j2 create mode 100644 migrations/versions/4820fa2e3ee2_.py diff --git a/app/admin/routes.py b/app/admin/routes.py index c4480e18..90d9034d 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -5,7 +5,7 @@ from app import db, hashids from app.decorators import admin_required from app.models import Role, User, UserSettingJobStatusMailNotificationLevel from app.settings.forms import ( - EditGeneralSettingsForm, + EditProfileSettingsForm, EditNotificationSettingsForm ) from . import bp @@ -51,10 +51,10 @@ def edit_user(user_id): data={'confirmed': user.confirmed, 'role': user.role.hashid}, prefix='admin-edit-user-form' ) - edit_general_settings_form = EditGeneralSettingsForm( + edit_profile_settings_form = EditProfileSettingsForm( user, data=user.to_json_serializeable(), - prefix='edit-general-settings-form' + prefix='edit-profile-settings-form' ) edit_notification_settings_form = EditNotificationSettingsForm( data=user.to_json_serializeable(), @@ -68,10 +68,10 @@ def edit_user(user_id): db.session.commit() flash('Your changes have been saved') return redirect(url_for('.edit_user', user_id=user.id)) - if (edit_general_settings_form.submit.data - and edit_general_settings_form.validate()): - user.email = edit_general_settings_form.email.data - user.username = edit_general_settings_form.username.data + if (edit_profile_settings_form.submit.data + and edit_profile_settings_form.validate()): + user.email = edit_profile_settings_form.email.data + user.username = edit_profile_settings_form.username.data db.session.commit() flash('Your changes have been saved') return redirect(url_for('.edit_user', user_id=user.id)) @@ -87,7 +87,7 @@ def edit_user(user_id): return render_template( 'admin/edit_user.html.j2', admin_edit_user_form=admin_edit_user_form, - edit_general_settings_form=edit_general_settings_form, + edit_profile_settings_form=edit_profile_settings_form, edit_notification_settings_form=edit_notification_settings_form, title='Edit user', user=user diff --git a/app/models.py b/app/models.py index c607dc5f..62d0d99b 100644 --- a/app/models.py +++ b/app/models.py @@ -262,6 +262,11 @@ class User(HashidMixin, UserMixin, db.Model): default=UserSettingJobStatusMailNotificationLevel.END ) last_seen = db.Column(db.DateTime()) + full_name = db.Column(db.String(64)) + about_me = db.Column(db.String(256)) + location = db.Column(db.String(64)) + website = db.Column(db.String(128)) + organization = db.Column(db.String(128)) # Backrefs: role: Role # Relationships tesseract_ocr_pipeline_models = db.relationship( diff --git a/app/profile/forms.py b/app/profile/forms.py new file mode 100644 index 00000000..bcb9daf9 --- /dev/null +++ b/app/profile/forms.py @@ -0,0 +1,87 @@ +from flask_wtf import FlaskForm +from wtforms import ( + FileField, + StringField, + SubmitField, + TextAreaField, + ValidationError +) +from wtforms.validators import ( + InputRequired, + Email, + Length, + Regexp +) +from app.models import User +from app.auth import USERNAME_REGEX + +class EditProfileSettingsForm(FlaskForm): + user_avatar = FileField( + 'Image File' + ) + email = StringField( + 'E-Mail', + validators=[InputRequired(), Length(max=254), Email()] + ) + username = StringField( + 'Username', + validators=[ + InputRequired(), + Length(max=64), + Regexp( + USERNAME_REGEX, + message=( + 'Usernames must have only letters, numbers, dots or ' + 'underscores' + ) + ) + ] + ) + full_name = StringField( + 'Full name', + validators=[Length(max=128)] + ) + about_me = TextAreaField( + 'About me', + validators=[ + Length(max=254) + ] + ) + website = StringField( + 'Website', + validators=[ + Length(max=254) + ] + ) + organization = StringField( + 'Organization', + validators=[ + Length(max=128) + ] + ) + location = StringField( + 'Location', + validators=[ + Length(max=128) + ] + ) + + submit = SubmitField() + + def __init__(self, user, *args, **kwargs): + super().__init__(*args, **kwargs) + self.user = user + + def validate_email(self, field): + if (field.data != self.user.email + and User.query.filter_by(email=field.data).first()): + raise ValidationError('Email already registered') + + def validate_username(self, field): + if (field.data != self.user.username + and User.query.filter_by(username=field.data).first()): + raise ValidationError('Username already in use') + + def validate_image_file(self, field): + if not field.data.filename.lower().endswith('.jpg' or '.png' or '.jpeg'): + raise ValidationError('only .jpg, .png and .jpeg!') diff --git a/app/profile/routes.py b/app/profile/routes.py index 5487d417..8001ddb4 100644 --- a/app/profile/routes.py +++ b/app/profile/routes.py @@ -1,24 +1,61 @@ -from flask import render_template, url_for +from flask import flash, redirect, render_template, url_for from flask_login import current_user, login_required from app import db from app.models import User from . import bp - +from .forms import ( + EditProfileSettingsForm +) @bp.route('') @login_required def profile(): user_image = 'static/images/user_avatar.png' user_name = current_user.username - last_seen = current_user.last_seen - member_since = current_user.member_since + last_seen = f'{current_user.last_seen.strftime("%Y-%m-%d %H:%M")}' + location = 'Bielefeld' + about_me = '''Lorem ipsum dolor sit amet, consetetur sadipscing elitr, + sed diam nonumy eirmod tempor invidunt ut labore et dolore + magna aliquyam erat, sed diam voluptua. At vero eos et accusam + et justo duo dolores et ea rebum. Stet clita kasd gubergren, + no sea takimat''' + full_name = 'Inga Kirschnick' email = current_user.email - role = current_user.role + website = 'https://nopaque.uni-bielefeld.de' + organization = 'Universität Bielefeld' + member_since = f'{current_user.member_since.strftime("%Y-%m-%d")}' return render_template('profile/profile_page.html.j2', user_image=user_image, user_name=user_name, - last_seen=last_seen, - member_since=member_since, - email=email, - role=role) + last_seen=last_seen, + location=location, + about_me=about_me, + full_name=full_name, + email=email, + website=website, + organization=organization, + member_since=member_since) +@bp.route('/edit') +@login_required +def edit_profile(): + edit_profile_settings_form = EditProfileSettingsForm( + current_user, + data=current_user.to_json_serializeable(), + prefix='edit-profile-settings-form' + ) + if (edit_profile_settings_form.submit.data + and edit_profile_settings_form.validate()): + current_user.email = edit_profile_settings_form.email.data + current_user.username = edit_profile_settings_form.username.data + current_user.about_me = edit_profile_settings_form.about_me.data + current_user.location = edit_profile_settings_form.location.data + current_user.organization = edit_profile_settings_form.organization.data + current_user.website = edit_profile_settings_form.website.data + current_user.full_name = edit_profile_settings_form.full_name.data + db.session.commit() + flash('Your changes have been saved') + return redirect(url_for('.profile.edit_profile')) + return render_template('profile/edit_profile.html.j2', + edit_profile_settings_form=edit_profile_settings_form, + title='Edit Profile') diff --git a/app/settings/forms.py b/app/settings/forms.py index 1403b501..25bb5f1f 100644 --- a/app/settings/forms.py +++ b/app/settings/forms.py @@ -48,7 +48,7 @@ class ChangePasswordForm(FlaskForm): raise ValidationError('Invalid password') -class EditGeneralSettingsForm(FlaskForm): +class EditProfileSettingsForm(FlaskForm): user_avatar = FileField( 'Image File' ) @@ -74,7 +74,7 @@ class EditGeneralSettingsForm(FlaskForm): 'Full name', validators=[Length(max=128)] ) - bio = TextAreaField( + about_me = TextAreaField( 'About me', validators=[ Length(max=254) @@ -101,10 +101,6 @@ class EditGeneralSettingsForm(FlaskForm): submit = SubmitField() - def validate_image_file(self, field): - if not field.data.filename.lower().endswith('.jpg' or '.png' or '.jpeg'): - raise ValidationError('only .jpg, .png and .jpeg!') - def __init__(self, user, *args, **kwargs): super().__init__(*args, **kwargs) self.user = user @@ -118,6 +114,10 @@ class EditGeneralSettingsForm(FlaskForm): if (field.data != self.user.username and User.query.filter_by(username=field.data).first()): raise ValidationError('Username already in use') + + def validate_image_file(self, field): + if not field.data.filename.lower().endswith('.jpg' or '.png' or '.jpeg'): + raise ValidationError('only .jpg, .png and .jpeg!') class EditNotificationSettingsForm(FlaskForm): diff --git a/app/settings/routes.py b/app/settings/routes.py index 42400136..d7e36218 100644 --- a/app/settings/routes.py +++ b/app/settings/routes.py @@ -5,7 +5,6 @@ from app.models import UserSettingJobStatusMailNotificationLevel from . import bp from .forms import ( ChangePasswordForm, - EditGeneralSettingsForm, EditNotificationSettingsForm, EditPrivacySettingsForm ) @@ -18,11 +17,6 @@ def settings(): current_user, prefix='change-password-form' ) - edit_general_settings_form = EditGeneralSettingsForm( - current_user, - data=current_user.to_json_serializeable(), - prefix='edit-general-settings-form' - ) edit_notification_settings_form = EditNotificationSettingsForm( data=current_user.to_json_serializeable(), prefix='edit-notification-settings-form' @@ -36,13 +30,7 @@ def settings(): db.session.commit() flash('Your changes have been saved') return redirect(url_for('.index')) - if (edit_general_settings_form.submit.data - and edit_general_settings_form.validate()): - current_user.email = edit_general_settings_form.email.data - current_user.username = edit_general_settings_form.username.data - db.session.commit() - flash('Your changes have been saved') - return redirect(url_for('.settings')) + if (edit_notification_settings_form.submit.data and edit_notification_settings_form.validate()): current_user.setting_job_status_mail_notification_level = ( @@ -53,13 +41,10 @@ def settings(): db.session.commit() flash('Your changes have been saved') return redirect(url_for('.settings')) - user_image = 'static/images/user_avatar.png' return render_template( 'settings/settings.html.j2', change_password_form=change_password_form, - edit_general_settings_form=edit_general_settings_form, edit_notification_settings_form=edit_notification_settings_form, edit_privacy_settings_form=edit_privacy_settings_form, - user_image=user_image, - title='Profile & Settings' + title='Settings' ) diff --git a/app/templates/_sidenav.html.j2 b/app/templates/_sidenav.html.j2 index b0ea6de8..f87f701e 100644 --- a/app/templates/_sidenav.html.j2 +++ b/app/templates/_sidenav.html.j2 @@ -2,8 +2,16 @@
  • - {{ current_user.username }} - +
    + + +
    + {{ current_user.username }} + +
    +
  • nopaque
  • diff --git a/app/templates/profile/edit_profile.html.j2 b/app/templates/profile/edit_profile.html.j2 new file mode 100644 index 00000000..3a5ce381 --- /dev/null +++ b/app/templates/profile/edit_profile.html.j2 @@ -0,0 +1,43 @@ +{% extends "base.html.j2" %} +{% import "materialize/wtf.html.j2" as wtf %} + +{% block page_content %} +
    +
    +
    +

    {{ title }}

    +
    +
    +
    + {{ edit_profile_settings_form.hidden_tag() }} +
    +
    +
    +
    +
    + user-image + {{wtf.render_field(edit_profile_settings_form.user_avatar, accept='image/*', class='file-path validate')}} +
    +
    +
    + {{ wtf.render_field(edit_profile_settings_form.username, material_icon='person') }} + {{ wtf.render_field(edit_profile_settings_form.email, material_icon='email') }} + {{ wtf.render_field(edit_profile_settings_form.full_name, material_icon='badge') }} + {{ wtf.render_field(edit_profile_settings_form.about_me, material_icon='description') }} + {{ wtf.render_field(edit_profile_settings_form.website, material_icon='laptop') }} + {{ wtf.render_field(edit_profile_settings_form.organization, material_icon='business') }} + {{ wtf.render_field(edit_profile_settings_form.location, material_icon='location_on') }} +
    +
    +
    +
    +
    + {{ wtf.render_field(edit_profile_settings_form.submit, material_icon='send') }} +
    +
    +
    +
    +
    +
    +
    +{% endblock page_content %} diff --git a/app/templates/profile/profile_page.html.j2 b/app/templates/profile/profile_page.html.j2 index cf724303..fd4648aa 100644 --- a/app/templates/profile/profile_page.html.j2 +++ b/app/templates/profile/profile_page.html.j2 @@ -10,33 +10,76 @@
    + {% if about_me %} + user-image + {% else %} user-image + {% endif %}

    {{ user_name }}

    Last seen: {{ last_seen }}
    -

    location_onBielefeld

    + {% if location %} +

    location_on{{ location }}

    + {% endif %}


    -

    Inga Kirschnick

    -

    Bio

    + {% if about_me%} +
    +
    + About me +

    {{ about_me }}

    +
    +
    + {% endif %}
    -

    {{ email }}

    -

    Webseite

    -

    Organization

    -

    Member since: {{ member_since }}

    -

    Role: {{ role }}

    + + {% if full_name %} + + + + + {% endif %} + {% if email %} + + + + + {% endif %} + {% if website %} + + + + + {% endif %} + {% if organization %} + + + + + {% endif %} +
    person{{ full_name }}
    email{{ email }}
    laptop{{ website }}
    business{{ organization }}
    +
    +

    Member since: {{ member_since }}

    +

    +
    + Edit profile
    - +
    +
    + +
    + +
    {% endblock page_content %} diff --git a/app/templates/settings/settings.html.j2 b/app/templates/settings/settings.html.j2 index a61e77ad..b33ab0a1 100644 --- a/app/templates/settings/settings.html.j2 +++ b/app/templates/settings/settings.html.j2 @@ -8,38 +8,46 @@

    {{ title }}

    -
    - {{ edit_general_settings_form.hidden_tag() }} + {{ edit_notification_settings_form.hidden_tag() }}
    - Your profile -
    -
    -
    - user-image - {{wtf.render_field(edit_general_settings_form.user_avatar, accept='image/*', class='file-path validate')}} -
    -
    -
    - {{ wtf.render_field(edit_general_settings_form.username, material_icon='person') }} - {{ wtf.render_field(edit_general_settings_form.email, material_icon='email') }} - {{ wtf.render_field(edit_general_settings_form.full_name, material_icon='badge') }} - {{ wtf.render_field(edit_general_settings_form.bio, material_icon='description') }} -
    -
    -
    -
    - {{ wtf.render_field(edit_general_settings_form.website, material_icon='laptop') }} - {{ wtf.render_field(edit_general_settings_form.organization, material_icon='business') }} - {{ wtf.render_field(edit_general_settings_form.location, material_icon='location_on') }} -
    -
    + Notification settings + {{ wtf.render_field(edit_notification_settings_form.job_status_mail_notification_level, material_icon='notifications') }}
    - {{ wtf.render_field(edit_general_settings_form.submit, material_icon='send') }} + {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} +
    +
    +
    +
    + +
    +
    + Privacy settings + {{ wtf.render_field(edit_privacy_settings_form.public_profile) }} +
    +
    +
    + {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} +
    +
    +
    + +
    + {{ change_password_form.hidden_tag() }} +
    +
    + Change Password + {{ wtf.render_field(change_password_form.password, material_icon='vpn_key') }} + {{ wtf.render_field(change_password_form.new_password, material_icon='vpn_key') }} + {{ wtf.render_field(change_password_form.new_password_2, material_icon='vpn_key') }} +
    +
    +
    + {{ wtf.render_field(change_password_form.submit, material_icon='send') }}
    @@ -47,64 +55,15 @@
    - Settings - - {{ edit_notification_settings_form.hidden_tag() }} -
    -
    - Notification settings - {{ wtf.render_field(edit_notification_settings_form.job_status_mail_notification_level, material_icon='notifications') }} -
    -
    -
    - {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} -
    -
    -
    - - -
    -
    - Privacy settings - {{ wtf.render_field(edit_privacy_settings_form.public_profile) }} -
    -
    -
    - {{ wtf.render_field(edit_notification_settings_form.submit, material_icon='send') }} -
    -
    -
    - -
    - {{ change_password_form.hidden_tag() }} -
    -
    - Change Password - {{ wtf.render_field(change_password_form.password, material_icon='vpn_key') }} - {{ wtf.render_field(change_password_form.new_password, material_icon='vpn_key') }} - {{ wtf.render_field(change_password_form.new_password_2, material_icon='vpn_key') }} -
    -
    -
    - {{ wtf.render_field(change_password_form.submit, material_icon='send') }} -
    -
    -
    -
    - -
    -
    - Delete account -

    Deleting an account has the following effects:

    -
      -
    • All data associated with your corpora and jobs will be permanently deleted.
    • -
    • All settings will be permanently deleted.
    • -
    -
    - -
    + Delete account +

    Deleting an account has the following effects:

    +
      +
    • All data associated with your corpora and jobs will be permanently deleted.
    • +
    • All settings will be permanently deleted.
    • +
    +
    +
    diff --git a/migrations/versions/4820fa2e3ee2_.py b/migrations/versions/4820fa2e3ee2_.py new file mode 100644 index 00000000..4f821f66 --- /dev/null +++ b/migrations/versions/4820fa2e3ee2_.py @@ -0,0 +1,44 @@ +"""Add profile pages columns to users table + +Revision ID: 4820fa2e3ee2 +Revises: 31b9c0259e6b +Create Date: 2022-11-30 10:03:49.080576 + +""" +from alembic import op +import sqlalchemy as sa + +revision = '4820fa2e3ee2' +down_revision = '31b9c0259e6b' +branch_labels = None +depends_on = None + +def upgrade(): + + op.add_column( + 'users', + sa.Column('full_name', sa.String(length=64), nullable=True) + ) + op.add_column( + 'users', + sa.Column('about_me', sa.String(length=256), nullable=True) + ) + op.add_column( + 'users', + sa.Column('location', sa.String(length=64), nullable=True) + ) + op.add_column( + 'users', + sa.Column('website', sa.String(length=128), nullable=True) + ) + op.add_column( + 'users', + sa.Column('organization', sa.String(length=128), nullable=True) + ) + +def downgrade(): + op.drop_column('users', 'organization') + op.drop_column('users', 'website') + op.drop_column('users', 'location') + op.drop_column('users', 'about_me') + op.drop_column('users', 'full_name') From c8d7de434f6ecd1fa93432bb92a47e099b633247 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 30 Nov 2022 14:58:45 +0100 Subject: [PATCH 05/64] Extend CorpusList for use in public corpora route --- app/corpora/routes.py | 16 ++++++------- app/static/js/RessourceLists/CorpusList.js | 9 +++++++ app/templates/corpora/corpora.html.j2 | 28 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 app/templates/corpora/corpora.html.j2 diff --git a/app/corpora/routes.py b/app/corpora/routes.py index a2d14af7..f3cdf8f1 100644 --- a/app/corpora/routes.py +++ b/app/corpora/routes.py @@ -31,14 +31,17 @@ def user_can_delete_corpus(user, corpus): @bp.route('') @login_required def corpora(): - corpora = Corpus.query.filter(Corpus.user_id == current_user.id | Corpus.is_public == True).all() - return render_template('corpora/corpora.html', corpora=corpora) + query = Corpus.query.filter( + (Corpus.user_id == current_user.id) | (Corpus.is_public == True) + ) + corpora = [c.to_json_serializeable() for c in query.all()] + return render_template('corpora/corpora.html.j2', corpora=corpora, title='Corpora') @bp.route('/create', methods=['GET', 'POST']) @login_required def create_corpus(): - form = CreateCorpusForm(prefix='create-corpus-form') + form = CreateCorpusForm() if form.validate_on_submit(): try: corpus = Corpus.create( @@ -150,7 +153,7 @@ def create_corpus_file(corpus_id): corpus = Corpus.query.get_or_404(corpus_id) if not user_can_update_corpus(current_user, corpus): abort(403) - form = CreateCorpusFileForm(prefix='create-corpus-file-form') + form = CreateCorpusFileForm() if form.is_submitted(): if not form.validate(): response = {'errors': form.errors} @@ -197,10 +200,7 @@ def corpus_file(corpus_id, corpus_file_id): corpus_file = CorpusFile.query.filter_by(corpus_id = corpus_id, id=corpus_file_id).first_or_404() if not (corpus_file.corpus.user == current_user or current_user.is_administrator()): abort(403) - form = UpdateCorpusFileForm( - data=corpus_file.to_json_serializeable(), - prefix='edit-corpus-file-form' - ) + form = UpdateCorpusFileForm(data=corpus_file.to_json_serializeable()) if form.validate_on_submit(): form.populate_obj(corpus_file) if db.session.is_modified(corpus_file): diff --git a/app/static/js/RessourceLists/CorpusList.js b/app/static/js/RessourceLists/CorpusList.js index 0721a807..a16b1ce7 100644 --- a/app/static/js/RessourceLists/CorpusList.js +++ b/app/static/js/RessourceLists/CorpusList.js @@ -1,4 +1,12 @@ class CorpusList extends RessourceList { + static instances = []; + + static getInstance(elem) { + return CorpusList.instances.find((instance) => { + return instance.listjs.list === elem; + }); + } + static autoInit() { for (let corpusListElement of document.querySelectorAll('.corpus-list:not(.no-autoinit)')) { new CorpusList(corpusListElement); @@ -59,6 +67,7 @@ class CorpusList extends RessourceList { constructor(listElement, options = {}) { super(listElement, {...CorpusList.options, ...options}); + CorpusList.instances.push(this); } init(user) { diff --git a/app/templates/corpora/corpora.html.j2 b/app/templates/corpora/corpora.html.j2 new file mode 100644 index 00000000..ee184a48 --- /dev/null +++ b/app/templates/corpora/corpora.html.j2 @@ -0,0 +1,28 @@ +{% extends "base.html.j2" %} + +{% block page_content %} +
    +
    +
    +

    {{ title }}

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +{% endblock page_content %} + + +{% block scripts %} +{{ super() }} + +{% endblock scripts %} From 7be410d66a3ee4678c5acf4fb9ead25da2a00d05 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 30 Nov 2022 15:13:20 +0100 Subject: [PATCH 06/64] Change migrationscript running order --- migrations/versions/4820fa2e3ee2_.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/migrations/versions/4820fa2e3ee2_.py b/migrations/versions/4820fa2e3ee2_.py index 4f821f66..1e9380b3 100644 --- a/migrations/versions/4820fa2e3ee2_.py +++ b/migrations/versions/4820fa2e3ee2_.py @@ -1,7 +1,7 @@ """Add profile pages columns to users table Revision ID: 4820fa2e3ee2 -Revises: 31b9c0259e6b +Revises: f2656133df2f Create Date: 2022-11-30 10:03:49.080576 """ @@ -9,7 +9,7 @@ from alembic import op import sqlalchemy as sa revision = '4820fa2e3ee2' -down_revision = '31b9c0259e6b' +down_revision = 'f2656133df2f' branch_labels = None depends_on = None From 620d9d1ea2eefbadfdb4f62ebb30bb7c76f402e1 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 30 Nov 2022 15:13:52 +0100 Subject: [PATCH 07/64] add missing file --- migrations/versions/4820fa2e3ee2_.py | 1 - 1 file changed, 1 deletion(-) diff --git a/migrations/versions/4820fa2e3ee2_.py b/migrations/versions/4820fa2e3ee2_.py index 1e9380b3..da60c450 100644 --- a/migrations/versions/4820fa2e3ee2_.py +++ b/migrations/versions/4820fa2e3ee2_.py @@ -14,7 +14,6 @@ branch_labels = None depends_on = None def upgrade(): - op.add_column( 'users', sa.Column('full_name', sa.String(length=64), nullable=True) From be517a04afaaba347cd22bd4797d660423aea05f Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Mon, 5 Dec 2022 09:40:02 +0100 Subject: [PATCH 08/64] Update profile page with avatar --- app/admin/routes.py | 2 +- app/models.py | 25 +++++- app/profile/forms.py | 2 +- app/profile/routes.py | 88 ++++++++++++---------- app/settings/forms.py | 84 +++------------------ app/templates/profile/edit_profile.html.j2 | 21 ++++-- app/templates/profile/profile_page.html.j2 | 47 +++++------- app/templates/settings/settings.html.j2 | 8 +- migrations/versions/ef6a275f8079_.py | 36 +++++++++ nopaque.py | 2 + 10 files changed, 160 insertions(+), 155 deletions(-) create mode 100644 migrations/versions/ef6a275f8079_.py diff --git a/app/admin/routes.py b/app/admin/routes.py index 90d9034d..2f50b999 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -5,9 +5,9 @@ from app import db, hashids from app.decorators import admin_required from app.models import Role, User, UserSettingJobStatusMailNotificationLevel from app.settings.forms import ( - EditProfileSettingsForm, EditNotificationSettingsForm ) +from app.profile.forms import EditProfileSettingsForm from . import bp from .forms import AdminEditUserForm diff --git a/app/models.py b/app/models.py index 1e2cfb32..7927c81f 100644 --- a/app/models.py +++ b/app/models.py @@ -244,7 +244,17 @@ class Token(db.Model): yesterday = datetime.utcnow() - timedelta(days=1) Token.query.filter(Token.refresh_expiration < yesterday).delete() - +class Avatar(HashidMixin, FileMixin, db.Model): + __tablename__ = 'avatars' + # Primary key + id = db.Column(db.Integer, primary_key=True) + # Foreign keys + user_id = db.Column(db.Integer, db.ForeignKey('users.id')) + + @property + def path(self): + return os.path.join(self.user.path, 'avatar') + class User(HashidMixin, UserMixin, db.Model): __tablename__ = 'users' # Primary key @@ -269,6 +279,12 @@ class User(HashidMixin, UserMixin, db.Model): organization = db.Column(db.String(128)) # Backrefs: role: Role # Relationships + avatar = db.relationship( + 'Avatar', + backref='user', + cascade='all, delete-orphan', + uselist=False + ) tesseract_ocr_pipeline_models = db.relationship( 'TesseractOCRPipelineModel', backref='user', @@ -299,7 +315,7 @@ class User(HashidMixin, UserMixin, db.Model): cascade='all, delete-orphan', lazy='dynamic' ) - + def __init__(self, **kwargs): super().__init__(**kwargs) if self.role is not None: @@ -497,6 +513,11 @@ class User(HashidMixin, UserMixin, db.Model): ), 'member_since': f'{self.member_since.isoformat()}Z', 'username': self.username, + 'full_name': self.full_name, + 'about_me': self.about_me, + 'website': self.website, + 'location': self.location, + 'organization': self.organization, 'job_status_mail_notification_level': \ self.setting_job_status_mail_notification_level.name } diff --git a/app/profile/forms.py b/app/profile/forms.py index bcb9daf9..20bd4ad4 100644 --- a/app/profile/forms.py +++ b/app/profile/forms.py @@ -16,7 +16,7 @@ from app.models import User from app.auth import USERNAME_REGEX class EditProfileSettingsForm(FlaskForm): - user_avatar = FileField( + avatar = FileField( 'Image File' ) email = StringField( diff --git a/app/profile/routes.py b/app/profile/routes.py index 8001ddb4..74d742be 100644 --- a/app/profile/routes.py +++ b/app/profile/routes.py @@ -1,51 +1,58 @@ -from flask import flash, redirect, render_template, url_for +from flask import ( + abort, + flash, + Markup, + redirect, + render_template, + send_from_directory, + url_for +) from flask_login import current_user, login_required +import os from app import db -from app.models import User +from app.models import Avatar from . import bp from .forms import ( EditProfileSettingsForm ) -@bp.route('') +@bp.before_request @login_required -def profile(): - user_image = 'static/images/user_avatar.png' - user_name = current_user.username - last_seen = f'{current_user.last_seen.strftime("%Y-%m-%d %H:%M")}' - location = 'Bielefeld' - about_me = '''Lorem ipsum dolor sit amet, consetetur sadipscing elitr, - sed diam nonumy eirmod tempor invidunt ut labore et dolore - magna aliquyam erat, sed diam voluptua. At vero eos et accusam - et justo duo dolores et ea rebum. Stet clita kasd gubergren, - no sea takimat''' - full_name = 'Inga Kirschnick' - email = current_user.email - website = 'https://nopaque.uni-bielefeld.de' - organization = 'Universität Bielefeld' - member_since = f'{current_user.member_since.strftime("%Y-%m-%d")}' - return render_template('profile/profile_page.html.j2', - user_image=user_image, - user_name=user_name, - last_seen=last_seen, - location=location, - about_me=about_me, - full_name=full_name, - email=email, - website=website, - organization=organization, - member_since=member_since) +def before_request(): + pass -@bp.route('/edit') -@login_required + +@bp.route('') +def profile(): + return render_template('profile/profile_page.html.j2', + user=current_user) + +@bp.route('/avatars/') +def avatar_download(avatar_id): + avatar_file = Avatar.query.get_or_404(avatar_id) + if not (avatar_file and avatar_file.filename): + abort(404) + return send_from_directory( + os.path.dirname(avatar_file.path), + os.path.basename(avatar_file.path), + as_attachment=True, + attachment_filename=avatar_file.filename, + mimetype=avatar_file.mimetype + ) + +@bp.route('/edit-profile', methods=['GET', 'POST']) def edit_profile(): - edit_profile_settings_form = EditProfileSettingsForm( + edit_profile_settings_form = EditProfileSettingsForm( current_user, data=current_user.to_json_serializeable(), prefix='edit-profile-settings-form' - ) - if (edit_profile_settings_form.submit.data - and edit_profile_settings_form.validate()): + ) + if edit_profile_settings_form.validate_on_submit(): + if edit_profile_settings_form.avatar.data: + try: + Avatar.create(edit_profile_settings_form.avatar.data, user=current_user) + except (AttributeError, OSError): + abort(500) current_user.email = edit_profile_settings_form.email.data current_user.username = edit_profile_settings_form.username.data current_user.about_me = edit_profile_settings_form.about_me.data @@ -54,8 +61,9 @@ def edit_profile(): current_user.website = edit_profile_settings_form.website.data current_user.full_name = edit_profile_settings_form.full_name.data db.session.commit() - flash('Your changes have been saved') - return redirect(url_for('.profile.edit_profile')) - return render_template('profile/edit_profile.html.j2', - edit_profile_settings_form=edit_profile_settings_form, - title='Edit Profile') + message = Markup(f'Profile settings updated') + flash(message, 'success') + return redirect(url_for('.profile')) + return render_template('profile/edit_profile.html.j2', + edit_profile_settings_form=edit_profile_settings_form, + title='Edit Profile') diff --git a/app/settings/forms.py b/app/settings/forms.py index 25bb5f1f..335f73d3 100644 --- a/app/settings/forms.py +++ b/app/settings/forms.py @@ -47,79 +47,6 @@ class ChangePasswordForm(FlaskForm): if not self.user.verify_password(field.data): raise ValidationError('Invalid password') - -class EditProfileSettingsForm(FlaskForm): - user_avatar = FileField( - 'Image File' - ) - email = StringField( - 'E-Mail', - validators=[InputRequired(), Length(max=254), Email()] - ) - username = StringField( - 'Username', - validators=[ - InputRequired(), - Length(max=64), - Regexp( - USERNAME_REGEX, - message=( - 'Usernames must have only letters, numbers, dots or ' - 'underscores' - ) - ) - ] - ) - full_name = StringField( - 'Full name', - validators=[Length(max=128)] - ) - about_me = TextAreaField( - 'About me', - validators=[ - Length(max=254) - ] - ) - website = StringField( - 'Website', - validators=[ - Length(max=254) - ] - ) - organization = StringField( - 'Organization', - validators=[ - Length(max=128) - ] - ) - location = StringField( - 'Location', - validators=[ - Length(max=128) - ] - ) - - submit = SubmitField() - - def __init__(self, user, *args, **kwargs): - super().__init__(*args, **kwargs) - self.user = user - - def validate_email(self, field): - if (field.data != self.user.email - and User.query.filter_by(email=field.data).first()): - raise ValidationError('Email already registered') - - def validate_username(self, field): - if (field.data != self.user.username - and User.query.filter_by(username=field.data).first()): - raise ValidationError('Username already in use') - - def validate_image_file(self, field): - if not field.data.filename.lower().endswith('.jpg' or '.png' or '.jpeg'): - raise ValidationError('only .jpg, .png and .jpeg!') - - class EditNotificationSettingsForm(FlaskForm): job_status_mail_notification_level = SelectField( 'Job status mail notification level', @@ -136,7 +63,14 @@ class EditNotificationSettingsForm(FlaskForm): ] class EditPrivacySettingsForm(FlaskForm): - public_profile = BooleanField( - 'Public profile' + private_profile = BooleanField( + 'Private profile' ) + private_email = BooleanField( + 'Private email' + ) + only_username = BooleanField( + 'Show only username' + ) + submit = SubmitField() diff --git a/app/templates/profile/edit_profile.html.j2 b/app/templates/profile/edit_profile.html.j2 index 3a5ce381..e1a49ef4 100644 --- a/app/templates/profile/edit_profile.html.j2 +++ b/app/templates/profile/edit_profile.html.j2 @@ -5,18 +5,23 @@
    -

    {{ title }}

    -
    +

    {{ title }}

    +
    +
    -
    - {{ edit_profile_settings_form.hidden_tag() }} -
    +
    +
    + {{ edit_profile_settings_form.hidden_tag() }}
    + {% if current_user.avatar %} + user-image + {% else %} user-image - {{wtf.render_field(edit_profile_settings_form.user_avatar, accept='image/*', class='file-path validate')}} + {% endif %} + {{wtf.render_field(edit_profile_settings_form.avatar, accept='image/jpeg, image/png, image/gif', class='file-path validate')}}
    @@ -35,8 +40,8 @@ {{ wtf.render_field(edit_profile_settings_form.submit, material_icon='send') }}
    -
    - + +
    diff --git a/app/templates/profile/profile_page.html.j2 b/app/templates/profile/profile_page.html.j2 index fd4648aa..2845aedd 100644 --- a/app/templates/profile/profile_page.html.j2 +++ b/app/templates/profile/profile_page.html.j2 @@ -9,27 +9,26 @@
    -
    - {% if about_me %} - user-image +
    + {% if user.avatar %} + user-image {% else %} - user-image + user-image {% endif %}
    -
    -

    {{ user_name }}

    -
    Last seen: {{ last_seen }}
    - {% if location %} -

    location_on{{ location }}

    +

    {{ user.username }}

    +
    Last seen: {{ user.last_seen.strftime('%Y-%m-%d %H:%M') }}
    + {% if user.location %} +

    location_on{{ user.location }}

    {% endif %}


    - {% if about_me%} + {% if user.about_me%}
    About me -

    {{ about_me }}

    +

    {{ user.about_me }}

    {% endif %} @@ -39,47 +38,41 @@
    - {% if full_name %} + {% if user.full_name %} - + {% endif %} - {% if email %} + {% if user.email %} - + {% endif %} - {% if website %} + {% if user.website %} - + {% endif %} - {% if organization %} + {% if user.organization %} - + {% endif %}
    person{{ full_name }} {{ user.full_name }}
    email{{ email }}{{ user.email }}
    laptop{{ website }}{{ user.website }}
    business{{ organization }}{{ user.organization }}

    -

    Member since: {{ member_since }}

    +

    Member since: {{ user.member_since.strftime('%Y-%m-%d') }}


    - Edit profile + Edit profile
    -
    -
    - -
    - -
    {% endblock page_content %} diff --git a/app/templates/settings/settings.html.j2 b/app/templates/settings/settings.html.j2 index b33ab0a1..f272e63a 100644 --- a/app/templates/settings/settings.html.j2 +++ b/app/templates/settings/settings.html.j2 @@ -27,7 +27,13 @@
    Privacy settings - {{ wtf.render_field(edit_privacy_settings_form.public_profile) }} +
    + {{ wtf.render_field(edit_privacy_settings_form.private_profile) }} +
    + {{ wtf.render_field(edit_privacy_settings_form.private_email) }} +
    + {{ wtf.render_field(edit_privacy_settings_form.only_username) }} +
    diff --git a/migrations/versions/ef6a275f8079_.py b/migrations/versions/ef6a275f8079_.py new file mode 100644 index 00000000..0371f1b2 --- /dev/null +++ b/migrations/versions/ef6a275f8079_.py @@ -0,0 +1,36 @@ +"""empty message + +Revision ID: ef6a275f8079 +Revises: 4820fa2e3ee2 +Create Date: 2022-12-01 14:23:22.688572 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ef6a275f8079' +down_revision = '4820fa2e3ee2' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('avatars', + sa.Column('creation_date', sa.DateTime(), nullable=True), + sa.Column('filename', sa.String(length=255), nullable=True), + sa.Column('mimetype', sa.String(length=255), nullable=True), + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('avatars') + # ### end Alembic commands ### diff --git a/nopaque.py b/nopaque.py index cf1b1dec..6ecb2cf0 100644 --- a/nopaque.py +++ b/nopaque.py @@ -5,6 +5,7 @@ eventlet.monkey_patch() from app import cli, create_app, db, scheduler, socketio # noqa from app.models import ( + Avatar, Corpus, CorpusFile, Job, @@ -34,6 +35,7 @@ def make_context() -> Dict[str, Any]: def make_shell_context() -> Dict[str, Any]: ''' Adds variables to the shell context. ''' return { + 'Avatar': Avatar, 'Corpus': Corpus, 'CorpusFile': CorpusFile, 'db': db, From 91f38a47136ff9ebc7d6832311665c6cd8e9d77c Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Mon, 5 Dec 2022 09:50:42 +0100 Subject: [PATCH 09/64] update migrations script --- migrations/versions/ef6a275f8079_.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/migrations/versions/ef6a275f8079_.py b/migrations/versions/ef6a275f8079_.py index 0371f1b2..56fc6469 100644 --- a/migrations/versions/ef6a275f8079_.py +++ b/migrations/versions/ef6a275f8079_.py @@ -1,4 +1,4 @@ -"""empty message +"""Add avatar table and conncect it to users Revision ID: ef6a275f8079 Revises: 4820fa2e3ee2 @@ -9,7 +9,6 @@ from alembic import op import sqlalchemy as sa -# revision identifiers, used by Alembic. revision = 'ef6a275f8079' down_revision = '4820fa2e3ee2' branch_labels = None @@ -17,7 +16,6 @@ depends_on = None def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### op.create_table('avatars', sa.Column('creation_date', sa.DateTime(), nullable=True), sa.Column('filename', sa.String(length=255), nullable=True), @@ -27,10 +25,7 @@ def upgrade(): sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) - # ### end Alembic commands ### def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### op.drop_table('avatars') - # ### end Alembic commands ### From 3ee62f0a829231f276eac17925c682a771f5b8d3 Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Mon, 5 Dec 2022 16:25:54 +0100 Subject: [PATCH 10/64] profile page update for other users --- app/profile/routes.py | 23 +++--- .../js/RessourceLists/PublicCorporaList.js | 70 +++++++++++++++++++ app/static/js/RessourceLists/RessourceList.js | 1 + app/templates/_scripts.html.j2 | 1 + app/templates/_sidenav.html.j2 | 2 +- app/templates/profile/edit_profile.html.j2 | 26 ++++--- app/templates/profile/profile_page.html.j2 | 23 +++++- 7 files changed, 124 insertions(+), 22 deletions(-) create mode 100644 app/static/js/RessourceLists/PublicCorporaList.js diff --git a/app/profile/routes.py b/app/profile/routes.py index 74d742be..4702dcb7 100644 --- a/app/profile/routes.py +++ b/app/profile/routes.py @@ -10,7 +10,7 @@ from flask import ( from flask_login import current_user, login_required import os from app import db -from app.models import Avatar +from app.models import Avatar, User from . import bp from .forms import ( EditProfileSettingsForm @@ -22,14 +22,15 @@ def before_request(): pass -@bp.route('') -def profile(): +@bp.route('/') +def profile(user_id): + user = User.query.get_or_404(user_id) return render_template('profile/profile_page.html.j2', - user=current_user) + user=user) -@bp.route('/avatars/') -def avatar_download(avatar_id): - avatar_file = Avatar.query.get_or_404(avatar_id) +@bp.route('//avatars/') +def avatar_download(user_id, avatar_id): + avatar_file = Avatar.query.filter_by(user_id = user_id, id = avatar_id).first_or_404() if not (avatar_file and avatar_file.filename): abort(404) return send_from_directory( @@ -40,8 +41,9 @@ def avatar_download(avatar_id): mimetype=avatar_file.mimetype ) -@bp.route('/edit-profile', methods=['GET', 'POST']) -def edit_profile(): +@bp.route('//edit-profile', methods=['GET', 'POST']) +def edit_profile(user_id): + user = User.query.get_or_404(user_id) edit_profile_settings_form = EditProfileSettingsForm( current_user, data=current_user.to_json_serializeable(), @@ -63,7 +65,8 @@ def edit_profile(): db.session.commit() message = Markup(f'Profile settings updated') flash(message, 'success') - return redirect(url_for('.profile')) + return redirect(url_for('.profile', user_id=user.id)) return render_template('profile/edit_profile.html.j2', edit_profile_settings_form=edit_profile_settings_form, + user=user, title='Edit Profile') diff --git a/app/static/js/RessourceLists/PublicCorporaList.js b/app/static/js/RessourceLists/PublicCorporaList.js new file mode 100644 index 00000000..2171396e --- /dev/null +++ b/app/static/js/RessourceLists/PublicCorporaList.js @@ -0,0 +1,70 @@ +class PublicCorporaList extends RessourceList { + static instances = []; + + static getInstance(elem) { + return PublicCorporaList.instances.find((instance) => { + return instance.listjs.list === elem; + }); + } + + static autoInit() { + for (let publicCorporaListElement of document.querySelectorAll('.public-corpora-list:not(.no-autoinit)')) { + new PublicCorporaList(publicCorporaListElement); + } + } + + static options = { + initialHtmlGenerator: (id) => { + return ` +
    + search + + +
    + + + + + + + + + + +
    TitleDescription
    +
      + `.trim(); + }, + item: ` + + book + + + + `.trim(), + ressourceMapper: (corpus) => { + return { + 'id': corpus.id, + 'creation-date': corpus.creation_date, + 'description': corpus.description, + 'title': corpus.title + }; + }, + sortArgs: ['creation-date', {order: 'desc'}], + valueNames: [ + {data: ['id']}, + {data: ['creation-date']}, + 'description', + 'title' + ] + }; + + constructor(listElement, options = {}) { + super(listElement, {...PublicCorporaList.options, ...options}); + PublicCorporaList.instances.push(this); + } + + init(user) { + this._init(user.corpora.is_public); + } +} diff --git a/app/static/js/RessourceLists/RessourceList.js b/app/static/js/RessourceLists/RessourceList.js index 871a1e2f..5af7a231 100644 --- a/app/static/js/RessourceLists/RessourceList.js +++ b/app/static/js/RessourceLists/RessourceList.js @@ -10,6 +10,7 @@ class RessourceList { JobList.autoInit(); JobInputList.autoInit(); JobResultList.autoInit(); + PublicCorporaList.autoInit(); SpaCyNLPPipelineModelList.autoInit(); TesseractOCRPipelineModelList.autoInit(); UserList.autoInit(); diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2 index 7cc8a8f8..8ff90c33 100644 --- a/app/templates/_scripts.html.j2 +++ b/app/templates/_scripts.html.j2 @@ -24,6 +24,7 @@ 'js/RessourceLists/JobList.js', 'js/RessourceLists/JobInputList.js', 'js/RessourceLists/JobResultList.js', + 'js/RessourceLists/PublicCorporaList.js', 'js/RessourceLists/SpacyNLPPipelineModelList.js', 'js/RessourceLists/TesseractOCRPipelineModelList.js', 'js/RessourceLists/UserList.js' diff --git a/app/templates/_sidenav.html.j2 b/app/templates/_sidenav.html.j2 index f87f701e..cd86fe6c 100644 --- a/app/templates/_sidenav.html.j2 +++ b/app/templates/_sidenav.html.j2 @@ -4,7 +4,7 @@
      diff --git a/app/templates/profile/edit_profile.html.j2 b/app/templates/profile/edit_profile.html.j2 index e1a49ef4..1f4bd0e7 100644 --- a/app/templates/profile/edit_profile.html.j2 +++ b/app/templates/profile/edit_profile.html.j2 @@ -14,16 +14,24 @@
      {{ edit_profile_settings_form.hidden_tag() }}
      -
      -
      - {% if current_user.avatar %} - user-image - {% else %} - user-image - {% endif %} - {{wtf.render_field(edit_profile_settings_form.avatar, accept='image/jpeg, image/png, image/gif', class='file-path validate')}} +
      +
      +
      +
      + {% if current_user.avatar %} + user-image + {% else %} + user-image + {% endif %} +
      +
      +
      +
      +
      + {{wtf.render_field(edit_profile_settings_form.avatar, accept='image/jpeg, image/png, image/gif', placeholder="Choose an image file")}} +
      +
      -
      {{ wtf.render_field(edit_profile_settings_form.username, material_icon='person') }} {{ wtf.render_field(edit_profile_settings_form.email, material_icon='email') }} diff --git a/app/templates/profile/profile_page.html.j2 b/app/templates/profile/profile_page.html.j2 index 2845aedd..dbcd78ca 100644 --- a/app/templates/profile/profile_page.html.j2 +++ b/app/templates/profile/profile_page.html.j2 @@ -11,7 +11,7 @@
      {% if user.avatar %} - user-image + user-image {% else %} user-image {% endif %} @@ -67,12 +67,31 @@

      Member since: {{ user.member_since.strftime('%Y-%m-%d') }}


      - Edit profile + {% if current_user.is_authenticated and current_user.id == user.id %} + Edit profile + {% endif %}
      +
      +
      +
      +
      +

      Groups

      +
      +
      +
      +
      +
      +
      +

      Public corpora

      +
      +
      +
      +
      +
      {% endblock page_content %} From 7856e97402082464ff58de50bbb8edbc6241c26a Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Wed, 7 Dec 2022 14:02:33 +0100 Subject: [PATCH 11/64] Social area update --- app/templates/_navbar.html.j2 | 3 ++- app/templates/_sidenav.html.j2 | 3 ++- app/templates/main/dashboard.html.j2 | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/templates/_navbar.html.j2 b/app/templates/_navbar.html.j2 index e2d4db64..d90118b8 100644 --- a/app/templates/_navbar.html.j2 +++ b/app/templates/_navbar.html.j2 @@ -29,7 +29,8 @@
      -
    • nopaque
    • + {#
    • nopaque
    • #}
    • emailNews
    • helpManual
    • dashboardDashboard
    • IMy Corpora
    • JMy Jobs
    • +
    • groupsSocial
    • new_labelContribute
    • Processes & Services
    • diff --git a/app/templates/main/dashboard.html.j2 b/app/templates/main/dashboard.html.j2 index ec03609d..e0354ea6 100644 --- a/app/templates/main/dashboard.html.j2 +++ b/app/templates/main/dashboard.html.j2 @@ -42,6 +42,25 @@
      +
      +

      Social

      +
      +
      +
      + Other users and groups +

      Find other users and follow them to see their corpora and groups.

      +
      +
      +
      +
      +
      +
      + Public corpora +

      Find public corpora

      +
      +
      +
      +
      {% endblock page_content %} From c51a47a9aa4480d4aecf87ec15ed3fa41fb5348f Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 7 Dec 2022 14:04:36 +0100 Subject: [PATCH 12/64] Add first work for masto news and update public coropora page --- app/static/images/parallax_hq/canvas.png | Bin 0 -> 317770 bytes app/templates/corpora/corpora.html.j2 | 24 ++++++++++++++--- app/templates/main/news.html.j2 | 32 +++++++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 app/static/images/parallax_hq/canvas.png diff --git a/app/static/images/parallax_hq/canvas.png b/app/static/images/parallax_hq/canvas.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdbf0b60343234f0442914709806e56bafc838f GIT binary patch literal 317770 zcmeFZc|6o@`#+2nCG8PHi>0zvwj@hemsCPsLUxrKGv3-|zG{U9t=&d%E3E(JCPUbJ?rrF7Xd{&DpH1g_!E3W2osnv^a@KZTbl* ztEZU`dS!04c_NF}%%rF=mr|wnbD!pNBql$`qmI|(cNI^D<6F|!Z&rT6ZbW>lY*1HMhqHM_-j`7Zb23Korm`W^Jv_XT3~~dN6k`(Ay#Z zAZxCdcq<0A@G*vPfK_fqw0V%>p_tSpg+-^dq1E}b;S@^u`|`5o8|4%W{*6TrD$)`Q!k071?0@*zmgV&%Fbpsehr+1EM)!-@FIfS7uRYJq67&LjT82+42)4l&2b>v7iUdIrFBTq!5d+ji| zk{nO?lRwn);m$`qdDD0ofp@z61yReOXXve=dE?{7(cww$u&OSJsNh0%%;*ib8uytdNogN+PR>+S~&imVoN zWa@)sK@4uH^fjZ4o+oH{YQ%V>cXMKsgvIuKE*E#fwN^YG3Wq2)p=GnHFv6ZK3M2Fung z5Q4@`LY>E=f;Cwa&sX9idP<+OrfVyc%YuXJx=ZFl=2y5)j&>=Q^89}GeFRa^HmG@9 zPi8;>eKy+R##r`_9s+LqYqZ?O1SW~$9j0=L<>8Q=TrCuc`Dmwb&wrC~L$B!PGm=cY z{xNEn_3p;mKn(hN0sRmmgrH4$st~tx8$%;aq*3ZFA^rnC)Vyz;a;dCC&N~=`-XB5V zFUHGxm4H_bdY)f8L4kofi)PXl?XmCm%&3yokDD7eK18Rv4AnP^!mCH;WBCtwW;TKR z*s^D?YCEHzM6{X^{D7Z0;9ql%pGFxd)ELW#&lMONW6?zu`-u3Fbjwyl?O&;ZLCZ!1 zeEDqhG+3XQG>OXk8@=?{sX4XXM`{jKzeDp%Img`3eVfxcKQ&@7eyON7AypTft2O-b zyk)bzrEJ;!ZQ2(@0b{p|zvM*gN*;Meb?4Qul@NR=xVtB zy4W`nPs*~j44yQM4-T#S-KDH_I^uS(-f`W@yEMALCbguqZo)k0nC`+Or)o*L`7={P zar!LX;>71QPF?LBr&Ds^jbi3x_>XZgf!sxjDZn6_X_ z+-NG|Fg!Z*oK@&*9qc}KQMy;$_vBH>*!yOs9?@d`H=nO392aw$pQ-S_QWWaZ-nKXS zLaoY!qJrsP;=Dv@+F|#teLmpt5^VBMyqub4(!XD!V6MSZT+_DHIHFH=KPvfBeH8}1 zO@Xlnr;tF<&a!lx2<)X?-s#e$vW?N=LBAWd`5{_z=~x>6bOC5yXSOw_DIY1Oi!&|X0(`8QRWici@!n8HVPzB<3b2-?(gj2=lqxV zQbae5GSJC6`#&yDjj`y%R8bnGz1^SLmdrp=c@8DpeUZBE^hVpQ{r9od=Z8}RQuoAb zRB6>{zDc!@Px$`iuExEr_IWmC7l*Q!MQX;|W%U{&P12}`E$iu=4U-(6$p5cznq zI&1DKBh|ocG{eC>uv%ESyjPu}{bE`_vyE6xco14%$k*F3(;)3Zy=kLCDhXJmZIm|l z?egiACyY*9+&GsUyr*d3NqCuqF1oBFYVBghwfF~Vsyoq%(dDN1REDOje2BrUIY<89 zWS_Kod#|~D5{BQCb>nR((W&91ZC~dnO~YtV(fX?WA3$b3NlR!Yy^GmGmL=>gNVT#%8y{ z`)C>bNaRVTO%si>C$LN}0%9*B$t`X7Hin5=Yst{Mhv=bGNp-3;I}G}LjfAt(bO2f- zrs2N=u&Nx5ql2?!>I!>jl+b5Y9^~>)3t6r%J?`CD)m@b2NiinQ zua&#FY}6s(0H)Zra}IxA{)<9s++%5L$p3_S^l+8#$;8__I3uzCKJp6ubWo08St99l z_LnJ9hYqhl^(2O+0tTX+S!bw{A8PR9R_7YE45^6`8TbeYstAv7Yw{p&TpU6#-PZ?8 zYG!6AXWhC)u!!?A#o%^F?~PDePP21+F2u(~iKb7_Xf7Gq^~Jdn>w=bsip?9rjDO zxU>JTfK2tg1+(LQWXaS?-_COce+xUEkJ(olT3Q&>xBge!+xlNwreroc1YPe@eV`!T zs5@7|(qujfcj>*Z^RBJkOIP^)M16f@hw`cHoTU`EKm2y5y4yV!yJ>35v-#J_9s$&^ zl2Pb{Q^SwvOAFk@7c==SM2B8?Mo)QHnq=U*o)Y}h4y$5Vl`AifJGJu=u62DanZ7VC z@nvx=If}8#E&mG7Lf4{Q?r<$JdeMQ|{hr7>yE!;XB=}`1{VM(~$<%u~uO?x#^0~99 z$V5PH+hKHe>YVr60kQsmQ+WsFxayd|-595f`G!UD-x(r!qZkJ{GmRt%?;{iHO!~H+ z>VZmUEOSd-KHx{P?4*w>GbW$aP?A##qmp-9bsrfXh1m`LfOI zFvD#Y-sG}byQ_5g1@U%Om&a!91uF9a@t%K_muAhxkYT?)t)S zZA$1Bwr?E2``7o^cy+!XUS&y_LH{u}UX8829QR#)A zl!4rU9ObgQftlcAHLb)?mB|zGqIH9J7GJ6~#U|5SU82KVdLxP~14|C3Ml;OZKOE?- z|CC(fI@+r`t~IIXHB?&JfzN5XJ3~!2ci7I5bGH&|Zobkl#zbikwWOV{#RsPQqWkwS zeA5b;s2z+oEqNp~dAt~4%PgZb;tX}ftrxHE0pT<87~M+|&ak4olZLFR?xtBY2Y<{J$61p&svP3>Mf}wCU(FlEvfEZLvXD_-HgUpEhfEc zMYloNy}mBAd|FB1=-Tvbr8rEsvbajnyYq8ZT^k6U+s9wE%6VMB;Pv5f=%VgORhRIs z(w=Nu=krH2a#xn}e1^l*guv^}I7@S+JP=B-QQH?CezJEgzUGZd(3=y8y0l-)<7PJf zo_@P4D|{$&k;$sKUvspZDN%Lw5|46@l3whw^-47>YNM$8&*ok1DZX%>4@cQI?VZuowl4$~MbuCNR1`}${T@)3b+BftdIYB+o)V^F>NnY5M0$c2 z&}E{U)8pujT72V#&lC~pTa@Run06ovc{vq@J0GG2l9OxjcS-2#K=o#H3Be{gUp`zJ zz!BA7mQ=Y4#zpEYU&`Yxn-Vigr5QiePP*XX=Ocuq3AnEzSw^_ zb$IQ)+mQnIUWPenjNkWstUdQ6T&}wGS=;hA)A^mAS7t}53%>})Jkj<^!YLMIxH@Ma zthxOncm2!@ym{ilRND480}_J*^(X56s@0OdCh=Eo+|?yowirqaHOOPUG%RwPh>tMQ zW!_2cDx2fGO>(eTE43?T>C~tg?{e7ap@aJFkBiR7&cnb;H zSF#VyPepEAtn4QFSASn#BbiWpKW_l_#m0Y-+;#B70sP4RdC&0KoBIoc7IJB2o888r zx>S{rtA=_h*johcB6aneL>lFEldTypgkXa!>^C;krzXCne`hE$*0?AF?!3>69Y|1O zm{d30$twVrXlbN4!)tv@aA#UA{{2coAo^7W=YuY=jGjKN#8t426W4I<@R~OvJv9KI z-T?b+ciwwi-_E38v!(dt!umMrP}~dP^~!v8U@<{EAq7Bg4etC)?*f9hq$N5rv)qCm zB|1~bCWG2jSp8{JqIDu=TReEkN?X;|MQbmVPQGzUeqP~MEm?){-({I&6(2Bm@A=!; zt~)SZ&7J67@zJD1>RP?OYKugi*SYJa5qLz0v3Me=r#GrF!+%{Yp}f)HNQb$leDd7K zzA34+)9AW5TGe?`k{-*6dFHLq(CySts|m?UQMI{+SvkG6Xqi*19^)4lE{s)5CztFh zny>#P9b5sMOLk;e6Mm(yi{*}8WcoCg*8cwA6l0Z#g)>i{y*HKEK7E< zrVX9PWmk0NcXC0P3t_4E`HII8@ktd)$7ymLDL>0cpg#hbJ~OJ zcd44Rzq1PxJKXH)_^7&GOGj(+Rk~{Y_-sb9cxJVVy_MQ)(M8M#us_)2?C~DT5vnAK z)I0$`I&s~<G7w+ zD8&{lvo#1Yb!8l&Q6^imb9Tm{XRTTEdK<`&&p+!Xv%RpqBJzBDa3N5?~wv-p(^N=1SBN57TV4E3p5IIu+t z)h;NGK<*v%^+qvKnnRZ@_&c^ijcp@~!PzsE^^B<_UOsp&O$;vHM_qx>9jWQEA_+D* z=$K?VhHp_ZB_Whh}Y zdLNwE7D;G(?Ug25cUU3*sPgnLxx+@swFZhJWW%CVO^r>oJSXuYnub?3c3S26j&^zl zY6-qOoDz^zG&o3$N^TE$H-4$xF7IVqdv4paIaA%IhbG3uTUDt0Fot6<_{$bcH3YZp z*-kx4{!p(W^{#90G zxue zBJc0n{Xc#`9?*C*CyRFiLkROJw~z@*ib znI`S_wM(9aR?QHAX){rwx&N@wIrn?Cc^UzJ&)q03>g0 z{y+R+GvBxe5A{vpjAvy;nc-&Pa{m&=_Mlnko%TWIAmTdp_IN+YOCaM-PEh^5avLL^ zNw4ctXDy}U>b?bof{QD`XpknGoCPzj6Ky9Z!Y}Mbw<*P6aX?QyRpWj}5s{Kzn8r^; z!-cCoi`EgZuQ=mJKi83zjtl`qq+aiIsxELg9=j;0XM!s8?gre90@WoA#Jk4G5fVsp3r)qBRHM-wF}O<^pZx^yL(+-p$K_}A zf*?9Mkj;*TOo#<0D$nBgPwTcg=u;)TMsLv(29a-yjz-U(8F8*Nhf*d!e@FQ3@@YtV z)3<@Nt)30C#NZeTj=tkDK)BnpbWP>*CyuF}Pyh!hoH2 z#U4zX$~8qfI+@d?Ss5b{QQ-@f%F)KUC(4DCk1Ln#-yP5FJ6Jtv|;e_AZ8=&esG@Wf;N4x>zjG>;&rB+si?M@y^jx*NV*cl zFqZJI?Yk)vCi!-eBZB+cw?CYX*cjOr+(oO-FZQeN+T?I=bfApt$M7=z8n(CxHd|=P z{So|vCrwjw*oA#<>EnPe_naooqCnRIA+sNZ%)so0EB(q0kzftrOm;VuOdM|jStH=j zX-)VjogD2|8?zzeH_H3G$AIrK>4#$OH447_1#Vc~k0&`K1=5uU=Cn62WDi(bF8D`u)nO zr0>tRpa1-vZs_RC7g&E_@mlM)E<1E1ZLXI>v??~+!LVMQx8Wgr{#JWtOH%)a*xMmM zh)`!O1MP(x{oIYeCNb$Ung)qxoKU<#(+fFe9qbVF>;xG*QNY9HG#bxTh1R^{EpKu{rHI6!A4yTGcAWCr>sKuR|xc8-f!#COT zDyz&s;dqJ);&|kkd{ojrBz$CdN;=0UPiF6ZePg!VGa@18mb`$F5NDr<=-=W z<`XOC1Z5yZ4udZKl9{U$c_HFtgzgS2>*1R=L2jrbg^Lmo45bx(7ww(^1#_C8DRMbQ z|C6<#8o4pTqvvG!Qywf!u<85l8N#ze^C!K`-*YZlttT)-l{`e<)lYJ1XyIPFEdT4mX0# z&slW_^*g5Bmq2CP?=sw)lwhaEBkk)tQB=Q8KP8b*z2sTxHWQZUbTDgx7T>D3h!aJ{ z69zXEtM&HJQ(Dw{aNZ;0>R6@aDEx&6p1DMZIr*Aa&!L51nMJjcWvmm-lVcZ!%ngeg zi`jGD_`jL+GGUD77%O{f1s}f#Yz_6=%A&|m0aotxIUFK)_yodUvv58>qjVisPk)OrDuBTx}s_% zTc*g`tWjy1oCAI{bn%chkKvX4gX^YiG$Y5u?vFP@<=8TD-+SCW)cG4@-f>98NMtSb z!ULWCFdm!v=bkIDB0%96{>ZGXZEaY2MQ$4dMPtY82$lyM&R*sTeeNIj;s@Vmvi=F3(bKR>Yxj8#rTQKwz;Z)`~slD=lsf<10`8qEDsRo~BN)=rZ<} zbgoO2qw}vw&5N*Cnr}hpNLiQA$0Sg$z=^XhS74P9HwP%YWtpqBE*8WM1%`>s#Ucgl zb&dmMO{w=^;_r|-Wk#jQwc3r@#@p_xo&k~GMdd_xaWS)LYoVG}|M&Bjg{kQzpB21( zBb$*4o1~;AixE@;nW~|3@6ZVkL9iKAZRW8By>NZ(laTx40qvWoWcooa2<|BkFPr*I ziR`)_$RvC0iVF$Lv<&)UR5WxwW{ul3qh>Wxz9?{1NNt>8%nG@`lYv_IM#Op6`ujCL zV>XP*WgA`Cu{RU>2+H`<%L%3_ddQNKlbca5?U306MAznA_1?J`qycbW+zngf6fur3 zYxLy1ZsL#I1#=vMT5Rf`od!uk{4lCCt2ncI>r-~H+77SlhgiiUv1-AmJ9C!#dNJ~l z#qb%{*aI1D`Y80oL;Fr>?%1n}jYsX?Z!#t;k6UU^Zlpg*TC$-=QJpr`{?|GFzsZ9BEur5 zq;xJg`SMDab>9k*(fj(}innv%N45<^LjaVS>6)f&kne@eCE~Kd6=YTfu<8N>#l_e@ z!lY-mru1)&y~+6?%1^dP0E=1$(Ti{838=J;8ZUcz==-sWKm1(YF6*~Slf@6)24<@Y zu5-=NH}-fn&S#w`SH!4rDl6&tnfcS?^N*RT1ituipf=Lb!eZ?+Q?dSqJCSZ4ioPt$ zOIMyCpWJFXaguB)kEp-KQ;WkzvMA_}nO{ zW`tl6hwHi`%Y#2$-j7c$xovBZQp;Y^-U)XUI|IRr>gAwSWntN2wrlXtu;_QWD>@c^ z=_G&Lc4S2@mW_fguslX4#{TJJZKsbuKbnCk6v=EcqxM~bAMKI6+irR-V!bO5>KbNs zg#L?=`*}XkCx)WrEuriXicEZR=C^_cez#{6vTD41W}Io95qT27;nivVDiDbT&kCuR zjvl(FABL<8&Y-sW)Jj4M$04a(1=q#0Csy){AhM&5B#nZyd*R9K^~Ru!6+Ti{o&@fX zd@xW}e+a7|zx*;V)XO}jvs7AVSY(carQOW37`gt0q^X7=Kt!JGQR3kM@vuA8w-kCyu>QHw-R$mefRJJ$cLLz1b_7Y^W z#wPdH5@f%))^%l*ECMV(S?Z+idzGM)u+AO9=OCM3V*9WM*|Uo9=@a9B$=<%k*-arE z$ttO`r(zKMx8%1Rx>NoR%HK=G0!AqlHGA3lPr&b2yBWS2ywk<;k>mIJVzue%%AfWb z%DIRNmkUUr;k2yZ$kW8AMn&868q8tD z-ni}`^QKG%0>(7)3vK<}I-be?{zVfN>`3 zeax#b>tAhp=(*?ab?+Pb4e`Il@4`M~hxx1JJx+YW@R9i0$6~@n>)7>#>J6@ih~YH? z?utucPrw}`Uunvp6)M@Ce|N){6DcnVLJjHoN)Ipi|KUlzvHVDL zB@u*+Q;6put>wCXc>>@5h~>G5%dOvt2(D{`4iFeJ;h^9A3Z+G`cW2e zNqk;h-R}?JGwFGMDr5JI}FDXz>t+^`iuTwhR+C7=1^kf0J-|POuNh+voXo z^+$PsnYDZ?_T8#G0uO@CY32ySLgB-K=A-Vq0HEFz_Y?mXPyjHA*&gw9Wk$hk>#7qe z_6VQPLRVtMv7AkjE8`RzMZ=QRw(=x=HyWLW|D%(A3(CMu!2s;O$ERP+>ZpEE*@tEOJziWNb%4UG#=19gCs!q*089HUD*U%2Qxx>*Dd1G*jZUyvQ>j> z&dCw_I*9RYNGHZOvGFvmr=tpAgLlu2+qdx*2vpJNA*)MCzc?NQso zKBOCqiPBN1GZQ=sUjvOmg0Y8D@b+@m$rLHzt|(3Mkk(A&Qa=N)FBgeX8GXtPAWKe_ zC}2oLfbmwdlcwAC9SituN}nlrYP4re^M%Y$CXEyh2F!GP4P=%IMBy2f=_U%=Sa~7C z>5hR<#GiSB>$V_WPkFEWl#(atw0Ai9-r0my8@~6M%ORxlH6{4Q0ZKPw(7FnhTKsYH zdrtzE##@#hk8q962My#mY6)9hgT|G&zlBGZk1vPT8zu^8*|68`Fm+_odapL0iVOl< z_G0`Ud)Swgt$SJF{>bI^q$Vr=V)n;&)}+4ADoBY(AdlqlL)xM6B_baq%2(@kjT~Jz z8oG9^?_$Z|5OHS0TjiCGuPHV7sMjB3B2v73f$Q6t%Wjr_#9vMl56QSWr;BYDS{>y% zNm0;B`*6TR*Lku>;|5V^b)E=~LY&3##J+@RR@tAI79nWRs&G@^1~G(gm%CeZzb5@$3zTO4E`y4Eb{i19P34^~&|V>2-o>(?*l^(M zD0_3_&5;Z?L8Gh#f|l=db^&{K=!A2*&ZaGLJzE2R1(-EmqxI&_DVl_D*>tWq8cLK1}3K-R65cp$$*bM!D1wJhxXF@A9>$bg7hnBXEHrPM07DE27 zAEGY`kf&_n^G=J1Pc16C2X}!FT!H42hi96!Aa$F#lXkH0&OZp|9g0LPctgiP>j%M= z-+xV+7cSSNL?&3ORd>$3AB>cQ4sG90JOQJ;puB~0?ghCXJA?wQsFDcU`Ga4oUTa() zhh~%b43}Zf7|L6~i`_1SLO?1ZV}k4KpsK*1ZT{3J!-(kX+ru6_TT?;h4Vm?Sqfrj# z>x6Oc{|bm*mQgW_1iO5yU9q#WBN)^3YWMWH{HG?X<}4`2|1z z*3HaVA?AW8*yr)Lh(9E3tBAI|G$3LoMlFFW*`vW)0guUR@@UEHr8qagcV*j+hb>S< zc@FJ3v5|*}>_E{B<{JEX-aLIK0Aa3ikRgTvy zmv+;B$H@qZoV+54YFdY7hv~!TVo>oRMm)8f9sLSgHi3U2=;7}3S~!V)lkX=0|91lL zU19?yDrb4#PL7E;0PuW(-NU)@{{27jn0?K)ex6>jUXb9?HDuX%ATrjLEc&I^g}g7WB^$Ry&;wNtlqCQ+cwh1$q}HJSyMx0tii2T-_$oDJDOS}eo4 z<_rdMQL~yhUzVsVdf8~NrEI^7k%g`uB2~){X4fX8v1@UU+ym{SS z&QHLtvBCh6`5ararB3+RFdjBy8VdM-cye```F*OQ3)HJEcjelj>##A2Y(?jxg z`2C0aB>oOEPeAKEDA16iOSxTP?eY5E;vo);gMVM`5wwU{|8v^y_zXkOKfhGQBml9! zBWVrL*#R3u1v$<~x#m6tzuSB?Q0oYF#OOs`6nn_u0boWfOZwxo{!@IyVg%pec&9rg z!YE_V844AZ>A1UxN&P`3OuG?>4X|U!@d=-$gLWJ5G~GYLaBLC>gQXBrc;uMNkJQP* z#b(&#%|Go>{}4U<+of?CwhiY2mS@cwMa~NUDXKe4@r_*Jv4_V0ubbhBi>zsOoPS)H zh_Ltt6Mz5Qt7Oc>1GhMuHKPoLvQcRQ0{Mbb@@9*TsDHY^r{yl#y@zv=l7*w<*yRirCRTz0=cHS z8F%pNC4^H&=%oK#fODqv3b;l__>31M$CwlG@@yae24yrk=Q>H<2GeTI88CnGE})EW z(^Kn?Qzh%_%sC_0&x0^?ZcVHIM8x}C_7~yh8{dSC&mFy5Jfv*AWbl$y;IEJdw|alT z{yhz{WhqFHLuse!Pn>~fuL0R4Q}k#}#3QKeBz&vYE(gmxLwg`j5t z?DiUb3vBx$BWW;za0oM(bT{GdIj|8UP6-Z{;B|c>OsH9AWGDb))AY3^Lduxow7H8! zQ$|iwpSI~Sa6xGC_q6g(TPT@*nb1rk#Ax zyO&qZw!9)}FF%9hxIe!$bS~Bt_`}6u{bGOHBFM4M-owDlZp12;MH9$OK5<>nyQ9dC z<*m2>-rGc79T0DmM|#=@2QMf5UH0MNGVq7&&BP*6`PR-;I;+IeI$qU5i?e%n(pzo_ z*ud$WtnmN0kj`{@2k3JKYrUZuSzv1f6$Z9SJw60t95( z+W&txDwa8s1mGVKhfo^~t%Zb@?w?yiiIpD?Tp05iJn#0*tXEBp1O45WAdI|t!xcuBP~rd^C2~cM za!^9l)$%8;G1E>{6R6W}-$flItpO#FT+Hr#=i%Hgr2GSLiUdez`|AgYE31hIc7|$B z|H0-R-M@&7bDZVPQ#J<}nf&^%k~yoNbn!=7$-d}YBAZ;dqw zFg`~@^y~OWKw12;WvyEBwVMWFVXD2^-`G45Gy?PCjvlrQGoffW+}^lh3&JZJ({Idf z;9yjg2%E-5wRp75v*}3QWfwIrw6-i&>z~;bCA(T@BZn-f9DGru7p%;d0?2L^oS{NR z$*%BY_NXv?@o~kF@}P+r8{B3n2x?)O1btjh|2#Ep_v z$fc=dpOF(7oZDt~X^vZ`K-H8L`ai&&qw8EvmyJrIW&7d_H{3^!2L1R~^yeDD*lG5H8wZk#MVzB}ItC@4R(ED4w6pQiuPAcQ}Ma_q#*cSPv1SiiSHDXa4ZQMGK#3{y*`&GQcQ zHI-dir5vOrabvBn;~VW!YGp9>nd=r`H4qZrO_c86*F}u>yCn-=G8`SEfg3$YaoInwDJ0t^;ZY z=d=zQ$}?JCk63Zz&JJv9_qi?@)WbP(vF#ju-pf8qYh{@OT7k9I_>P9%$Z)%St5bNV zwYxH^^pLjT#;7A}GXGYjc3v}j zp^`UhB|{~-?aq#c|%=P-fQ(E7hdp@lLIXI@%bKC%~5KN;L#*D`p# zsPy1EvW!&!TD zSA4*tbd+1R>65Og%%IDY7pQE9h6tqNLl7{Wn1Zu6KvL1oFZ;Iw96#U#n z(s^6&vQNayaY{z+{+AB2|7E7IldCM;2EKJ?d~mRxiLz91v*-8?#HR3LV0=CxbQ$r- zb-}^p$^`$@%!#4&<7;i>61=Z_4WIsrqc^A_Rcz382e0>aU~J*gMcawxyBd?;-&h_h z84_HiJz7t+_m`U;(P@*M?p_v2@qIceSR5RT!Of~`9O1;jBdBYW-m;KAGVxYy{)5#8 z><-MF={C}x_rD#~Le1oG`YteRsd>O&2MjLRN7Idcd4nN9&jWMl6u0uplWRDE?bGCO zK${^+0@Sl*(j0-!RwMO?kGPAR#VHptusfE``!%c%7#bn&RB+Kt9l@FUS|4iLUU)^2 z+OV47@mBR}`zG53M#LBR)h~nuW6mO7gU;EJqmuoqLa+yLqMoa86obI&oAul#84hJ6 zTgUI_@*$*>CtZeW)67kkYj$w+Z1#vXUHGy#xx!KMACiV9(pAl2gU@$gJgyLSu7R^E zJlL#N&=GoQ^c0g~6UAJ-nq4T5nY-H_I#T#PWdMD|Y*g1^=T+84ML?Qie5>P>V|6Di z;^tqteszpSp=a~Kk=uNARj$n!Kun&?>hJ}*x8R$`Y>e%ua{32xRPL%?bdLT>@m%*~nTNqg8OA`B?fcQNXJp{R0`Cep?3 z{_3}hE$s8=PzG+nI&1QDWl0E2rjRrAzrfa?B zm-9tz(keAPqK!n2bEJ_N5ajMjhL{>ns>Gexx@2!%p-h{Y&MAGb>IYFCwlSSv{>`?Ss$5{(AGic%bQYQ8xq@QNTDvM*B(=Q@ikkTY^p96aveb@U@H zXRd=iuXwYt^hY1?=D!4S=eKPX+6{3!8NVPW8SistGFRxxAtzX$3ICOvwShSc9gW9Q ziiFF#ZG@w_G@`k8lsj%OY|&MccEh7c)c?_XY6-oC*X_z{f;zIRM7@aq(#hbh+0~8W zH_)Bu-UyAV#NP;WfIJzxc1yss+ERaE-?en+cI3Q5-%-xUn_#1(<+aYD3lTq#^OEBj zR^JiPz@84lZmYB1{Ux;?nc_#7VqIp~X>J-F0XU4eQibpO>;w6{U{6EmitfL+{uvcQ zd&n&5n8^YA*Bsx1-$>`T&`pBK^cr_3wq_gCOH?p@Pt!AAF3tj8D{HTf!=jaZ1%p@% zNLu$@NeyfT#BY>7k_gA)e^Tm9!JAd#6pKdcnxkBAM*0Wbj~au9-c+%R>k)KN73yBS z{y97wbYOyF>d=F7S|D|sz9W^d&Yh=pz8-19fcCwlkL&NqBi#!e`EJS7{2HQuP8XRy z_$cT=>^$p~!z?4soPCqhCgyiMm#hp}ZbGzIF`88HU7?%ex#+*}^d$d>YqxV80#hV&)BBr6-->tkidyS)y?rG=UfT z@8RX!DWnFX-{5)8VlRPiJR>WqliU@TFhM^Y`j4e85q-yNSf8QD%?1m_J=y2c-ENW6 zS;wS;&wrma9;|^=u(!J_L!GY2y^O9y$I%IG^PVx2X3 zkmG{%+^_wgX-^$K>Qu-Y?ELUFO)f1VRR#h}L7dI#pt zB|)2bo=eA4R#!m_QdPC4Lui`?FSs-^BtPPe?G}25&6vLupH%Lz?R8Tw|}>VgWSV;!03|Eq>hF3)Hvp4X)11uC_Zd z+ruI=va_o|`169Q9-c|_7yR*H$GDCSEemp8h03gfKw`)F)^00lwqMJ`b0P@WrkoZ_ z;2hBH?%dslb6s)10NWY=7+V_l3dk`|7VvNmF+(&rPYRy2hH2afIqE-p515}jGkarl z?dQO#z_7&6H4e3jP0oQpOrcSmBM*9gd_-)A$6K^_e&K47g6m#cc0V(WlGwG{9QUL;3uBVKL|wI zaAOQtVrBbN3e-JlHP4^v_&9d!Q`(=GH@Mo4~L;ugvm$Dm4@(S>1o35ItOE*ROhQ@Pl610OApktgv5aV`$AXv5m zVFU@sL-a537wkUD>~v0TZ`k(M`>k6C9WSE2jG^9UH?c+=O1G-@4^x+ZPkB{lz#&ZcGuo5$F5L*H6&0??NRFF73DN(f z+=cy1C`DPHJqJE*1v?XA_8F=jIy>h#IA#&#r9E8qtb71~M{I}hBs9x9MyiD8j=@{dR z%AAWwuD0LD2fsBMWv5=L$-=pG(8rG#_0HK=|Ddg3Sw^=5@4*SRCC8HafqVzsw)<7; z)VTuLh<|tD{?ax{1GG3zvGT`RDF4>HM@x`dfb_`P<*ZurgMU5Lp5;~SpPt8ap+qi1BHr~aq#%WH6ASN1H9%ismSLsx=vKq)!Tz@wPEmmw-ll}ahIIR zUUG&=$x7~=N`S=nQtXxdqGTJ^V2K($9tZn#cjG#Fq27R^6cQJbY8|_tZ})>#>sQNh zSVS$)nyNVx=?$E(wXFCj?OO1i4Lmy|vbQq3Tr<$);bungn;D@CFLf?p&>er!O}SqE z4NCBzDiZya2ax}yGf?$QLA8L$cCYiFE@8n8?BGnk9qc<9qW_-%Wh)P%_g7J+6Ta5A zY76u;YW$-3Wx#!n!koJUgD2eDe|FZVLH))==*0DBSp6i*@)z%XgR=ALT1HgTJ6RfN zHU{-pkLkytAV_g;j{Hl*K-#*0k~|@4!bzBXjU~_IFNTwxKXJWvNJqvpxH$H%ejpN0 z9@Ua7@H~r*bDAA-;p>0K{Y73r;q|-ndP3KV zYB5`A#b9@`4e>3dvvuEc!M?qNaS~jb5Q0?D z;QlEhSod7lPu@TVt)(>jkJPNVyWBvJNeX)l5AK`tn{3m;EQ*1UP73Ng%H7z7%0v+x z{Xl;0p~sz2EakgJ`7_{%bLIvy;ia3GZvp(-;-|diiR)ZJ(IHQ75Zm_u|e0h3i#u)IqVFL)Aa-ozc*HcO!__z^6ah*`NBzKjyQ5;c_VM-M)Eky7kb zSppUMX8a4gs5w^yC{pU;2ROVB&Y;9;YV71T(Li%ecDYKDpAx9oO*q zMHg)mQ~9MOa)n1+km)mGIzR0Fw?cbc!$qKowax09OBMrX5nuA9pPgl+NGzV$ul9}( zH0C#+uYMJm7z<+cU^`1Q5s8iq@_84Rpop@sT!$wYtM0F=rv;vu+z4{)AE&pK&tUY(eQlYfx8 z)pN@cTVD>B8m$mm?fJ-T>0*At)w|zhPd|^Jl{#k82@UMW`~Pwb5r|)2~eo()-Z06s5qj>jTIL7c&uFOxPs6UOkc40T1W;RIuQwNaZr2WWJJJL9fF~U*n z*b7`B_vW$>Q-5sv0eGa?lGL%Z$*V5^#zo(UfiNeAv0@2n_40)19rcpdvG?T7}Vxd4G-Iq)p04JoqhYCW)Z!?l$$q zRbN4O{?8>1{~+Z5p}a|%A7h;X@0h96dBpV|{S;krA6+-o9r})Pd=u)Bp-OxVdKiIg zWzcg6Snw=5CGZfv)54=J=%+%>dNlgI`?WO?4EP7j)zkOQvL1l;eU(y4NXO!K8;3nA#VUo22`Bf7p`$GL(pJy_0)?j3f@G9#^3g@ngX)V8Ja= zYkyell@<7mSZ5D#A%hf2IJNlkqxxU>`(dE}=pWX*Qg{n*8K^of4P(jhOQTpq>m`i+ z0hfRK2bR9dm4}XUuUpzd`S)M{mp_tni%&en=B(Ngt~mZ5&E=;rf6ES8(fwop;y;_q z&x8A~dH$_m{MS7HHP3&8>z^#}U+nn_i2s%)*vR@{^ZftOJY?-W*c^oZ9_Dlu@yG)i zcp5xBC6(FMLyS|G=+D3UrO&(b(s6ir2@yJjR4DGFL$&vkMMW3M2Mk$rt zIs+u>q-0?BuV8P2vp3-S1h}NV4vjK4XKNgy4?U+JM*pl{>IFarwj});0#CMp&j;ag zOa1+q`F^69$FoK`u<# z9vE<0QI>6GGuNLcP-Y>it#|^Sn(45hC^a_|DJq|HP)#dy8tH+ikIr>1{t*-95h%|p zTU4`p<2XHJ2OCB(pJ|?RrN5~JB&}UnHSP`jij6@3(uRiUoToiW=0Ml0Ur;t|-xdS8 zycS4FyV*wfl;2VW~LrQ3%A7qX7kp)Frt5U|mX)#ljW^}pDA^LVJ&_kSEwO53DT_Bf@E zPzlLeSx!k(A$yyYU1BiS7EKE(l_Es0BXoRd|AIyyTU9T~9&iQ=5 z=kxx)&*$@g{QfzAoE~$=Yi92IzV_>SUe~Q~EtR@gx^0z~5IxWN6?()6CIW0bgrg0T!C>`8o_!+vog1huUEF7-Ol!i%x_2e$0o$2 zFgHLT2KN(W(V;M`^no+ha%x)VgHPRh8Kz@QXo%Y@qPmXKL%?xv@#Tjt7!S<5#O0r| zZ@?)q`bHE+EI^P`m67&ixm*a62^vPA*m9S9=f`q^FBP1755RO20Mtw6z(}0A<(@;9 zyP13y5-N~o>?FZ-`#Jg@fVkpeik8|wedw^R{yg&Lj^|UfvRUb9ZBH zk}R5zDl3@XGCj}}6YtsPpG3u&j6MpD+5Cym&VC1kcw26l-II|Wn67_Q+tmQ0S_?^L z?ja0wj@gv$0V>PEU7Yzkh#booJ_}1`XB4f4141?)nzQ%x#Izm>sZZPos^skk-L(ZF zG-s6@uW<1NS`Ow)c(0MkqM^_NJ8i2O!xugSM>>zFoH|NEn8~5L=y{>L=0~_U?>dD-9mHO^&~f0%cB2#e zdIx{mdackCtJvpkx5B$=BT8-lt|i`AQL9$1zb0;X;o0&C;p&aT7s_79Gdn(7^|&hN z1Q&$haOs}ZAxE9M;Q8I9zQuj$1CgQC0raao2s7>V=Yx8?aznc(+w#Q+CPR<9UZJ{X zU-xH>p!96TU!E|;yxJ!}`avce+F%o3EIf~c42|irK9NhKJ@s1D=JqPWS1FWpB1tpE zeo5J~kYg2BqV3l-QQ9rUVQkG_DCsLWrIG>5e-REZ;LXn5z}dqV5Skx54N0qNFsu5& zPejeTzXoV{rrhQW?*@76jtmAceJ5yv?jCar(e^nASpWo)0Vk7SHjO{1lj(pv=rPM* zL0SQf;ZA8*xN!-T!>#)fTT8K{hgTk$v8#AxBBxAvmHWtV!aY_h*yIVlGo!nWoNm-! zKa3kOLNVIYN#EM&FCV)sE`2=nF(aKEZn9_CY*vdl(AQrXe_Gl*O-gREIV-Q69{O;t zw^d&5aGdd3ZQZU4EKy^SaqS^A5QP^B;q~9=ELT}R%3TYTK;0Xgz6%Q90Azi9k{NGH zr(sK{gCh^X(t$0fr++N{?>#QRKAGSDY3j)v%BcgT%!|45rPE|=QlbW?lRgg}-RxZF zvVg)g7;sRddc5-X5q9eNYNC97YNQB7<%|qKRWR-AtC->aRc+B%{XfdfHKxa1k^-rC zW?Lq53I9w?I6(0(z$qZ%q~7UrL_n|-q=i_QgO4vb1T{NV1V4~%v|j%h9`?jyRpb5# zkAJzf8b*WEH{|N845h}~!u)>Ev9Znc?*GB#VhFEhuT_Tg#jzt)|1Vo-Ex--nLZrI;&1$>_YXcBuWgubwW8Oh>pC=F>LobjLU!MSZU+87pGYm zRJ%#RGAXwgYZg%>uYYXUBLDE4N$NbIoAadVe*?!N6%jf#Pw2Q>dvl~gSlKDq^K?M$ zoWA&*kBb}v9e?3rJ_`T6tH}t@oWdq4B~V!LEfWRX+4r`V2A{4_YcggHrDHR4p8KJ) zOH7EbPLjl4afHEZk z&%v?W0&j28bDldD25uVW2XF;>3(Wn{Dtv^3FX~`>cmmdDkZ1xP>P1kx7pFDjA-tu~ zCrjslBU6YEVb&H0lo`jbR#K6FN!dxYgfTBw4RX87tPUH4LX$}W{8}DjBM+SowDVh) zppM=vW)Or>FbTp38 zF5QALA9eTxo;rvijMzn**ZIOJptE7?Tl2vIt@3lZ;&l?#i&@YHnqnGS{r$aYiVp*u zW~J42PYRu;&bc>MI~7uK*7>y`TS;rS)^D?e%H!=TJWHG^N(!PkavVw@yR_STk{hkN z6n5U(np2uOQ5WlA&c=`mwc1`jbr~S%xd?{5oy{`pFx7Y<(XVN2wWK=MAk&7Ft{7R7 z_HfP10Mai5i2Y9xm|d2OPvx1Oad5;ZJ$v>;Lh2(l+;=x!=Gh(|xu7ZqWNsG!u|-W_ z^q!{()dZ}P#$GE}EvdnL#7lT-jM1V5~V6Lywo2F0C8r`SQ_yhk)P)gEG$X zdr4<_Z1NpKN0@(Vt62*b6o4IS5OjHTp8>kV07AzLu5Y^w}-6sTjHJ z%s96u?dn>BiqAssf4!$d-PX|UMMy?( zLDQ3g`F7$LR0!K>RXs*QoT^+6fmqj&cVo6os$4C!M9g$bX9uxp_DSb?!zNMK9e9^> z4w#4;ha3x}{%I*PrT1~v^$mC@2yg#!kI3vOV$QPv%Wh!Ua3j(bz*U9Z!BRRhg2G=^ zKrc{^@El4#?vxGBt{pJ2fc}TmDr1u6k{yXLH&=e*dwA(keuRF@2xAHT#?ioCJxfcS zdMGCy#791rq-oUO>!yn8NqB#L*MMd#_1xXiUZwq*G-d18ozSYS{a*0Sh7KoEPa^9b z)^Rp)rYE+t6ODf~(W0ux=NK4Jq3UR<#+T#f_-@{i%*bc71z7lH=bUPx=B}R>#wp)S zkmISrWHiutH)SxGyyGHY_z);9^b^u59+#H@mydeTGb*9DbqdtPjYAnmy#2w)V2VgE z3Hj6wu#D!n(PR6-WB$$^>BF?wss&pL$TAJWZaj6)$Nuq={S|A)!xT=$xt4wq)fFAd zNi%5owZe3~>o>%Iw?-|{+j@fRtED%r&|^V-mGrP^8ci*cTN)Hpk~+E4s)bO;KZWF(5H#IsLzUMASQCe#h1O-Qu3F20ECD6wsU5ENEPtTL9hZh5!3!* zQeYi7{-FRB^JDRCZLQ{z4nj@=_qlHokH_JUfcYv|^#sx-4)7rU9`8Inx#!V#4f%`; zu!w^Rj|()oT;Trh*#`Y&F*vB4^>fDZQ#>*xYcl`DhIAW97MU`_G%!^ODEdql)-#ll zi^?CMG1J8i2fT7>Pd69Eg(k7bu~oW{TPM)fn)4iJuN!J6=`!r|6}{B{_Lqe#by@33 zW@|zNDptq)a=zp|lpZOKHpsLiWe5BE)|mwys%Ulf)pJCk{@Vl`WKZ3(QR6x5H@Tx` zSuW-fT>$LO!@+cJ;j&-`s&Uh##}E>RAUloY?G)m@yXdhDLvZNX;MN4F@s0-4F^cqV ztLq4*A?O@);YkR@jaHx~?p@9N!l!+!fzo3d%D9pRZAKoh%MSXn*tjO6fm~X)?N?*;FXRhMe5SRTB4?i0sF?ih;1{fIQ(-qrVc_*14CCu7k&#AQ zBez_O3LWtJn*4gZP<27p6ASvPC#$6V^+{oVcjk8#_YnOBH&{b-#Tvkb-{gi-e{&D3 zAu<~WmhL9;6h35>vhnebN{CcL#~Cr>!(2QDIV*dRYnu(P4gqZsU}QAx{py3uwdC(P zd}{fG`5q(h5NJ?Q+@HTdDYAgW%0Z<)Y%J;@qD{y}w6K_WJ&l68O;Ak^RCa_(C;fJ0 zMoy#+A)By+7Q%2>6YxC5W_FX5-{b`OR7_~(R~0iREiR5+$(Y}fhl|d+0QPn*L@3+# zWr_0))_d^3Mm;=Io`Jnuj2Cc zL>}oOQE(USqi6`D2QDI{*Wr;KGCV+f%W4CwvwVr)d+A@hIh}g8I1VMiiuqKk08$z8 za(;zYJwt>p1(l%hm$0tcu1!GUiyXWQUx>{ZklRd2YZ;-l5UZFo^mRkpoqMSr^}_f! zGg*}#DPl(Lei+=D&pRzHdgs-Ql;rnvQ~|%r7p}$){uliJw@b%~Mr>}~Alv}iWo)F) z?r>Sqp4U2$I2j`bItNw9?8mwn41L|RU}FiZy3ymEhNYGmSRR9-?3!$B;Y=L%)gEvA zDq9DskxOhXiR6CqwjH325)o~r$>3=tBzcw_gO9h>OBY^_5K=Sk5Kn{rr^shU2|D{Q zIE3^)u*Q8*)UQpGrV}dhlC(PE;=|zw*ifDIwCqhE2Dgv5Lmt$sHwj6 zP5!MQvy?|4NWa(CQ%|#x_L5_MbEFM2z@rloE?MEdquqmEF&J`^^Mwv5kR~6{XAXZ5O znxiw4i&6;A&NZKU8J+3(KG?h>HU38F`Li=@YIld8`h3JiinKWFb#}3`p7rCPEWeHD z*Jl#2hY#Fn4r=&J(6jn2tn9l8k_eFJ3E)k%75sW4Omgn#=B&WwLH3Q%FK`h+O;!Oh z^h9}90cg~}3Bu|lpkG+~fqY2T3)Y^U27+yl*bmipb96&=QR0O-!R>raf|~i|h%2v1 zmGlPQv<+&1B1f5wtF`wuc`|%G`sz{0R_w|jm}Q0+7!4E|lUzz0-~LiO6k&OIc(B0O z4w!R-M2L;(AZZE0zpu(i$|tQ08HHP%D=kFVn1wqy%1WZ&9$VVOGMnh}%fm3^s+O4z zdVW-pc3^wH%Nq32Xx&0nNhed8I_jCVdIQPWZMFNahzYZ+cSiGtKS%hk|2gc*ANaS; z2JWIQ9@{Ipfy;IZ?6qDT!3bzwf-%5$p1KeWLfHup24=gg;ZFWt>X|qF3*v2a4*^E% zeMPkP(6D7Z0JR{kx$wKy*yeFr0NE_aytXZ?wUEJ3~HK0WZPn`&98rv0CHjH>sX#WhN0t&JO*$kjWGYsm~8Y~_qHBR==QbV!zffidu!?Ryk*b);B0jx0 zAUJn-1^A)eI_ZRg~d+(BIH^cN}4thh=I>m<6_u? zg&2Wyt`hy4voq%ydF`URKY_jxGC5 zWSlARwYm#+#jj;6B+AEH`0Qr!N<>1+rpIlM_zUB2g2ucFQr|`XxYHa4fj|`&Mu}2g zwn1MOgcsmIW{RqTuH({VB5Q*@>Tf?jMu6;#Qbdc;X_o<=uWS^9ngVLy$1!Th>{Cb$ zSzt0Bh+h_qn@EW@)*f>jtn98I$DK*AR2{w@DW^`|e4=4Jia{xzz;rboIy{%U|8AU2 z6%+2tt<}zGeN-}YeDUGv@}<}OZ6@yO%Oql0(Q`l)?xe2LG^{U2H96l&2pl54%$k-3i3GuP$wpNWSzITB`k z8!Y9A@5LJrFq5%tY5b?5=7|-uTc`pT@%kH^LI$qL9nd;CV}HlqSB6zKU5ab$Ny3D< zHci=j4B`{(r)jmxvWkUTNHc~WzK3#njW2p8x~9UQWT^w@IzWNShJ6K`eA zqFJFbW(&Dik!1oJ^7DL=q^{|ltA$?HOv*O&k+=)ND{DUezyd7uKc6SsQ=>|9K~klw z*NhA8UfYX(B7e`m{kctuSGht)cSi`Ck>wh-uYtbKB8L8@8!khM+GtvRIJB(7E~#H= zw|(vjNv;Hf^v19kBO-|8k7@sE^Vw>kZWJ!fDX;+dABO@%Ojkl3^;a-BAscux323OM z!v|xaI1(pYb?$zX74fLv4jh>^^PVk7nW(It-x2Q-oBQOYH*y3aF%|-V2f98G`1FI4-H9ri!PZs2Sbk;#B6Unr? z{(S#mIRN*{wVA6>gjrME^u#8!YyK10(<>=?tp&_@su9aHuVJwI?jRL2+9@CPJj9b& ze0kCMNK6L#2H_J$sHnZF)Z*e8%_WvvlYJ&Qi!$v`#I*ZFW1~x5A5rr9A+ud7*ykU9 zFq{1`H{Jd{bt_vrN?V&&L~06>Owv=M6^f>Yj+$HKjviky5n|{dJMPg9ZR7|P95tG) z033^0mmkCdn}<*WF?n7H!xsEtSgj`U;gBZL-C<>0koWU{y#JS8(oaVI_{P}44in65 zbeMUFb=FSFeaWzjHPG(4o3Ny;PWuOV(u$ypkfI-6ZmKA7RK zX5`B}EeT8wgVVPj*|z3p+Is@BZIw`Y8e66xE^YoqHHL&jg-vMt!s$t^^n_c~)i1{{ z~k zgrslca(Ey7zwW#r?;~;w)%0iJ_D(+lC4f}0xhip&DOf1i3z9X*qk=3d3<(|@d8MrP z*fg2;mS&7aUjJZ&!r>MzYJAaM7dujg z7n>&!i3vM7kM419K3*`uXBX#r#rxy9%uGseK~Tt9fguKL%2BfiCHn$ucM|L9fg6CF zNExr`KSxgdwVXXuKSZss$lRnWbbtuUA0nS zdJ~VZ%%LwWe5@uC+aWNZt#4Q83U8KH)j8|JO)y+^&$Ol|fIcC08MP}Mi0&(Ao^tGB)wqa@B=z*6nW+02G3 z#`q_#yWpxFB!LRy>y65q6WkZUaba+Llof>LH|)z?gHgW?}Gko-6M zI*9+v|46UDbRhn|4Mj^gwQfDvmEJh0Gjt2(i5VQPr0hwO@pdAyif0O&bmVn8FGt{F z5lV)9$Vi6YN%{s8xzd^ESWNp9pXwxkf9EG{hZ9$hw2DRlP`IDIiCj{QHJ032UW;>D z&{2QKwr6WYXnSlbbyPEDVPO!mFO)$YNphvuYah zi6vWvam^AB)%(3OMa>D`|+&_?UHt@ul;9-<37m1vBZLQ>^Exs)Q}UPoJcB zca|?r?-aE;36?i0<(BY%XtjjPenw}|bir;Umq)=>>J|V4}HrHK_58A&9&p^oPx3eZcYKB>0^bU z!6>$K8Vta3re##;;qzdN5SW3A@(&dT<_AUv7{T>l#JWp=bSzvT9b_l^?dVdUxg5Fk z$^JR~(M}1BbGjnYK?URC{A6JFo|(DCg5SLJMYAWtwNl_%_XJCY9;)amZMSAzU1rc8 z8hhEVDjS0O>D6m0!EJ~(mXvxqK&!=(&y-_%@|(2#?2OJ+m(he)7OuZGE1{ug%2(P! z_RI6Ln+0OPI70l1n;~n4Pa}yQxXyx$r1?w1{o9`Z$7?wGrT#XEDlRQ~AdWF1J8G-a z8rxcZ+dL(p=4VD#@_(dH_I4(fu`02StY1%%(i<&Q98_qR7{*XyaGp1QJtOt|SmJ6*7uzp><{xjPzPB6}Rj6v|)J;<~Er;*6pz7Ap9KSn<=idtY+_afpol3qSw&;syk1_s{iw({xGPV1P-Y>M~CgaQk z52kW8=cV5;DnZL(=%sCiUWs$@=iNo z0STAxcRafP2ln5?k)y3AWf!=rPu9N9r32491nsX-2_aF03b%`J%BhCh-_7J2ZJwO< z`|?t`cn8flRK}a=JE%xLwYOp+{W=&ht(@6;oRuRf4Lc<+Q%BRW3as9@#XaUpqD{uf z4hcrE1s)Z0(^GwQC2G-;>NloNktFehjXpJCu=b>Hpgt!Oa6^*jaoCz2rcw^F+t<6= z3B&-q=Xb-5AbcJ@YT-v{5{yJ$>7ZyoJ^tnW}Cj@614!{_Ik`}Zr!>&{ZJS@~<))_<*pw$g*gbRA^vinM8; z*824+Y4OEwpcF+tn3XRD(An5NQLh+;<@?0r%T7VIHf#DGTEUf!v;Fh(|B~c!Tv5LO zqK^14Ge1P(FEism?AF8<&p>nqBjii4Gc_aUsy`(|EBRZe zzD_%1CbwUzp(}bW^4(w6V-~q%=u$6LGu>r_?m%+4^JkGu2tGJ`FOt9^@3o;1-7O13 zBH!Tu=L*bURW0Bwb|MAG$8)v|slEe*qIBPpBS_Bf;*dbktXYLQ_?h-r`L0PXLM!4O z)!-1KlO#t}9KX9=BcIN|qVemXPCDq8JUIKIJZq!YOz8w0WukIMLn~HsBM$O&mr?!M zZ2>wtfv!*$$#)gYX)3M*s9Y;U)6OEv2r1u>O$a=)>wGEWG8m#eu@N^7(QuRYoc%5z z2Kzl5a+amEq^x`gUVlx*t2)^&nuwj&(##+ythn!p1Qk3y;HRH8r+<6LfED733=gaP zof}+|t*%}J)c*^oPxi;&kx@CBer0TWQbD|ZtefNr6g|K=*Pd>AB{D2QT{}|ah*tls zOIrsHt9!-#el!O^{cIzV0H6Vb7JmPC*CtmD6xvs`Im)~oi%MWj$BfBQj*xql3i4bT z%}O+xS>+Q?mUMS64T7fUPT4IO2m27ic#S75WF*T{!2H$R z91ybki_ZyAcdF9px}S9)WgSA^j#v5D|+S9EEBH~*K1gK&;>twkoV~i{a zmP4vnEPNY?S>4nIf|z%c{U8*gXOL+7;w*kFj$WuryI)|;ay#oBGloE;SkIrJL(9*N zLk48A@)oMf@@zY4@9&GXrtV3FnfQ2Wo}O98s2{g2b&LzU;_Dy2W%JpjJ;%-gOHbO> z;9_!z$eY5CL%t}$n((0jLgg-dQUx;CEnZQ}+Z21yU%5o)7>W z*ltRPh`<0;Xa5ht0g~g@C^)pCcpm@`%tDuGgpSeWk@Ue`s{%8dP;Xas`xV_nA9VYu z=o%;-VMBF`T-G>{vZ*I>(;rOMrF+l1oR2$Y;!~~wc%!=w@*eglHK^xE(OKdT9mgJH zO*MKi{R(9yww^(Ikx{M}lttN|NJOBM{3{@)%2tL?hd?@|=VPu7WKE*wmw65jVcHiq z5YR_R+k={Sl_wlfSsnqI3*r42ppKO26o6h~iO2i`RVdi8{hVJb%gyfp`?!O@I=wqr zv*AL>&kfX0V(3UeN`~d{e3*Vw=HTFBRx#2;AURMhVT1cNOS4MAeN%4PLAyE6_{qY; z?VOOVcvRBNZi5yff8t4iRynW+u;ih(mUg>7%5W_KGBCW9`c2w zP-`xW316l)yNEHsO#lx+3>uR?EMybG4*0^e zpV}P1ckH7TDY13!f~=-126yZ)^>iL3vzV82EOFv0bo_;S7E{CQdNVUT0ZKJ}-&8EM z=7*}&veo=JWcMB{gXLafY5TD%VG6*am3xmJagbfvARiTV)NiD{7-tze8$8wASX)*O z&hVQ2!aDga+6rX%d)Gv+-9^)yvzWa!3;$noIJ0%XTw`fZ=?(icomD}NybD7PjB zV%{tAk~^zvOCcWE&bhatV;W4w{bjyMdyj47)<3sd7UTZR{K@|kD0T!I_O2tTIlvJj zxx(+<$`QtPYdX9}LOxfXG8l&`wbi(itov8f8~L=&8|=%8ln~>*wn1aL(ut%5+{{p^ zYlW+Wq&I=t4KuWc-gM!ECvWWd_5l^|eyCiicB?_l1mgzX_@SRsMV-pEqc0!lBA!uH zz}f!5RKO*teqENd#(S49CEa3hOnUYvR>Oi=7q1>PNUUB1-G=5U9 zyrhNN0vW$gtPcUw|#P_Y#@r)`gJlO$+_xro|syysn{8<29nPreMp_ajH zt33IUF8I)%mv(#3&IXU<%1JZd_Yw&;Iaz+QI;E{!3wNT4-BhUpS2dkjS4Y>ZIIksp z!paOpZnTPA+P1bTLb@5K3BLF}afP2Shfs_5Q?B|6YU9X9Ebm+mz>i{J=2R z9!-KYYGzu&n|MXrjL<%+-0Z}4$gO~yY$mjRK<94&^qHmBh~<(ZN0v>+5`d0}x4Eq{ zFZFBLbfO^rvs(xI4DwPVY)cF>Bh7`qkjy7)c<3Q#mbqlvkKTb3USGN38b1>5=S z7+^kv>cZ+2w!l1Ra5QH#+JS4JrXR2IgKPe90{=Uhbk#;@FkJn;?o-{_xJNF6TAOIL zoR*>|o&_5^;zJz=tD!j5OT9id8|_S4QfL>rHf=jQn-Bu{Q=`o-g`^<$!=m6S=ZS~a zG!qCZF3njXN*wLBm(F?p^ux<;Y$Q;8`g<*$GDY>oyek=Lba6c00hNQXt|-YryQX;< zc;#W)GvF0bZ%Fy4pr&42G&*Smb|f;uYn5OnxYbgOwSJ-C9U)Mo>%0K+f4OzRXEOj( zqPt!%9Z3xtYr`@^excz-QZ@ML1?UQsL~?5hIx8>L@yo00@*%@9mZHOkgv1h*KT*}> z@bFGj)0fU6T!wu}Mov*w{SG@ncJP-y89Bl7lg;ik*@P|@nAXo`R!x@nP3{HgsG|Vz z<$P=`QYAMm?+sqbFK}|>mTHydMv-kIm(1f)O?!?7fubBqutggIga*->MZ6T@G3XLL z7E%jiZpz|7SVDBbyF{>5i@^vi?e1{{tR3`WWC4s>PXiz?p8!wShI^ojwBN=@VyBMZ^t+{D!{o1|4WKHjqrjJ01e zQj^X<#d3L=%h94mY4w%ds-I%sO!sE+GoqU(bV*IMq^P&?MAllwV7~S=4q_Nv>>0UM zD^4U#)LutA4-2wI#Li<7zW{TLGk~~T}T)=K$1lhkJOGu+7)i5 zInL@pOCv(mB1}d20t4+34t7GUF6dE#l_?>XqfEQ)V*FJ^*+oMz$0p;HI{OC}fJBYV zq70%7(p%7U9RNbAoruqpQ*ZI_9zn!if!08<8Z@#S+^>Cjj7~ig`4OY{sg}SdVxcqS zy)ZOX`~jYe+>M)6^?4)kJYoovLV2-4AgH)N$w(*^BM6`A=^qVrfA4V-8>E3Qu@r@y zaceWA}~_5%-2Q_Si7@)7M>@*a}D5U0R@MoO^J29EI0xN`Wuhi z+=QHg*tge_!-la&WR+lfnj>LH$wL3nJF^myiduBY8Gt;VC)|3aI!q*RI-8VGT~z0t zjn6A7K@C_X^^Cal8KKHV0yzrMx>J)6PoCZ-k zZ5O!@8o;@t1Pu(_esP%4=3Ys92L0kNiXcA8k+-?O_xR3wU^wHzz{(DqvfXO$Mop9> z(-PXwoJ$|M=U>~16QE+4=?e>6*A}vD{Dd7sM~?BisoEDSkq3w9L%; z44_E3d{;v+iRU-|y~l%}B8u|M`5V3O?j&V<&0a=PXG5SM_%J}D<6J+uNE?Y|@m9DY zO76@=sg|Kz@h>MnRAxD9JTI-z>CbAqP&`(P)k@DfcgNABoF1uRZ0Bc4`ew_vnJuwx z@YFt|7NDamK6x)PKa;#CWjb$pW5iDH!UdVBrS~muuGIux={zD z)Mok%LdYG_96RyLC$q3PD}&5JoLViJl%qji;mwpnHBpy)w+&{|iN2X0EHb7JtAq9& z-0jvxU1)v7Bc=?yXn%0{3-^h63#+5PNA(IgIWrW~1~zlb5ATH`lE*?|h0_y^URXKe z*ComGR*s;6%X269Lf`p*gr=T6nj+PcE6#&4(5iYLIROeUL4=@Im)5lcxb_7CFJj?& zF(Hy@mrBetixUH#G4@vXjf_p)xlrG|73*USS>Fiq%IV^T$|ZP=s#n4(=({y9oorD& zLG6R|MM7~U(l-+R9FP@jU02kR__VL)4ka$U0kCDQKp)yQNJU8j*y2UekB(5}Lif4m z=n+V4FNn9|wF}SP6NIz`t}#PC5O9~*CHt>FV1zV(|8}6}lHHN%g(6n=qTXK(A*Ji4 zCKyW&ir-O@J+vlnjBav@F%6*W`8uRvf*smsYX!pL(+B^i74EV9_t8 zV}5J}9)lSN-VWe8)+rK}aX11R99`O|qI|W?3k^zpE6N|Vmz5RqO|1QA%;90kAE;X& z3U-%#2}27&9eCtg^fQoo5NiyfLt=jXsvme3A}|861sUma8BE7gbw{4tmkg=G0!>?a zQP~$SK+C=9HsSR!ZwF3LcXmAm2xCCxX*CCZm}|lg?}o>^-6HpgmAwV+u^?WBN1jiR zjBIEO(jJ%cWREzOG|`sW_q8n`+{OVT+B z{F*bM$1W1D^Um}?@P~RVz#xr|F8Ogs0xSpGqu_M^%@+`QE-B;oaQ~f8|Nfi$@}OuW zj;n3_pM4FC*8$zk;5MQE+k5$aHE!e{tAE|HS|{UiC)*FabBC%*Qic<^rj&6EA} z*9dQyg9Znb<;9<)WB=y&L67!4uTT%@(Ecw!@Na(Kr+*mezZaN)80f!e`F|MbUkKno z4D=5J{hLbp&pQ1d2KtAA{$Zg1%L)AB1N~W1{8u0MA1C@>L_+^C&_4|HFTA(^DpP-s zYyV-Oe;DW=2Kv98z#sBJClz0ubE<$Lh0xhq0iCu(c-0ewdGbTv(b!0JZ1ah+KG$6A zyZ%U}aEYJyx2!n{Ima6cO<6y$AG(Bh{dp&#@Qqx^u+`@FQ+_&z-|Ss~uHx83q3-uM z7(f_6Bg1uO7ezAdR(bblp<-F;wDvLi?80A9Oy|LTCYZlNDF$4mZ+gyp3FCI346J*4 zj(fq?W~Vf)RDQ!^?WxUc!ha+OkZBJEo2)y3=51~O%uj1kZio2KHN-)(F&@zIKU757 zMo1Gs*&>qthc5}29?b?E{f0M%kXW?~w}66`68xtUvT7tZB`e27*;S2oIvSGk$jr9n z1qK6wN!SGRjpkE(C*6F1*F|xV9FNac+xGLPSdf(+(_4`J^ALW|n(`#{Bizia#qsG_ z^!s{6zpK(+_&hxJ-GEf-?v*e@6_9^ML3Cr3o=#3)8y&hzI0f7smTQc}FI^{u}0lr+h77*Z^h~65w57k0zl*0Vwf^X`nq~W~(*N z^Y!uIlM*nyg7>@n05B`y4qD*-%H~t>BkSrCU4Pys^&Pq1Ty!+}=SnZb6-mn9T6_k7 zo-J9>1z{fCIwp)I=u|lfb4f|-QI5JgG(Cr}$b6G81tC}SvEd~z4eJXe^}Q}04evs$XVX3;(|iWusIAMg0aZLA`fL+WPnwYO zHA)!ZamfRtm{}FM(#b)rj1`WfPGaG@)yPoz+{1ZH>d60a+acRh34W~7s-uT+!=Jez zBcWbK)Vtz%CnjkKxr+$tExV#LGzR>!1?20F>*>2cumG-3;C&~($^t>C5A z)(O}hcVd%*1-v=~H{!b6G*3Yx6=tVsJy)fd0wL89I-jnXfG<@RQ0ul|Qr7uuV>@&O zm5AI)dinxp{nmwSqABzk-qEwW;yY06Q?YJ=(Ew+QX<7L;27r)nWb03_TdcsrRIIYH zBogYd{zG4%V6w826^rcEr`Z3N+hqg4;|#y^(7CAu4mk-hluNW}s%Zuf zM=rvc;rCaO^nYih+&wqDU<(4}8^5?M0HJKSjI*GboqinhM$IN9d|}Kck+ja#yXe>5?1yHbWbwSE%`z%^6rnz2*alVPtemu zO@k@>vjR)LA?!nNYhTANa9F6?vd^iBY8JYVc02tzI{PF*_Wh{qXzI(vVDefPgbC=7_xfH1RrC>DIdl9r6qoP78YSVV>X8s+Kem;bR*>kraa>(H{eTAFI?w zL?aheP9rkn_xIW|^dDrw8^Ryqet9hf(F%`I=I$vyz{qzHYxjB}E%o1C3K z#NvcLt2f_tLHP0GV>!()7*X~s-!;eVeef~Pk@ic>Xwr?VqN-!pMXN#|qau^fA6b56 zF-n5peAkg9D}~l?e2g7mN+{|1X8jtIgsUrYPMXnm)iGHyN$$#H_^`ia2hsC|2%?Fx z^P_L;S|1EKoj=7GIQ-PdET(u!SbMce0o5t zJi1(QxjtWbrtppUjXEbNp38xO`Ye zpEBY3QCL_uOkWe;be_k3vtuj$5Z^#3a}7VgVEr#IzMJ%#m8YZ;iTM7;yNT9gr|Yd1 zOxVizihZBEPv#5z*PlAuyyk3n(Za&^hLbA2jkAZ6p14XxTgiv<37lQ|f__=Pa$h;I zuKI4*_0YlgO?(GBmu^!KT>kzxEZ+q8&JLw7s{+f%5B$;(8{RB@6P^3QRrG}+`GF!RNjfPK#hH3G-Y3z8 z(Pq3(9xm)3GLPJ+hkW}hfk|7pp{?%-p~0p$xsC41EBSDmpBKT8ZB)>wbh*g_HAWC7 z$UXfFEHL>%7{11uyFXD`dZjb*H~131fLK*{Ot=F0B9i(Lg@V89Qo9!am(R*Z)S)-= zb>CkXrtd9inR9DMW^-i7zShE*zb6wX39S- zUoUcaUrv#^d~a*bQ&;6%HhDKFPNNz1d&-}p^)`~xRg?AZO?!JDinE)?vB+U;+T!te z{Qbt>hPs;2ue*z;5AsR&9N4;AK=_*}0743+oOFa`Z(0JqZO{<`a3&NWY5?_k;}u|k zlq@~fN#Xti0pXSKumdS1_275b!=anRc_aID7t-!Q zmhHt|ww3d~WlL{Sf(pjt+6Lu z?LmY$S`gm&!<%s4oVqekegWZMfS*ij6L0;IJ7!_evyp2-VJ!dcJNLu`k)`uv#^`&> zQ7mchle-S}TYl{so{6vjXnnh6?^GE3 zDOqbT(QgrTSq`#{bkxzJUpKOXN3G9Zp7zOGCR9eM9@z=YhYRY@ErJ8%4+U8a%^$x3 z^eP0MV4rdZPG9(vm@GX)qmz3CUx1&U8TKxN6*kMkX0{_t{Q))|L!EaTUQVw9+#lN0 zdaZ!)DdRF9N($c&E#vS9a$)*e0+ZeLwtTG5RVkRA zH#LY8o1n6!aJLJ=wNNwDL0)I({`S$m&kcQglO5{cFin_4>j%lEE^Qm^LSGxfe%=Z< zFIyI(ad4)_CNtT!Pb)>SwoOwuauN1%FHAQ`j65zeg!Rf~WZ`m{7xPcDRgDtZL)+_Gf3wIOouf?t8 zb7uN)!3ZuFmLDDvsV|p*8Zc%;=<_-}QkDt~D?<4@exP_s=D*m{zWGcftQ-{mb2LSs_&_ns+7`zr zRF)@EKM&a6DhzJ|i|cjn5}pD%p2r3K*_{!#G=DttcS;)E;@;l)2U^MEI0BNZmX8leHj7R{V7Vu>u`7uetUKq5?LsYkC8!_N6ys5`$`#_F%#!ylg}7f#0r zX_aQT9H^I0Na>8)=Bl;7?{k7gczJKVIKN=^!jExEWbcC4#~!`@+8M|ZyfYPIwvc-rJ$l@sh53Ul}l(To)(ilnr zVLVPNKh^_xU}w(}y$#n(@62xbEp9kydNyMdpF>Gyrt7oqF8EW|Z`A1IfA>fls()$x zTX3KWW@w$-S(0n<>^?4q`Zj-FCLsJ9SU}JSvNv^+9cu)q-Cn!yrakPz zj}i3%91w&>fd>;kEF<(;h(af>1-rid*)JWM;9}UFoi_#C_&&PKmcDnM%w2~B>p;^; z2_X$WMt^_WmPsO-IJIa0i0y-sc#RmhuWemDCZ_SlxVi@l>=9IN*IAF8vu!pzS;u-W zJxP&YcFXOnDlAF1fp=i9SD#F>UJt6_FtU4M z_Xnp&;itf>@!9NS>L8+JjR+By2`HcyjxV6VZ%-g{gh30rV#jRVF$2ned?Ab2ekg#j z=}w+iMl5C~Q3-TL-f;zbQ-H)46l1BGN%#k z$))~kpuRg$u9fAlh8(Ufvj2(T%I`Aaco5sM((+7Dsjrl|1bsL$?=1_ZUuJsja#70Y zghtA7v)?8+P|le}m+VJn7YP+c7fESUSCu|kCMmv>*z%Zs$SjHSW=UE8nx+YBobtxa z(k_h_*)Ix9O96JeVDfgY4r%2)ne};8lJ6-{dHSCPyNR(wc;h%#E5yZ_FqTnfH)I_W z8@oI&@*^`c7&e>xWECuPxg{7|n;W2De)%jNP6N@rj$>p>!a~;}0(-ji={6I=deEAt zbjlW0gxv55@cM@T$K5X9gV=}uE0?C>{G7s7R+}7lj7?1ZrGy#&x^^Y;9>y)aOvrgJ zTSZOd+mL0EXY6V}d|F~mg!Trdqeo{}3PAG_eK_1dRb?M&{Qm7;abij^9K^~5-( z63(Mdg0s7A2$Yg#ZLeI#d_-Rq1x($Dd0K+o3)UT@lLhWFRbZ0c6@|OVcyZ40#ETO6 zsrwS7oI5+?8TAoM@>xnkWz)KfnZVw+!T+%IQ=nU_KNb=&Tn%g-z_8W=Hr@s26A=3z zcQ^7(_#eXrYhZOt%KA|cCwUv$gQtK=ZlRO%V3VssH149W;%!^7tA$ru!^gjood-ek zg~IQTDhria?^uku?CGK}3|*4qPUKxxiBA$snNBKRmF?@MGJ!j~lXL#LMNMC2Hs)?Z zc_t%emwd`u)#_-^DpsY%8&kY#yro8WT9S#X^IlJaLh$&@@ezTuz1tY2Hu*QBbPg2{ z@ApykG6R#!XsTZU-oE0TQ+Al;>amRqN^IvK=ED;9$JkBx1v>6^>zwZgv3CJqU7{XQ zyz&77c=S#)D)xfW{Vn%C$|V^xjja!RCW7CzPB>1xeB7s&D_a#8vXkOF&Nt z9u71BVSWtu=r;PvPLuJAe>}3YVpv3(J)E5Ph6Ufglb?Bdr?ZDwKV9VTQ$xpy{xqv) zy?rK6JEPM}m*;ydeNt%x5#K=GP*6s zjE-UEjfR(8*!`{ZV{04Th8gr7ysKB6UYxtT{Y2*Wc2?$gx?}b`0u{G+C)?n8KyH11 zD&LOyo^WeKq=8!B$m0q7PG8c`hu1BwDyPA{cn1dfHu^fc&wA@0?Uk$xS9|xV8ixMK zO;zK*?dp7QTJEMgutKZfrD?=#YFqTnO(XzV4$jf6pxdLtw%nA3btXCcmob!VY+WT! zEjm89+M&)j zDc2i1@BRN+d+&gzvuf5V-3XaL$}_zkAR5?*0Cl_Z31Qd+)W^de*a^wSM-= zX9aE_V^nR#JIEAu_ zoL#V~``Au_T6NTvnJtyQ> zoNcjvYE!yY=D~~&jBMw;5la?z?49`v^UovChb*@{cVYQoI13b@-VXtEyUyE`C@#3# zk|dRDHc>jd!ADEAyj6jE6BjY8O2 zwl9p7;hdQYuhi>rZr^N=;{5>-lZm$DMsSJ{+t6cYKR62f1Eq0p;MN-|sp>DAw&LdC z-|YmQrtN?+*-%Gl2_5)F@;`+*zJ2jv42<%(a{vRU`F!U~6sM)A4fYuktI|E!`((v1 z)}_Xt7rA|37q8Y_7$c`A8}7MXWS4n7_hqq1b@AuE$nw8JHCjU*T}UNpx*W4`=66Ql z>59<{R5w@B4cGS6eEa)v;}uL3oPq;ojHA_=XRf-8T2On)g0nqb1Hh#)zL~!{77)R~ zWhNYd18Yne!crAxKXOi>%W~`d&)1fW3eC!ms=c~)|8xGEOC07_+Zc9(b(x3D-t6Cw zb>e%V;?5f!f4BmyE((y)a6;r$_`dmLd`eC|`l zfm;x`QmyShb;Du!_{Bcvosst#jB4i>!R*|l`9%+~auF!*Qmq1VQ*#;3Gv=z|Hf&Zg z+Exy;$Ik%^HI7i)g&&UfBzOBaKpJU{%H)Z7m?oSWF{K>VA_geocMxnk2^BM+A!SUy z^U7_y{9UgXpv_dSA!+@H&?q5aY3E*ZuP}z%^yiTD>?Y&JSnNkaY1dW0KzwS9-?mb% zcZLbvtHoNiI*B4AW7@&xFdJF>?>H=KRAqbQnKY^8RJ5fGLL;eD!n-iO%(M9 z__6xn8ey0ATDveyvZTcD=vP z!PT>~fUvrHCqnUKA2*ipyl&*J)z$CObOQ_J%d0CpO*wCqy%TyxaE5yhdv)D-NCoJy4{023eZkiPhc4YkL{C@Jq5yKX{aVxMw5ejdlLBt4usrigp7F zPi)?c)jdeW+2+Cz*48|4If7epK1 zW6)(OBzV!(b;-VCHcJDz1o^`*HEvn^SNvAfK3k=n>#AhEig%Ppe zq~*ZunHQgs^wT4?N+elIZBOJ*HY_=4ALF%`jZobxjr+q|qEfbhg1`?6c1+P{RRP&T zO}^QwST5_zBc+j-SM%0Z=5Q2g-7k!TchoL(^R!I`#=rSzPvq5;Q*B{d9eUUBKk8K6sQ_!?l z=s_58)EaMBzFHkD#+N%R6wU_8E8Zm4H8%+*_3Z6-7&Ym`Q=*0Z1!}f;3&qnq-}UA6 z8}@byN{IWUceM83|P01epV}1wED%SXn-n%IHxh$6!(cHpYew%HD|T3iXhvi)(UZqpelXG#b2CO zPB?meFS?ukYVg+Bnf_dp@Gi(4e+O&Q_zeH$%>`>FfC*we?pGydMmLxP%=6)#$xBs$ zr)do7=kun+Wdy3J-OE-E?wMs^)x?+^Fr#I}gIo^m1fbnb>^VP@9S^B*7$%o}+_eq& zgPlSDFcy^rM0|{EKg$>I2A+Y-`Q=qoCsCun$+`B6lX5r9Ue~q&%?)ODLDe zs}kJ;%MDqYv+Ws09aUy?Lh9bX%WQY-yG0MpM)`M73LopnkQ}{!vLN3f zTb_SekzqWOXJzHBBe5S`wU^fn_Ci+F9RbZ3Nnlm<9)Oec8J^rx?9GW*_6dbVV-PlE zu=#yeP?d;wNGUtH0@kF(;Rd8v@GE^bt}&OmbU2A&a(au{5NzB%oZuLl$safodn+Vx z0j=eP4@e{hesIwM4j3oP)1N4*b~Cs;vqnttevFUPG`%NFS2*Re&z(QF^rxcu_`)^N zcusk%J-LTJ+Gls^ZfPRjT>kdH@23_ZTAFAyY9E)}oJ+{G&bwIu;+vresemzG`| zjWhS$AI=q&OU~M^`FZF0aQT0Mi7x@jbse?HI7jGFEhIW zo_V_&k2Q}l7}rG#x)M^qWE<`&@M`_D z6`$hZTm^evtwa6`4b)76FVN0w07}l87Ey>Q;_{%Ia`a1>tQve4p@?5~n z`TyRPL%yJkk1j`%g_uf88fJ%nprmZO7RH3r_e7Z1IP|Qj492cppnq7t(hmIVCAO0v zQzIsoN3p6syu#JZnOPXasflOF3yPJc71ynO8sApa$`T$`VZwGJhAs;haQ;>&Mc50i z?x=mL78Zg|0*Vj;Mw;t6*@*YPwaU{ELE!1zrRWc5UjfN<2B|*vKdTZ+-7mQ(@(<*V z%K!O|KqQ{swHdb$tY@&Jp>nVaVW8Xi(^cse!W@`{hnb5l&KabQy242UYC>vAU1@~d zJpY1A|5;_~6)M18zlG06(^q$U`cv;xr?Z+`+lg^jF{v+6zEeKoZnPVHzoypt*&2P^ z8Gj5@F@$w^_nzr;mU8veXr+sVe8~~3bZb{DA@QX!2S%m`hF7(J`4IDH-vRhAYaayh z(nW5xCsh*%v{cw&5&Y_`?NKlB(1V~+p!0);|v~68c(|j%Gj@PIdorf_!>eC zjv4XkBlig^*OsMv6?Qmf$!ceA1DaN=R*0Z}^t0fqKawkyXT_q@MVLHR->HSE$+msFcH*vr3H%B)_(g;Um%zfR`@X)r_pcX+ z$yZyq=R*#S_|NIYXwT>)_LsO{0R;s#%W<7K0DjYOYli0YM8aAN@sbQvN#dg11{J>^oxmHQbYz$4{s7@|BGrJVkch zcJUAI2X0rz8)|f>&q!LY-e7$H^x}s%i#g-hEB~-;`WAJ-vMtmA(!K4LwL+YshqacV za;<-{n0^&W57OI>pG~61y?n;`BmtX}%sTID)_@TuM_Btn5?)j`c*<9D3F zKokY8Jn@?*IpXt)@DY`7;ETrn(9@dnR6?}tKGY!e~w$#9=mAT zofwcm?&vQUHR%sq2Xs9+ys#zL?=-W#RzFWYHOA*v8hO~FYsX0yr~&{FEQ0?LKJ;|0 zeijH?1bmgCSJ%8?8}N=_foiNn8TA`lChd|q2OJuhIg2_N1B+wVJ{M6#GmC45j(<~g z5^4bSh8KdW5|_meZ{Riuvw%NXbPE2UZiME;8SFU@z(y8w)r^O86Fy{qo!v^j!GZMU zBU-i86G2VfxMkjDnu5c?IjX$89;3OWqy6<$x4x&uc~kvOlX0mfSq@SR$~H(A!~!Z- zF!4T&NGwfW)RA$26JksST1<^qV~2jXBBHcF!0T02LrL|l2z&)!23zKbT<4{l?ZMZNC9LI~2%G#Wscc@wh zWy?fYoWF(5#ZWT+IyJ$djHlZoHkS8{j5P&KTN)AdG+=mkjyNEf$C}D;5gyyM7PLu#*(i76g{qF2Pzvh{?DsXwBLxr3LbhY8dQKSC@FMhhx zPkzhM{j2lQI4*gNbl7frHN~baVSBC7GFSHm237_(;`et4QGor)8+XJ?q94?%u7Eke ze?Mlqm9J2PS+;zuqAV`51O$ zo_ZG5+;0-c`9ipEFNqi?yU{ikon)gMniB-=q?=G%Tr0MIU>NmpIjHT!Ce|y;qyG=Q zcr@12K$xRTAlF=~dOpvs^**s`F=lW)I8gkD{F@sgpJ@&VRsC#70VVVB;Npw!xoDn| z_?d7hp;wk>3Q!n6ZcF`amSX*%$jKl!x?t{5!VP_1UjA+7-yitj8Sy-xS@#Q?pwM|U0n%?A+cF|S(%^OBN>p1#9+UG18bHdejL-y zy?T9DTx}>m9d|lomrI=ZQ%vAc@0PlgFZ?-|G{UoLA4114}gtKPYT>cvWVToS_Ui&58!{zpwB=}D6CWAb3cM!h{Eh+$JW5Y5wp`Q zhMRg*Ep0NaN+d(tZ_fbK4<=x&!~g89yP7Iv0Ng&VVP0j%Syk-h1mZT?Eom-9{0#qD z7sxe!$HiH0#^xrmt}PxDcm2aHZT|(8*QR&Oi3JyyG;}AMo6_nHvQ6Sr1n?YL*RtX_ zaNz=3zdoR5-d^om&{xW-P|dxnTmQRR)ghgJ_YJgmqa! zRTHaa0MQ+4>X^!x`C^bC+ERr%K`mh6X}WgHHD7pui=sWO@dk7sm0`ubjGUlFL*>qZ$oN{>yk^M{ri5|TP~dbW2~9kbBq(@~gg7;S#BceU+#cT}KqFH1O<`bEl6p67+M;v3pAC;(9`& z(VhosdlBBd1g^2;&bd|ZnY;iSZG_2#QB+$X2>ywzUuEP#O*4&_QBd;l%$7R zvE1$y5=09q{rJhpJtR-I{24bmGT*;J{PrFpWD}+4`5kJC*|Ih>wMZn?X*gVv1_zHq{N#XBima6M-3^8~Tge<-iWmGt5T#h>#usx_iX_(Rq4FV&B{o}*Tu$bgy{p+&`_f^pO#qUGbP9x1r~Y~;qUXF>_@X+Tov z&Pre8@THcYd?^NHoOB&)va$mcb5h{D{>AN+GsQ;LPq=P9gUt{fphLa_0wr|Ll|ov>8bB{W9N-+RfStZWktnb7 z^6slqp6vzvaA(JnwPDxS76<~6F7kmbsD?_1Zl2LVO?SlT&_DBgaJv)On1`{$WW`A? zSEOJJuZXN~+JIc-Akh918f9jp&0!8-)am}#SkL9L&-qxgKJ!Dql#eUBOm$Ab)-p?d zMvvN7pPpYM=iE_lbMBmXXT!;N!p4PMuA>PeiQ+NR#s@VbYV0@RA9@`1sRu%W`s)?K zNhT?aXna;Xd+vdpy8>RT^pWU3*4Ir@sF`g`XMn0@{a}RHCnS(?iRg$t;4(x!;vB%o zjKB(eR78f!leAq5+SZQnp-Em~C~S%8nt&@Km&Xh3tn%J>J1=+@_t~{l&`){S|JPS- zRq0CS9(g3X_nm)-a?laC^m<3a7jO*8=o4!2Gma6;mzeZ`{JwA@@bzbL9}UtsJ>;hE zXH;i&v}fVnhQ5GQ=A)uM=}&aLpLeYw$2JkkT;Q@i)S4~H*Mm!G1jl=Tvi-Ocl?)7; z;^g}7;1!)8l9m(VxiCwWtTg(=)w{wJo?1-4^#mA49;u%QUS$~^E{nojJ#NBnW?+D_#%LnqoS*Kd2kDI|G;K)2mt)x

      A$Mg}tzb9cnu(|9!;Zm>r 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

      A!Y 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

      !p; z6K|<;4?`u0oAi&wM$Ox~K{F)+i*4Uedvxk_0if%t;NW!Yw+#K;tM!EI%{)#Uxv~x9 z%D4=THxhi>2)eMt)$%rYS_&jJ2MK$I$u>+O5$F#g9f7#nGiXSd!Zo#F#RiEvW)2;C z4W{SU{EFx1E@M9(48@bNQJ6~I@%|>JdjW!PT;o#0yh!pj*=xJ)qJ~m&Ym84%VYJ-I zvtgsN2&owOLl6fQvVvtYs5vu@l*|qkYuTRW` z>sY2yc*RVB56Y`^{@mZtZTk+jO08_=kmp9vY!D7xR$i;$T}=z1^q>+jUzgx0Y}6jR z&D@vacp;Au@b)~w!HOFOdj1V1aH1=sM>oOeL^=zd`DXysJ&$y$7As)+#4U|%?4}6% z&^e!h{6dmM#Orcl0k%#x{aAf@;z8!pPR7UQk9OSOKZy1}$A8y5OkCl#xCTeS+U32< zMoSa3k$$eS^NM#QMSfu`BX(4K^QTNk_2*AP$aNrAEj?Y(H zR`nB51AdcH;ZgpJ&QsL<{>XCNyok*z_b_zEabaqZ4cruqhla2mUave1NMF40B z)$TW_Q$NbXc^I+-nXS*UGCW8pYkjjUy;Wy0%Jd*J@r$}pCF(vYN1Fk#D$Z97i^jOX zYoFq|IKCoJ5~kPe-Z`G*feWy0`f~9vE`X`{Suboahjl{%CJ`D@HpHMCwdt6<0_=oS zt=piJx3%m3K;7!$9b&@e^3gsXwEa8Et|~Jn0S~-;^Y0!DYx>JULF;AOBM9KctlUGj zqMonaMzs1kCgt??Ia7A!&~S9-%xJIVvdYAaqSIj!{|L9X;%BZ8l)XAfZ2pEG*LQHn zwXY}DH+yxGpT)4w(mhIwR>u1E>uul1LP6!i+QCKKk^rK*yZ*m;(dGzk>MEP#Q>A$Q zpjg?c+6$3WA|sEq`Ezi)G9eMRs2b@NaQr~)eybPDKovj7ov{`T;1K@f`Zr^FPOfe- z-^>2LW7z4%TjoLng9DpftYo97piTDj`^>iYx;Njad+{<`vG{&9vSrk~3DjXU@mU>l zF^EWRR0%JX#qtM7K55`exT`>RvmR_&&DMdOiYRRLvsO_Su#TDffAC^Z$OxIlRpow8 z##Gn2T$bz~uITK4tE6oIAR$1e@Qzujnk<64+~c743LMnfC4loUe^uVLuL7TKaZto1 zr~PxEdc%;Z_4IGhYa#t9h2JfsA6_F{<S;GxP+ z{Ypz(!L`3Zg{J7tU<97c1!<~+$3odbwu2mxxHlxmb7`06&i99&d9Kd)L z1h|zFm0^BgZslkbhEBQ8;NqSKXqmBcEB_`PF*yr|XYD&DulydXn9;t<`6)E zudjH!PqJ0^U57>kHN~xo=dPz6>RX!^iQJJcXE+f#C;AQ-jcHYY4lri9gVi7)x6sP+={5RkXuID{?3_#n6V0+8H;c96~U;A zgD0Yg$t9^mTUc=KR2VE(#+;P_1GGi`?tQ=uC1+oIT6{0$WCV$IKPY~&LQ{JdQv#lO z*Qi0EmaFmYnX{C4)qg!6iH6)$HE55W9wV+dV8Hk7N{`beiaX>PVi#4D6*D|3_b8RE zY3F_N3T&MyLf!XIquG3?yMe7^A9uo4^HmoIPD%eChh^KEnp?1pAvK|N$%N91G$WZ< z^b_i`PNY`dFjMD8%z08{iIaJl^-+cefYnf>Z68|JZ;;WCIpp18xpnUK_%aLQG|DLSKT} zlAU@%xTG11%*ioZfv_Vk5TwUp;Dbl4fEG@oRF&y|sBA3g!L$gYJ~)yTYR(#rSsJ z3${kUaIj5_WKoTmN|q&hpcmY$uaI;{D;`Rn3aZh+k4un>$DM;BSuK1MJt_-T%qHgN zd2iOnhLf-Bl6B2tN{wl1@@lPx-CK{-r-@9CN9IXl3G$D;Fl9cxp?l+RSVu_-$KAJH zHe5~??iF)Y$*r(hc~^ZuWiV{C!8S};u}3~}AFYhG3vP22T=fY|w4446hNM!pz`8N+ z`Ty(!7)Z6(f$oHIT&ns_34{yK*%ZDJBe=n~c8o>aILu%omqJ4SV|Rgeh(+udMe6*n;kI2sIPF?qNfx039>n_`{0X(N11l=ZTe0=ksIpJX`b~kVb4( zd+Z;VDCa4OrT9(^53%`_LD~3k_6)h2S>4`eb%rsILZ1sJe5696nmMa%j9jDBuSF5? zL&ut|Y(FY|n*XPsG2i4&ffBLpZIU>7PByj!-}|R5Tb82HtnKMbITgpcRu>01rS_}g zjl+V|{uNh_w%@Yg184;FhIh!sIQk&IB_s^$A}}1a4a3>kvPUt)WW`AixU;~I$-)W$ zD)fN>;$EzG7B+ORN6;x~2_t(Jy0K?>!R?lz@vp(D>>yPA&i4+;T@$0)8^N)J2P{YF z?`npliInS2^TL*1T70j_TH#E3Z$ZrJf<}OOz!8ccy&cv3* z_wMgK%liVV$9loV$9^et(D(3Nu2C>(qE^Y8pEKS5NB<5&LjiQE?tv?qOx!Vpq0>Wz zBoMkwCsp-V)QpCZ8XZdNfXb#w8Dj_7_SBj7Sd2NGxLw5sn1NMwoo41wi-qj5^FP8ogMd(-e6 zd+|uJn*D;e7WM{?6>$b@ee-|2##< zkb=9HDD&L`bzNwjyqe)1l4SDcjBP=x+`fg13l^ekADm9m)x6#okz_R@y%}ykp-#Jz zc2NF)@F4t%2Vt=bz7$ruinMBnX;afA?TEL@qu!zJV z)IvB7K;cbiU5D%23h4ue%Gp*WX9l@=@Xk1n2raAjfXihbF{0(cLkMMUQX0s9BtKp~ zF?s3CHh(*cxAA%JEU$pPhjywIzPRPrZn1~@l9b=9_{u4x_uhNo{{F1;XyXwe@)cA) zyFxN<(I-|`TYUE4R~>rx{^XAt$t!G-%yx_PK>OPnZocz%4Q3RUSwfQG(1lcJ!gOqw zEP3I;&HWMbkeVnlqRMeiem6S+aAz&O36@R-cS5YJ^p;xBp#FX7xvZr-|JTyn)2Gpp zJ5BT0sM0WKwrh2E&f`wq`=vQon+uH?nCR=&`PuBo$Vx`rQm>NYS^s5a$_&q8hAwg= z!m7qkkklmbxlyU^6MEUpY_myo^QZgvClwjzUVr0Oe27i-grzwExRV!7nwQzWYIjX8 zXi5T>M-`oej?1(3Fb3BbWXUy{oD{l|;#nL3Nyt%>#yjodWfSMNW+d@4l z=NRdu7Ty#STuh}xwr!~>)DaA&fn(b8vJ@#iK(?D<7yCB49t-UX$k6ADvo5na@;o)1 z5}uo0+=G4=K~)u$RnizG;?(MHX=9vzg|!~=goVNfyEl2Ebp2|zS(T8NvHC#hYB_+C zT9AC&`n&}KTEB*EIBYSCbcVp&ERsswNgqjC?fa&yEHZW^mYIB9Tl1AC?1v-mlozUZ zxo(pGpZ$Q_a|*5*Yd`LXJ)rYqJXFSWmabC`Tul8`q?_N-N^1qCEu1kk!>0in%BY%) z{{Vkd_F0*^Vr*8$nZ0+j+6xZZ+V6^^=XGn$j_^8HpuKGglahWnpSWR&1x+u(2sBTz z`z&`xW=o=TCd}_T3?%bvoG+uGM~FZ0M(jC$*=s$wK4d5*2-i|oCvOrn|6a9QHpUvS zgqS`kt+4mM#uMF;38Y9Gu)-1E;F2J{S7QVC2N<`wTsfI`&}F~SuAoWC(()@FBkL5) z*LlV23N$zabK)FC;m{6+seS}nQV?aK;b3WRL-_fm5#X_R*`U9PzIx0DWD2I=*N6=? zps*|meunH{hOH=q?onWpnVN676|e9%!BHZg}){e}sFGyaE5u z#Ol=41@CqN1%IQ|n@5AKH6@8*+-q(x;JHJiNL>%WvKIc~>ri=43R zDR@7Z5w1oOaKWJidAsCg(r+Xo^xR}hXU5Lo`LPTenp)LW8J+R7@y#LX4-3`mY|B%i7mQ*JL~f~9L|alaM1Pl+E(sk!CaNS z=IG)VVd`g=Y8VgbE&^=MY6{D=xZN@UDfh}D9WE&du2NlbgafqN?ag<&B|%n27EElx z?mGGB_NSWKut*_t2^HFCO?B#d+c^L2l8i$T{aT8rLS0)x<(@r_IAUP6Eg5Tta|@gW z*el%cAZ_%fm>CyHSO}SH^LJJ*fWH&qI8{&Bq3Hh6wtGz>R<`S}(MO8tc9-$3B!hvT z=U+!+o&c8~9q?OC%->sp)pKPqzXh+cGd9ULZDm^)(FhW&_5yno)A%(nL#1Vg-R!O3 zAmym&0QNnmL{E9KWCfjb2KX=5&YjFT1a1WeLEc&9pv}sv!4@18M7hZ8-V>t*) z4ak7qpG3&oMPQ2-PwpNj`%X%vYrX=C7Iac5AwMB!t@viDIH!9#6}d6EDOX%oZojvSO-yy({=AtQTO6G)3bgf{`cHM) zF?!gYt}P*eg;@~JE1@bCip%4(Ijm%I+A5U8lI4Pn!Zn2rnb zvs&UpV9&>=E`{r@QzXtqCJw}h{?_nsfp!2_e zPV>UdR1vt!cDj!6{I7{N(gi%ASFNqKXDtevPBWALcdMoPGyG1s1Gj z!U6KlZ8}x~gt;D%J5qja0%1v5@70c^k=;&x(ted!&2MAw7Cj6UO9-%1okiJCJ;s}U zEqU(trn@ePiGQ>szx>`P@KVrrwLUuW@~-iNwxpb(_Rr;ex}5jPFc#$4fL}!2jex7> zu;hXymwD~}Q2hiKzVq3E%#au5GO#7yEz$~S#i3Fq7fhZj@j?ps*1bWhaJCODz&xhi z@(*&RKjfp{S#c(5zA#K!GV9s(i0P%JASpaH$sok1(C*A~^t8QX(ybKQ$X zvM=;ubX=}usoSg*;63D@ld_3YzgIZ%=fI9EPafJqAUkbe-;kt)!_01hh>EpKltTB3 z!{ocsZg&P&GSz}*%yW&rX%AivGOEKL$Uj^7u5bVJ5Qk-N>5QBPXSdtba&z99I>61PrHWhX7f=h3akycf4|Gv=VYpe70gC)5E zk;?9Og&&we;UypRG~gIl6|Y{hzlpa+g^wPqyRK+8(cE)qT>WI+e9Rol;q(U&{QUtV zhrY~ww^!Y5Oh(ksZmXVr;fGabDm;yQf~Z^_nNi>|nLRd@P}hv^vO|*ZqKfZdVg2hs zLmog0tYni62L7}K+vcYoFT$Y<%a7`3FP^Udhmi@^&)=fvpe-H(HzUO49ypZxZiV9< z_N>CI&0jlS?0@|jTnxalt%Gl5KMv^W``bQP`C1Y+IB<_#q+Ds`s_E(=+GtI|!uu^K zVulR{pV#4+YhTFkRhbm0EXm-{`iwb^bYBgxXvMBdk=$IX$7bdAT>E29vfuknQG3pB ziRT!M3X2X?{$o5xpX!H*$0Vh4{2vqy8dC<=6iS53d!(KshhIpj0ZLC5G%qF&NB^OM zIDn96njLU%&|fT6Xz=An*cHNWJr;5|fkic|Udls5KN6QRER8#}XTjFz*tiKv< zf&(9KkH`{|cIt8LznGoArdvsbTQD-)(8t31=ij5z13(^J@dPp|D}fC57&VjM z*n)*#K!j0t=Q#6#UI$ySxN;oJ=?hohZ@i-ewXXQlY-L50ltizN;Pox=Vb6J(JFxv& zK+s$invC&q_(~E8>=WpNzur}<=D9LFQx1INgMDLP457FCIjZW%R?=N#wsISL%9TrO zFB>u0XsL?Z+ZIF>muE+RuV1yZ3THC32HvFVw?ui*zvAwSRbcMtiw*SC5Tn2HTJuy~ zd7>-G22D5Go@~fsQ3%dv+?Tmg4lF`F71OT|48j&6y8|rM&!gSJZ`Hg|qITM+#lu++ zU$o_f!&`QkMrZ>AH)Zj?TF&#-zkspPfM+nv$g!!&61J99+$Uxct;!oKi#zZcreyEEVA z=Fdts-;BALBe3oPL%<*TL3A#_zFd?R0BzQ*xkd@<`Kv3YcSLpfz>>n@!}lumHTT?{p3bgXqCPApyE z@eQ`6lvZvZzRrui7W35~4>(u{vZ-eWFH&~QS6Pzg)7ZNDIU9$pKsJAran}At z=^|s1LK;7@T9+aGI*Z%$?;4{Pzwg4aAU&@N4`d$vXljYls#-gcd2K{V8|2^MqogSz#BsEPI(v7r`?i&TD*a^+?W=5R~>OZ zSni92LWb6c_)Z+sepnOKK0zS8$7MzR(#8I}xu*zx*6q)%L_YjVvk!^kZ(jQ9jlHq` z&jTN1@6MC=_R%;gV*}y$a0u-tPy8q*5>d_Ga3y%YM`S${4^nT2eg1eSPpz(umsd3Y zh?SV+%>2A)n<$yzS`00qq?R&=066?ruNk585bwA^R}n7P@QyVE%>Z ztdgTYqJX!OCkwvLhIn#Rs@P=p`@aYz#ob^8`41-b_x<7m_|fCkIP4MCp&bhLp_|9{ zzNRHuK<|`fGHrCkCVwaJ0g$M_=x6{3tUtgl0FDsUx1;rTU%4HjmNsa4`iqF<#X9rZ zdogBPI0~WkbZ8Bx7Y>tet5IO20q8otVh1*Xz#5`{x;$Ia3Zbxwo!X!f^-E%K@LVK5f zKVCcnN{Fc#^6)HKHPNx-ejt>Eo#ZcAeFU^y(s>ofGN5CI>gn1n2Cdp#;58*xSRdpb z2EGP3h&C@;xi}aqG1aCEtt!>+8(? zi7rc!4!N~oKRr#$O8eO<$n0SF&cx4sIWnuhmZCV3Ip{IClyufxAC=%&yaw1#kT3TU zv%}0*-|mJ_hekT1ijV-I-YlA~DQ*vUf~3M10`)YDqJl8*qZfQpEmAKF_aQnsTv!{> zVE=gylEg*dd?i*Pl{VxH`BN@0WKsx|9|SS#0~tFIpMsQ+OrKBN`9GJje9F8+;|l*f z6LG0zT8AZ@BYS5?G^WzP+xt%8OSB~;@Q~zGeBz}GjdBx`0+(&W+v073^ z!GNd|wD3E}9(;dtuSL`X-)8vYf|})c5qjj~0Cm}`ZgN(_@Vs$TWx(QT#L1G?&Unv< zl6KK-FtHUbIc^rqWk`fQh>VGCv$D+ z(WTdG$JE(obN`kO+-Ko?VLp2d+TRgs?C9;@olKHz zn|=$qpA(e$uELH1?{%XlGv#>{EXyUOKPD;SSExjwbd1q?`ri=Z&J3E1EkEREgg&<| zKb&c0RaQLOl)6@;t337DTxVz=-c%`QURcscVj-Ykt_erHl4-=YoLYexc#-iZU%t zq<7OKV0oCj%(wvC1}{p^FZ<%w;?pN-zi^c@TZ13#_P2uxAC&SoykOHCbOUK5?I%c@ zRln8GKvTO*zl>@7-oEWeEgt6ioDUC_eP=NfUAnd3m;ci_S01k(9!L!+r&Jm_Svs<) z0oh+``wQ0gPNk)cp9KUjG7oO7Ed|+(ve^vbpc@biqXwXn!WyU`{lD`7cynzlmN&1b z&IqTg@JWeEkZ0bETQ;P_iU}Omjj}n6@FgElno;ZVKZ|9G$B z_I_v5D)^+zvyHq#bI2#}-8F-`M-KsgDjH(^%gtb75WP^PBCt}sme0Rt48d3%Fnj6= zFVra?ZEe8!?Me+EoE15EZtfd}FJ)Fxo1{0?xZg$5idPF!1UKiS23q5AHp4Yy%6sukH1n>jl;)R%LI3uLg=C*-v z;Hb=-bnZ{!fh6uuQyWX($DBYl_Mh&DDF2&~wP3HXX5Y;%&N;Vt*v{g!-15m_%ATBtWts{IrTvB*8J`21-WL=Ngbu$ zGGvF9(s)&y>fb9&M;-X7Cx$}Sa64*kNE!g&#l4)hqt-r>{jMyMkeKdE@WDRf(8sHw>0C6u{G3J1QD5Z=G;Z>_{?ONNXGHdYO z$>Du^=?-6B*V)M|5qylS^wNB33+VH9oItS=r!P=0(T~@3(l-z83ZF&=^Yh|_1MBqk zV`D{!F1yao7H4m5-UQ4T@rZ*E?OEIcmb&}6&$)hs+C-pSvG}hnoLF2Ae&iadH|*^H z>?Po-rwZ)`DJSTEn})LT4sx!5%VKtSbSgkk4^aY$NASX%sMDWc5$B85teu6`SrfL> z(Yu!dnxH+&=7F&Dymnp9H|Z%jRKgyI_8;mcLs7_8H5$CfwnKJpHVw`v#lV=28!cDaFpB%hu7ubIEIL=ANM)vU57Rw|HBZ_aD>|oE%7j@ z7A^pFt7IE=;+LQ*8u;sH8yf%iZP|09U&GeK4+j+wL{0f?LM`tW9xANc$s4(u4#Rhz z-f5R*W?VhQ{H9KMF7<`sS6@mRWH+j#w}u;rBW%}o7M~Y1v&07h(x2#z?T14_dR{BE zV={oVJA#vB^|07EBcV)Q=gR|C6IkjEivW)N$B=?yi-C_wgVPIscGT~&nHUH6%GoO5 z-HQCEx5Fo|b?ivwux62)k8}TXs;RsZ`$ch~&$L*$6DTWMv`9^87 ztFf!ZT;V2sgM7qfGQhHIL5kr0+Dc>^w}NlrMtlS(GW%$q8;X!UxfdW$W)VdBknC~Y zQ)r4iz=|@c|C$A@#Q)zryx;TWEnAmmly42{L4-NwHCss}UjQtrm&dVBI#Y?JkZuwm zkoCMHJGLV}*#LK6*nzsN*V}>2KC6DT;3S{(VWC?XC_lWDdTLuHrToZ!9KP+>TbH^k za4R8-0L4t-C;9cJ3?Xd^)l)sWNa@S>1gZyN{6P@mz{TxRKpM~>snkSjMe>a)m2_>m z9_j;`1_|Kt#IhmcBFS~ED=b(YOsS9(iFKGA0(AD*ggV5)3b#i658nlS_Ymk)M6x(;x%n^t zpCASdHHj$~&XlTvSb#Xnnm(*aXduFQDaiYUBs>GGNp`d{{|*c^14V8vkRpQ#{&d`z z0s%JD^;t4G&Z$LRj7&yqshFOaucNep=`8x3 z@}XzIyR(l&^^CWRtyeG*_Z+rtE@snliOQ2*@S8kj|LH7=BmXTvNjo%kwk2Y-)o+s` zEWc-q_&uaI93cWIVsgd)b-gF6(_Vaax#girltqe*h&!k zmUK#>pM=Fisp6O)jJ_c?eJ8QSx;RcPb(}#D>Em`%y$7_Cg^mTdSV0w=rIBGZR=QOC*@%gEU3aA%3>e8@Co_ zUq$1w5R(77x$A-eN{8Ca;>Osy8<1B9=eA`026L{2VD#l~Hs_urenVSGlc(lgjoBtA zPQv)Q?%g@gY4oB2qNGFL2Whnu zjnWXdpy!c4T4{tXz`dxg8CkTlVNZg+>u#AamIES0V4!&1SRm#fz{SNxy7r@ zIhg68o&f!$B4ngTzpsw>b%-b!4H*?nAbx=RMT&|lb%W!j)w{W?BcR8DhU610( zJSIVpr>FKuAi>&q`SiwMPh{j8d1Xpg<}AxPV<*Glh}Y+6eum~Kis;ku1tfA14iCVb zJ;N9PWM7?!NA^>d9JCOEH%2i`uHxrnR`742AYcnxf_wdv58=ZiS}bSwpD)Jn$;>qW z3)=##MNvHx5mxNWws(U4>kN)-RgKbrzQZtOr8>YOhlf&wTb`F;8?qhzWN`F*7dcmA zN?#XO*7d(c<~wfH!3n=$#FizbQ0_gfq6;50$%s^s+as`6dGxF|V^jSqV+6Uu3Kt@w zj%FHE*Yuq>fr$tkU9DOjaWs7B1x9eWF!7WGTt382E%q3iJXmMseG^%hT31d&9}X5( zNssy}jx_To&~fm{QREQ>74jOm-tkzo0N(4inuYh!ti_%K!0KBkP`reZ6xh z_0mz>-|Z}rKIb+rP9kM=!I z*kP9T$^l=xHLve1d(MQ*8xgouIW?8}O*;yzYtJkE!Jp$Woh>Wi)Y{m0&f%FSS}|71 z@hA$b=ur_sP z+kI@m?w#8_flcZ?;!exx%8!0xDn%$OL6=8v{gg=AqX75;fC#li6A5$7lrs|gSqJT$ zb)XoYX!!x_a)MJXVuW`~@F7zYV-11*9LY3(ixvE zNzd52AwPaZdEUYjtV0&?t2AZb6BIH^_5?Z0@F49x2+NXQa9GCW*8CJwrmzW|%O!o#6Flx4GA}BieUb(B>d0;WZ4TmfdR8yD9`H}T#eYSQQiULa~N$+IZpYYgMZw#{3p}Z zFWisVMSSeG@PTxCS>MM!s;3~v@zT$Zmd&oasBhEQ7Mf0xpzKEV@5C_wa+A3W)2liW zI#5%wSLxRp=Dz!~t5od$QYNGERU8gc?|ufD29>T-SI&>9#)QN38>EMSUCLkPc@g-= zD7CQ%8&JJ?ge-FQNV}eorK_Bt8G4Rw%iq(;2^IscuBpTS7bt(L6}ORemB--mj-&3 zb0r(Cuk}fW`MHKL$8cS73?T4<7DsRv&=eydp^3WcAk4r{qDveDq&4qX!3bcj060bkj{@X&(gN^dIdK*vr_VqUYa3WCYFi1(Vu^NL$2AD^Hzj z{NnVDzPhaUHvap-&>yFYAX&yXawT7%~iU-v4|235{ zC>88fm!?Sp1_PyUk1Y&Cpg=fZhu}Bj0N~cxKr=``k?y})@3GNfOsN@QDTmBO#BB+qPl#$oN>%_p4|*id{3iLZANPgA%jxM%<1^_vfb zgFt;l#W=ICD`t%dMKxqxbb4yM^ZAwwJmr%HUkX*}6_pKHBz6$XL$rH9#}aEwV_dvo zn3_1>V=&R3w`w)TaqxNOri8sv6+YFCa6Ep<*VL^FXEumBpTcH;Es8r85gb>lUDxJL z1SCJ}i>3OWujW)Z%AXmKNqrLi@rCEvQNKHz>S1(`j{hroNtsP~ZaJH^hevo~PrEUQ5zWiz{>2w{O9~i0}Kj0H65? z52|=K5yT|`2K+P0X`N(5Nk^?q3lR(hJZ%9kgKMK>y)^l>e8M;unHVPz`@xzRwLxsE z^p@Bt8b3$D9vTwr&H0`n1CSH(EihgI5g7dUUj@h?a;o5kc>}KaOGvYY(IZI0!0WwQ zer{>#C?%H|lRRDNqu+T=P9)&68`m2;F4wVjy6fo(PdE-0h56SJ3-6@%oa-j%n9Xfd zom<3UT($M;;`6x?)5yYWMc2&pmAaC(*K+Q_%(_L7?c4lR;>FMly>AHZY3^>zKd^;! zz}sR;Ue>360kUB0fN;EfSTh&@nE;PWG-~>CfooP0UMI$Zm3%_j&7HVbzR%BKr7|j7 z;HfTvr{X(*22T4=We^ao58%5!Aq2c&mWTVLI~UpkGuLE4oQ*C(^g^BS2mD~k2 zbs3#NFUW2#bFjJ&FDwJn-NI%6;HR(|2l`MJjg}MN>^3>9Pmci^kr z(ROGUj!@mA9t#xSm?P1U#qRCp7!2qe@BPxZ)LZC!k+Uz4ON;nY44gE07Sx(g<2L?x zz)eJlnk!oZRK#i{uIu^Ld_MfacOE%E0|Gw={_^~~aAO4!j9Fq`24Bz}xUXN|;fGGZ zy`S8a4=!mAteEAqSz~tE3WUFno&j;076RS=+piPf!ZLB53XBD_&j4qVFH#OjTHX<8 z%_9Z<;&)Q|kN&26V$rCgp+=P(&6ANtf)FXqjH`X7P~ixF9j zUclP^-1zH1u!)|_%aSXrK;LcQerj!($InB zF{73PV|ov^oEPa`Hft-0#Y5*B1OjDi6?ATlxccEcdV9<&XTX_1Wng-{bR5 zYZzNcgw{V|P&txpmE~sukz!*-RYh<+?|9j2%>wAIc`bPx* zdHvsx_n+@={N00%txH0B(x;2J^_Yt|=O1VcGkOoaBuq>#|B zbNlao8rBE;kG==%_@%?(E|pgNYW=X@652U0hhY$Du&a&PA&8A#<)@_CL{)NEet&%J z4u(yMt145K%%HIN=yHp7HXi z!mpEI4X3m5fH?uk0G5qinT9J{KM6V%A*{C6#-V-(zaG^M>?DMOx3NrQ$n3%VF@T8s z5Qvy{*w3V(dkRy6r^DoAv|&0909B};n4Zht{(D{?0+yv*;!0z{xIUs(!j8sF1!SwG zX7eHwuv->f=w&W%=IYN-xbjD#Xy{)%50iXeRV{T%z#jJiC|CHIBDe3AgxQXYCHoDuEt0CUes^DG zwo^Fof}4%I(xWkz@T~Zlwd?)fk-vrPeG#bh&TZ2N6ZGMVcl#FaCfr!JZtqvMotisJ z-Fzp>Z@Cu*C@;>#&TD%4Q5Nx+VL%QHIFfy;2}8z;T$EXUy>2jd34YNJ)sF$*wn>e_sv(VV zdX9whZ@ps$<94jP*i)S}kKl;8VQG(7LeTDyuF2p4jILhk+$g#c(ZjN=tpZ8xmETN5 z_1EHu^}HN?e>1x?5z|?v6mIS~*hY|?K3*O?kmy|Z$V_)K3f-%_!n>KGqBpRKXUTgSneJlWYx$j zCHBM6seyz}+Q9h;7)Hed@iEMqYK%EYH=(8CS& zJ(T(ooAM-VDv{KCt9mBd1{Yke7qo%-vfj`x#G*X4_ER3+g+b_+kr^`AyH)o2d7z&% z?+9S&4KUcNAt{SYY-~8oKNpyZ1S5h1go{|JtkhApwX?7|Ilwp}hrIzBS@+)0J?siM z<|jd~tX@~O*;A#GQS$X9hGfo6CoZ|k>B1D$(=dms4tvv21nMbl1ASBg8$ zLz9Q((R!0)HPf`I0gSvZXE}O??PzGnDXSw73Czg5TEGvEz35*M6mlF zCMYy`k!?XQ_f``XMD@eqBtMT}_MezZ2@M&1JRDIMP_65_h<%~@S}=Jr(UwvAl~z_! zYXllYz{0Pz+jlGF^zWs^EUV+^?~Dx(Y#(sm1cf(h7`WbXRtzQ70yCic+a?A!vBs1= zbWzdcLF`E;eR8V+edt%c;e~SaVcTp?K~(VK+ol~lowevVhr-_YnzRPpBL83eA@P$* zoh)=b$!RDk<9;HrgSV$FA$3w%-$%cmmUkGtM7XB=cq%CP$2L99;)!0gL3N4iT7`AX|a zOqY%TM(v`GKp`bD?hBQpl8fhRxhzRanTa|5ei#O>Ee<-AE zGPoieyd(bkMtZ+8^Udu8P(l+D<7{UCw;Or#)65*dDY5noN8FYxCkb)CHaCP)W&~@k zN?d))&&;eHdLLCEhO3zwq|-8j=03tggqj1f{IGwk&D0~{CbJ!E(U1C zJoFY(TeUiXZXrN!^TzIXA3Jhy7ydS?)7;I}R&wYHu4U@+!akWH`6>hL&LQ;j5GP<_ z_N8INTPPY570=?Peaacr!Dd21oIcePpMqn2bTj?;4ZMmRci1qMJdzwAK)2pg?0^T~PTAZD4{}0?b`Z2#${Lq;0loS$Pm(vBXyYKfbn|NzM@PFUe?M zx~pG<@Log>{dw3E-5vD%*l0hiudJKyCKu`NRDOEBg?1wQWL`?!vxAt5FziH(0R?mZ zMlq)q-4rCxlnH;yG%geKp3;!7X1I+!w=$ER3{5#ZwxOc!nz#YA)11J<=$GT!5t`qq zKZIX&LL`cT_BQ@9R7-R=ohzWOV*0?c~t;#U0%&jc#8l z>|AR_cN@D%8_uwErUFt!nPj@Ih# zB9sc07TE!PxV#ghElfaXh{2>`N&PqAM3FPd<)1;1=nXYc5F7@63*4VLpz$Oz!l>QY zG18ymcp&J$|0z#vF90QMxwZ2QE-bVEuhG~=*b=2%;ei75i&~` z&8B0U>^}Y9|fch47h5h;s56={Of_KJ=A2%rMWSBuw69zNv`P z-3o&50JnYlThW+O5ScfRQ5TAA*+r5vruWx1z83lp7?LOBC(mju-O+-Uy%`RyxaLq_ zi1h5S!#KifQbXAnKO-k(V5MfAB_PXg>&|@Pul6wcRHJP`6>jxo=U9LJhhdA zs87HJ|8lbSAQ&;A;$Dn31i=ZzTeH-w?_VJkUu`+@Dg}Jhjcgol2sI}q7_mw+NQ_zlE!a{3stYKfu0=Z>c7stxKzZDmTnFQRmgr((0Go#F4ooRfs_U)r^MerXbN?~4AkzC z=vm3;2XJZ?m0{nIg2RbX)L}T5AdUU>#ClWD|DXl@Razbg1;Jup0Jn@xtlE7-STLDY zhXKWcCxY)Kf`F;ZVmS}D;dAUn$c-N}lE z5S-W8N5+Bysoa#HZzP1>^L21b0B8iFE<|F_-dRm{^>6xgcNJB>xZ~fr{WdJo&f%}B zt&<`gP6?UZ+ID#Poa%QJC0|Vv4ZZe!W7j7Ad+}6?#FgUY@sEA!fA;1i>paq^$lylx zKZv~H-x5u+QY6is|2Ui$7u<2xdT8iOoRQsRL^B0r7MgHM2H02IOi0D55SbN2gll!8 z@iocI^3LTDSmxuzOP^QI>8U0_>$H(-Qlf+2WtbhyTmK%Axt+8+)%ZnoO6me0BMxn< z|2X$t9YR1wBgW2iGrp;zDEZg0@`YrX)Xn<$?o(@v4g?K7Bh&}oSFBb}dWY>OY7s}p znR00^M?jiT2}U~F%+E5Bn!|h1*ntx6CG|Ej?}{e5?CHQEUw7RK>Y1V8y$kD-eoTI2 z9-wobVF7pN)lS1R&5sHYydB@h#C`XD#A+BZV5HjU;pzpj`)Bia3e z0ao%ye!qQU(x8!hVt)ah04Fc(vP=$;uM&%%wA#z7i40t zuN&>w-2$a1%5(p_tm#Q{gR+VVnX&d$Q&Bhk&zcpJoqfy0#A_=X?($6_Ss07PTPxeo zX3gwcokEab5@#gV;Ad~TnS-pp3#*lNWA>Nr6y%pWT=-^4^->-$4N6^wRY_rT{6{aW_bGt9-_&OM0DRT=`5Q}r8 zlN1M(!$V}I-&yAlZvare-ktYExE~+28YFIF(t^wUjArQsVOE&;o}p87sFw;1+hj7R zKXMkXr{91*q%Z^~=MMa^t!y5m;j}c>4v1`v)#nJc+j=DGTxVyq3^U11eLcn4{@s%W z-0#o4{9LDpuTwkMRu^o`f+5;v$mGsHTE_OceRlTc)2jE_1PyciBk5&4X8RQ}#kSHrh< zB;DOLw^1S=LBjX`<~p~NvfB+|D{rJZ*UoRYFFf-67)Zr=48JF!`D#Cc-t#d15B`I% z5I-tFE_U(k{+ZSD`X9X}RR1bUG<2u7 znDHD(m^=4>agR>e2?|rgv15L7j+eRp{}v3nMtLI z^QiMLF64jF=kFlY|Dw--%~pO_{9o?#U*OUIAM`mb`T6-SW?`%R7^(g<=G4?rj_n7M zm?k=RWcV#$LzwH@W94Uw9VWWd=Go~#U2R?je0$*FHUbZvk1IY0S(SHM8FJl*d|#S2 ze!I8m=Ywd_+2!|aGu|}!+OylBga77+IYma_=>W)g!m^rUbN*nXd^NrT1rc-MKZtt@>7=id#Laod4YGy%2l;B9=M- zy?aWaaw}PPteoSLUu7Xv(o3|Fzd#8S;FT|>OO_(MlKNQKqihqiA(<#X`b#@w#LRq6la>dgXR?wL_lOdfNms-rYK2%78% z=IIlThib@g5@0jhKkg{B=B;@9FQ7%7*4*T_5ik>9vGTK*c{wLJ zOmidwoK=1l45%2s8hvvw+b#?{Cz^J4`TX9J;B&O4^T7WX^bN+5Fm=uPuuX`fNWCO_ zp0?Ke)m6lW&djOHxpq&WI4Rn4{=Ki@%w8qq#phAtq5`;NUEF@3|I`;yJHOOZMd$JJ zIhg;Xyj{QY_Zct-)n2k_DWBk0irki2Z|Ch>zQ)DKF6hvdAPg!j`tau*CjUo_$VlBD zJ(ml>^A!K5*s((PT`8E{rMYWnk+Vbykh3CfCvP1GWuJ1g2{k!4G$Dj#tm>wI57qAM zU^9;$Kj7tKo*sttU`+$+O=s2~n8W;cU~#olO4iI{%LITqnWw&r59T`?eL*j`J<`0( z`l!D!uC^fK5dc#I@r3j5)xW0)xT)v1b6!>d7r&0T1l83xw}-zt*i&Ij@^o9~IHn`j zZ^2dpkM7i;-U>FbNOq<39G*BMUUjSIrbm{~D{*80OEg{6R{88Md)lXON6ZBeZ z^k9DRZvjv0<~SZgszHGMLG_i@^XT6N;B{-Lp=Qq-GF0FM%3Khu9C?fWBLMF=xuyI+ z{s~bo2~srvK(+rBptJD7!lH)g`Q5_7Zq4j`wr?I&$Kd@~EuDG99EJsq=*cS~oCFr( zrvzM6cmwYb`^A4jmHa%I=KC`WDS+>S7y0benTMoO9{6E*X6Eg=Z{LHn{fqNT06zqx zs$;j3(yRdX+XA2JvXbgLx-6?U8WTPgVum~v8b=iAET0&R&| zx8^s-51b9prRPz{9C1zrJs+DFZg6$Me{xmg7zl%X>q$qD59_C)h^(z)IEus&g)Zsc zbEY<}<#ZH*#L8}hsq#7sS@S#i0dTEnTf{sQxtR>e$cR6Io&!jK51eM=qg(S&3h2Wc|NBl7AV=jw9V zcL`NGdzj*?kteVR%SRlt1&T{jAZR#CtM;(>_HWk4%^|PsLRii<^QS+xi)`Q>*}q53 zp>Hp62w^E>+y06AyY@pET4!p>e?+sFe2S>jFb@E=h=r#=5f0xTxMN1mKYX(q>#{aK#bK54-1 z8<9&ghnj|QfW7VboJSkFum9Ir_1}Nq1cANU&5QT>htz(|fuOF%=(MbGz`!osZQ(eX zApi0j$JO3#J8IZg@NtWuA6J8q|CL{V-2xjQpkfJeZ2qadj1G{Q6==O51bg1cEq{KT1FzyNjhLlB02KVT zL{{^OInQn=l?zHB_p0H%G=2@is9N^<%vrzgx8tBiq>+C?7$E+Q$gFBc;bss<>O8Hu zSXQunWbnoE43jWTrx{v*6aB!o|*%}YsWVtc8n@J%OK^2NwxAU#+fVrp ziM2nmqM_OqwAGn7?zwWh+Y`edlk=|?iUk=&TQZN4|AjgVfd13fbKob;UbL&(S%xHw zKkp`0=dkIJOV%Jvb#dU6Ust zi8Cx^GA_hE7p5AmM-TO-8QrGD=ENw4?;Z;~VfL0Z?108f%#=M*)O4`m@;ufj4uDd| zFptAbj;c$6-ZAVUYH%8O38Ir0Ibz|TXCC?>#2-?Rs{I1EbQRJ63jPPT4+KEUqRwTP zUG^O3iLsq>1I2lYzXktZ?h0^`-zcXB?NqLtCjbG9xTD}IIA z*>I_b;h3A!d^dkH==`4nPeM!&)BBrR&kG#`5xzw%0wP&>#M%n!@8qR2$X)@|-S-}e z8zCBFf0M(%emgd_8LZLJq>9_EW$`M?2hm;_qr84%&xdVL?mD9WD{S(a7pycr4W(&X zaXN?4X^yE$8!qD$SJzal1k?tl4lnw8P1mU~yTIVqVDMO?xG>8$D8}Fg5@WdYC#WMV z*J{#KATdH8aGRGw!cV+t%_$|f<`gxHJOtNeUf+cZeDYsaEls*ou5p|HBBm zDki^f?fPUOI2hTh*kmaotoKCms7m-HHmP1m_=S68=5j!&3y{Dtsk4ZWXuO=hDS>sW zKtqV-+Ry$mn_~hwWe^==FY7T4r49m?Qe41t>2+5}jqrkYWXwSvASck@q|Sn$?~1{6 zm+qffCA*!B>={(CP6aO41gHdu77{0+K z5^54114+-rwrLZq$BzLRi4kQ;X=XS^sOn1E_`$CUo~yphzCE}6!Phu{P9n=ZHBO)p+zOgk;?c8@UiAC=<(fc!5DO>ACFt#RMuf=vS$bL zj}%3fZY$35uf8lsz?C%eX6BnJb=!a#cVIbp2Cqs32HJ`VnB!~Hb zkG{)x%&vMTOf`11!JaMm*3)ja;#}+)cI&KG!y;*cLeC{0SN}dd&exRbV{tpS~7COAk~mJ$6ZHN;$bacIpBOi+w4RYB5mH>H{)YpLrI zQe|bm!c3yCG1wx0>vWbpSsQMDa6z5^dC3%~V?6%4Z(;OxctjLWXR-so z9upwv)`=<@sonAc_MFmYr~gQh&3)G=C*3 z7^rl#pp!OXX|q!HCS=h;VAn?~>ksO7pygmpKv7vttdPi8(2T1|oVLpMIR^v>zeR0- z@yoHYbd|up2Vx$bA_z$~t`J%&+E%=Q*_JXs!{aprrJI?HqOSXYI+Ul-ks8!_LV%o4 zc@Pyg9^d^oDKO}rpeWuviIgj{;u~P^gI!y~Zeqk|{Ctcfe!C|HRF#+k2^B|x+aO}i zWo(P6+>>p=Wm;`I8awfwaJ+u(eROx8U*XlF<7d>M1>Ou^!yD4X7Or1}EJwad zIe~s$eHIS4wf>0OV*IplP+4o8-Tbq!NjtH)s@s~d$K1_ zK{jr^l2xkZ_Vs{~A7FI_&v9or10EiRWwAdU6zYP|X}5U7XdI?NbL|xYKnYOOW~iCf zN9q0DD#R=L(y#%M$9!S@Ov}N=D4}71;2gBR(9PJoAAUNz7!?eX!}Vb&Bz78Z(7y)< zp1GN2nY=&dKH1j&u`s?2Ua0nAR`GlnrEg&wjmfCL5AV-XUl*`gm@2PFeOQwdxc~7; z>hs6KXbV63;b;eo%ji4CPBpOvr80@3?49zUT+@y&lo1=^b|C7DMg^tw34Jh?;2GjJ zIT|AqbUTN{QYj0=sZgq$8kvkDu5CFcyfkLgcA|hbaF-p}5-k_fcRg=k`-e&-kX#~q z{ET`4rb)r-i~_4Gus6#M4NUS!8YE$A?2;2i(SS>-gDC0m>RJ<{PXX);^n~iYbo3%X z5vUySuUezknlya(yF!XZGbCgZwcL)Q+yPScb0iiFbNKm^WYz>+Cb}F)O#yQEly=g7 zq#AAn<^m4!ZW666^U4|vaI>%Tt&OOgOnpuerdl{pKh5mwY`CGnoM%dh%GR?L+9a2Pvm zR^5Q>DRBLp&AqLpH^8x)Fz?2No`c#=`WOK-kBiC-6?pl=q`U{f0J=PssZgyb*?v>X z(>n>UUWxGd+3>Y95jn}rg!Zf|o{EI@nGMW*-#oeIR8Uss*Ixib$6*B+I!Ca}8$zZ= z(Z-IBFaW*=SC-{foS`UE*4fzHaLJs~xZXxvnzMVSyy*gyEH|(!j{zMN)28mnlSxxs zUX#*29(ju(zN>1|2ty7Lf#M*tCZpSEGIuPj-;m5X*-xXk0H+!r5F5zV;mf#JoFMl4 z?yX7z8nuaPqW>UoT>*JC5j~{xNKv=}u#8Tc0cm8+IFy|z}2O~~}KS2L;kB;(A$xKis+gvz3jl5yED&#ia-Xrk=E z?is{*7|&d6A5OcTIBt%eEZ?p!>OjtPC$1r(4|yf?6f8 z9nf;QQ^jWCKf(^oV0a+k|=P`u*2FrXp4_aRhZ*d%QiCajsn>Z_q`yr_(s)A z!0wDZYniWGtuYKnhvOO5LG*eW-~!B`8L%;hoLd9gxg*JJM<^i6Qq3Qpsz`<%)M~t z?v6Oal7Y(nj?V2ioR7bQ_?cMsxY|!^dee>ot07NZQNv*&Kfqdb(gsKw&rz|hA=!Ul zOQhC;8C?f#WV0?~H1PleQBgC@eW@ishn#c2bhq6=S%O=B}z=6wKXj1inSl)?)tAL1fEdqX3N+h03-wjVp3A zaB2R(4rYz8&i3C&=Y&|7FP9bv4;H6N$w*Oe<3t3*bf=}s1MU}Gz3Z;VeNH=sp8T3b z#@6dV5UB(EQe^}*j&3b^DCMC9U_t2={ceglW3?tXsCQ;mgJ=$+{E&SIst=_Vxt#nn{DWp3WN7dO1a>vKM~goi0KClzKZIw&Wd zYW-os_e;i6wlj-Q-yKV`oE&Yc7sbzH`)~CMgC+tQ@*zFla!JGEgyEj*k+Ol}oy>TJ zI;gFmQk^&(;`U4q6)t-;W;AyCPv~NjTTc)7lJC34bEH4dgO&%@>T3?s-BTVZBfh3= zCgWn!n}a;q8aUP9ZzbN?$Wnj*Ar^72f?|y!-Z+31C}HZ00tp}06iZ>q$4hy`Awg(nKOGGEKfISetGhYF(3(s568j^S<|)wSS^yBKPF z^#`324dqvXB=R^DTNvL4qT0jcAiclR*XqHy!MJ&s}RLh}vW-$pLB zBo)$o)mlStdbtl>Y*)5zF?E!%Ngi$?yb70V7guVDcpy-mNCdmR53vfGtCo|7?Dz95 zx@5$n^9DW>m1ix|2dpdx6O38$+6>IO?&DzfLe*GELhU|%dZ`hW;W9X-FAFh{qU4=W zjpQ8*|I`=rc%8kz(_xV8dTCHn)UgfzotNMl8Kir;;K;4~eGj*4RS1Ty*49a=v=bnc zXE78XI`2rjaSgrb|U zP{&n}XIrR*vJ|k})CWQ2vrykbmsemFmKsc;kz$Y3(ag0+=vgc8ve;Aj=Ae+kRev#Z zAHrFfpRGe5&UY^KAl_OWt=} z*(r_}#p~g4<;^l-pUEZCpWYi8a4R$98rOfwo=F*deowJDgjIrOO!$?%7ZsT+hKD*j zeuhe{yOM%R0v;~e5K(sG3L7L{)$Ko+>x)+|9Jr>Ck2sDzhQH|b*2TIst%>{P88tu$X^ zR)0tdl=bslMRAOY0m5QEDevw|zq}-`pz@LMoXgA4HQ~&#F?vV($WcaigFR!W3v``k z2n>!Vdbw(n5cyor#Gj&}y|%80cvWp0?sN}~XdqhlC`iLsG?;Z)TB^6**z?>06iZiSr(mw~BrQqxo)GJO{`r1~Ld>`e@Bavt&mLIO>t^U0vFb3<>!{LkqE%^F%K5*eq zS|P?r50wsd{xM|~RMB4BPwrcw9P&e?K7?#x8>f_|J}rSkp1yX{s$-`m)smg;hd$Oy zsUK$>BZ;FyF`iwWca$inZ9@h!)-d&8l#rS z#06BvXF|TqI4jMhzI#8H3lQ}B@&|Fjrl|#ah3cr22==S3Ql!MyE0=j>4!v3wD-{58 zHjSL>kK0WS*>EmT+@#2t(@;*Iq7zhuH!-z})EV8!(1TIyB|#0DkDNV)bF zi3E!f%MXF^Gzt{T98Uh4mi1pAK@`!w7eG~hbI3^BX#ltPd=-HBd5>NNFyd0f+n zMSZeIr`0liWeCO2!CH5piHtv#JfQt$2O68>s!=J&-UAsTNO0f}dkI0xkS{t4dvVnK zPR)#?{}}LzQqV(bm?qndE564VX`*ufHwC&$*S#mLN9CTjpoCeQ$KQW z59l_KJL2;pOdl~b9ap&dc>dUMGXq)q8yFQaSwnh7H_BUe0`g)y?HNmjQXvAj410HO zh4@assQm@MWf5RvQYz5vGVFp{@O9gpP#K_B?sc+3cBp#`!2XJ^pNFUm_6%WZ2ssZ3 z_~!5Lnpo&;Q9&_oACVB86gZi0)%0>v-!Z4D(TeC$hK%?7Zux<>&&$65(IM{uMb(#= zoo~Y3!p6uj$wN`CI@dX%5QMNP2DeR5C%x>g567OMSL{)RVO+QKH@t&Ij7pZb(AJfT zd<8+W468mopfe4N!MyJiish5g0zL^PJ)T>*lM8RxgZDa}L)NXZ_2;@VVuNfBo{;^z;RM~iz;0rp+rYoucriF2|n8pkXONs@Dtk-af7VWW+=7rkwIJ-8_zoyaU3)K^X?lcWp(JsGJ0cM5X({rcVjyCJa0%SaA@7 z{HcGQ*N7x*`9xz{X)>iE4yJVMDrArhrPr(5o{nx*NdEk=pil@_0g5-5dQD!v?W4!n;p_Qn zWOe4#{c@Js=QS!*#_o3S|Kr*CM4ZFQTt;wZR+{Xowr-cv2C%!J&aTZ_Ys1q#*vz&p zaH9z<$4tIGJa2J1Rm1*!r70o%Pt)BAcvB=k$X*jcMS>P`@Cr za`Bp$8?p%lWAS`{sLDYke|AIa{gtBm%G35X`&#AN|FGRIhNRIau!mAa#^upXnVv<( z1=qkYb_T7-eN3>x7D$~2`6eTmFi}XzD5Kl8KTdefdiOeghoyZq{X8wQ z1R>ZChq|p$Mv=j}+^MoPL^B#hd;{?7G+d?MK_?N|XOYq71cYMR`giWc&j(6xK&_he zfDpn4id$WrQ2`(x1Cqim(5p!Ze2eDc8wMo@3HY~Ug`%7!H|pW{c%~|dn>Nr~SOiQ$ zZttiPs*ZI&i=e*@WjwP1+dqo7EmU)SfA3>LN6{yCtN|CWybYX3d5<+1bkDF%u#)78emS6YiCT362N1x6SdA3TAK_V&%91W zGVi>`oHsue;T_C2R%0Gm%806P8ZfacD6r84(I_#+pi%ZV*N{dN^5wQW!w+xMT>6EO zbed~mdKD#=f*}7p4;8(016Ac+Rq~gv-m>^4J28Q{9G|eXN<~!NpsezB{Vr4|?)7xf zbAl?@yu7QnU&2;5W=tV@jrTiz|Af`(#Fdox(Z<#co7xau?Gt8(;$erWQb#Lsh+i&X zVe4l?sMC2k3R@R(87!(iLn=%Do&00N%Uujb(F9g@5#^ah$+X_&E5haFPZ$bmv7(_q zdzQLw;2C$Bl;%Z1yTCHWf}1*d_4-Ktkp?3#_g9oT!YXNHtUPjSQ89xVdPz^=yVy;Ht9|&d>9=8&FH7Z(SET{F{@x z+4y8521)!Yci*+x9V6tAFq0sU@&!$)X#w;ad5_OGL)soh-4$;Lnc0ALqp%Cy%?3l* zhxEE5q5wy;+d!H#X?rIt~K031&Ea-uzJAuE*$Uc;S3SVzP#13tZjLq9E5nk9o zGEhwlK1U4ynSzz7h={Uax?4bzsk;w)KKzdG8>nxq$11bN(%n^19C#BaDIx}aCxy3L z0XdyC-GW+!x!rnZ0}RJ)hwH}@{Z5A2H&>##nZk!7=(uk$PXQMZSW_?h4kmG(wmWD3euFaCk@67vjlqc;x!3?;?kJrNooP3`C9ZlD!Fuy+k(W zguOCIgMvG1-;X=d0k8@H?8luYCQctv-ND+-1v1w`3n95@>*PZh2JlZ#zvFYADu-Z* z)@ov`WrrRc9k^(}B#2{yrc5nFH_=Wo&ewh?6wT1z1|C)gvC@;D8KWNv>*l$d&u#|R z&e{YX9z9>18ZdV9H*B{D(tGaW<|0%nhn$u@!y=%_?PSNQ*HDmEI~kN2NtHu9l^#uO zJ9@v(=W(H7Amb5TnGAV^!U5V*9WZhw)OF{fJ+~NA3XVKFsenqSAC8kq6Df{9{i`DW z$_mABGt*#OGa+sSq;GkYbw1lZ+7z+_0x9u2Iv9G>O<`(lc4;q@5UzTCyj1UcasSxF zsZR5_8o73{x>1+JoJY%7bV2`ypLuC_Vj&Nh8&FMh9Vp>zg_VGEkwYIdTB_VUe@60fMiIqoCR=Y# z)LwM;4hxN5AN@jP+imJZuRMLY4rm0O8{k9Aq6|Mm>rFpET#nf@$8zjMLyKq?$Gpp< zbaFp4LeP^mmogod(GZaCI8Lr}SI(X-%<}HkcuJI6Q0O}z8qFnyIlTwGp)sH-_7sLd zZl#-;{^XtfxLxa~+E@(f&s{3>n=Z1AM>~GLtWI8TmI%_0%4=S8Th4wT^sz7q{ z=gu{I)=uAu{`P$qu65CSMYcVprlt(CvsjUe$%k9NrsubwN(6(>bm~BP%l_6?T}Y&h zc)`&WZ1QCAC|zE5&|HK|!ifzHnKrVwCKm@;nq>yR!;elbY5uTKWdC;}5s9_&I+Dy5 zTEpzG2*2|ic;&m)&j4v|^1abjce2442rh&w?OTxbcyKw&97K7VU&`2iC-Ap;j9MeT z93W#-UPt8c5%9mZTyI&9?*YvG1l~kTDeyH$fKP1~AoDqeb9z@m1U5lMLpI}ZoZmx{ z;+ec%@}PU(HhnZjoLS{PqTKIip{vtp6|#XjSb$ctRFjeKMzuep-8S7FQnynsQp7MGWo(R5rE?xGNV!+7C)eykp^%w!G2)Y14 z-16LmM-mWUR8n4a7-}REUv6nxfbRhW`~-~xkhP9R5Fc&Hpoo$5=NT} zTCF+Jg$^@M2=X%Pa?j;BpS}Su#a3w@Fih)JlY+EOH+XSAb}|Co$`hq}tz%3DLux#Y zZdWvxP{a;=4cXUd^fQ$gDHLebh{a$$H?bNi#x^T?n#b6x{18+)=$nmtp1}UIaJB%G zJHXV^?S>Ib1y0kbXZCk5klIP+0_1kddrkf9DG+13L5!`>dn0n#q&?g*a=e3mz;1-k zG)kYzj>V`(_vvGFT%mbR;s7pNM(IoNHr8Re={8k2vK5o;r7{0)wpexX~z-3UHhBYWH8IrT_}on%E$ITiWWZMTd>yyc+{r zmf{USc_k+1gY;J??XX#euqv%AXjhpCj&73Jl*p1%fK$tWI+Xx^xWg7;%Ah?b8X##N z@fXolaQ%|<;IeIAb)lF1T|$5{6T)-;RUSbT!wTHDB_)xDux@S79*r{wwuW5_f7z}) zqmF$xfC-<;;xb4X;`!H$ZOXNOE~u-Qsj zy^oe4Gyz~Dc~}sfL%>V|cR$qn=V?9Mh2H_9`Ly;fx6S&9!RqcOi3slIi1&A?Y9J#`!k2LQ{zg%13 zs4559sQr|9mHwk>FSd*OFDP>fB;^%qkDvs}dV@Q$X;GDtHf8*YxtJ|XY9V18DGVcn&_{gucE{%OW&;42*ksIc~4Z2ILcL@Sw zks(k&n+&uXx@Ty`Mn9|Djg;{$dW^lIui}|%TytEguX?5I_9%VM#THEBnxQxKZ$({O z$<;HDLm;}dzSxglYL4`6zKX;*mX)b6^+J@x{-{ABSTEe!1sNrfXCtno*P9Mql~#az zMW?`=z7Cp%HM!Xq2G)4iC;gGoYrOYBw!&$9p`Y3ENS;J(J$ORnfpfAV0U(h6k)01S zqXiKEwukhi{#HclBS|56Z`g*8J*pY74M>5*h?Ly?HUJ$&_L4K9R3@N_!RYTIfzS9` z<)_CyTNCM+@$C>KS(?6Ey!(g;Kzr?;i2sJ12S-*N+OTQfW!&e@U2#j*!Vox68T zs0h&ggwO04lvE8b9{;m>6}~11ocjGfRSr2puH_BMcG^qFso#g_A%SLRgB^THk0e+s zNo%>6m*+6b>cQ%m{HQL;OSM3J_o0Xp=Ai`wzvYOaSHUfb`O|=c55!lT2=R-4NUD%> z-TRkBZ6uQ3+5>Xd1Chdi=b@`ffXnP9Wh)vwr=6c)6bTEJWbSF%h&K_gR_ICs`@tw-kV@Mhx94}k!9t}idWt3O4QMMzEiBWU7(C!F(it7<$ZbHM zLH`(VIP+!5IHY7cnoyH`Y)sEFx!XKcTmUnXb=C`23P(^HO}r_9#{(1c8yp@OpmFim zBuJ;J#U)TP-~Tvh>tKmYqBx2XXp1=cTYHb?JP22inWUjunG5KD(FFNhm~It}4sAiI8(19Vyek=#09(qnK>70yo8 zbp#RyfSJI6R)iTNFd(Uk1A{J3!a^cHK$$2UiJgPtXGPgNNRMu(Sh5hS?(iSaZehr8=walgkSnR z9Ahgu_#vr!UwgQo%+PX2Lh%3*O$;wB3XU-qm>#t<1Q#MYW6UPx_J^?mJ;#|XRMSAa za-yj#DP>?{3)Cq#z80DQY(ubC5Ve~J=YG099k7)&`4A2fj#c+IG>Aj|rXD2oTl3(+ zt*@Gi(01k|oU`9FVt)*DeKYu3%7$3pt#yv`U;^d&w&6a>(o_|0p2Q z-|AwG68z4U?_Ynr>8j`FqnVSt(48|Iwz0Q11^+fQX{xK9<7*2^51d7}^^UeLkcosm z3Q~b|z=5F|I5>IV>B0zWm@tsVn$uYI@V>J1o*nX=MUsWpxTkzH+~ey{xqbG{sQOB z+46>@MTB<$AyE))22->(E#M41ng%y+iaO<0_e!?+agcy3orhWEbmZ2R8Z}*6ta_ODt)e)&}wnZzJ%UH)@E9p zCcfLy4C#l7fAxfE9O0N3I7~ew6qThpY#2HUS&Jl6`%6e!JuW7Q%a}F~jEfHFG?t(C z8FC=meevKN@06r$g<9#}__9L(Q-k%|X%4MrHh>DoE!slQf%TF!)S(gtvC{hMjOe9R z2r6g+Dj?ZjWe;ojhw5h|s1QAm3R7_F6p?rfn(iY^pc@g*{T`7HLKE<|NevBocpHLP zb^GUVVYcqC@;rhIK4PnEUZ0>J7oRct_Mur6|5iu^7WlEqz|K~C6Q(A%D_jZp#FEoe zoc^2zNtvCZ8t##rFi>WiWLm`V*IBu?G8kL zbA<3RqwNOdT7t$r@1XphLDYp{a|^E4 z7h@MUpv^GT_|5WfB3H8hmMgRq8(tnwI;^TCT9LeB;w~|{>S|<1fP+> z|K-41OL`1K^=IJtX1bi$L8-~$J?`S|0Un-D!f=x9ADZRxON8mZ&Pd%caF&S*$RV{G z7{0Vvo{se>FMw1fBvQz7oU9#RB9nW{AhD5F1X)o? z748z)*JYbL9U!wEww{;_$#lHNS69Idx#q2*#HWVZ`u(##vR;7#_^Ox~!zZ6EARm7B z$df=!C);X&<73_kU>>jY)|?S9eESLa;4J- z0J(sOMkJ0u{0JHvsWaF)Gfmd$!6&88!8OUR$5yF6aXiX>(ICI91UC{u`UXST7F(QN z`5M{{)^=~p{DWT}(KR+(BKgz8M$kuHZ#i`KLONFR{puc;kVVP^`r6+Ex&Q+PNNKd{ zw?Fn%(zj0AzYBM11)LgZ#>r2Q>+pIs4v-qQsUR)^>1ngvZVE{e31YU6fU`UYd*(n% z)g!rfE3yi+Cay`Uy8vY1&ieGG!d^?!P@X633y?3rN*l?pclY}RX~CJbXvJzvunig+ zeLw~fvsBkw7*G@+*9dSRai?BSKY#;lBx2%aXy|F|2I;{_1anjais%CneZ6ik-M#A( z7#6QUgLySUER{sy*iQVaCv-Ish@%$;NzT#woa1dpj| z4vzQ5S}quJNEP?IcYDQa=+)}(2XoQ?9q_Q-z_YXz)L;0af|2v^6)oudcEH*3vWrpm+R3eTsnf5095;>kdW!?!it7NUnd zmn9Iv$nM2TP{xGR7sW%h%HP@FM3^xF9GTD~#n=!xK8^7W=c{QtcNz5#)IDP;bVCH8INh{cd+ zC;F^@=vwQV!*jU+`kSE(tT%-I?@E-bDC5opZar5m-p=fIQBw^Hft1Vo$$B(v%Bg&2 z6d$;7yd^mblHxzQwVqKDrXuNt`bn^L{IXL-Tr_ILK{f{Dfc!;=MTnzO4~T=8oj<3k zLV7W>>r=4nfA4{tb^ywSV+$H3zI{hP>6d>8Cc|MUQTWW3Fs&%3JY)?C+9s~$!9;koPYE8KT8mQ$C0z4CBnx_fw~hX6_-Gv5)}%_MS8|q6?*|Z#!nt>Li%L!NymC#ux z^2_Z^*bT&32(11$HyR|)|MkFrR{<95Gt`rC7$P)4(r+SP>I1*t_B7pp0=lzKzNtR| zEhk1#RXTvs8&qc982`-pgiT@nd5{xb{(by*KVu}8V5FPb@~lPzgu};O>UeKp!ED`?82LuHr407{NQl@kP(QN(@1whR2*2Fu ze6cG#JRTY@aPGhHOj_&xChj>NHdgPW-?3h>)0buN!siv<{Qz>!S$rUrdRrJY3vgrJBDgiO0^`gT zfl@IL?8?EOo=Tfg-_1snUeBnW{U9G~D@^S<5^>Ne6L|3n)4JzSCjd!|M;>gQEqaG^ zKYm4t(^}vncYSWp)~Be!U%VRT?MngiYj;C1iPva-E&Ro+r@wO*q+r*&*?JUyKl1mA zmmxD{{U5Z4B=N^kWl^sSX~z2xSPPNc+>%S>9Y%%;E;{1SQC+A~>8L~{&lQpr_4(PE z?%>0~LfWi3<_*)_K2VKPb#johUS&#*-`ms&VD4>A)xo=hZPTFZNRo#prC`;)bt{2R z%e+cv*(_KLuM_?ah|eX?aA#|v^=)9eS!wSfI~`(+S~DD|n3GzI7r^HOcs8aFz}1Dc z8=6KM#q!!^@H^uh_8tKq>G^Tkgk=G&wde?)kjX8&D2@yeJ^X|C2{LUaqcnX?5`=#|?<3)1D z(zg7~2e9-gRD05kyrcn0$ZPX<(Jvc}jOmnR zi!*z3_JOdkRPpNCjh5lG5|(Pz`u$pfYQJFW$h}aWGc{0Ws+H8;SBG^h4`vfx{@_eN zM;D|Qa5}PhjZgN!E(3oUVkVyl1JffAedjI`fj8+lXlPlAcE)4#EybNs5!rBBMJq%^4bG!pb`Y-)fGU7roxAwM*z9m%js zb_N;ni4kI4&IsNEaY0UDmuZTr1{S)sAR`Wt3dd2weUq*Khq(6+YckvVhG{Am#Mn>~ zQ5Z$377(O62#g@0B1Ms+h$sjM2%!fYl_&zENRg_JQUz3m2nj_+k*?CDB}kPTdg%Gq zz7w1|&-XmvbI!Tm^L~Gf*BF!g-h1t})?W3u{uF~*1+cnGXzlC1=!LBaRy|_TybfD+ zCDbyZDHqsZpvi`wt%B7SG|$1R|EV9ig?aaJP?(jl z3*h0sB6=0nP|`-t^gv$%KyrK>zl7k-Y%+s)6ZA&TFiLRRstO-|8^q8epwkaZPt74D zU10bTWEx@sq=)G&8x$2OcD1HZ9cD%LYQpD@DUe~Hyxz6f2&Jjx`dV{jxC}vLV&YQ& z$sY_|281*3>)Sra9x8ks;ZGLl(mye07Lv)~vA&^J1kzkuDAy!#cGJk$b%~{;3;f!1 znM|RVHsy1(-m`Q~7;G_Ja#`s*S6hw?tF(HCW5;0desGb^K`l+(WOY*_JT@Ttv|qCz zM&$`0IcmYg@C85z&`J3i$<3HRa@2nLzy1Kv?`_D@!aaH^@zXqC_KlX8yb55n9m?Tq z`*PN3B}C8<^Bi;tnX04Ro=VEBDEw|nIMA*g5<`g1f$?mP5=p{H*Jbdp`AXdl>Q3DX zMJcdZEZ?x=3tvls7uYTaYBH(j#YQX{)zx~rS%MpPisu;41j5-=Oqw zgjg$phlJw|X(>wt4LFCd3r#taW?!z1wns1(fWtByckO&}=?9ZL4FEC=4ZSYrZY%vG zyB+c(ZB?=_^A93GoVIpd5oj))PT-oGG0}!L%J-h)9NQ2sR1O?}zpp=xG%rAJB!IRi z)L#@~l~#~>87X#3Wy_2<2Ls=5kkjMhl}V7?lCEVd^qHow85f6R=| z^zl_G#Oq~t8y`avODOztA#9F;7RVs5Yl4z<133aJL7|Lh;I&0L`HF(4cKMBYGp&oC ztKDe6!cjGlyIetj8>#V>l0ElTzlFmxp;Pk=eIIU91Uuxlb}IOqms5?QKh5)E@$Hgv z+3$MFTHM2<11b;I*MW50j`v3Nw1SEwyz!m}sJn(Dzvi6e5rijVWeDf*3sXg2!5v{! z>MadV#1ge>RAb#oQ1(H3Y8SN#j6}%%^If ztQn_yLR7V@^#eXs zY56e()%+YPWU)r*YFgp(Zl~& zQ%;YOrra=f8i?}8cBqjfe;(sq1vZE|#eHr$Wv4}1(GXVKx61=hJ2JR zo;0!Nh(DDpD4jDD*n2|z$NLFMDRbF6#HlIQ4hmjwRT`|I%hQ*Ta zGIprLtc4(Yz?{_i66Tp=ZkpMZyR2=z%*zcz+W>}O#E&U+S%Y^bkeN&&zll>?z9tIF zLBsL3G^q^O5HS2u`|Ph&^OmYO9^MM9%A`?{`-T*77e(#Hz1R`~O8Q zRhoH=!GHNd#8HbBPLKOGmR4V~=JulcW2oT0m)Sa;J@7H@bOhxj_f<#7j02x}l!IQ` z^ByyUl~?vL6RLw0n4&?!F9!+(WjSPw4pW#?Nr0}Ic!Ae#5n4tNLvhyir-Hy<;FI9HD&7gn-MhMr1jb8Wr& z4x&tI_;s+gGBR}u-x664d7jwf!K{Uj7jo6<`lUjkP^8`CZtiM3O4%uSzvvy8s=8^^ zP>NvTXg0BMj9+9M!Dqo)79cdcS3@C9a=Ax;4515JZ16htRrWg($h%Tu;{iI{wbQxa z)l`DA#T}}d^=Tl3cL?1!jt36Iy`4Z_jv_4!0a28Ga~Q~E2>W~Z2=3w6nfAd9M8BbBaIzn&`3kg=Qns zVTuf2(b%2bc&t;Bh%fB#y#*^&^rq=7zlLIlCQxXC8TPj5F34a&U+o|;Vx<%qHVEnn zy1lOQPr;h6a|Gmo9_+pkF;orcL1vK+lAI`l8p(bN5{LXxtwnm&t z{LB&CaN4%x!t0|HO(0|o5Hc#}%AbPLQe59)DvBs0U_Jv_X!wU)e7I?*iLEHzOANRD#U3EqbOBHrZ3T4sdzI~U zFB3R^sFG{Ns0j<8F~ntiU#BW zdv!lyKmRyT(|~?MPwq&?`OYzO`YtY>gUJ4(16EA#V;nCWzC2hd8F*;ubwHHg`IGYK zm;v$uy2Tu%LC<5m2Qlt9fAPqFY1@+TTE5Lsm-UwB?r7pne*-p^C(e8!v( zUy&*;u21Ph-f~H}(4@O_zMDhV9)KSf?O!U%k;@n4YH)Wsc@O|4icTSAhEMgTnnmjOcdj5W2?vDX9!x_rA@oE(#B z)jig_r@##AOwR-P&pQfIce0lOywcUWXUN-r*XJZ)=8zot4`BI@L2(&)g>UHT53#hL zQqy10giEQtz{$CCi@#a%*74&GKx_^}2OxIlf!g)^evpWz>n>>mvD5c{6b;p)jF=!* zHaP<1cI?uDBDLglyDV8Cw-J@rqDvL(Czs@5mqC?d_SbOsYoIbx{=6%JzYeZdzsy=t zyoTN;r)2_y5kt7&WG_@aZEH+Fd(`SKaJ?Qi_|wuXN}ps`>*@8-x=I24>zxe@ zimG~$;*mvn`McSoEi5)j0yaP(d#Fz=O!)!&8F9YKd_`Gix%V;br6h@_k7{ee@FkP0UvA?XL>{y!H4odP#Tg7d?)^w=7_; z@g(3|f>r>nqBN;O?U<3}U=Yn){%l$Rvo)FXjks%Ex>J?Z(4f_?JYG1MX60SM=JTJc zjN<9r->6J`K&EN}Lzawhd%2Oz0aWzhZT315>Zh#>29?E;^c5t zFtF$0OeS|$uk*SWXV6dwWikaXx1*w}ah4rLe ziv!ey`0RVUtDrF0fusY;{dg_Wy}JVPR_y{p4k|*ggo-^d#dTPOV>ru#gHCI=&9I2f zCbxRnSUs>X4~S)}IBdadOE8Re>)Q`ou*mLz-qkw!95{p*2tYQvk8eg52>X`T+U)ft z<=ZttjDPU7z~1{y+qmw0o?V|o-qB8?=J%G&oNMwsWIXeD#)-OaB(LE$^O)$`?Z*?b zt(2D*;+$vW{ZRyKbzmMcQ)4Y*Wn8#L}H-%cCQd9_19+o%=rXupP5Ws zK|}80EBYBCdv^hqXm$v)&U;J1Nu=o{MCmyQg%=ssv+2nQwJr&_8`ad1_Os98Ao|gr zfBQ!=y_dlc{0ve*`*9VeF_@O9#KSmJf9#jzN#QR!lT@7P~QWyd4S(JaC` zNg2d}67z$zB2<@|E7o=#@s*`)=wgn5U7&{681$B_b~CCBQ<+t28_ep7`D2 z`wjkq_rEcqGd3fkkqzRV1uje0q2Lj5m}g~_4bBY~IfD^y_&jeY2X`DykA*`QT??k$ zlk;Z~>>%%YWbV9MS^Iq)_3+_AMJV^d|oiDRTI$NowDr~TMQ@F#( zJmbG^+e6=YlDCGvKSkJ|QkRt1RZr57(I`xY;ZTr$v$m5X@E(4dsjMMDiE#uV55IZc zUxz=w)12z+qTFP4^wl7n-OHnF%@(>%`aAo%+&TsK70{Je7DYr7cqwyWwH%9HwYq4ISJ`0>O zo2aq*1XW1qSp^%Qo+WUCllf47(r-J-Udt8mNUrExQ*@|8)<)^<0bt*b0|AEOp##Ir zTLKV|i-;gwp~+DZ7?a;z2`?Sya#K(d-hPb@gbmtr6DaDaljEv5PZHjRpAB&z0igtG z&ip^L%g8s^zmsL}N+0A|-!o|2S*lc?@-Ft^wAaYaHp4S6 zf~48HZs{v_heYBr^0Y z_106%fWCW0fV`sOiP!)L_3xmqcT?1b^sATg3bk)xk3rlGIajH~_4x)zsDp7W+-wov z2`|-Em+8DW>bT?PUOx7&P;|?X`ea!oK1e#Wlr1(=phKh%ufDp;6YsBizy^I4*o*rG z!asw>VhYppYnMvNGTyGb;=61PnFJ1*)C=7Igrf97=OF}8(P^@=F}sPVAGqiC(%w0JQY?C4E=D zRMmg1Y52@y1@(O(Hv69a@D&+#q<3!njdg&MV0)W$dF=>&fM2=i#$~qJjss;7H@Z>f z4aMx5=P~w-#7ii%yWGY9{USSL>5iJSW#P;E!iUPYb8P z9XRdHo(lQ`@>O`x$#TC}6!O3d5B8La&!}oW(B)zEANca;L8lk*GdPMtuho}jJ@LQQ z?KeSN`F7WTsg)UP{o_0L0z(&i+7(wRP0Agp?mg3XfFLw-Tf)}+&fg7^2M{TXFbONT z_zQh<=injMHjDNHZEgBw7>%PtF7qnvQ7S*6@^r8yw>aq&d8hG*SoSfXz+jGM;DLA; zEq>lU&jDgXiGl9kEQE)XBbax)=0#=m%>-^b=Isu28Lg(mbDXaHz@dcWZRc)oA z>wWMvo9Hn>^qA-lA&A>JIj|>=VvrBsH=9o{_LkrinwYs58HM zQSTz}qIN6YbacqW-rfd%?+x6C0Ro@L5eHkT!|OI3e;J`*B)nY`NBfh_)>`md(Sp(z zNxFVw?M5ApGFm|Skc_8sk^ri9qwW!Vf&B1I{!gMFpqa0WoMFvuiAsj0e0f)$d&Lv4 zzc&&I80g9^{4~RgXYWVfI|~9;=N~3(~Sq zobsRKcw~SY}n1M~efOXvisU$k>moF!W?a980 z8CC&bK&tc1X#l{TZst*bzW z6>4Bv+E(yXB@jE6DUP?>qEJLLYj^G~?2|RS!JCzODc)6ilq&UqNRYS%u=ry%rfOE9 zXf?NZ{o15H?i)MXy=B?!{|)qevHZiBuGZ2AO}}C+UGxL4pD*FB!Dx_wggTEJj)fGA(vy>QJNSn{2H%;3Btla7{my>An_Hj zlBxD9A_dSW;2bdE`{!n~EQIpGP{z(${gD)KjZ~>~s3<*zTwu(yp|CM&xp{->dQ^w% zufMS#fB^^>QZ;;|DN40v59MJmS~75~<2!ROy}w(ltyD~Oo25y`wPR0@2lULHdc5v{ z6zeVi>Hte+A5;OpTGjs{i7MI(0^3vMf+jAxG@z5D)+-1~x%8=Zo7e2dx^JLT~)}0ji=gUn%(WSym6>irzn=0x8E|d73VB z6pVBenUl6STAmU@NU~VCPvo|M9{%!QBQ9_G`4pZlyjR5O1s-%FobK<3TUmM+z4Xx< zV57gB5Ll}i=v^r3W+^Oq!fuEV{LP*P=|o|Y^L_w#F1V>fe;CL;EPf@`{L*DhpXZovyN$0rS zXz#K`DGB(mqm_<><8AiqhKirFAOBy2IUfMEBaSa|1#W>!WPC-!xsvTI@G2(vMERkS zD59ak-EWS~Gxp|emj|&G3OU~pk7Cbj0=7ae@qeEOx*Ig4)Z-Q1KgIqtKxj6HKX+ys z3P5Kapto-F^+Ry6`KxCwZ42BMqCkH~43fTW$|x=?Z*-pR8>d+l_M8urT49>E=Py-~ z47M#h1cKD(UkAm0*C+DiPx`RnVN4pDesV~sxi?bAYPd`F96sd^I9tm#&L8R~p310f zZ@+6Ovf9&VK0D(tHS@2K4^#52obRAc{hObhfV`=lr`~Qw!uIGi_i%W_k=U>;{!Rti zeuoHSJztj>iD^Qe$bbC3+R{M^c!%P7{^yj~bYsofxdfku zvpre#GuzRIUu}YlYNfl14`E&d>ly4MDwIgE>G>~xBY!!(*QZ7bXPY2A(p#93Fi^hw zu0lsAv0>{eLb}9HHsJk>>;Ly-W3xjZ^pzo;oyC>@P54%UUM#< zRogn!rXe9?+boAmieKYA_XU@hBYCMe@#p9>b*lrAElmF@$1JF|y6l6CkA{MrZ9kW~ z3Bl}j_niSK5Z1|nslX3Au@VjVu*ILAD<8MueYn^r;jYJMY4~XdRTPsSf|TFSr*XXp z84o-mmi1Ewn;rviyQ0$kC%gPB-*{w#UhMQH#g1cPz-=PTcQ6e=zz?+-&G%)xK?Mf; zp#guqd^-J6&8LFjm$RYT&rQtmPGr0u^i4W=YKsr7O!Iid0pMo z7gHNhD3p!n7{53gFfHg`=%-!W*rV+;n(Fm+e)2XFp7*O$3hOugJhZ>*?*E-f|MxRk zvZ8{<;Zv85>p8o|xkd_Zo$)qe4dm@OXX`Ede~!-Po9<8Nw*Wn z!Y3QB$%Ef81Ax4BsYDW>iiC8Cu0*QI$u)coO(*kXC(gz8S3VW3b=fx@`(KATSuU#U3uy=7!)u;usKw>FeKD;KK9p0 z$1{Jib3D`zHGw*1v+6%<7_xbvZEqN_kILtqQljZ4F@c|^I&cQ6x%>Mw$VXy5b&5}D zx3Qzt@RGf&APlp~Z9jBtu(|XDX!H*)EkDi4f9V?$yY_l>4+qO@$NKse*Ck{o45V3Z zcJ{L4@cW?qpHz%*xw7OrEd6ZUxP}|($(B_wo#4hRCiV>eM=#oqQR$phfVK>czcX$p zivLtQ>v^a--Y4Pr-Vh-tRXTU~j%MZ$ue2cCz+lEuIOo5o@`SC$+H&DE(Girdb* zdk*@)q^aU;W4Ahg+wq^Y#;*o6Zt>5YKVN((g>z~~ra`9X^Y5bi27E=!2F(7Gwu}HG z@t?w&vFOWy*QRT0#=4&@)>o?i531vLOZo);g}q?P>`GDTykE|@uKTa1j8AVOJC_84 zx*Z}=IZ$285}|)nAwT4ScRJ-twGXU>{@FagqW>%R9rv1KCys*AXrk*$?%_&O{r_~X z5fa0n{)94kwe$UTIQw{VORnTtFFQQI+W2P}v2E5^Ms6M4C%SldL;$u`8M(ZL5U;mr z*(#N(#K| z*hvM1zz50xxkk$)EuJRD@njRr_E&_N?B)zGG-Fo>Qk3G(n6cwNdr|x<6(*ge`#NQ_ z&j{wdK&hA_xmAbd1TJ=DG4kcui)Vv854cP0RDZN2ApE~FgqmZ6`On+(OjPuaMU~B? zxWSaL_M4PtralMta$sM>HkrHM>_efE{utle*&_ole3NQS``Si_PEMR*diW!2tgXc(Xfr!`y!{10+(C~+-_mgylY48|3m5KT zDUxO^WdApqG-USMEYpg;x5eMm_4wcYIn#`yf3VW4p^J+?K#>bpb(gF3xn|LyMnG1hjwGduA1rEf z1azTKhFtKE;7NPc5iuJGX#n|9FEbbkSeLKEL@ZvL{g*|mFtlRB3Vw9GGSE_On>wMt zXrLk>JSZ^C%}QUaOhKj9P_n)_tQ|R$P{-Ik?*OjkHIWz7OWVQ=jLyGLxdJ0xOlTWN zCObs@`jQkMCPQF~Z2_HG|K@vQD(6&IL#5g!M_xGh)Xg3}*M7a~$mQ3|iJMJIY%_O< zE1_%7TDoJkCw_BZ{Lw{`fD}(K)Fd_9$1i$Err?Oe*;~^*cP*YhKx{!vlYOQqD<%)F z&t|kr@?GDahma;XV>Jf#!aixmKQH-JTi$mrE-wrR19EFQ0NT7CFKafs(d?8MhniDT z>K+e$G){iRfVb?q98LESHB`*f*N+55W}um4M6$W`HWZdF5}`5~y*XW1DDBMWeb zp>va+xZs(=Dk%#Xu{}RO`P+B)t_Y}<=cpb_U#rH*!X+h~iktiS1}IHbS6x29Ev#QC zeaB-waIng4qK`OO|MVkm@TA67MInz+0j+_s=zy`zmi4hQH+4Nr$5+mPv%gyWxh3&^N0PKiY0+rBya(MZb0#1*3r*Mz{ z6S$;jOWS<-binkk1o z>LOaJ&$${vOck|Su@;9_wd>ZPQiUF?Nn{`{%SGfbvoh1K*I@Wg$FU``$(4 z>cZEkodF?JsUfm= z_3TehL~6v*n+#*9*yoR(BZ*>unO!Zz5ip5PmXzOm0S4;s+V!G$X`5$(Q9H}1akKje zrX#g%be>!SEl=i?%3}ld@;vlE^p{g@damss9;%D18c6UP%&|YBdf4MjB!!$DJG;0H z8;Ii@`F6IxVx%-K3gh2e|JX9D0pXCY)*SW^At46DnLPu77n!d23XAC~ zx9r_zxs+pZZ}B`CFiUCgp1ZhE%1 z+y3E&*;8Umt7q=xZNpuJ7FojsBDIiorTE%^Tzu?l>^7;-Z&zFthBeqH#M%1TMRk^i z-6qeyKe)lKzNuSvu&7uxFH)tjv)yS<(iDDs%&cvsL{xPwm&oj}l*2>Vm}p2{3l4Qm zs0|XdE4zp9m5WrF3px|*`pkQ?jqK)p-^(1Ct4s)b!%)J}-iWr>H;WcT>#y-^^Df7m z=PRBkkK4#jUu%nVzw7ZqS7bH8yl&H3222aMF^8&o4uT3Cgb2Yc$Y6m;X*8yH!vvwD zu*IWwdj+_7jN$I=GN-SBcT2)oq@Q$e2w*;vNb^q6!v!sHVWG zw^Q#^ly0=zLGs`Mlz>DS zE#6oI;atGwS)cC!fwgNgFG^Ww<52Q+op`8jQs%Q7@qBpYUK>bdAIqJo*SAuD=1HE( zSKOjizwu>f9=g;qG2eC%Zu(`ehF51)sCo;rbsE&4YkW)Z29&zXK>f=b_6fu3U|Nm3892ri65i&gs(b;I z60=WzhvcEu!0If7kKgoNmgD(|34(QNb3Fj1F}MWfIAmth*P31VGJin@r7m`&qO{Jw zC=K0$BmX5py%z)I*Q%b!z+FE#G1+N!I`?b0mK)$H2><_YbG__8{ZJJ)+iD2M_V4451Mvr`fb*XLeQkaUkh z_p3P_l|Lall@{+&g@UHPU$N5gh_e%~w_xDVU9B&N9QvWN*E;~ZMVe=fZx1C6Er-4D z*0nMe-ac1rph@w_B$~TZ=gubhyt0cXk8~$xmL{bpj7D60H#1_B{^bh9!*l+!6l3*= zd@prnBNJ$_nNhxqlDdGEI@?$+HFX&-Inw(W_)}rf= zri=ljm8g!vyzq}uPJs1DTS;P!7Lk8N2xy{h^(TwbDz&v@BlK^2za5J_;AsGS(cTitXKkPQ#S2+BPh@T&-X@KgOlvmxqS}AieS_GY|mf#|N_lwB)W{fwv zMG_Af+*ar#cJ~uHzx0`rw|VT9<4LLsaMc)gNZC9!Da@p5X$(JJmQ-`6rn(snfrLzo znNueU5nh2#yKEUCHuS`%i~mB8C@`!H<-iL4PfA$B@Vn;_FN4!u3g4B51CRNU3l|mO z1;N!2>e~%GdKZeFvAUZgQ_K{Q^lnrH#tkXTf`m3Q1t4wX^=t8nw)XQTmqTHUQ}Cn* zzd$+c{nT^PXaQ}vVp5m3Ra=SQ1f`IxMb=r*iwGgd~fAx zXW~}JGROW*Ip;xbFbhpBh`N|0WL#iKjWemA0EY1Zhb>!>wHL5bb!pGgftA96mDcT( z=iEdtT3hKJ8+;H%v5NQVwLTD1f>U)zZ=Wzp=a5JC%%qDxtgQ{ zLZeu>U+(7Cg{H1!Ery`tk4Ho8hfW%C8Y!ltk_9Z~OQWPwyT8f9PS%OWlMLsx^)f&4 zy=AB!ht(4bCj@bp3wCwueQ5I&e^!rukOj?_glV=z5Q?V4+MuBx3<)XU$Y^0Cz>owp zDQQ8C+n8QMQB|x8P6dP!m41P3^RikQEW;7dD;??S;m|3AJ`J&vF$0^j9Oq%oJ*-R< zA89g4GW-rE&(*@2+l2mjA{{(rlDTNTGHC(zjjCG_QE}4wx{8O;I6HdO3c4$Z{5}fp zFH4Lq7|MLv4l7lsFDP!FdYn2UFV9T_mvqBaRqc8oZ?|8ss_yf6-{3dSNT8k|ac*9!TCqXiSm*Th?n;*E zq^Zr15zEy!yqr0NBhxoJ7Zu=8u2NIxE(E*gv!EHBBVY&b6vsJUqy5@2jpUP9K%ARj zu??URR@59fQ#+F-vCUJq{c)gS2mSZD5qaJJrzN6>M?09&?-$ebY!*CdyxjCqRdo*-8X{qyk#o zOOAA&O9QL}Q2aXvOZ)F`Mh?MM4-AftOn4{qMX>qD?lUCh44@GV%d_Q_dB zYd2v5gVk>IXsEmC;+=cSIW?&yTBWbIBjL>}KbNuC75MjhM%=@;nav(8J~Q;mX3c@9 zE!SNQhb>YzdnBlcP978E?xEqo75GV`th4$aRHgfDZ8wN(B9H3KODrgZC*)U~h2DXD zqIg31LK)v%gN5C`r4@ZdsT@;Zcc^&&=`;&TP-1G)g99UNPeVL*Z`hozfC zU9vZ1XEflzTDnpmPsP?=8J$q-EBPO+_X+Da$Ve!Mj)`}#I#oc~D*l7rUtDJ56yx#@ zpeVKyt{qu;6|oN(aGz1l8PK`lij!BlRRgNQMmUs{V8Av?0ZIbEF2Ko)EUjL>mhnQ6(kbl#6V14=7}Y``#0L^XfeqxE`^z?TF!kq{ZZ zgJmWL9^dKu3&J~re%7$L=KpdWQK^Db4u9Ep^rZH)O6Y(u*Iza_nk zTkHHOt?zrr{CT^BNBN2x2)PSQo|&fkigD_cU2+SFH34`Xz0%wr9tpLpC_SNshBeBW z$^8J?FAi5UON1o?r1iP_?J~@Rm8wa};Po24g({6zXsDXklFEc44{Q^7%4~BPlyMjU z164PL0eTty9}I42-j@M^Pz*pr>7Qi5HrNESzf~=I`qUfI)#(tMREjGwW6b<0!JHu4 zyqn2E=9oiHhCZiX>K=vpc){yqrEZ?_-a{5~+fa28L^Ghz22I8W3)(6^tjN9fnc_Sn z`Mqe)xAR}bB0Oozv?sgh5vMh>z?z#V;=Z2eK7-1H({3+6wXC7ktTs9@T*WfP4P2Ym*>Y%RE8~_|b30Xe5VEMFs=H=l<1@_RXM;C`aRfH6PPYnm00OXO6 zIyNfR4uDOKx<%^rB zndvsi(aC$;3z;^^kI1Bt-toC^uF5&(sbr-07HZtiXF^b*z&jBlx2e0%A^DNr0Br|` zhZ*Z&9(a+ZFF5MiI8uwT+RWc-L7H}$kF?Tv{=O2bflq#^0LWz#U^E3@L+1<2w0d2<^L9sx3>2{2}muXpq&h~j@D z|1R-x`MRhZ=-|r8VIFB_zXVwD#M^PGb{eVONdxSCib>)Ab|@pm?9$oawM85Y0UOvd zXzHU7jzrxyQdjFSs%}?gI%&@e2NE{rnA`E{Lp)*R9T5W5R~N!#uDfQvKykWm*zG&Y z`3$%k?E{e7+#TmL%TBf$lu!S7y-rkL@!)&YeEzLt^u@nlH1F!ICK{x}JG>SV(=R)hmhfE1x`Wq=*O zXokzO*hJUcB$_|q9Fke&xddT7zW3#RT})1gB%xHTo}X43-&^xI9n!!=$l$c63_(UNmL6@_qxr}H4772q zr=ddRD%1cMOh45paoBmYqwvm<9Wchv7(&+ z%FK-obpj=zeQP-37 z8sG0Tb`LN*T-?0D{6^>w>W_rb=386zq5a)6RLXw6C;s$kyaZNVib5?c4k>f*hF0*7 zOAn?&7N;v)VAcc)X-XI*J-f}U{>SJL7%&Xb==VEXmTixkY&L4e=)z^Aj^IX=#+^Z40o;=>_W9Jp{~nE2kZ;ra5su02~ExdSLp z3kg|iyAtzHj^&`y2B7C7U-y88n^yEJfv6xK=i|*F_0zHFc-*P3xC{&aXEOe|3*{*z zi~~5!V}(6V3f==RlM-?OD@$zNrMUU4KvgHR<)egJ$Mdn8J)a^QLeV^$3G&msV1DfH z+xy}4C$i!5Jh^qd0kkW9e>R0YsyZ?4*hufttJJ3oSyX=9Z|#Yf41c|vs{=e_0NZfS zq9_HOJl*h#Y*S~glXVZDbjktHk)VD7?r)oJGlT5J$FniTb$t`qWY*V7^CvnjpMqhWz)aR`dTPiaaZg9A2 zX-Off{ERrXuG->gTSjf?wb4xNxe5sp{bPDZrezPy01ymVUi>!5-8Bx--WIGt{~c$q zwgnYR(aSdX)UG@E@n|q zc4KyhKw~(Ftld0Kls@S+bX%>IoE68>Qj&62aN|zqhe(4v-feIDZnUxEiB*LzhQse^ zbkbe(xD^d_@sG^cbKDbC2h!XMKtbWR(iTeVI!s=_)8v`szsN%1%iwV|(95w+3Ug9( zwwYg-SEbMZ>AxqsqK)Q7)ejH=8j{q>=mqf8!C&j5SdlSf7leKG8^F8TpEfBcm)~cc#R>@#&K~4l zE~u3O7~ljUl+s+7D`pIm6^Dh0K*GqM{2t&1PV_Ukp#cvD53mYs)H2=Gs_FiWLMEPJ zG9XhD=JP|_{mlsUHpR-dfc&aK^Mh-vU;QjctW@|ox zkY)=+K!6SL0>EiL0MpzzHv}%DS&jb-!A{0W+$enO z%OF{{+r+MDSP=iH)_#ESXedv&81lOV6zk%By|Qmf`G?NW4t{j9x>=4JR*RAjG!+|;GK{Ku9^Fc&W3zN#rbd`65ta5 zcjB{~rK6#D447v?#}kjsUZCHDVJ?g#EZ$<}^e&kEowpXy&_oXY?=d{vyd~S;UhC6T zg%n)gbEl;RDsih~W3G=e3ro`;7=Dj_eomaBI<~A2pt$6=)1adZ9d5n`$0HPMUcqh%}80OVhL>O_LJ~+NA4^ zcPdtwdmJ;^rC$kx=+s8IhEm8|@dm!)^o$k`N?qzTJ3GYci;8r9He z65Etcie6RStdPKipN*^QeLF_cQQqJfKW*^62|--uUlSR3NcmVeW{|dlx!?^EHu?6i z21m|byL^ONy{s_R?%GVRfWhGpTV~e}^B2$5PCl1jQUG!Ho*O-S9~Wx@oPGUcu+jFjD|V;2BX=2Xv6bg}L>R(#tUZmdAdqhK{X2I;ei06XB! z$2zE%sZ|++rkafTy%0*kPlZ2#ATTrj+!S1T>EQR-ng_lH_yg!HZ3qV&<2xNqqk*<^ zrfLMfwC5brI1w&4%R zQ70fiD;#T0T|O1vj|>8$ws1OOW{v*g49gEw8K0P4JI z0nsK|zDb9NOgXtDrNh)%gdXzjevJjx4u#Bs84PB82;&v}N-@M{XEt9ExP@^mB2hWb zXVZwS_Y59^uCw$wS{(Q_Gq1)!&`Z3pzK2 zFO-&?tohL(vhWd5WG2+&9S#;w3=#Xk-hP`q&3I}V@`>-6Mfti<1OdMv?LCGtS!FdHq~sDd4G`RuPX*{kamVN63644a4VH3P-~k8s)Y!Ajr*jKSv#aaEk}P*$T5Psm1#f5>!FkI&u+}B z4e7|2gujGXn`t_5Urk7QH*s6(gW>*}@xi{+(}FHzq$fV&^Ji#NJFed0p{nY%Nc$!Az@XNs?`tMx9(jroQH!j@{LAf_sHvYIo9v-h1=P);Ar{f&XsG zUb%jQDj+UuM#AhLn&=RPe8xs~hc6XsJ!lp(ccyLvT252uU8A%)w=Sm;MO%mB55k!X z_de@n&M|r(rsPg0i_VytEVPGb6ZSVpzUVxiu0yCU?EOT4z5da6~cPZnxAOm2`Z zL@1GO?&6@CJK4J%vY|uIPi9E4LT#0Zo_=7(70SJ7Bq!Y^cY!TzwGk!v2Jb!w*IFaJ zC9wz5tRD|0H-XdC2z=maQcA@cYMjoq5|Tco_~c*?AQ*Vx=$GM-3BlO`$n}|cQ2GJe z&B%{ckfFZn# zW*#3I?TJs`5Q zzsw41V*xN0f~0E$)SR_;&EQ9_d6EVUzvm@ScYk~UQ~MlyPGhiwz3hN1LXdB5l(xTs zOus?~97+C40Rr6pP`o}1N_y6L@_{=%%3VcwlOCwruGY2G+d-9wvA&Rb_%Xl)oMbt0 z&+h($SlMw8{o^zYrK)o34)I%Je1&6Z^wb-=pN!n{XSb?^PKJH1PdS%NZ%|IUKsgkr zh;KTIlZoo6%`Ip+Fxk^3TI)JS7gIBmOU`e9*8BQhEzkI9`KlU5kJhIHCtb}QZ?v>X(8g}c zXj1y|3BH=D6E2Z)0x{*T2{HPlg%9Bg(}+{Qzov~viWD=~J9qYr49&Pt z5M;h`_zb6s)IZI~Plxw19KNOu%xccfWNJZlVP8skVZ=ZJ%uJjSns8O==BpF1QdaZ5 zr z;)!jM_&}q~$5qBuA-k>$?-QV(PUOC#!`M>@x(_gZbYB#sug-GRh{>iXy}t9%2?2wo zSUm)6B~UMB-QHP_#-omLf2cWWJi1AVQS@uqj)^T#vwWz3Q#UC+UqtS7&P18mE8mIw z)O%y!g^y6a_lS=6y80G$AKDoe};Vx!@_+ZNK`C!enG>n16nv)E|Ns%z5D>b9J^&&X>M&P=2f$ ztxkjVC(z`G`zDvCeg(a7`CpSm^CaX=DWT(n;we`U_px^6X|By(|>@re2LR zEg_YYe2v*08Z;G@CbG~kY~qgezw9I~Fr?wt)9|jlVKH`US5Hi6N=W4An1^k#!y0qC zF2pL)GxWt5rYx&=y?H-bw@^l~Z1DB0;FCAvD@w@E@VkPNqUkg-b4#c_mAW#Az^5nQ zp915<+4v00E@Y%b3Fs(c+b42)=GzAsAtsd4RAZ4wQK~|B0kFGz$$F z77lkpG?S(E-skCKGIcKBwxJr%?_%pMfDyzehaaGOg3x(>xaFLWg$LhzWI8J7dg7zp z1pA%~cDF*Upz!R+)aeONCAp+h!sAwF+u|fuLFdXIQAgdRuPXQS^L=!^v>aEJ=?VGf zcOTkmUENyK8<(HwgC-Qp7y9%Q z)M5t5EAozxw{pZ9l(zJ1;+Ru$`sV3rm8Y1>gxH`Z!%BJ&sFjj(fv#&64WLIaKd@Aal3sCvc(ABvvGwHetzC= z5`P@1I-Qbou;Il}xWU)T%{{}XVr(e!KKtV~#ucpDB_CJqa>hBnBh4bdAa++=ss*EK zAC?G#Jezcf(D3+yF3^nz6HuOgNHPSpz+x=+K4j5Nf_E(&YG@cx?s>>Xm@FkSM+=B8UGWCJ2=zPn+@8Ww z{^qR@7Uu4xHV%BJYtKQ2&=FdTWUOW3SU+xdaDJRP{Yz1(pJaPY$~3S88NQ{+{-mWa<5R-WPFi zq~{09EL}#X1^Y6kcXYJO#*Ob37QX$av$}@X-%F?GnW)w&(;tTyC|^8{(j@gp)d@~O zy=-|@0w%4|dSDhxmu8P!3?1lf?K_ak|5T=IR(<9jWv=m?j!XjGSaIhZKB23?HDdOf zCq8$<&^M2wR96;CXdNAzvX{h6hFmapV;K;PjXe{5IT4y+Q!h(ZLyb^Lp)kaR0C$W! zdlrkW?SnP{nDdgUzZS#{UTU_~-E;z?SiR7Dw za-50JuJ)i_M$47)Z`Re@oQ&+=`PAIQ(LKzH9jh(pPLH)5s@}8NNku&Ft_Nz+s2JmE z$l37+qntTukY>nfIr5cQ7^feiygP0#lId*i*jZVrH+`yC(9m#NG-U+uTSGsPFh5K8 zor#yoy!~dlotR0D?t7@8qdfi1jzG`T70iIR!)Km5F7-M0$QKDRIz>(yjDCgGG zXiT{n(`VbF!wQGAaY3)Qn3~{eb7X<+F)y*KF~;$9g$&{J$6MYi^306+u)Z6q z6m5c{c^Kn|F2Cu(=AkpE+uB35V`KDdE7e5%EOuUqox8brnm*>U;_AY%b%aT4WJ$#s z@)37hyt9aUHfc=(1S4ysz^q-Kc!li!H7qo#TYljXrz!BNpRTjr=q3Zll-?|A&IDYT z>=z>@a9<9FzJy}}vpKOrlw}#hG2dlSP^)sVTLes%l2B@OD<#(?v$d%g65!N^Zx^9n zCH)E5+WOY~C~HGedd>i*dF~bLkh8KINvN>bRkzVW&e^K!2ZH-t!)#PX7!Z@xi=Mtv zUzzXHL8mG1kmGx%_0;y@j!I_dj8cS~j@Ep|*_V%trhAVRF?}rD>^jxv<5KT2%<$U( z4}0$!)?~V^0V^U_L`MY$5tSw)Wu!^Ralo+vDk9P?2nYgFLyyr>XQU~JXs9+&s(=t7 zKu`n>NRwWYfCNxV0-=PSZ@o!yoO90J*V+4A*Y|xt_K!U?JET1C^Q>o;d);fTd7SR? zl-y*#e79iPFGpUvA5a^m6$Ci#3vmD7nXq}RtZ7#qYqwo+A76LObE(|Gx)1)AQ!xp~Owen%W_ za6;)I>l1l&GR!Uc#5L0o=!M=vV~=q+op&l~y94s1?-6|a*yTRYHHd*P%wnZ6D%OW; z|Cq5G6i8P1<~uz%`K%diXWo^>#3&EF#hG4Jlo<*j zUsAiUAGTCA1B2Gcd=f1H;@nFXvou@r57OVFs((*scCcgChn3fvlgV)*gnr?ES zBLCg2g>h!1ripm38vX8cIgCe)Cu|;jTxZH}H#0%$nvOMIxhSG5l6}N!k)$499~XN7 zcPz|>86>UpaKS*OkvX5W$#%v<z8LvwhqKl5vgHcma*ErPvX?7BVbxdto1I=q7~nay8#_$ z;Ewf4b#=|p#iC`Q_v<&-#CX@a`E0@;zAXJslm(kShw&@#=m$%5L$Y;c&@!d%uf`^$ zzR{}+%|xUz&Dxg|bXgV}Pc-U);A_>^wM`bz@rdq2qeC{ajM9ZkC4iKVbpoU;QnwYj zYEJ4C(GZDcCCvZ^*1iHx5qcl9-1rk}@#&;!$nN?JySRfJ3IjS2)&20)9UXhbIu0=( zLteB}Gjj$sILth7gt`uw%7(qw03pXXP?%9*BY~AZXWcsN#~vAh13(cPML+KYDps|- zZG{Q@4b~N!ZetFBBz6|$T4U75X%%3B;&>m%`ehpNV+$G>$(E_fA%ztb2l;>+PjN_m ze;9M4O`T~eF(NwRo;Qk&04z2?#M*M-IBH&iwdc!mHB;$n@?+r}sE(h%$hn11KQ{Yy zICr38PLi-ZTsQYXHGdzDwDW#MWia?j(mOV1qcxf>#_1DNO;2TOQyhbPj&GtLt0{ro zSUj^XD+Bv!&c9FL%yh5U0Uy_-z<%e-5%ERZ6;mY`a?ihVkcaf|2!TW}SyZ2Yr~7KkP3M9y@Z*9P%*4aJ)?RZi|7cs{QM=M~Lt21}`b@s-u>PVJ zD}AAH0tIT|!IaZ%KoKpkKq2DWECL1;a^$A6h4>Iv}GKhL}-sZ2g*P_-rbP zb~Q{3My_Zk#-t&~R-Ja#OevBbYNVme)Ow-1?X9qPFdTlc66yg!?GH^OP~-h?5){_u zac@8S71t6>T$=*NhtiUJikXg{4=b>D^<1rrh8cfQ=E@wh-quxgR*FTum5L8us6#7! znbY<4-|3uxG+^#!>iy3lKL+r>G%*;Ku4d4lTdQn=P`uoym8|zbB#B*;v7gMVX9a?oTwC%rcnUUpGFZ zO|Oo@%`tUmnxC%0h4+>`ote%Gu{LMTHQ!`1Rxm}<+glg?PiJ1Jyvi$IeDU@8$R*?b zfds~JMY5S)oWNGwqR-DmO%~_yT`Q*v!IzXHYY#1g65W*C68sXkiAw-5j2hXm25~Qz1ufFADA~N;OY?Z%FRKH(CKCYgz1WlEBI0n%IOr3xly3HAM4C zxZ9Hl1CFV{8&xt5i_+Kuk73|t*Ps*7+jp>evLXCF%C-weCDpD@Yn9NoxNl`Ty#E|6 z+>cp&bo=RK^;Ggo-#F_7RTU*lMlwFf_G68!t^0ROu6a;%A!RE*RVQ!XObt##Kv%=j zB4B(d61`Y=o8FCgUvaJd>lFFv7;_pOIh-93;6{1; zeocFEMWYHC3a%>D)2d-L`FUurE2&#MzpEkr>eX$1ZS&QaGG$8cC3mfy3E%T<1033~ zWYPR%sdGVoI1Niwf)$)XS8a3+ILWc6?xY&*rf;z8BaM})Ktg_StNMHigLX~ap$RNz z3uG>HAw%jg)cyufL}FAG^;!!Un87>-NIX<$SpqpRBRn6Bv`bd^`(82W-s!pZD~_WR z-%%VM4d8DSX&MLBk)hkZv&$RcW4Q!CBWk%d({p%*v)cywZU+ro<5-WAU?0}Fi8rkV40&uA5@YCVitCBPnW-)zZjM*YAk5G zI97g~Z>YcEB6IRWWuzpLzQuX4i79~}iTuPs^!A0>U^L7vMG0%So`sT&v#*B8-f%Iz z_tp(;X9u2rVYz~^uZgYBGiTU4Tl5;X{}y-qaXO3c2g2)6o6(6EUOxm{M6om^zjK*( zeyze^fic!enyrH27{DLE+fdlIDy3mI5NF&>>$mD7xwhoRMYFHnh<^~Y+)g!1G|>Eo zOnS52_leu7fO#VIc5GzMlYu)ZLCsvjuu|t1qe^qt#ho_8=Vw~fB(t=y)_*Nnm}(?> zI-5o09ye%T?_EJ8LOqj`Ac|C|*B&?ZC+lqwGp0ylhO(&7s6}f{uOMAGQt*}aHMe|2 z6zfgfm7H^CnpxR*k&60Os@TM9PVIMi4& zN}i&LrcY3<%Qqwd{bBV3{AloG>O1T{RajDilF8i+o`#BolB#pLmW}&zPl(QAtJIGl3Ycc>+~;0gg|$YnAZ{opZxGEmfz~2eikFnBGBwl2I`G?jCLjMu z-Tc+E@rSfWMFVdyrVI<J)q|ibuk!FEshF#A*ejy|L2OeBCRi z}}OJ=7-CQ zrneL!e>Qx>K3^E46Dguk{&uREla=#m6f-V+ivejG1vhl$^+G)_g=% z>kf^fl(%9S;>w*tf%VT9Ylc*dj}$zkCe9yXq&}Sq?6^c)N4%RTkvMz8!)%OVe8ax?D|IfY88x0_#n=3Q`!ww1Cip`nWT zO4TmTW8kZTmEttx@u_g_kgh_v>?xY8&(o5Dl(MXQsHpt(TRqKJK@GZU4z;A5s>TPU z`k)5((S1^YOuvV|p(PilJd78DV`-9B5`G3s!29qjZg4dwA$v@kOf!eF)FC(t&y{%}unK~BPs3h0Sr}D~58hYP zmKj<2x+Px_Iw8fQ`IAK<#W_8HhHMBrZY1qh$q=ME(zUO6fQj?aG*g8l0GG4cQrpA8 z>SWrgF=!GHOj?Q4Yk}8N31LO$xQCA?gd+Vd_D%P}Ljh!FFzto<01;pF>el_M;B(|@ z6hcu%J|U6~&E?a*VTx3iebA1vv+Sb^3W@ilSPnPgs%vi=w2N)wmlW7yC`54VfBa=H zYFbXjFg*Bp_PX<9&IP?~Q=P`{WozW+P=i_lejW}DpR|Veiae|`_!>i39X>&@y;WM_ z_L6||_ZSRF^}QSL(<7s#K->96fyfBKni3JQzRYGfv?b$Dw93pvwZi%7FE8|aJIiCq z&*ne>&QKZ4yd*`y$*#G2w40a`nPsDL&ND(+{oo~-LkZ&yi|GxQ za~W6Y#zq?C@LN&m>b_vZC@1R{36Zt|efw#HJ9+IDMz1#9^C^!eI_MI<6{lQjg5u+X zCvD~95jwG2Cd2Ow7x$vh1{sg7B7+igu>di9L&l9XW>zx{O3T4*FuWQ3x8}EnLxB*E&%8CB1Gg>k z5P~tIn?EhC^+Qc1)6PLdU(2vGd@Uz}dSeV-H-r$a^{;+SsUTbGJm<+9%+&alV`CgFq+7vWn6)|nY_8{tz&2MMtC1#o& zR7ph7v3#PlO?2Sw=JA=IZZ$Y`f0AGQpoUP*(kPfq(eLd`j8J`so})+R>AN1xc07$9 z$r8dZ6Vkk(Ik;)Bl2Q8`>)`G0UiT*LiHP?*<}q=(lrVQpwXL!ZHIhbExAcF4U|n0WX8jpYHYufhHU7>Yxxp;NF zLUlZ=sz1_Wpv4;Xm}OMhm+5|a#kGQvuGhUTZpUi(VlQpbc5HhbOxTB+bbF~ldgbV- zK}bz`tAJ@=)5SW;$ky$8a|Jj5{-zl%F|a?1NW+IurQZ=VTzupBwrH%Me;|h0?nbBf z5_D~p#vF~k1Tk{!x|ruZ2C5oF^s@*u?L%9MSrBq$yEMF}y);e=Bpk#$E-UG~Q+F!tJfO>30rLupXt{$=4zLA+2xut!dHZCUNaoavf* zNBz^PE-{*{lA%Yb313Qh?WJGayD%2SB*f&fL25cx)+Z@8!%~Z&rsvJm5{ycGuXvEl zV-qZIH&HZ6&KKS$DXpF`>6Wz>wTnBlQ$&ZAZy)E7cwBzY!sDH7m}*_mPf>|brRO?O z1x1F|vQJ$AuISunU&LDo7)gsIFxqYC^16o5$;2D4uI7h}^;VJPae-KTC?m4SG7A-x zC`I=vC?v(j7IoGXVz**c5!~bKQF2BrzS=kng|{NP*22f_t!wV;iGa%RPXl`75UDQ( zDxWf4)duoUk>fL$`{K)q@AP}!3VP|z=;F4>qPABaDVJ*w$;KMgE}YJpmp!Wf?N<2Z z<57*|#5k|{d6b-Mcz2*dj(<&eLEo&$M#r0aGd7-F#p!tDO1E`!VOx7n+mm@jbB^co zw53|c1}u#uw(w(znAYO1z*QN#I#a({QyA?`$3xy)L>K@gZd`!&@P@P}=;u6(b zv~OlYI#Lw14JAi~>*2Qgam=R$D-0g(d)l z&&tZt&kl9=;j2NWGYg3L7N|M(21-RU=z`{1pBWmU#A(jJr&EC~j0ZW%gJG+ACDtVn z5BCjXV~d>mq5M4s1R*0I{^u4$mq%_@|Jl`{WSEXRH*x8%C^}+4R1f*<=PXRs09EHM zHLi~cc&Jvbhbvuk_e}ktM5Ah~c8Y2QEfIZH=NT)Wax8dGblfjLMfLFc=0@UHN}J+C zk2|Cs;#62x{K#}mx?u_HCiR(qF1?~MG6r0H#M#U1VaZjVQO%79IAY-8lS!tLG1>dm z)yjN-@3G6Pb&bHqC<}_Aozogkai& z#HoQ2hAY~M^yYCD9%hfdF}Uv=03(dt_R`N@YGdM|S&{AX@mK%O2ucJI$24RDx^_RmD{Edvy*DhdKqb5{uPj&^s2kP7{lX zuUH;s^Qf*1_2=iZSmncp335KkMI5YPf-Iso^{{4*+7``=tOkcDhv594qMY4K?Mg|+ zX^R;8_C+0S8YuIAV9}$jxLWj2h4~P>JCeER1WhQbjn}hPs;x^fe2A8u`Fxq!Sof&~ z=o=XhiF7FhK^c$77g^5ZfzM9gGvURf#O?z!S^X-@`ND05l*bgXXzH&-!l8nz3NJ3d zHD#0IE%-t}&}@se<_ZO|^S{8HZL4_K2!!;8FMeN>>BbXOa}e47+pUH0kA2>rp~(NM ziFP>~1X$`q5Fa}6NkJA&=_|cU9169=Y zbx~=7%glQ^q%AiOV+`=>q(las|D0dB!(?^{kk= zqq%B^)*<3Bpg^y!{T%<3U+ca{(3xsT;8TCzlva%1RyNT;*m}}W?#x&Rwp<&Ef%XER+yet!9nKhpdpN|V2w{$Z$QaDgc4ye8KJQv+RUMG#V9L`xRKOV^l z^1(vche2H)6oUe(ZgQ2qp=DIX;q!pQB4o(m3iEYP-q~+DV8K%Zw+%+nW}Oz7P%JDx zxV>@!Z;6_mp?!6(h2ClZ_xxy*CRlP< zeLx`L+%&R>JSxRcTz|>tIyei|Yfo}yra3BT)Kgmf@QTsr9+~3x`!ViH zwRb3LAJtvv_Qc$3s;;2q%Kx@Fq$ZUXR;2kj7Un)V0y+%RfGz$dEF4)ptvke(O0w(9 z>mDaH*gDio)We`q=UBHq%pkOZqk(17HZx^ElxM4vh_~5<> zJmA!wb2fUwAt`|FjEks zNUqwV+4GQswWJ+uujp;43?ZRoq+^2Q%yF(g+aGAU2UDAK4Zo96yQ=T+HPB{rHW&x-)SNVGg}d&dBpy|DM@gZGsayi!Pk9`L^+ z&BC2md)X!>7vT+UralXKK=R{R#EA{sd)r-Nrc@U*Z3S_ppW9@5XJc=a z*W#f1W%KcLe%v>Y3coKz>iqFY!mJa+YV7j5vT%}e&P1`v{tc&-oMqCvH(Z1}5lg)A(-=!#mh(vtNF%Kc0apY#eqb+6~ z7KfQ|Y+3nIs4T@31^z8tiO5!}@D?hZgnKW=s$|Xn0)X>r+VA*~2KL>CQWQxk zPzUIK9S(ZJSp&?H+ATi}bu3>PcTH zOKh18^#r?W|CPRQen_zT;Rf=h2%SC13g-2D*Yn5$gM0yF9ukxFWOEx#Q6ZJ?rq2ep zc0wN|@V23W$Ph-)j9so%e4S8NA8nTBxA75#=U_4IB@5PJW?-L?FJrYn*|gD--4RCB z-CB4v<|y(Z*bQoQuP_fu=%ozZH7ZLEz56(7c*EC0m7AhHwS>2An`i^;>e8;RRUcU( z9<7w_Gm87+IS~)TR{3SnM3jh;4C>i@abpxp)Fh&SuiHOP`<7lb&*h4lY6St0+VQ&T zgSr8#1yr}FKD2h*ZkOImNIbAg3SdV@giZXgWnj+@Sn}DKSuZ!9arPs(7quo0Y<_eL znsmH+S~N6HGB3*Py2*J~oUC)Z)-2@uA#b~KKInEZLFkb-1{o5_$TZ`_$a9Xc^OjkT z`o@=l@I|B2%*|=XlAs0x(PcwHHGaYv)it2YaKyZr;(Do=Czpaod#LM#B+RVTCz^J6 z>3Q_alxJQ$vH=Vn6#ttgC95^9#3Tf{j+RWc*9lv%F-mgP*`;kRmC*o{U&G8SM3tbTgn^6b$*tY;b;ZyjfX@Cl~J40;c`y z*+~4xM_JcH#p#(suLb+(EWqp=vdz9!=J88=6f==OLF`}R6la{I%f6e5&92GTut|v1 zRGoFrQ(O@`^ukZ$Zde&6v73j=(p7u&9Jlad_k#S6*sK_3-nCY(lNUbZTIlU-9-*;^ zeLZEEFI9TxCC=ly`R!Q$ zp586C9v;;KcLbg&Y)|RBu;4~Wh%*}wo$soP61Pb#%5Yo+hvE5EUYnwkYiX(pFjhX> zsp3SE1=N*@Ju=0=?~2#c1_c!o-$&|k&Qf5FC|SMV&RfVnNs>*EeX9_1Le>hP#7l|> zYogd@sYr9y$z2N55B@fywYyqV?r(a8V~cnIzrPN~oO@$K%pwCeeofXh^uql{ZmQpt?@%>4stIR?| zbG7`a**%B9np709o=~wOcddhQGEgHF137na(aXX*0&f>}_785?M7&aK^!c+jRUT$M zldww5sfQ>bn>#_XZi)W3_hG)aIs4ey{;w4H$AIqhfQ24bq3+{hpCd^=%gu9$ZFXQr zwO?_p48|SlJ%j2}=?&ya1040AStl;-sb7!5LI+;q>t@>VaRH}1#`=yH9Ip7KGUo-6 zjXaj%@ntHPWJFfN%?Gus!TM8Pk%zxDOg`e>rfvIn^`&Nbm}8vBAino7;Za%p@gRfdzufsrg;2tgO^z_0O_rYTSRlL)BZvG6dIr`& zP30{_iL}c8uGfhy7tHNkTHExRGk|eb;hQrRQPL-YKY{d#XeQKZVf12Gf_q7VF8xCZ z;7mrkS!otctP;Hkz3UP1tj-&z*p3Lk{KlWx@SE^;5$l~d#TCzV*GB7C6et$V&OS-$ zufGXe(}~fdhTO{$*vd{bC2^^f(ANtL;NUrjghNTkAQC@D@*x2TWL6ydP|q6Kd&^df z@f|#-pdd_%`E-a{=A7(5@D2jZ(MQr~dF-(9B?o}EW65mb@0NJ9?%N z&za_o;Im+GDt7zN7!6+TQ%qHW->2R`rFkdj>r3%SrMrCHhd1m9&Qt>T1cx|&VFsU< zb$w-Q+ktuVJ@E8*3Lcl!uTWQ)Aq;v=&Q6-etrUs->Bk6H#bTUt>5oli&< zGyY!S*AE~VxqD**pkt67;;qD<*!Y74t(P3ES<~{1+cB4?ycNJ=1toTFT?LU>c<-)W z<=1;Xg(LG6rF|nL>#wnm>hw=4T0DnW+QmKjwOIX~#aF{uh7U^5A%~*ba>M-qh7ZJv ze}7fnZ9BP7Ysi<@C<7lP8YNQlD}O}k$>rM}_MUPxdM)U0;0d@S& z@Y}kI{4FSb_Tj))xpV7ySAUurC()Fb zQ3?*I551=j4&6~mH50?enJX_N%y@If9ZJ}42yE;i+^tEf|AwJM&s;Ay@>&QuS=jqcu$cInJ)g^*@VEVVmWQio7rs^kzAya!KkWTl=-- ze%89B$DvfY0Hvz4B6YhG#-A)gBi~SPBC|MPSgsM#>l%YI3iuVrx0D~^K9f1%n_qnfJ;v$AhMM?L~#XYm+ z=}lkhhqKI66XAIV7U@r*S{!rVfazZo8s!cd!DhFI;=&GcFbn+wN`YsDt$KXY&peYD zy@&x0Oi|~^R%L|DgfABS6kZA=yAj2DQ_pf`1@Ry>tV+}Bcw1?{jzM!wuH945?ou=I z*UzLFkMxz6hZv7^Bu3?VGms34Gei5382N=#6vMJU*mevzonT<ibts}WP3F9X5{M6Duwpa= zCm?*CFkakqyxTC#ke!dvy*gb`3vHT2kias3L$&QjXKUj6w|97e%7iO^_3>be#GRc@ zhhOeI;TM;;i#~P!(4#$=8dxRze82voqzrf;aA7h`ce->Tr-xEDaoF?~`Zz&PmMhw^ z#|gab&BwJ?9CSWJ9+|RG)Pz_PalEqD^SEr?Cfy77GlSvSyAwIsXOA^P^kUeudVHwe zYE}{+2iYanzjo2hB`k5=t6p+-C;YkxkJGc*c7dwd=vesLMv zp90uiV z0*>coD7RmG8=G2)^nlIaPJ=;^23MgpjrKSyiP&YuZN9Gzt#Mp@f(CcQ7g_!_BiI|Z z!275gOP%35?rirvum7IixeB$4<_QJE)d3lUGZ=hi{UihMGO!j-tQ6&z=v#3vI3 z8B9IQw|(GaYn|tZ1Z((hSZ7A+TH0~$TP)x$z(=tlm@`F?_0*)sH-PLSf3*~1D=d=D zQMRS(bbbe2>yW;VF&s4)vyb(qAT(EyN^;FwnadeiYW)-YGuEj^U|XE9qL`L-Z}7{f zu_BSVA$;AMXV)uya4Wg|T9bTe6+#bU3nVlU@mmW<516R;+@~lG3F1@3sl03@Xli=R zmMgU_Y~71$nXM_Lus8ecNGNwQa~lFxB3pWlZ7}~YTN-0?KMo=}kivC8N}>5sh&^W= z*Y)nKJo|%#aN8kHKyar2rnKa7o6i>>>@)mnH?A=?2 zseq6#Os>X?Pl{f9i*%UN%O0~9yq>l0mcCG8a!X$cnxV2)$RUV?dD;P>%G(J+!acnJ zk-q{t(247!XxRbTN@N)#+nrVUgL0DdBhV)tINrV%*R(?4+Jj>!7s_5 zZI0u<6R5N20MN4l2b6ufoIiW#r~~7spny9W1%XdHhi9AAHT-Z!-{-Lpf^8d$bY1iW zf2H-~>NOK5l8S#6OUZ!AC&b4PI>y?n&09He<%+jo=31vH1Zlep7L$9P`8GO-D5yiI zEWozTj!<>Mj+?mG8r*wP*QOXHDyig5hZcLY^azmF32qK}0z-ycxU*X7^})>zF^#`! z#Gu)^W^(6rVgV^o#p`&78<8{EBgeNLLRQ$?b#ge|3_R`Zi_^;JIZ@&_X=!jiM?I0g z_Uzw%lu{bqy50wgJYj`Q{N2!TuE`CZ0<}Am_IML_5>6THW{*LT`eE|O@fS6mu^1D; z`x-GT7Q$u}Im>aM+8XR9{#-M$UxIGb-@lJ@zDez%EOUoU2EIa@<2-F>S-Oe0qkUPC zzagWqI&xh8Xo5xFsB+By?aCE#^EA7$eDQk+Z*f+*OHmqgpf}Ez8au9FlrT5*{^q%S zWe)6Ceb95C*^7v1lx&~3Cs&Y+07i-H7MVWhhr{Uq3^OO#;^hQ7)9HO}7cBRLjN$K` zZ*D^fKRb~A>;G_blTKrNRF~;akDg~zWJ~U+TjCV!5nnI?Th#mV*lyC&G$X}4y~pk) z*ACrx&)gB5c5}nt1GO^51~y9eJsM~08s6LRb7f((9)OX=9E+9as7eT`JG1;1lr8;Q zArfOBO(CSRe6mxcUDjgfe&3Yhj#Mr~u z0_QsZSrlrhX$m^wB1fMDQvz`E-}-frkX?eqLhtDbtn6rI3to(^Q7u8jZ*k_<@%*b- zJUZs0qQZ>@-8#z{*aMt9Sucz+HJ0Y&NOSBnLL0H~O%+f2;dsvAxT9nGkzql_ykXnn z03V&+#+}=%2<@9uw;#z7qKi5iJi_d$_mFaco7?*SpQ<2C6|%Vb?lK~f+A`mI9IQRG zO2Q!_az_yL?{_v{HY!*CL}p3w{~PYszWNfr?xB*{xMHn>k?LI;4QATUk)k1&n4T-Ft?;>y@`&)vc#wQ7}<+!>?c<(xZF zx`Wp)PCZF&;(p67hu2*?$9?q-&w<)Af$@cH7GKY(8*Z$jH|r$MIC(y`5a)-T3Gn5+zsC zz(`4|)3$AQxH!sZdk~3nMXY{1%pHiXx{2$QX#M+62}g=wBW>~orI6%jo-6d=Hcztt z(RQ84(vVOeZ=!x|75JOR07nJ#*=(huMsWTA##iw&Le|>abr1M2h!OMM4ZhRs6);-o z?@rangX2wZEx8%D?3>FR+2Xhi)4uxS!Cd#@_txpRb9d=an7J%L2b`C8}3PRVJMC#dgXW>G)n8^E{nHmAn*r zaA`8t$!Dd5D#RFtsRN?6{4^T_u4lR)qM|z@ zli$`Oj1N^aw$`eLwT$|+@2zlg|7L#)>{HP#tgC@8_utS z`EonwhsV>1!E+L;XqL*nV)usUKabG{hLPmncot?8*Cok?Ep~A0Xwj?!R3grus~6TG z>ZtPHP)D0rze!m>4X9qt&(%?yW*ZXw*U(QGvGf=W5(lbapA4c9i|p^Y(+V95Pwh94 z9Dei0aUQs#tL1%G$&1_&*o(z57y7bL7l@Rw)4SEjktk_T&#hcz zi!@zspM2%%1>K7}67;W^{?0Svh=30l9g5aPalEh5Gfav!qOBg`41fD_fb+Z8^$d}W z>id=8YUj+ZddU9{{EIfxxAT*w3z20Tb}Fx=1Mj|$`TH%9P+6|?_kW1=IqOwq*VLMu z0XrOTVLra6UIya>O3HsO37JDI63zntgF{^84*&YU3vrm5(DoEIeRneaV#Cvm4&9e; zR#0-b`(~MK(d4C@!fG|!cE9cVx$RUIn7k}p3Kxao6xQN;WEid@sdk~ zL>}9j!Ck!oW&|E7ushnYu?P|2E3Xfa>JYFyPAad6(YVjrhbH0mh)T*{x2#mQchOb>^rg+9m7#UyXvnZP#Uce8VORQ z&1_@R-)j2JKAws2s}$wK1AFToo{k-!t0rLt{4VF98g}e=sL3~Amr-!1u{%N^&(1iD zPo5GCn%1OtEa!WgcdY`8er-ZYXSDC=hwy1G zV_igb$43=UotWwjc&$0QdzBP^aX{n0xU6F`n|2gywDOcyqRP!$8Ib z4;h#4<2nmK185g3qKt)?WT%xy{Gv~05z+pw00!Q53J6Edy7^WWvO9x!? zn7TzAL2X#2!}0dsUNvy%s#D&M{jYsoJSZ#l`DVwGwogCoj6AY4mKB;$(P_W(?fjkY zoZZlbd$gpyw)C>ewHcNsXQMn+xfdOoStH`T<1*AZ>^)Y?oy%AVSe#GBQ_Do?Q=DiK z%N=C<8pyUIbxzO%#KalKgR!?A7{;0G6{|V$WNdK+$#`KVF|glwXTZe^-6Mk198##h zNmb5S!LlTd?+GB!)^n3yAm>Ds+tDgkx0N4?@gZt_Rj2!%L+oCxL3g3ds`}g%MYmC4D)+-sVC}(GT?!`m6RbS7#Xqu2+EXzZ=0{9ZLjv2q?ZD&4!n(bB3 zxC)(9enY5&@*C5^LYP&fw8hZ}n3)PyTpMjNd;?dXT}iu1LPuyynZI$o{j2Nud8A2t zGktq6A09QtNl}XAq5c9PN1~H1AHG(gbgg|$(NHy?VJZCmU3ndt?+{!(Yg?=`j~@@?QK>)AoI^~A6?Y7)7l5rJ20?(dH8t$#YUXw@oVjZ8m7;wlzn1~rQLOcR zu-*Ko!a4?isJHi#ByOl)uE=$|)#Ett3m%h`W$*q@d|Z<3OhmGCp0;hBuAuYhG%g5i zVDUt!@>eNbmO%l<`$l!52daDFZahYy3+K36=X||H7ZcEhxwVRDu3VpiIO@zR`*>-( zYT8bN!|dZIPE^x9t*^c>C` zF$rsx|BlhsWgpq9xhyem*j73EAm<~?d4dGb;Z+Oh80wUmG}MrH1zIAKB4nN;(SGGh z!!+KcVWZXX1}jxwG0=eYxoX?FwvGGgwP_ST_G&=~?~eZoRX zUwX)?O}k#3V)_9(nf1+{qcf;ES&~C7a#ruPeT;QHoIJX+k1fr|-lce=J6k$()y`wC zg(@?%DnxCjWSzF!aOxnMaCJ3I|2(8LnpwW#T~?Q_`f&F9Awkxys(`k|<6oxr94%Qs4r10@o;Pm*0H z$&Hd1VYkO$6+jsc3K`~yta=vO=G3P2BV{?-(cH&?&DKoBLdA_cG73+Mz2xX}SFb(} z|IUNUzvJHnyfp6V5?8il8lDxL8Jf}zAz`wNg5MkfDj|`smL?msUq<*w%myq5CF8S- zJYcp;^Sff3#2~S^ZQWU=|EhG3RI0a zj2z`I0P>tI1U`sXYP9b!!@T0fvH?JkMalBIa-yfMt?!NMy9W2zg)V_PzMZcWtxj-m zJYXk}OHI-uSBV*w1RVF6^d{cLN2Me_)@@`9HmDMG_TkY4BA7=AX4~zNj4!=pEFqxvAaD*(G;Nh)l4H_keE1WXr&M`i zEDy*Cu^MGOMbT7$3sFJrjcQibl{-)_aCaNmyVpAph8^gNpp)Ibgt+HenhuL;{{yB! z{7bJnZEcgHYcAe`2{1Ws*(Me<&IM5&MG@>Qn(%cu$f6;nU8J_eN)`287xE5n_5FIE zT8Y|f+rJd~U2Fp=~XO*UslW-Tn6JT5^^nAG8{=6%yx~ywz_2qKi*= z0y@`s^l}-d5SC8-(Dy^eZ{tg_Lh&c8egHZD%iBt=R^~%DgQC%pWJ>(Q4OldD=Cb&; zb_w_MW4RM%gJRugCD^#!z&Cu6%$+fD!HlGWvL$ePm!d8vQ8%$G$c=Fm{afbz*&GO4 z|CAn3OPDm4N3B8@yy~w7BZH`lZ$NULR0SMxwrap6gJ3^1gK0tk(rd~F=VLEQC|o^& zo#g*XQwX0tQsSJgG-`8`aehK+JQ3P`vxK*CZH`{jI#4AK)4qSd{RbF#^(S^ERsj8YX0iLdNgDdvv{1NCTImb48;)zy6b?^bQ8DVudOM%zT{?P%EDQ9d_Zq6JmTq1Pl2dO@ ziZQFI#(f8}Z2zr557WSm313%BB>&CuTB-KZY=?g;qJtpZtkjk--UFf6 zX;*bZ{r41Hw(nw&d*YWs?)Slr&NW(j`~27jeZ9|W8$Xni@Qpr_RK`!2mgbqi0e2|K zeFQlA<(iC*aLlfm0Rtq_n@ zBVhx_3#qh3DPvuw3jTc>rsRy(EiOymg*F)9&587>s|~T-`R4VUsh!O?)XX{ikc2|$ z8l8B3xA&aq)5~JB8_d>`?bf_Gd_JGQRHUxpYL(nSa4U;u+`m`pWHJX2M=3#$7C_A( zQpi9|EQPWh*}K*lw|Vj|Su(48R3Y@0e+9#}`8~~e=>h>6>xbw>FDU{XYq2!f+NEt@ z1ff}YmG^jQ7iJ-gGnGBqf8sh2GE$wFkprI|e<+~|6*DS#J?LuXUz0wC3+Px;KUzjQhurRtE;o8- z=(zeJN+d^bi7c?I9{NS#`c^9cCEqJSPS*Y$FFcLwYMh7dK` zGAhe9s>{ZglFfhi4#$*I)tR(h+m8|S zW0|u)9%Y6^@dy>Pl$*Z`yFzpNLXBA3rtkX$%JIn&sCdWmCcuzaj`}?bjfO3EXIgRr zNgzgo4T=v~vwrCfdP%>)hW%oNTQUY4AK}68WB#-azJau{O{&#q>OCv23PhqRAhMIb z-{&}9W2T`Bj9jc*BZ?razOaJmidS~KYVhmQch*~hP1J4MbPj^3uuu+Qgd9D$mB;r5 zBSlc`j2U;a|Lh%*>c85ttY}6t(IQ%F`Wk~|8JU)K{A^de*21Si>D(W(Ynqg7Uk$GD zxvqzY{q||C`}%#q1p)fZK<34B%&$Cnnn+>klIIDx3#l;WDuEdIG$(j@lwJCszcf~N z7%G7SLPTMX3*f9J!J~D~cdc&@X>HKhr9S?E`c-@=FclbBOQs0H77j<(+~DF^u-$;F>pU`?AZ>3B00}m z`T?x_2QPVU+7UwVfBcT5Se{0>#8(;P15tRoVeqH`lr--XmZTXa_WRC_ko5$a-9NOY_E&cEyTayKTbB^)N{!@-uPqw5;hK@>Eo@eJ-I20)o`OSVA1~a zig>>6n%!an7wdPqH)cR_lPvZo8VmB^)m8ma>O1({NUDahflG!t8Ca|-4W4pKkFD1T zN1SZ-ar)nShuoHzP+;#FdPK~aR;*9}tn|U5s5!9{E$N~W!}T{Km4L%CTQQdD$pxkm zMU%R+stEsuMy;R|@urq|-R~<|0L`?}pRh!b+I12Fupfh>)k}@|zCX<*1agz+0Y5G0 z@!a$>Yq@Xlw+vAG^nhIj3zbMXphkHJ1)|rkQv#2BKzp^n5ryDq`yowK%bsh+6XY`wn*TtO1oV7>0u-|W3X((*}_M3$qauzH@?-~4pL3G*q@8@9;C1$nT znnu3AAPmb^P2IuA1#5t>b_qb7iX>MU<)p=nZGc6568kS|neqAQH)g0wB-@F=-idbj zu7ubnTbd$AP)pvI9OU}oYaN%lUT9eV_RO@zvn;F^B?K? zpC#kJYnuQ5%KuNL$A$ihws?gBOv25^k^`d@h8=Ij) zM{ON={7sP3;G_nW0sV{5+zE5xgEOV{l91dPJFkEg2h+SJAs`s{gd88&oBn)arSh`6 z2aPpSf_o{yqCMO^D(_PBH6v5bO4jM9O?yvbza%D#&T9;}T{wDLm524k;ahiWOtG?G z%>`mld7Z3{&hQ3>#RY{0Z$<`Pg2fb*hT=$cu`CFHV(N8)jRw&j3_l&cN9;u+^}1(= zhGmtxX8qibY6VujgM9LI1 zT3ShKHabE{uBLT7mGo`i%J8~g9z+#+B{Z85@ailcY1@TB!QG!aQ`6@MDAIs;oA2!0 zs=1P$=a7RM^8^A}aDcSiKA&+?f#dp}K30B)3?UZf{HibO7Wd3FYu~o+VS-nvSOAY9 z1&tjhmcM7O_WTrVB(%?ioQn^{(~Zr>+%x!u^f@km1>JY*q1_~^a26)2un&!s1@;Cm zM+YQBjLdY|9r|EqZveav+8qAIiQK;pO4E%72Ap`HeDumwi(7U#*CTwdrhPJ+|T_!_qm_veeUP|=lpTbN8@tM@AuvJ z@6%I{3hwq{e4h5i)er{LA^#BYWgE#P?$cCZjS($fKy=>?fr856?VJZ9Q=WUAeJLe3 z@4}`tGGL0s>b;=fXRz@Wb_Zo-CJhp%{|w9P^V)Shl5l*vmK}Z}gnz=keIz9n6w$G_6lV zD{etYIt6@uPV%iZHtxSVli6F_qiK1SQJyA6wfY>i?C2#w) z&0CR_#bKm>VmpxXW0)mwGPU43#tI(*N<gqC-%eZ&j2gN$=i=;_rf{Pl*stKsu|# zs0`}+f^_RB3#5k*rZ?y-O3T*-9%EB>sD-Urx5`^ohljS$m4ed+#+b;LY}H-e>>rBu zyb-w?_Ol+J7%rirUp0M}KFVvlas}rGJAb@eJDC(_Le?_#c+*To0=0cEKiM+kz@koV z;?e@&9mR}YKc|9K!|L-$@dN&TuhBIYM}b8#LC>8$#@}c4 z?*S+0G_tk+XN1k67tJK~K30|)ekj49f zwd^=l54`FjR1@YKO`Nx!2d>Y~m0Px6;y5pbo-e_vlL74MG{X;tS?Ka?U&u%KmH57ZOE7 z{S4l(o?Wr=#Uqo=CD1{Z8MLzyT%(#7uq$;%9_h^4*L>$uQDJ zoOb&K-1o29Sfpe{r3w}wd_A-h=n9zE4kXepK6KK|p&?EPlUlVQMhZT~m-fY>_l_!=e?7j4PUZbYX)$1YK%=fMtS^s(K z`ORwXuP&~~>19TW* zVJJ<>e-{wCn?lRev%1Bn?+BYjsp(;s0V6qbdJ!>030hlAA+XfmNP2j1fLP8+T!}(e zzbPUM9`d|XuN1-0>@ywu-}^??HKHne$SQaTG(884p*=H^!FAQ!sr!{^4+|`NUKI}N z5;WC9J>gwl3sRS+*hJM_Rv4DK1A{0n?&J4^OdMDeI zP+{JCzy+`X9$P(gDbU@e177-YDWLR%EZ><+fr^HGMzK&Jjx=>KVNmiPU+=sR0uhcM zg6t+=WnvF;NZpCP5nAQrZLBMQpM{pI8VnW}c?(0wdr5}QTFwP5sFn2Sp2bQ$T|t`aYTTk_-1C9aB1(1% zZg4qcTzxgTF*LB@dC%6YP+VYUfo8I|MMa8Nh)4fE`TG8Rda&LeGMw1AlzI z*Di?YxLt2Cj8=^7>mjAllOjZ87aE8L1YvS6{pVUodwX5N&%B;jB#jgU!aO7Q(X`*f zsaUT`*Q#C2fkJ`?e<-nI8bzv_a1FzB`lL}W)EB{f>dK$SklleP#o`-R0a?e{g;PVo3!~u40u9QX4oNH7%%z5v%LL zijpjvf{Y3D>p7c?IH;;58!%Tu{-=J!Ge2PpHVhl_ctA)^W(lGT77bXYilYFVB#td$%M`thHUC^H^9n#Rzs_eg; z^TKn@D%88SWlBi3yo$8m;(o`oiu1&`SpgbIh4yY9$P*;N0Q)5wQSY~j?9%QfG#&9F>EMIhYgmLe4!8i$YY%+K!TjZJE?$MxM_MNN zEm>Mj{RSdgpD-N9De=zEoj+MfI>$=cDu^bTH5AsY+R*$vzr=lwvu~@{;p&lG#=Go< z0pFX1;^y6gXrd1!l9hW}mC~f5ot6$O{@(9Nl{+sMH{SsPE@U!Kfl_`1Oxjj7S3-e* zI6sGV6t1Q6wqc*_yfF|@6TZFk;Q0+22pm4mz#$#rke-zdMsMfzKmNg`2g}|`ZGCpY zqOR%W(QtHzb%TBR$vP^pf!I@)Se=>fx8IXYFYadV&$2VLw^1Ki z*sg)07_1YyRX6LiP$0eb^=NIm@snQpqtPaF;$t2+*B|qssXzA#hMlW0`9A)OzKrj) zo~b99!n?WKc$JKac9Yyw+<4y9hH=OY1C?{cF=FCV$J%s>I@v_mm>Be#Om*R~=# z2^7u&g`R6SP5>;zf*%A5VjB1W$PKoC2rt@;5JSN)KYpd*qcBYd<7Z+8A@dqOwX1Cg zB=;e$K9K%P!&UGsZr$on_I)ZiHpRm^n2kN~VA4DkJA=*Vc9?{6mL%}Ke+*(uNv)Q$ z-ns1;y3esuHqS1Q#jL&&F~BFyCZ_v5bmdMq4-%R(Nz^ozFnqfvh1Y29^@)leupb@z zbn$a+Do!`cCoSWgFQH&`;2BxN(IqK86b&kZw9?$Bu-aoJjUJqrt59a#v_y@pzk!XP z1nzl_ufhj5_+VS4T(E2%+^wyXLR+<#pYdHFuoR?4F;3Gv!=v|#+4nh;?Z-S$>Ru}& z+XmFrRs>aaVxe^opaQg_T?cdm((%!ZxOn_jT+?6%maRL0B@Al&{^9u$Vtb>~jJ%++ zmrGB3XP&nK9!c8!rgwhCcp8adcFpC3KBbVq4#rRqf3cs%7G&UvBN@5ZOTCnY&lf4u z$MJ(>&T-+VN_>V@2^uD-tPZah`xakfR`Du7uX)v-cNy(@8t$Tr=GdB^R1w1|<6^gb zYQ_a7u6iV`mE!5cZyL)LeWZlE*`xz*AN8e*ZV@hr)6_$o(o*Mi%Ey%dTnChU+qp(` z>=5zC8C@>|VGo1Fi6{_X7QTQ~{QFM}Bq*E){@|cQ`LzlVMF6B5*kmaEr@sQdkN|pN z4rFe7sN2YK-5^WFg~Hn_>0k9ed=-?Ih#ubhO&tOYzw6^866+%Mc_~e6@Ex$vQ*)J8 zQ>1smm*WX0v?u)Y^yzIa8~D#(rQsHpVFHHPn&I?k)3x;AqR(R`3B*uGPKo=5(?^8e zo@*BQqE*};_CafIYS!|JN)LRuZLj49!uPllb&?0hdnMTql-JWJPysFM+1th1YYH5T zw9^~l-hRlv9pK(t?{SKtun?X1MLd+0?`{wW@InmPef=N)(_g_b?j$gdHr_|rU||JX z8M1Fvh;^{+^Ym9$iF{cPRp{8TM;R77Xy%r`O50#ESv^>kSYP->b!>!~wUxh)l$=k% z5%opF11)RAdnwdde9p1S+c6lWi(Em7UH;@6OiCl1YA9Ap)<64X^&90U`>0KrwU zZHHzq2Tm$fhdKWQD)9^G{Q@#vPHg!>1{SKs@W1{7?hh2^I2UP1)H-yZK((0ftNRd7 zQUfTu*-A_$oEX{k%eNkQ!%#Z|>JHkVospLB6rZ8(&PJWrAxu^?%1I~_jM2-&A|BVv z!A6yL&4Wx2t@|$YH@Ss+?L;E;CFwW!0os$YrDl`T4Gt?r-6z@$!n4LlwKRPrF~z+T z<)2avxq`_$O;GpzkY%8~?<0n+<%0v=lI!*(wOM%Vv-{wtE=G=LCpn&YCR|(5aS3e3+Y#p#HuXS5vKb!Iaqsrc9WDgy4~$XsCKWf}r{m0s+{vEH-SwqJVLZj`e#E zc}r!IywrwsiBk>svxb9>-pcPq3#RkUZCOMd21LE0p?nG3+TQdyjJ3?+;RgjKIDDtH zo)78e8>0(2nn^dEnmLvB2M3uyT{~y2H6@;ooK>uP^UbVb0Ns#f!%DNS^jzXu+7o*hGIr5mrb~jK><53*OL- zT$FH*zV9Q>(0IWub_oP}LCd_#lcVf*eS$1;QZG@vD09_-F2PW~mJPcNj0R1s7l0Q3 zFb@QF_J;=}5_3IRj2ry^Utr|VRRlLMJVuNgFzWy}hc2&|k-dlZT3Oy z+eQ$8Rhbg&bqhky1gNmiSP$|kYY)ad=TEEdO-z%t!b+LTb1Z5L1jkvp%UK)O_+bmU3 z@0sA-JG4}wsAoSx4Hv`~gTv|Ke=y*9Ng#WfqZV1X9;nw|-H%r>#$kN!B{#3$`kMK! zZVhfqz|#D(t=9iL$iH7kB<}z?mSUC}gZM~_VFD(+NDU+v!a(DPBv41hFbBmxc=xPS zv>_sNc1eUzl~{an*Y5)zwF;rryAnF3iKT0J(tS`+^2qh~Nv;nX9OQA8%`f`kTpZu}h80prV=7tg@>-x9 zTO(o*R5TX#aIu0Gd-Y)ry92|Y=5)D{15;cR<10)2KR$NMVT1j28xL1R6v&JL1?OTl zTf$w&v*9jba59?Be>@r3=MepKE?O&LQoLBVxM{2h3la&6INp#b9f&|B0l2;ga6N^H zO`A4M*%Pa0a5&!(svLj2Y-us;@yW;7=rokQP!LPP*xRB+z;EDDh$fRS5Jc6Yli~5hM5t?yPlMyYey7Ol?7?FomuYJT&Vi9Q))Xoi5hRnM`8l3@(pdwMujKR z3N%GRmmj2M67@P~Z=Y5U{c0hC0|0Tr0WUBe%Ml&FQsN&W2g;Oz<`85vMb>-?`jCq7 zb@1qZB#LtD&mTQyZ86Kw_SylHx3@gC^n~?{idDU+k$sD7-S~M_0xj9Hi&?eRm|0mq zhf>UEx4S0}65U(8tDnDFQ}Ows{ej_FBTYw_3>S(Z+-sg2VF#GSx+cozUxeCRRma}9 zW!^F^>)x^D&L59o)!6kx)GjEe4$`Vw%(S{ihP}t*P7Cp$r^=5T(KqnUd2qSg%+n0& z)ckkvuXP&ip8eu>aU8^hsu5g;0j5?UO);K2>^NVl@semKvDS3L&FL_Y_J^nshqalU z76{n`5V}3CO)yWVTg-kV1%{r$umD1Mi_+J(z!ojvXU0pw1w&a`5K}$xECRnE@@T_} zK7#qph`|ynVMt!jaD&mRqM)m$;P>Ss&?o=eqt2)dUb2LfT>BhIxN7Dv6L z*_bN&cmxDcAh8AkRl0Yeri^SQeH=?Z@D2~YVKvEPFv_!9pZDIO7d=irMqsGX6HXJ) z82vs#zaG(N-rN5M<34egffKlu92j0eoyOGWei{OMLt19K+G1^ri%?+Nb#Fo!`@K?> zZMU!2rNeZqS$^Sxs5LSr$Z(XY1%4vgc~>FSG;|8KkGTXl?)p}39DxW7lj_#qJzwuE z9u9X^Z12_KKc)XB1x3qBkesfWL_`iokl(m+{^DUQe6|;f;HG-dk@KxEHXggrs2E_P zgq`P7shaV9sQxODe-vD@Sd{FKeWCr^lMeE$6b%zYyCxG9F`=;I+4rj-@1H#f_=h!q zUr~dZ-rne{hnY1@3)f^vL>BWr28e3%HA8Rl`{uo^K)^Zpr191W14olERLfFOmyBg{m`r(T7`+qc(?0AnA2J$&TolUiCgExF@(5v!IQ zkJAk$&jm-YomqS2(Y}xzCz0SRW1U{Q&uNf{`G)=avx;b2DINnS@>@x+=plg{@7aeN zn#a_@-umvxjbG%>2NWhcc%e`EVpqHrG%3WaaX4M=ZEiBO*O}t#n0n2}JZp;?Z|A6i zC~!~9?=FS-UNBBAt>I2pVw-}jG!h9>L$P;=cDw;WV3Oq@g|uDh}o;gb>aoKmb`egr0=1D@>7!?peN~clP%32{KXLxa-~p%szB$6}u{# z&)UK?AG+FDI6`)%N1Eo0;Ps`*SoqK80mw?o?1B8B53^k>5!H>CsO}u(Mq+Uj0vaT2 zCRom4?U#Y+zIm{$z#p*|h9V9U}txy?k!N1M92RYAXh+PYmm(K2&d5 zO;sW>a_9wM`O+`w7C|#^j4b8CDj9t0luC&}!h`V^tMnG@R_Gf?T+ay7>T1e)CCn!3 zPbZt}*)H)jSJPWO^?tu?RLy=snRyCiKSuNS>dm+NoQ(phO;QV%XBy1I=OQOPo85#2eNMg<=T zXevZKQ;-Y4d6pGnQzFM(wVd|qy_IIusp{nJ(ciigkHE^rD0O7VpWvLv1LUS*%f?4RCS?EAqu@s_*OBoc%b)F6P0U26HPpDS&q64WA7F` z9hbS|@+owr;a}@fgp)>{{#bhx_0U}{*CMFnR8O5)VvcmkwRpvO=k6O{l#1p7 z$`g-2D1#x>u{2b7h(XAm=NbQ*eQ#kq4lFTkm69T+5Q z-}Qo^zGYRl)|lDBlA}eGFwWTp4%?et9ky&+S)o6z+NRHI^c7OWo9^kWrwpuQfN8hd zI}U^tn09He37K+mL)fC;<|Db`;Ui*UqXr}m-ERdjmP70iuVxqe%7+le;w>E!Z?IDg z2_Pe)dweNCV;y`ry$5k}AgUrZq_)|DOX7Ss{mrpBtaZSI12grAXz~lgItFbt;np!2 z#{b>Z!FSehUiCHQa2K!;=#}e3UrPr<^DifBw3rcN-X^s*Y0=rVA2(V?m%6XMkwIGI zegbxl&GPfAR;lxRB6_E1N9+;g%nx~o;PZ`f9O6JTs5@!nd;SA@YMRBenFqG{A7wLG z_mMs|d{+k;F4v7<|Ct2)V#I+zZjA&HJhy-KXujh32&kNn?-{==92GdC+1~s|<~EsA z_h|ApxXJU3P%FE-g*8{E)jWK|gE=+)U?Zs}QGF0vD)Wui3p<4s-yD2ix^|CShe66c-aP|v7Y#hYcz*f+uE&hQW2DK+El0cm5 zfk}bHI>7!!K#!Q8Ziw6UjSvad2A%9pA;|MkdE#93P5dG%M0VaDSjyvUzGOy%A=>6$ z0vM~wtMdYGn)9wO_<2o3-h{))*$2rm$T~?dMGlk|b#oI^s*Y|^ilUE4GrF?|Xws8A z*t=P!R)9A(11^75uJ;jZ)R{z}ZBD9(o37rtJ$hdy*s%Pm-ll>j_D4dxPAbxhR}HT< z%geY9(tK+*Yl`(Av1+AMCx9j&pN)f(FW?wE4>;#{Kz-2UTu>*WzJG^G5%f4Gh$d@Y z4h;MnTZN}3E06uon$sDxb#>@yJ`z87G^_WarAG7&1kUM+vlko&)0N7dxaX-wtUOW3 z!mFiM-l1%xASuV`c~|?vTDX|)b|XCy#cjP|UT^kMe=hs!4s%Beq4e*WP^C$<=_&V; zoOY$fik%HVeRVrP@CN>G2;NokLxU^IdnX!)O#APUd_<>@9cOnn+30$wx|6Z!>OjtK zTzi;Yw8=eH@I@;yw#vECzIyl$V7gO%NHJj(leA*ouiDx5v-oH3^~7-LjD#>st9=yg^&Uc_V} z@#)Oz8%dF(!c0*5a&XV>a zt$ZnWequxH&ZEg<$10gj4A*+Bj7ZFif1g3f6Z}SUrkjGUwOx+ih$Ra_AZSsd!&~F29Xcky3S=SAR0zshrDt zGk@`6)#!ahi?x{XDNGO=lOXBd^EUy&nga1^i=xQLcY759JhzdFD>CTvn|AMT7SkBg-3)I+x zqVQ0T$)Y~gpzEVT{qU;cmDJc`ZTUW`+8(nBO8J~G0n>WEO5tkUa4L7aaM2nykqd^( zr)7eh^fzn24zy^zM2ixr-?Zp=xqDNwi+oZem_{O2m8U0j>}PBm*o&V&=r50^hohAJA`hVXU?ZnE*^~^CKZt_Btgmi(WT5JsQn8&6`~5OuYDg_oLUHArO#x8{V2wm1 zFVS@Vk9zg#8t}z6UO!OoZEH_Bmw6Kr#(4bUJTf=Nb16Gz8t!bj9| z?b-bwfDR4qe8>eY9|WCqVWi=%;t>@l>#jh}Cq}iks=Ehf7m9|Bc6MugbUX1_qAqjtFLZvy(uo^$wc8a~nEVxPeCJctJb9&IxkmHJ9n5IM&I49a>Wh?)Nl%K>X%+0N7g{3*s&de5-! z%(yux8hp{uU7zja+~VqWP`FP;Y09Gyb5RY-uOitL{qqK~&qvcPILfrqE46tqM41G3 zK!aW+iZfYf$Srx^p#rr6ob;4nI`xh&L=LX zVJOe=gL7O)jSG0u^NUU?{Z>S%CRFGPljn5qiv&%T^vHkyTL?aw7%`#Xxd4aRbF>4I zX=M_b_Fo3ZzW{)%Y8p+x=qgwI6U>v0NZ%@*P+EPW+VlyOVrTOP0Unps!Ne!Xw|S*z z1U)Kgf+c}u(n-g+u6@b*iQTl+!3ZWRAICRelVy5`uy3+e&suf5U3(x?E7IOYE!s(8 z1y}C;=dce~5&~1rxoy*@tDQKA=bNX}rsw`gp5LE(seW_zR7mv3^-kU2Ln+RL zxness$RBCaU{6_KHVsO1t!cv4q!PJdJ0l~zdbz|47Z83>0}fy6bmARW+ynAGFnzyQ9` zKR2ltjXpHea_1jnXGH3iZwT$RC8S-b*R5&7g|)a$l(Bj#*0cHjMzEm3sC+85TzdoI zPSv#w_wKP{PSzf{d8)ZuB-48f~~?KJ}Wh zvVr_-mV`zG;``?+g z$(yD#ZaNyo7W(vhgSuwuxflC+(!u5DG-dUpE>j^TEMK$-!jY^wpJ<+{zPl*zxdy(r z_U3_wlyaAC6#1c?CTmFOum(a&J_+n}Lq`IsHiN%)xH>U1tNUQEA=I`j94-WoR|1Z2 zWHCq0Pa4s|9Iwb~Y25AhUjI9HOeB|`QcG`^+8PJmRQF!=LYWeApt7Xo6Lnp552DGY zCAdUVTRl`-{!XCjGl=H9{QnN4QxNKLo>K+uICVn(OJ=cf(|(1N;PK@oNP8d=O%HOh z+;A50C*FtyA?=hJCyMb5mkcFAG^TUhucvGl6Fev-+2m0m4wJ9JFI&_%5wL~$A4I?f+v&}SPS`;) zp7$2USVGjg(HoN|n=E#bXR1Q~G=BxT>`zFi`Lcf*j&~Ixz`63n{0JU{QADFv$qi?# ze)8(4`n_cRR6Snhq1BP=H2Bb`7mEYi_CVH0{S?#k2lU&l^zMfhy`Sty*}u8lqRLOQ z9-XwJo11Nc@<~DwL_ZT#h`KysAJwk0$$Y&rXMQ3E*Bua~3R!c-!z{&lims{3)vp&; z13;TQoXxIG$Ao)L>CpA;YPu0YsO!c20k#rxSRF3)&>g}8^7y+D=1fxgznrVR3sIb7 zh%hmg2$Pvazek15tl>QlI5i{OP*Fm*dxA?4sbgCjs+pp~jph!~RPX}Xi}8_$yu5gQ z`InIT^d$th?BRzuY{qRiwkysl?}}8jGsFEFFujGqOU}ohXz3K>HQAMZDqi()@OuFn zm)22fU*bnuH+iPW8cln$=$9O%0$uBI2N(=J=@B-0Bn;xMn-KV_h}2MN(U%9Q5t0Wb zha+JotD>C%txOLmTE>NCY}NT2kdhf#xBl-gN(ddz68_4;h(1z3gww+fO=b}{P(1Qk z&kM^Qme{i5vCUPstbQGs)0=r!vlDpaYmMT)L77SxGb&uGDf~!r6SX2O&6cW7znPBp z;6^58oXraQ!q7M58b1Rc;O63JYe@C3b)ye{#=fwY+XrX}CSyccvEAP-1Y$t>L&65h zRck2%F+8DBHKKbE8gG@*_)O)VtPxPc}su!_+*so2#s`RI&r`h#MsYpmW-^;v+0dDhJiwi~s9nA5MGg+hNP zJRDHJg&<;;cyf$z*H06N0y=&Rgj}4ROd?0-&P~0ur z)nP@5OZ&m?Ii5qXm8nN+DBC3}{=Z#Z^r!VVJ37X25t~BCol{+-$ZzF~huUC|sx?HM zbWh)$o_Iid!gj8lKdG?DW+C>MVi8s@e%0si!&SqkoJd5G6=$d=;R@40#3K4~-kN(C zKHvqnK4jgg=AUCUK-tYjy<7ZgDAjcnr1zRFEav+n`r{=~XB*F*w^F)j4#hPj^jTkMRUD~w@USe*dj_5m)}4Zd7;--ccxHrYm$ZYdz}46(0M-CT$}^b zV}k$O^8tgBX#wU%_a3HY2%oVQ&PS5E-_k7vwIo412**fTm0#kt~cO&jBqQiIVi zb@GhAblIs7wIritgu{6WYU$;VrSZyyIuywj12b#fJ+->RhfG|K5AhT=J+so%!@>gE zjP1JFyGZgz=;No0{h3>lnmdu%iDRR_UaDAjOkxv=jDY%%Cp~2#KL`!ejdYz5*^Y~F zOiNkKk=fhtm?M@%Lsni-2{*GL?n{w_A^miy)+>O`I0h|K0+Yiaef_wRs{Z%-a*mi0 zo*#S$E79Ecks2>;#)lXb|fUA2J9rlcINr? z2WB9te{o>X^DR7GAiU$CDdP08G&>Kj(uhBW=D0qbKRH&Cnh}zAvBN>+9MEcT#l17G zT}#|{5t(XPqT{Fq9^q(s&ItO6gVzTglX15Ir_u2=_ol6cQFhJY6r5{#IHqdfPd_(;Kf^C52UWttOH-hGpFY9uCs^#NFYY^F?5*cnF?at5l zaHMTYSVByWm~Owqp5vlhb@f0h)`+T4LFb%8kH)FbF@)`Ho3u7Q0Gnbb*cAJf zqCtH8oD1|px;fWz+tE*uyzt68#)X37G9*FjFA)ZRXj`~~gc=4U35l8R6PPpwo_Plp z+{cUt>Pt%M5}^ii-iHMtL}%?J_!}fEvjW+J)zNtUz&dCpUY{3y)o2`gOnhNn_qk1q zhSF*wL*l4E`;c^h`FHb#=@hiZ7Qg*u#-K zZ{0m1bFA6p_wmIyA$NfZW42{L#sDfk@H7{RcjJp}*4p*2Xir6C=f&+a&^p_`pK zwuC(^O|vu4?5A=r_KMNlWY@4JV?CZftjw_7)QAykm-pqOeedZD&2D>jR548xs@R_* zhA4w;E5|=GCs~UUmQ*K1j62)y7%89{q~h8$6rnod@m{30>|mFqBKaaj1!9c!kriV| z=7qR$hP6R{E%ZGl3s{1=h6QkUb3M>^f9&8{HjKq%VV~YtX;4ycVT zP#awWWm5x4w&i)OPvKcY3mlJ$v$Hold29)+bJ3iuc0<5YPp~s`5^VQ9or=|)JQ?6t zl0AIOv&le~j^!UUDn;Yzk*OYZ{!rE+0aM&PK}vSsVCF`F7L1({pUJ7zOKBOuDf$Sf zv+UGIr&%YN^yePG??Wn9Ce7b^-`HX>Q?UBK+*3CAxyeh(lNhp}(}%Ndd+XCd4bEd! z+l>w$SGzSx{2f)}k~-y_7Z(4-YG$Ht4#!nzMlYOA;|$~mP0}dqcbi75>+y_h1#Hv zX$Y}bO6x!{m*)F?ik=2Y^9y!0P{cF%yEA$gc5+r?LFr(m`bp1D zAKZ9a(Le%nNki{innymA(5Goqd$VjueT$kv*SQ-T^Jsk;t}#sZl(W)rYUra-~6>S=82`5HG&!{Auc-s|D?CJpIzR?*uam37t!680F zZaD=2f%boAbNUQGAbik1uCD|DL1JJ{GsQ8I*O%S}?ku|BcjO1f@K*;(BO*e{lHr5o z4V7Pt)!8(=9YgA>HK9r<0b&K9W{L;(?*ER@GmyT`C8nka{QNyL64L{`Ilk`py467=t3LVj?+q@9NO1+p z>EYSQ@uB<>(qeaU)?s`fH$8U*f12x7y}W${pZ-8!sQPYjx1f`+1sy%b-mQL23}`3W zsb$c-;PzI6ma8zoL#3eTJ-`zQFJjFkrp*8J=UO(vLp$y2Zn*8?^)2vBPlC)YDaFAp z!l*M~0E&QZHVqp#6cR8fY*o7|=}>-Rt8);RTFhHdL{<9F?e9%XOiL}|tRp60q~{me zH4-0tan4|MM6~=quqv%L(OxdxgJu3estz||(vI0^y*LA`F(MWg*CoPY1+;0HgdO*U zA_Qcb;8duj?s+44!kDqzMo?Wrh<`LHDU?1s20HLdY(}(Hbf1_qB{knQUjXq)tWsL0 z1<5cpWlN;Xd$63cjnEf=TMW&a3N0Je6-Pk7=Ve}x=r(~`Y3B-s5S_YGXbh*!28@{y zX?;c_7o`g&+XC7PNCo)d+VTS4_@{w{RlYWbmFuBJp^@9hb!wjsCr&3$bB6}EpC;2+ zI$cF2)|_AP78m{a!04>`Z{og~$<2P#$Wm-*cM_)6CBihz8V(4z`T_PJB$$9(oXxEy zQlJ(bySS!Lw?K~G63aP>UneduHuFJBg-?p*qNLa6XaqoD@=*r#WhaT{Xqx1vNXDhR z1f6>l!ef;i1~)}CH{akVjwXyYI#l!BNff(T%;U%eP61buy^M&E{56sE91BiOb#x zt`E3$n6l6$iIFt~s2bX=bODe9VeXhT$A9q;PW}i}b{rT_-@e|Jl=awe7H$ytvOLrF~o$#&)7zi;_!mEz=j$9#C9AB2@;7KXyV<$fmBD%8*FlmdFF@P;Ofc z^w8DoAn9iPo18lY4csOj0@Byc<>(1`Y{D*fcT~+Ah~LJf!RVQP@B#Mwh2) zwHp$q3Q?)yc-qgDpu`i2y*{HR8trEiZ?MIqn3|zKX9ema{7>9Cd=;6v9$!)dH8?=e z06Ew|BJRGfg{Vbb9mNT#W{;R^V2!ibH17uDs_P!y06+nQ!K9;7(pDZl0_4=~k6sQf z1yIkef^wUINeIAXWV1>AZqShN=UZ<>T=JjJ6#K_9T7Un^oFyO}Zl-~&`Tz8qc~^G= zWOpBymkgT!Z@=y6Mo={8%8ezPPX616s`(2*{~UII0q9R?^nVjTaX4w#OfA5_#EE~g z8(5D23{rmq=q~{Ma{&l8)L#_z_r}0KW2k?WmVdF>UljBgi~V0|;4iECPo(Q#0Qw6+ z|EN*^E1&#DL4Q%ue}!KD(YE=Eg8tVjsOH0hM^1?yAqN6@NhIi(H=?JXE;|+wW3ncV zzK()U>-8Cc4*R_1n%HlZRW_2KhykRSj{peuD%wE8mK?Yy1 zcGDwzoZ$-dAhwRMU=C^5?6!_f7hGfjO)mioU7`KIe2ilc4TQ3^$+(POdTeS@tMeKR z&5ZJd_sOg71WcWzqTheFRj^@2^bD+y{sN)B`zK;;XH4gf^WlRvZ_oOCvxShxJQJim zeCCrqXW@hSC7m$xLh_NN#ycxotJKzq)*E3JpSEM?L~b9q0{(-J?P^>YbD(n6M4tF8 z3yNG#+1ERmnIsy@?->URZ|VT$+o_Y^3j1F4jCYru;Y1^Z{t@HC-F{wrd8Ns-$As z^yJ&=5@B+M{nU5mX5Wr?O!neyI8015W&@yCeQ#<+6Mq*c<3J*`TVW$m0rfgVRCg~~ zZ0B@hodE6W+1X&^<9iyCr88Sfkih~I-*aHxz*i7NCjpHVGAMyV-@X-Q5>UlM86;SJ zoB+Y_q^;qF88c|Uonj#u>Nv|!?*v`T;^@@uH)^@&Pz%uU8wn@OVx;<51vags{!q?$ zBZ)$SIPYd9o+(vo2)zp7&*-G}!zI0Qe@e$-p@ypPgNYxsV1Et#{>*%J5b{9b0F}Xp zaua~{R`@X_J>vp=?cdH64O1Au)-gy$m%_nHcg0%4dm;7UqX9@g`ZN4mTp|)xGdBO} z4UB=51HIYL3aO6Ui{_bjTak#78a#9fpM5_SN3O~xurif}b2H}PbsV{Y&%BYz^;I%3 zOqWwZ^g-K*G8p&ObGc^Jm4Ha36DiKQg9ngi}3=VfUaG3qwK^) zPi5nBa{n9TWC;L(Bz@;Xm|yJ$xr@9|G!^zM)5&c^Cz$fO5|o9;7;h;m0<|C_a$d2LSf{ z3$d^VQ(WP82>M54EurT;u8sT!=;#l`{fF9+@8E%j+FwF|*LSROdzggr@+ikyHVfKCLePsGx5o!!te;B)KxdD zY7;^mkiBR_#LIu};4>rjD**(YDHGW3(4x2TELe91 z2KdmXQ_OZFom0Dph)BroomA}1F(X#4;XPlJ$j+ki`deLG&_YvzKS?1*vt8frl^Mc| zv!h|ILTEQ#3s@RDKUpTwS}vzuV+!>|-hhb@FKS^wptz$&8(El{4b=)(13p0j-7&~F zh0o^!smopjx%xGWBYP1Zh*=f{^<1)TP{(rw20$!6jFd8kPG>-+XrJPWeTcB1wyjfv zuW;`?>yby}Mn3YA5rzTvyY?SIPe;C+PP8)rk>Z;*ZX|3}%hs2{4LQU7!=b?il^zYv z%<=&iX`j^^;`Hqkt?Ne-uIpPq*%hBio^~zqnR<0awDOU3NClHl1^J>1-@LW4aXUQp z3Mxtmkkz!=AoQ(#2ceUC@nIVPv?0PA-!jcJT2tK1SMSMw3y+DX{{R@i%(g^COgy$f z9a7KM->;P?YGHMdlA=bUU!S&i12LYL!FUpHgKjr2f2lG>yfWas+ulrr_dyYwsa$o* zWZ4K9>WNfUjV_$ds)OMYix01p5ltj9)ElyhiiYNwjx`Kjaep?aGwJ8FLKvxU4dB!Y z_Ha=Ifr6~%ezAc73o??Sdel{19w_Sp8wN6ZC>S>Mg(E4$l&7PJoPr&nJ_nH>#(;pt znR00vTgU^pLGzugrQXID2q}%VFaZdA5^7+arkY?UC&$B+=8SR@yfLJ%;Z@P?GX;|; zxULroQ_Zr1R$omuQ3O;+Eg9aQRmDo(%8yToQQh3ZQ?>)xS}$FTTaM*SGL|%u$H{tB zfpekjtl>3{w|yXStpVSw?N#amlkr=ik<-3@PX!E*I0S|O;d>8~0g%BNIONlY`+S(a zfM_4r6>u7f1_n&aEpnXuP3N+0I@vsHwcf0RAs~h zX>qe#V0s ztr#J8KUxMga6lyw-N^lJI)vuEv>HvHZxud#UXvZV^Uj4dp7?z!9LXT16?|C8~o&ooaAn@S~wbBX!r zjKt#b@gu}%_WToCzIw8YcRRq)jZ6c~b}4Du{gc=fnWM=oW#%olI?7+zCv>+7%)D+U zsvIjLVlR*359Ium{W+L&h8rFdr~eWyql=dt_E$ga8l`nuZS!Iaspv|%$t#Okp%zD| zKR$bQK}~*kO;^F@CDO8sH}8$AtWULo?`U4Knw{&}kbyjomgeaCNW-uHc!<}8NAQWo z>PTr0YO1$G0shg+cWslBnYa2{rc|hrsSoQs{Nvu(wC?Ph4FQ+5{ zJa%)@mffl7f}rl!{YAZ#uFE%ES4~}45K$D=KFznrbZl_l`jarc)NaV(Pa%<8t z>!duM{}5&2FPpp}5xZr_k?P{Hn|#&v)6+W5If)5BIT3$aYk?IeH4kB)$S_O>g$Igm zY{A6Q=F*))xTpu^c^^J3oenERfcbgx&G8e%#pe!%YYtIXRqa|3m7V548!q<_&U#X3 zb(EA0N$wgZ(WrOfJUFT`0`FM}yxjoll|NyScf2MDL@Ot?;c!#)q1eo`DMJB1uBM-q z|Brv3QBBX0x|tIrCG$#QI0L7as!_$=*7sAqvMv>ysDI4mXU+CfThaKYzTezad_}oF z_tNrqSB39lzijSlE?$w@7IQ9EfTmx;d~j+9uEa}ptlM}YiCOPN2wr4Z=8Zzz+2t6Xx9s$7L%JA{19hs!*g z1JB+T%0M+!le8(^s&*NyC}nm0{Il%h*YOrFLQ`Zq1si6EU6zu0wqUZ6;3g$_{;63f zL;uLsL~Qdqtq);&&1AN4>sqPI@qEsZyNOdp&z1-DWACRPN5+f|cQ+q*ur>|fecaMo zOIa&+g{Dg2jStMuQ$zlS0QSYZYKU9Q04U`t8aUO~fW1;KS5(P=PYww{4w@Ra1mynu zKt}p{jh29h7YnXoUfTGpB9w{T)XDvbl~nX+`1Fbi_o}kAY_Wy~t)VUA-749|r1rDT%e znWWgwVv4hksL-iVe)Ho48iL`t;vV-CKGLcm<1kPkpXUUY7UqRoe1uZ{lj+2N|!DmVGn-(P0g0aQxF_ ziDTtM0jj;HN||Xy|3@9$r2SUxYTO3cumP?i5d>%8qLpyD5K}LCxZM4N$R!Gb<^4@% z=0!MxNV|-15P}&EwujHI=2fyBJ;0Jk`DYox(gt9+Q2dia`q|t5K#X)_Sm-P8w zq$^kJRosFwgL}PRtZTm2os%7ZBQ-T)rFH>OS-0HV3@y8?Gp~qhHsKS8REx~dp)%H2 zOqI;bczTho0L<=XO4D)I6|)5RpU0U0g;?D#yjM z5)`ZLZfyu2Qldr9&}LU*UyJh=o^0QvmV5qMHg1z|qv0&)mkm?H)rwQrO)AbSDCoM3 zn>G$)o+(|z+uWxm(rs}6MTlA|6_YW)aR=P28i-OJ20;me0iQZ>!Xsm4%MmenNKBOI z3-7ncyjr}Pz5ICQN)4HLj056(GT-Eo=bZq$O)KEtHUf670jYw(O#$vk02P7WaRfns z!uMiyrhoYTy)FWz&PAoRJ=2HQ4mjthm=sp-2KnJ-AqwG(c+BPlO*X`I^)sJbDu(Xt zxYwR%&CFC4(rAV3wF2Ar3xU*&!(`sAb8}>0g)lRIh*i=ZA5<6$1NjjBdH!U|T&~%Q ztyYoTk&Q9t?btC_ugQ0vJ#)+jjtin*miaG4Kpra<%B}Z?#Y%@1$gB6B1~Ku3ne`r^ zKOtt0zSJkAlt( zbzeOOYVF1R)6ZPjr|7152;&(hBgrNg7nS_z(ms1~PrHgy<4d*PMP}bGZ3umjdeHrL z}9s8WC2S&c^Yt~p&uwwETkg&(tZ$se<`q9bb%~Y;+ zK6$qZ`r@i-FD+X-(N*cRp7Q3`nMT;XQp$~SB?uMYhZ8sd%AnrY{%urYZ6P3}EU@Xd zg2iezF+G|cT3@wuH31$PY?L=e$iM};R*xPS9Nu7rwDs1tA~LvH{B*O=)d_`DK>)Dq zrj6aen3Zz(u7Rd*~^@f%QnZIxVj+1!Mo%xB_Kv|o(uX;P>Vt74wgbv z`@+DBboMP~&dPY(Rfb8`FXXxl%k|6HU6C)JDy5gSU;fRx&B=c>t@-l7W&+#!hvB;B zLf5YL;Y~5$m1abpVRp$iUXL@j>F+T9G@c#{)`m`JQwo7KKl50R+pm7NYfdVDjO!=c z&Kh$1RNhjJvyt{YUbM^-P&lpt`?Anl>_dj1zmvVZ0Yocja1$Ct>p6f3XTx=j_A385 zGP{-od52D{Gy(G71_iL8$zMft^p7Cvu59IBRgsqEtcGyPR$B)3jb(bY#dV;PU73-! zaZ)m&i+8UBft4Qf%0dl<^A>5n{q3h-d5^k1X^QZguJya%1IE>Xq6AHcgfIg~40|HK za*;MI2|IH0>Et+v%MBMc$UnEQbR`_ZG{ve}*B{#LTcsZP_|Or;wyCj_;WGx@8=6-W zbwwA47Hr+$Pf-^{36R;FyM&D zv}VYl}rQCb)T%EJqzgbCb*a17I?OA(>L?TzRnRlENi- zFd&HQbbbU8=MUxviQr$L@oC%b*FZTxHklm@t? zV`q=At=#gt#2Bi=M~sE4>H4)h&8W3B_Tx|d9de-j9irRLG-o^5lnl0bHx)g8MWmP8 zr3RIL$PVxGKOmLfG;UD@G#)O#?!+Mt)9tI>;iM4_idDN1F@ap*mGk)3711Gpz>%ds!1m}Ot5>pZU3*U_ZAV#&|r5~}{9-k9%jXM0rU8-^%Pf5%%jx&Ad1aZQtq zFe50vM)di>WcEtgw@cU2AScAtZffKKJ&vX=uc7tBmz14-Zq@bkh&+dm#~BNz%ps_R z=xfFwxWlGtgxhRQjCcw$z@-+(Jc)QUY~(&wDIx;MrFWCMcoFR(Owj7u6@Y;Ln^1Q_ z9U$V1slSh^OLoD{ZlSRwTR`sti?(9w3!Nmg%^!m-^Wxkt5x4y9yUx~&V?o?t#aNDo z=8|4B!7gyj4$INpj{FcaFdtX|! zbwwoT@e3aAX?FNk)Hkv%SFP~D&MvPMlULN7*dDi{z?hP1_)@)I@{x<$oHrr1hu7Ne z%|b{x{aJNmu=*rssucjwlhpMTO_R9~j+7vz$Gg?N_AfpS!4gL~me>d7_L z>ZQF#a`>Y6y#+Q}-|A!|r8jFRuOX~@vot8K1)CfJ5h1r5$T3y3zi3KMLhl>!$x#vG zX4f)6@=8%;8D$jQmH5al9j0r$e7VpgC1l%wQG61Tx#DK(xOm`y;AVIQH>bq7iLDl@ z)29k8;+jkQ+e?$=ys7@4cU1Cm#cawa{ieRiYP1v~k#nEH+mnZhyNo}{+A>v4qN_53 zXM)N2hwq(eEaxZ-Tl98E=d2RHPF(5l-*=G@6u$+-qnQft(TFqUhc9Xfl3qD zGMBm9eY&Eo<@!m1%2Ct2F~Bf=17^$F;{X9AOvYYd4w(R>KDTI!TFc#HMV+V6RPGeF zJcJdohO%?L7{!zyuC@E`>E>0@wUu|udeg#Dgr6*0%2 zshJiPS{7#}&T|Zt{1ycne)X|M8MxLWM}lcWX3c2-Ip z0=Gwdfmdh3dVh9{qo_4U7c1#RKnP@tn>IoSS|J42ip`lZLv>v;%HqCy%g*gSEItMv zF6r9FJ2BPoDRmF}s{VVueJ3CU#b$6cfp(AJCUu;cJe+i#rKD3~=8!f$_9ynkKv_2D z@4xG4!RyxfMNK>6>+dJ}agv9SZ!&IX5t$ANXOylZ8N0sV^C&I%u;vb$LDG$Zo7sjI z$lZxU%?h>>98`4z=`nZAD)*@Q*X;UlV7&CJPL#{erbt^K@u;H-2@h-J+(Z4J?+?28 zn(g&-GW1l0yVa;JC3zy*F)AE6nQkx(n7&`kJz~Ol; zCIxM+plSk*3XVS(7vh-T67Gx92WrS+VVwB?dZc%0io3z4Q0R9j&>+8(Z(p>)ZbQFG zC3X3F6xgzJj!;D*MONLU^EWf-EB2Di%o!SbdhU+NsT940`M&PYKK@Ri3&!n4^4MD{ z1*HgPU>N#!=e;n_li8Lr*XS^+#E<*uNq2-EuiTyD+6olI#^u-VmsVlN29P z)ZA_#k_PDq&6E^;;v>0KjV>t}09M1$Uqd5?P*5!)9&?@vcn?E3+LI3gq?z6H*&C<_ z5#S^2g4c<>EaYScK~bi4Jj!MPt=JBj;S|H^Kt1uQiXZc#9T)C1rvcxxkn|bqv8AA! z50EZhHE?83`YB`As0s8HP@n~muJ~A`9 z97Bu?ZcwAAKhHHJJ?>ueHLt(pl7sD7TlckXeDN3j5>{cA)Kj^VS1H`Geiq*J#XSF( zuzdlw_sg@3lRUG$V)Ku`#+As0iFi8$%Kx?;0Pp2Rv{-5S@x6kQOKzE=0Xadmw3O15 zrb;?*V5F)`oA&`@X(clVXakYiXrG%UqYR)@V~r=^2a0ocNb$Fdx!llI65V>4=f-#o z8_1J(^!1VfK!J()sW&#G+CX$?w(`m@Qo9TL^KGZL_Exra3@?eT7i9P`^OGeVQ2cWlufne6HH~j=jx7r&f>O zslj0c**Qu!VaCqs`{{lyoNj|lnqxjTiAbfloii;Z>S46MGGaXZO#&NDAQv`;R|>z) z*JabAgb_DQ2)gB;Jdw92^$w1D>MoYD1`c+2k3V`#aI%`iXH&JhLd!xaIu%zlR8})u zRq`XO*&(Q!HsM`3MR{`vOnwst%r&ur+)zRPRniXZ4{n+~-z(W>XD}FRtD)32y!wgn z^;<#7J+tIxGNnf{pN)`^{JuQ2?tdE^>?!F0IOBY{QDQFye39AwSR?2m29k>lTo;?d zp;k`pf&A$*D%$h!!3$$;ClM0m3ZLZKW~Y;@=5T(i3*6|HYoTx>Cf*lehOHD@AGG5} zDi&(yPIf?QxiUUevNJ*(OZ$x^kPb?)G50Qn<(g%^xLG-q(=GU(-;GZ+&WZcV+k@>@ zqED8k&0d@PSwlxKqCrEg*FW)N{k!N@$V?qaZ*qhN)&*!$__*whFZ;=(ql!43yzM-j zoWu%910{1# z{D`LVg2ol2bp+?@%ymoaog3KnR$R&_LsE4?cFhvXK=A9RtS`4Mz5D^)N$TE~-qzOy z&BRQ?A%CyPL$}vGSg~z9xtF+P1fiOV&Ehafik+EurK+nF@HMY~2KO<1KZLYFH(|xL z&)Egu)$`LUEK4h%0^ka8;d}8vd|MU1A8^=L(m?J@KPU%2)H3%!#XQY?Xau_(aAW#` z6*?DY#)nuB#sJdQe5Ix6%38eJUv{qWGuR8Lo+|KuTejyowL5ayUcC*qw>{tP-Q=_N z0(VD}P4kgH*|3Zkc~)mX36ZQKb$#=laUYiT#p*Rdx&m{YuHd<@XD+i|)*E?{QFe}Y z>ahFu-(rpYxVkxPH*zlFi8o?yu&B2@F+Pr0j)3phNjeeZv7+<5(o@yTQOwh=sYYAk zb6~Qmp!~$dEzE2lCOdPwvDD)K7;PYrKKfHzYHW)cGv?Wu6#}QFNQ3_gInVbBeD>|9 z@IVj<*?9^0>;SR1UyJMw5bcGQVt)$`OJh~hN_r!Fb3C-I%r$=rHKm}ISaaoFJF!*H z-<{ZP?-3G&)ft@WW3v|cZ&w_Yo#IbvV}bH2>g@Pbl{8!9dw916=dz(>R&_% zevn9kMO;^g*yYb{9O&~tHI>nA5;P~b?SS{)1G4|zR|ua0EKS-cnu5@SF5{>aS`K$_} z5Ik-G86~Z1FaEfe<#Ib|5THOHD$>jd%#6v3l6Jp-ef-xVG$~tB znAXRgh!$)3U8@w{D>M^TY3Qo>W;{zhl&JFb%!4z=vHh%rHuPC}dXsi;z*H`Y^xa{z zt5GEL3YYa72VVk-9%v~6|F=}ef08}jWivnbqy*#rJvo(dviyuZdZPbOq0%~}l+chh zKW5k#`~Y_BZvCTrqvFRDU|mP1P)t&s5gzr}W);8SI2idVVk19CAEx7AT%iefaKEX9 z+e21?ZthU*04%Ne+3-^M-r)k7T0qMV-iM;tYruHvK=z)odqNDWSpWW0Aja(mwE_?T mRc1L94>j#f|DZ8}`;zok5xY;|OSG4OpC#(d@q*tkNBjpMavfd( literal 0 HcmV?d00001 diff --git a/app/templates/corpora/corpora.html.j2 b/app/templates/corpora/corpora.html.j2 index ee184a48..1a8766ab 100644 --- a/app/templates/corpora/corpora.html.j2 +++ b/app/templates/corpora/corpora.html.j2 @@ -1,12 +1,28 @@ {% extends "base.html.j2" %} {% block page_content %} +

      + +
      -
      -

      {{ title }}

      -
      -
      diff --git a/app/templates/main/news.html.j2 b/app/templates/main/news.html.j2 index cab57fa7..b7204f07 100644 --- a/app/templates/main/news.html.j2 +++ b/app/templates/main/news.html.j2 @@ -9,6 +9,8 @@
      +
      +
      April 2022 update @@ -126,3 +128,33 @@
      {% endblock page_content %} + +{% block scripts %} +{{ super() }} + +{% endblock scripts %} From 65c907a990f96283af8d52e51bc5906a95a20f8c Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Wed, 7 Dec 2022 14:12:30 +0100 Subject: [PATCH 13/64] Add search functionality to public corpora page --- app/templates/corpora/corpora.html.j2 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/templates/corpora/corpora.html.j2 b/app/templates/corpora/corpora.html.j2 index 1a8766ab..8cc701f8 100644 --- a/app/templates/corpora/corpora.html.j2 +++ b/app/templates/corpora/corpora.html.j2 @@ -9,12 +9,10 @@

      ICorpora

      -
      -
      - search - -
      -
      +
      + search + +
      @@ -38,7 +36,9 @@ {% block scripts %} {{ super() }} {% endblock scripts %} From 69152f5e6af3e93bb39787455002fb7c5fe98b47 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Mon, 12 Dec 2022 13:18:22 +0100 Subject: [PATCH 14/64] Remove PublicCorporaList.js --- .../js/RessourceLists/PublicCorporaList.js | 70 ------------------- app/static/js/RessourceLists/RessourceList.js | 1 - app/templates/_scripts.html.j2 | 1 - 3 files changed, 72 deletions(-) delete mode 100644 app/static/js/RessourceLists/PublicCorporaList.js diff --git a/app/static/js/RessourceLists/PublicCorporaList.js b/app/static/js/RessourceLists/PublicCorporaList.js deleted file mode 100644 index 2171396e..00000000 --- a/app/static/js/RessourceLists/PublicCorporaList.js +++ /dev/null @@ -1,70 +0,0 @@ -class PublicCorporaList extends RessourceList { - static instances = []; - - static getInstance(elem) { - return PublicCorporaList.instances.find((instance) => { - return instance.listjs.list === elem; - }); - } - - static autoInit() { - for (let publicCorporaListElement of document.querySelectorAll('.public-corpora-list:not(.no-autoinit)')) { - new PublicCorporaList(publicCorporaListElement); - } - } - - static options = { - initialHtmlGenerator: (id) => { - return ` -
      - search - - -
      - - - - - - - - - - -
      TitleDescription
      -
        - `.trim(); - }, - item: ` - -
        book - - - - `.trim(), - ressourceMapper: (corpus) => { - return { - 'id': corpus.id, - 'creation-date': corpus.creation_date, - 'description': corpus.description, - 'title': corpus.title - }; - }, - sortArgs: ['creation-date', {order: 'desc'}], - valueNames: [ - {data: ['id']}, - {data: ['creation-date']}, - 'description', - 'title' - ] - }; - - constructor(listElement, options = {}) { - super(listElement, {...PublicCorporaList.options, ...options}); - PublicCorporaList.instances.push(this); - } - - init(user) { - this._init(user.corpora.is_public); - } -} diff --git a/app/static/js/RessourceLists/RessourceList.js b/app/static/js/RessourceLists/RessourceList.js index 5af7a231..871a1e2f 100644 --- a/app/static/js/RessourceLists/RessourceList.js +++ b/app/static/js/RessourceLists/RessourceList.js @@ -10,7 +10,6 @@ class RessourceList { JobList.autoInit(); JobInputList.autoInit(); JobResultList.autoInit(); - PublicCorporaList.autoInit(); SpaCyNLPPipelineModelList.autoInit(); TesseractOCRPipelineModelList.autoInit(); UserList.autoInit(); diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2 index 8ff90c33..7cc8a8f8 100644 --- a/app/templates/_scripts.html.j2 +++ b/app/templates/_scripts.html.j2 @@ -24,7 +24,6 @@ 'js/RessourceLists/JobList.js', 'js/RessourceLists/JobInputList.js', 'js/RessourceLists/JobResultList.js', - 'js/RessourceLists/PublicCorporaList.js', 'js/RessourceLists/SpacyNLPPipelineModelList.js', 'js/RessourceLists/TesseractOCRPipelineModelList.js', 'js/RessourceLists/UserList.js' From a413b41dfd54aac163b6dbc771b5864fa9305206 Mon Sep 17 00:00:00 2001 From: Patrick Jentsch Date: Mon, 12 Dec 2022 15:37:33 +0100 Subject: [PATCH 15/64] Update News page --- app/static/js/RessourceLists/RessourceList.js | 4 +- app/static/js/XMLtoObject.js | 102 ++++++++++++++ app/templates/_scripts.html.j2 | 5 +- app/templates/corpora/corpora.html.j2 | 62 ++++++--- app/templates/main/news.html.j2 | 129 +++++++++++++++--- 5 files changed, 260 insertions(+), 42 deletions(-) create mode 100644 app/static/js/XMLtoObject.js diff --git a/app/static/js/RessourceLists/RessourceList.js b/app/static/js/RessourceLists/RessourceList.js index 871a1e2f..323f9d0e 100644 --- a/app/static/js/RessourceLists/RessourceList.js +++ b/app/static/js/RessourceLists/RessourceList.js @@ -30,11 +30,11 @@ class RessourceList { ...{pagination: {item: `
      • `}}, ...options } - if ('ressourceMapper' in options) { + if ('ressourceMapper' in options && typeof options.ressourceMapper === 'function') { this.ressourceMapper = options.ressourceMapper; delete options.ressourceMapper; } - if ('initialHtmlGenerator' in options) { + if ('initialHtmlGenerator' in options && typeof options.initialHtmlGenerator === 'function') { this.initialHtmlGenerator = options.initialHtmlGenerator; listElement.innerHTML = this.initialHtmlGenerator(listElement.id); delete options.initialHtmlGenerator; diff --git a/app/static/js/XMLtoObject.js b/app/static/js/XMLtoObject.js new file mode 100644 index 00000000..001376cb --- /dev/null +++ b/app/static/js/XMLtoObject.js @@ -0,0 +1,102 @@ +/** + * XMLtoObject - Converts XML into a JavaScript value or object. + * GitHub: https://github.com/Pevtrick/XMLtoObject + * by Patrick Jentsch: https://github.com/Pevtrick + */ + +/** + * The XMLDocument.toObject() method converts the XMLDocument into a JavaScript value or object. + * @param {String} [attributePrefix=] - A Prefix, which is added to all properties generated by XML attributes. + * @returns {Object} - The converted result. + */ + XMLDocument.prototype.toObject = function(attributePrefix='') { + let obj = {}; + + obj[this.documentElement.nodeName] = this.documentElement.toObject(attributePrefix); + + return obj; +}; + +/** +* The Node.toObject() method converts the Node into a JavaScript value or object. +* @param {String} [attributePrefix=] - A Prefix, which is added to all properties generated by XML attributes. +* @returns {Object|String|null} - The converted result. +*/ +Node.prototype.toObject = function(attributePrefix='') { + let obj = null; + + switch (this.nodeType) { + case Node.ELEMENT_NODE: + let hasAttributes = this.attributes.length > 0; + let hasChildNodes = this.childNodes.length > 0; + + /* Stop conversion if the Node doesn't contain any attributes or child nodes */ + if (!(hasAttributes || hasChildNodes)) { + break; + } + + obj = {}; + + /* Convert attributes */ + for (let attribute of this.attributes) { + obj[`attributePrefix${attribute.name}`] = attribute.value; + } + + /* Convert child nodes */ + for (let childNode of this.childNodes) { + switch (childNode.nodeType) { + case Node.ELEMENT_NODE: + break; + case Node.TEXT_NODE: + /* Check whether the child text node is the only child of the current node. */ + if (!hasAttributes && this.childNodes.length === 1) { + obj = childNode.toObject(attributePrefix); + continue; + } + if (childNode.data.trim() === '') {continue;} + break; + default: + /* This recursion leads to a console message. */ + childNode.toObject(attributePrefix); + continue; + } + /** + * If the child node is the first of its type in this childset, + * process it and add it directly as a property to the return object. + * If not add it to an array which is set as a property of the return object. + */ + if (childNode.nodeName in obj) { + if (!Array.isArray(obj[childNode.nodeName])) { + obj[childNode.nodeName] = [obj[childNode.nodeName]]; + } + obj[childNode.nodeName].push(childNode.toObject(attributePrefix)); + } else { + obj[childNode.nodeName] = childNode.toObject(attributePrefix); + } + } + break; + case Node.TEXT_NODE: + if (this.data.trim() !== '') {obj = this.data;} + break; + case Node.COMMENT_NODE: + console.log('Skipping comment node:'); + console.log(node); + break; + case Node.DOCUMENT_NODE: + obj = {}; + obj[this.documentElement.nodeName] = this.documentElement.toObject(attributePrefix); + break; + default: + /** + * The following node types are not processed because they don't offer data, which has to be stored in the object: + * Node.PROCESSING_INSTRUCTION_NODE, Node.DOCUMENT_TYPE_NODE, Node.DOCUMENT_FRAGMENT_NODE + * The following node types are deprecated and therefore not supported by this function: + * Node.ATTRIBUTE_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE + */ + console.log(`Node type: '${this.nodeType}' is not supported.`); + console.log(node); + break; + } + + return obj; +} diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2 index 7cc8a8f8..24d24d97 100644 --- a/app/templates/_scripts.html.j2 +++ b/app/templates/_scripts.html.j2 @@ -26,7 +26,8 @@ 'js/RessourceLists/JobResultList.js', 'js/RessourceLists/SpacyNLPPipelineModelList.js', 'js/RessourceLists/TesseractOCRPipelineModelList.js', - 'js/RessourceLists/UserList.js' + 'js/RessourceLists/UserList.js', + 'js/XMLtoObject.js' %} {%- endassets %} @@ -52,7 +53,7 @@ // Initialize components M.AutoInit(); - M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"], input[data-length][type="email"], input[data-length][type="search"], input[data-length][type="password"], input[data-length][type="tel"], input[data-length][type="url"], textarea[data-length]')); + M.CharacterCounter.init(document.querySelectorAll('input[data-length], textarea[data-length]')); M.Dropdown.init( document.querySelectorAll('#nav-more-dropdown-trigger'), {alignment: 'right', constrainWidth: false, coverTrigger: false} diff --git a/app/templates/corpora/corpora.html.j2 b/app/templates/corpora/corpora.html.j2 index 8cc701f8..9be377f3 100644 --- a/app/templates/corpora/corpora.html.j2 +++ b/app/templates/corpora/corpora.html.j2 @@ -1,30 +1,46 @@ {% extends "base.html.j2" %} +{% block main_attribs %} class="service-scheme" data-service="corpus-analysis"{% endblock main_attribs %} + {% block page_content %} -
        -
        -
        -
        -
        -

        ICorpora

        -
        -
        -
        - search - +
        +
        +
        +
        +
        +
        +

        ICorpora

        +
        +
        +
        + search + + +
        -
        -
        -
        +
        + + + + + + + + + + +
        Title and DescriptionStatus
        +
          +
          @@ -36,9 +52,21 @@ {% block scripts %} {{ super() }} {% endblock scripts %} diff --git a/app/templates/main/news.html.j2 b/app/templates/main/news.html.j2 index b7204f07..c374237c 100644 --- a/app/templates/main/news.html.j2 +++ b/app/templates/main/news.html.j2 @@ -9,7 +9,7 @@
          -
          +
          @@ -132,29 +132,116 @@ {% block scripts %} {{ super() }} {% endblock scripts %} From 61a6ddd4be227df5a7cbc3de560b9138b205222e Mon Sep 17 00:00:00 2001 From: Inga Kirschnick Date: Tue, 13 Dec 2022 15:01:04 +0100 Subject: [PATCH 16/64] Privacy settings for profile pages --- app/__init__.py | 3 - app/api/schemas.py | 2 +- app/models.py | 40 +- app/profile/forms.py | 45 +- app/profile/routes.py | 83 +++- app/services/forms.py | 8 +- app/services/routes.py | 2 +- app/settings/forms.py | 12 - app/settings/routes.py | 14 +- .../SpacyNLPPipelineModelList.js | 14 +- .../TesseractOCRPipelineModelList.js | 14 +- app/static/js/Utils.js | 8 +- app/templates/_sidenav.html.j2 | 3 +- app/templates/profile/edit_profile.html.j2 | 188 +++++++- app/templates/profile/profile_page.html.j2 | 185 ++++--- .../services/tesseract_ocr_pipeline.html.j2 | 2 +- app/templates/settings/settings.html.j2 | 18 - .../test/analyse_corpus.concordance.html.j2 | 117 ----- app/templates/test/analyse_corpus.html.j2 | 454 ------------------ app/test/__init__.py | 5 - app/test/routes.py | 10 - migrations/versions/5b2a6e590166_.py | 35 ++ 22 files changed, 476 insertions(+), 786 deletions(-) delete mode 100644 app/templates/test/analyse_corpus.concordance.html.j2 delete mode 100644 app/templates/test/analyse_corpus.html.j2 delete mode 100644 app/test/__init__.py delete mode 100644 app/test/routes.py create mode 100644 migrations/versions/5b2a6e590166_.py diff --git a/app/__init__.py b/app/__init__.py index 960d4e90..77742800 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -90,7 +90,4 @@ def create_app(config: Config = Config) -> Flask: from .users import bp as users_blueprint app.register_blueprint(users_blueprint, url_prefix='/users') - from .test import bp as test_blueprint - app.register_blueprint(test_blueprint, url_prefix='/test') - return app diff --git a/app/api/schemas.py b/app/api/schemas.py index 7abb56de..f0792f7c 100644 --- a/app/api/schemas.py +++ b/app/api/schemas.py @@ -66,7 +66,7 @@ class TesseractOCRPipelineModelSchema(ma.SQLAlchemySchema): publishing_year = ma.Int( required=True ) - shared = ma.Boolean(required=True) + is_public = ma.Boolean(required=True) class JobSchema(ma.SQLAlchemySchema): diff --git a/app/models.py b/app/models.py index 7927c81f..d28331a0 100644 --- a/app/models.py +++ b/app/models.py @@ -61,6 +61,12 @@ class UserSettingJobStatusMailNotificationLevel(IntEnum): NONE = 1 END = 2 ALL = 3 + + +class ProfilePrivacySettings(IntEnum): + SHOW_EMAIL = 1 + SHOW_LAST_SEEN = 2 + SHOW_MEMBER_SINCE = 4 # endregion enums @@ -220,7 +226,6 @@ class Role(HashidMixin, db.Model): db.session.add(role) db.session.commit() - class Token(db.Model): __tablename__ = 'tokens' # Primary key @@ -255,12 +260,20 @@ class Avatar(HashidMixin, FileMixin, db.Model): def path(self): return os.path.join(self.user.path, 'avatar') + def delete(self): + try: + os.remove(self.path) + except OSError as e: + current_app.logger.error(e) + db.session.delete(self) + class User(HashidMixin, UserMixin, db.Model): __tablename__ = 'users' # Primary key id = db.Column(db.Integer, primary_key=True) # Foreign keys role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) + # privacy_id = db.Column(db.Integer, db.ForeignKey('privacies.id')) # Fields email = db.Column(db.String(254), index=True, unique=True) username = db.Column(db.String(64), index=True, unique=True) @@ -277,6 +290,8 @@ class User(HashidMixin, UserMixin, db.Model): location = db.Column(db.String(64)) website = db.Column(db.String(128)) organization = db.Column(db.String(128)) + is_public = db.Column(db.Boolean, default=False) + profile_privacy_settings = db.Column(db.Integer(), default=0) # Backrefs: role: Role # Relationships avatar = db.relationship( @@ -502,6 +517,22 @@ class User(HashidMixin, UserMixin, db.Model): return False return check_password_hash(self.password_hash, password) + #region Profile Privacy settings + def has_profile_privacy_setting(self, setting): + return self.profile_privacy_settings & setting == setting + + def add_profile_privacy_setting(self, setting): + if not self.has_profile_privacy_setting(setting): + self.profile_privacy_settings += setting + + def remove_profile_privacy_setting(self, setting): + if self.has_profile_privacy_setting(setting): + self.profile_privacy_settings -= setting + + def reset_profile_privacy_settings(self): + self.profile_privacy_settings = 0 + #endregion Profile Privacy settings + def to_json_serializeable(self, backrefs=False, relationships=False): json_serializeable = { 'id': self.hashid, @@ -519,7 +550,12 @@ class User(HashidMixin, UserMixin, db.Model): 'location': self.location, 'organization': self.organization, 'job_status_mail_notification_level': \ - self.setting_job_status_mail_notification_level.name + self.setting_job_status_mail_notification_level.name, + 'is_public': self.is_public, + 'show_email': self.has_profile_privacy_setting(ProfilePrivacySettings.SHOW_EMAIL), + 'show_last_seen': self.has_profile_privacy_setting(ProfilePrivacySettings.SHOW_LAST_SEEN), + 'show_member_since': self.has_profile_privacy_setting(ProfilePrivacySettings.SHOW_MEMBER_SINCE) + } if backrefs: json_serializeable['role'] = \ diff --git a/app/profile/forms.py b/app/profile/forms.py index 20bd4ad4..50594519 100644 --- a/app/profile/forms.py +++ b/app/profile/forms.py @@ -1,5 +1,6 @@ from flask_wtf import FlaskForm from wtforms import ( + BooleanField, FileField, StringField, SubmitField, @@ -16,9 +17,6 @@ from app.models import User from app.auth import USERNAME_REGEX class EditProfileSettingsForm(FlaskForm): - avatar = FileField( - 'Image File' - ) email = StringField( 'E-Mail', validators=[InputRequired(), Length(max=254), Email()] @@ -37,6 +35,26 @@ class EditProfileSettingsForm(FlaskForm): ) ] ) + submit = SubmitField() + + def __init__(self, user, *args, **kwargs): + super().__init__(*args, **kwargs) + self.user = user + + def validate_email(self, field): + if (field.data != self.user.email + and User.query.filter_by(email=field.data).first()): + raise ValidationError('Email already registered') + + def validate_username(self, field): + if (field.data != self.user.username + and User.query.filter_by(username=field.data).first()): + raise ValidationError('Username already in use') + +class EditPublicProfileInformationForm(FlaskForm): + avatar = FileField( + 'Image File' + ) full_name = StringField( 'Full name', validators=[Length(max=128)] @@ -68,20 +86,13 @@ class EditProfileSettingsForm(FlaskForm): submit = SubmitField() - def __init__(self, user, *args, **kwargs): - super().__init__(*args, **kwargs) - self.user = user - - def validate_email(self, field): - if (field.data != self.user.email - and User.query.filter_by(email=field.data).first()): - raise ValidationError('Email already registered') - - def validate_username(self, field): - if (field.data != self.user.username - and User.query.filter_by(username=field.data).first()): - raise ValidationError('Username already in use') - def validate_image_file(self, field): if not field.data.filename.lower().endswith('.jpg' or '.png' or '.jpeg'): raise ValidationError('only .jpg, .png and .jpeg!') + +class EditPrivacySettingsForm(FlaskForm): + is_public = BooleanField('Public profile') + show_email = BooleanField('Show email') + show_last_seen = BooleanField('Show last seen') + show_member_since = BooleanField('Show member since') + submit = SubmitField() diff --git a/app/profile/routes.py b/app/profile/routes.py index 4702dcb7..b4711aa5 100644 --- a/app/profile/routes.py +++ b/app/profile/routes.py @@ -1,5 +1,6 @@ from flask import ( abort, + current_app, flash, Markup, redirect, @@ -8,12 +9,15 @@ from flask import ( url_for ) from flask_login import current_user, login_required +from threading import Thread import os from app import db -from app.models import Avatar, User +from app.models import Avatar, ProfilePrivacySettings, User from . import bp from .forms import ( - EditProfileSettingsForm + EditPrivacySettingsForm, + EditProfileSettingsForm, + EditPublicProfileInformationForm ) @bp.before_request @@ -25,8 +29,12 @@ def before_request(): @bp.route('/') def profile(user_id): user = User.query.get_or_404(user_id) + user_data = user.to_json_serializeable() + if not user.is_public and user != current_user: + abort(403) return render_template('profile/profile_page.html.j2', - user=user) + user=user, + user_data=user_data) @bp.route('//avatars/') def avatar_download(user_id, avatar_id): @@ -41,6 +49,21 @@ def avatar_download(user_id, avatar_id): mimetype=avatar_file.mimetype ) +@bp.route('//avatars/', methods=['DELETE']) +def delete_avatar(avatar_id, user_id): + def _delete_avatar(app, avatar_id): + with app.app_context(): + avatar_file = Avatar.query.get(avatar_id) + print(avatar_file) + avatar_file.delete() + db.session.commit() + thread = Thread( + target=_delete_avatar, + args=(current_app._get_current_object(), avatar_id) + ) + thread.start() + return {}, 202 + @bp.route('//edit-profile', methods=['GET', 'POST']) def edit_profile(user_id): user = User.query.get_or_404(user_id) @@ -49,24 +72,58 @@ def edit_profile(user_id): data=current_user.to_json_serializeable(), prefix='edit-profile-settings-form' ) + edit_privacy_settings_form = EditPrivacySettingsForm( + data=current_user.to_json_serializeable(), + prefix='edit-privacy-settings-form' + ) + edit_public_profile_information_form = EditPublicProfileInformationForm( + data=current_user.to_json_serializeable(), + prefix='edit-public-profile-information-form' + ) + if edit_profile_settings_form.validate_on_submit(): - if edit_profile_settings_form.avatar.data: - try: - Avatar.create(edit_profile_settings_form.avatar.data, user=current_user) - except (AttributeError, OSError): - abort(500) current_user.email = edit_profile_settings_form.email.data current_user.username = edit_profile_settings_form.username.data - current_user.about_me = edit_profile_settings_form.about_me.data - current_user.location = edit_profile_settings_form.location.data - current_user.organization = edit_profile_settings_form.organization.data - current_user.website = edit_profile_settings_form.website.data - current_user.full_name = edit_profile_settings_form.full_name.data + db.session.commit() + message = Markup(f'Profile settings updated') + flash(message, 'success') + return redirect(url_for('.profile', user_id=user.id)) + if (edit_privacy_settings_form.submit.data + and edit_privacy_settings_form.validate()): + current_user.is_public = edit_privacy_settings_form.is_public.data + if edit_privacy_settings_form.show_email.data: + current_user.add_profile_privacy_setting(ProfilePrivacySettings.SHOW_EMAIL) + else: + current_user.remove_profile_privacy_setting(ProfilePrivacySettings.SHOW_EMAIL) + if edit_privacy_settings_form.show_last_seen.data: + current_user.add_profile_privacy_setting(ProfilePrivacySettings.SHOW_LAST_SEEN) + else: + current_user.remove_profile_privacy_setting(ProfilePrivacySettings.SHOW_LAST_SEEN) + if edit_privacy_settings_form.show_member_since.data: + current_user.add_profile_privacy_setting(ProfilePrivacySettings.SHOW_MEMBER_SINCE) + else: + current_user.remove_profile_privacy_setting(ProfilePrivacySettings.SHOW_MEMBER_SINCE) + db.session.commit() + flash('Your changes have been saved') + return redirect(url_for('.profile', user_id=user.id)) + if edit_public_profile_information_form.validate_on_submit(): + if edit_public_profile_information_form.avatar.data: + try: + Avatar.create(edit_public_profile_information_form.avatar.data, user=current_user) + except (AttributeError, OSError): + abort(500) + current_user.about_me = edit_public_profile_information_form.about_me.data + current_user.location = edit_public_profile_information_form.location.data + current_user.organization = edit_public_profile_information_form.organization.data + current_user.website = edit_public_profile_information_form.website.data + current_user.full_name = edit_public_profile_information_form.full_name.data db.session.commit() message = Markup(f'Profile settings updated') flash(message, 'success') return redirect(url_for('.profile', user_id=user.id)) return render_template('profile/edit_profile.html.j2', edit_profile_settings_form=edit_profile_settings_form, + edit_privacy_settings_form=edit_privacy_settings_form, + edit_public_profile_information_form=edit_public_profile_information_form, user=user, title='Edit Profile') diff --git a/app/services/forms.py b/app/services/forms.py index 562696eb..1ad544dc 100644 --- a/app/services/forms.py +++ b/app/services/forms.py @@ -73,11 +73,11 @@ class CreateTesseractOCRPipelineJobForm(CreateJobBaseForm): if 'methods' in service_info: if 'binarization' in service_info['methods']: del self.binarization.render_kw['disabled'] - if 'ocropus_nlbin_threshold' in service_info['methods']: - del self.ocropus_nlbin_threshold.render_kw['disabled'] + if 'ocropus_nlbin_threshold' in service_info['methods']: + del self.ocropus_nlbin_threshold.render_kw['disabled'] models = [ x for x in TesseractOCRPipelineModel.query.order_by(TesseractOCRPipelineModel.title).all() - if version in x.compatible_service_versions and (x.shared == True or x.user == current_user) + if version in x.compatible_service_versions and (x.is_public == True or x.user == current_user) ] self.model.choices = [('', 'Choose your option')] self.model.choices += [(x.hashid, f'{x.title} [{x.version}]') for x in models] @@ -157,7 +157,7 @@ class CreateSpacyNLPPipelineJobForm(CreateJobBaseForm): del self.encoding_detection.render_kw['disabled'] models = [ x for x in SpaCyNLPPipelineModel.query.order_by(SpaCyNLPPipelineModel.title).all() - if version in x.compatible_service_versions and (x.shared == True or x.user == current_user) + if version in x.compatible_service_versions and (x.is_public == True or x.user == current_user) ] self.model.choices = [('', 'Choose your option')] self.model.choices += [(x.hashid, f'{x.title} [{x.version}]') for x in models] diff --git a/app/services/routes.py b/app/services/routes.py index 7748240c..24688c88 100644 --- a/app/services/routes.py +++ b/app/services/routes.py @@ -98,7 +98,7 @@ def tesseract_ocr_pipeline(): return {}, 201, {'Location': job.url} tesseract_ocr_pipeline_models = [ x for x in TesseractOCRPipelineModel.query.all() - if version in x.compatible_service_versions and (x.shared == True or x.user == current_user) + if version in x.compatible_service_versions and (x.is_public == True or x.user == current_user) ] return render_template( 'services/tesseract_ocr_pipeline.html.j2', diff --git a/app/settings/forms.py b/app/settings/forms.py index 335f73d3..55279927 100644 --- a/app/settings/forms.py +++ b/app/settings/forms.py @@ -62,15 +62,3 @@ class EditNotificationSettingsForm(FlaskForm): for x in UserSettingJobStatusMailNotificationLevel ] -class EditPrivacySettingsForm(FlaskForm): - private_profile = BooleanField( - 'Private profile' - ) - private_email = BooleanField( - 'Private email' - ) - only_username = BooleanField( - 'Show only username' - ) - - submit = SubmitField() diff --git a/app/settings/routes.py b/app/settings/routes.py index d7e36218..754a98cd 100644 --- a/app/settings/routes.py +++ b/app/settings/routes.py @@ -1,12 +1,11 @@ -from flask import flash, redirect, render_template, url_for +from flask import abort, flash, redirect, render_template, url_for from flask_login import current_user, login_required from app import db -from app.models import UserSettingJobStatusMailNotificationLevel +from app.models import ProfilePrivacySettings, UserSettingJobStatusMailNotificationLevel from . import bp from .forms import ( ChangePasswordForm, - EditNotificationSettingsForm, - EditPrivacySettingsForm + EditNotificationSettingsForm ) @@ -21,17 +20,13 @@ def settings(): data=current_user.to_json_serializeable(), prefix='edit-notification-settings-form' ) - edit_privacy_settings_form = EditPrivacySettingsForm( - data=current_user.to_json_serializeable(), - prefix='edit-privacy-settings-form' - ) if change_password_form.submit.data and change_password_form.validate(): current_user.password = change_password_form.new_password.data db.session.commit() flash('Your changes have been saved') return redirect(url_for('.index')) - if (edit_notification_settings_form.submit.data + if (edit_notification_settings_form.submit and edit_notification_settings_form.validate()): current_user.setting_job_status_mail_notification_level = ( UserSettingJobStatusMailNotificationLevel[ @@ -45,6 +40,5 @@ def settings(): 'settings/settings.html.j2', change_password_form=change_password_form, edit_notification_settings_form=edit_notification_settings_form, - edit_privacy_settings_form=edit_privacy_settings_form, title='Settings' ) diff --git a/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js b/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js index 78693c91..d03c79eb 100644 --- a/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js +++ b/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js @@ -34,9 +34,9 @@ class SpaCyNLPPipelineModelList extends RessourceList {
          @@ -59,7 +59,7 @@ class SpaCyNLPPipelineModelList extends RessourceList { 'title': spaCyNLPPipelineModel.title, 'title-2': spaCyNLPPipelineModel.title, 'version': spaCyNLPPipelineModel.version, - 'shared': spaCyNLPPipelineModel.shared ? 'True' : 'False' + 'is_public': spaCyNLPPipelineModel.is_public ? 'True' : 'False' }; }, sortArgs: ['creation-date', {order: 'desc'}], @@ -75,7 +75,7 @@ class SpaCyNLPPipelineModelList extends RessourceList { 'title', 'title-2', 'version', - {name: 'shared', attr: 'data-checked'} + {name: 'is_public', attr: 'data-checked'} ] }; @@ -87,7 +87,7 @@ class SpaCyNLPPipelineModelList extends RessourceList { init(user) { this._init(user.spacy_nlp_pipeline_models); if (user.role.name !== ('Administrator' || 'Contributor')) { - for (let switchElement of this.listjs.list.querySelectorAll('.shared')) { + for (let switchElement of this.listjs.list.querySelectorAll('.is_public')) { switchElement.setAttribute('disabled', ''); } } @@ -134,8 +134,8 @@ class SpaCyNLPPipelineModelList extends RessourceList { let spaCyNLPPipelineModelId = spaCyNLPPipelineModelElement.dataset.id; switch (action) { case 'share-request': { - let shared = actionSwitchElement.querySelector('input').checked; - Utils.shareSpaCyNLPPipelineModelRequest(this.userId, spaCyNLPPipelineModelId, shared); + let is_public = actionSwitchElement.querySelector('input').checked; + Utils.shareSpaCyNLPPipelineModelRequest(this.userId, spaCyNLPPipelineModelId, is_public); break; } default: { diff --git a/app/static/js/RessourceLists/TesseractOCRPipelineModelList.js b/app/static/js/RessourceLists/TesseractOCRPipelineModelList.js index 22c4bc37..d299af1b 100644 --- a/app/static/js/RessourceLists/TesseractOCRPipelineModelList.js +++ b/app/static/js/RessourceLists/TesseractOCRPipelineModelList.js @@ -34,9 +34,9 @@ class TesseractOCRPipelineModelList extends RessourceList {
          @@ -59,7 +59,7 @@ class TesseractOCRPipelineModelList extends RessourceList { 'title': tesseractOCRPipelineModel.title, 'title-2': tesseractOCRPipelineModel.title, 'version': tesseractOCRPipelineModel.version, - 'shared': tesseractOCRPipelineModel.shared ? 'True' : 'False' + 'is_public': tesseractOCRPipelineModel.is_public ? 'True' : 'False' }; }, sortArgs: ['creation-date', {order: 'desc'}], @@ -75,7 +75,7 @@ class TesseractOCRPipelineModelList extends RessourceList { 'title', 'title-2', 'version', - {name: 'shared', attr: 'data-checked'} + {name: 'is_public', attr: 'data-checked'} ] }; @@ -87,7 +87,7 @@ class TesseractOCRPipelineModelList extends RessourceList { init (user) { this._init(user.tesseract_ocr_pipeline_models); if (user.role.name !== ('Administrator' || 'Contributor')) { - for (let switchElement of this.listjs.list.querySelectorAll('.shared')) { + for (let switchElement of this.listjs.list.querySelectorAll('.is_public')) { switchElement.setAttribute('disabled', ''); } } @@ -134,8 +134,8 @@ class TesseractOCRPipelineModelList extends RessourceList { let tesseractOCRPipelineModelId = tesseractOCRPipelineModelElement.dataset.id; switch (action) { case 'share-request': { - let shared = actionSwitchElement.querySelector('input').checked; - Utils.shareTesseractOCRPipelineModelRequest(this.userId, tesseractOCRPipelineModelId, shared); + let is_public = actionSwitchElement.querySelector('input').checked; + Utils.shareTesseractOCRPipelineModelRequest(this.userId, tesseractOCRPipelineModelId, is_public); break; } default: { diff --git a/app/static/js/Utils.js b/app/static/js/Utils.js index ea8b1efc..899147b4 100644 --- a/app/static/js/Utils.js +++ b/app/static/js/Utils.js @@ -429,11 +429,11 @@ class Utils { }); } - static shareTesseractOCRPipelineModelRequest(userId, tesseractOCRPipelineModelId, shared) { + static shareTesseractOCRPipelineModelRequest(userId, tesseractOCRPipelineModelId, is_public) { return new Promise((resolve, reject) => { let tesseractOCRPipelineModel = app.data.users[userId].tesseract_ocr_pipeline_models[tesseractOCRPipelineModelId]; let msg = ''; - if (shared) { + if (is_public) { msg = `Model "${tesseractOCRPipelineModel.title}" is now public`; } else { msg = `Model "${tesseractOCRPipelineModel.title}" is now private`; @@ -453,11 +453,11 @@ class Utils { }); } - static shareSpaCyNLPPipelineModelRequest(userId, spaCyNLPPipelineModelId, shared) { + static shareSpaCyNLPPipelineModelRequest(userId, spaCyNLPPipelineModelId, is_public) { return new Promise((resolve, reject) => { let spaCyNLPPipelineModel = app.data.users[userId].spacy_nlp_pipeline_models[spaCyNLPPipelineModelId]; let msg = ''; - if (shared) { + if (is_public) { msg = `Model "${spaCyNLPPipelineModel.title}" is now public`; } else { msg = `Model "${spaCyNLPPipelineModel.title}" is now private`; diff --git a/app/templates/_sidenav.html.j2 b/app/templates/_sidenav.html.j2 index 1aff7f89..ffdf86a6 100644 --- a/app/templates/_sidenav.html.j2 +++ b/app/templates/_sidenav.html.j2 @@ -33,7 +33,8 @@
        • Corpus analysis
        • Account
        • -
        • settingsSettings
        • +
        • settingsGeneral Settings
        • +
        • contact_pageProfile settings
        • Log out
        • {% if current_user.can(Permission.ADMINISTRATE) or current_user.can(Permission.USE_API) %}
        • diff --git a/app/templates/profile/edit_profile.html.j2 b/app/templates/profile/edit_profile.html.j2 index 1f4bd0e7..7b1dbef7 100644 --- a/app/templates/profile/edit_profile.html.j2 +++ b/app/templates/profile/edit_profile.html.j2 @@ -9,37 +9,15 @@
          +
          - {{ edit_profile_settings_form.hidden_tag() }}
          -
          -
          -
          -
          - {% if current_user.avatar %} - user-image - {% else %} - user-image - {% endif %} -
          -
          -
          -
          -
          - {{wtf.render_field(edit_profile_settings_form.avatar, accept='image/jpeg, image/png, image/gif', placeholder="Choose an image file")}} -
          -
          -
          -
          +
          + {{ edit_profile_settings_form.hidden_tag() }} {{ wtf.render_field(edit_profile_settings_form.username, material_icon='person') }} {{ wtf.render_field(edit_profile_settings_form.email, material_icon='email') }} - {{ wtf.render_field(edit_profile_settings_form.full_name, material_icon='badge') }} - {{ wtf.render_field(edit_profile_settings_form.about_me, material_icon='description') }} - {{ wtf.render_field(edit_profile_settings_form.website, material_icon='laptop') }} - {{ wtf.render_field(edit_profile_settings_form.organization, material_icon='business') }} - {{ wtf.render_field(edit_profile_settings_form.location, material_icon='location_on') }}
          @@ -50,7 +28,167 @@
          + +
          + {{ edit_privacy_settings_form.hidden_tag() }} +
          +
          + Privacy settings +
          + {{ wtf.render_field(edit_privacy_settings_form.is_public, id='public-profile') }} +
          +
          +
          + {{ wtf.render_field(edit_privacy_settings_form.show_email, data_action='disable', disabled=true) }} +
          + {{ wtf.render_field(edit_privacy_settings_form.show_last_seen, data_action='disable', disabled=true) }} +
          + {{ wtf.render_field(edit_privacy_settings_form.show_member_since, data_action='disable', disabled=true) }} +
          +
          +
          +
          + {{ wtf.render_field(edit_privacy_settings_form.submit, material_icon='send') }} +
          +
          +
          +
          + +
          +
          +
          + {{ edit_public_profile_information_form.hidden_tag() }} +
          +
          + Public Profile +
          +
          +
          +
          +
          +
          +
          + {% if current_user.avatar %} + user-image + {% else %} + user-image + {% endif %} +
          +
          +
          +
          +
          +
          + delete +
          +
          +
          + {{wtf.render_field(edit_public_profile_information_form.avatar, accept='image/jpeg, image/png, image/gif', placeholder='Choose an image file', id='avatar-upload', data_action='disable')}} +
          +
          +
          +
          +

          +
          + {{ wtf.render_field(edit_public_profile_information_form.full_name, material_icon='badge') }} + {{ wtf.render_field(edit_public_profile_information_form.about_me, material_icon='description') }} + {{ wtf.render_field(edit_public_profile_information_form.website, material_icon='laptop') }} + {{ wtf.render_field(edit_public_profile_information_form.organization, material_icon='business') }} + {{ wtf.render_field(edit_public_profile_information_form.location, material_icon='location_on') }} +
          +
          +
          +
          +
          + {{ wtf.render_field(edit_public_profile_information_form.submit, material_icon='send') }} +
          +
          +
          +
          +
          {% endblock page_content %} + +{% block modals %} + +{% endblock modals %} + +{% block scripts %} +{{ super() }} + +{% endblock scripts %} diff --git a/app/templates/profile/profile_page.html.j2 b/app/templates/profile/profile_page.html.j2 index dbcd78ca..be137392 100644 --- a/app/templates/profile/profile_page.html.j2 +++ b/app/templates/profile/profile_page.html.j2 @@ -2,96 +2,133 @@ {% import "materialize/wtf.html.j2" as wtf %} {% block page_content %} -
          -
          -
          -
          -
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + {% if user.avatar %} + user-image + {% else %} + user-image + {% endif %} +
          +
          +
          -
          -
          - {% if user.avatar %} - user-image - {% else %} - user-image - {% endif %} +
          +

          {{ user.username }}

          -
          -

          {{ user.username }}

          +
          + {% if user_data['show_last_seen'] %}
          Last seen: {{ user.last_seen.strftime('%Y-%m-%d %H:%M') }}
          + {% endif %} {% if user.location %}

          location_on{{ user.location }}

          {% endif %}


          {% if user.about_me%} -
          -
          - About me -

          {{ user.about_me }}

          -
          +
          +
          About me
          +

          {{ user.about_me }}

          {% endif %}
          -
          -
          -
          - - {% if user.full_name %} - - - - - {% endif %} - {% if user.email %} - - - - - {% endif %} - {% if user.website %} - - - - - {% endif %} - {% if user.organization %} - - - - - {% endif %} -
          person{{ user.full_name }}
          email{{ user.email }}
          laptop{{ user.website }}
          business{{ user.organization }}
          -
          -

          Member since: {{ user.member_since.strftime('%Y-%m-%d') }}

          -

          -
          - {% if current_user.is_authenticated and current_user.id == user.id %} - Edit profile - {% endif %} -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -

          Groups

          -
          -
          -
          -
          -
          -
          -

          Public corpora

          -
          + + +
          +
          +

          +
          +
          +
          +
          + + {% if user.full_name %} + + + + + {% endif %} + {% if user_data['show_email'] %} + + + + + {% endif %} + {% if user.website %} + + + + + {% endif %} + {% if user.organization %} + + + + + {% endif %} +
          person{{ user.full_name }}
          email{{ user.email }}
          laptop{{ user.website }}
          business{{ user.organization }}
          +
          + {% if user_data['show_member_since'] %} +

          Member since: {{ user.member_since.strftime('%Y-%m-%d') }}

          + {% endif %} +

          +
          + {% if current_user.is_authenticated and current_user.id == user.id %} + Edit profile + {% endif %}
          +
          +
          +
          +
          +
          +

          Groups

          +
          +
          +
          +
          +
          +
          +

          Public corpora

          + {#
          #} +
          +
          +
          +
          +
          {% endblock page_content %} + +{% block scripts %} +{{ super() }} + +{% endblock scripts %} + diff --git a/app/templates/services/tesseract_ocr_pipeline.html.j2 b/app/templates/services/tesseract_ocr_pipeline.html.j2 index 3bb14254..c9617d5a 100644 --- a/app/templates/services/tesseract_ocr_pipeline.html.j2 +++ b/app/templates/services/tesseract_ocr_pipeline.html.j2 @@ -85,6 +85,7 @@
          + {% endif %} {% if 'disabled' not in form.ocropus_nlbin_threshold.render_kw or not form.ocropus_nlbin_threshold.render_kw['disabled'] %}

          @@ -92,7 +93,6 @@

          {{ form.ocropus_nlbin_threshold() }}

          {% endif %} - {% endif %}