diff --git a/credentials/apps/core/admin.py b/credentials/apps/core/admin.py index 2f83551aa..cc51eb681 100644 --- a/credentials/apps/core/admin.py +++ b/credentials/apps/core/admin.py @@ -27,7 +27,7 @@ class SiteConfigurationAdmin(admin.ModelAdmin): search_fields = ('site__name',) form = SiteConfigurationAdminForm fieldsets = ( - (None, {'fields': ('site', 'platform_name', 'company_name', 'segment_key', 'theme_name', + (None, {'fields': ('site', 'edx_org_short_name', 'platform_name', 'company_name', 'segment_key', 'theme_name', 'partner_from_address', 'records_enabled',)}), (_('URLs'), { 'fields': ( diff --git a/credentials/apps/core/migrations/0021_siteconfiguration_edx_org_short_name.py b/credentials/apps/core/migrations/0021_siteconfiguration_edx_org_short_name.py new file mode 100644 index 000000000..4dd9af949 --- /dev/null +++ b/credentials/apps/core/migrations/0021_siteconfiguration_edx_org_short_name.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-11-30 07:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0020_siteconfiguration_edly_client_branding_and_django_settings'), + ] + + operations = [ + migrations.AddField( + model_name='siteconfiguration', + name='edx_org_short_name', + field=models.CharField(help_text='Unique, short string identifier for organization, same as LMS. Please do not use spaces or special characters. Only allowed special characters are period (.), hyphen (-) and underscore (_).', max_length=255, null=True, unique=True, verbose_name='Organization short name'), + ), + ] diff --git a/credentials/apps/core/models.py b/credentials/apps/core/models.py index 0ccd42fe4..368a6e893 100644 --- a/credentials/apps/core/models.py +++ b/credentials/apps/core/models.py @@ -19,6 +19,17 @@ class SiteConfiguration(models.Model): site = models.OneToOneField(Site, null=False, blank=False) + edx_org_short_name = models.CharField( + max_length=255, + unique=True, + verbose_name=u'Organization short name', + help_text=_( + 'Unique, short string identifier for organization, same as LMS. ' + 'Please do not use spaces or special characters. ' + 'Only allowed special characters are period (.), hyphen (-) and underscore (_).' + ), + null=True, + ) platform_name = models.CharField( verbose_name=_('Platform Name'), help_text=_('Name of your Open edX platform'), diff --git a/credentials/apps/core/tests/factories.py b/credentials/apps/core/tests/factories.py index 4f8a3d330..611a76bff 100644 --- a/credentials/apps/core/tests/factories.py +++ b/credentials/apps/core/tests/factories.py @@ -37,6 +37,7 @@ class Meta(object): model = SiteConfiguration site = SubFactory(SiteFactory) + edx_org_short_name = Faker('word') lms_url_root = Faker('url') catalog_api_url = Faker('url') platform_name = Faker('word') diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/__init__.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/fields.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/fields.py new file mode 100644 index 000000000..15cfcda31 --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/fields.py @@ -0,0 +1,26 @@ +import base64 + +from django.core.files.base import ContentFile +from rest_framework import serializers + + +class Base64ImageField(serializers.ImageField): + """ + Custom serializer field to ingest base64 encoded image. + """ + + def to_internal_value(self, data): + """ + Save base 64 encoded images. + + SOURCE: http://matthewdaly.co.uk/blog/2015/07/04/handling-images-as-base64-strings-with-django-rest-framework/ + """ + if not data: + return None + + if isinstance(data, str) and data.startswith('data:image'): + file_format, image_string = data.split(';base64,') # format ~= data:image/X;base64,/xxxyyyzzz/ + file_extension = file_format.split('/')[-1] + data = ContentFile(base64.b64decode(image_string), name='tmp.' + file_extension) + + return super(Base64ImageField, self).to_internal_value(data) diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/permissions.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/permissions.py new file mode 100644 index 000000000..b82bf746d --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/permissions.py @@ -0,0 +1,25 @@ +""" +Edly's Custom permissions classes for use with DRF. +""" +import logging + +from rest_framework import permissions + +from credentials.apps.edx_credentials_extensions.edly_credentials_app.utils import user_has_edx_organization_access + +logger = logging.getLogger(__name__) + + +class CanAccessCurrentSite(permissions.BasePermission): + """ + Permission to check if the current site is allowed for the user. + """ + + def has_permission(self, request, view): + """ + Checks for user's permission for current site. + """ + if user_has_edx_organization_access(request): + return True + + return False diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/serializers.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/serializers.py new file mode 100644 index 000000000..3090bcd0d --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/serializers.py @@ -0,0 +1,63 @@ +""" +Serializers for edly_api. +""" +from django.contrib.sites.models import Site + +from rest_framework import serializers + +from credentials.apps.credentials.models import ProgramCertificate, Signatory +from credentials.apps.edx_credentials_extensions.edly_credentials_app.api.fields import Base64ImageField + + +class SignatorySerializer(serializers.ModelSerializer): + """ + Serializer for Signatory. + """ + image = Base64ImageField(max_length=None, use_url=True) + + class Meta: + model = Signatory + fields = ['id', 'name', 'title', 'image'] + + +class ProgramCertificateConfigurationSerializer(serializers.ModelSerializer): + """ + Serializer for Program Certificate Configuration. + """ + site = serializers.SlugRelatedField(slug_field='domain', queryset=Site.objects.all()) + signatories = SignatorySerializer(many=True) + + class Meta: + model = ProgramCertificate + fields = [ + 'site', 'is_active', 'signatories', 'program_uuid', 'use_org_name', + 'include_hours_of_effort', 'language', + ] + + def create(self, validated_data): + signatories = [] + for signatory in validated_data.pop('signatories', []): + signatories.append(Signatory.objects.create(**signatory)) + + program_certificate_configuration = ProgramCertificate(**validated_data) + program_certificate_configuration.save() + program_certificate_configuration.signatories.set(signatories) + return program_certificate_configuration + + def update(self, instance, validated_data): + signatory_ids = self.context.get('signatory_ids', []) + + signatories = [] + for signatory_index, signatory in enumerate(validated_data.pop('signatories', [])): + signatory_obj, _ = Signatory.objects.update_or_create( + pk=signatory_ids[signatory_index], + defaults=signatory + ) + signatories.append(signatory_obj) + + for attr, value in validated_data.items(): + setattr(instance, attr, value) + + instance.save() + instance.signatories.set(signatories) + return instance diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/tests/__init__.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/tests/test_serializers.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/tests/test_serializers.py new file mode 100644 index 000000000..80312a250 --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/tests/test_serializers.py @@ -0,0 +1,85 @@ +""" +Tests for edly_api serializers. +""" +from django.test import TestCase + +from credentials.apps.catalog.tests.factories import ProgramFactory +from credentials.apps.core.tests.mixins import SiteMixin +from credentials.apps.credentials.tests.factories import SignatoryFactory, ProgramCertificateFactory +from credentials.apps.edx_credentials_extensions.edly_credentials_app.api.serializers import SignatorySerializer, ProgramCertificateConfigurationSerializer + + +class SignatorySerializerTest(SiteMixin, TestCase): + """ + Tests for Signatory Serializer. + """ + + def setUp(self): + super(SignatorySerializerTest, self).setUp() + self.serializer = SignatorySerializer + self.test_data = { + "name": "Jhon Doe", + "title": "Director Certificates", + "image": "data:image/png;base64,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" + } + + def test_create_signatory(self): + """ + Verify creation data. + """ + serializer = self.serializer(data=self.test_data) + assert serializer.is_valid(raise_exception=True) + + def test_update_signatory(self): + """ + Verify update data. + """ + signatory = SignatoryFactory() + self.test_data['id'] = signatory.id + serializer = self.serializer(data=self.test_data) + assert serializer.is_valid(raise_exception=True) + + +class ProgramCertificateConfigurationSerializerTest(SiteMixin, TestCase): + """ + Tests for Program Certificate Configuration Serializer. + """ + + def setUp(self): + super(ProgramCertificateConfigurationSerializerTest, self).setUp() + self.serializer = ProgramCertificateConfigurationSerializer + + program = ProgramFactory(site=self.site) + self.test_data = { + "site": self.site.domain, + "is_active": True, + "signatories": [ + { + "name": "Jhon Doe", + "title": "Director Certificates", + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAAE7CAYAAACFTU+yAAB77UlEQVR42uy9ebyP5b7/f86emtSmpIiMySwikqlBSYYkGlDKLA2GDBElQxIRkqREKDRIyJxZGTKEKEpEGnf77HPOn9fv8by+59NvZa/7uu/PfH8+n9cfz8c5O2t91lrXfd3X9R5f7//43//9XyOEEEIIIYQQIvf4Dy2CEEIIIYQQQsghFEIIIYQQQgghh1AIIYQQQgghhBxCIYQQQgghhBByCIUQQgghhBBCyCEUQgghhBBCCCGHUAghhBBCCCGEHEIhhBBCCCGEEHIIhRBCCCGEEELIIRRCCCGEEEIIIYdQCCGEEEIIIYQcQiGEEEIIIYQQcgiFEEIIIYQQQsghFEIIIYQQQgghh1AIIYQQQgghhBxCIYQQQgghhBByCIUQQgghhBBCyCEUQgghhBBCCCGHUAghhBBCCCGEHEIhhBBCCCGEEHIIhRBCCCGEEELIIRRCCCGEEEIIIYdQCCGEEEIIIYQcQiGEEEIIIYSQQyiEEEIIIYQQQg6hEEIIIYQQQgg5hEIIIYQQQggh5BAKIYQQQgghhJBDKIQQQgghhBBCDqEQQgghhBBCCDmEQgghhBBCCCHkEAohhBBCCCGEkEMohBBCCCGEEEIOoRBCCCGEEEIIOYRCCCGEEEIIIeQQCiGEEEIIIYSQQyiEEEIIIYQQQg6hEEIIIYQQQgg5hEIIIYQQQggh5BAKIYQQQogk8fPPP5tDhw6ZjRs3mg8//NAsWLDATJkyxQwfPtw8/PDDpnv37r/Tv39/M3LkSPPaa6+Z9957z37PV199Zf75z39qLYWQQyhE5vLf//3f5sSJE+azzz4zy5YtM2+//baZMGGCefbZZ3+Hi3HEiBH2/586daqZM2eOWbhwodm6das5cuSILkMhhAg5q1atMkOGDLFw1v/jH//I2bXYt2+fmT59uunTp4+54447zLXXXmtKlChhChQoYP7zP//T/Md//Icvf/vb3+z31K9f3zzwwAPWicRBxMHUfhNCDqEQoeF//ud/zOnTp83hw4fNtm3brBEwatQoc/fdd5uGDRuaChUqmIsuusj8/e9/NxdccIE577zzzDnnnGMvur/+9a+/85e//MXC/3/WWWeZs88+25x77rnm/PPPt9976aWXmlq1apn27dub5557zqxYscLs2LHDfPfdd+Zf//qXnoUQQqSJX375xWa1OK8jZzln/b333muDgbmQAdy9e7cNYvbu3dtUqlTJ3nfcZX/6058COX9+4ETyeTiUxYsXN926dTMff/yx+eGHH7QHhZBDKETq+fHHH82aNWvMzJkzzeDBg81dd91l6tSpYy6++OKEXX5BIqclS5Y0LVq0MAMGDLAXMZlEHFQ9IyGESF1QkBLIIkWK5HtODxs2LGsrPCjlnDZtms3elS9f3vz5z39Oyf0XgTuXn718+XLz22+/aT8KIYdQiORd9kQgv/jiC9vPQFSyWrVqpnDhwjZSmeoLMD/4HcgiUlrToUMHs3jxYpWZCiFECjh16pSpW7eu5/ncrFmzrMkScqd8/fXX5t133zWtW7c2pUqVspnQoCWgyYAgLPcxwVHuvl9//VX7Ugg5hEIkBpzAdevWmXHjxtkyzcsvvzwUzl8QKFfCaaWPhb9Bz1MIIZLDxIkTnedx06ZNzbfffpvRfyPZty1btthe99q1a9vWhjDefZSU8jseP35ce1MIOYRCxJYJpBR0586dtgyUS48+BUp+MsEJ9HIM+Ru6du1q1q9fb/tc9KyFECIxIBRWvXp1Z/VG3759zX/9139lbHvE2rVrze23325bFMLqCOaFHn1+X6p6EHTTPhVCDqEQvnBhoIZGP+DNN99sy18y1QH06zns3LmzvdzVayGEEPELqfTo0cNZOUJJJWIrmRYc/eabb2xf5A033GCzbom+jxDfKVasmLnyyittNUvNmjWtaBrw32h/4Gvi+RmVK1c2b731lu47IeQQCuF94RGxRRX0oYceshcS/YCJvvToqwB6HADDAcjcUYJKE/5ll11m+x9QZOO/R74GIt+XqP4MPoufO2jQoIwvYRJCiHSCwmXBggWdZ+5TTz2VUX8T/XdvvPGGVcguVKhQQu4c7jXuOkZPoMD95ptvWhGYDRs2mE8//dQ6zARl9+/fb+G/bdq0yXz00Ud2FiFzCrmjUd2O9i5EnRvRG4mtCSGHUIh/K/GZPHmyVQVNRokmSnOUEDVp0sT06tXLPPPMM+bVV1+1TfjMFDx69KhzTARlnd9//705duyYNThmzJhhHnnkEdOqVStTr149U7FiRfsz4u1nLFu2rM2Kap6TEEJEB6OGGjRo4DxjOa/JtGXC38P4oldeecVm6uJRyuZeIsjJ396lSxczd+7chK0BYjZjx441N954o7nwwgsD/0447a+//rpE1oSQQyjE/9omcwRicNYS2Rd4ySWX2AsKpw3nbenSpWbv3r0Jn43EgGMuRKKn/IzRo0eb5s2b23mFsf7uZCXJkBKV1R4RQohgbQYE+VB29jpb+Te+JhN62N5++20bcIy3XaJRo0bWYVu9erW9q5I1HxfF1vnz59uga9CexnLlytmB9tq/QsghFDkIvQOffPKJefLJJ624SrwN8TSrk1lr3LixHQ7PZ5PNI6tHCWoqy1K4bCnv+fLLL83LL79sm+jpvYj2Uo9EdCnPwenUvhFCCG8ocaSE0XWuch6HufqCs57AIr8n91q0pZh8PVk6ev6Ys8hdyN+bKgeYu5b7j8xf1apVbXWO3+9Mdc3nn3+uPSyEHEKRa0IxqIXSuxDvsPjSpUvb4bdTpkyxF18Y5xxRDoNC6tSpU22kNlohAJr4x48frwZ8IYRwgGqoX4liWLNROFLcjfwNF110UUz3IY7gXXfdZUVn0j1fkb+He4+ZiEH6GVu2bGmDqNrHQsghFFkMThHlmpRvIp4Sa0aQ5nWcQIbQL1myxHz11Vc2+pkJjek4w/SDUFJz3XXXOcuazoTsYu/evW3Ph5rwhRDijzDXFREwrzOUO2fAgAGhC6xxLyAkRtsE4yOCZNTOnO9HcLV///42KJrolohElJEiluZ33/F309uocRRCyCEUWQqlm88++6y9tGJV5UTmmtETL774op1hlOlO0alTp6yiGyWuOLlBx1MQ/c0UMQQhhEjVecrZ6Ko4oYQybD3ZBErpE+QeiDZISktBlSpVrDoof1eY70SCtji8fhoBOLdbtmzRnhZCDqHIJijfpBeCBnN6IaLtg8BRImL64IMPWhlsoqjZlh2jwZ9eizJlygQqn+VCvfvuu22mUXtMCCH+145jcGWgOFvp5w7L/UEWDCeOWYkXX3xx1BlB7sXnn3/eVt3QI58p9gDlsH699PROEkTWvhZCDqHIgj5BSlcocYxlcC7ZwNtuu81Mnz7dnDx5MifWjKgoyqRB1ovSmnbt2tlyWe03IUQuQ3AM8RI/lc1kKWvGUjHDDD+ExqK9G/k7qbZhRFKmVgv17NnTOZqJucPMJ1TpqBByCEWGQvT1p59+srMEuexi6YWoW7eu7bHLxmyg39qRLaTXIogaKZnC7t2769IUQuT0ncM4BVd1BUIriKyE4XdFSZMh8NEMlqdaBjEcAqyMNgqLYxsrtDxUrlzZ+TejFKssoRByCEUGQqP++++/b4fKR6scymV3yy23mPfeey/nB9Ry2bOOV199te+60XMyfPhw64RrDwohcg2EZCi3d5WKMs813WN7cG4o8WQ2bjR3Y5EiRUynTp1saWg2PTfmITJuyvW3o0Se6c6vEHIIRU5x+vRp29jOzLxoLjsyiNdff72N3jKcXmv5/0PJbf369X3XEHnyGTNmSHlUCJFzQciuXbv6ZgfT7UwdPHjQjkYKKh4W4aqrrjKLFi0KnWpoImA+cJ8+fZxCOmQJWTvtdSHkEIqQQzZv69at5oYbboiqPJSSyBtvvNEOXM+UkRHpAEOGzKnfeiJKwLwnrZkQIlegosTVi0ZZ/ejRo9OaFWT2bKlSpQJXzXCPVqhQwUyaNMl+fzbfjZSOuno/caBpP5F9IIQcQhFi6F0jM0WvYDSjJFBHQ36afjmtoz+7d+82lSpV8l1X+lLSPYhYCCFSAT3mqFe7zkRmvaZr0DmZLbKXCKQEvRvPPvtsqzpKn2CuPEccX9eatG3b1lYgac8LIYdQhLCJ/9ChQ6ZXr15RXXaUNt5///3mwIEDGSOTHRbWr19vy4dcjjdjPYYNGxa6octCCJHoypTnnnvOKb7FCIo5c+akXHSLUsjFixdb0ZSgVTOUTdauXdvOI+T7c+lZopRds2ZNz7W54IILcspBFkIOocgYVqxYYZVAg5bAULZTr149s3DhwrQ39mcyq1atMpdffrmv0719+3atlxAia0Gps2LFis6zsE2bNikXKKPE84knnrDncDSBUnrpDh8+nJPPkuAwZb1kR73WaMCAAdr3QsghFGGBXj/mAroU3c5Ud+OyQxKcy059APGX6BJBLly4sHPd77nnHjneQoisdSAYv+AKSNJTvWnTppSezYiAtWrVylZqBO0VRDTsgw8+yLms4Jns2LHDlC9f3nOtaJlQO4QQcghFCPjxxx+tBHRQlTRKYG699VYrCa71SxyMlyCaTNbVa+2ZbzV37lw54EKIrGP58uXW4XNVpDz++OPm119/TcnvQ/CN0tTSpUtHlRVkFMbJkyf1TP8PZuq6yn+ZTax1EkIOoUhz8z4R2aDOIH0djz76qDl69KickiSVS7mG+tJnePPNN2uMh0gKzAXD2GZ/7dq1y77nZDhS3aslcg8cqLvuusuZHaSUdP/+/Sn7fYYMGWJnBQatmqHsn/YJzY79I0uWLPHskWfd+vXrp5mEQsghFOmCi/Wmm24KHPmsUaOGvewkGpNc3nzzTV8HnSyh1kokMjvNmBh6pKpXr/6HLHWJEiWscjDBI62VSBYvv/yyc24dZZhvvPFGSkpEP/vsM9O0adPAdyNZLoTYGLWgZ5l//6WrbLRZs2YKcgohh1CkA+YLMiswiHgMxmGLFi3Mtm3btHYpABnu1q1bO58Jz06KoyIR8F536tTJFC1a1DkzjLIveo21ZiLR0EPmqoyAhg0bpqQM85133rHKmK4ZiHm57LLLzEsvvZSVA+YTWXrLyA2vNWS81Z49e7RWQsghFKmCcrB3333XipcEmS94ySWXmClTpuR8Y3yqQcTANZ+QiPSCBQu0ViImKPfGAOvfv78566yzAp0FBI8mTJig8lGRcGdh0KBBzuxgsWLFzNKlS5PulKKIyfsQTS89pdVqn/Bn9uzZnqI8BJ2pUNA6CSGHUKQASj1fffVVU7x48UAXHlG7dMx6Ev+vl+vpp592GufMfVRUWsRyDpAFqVWrltMIzw/mZX7xxRdaR5EwNmzYYMqWLevcd507d06qkAzOYLt27QLP3mV+HsIx9NjqGQbj448/NqVKlfJc0xEjRmidhJBDKJINGT56NIJcePRqVKtWzezcuVON3mnkyy+/dI6hwLFPpfy6yI7SvKFDhzqVHF0ULFhQioAiYTBLkHYEV4aa7GCyghDcbzgqjRo1CtQ+wd1ILxzVGaqaiY7vvvvOrrPX2vJvWich5BCKJJeJUupFmWGQC69ly5a2qV5rl17oESQL6Hpeo0aN0lqJQGBUd+zYMeqs4Jnnw8iRI1U1IBICc/pcjhilhGPGjElaSea8efPMFVdcEVhFFOeVIJxKRGPD1UdIewriM1onIeQQijQ7g9T3Iy6B2pcuvHD0eRGJZvag1zMjkyvVV+G3j+hJveGGG6xDF2SOGvL5Xv9OqRx9X1pbEQ9fffWV3ZOuETsNGjRISnYQx+PZZ581l156aSBnkMoaxjPpboyP6dOnO8twqUrSOgkhh1AkGBQBn3vuuUAzBjmMhw8frp60kIGM+fXXX+904tevX6+1Ep79ggz7ph84iOHLzLUZM2bYfiqvrxk4cKBKyUXcpZr0jOUdb3ImZ599tu11TfTPZnwKirleAidnUqZMGevISGE3flA3d804Xrx4sdZJCDmEIpFQ0jVt2jRndimvMzh16lQN0w3pcySS7dVjQ8ZHzfjCa+8wN5SepyAqojiDnAMEIZo0aZLv1yDFz37U+op4s4N+4ma0LtBjmMhM+b59+0ybNm0CZcrZ6wgvrVy5UiXSCQxSe5UIo+7K+A6tkxByCEUCe8/ojTj//PN9Lz1Uvxj2q7LD8EJE2yUu07x5czu7UGslIlDS6ZJ5PxOGz+M88r2IGdHP41U6RwZRayziaWNANdRvP27cuDGhwZG1a9eaihUrBnofcE4eeOABc+TIET2zBJeve82bxAEfMGCA1kkIOYQiUQcuZTauHqAzZ9klMgorksPtt9/u+RyrVKmi3gvxh3I8nDYGZgcxfjGSOQciQSHmlLqEH5I9D05kNx9++KFnwCEy369v374JGzMRyZRzTgZ5Hwik9uvXz/YL6nkl3j5p2rSp59rfd999Ck4LIYdQJOLiW7NmjW+ZKOVjGIEYfiqFyQwYGeJVakMW6K233tI6CSuFP2XKlECZQfq3kHo/fPjw70IZOJN33HGH5/dcffXV5uTJk1prEXO1w0033eTclwhlJcoZoyf+xRdfDNRHH8lMUl0j4ZjkgTiPq0xYOgZCyCEUcfLpp59agy2IiqD6IjILHP0LL7zQ85kyW05GTG5Dpv/VV18NpJxIeRbR+P379//hMxg3g1Hs9X2IcWitRawgzuLq3yM7OHny5IT8LHriBw0aFEhhG6pWrWqDpDpHkwtja7yeQcOGDVWmK4QcQhEPRPk5TP2G65YsWdKWh+nSyyyQXq9bt67nc0WeXcqPud03TJkog+ODlIoPGTLk31QTKdVCadil/Lho0SKtt4iJAwcOWIEj15w/SuNPnDgRd1nioUOHzL333uvcy3kz5Y0bN7bfoyBp8pk1a5anyBVO+a5du7ROQsghFLGWxTA/0O/iI8OE0IRq9DNTJIQh9V4XKZLdKuXLTXifea8vvvjiQPPURo0aZX788cd8gw41atTw/N5ixYqZo0ePas1F1BB8eOyxx2wG0KVyy6D6eH/W3r17TbNmzQIpiTLaomfPnlZISc8pNfCMvUp4y5Yta0dTaJ2EkEMoooTG+2HDhvn2DOEMkkGQgEzmMm7cOKt+5/WMNcMpN0Ua5s+f7yvhHxHLeP75522fYX6fxfngZUSTvaH3RwPpRSx8/PHHTiEZ6NGjR1z7i+weYyXq169vS6KDZMqffvpp9aylGESpGHXlFXRir2idhJBDKKKE8k9Xb1nEEMSZkDGX2WzatMnZD4Oxr3XKHTCAP/roo0A9g5wRkyZN8lRuZGyJq/8YxdIVK1Zo3UXUEIBgNI5fKwMlm/H2WTM3MMjMTVS46bfVnZh6Vq9e7VnNQJaY56h1EkIOoYgCoqFeM33yikcgBJFfiZjIvLJRl/FPBkfrlDswpw1FRj8DmCACKrVeziBZRv7dVWVw2223me+//17rLqLOYKOA7JqJS9UDQiOxtjIQGEFQjbvQr4eed4XZu4xmou9Wzyj1rFu3zhQtWtTzrFq2bJnWSQg5hCIoyHcjD++6AOnX4Gs0tDx7qFOnjnNAvYRlcoPPP//clCtXLlBmcOrUqU5jG6VRMiuuz1E5soh1n/opXzOG4uuvv47ZGaRKpkyZMoGURBGPIZAiUbX0VrqQEfbqhV+yZInWSQg5hCKafjK/vkEu4t27d+vyyyLatm3r+byvu+46ZXFyAGTZUWMMYgCPHTv239REz4TsjEuN8corr7QS/lp7ES3PPPOMr9JnPMEG+tFcY1LyQm8hVTV6Lull27ZtnsEsAtxSMhZCDqGIIsLm1ZSdd9ag1Lqyj0ceecQ5R2vPnj1apywGSX7KN/2MX86HJ5980jcYRAaHqLzX56AGSDmpgkoiluygayA8xj8BrlhGPVDuOWXKFFO4cGHfd4GSVARr4h1nIRID5b0VKlTwfF6UGGudhJBDKAKUipIdcPUNYeCNGTNGM5WyEIRjvJ47vTFSaMteyPT16dPHV06ff3/00UfNqVOnnJ9HT+HDDz/sPEvIqnz11VdafxEV9Kx37tzZuU9Lly5tVq1aFdPnUwYdZMwKbRP00Pu9CyJ1MGewSpUqns+MOYVaJyHkEAoH9IcxYoLZSa6oKxeg+gazk/fee8/z2RcqVMgsXLhQ65SF4Lw99dRTTnGOSDYEQ9xPPZGMH6V6rnEVZHcYaaHsoIgG9svcuXNtlYoraDF8+PCoe5651/g+l9pyXoESSlY1ViJc7NixwymGR0+o1kkIOYTCwSeffOK8ZCNR13jlu0V42bx5s2eGiP8+ffp0rVMWgoFdsGBB38wgJXjHjh3z/Tx6TRs1auT8vCZNmmhuqYgasnH16tVz7i36Ur/55puoPpe9OHjw4EDOICXT9MZ6zdwU6bVjypcv7/nsFNQUQg6h8DHgWrVq5RsRZbaS1it72blzp3P0BGJDyuhkD5FZg34qipR9otaIke33/DGsGcjtGt7NEPFYy/lEbu/XyZMnO/cWFS4zZ86M6nOPHz9u+6dd/a55Z2byO8gZDG9Qk/aG/J4dAkRUwWidhJBDKDxKRV966SWnkAzZgS5dukhlMss5cOCAs/+CqLh6R7OH7du3m6uuusrXCK5Ro4YtxQpSzsecL4xmr8/CKOvfv78MapHwckACF/TAf/fdd1EFQzt27GjLoYM4g5Q561mEF9fYCZ7x+++/r3USQg6hyI+jR49aBUnXRXjFFVeYvXv3ar2ynC+++MJUr17dcx/E0pcjwlsVgKKo37BtsofI7wcJBFBOSimo6zP5PAIPegYiGgggIFKEkIvX3kIIhjlzQasY2K9du3b1FVKCihUr2pEFOv/CDcJnxYoVk0MohBxCES1Dhw71FZJ45ZVXtFY5AP2hNWvW9NwLQ4YMcQ4hF5kB4hm9e/f2NYQpEw+aEWFfMIrC9XmU5EnlT8TC6tWrfftce/XqFVWZaJs2bZzlpxGomqA3Tc8h/KxZs8YUKVIk3+eIaBbBLa2TEHIIRT49Y64GbLj55pvt5an1yn6+/PJLU6dOHc+98Pjjj0sIJAugRNxPPKNAgQLWwWMmW1BDzG+Id+vWrVV2LqIGVdvmzZs79xZlgsygC/J5jK1gdqCfM0gJKuchWSf1TmcGK1asMBdeeKGnUjb/rnUSQg6hyMNPP/1kunXr5izvQmBk5cqVWi85hBaySn4jB0S4RTno8XONlokwaNCgwH1++/fvNw0aNHB+XqVKlQL1IQpxZuZ54sSJTsEXghcvvPBCoOoFgpvt27f3dQa5F6+//no7m1fPIXNg3M0555zj2QO6fv16rZMQcghFXiiB8aq1j9CpU6fAGQKR/Q4hAQRm1mmtMleUw1USHKFp06ZRzRplNqGfgT1lyhQ9AxFTGXvt2rWde+u6664LVMVCEJQ+RD8BGTKDjE2hgkbPILOYM2eO53OtUKFC4CyyEEIOYc7AgHkuPq/Ds2jRohKSyTG+/vpr5/y4Bx98UA5hhoKABqMjXBUBnAeNGzcO/N4TLHr++eftkHmXQvE999xjy/T0HEQ0IOCCIq1rz7L3Pvjgg0D7HwEZv+w4PwthJIJjKhPNPCZMmOD5bGvVqmU+//xzrZMQcghFhIMHDzqzg0T7H3vsMZUHyiGUQ5gFUPrZt29f38wgJeL0S0XTr1O6dGnnZ6Jaq1JREQtbtmxxzkWFe++917e0mcAFPYN+mUGcQXrm9+3bp/XPUAYMGOD5fClr/+qrr7ROQsghFJE+omeeecbOA/M6OMuWLataezmE/wazKOUQZl4PFuWafgqN9GFNmzYtcFaEcTXVqlVzVhmQvXnnnXc0u1JEDeJD7dq1c+4vRpisXbvW93Poh/XqK8ubyUZ1VJnBzIXn1qFDB89njDCRRK2EkEMo8hj9N9xwg/NyJJqq8QK5x5EjR2w/jte+IGusntLMAvVP16D4yGiZfv36BS7rZPA32WLXZxJwol9LxrWItRfML4jhNxeVs4o96BKkAWYbtmzZ0t6NWvvMdgibNWvm+Zzbtm2rgKYQcghFhFWrVpmLLrrIWTazYcMGrVUO4jeYftiwYQoUZFHGN9I3iIjMqVOnAvcNPvvss+aCCy5wfuaNN95o95Oeg4gWjPbKlSs79225cuWce/aHH36wY1P8MoPcd3fccYfdqwpeZL5DWKNGDadInp6xEHIIxf8xcOBA5wV51VVXKQuUo3z22WemePHinnsDARFdqJkBxjLlU37qn7zve/bsCSzywWB5Bjy7PpOSc/UNilhgj40ePdq5v9h/06dP9/yMn3/+2fTp08cpdhTJDLZo0UJlhFnkECKG51USPHToUK2TEHIIRQRmK7kuSbJA6vnJTZDkZniv14VKj5nWKTMMI2a3+TlulJK+9957gd53PpPy0yuvvNLXWH/llVf0HERMbN++3VStWtWZfcaJQzXUq0d+7NixtifWLzNImeiBAwe07lkCgQCvABhl8bq/hJBDKP4P5jD9/e9/97wkcQaWLFmitcpREBIiap7f3qAPZ/bs2VqnkINB/OGHH5oLL7zQaRCTPZk5c2bgz922bZsdLu/6TMrzRowYoT4dEXOpqEsUBGh3YC96fT9lokF6Bukni2bWpsiM+8sVqJJQnhByCEUAgx+qVKmiYbw5zPvvv+8MFixYsEDrFHKYs4UwkEudkSg6irFBRWTIxiDH7ze24rbbbjMnTpzQcxAxQe+6nzPXuXNnz+9/6aWXfIVo2PtkBlET1ZpnF66h9ATCNXJCCDmE4v+YMWOGs6cIcQn1U+Qur732mnNG3dKlS7VOIS+ZQjrfNcgbbr311sDG0fHjx+1gede5wc+rX7++jGwRM99++63dQ659Synp7t27/+176Xl//fXXTeHChX3LRFGhVNAiO+nfv7/ns6e3UP3vQsghFP/HyJEjncYiQ35dMt4iu5kwYYLn3ihZsqRZt26d1imkoP5KhsRVARApudu8eXPgz2XQs99A7yuuuMLuDRlcIha4c1588UVn3x/lyIjN/POf//y376dE+vLLL/d1BlG+1dD57OXOO+/0fP516tTRGgkhh1BE6NWrl2cpGRcmA3y1TrkLs+i8LlRk4FEh1TqFU0SG3t/SpUs7jWLK6V5++eVAjtsvv/xixo0b5ytMQykWpcYSohKxsnfvXl+xIsqgzxwzwZ7bsmWLKV++vG85M9+Pmq6CFtkJWV9Xhrl9+/ZaJyHkEIoI9913n6dDiIokYwW0TrmLS9Chbt26tnxQ6xQ+mDdIBNxlEPN+M6Sb+WxBs8WueaURZ9ArayNEUHr37u2rXLt48eJ/+z5Gm1xzzTXOftlIqSkKylrr7IVSYpc6LeeU1kkIOYQioEM4fvx4rVMOU7NmTc8L9fbbb1c5cQj5xz/+YTP/rlJw3vl69eqZkydP+n4ezt3bb7/tK87BeUFGOagwjRD5ZbYZZVKsWDFnqSfZnTMVQRE6IusXZM4mP0MZ7Ozmo48+8txH7KF3331X6ySEHEIR1CHUnJ7chczRxRdf7GlY9e3bV+sUMnDepkyZ4hwlE+nx27RpU6BerldffdVccsklvrL99BtrvISIByoOUPx0BTPKlSv3b3v3m2++cfaLRaCEeuvWrVrrHAgsMPv0b3/7m6egjDLEQsghFHno3r270yGkTEzrlJtwYbqyQpMmTdI6hQxK5kqVKuU0ii+44AIr2OFX1kkGZcWKFVZN1vV5nB+Ml5CiqIgXlEFdYybYa8OHD7eCSZHvQUm3a9euVmTGtU8RwSLTrXXOjcDY448/7mx3OHz4sNZKCDmEIgKiMV7RWEpvhg0bpnXKUd566y2ncYazoHUKD999951p0qSJ78y1Pn36+H4WBjczJomk+2Vd6NnSPC8RL4yZ8BOSodwzb6noTz/9ZO8wvz3KPkZkSeucG7AvXHNS6Y1XabsQcghFHsaMGePpEPLfH330Ua1TjvLss896ltwAwiVap/BExHleflkSIuOHDh3y/TxGRlSoUMHX0Ea04eOPP9YzEHFBafLTTz/tHJFCZpsxKpHeP/Y8/7tQoUK+Y1UmT56sdc4hUJ/1GjtCUGzIkCFSlxVCDqHICz2Crib8du3aqfk+Rw20Bx54wDmuQEqS4eGdd97xVQAtU6aMWbVqldMQIjO4cuVK26fl5wxWq1bNSvzLsBLxgsgL+9O131q3bm2+//7738uZ6W0999xzfVVv6anVWZVbbN++3bMVhsDCnDlztE5CyCEUeVm0aJHtFfS6UFu0aGHnj2mtcgvUJ+kLczkDeft4RPogU1u9enVfB44Zgn6qsCjvUbbnJ9tPP9YHH3yg9RcJoU2bNs79dtZZZ5nNmzf/7gwycqJEiRK+QkcDBw6U0FEOQubYa18UKVJEVQ1CyCEUZ4Jam6tM58Ybb7QDXrVWucXnn3/uHDlxzz33aORECCBj0qlTJ6cqIxUAKDCeKdOfF0ZVzJs3zxpLQZQaCSTp+Yt4Ibv8/vvvO++gyLzMSKUKWW4y2K6gBaXuXbp0CTRWRWQfDz74oOfeKF++vPaFEHIIRX6N/ERfvQ7PKlWqWOVCrVVusXHjRucssKeeekqlgiGA3ii/ERNkDymhcn3OxIkTAwnIFC5c2MyePVtrLxLCkSNHbNDRr091165d9uv37dtnatSo4btPqWyR0FFuQkb42muv9dwbjDXROgkhh1CcAVFX16w55o9JTTL3mDt3rmcpcYECBWyGSOuU/iyuy2mHs88+26qFevUBYzwFmVsYKRN944031I8lEgIl55Qxu5SM2b/jx4+3X3v06FHbR+jKhvNvderUMQcOHNAa5yiMS3L1o7LntE5CyCEU+dCoUSNnuRnN+8oG5Rb9+vVzltxs27ZN65RGKOMm0u1y4Cib6927t+dnIM0+ePDgQM4g2cNly5Zp7UXCINtXvHhx577jbmI8AEEIZua6+t0jYymobtB9lbvMnDnTBi29Agxbt27VOgkhh1DkR48ePZyXLHPL1C+UW9SvX9/ZV0qpsdYpPURGTLgUFumvuuGGGzxHTGBkM7jZlZ3Jq046f/58rb1IGNwnjDTyUwhlkDzZ7RkzZgRSFCVoIVXs3IVe6Mcee8yzv5RROpQpa62EkEMo8uH11193jp4oW7aszSZorXIDnAWvCCsXbdeuXbVOaWT58uXm/PPP9y3vpHQqv+/fu3evHSfjEvKIgHgHIwG07iJRRIRkaEdwCcl069bNiiYRjPArjaa3lcyQ1je3OXbsmLN/sGPHjhpIL4QcQuEFSqN+ghIyCnOHjz76yDNAgBMxYcIErVOaIDPrJ8LBM3ruuefy/f6dO3eaxo0bOwNAeZ1B5htq3UUiYWg45c4ulVCcRcZMHD582FSsWNG3NJqh9gpaiv3795tChQo5z0VlkIWQQygcRuYtt9zivHQ7d+6suXM5wtChQz2NNcq2vDJPIrn8/PPPtswOA9iVWbnvvvus0Z33e3/77TfbC3z55Zf7OoKAkuOGDRvUiyUSztSpU53OIMGKkSNH2nLnhg0b+s4nzDuSQmhvuYIMH374odZJCDmEwgsuUyKsrhKyypUrm927d2u9cqAHwyVWQmnWL7/8orVKAwzj9op+5+33i0j053Ukyeq61ITPfNdVESCSAf1bCL+49t/VV19tPvvsM9vb7gp+4Djecccd6mcWv8N8XNcILY0iEUIOofABxTdX2SgXM7PnJDmf3ezZs8dUq1bNcx80a9ZM65QGvvzyS+dziYwDod8qb1bv+PHjpkOHDlZdL4gziJgQKnzKuIhkZLj79+/vdPIKFixoM9ljxoxxfh3UrFnTUzRJ5B70m6J34LVf7rrrLlU8CCGHUAShbdu2zgv4sssus7PPtFbZCyU1rkzSkCFDtE4p5ocffjC9evVyZvApFe3SpcvvggkYPjt27DB33nlnIEeQz6ZsXFUAIlmsXbvWt1edgfI4hC7BmchdhLiS1lVEYD9cdNFFnnuGfaV1EkIOoQgAkt1+M8kGDhyo7EGWghPxwgsveA5+xulYuHCh1irFzJkzx2ZOXO9l7dq1fx/GzbB5HPtKlSoFEo8he4jDSRZSEXSRDOhhZai8ax9eeOGF9vxh37p6DAlYMYZCPe0ib9sLwUqvOZXYNV9//bXWSgg5hCJoyUX79u2dlzGiFJ988onWK0v7B11ZYnrLKCnVWqUOnLzy5cs7DekLLrjALF261H79d999Z5544glfBzKv0MLw4cO11iKpzJ0715xzzjnODDV3j19/IV9Hv7ucQZEXxk00adLEc9/cfPPNtmRZayWEHEIRMEPEfKgiRYo4S9No9tcsn+wMCJQoUcLz2bdp08Z+jdYqNfCOkblzZfn4t4ceeshmBXHWKblzGd5550nyrMn4SiRIJBP6/Bo1auQMNLIX69at69zrVC4QsDp58qTWVfyBLVu2eJYZs+9GjRpl/vWvf2mthJBDKKKhd+/eTmPyvPPO03yyLO0fdJUVjh8/XuuUwuDMlClTrFCM61289dZbbV/v9OnTTenSpQNlBQnqYKAr0y9SAWJkXqV8ectA/b6G+ZsHDx7Umop/Y+zYsZ77hr5V9ZsKIYdQxADCEsWKFXNezhiUiF1ovbKHPn36eD5vmvURhdA6pQZKP4sXL+58B5kJ+e6775rBgwcHLhGNCHdQiqp+QZFs6NsKMu7EzxmkBwz1W62pyA9XuWidOnU0bkIIOYQiFiitmDhxos0EusZQIDBDqZrWLPP55ptvnP07jDygx1BrlXxOnz5tJdL9DGhEOqpXrx7YEcRpxHlUubdIVcnzvffeG3h/uvpc6UHUmgqvPmv6qL32D4FOrZMQcghFjJw4ccLcdNNNzouavo8VK1ZovbIAnqMrK0yfmtYpNcGYadOm+ar9Iq5x/vnnBzaqUXCcOnWqnEGRspLnBQsWmMKFC8flDLLPhw0bJkEQ4ckrr7xizjrrLM/+wSVLlmidhJBDKOJhw4YNTsOUw7ZWrVpq8s9wkOymB8Nrzh3ZqPfee09rlQL27dtnlXzjzarkzeQzX3Djxo0SVRApgzuhfv36ce1dzh0y5apMEF789NNPVuzMaw9deumlUqQVQg6hSES2on///taodCm/UZKhfsLMBeXQ5s2bez7jcuXKmS+++EJrlWR4hxJRYheB7Azv5rfffpsz6/fBBx9YwStmKmpPpQ8EkeLdv6iOIpik9RReIIx15ZVXeu6hLl26aJ2EkEMoElWf37BhQ985aM8//7wicRnK/v37ncIPSL2HedwEGQT67nB8EA/AGTh69Kjl+PHjtkySLGgmlIq6emGiKbOj5xPV2FwYKcGzZQ8jlkNpLL2SNWvWNPPnz1dWNA3s2LHDziyNZw8jqMT+Dft7K9ILWgeuYfSLFy/OuL8JO4o7C2GxI0eO2PuM/8t9Rq8/d90///nPrC43R5sCm4P7O3KXR+Ce599+++03vQNyCEWq+eijj3x7mgoVKqRa/Qxl5syZns+V3oxx48aFzjDjQli9erWZPHmyHZOC01qvXj0bLb7iiitM1apVrVPUuHFj07FjRzvMGmGKsDpIRLr5veN1BnGG6PfEQcqV/Ysq8nXXXWerFfKuBSM7mKuqdzx18H49+uijvqqhLhhxg6Gv9RR+jgPnu9c+omQ5UyoFCGru2rXLvP7662bIkCGmQ4cOVjm1SpUqpmzZsjbAwp1Gi067du1M3759zUsvvZTxatEE7D777DOzbNkyM2/ePDNp0iQ7pqZnz57m9ttvt8kI7nH+dkBEjXueMmHOGdZg8+bNKiuXQyhS+dI+/vjjvpc8hxWGreTsM+tS5YLxeqYIzeB4hSELhLAEfa04gOy1yy67zBqPQYxM+l0JajAuBbGkpk2bWseJ+VQ4l+mMuPKz/VRF/cAZKlOmjJkzZ05OCcecOnXKPsszncEI9E+qnD11rFmzxhQpUiTmfcxg+vvuuy/UFQkiHJAt8jr/2Uc4DGGuWsKJOXz4sA24Xn/99TYgSIUId1WQd+Wcc86xzhLzObnTaDdAYIcqGTJsYbPDInc4ZzY2xZNPPmnPbv5uej0JZnqJA7nWoGTJkuaee+6xlQmqCJFDKFLAsWPHrMy9l+GVd3gws6e0ZpkBF1KpUqU8nycRunQr/HHxEwmkz9HVzxqrI1WxYkXbK5uOXjsuMNQ/XSNegmRUMKL37t2bU3uX53X33Xdb489rbYiw79mzJ/Cz4Jz79NNPbakZMx5R3yUIQcmWjA3/rD3nfzzvI4ax+j9FEEaOHOm5j1BgDuvcXAJ2S5cuNd26dbOOUCLvs0i1FhnGVatWhcIp5FygtxvHFxuSQG5QpzcaSpcubd588029G3IIRSrYtm2bfZn9IrwIWSiFnxm8+uqrzvEFY8aMSVmm8szLi+jurFmzzA033GAjgYm+QM50DLlEcT5Tuf44Kzgt8cxoGz16dNZmVCL74sy9wf8mA3Duuec616d27dqeASo+g6g15xrGCj2I1157ralQoYIV5KEfkQw5hsY111xjOnfubMubMqkCIr+1Sxa8q9GMQsmv5ysM1Qgi/NBf5wo+cKamq8fMdWZRFkomj3M7GU7RmQ7S+vXr07YGKA0jLkUWEI0Cv2RCIqD3mDNaZ7IcQpECiJxzmLleSrIdo0aNklMYcvwGoGPckUFM1qFIJgADEKeTMtARI0bYqGYkohhvtiEWKJ9NtCHB38rfRDk1JZ04Hy+++KLNPjVr1iym3/Oiiy4yd955Z9aqv9KLRmaOPYEBNWDAALNz504bJGDfPvHEE74GBiXuBDzOLFtiT7O/evToEfWID6LvGDmUZIX93SYLMXjwYNuPM3369KRWbpCdvuqqq2J+79jPvBsSkRFB4P11CaFxbgQtY6RkPyLiQoUA58PBgwdtbzJliASM6FMj47hy5UrbZkBvMmrGb7/9tg2E8H5xrpO1HDp0qA1WcadxznNu8X6QEfTTYkg05cuXt/dOMspdUQBG+GnChAn2DqeigoAqP49zx89OTAY42e3btw+V4AyVJVSYsG+wiwk8U+KKEGOy7Cs5hCJlde/PPvusFWxwvZiUQixatEhrFmKIpLkM4ptvvjnh/VcYqlykXJgIgeTtN+IwJ8J322232f+b6sskkqVIVJYQp4EILQYCfxOZp7x9uBjBsURNaaynAT9be+MwoB588EG7NyNRdCoP6BvdunWrNUDoN/Fbp1atWv3eT4nhx+cOHDjQihLEo+aKIRpWAS2CDxjLlNLmNZjJsBNASNaeQQjCVbrrx8MPP5xTva8ivp5rHA6vs5OqgUjAjXdh9uzZtreOc4NqCkRbcNZw0Ag2EQRs2bKlve+oRuF8oCKA/jzEXOhxI9uGTcM7RVCI98lrbu+ZFVNkKzm70nGf0ZP3wgsvJCzQwpxcWhxYt6uvvvoPDi5rghAOaxbPWRAvtLmEYdQSvZIkULp3724aNGhgq07O3BvYBdk0WkcOYY4eyByofgcih+i6desU9Q0pKHp5la3wbBNxkVA2giGOehpRMaKGXBypKB+JlTOzSkENcSSyt2/fbt544w3b00e5IdnyRFyOrBeGCRFoLrtsKjmJZFAx4CjbxMjIb3+wV+n39BMe4HtRnUVcARYuXGg/lyBWogwVRBzCdK6R3ViwYIG59dZb7fuV33vNumEQJ3rv4KQHcdC9nhXGkqpJcteWYLg8xjPZOd5XFJLJzpFpimTmyETRH4aq9LBhw6yAlitLxDuAY8j/Zd8DdxoBOc4A9l2ySzbDAs5uLMEWtANoaSCzRY89DjKBNPr4vdYuDGuKOmmqdQ/IAjISZNOmTTbwQDCS4IGfrcO/9erVSw6hyGxOnDhhRT5cBhaHA8OFw17TnauQofN6dkhdc7jFqia2ceNGW0bCZcTlHWYH8EwQsIlGlIdSGbKAlH9GW4IYBJzK+++/P/DzoKySdy5iQOHgMjomjKIoGIQYHGS0yJgmYr2I7pOZ5TnibCSj/5TM9qFDh9K+fmShmbeIERQk64moQyKzhDjyBD9ifb8paSNoqPM4O509jGTKJbds2WKzJWTryDBxN6BcTpaOEjr2Lxk6RkVQesz4IPQKyMYlWkgs1+BeCvrOU8HD2Uk5I3dOpUqVAit5hwHsUcZopWqPEwSm4okxIGRHYymTZWauHEKR8VF9Dnpk/P1eUL6GCKDWLTygpMhl6/Xc7rjjjsAz+zBKKbMkksslTxCA6FgyLvJI9DcaA5Q9iEAITi5OMEaH63d76623/rDP+fs4+OnXo68Ng6ZTp06mRo0a1mghOxLP3DUviHAjcoLD5Irw8pzox6RnjL44IrmUN+EgsFZkxvj7MQz4rHRLsRMwIHMcydxRSpOoyHLRokXtjCqetZ/gTLylxaxlutaPnhR67nB4o5GqxyHE6EvU74KB7zpH/NaQyoEwjwbI9TueZxPJ4FGZQAaP2XdkjsgMk7mjHHPs2LG27JfgAEqxnI0EAin9553kPuCcpC+d95LzN5OChMmEtYjmruRdJ0jIuAXaB6hWcDki6ATwDPM66gRyuDPIxHKOcG/z3PhMzmOcwEzLoLKGVIYkq7+bexY7h8Ds+PHj7VlaokQJz4qWoCB8JodQZAWUyHGI+JUFEQmUUxgOMCgpu3GV/AYpm6T2nV425vnRT5DsSC6/L3PlHnjggUBjGvh6nFMMFUQAcOooTRs0aJDzb6f0DjU4Mn8YOjhZCNy4xnMkGowpSnbJxLvkyxE1QDSEPpUgTikGGgZAOvsqXn75ZVtdEKQHJ6xg3FLimur1wxFE1IZ9HW0Qgq+nhzJRmWKyDrH2RvG7sG91Hqff6eMcwdEjSIioFxnnadOm2SwepYKct1R6RIaEYwTH04Mr/tgG8NhjjwW+W/i6jh072soPSmtx2BFmO7M/LS88PypG+DrEb/h5BHzp9Uu2eneq4DyhJSXRwlmR2ce8D9iwnHeJzJhiM6VKyV0OoUjJhTJ37lwbBfQre0N4QNHg9EMZD+U5LnXRM513nEgMB76Xkgyayin3wjBOdiSRz+fi5BKkRJPyDFdEjq+nf5WyF9TiiI6y74iMEtH2E6zBGSPDxCWb6nIlLhsEVVC2y69HDfU0ngGKdmSHyM5Eu/6sJSVcqSwdoz+I50F2Np7RBMkSXiDKS2ALgQlEs4gAu0bsEJFnb6Vi/XjmRPP5neihjGVmJVlyDMBECRjgVNIrE0tknP3auHFja9DqPE5OVo8sCQ47mSCCSjh89OMh9MZzQ7WXzBFZIbJM7CvOTPqeOdPJ4qVTGCTb4R2md4z+ekqm/e4ZzsyuXbvaVgyeaeQ+8xu/AdxjnPmRnvZUq34m+/PZq7QcEPCN573hnKV6gkogqoQYM0TgjQAIPyORf0sky0updDbNXZVDKOzhRNTfL9qE4RVWdb5cgtJCl/w10cOIMxLpKYjMaUtUn1c0WUFKYiLGN84dvQ0uh4p9iMGJY8V4guHDh9seP8pi6E0Js6HgNfaCd+zjjz+2Mz79MvJBItM49MmeXcjvTHSVrBQOdpjWmQuZaDuZSvY2axspq8KYJqvsMogpPU6FI4ixyDPHKIn1b2W/kI1LZM8jgh8EhGL9fdQ3GL/jh8NHCRuZPbLV9AxPnDjRPPnkk/bsY/4b/UmUj/sJMYngmSjuGJxmymAJGnGOlCtXLnCgi/eGZxUJjlOJ4grk8Oy4t+i15CzgPgOceu7ksFZa8HtxDxN4iLWs3O9ZoAhLyXLektho4P1Zs2aNzZwilEgW3E9BP97gI1l27l/E58I0HkMOoUio8UJpnV8UBUMqVZF1kT9IdrsO8RkzZtjIJYYyMtxEjhPZI8ceCZJZ4DLkMsk7aw8jiMPUVYIRpt4H/k7Wjgy6X08bgjQ4UGdmZsnqPPLII9apSlTUnqhxMozySIaCIAKOO9nWsGQa2BdcyPRsMKeMHih6GfMrhfareKDaIZmjfXBQ6cfCeYpl/fhbMVopc2JPJVJ1j9+P/RjLmcDvRQY2jAJHYXL2eO9ZI7JAnHmcx/SsUi5MGScjRDBeKWGLCLBgyOZyXx7vCbAvgbssAvcC7wOZfRyyqlWr2rUju0ZvNeWGlFbiFFCB8vTTT9t9Sqnga6+9ZqugaDsgoL1s2TJbfsn5ScaOc4TsK4FLv73Pc+L78lZKkY1y3R9hcvj4G4LcrzjLzz33nM1+4azRhkF1CH9LPPdzZD2wS3AEsSWDnCWR94lzMGLbYFuwB7h3kxUwidz/3IO01tA3T99mqlVQ5RCKlINxhdiGy1DgwObAlcx4+lQJKR1xZdjIRiTaqYoYqCjI0QNBOYZfJI0o95n7hP/N/glzORORYtTZ6LvBsEBsh8vRFXnEWeSSwgCMZNeIXGKgJKvEEqMykdlAxCaItCIiFevz4ezAaEukEcTvghHInqNHyq8UksHGrs8jG5DockecANaPqDHrF+vfz3vGvEvmfCZr6DHZqFgMKJ4tTm4iRW0yvZcbZ48ABA4F5ez09zIahPJA+qXZa5mk8pgoI5rzECEsAjMEwnh/Xe8ERj2qwlS/EEwhg837RAYo0jKQzGeJk+eq3OC9rFOnjnUez/xeft8w9/Lx3hIUJgCBU+Pn+KLy7NWSwPnLXD6+Buc4yD3BvUlZM4IxOOgEiF2jcyLvFTMTuUMRviKIQptMKiqceF95b8neMiYKBzRXWqXkEIo/wMtK9M31wmDwaRRFeiC6mcooMpFZSiQQciHCyiFN4IBSEtflyTw1r9p6orR5h26HJTqNs0tpHlFAyrgiZSz8HX7vBGqi9INw0fFuUBqEkZPMZ8XlmIhsPX8rGSOirfE4cmQt+Rwi9okKSGCkUUKHgRKkPAdD0lWeiXGEcZGogBbPm2dA4IDMZTw9PrwTGGz8DckKuFFmzLsZy++H8NGOHTty9uylLxuFQsoFyTDjHFOyTFknTg8Bs2zv28Px4f3iTqBaiL+fIDLvFMYzA+UJiiCWxVD5lStXWmeZ/llXYAxnIV3ldzggBPNcgXBKJnGG8usL59zH2Qrbs8IZpzeP3n2qDOgDJ5jjCphxZ+Hg+gXdKF8nyzpr1iwzatQoG8CiogQIgrIfKIul35W9gKqt60xD34CfS1CAYAr7CqVb/oZU2Du8t2QB2ctUWLFnYy1jlUMosgpedL+eFww/DaxPfXaQPoRkR8c4GIluU3LDQY5cc96yDjJmrnl9CBy4MjB8FpeIqw8ymdk/9jaXzW233WZ7FHEAueD4O8+MBJLx8yulJhLOnEAyBUOGDLGGYSyXGFF1DEuEIrhg+Swiqy7nhq+JJnoZGcCLg0XWk6h3PKVqOEBEi+l9Yg35vePNiPD9/N0YFAgNBC1P5P3gXHIZ5ZTnxRvM4vchSMD8KgyueBwB/laCDTi9KOwlMxLNZ0+aNCmmjDWqlPRKuSL7mT5zj0AX5xZZIJwZ1opeVBxoMiy8JzhEBMl43pk4GD0i4kEwCXGuSPkl7zAiV4hkUKaMQc/fj3NH5pMsCdk6DHcMZc5K3jeMfNaOdwJ7IL/9QRCC3mqv9WIteZfS9ewp/+O+c2W4qJzw2vv8d2wm11mdzIAtPaZUtFCZwF2FHgTq8Th/ONl5f2/+G2eWy+EnKMr+J9DF10eqXlwOdUQkB/j/2Q8QEUdi7xBM5t4hIMx9QdCUAfD87pwvnIXxlqQGfQewPdj79Omi2I4DyD7g98/WM04OoYi5nxBj0RXtxrBSL2HqItM4LaiaxTI4NUiJDwYPkUOiiRyOXjMMOSw5zL1U1TjQuZCCGO+oVlKakeyINpkNDBKcJ8pPKEPB+A7iaBAVxuFzGcqIAzDeAoMgFscAgwMhINYeYzTvHCaGQbu+l/JCnpff34FSIX0gCPPQd4MREc/Fy/PHUCaiiwIiRgD9UfGUTvH7cEnTH4hzHW3AifMI48L1MzDw43kXMYwJZpARiCcbyDtHloXMBKVxqQiusT6xGK08axztbBJQwEglM847QYknRjAl4ozfoSQ/k0eqcJ4Q9KLigTI7SsvJPGP4krFhJBH3CWcbjgP7gjsmWcEIslOue4szLL9e4FRB5sxrDAdnEnNRg/x+9F37zchNxF1N1QRD1Bk/QUaWMlsCt0Hm93Hn4ewHCfRRMcLeoVSfu5P7iX5JqpTyAyeSAAJ7jDOcTCF9nWR/6RmMzNdN17uFE0hlE38/47bY+37OrhxCIf4vqsfgTlemJcisOxFbJpD+ISJplE/grHGYJaocic+hBIYDmmgwpaBkjYj8+kXH+N0wnrw+m88MqobIYUymhUsjVmWwyKB7It4YQQQqKDch84dEO44FA5mJbEdr8GAEYAy4HCdKWoiwR+sIYTRwsXM5USKIgZqfU8AauWbFRWZhYdhywRGF5W/GQMBAwekm+k1GF6Mnnj3E70zfCIEDBDI4IyLN/jjafkIurv1ItgIDh30f6yXNOBXX30dG9UzRnyDZA/YzA9jpKSlSpEhcAgZkE8nG8HlEzVMlzsLPwamLJROM8ZmsfsZklgHyzhP44X0gCITxTFANKXqUJSnR5Z0Im5DVmedbRBWTvceZwfvOOUsvGO8ixjrZPDK4BId4VvzdZNd5RzlbOLfTJQTkqrDgnSTAkk6RIspaXQE/nJwgWSO+hvJRRGxcff5B1D257zlPCZiixMm+RYSFu4Jny3M9M/sXFEqeo63O4Tlxx7Ee7MX84DO5x1OV6fPTMGD9CIp06dLF3k8E3gh8ZJsyqBxCkRLIVngdHBgWZEakNpfYSCUHF5E1nIxEKoNGon70utEPiAPB5RXt74jTiKiMyyEMYjxi9GOk0XtFqVK0DiEOIJFHRiJgDFFyRMQ/kZFmBCKSMfcJgw4jLmg/FoZskKgzlzCXII4xxmOiIrHsQy5WSjjzExsg0xB0MHN+UVvEh/jceM8Sv944nE7esSDOBIEKDEGMCTLM8a4hBhMOJUPDkz0uxCt7EUvfLoEjjNBMGJ3Es+VMwSBnr9Ljx3nH+5AJvX2ReXM4AARjcaQ4q8m4sG8Iwuzatcs6BJnSroEmAVkhV6VRuvcXgUNX4JtzIMjn4HBQJYHiqetv9jpjaRXg7mfQOU4bPXWR6otEZ8cJmmZTbyvOJ1loymZZQyovEArib5VtKYdQJOjgoMbb6yWkDEXRlvgygURxKfmgmRnDEwM5EZE1PgMngnJHRA8QQUAQ4ciRI3FdMPzOGCquyBylVzicEZU4oDeHPjvKToh2UroRS2kWhh0lRjiAkQxVskYHUD6WyKZ1/l4ygpQdRvPekOEgq5Tq3hScbvosEQUgS3bmvokI6LC/Yvl8RCkoXUvEpc2+9ovKY3Dn19saGWjM34ghxlgUSlfj7XGNOOj0/WLcxRKASVTJOUZqtNlBgiG0DoRpnAN7kP1CCTTvESVsGICU6tG7zB7AiA+LA8jvQcaEzApnMY4CThBZe85B+rRxOOjLxtljf3Je8sw4azO5T5/fnYCfK7DJs0t32Z4rQ8g7Q3CW94D9xjnD8+H/Um1A0BCnHTuJ5xpLAJFziYoWnL9U2VPYAskWPUumaipnMw4g7z2q5dgD3EUES2STyiEUSbqAp06dmq9IBIY/kSwJy0QPBxeGJwYBJSGJPJQxQDjo6ZnD2CBrlsgLlz3xwgsvBO6TQMDAb35fNP2AOM579+5N+jNCRCBRvSCU/BI8iUeh0dW3mUjICNEfF5HbdmXtcKDoDYlm/xKoIAtCBserTzUW6LX06gPKC5FxZpKRbaEkG0U5DAoM9ESJHHE2EkygZ4uZVek+I8mYRVvSzDmCYmA6e7vyKhpGhk8zg5WAE0GhsGX9cAYQhSJ4QyCFDCXOAhUM7733ns2EpXs9UwnnNOJdrl7HMKiVk1kOKrTEu819lojqHT6DYBrB03TYdgQhXO0IYXIAKZUmgMjsQQS4EDqizSWXBWDkEIqUw2VMD0leow+jjtLARM/yylaIahPtxQnEoalcubK9gBJVY8+zIfpMSRpG07Zt25I6K4zIKE5OKudacSFQOpWKcjtKXslgxvt8eMaUftHXE6Th3y/LQ9YqGaU2ZLIIItAbijgAkWo/JyYy7y8aw4ivZT3odUx0FJey2iDqpvy9OI5kkogwJ2pGXES9kRJFeqs5G8NQTk+JdyxCMpTXpvJ8j2T/yMxjoNPXTFk1jjq/P2Wf6Zz1FhlQTVCGPcN5i9PPfqb6gp5Q5jsSgEOkhWxwLs/q5XnyTrr6bbmvwvC7EpgiyJDK8kb2EedtOgNG/Fwccs7xRFUmxbMmBHhYFwIF2EgI2jzzzDM22IdNw72ci6Mg5BCKUMHlFlEnJCOA6hS9AVobtxOIwAfRPyLF0fYURAMlaamOPNM/mopLAkcFsRGEYVJlyKCcGU8EmAuNLBsGYiL7P3DE6eVLRGYEAwCDFlEhym2iMV75WozgaDKWGPWUxsXrGHtBRjMVGdT8xkbwTOiD5PmEaYAxTjdZymj3ckRII9m/H6IvGMSUzNPzg7hULAJNiYYACf2WZCEjoxgYpxIZnI5hqt55/0AElQCuSgQy9GH5fakYiFUUK9osMkJllKmGKbtF9QoCdgS0kj0jmDOTtabEm3uSclucY2ZVcmemo8dayCEUUTo4OIb0bkiq191jx2HP4Uq5TKzqmdE4H5RTpfrvJItEA3cye9joe6L3KllOhFfmi8BHPMOAUfaklyEZvxsXN3OkYnF+cCTpU6VEkt69WLNYlJL6jXfIW+ZLQCTZwhGpdgj5WWSRKamnNC6MZyJrHm1WmUwY712yjDIqF8j+0TNFhohKE3qo0ukAEhzhrKbMnkAHzjAOQkTRUfdd9NB37Kdcm6ogX1AHlhaLZGXJ+FwCRyghp6uXOMj9gpgWQQ/agQj8cxdyhkSrrMz5iLAZ30tQhWwfcwfREGBvIERGNp2yT/X8ySEUImscZYwGekSQdae0MVEy5kSqXaIr/AyMt2SWh7rAoSB6nqiyO9aNC4RsC6qI6Si5wuGKpacTARaCALHMz4sl84MoQPfu3a1BzcUbcYbYE1zeROAp66VHhAwyPYiI/LCm8WY3mDfl53yRlSLDghR+KrJmZOJjGbgejaPEM6aPBWcmUvYa1h4WnBgi79GeQzhGiRgxwTuAwY9TxbMhCMFe5BlxpqVSzIKfxftAxorfgXVB3AlBGoRccAZ4L9in6omPH0RXyDS5+sppnwijQzR06FCbIUuUY0hpOmXPlJEjhpQpPW+RYfOccbwb/O7cbdzLEXDqcB4j0BpBVRQOL2W4BHL5Xj4jMqxePX9yCIXIOjjwOBAxLCijTZRwSiTr16xZMyu8wdw3l5R90BlJycwUMpQdRy7WS5S1Qy0MsRoMyHSWYxEljtbYxMhEqCTVDiyXNk45PRb0jrJ+CFgwr4oM4MaNG5OSqSR74pf5JitIJjFVexO1XvpOkiFogHogDg3y9EHGVoQBqhSiVfClnC1eQx2jcdasWTYbwFB0ghKJHp8TdLQLWShULOk9xinlbCEjofsruWcS548rOEOgKKzjAPi9yGCzd+IZ20MFBQFierLTFbAVQg6hEEm66DAGmZc2YsQIqw6WqGHxZFsQTaC0AoOevhpKtjCsXMqHRGHDoFpH9A/HEGEF5rbRm4baHv1/lFAi3kFZGM4tBiLOI+UzZLgwQMlcJXOERDRQNhbUEeTvwmlnX+RSZiGiLnpmAID/jWou/WD0h6WjTI09Fmtggu/DKeIz6tSpY/r162f7AnE2M6msCaeHctZozyCcp6DPjf2O0BHlsoyTYa0Y+E52hTVMdgaQzycoEelFIgtDnx/nCednZCg7QRplJVKrN8C746p6oaQ+7H8H9yr9bKjEctZxZ1H9w9nAuc8+RxeA/8aZhwNICTT3NzYCrTUqhRRyCIXIMuhjGzVqlK2nT5Q0fWT+EJcI9fpcInl75TBoyBK6vn/atGmhXK+ff/7Zlo4QkSeLSpSUqCvriKoZfQphVQu74447AjkOPDdEEXJVXGL16tXWqc8rFNC0aVNbSpSuNcH4RyAHAy5odJ9nWaZMGftu4xC9/PLL1gnM1IHGBGfI2EdbsVC7dm0bmAli8CP5Ts8mpZcYxPFkUqJx1in7JBDHnEgUSMmKc75Qoqh7KhxQseJ6jgQLM02QLhLwpEyc8437jKqMiKos7w0OpMqNhRxCIbIIosk4NFwAzCjDKSMKnQjBCnq7cAKJ3hMl5YLxukgwulxz1ci0JaMcMNdBVMIlyoIBTFkpEeBczjywZ5HXp4wS9UWMI4IYYcnkk7Uik4/Tcv3119vZcJQl4/ghykPkn9I2DDwMOvrdsmFMAOdWqVKlop7vSXDjzP2MY0+WjTLQefPm2bmEqICSHUmWExiR5CfwRv8VWUfKdWfPnm0zf/x9OOsyvsMHe4V3zLXPqB6QQqsQcgiFCLWBe+TIERvhxPBhDleiDBw+i0HFXIZkzfyMGSKSlEC5+pqQkw+TxH02lUPSM5bfM+zRo4c1SrVOIozg0D700ENRB6ko94woaeIUEmgiIIVDTR9gMsV6IuWflMxTAk/J+ejRo61wUa6VYmf6/TllyhTnXmH0jIKYQsghFCKUlxjiMAw9pQGcCysRJaFkkrgY6QnECeTzySgF/b0YI4FgjCs7SGZDzzA5GWLKgMgC1qtXz6pKDhw40JYRkjnWGomw7luU/lwiVPlB5nTPnj22HxAnEIcMpVH6pBLRH52f84cTSp8hJceIz5B9JFCGuqn6rjITHD3OSldg9LnnntNaCSGHUIjwQMkRPVA4a8j2J0IFD0OHclD6lyg7pBw01rIbBte6hDF69eql7KAQ4ncIOJHNi7Z6gVlj9OQxUiOZc/4Q3aB8l+AK/VfRBMhE+OEude0Bej8zRaFXCDmEQmQ5CCLQ74QgCJH0REXAUdN88sknbYQ9XlnztWvX2h4d18/bunWrnqcQ4nfmzJlje7RiGauRLCeQXmnORfoTCZClQ3lWpCY7WKVKFc+9gOAUFRcKYgohh1CItEDzOiIEDCBGSAKRlkTIoWPsUO6EKiGz3lAHTZTACNlB18/m71BfjRAib98rc/dSPesv7xxR+m4bNWpk1T+ZgYiKMA6ARj5kN5T4Dh482CkyxBgKlKW1XkLIIRQipWCI0JPC0PiGDRvaCGWiMoFdu3Y18+fPt9LZiVZL27Vrl+2t8fr5RYoUseVWesZCiIiQDGWYiVBBjlaZlFEV9AC+9tpr9rwN6ygZkTwYI3SmCNeZjB8/XmslhBxCIVID4jDIoyMljxNIT0y8JaE4Zwi4tG3b1mYZkabPOyswkSBY0qlTJ2e/T/v27VV2JYT4Q4k5Cp3JVgGlKoIsZPPmzc0LL7xgg1f0O5MhUhYwN6FShSoZV787PfoIFmm9hJBDKERSISr93nvvme7du5uKFSsmpCcGhU/6DCdPnhyzOEw0YFDxN5ABdDmnDHbXMxdCRMr1WrdundRSUOYAUmnx5ptvmv3796sPTPzOjh07nP3u3FmMolCLgxByCIVIivOEE0iEmkZ11MsuvPDCuHoDiXAWKlTIyq2jEMpFR1QzVRcZWT8cUFekld5CGWNC6PxDJZkSTeYHxiIk43UG8llFixa1SsnPPPOM/RkIhmgUhDgTssNUtLju3ZtuuklzB4WQQyhE4kEgZsaMGea+++6zTmAiDCEcSsY4MMMLQysdf9eiRYucPUCMs1ixYoX2gBA5DCXrs2fPtmMiEjUsHjGQ8uXLW7GqiRMn2hmckSH1QngFJdiHrlm5zJrkTtV6CSGHUIiEXDz07O3du9cMGDDAOm8FChSI2wDiIrvzzjvN66+/bg4cOJDWCDiRViKprsg9xhpfpz0hRG6df4jGUKo5YsQIq9bI2eWqJAiSCcRYZ/A8cwEZCo8wyOnTp7XmIhDcyQgKufZZ06ZNlVkWQg6hEPE3qx85csTMmjXLtGzZ0how8YoiYADdcsstZsKECVamPQx/Jyql9Fi4ov1kB9esWaN9IUSOleS9++67thoCQZd4M4GcocyK69Chg1UFZSar1lnEcmf5DaEvVqyYWbVqldZLCDmEQsTO0aNHzbBhw0yDBg3s3MB4DaHixYvb2VirV6+2JVdh+luPHz9urrvuOufvf/vttyvSKkQOZQXnzp1re4pdgh3RQLaGaoidO3daNWats4iV3bt3m+rVqzuDr126dLGq2VovIeQQChFVxPHw4cN2rANGECWh8ZREcSEhj86oiOXLl1sBmrDKovtFWskMMPhe+0SI7IWePUSyxo4da7N48Zx/Z0LASfMBRaJKRbt16+bcb5dddpkd/6T1EkIOoRCBHcE9e/bYbGC9evXiFkmgNxDjZ/To0WbLli1JmxeYKA4ePGiNP79Iq+YOCpG9UL4+ePBgU7Vq1YSMzMkLs1jpEdScQJEI1q1b51u+PHDgQK2VEHIIhfDnm2++McuWLTPt2rWz/XE4cvHMyapQoYJ54IEH7IBmVEJxNMO+BpTTIBnvUhZF+W/btm3aM0JkGQjFMNKBUnbGPCTaEYyIxzz22GMqERUJgXYLP/GzWrVqWQEkrZcQcgiF8OyLYWQEAirMuGJgbbwCCYjNTJo0yfY0ZNp8PiKtGIKuv5HMqfaOENl1DhLkYdB7yZIlkzZQHkqXLm2FubTuIhElzZQzE4D12m/0+0+bNi0jArJCCDmEIsVQ7rh9+3bz+OOP24yX60Lxi3ZTUspn8FkbNmywKnypGhyf6D6MZs2aOf/eatWq2Uyq9pAQmQ+iUJTHU05HICieqoggRIxzrb1IBNzhZcqUce457jQJyQghh1CIP3Dy5EmzcOFC07Fjx7gHyBcqVMgKxMycOdOcOHEio9cFB5a/45xzzvE15jLR2RVC/DEjSAnd008/HXNGkHLSIkWKRCWq1b59e80tFQmBkmPuX9eeQw2XIK3WSwg5hELYsk2yWm+88YapX7++FTSIVS3v7LPPNpdeeqntgWEG36lTp7Jijfbu3Wvq1q3rXJfmzZtbh1p7SojMDfwQvBo/frzN9nOeRVsRQTUFo3cIDl177bWBvxfjXL3HIlH7mHElLiEZ+uD79OmjXlUh5BAKRRB/MevXr7c9b/StxCOCgBPJzKxXX301KwcnP/zww841IHO4adMm7SshMhSErWbMmGHq1Klj/vznP8ekDHrPPffYCgt6twiwBVVgxjh//vnn9RxEQvjss8+cMweBYMUXX3yh9RJCDqHIVWgeRynvvvvus45grEp5OIKUhXbq1Ml8+OGHGV8W6rpc/SS7UV6VRLwQmVkeSq8Vzhxl37EIZVHquXjxYnP69Gn7mV9//bVp0qRJ4EqL66+/3n6PnodIBI888ogtQXbtOTKIWish5BCKHASDgyHyN954o3NsQpDeQAyYqVOnZn2J5PHjx02LFi2c61GuXDmVegmRgWV1BHsob4+2NJQMIkJZvXr1Mp9++um/ffaIESMCfxYDwVEv1jMRidjT77zzjnM/4yi2adPGjlDRmgkhh1DkEEStiQYyNiKWCHhe0ZS77rrLXjjHjh3L+owYl+tLL73kXDOyqwMGDLBqhNprQmQGlHTOnj07pqHyVAvgCG7evDlfo5qRESVKlAj8eYyykOS/SAQHDx40DRs2dGam2ZsrVqzQegkhh1DkAhG5dOb9EcmmrCkWJ5DeOMQViKIfOnTIjl7IlTVEZdDPsLvqqqukCihEBjmCOHKtWrWKepQOiqFkVii39woA0ZfdrVs333K9SMk9/YoqFRWJ2tuog7v6X9lzo0aNUgBCCDmEIhdKRnbt2mXnZlWsWDHm/kAcyEaNGpkXXnjBOka5NkoBw+7+++93rlHBggXNvHnztO+EyAAI3EyYMMFceeWVUSsnI5j1wQcfmJ9++sn5M5YtW2bnFQYVoZk7d67G1IiE8O677/rOybzmmmsUwBRCDqHIZhgkv3XrVtO5c2c79iGWAcpEtTFmWrZsaQUSUAvNRWOF6On06dOdQjKsb+/eve26a/8JEe7MCWNjbr75ZnPeeecFPg/JINaqVcvMnz8/0PgcgkjRCMn06NEjpyouRPIgCHz11Vf79qouX75c6yWEHEKRjWBQrF692ip9xjpIHgOmUqVKdrTCli1b7FzCXF5TSm0ps3WtWZUqVcyBAwe0B4UI+flI2TzCT9GciZTJjxs3zopKBf1Z9GkH/fyyZcvaEnw9I5GIahYCwa5SUUTkhg8frgCEEHIIRTaBmAuXAM4bIi/FihWLaZA8/YGIKmD4UBYqYZT/13vZoUMH35lhzFvUXhQivGckDlf37t2jEtJCQZnMHUGhaAJjfD3ZxCA/g9mEOKkqFRWJaBFZsGCBb+abmYMqFRVCDqHIIn7++WdbzhnrzKyIWiilTZRFquTxj6VlkydPdg6TJgqLwxiZNyaECF/J99KlS22WL+iZSAk4JXf0YUVbIUEQqU+fPoGG2RO4Y/6rjHORCGgT8atmoQ1EqqJCyCEUWWTkbNiwwWYE6RGMxRGkJ4YZhMwi/PbbbzVIPZ8of+XKlZ1rWLp0abNx40atnRAhLZ9jPmqZMmUCn4tk/BkdQ5VELO81swwRiAkajKOfUc9KxAs9/nfeeaczEIE43BNPPKGZg0LIIRSZDpFkSkIYjh6LUAwRaUYntGvXzjoyWlPvzCtS9H7DqMkgar2ECB9Hjx61JaI4eEGzgrfeeqtZtWpVzD8T1VHO5qAl+qg261mJRASIURL323MEgE+ePKk1E0IOocjkHpiVK1eau+++O2axGOZmoYS5du1aX7n0XAdBCOTlXet50003qdRLiJBm9wnoBA2aoSA8ZMiQuGcAEqwLcj4TmLvlllus06rnJeKFESiFCxf27Ydds2aN1ksIOYQiE8Fx4xCnTw0HJVqxGKLQKIY++eST1tjJdcXQIKDS6teHgSqgLlchwpcpYVA8M1eDDIPna+rWrWvf5XiHc3/11VdWrCPIuXzJJZeYdevWqdRcxA37vXr16r7CRePHj7d98VozIeQQigwCtbAdO3aYbt26xdQjSDkjjiCKofv27Yvb2MkVfvjhB9OgQQPf9Z0yZYrWVIiQVVEsWbLEKiUHCZwRYGvbtq3t+UvEz8fg/stf/hLofO7Xr5+emYgbBIzYw377rU2bNubEiRNaMyHkEIpMOuAxUB566CE7ODaIUl1+GUF6U4hYKyMYnQAFfRiuzAL/Ro+QmvKFCA+8j4sWLbLBsyDOIOVzY8aMsUIcicjScWaXKlUqUKnoNddco5mlIiG2AuNK/FobrrjiCu03IeQQikzi4MGDto8F5cpoS0OJTCOrTpT68OHDWs8YSs1mzJjh2//DAPpt27ZpzYQICQS96PmlRzqIQ8Y7PHv27ITN/aOsv2fPnoGCd/QqvvHGG5o5KOLOhr///vvm8ssvd+43AiSoiKs0WQg5hCIDSkOPHz9unnnmGVvqFFQRL6+MdIUKFawjiEy6DI3YoKyWSKqfRPycOXNUKipEiAI5zAqkmiKIimj9+vXN7t27E1o58eGHHwYu62dMEJUIenYiHo4cOWJHIrkCxwSJR4wYoWoWIeQQirBDudK0adNMzZo1o+4R5LCn9Oi5556zMwS1nrFz7NgxKzfv15OJQqvWS4jwZAZxBv2yJJHAGe9vos9KnLvrrrsu0JmN05qofkWRu9ALeMcdd/jut+bNm8sZFEIOoQh77T+zrpAdR/0rGkeQHjbmCI4dO1YZwQT1Hg0fPtz2XrrWncwC6601EyIcoNKJ2q9fef25555rBg8enPARMZThUXoapKoDh3To0KEy0EXc99XTTz9tzjvvPOd+o31k69atWjMh5BCKMPLrr7+ajz/+2M4SjHaofKT3BaOCzKLWMzHMmzfPFChQwLn2xYsXNytWrNB6CRESUGDGGfQ7N8ke0hucDEeM0lMM7yDnN8E/qTyKeKH/lOCCa69dfPHFVm1X6yWEHEIRQihVevTRR62BEq1gDEInlDvt3LlTqqEJZNeuXYEMutGjR6tvUIgQ9U+h9Osn4sK5OXfuXFuRkYze7wEDBgQaM4EBT0WInp2IB8TM6Bv0229kw2UnCCGHUAsRQuNl5MiRpmTJkoEGJectDaXnpGvXrubzzz+XQ5JgKP9s2LChb1N+x44dE15qJoSIjR9//NEKs/idpWQPGUORrHOT4Jxf2R5QTtq3b18NBBdx31f0qrruK/bagw8+aE6ePKk1E0IOoRYhLGAALFy40JYKRVseiqGBI0KZonpOktPDef/99/tmGBD7kQiEEOEA527ixImBMoPJdAZxSu+9995AZ3mNGjVsQE/PT8QKY02wB/z2Gn3uGjklhJBDGCJH8JNPPrEHOGMKoikPRWCmZcuWZunSpdbo0Homp4+Tpny/Yb4Mrl6zZo3mNwkRAngP6Yui0sL13l5yySW2zypZziClom+++aa56KKLApWK0qOsM0TEyg8//GAGDRrkFD3Dxihfvry1O7RmQgg5hCEA0QDmCZYrVy4qR5Dyp2uvvdZMmTLFOixay+TBAGua7v2GRz///PPqwxAiJCCkVa9ePd9RPBMmTEjqnD96wf1+jwi33367np2Ii0mTJtn7yLXPihYtat555x0pjgsh5BCmm59//tksWLDA9qT5ZZ7ONGBKly5tewyPHj2qPsEkZxi2b99uR3b4qbk+/PDDtkxH6yZE+iEw88QTTzj7Bumf6tmzZ1IDahjcY8aMCSQkU7FiRbNp0yY9PxFzeTSVQkWKFHHuM+wNyqiTIZwkhJBDKKIwELj0u3XrFpUjGInqoRx68OBBrWWKmvIbNGgQqA+DMh2tmRDhCOQsX77cjn7xemfpKWzbtq05fvx4Un8XAkqlSpXyPUMiRroCfCJWGE915ZVX+pYko1wuwSIhhBzCNBopOA0vvPCCzfD5iRzkzT4RyW7durWVISezqPVMPqdPnw40+7FSpUp22LXWTIhwgMJvmzZtnNlBzmDmEia7CoQAXhCBMAJPCiqJeFpPateu7dzz2BK8F8eOHdOaCSHkEKYDSjMo5WjcuHFgRzBSHoriKKWliuiljlOnTpmHHnoo0KzHDz74QGsmRIiYPXu2b78vX5Ps34MsZcGCBX3PETKZ69ev17MTMfH111/bgLHfPsNhpJ9VayaEkEOYpkzTiBEjfPvQ8lO+e+qpp2yfoNYxdTCyg/7MAgUKOJ8PUX+U3FTiJUS4gjnMXnOJcXXq1Cnp2TiCgE2bNg00c5Bh9RIGE7GAsniHDh18208QrSNAoTUTQsghTDGUC5EVrFWrVuDh8pR0IE3OAc8cKimApRaysOPGjXPKdUf6MPr06aMSLyFC1p+N6rIrmIPUfrJLRRG0oTXg3HPP9T3zcV6T3ccosjf4wWxcP3XysmXLahySEEIOYbrq+VGdRAQmmlESOI9vvfWW5gmmyZhk/lfhwoV9n1OrVq1UeiNEyMCx8svKkf1P9u9x4MABc/XVV/ueI+edd56V/tezE9GCojUquuwh1x4jwDxnzhytmRBCDmEqoexn0aJFpmbNmoFkxiMlTETwhg8fbnsBFMVLDzjiLlXCyLOiD/TQoUNaMyFCxuLFi50G8lVXXWW++eabpAeW+vbt69srTsk5QUOJhIlYqo+GDRvmWyaKM0jGXOMlhBByCFMIhgZOnd9A2LxQUnTnnXdq9lSa2bBhg1Ud9Hte1apVM9u2bdOaCRFCUAV2lXk/++yztpwzmb/Dli1brCEe5CzZvXu3npuIil9++cWMHTvWtxyZfx89enTS97sQQg6hyNN3tnnzZnPjjTf69p7lVQ9lNtXMmTNtH4CygukDZ7xOnTq+pb0M+127dq2elRAhBCl9V4YfB2zPnj1J/R0Yd0H/t1/POEIyr7/+us4SEbWtMXnyZKtu7dpf9ND2799fPe5CCDmEqYIDd8KECebyyy8PnBXEaezRo4fZt2+f1jDNIC5RpUqVQIqvr732mhRFhQgpvJ+uctF+/fol9efj3M2aNSvQmAmqQlTGJ6JtR5kxY4av+jVQsiwdAiGEHMIUCZAwDqJ9+/bmggsuCOQI0lOCwh2HuiJ36QXj7ZNPPjENGzb0fW70+kycOFGy8EKE2Fh+8MEHPbP8/Pdkz/mjrwtRML/z5IorrjDr1q3TcxNRZQZRrSUw6WdjtGzZUqq1Qgg5hKmAmvw333zTZpaCKojSU8Kg88OHD2sNQwB9PkEyg0RjH3/8ca2ZECEGVc9rrrnG8z2uVKmSnS+arJ9P5QD9iUGCgpMmTdIzE4FBTZSAJD2wfoJnBKiPHDmidRNCyCFMRUM3F7pfpC4vZcqUsbLPKuEIT5lo/fr1A2UGUQGkL0jrJkR4QRSKHl+vd7lXr15JLffevn27qVy5cqCxQhj4emYiaGZw/PjxgUSKmjRpYlXKtW5CCDmESeaLL74wbdu2tY5CEEfw/PPPN/fcc48VO9D6hQPKxqpWrRqoz5OeI4k+CBF+XnnlFaeAF/2FySwV7dixo++ZUqJECTscXM9LBNUnGDp0qG8VEvu7TZs25quvvtK6CSHkECa73+zjjz+2EbigWUGGm1PmoexSeCCKj5qo37OjNKdz587mu+++07oJkQH07t3b830uWrSoWb16ddJ+Nk6e36ghgoiUnlNhouclggQZRo4caYPKfvfVzTffrLm4Qgg5hKk4mBGBKVasWKB+QS7+5s2b21l1UqQMD8uXL7ey837PEDn4Tp06yZEXIoPgzPV6p2vXrm17DJPxcwkaMW7I716gv1FnigjCyZMnbYmzX88gtkarVq3kDAoh5BAmm9OnT5unnnrKd+ZPXuEY5J5PnDih9QsJOOU4gyj7+T0/nEGa8qXQJkRm4VL3xGFLxpnM2TJt2jRflelChQqZhQsX6jkJX7755htbneLnDEKLFi1sG4vWTQghhzCJJaJE6ZAxP/fcc30PZrJOOBwLFixQSVCIQA32jTfeMKVLl/bNDKL+R7/nt99+q7UTIsNwCcq0bt06KQqjzJGtXr2682yhv4tsj4RkhAvGWH355Ze2/JPApF9m8LbbblNmUAghhzDZfP7557YUAychSIkoEeitW7dq7UIEjvnLL78cqAeDaCxiQSrpEiIz8VJhxFl74IEHkvIz+/Tp43u21KhRwxw8eFDPSPhqFDRq1ChQWwoCMsoMCiHkECb5YGZOYL169QIpieJI9OzZ0879kRpleCAaP2rUqEBS3TznHj16SK5bCDmEgWGO6WWXXeZ7tsyePVvPRzjLjhmZUqFCBd8ANNlmemWlJiqEkEOY5JKNZcuW2RKgIP2CJUuWNBMmTDC//fabNlGIoOSTPs6gY0Eee+wxrZsQcggDc+rUKVtR4MrmYNwjTqVSUeEFMwZnzZrlG1iIBJ+ZiauWBiGEHMIkQ5SOXrM//elPvofzpZdealatWiVnMGQgHHH33XfbGYJBBGQGDhyoMlEhsgCXUd2uXTvbT5yonzV//nzfMRPlypUzmzZtUuWIyBdsBwbOX3LJJYGqWHAGEbnT2gkh5BAmsWTjww8/NJdffrnvwYyzeOutt1oxAW2c8ICxt3nzZjtWIqga7Lhx47R2QmQJV111lef73rRp04QFfsgOVqxY0VegCjErPReRH4xA6dixYyAl0YsvvthMnTpVwWchhBzCZLN+/XpTvnz5QI4ECmBq5g4fSLpXrVo1UHaXyP7EiRPtfEmtnRDZQcuWLT3f+bp169re8ET8nOeff972cvndEyoVFfmxc+dO06RJk0CCdYULFzaTJ09OaHZbCCHkEOaTVVq5cqVvtBcoQezWrZudEaQNEx5++OEHM2nSJOvk+amz8e/Fixc38+bN0wUrRJbh6hsuVqyYWb16ddw/gxJQv/uibNmyZu3atXom4t/6BV9//XU7niqIkuiVV15p3n33XVvBpPUTQsghTHJmkBJDv8OZOYQYG5QKabOEh19//dXO9/IbCh2hcuXKZsmSJbpghchCGDGTTLVPgkiIxLgyO/zb2LFjrfGvZyLyBi4RoAuieg2VKlWybSxaOyGEHMIkQpM/cwZr1arl6wwWLFjQjBgxQs3cIQI12E8++cS0aNEi0GgQvqZ+/fpm165d9nu1hkJkH8xxcw2nR2k0nsoAAohnn32286xhjpxK0UVeW4ORVO3btzfnnXdeII2C6667zgrc6a4SQsghTDIc0PSb+PWbkRkcM2aMzURpk4SnzHfBggU2ghok0hqRnE9U/5AQIpwcOnTIXHvttZ5nAWqOZGpi+WzUixETc501lKV+9NFHehbi97uKihRmGge5qwg23H777bqrhBByCFNVx9+5c2dfdS/KEIcOHSphgBBx8uRJM3r0aFO0aNFAFyzPkJJSvk/rJ0T2l5DT5+0K9L311lsxZXnmzJnjHDPBCJshQ4aYf/zjH3oWygpauwEVa8ZTBekXLFCggBkwYIA0CoQQcghT5QwiQBKkxBDHQ5nB8JSIfvbZZ6ZVq1aBHMFINuCll14yv/zyi9ZQiByB6oHzzz/fOX4i2vJ/jPt7773Xed7UqVNHgSdhoZ2hdevWNkgQpIIFESL6X7V2Qgg5hCkClbkyZcr4Divv2bOnnMEQRVuXLl1qateuHUimG5gn+dprr2lukxA5Bs5e6dKlPc8GegwXL14c9Wc2a9bM8zNxQN9//32tvwKXZvny5aZGjRqBxh/hDDIqadWqVRIhEkLIIUwVlGK4BhcDs6UefvhhCciEqNdz5MiRgSKtEYU/5n8hHqP1EyI3GTx4sPOcuOWWW6LK5hFY6tevX74BKVoPnnzySZWK5jhHjx41vXv3Dqx4zRgrss7qFxRCyCFMcanooEGDfA9pRAO+++47bYgQQInoTTfdZC/OIBcsCm7du3e3whJaPyFyl23btlmBF6+zAieOeXDRfObmzZttad+Zn3XDDTeYr7/+Wuuew1nBZcuWWdshSFYwUoXUp08f8+2332oNhRByCFN5YM+dO9cULlzYKfXcuHFjc+DAAW2GNINDTv/mZZddFqgZPzJsHgNPZTdCCPqGyda4SswZ+r1v376o7hEczdtuu81WmtAz+Mgjj5gvv/xSa56jjiDZPbLDqIMGuaugQoUKZubMmcooCyHkEKaa48ePm4YNGzoPaZyPlStXau5Pmi9YmvEpo6F0N6h4DPMFGeCrZyeEiMDMQFeWkDPmwQcfNN9//33U1SZkBAlc/etf/9Ja5yhkBRknEU07A0HnjRs3at8IIeQQpsPJmDhxotPBILo3fvx4ORRpAtEYjLIZM2ZYwZ+gwjEIOaDkRp+hnp0QIi8Y3fQSusr4OPsnTJggA10E5uDBg6Z///52nETQoCXVScOGDbN9hlpDIYQcwjTw+eef2xINV6lou3btoo4Si8SxadMm06FDB2ucBb1gyei++OKLem5CCE8IFlWrVs3XWGdUBUPEtWbCVYa8aNEiU7du3cD3FPZFzZo1zfz587WGQgg5hOmC0h7q+10lHYgErFu3zmaptAlS3ytI9haJ+KBZQZ5lgwYNzJo1a2TACSF8s4T0Fl900UXOHuRSpUrZsRG6B8SZcM8QWKaVgX0UtFfw3HPPNXfeeaftU1UGWgghhzCN7N+/3zc6PG7cOD38FIOEO3OXcOyi6RVk0DwlYPSEah2FEEEzO3379vU9X+g3XLFihcrPxe8wqurpp5+2AYOg9xTQ+jB16lS797SOQgg5hGkGJS+Xw4HKnOTCU98r+Oijj5oSJUoEvlyJyFapUsW8/fbbumCFEFFz7Ngxc+211zqzO/xb5cqVzUcffaRMYY6DAujixYvt2KOgojER4ZjatWubtWvXSvFaCCGHMCxlHjVq1HDOoSI7qFKO1JWHvvrqq85+zvwoWLCg6dKli+Y1CSHiYsuWLTaw5HfmMMKGCgZlCnPTEUSdtmPHjlE5gvQK0n6CON3p06e1lkIIOYRhYceOHeaCCy7wPMCJBO/cuVMPPgU9PBs2bDAtWrQwf//736NyBuktnDNnjvnhhx+0lkKIuIOES5YsserEfmcPjuNbb72lPuUcAvXQnj17mpIlSwYeMB/JCt5zzz3WkVRmWQghhzBkjB071vz1r3/1PMTJOunwTh6Uy+zevdtGWgsUKBC4ER+KFCliHn74YTvwWc9ICJHIsnUUHylZ9zuTOLcGDRpkTpw4obXL4ntq7969to2BeycaR5B2lGuuucbMmzdP5aFCCDmEYeTHH380bdu2dV74KMrpoSeHU6dO2UZ8ouzROIIRiW4uWPUKCiGSAaJWs2bNCpQpZBTOXXfdZVUmtXbZBTMBn3rq/2vvzn6rrNYAjF8bygUCIhAFFSsGDTEOKEpJUMtUQQ0KSqPWOIHGAIIkaBQBARMVyg0EiEYFHJiiQkEtKiCJgEPQqHVEExpChJT/YJnnPdk5PRy63UOH3fa5+MUAHXa/Xb/1vWu9w8JoPJfPOgWyXZ544on4vTC1WJIBYYmizTOBRba6NB4KfNNbD4sijRto5DNixIio0cwnEGR3dsGCBdHkxwVWUlufDNXW1uaUxk5KICUG27dvjxozr1/nft9//PHHyCAqLy/Pq04wM0ri1ltvTfX19ampqclrKsmAsJRRs0ZjgJZu6hUVFaYitqKTJ09GIDh27NisabotqaqqSnV1ddbrSGo3PNDTWCzX2ubzzz8/UkhtcNU50VSITcd/G0WVre/AsmXLHHskyYCwsyAdlFSflm7spHr4hhePERI7duyIQJCHqnzSbth1Z4f25Zdf9gFLUoc4depUBIV9+/bN6f7FiRJ1Y6tXr477nxuLpV0vSvkIp3k1NTXpwgsvzHvDkjrBIUOGpGeffTaazlgrKMmAsBOhPiTbTX7RokW+4UUGglu2bIlAMFvg3dKsr4EDB0ZQ3tDQ4PWU1KHohEw66NVXX513ZgObjwYJpYdGQGStTJkyJe81KrNOMYx+1qxZ6eeff/aaSjIg7IwYYJ7tZr98+XLf8AJqBBn/kAkEe/funfciy+76mDFj0kcffWTTGEkldX/79ttvU2VlZWQv5Bo0kEb68MMPR12aKe8dexpIX4BffvklLV68OMpCso2dylbPzuc9+OCDaf/+/daMSjIg7Mw2b96c9aY/d+5c3/A8ds+PHDkSqZ3Dhw/P+WHpzPTQG2+8Mdq9u8BKKuXsh+effz7vmamknJL18Pnnn0caqteyfWTGG61bty5NmjQpnXPOOQXVB6JPnz4R3B88eNDGZpIMCLuCDz74IOvCMHnyZGs/ckBbbmonCATz7caWQXroM888k3744QevqaSSx6bVmjVrsjYma+l0iTo10hTJgvDEsO3QEIjawPvvvz+axOTT1fpso0XuvvvutG3bNjNXJKkrBYRff/11dATL1jr6xIkTvulnSbthGDwB9Z133hm75PkM6m2eSnXZZZelefPmpcbGRndbJXW6eyEnT9OmTYsxRfneA2leQk3i2rVrY1YdmRZe1+ICQNJyaWI2f/78dMkll8Q1znd+YPPyhcsvvzzWqG+++cbgXZK6YkBIEDJu3LisC8KqVat808+on6Gl9k033ZTKysqKSrt5/PHH06FDh2y2IKnTp5DSpGzkyJEF3Q85uWImLlkSe/fudf5tnv78889IB33ooYfStddeW9TalHHVVVdFZ9nDhw97jSWpKweE7O5SB0LL6JYWhSuuuCJ98cUX3TZ1lB1Xdq7fe++9SJc599xzC04LpUaQ1NDHHnssTmetE5TUlTbMmD23dOnSyHwoJGuC0ywyLki/51Tq448/jpR8N83+u2azJnFNmBdYW1sbA+D79+8fGT2FXPPmqbzUeLJJTB0776UntpLUDQJCEOxwWpVtkWCBOH78eLd6k//666/0xhtvpBkzZsTDTbagOddhzTNnzkyfffaZDzeSurSvvvoqGo/06tWrqPsmJ4ejRo1Ks2fPjiZonIR1x81JZtB+8sknaeXKlXFduSb5NvTJpl+/fvF1GQ9isx9J6oYBIbu6tI7OVmNAMESNCHOGuuJizM/EqIjff/89ffjhh6m6ujoNHTo02moXWnuRKcK/+OKL08KFCyM11IVWUndx8uTJaGjCCRbjdwrpvNx8Y5LgkuHn99xzT5yMcULGPZt01a6wycY6RLMWNl/5udg8XLJkSTR3Ky8vT+edd15R3UHPzFbhPbnmmmviWhLA8375eytJ3TQgBMEKC86/LcjUh7z//vtdprCcIDCz6zp16tTofFfMQ0vzQnzqOBhBQfMZ/6eR1F0RrDFmgnETl156aavcY5t3Kx0/fnw0UKHjKQHo0aNHO0WDrr///js1NDTEGvTWW2/F3N9HHnkkAugBAwa02nU6c5NyxIgRkY67Z88eyxYkyYDwfxfsV199NfXs2TOn8QizZs2KQKcz1RfwM3JCRyoop4A8nDDzj5bphdYEnrnjSg0HzWZY3H/66Sf/Z5GkZvXYdKp88cUXI3OimBEILQU73M+pP5w4cWI07Vq0aFF68803IyDl3k/XbE7CeC2sCWxuso4RQBaT/cLn8jX4ejTE4euz3rDpyAnm999/H81y3nnnncgYmT59egRmV155ZbzmYrNRsnWyZn1j3Wb0xPbt2yPTx26hkmRAeFYsYiygue5KXnDBBdFtk0WuFGcSseCRdsODALWA/GyccLb2Qwhfj/lOTz31VNq/f78LrSTlkJ3Bffnmm2+O1MXWDoRaQuDF/XrChAnp0UcfjZPF5557Lk7n2BRdv359dEvdsGFDevfdd2PmHiMcwJgh/szfb9y4MV4/H8/IDNIuX3rppTh5q6mpSZWVldGlk0CMRjnt9fM1D46pfSfzhddHUOrvnSQZEOaEgv3bb78956CQ2sKLLroo3XXXXem1117r0JmF7NCy88nCTedUOoLecMMNafDgwbE4tsWCywkjiy2jKOzGJkn5N0vZvXt3evLJJ2NmXluckhWS7cFGX48ePWK2Ip03QeBKIxf+nvt/sY3G2uJ1cw0ZPcGp6MGDB61blyQDwsKDQnYV861foJ6DhZI0mDlz5sQOKydmpE6SqsMpYqF1HQR7BJuc+DGugVNJuqGtXr06dmRvueWW6JLGa+Z1tNVDBUX9FRUVsavM8F8HyUtS62zosam2b9++uL+OHj06OjO3RR1dV0GJB0PjaTpDtg4dw7mG3XVElCQZELbBri31BtTEFbNbSbrMddddFwEbJ3YUzFM/sWLFiki14VQR1FWAdBx2NletWhV1Jk8//XTM7CMFh5NLHhKGDRsWM5daO/UzG+o8CHJpqMO1MRCUpLZz7NixtHPnzqgBvP7662Oz0SDwP3Ma6QxKHf+mTZuiO6hjjCTJgLBNazzovknKZWulxnByx4JGMEf77AwCT7Do81/+nY8jqGzvFCK+JzvT1JkQBH766afRBtxFV5LaFydeZIdw+kVGCBuEbDKSGkkKZzGD2EsVax6pqdTpZ+od2UilIQzXgXpAav79/ZAkA8J2w6wnOnLm0oG0M+PUsaqqKr3wwgtp165dqbGx0V92SSoxdAnlZIxB9QRK9913XzRwKSajpaMRAHLyd++990YNPJ2qSZ9lHbI+XZIMCEsChel1dXVp7NixRQ8YLoXdV04lqTlk+DxDjklT/e677+Ik0MVXkjoH0veZ5/fHH3/EPfztt9+OrqF0EGW9osaOWYVs+DHYvqysrF2awbDO8H3IeuH7Un/Oid+QIUMiBZYSCmolX3nllRiDxFgK5ieSmWNJgiQZEJZ8YEhHOE4MSWXpiHbahQ4wZtYTNYiMn6BF+JdffhkPEv5CS1LXDRgJFjlRZGzEunXr4gSONay6ujoCs9tuuy2NGzcuat0ZTcRJHesbwSQBHEPi2UAksOTP/BsnkqSuMneWzyO75I477oiO25zy0TWV70OaKw3QaLD222+/OZZIkgwIu47Tp09HLcPrr78eiyC7r+y8EiB2VNvwTH0iaUOk3wwaNChNmjQpFuWtW7emw4cPx4OBtYCSZKBI6in1iaRl0iyMDtu//vpramhoiPWNE0dGCh06dChGOBBU8mf+je7ZjDkiyOPzaIJDhglfj41GM00kyYCw22GkBAPglyxZEimYmfl/BGZtNXSXuVDl5eWRfjNx4sSYvcRwYXZjCfzciZUkSZJkQNjOmpqaYuf0wIED0ZyF4nhGSDzwwANp/Pjxafjw4VG7x0B70nAIGjMjJKhN5KSRLp98DB/L3L/KysoYg8EYCgbBE/TV19fHri27uXRdc0dWkiRJkgGhJEmSJMmAUJIkSZJkQChJkiRJMiCUJEmSJBkQSpIkSZIMCCVJkiRJBoSSJEmSJANCSZIkSZIBoSRJkiTJgFCSJEmSDAglSZIkSQaEkiRJkiQDQkmSJEmSAaEkSZIkyYBQkiRJkmRAKEmSJEkyIJQkSZIkGRBKkiRJkgwIJUmSJEkGhJIkSZIkA0JJkiRJkgGhJEmSJMmAUJIkSZJkQChJkiRJMiCUJEmSJBkQSpIkSZIMCCVJkiRJBoSSJEmSJANCSZIkSZIBoSRJkiTJgFCSJEmS9H/+AYh11S+FDRUzAAAAAElFTkSuQmCC" + } + ], + "program_uuid": str(program.uuid), + "use_org_name": True, + "include_hours_of_effort": True, + "language": "en" + } + + def test_create_program_certificate_configuration(self): + """ + Verify creation data. + """ + serializer = self.serializer(data=self.test_data) + assert serializer.is_valid(raise_exception=True) + + def test_update_program_certificate_configuration(self): + """ + Verify update data. + """ + test_data = self.test_data + test_data['signatories'] = [] + test_data['is_active'] = False + + serializer = self.serializer(data=test_data) + assert serializer.is_valid(raise_exception=True) diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/urls.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/urls.py new file mode 100644 index 000000000..a9988e30a --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls import include, url + +urlpatterns = [ + url(r'^v1/', include('credentials.apps.edx_credentials_extensions.edly_credentials_app.api.v1.urls')), +] diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/__init__.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/urls.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/urls.py new file mode 100644 index 000000000..74ee2ffae --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/urls.py @@ -0,0 +1,9 @@ +from rest_framework import routers + +from credentials.apps.edx_credentials_extensions.edly_credentials_app.api.v1.views.program_certificate_configuration import ProgramCertificateConfigurationViewSet + + +router = routers.SimpleRouter() +router.register(r'program-certificate-configuration', ProgramCertificateConfigurationViewSet, base_name='program-certificate-configuration') + +urlpatterns = router.urls diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/__init__.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/program_certificate_configuration.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/program_certificate_configuration.py new file mode 100644 index 000000000..ff81c78c0 --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/program_certificate_configuration.py @@ -0,0 +1,46 @@ +""" +Views for Edly Program Certificate Configuration API. +""" +from rest_framework import status, viewsets +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response + +from credentials.apps.credentials.models import ProgramCertificate +from credentials.apps.edx_credentials_extensions.edly_credentials_app.api.permissions import CanAccessCurrentSite +from credentials.apps.edx_credentials_extensions.edly_credentials_app.api.serializers import ( + ProgramCertificateConfigurationSerializer +) + + +class ProgramCertificateConfigurationViewSet(viewsets.ModelViewSet): + """ + ViewSet for Program Certificate Configuration. + """ + lookup_field = 'program_uuid' + lookup_value_regex = '[0-9a-f-]+' + permission_classes = (IsAuthenticated, CanAccessCurrentSite) + serializer_class = ProgramCertificateConfigurationSerializer + queryset = ProgramCertificate.objects.all() + + def update(self, request, *args, **kwargs): + """ + Update existing Program Certificate Configuration. + """ + data = request.data.copy() + + signatory_ids = [] + for signatory in data.get('signatories', []): + signatory_ids.append(signatory.get('id')) + + context = { + 'request': request, + 'signatory_ids': signatory_ids + } + + instance = ProgramCertificate.objects.get(program_uuid=kwargs.get('program_uuid')) + + serializer = ProgramCertificateConfigurationSerializer(instance, data=data, context=context) + serializer.is_valid(raise_exception=True) + self.perform_update(serializer) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_200_OK, headers=headers) diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/tests/__init__.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/tests/test_views.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/tests/test_views.py new file mode 100644 index 000000000..cc998aa89 --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/api/v1/views/tests/test_views.py @@ -0,0 +1,101 @@ +""" +Tests for edly_api Views. +""" +import json + +from django.urls import reverse + +from rest_framework.test import APITestCase + +from credentials.apps.catalog.tests.factories import ProgramFactory +from credentials.apps.core.tests.factories import UserFactory +from credentials.apps.core.tests.mixins import SiteMixin +from credentials.apps.credentials.tests.factories import ProgramCertificateFactory + +JSON_CONTENT_TYPE = 'application/json' + + +def get_test_image_as_base_64_encoded_string(): + base64_header = 'data:image/png;base64,' + base64_data = ( + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY' + '42YAAAAASUVORK5CYII=' + ) + base64_full = base64_header + base64_data + return base64_full + + +class ProgramCertificateConfigurationTests(SiteMixin, APITestCase): + """ + Test for Program Certificate Configuration Viewset. + """ + + def setUp(self): + super(ProgramCertificateConfigurationTests, self).setUp() + self.list_url = reverse('edly_api:program-certificate-configuration-list') + + self.user = UserFactory(is_staff=True, is_superuser=True) + + program = ProgramFactory(site=self.site) + self.test_data = { + 'site': self.site.domain, + 'is_active': True, + 'signatories': [ + { + 'name': 'Jhon Doe', + 'title': 'Test Certificate', + 'image': get_test_image_as_base_64_encoded_string() + } + ], + 'program_uuid': str(program.uuid), + 'use_org_name': True, + 'include_hours_of_effort': True, + 'language': 'en' + } + + def test_create_program_certificate_configuration(self): + """ + Verify program certificate configuration creation. + """ + response = self.client.post(self.list_url, data=json.dumps(self.test_data), content_type=JSON_CONTENT_TYPE) + assert response.status_code == 401 + + self.client.login(username=self.user.username, password='password') + response = self.client.post(self.list_url, data=json.dumps(self.test_data), content_type=JSON_CONTENT_TYPE) + assert response.status_code == 201 + + def test_update_program_certificate_configuration(self): + """ + Verify program certificate configuration update. + """ + program_certificate_configuration = ProgramCertificateFactory() + + self.detail_url = reverse('edly_api:program-certificate-configuration-detail', + kwargs={'program_uuid': str(program_certificate_configuration.program_uuid)}) + test_data = self.test_data + test_data['signatories'] = [] + test_data['is_active'] = False + + response = self.client.patch(self.detail_url, data=json.dumps(test_data), content_type=JSON_CONTENT_TYPE) + assert response.status_code == 401 + + self.client.login(username=self.user.username, password='password') + response = self.client.patch(self.detail_url, data=json.dumps(test_data), content_type=JSON_CONTENT_TYPE) + assert response.status_code == 200 + + def test_list_program_certificate_configuration(self): + """ + Verify list program certificate configuration. + """ + program_certificate_configuration = ProgramCertificateFactory() + + response = self.client.get(self.list_url) + assert response.status_code == 401 + + self.client.login(username=self.user.username, password='password') + response = self.client.get(self.list_url) + assert response.status_code == 200 + + actual_data = response.json() + actual_data = actual_data.get('results')[0] + assert str(program_certificate_configuration.program_uuid) == actual_data.get('program_uuid') diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/tests/test_utils.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/tests/test_utils.py new file mode 100644 index 000000000..bb94cd7bd --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/tests/test_utils.py @@ -0,0 +1,116 @@ +""" +Tests for Edly Utils Functions. +""" +from unittest import TestCase + +import jwt +import mock +import pytest +from django.conf import settings +from django.test.client import RequestFactory +from mock import MagicMock + +from credentials.apps.core.tests.factories import SiteFactory, UserFactory +from credentials.apps.edx_credentials_extensions.edly_credentials_app.tests.factories import ( + EdlySiteConfigurationFactory, +) +from credentials.apps.edx_credentials_extensions.edly_credentials_app.utils import ( + encode_edly_user_info_cookie, + decode_edly_user_info_cookie, + get_edx_org_from_cookie, + user_has_edx_organization_access, +) + + +@pytest.mark.django_db +class UtilsTests(TestCase): + """ + Tests for utility methods. + """ + + def setUp(self): + """ + Setup initial test data + """ + super(UtilsTests, self).setUp() + self.user = UserFactory() + self.admin_user = UserFactory(is_staff=True) + self.request = RequestFactory().get('/') + self.request.user = self.user + self.request.session = self._get_stub_session() + self.request.site = SiteFactory() + self.request.site.siteconfiguration = EdlySiteConfigurationFactory( + site=self.request.site, + edx_org_short_name='cloudX' + ) + + self.test_edly_user_info_cookie_data = { + 'edly-org': 'edly', + 'edly-sub-org': 'cloud', + 'edx-org': 'cloudX' + } + + def _get_stub_session(self, expire_at_browser_close=False, max_age=604800): + return MagicMock( + get_expire_at_browser_close=lambda: expire_at_browser_close, + get_expiry_age=lambda: max_age, + ) + + def _copy_cookies_to_request(self, request): + edly_cookie_string = encode_edly_user_info_cookie((self.test_edly_user_info_cookie_data)) + request.COOKIES = { + settings.EDLY_USER_INFO_COOKIE_NAME: edly_cookie_string + } + + def test_encode_edly_user_info_cookie(self): + """ + Test that "encode_edly_user_info_cookie" method encodes data correctly. + """ + actual_encoded_string = encode_edly_user_info_cookie(self.test_edly_user_info_cookie_data) + expected_encoded_string = jwt.encode( + self.test_edly_user_info_cookie_data, settings.EDLY_COOKIE_SECRET_KEY, + algorithm=settings.EDLY_JWT_ALGORITHM + ) + + assert actual_encoded_string == expected_encoded_string + + def test_decode_edly_user_info_cookie(self): + """ + Test that "decode_edly_user_info_cookie" method decodes data correctly. + """ + encoded_data = jwt.encode( + self.test_edly_user_info_cookie_data, + settings.EDLY_COOKIE_SECRET_KEY, + algorithm=settings.EDLY_JWT_ALGORITHM + ) + decoded_edly_user_info_cookie_data = decode_edly_user_info_cookie(encoded_data) + + assert self.test_edly_user_info_cookie_data == decoded_edly_user_info_cookie_data + + def test_get_edx_org_from_cookie(self): + """ + Test that "get_edx_org_from_cookie" method returns edx-org short name correctly. + """ + edly_user_info_cookie = encode_edly_user_info_cookie(self.test_edly_user_info_cookie_data) + + assert self.request.site.siteconfiguration.edx_org_short_name == get_edx_org_from_cookie(edly_user_info_cookie) + + def test_user_with_edx_organization_access(self): + """ + Test user has edx organization access of a site. + """ + with mock.patch('credentials.apps.edx_credentials_extensions.edly_credentials_app.utils.get_current_site') as current_site: + current_site.return_value = self.request.site + self._copy_cookies_to_request(self.request) + + assert user_has_edx_organization_access(self.request) is True + + def test_user_without_edx_organization_access(self): + """ + Test user does not have edx organization access of a site. + """ + with mock.patch('credentials.apps.edx_credentials_extensions.edly_credentials_app.utils.get_current_site') as current_site: + current_site.return_value = self.request.site + self.request.site.siteconfiguration = EdlySiteConfigurationFactory() + + assert user_has_edx_organization_access(self.request) is False diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/urls.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/urls.py index 65b34d128..4f3dd04a2 100644 --- a/credentials/apps/edx_credentials_extensions/edly_credentials_app/urls.py +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/urls.py @@ -1,6 +1,5 @@ -from django.conf.urls import url - -from . import views +from django.conf.urls import include, url urlpatterns = [ + url('', include('credentials.apps.edx_credentials_extensions.edly_credentials_app.api.urls')), ] diff --git a/credentials/apps/edx_credentials_extensions/edly_credentials_app/utils.py b/credentials/apps/edx_credentials_extensions/edly_credentials_app/utils.py new file mode 100644 index 000000000..3d19aa90f --- /dev/null +++ b/credentials/apps/edx_credentials_extensions/edly_credentials_app/utils.py @@ -0,0 +1,84 @@ +import logging + +import jwt +from django.conf import settings +from django.contrib.sites.shortcuts import get_current_site + +from credentials.apps.core.models import SiteConfiguration + +LOGGER = logging.getLogger(__name__) + + +def user_has_edx_organization_access(request): + """ + Check if the user can access the requested URL by verifying its linked edx organization. + + This method checks if the "edx_org_short_name" related to the requested URL's site + matches with the "edx-org" in the "edly_user_info" cookie. + + Arguments: + request: HTTP request object + + Returns: + bool: Returns True if user has edX organization access otherwise False. + """ + + if request.user.is_superuser or request.user.is_staff: + return True + + current_site = get_current_site(request) + try: + current_site_configuration = current_site.siteconfiguration + except SiteConfiguration.DoesNotExist: + LOGGER.warning('Site (%s) has no related site configuration.', current_site) + return False + + edly_user_info_cookie = request.COOKIES.get(settings.EDLY_USER_INFO_COOKIE_NAME, None) + if current_site_configuration.edx_org_short_name == get_edx_org_from_cookie(edly_user_info_cookie): + return True + + return False + + +def encode_edly_user_info_cookie(cookie_data): + """ + Encode edly_user_info cookie data into JWT string. + + Arguments: + cookie_data (dict): Edly user info cookie dict. + + Returns: + string + """ + return jwt.encode(cookie_data, settings.EDLY_COOKIE_SECRET_KEY, algorithm=settings.EDLY_JWT_ALGORITHM) + + +def decode_edly_user_info_cookie(encoded_cookie_data): + """ + Decode edly_user_info cookie data from JWT string. + + Arguments: + encoded_cookie_data (dict): Edly user info cookie JWT encoded string. + + Returns: + dict + """ + return jwt.decode(encoded_cookie_data, settings.EDLY_COOKIE_SECRET_KEY, algorithms=[settings.EDLY_JWT_ALGORITHM]) + + +def get_edx_org_from_cookie(encoded_cookie_data): + """ + Returns edx-org short name from the edly-user-info cookie. + + Arguments: + encoded_cookie_data (dict): Edly user info cookie JWT encoded string. + + Returns: + string + """ + + if not encoded_cookie_data: + return '' + + decoded_cookie_data = decode_edly_user_info_cookie(encoded_cookie_data) + return decoded_cookie_data['edx-org'] diff --git a/credentials/settings/base.py b/credentials/settings/base.py index 7aedf92cd..4fae96e73 100644 --- a/credentials/settings/base.py +++ b/credentials/settings/base.py @@ -66,6 +66,7 @@ 'credentials.apps.edx_django_extensions', 'credentials.apps.credentials_theme_openedx', 'credentials.apps.records', + 'credentials.apps.edx_credentials_extensions.edly_credentials_app' ] INSTALLED_APPS += THIRD_PARTY_APPS @@ -434,3 +435,8 @@ 'debug_toolbar.panels.redirects.RedirectsPanel', ] # END DJANGO DEBUG TOOLBAR CONFIGURATION + +# Edly user info cookie specific values +EDLY_USER_INFO_COOKIE_NAME = 'edly-user-info' +EDLY_COOKIE_SECRET_KEY = 'EDLY-COOKIE-SECRET-KEY' +EDLY_JWT_ALGORITHM = 'HS256' diff --git a/credentials/settings/production.py b/credentials/settings/production.py index 2b0dc7fcd..dde3118f3 100644 --- a/credentials/settings/production.py +++ b/credentials/settings/production.py @@ -58,3 +58,8 @@ for override, value in DB_OVERRIDES.items(): DATABASES['default'][override] = value + +# Edly user info cookie specific values +EDLY_USER_INFO_COOKIE_NAME = environ.get('EDLY_USER_INFO_COOKIE_NAME', EDLY_USER_INFO_COOKIE_NAME) +EDLY_COOKIE_SECRET_KEY = environ.get('EDLY_COOKIE_SECRET_KEY', EDLY_COOKIE_SECRET_KEY) +EDLY_JWT_ALGORITHM = environ.get('EDLY_JWT_ALGORITHM', EDLY_JWT_ALGORITHM) diff --git a/credentials/urls.py b/credentials/urls.py index 70cdd4c6f..fbfc18cfd 100644 --- a/credentials/urls.py +++ b/credentials/urls.py @@ -48,6 +48,11 @@ url(r'^hijack/', include('hijack.urls', namespace='hijack')), ] +# Edly Urls +urlpatterns += [ + url(r'^edly-api/', include('credentials.apps.edx_credentials_extensions.edly_credentials_app.urls', namespace='edly_api')), +] + handler500 = 'credentials.apps.core.views.render_500' # Add media and extra urls