From c3854bbb0dc39917c8f0e7d95dfbc3d9359d9011 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 28 Jul 2015 17:54:40 -0400 Subject: [PATCH 01/92] Start adding model for url logs --- api/webview/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/webview/models.py b/api/webview/models.py index 65d58765..34bb826d 100644 --- a/api/webview/models.py +++ b/api/webview/models.py @@ -11,3 +11,5 @@ class Document(models.Model): raw = JsonField() normalized = JsonField() + + url_logs = JsonField() From 050e4ecd745eee6b2900b408b1cd961cb7ecb467 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 28 Jul 2015 18:45:32 -0400 Subject: [PATCH 02/92] Remove the url log column - just adding to normalized --- api/webview/models.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/webview/models.py b/api/webview/models.py index 34bb826d..65d58765 100644 --- a/api/webview/models.py +++ b/api/webview/models.py @@ -11,5 +11,3 @@ class Document(models.Model): raw = JsonField() normalized = JsonField() - - url_logs = JsonField() From 16c05c57aece30938ffe3e6ffa4e07edd4123bf4 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 29 Jul 2015 10:49:16 -0400 Subject: [PATCH 03/92] Add url processor to postgres processor --- scrapi/processing/postgres.py | 64 ++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index 3686e9c3..b936f03e 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -1,7 +1,9 @@ from __future__ import absolute_import import os -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") +import json +import datetime +import requests import copy import logging @@ -9,6 +11,8 @@ from scrapi import events from scrapi.processing.base import BaseProcessor +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") +from django.core.exceptions import ObjectDoesNotExist from api.webview.models import Document logger = logging.getLogger(__name__) @@ -45,3 +49,61 @@ def _get_by_source_id(self, model, source, docID): return Document.objects.filter(source=source, docID=docID)[0] except IndexError: return None + + +class UriProcessor(BaseProcessor): + NAME = 'postgres_uri' + + def process_raw(self, raw_doc): + pass + + def process_normalized(self, raw_doc, normalized): + try: + document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) + normalized_document = json.loads(document.normalized.attributes) + + processed_normalized = self.save_status_of_canonical_uri(normalized_document) + processed_normalized = self.save_status_of_object_uris(processed_normalized) + + document.normalized = processed_normalized + + document.save() + except ObjectDoesNotExist: + pass + + def save_status_of_canonical_uri(self, normalized): + cannonical_uri_status = requests.get(normalized['uris']['canonicalUri']) + + cannonical_status = { + 'resolved_uri': cannonical_uri_status.url, + 'resolved_datetime': datetime.datetime.now(), + 'resolved_status': cannonical_uri_status.status_code, + 'is_doi': True if 'dx.doi.org' in normalized['uris']['canonicalUri'] else False + } + + try: + normalized['shareProperties']['uri_logs']['cannonical_status'].append(cannonical_status) + except KeyError: + normalized['shareProperties']['uri_logs']['cannonical_status'] = [cannonical_status] + + return normalized + + def save_status_of_object_uris(self, normalized): + all_object_uris = normalized['uris']['object_uris'] + + for uri in all_object_uris: + current_list = [] + uri_resolved = requests.get(uri) + + uri_status = { + 'resolved_uri': uri_resolved.url, + 'resolved_datetime': datetime.datetime.now(), + 'resolved_status': uri_resolved.status_code, + 'is_doi': True if 'dx.doi.org' in uri else False + } + current_list.append(uri_status) + + try: + normalized['shareProperties']['uri_logs']['object_status'].append(current_list) + except KeyError: + normalized['shareProperties']['uri_logs']['object_status'] = [current_list] From 0921cc0c1de61976b78eb7b1870266a743eaadfb Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 29 Jul 2015 11:34:07 -0400 Subject: [PATCH 04/92] A few key error fixes --- scrapi/processing/postgres.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index b936f03e..1d261660 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -1,7 +1,6 @@ from __future__ import absolute_import import os -import json import datetime import requests @@ -60,9 +59,9 @@ def process_raw(self, raw_doc): def process_normalized(self, raw_doc, normalized): try: document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) - normalized_document = json.loads(document.normalized.attributes) + # normalized_document = json.loads(document.normalized) - processed_normalized = self.save_status_of_canonical_uri(normalized_document) + processed_normalized = self.save_status_of_canonical_uri(document.normalized) processed_normalized = self.save_status_of_object_uris(processed_normalized) document.normalized = processed_normalized @@ -84,12 +83,17 @@ def save_status_of_canonical_uri(self, normalized): try: normalized['shareProperties']['uri_logs']['cannonical_status'].append(cannonical_status) except KeyError: + normalized['shareProperties']['uri_logs'] = {} normalized['shareProperties']['uri_logs']['cannonical_status'] = [cannonical_status] return normalized def save_status_of_object_uris(self, normalized): - all_object_uris = normalized['uris']['object_uris'] + try: + all_object_uris = normalized['uris']['object_uris'] + except KeyError: + all_object_uris = [] + current_list = [] for uri in all_object_uris: current_list = [] @@ -106,4 +110,5 @@ def save_status_of_object_uris(self, normalized): try: normalized['shareProperties']['uri_logs']['object_status'].append(current_list) except KeyError: + normalized['shareProperties']['uri_logs'] = {} normalized['shareProperties']['uri_logs']['object_status'] = [current_list] From 63243b7dce0f6e21075594c6b225bb969cca635b Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 29 Jul 2015 11:56:22 -0400 Subject: [PATCH 05/92] Add invoke task to reset postgres and elasticsearch --- tasks.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tasks.py b/tasks.py index 09f22b68..418a536c 100644 --- a/tasks.py +++ b/tasks.py @@ -1,3 +1,4 @@ +import os import base64 import logging import platform @@ -220,3 +221,12 @@ def provider_map(delete=False): refresh=True ) print(es.count('share_providers', body={'query': {'match_all': {}}})['count']) + + +@task +def reset_all(): + os.system('psql -c "DROP DATABASE scrapi;"') + os.system('psql -c "CREATE DATABASE scrapi;"') + os.system('python manage.py migrate') + + os.system("curl -XDELETE '{}/share*'".format(settings.ELASTIC_URI)) From 66c10595bb7049d07c17a6519eee2ae1aa9d713c Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 29 Jul 2015 13:04:56 -0400 Subject: [PATCH 06/92] return things properly duh --- scrapi/processing/postgres.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index 1d261660..6d1caf67 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -53,13 +53,9 @@ def _get_by_source_id(self, model, source, docID): class UriProcessor(BaseProcessor): NAME = 'postgres_uri' - def process_raw(self, raw_doc): - pass - def process_normalized(self, raw_doc, normalized): try: document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) - # normalized_document = json.loads(document.normalized) processed_normalized = self.save_status_of_canonical_uri(document.normalized) processed_normalized = self.save_status_of_object_uris(processed_normalized) @@ -92,8 +88,7 @@ def save_status_of_object_uris(self, normalized): try: all_object_uris = normalized['uris']['object_uris'] except KeyError: - all_object_uris = [] - current_list = [] + return normalized for uri in all_object_uris: current_list = [] @@ -110,5 +105,6 @@ def save_status_of_object_uris(self, normalized): try: normalized['shareProperties']['uri_logs']['object_status'].append(current_list) except KeyError: - normalized['shareProperties']['uri_logs'] = {} normalized['shareProperties']['uri_logs']['object_status'] = [current_list] + + return normalized From 3f88feeba1d46a3f32815af638e9c82244da5730 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 29 Jul 2015 14:31:31 -0400 Subject: [PATCH 07/92] Add inv alias to reset task --- tasks.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks.py b/tasks.py index 418a536c..3fccd3e5 100644 --- a/tasks.py +++ b/tasks.py @@ -230,3 +230,5 @@ def reset_all(): os.system('python manage.py migrate') os.system("curl -XDELETE '{}/share*'".format(settings.ELASTIC_URI)) + os.system("invoke alias share share_v2") + os.system("invoke provider_map") From a16502f5ffd707ea18f0aa826b1e25a2ef43e2a0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Thu, 30 Jul 2015 10:02:02 -0400 Subject: [PATCH 08/92] Add actual uri to uri log --- scrapi/processing/postgres.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index 6d1caf67..cef8ef5f 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -1,10 +1,9 @@ from __future__ import absolute_import import os +import copy import datetime import requests - -import copy import logging from scrapi import events @@ -70,6 +69,7 @@ def save_status_of_canonical_uri(self, normalized): cannonical_uri_status = requests.get(normalized['uris']['canonicalUri']) cannonical_status = { + 'actual_uri': normalized['uris']['canonicalUri'], 'resolved_uri': cannonical_uri_status.url, 'resolved_datetime': datetime.datetime.now(), 'resolved_status': cannonical_uri_status.status_code, @@ -95,6 +95,7 @@ def save_status_of_object_uris(self, normalized): uri_resolved = requests.get(uri) uri_status = { + 'actual_uri': uri, 'resolved_uri': uri_resolved.url, 'resolved_datetime': datetime.datetime.now(), 'resolved_status': uri_resolved.status_code, From 9d91fe3e4ce4b116edadf2fefc9856c98315046c Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 31 Jul 2015 11:13:22 -0400 Subject: [PATCH 09/92] Add post_processing flag, so we can more closely control post processing incl url gathering --- scrapi/processing/__init__.py | 6 ++++++ scrapi/processing/base.py | 3 +++ scrapi/settings/local-dist.py | 1 + 3 files changed, 10 insertions(+) diff --git a/scrapi/processing/__init__.py b/scrapi/processing/__init__.py index b08de00c..4a516c99 100644 --- a/scrapi/processing/__init__.py +++ b/scrapi/processing/__init__.py @@ -34,3 +34,9 @@ def process_raw(raw_doc, kwargs): for p in settings.RAW_PROCESSING: extras = kwargs.get(p, {}) get_processor(p).process_raw(raw_doc, **extras) + + +def post_process(raw_doc, normalized, kwargs): + for p in settings.POST_PROCESSING: + extras = kwargs.get(p, {}) + get_processor(p).process_normalized(raw_doc, normalized, **extras) diff --git a/scrapi/processing/base.py b/scrapi/processing/base.py index 155736e7..c8794b93 100644 --- a/scrapi/processing/base.py +++ b/scrapi/processing/base.py @@ -6,3 +6,6 @@ def process_raw(self, raw_doc, **kwargs): def process_normalized(self, raw_doc, normalized, **kwargs): pass # pragma: no cover + + def post_process(raw_doc, normalized, kwargs): + pass diff --git a/scrapi/settings/local-dist.py b/scrapi/settings/local-dist.py index 826d3528..5d6ada4a 100644 --- a/scrapi/settings/local-dist.py +++ b/scrapi/settings/local-dist.py @@ -12,6 +12,7 @@ NORMALIZED_PROCESSING = [] RAW_PROCESSING = [] +POST_PROCESSING = [] SENTRY_DSN = None From 1d9aae6a8c20904aa21080f011f6d270c05ca720 Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 31 Jul 2015 11:25:07 -0400 Subject: [PATCH 10/92] Update local-dist to have correct static files --- api/api/settings/local-dist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/api/settings/local-dist.py b/api/api/settings/local-dist.py index 047df8bf..6bebde93 100644 --- a/api/api/settings/local-dist.py +++ b/api/api/settings/local-dist.py @@ -15,4 +15,4 @@ } } -STATIC_URL = '{}/static/'.format(DOMAIN) +STATIC_URL = '/static/' From 581df5e141cca0f437ed444ff99b9ec1759bfc26 Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 3 Aug 2015 14:53:47 -0400 Subject: [PATCH 11/92] Move uri logging processor out of postgres processor --- scrapi/processing/postgres.py | 65 --------------------------- scrapi/processing/uri_logging.py | 76 ++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 65 deletions(-) create mode 100644 scrapi/processing/uri_logging.py diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index cef8ef5f..82a78009 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -2,15 +2,12 @@ import os import copy -import datetime -import requests import logging from scrapi import events from scrapi.processing.base import BaseProcessor os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") -from django.core.exceptions import ObjectDoesNotExist from api.webview.models import Document logger = logging.getLogger(__name__) @@ -47,65 +44,3 @@ def _get_by_source_id(self, model, source, docID): return Document.objects.filter(source=source, docID=docID)[0] except IndexError: return None - - -class UriProcessor(BaseProcessor): - NAME = 'postgres_uri' - - def process_normalized(self, raw_doc, normalized): - try: - document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) - - processed_normalized = self.save_status_of_canonical_uri(document.normalized) - processed_normalized = self.save_status_of_object_uris(processed_normalized) - - document.normalized = processed_normalized - - document.save() - except ObjectDoesNotExist: - pass - - def save_status_of_canonical_uri(self, normalized): - cannonical_uri_status = requests.get(normalized['uris']['canonicalUri']) - - cannonical_status = { - 'actual_uri': normalized['uris']['canonicalUri'], - 'resolved_uri': cannonical_uri_status.url, - 'resolved_datetime': datetime.datetime.now(), - 'resolved_status': cannonical_uri_status.status_code, - 'is_doi': True if 'dx.doi.org' in normalized['uris']['canonicalUri'] else False - } - - try: - normalized['shareProperties']['uri_logs']['cannonical_status'].append(cannonical_status) - except KeyError: - normalized['shareProperties']['uri_logs'] = {} - normalized['shareProperties']['uri_logs']['cannonical_status'] = [cannonical_status] - - return normalized - - def save_status_of_object_uris(self, normalized): - try: - all_object_uris = normalized['uris']['object_uris'] - except KeyError: - return normalized - - for uri in all_object_uris: - current_list = [] - uri_resolved = requests.get(uri) - - uri_status = { - 'actual_uri': uri, - 'resolved_uri': uri_resolved.url, - 'resolved_datetime': datetime.datetime.now(), - 'resolved_status': uri_resolved.status_code, - 'is_doi': True if 'dx.doi.org' in uri else False - } - current_list.append(uri_status) - - try: - normalized['shareProperties']['uri_logs']['object_status'].append(current_list) - except KeyError: - normalized['shareProperties']['uri_logs']['object_status'] = [current_list] - - return normalized diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py new file mode 100644 index 00000000..67e0f8f1 --- /dev/null +++ b/scrapi/processing/uri_logging.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import + +import os +import datetime +import requests +import logging + +from scrapi.processing.base import BaseProcessor + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") +from django.core.exceptions import ObjectDoesNotExist +from api.webview.models import Document + +logger = logging.getLogger(__name__) + + +class UriProcessor(BaseProcessor): + NAME = 'postgres_uri' + + def process_normalized(self, raw_doc, normalized): + try: + document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) + + processed_normalized = self.save_status_of_canonical_uri(document.normalized) + processed_normalized = self.save_status_of_object_uris(processed_normalized) + + document.normalized = processed_normalized + + document.save() + except ObjectDoesNotExist: + pass + + def save_status_of_canonical_uri(self, normalized): + cannonical_uri_status = requests.get(normalized['uris']['canonicalUri']) + + cannonical_status = { + 'actual_uri': normalized['uris']['canonicalUri'], + 'resolved_uri': cannonical_uri_status.url, + 'resolved_datetime': datetime.datetime.now(), + 'resolved_status': cannonical_uri_status.status_code, + 'is_doi': True if 'dx.doi.org' in normalized['uris']['canonicalUri'] else False + } + + try: + normalized['shareProperties']['uri_logs']['cannonical_status'].append(cannonical_status) + except KeyError: + normalized['shareProperties']['uri_logs'] = {} + normalized['shareProperties']['uri_logs']['cannonical_status'] = [cannonical_status] + + return normalized + + def save_status_of_object_uris(self, normalized): + try: + all_object_uris = normalized['uris']['object_uris'] + except KeyError: + return normalized + + for uri in all_object_uris: + current_list = [] + uri_resolved = requests.get(uri) + + uri_status = { + 'actual_uri': uri, + 'resolved_uri': uri_resolved.url, + 'resolved_datetime': datetime.datetime.now(), + 'resolved_status': uri_resolved.status_code, + 'is_doi': True if 'dx.doi.org' in uri else False + } + current_list.append(uri_status) + + try: + normalized['shareProperties']['uri_logs']['object_status'].append(current_list) + except KeyError: + normalized['shareProperties']['uri_logs']['object_status'] = [current_list] + + return normalized From 4bacb91987e4135fb4d1bfd9e3d7e98eec9019c6 Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 3 Aug 2015 14:54:30 -0400 Subject: [PATCH 12/92] Change name of uri processor --- scrapi/processing/uri_logging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index 67e0f8f1..e17ec1d5 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -15,7 +15,7 @@ class UriProcessor(BaseProcessor): - NAME = 'postgres_uri' + NAME = 'uri_logging' def process_normalized(self, raw_doc, normalized): try: From 48d3d8975c1977fcbaf84eef5f525952b267989c Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 3 Aug 2015 15:25:42 -0400 Subject: [PATCH 13/92] Add basic processing tasks that do nothing right now --- scrapi/tasks.py | 6 ++++++ tasks.py | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index c196d84e..200bf87c 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -101,6 +101,12 @@ def process_raw(raw_doc, **kwargs): processing.process_raw(raw_doc, kwargs) +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=settings.CELERY_MAX_RETRIES) +@events.logged(events.PROCESSSING_URIS, 'post_processing') +def process_uris(): + processing.process_uris() + + @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=settings.CELERY_MAX_RETRIES, throws=events.Skip) @events.logged(events.NORMALIZATION) def normalize(raw_doc, harvester_name): diff --git a/tasks.py b/tasks.py index eb16633c..3807846f 100644 --- a/tasks.py +++ b/tasks.py @@ -228,6 +228,14 @@ def provider_map(delete=False): print(es.count('share_providers', body={'query': {'match_all': {}}})['count']) +@task +def process_uris(async=False): + settings.CELERY_ALWAYS_EAGER = not async + from scrapi.tasks import process_uris + + process_uris.delay() + + @task def reset_all(): os.system('psql -c "DROP DATABASE scrapi;"') From 0c88127febb567ae7f7013ae352d97bf77d7425b Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 3 Aug 2015 15:26:17 -0400 Subject: [PATCH 14/92] update name --- scrapi/processing/uri_logging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index e17ec1d5..e4ea4215 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -17,7 +17,7 @@ class UriProcessor(BaseProcessor): NAME = 'uri_logging' - def process_normalized(self, raw_doc, normalized): + def process_uris(self, raw_doc, normalized): try: document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) From 4350322b59bf7a5f251db766859c44c0d7f8b750 Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 3 Aug 2015 15:26:29 -0400 Subject: [PATCH 15/92] Add post log event --- scrapi/events.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scrapi/events.py b/scrapi/events.py index f6fc8eca..db943b83 100644 --- a/scrapi/events.py +++ b/scrapi/events.py @@ -22,6 +22,7 @@ HARVESTER_RUN = 'runHarvester' CHECK_ARCHIVE = 'checkArchive' NORMALIZATION = 'normalization' +PROCESSSING_URIS = 'processingUris' # statuses FAILED = 'failed' From 6436e7723f86a78c7c26177caaa1cba76f7b632b Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 11:41:35 -0400 Subject: [PATCH 16/92] Add inv task for process uris --- tasks.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tasks.py b/tasks.py index 3807846f..97ccc266 100644 --- a/tasks.py +++ b/tasks.py @@ -187,6 +187,14 @@ def harvesters(async=False, start=None, end=None): logger.exception(e) +@task +def process_uris(async=False, start=None, end=None): + settings.CELERY_ALWAYS_EAGER = not async + from scrapi.tasks import process_uris + + process_uris.delay(async=async, start=start, end=None) + + @task def lint_all(): for name in registry.keys(): @@ -228,14 +236,6 @@ def provider_map(delete=False): print(es.count('share_providers', body={'query': {'match_all': {}}})['count']) -@task -def process_uris(async=False): - settings.CELERY_ALWAYS_EAGER = not async - from scrapi.tasks import process_uris - - process_uris.delay() - - @task def reset_all(): os.system('psql -c "DROP DATABASE scrapi;"') From 558b8536a07857e19e95b76e3f42bdd1928b96f5 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 11:42:00 -0400 Subject: [PATCH 17/92] Add celery task for process uri that does all documents --- scrapi/tasks.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 200bf87c..2b7a3fb3 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -1,3 +1,4 @@ +import os import logging import functools from itertools import islice @@ -101,12 +102,6 @@ def process_raw(raw_doc, **kwargs): processing.process_raw(raw_doc, kwargs) -@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=settings.CELERY_MAX_RETRIES) -@events.logged(events.PROCESSSING_URIS, 'post_processing') -def process_uris(): - processing.process_uris() - - @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=settings.CELERY_MAX_RETRIES, throws=events.Skip) @events.logged(events.NORMALIZATION) def normalize(raw_doc, harvester_name): @@ -131,6 +126,16 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): processing.process_normalized(raw_doc, normalized_doc, kwargs) +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=settings.CELERY_MAX_RETRIES) +@events.logged(events.PROCESSSING_URIS, 'post_processing') +def process_uris(**kwargs): + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") + from api.webview.models import Document + + for document in Document.objects.all(): + processing.process_uris(document, kwargs) + + @app.task def migrate(migration, sources=tuple(), async=False, dry=True, group_size=1000, **kwargs): from scrapi.migrations import documents From 51be35f38fac4a3beee6774305a4d7a96e9daf5e Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 11:42:42 -0400 Subject: [PATCH 18/92] Add try except for document normalized instead of the doc not existing --- scrapi/processing/uri_logging.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index e4ea4215..b1ae7bd9 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -8,8 +8,8 @@ from scrapi.processing.base import BaseProcessor os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") -from django.core.exceptions import ObjectDoesNotExist -from api.webview.models import Document +# from django.core.exceptions import ObjectDoesNotExist +# from api.webview.models import Document logger = logging.getLogger(__name__) @@ -17,17 +17,15 @@ class UriProcessor(BaseProcessor): NAME = 'uri_logging' - def process_uris(self, raw_doc, normalized): + def process_uris(self, document): try: - document = Document.objects.get(source=raw_doc['source'], docID=raw_doc['docID']) - processed_normalized = self.save_status_of_canonical_uri(document.normalized) processed_normalized = self.save_status_of_object_uris(processed_normalized) document.normalized = processed_normalized document.save() - except ObjectDoesNotExist: + except TypeError: pass def save_status_of_canonical_uri(self, normalized): From f264fb4ec177bde2e2c057742c775abeead5265a Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 11:45:29 -0400 Subject: [PATCH 19/92] Remove unused os and django settings --- scrapi/processing/uri_logging.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index b1ae7bd9..9e51af55 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -1,15 +1,11 @@ from __future__ import absolute_import -import os import datetime import requests import logging from scrapi.processing.base import BaseProcessor -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") -# from django.core.exceptions import ObjectDoesNotExist -# from api.webview.models import Document logger = logging.getLogger(__name__) From 5f50306932edb4615c51cd8ef30a5e55441d04b0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 11:46:05 -0400 Subject: [PATCH 20/92] change args and kwargs for processor method --- scrapi/processing/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scrapi/processing/__init__.py b/scrapi/processing/__init__.py index 4a516c99..bd4e4ee5 100644 --- a/scrapi/processing/__init__.py +++ b/scrapi/processing/__init__.py @@ -36,7 +36,7 @@ def process_raw(raw_doc, kwargs): get_processor(p).process_raw(raw_doc, **extras) -def post_process(raw_doc, normalized, kwargs): +def process_uris(document, kwargs): for p in settings.POST_PROCESSING: extras = kwargs.get(p, {}) - get_processor(p).process_normalized(raw_doc, normalized, **extras) + get_processor(p).process_uris(document, **extras) From 9db7b50649858aa63e0cbd4413892c6417914930 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 11:46:25 -0400 Subject: [PATCH 21/92] Add cross origin settings to local dist --- api/api/settings/local-dist.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/api/settings/local-dist.py b/api/api/settings/local-dist.py index 6bebde93..934bd1bf 100644 --- a/api/api/settings/local-dist.py +++ b/api/api/settings/local-dist.py @@ -16,3 +16,10 @@ } STATIC_URL = '/static/' + + +CORS_ORIGIN_WHITELIST = ( + 'localhost:5000', + 'osf.io', + 'staging.osf.io' +) From 8542dc07cd3945eb8c90a5c9a521283e47a9b0fc Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 4 Aug 2015 13:38:32 -0400 Subject: [PATCH 22/92] Now specifiy source to just resolve urls in that source --- scrapi/tasks.py | 9 ++++++--- tasks.py | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 2b7a3fb3..4724993a 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -131,9 +131,12 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): def process_uris(**kwargs): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") from api.webview.models import Document - - for document in Document.objects.all(): - processing.process_uris(document, kwargs) + if kwargs.get('source'): + for document in Document.objects.filter(source=kwargs['source']): + processing.process_uris(document, kwargs) + else: + for document in Document.objects.all(): + processing.process_uris(document, kwargs) @app.task diff --git a/tasks.py b/tasks.py index 97ccc266..182d1ab4 100644 --- a/tasks.py +++ b/tasks.py @@ -188,11 +188,11 @@ def harvesters(async=False, start=None, end=None): @task -def process_uris(async=False, start=None, end=None): +def process_uris(async=False, start=None, end=None, source=None): settings.CELERY_ALWAYS_EAGER = not async from scrapi.tasks import process_uris - process_uris.delay(async=async, start=start, end=None) + process_uris.delay(async=async, start=start, end=end, source=source) @task From ab0239661cc469d44dd5475181f1f8ecb42524d1 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 5 Aug 2015 09:37:05 -0400 Subject: [PATCH 23/92] Massive if statement to organize source uris into common buckets --- scrapi/tasks.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 4724993a..d0579333 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -1,4 +1,5 @@ import os +import re import logging import functools from itertools import islice @@ -126,11 +127,32 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): processing.process_normalized(raw_doc, normalized_doc, kwargs) -@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=settings.CELERY_MAX_RETRIES) +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) @events.logged(events.PROCESSSING_URIS, 'post_processing') def process_uris(**kwargs): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") from api.webview.models import Document + + URL_RE = re.compile(r'(https?:\/\/[^\/]*)') + + if kwargs.get('async'): + uri_buckets = [] + for source in registry.keys(): + source_dict = {'source': source, 'uris': [{}]} + for document in Document.objects.filter(source=source): + if document.normalized: + cannonical_uri = document.normalized['canonicalUri'] + base_uri = URL_RE.search(cannonical_uri).group() + for entry in source_dict['uris']: + if base_uri == entry.get('base_uri'): + entry['base_uri']['individual_uris'].append(cannonical_uri) + else: + entry['base_uri'] = base_uri + entry['individual_uris'] = [cannonical_uri] + uri_buckets.append(source_dict) + + print(uri_buckets) + if kwargs.get('source'): for document in Document.objects.filter(source=kwargs['source']): processing.process_uris(document, kwargs) From 970cae2a7744b9199b720cff2ffafbcc0f5555de Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 10 Aug 2015 11:03:14 -0400 Subject: [PATCH 24/92] Update logging to be by document instead of all at once --- scrapi/processing/uri_logging.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index 9e51af55..36a3952f 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -1,11 +1,15 @@ from __future__ import absolute_import +import os import datetime import requests import logging from scrapi.processing.base import BaseProcessor +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") +from api.webview.models import Document + logger = logging.getLogger(__name__) @@ -13,10 +17,11 @@ class UriProcessor(BaseProcessor): NAME = 'uri_logging' - def process_uris(self, document): + def process_uris(self, source, docID, uri): try: - processed_normalized = self.save_status_of_canonical_uri(document.normalized) - processed_normalized = self.save_status_of_object_uris(processed_normalized) + document = Document.objects.get(source=source, docID=docID) + processed_normalized = self.save_status_of_canonical_uri(document.normalized, uri) + # processed_normalized = self.save_status_of_object_uris(processed_normalized) document.normalized = processed_normalized @@ -24,11 +29,11 @@ def process_uris(self, document): except TypeError: pass - def save_status_of_canonical_uri(self, normalized): - cannonical_uri_status = requests.get(normalized['uris']['canonicalUri']) + def save_status_of_canonical_uri(self, normalized, uri): + cannonical_uri_status = requests.get(uri) cannonical_status = { - 'actual_uri': normalized['uris']['canonicalUri'], + 'actual_uri': uri, 'resolved_uri': cannonical_uri_status.url, 'resolved_datetime': datetime.datetime.now(), 'resolved_status': cannonical_uri_status.status_code, From 73d00bc6cce45d01f01841ed3f99b30a7a7958f6 Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 10 Aug 2015 11:03:53 -0400 Subject: [PATCH 25/92] Start breaking into smaller chunks --- scrapi/tasks.py | 55 ++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index d0579333..6b222e28 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -1,5 +1,6 @@ import os -import re +import re +import json import logging import functools from itertools import islice @@ -127,38 +128,32 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): processing.process_normalized(raw_doc, normalized_doc, kwargs) -@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) -@events.logged(events.PROCESSSING_URIS, 'post_processing') +# @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) +# @events.logged(events.PROCESSSING_URIS, 'post_processing') def process_uris(**kwargs): - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") - from api.webview.models import Document - - URL_RE = re.compile(r'(https?:\/\/[^\/]*)') if kwargs.get('async'): - uri_buckets = [] - for source in registry.keys(): - source_dict = {'source': source, 'uris': [{}]} - for document in Document.objects.filter(source=source): - if document.normalized: - cannonical_uri = document.normalized['canonicalUri'] - base_uri = URL_RE.search(cannonical_uri).group() - for entry in source_dict['uris']: - if base_uri == entry.get('base_uri'): - entry['base_uri']['individual_uris'].append(cannonical_uri) - else: - entry['base_uri'] = base_uri - entry['individual_uris'] = [cannonical_uri] - uri_buckets.append(source_dict) - - print(uri_buckets) - - if kwargs.get('source'): - for document in Document.objects.filter(source=kwargs['source']): - processing.process_uris(document, kwargs) - else: - for document in Document.objects.all(): - processing.process_uris(document, kwargs) + all_buckets = [] + if kwargs.get('source'): + uri_buckets = util.parse_urls_into_groups(kwargs.get('source')) + all_buckets.append(uri_buckets) + else: + for source in registry.keys(): + uri_buckets = util.parse_urls_into_groups(source) + all_buckets.append(uri_buckets) + + print(json.dumps(all_buckets, indent=4)) + + for source_dict in uri_buckets: + for group in source_dict['uris']: + process_uris_at_one_base_uri(group['individual_uris']) + + +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) +@events.logged(events.PROCESSSING_URIS, 'post_processing') +def process_uris_at_one_base_uri(uri_list): + for uri in uri_list: + processing.process_uris(source=uri['source'], docID=uri['docID'], uri=uri['uri']) @app.task From da4699961a42a8bb233a66dbe8bc877a1f46bdff Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 10 Aug 2015 11:04:17 -0400 Subject: [PATCH 26/92] Breaking URIs into smaller groups now by source instead of all one --- scrapi/util.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/scrapi/util.py b/scrapi/util.py index 0116141d..0dbed8b6 100644 --- a/scrapi/util.py +++ b/scrapi/util.py @@ -1,8 +1,15 @@ from datetime import datetime +import os +import re import six import pytz +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") +from api.webview.models import Document + +URL_RE = re.compile(r'(https?:\/\/[^\/]*)') + def timestamp(): return pytz.utc.localize(datetime.utcnow()).isoformat() @@ -51,3 +58,58 @@ def json_without_bytes(jobj): if isinstance(v, six.binary_type): jobj[k] = v.decode('utf8') return jobj + + +def parse_urls_into_groups(source): + + uri_buckets = [] + for document in Document.objects.filter(source=source): + if document.normalized: + cannonical_uri = document.normalized['uris']['canonicalUri'] + provider_uris = document.normalized['uris'].get('providerUris') + descriptor_uris = document.normalized['uris'].get('descriptorUris') + object_uris = document.normalized['uris'].get('objectUris') + + uri_buckets.append(cannonical_uri_processing(cannonical_uri, document.normalized)) + + if provider_uris: + uri_buckets = other_uri_processing(provider_uris, 'providerUris', uri_buckets) + if descriptor_uris: + uri_buckets = other_uri_processing(descriptor_uris, 'descriptorUris', uri_buckets) + if object_uris: + uri_buckets = other_uri_processing(object_uris, 'objectUris', uri_buckets) + + return uri_buckets + + +def other_uri_processing(uri, uritype, uri_buckets): + pass + + +def cannonical_uri_processing(cannonical_uri, normalized): + source_dict = {'source': source, 'uris': [{}]} + base_uri = URL_RE.search(cannonical_uri).group() + for entry in source_dict['uris']: + if base_uri == entry.get('base_uri'): + if entry.get('individual_uris'): + entry['individual_uris'].append({ + 'uri': cannonical_uri, + 'source': normalized['shareProperties']['source'], + 'docID': normalized['shareProperties']['docID'], + 'type': 'cannonicalUri' + }) + else: + entry['individual_uris'] = [{ + 'uri': cannonical_uri, + 'source': normalized['shareProperties']['source'], + 'docID': normalized['shareProperties']['docID'], + 'type': 'cannonicalUri' + }] + else: + entry['base_uri'] = base_uri + entry['individual_uris'] = [{ + 'uri': cannonical_uri, + 'source': normalized['shareProperties']['source'], + 'docID': normalized['shareProperties']['docID'], + 'type': 'cannonicalUri' + }] From 6af8a54454e01068fcdeadfe52bd257c4e9ef5cd Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 11 Aug 2015 10:36:44 -0400 Subject: [PATCH 27/92] Fix url parsing for all different types of URIs --- scrapi/util.py | 92 +++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/scrapi/util.py b/scrapi/util.py index 0dbed8b6..3ebea623 100644 --- a/scrapi/util.py +++ b/scrapi/util.py @@ -62,54 +62,54 @@ def json_without_bytes(jobj): def parse_urls_into_groups(source): - uri_buckets = [] + source_dict = {'source': source, 'uris': [], 'all_bases': []} for document in Document.objects.filter(source=source): if document.normalized: - cannonical_uri = document.normalized['uris']['canonicalUri'] - provider_uris = document.normalized['uris'].get('providerUris') - descriptor_uris = document.normalized['uris'].get('descriptorUris') - object_uris = document.normalized['uris'].get('objectUris') - - uri_buckets.append(cannonical_uri_processing(cannonical_uri, document.normalized)) - - if provider_uris: - uri_buckets = other_uri_processing(provider_uris, 'providerUris', uri_buckets) - if descriptor_uris: - uri_buckets = other_uri_processing(descriptor_uris, 'descriptorUris', uri_buckets) - if object_uris: - uri_buckets = other_uri_processing(object_uris, 'objectUris', uri_buckets) - - return uri_buckets - - -def other_uri_processing(uri, uritype, uri_buckets): - pass - - -def cannonical_uri_processing(cannonical_uri, normalized): - source_dict = {'source': source, 'uris': [{}]} - base_uri = URL_RE.search(cannonical_uri).group() - for entry in source_dict['uris']: - if base_uri == entry.get('base_uri'): - if entry.get('individual_uris'): + docID = document.normalized['shareProperties']['docID'] + + source_dict = uri_processing( + document.normalized['uris']['canonicalUri'], + source, + docID, + source_dict, + 'cannonicalUri' + ) + + if document.normalized['uris'].get('providerUris'): + for uri in document.normalized['uris']['providerUris']: + source_dict = uri_processing(uri, source, docID, source_dict, 'providerUris') + if document.normalized['uris'].get('descriptorUris'): + for uri in document.normalized['uris']['descriptorUris']: + source_dict = uri_processing(uri, source, docID, source_dict, 'descriptorUris') + if document.normalized['uris'].get('objectUris'): + for uri in document.normalized['uris']['objectUris']: + source_dict = uri_processing(uri, source, docID, source_dict, 'objectUris') + + return source_dict + + +def uri_processing(uri, source, docID, source_dict, uritype): + base_uri = URL_RE.search(uri).group() + + if base_uri in source_dict['all_bases']: + for entry in source_dict['uris']: + if base_uri == entry['base_uri']: entry['individual_uris'].append({ - 'uri': cannonical_uri, - 'source': normalized['shareProperties']['source'], - 'docID': normalized['shareProperties']['docID'], - 'type': 'cannonicalUri' + 'uri': uri, + 'source': source, + 'docID': docID, + 'type': uritype }) - else: - entry['individual_uris'] = [{ - 'uri': cannonical_uri, - 'source': normalized['shareProperties']['source'], - 'docID': normalized['shareProperties']['docID'], - 'type': 'cannonicalUri' - }] - else: - entry['base_uri'] = base_uri - entry['individual_uris'] = [{ - 'uri': cannonical_uri, - 'source': normalized['shareProperties']['source'], - 'docID': normalized['shareProperties']['docID'], - 'type': 'cannonicalUri' + else: + source_dict['uris'].append({ + 'base_uri': base_uri, + 'individual_uris': [{ + 'uri': uri, + 'source': source, + 'docID': docID, + 'type': uritype }] + }) + source_dict['all_bases'].append(base_uri) + + return source_dict From 2d8b6dac31f4dc9fd25e40a12bda70b9c8d043b8 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 11 Aug 2015 10:47:30 -0400 Subject: [PATCH 28/92] Change to uritype --- scrapi/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scrapi/util.py b/scrapi/util.py index 3ebea623..59cafffe 100644 --- a/scrapi/util.py +++ b/scrapi/util.py @@ -98,7 +98,7 @@ def uri_processing(uri, source, docID, source_dict, uritype): 'uri': uri, 'source': source, 'docID': docID, - 'type': uritype + 'uritype': uritype }) else: source_dict['uris'].append({ @@ -107,7 +107,7 @@ def uri_processing(uri, source, docID, source_dict, uritype): 'uri': uri, 'source': source, 'docID': docID, - 'type': uritype + 'uritype': uritype }] }) source_dict['all_bases'].append(base_uri) From 8bac5758ee641b9c32648308a4202d3f1aebf085 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 11 Aug 2015 11:05:00 -0400 Subject: [PATCH 29/92] Update uri processing processor to be more universal --- scrapi/processing/uri_logging.py | 45 +++++++------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index 36a3952f..df43579a 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -17,10 +17,10 @@ class UriProcessor(BaseProcessor): NAME = 'uri_logging' - def process_uris(self, source, docID, uri): + def process_uris(self, source, docID, uri, uritype): try: document = Document.objects.get(source=source, docID=docID) - processed_normalized = self.save_status_of_canonical_uri(document.normalized, uri) + processed_normalized = self.save_status_of_uri(document.normalized, uri, uritype) # processed_normalized = self.save_status_of_object_uris(processed_normalized) document.normalized = processed_normalized @@ -29,47 +29,22 @@ def process_uris(self, source, docID, uri): except TypeError: pass - def save_status_of_canonical_uri(self, normalized, uri): - cannonical_uri_status = requests.get(uri) + def save_status_of_uri(self, normalized, uri, uritype): + uri_status = requests.get(uri) - cannonical_status = { + status = { 'actual_uri': uri, - 'resolved_uri': cannonical_uri_status.url, + 'uritype': uritype, + 'resolved_uri': uri_status.url, 'resolved_datetime': datetime.datetime.now(), - 'resolved_status': cannonical_uri_status.status_code, + 'resolved_status': uri_status.status_code, 'is_doi': True if 'dx.doi.org' in normalized['uris']['canonicalUri'] else False } try: - normalized['shareProperties']['uri_logs']['cannonical_status'].append(cannonical_status) + normalized['shareProperties']['uri_logs']['status'].append(status) except KeyError: normalized['shareProperties']['uri_logs'] = {} - normalized['shareProperties']['uri_logs']['cannonical_status'] = [cannonical_status] - - return normalized - - def save_status_of_object_uris(self, normalized): - try: - all_object_uris = normalized['uris']['object_uris'] - except KeyError: - return normalized - - for uri in all_object_uris: - current_list = [] - uri_resolved = requests.get(uri) - - uri_status = { - 'actual_uri': uri, - 'resolved_uri': uri_resolved.url, - 'resolved_datetime': datetime.datetime.now(), - 'resolved_status': uri_resolved.status_code, - 'is_doi': True if 'dx.doi.org' in uri else False - } - current_list.append(uri_status) - - try: - normalized['shareProperties']['uri_logs']['object_status'].append(current_list) - except KeyError: - normalized['shareProperties']['uri_logs']['object_status'] = [current_list] + normalized['shareProperties']['uri_logs']['status'] = [status] return normalized From 98b2be5b2921882f02d6a8d35455896be39b08cc Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 11 Aug 2015 11:05:54 -0400 Subject: [PATCH 30/92] Celery task for processing uris updated --- scrapi/tasks.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 6b222e28..d65876c9 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -128,23 +128,20 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): processing.process_normalized(raw_doc, normalized_doc, kwargs) -# @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) -# @events.logged(events.PROCESSSING_URIS, 'post_processing') +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) +@events.logged(events.PROCESSSING_URIS, 'post_processing') def process_uris(**kwargs): - if kwargs.get('async'): all_buckets = [] if kwargs.get('source'): - uri_buckets = util.parse_urls_into_groups(kwargs.get('source')) - all_buckets.append(uri_buckets) + source_buckets = util.parse_urls_into_groups(kwargs['source']) + all_buckets.append(source_buckets) else: for source in registry.keys(): - uri_buckets = util.parse_urls_into_groups(source) - all_buckets.append(uri_buckets) - - print(json.dumps(all_buckets, indent=4)) + source_buckets = util.parse_urls_into_groups(source) + all_buckets.append(source_buckets) - for source_dict in uri_buckets: + for source_dict in all_buckets: for group in source_dict['uris']: process_uris_at_one_base_uri(group['individual_uris']) @@ -153,7 +150,12 @@ def process_uris(**kwargs): @events.logged(events.PROCESSSING_URIS, 'post_processing') def process_uris_at_one_base_uri(uri_list): for uri in uri_list: - processing.process_uris(source=uri['source'], docID=uri['docID'], uri=uri['uri']) + processing.process_uris( + source=uri['source'], + docID=uri['docID'], + uri=uri['uri'], + uritype=uri['uritype'] + ) @app.task From d6d96f9754838cfa3823b6f60949a56cdc8f99f8 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 11 Aug 2015 11:06:11 -0400 Subject: [PATCH 31/92] Remove unecessary args from tasks --- tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks.py b/tasks.py index 182d1ab4..627c0659 100644 --- a/tasks.py +++ b/tasks.py @@ -188,11 +188,11 @@ def harvesters(async=False, start=None, end=None): @task -def process_uris(async=False, start=None, end=None, source=None): +def process_uris(async=False, source=None): settings.CELERY_ALWAYS_EAGER = not async from scrapi.tasks import process_uris - process_uris.delay(async=async, start=start, end=end, source=source) + process_uris.delay(async=async, source=source) @task From 77b875c0b6f281bed5470e5a9e18eaa6eaecdfc0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 10:43:03 -0400 Subject: [PATCH 32/92] Remove old comments --- scrapi/processing/uri_logging.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index df43579a..f9779262 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -21,7 +21,6 @@ def process_uris(self, source, docID, uri, uritype): try: document = Document.objects.get(source=source, docID=docID) processed_normalized = self.save_status_of_uri(document.normalized, uri, uritype) - # processed_normalized = self.save_status_of_object_uris(processed_normalized) document.normalized = processed_normalized From f380406df02b1e56d9ae3dd2439458a67c5be6a5 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 10:43:36 -0400 Subject: [PATCH 33/92] Add invoke apiserver task --- tasks.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasks.py b/tasks.py index 627c0659..89b4a312 100644 --- a/tasks.py +++ b/tasks.py @@ -236,6 +236,11 @@ def provider_map(delete=False): print(es.count('share_providers', body={'query': {'match_all': {}}})['count']) +@task +def apiserver(): + os.system('python manage.py runserver') + + @task def reset_all(): os.system('psql -c "DROP DATABASE scrapi;"') From 1384544d62e8a7d155ef1241d97c58326ddb6d7b Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 10:43:53 -0400 Subject: [PATCH 34/92] Add proces one URI task that can be rate limited --- scrapi/tasks.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index d65876c9..4688b6ad 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -1,6 +1,3 @@ -import os -import re -import json import logging import functools from itertools import islice @@ -150,12 +147,18 @@ def process_uris(**kwargs): @events.logged(events.PROCESSSING_URIS, 'post_processing') def process_uris_at_one_base_uri(uri_list): for uri in uri_list: - processing.process_uris( - source=uri['source'], - docID=uri['docID'], - uri=uri['uri'], - uritype=uri['uritype'] - ) + process_one_uri(uri) + + +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0, rate_limit='5/s') +@events.logged(events.PROCESSSING_URIS, 'post_processing') +def process_one_uri(uri): + processing.process_uris( + source=uri['source'], + docID=uri['docID'], + uri=uri['uri'], + uritype=uri['uritype'] + ) @app.task From 3d851e1c0e5bf9be8862429b7e4eb1ee713cd196 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 15:42:48 -0400 Subject: [PATCH 35/92] Allow proper not async settings --- scrapi/tasks.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 4688b6ad..aeb0f3d4 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -128,26 +128,31 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) @events.logged(events.PROCESSSING_URIS, 'post_processing') def process_uris(**kwargs): - if kwargs.get('async'): - all_buckets = [] - if kwargs.get('source'): - source_buckets = util.parse_urls_into_groups(kwargs['source']) + all_buckets = [] + if kwargs.get('source'): + source_buckets = util.parse_urls_into_groups(kwargs['source']) + all_buckets.append(source_buckets) + else: + for source in registry.keys(): + source_buckets = util.parse_urls_into_groups(source) all_buckets.append(source_buckets) - else: - for source in registry.keys(): - source_buckets = util.parse_urls_into_groups(source) - all_buckets.append(source_buckets) - for source_dict in all_buckets: - for group in source_dict['uris']: + for source_dict in all_buckets: + for group in source_dict['uris']: + if kwargs.get('async'): + process_uris_at_one_base_uri.delay(group['individual_uris'], kwargs['async']) + else: process_uris_at_one_base_uri(group['individual_uris']) @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) @events.logged(events.PROCESSSING_URIS, 'post_processing') -def process_uris_at_one_base_uri(uri_list): +def process_uris_at_one_base_uri(uri_list, async=False): for uri in uri_list: - process_one_uri(uri) + if async: + process_one_uri.delay(uri) + else: + process_one_uri(uri) @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0, rate_limit='5/s') From 89219ac9a64d01f6d9798ff6d4b5fb8bddb1fcf2 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 17:39:23 -0400 Subject: [PATCH 36/92] Update reset_all task to incl a confirmation --- tasks.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasks.py b/tasks.py index 89b4a312..3dba470e 100644 --- a/tasks.py +++ b/tasks.py @@ -243,6 +243,12 @@ def apiserver(): @task def reset_all(): + try: + input = raw_input + except Exception: + pass + if input('Are you sure? y/N ') != 'y': + return os.system('psql -c "DROP DATABASE scrapi;"') os.system('psql -c "CREATE DATABASE scrapi;"') os.system('python manage.py migrate') From c44722cc39f6b7f3cbcec5748dd726947a18b242 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 17:39:46 -0400 Subject: [PATCH 37/92] Use Celery always eager setting for async control --- scrapi/tasks.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index aeb0f3d4..5a69da04 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -126,8 +126,10 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) -@events.logged(events.PROCESSSING_URIS, 'post_processing') -def process_uris(**kwargs): +@events.logged(events.PROCESSSING_URIS, 'uri_processing') +def process_uris(async, **kwargs): + settings.CELERY_ALWAYS_EAGER = not async + all_buckets = [] if kwargs.get('source'): source_buckets = util.parse_urls_into_groups(kwargs['source']) @@ -139,30 +141,27 @@ def process_uris(**kwargs): for source_dict in all_buckets: for group in source_dict['uris']: - if kwargs.get('async'): - process_uris_at_one_base_uri.delay(group['individual_uris'], kwargs['async']) - else: - process_uris_at_one_base_uri(group['individual_uris']) + process_uris_at_one_base_uri.delay(group['individual_uris'], async, kwargs=kwargs) @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) -@events.logged(events.PROCESSSING_URIS, 'post_processing') -def process_uris_at_one_base_uri(uri_list, async=False): +@events.logged(events.PROCESSSING_URIS, 'uri_processing') +def process_uris_at_one_base_uri(uri_list, async=False, **kwargs): + settings.CELERY_ALWAYS_EAGER = not async + for uri in uri_list: - if async: - process_one_uri.delay(uri) - else: - process_one_uri(uri) + process_one_uri.delay(uri, kwargs=kwargs) @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0, rate_limit='5/s') -@events.logged(events.PROCESSSING_URIS, 'post_processing') -def process_one_uri(uri): +@events.logged(events.PROCESSSING_URIS, 'uri_processing') +def process_one_uri(uri, **kwargs): processing.process_uris( source=uri['source'], docID=uri['docID'], uri=uri['uri'], - uritype=uri['uritype'] + uritype=uri['uritype'], + kwargs=kwargs ) From 86180f11ed5eebb81ce9cc60352f4855e35f16f3 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 12 Aug 2015 17:40:36 -0400 Subject: [PATCH 38/92] Pass around correct params to uri logging --- scrapi/processing/__init__.py | 4 ++-- scrapi/processing/base.py | 4 ++-- scrapi/processing/uri_logging.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scrapi/processing/__init__.py b/scrapi/processing/__init__.py index bd4e4ee5..7a1918dd 100644 --- a/scrapi/processing/__init__.py +++ b/scrapi/processing/__init__.py @@ -36,7 +36,7 @@ def process_raw(raw_doc, kwargs): get_processor(p).process_raw(raw_doc, **extras) -def process_uris(document, kwargs): +def process_uris(source, docID, uri, uritype, kwargs): for p in settings.POST_PROCESSING: extras = kwargs.get(p, {}) - get_processor(p).process_uris(document, **extras) + get_processor(p).process_uris(source, docID, uri, uritype, **extras) diff --git a/scrapi/processing/base.py b/scrapi/processing/base.py index c8794b93..87bcb869 100644 --- a/scrapi/processing/base.py +++ b/scrapi/processing/base.py @@ -7,5 +7,5 @@ def process_raw(self, raw_doc, **kwargs): def process_normalized(self, raw_doc, normalized, **kwargs): pass # pragma: no cover - def post_process(raw_doc, normalized, kwargs): - pass + def process_uris(self, source, docID, uri, uritype, **kwargs): + pass # pragma: no cover diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index f9779262..a6812189 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -17,7 +17,7 @@ class UriProcessor(BaseProcessor): NAME = 'uri_logging' - def process_uris(self, source, docID, uri, uritype): + def process_uris(self, source, docID, uri, uritype, **kwargs): try: document = Document.objects.get(source=source, docID=docID) processed_normalized = self.save_status_of_uri(document.normalized, uri, uritype) From 397af5ddce18c7b7b0705944b656326a3cb4768b Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 17 Aug 2015 15:34:12 -0400 Subject: [PATCH 39/92] Add basic scraping to uri pipeline --- scrapi/processing/uri_logging.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index a6812189..16bc8abd 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -4,7 +4,9 @@ import datetime import requests import logging +# from furl import furl +from scrapi.processing import scrapers from scrapi.processing.base import BaseProcessor os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") @@ -46,4 +48,12 @@ def save_status_of_uri(self, normalized, uri, uritype): normalized['shareProperties']['uri_logs'] = {} normalized['shareProperties']['uri_logs']['status'] = [status] + extra_info = scrapers.collect_scraped(uri) + + if extra_info: + try: + normalized['shareProperties']['scraped_properties'].append(extra_info) + except KeyError: + normalized['shareProperties']['scraped_properties'] = [extra_info] + return normalized From b1a3aec924c9f388a54ab7bf347b2e71fa4040ad Mon Sep 17 00:00:00 2001 From: erinspace Date: Mon, 17 Aug 2015 15:34:42 -0400 Subject: [PATCH 40/92] Add basic scrapers for springer and science direct --- scrapi/processing/scrapers.py | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 scrapi/processing/scrapers.py diff --git a/scrapi/processing/scrapers.py b/scrapi/processing/scrapers.py new file mode 100644 index 00000000..367c54e7 --- /dev/null +++ b/scrapi/processing/scrapers.py @@ -0,0 +1,67 @@ +from furl import furl +import requests +from lxml import etree +from bs4 import BeautifulSoup + + +def collect_scraped(uri): + + base = furl(uri).host.replace('www.', '') + if base == 'sciencedirect.com': + info = science_direct(base) + elif base == 'link.springer.com': + info = springer_link(base) + else: + info = {} + + return info + + +# Generic helpers + +def get_elements_from_link(link): + content = requests.get(link).content + return etree.HTML(content) + + +def get_html_from_link(link): + return requests.get(link).content + + +# Science Direct + +def science_direct(uri): + soup = BeautifulSoup(get_html_from_link(uri)) + all_authors = soup.find_all("a", class_="authorName") + + return parse_sd_author_list(all_authors) + + +# Springer Link + +def springer_link(uri): + element = get_elements_from_link(uri) + return {'open_access': get_springer_open_access(element)} + + +def get_springer_open_access(element): + links = element.xpath('//a') + words = [] + for link in links: + if 'viewtype' in link.keys(): + if 'webtrekk-track' in link.get('class'): + words.append(link.get('viewtype')) + if 'Denial' in words: + return False + else: + return True + + +def parse_sd_author_list(author_list): + all_authors = [] + for author in author_list: + author_info = author.attrs + author_info['full_name'] = author.text + all_authors.append(author_info) + + return all_authors From 83540d05785e15b2d0c6baf06c3bfce14b4efdb2 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 18 Aug 2015 16:46:50 -0400 Subject: [PATCH 41/92] Move scrapers around, add more utilty --- scrapi/processing/scrapers.py | 67 ------------------------ scrapi/scrapers/__init__.py | 0 scrapi/scrapers/scrapers.py | 95 +++++++++++++++++++++++++++++++++++ scrapi/scrapers/utils.py | 26 ++++++++++ 4 files changed, 121 insertions(+), 67 deletions(-) delete mode 100644 scrapi/processing/scrapers.py create mode 100644 scrapi/scrapers/__init__.py create mode 100644 scrapi/scrapers/scrapers.py create mode 100644 scrapi/scrapers/utils.py diff --git a/scrapi/processing/scrapers.py b/scrapi/processing/scrapers.py deleted file mode 100644 index 367c54e7..00000000 --- a/scrapi/processing/scrapers.py +++ /dev/null @@ -1,67 +0,0 @@ -from furl import furl -import requests -from lxml import etree -from bs4 import BeautifulSoup - - -def collect_scraped(uri): - - base = furl(uri).host.replace('www.', '') - if base == 'sciencedirect.com': - info = science_direct(base) - elif base == 'link.springer.com': - info = springer_link(base) - else: - info = {} - - return info - - -# Generic helpers - -def get_elements_from_link(link): - content = requests.get(link).content - return etree.HTML(content) - - -def get_html_from_link(link): - return requests.get(link).content - - -# Science Direct - -def science_direct(uri): - soup = BeautifulSoup(get_html_from_link(uri)) - all_authors = soup.find_all("a", class_="authorName") - - return parse_sd_author_list(all_authors) - - -# Springer Link - -def springer_link(uri): - element = get_elements_from_link(uri) - return {'open_access': get_springer_open_access(element)} - - -def get_springer_open_access(element): - links = element.xpath('//a') - words = [] - for link in links: - if 'viewtype' in link.keys(): - if 'webtrekk-track' in link.get('class'): - words.append(link.get('viewtype')) - if 'Denial' in words: - return False - else: - return True - - -def parse_sd_author_list(author_list): - all_authors = [] - for author in author_list: - author_info = author.attrs - author_info['full_name'] = author.text - all_authors.append(author_info) - - return all_authors diff --git a/scrapi/scrapers/__init__.py b/scrapi/scrapers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/scrapi/scrapers/scrapers.py b/scrapi/scrapers/scrapers.py new file mode 100644 index 00000000..1fe307a1 --- /dev/null +++ b/scrapi/scrapers/scrapers.py @@ -0,0 +1,95 @@ +from furl import furl +from bs4 import BeautifulSoup + +from scrapi.scrapers import utils + + +def collect_scraped(uri): + + base = furl(uri).host.replace('www.', '') + if base == 'sciencedirect.com': + info = science_direct(uri) + elif base == 'link.springer.com': + info = springer_link(uri) + else: + info = {} + + return info + + +# Science Direct + + +def science_direct(uri): + ''' + Future potential +
+
  • + ''' + + return parse_sd_author_list(uri) + + +def parse_sd_author_list(uri): + + soup = BeautifulSoup(utils.get_html_from_link(uri), "lxml") + + auth_affil = soup.find_all("ul", class_="authorGroup") + lis = [item.find_all('li') for item in auth_affil][0] + theas = [thing.find_all('a') for thing in lis] + + full_author_info = [] + for author_pair in theas: + author_info = {} + for author_part in author_pair: + author_info = utils.merge_dicts(author_part.attrs, author_info) + author_info['matcher'] = author_info['href'][0] + + full_author_info.append(author_info) + + # Get affiliations and put them with the original author dict + outer_affilations = soup.find_all("ul", class_="authAffil") + affiliations = [item.find_all('li') for item in outer_affilations] + + affils = [] + for person in affiliations: + for result in person: + d = result.attrs + d['institution'] = result.text + d['matcher'] = d['id'] + affils.append(d) + + all_authors = [] + for author in full_author_info: + del author['data-pos'] + del author['data-t'] + del author['data-tb'] + + for affil in affils: + if author['matcher'].replace('#', '') == affil['matcher']: + combined = author.copy() + combined.update(affil) + all_authors.append(combined) + del author['matcher'] + + return all_authors + + +# Springer Link + +def springer_link(uri): + element = utils.get_elements_from_link(uri) + return {'open_access': get_springer_open_access(element)} + + +def get_springer_open_access(element): + links = element.xpath('//a') + words = [] + for link in links: + if 'viewtype' in link.keys(): + if 'webtrekk-track' in link.get('class'): + words.append(link.get('viewtype')) + if 'Denial' in words: + return False + else: + return True diff --git a/scrapi/scrapers/utils.py b/scrapi/scrapers/utils.py new file mode 100644 index 00000000..f02c8699 --- /dev/null +++ b/scrapi/scrapers/utils.py @@ -0,0 +1,26 @@ +import requests +from lxml import etree + + +def merge_dicts(*dicts): + d = {} + for dict in dicts: + for key in dict: + try: + d[key].append(dict[key]) + except KeyError: + d[key] = [dict[key]] + for key in d: + if len(d[key]) == 1: + d[key] = d[key][0] + + return d + + +def get_elements_from_link(link): + content = requests.get(link).content + return etree.HTML(content) + + +def get_html_from_link(link): + return requests.get(link).content From 8c6f410ac22f84ca56b679d7a7fd19cad05b3f1e Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 21 Aug 2015 10:14:59 -0400 Subject: [PATCH 42/92] Leave things in an experimental state to get uri list --- scrapi/processing/uri_logging.py | 14 +++++++------- scrapi/tasks.py | 10 +++++++--- scrapi/util.py | 7 ++++++- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/uri_logging.py index 16bc8abd..bbc10aa9 100644 --- a/scrapi/processing/uri_logging.py +++ b/scrapi/processing/uri_logging.py @@ -6,7 +6,7 @@ import logging # from furl import furl -from scrapi.processing import scrapers +# from scrapi.processing import scrapers from scrapi.processing.base import BaseProcessor os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") @@ -48,12 +48,12 @@ def save_status_of_uri(self, normalized, uri, uritype): normalized['shareProperties']['uri_logs'] = {} normalized['shareProperties']['uri_logs']['status'] = [status] - extra_info = scrapers.collect_scraped(uri) + # extra_info = scrapers.collect_scraped(uri) - if extra_info: - try: - normalized['shareProperties']['scraped_properties'].append(extra_info) - except KeyError: - normalized['shareProperties']['scraped_properties'] = [extra_info] + # if extra_info: + # try: + # normalized['shareProperties']['scraped_properties'].append(extra_info) + # except KeyError: + # normalized['shareProperties']['scraped_properties'] = [extra_info] return normalized diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 5a69da04..948605e2 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -1,4 +1,5 @@ import logging +import json import functools from itertools import islice from datetime import date, timedelta @@ -139,9 +140,12 @@ def process_uris(async, **kwargs): source_buckets = util.parse_urls_into_groups(source) all_buckets.append(source_buckets) - for source_dict in all_buckets: - for group in source_dict['uris']: - process_uris_at_one_base_uri.delay(group['individual_uris'], async, kwargs=kwargs) + with open('all_sources.json', 'w') as outfile: + json.dump(all_buckets, outfile) + + # for source_dict in all_buckets: + # for group in source_dict['uris']: + # process_uris_at_one_base_uri.delay(group['individual_uris'], async, kwargs=kwargs) @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) diff --git a/scrapi/util.py b/scrapi/util.py index 59cafffe..86bf0b08 100644 --- a/scrapi/util.py +++ b/scrapi/util.py @@ -83,7 +83,12 @@ def parse_urls_into_groups(source): source_dict = uri_processing(uri, source, docID, source_dict, 'descriptorUris') if document.normalized['uris'].get('objectUris'): for uri in document.normalized['uris']['objectUris']: - source_dict = uri_processing(uri, source, docID, source_dict, 'objectUris') + if uri: + if isinstance(uri, list): + for element in uri: + source_dict = uri_processing(element, source, docID, source_dict, 'objectUris') + else: + source_dict = uri_processing(uri, source, docID, source_dict, 'objectUris') return source_dict From 4475e5de3ae5e7332d81a54fc76189a81e061160 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 12:15:35 -0400 Subject: [PATCH 43/92] Add models for a person and a URL harvest --- api/webview/models.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/api/webview/models.py b/api/webview/models.py index e0a9dc1e..6a044ac9 100644 --- a/api/webview/models.py +++ b/api/webview/models.py @@ -2,14 +2,11 @@ from django_pgjson.fields import JsonField -class Document(models.Model): - source = models.CharField(max_length=255) - docID = models.TextField() - - providerUpdatedDateTime = models.DateTimeField(null=True) - - raw = JsonField() - normalized = JsonField(null=True) +class Person(models.Model): + name = models.CharField(max_length=255) + institution = models.CharField(max_length=255, null=True) + email = models.CharField(max_length=100) + ids = JsonField(null=True) class HarvesterResponse(models.Model): @@ -26,3 +23,22 @@ class HarvesterResponse(models.Model): headers_str = models.TextField(null=True) status_code = models.IntegerField(null=True) time_made = models.DateTimeField(auto_now=True) + + +class URL(models.Model): + url = models.CharField(max_length=500) + status = JsonField(null=True) + response = models.ForeignKey(HarvesterResponse, related_name='response') + + +class Document(models.Model): + source = models.CharField(max_length=255) + docID = models.TextField() + + providerUpdatedDateTime = models.DateTimeField(null=True) + + raw = JsonField() + normalized = JsonField(null=True) + + contributors = models.ManyToManyField(Person, related_name='contributors') + urls = models.ManyToManyField(URL, related_name='urls') From 386f85df74cd015ac0785593300c511a8ff5af9e Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 12:17:02 -0400 Subject: [PATCH 44/92] Make sure things are null that may be --- api/webview/models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/webview/models.py b/api/webview/models.py index 6a044ac9..b67edb16 100644 --- a/api/webview/models.py +++ b/api/webview/models.py @@ -5,7 +5,6 @@ class Person(models.Model): name = models.CharField(max_length=255) institution = models.CharField(max_length=255, null=True) - email = models.CharField(max_length=100) ids = JsonField(null=True) @@ -28,7 +27,7 @@ class HarvesterResponse(models.Model): class URL(models.Model): url = models.CharField(max_length=500) status = JsonField(null=True) - response = models.ForeignKey(HarvesterResponse, related_name='response') + response = models.ForeignKey(HarvesterResponse, related_name='response', null=True) class Document(models.Model): From 12c0928803dca90f43974c8fbcd43d429ae4746f Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 12:55:46 -0400 Subject: [PATCH 45/92] Remove generic id field and add some specific ones --- api/webview/models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/webview/models.py b/api/webview/models.py index b67edb16..1a6119b3 100644 --- a/api/webview/models.py +++ b/api/webview/models.py @@ -5,7 +5,9 @@ class Person(models.Model): name = models.CharField(max_length=255) institution = models.CharField(max_length=255, null=True) - ids = JsonField(null=True) + id_osf = models.CharField(max_length=10, null=True) + id_orcid = models.CharField(max_length=100, null=True) + id_email = models.CharField(max_length=255, null=True) class HarvesterResponse(models.Model): From 20dcac61e78d8ed7d155c0b4462dc9c3986200c0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 13:06:14 -0400 Subject: [PATCH 46/92] Add back HarvesterResponse loss from bad merge --- scrapi/processing/postgres.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index 89fb7656..50b438ad 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -8,7 +8,7 @@ import django -from api.webview.models import Document +from api.webview.models import HarvesterResponse, Document from scrapi import events from scrapi.util import json_without_bytes From 93292c0addbf5b3deabf7900d86bba9b8a5a73f4 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 15:34:37 -0400 Subject: [PATCH 47/92] Rename URI processing to helpers because it will happen in the processors --- scrapi/processing/{uri_logging.py => helpers.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename scrapi/processing/{uri_logging.py => helpers.py} (100%) diff --git a/scrapi/processing/uri_logging.py b/scrapi/processing/helpers.py similarity index 100% rename from scrapi/processing/uri_logging.py rename to scrapi/processing/helpers.py From 690d089abef2709d1a7e6affc2d9f65b98d3d1d0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 15:35:21 -0400 Subject: [PATCH 48/92] Add the processing helpers to do some manipulating --- scrapi/processing/helpers.py | 61 ++++++------------------------------ 1 file changed, 9 insertions(+), 52 deletions(-) diff --git a/scrapi/processing/helpers.py b/scrapi/processing/helpers.py index bbc10aa9..1254a89a 100644 --- a/scrapi/processing/helpers.py +++ b/scrapi/processing/helpers.py @@ -1,59 +1,16 @@ from __future__ import absolute_import -import os import datetime import requests -import logging -# from furl import furl -# from scrapi.processing import scrapers -from scrapi.processing.base import BaseProcessor -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") -from api.webview.models import Document +def save_status_of_uri(uri, uritype): + uri_status = requests.get(uri) - -logger = logging.getLogger(__name__) - - -class UriProcessor(BaseProcessor): - NAME = 'uri_logging' - - def process_uris(self, source, docID, uri, uritype, **kwargs): - try: - document = Document.objects.get(source=source, docID=docID) - processed_normalized = self.save_status_of_uri(document.normalized, uri, uritype) - - document.normalized = processed_normalized - - document.save() - except TypeError: - pass - - def save_status_of_uri(self, normalized, uri, uritype): - uri_status = requests.get(uri) - - status = { - 'actual_uri': uri, - 'uritype': uritype, - 'resolved_uri': uri_status.url, - 'resolved_datetime': datetime.datetime.now(), - 'resolved_status': uri_status.status_code, - 'is_doi': True if 'dx.doi.org' in normalized['uris']['canonicalUri'] else False - } - - try: - normalized['shareProperties']['uri_logs']['status'].append(status) - except KeyError: - normalized['shareProperties']['uri_logs'] = {} - normalized['shareProperties']['uri_logs']['status'] = [status] - - # extra_info = scrapers.collect_scraped(uri) - - # if extra_info: - # try: - # normalized['shareProperties']['scraped_properties'].append(extra_info) - # except KeyError: - # normalized['shareProperties']['scraped_properties'] = [extra_info] - - return normalized + return { + 'actual_uri': uri, + 'uritype': uritype, + 'resolved_uri': uri_status.url, + 'resolved_datetime': datetime.datetime.now(), + 'resolved_status': uri_status.status_code, + } From 73ac7f5f8e7d0732f9dc8db4a2532a03c1e972af Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 15:35:48 -0400 Subject: [PATCH 49/92] Add process_uris to postgres processor Addresses [#SHARE-105] --- scrapi/processing/postgres.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index 50b438ad..f25d9e7e 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -8,12 +8,13 @@ import django -from api.webview.models import HarvesterResponse, Document +from api.webview.models import HarvesterResponse, Document, URL from scrapi import events from scrapi.util import json_without_bytes from scrapi.linter import RawDocument, NormalizedDocument from scrapi.processing import DocumentTuple +from scrapi.processing.helpers import save_status_of_uri from scrapi.processing.base import BaseProcessor, BaseHarvesterResponse, BaseDatabaseManager django.setup() @@ -113,6 +114,17 @@ def _get_by_source_id(self, model, source, docID): except IndexError: return None + def process_uris(self, source, docID, uri, uritype, **kwargs): + document = Document.objects.get(source=source, docID=docID) + status = save_status_of_uri(uri, uritype) + url = URL(url=uri, status=status) + url.save() + document.urls.add(url) + document.save() + + def process_contributors(self): + pass + class HarvesterResponseModel(BaseHarvesterResponse): From d2c8820e082c577a9f6890af62a6b87c232ab946 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 15:36:58 -0400 Subject: [PATCH 50/92] Add back real processing, but leave testing writing to file just in case --- scrapi/tasks.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index 8f9c5b47..acb95c02 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -1,5 +1,4 @@ import logging -import json import functools from itertools import islice from datetime import date, timedelta @@ -138,12 +137,13 @@ def process_uris(async, **kwargs): source_buckets = util.parse_urls_into_groups(source) all_buckets.append(source_buckets) - with open('all_sources.json', 'w') as outfile: - json.dump(all_buckets, outfile) + # import json + # with open('all_sources.json', 'w') as outfile: + # json.dump(all_buckets, outfile) - # for source_dict in all_buckets: - # for group in source_dict['uris']: - # process_uris_at_one_base_uri.delay(group['individual_uris'], async, kwargs=kwargs) + for source_dict in all_buckets: + for group in source_dict['uris']: + process_uris_at_one_base_uri.delay(group['individual_uris'], async, kwargs=kwargs) @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) From 926dc1f8a5e8344ea5c265f02309872b48263d0b Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 15:46:21 -0400 Subject: [PATCH 51/92] Fix error in requirements --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 14748db9..0a3355f9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,6 @@ furl==0.4.4 jsonschema==2.4.0 jsonpointer==1.7 pycountry==1.10 -<<<<<<< Temporary merge branch 1 djangorestframework==3.1.3 Django==1.8.2 django-pgjson==0.3.1 From c1d7e3880648aad12f8c785e823d2be121ee178f Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 15:52:39 -0400 Subject: [PATCH 52/92] Move scrapers for now --- scrapi/scrapers/__init__.py | 0 scrapi/scrapers/scrapers.py | 95 ------------------------------------- scrapi/scrapers/utils.py | 26 ---------- 3 files changed, 121 deletions(-) delete mode 100644 scrapi/scrapers/__init__.py delete mode 100644 scrapi/scrapers/scrapers.py delete mode 100644 scrapi/scrapers/utils.py diff --git a/scrapi/scrapers/__init__.py b/scrapi/scrapers/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/scrapi/scrapers/scrapers.py b/scrapi/scrapers/scrapers.py deleted file mode 100644 index 1fe307a1..00000000 --- a/scrapi/scrapers/scrapers.py +++ /dev/null @@ -1,95 +0,0 @@ -from furl import furl -from bs4 import BeautifulSoup - -from scrapi.scrapers import utils - - -def collect_scraped(uri): - - base = furl(uri).host.replace('www.', '') - if base == 'sciencedirect.com': - info = science_direct(uri) - elif base == 'link.springer.com': - info = springer_link(uri) - else: - info = {} - - return info - - -# Science Direct - - -def science_direct(uri): - ''' - Future potential -
    -
  • - ''' - - return parse_sd_author_list(uri) - - -def parse_sd_author_list(uri): - - soup = BeautifulSoup(utils.get_html_from_link(uri), "lxml") - - auth_affil = soup.find_all("ul", class_="authorGroup") - lis = [item.find_all('li') for item in auth_affil][0] - theas = [thing.find_all('a') for thing in lis] - - full_author_info = [] - for author_pair in theas: - author_info = {} - for author_part in author_pair: - author_info = utils.merge_dicts(author_part.attrs, author_info) - author_info['matcher'] = author_info['href'][0] - - full_author_info.append(author_info) - - # Get affiliations and put them with the original author dict - outer_affilations = soup.find_all("ul", class_="authAffil") - affiliations = [item.find_all('li') for item in outer_affilations] - - affils = [] - for person in affiliations: - for result in person: - d = result.attrs - d['institution'] = result.text - d['matcher'] = d['id'] - affils.append(d) - - all_authors = [] - for author in full_author_info: - del author['data-pos'] - del author['data-t'] - del author['data-tb'] - - for affil in affils: - if author['matcher'].replace('#', '') == affil['matcher']: - combined = author.copy() - combined.update(affil) - all_authors.append(combined) - del author['matcher'] - - return all_authors - - -# Springer Link - -def springer_link(uri): - element = utils.get_elements_from_link(uri) - return {'open_access': get_springer_open_access(element)} - - -def get_springer_open_access(element): - links = element.xpath('//a') - words = [] - for link in links: - if 'viewtype' in link.keys(): - if 'webtrekk-track' in link.get('class'): - words.append(link.get('viewtype')) - if 'Denial' in words: - return False - else: - return True diff --git a/scrapi/scrapers/utils.py b/scrapi/scrapers/utils.py deleted file mode 100644 index f02c8699..00000000 --- a/scrapi/scrapers/utils.py +++ /dev/null @@ -1,26 +0,0 @@ -import requests -from lxml import etree - - -def merge_dicts(*dicts): - d = {} - for dict in dicts: - for key in dict: - try: - d[key].append(dict[key]) - except KeyError: - d[key] = [dict[key]] - for key in d: - if len(d[key]) == 1: - d[key] = d[key][0] - - return d - - -def get_elements_from_link(link): - content = requests.get(link).content - return etree.HTML(content) - - -def get_html_from_link(link): - return requests.get(link).content From 838b37587dea6b77001d9a8ca1ebf3ac7546cc5f Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 17:35:58 -0400 Subject: [PATCH 53/92] Add processing contributors to postgres --- scrapi/processing/postgres.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index f25d9e7e..a2af049a 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -8,7 +8,7 @@ import django -from api.webview.models import HarvesterResponse, Document, URL +from api.webview.models import HarvesterResponse, Document, URL, Person from scrapi import events from scrapi.util import json_without_bytes @@ -122,8 +122,28 @@ def process_uris(self, source, docID, uri, uritype, **kwargs): document.urls.add(url) document.save() - def process_contributors(self): - pass + def process_contributor(self, source, docID, contributor_dict): + document = Document.objects.get(source=source, docID=docID) + + id_osf = None + id_orcid = None + id_email = None + if contributor_dict.get('sameAs'): + for identifier in contributor_dict['sameAs']: + if 'osf.io' in identifier: + id_osf = identifier + if 'orcid' in identifier: + id_orcid = identifier + + if contributor_dict.get('email'): + id_email = contributor_dict['email'] + + # TODO check to see if the person exists first, if they do, don't make a new one + person = Person(name=contributor_dict['name'], id_osf=id_osf, id_email=id_email, id_orcid=id_orcid) + person.save() + + document.contributors.add(person) + document.save() class HarvesterResponseModel(BaseHarvesterResponse): From a4ca45b0ad5ecb06d361288ba3ef1c3bb2ad37f0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 17:36:22 -0400 Subject: [PATCH 54/92] Add task to process contributors --- scrapi/tasks.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index acb95c02..aa913532 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -123,6 +123,43 @@ def process_normalized(normalized_doc, raw_doc, **kwargs): processing.process_normalized(raw_doc, normalized_doc, kwargs) +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) +@events.logged(events.PROCESSSING_URIS, 'uri_processing') +def process_contributors(async, **kwargs): + settings.CELERY_ALWAYS_EAGER = not async + + all_buckets = [] + if kwargs.get('source'): + source_buckets = util.gather_contributors(kwargs['source']) + all_buckets.append(source_buckets) + else: + for source in registry.keys(): + source_buckets = util.gather_contributors(source) + all_buckets.append(source_buckets) + + for source in all_buckets: + process_contributors_from_one_source.delay(source['contributors'], async, kwargs=kwargs) + + +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) +def process_contributors_from_one_source(contributors, async=False, **kwargs): + settings.CELERY_ALWAYS_EAGER = not async + + for person in contributors: + process_one_person.delay(person) + + +@task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0, rate_limit='5/s') +@events.logged(events.PROCESSSING_URIS, 'uri_processing') +def process_one_person(person, **kwargs): + processing.process_contributors( + source=person['source'], + docID=person['docID'], + contributor_dict=person['contributor'], + kwargs=kwargs + ) + + @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0) @events.logged(events.PROCESSSING_URIS, 'uri_processing') def process_uris(async, **kwargs): From 7712ff7ec6532beea4a5657ebf888c44f43f3644 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 17:36:50 -0400 Subject: [PATCH 55/92] Add util function to gather contributors into one place for a source --- scrapi/util.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/scrapi/util.py b/scrapi/util.py index 7c5528d5..e49d1530 100644 --- a/scrapi/util.py +++ b/scrapi/util.py @@ -66,8 +66,21 @@ def json_without_bytes(jobj): return jobj -def parse_urls_into_groups(source): +def gather_contributors(source): + source_contributors = [] + source_dict = {'source': source} + for document in Document.objects.filter(source=source): + if document.normalized: + docID = document.normalized['shareProperties']['docID'] + + for person in document.normalized['contributors']: + source_contributors.append({'source': source, 'docID': docID, 'contributor': person}) + source_dict['contributors'] = source_contributors + return source_dict + + +def parse_urls_into_groups(source): source_dict = {'source': source, 'uris': [], 'all_bases': []} for document in Document.objects.filter(source=source): if document.normalized: From eaacfd2ba93863ebb1b7d63fa5e1be8a3addc0a2 Mon Sep 17 00:00:00 2001 From: erinspace Date: Tue, 6 Oct 2015 17:44:49 -0400 Subject: [PATCH 56/92] Add invoke task for process contributors --- tasks.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tasks.py b/tasks.py index e6888aa2..13894697 100644 --- a/tasks.py +++ b/tasks.py @@ -205,6 +205,14 @@ def process_uris(async=False, source=None): process_uris.delay(async=async, source=source) +@task +def process_contributors(async=False, source=None): + settings.CELERY_ALWAYS_EAGER = not async + from scrapi.tasks import process_contributors + + process_contributors.delay(async=async, source=source) + + @task def lint_all(): for name in registry.keys(): From 51e40e61cd8f32bbf43e88c8dfd774044a5177b3 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 7 Oct 2015 14:04:10 -0400 Subject: [PATCH 57/92] Update related name and add field for reconstructed name --- api/webview/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/webview/models.py b/api/webview/models.py index 1a6119b3..e7d744ce 100644 --- a/api/webview/models.py +++ b/api/webview/models.py @@ -4,6 +4,7 @@ class Person(models.Model): name = models.CharField(max_length=255) + reconstructed_name = models.CharField(max_length=255) institution = models.CharField(max_length=255, null=True) id_osf = models.CharField(max_length=10, null=True) id_orcid = models.CharField(max_length=100, null=True) @@ -41,5 +42,5 @@ class Document(models.Model): raw = JsonField() normalized = JsonField(null=True) - contributors = models.ManyToManyField(Person, related_name='contributors') + contributors = models.ManyToManyField(Person, related_name='documents') urls = models.ManyToManyField(URL, related_name='urls') From 7d2c06094544ec2012488cbff8cc020e150a5aaf Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 7 Oct 2015 14:04:59 -0400 Subject: [PATCH 58/92] Add contrib processig to events --- scrapi/events.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scrapi/events.py b/scrapi/events.py index db943b83..7ab83dab 100644 --- a/scrapi/events.py +++ b/scrapi/events.py @@ -23,6 +23,7 @@ CHECK_ARCHIVE = 'checkArchive' NORMALIZATION = 'normalization' PROCESSSING_URIS = 'processingUris' +PROCESSSING_CONTRIBUTORS = 'processingContributors' # statuses FAILED = 'failed' From 6934afb8265cc355e8e1c3fca30aa849bd345513 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 7 Oct 2015 14:05:29 -0400 Subject: [PATCH 59/92] Add process_contributors to base processor --- scrapi/processing/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scrapi/processing/__init__.py b/scrapi/processing/__init__.py index 899e7b6b..0dade9ca 100644 --- a/scrapi/processing/__init__.py +++ b/scrapi/processing/__init__.py @@ -47,6 +47,12 @@ def process_uris(source, docID, uri, uritype, kwargs): get_processor(p).process_uris(source, docID, uri, uritype, **extras) +def process_contributors(source, docID, contributor_dict, kwargs): + for p in settings.POST_PROCESSING: + extras = kwargs.get(p, {}) + get_processor(p).process_contributors(source, docID, contributor_dict, **extras) + + HarvesterResponse = get_processor(settings.RESPONSE_PROCESSOR).HarvesterResponseModel all_processors = map(get_processor, list(set( From d0d1c84ad0f5e406f5f83e15b48c32ce3fc84f37 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 7 Oct 2015 14:05:52 -0400 Subject: [PATCH 60/92] Add process_contributors to base hold --- scrapi/processing/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scrapi/processing/base.py b/scrapi/processing/base.py index 038fcb69..505b0928 100644 --- a/scrapi/processing/base.py +++ b/scrapi/processing/base.py @@ -17,6 +17,9 @@ def process_normalized(self, raw_doc, normalized, **kwargs): def process_uris(self, source, docID, uri, uritype, **kwargs): pass # pragma: no cover + def process_contributors(self, source, docID, contributor_dict, **kwargs): + pass # pragma: no cover + @abstractmethod def documents(self, *sources): ''' From 2dabdbfa97ebf3c0df00172acb00534e5ad70164 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 7 Oct 2015 14:06:35 -0400 Subject: [PATCH 61/92] Add person gettr, and more to process contributors --- scrapi/processing/postgres.py | 39 ++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/scrapi/processing/postgres.py b/scrapi/processing/postgres.py index a2af049a..e48546aa 100644 --- a/scrapi/processing/postgres.py +++ b/scrapi/processing/postgres.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import +from __future__ import absolute_import, unicode_literals import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.api.settings") @@ -110,8 +110,8 @@ def process_normalized(self, raw_doc, normalized): def _get_by_source_id(self, model, source, docID): try: - return Document.objects.filter(source=source, docID=docID)[0] - except IndexError: + return model.objects.get(source=source, docID=docID) + except model.DoesNotExist: return None def process_uris(self, source, docID, uri, uritype, **kwargs): @@ -122,7 +122,19 @@ def process_uris(self, source, docID, uri, uritype, **kwargs): document.urls.add(url) document.save() - def process_contributor(self, source, docID, contributor_dict): + def get_person(self, model, name, reconstructed_name, id_osf, id_email, id_orcid): + try: + return model.objects.get( + name=name, + reconstructed_name=reconstructed_name, + id_osf=id_osf, + id_email=id_email, + id_orcid=id_orcid + ) + except model.DoesNotExist: + return None + + def process_contributors(self, source, docID, contributor_dict): document = Document.objects.get(source=source, docID=docID) id_osf = None @@ -138,8 +150,25 @@ def process_contributor(self, source, docID, contributor_dict): if contributor_dict.get('email'): id_email = contributor_dict['email'] + reconstructed_name = contributor_dict['givenName'] + if contributor_dict.get('additionalName'): + reconstructed_name = '{} {}'.format(reconstructed_name, contributor_dict['additionalName']) + reconstructed_name = '{} {}'.format(reconstructed_name, contributor_dict['familyName']) + # TODO check to see if the person exists first, if they do, don't make a new one - person = Person(name=contributor_dict['name'], id_osf=id_osf, id_email=id_email, id_orcid=id_orcid) + person = self.get_person( + Person, + name=contributor_dict['name'], + reconstructed_name=reconstructed_name, + id_osf=id_osf, + id_email=id_email, + id_orcid=id_orcid) or Person( + name=contributor_dict['name'], + reconstructed_name=reconstructed_name, + id_osf=id_osf, + id_email=id_email, + id_orcid=id_orcid + ) person.save() document.contributors.add(person) From eb87e3d27595cbbc075d3dee3429661ab3e7a2b0 Mon Sep 17 00:00:00 2001 From: erinspace Date: Wed, 7 Oct 2015 14:07:21 -0400 Subject: [PATCH 62/92] Fix process contribs nvoke task --- scrapi/tasks.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scrapi/tasks.py b/scrapi/tasks.py index aa913532..1259b0d3 100644 --- a/scrapi/tasks.py +++ b/scrapi/tasks.py @@ -150,7 +150,7 @@ def process_contributors_from_one_source(contributors, async=False, **kwargs): @task_autoretry(default_retry_delay=settings.CELERY_RETRY_DELAY, max_retries=0, rate_limit='5/s') -@events.logged(events.PROCESSSING_URIS, 'uri_processing') +@events.logged(events.PROCESSSING_CONTRIBUTORS, 'contributor_processing') def process_one_person(person, **kwargs): processing.process_contributors( source=person['source'], @@ -174,10 +174,6 @@ def process_uris(async, **kwargs): source_buckets = util.parse_urls_into_groups(source) all_buckets.append(source_buckets) - # import json - # with open('all_sources.json', 'w') as outfile: - # json.dump(all_buckets, outfile) - for source_dict in all_buckets: for group in source_dict['uris']: process_uris_at_one_base_uri.delay(group['individual_uris'], async, kwargs=kwargs) From f61296142f325b9a2099f59ccbba096aacadf3b7 Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 9 Oct 2015 12:13:18 -0400 Subject: [PATCH 63/92] Add registration app to settings --- api/api/settings/defaults.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/api/settings/defaults.py b/api/api/settings/defaults.py index 29c92284..a5f1b380 100644 --- a/api/api/settings/defaults.py +++ b/api/api/settings/defaults.py @@ -42,6 +42,7 @@ 'django.contrib.contenttypes', 'django.contrib.sites', 'api.webview', + 'api.provider_registration', 'rest_framework', 'corsheaders' ) From 665cba52cc879fa29212696eb0ae25517fcd83c6 Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 9 Oct 2015 12:13:41 -0400 Subject: [PATCH 64/92] Add registration urls to main proj --- api/api/urls.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/api/urls.py b/api/api/urls.py index 12b72f36..96cfdc44 100644 --- a/api/api/urls.py +++ b/api/api/urls.py @@ -18,5 +18,6 @@ urlpatterns = [ url(r'^admin/', include(admin.site.urls)), - url(r'^', include('api.webview.urls')), + url(r'^api/', include('api.webview.urls')), + url(r'^registration', include('api.provider_registration.urls', namespace="provider_registration")) ] From 6e6ec50c8a034f1cec028b4304e4e122f0e4dfa9 Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 9 Oct 2015 12:14:01 -0400 Subject: [PATCH 65/92] Add all provider registration models, views, tests, and validators --- api/provider_registration/__init__.py | 0 api/provider_registration/admin.py | 76 ++ api/provider_registration/forms.py | 75 ++ .../migrations/0001_initial.py | 43 ++ ..._registrationinfo_registration_complete.py | 20 + ...0003_registrationinfo_metadata_complete.py | 20 + .../0004_registrationinfo_desk_contact.py | 20 + .../migrations/0005_auto_20151009_0953.py | 19 + .../migrations/__init__.py | 0 api/provider_registration/models.py | 57 ++ .../provider_registration/already_exists.html | 12 + .../templates/provider_registration/base.html | 42 ++ .../provider_registration/confirmation.html | 16 + .../contact_information.html | 47 ++ .../provider_registration/detail.html | 11 + .../provider_registration/index.html | 38 + .../metadata_questions.html | 61 ++ .../oai_registration_form.html | 77 ++ .../other_registration_form.html | 40 ++ .../provider_questions.html | 87 +++ .../registration_paused.html | 17 + .../simple_oai_registration_form.html | 50 ++ .../test_utils/vcr_cassettes/doi.yaml | 80 +++ .../test_utils/vcr_cassettes/doi1.yaml | 662 ++++++++++++++++++ .../test_utils/vcr_cassettes/doi2.yaml | 662 ++++++++++++++++++ .../test_utils/vcr_cassettes/doi3.yaml | 662 ++++++++++++++++++ .../test_utils/vcr_cassettes/doi4.yaml | 662 ++++++++++++++++++ .../invalid_xml_oai_dataquery.yaml | 471 +++++++++++++ .../invalid_xml_oai_dataquery3.yaml | 490 +++++++++++++ .../vcr_cassettes/oai_response.yaml | 31 + .../vcr_cassettes/oai_response_datequery.yaml | 334 +++++++++ .../oai_response_datequery1.yaml | 335 +++++++++ .../oai_response_datequery2.yaml | 335 +++++++++ .../vcr_cassettes/oai_response_identify.yaml | 39 ++ .../oai_response_invalid_identify.yaml | 35 + .../vcr_cassettes/other_response.yaml | 472 +++++++++++++ .../vcr_cassettes/other_response_404.yaml | 35 + .../vcr_cassettes/other_response_404_oai.yaml | 35 + .../other_response_identify.yaml | 472 +++++++++++++ .../vcr_cassettes/other_response_oai.yaml | 471 +++++++++++++ api/provider_registration/tests.py | 436 ++++++++++++ api/provider_registration/urls.py | 13 + api/provider_registration/utils.py | 77 ++ api/provider_registration/validators.py | 46 ++ api/provider_registration/views.py | 338 +++++++++ 45 files changed, 8021 insertions(+) create mode 100644 api/provider_registration/__init__.py create mode 100644 api/provider_registration/admin.py create mode 100644 api/provider_registration/forms.py create mode 100644 api/provider_registration/migrations/0001_initial.py create mode 100644 api/provider_registration/migrations/0002_registrationinfo_registration_complete.py create mode 100644 api/provider_registration/migrations/0003_registrationinfo_metadata_complete.py create mode 100644 api/provider_registration/migrations/0004_registrationinfo_desk_contact.py create mode 100644 api/provider_registration/migrations/0005_auto_20151009_0953.py create mode 100644 api/provider_registration/migrations/__init__.py create mode 100644 api/provider_registration/models.py create mode 100644 api/provider_registration/templates/provider_registration/already_exists.html create mode 100644 api/provider_registration/templates/provider_registration/base.html create mode 100644 api/provider_registration/templates/provider_registration/confirmation.html create mode 100644 api/provider_registration/templates/provider_registration/contact_information.html create mode 100644 api/provider_registration/templates/provider_registration/detail.html create mode 100644 api/provider_registration/templates/provider_registration/index.html create mode 100644 api/provider_registration/templates/provider_registration/metadata_questions.html create mode 100644 api/provider_registration/templates/provider_registration/oai_registration_form.html create mode 100644 api/provider_registration/templates/provider_registration/other_registration_form.html create mode 100644 api/provider_registration/templates/provider_registration/provider_questions.html create mode 100644 api/provider_registration/templates/provider_registration/registration_paused.html create mode 100644 api/provider_registration/templates/provider_registration/simple_oai_registration_form.html create mode 100644 api/provider_registration/test_utils/vcr_cassettes/doi.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/doi1.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/doi2.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/doi3.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/doi4.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery3.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/oai_response.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery1.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery2.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/oai_response_identify.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/oai_response_invalid_identify.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/other_response.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/other_response_404.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/other_response_404_oai.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/other_response_identify.yaml create mode 100644 api/provider_registration/test_utils/vcr_cassettes/other_response_oai.yaml create mode 100644 api/provider_registration/tests.py create mode 100644 api/provider_registration/urls.py create mode 100644 api/provider_registration/utils.py create mode 100644 api/provider_registration/validators.py create mode 100644 api/provider_registration/views.py diff --git a/api/provider_registration/__init__.py b/api/provider_registration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/api/provider_registration/admin.py b/api/provider_registration/admin.py new file mode 100644 index 00000000..995fc6d0 --- /dev/null +++ b/api/provider_registration/admin.py @@ -0,0 +1,76 @@ +from django.contrib import admin +from api.provider_registration.models import RegistrationInfo + + +class RegistrationAdmin(admin.ModelAdmin): + fieldsets = [ + ('Contact', { + 'fields': [ + 'contact_name', + 'contact_email', + ] + }), + ('Provider', { + 'fields': [ + 'api_docs', + 'base_url', + 'description', + 'oai_provider', + 'provider_short_name', + 'provider_long_name', + 'rate_limit' + ] + }), + ('Harvester', { + 'fields': [ + 'base_url', + 'property_list', + 'approved_sets', + 'per_request_rate_limit', + 'active_provider' + ] + }), + ('Metadata', { + 'fields': [ + 'meta_tos', + 'meta_rights', + 'meta_privacy', + 'meta_sharing', + 'meta_license_cc0', + 'meta_license' + ] + }), + ('Date information', { + 'fields': ['registration_date'], + 'classes': ['collapse'] + }), + ('Registration Complete', { + 'fields': ['registration_complete', 'metadata_complete', 'desk_contact'] + }) + ] + + list_display_links = ['link'] + list_display = ( + 'link', + 'id', + 'contact_name', + 'contact_email', + 'active_provider', + 'provider_short_name', + 'provider_long_name', + 'registration_date', + 'base_url', + 'registration_complete', + 'metadata_complete', + 'desk_contact' + ) + + list_filter = ['registration_date'] + search_fields = ['provider_long_name'] + + list_editable = ['provider_long_name', 'provider_short_name', 'active_provider', 'desk_contact'] + + def __unicode__(self): + return "Registration" + +admin.site.register(RegistrationInfo, RegistrationAdmin) diff --git a/api/provider_registration/forms.py b/api/provider_registration/forms.py new file mode 100644 index 00000000..6e89b7f7 --- /dev/null +++ b/api/provider_registration/forms.py @@ -0,0 +1,75 @@ +from django import forms +from api.provider_registration.validators import URLResolves + + +from api.provider_registration.models import RegistrationInfo + + +class ContactInfoForm(forms.ModelForm): + contact_name = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'off'})) + contact_email = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'off'})) + + class Meta: + model = RegistrationInfo + fields = ['contact_name', 'contact_email'] + + +class MetadataQuestionsForm(forms.ModelForm): + reg_id = forms.CharField(widget=forms.HiddenInput()) + + class Meta: + model = RegistrationInfo + fields = ['meta_tos', 'meta_rights', 'meta_privacy', 'meta_sharing', + 'meta_license_cc0', 'reg_id'] + + +class InitialProviderForm(forms.ModelForm): + reg_id = forms.CharField(widget=forms.HiddenInput()) + provider_long_name = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'off'})) + api_docs = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'off'}), required=False) + rate_limit = forms.CharField(widget=forms.TextInput(attrs={'autocomplete': 'off'}), required=False) + base_url = forms.URLField(validators=[URLResolves()], widget=forms.TextInput(attrs={'autocomplete': 'off'})) + + class Meta: + model = RegistrationInfo + fields = ['provider_long_name', 'base_url', 'description', 'oai_provider', + 'reg_id', 'rate_limit', 'api_docs'] + + +class OAIProviderForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + self.choices = kwargs.pop('choices') + super(OAIProviderForm, self).__init__(*args, **kwargs) + self.fields['approved_sets'].choices = self.choices + + reg_id = forms.CharField(widget=forms.HiddenInput()) + property_list = forms.CharField(widget=forms.HiddenInput) + provider_long_name = forms.CharField(widget=forms.HiddenInput()) + base_url = forms.URLField(widget=forms.TextInput(attrs={'autocomplete': 'off'})) + + approved_sets = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple) + + class Meta: + model = RegistrationInfo + fields = ['provider_long_name', 'base_url', + 'property_list', 'approved_sets', 'reg_id'] + + +class SimpleOAIProviderForm(forms.ModelForm): + reg_id = forms.CharField(widget=forms.HiddenInput()) + property_list = forms.CharField(widget=forms.HiddenInput) + provider_long_name = forms.CharField(widget=forms.HiddenInput()) + + class Meta: + model = RegistrationInfo + fields = ['provider_long_name', 'base_url', 'reg_id', 'approved_sets', 'property_list'] + + +class OtherProviderForm(forms.ModelForm): + reg_id = forms.CharField(widget=forms.HiddenInput()) + property_list = forms.CharField(widget=forms.HiddenInput) + provider_long_name = forms.CharField(widget=forms.HiddenInput()) + + class Meta: + model = RegistrationInfo + fields = ['provider_long_name', 'base_url', 'reg_id', 'property_list'] diff --git a/api/provider_registration/migrations/0001_initial.py b/api/provider_registration/migrations/0001_initial.py new file mode 100644 index 00000000..f5300960 --- /dev/null +++ b/api/provider_registration/migrations/0001_initial.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='RegistrationInfo', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('contact_email', models.EmailField(max_length=75)), + ('contact_name', models.CharField(max_length=100)), + ('meta_tos', models.BooleanField(default=False)), + ('meta_rights', models.BooleanField(default=False)), + ('meta_privacy', models.BooleanField(default=False)), + ('meta_sharing', models.BooleanField(default=False)), + ('meta_license_cc0', models.BooleanField(default=False)), + ('meta_license', models.CharField(default=b'None', max_length=100)), + ('base_url', models.URLField()), + ('description', models.TextField()), + ('oai_provider', models.BooleanField(default=False)), + ('api_docs', models.URLField(default=b'', blank=True)), + ('provider_long_name', models.CharField(max_length=100)), + ('per_request_rate_limit', models.PositiveSmallIntegerField(default=0)), + ('rate_limit', models.CharField(default=b'', max_length=100, blank=True)), + ('provider_short_name', models.CharField(default=b'', max_length=50, blank=True)), + ('property_list', models.TextField(default=b'None')), + ('active_provider', models.BooleanField(default=False)), + ('approved_sets', models.TextField(default=b'', blank=True)), + ('registration_date', models.DateTimeField(verbose_name=b'date registered')), + ], + options={ + 'verbose_name': 'Registration', + }, + bases=(models.Model,), + ), + ] diff --git a/api/provider_registration/migrations/0002_registrationinfo_registration_complete.py b/api/provider_registration/migrations/0002_registrationinfo_registration_complete.py new file mode 100644 index 00000000..edf6218b --- /dev/null +++ b/api/provider_registration/migrations/0002_registrationinfo_registration_complete.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('provider_registration', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='registrationinfo', + name='registration_complete', + field=models.BooleanField(default=False), + preserve_default=True, + ), + ] diff --git a/api/provider_registration/migrations/0003_registrationinfo_metadata_complete.py b/api/provider_registration/migrations/0003_registrationinfo_metadata_complete.py new file mode 100644 index 00000000..8c7f5cd2 --- /dev/null +++ b/api/provider_registration/migrations/0003_registrationinfo_metadata_complete.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('provider_registration', '0002_registrationinfo_registration_complete'), + ] + + operations = [ + migrations.AddField( + model_name='registrationinfo', + name='metadata_complete', + field=models.BooleanField(default=False), + preserve_default=True, + ), + ] diff --git a/api/provider_registration/migrations/0004_registrationinfo_desk_contact.py b/api/provider_registration/migrations/0004_registrationinfo_desk_contact.py new file mode 100644 index 00000000..561bc511 --- /dev/null +++ b/api/provider_registration/migrations/0004_registrationinfo_desk_contact.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('provider_registration', '0003_registrationinfo_metadata_complete'), + ] + + operations = [ + migrations.AddField( + model_name='registrationinfo', + name='desk_contact', + field=models.BooleanField(default=False), + preserve_default=True, + ), + ] diff --git a/api/provider_registration/migrations/0005_auto_20151009_0953.py b/api/provider_registration/migrations/0005_auto_20151009_0953.py new file mode 100644 index 00000000..f8c1ebe2 --- /dev/null +++ b/api/provider_registration/migrations/0005_auto_20151009_0953.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('provider_registration', '0004_registrationinfo_desk_contact'), + ] + + operations = [ + migrations.AlterField( + model_name='registrationinfo', + name='contact_email', + field=models.EmailField(max_length=254), + ), + ] diff --git a/api/provider_registration/migrations/__init__.py b/api/provider_registration/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/api/provider_registration/models.py b/api/provider_registration/models.py new file mode 100644 index 00000000..9349f477 --- /dev/null +++ b/api/provider_registration/models.py @@ -0,0 +1,57 @@ +import datetime + +from django.db import models +from django.utils import timezone + + +class RegistrationInfo(models.Model): + link = 'Edit' + + # Contact Information + contact_email = models.EmailField() + contact_name = models.CharField(max_length=100) + + # Terms of Service and Metadata Permissions Questions + meta_tos = models.BooleanField(default=False) + meta_rights = models.BooleanField(default=False) + meta_privacy = models.BooleanField(default=False) + meta_sharing = models.BooleanField(default=False) + meta_license_cc0 = models.BooleanField(default=False) + meta_license = models.CharField(max_length=100, default='None') + + #Provider Information + base_url = models.URLField() + description = models.TextField() + oai_provider = models.BooleanField(default=False) + api_docs = models.URLField(blank=True, default='') + provider_long_name = models.CharField(max_length=100) + per_request_rate_limit = models.PositiveSmallIntegerField(default=0) + rate_limit = models.CharField(max_length=100, blank=True, default='') + provider_short_name = models.CharField(max_length=50, blank=True, default='') + + # Harvester Information + property_list = models.TextField(default='None') + active_provider = models.BooleanField(default=False) + approved_sets = models.TextField(blank=True, default='') + + # Added automatically + registration_date = models.DateTimeField('date registered') + + # Registation or metadata complete? + registration_complete = models.BooleanField(default=False) + metadata_complete = models.BooleanField(default=False) + desk_contact = models.BooleanField(default=False) + + def __unicode__(self): + return self.provider_long_name + + def was_registered_recently(self, days=1): + now = timezone.now() + return now - datetime.timedelta(days) <= self.registration_date <= now + + was_registered_recently.boolean = True + was_registered_recently.admin_order_field = 'registration_date' + was_registered_recently.short_description = 'Registered recently?' + + class Meta: + verbose_name = 'Registration' diff --git a/api/provider_registration/templates/provider_registration/already_exists.html b/api/provider_registration/templates/provider_registration/already_exists.html new file mode 100644 index 00000000..adc8b2aa --- /dev/null +++ b/api/provider_registration/templates/provider_registration/already_exists.html @@ -0,0 +1,12 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} +
    +
    + +

    Sorry, {{ provider }} already exists.

    + Back to provider list + +
    +
    +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/base.html b/api/provider_registration/templates/provider_registration/base.html new file mode 100644 index 00000000..9e9c5117 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/base.html @@ -0,0 +1,42 @@ +{% load staticfiles %} + + + + + + + +
    +
    + + + {% block header_content %} + {% endblock %} +
    +
    + {% block under_header_content %} + {% endblock %} +
    + +
    + Questions or feedback? Contact us at share-support@osf.io +
    + {% block content %} + {% endblock %} +
    + + + + + + {% block javascript_bottom %} + {% endblock %} + + diff --git a/api/provider_registration/templates/provider_registration/confirmation.html b/api/provider_registration/templates/provider_registration/confirmation.html new file mode 100644 index 00000000..f0c258fe --- /dev/null +++ b/api/provider_registration/templates/provider_registration/confirmation.html @@ -0,0 +1,16 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    +

    Registration Complete

    +

    Congratulations {{ provider }}! You have successfully registered.

    + +

    We will follow up with any further questions, and notify you when we begin collecting your data.

    + + Exit to SHARE Search +
    +
    + +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/contact_information.html b/api/provider_registration/templates/provider_registration/contact_information.html new file mode 100644 index 00000000..5455b3db --- /dev/null +++ b/api/provider_registration/templates/provider_registration/contact_information.html @@ -0,0 +1,47 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    + +
    +
    + +
    +
    +
    + {% csrf_token %} + {% if form.errors %} +
    Please correct the error{{ form.errors|pluralize }} below.
    + {% endif %} +

    Technical Contact Information

    +

    Please let us know who we can ask questions about your data provider.

    + +
    + {% if form.contact_name.errors %} + + {% for error in form.contact_name.errors %}{{ error }}{% endfor %} + + {% endif %} +

    Name

    + {{ form.contact_name }} +
    +
    + {% if form.contact_email.errors %} + + {% for error in form.contact_email.errors %}{{ error }}{% endfor %} + + {% endif %} +

    Email

    + {{ form.contact_email }} +
    + +
    +
    +
    +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/detail.html b/api/provider_registration/templates/provider_registration/detail.html new file mode 100644 index 00000000..32237b82 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/detail.html @@ -0,0 +1,11 @@ +

    {{ provider.provider_long_name }}

    +
      +
    • ID: {{ provider.id }}
    • +
    • Base url: {{ provider.base_url }}
    • +
    • Approved sets: {{ provider.approved_sets }}
    • +
    • Property List: {{ provider.property_list }}
    • +
    + + diff --git a/api/provider_registration/templates/provider_registration/index.html b/api/provider_registration/templates/provider_registration/index.html new file mode 100644 index 00000000..de57c0ad --- /dev/null +++ b/api/provider_registration/templates/provider_registration/index.html @@ -0,0 +1,38 @@ +{% extends "provider_registration/base.html" %} + +{% block header_content %} +
    +

    To include your organization's publications, data, repository holdings, or other research in SHARE, please register here.

    +
    + Register as a Provider +{% endblock %} + +{% block under_header_content %} +

    {{ doc_count }} research events and counting

    +{% endblock %} + +{% block content %} + +
    + +
    +
    + +

    We will look at your data, and see if it can be added to the system. For more information about who can register and what is included in the registration form, please see the section on Frequently Asked Questions.

    + +

    If your data already conforms to the SHARE data schema, no registration is necessary. You can push it directly to our system. See the documentation for more information.

    + +
    +
    + +
    +

    {{ number_of_providers }} Current Providers

    + +
    + + +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/metadata_questions.html b/api/provider_registration/templates/provider_registration/metadata_questions.html new file mode 100644 index 00000000..8e77bca2 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/metadata_questions.html @@ -0,0 +1,61 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    + +
    +
    + +
    +
    +
    + {% csrf_token %} + + {% if form.errors %} +
    Please correct the error{{ form.errors|pluralize }} below.
    + {% endif %} + +

    Metadata Sharing

    +

    Please confirm the following statements about the metadata you will be providing to SHARE:

    +

    Please note these statements only apply to the metadata in your API, not to the research objects themselves.


    + +

    {{ form.meta_tos }} Metadata gathering does not violate my organization's Terms of Service.

    +

    {{ form.meta_privacy }} Metadata gathering does not violate my organization's Privacy Policy.

    + +

    {{ form.meta_sharing }} Distributing this metadata does not violate my organization's Terms of Service or Privacy Policy.

    + +

    {{ form.meta_license_cc0 }} I understand and acknowledge that the metadata my organization provides will be redistributed by SHARE.

    + +

    {{ form.meta_rights }} I have the right to acknowledge the above statements for my organization.

    + {{ form.reg_id }} + + + + +
    +
    +
    + +{% endblock %} + +{% block javascript_bottom %} + + + +{% endblock %} + diff --git a/api/provider_registration/templates/provider_registration/oai_registration_form.html b/api/provider_registration/templates/provider_registration/oai_registration_form.html new file mode 100644 index 00000000..d620cea8 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/oai_registration_form.html @@ -0,0 +1,77 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    + +
    +
    + +
    +
    + + {% if error_message %}{{ error_message }}

    {% endif %} + +
    + {% csrf_token %} +

    Provider Information

    +
    +

    Provider Name: {{ name }}

    +
    + +
    +

    Base URL: {{ base_url }}

    +
    +
    +
    +

    + Approved Sets + + +

    +

    Check the sets that you'd like to appear in SHARE Notify. These options are automatically generated from your provider's ListSets API endpoint. Displayed here are the setNames for the corresponding setSpec options in your publically accessable database.

    +

    If you'd rather enter the approved sets manually, click here to access the simple OAI registration form.

    + +

    Sets that you specify will be included in SHARE, and sets that you do not specify will be ignored and not processed by SHARE.

    +
    + {{ form.approved_sets }} +
    + + {{ form.reg_id }} + {{ form.property_list }} + {{ form.provider_long_name}} + + +
    +
    +
    + +{% endblock %} + + +{% block javascript_bottom %} + + + +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/other_registration_form.html b/api/provider_registration/templates/provider_registration/other_registration_form.html new file mode 100644 index 00000000..a966a973 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/other_registration_form.html @@ -0,0 +1,40 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    + +
    +
    + +
    +
    + + {% if error_message %}{{ error_message }}

    {% endif %} + +
    + {% csrf_token %} + +
    +

    Provider Name: {{ name }}

    +
    + +
    +

    Base URL: {{ base_url }}

    +
    + + {{ form.reg_id }} + {{ form.property_list }} + {{ form.provider_long_name}} + + +
    +
    +
    + +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/provider_questions.html b/api/provider_registration/templates/provider_registration/provider_questions.html new file mode 100644 index 00000000..5f369c81 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/provider_questions.html @@ -0,0 +1,87 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    + +
    +
    + +
    +
    + +
    +
    + {% csrf_token %} +

    Basic Provider Information

    + {% if form.errors %} +
    Please correct the error{{ form.errors|pluralize }} below.
    + {% endif %} +
    + {% if form.provider_long_name.errors %} + + {% for error in form.provider_long_name.errors %}{{ error }}{% endfor %} + + {% endif %} +

    Name of your organization (required)

    + {{ form.provider_long_name }} +
    + +
    +

    If there are rate limits for requests from your service, please list them below.

    + {{ form.rate_limit }} +

    Example: 1 request/second

    +
    + +
    + {% if form.api_docs.errors %} + + {% for error in form.api_docs.errors %}{{ error }}{% endfor %} + + {% endif %} +

    If your organization’s API has documentation online, please enter the URL below.

    + {{ form.api_docs }} +
    + +
    +

    {{ form.oai_provider }} This content provider is based on OAI-PMH Standards.

    +
    + +
    +

    Base URL (required)

    +

    Enter the base URL for your content provider.
    + If you're entering an OAI-PMH provider, include everything before the ? in the base url.

    + {% if form.base_url.errors %} + + {% for error in form.base_url.errors %}{{ error }}{% endfor %} + + {% endif %} + {{ form.base_url }} +

    Example: http://repository.stcloudstate.edu/do/oai/ +
    + Not: http://repository.stcloudstate.edu/do/oai/?verb=ListRecords

    +
    + +
    +

    Description of your organization (required)

    + {% if form.description.errors %} + + {% for error in form.description.errors %}{{ error }}{% endfor %} + + {% endif %} + {{ form.description }} +
    + + {{ form.reg_id }} + + +
    + +
    +
    +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/registration_paused.html b/api/provider_registration/templates/provider_registration/registration_paused.html new file mode 100644 index 00000000..f99d757d --- /dev/null +++ b/api/provider_registration/templates/provider_registration/registration_paused.html @@ -0,0 +1,17 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    +

    Unfortunately, the metadata you wish to provide does not currently meet our requirements. We would like to discuss this with you; we will contact you within 3 business days.

    + +

    Please feel free to contact us at share-support@osf.io for more information at any time.

    + + Back + + Exit to SHARE Search +
    +
    + +{% endblock %} diff --git a/api/provider_registration/templates/provider_registration/simple_oai_registration_form.html b/api/provider_registration/templates/provider_registration/simple_oai_registration_form.html new file mode 100644 index 00000000..f621e229 --- /dev/null +++ b/api/provider_registration/templates/provider_registration/simple_oai_registration_form.html @@ -0,0 +1,50 @@ +{% extends "provider_registration/base.html" %} + +{% block content %} + +
    +
    + +
    +
    + +
    +
    + + {% if error_message %}{{ error_message }}

    {% endif %} + +
    + {% csrf_token %} +

    Simple Provider Information

    +
    +

    Provider Name: {{ name }}

    +
    + +
    +

    Base URL: {{ base_url }}

    +
    + +
    +

    Approved Set List

    + +

    Enter the sets from your OAI-PMH data provider that you'd like to appear in SHARE Notify. A list of these options can usually be found at your provider's ListSets OAI API endpoint. Enter the sets you'd like to be included as they are represented in the setSpec element of your provider. Enter each set seperated by a comma.

    + +

    Sets that you specify will be included in SHARE, and sets that you do not specify will be ignored and not processed by SHARE.

    + {{ form.approved_sets }} +

    Example: 'academicsenate, agb_fac, biosp'

    +
    + + {{ form.reg_id }} + {{ form.property_list }} + {{ form.provider_long_name }} + + +
    +
    +
    + +{% endblock %} diff --git a/api/provider_registration/test_utils/vcr_cassettes/doi.yaml b/api/provider_registration/test_utils/vcr_cassettes/doi.yaml new file mode 100644 index 00000000..311df2b6 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/doi.yaml @@ -0,0 +1,80 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/thisistotallynotadoi + response: + body: {string: !!python/unicode "\n\n\nError: + DOI Not Found\n\n\n\n\n \n\n\n\n\n\n\n
    \n\"Logo\"\n
    \n\n
    \n
    \n
    \n\n\n\n\n\n \n \n \n \n
    \"\"\n + \ HOME  | HANDBOOK +  | FACTSHEETS +  | FAQs  |  + RESOURCES  | USERS  | NEWS +  | MEMBERS + AREA\n
    \n\n\n
    \n
    \n\n\n\n \n\n\n\n\n\n\n\n\n\n\n
    \n\"\"\n
    \n\n

    DOI Not Found

    \n\n
     
    \n\n\n\n

    10/thisistotallynotadoi

    \n\n
     
    \n\n\n\n\n

    This DOI cannot be found in the + DOI System. Possible reasons are:

    \n\n\n
      \n\n
    • The DOI is incorrect in your source. Search for the item by name, + title, or other metadata using a search engine.
    • \n\n
    • The DOI was copied incorrectly. Check to see that the string includes + all the characters before and after the slash and no sentence punctuation + marks.
    • \n\n
    • The DOI has not been activated + yet. Please try again later, and report the problem if the error continues.
    • \n\n
    \n\n\n\n
     
    \n\n

    You may report this error to the responsible + DOI Registration Agency using the form below. Include your email address + to receive confirmation and feedback.

    \n\n
    \n\n
    \n\n\n\n\n\n\n\n\n\n\n\n\n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Your Email Address:
    Additional Information About + the Error:
    \n\n

    \n\n
    \n
    \n\n\n\n\n
    \"\"
    \n\n
     
    \n\n\n\n\n\n\n\n\n\n\n\n\n \n\n
    \nDOI + System Proxy Server Documentation\n
    \n\"DOI_disc_logo\"\n\n®, + DOI®, DOI.ORG®, and shortDOI® + are trademarks of the International DOI Foundation.\n
    \n\n\n"} + headers: + content-length: ['4994'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:21:15 GMT'] + server: [Apache-Coyote/1.1] + status: {code: 404, message: Not Found} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/doi1.yaml b/api/provider_registration/test_utils/vcr_cassettes/doi1.yaml new file mode 100644 index 00000000..83dddee1 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/doi1.yaml @@ -0,0 +1,662 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/sdf + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Fri, 03 Apr 2015 20:25:13 GMT'] + expires: ['Sat, 04 Apr 2015 20:25:14 GMT'] + location: ['https://dx.doi.org/10.1038/508312A'] + server: [Apache-Coyote/1.1] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/10.1038/508312A + response: + body: {string: !!python/unicode ' + + Handle Redirect + + http://www.nature.com/doifinder/10.1038/508312a'} + headers: + content-length: ['180'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:25:13 GMT'] + expires: ['Fri, 03 Apr 2015 21:32:15 GMT'] + location: ['http://www.nature.com/doifinder/10.1038/508312a'] + server: [Apache-Coyote/1.1] + vary: [Accept] + status: {code: 303, message: See Other} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/doifinder/10.1038/508312a + response: + body: + string: !!binary | + H4sIAAAAAAAE/wMAAAAAAAAAAAA= + headers: + connection: [keep-alive, Transfer-Encoding] + content-encoding: [gzip] + content-type: [text/html; charset=UTF-8] + date: ['Fri, 03 Apr 2015 20:25:15 GMT'] + expires: ['Thu, 01-Jan-1970 00:00:00 GMT'] + location: [/news/publishing-credit-where-credit-is-due-1.15033] + p3p: [CP="CAO DSP LAW IVA IVD HIS OUR UNR STP UNI COM"] + server: [Jetty(6.1.26)] + set-cookie: [SaneID=208.185.118.84.1428092715148508; path=/; domain=.nature.com, + JSESSIONID=jx1m4l02ae6e180q9repjy4tx;Path=/, 'login_encoded=null;Path=/;Expires=Thu, + 01-Jan-1970 00:00:00 GMT', JSESSIONID=jx1m4l02ae6e180q9repjy4tx;Path=/oa;Domain=.nature.com] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + webserver: [npgj2ee1.nature.com] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Cookie: [JSESSIONID=jx1m4l02ae6e180q9repjy4tx; SaneID=208.185.118.84.1428092715148508] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/news/publishing-credit-where-credit-is-due-1.15033 + response: + body: + string: !!binary | + H4sIAAAAAAAE/9xWbW/bNhD+bP8KRh9mG7UkO+/1G5C6GdpizYItwFAEgUFTZ4kpJQokZdcN+t93 + lBSbc+xl/boEBl90vHt4x3vuRkfvf5/efbm9JolJxaRJRnYkgmbx2IPMI0xQrcfeo/YjrulcQORN + mqMEaDRpNkYpGEpYQpUGM/YKs/AvvXDSbDbsf8P+lZOmnb34kRc7+zbQiuFGAJpr3BZzwXXCs3hA + pgoibsgqAQWEVQuuSVQAGZAbagrcvoGVJr/QNB+SqUxTyAxqC02lrkS2z+Ire6iivHZGUxh7EWim + eG64tM6SmUEjY+83/p1cCQFZl1yla/JO0Szqkk+S/MmkMV3ymTOaoIRJaUbwG/lM1aNUHMgHQZeU + UARvFKdC4F1JxGNuqCCGfpOZTDloYiRJQOREgQaqGDqh3OMRmueLNTEJcEUY4lF8Xlh05XcmhaBz + qajhSyC5ko/AjA5szOpgVrf6CuuVVJH2ShWoc+xdFSaRCp2fd8kU8YHSXbINSJf8UUMheCcag/W2 + 1WtjX70TNJeDMuuxJ+OBWefgaKfKcCbAHmjUSHIlt+KaG5hZbM6Zg0E+qKWMvKNhC//f3tNBdf+f + 2O9zeaGE46rEmHwQhqvVKsjK5AqYTMMMEyzMN1npV3nol0n5vOBIHQX4/aB/1js5qZy5SbE9L4On + +HpetZxLIfG3ni10eBH0z88vzoL+yduL/vH52fnpUVhqCaclL8yQFILHPJ7FkIURKL4s378Os/Im + s0SmkKPRHfFXoNLqyQ4MjR202zRxju/ecv/ROqt++tztxv8/ffRAztbhOQRbI2lw6fLdtGJXa9/m + e32+GkqerVTZBB57H5DwkLyiX5HvskisHe/dqaLiAFd+yWGVS2UcuRWPTDKOYMkZ+OWiyzNukDB9 + zaiAcT/odVP6jadFWu8cB8fdQoMql7aQjdegLeBnvqnAUcZAu7z3pZZyEf11F7B45jrgpnxJ5Abz + odT5UtrV6birsSP5fYaad8hxR3ntYfcgw/pgSX5GK5Z2XHVVlSGsSMPn6vNJDp9LElanYVVzsCjV + NWhYFybcsWVqSMobYTD3WnyUhcqomO1y6w7of3p5gzeS3MGKq0G/F/R7J5fhWe/ypH9MK9t7Le9a + 3ObBf2XzKuQbMAuutLFE4EBCDAjhEHpq3CJ23Ouf+r1Tv39x+MhSiiJ1D+E9D0tzrQtX+OL07bmV + bmITcuT793xBPl4/TEZH95BFfPHg+7b5GlUtyaS9KDJmn0U76TwlQdnK3diuxZkHCnJBGbRbTovX + 6toVZDZNolbnR6cdSYawMxPEYK4F2OKu363vaGz1tVu2aWx17nsPnVFYG3cgCkM+XpO3iLP+tgUG + naeFVO0lVYSPe0O45w/DN29452ljkClAL9c221agM/yBiO5bdD5XiLQmUzvT2P/YsYi4xJHRbEk1 + TiJsU7mwswWPGS27NdzGBXaJdiKlAavL9rXVJFayyPFTStVXO0AlkNG/ua+a5raNGHqWfsV6L02m + pujasSSPSHWSmRwy0/EhbqdHzYqEybVXS4a7kuVOfnwf+GXKlRP30B7ikUUKC2CxWOAB2OFXsfXl + 1uMFPUpWAS/w2oIiv203kHrEm9cbwmMHs4qfBr6JTgb3NYpOupsU095HwlVJLPOjVTcB2ha2dbQL + NQWupETf6oTfp5M7J5f9PRzsNR4hktvt3mT1tczffj158+njW+yMhWVktL1HW2li6fyjIZcTeSkY + kWLpae/DhOFxQ6lWsVTGSJFXdBvLENW4wP/jynmFZo752gLbtAmwutSYH0Kb6YddThNWFCJ2g+DA + xoE75jDqv7dH0zx4btPgfjp74CQxffuVHzP21v9h2Dfswog1vKscBTLZeqHR83dXcjx6btWOmSb4 + ApQASAYHIYVZ4tvizbwR0p6wHd00Epj5RkNrGmobNaosDQqJR8sQoqW3rl5NqQEDUH/eb/owOm7z + k9hAw4TFXr2zq7b/ap+KvmzJeXbReNQiapOUIeJ5v3UTsk5nuSfbtMJlFn4AjjhfqfIwBcdRyMCy + HHeh1AAiJ/u6SB9FDcyxND7QNEXqnhyJPgDoc/5vMs+QOkPlmmYva+Y8O2Sev8DcYsYz5Rlb/pLI + CVcoFKaId/hnusO5qd4JncYyKSx7T1u5ZKACVHUrqBHEA6nsfIVZETNoKkVVGIrlWllLFYtFVu1Y + OsrPO15u72W9gS9KnEuJFrHk0iqPCsD3F4UKmJmf17Jbw48RIrrT4bSnjTqQZpK2Ke3l8qZZbXQY + vURuAmjxGWioKNMORWRowBPtc7vaq6gdMBA3RcZ+iXrjb4u9rwoful0Stou/Mc+hhlEU1oeJAMXw + SxTCo0/mDTxsSKVUrQtVwaltQLZOFk7bzFCgUlm7ZTQai/av7u1xTv6M8cfPEZ4Rtulcp1Kh0mB2 + Pt9fnfHbL1KkyiuoCxzXuDBU6SQtMMRQApy4n1jy4fX5/BL0u9Cio7b9LYVtsV+odRWfPNDa7xZM + SuPLpl1cpElR+lg7v0CVR2j8snB/xc3mi7JwMUJg4bbrDTqC2JbZCu93GGdWF7Oj5Nn0KPnd7Oo4 + /Wq6KKo0vphfTs/OZlfvrmbzd+dn01/Zc5EtGshbPt0iznj87HfbTfnjHD7Sm0x897Z/mPMKZXws + 36c7qrx23CyjjDSJ2ccAigKSpE6oNp04eZoErZOfQaTOI53GcqM4+5nek3q0DLi4AP26hGvTlkMO + KlvlQhzkatTIYPteX0OppaK8bn+xCoQAJj7Fa5OKstsq1ykFHl2hXF7XSdocEiK1qfnF8pP1hPmQ + i78y4oHo3jyKu2ILmhHFrXCJJpsQKuQFb4dntzVrANSMI4D/RiBh8wKOwPwhhaqnGvScTSvxrBkR + 7LDmNEHD0Nvb/AxYY1c6GhIfO7rVZFJHvjbEqDUZAU504aRSqoJ7eqxr0PKmbmCisGapmbXFPNC2 + O7lOU7JSWLWhWGqbmC2clBTGAGfQ7Tgpdspssda6wa1s7bvTpFIPaJBXuFlP1rNNo+hl1bR/hepS + maxSOzqFsStl9UaZ7+l1ZZD0Np5fvoLd9exAdlpxa8fzqM1eIfslQEHYNQ65fv/7H58/nl5//PPm + 9Jq/P8jl6NAF7m/aq7Y5bRwIfya/QvGHTjutYwjk5RpDx6WUkKRNoGk6N52bjACDxcmWa8mQXNP/ + fruSTPDV16MzPQbwy660q319VtvetHPr48Iv1uKg/heH6KE2Ehwc13Y+2EVWzDoc1J1ySEzveJjM + VdR29ut1o/E4V0ok1qHQImIGjN+FlWspnb7wPbOks6PD1qdwIZEZjKSWDpV+eWtuX6GKbqNt3Y4t + 7kWC/2MHl004lbLtGF6XwzyGrztQTmgyCafEEDDTgBsa/GPY+h7Ea4wRCYkDuV/x9S0+qvk5J3gi + rCwuvFwbpVw+fM6IVQiYXMRSZMYyqTZxjDmIp9HQXqQAzXd8mdKkcypiSG19i/r6HoAjVHoTWuG2 + eHiCWb0MN/atngWQ1zMSXbx3YbDEEuvu7x0dH8NyLe494AbyhMbpCemKGOm+pwk/1CMLjXFhF1q4 + z4jyCtL65nZ8f6vu07B04JHdYBthE0CwYSYrZFlKhUG7Zo092ZkYy60k5VmmC8o/C7k3MZRbJmVe + PknXUMgAKdsIoTA6spL/rJc8S6k4TmDWbLX9ssJQNJ8ycbtk01BU7Y5Ua6ob5NlKTq4iUekVaigV + gt6KjASGWiXCYvCaDwYBEA5X0/kxE4ofpCre1vRf8QBX/Np39gJvzJ3+X7fvcQZdapLl8RgiCknr + TF+nOpSrH2Q67Lvld6Mm6FJAUojKRNkL1PPOd3FGjaNLtgvMu3JCbqXChgJl0fsVMWK7rLeEEcFL + jlq/HZa0uBE8j0MCxF+pSPPnFRlgohHU71cq0vp5Rdb1knYeC/ZWftFMG86BRqbIxBQS0EPX3yBT + DFrMOk+KjoBri0SBDIGugH3M1wMrhDPAZdPuARAU8ycssXRggAedPOuEABQlVQa4GRpEorD8FY0M + xNMsnDokEzAhbmDr2ubi8hLBNTJAKRU/K19TdnZ8O+btrKAjitWe6SCkTcrPDw/k67eTMtOejMRq + FHKqwukFdH55JSRTgBph9eEJGKHY2qfGjmCktdL2lVZUa4SQ/xHpa+3MESfgGYAYSqRuJlZ6AeCs + tDCQgrampwqWzC2xpht6wWBzylVMcejY7zV+9U2D1ZLL7FDuoPxmTufh33lQptNZx56OFb2V76UF + qoJ9Cg3sWV0lBJdERjSzuvpRs+BZMplTzu/dyEDyzgfDBkMGDhuAgMB6m1Bkc1OykK5I+L05PxQ0 + azMGcUVSkKYcixAWdEmNW15aB2vy02dmac3f/cxmZPcpVyEZ9MjRsz9QLNibxXN9QqLHxSu9p3kh + s0nbmVJFXwJgn4fenM1OxlSGh60XozrvX77hUS8IhsF5rxsMwtOodXi5WHrmc3968DronQfBu+Ai + 0J9h8BqvA8kH/fRufjE9Ta+HN9fpeHj1KRj07ya8tThnlF6Ig4Owezw7q9/8Ka9HrTg/GL57m8X1 + fvAxuFy1247RrrBEwlkSumgQS0CNtUcUS9vOVzjWN0Px7Il3P+NcMCsMsOu6aJrCMPa1NoSWBJYz + /K6rN8DCCISiKvmP2JSabNDCjdk1BK+RQlf0WghYlzuwQY1YaJ4ASgTMfKcyoTy5nHjIMRNZ/Goq + WLtR32vUm8ce9IZmY58+QTQ5Y1AyPL0uzcecyQjizp1k4ZQpdxWFWVg8MOlO89Bt7DUO6s2mFqsP + UYNTsdl/x0MPddHLauT/iQfBB89Ttupd/d4cBR/6fLHky7+6zY/T8zfzxaezpng+H30ZDXt/015l + vYoiUfh55lc4ncwTsUFEkKRvOiWb4HJRUJR5AkTZZJFN+PVdLNp9J9Ppnptckgq1njp1zlffB7lW + kwVPraoSPUkQdVTv1SO2H4SDNgB/NqwFI/YOHAzSyHKNoMXEII7iPB7GRvsdPGiB2rH/m4E2QV8c + YtD8GWXR5RLYw9SBiz69AVJnuMPZ76ZTacygZhT5V+Pm9xH8ZV5PTnvPX1ev3T1HZG9iaEFM2mEC + Xwae3UwFy1YyW05viypbwkao4w0l2F5Eyucx3bECilZlQwKgtQcAt6NZSdlizGY5M/jpkdnesbPk + TwRGr6SIWaw3W8UkLvrcv5fmdLNDDuKrBxxGiK4isM6SA9wRALurVKvGenM1HXzOyy7HXsu6vM+S + RHX4rfJ6dwNfzpXjbgMAm770p/5g3LyN9E8A5BBdrhtJaZKdNukZQkLz00de82DQe9rlexjFjRKn + gzDKhh1sIKu0nwmtLcjo3wnpzZLeIpxg9Mzzw6/t2bDsBhafreiKtm58jp34a/7yw5zQyPKb3c54 + B/U8juFCdweP7Z4+/RTAf0B/HxIF651K8b23XSqb7l9iOHC4C1DAcrUCInMqIsYq/H2e5F6B2GFT + SkTbTxJROBW+nie+XiQYLAUEbgdZ8HyYVttgs3xomwJmIgBgW/mrQEqo0ZGNNXIPdZjjFfcieodY + MXnnGJdCqlSZtJLcNL4sq9NhOeMXjFCFR4Hg/cwnFf8qBmePtqSlv1C5CAcRxzF7XnITO3Qk/ciJ + F06ZjxjU4MRRNSsrDmDrFO7NLY7jeGpvAH4GlsSDVaqFM0maXXfB1tp+x30TrB5Q7r8psxlrSQlq + 5rAbffmU3XL7GedeQuHEL3/907FhjzqYpv8WUjj3ka72FsD2c22vqE0XavSGHrradP5fJGelm2X2 + rYWoE11t9GuaQdCmL/JTJf8eA4RphRJphRKxuoabIlAokY+Be+/XO9Gudqd6JmHwu2Bf71DAkjGh + wiJDINfVdVzjEaFWwbjOvbEH62zuj2syIVQ8HMNxYnUI6Rr2eYk79hVsAvsJTrgTUzOiC5lEBRaQ + GoOSHnIjfBefWLcYmcsCiTEZocI1FESvZO6nR0qhqNqnzwWC1khKeFVAsPCNmCN0XkiUPEZRfAlt + wRKeJWruSeT0FtPUwaEFlCf3OTJpbKZsQDd+mOyFVvFojB6mqIeHxG5RTRb1iebw8SQNE5pYrqiz + SqE2WyMYkxMpPEdzeas5yoyc9Y6ZccfD1tG40UZmacISeM/A95goSIGOB7msLIucmrqiALVCkQ7r + HVaqhxmra06szONK369JNdh69jXzXrWNK9fERZ5fSFsYlaa2x47KjDC1e27VMSErkqMLtKurcdPO + dLjvshIvNhsT5mGGGTXmbrRtcbzuvjFaJWuq4mD0gVyIDJYsGSKEIkHCJOwElBm1ZH76DtbtrtuL + 7u8u/JDpcP4zQLKVDwR4SOh/7PCjGaARl1KGS9AjFzF4SThTkWakgtFcpNlcwGy6gLNKNNNP4QgV + Kfv1K06FdEga0li1AUjxD5850kIRNjmT6tLenEUu5ZI+XVAfc0ZL8QTLrQakwgGVsFvvN89YiFuS + X5Vdn8zoB7cidcLi+bLOEIg91I0qKh952Ii7VGUK+PPMdU7sukxx0QmTqPfBZIXFbI5VzBq12eAh + dkQ+PEsDWmdmd91bH233ilu0TzjiRMG/OFMewremjlDGLDNctSPVg2qkiIuv12PkiE50xkN6NsrI + N+qoQAXU8y7WhMVq8y5R/5DL6hP11PWYvcsZjzUbYTCBmMU76nOfghpQf+l8Uh/RrFilLFuqNCE3 + YZCazEgNeeQCnpThTFSbI1WkEhfylgvntz5nmery+G+8ivpf+Rqi/hIAZqyCibhAsF3I2wzg6T5P + vZpwBbnf8Iy4xUwYCGXk/fC7BHVl/eBNf4Yn7W3OqMMzGZKaDDE7irD69g0e5XvM0eNsPiSKrHqL + l7nBsbwEAhNz+A7LtRNUa7DD1pqVpmajgGhJI3ZQx4zX+I3V1D31N48bXDueLcLVG0V4XAJ7by9U + q7IaMUAzLuGIy4zqmmu4NABWU41U+IjKTKA5pd7+jUd7xPldRDn8hleteAgAqhWY8GKPeIHj/+GZ + C+WuiGtX9kTzl5B6n+jkEbP8Bqoj7eevXpXv6/h3prRdnWpgPb+96nIesl2dKnIdN+tccH1HyNvt + h7g9DfvNreTE4cwctuZ0sLb9x3X52vftXdjEtWCdCv6q3riOS1jxK2LxLdiltD2dbi+HD7yg4XNO + Sn16ncF4MOXR3GyGeP7ovxq++7jQ8ljzK1aGryf7eu6fj+fntXlcnPL+1LJW2Ket0V+aqDjXj8Cr + hE9SwY1F42kW9wbm/OWYQ0vJQnl7a3eHK/cQrnrKpmeyJO1xjFmhi7XueQnyNmr8KmSNPDyK17M/ + xUFdh/4u8v0jdjxfPrnVDjnMw3BAqhGPpr86SqeFF0/qa2+5GYdLj0ELnJBy6E1n/Posqrsxh7Wh + oAI60k3PmUSb7pEmJ8GR2C7Iga2ONPLS61OxM13OPCCNUKarnXxj2+t2Kynfq7P34k6StBYptwRk + L+0uQhhIUaiGqjvKk+MzVyVDCk+UUP6L+TJpctSGAvA5+RXJHHJxdYvVS5KuKZnFrGYz2O4bxpjV + zSJh2fz6wZ52JzWnrq5MZrhQCKn0ePr0+JQJS62RHCFNLI/RYWTKeF41/mr0fN6FsSo1IMgkIsFs + +zwPaBHCpFJFZCocFETBNPxqq8qiZ+X5nqR+JQreZZsIlQU1AlYOF2haQuRkWTsUxWjnzJJyaRHI + pmS6FK+fydh2ttpKNqFJ4GmRwEWqr4lXULRw0U+BxKwoXDpMEGicJauOAyeffv3l6/Wm0P+XuL2a + x33+v39/db7/2tv2cfmYRVn12CFQVwh/7tryKcW4/hMAQsjjyyBxbXzTupeYDH3edO4hauN9hh9u + Lnd/yNDDvosf6Eeap1j2j/BY/4UzXMZP79XAT2+Zvh5WhuiuwXXog/4mxuXr+Hsi321wugqhZefc + yMg5AhkwsgseQhoQCKE9GN31Lij8dSsMLd8cR5ZOaLTRpFip+nKkyzIqEealTF3vpE2Y+WqDhFbL + sudx4e97zh52FIKR6HocC21ncVHnpBHt8UGSdojMpUk9N2ocbHqH5+nGZHnihec+b+UgD7Vhcos8 + Pf04Ut9yfE/x92M1S5IbiajbHTP8uU5DFD8xN8p+LmyHQD9K7HXoPZO/vfe4YZjmDdbZbk3jTUDH + A7SjHk2MkMFtzOIRO/ytura5Qqw3TXN6BRj+67rBLA0N5BuY3UthllozobgFbTKoSLiF3/G6FmSH + 4uwqiTNu4jCNIJrqGi3x5BiMe6jCo0c5Fz3x88QVipWDLxDNw0Za5lJ1SXOHWtBcAtfgVCrWwXCn + G8crZcSolyKREqg4L3XpaJIvQ5b2LS/pXOe5l6WZsw/mVpEe/dJNXCiiHwn+sFT3lfo+zKOhCNdl + hx6TqkrK+Cv7adjGP1eV/hrdNdAPQr+4fd7onxr2Xu7tCEJztaSi3KWtaijYYsFPe58eIU/q0PDu + ZWgfK5nNcjMDqH20s6huAsBU1PusfCn34pqJep+xi6HvyaMjdkWj1qMFgRKnttGTeUuDQR1nu4jF + bMJt4+o0NYx+dGjG3QlPYvYMoo1FuRdKiYfNpQOREo7cgizttMy0JrtwCpyb6XO+LUi9zlhvh+t8 + Wz4vTqQ+0peI9WmsbJiZsmawuGFGbTseKeXY3Jg9P/QhcyMBCYQGMKi21ymkGD0AyLHz4wqA2o7F + kme7tBvG8NRyUsUAjTfHGOM+5U3FZcCp9uWx1SZzisaTlLd6PDkcaEBlwOzl03G2CxluPZssDxE7 + 3Qx53JiUdlgfybxn9qf4C+VlksQoDkTRA7EAgwCzFGADZp5s8A7MPM8CTt901QlKG4UipMz870dK + IQrx1Pk/3ymQifScmNnTCRvimRBpu5WtfelK54b3+hWH+sxYQu58wgUxlU0EvrEkfpHGER1VZiLZ + QjI0bFRtRpDRiRaQhvelzG5k3q08/timc8tDm6k36bu0PVhBI3wOLbUauo8Y+nj3zdzZBBYPjMPV + jTHlgCrTBdNaJp0WlmWVM7J83bBCsnGfY87PNys42FLSyTdpTMqn34gG69d4ZBBvFkGULDgF7ohn + AS6iu8p+nEyexi1DPY6PlsHmQLd0IqUuBeLrNNiS/mUm4ZaUjFOTXzhJdftIw0myBuQJsMQxtVHU + /fLGSE+EJ1MGSvdJJFUCIH/seNW+M6uJCR50jOfr35U67KdTXPst7mKvea9bnWLGdVkDExni19z3 + 4hVV66VPvjJzWw4QT9Nf3H0lWniBHfTf6d0c7HzcImnMztHL8NHEuom7cnk8Rsjr5QBI78A5VqW1 + yRgZ9DEH2lmo6PGWxGEVC8A/42qLWew3XX0SdPRq1bS5Lex9u9bbzKolfm7yfk/zVjaDgbnL6rnT + dY3rrbTiOM55EbXhg9VHNCOslAL5nUTNp5wr93bVSV3aSava+lnTiTVvpW06cYw98M2VC65Lgen1 + zNrN7HzFnS4PNVw+4T+OP+/W3zPa38mFvAIhrHBomP3BhcaNeWzDNNmRq03+4ZgOUIe+DaAN7X2d + GWMlVXlXQztvWPphRFUOIW/q4d1tXs/2izzQjzvIJdMvRw+WSg1vQQ/LoX4GYCdPX/UErlQKmEfa + TxIGGu1MWYfPR3eW9sYIDh3exfxROY7goEbVLPPk63YQGSQRodEtKxWfElIcW5POHaZ7xF19a5Iv + lZN7BECqCES1LHYGdMkSq+fAf+TofKutpBGx/4Vk3h+J2zWivWQvGKatUdmMEisYW6uVpgXh11MB + 5HxkdntsF9WbrwkHjsLQbJuBiB8jlDXSr39XX/xGvxLhfuofByoiVJ7VzzsLYKeC+ggUID/M6O4L + 0FYgfAY0oyxig8KHkhpmXfNCHmi2ADEkjExSC6Hy8J1oCecL5kfKBbtCymspoAUXE/mSQN5KlJ/I + f7dl8R/31bbrqg1Ef2X3PLVCKgQCIZXaCkMgQG7EIYQt9YGdTQAD5hZj8NfXqU7VSn2rVLWqZcmX + sWXPmiUvj5G1oWNk9eHO0DK+ZzlCp322Af+uvn9VpX9W4n8QRcrTrKrAZfpZ4O/vTS3e6SAOedKn + P5P/UjJWfb3jl5/+BEnxePvm2+qZvrmbt9V3v/xhKurs92VvSfX88cvut+0u/hsq/3AN/0ifVZ1R + AxQFBc/a7l79CWe8H4ASZaBABqh4iytXvtULoaQUkPrB1uJVcPnYxXwvQiQYKJibbUJnVhyHDCBE + QVHAGrTI9/s1a1YdP4uCqkxPTx379z4Aban547PSfCyOuvjodREKmy4DI7bkYJDqiJjQ6vJcaPOz + 3sJ520PZ6ydVxTglUz6pmKBpfTvKkjmJDemndWxqkiJETSV083MHJXIjuv7xvpTJpZ1nt5ec03Ar + yCTilXhk8/rl50WLRgOMtazFXQBQIX6oAgUUP1aCuCjaGddkmqYlPilrMYlm4kSnpk0/GzO1O00W + JkxmZpsZVeAwoQPJuY+ojK7EAE35wVw22yp+Txa0x+EyOogodOAzZWzdwaZLNJ3yjw7jWCHYuX0G + msqcjYYCXEJitH7ECKxEPkY8PnX5yXHMuI3cKvUqeNgAfeUxaxGZI4sjNgeA1lTV+HruD6xoPmnN + yaL6JopIyv1NH+PaAEM1nbVmjxL1IOZLxVckwmMSvDDoZGk1QiXjsVd8xsadIoRCTMI5JnWCpxcn + hlOiBmDR8H8WeWwXggm9oVfMyeyc3oL7IeB3uvkSu0C3063bUiHVE7RqsyUTszUPFwehPSrSWkSa + 6JgF5x5CZ4/Vt6Mgq6YuBUBta2EhIfk4QLIfpkquF+mDP4DbHh233TjyOEBKbD7nM2+BuPysT+HC + Fnzc92cliuopAHmhj3f1nK/bsEjppQ4JJowFnLuZp3d+JJGQxOTF0xceisMYTihzhRhHSTNlnLsj + V+JXpcb/t5hbFRg8O91nxl9U3rPz4Xy26r1j5VRzzORcmdBQD2a2r6VicpvrZ6OZhvsBm8jaOJY1 + +7aNd1fz/QGNLEjBtZLmwTSine9xq6G296Jj9yN0zcpTH4F7Ekrkbwq4vNjhUpKfXmUHTz9W3sPS + NPLCUG/lNdbnT4BgE5e7fGe753A3wXN4uSQhrJwtJ9SmXdG7rlwGx4yvZNvZhgVyyf+V+2prbtQG + o8/7L9K8UlchNmDaeDuCYAdjLC62sbPTByASFjaXgBGYX1/RJLuZ6UsfO8uMhm/03XTOx3BAW5lj + uZ3k67p/tenjKYHZBq5cc57oqX6XXYzlsZ0C/ZLErawnrVbDRNBahGze+FnLge7ePXfZo3dnQq2c + 1vPHbGG5ezyRxZD/hGSwXT16EwgXZuaWz9Fxt/Ku9MkyrBb41DSMXk78426h295WPwTQ2D9HqVVu + 3YkJi8LtDjY0dIOCp5KGavCqx8/L7cQu5geQ9rIyhf18sXbmLWy3ddu6XcI7GUZCDWO3MZOijfbX + Dvamu91VFBp9nBgdhKidzX6IQHwO63p2S/MzzfGIxsUngXgJL+EoPF9Gb97Z7aVq8PdU8PVDYB5+ + +YbzF0r++rQzGn3j2vShTD88K5pzpTXzf+WORl/f9x5A+G4+gDP9MM/05v2sdRHT8Dwqygvlp333 + f3kIb44VJrPb4+VSvst6fWmy6Iybssh/G5S9bqKMXv78X8n6pzPefmD5whnl7P1HZfffUG45yu/D + uamreHY7DPB3moUJBgklf0RhjeXJr97deYEez0cjgT50Yv5ESAQ10ssa5JKAxd0KSRgNws1SSWCV + LAC+GjG0Wc7tsQoEtfAA7stGPNi421iE72G126HOt5C4tQjyCavWHRKf7YbXYtxPFFnAUuI4wfHk + 5JJA5upBkOJ1w2PI3u+dfN4IvJajTfaOZb+woMiw2m6ZZUROUGYNr8vGTMGdt2TKWGWV1RLt1Qdh + mbFUVInW71if3A8YWIApwHLFrHnE+kJych4bkJTlrcKsZcyCmBKgAsxxY7XaDP1A5V2Z0iksXzJg + wdAZPjQ0eQ/yiwz8XcKC9MSw+OqQSgbKVABpNyWMK38/BYSq9SACLKAnkt6rIGwKpJ5cgttC4Hxi + zi2rUEfQLiFDjf40Bn06BtWqBRwvGfhI71QnNZqhD6gmgjPEYLUmc+WAOs5pn0tOxWOiZIzFYMWQ + iwFTgJPzmeBpjYb3TTpvgGXFoFIAkqjTqNedo9yrjlb6DhBAI+5th5QykqI1EvlS2ZaEl5wF57MT + kTES4zXR7gPAuSEcl6PwHD4jzpEvqJlHOL6G5w39CZ8pr7dqJIIEKUGAX+3Pq38/NbJ/xP0N4ert + 5kPNhBCmAOq2akV6sj0YeuqZr8sVTXzdtU/+cmEk5vx6OG2CRi9OTuqmW7df0UMbM10zvGK69jc+ + 8mDZS8kT7SQtoe7mROESucc5rtfXv4kvk55XbSgM/5WqW/QVM5hhaZJ8hIDDmAF2gTA4JICZya8v + ubdX7bpS1cWRZZ/JshfPe8jkIjyVYlJ6+aFG53MVpsP3fp8rEyo3hQsQOp9yhKIrYVJdA6eQGEkR + akXgFovXLftAdq+6S0CDzNK3doUeaIvm3sl2RtKIc4+4dBdEp9Dz92aNn96c77pvtJnh3dgG9IQ3 + O/1kGIhkt7qLjzX6nvwyEwGx3IffhBphJ+DeN/rOx7fyGtjIMxp3cZvHkbjY2KJFRNZF8zkR7ytg + hLmJisTX9M1xxjFa0PGeBXXpY/WRa4kRmdpdcoEzPzzHm9jTm25xs8O2UYUwXAwN+ZQBeR7W/qpC + MPYv/hy5bqlNooLLfHsH+W7nRvkB5fpWHxDaGXno54ZHdE9D7v8Mdf9vAv3F8A/BfmqC/4LrbXq/ + k/4n0tl/8L669UOb/jiv0qljmyF+kq4gVf6VrDmk/5qKtE1/bUj3dR/SL+4PDgJB+P2XviCrCPpt + DV9b/Esiez/u9y9gnFUIV7mKnUTp2FKt0x4k8kPts4bpgxdzdChb04X7mHyTJ2slZHuTR/Xds4bd + vtXtkwmHCTTCBlpsrB6zM5DsJz3QtG50DkRm3tLNPMIXHaRY46N1bSQJwNUfSUWTjE8WC8+11jZn + 2hrSV9teKHq2lJ3toITxiGa833wmVLmvWqa5yELIAC4JtlP9mjjj1oODL3HSAOdYZxZnnSiPWc1c + h4D2lg8aG/ICPVEoVW2jQ8GsDIhHwhx0kRd5jj9cFEGx0AhpO0Dz9Gx0nneYIDOHhuIgY+yryMpZ + ILfxaqkyfXqvMVy9LJyjgpNIFw5XNmfay+SwghqZULCq3XtkbgXOPP4WI+4jEG4vMN6DM5e039P1 + de36+AygNI4S6br7OLLwklHHmRVzv5cMOoJI4t4WGyl1OoC4DVWHlZiMkVprr4FDqoqHjfPo40q9 + 6TJg2ZTLmKkSSDIeNoCz21GGLRJ7p2YPG55TrxXjrPCMBU9s2ZsiDKhYfQx8a+Ln70Q6ATh0gzxe + 5G4kqvqgTL/mJFmhyhdpFEn/Nl/Ku76sb22KfKQLHBUMsRkeVHrYsuJkzHF75kP+zTUvVoyELbSt + Eu6lE7Wqk9xQhZdkV4aUFY+Pjq0lOl+XuK+IXSvvQsWjtYg0rNW9B+I/qa+yHUdxKPpc/RUM85iJ + CFlIakRFMkvYKwupbK15cICAE/Y18PVjkkp1tUZq1Us/jHUtL8c+914bdGSBp5VgF58oHfsteyka + FcfBfqJp4x4zlgdxnZdHqcpUnEYcgqGz80fHZjcebiXvWFBXHXUqRssLLUhStUhLPd2MITO+Mvw5 + Dhn5zDhpOgxqenLyOsbC6zCdItUGAp1AunpuKmokoSxbyDXDp/mr7HeO5eH5KK8niSwx+mA53OYj + b9BH2EddQdOPB1vxEvLgokllCU/6GMfV7zOCPyqcKNHcMJL8azmgqOEcpoVg9xnpFEb4mz0xNjLW + Un2gZqOYcaP8HOP/LeyoPE0rZtaM6lNEvZcK6+LvtJsYiwDMLaDf/ZiAU8BNjI3nmYVfqTtF5IdY + jHWRj9zD20Q972mD54vosrlyJXgzLsKZ51aocl1FEgKzUoyO7Y2wkOyBoL6tuUpQQsMXJNijt8dx + JO1WwEuqBdgr2utqlW94tdoyeg9EUsrxKy5ZwP1lx6kz6OtlJBwKd6ebyvUAVaWnla9BoL3aM1m1 + THkzAyP1XK0Ol74nBecDp/WNJo43RuoBa16rUX5RoNrUz42lJRdjZcvn42Wbrd3nKgGX/toyd1a9 + sZCO6WbFKFtmk2YhoaGiBOeI61kFzNeHhW1q2VvBJb0DHYqT2gP8Lplx+1XhCXbAmSI4ZP5y4i2Z + CZcE4zfUJFh7JzJaVXtJqzgOzjVBOljQDwXFFEWXt7STtsrm+UbpRXov5oA/VHfcNT73BvJemqx3 + JXLVhqIqwEyA4l+taoncrdEI8tx1q7oGS6O/9a4Nys6b2WLurbxgK4rFa1ytRQDG5EMUCcuHWfZC + otBHodNtheYH1j7WutDPu3f0hczTwvmAqemDhP3juxPa6PTPp5lu9zs6EX7uEIpIjH8gdyH6z85f + azJLFf6Nm6VsVLY9lvIRbu/Ax+zTe6+lbyvr0Y8EYZojy3e6ngNtFLrkdPGhxH8TfOrYKCeqVooJ + 6z5AGWEXDkt5NPbzdCvfWk5csT21FU/iBtsXR3jZN8zBFv5HVEXuRWmGhw7Ebh/izvoIT90uJo7i + Iu7GGA1zkrjdSBr5zgv5EzBtqXHFEX2yNrJPw5+7n0E2i2H48FhaMLXJKQsJL3VOL+SfEAfZpckH + fgrf47hHUCE7915IJ8tRAHOHnOqoIYDvOyFLwSlLtdRTNiviz4w0OaXf4RZo1zzorSgIIDn9i3hs + pW433QbP/p5j+UL2/S9nr0aEaUV5/p4dPtf/ffKDLycPgprgUhjav8j+X+qrLrdxGwg/O0DvMCsg + ++LYsmzH+amsRZBg+4MmDXYPENASYzGgRIKk7fhtD9ET9iT9SEmOk82iQbtAUSSSaHJmODOc+WY4 + jrJxu/y/OPrpm62/ZuZBGcHpZ8nWrLXxtQCYRNmkXfYu+DcB/p5V+kfqHYQ/nyNPz36C+9k3hPnx + 220VOSuR5q5idWvKa5ZOo2zaLu9b2sD2M51TAHsHAXq1ANDxAQJpkCtjeO6Eqi0wCRjDPQhyP5hH + 41EyHYymg2QWUcuUJTO60EZI8otp7Amztix4LwSvhJf/1Uv3trUOG94LYx09DQcb4cpBxcxS1B08 + 91Kd7VDuiHZRf0Rd9h/R9Z6DCHLpmpm96CAAOjkjmJSoRlSIpXBMkmOPqlaV4JacopJLTYZbzkyO + 0hTmRMFrJ+635EouDOFiCCmLVXCQ58mVlGyhDHNizUkb9QDv2WEa6+yHxuyXzkgLse48jwoJxQpo + 11RLp5S0xB+dASQf9NJy3FGuhV1B+e2gFAVUirKLpsBCB7CgbI592USpCx+5q2dB1kA4XkV+pZcy + r1UndaEeyfcgpIv7KCyUoQaVzulzdDubzbBmbmX4EGXi/HQUayUVnu3dvY2TYXI8mkzexRWvV3HF + RB07pS+VXFW19cPf+L1rfsaQHx+PTifJmA0xbvYyXM4j9Dvc1Mw1jQ65reaY1FriQL2X4448u736 + 6GMbaqZxU6PSb9rpzfzKSCOWpbPRQY+erLQw0yaj0TBXehsIMKriC62vBMqky8vP3Kwldx98WVZm + jkDsX/hyezi+/FX1Q/HBEEHZD1CM8XUbev0ATH4CtpTg8tkbEMQJJ/n8dtcSHU4u+pdoSITrh6ao + nzc/hO2jKQosuiHm5oZVfH5z+9N7Bijy8YgA/eVqnoyGyWhyejj+2Po5rAeuHMGp6iv4eD6agiCZ + 4eXT9SXJ/CYcdv+Gb7ybsk/BYRTI6JabSljrkaE9hl57Di28tIGO8wmp3rxei3a7WvgsGThItECc + 2iF2uGkCFGx7Yf+cdNdMfm4kUJBw3kU/WHvIgO7cu+SyDXGz3W4TT/zqk8pd8uxz7jOmrI2guA4O + ixkAA/kftwzD0lXyQ64KPp+cIFXR0KHrLIXuHBc2br0Xxt98fV9tTmZRdskM58b+16pMT86ivUvB + d1OHcMFy//Cwpmfwz6e2AFDFarbkADf3d8q1CeAPsU0CP2weBCdnBTfZAfDc8txjGokCGNcA+GCh + im2UIWv2U6UlDPPPimab8FSr7mqFcOc40gL6ijpkEwABjJDYaPD8jRtR89/rhe8z6aJaEp5BhSIj + eUTWbSWfRxuBO8f5bDLWj1FGvZcs3aadJjs+zYoC5fY88XzQJ4VssiafR7HeKyQnw2Q2OzkeJpOz + k2Q8O55N38Wigu/jywCDd8DA4YNe3i15HcOVYg1AW3MbSxR6mzPN72aT0QviiFBZ5lEUZ4393cG0 + X2jTzH/9TnW2iwGnCrYl3E0NXCy3xEjVfKCRP6qmB7UY0u9GoFVBL2G6uNFQCHfMjXAl6C0cIDk1 + 1YMghf788gdp5k9/JZmBUFH77oKkuOf0F+3VtuLIDUR/pZg8+MXjzdyWXWIMgbAQQmBJFvZZLVW7 + hdWS0MU9zlP+IX+YL8kpddueTLL7EvJiZtQtVenUOaeqs7bsNeYReUvRUXmbBxxBHVRrNvQRG91p + 3TZY3zsggUxCfw7g69ghO6SJGJInDSpTx+zJJFiUp+5Evu16kfOtyplzHsEc4mdO2uLfazBbBIIy + MEEOCVXQTAjZ2X0btXRwTnXnGWi5wZpwps2FjUQsrAePku9b6qqdpwflAd2+3eWC3qWmmy1mqH9W + 57LS2Cs/XyNykg524ePM4wdh4//C4vv39283d4/3j9++f3q8ezqz+NPHn6xznP6Vw311Ltvf+M3L + t/4TeT8PwHdi0sr7UKiwc8QqWzANtU9wI+tRuJkfUthpCGSsoQkbN/QJv7JqbN9bXR1OwGPWNg6c + CCfAgjKW5RChxMJsh1pnFF0ffJgcmz2o4kumkF4NzYu14UlPY8gFMqoYAF3+jiDnRobqc0lVlwr5 + E1ge0qhm38z0t7QKPxeYledtrnF3acvfdHc3uztx7TW9WLy/2d3L4hZ9Ou6+yK9t3P3AR3YhjtBD + RgIIup+/Fy40xqgPvftCIcaQSvW2LF8RJlAOI5dBAIIsKgAcbN7QZwtDEMQaKWm1fHycVmtYt69Z + JxvLba7dMmbhmL5MKqGSoTpD7FUHJzkrheExJTSV7f0VY+CdguNMiZ0qUDzKvlQfPpOvuPYNVQBa + k2QqicUUNOdWGTMjIE+kKm2OnI1IzcTZ0PceBVMu7JtByv4P1ZtfuCcraLTgtJzDzQV6PEfaa/l4 + BF/Ap4wjzBeuf2RvMDbhC4e6agGAsYl1gU/6Q6aOy8RwtSUzBDgD046E+QRtVcG6RJV75FATrkdm + vjDae50xp3zB/Guk+CDQougKwx4ncF2urDrrbDm1JLkUKMSwnNpxk5PQ+XQtDrKZWi3xWIH9ialm + hgWQrimx1zhoUPBoloRXi7R883R6J6au6O7pdlmPKnJabehX6RlF9IdIwhST1ESqFNAX47rkhlTx + 9ZojZAxR4zVfku2qiKp95l5RnEI6yA6D85BERfuRS8juA1wsU5/CiJWQWXrA1fulVEBIhzFysQX/ + rqnHAj+rMYK3C+yK9kn5cquun3jQ0sK7BNBQ08x8QGwCEkorw6PVhPeD9WXEncSjbMYl5K4de+4t + XAQSRLQzCRjqsB5UPffZOZlpaMkj9fhKth2jWa8OfFqRqmXAUQH8pqiAsVipJHlEf4a0xSeJXc1Q + 14Z+ZrxtpLdZjZZqYbpHJdenudTKZThCERVBrud0G4oa/d/2lg3NkpWeP1cKHvuiQCoxiZVD0hYe + gDEkRqzBfXBFBSA8tCK1RPwleYfyvTbFh5vdw5+///H2hQfSjwXbBceWZq+00BmyweqlqQsQ3pBR + RVEeVLML9AHlXJikTAE5A27cTgpHoRbwgwnAZWwF5BRTOFrDZi7Cwgg0C4oYZ6yuwIGiZc1CqRYH + +OcCC8mloYpR3J0yXHT7Ji4D3WUQaH9s4+7TkELdDy32bB1/8V1+u1EbURh/laP0ApCWAGklQE23 + QqillVIaKa24nrVn1wO2x/LYSbdXPEb7ejxJf9/Y3l0iyk2kdWzPOd+/c+wb1KJXhrYMFDDS5AM6 + OxH/yk4Vw8hk56UmOaCJ8L3x+0jvsxVJwA59pHxGGZvQOkhovEsjFLESeRYe35zbz9S/5A6LbItD + CQwySwlxOtHcZoGriCdlqejsE0P3NRBolM56YlIDuJV4OYXYPm5cNks3hfe5vWHE65iOtAy6g44P + DM9DBJVEZirKc63LyOpEvVZKxHildTHnB5Kiwm7UKN/St3y/8aJd/YlSn2MFNTAHljs+b+bOg04d + 2g+ch0pca7HD5g5gJRKkKp6OREgv20BmgCKyaQeZpD+XWGcM5KnK191cUB1jxmDLA2qi0V7hugEN + ksi9vw2eGtLES2C7CMM4gB2cjG1JVsie6snZsYoHipgjJ0bkqGUnUYEKjego94WAmvAjJ6MOUTfM + nXR++f/avRmL/LGwRz/NzNcSFUs2Z4tFAse1+8PSZGWksDSSTAQG03E3ghhYswEIjZxVsJGI5HHg + IswTbhIy/quJrtkyMFS5LHiYIchqRB4NC/SVG2tw9snLFb3f1prC6h2h1Rp+CH/QhxKILfDdz57n + Z+vnyp2VXTqreMkPZ99sXpytX+jivJAdlDswIRLR4DUQU5UnZpXZjsZKOBZUUhGJ01zk9GNTVoaE + WGl0EilTHv+VRl69Z/4jdvNlUDzTPvqb317MmTWERu92w3KXIW5uKyqXpI86QFBp83l5vgHuNiwL + KrUADMNSNvoK49XF+nXtUgrbvV7LO2BvmseXT/hnzrR7fy6JuCgxbbxV8c7SpJlljbQm7KqBodN/ + WJnWf3JrLAYsh9/8XxiN3tqBL9axt21oSw5O3FkFSa9HQGPTEO5/80SFYVeW/CDelYg7n3ulN3Ln + dtmNlRmMhH0afGNYb44gHgLAIip0AK7lYdV72mQW16IVmwLGHEXcunr05flXrPJraxdPn12sGNep + IXXYJ+LYqZR7BOOR0NIMNsB+dqf1+xfX37q+tD/bcIvtJd7Q2mvXbPpQ7vzKfoMUV1QjvQ+g4+Be + Tb/jI4rNxtsf/Zj4em3tCnhjK0fMK67qCXnTOTQKJD27uB0oGqLhwWGqZWmfOu675eXZ+uWpMW7Y + Omhn+k6CmMw8GFZK4yUfSkPkKvZ63DAy7CpsetfvhUzeEAtvD6+vfr95tLKj07XuIYSpoo1LbFqH + 8glIKyaVhsIpytj+6MkpoLTSofa9dz1fbjp214uHkrFUgvoQjY8zn/H7+tx+xThoa6hC0f2t36/Y + 8HMQDXnBfzXuBLmYeEscNRvfSwDfruzO8fXiU9iJZc6boK3Yx7jFjUPFDnpv3Iuv3hcaN+9jhtOY + 9qGoCYxJsBt/6Jkuxux6Z8++e/w5kw9ZdU6ijCWnDKXC9mz96eM/76po/DZd+PHTx3/F5SOtrXKZ + esy1J5VB3c9WF0+fgilfAKlDVuJjLl/kiSLrxGmqKCm0JhZP5PDWDWPv7Xq6RU+/6UXF+6nDtLKf + 6qQZ2J88dBnWsyoun4R1nlhc8ldh63Xh3F7HL9XDGPXm0jzJQ1tKGYpMYDtZYFS3x0dzUuonEiEX + Z7TNFUXsS9UKAPzLBG/iy9H0YzEMJpeAIuA0jdDCcWFI+tn1vvKtVvDWJxR4V3me7PU4WExlMiel + DrYHFrshH0F86fOs0wQgMUngdve9KZ4mqnnH0a5FbDqHTSd3/Ed72bW2jURh+DqB/ofBUNgFJ166 + LJRGMYSEQC8CoV3o9VgztrQZadTRKKn31+9zZmzZDsl6S7eQxIpndD7f93yUaUWLG5fODmhC1QCG + YuJFCiVdo0xqnQPPIt7qHioGYLFkAxscRSQmFOA/1eacttjqxl5OnioPdAQ5k7ng5rVSuOkOp/JZ + MN5m2F5OFv5bsk3DqDCZc/7slIuQ1pp0dnKyfxrZLkiks3htiMPC2bOmNsbZ7eXellIIRKwozr9F + 9Q6hxOByEkXCWWW15HYy/7JPhG1nK9Kl7RuGtQJPS90lwUU3/8RECQ3Id08jI5sj3nrr0K+k6me8 + xIpOo2WVtEYRyT3MTYHpJtsLDqHNQW4XNLEn7mR8ya5hoWtNL6SqcbO3CS8bC4iIUZS+fug6HyK4 + PZe8vDktZlvD35yeFLynzZwnHkP65KFSfcm8ezkpvZvM/9TffOubNTtltCsf1sUsVi9fvbEZqlKH + MUo8Hi/zkBTwKcEWAUVceLOWJ5SmQ5IbzfxzHAzqfFvaFGJeyTZyzcw/GquhD02yGZyWFAhZg+3B + AMH4OthevryQKYA2T1LkvFp3HmfzRoaO5PIsZq3F5jPJv4OW3njnV+LpnuIb+0gKuiZJhBdWqCqy + m90bF6pkxhT96cAb63oC/68KryHtEJMnxWxzM1lyHzwrVdOQvKnq/TI+gXIQMppxwT9iBBdShWFe + DqrLbxGi1NzF3CRbDCICu4sl1mXujxgBqGS4jlVz1OpbHxhmeD9vY4eWXwnAy1GtgLUmK0zpU8UW + V1n+UIedAqGSFua7LC7asmpryaGQI696tKAECAPvjsXyY/so6V8l1R9UZ8MSwbBJPN/NlP2hudeQ + dyiFJFKN1YglDdfqfYkS3JLqTTo6xgbqIsxeb9VIGp7p+U57xcUZjc+wSFDWvHMWs3z7v5pbLIKa + JdadvKbvfFTIwwsc+WR7WjWR4HiPIffBP9b9hv19ShqJtqHWjp4OMVZwh6e9Lzsylb90euGDps2t + Va9lLOWibmtAxkPd9jEMe1gOKuMmQ6RmtPT+ONVugJCiLaL0eVDvkLSyokFpYv5Yx5oRiwqt29ZH + Ha36pQveDKVV8F0bJP0K+g14rttI79rBRs7S9lG3SNFODT0jCFhyiAncO+OLYyH+Eni3Xc0a3Q65 + qqouWLq7luryQT3lcyWA2+oxQS9j8ayGjO9Md7UJYM+gHgJlpEsSt+Why0MZlHny4WEq6+Q4GLyu + 9Ee9KcUbyoMKoN/S5krfSC60rAMSsoyrn+nbfzThRz3FkUG7+u8U9JkBRpLXMQ0/08Mjqo959nmg + nCIDfh9aSTXoPJPtonayn1JxVb+9265UsLk1X+Co/4uCRtUvK8p0SDGQr+u2rDuIsiu2oFN+QHdQ + juFM0UMebOWdseGYofchq9GG1knfyXoObb72aZpPFmAPLG71hv4yuWxMVnpXCsSKVOE9nKPgJKLk + HnfMoNuBtYNI6PLrUPe1EPjQmqvdwZaHy7rVRIWgEMuOES5VFOIxRvG7DELfIg9bPMnImxtAGoeL + 2f6QXMyYzdO4PD6ND+n6S3+Kbn4VPG6qd7//pvQQK1ZZtdKPVi2tNQtdPpyrO89ozADcqvd/vMUd + uS4Oxe2EyWC3lr4/bOrl0rpIsJmY68jc8miDNYqOy3dWBe8o0CSr3K5xopKCjUj2tk6D1nN1OwT+ + Dw2qp+r9u7cSXgAJXumxLGbBdsQWsdgVKdQpwxU1nhfOpOeUcRCto42HCjdWdIiki4kYQYdt/uG7 + DHbktmEw/Cq8FE6B3UWbpiiQACl67CU5pEDPssUZC7ElV5LHmZ7yED22L5cn6UfZs5scksti1pYp + 8ufPn2RblFw16pYqHS5YU9NOXJFnP/3y3fcCu7tea9XcybMXP/PEBn7NczEX3WBdagCN0UWxdcxM + 7LiCRKw59KvxyBqfwUHEWQd8mBhHHiV8MRBkdKBGHCB3lV41Ckehv3qIu7z+Sj7/GJV0hSKDZutv + GDYUZaMtWJJ8ehDOyBKmVOUalNL0UtaeSo2Vlv+YeUlRCsNzhsyV2U9L+5IkhzhMq1f/cg8xicay + cqs7Z9WZaMTNKZ5lDxxk4hFrOcavL7F4dTOz0Ebs63LIkDHjlNMsFNWy5LQwklQloureW8YZ2n2o + r9inFAdzCw/h4BX1OoJZ3RTYOiu57k467C7Qhved0Eul078Q9U4aJ1+1Ry1nSQzpcwx/K467yh+m + 2cADGx3jsI8FmSXx4uw/I9eO9m5KLi4HLY8OODa5wWhvlxrnXGblcUxWQPrWXC9S1vNZSzUujtzY + clavC1bM+q1WEHEpY1onL70Cy54HfjQXn9gOFmalpNnm0c95V1a7ukh3oo5BQtzwqG4HKsshxMww + h7h2MofzWO1OW0PJtRdWJN12srX0mhYfI889dJpDaSMlxhg4y4Otsd+krMvAOpVkc9q4b3LBRovB + XdRR8q6UNARGMS8bqw4BQ/LG4pf8Jj9t+mwVTGZcDRdjSpkpn5bZFCHOkDL4LywOLfR1F7xN7e7y + HvCtC5IQ6jItzGf0x0Z6eYR2c0U8VTGlheOW0LqnLewo9AHMffPcXk7hpPdlCLYZFGg/zyvT5VU+ + ffxHNqXGLyoMqnIzQqAXNwVofRUsJnxhy7IqNToNzjSW7/TDYh25qZ8dATpCONm5+8KrAFG57Ug8 + otUo/iBvUlTOT20ZqmMoctN5IVGX4OGbY3jMwNMnl73V1GnNfJOFS6fENVYjHLrC1pl+kE3bk7VU + Sv4zVZd25xNzgm0HM/X9LQEbn79+p7XtdCZI3mXP1sfTr3DnXZLNmB7T9qu8pdU0LkT9UKWED+a9 + BmMuelTHcmeYb2GapLe6mI7lhWB3TtFrrW7LUSNELW9gUopI4O8RbsztP3lXya25Jm/z2aET+2O6 + mF7SRErtyxtljEA02fOIawA+sB663nYmivnJIYAr61TFSZ+T85oZ+1Mp90ePt+5iRmGvOlOPgUm7 + UekOnpgMWBC3t5pJrAmnD6cT5I6gYRysjReNJmCBu0XhYNoQrCmQazrozeunvPV6pV7kRuwQ9a4V + FJ+7cnQZQlMzsh6CeUbbKjF4ZSAKNaRoARDj3gFvhKQrNSkzulmuvohQh1SuxrEH+XPnN3OhP60T + l6GQLl7FLQtgIWjzWmqrI+e9GfoMiE76NXs6FDihsv0cdnqRQWnDYBkNOuuPd4Jjp1UnOTrXGBbx + oRRXQznZUJkiswmHbLE16eeLqMJtJilQG2mwra9XL2nNQrRuetIOV17Kp4//Nm3fRwX2U/Njoh6l + O2tUiFK6Tx//+5Ze/kZbBkoPevl9GdMiwMsDbuvXind74cG1ZXIx4gvMBTTLTcheaHrZkkNjef7D + jy/uhPVTs2xjAMnN2krV+D/tVbvTRg5Ff9OnsGalqkiTjyGBhHYYiQJt6ZYtAmmr/emM3cTFGY88 + Dts+wf7qQ+y7dN9rjz3jFA+EtIFKQQF8fX3uuedeXzNL47JkIUsQL2GFQxASzTXESVwkiL6WZGkH + mBxcAY5aGMnRzGx0TKABlhLCqQh6Gs7ctVMlww1iVbE8pN4JWaE4Da8MgOfK6kPU80bsmg3/TOel + 5Fb2hk/tI6GYAh4TU2Go/E7238LMVtxJFpRH3fl+y5FabpUtWE4kNQbxLiUm5nTqQqC42DAK2FPB + kpt5rIBUcbvhos2Aek5KzUtai3yGIZUWC6uS0riAbtAWE4falkGpkAQ3j4EQqPyjHdNxg1EUdG5c + NnP0i4VGaQAGLOw1a/lkysLx8XXTXjgrPkEnTXtMXGf2N/uTMklyibAOohwc2mqN3OJWykz2Vi10 + AWILOufPsdH4JeY3faotOkYg51GGjglUsGS1Jc6zjrw1GuRizqPsTyXxfbfHa7cWZbv9cVqVtMhi + PHbsd+i18Zyd0ymv7vZUYinKBsnO04LRavZikAzu9nFMUYsuFdUMky2MTA0/ZSx7lhox54TBxv5y + EEHDw05/2ElGUZaMyGGphST2n2nPGmTb2M/q/Rak/bFcHr8/vRsmUyLKUjqZoGdYFg+iYzEVVs/v + J5/sTX/K0F3QvbmOMhinPWubPU/63aQ/GPdAFGKkwan4QzoIT+zxW/jT5RxMwiE6Mtawgs9W6i8Z + wQ4izT9yzTHWVhHeGG4ZYiGtJZ9NvxOzAaqKMy+cWdKy6Mw4ZVaYRk2nEvm/WJ6T9mYJwABlak/K + ZS1FzLyIuXG4lSrpPerlTr+IrfikUjiYk+T7/9Mycwrye69zqlnT3sG4FZdf+lhE2TFF4DE5RNXY + pQxkWdmRwEelFjrnnZbcnX1oeN3IeDjebxzFoUFl8DTo1Brd3U8ao6e/fe5DS4MXwaloyUtLaLg+ + 7llg8oVTyANbdxpP211b/TaHoOfHP2lPijohzZ4lszsbM/tK4xaY8ZhcApMD32AkQQgP4nY42iXP + Ane/npHBxoz8TjVGx5hctAhpaWSNYt/jKppgcIjJqy45f5CrVxQDsb4NiDzFjfuCBMSuQfVaCmqM + im8hCr2E2T7MKcNg4J4HTiGhsa+m8bhRTouom8U02Bs2RuuKabDn3a2Sji+2Ry+m4cbSuVBMiyno + PWolfINUvVSa4Zkbk7O2ryDhYaou3WtCzbnRIq8aqjdPVzLcbXysS1ey57vkqnT59UdP1+7G6TqS + aMxfbjPcEvCamnpL86tKFTE5biXq59x8oBJzbUxeP9CLcVjazWsDAb5ZFMbCISctRKGeQgG+7ZIj + KYou+WOhK78v3OD7xY5XRIunm/1i3N//QQGOk6SxXCXAX3b57m0swBNR0OuYvPNE+Qh+vrH/hWfM + XZ7u6RVI1UmukKpzvjZV/QbZPalKRj/cK8ajxt2KVPX3mvVH7xWjjVN1RvH6q2yZH3YbdM1XqO6w + HM7fqUtytvbmbDzFhCf9ftIf7awgZqnxbWAog1GwmQjv/1o9QI4fQIwU375eiQe3Ua5V8e2r+PZP + TA4Rnps0lsQEOl7TkM+oXvz3r3N01nK0QRu84a0N677Mvzw7coknF7yyw5OZKaakhxPu9B0x8S0q + Jsl4f5UGvNE2nD2qBvY31sAbOudVTE6B6GbawignSl35x9kFL5U2RBUEVUVOC9x8BTVCFVSSD0pf + VTNV2tUjPDa1mCyM0tVMlARvWXKZz5SkWn4hhwZjDhax73/qq7a3bRsIf7Z/BSFgb0gUvdip445W + oWVY2y3piqVBP9PU2eJKiypJOcl+/Y6ULCtulmJohm2AJVMi73gP7+65Uxco5NtXTG8ZfkpeV2KL + vCbs3TF5D1JybIrIO90Ye0zcl9h3JzR6gtOjkZJtHtKoEFs/7EdoFHCHyr3+2197f5nK1LRaiSgW + gQbJLBQhFt0PpnUgRUMemCNcMmMWwU4abms8TihaoREtk4MVYQmsENWaWLVeSwiy39q9iEF3CDAE + xYkU1QdsNMskG3uEfvNuJ47eg8p2G3g8tEyzn7TaEHR3o+EE3UIjfOdlR7SROxt0u9cOF8UvX8q0 + FVxChqZmlJFSw2oRRIUSK1EVoKMkPkniyVk0nceT9JQF2UuplhhRG7UUEiPhOcaOgIoD2bC6hoKo + xtKIZWhBktE6o1ZsgBR4nm6wCNI4ScMkDpNZQOpm6Saye0TklgVZMiO/cquWoH1koddrVqFSN4t/ + qDfqLY8cDnf1b/DkHsVyNp/OHJbXlghDnE6yUpqsGilJIQyXyuBBErUirEGS0cSdus8ZTAv0DEMT + 3B5ohhd2KNyggxfPw/TZo/DSZ+QKagub5T8DcDZLp1N01pu3L78xpFZS8DuX+y0cl/af8VESIoj4 + cR/Fs/sgkif20ukZlu0zRJF7JzirWyiYJ4+b72yfhun8cR/MSV5rITHA4vnnTY+ajpR8zuGtp6RR + P0ItMCSn8WiYuszDCAuwTEgTLkGqG5/H4/FojArdDyU6LsnwlZd2jNSJigrDdMMc/QW7pO6Wk/vU + g+l8sOAT5sm9OWSg0+csbnvPahf6B4TjDHWkk69WyAHeHEyKMnUm4xxVPeOwwYqgm8YV+5/bbf80 + GlEpPM2yZLiclpPsQvxBcimhIqwqyM+KXHFlLWEaCLO+5L2HYUlCYORCVYVrL69/OUFsk4cMGG7+ + hWMaIQkdAjrUeThPd4DTQ8D55o78oB1Y5CiE+KNYC8sk4m75VlTknG2WWhRrwEYR6xDjZWPAWnNM + rq/yJ4L8Zagmh6gumf5daQHklWRb5ugXoeWcgzHYs1Rq24aT814ul83HBjRex+QN3GDvdyu4+u+A + m34CTnBWYpTaDas6aK4Xu3z9jlyIpWaIG31zOXQVgjZW2MaCKzfvgJeVkmp9d/zvO3ffh7kg7gO3 + H2B7k2bnSmswNSaa62qY5xTMtbTLNVrvaIj3C123EAwE3TP2Q88J7bvHQdNyKIcJM2hUKmaxUkcr + dWu1spHZ8qi1ATZIso4tXxRKLHZdzGl8NklS9jXb1N8jd8EiquDGRHWzlALrS7UOuYZC2PCmBA27 + B2HCooEwOUlO48nEC1thJSze9nJfTfKjcy965EWPePsgzBGKepHWrgXy2JHnsSDDIQYLUlpbzZA9 + aDSsMmN37u7ydYBL5lrNVs2uigS7cy7TLPeHT7r6MnTCUKnTt6dZFAmTnRI/1d7uMS6qGnBnb1W7 + 8oH73uneC0G2b8b+1/46x96bcUsO/PbAJ88DDjPANC+HR03LaXbl3/ru05aO59Eh2ImKCs982vnW + nTAmxODJ+4+38bAS2tjhERuvMoJb4MgqV/7phanDj3+yX0W9ieNA+Ln9FRZSn3ohd+3xcHsJVYBs + mxUEVOhJ+1SZxCTuJnZqO7Dsr7+JQ4C2rk731qJUaWtm7Jn5xmG+Gffi6gpCr98+WOu3EhSFi7NM + fyhwYkkFbbT7h/4Mysi96jXr/CCWbtXzPsZERoTF8NWv91BFhjwmbn3Ntaywqq0WMFlC3N8bGY7X + GKaG2FWiJI3w2frrojfwJhe90cHVTjibPYbThT836f4JvPDr+MGgGo6DibfwDZrQWzzcv6/4Nh2Y + XIWDhcnWcGCU3vmT9+SDYGpWBaFnVLwPZDidTIyx+g/3Rie3Jge3/tQkDozCcBR4JoURLlyAca+/ + uDPKg9Fo7PvefGHShl5ojHN2N11MQ9OJ2d13Y3Zm91Ojh/nEdJnzYeCHi+BrMPQm/j38Nfl6u2kS + hCNDUPN7f2YSL/zJ0B+PTfEOxtPbWt7pw1iHnngpGM6g8a6mUeCOo7rswMd9zU2VKr7Y9maz6bJo + Sbssy7uMpt2Er21o7AX5ZT+XRGy7qyihN1Eeu1LXDP2lVETkB8qCLyfWBQpi7/SB/SYk3nPXf/iX + UcozLMAtTzLSjXi3/GHvhDdYPj672iErocrUVWKp2K0717FczuvTegtsJsVuO6z5YUkOSx5FysVs + 25yQdeDyAKbRFBWJR7rtrEMAm9uMH9Yp3a+hUMpy+eTCf308zVzCOv1bXmGCzlxDNGTkJa/v58Wq + ssP0CLd1lDwQwv3VUxAk23oxGICyeip6bkYgYIr/w84flpq+cbhlGOkurq50boF8WmaqGlVIRM2B + NWW1zKS7hDCAIvS6Swih3LbMZEjMiTLTvmb0BnV9B+iflZgaLLr4AQd9dF66Pp5lKlKC34qXvHyL + BtDtQ2eQngQxAaBLDahlJm/x0M5MBz5uZ6ZdY9LOTFLPKbp265npUDROgJr2YDS+T8BNf77DTRMs + nrigBN1leI1PZXJqUF1qVC1LtSyVF3+3LPVmOGxZ6jVLvaocJ0BVLxF9Fr7qvcdXNMIp8jKVY3Yy + bFVhuqwxtVzVclXLVRe9UctVv+znkohtdxUl9CbKY/cNVx3XjVNgqiM8H5anHLvM+udn8OPYMV3r + 5X7VLBxbkkhRzkC9k8EReODY+Tn8h+cMFgghp0BRhqV0O4wrK+NJQmKLsk7/KxdIpQQtiVQo4nlO + mKIsQeRnQWBgYxH5DTkYpYKs3I694j+V4MqW68gGI5TdqG1B3MO5Tr/ICJYEaS0C44IkVCoiEJYI + o1IS4di4jzCLEU4EIUhxxEtx5ISyFbcrkyWjamslJY1JRhmR3VTlWac/hCi1Ct3uVZXNLvrOS7Sh + WQZokCBWTAXkh8RoiaMflR+VUokKnBC0SYkgaNvslxBHBGYBvERlEWNV5YAysIIzS9Gc6IBTvIZ4 + IVt4STOIrbIJLvTBuMmerKQccio0Wtl17KIPtwEXUT1nDtxncxlSYVVKKydSVlHtQrCijEsS697E + Sa81YB3ZCvKpMahUEAwJBAyMb8BatR8cwebzs+ZVgGujsdvZGZUdxHBOjj7v7VbJg2PpNRjS78ju + tbJScAKJ6PQdWWDW7+0hOrYWHC4tVaqQX2ybAR5BGNnIf8mslt02bii6dr7iZgCjC3o0kmLHdiCr + cA0U2RQF6uwNzpAj0aVIhg/F6qrf0k/rl/SQGioqAsgATfJeXp57zuHMhApfU5jh+M6lXquwRaqX + wUuh4kvBv/6jwotIstM8goQzH1DqRFaMW63Mn836OfVh8KoH/vasDL4+fp69u8AFrK4XwKGZyKF1 + NsR247mTe2Ukpc1QUL1YaVX39vYNQ8lRGCkjAHSr5V7qeUNn8LWLDzd3dx/m1x/vpwxnbZyOa/me + R+6P69Agfiu12yB7QXVapeCHh6YCJr6jxJ3qsj5Cd9wZuoxHa9ymHRe3t+J+lMPyRvC78eOCj4vx + vp/zubyZj/0we3WbhriOD81jqYEyVf7gwgbN9/SL/cvuG+rgE6gJv1UnqqlgUAus1+itOJxfAgEX + F6uJFDXHalBR1sj9wD34WmhS50bTrP9fwerImlWXQ095MpNqTJ+0lrFZ//v3P9PmbGE4fxUVNCh4 + lHnw0Czni+t2ft0u774sFp+ul2w+/zSfN+vv81Tm6fG3VZdDTseJyVdzUiHWvyofoj5cETdknTQU + DnCrXfiJHPd8J+FcATwAK7LeHXQWKKT+Fcai9pJUCEmSyNt2ysA2LNKMlEydgvvY025cdZDkpcZG + BMP5VAwECgweGcgOQ3I8GzrZcUYN1sfki5PAjrX1krZQO59qLD3mWtsBMQY0syZCISnCJbzVMtBO + bbaRepS5gy1nRUgxa949y8EakS8dZIxQJcGHjOBeBLoi9/mKwsBzvB1pz72yCZ52cDJc0U7ykLzM + qYg7B4hiwrSXX5PyEtu2PJI18lRiMuWFAoYGUI4S5gAIcuCE7XQBSRUmFQ8zevdlq3wp8fcxSoP2 + UEChWhJPcQskBDnupA/EPfBHD/Kr4XdAAh0AkR2qCWqyaY7jsdMcaMhvkzIIDnFGj7TxNjn0b1QG + 1aMxIaqBeusFcuNUky1B7ZVIXGNblB5txs7eosWABkOA5Lx9BSHQ69LhNhMOJmVC9ByJBXHntMpt + siZQC1B1ku/pCZajIpVnsCCKwkpB6FwKkUYOqOw4ntpzwiiTiGsgRXHLI7oiY363CG04TlvnrI/l + lXwPsYt11VEndB1DAZB1F1D58RsiT/wg83Qy1Z0V0heAfzCHHIm/M1cNW6ADUmoeoOfpdBzHq9Tj + NxWj9A1ty6dF9cNpujwbyqD1sYvfpIw/R/kWHya1Xi6fGDcs65VNer1c3jIHOu4gJB8YPhlMBD6s + KJaFk2JZUSyr8izXYXZkaGeOzN0VrFJRsuDQA1YVy6JlUCyrimXfFYscM3a5XGLHpFkm35wGUxk0 + y/hUJ4Mvs4ny4DODEKtmWdEsK5plvWTqTLNIfDl/fJ50m68/KZeFyI/KxeFPzH0ua0NWLypik3pZ + PEC9eWknedUvAyk5+plCXvCgjoJmWCYUg4JPBVcFs9wOPymYnWE9Xec/7qttt20jiL77KwYKVLQY + i+JFsqRUaSE4SOCgTg3Yfi6W5MoixBu4pAX163tmSTGy47YBmtSBAZmWlsPlzJkzc2Z1DxtwBxbu + qqth2d5WsXwBEIg71XyoY+wkdcyq0hw3CBvTX1fHQCcr4dOhjlkhsQaZ33OEOoZDeBh1zCu2ZYOs + 2jrmro65q2P73hzm0DpbyTAE9STXBjZIPbiqjQDWV3KbeVvJcKOvZAGtr2QeAeC00UPf43Nby9zX + Mt7WOmU4Qy2z1DJesGbTJaxHSzNmuRSYsYU+06hlbkpGQmwtg+Z9LeNNP6is/Lmp0jdSMZi4drud + A+FpKm1rRkavo3lrFFm/RnbeOvxIzChu9MhzvKkbBEM/QL/MdF6PjmYcqlV1pzFP/BGmyg5gG2SI + IEk3beG2QyOKXj4YNSNUunkzkDjDotge13Xn5eGW9VP6g67G7T+n3JS/Ns8W0TvUuPj8NyGBnhky + ARCOelUX039CfvzqCeB/ubZAp0m+FbTrTWIgJZnk59i/5ThNDo18OW4OTX35qJ2j447BerHsnzjq + 0l88+07mZ8FkEZy1nX+JLQ99/BCCulegTHtfKIE3f53ZN1SzUE+DtV64sRuE7iR03el0PQljd7FQ + 0eTp2feDNo2hP1VWVOo5Jt8PR+9HUkocn5Zfc+71bjz/tT/9bO71yK7T1eXyn+deTNrg1ahtwzib + lQSiQQ4wCmDU0fcao88a44WuMD5ieEK+cUaindpjOCUQIInRyMWAdkW1PXFOuoaUgrmOKSvc1ZWt + dVXVSZTqsec6nuvOhv4743m+vxi5nj9y/WA+cl/SjAJkOSqOkMXMwQdkWZDlZI1mD2TljmJgoyoG + shAIPiArBizIDt2Vgz9BdxisAB4+n2GMtQ5lfOtxnj6B9LfVj75PvBj9+IKIvgf96N38TvUjmE1m + Z+6s1Yf/VT/mcaijifLP/Lm3CIKZmupppCJvHs/cua/00/pxmUQbpVP6DSc+lT+Hgjz04BtoiDe7 + 8b3X7uyxhngzchdY/1cNuaA02WpSplSVuoPc4ihCOI6mOGTUVOQR7hEOb1tcaKPuISSybDUjTvJc + V+gSYaqdk4/FDqsQIHzqjcaBt6iszgxW7eYaCmIGEKz8Xu91TOEe9poyBWtckihROV3XuNymKqOT + H68dkm+nNFjF0LK6qbQR4VIPnxnQrSPL5xjwcDTLE0VXsDSn5C0W3k/OyUVOit5bEtCmyDTBioo0 + plIXZapPxY09GV3dwytlyg4JsWpDdOj3XMM6N1BWRLxTBlFvoY6UFQZ4rCnBNadNYqhMVd3umcvG + VCC8ypBRSUyDy4re482hru4EUJWa4lECBg7CbX3oAEtyMlGic6QC2zcGTuIokCOmTGehriR21ZrU + yTqJqNaAD7N8khn4B+1vDxAG7qic4kY7D3l5Slcb561zSpe4viAVv2DhNvcZZXCbVc2pcJuF26xY + uI0LC7c5qbFsVbtNPNdKuD10V2A31hN7eEVCcQQEu0Xrh76/MpYyNl34icGhZTiHezyjGeTeaFws + w/kaDGfhNWPboT+/duyvoX/OePgT02Vz9fBZ3OdbR2584jpbrsvTwvahv3Cw7UWOyFrGszCewWUG + 77hlvFgjiD23nD9CSOza0B0G52HfcR6jjfmL+/LbbduGwvh1/BSEBwMbONuS/8T2YDcb0OaiwLAB + DZDLgRKPYq6y6JGU3dz1NXa7R+uT7DuUlNlpi9y0yNAgSCSREs85/PE758igmHm5A/NsRBMtMC8j + 8+1Xq+hzQ71k6tmtX53suOdgM/ePNge+jXjm42CaSvqGfi60mH7J9MO/hn42RDVTIv0ygH6UYwr0 + w1JHsqUfZqlKntAvm7zAZkf++YJPwFeurqaLJotCQdwdhU3/j6xUaEzbpB+suDmaEMidtooXa4Xi + XXm/6RcqJ+50+x93st1QrNj9Vjly4+bfaL/dX9WbbQj7L9H1DibTrmdMp7OnPbpubf6MS3vW5tIg + CB/7VCnW/ehRRUc/3tdZadDrVHfDZmOHwMFRd2P8UNc0TEfpPJlOx999wsw20LyeQLQDAEZS2u2o + Cqf2rceledG7iD/rcV2210jilAdjq/b+4gKKaQ589/DGujTdbmX2HS4JW6GFqTTWGJZoH8qkL4ze + 9E/Nu5zO0un8GaorPS/S+SxPikmeFos00ypL8xUlq+lcLy518unq6jU52t2La0Olfo7a6nR9bMpe + VS/W49wE4q3gXVtDlisEP56aDB0dhf6LD+//aSd3WxsMKgKtAuR7R5v+JElnw2Q2TBc3k+Sn6fxT + ldUSz5+srF5a5FtqkvFRVQH5GuCiTCjEXoF4pGPMIB94mnFiR2FrtS3tHaqm6mo91vrBk7Euu2v2 + 7AIunEG49me3F+u67BzfWU1OMbANWfH9sz8ntLJYcFVTKo9YtREC4ar7Wmik6VR7PASlfRxPqakC + VWEckFjDVaB3YfPSQnupEWaOBLSbI8HK3URCBsxAJHiacfIkEkjHg+n111bk9uR9Q4r8pEf/D0Vu + zXxmRT4T5vSxMC9ns9UkWSya47PW5tAdhk681UEF5Zrx5mStze6um9WOCu/yTZ8TMB8YbfxftY/n + Re3NGGWN8+Nmph8HHIVhtb8b6owuSS8pTalYzjNa5sss00m2WKYqXenVZ4TZije5DeFZRNmKuDYE + 6ssK8nyYzm7SKYT3XJD5uUhSPH9SkG+2qnrrY/N3b2vX5fxRr3dLAgla5LVzkK7yXmB78tp7lkLU + yaKid0Hst8oT91qxYNgbyvmud7Tu7Y/iuDX5VhxNWQKmgy0PJDyqZdqi6CYnHHlSDjNUpcWRPrz/ + W4vSYlKwYosRTgHiYFDf9GwhdtbRwyvk/Ejc2rrUAlYL7mi4asmoW0jjQqjq/mxBWwdHKt/2lBd7 + 5WLWiXazuVe930tiZwqiUhSOkKUswlEFlQfkIWGKuJZyvEggWB/QdH7/58gzVz8fqSzBPo1UPqrf + /jDqid5rK97wWO/VQZW14nQjfivQjJLr3bbTxY2rPUqsbyavNUDF3gpb4yRiwkXkaJD8gt9bkgig + fIBK/gcV5znJUMkIFSdC3hwZocId3uZ9GqAljGBJBkuaKoIlT8CS2Brgk29ja3ukwavJYJkMVist + GS/Oq4xXXC/ihS/bommLulcZMBkBk/Ci6cqQjzPqFtS4wPfvzxbuAMMHlZeMGOzGOsbLaPr0GiMN + ZpIxk4wZ25PbiJnc4ftFXJGjZFA0wCBgJgeTZQvaYJYcW3Ya1NruVv5LftX1tm1D0Wf7V3AG+tQx + +rAk24HqhxbtihUJiiZDHw1apm3OFBmQtN3s1+9QX3GQxMmQDRs8w1Iii/eK1Dk891yk/lW/vfKE + w793lHvbUA4/fm8C31ak+2cNRFchCMrA6hRauhes6NN/oKXrpjm9WoNFRAq18eLoNxP07G9s6fJA + w4H3e71+v0d6fRhw+IBpH/2icaKQXc/RJ82nj0G1F8A5P7DnOQJba1Awo7cWGuw7W9peDaZ4Ti9f + x+2wJppiKy9QkgbTKyi2RmEy5BIlg1TsJh90tV4CtfczQqEzuiQ5I2vDl+8GgcLQwTQX00vmtobn + gUC/xHCs4/qBhxPDJkUlHFQ3DrsJK8WC29oi+YTdpGlzp47Amg++uRTtUto11sOb/H5o3kz7IP7w + TTmOenXPYvW6lXlPhR5kv9+fqWppla3yswsMSEqdppDM8oZCsyhTomSS3ki22nI65yuhLI3OolGc + Tg6mgynl62T6DfGeUFU8QTwKrY8ndTyp4/MAQz1miKq+feKJ0sfHX+JPH4zxlrDygMENmjwct7Ol + DUZncRpOkrMoiUeTSYZZ/BTgCSsefP/4fhYn2TCdhWGceqs3W3EVLLgROxTYHbfBXP+YRdH4kaED + wqR7NxgEUzzaT6I6QNfD9xsA8btr3LzPZZBcirv7VYaDU/6voeq2JfwbLbcO70EDvzUzilvLFx7r + +VbIBXipCm7ojhWFULxBOHyI8HWVi3S5SJfL417lIgXzuUiT69Vop1mN9jiKx2mLdk3BcHZVCI6n + zbBR4EV19PmbRx4HXz0J/wtiT5oP2w3lkhfedFLsKwFF9lvcKwq3FLbiRqsF1Yra+uU2bMgesuG3 + L6TNdE6+almnqhy04JY0qYhWpEl1nAzP7/xx2HAhHEbjlgtLbd7EsD5znJOYZtlkNIqHI5DgaQ4c + iTl17AvJjFgCH+q9pdE7bqwAAUq+EMzD74yoyGE7DjhhXSv76aM06JLCRyjXJUV3hKSeCF3Sjg1V + 0lcTIm4IMc7CqCVEvcFTer2GwbFOF5uva+00VjBM0nE0SpKj3HhZ+EnTZK33vjagwd1ITg0rhC2p + UBTSsVWiYozzDKpe1fARJ/BZ731BqBOQOgERikAxDhMchx/uEZLQy49YgayxAqMsm2T38B9OZl+Y + 3DPlZoUBtd3swiucurgF35/H/9nwk8W/8oTB73prFJPBLo3DQI3SJA2WWykDXIbDkJ2tXSkfKsFn + CIU2t0QvW8U/J9/4jkvmq431vzOyh+GoZAJOQ7mjFAD8/WNeMBlHdUVIs+F42BHgk9GroxC3Awan + 6vteAGL8FIiXfGu0rWv/ObnWjkkoeMGk/JnsuSx0yYmeS7ETWr0WvVq+0ywJR3foabPizqF1oxe3 + bm3fxB/oV9h4aSmDMfmgyxuubM2o4yj/xUT/ZzZET7HhvdYb66V7bgRfvhbvqCrX2K2TUdLK9S+G + M0evDVNWeJk4iuljg08WN763Af+h7QYu28GQz7V2loryxhss7874Tsutf2cUL9ab3oeS/PEunlTx + pIn3RqyLP4pr79lCnEwmkwrZSZgkcdgiG51FflJHAT0Yc9I4lkIJytUftyWnJUy3pSuuOOULcF6t + aCG15aYyXWuOK4wuGlCTh6D+yX217SaOBNFn8hUtpHnbHt+xQQ5SEkU7q02iaFCeUdN0Qs80tuVu + Q7JP+w/7h/slW12+AENkZhTtCzyAL13HhU+dqtP3cJvUYATBiAUjDRipwdCArQScwWr+cYaBqdCP + Ezf2dr36xvXi2AvGdGZYsXpTOc85r/R89ng334pFL/M/EXvWFaHBGGV0yd409WO6ZiVfUZ+yopSK + +q4XUXjhIB/vmP6ZjSQ2ckL8mNzb0H///scnVzaY2OB+uk/5qsgNamOdeF6UdJ06hpS+FS9zKDZn + CRN5wwxsBrSzyF/nnpc4zf2zZo0ruWYGJLpi2Qvod70QS2pAszrnkinaGCdo05mVMa4tciX5G7w8 + aIfu6JjPmxqTcMSckFsLSgCU1KCtmcY5zJvFNejHeA7jZIR9O/Hd0Thu+zZYrLXIDHiCPrYPVp01 + 59rkRSGhSy/Fc14KbaDu7ThmxihB4RIWAFuzv+AqqtYPjlmeNSjkAGVCrhGGAAxSfoUw/bz+xECO + AiQ29sZxELTE1thQiH287i86a1pruSF3nGUcxi/Ps40o670FvCWQa/CeXFGmSFYdZ3ezXVwvc6ca + bxBFKMggisdJ5Le8cWgg2XzNuFRbJrPesfrO2rNmscrASYEtfpalNrRQYvkitDXHZc6gM+e0YKXU + XS+G3ex3XXMbxscifXoAK2U0QTTSoFmrbNGso3q0aNZT2c5OEK2X8dPmOXJDH7WaJEHsRi3n2EfC + uJfrvTVnzbHYyKUAhdIF0zBu12B0uQT3rNlG0IXK8yXFQyU3wD2+FT88Jvf2AIa0MBMyYxtBEOc3 + ou0xAvXzekrK4XjkIq2x70ajbk90bbP1elndLTlrUqvvFPa1HLevGTNVKSh4GgXOyWhaCgYOE3UM + Pog2ropuciNq8QbJMb9Pf5IWcUJSOX1A1NSRU4LIRIKyG2SraUBurRWxyL2En+I7cr1Gxm6QBJ1n + zjCHeZuXzWPOWZlXWqjeKjgVOCRMmcvh0JleXAy6T+qw6e40dZZyszuHm6WRXInuUuoo2Z10IO1B + qiR0Oqb15bBNmWoll2Lv1afsB8jBIIWHtnFGgGLLvfVwm5FVKZ4vhytjionjbLfbz/Wf/czztZOJ + rXbUilPxWggOpWByqAbwXKWhW2lWstkzocrDd3ZHd19uSBNrGzb6tdKQOhZ3Tb08n27YYRxGqOzE + Dby4Y9om5IGf7vNWe2vOmr99bVdFTV5hKwXasxaG5pXpNF0oljUTOXjHNh+I+qnGIg0WASwCWJ2K + EeuD9EauWzfuxPVHo908/uS7M1OVLyLP4PDLH19vZ/D7eEV9PxyNo9CFMzDx8L0Vi15pe7Dm16DO + ulgyUZWwcYIB/8ZVXjCY7oyCAYNaqQqK8t8IpuiiBO9LteClgLZgpeQH/kFrGaSrcPqAcOQAzvo5 + oUlV1B3BwhGEgwpCuA/WTDge180/HvtJ0NVMVw5AeJ0WHECTK+Dn6+/X8K3XTPXPgV/AGP5vIyF1 + KoVzopso7UHqACF2huPtC4IfHCC7MYSnP3y18c1lnBlyeTkUr6ZkGdsM2wkC+5lDjptnEHIxOH5E + 2mRDLJbOuYS6sT6P2bqxaXa4796EP4GZcIVTb38NJpGu/DavlVyCJx1OZ/gQcm+rllznr4SSq/s7 + qCcfwAb7aIv89T/uq623bRuMPtvA/gPLPdOSb3E0y9qKbAX2sKBI9h5QEm0zlUhBpNKmv76HpOTI + TTI0wF42IBeKl+9+OR91e5O0qwYqRSV4K0ogE1EbtqLE2MdK7GjN24NUv8QkJvO4+bINDyejjixq + LiuapT/QTQWvBLqnVFa0tZMTIKrhBzE72hok/mD+HOgg83jAuWTEqDXmOZu9EKUZt+1rj3Ou0byv + dF0LZWl2c3v7Gs09L0Su9afnhB0aGE49HngiTLMP/bMzsk7csWHsZ2mhKIELIUQfImdmMkAd/S3P + QnnZFWSng19yq1h/hWZ/B4qOayA3mOmUFpBh7Ok+NogLQhses72uKv158OPgtZ9PHI+yFMwi/Inj + jUJoALOuKm3Eie9blThnzfLOWq0oIJDlzBz1Z1boTtkd3fPKMfvgJSS/qZM5Bs7jZB3W/f/z/Icd + /E86TkOrG2asbh9POYgsGJsLiQG7C58Ip8u9pSao6QuchnwUhVYlB6Uj5gOpDijnA+1+B97SDbII + 7IYchESprA/TUB2vWmmalk4HmvYknayREwgbVZqCN4JOiWmLHY0aXWn8Pt7tTbSZLdZxspnNV4tN + kiRxkryLjLTi0PLmKAsTrS4ukmQVr14EAKXY866yZ5foFAgeIkLP5XOZrLQV4sCF3Zn3EcEuU4Kr + QhAjfKNaKsmE+vpYC1brB2HYQSjBkPMW1mKFC6fWtVSMPvjC7YKFRrqi2V/4JOEx8Y+Je0z6x5AN + sdjC4gSP8YXbRR8gsPQSPp2kTfa7NAUYt48Og3OYEqOXFcqiEJOrmz9vP96Agq6cy9HZiMU45kTz + rDCbkFIaNzIYIhU5djWg4SyNmuyn6XTyjxHnxjNnxQkW6WgA4SXhJVvG8Zd5HPslDQmA3eDeiJez + Und5JYpKFp9mStjoenG5xv69n0aUzwdvZB6GnS3P2907wDz7sHVb5W4dXy7nC75trET5XmzN113P + c9tos2vl4Wi3pstrYflONYc7rO8x3twtNy9uby5e3F5tkpf3k4utbiHGfLlcxuvFanOZrOYX819d + FqVKm6KVjX1qFhGUe1np+65u/gdau4Tv0/dVVXn531c01LT35QMavDQ1Eo1GmcvKNDp5fdonjk+P + 8KeHTigr+EGJ/b5cFxpYQWFGQ4hK9AyX3BOfVr6loWQON1z4A8QwhyeY5XkuSobkpigQvmSPtjwR + lLnFcIaWVwoVKvZV4OjQU8gx8hHVGIVl4Z4FKUdpDbKGupOgz5tkY3M6SAAyhBdWPvQ1FtQcxPtB + JZ2+58RYxXNRAdWYhqvsRhRwSBr5j0EVsHibtKAkvuPitp60934pAHfMjlqes6I35Z4DUejOQhx9 + ApyDv/ZClI5EWklnxrTfd2snoTM4LJGlA1A5Wtu80nRaoDKGMc1YXjcMDBlXsgbwbip+6ATLBaCs + Yb7PrBPgQtxHEyD+PsF9Eu6TcJ+E+yGIjwsvUdpkqbPi4Ld73bUKHPr2eO0rdG9ozAXQILWyFqTp + 8pJb4Ol+QV3tF+5oRxfxfM3iFYuXMNCYuDumWbwk75tWVsTd60mnkTvzEp1mD9edYC2IG+IWp2nk + jfovmNZ2NTRldWe5G14MO/JWCfON/bLbbduG4vi18xQH2tBeyfqyYztVNHRtgKHFilxsu6cl2iIs + kQJJxXCv9hp7vT1JD/U1q7EzuzacFGhgOIakQ1L/8/U7iiZG8HnJssSOCY+ptB9IHDPs9bXMLmZV + ZQudLXS2RvzKFmpbaGzxHbB2XEJyf7fk/guQvFzZFFHAyG0XImOaxRhohckPxClJVYEIagtuq5hR + VL6J62sr+vMjtJY3cN+aQmMKjSkIDo3pD73XykG944xItmAoryld0uCjQl60c5owYqNuWjIs0oKr + TnfNlG5LyriSvlsEeotAtYgRv1uk80C1yA8noBPMMIgVXJN4lVFbkhhZwmbcRueUHLujxBnH+Kcq + LsHMin4Ta1NFagOoDQyyYw5sG3z34oaOyLAmJuwB6zq2le6zzVTbv80DIT4OhzKEvw0jVrsL9t6D + VzA9v7fK1xRCkq5/pX63wzGHLAh2lv4e5pLVLlYTDaag2ssgiJxX2CcH4R4WAaWxxt5aXrtoWDVR + 1DPE6yzOaLNZmAbR/2BJyZIF4wmVjucOPTeYOmNv5k+uCXbFlEK+EQUjMBcibwK0ml5xq10fc2hE + 5GMIJDSY8Ag1AtubWi2S9HnGPG9F3hR+J3IHcDSMgadwtrUInVaiwVnF4hVODQ34DL2J70+s6N4U + Zb0BlUrGVwrmkjCuYCFFDnMmdfqKz1Xx5pDvy0oeuE9KHrgvQ/KRkfka4/MuKWOicea6gT8wVO/T + 97AgsRZyczHdPEPF/tO6+S4gHZtQ9braYoIYa2URVRmDx+2A2ATuJULVC2oMy0lR0KQaLeYbWFJO + keLAcLLSFxRyjLPF95nz3mRmRa9/paTUbFFmkGM1fQ0fRMrhE1EpkCRR8BZHXbiX7DM1KJAyBZ8E + XkLHYxRgka7CYFdFHdR3jhrq9pVUf/xkfvvjb83vqvNfDfq9PTRNM85I2+YWQmgqMUMTaotS41RD + IJV0cWulWhc3jrNer4dNOY1F7nCKsKVFYRtGpVzbpM4RuyBLak+Gk9nsl+bSLbLW2A2CVyQv3mCL + v50Mp65nQbO7ZMvUmEuxtqK/GF0DybJaejxjVMu+ffjt3+Zu9SqHQkrQ7YsnaRv04FhI6a3Sh5R3 + Is9RD5p01ST16zqCtQNf6GAYKgyp9Dcyl6x2sUNI5cr8oUbnRRUnETjk8OQUKglPoZCfmab5MCGa + PpkyeykEQoVSRh177X+hn+LanQqZZoTzWOVbVUdnvYZzli6x4wRNsl2aXS7hmL2scoBjHsnyjC4a + e8jiPrGiO52yWIFYAM3nciOAJkwzvgRMeJZQBSpmWBSY0k3s7GgqlxD+5IzwyZbc08smxNibjTwX + 1X4v+L9//6MrkUGnFNIyJxzpSOaQMU7r9Hwuif09ffqA2G7e8Pkk/iq53JEVvRM8ppIDjknKkOgD + UkJBNjmGMyyEIQalbS1JvIKC4j1JH7CHP6sL/Mm3u+CRAic74wXil+cFwX9kcVkAG50FwHqr9AHs + LicsOxN+9bdBZqBH4dcA8evs9LWbx0uWLFgPyQyhD33XnQ5H7tSK3i6paUg5WWE7MkWT5WTJMNyZ + 4LBmeEXuTVp8h+ZzVf0PT4E3cyTb9WwsLlCUc0NxUcVj7UCgWY4yuyP4gEXdPN2RtLmDE9lZiOtI + GT13GFwbGRMsgJopoyX2mhXEpFSo6DwTyyWWP6UlW+3vQJV81ddZlPRc2/3CfdU9J24D8Wf6V2z9 + dDdTxR+AbYqhk+aSudzMcZkAvenTjZBFUGIkjyST0L++KxtI0qF02k5I2gfb8kq70v60nwmJsJk6 + gGQUwqeqACwkg1dFspNEURJj/j7PK0Yt2t2PMMHsfbX4gH0ns0qvj2WBYYjmR6LgYPsQBXBaaodb + +Lq4deM0jhC3Eb83zn+1KzQtIrfmVDcYLilbYOUD9fSxUAxSEkYkTA6iGCbwgTOIMBC9MopBt+dQ + /KxktcTqxQCVOQhprG7+jwZbQtD+ovQgbFEKI7VysCV/E7a3WG9EYYBWwgpqzMD7t/VG5mNXNXTx + czdCiDhzEQXJbqKOsO6FCbj5x0GGbNscQ3OgOWkHwUPUDdyw6wFmIkqQajQbeL5P85NcVbOCs0Kw + uxPJrT+K0i7Sb32JniiprTQ/YWrpU20FK3ifzvTg+3s+s6u+I+WDbpC2w4j2S4slyaDdN78NNnv2 + S2UGNRJ9U82W3NKBLG++4fgWNfnWTvaSk3gvuZP09tN7cV/pfJCmadDudsKoGydJr9P7yVUxmVSG + aVHaYUZhofn8kNK31bL8H2idieUN/OX9/vcVBVrYgXearzhapnHRzvOxcKL47G79u533OEepH3SS + A94SxsFDHNTeEnsv7y0d5y2bPY/qLWGYdNpBGMTtdidJo+Co3vKWtH5Rb3lDiv5Tb2llBmM11rEg + 8oEn63xAbtXMkA3dhdnW07QzUw+Agd9i90DceE5zTlRl64WtbBENx0xwyTg4MTDXagnPeqNmE2/Y + fDPflFQ+754WIs+59Iawb9IIy4mkrr9yG2yX+Lixc/ysKjCB1qEAX47SamWF2NKyRfsxV+zvn5pz + Odm+aTTx659O2kvikMiyIve8wJzJDRHSco0MCCAtiKUFFmXEKkRQSFK5eazQw643HF1N4euGCy6f + csGk5gKr4JMSEqYGCzrATqf7x2IuK4cjpe3inhu3K1ypYm05W0jBaAFTKTBUIjrrzN90l63Mf9T8 + JdBokzllVWHXpFS4M6JgCF1RUdBZwREcYtAw6vOSanc8b3jRMKECGyY43TI53cdbpmc6ucCPl9fc + aAuxGH+ZTj5+PR9PYDq6/OX8enw5+fU4qveCdq9HcqHRdZQmhpo7atmC31NJGFqA5mSOdLZmhbJa + SbKxI+MNP2yYfoDxEy44q7kAueBsywXjxvrMHjsYr4uVoHDBc6WrOzijkuaCyqdyRhWWc1SjsUm1 + qlvVI4ETpklIVMkl0VTeEc0NtnhssTMVy2WFCG0/mrI7b/gF18M1rofrzXq42FjJu0nNAD40AzJx + LO/3oDLd2ZjrLi+LQkglDJwt0EFuFJypouA33M195rlg2GweCZI4aicEGwdhLJWWlFrNuTFoIrZW + jVinEVFzMhMK7WiJ5y0ITksq1ZKiswtaGMLlDR6Za4y83vDUmEYaXG2lwbtJLQ4mTtx7p+fPj/JA + aRg9lQfnj/L2gHk++fgn6GS/s151PY3jUPQ5/RVWVtqnlhR2hmF300gVqhikmYLamefKcdzWjBNn + bQfov99jxyltaQViFwGK7evr63M/znXS7NZYFJYP/aJSd08Z8AgyRuGiZBnoBEsIG17EWSoFBtSY + 0e6ziyyFNharXeP/7mKO1wTXxjXIcXavjCXII805qm/ewoCaefzMj5zmqCPOvivNu3x2B4Wcdift + g9k1tGkS+Lcjrg7iHvE/3TDqNrQTYeSKZOqeigKkzlRlrKaiChDHHZq+PjiEnXgUFBPSi/zYK0yX + ynkl6/Ui5y6n7kE1ugLZuffeUVXpi786WSus5CBB3150pLQjJ4wB3ac0zzXxsqP4do8j58ibguqC + zBH+ILtpU+Zcx9ntfD6F07DveAfxF3Cs0V6Q4fDiajC8+uPyyOn8yPETidqO0i0YeZ8lk3ebcv7p + y+Xg0+XVl2BKm04AuHNYizn6KfjBoc4kdcHfTg9Q1H6ZLvohEQHHLO2yIKnqFYpDDgole3hOPfbk + vsmlMGuUEHKjVVPDKfc3HYKJ41jE5FGtiwSBZClDzl2ryn38nweIaqkSyhjKosiFFHazMBaVrwQx + nq1tKXGp3VWyXYXxWUAyOsBizSUu+BX/d4VavCHbyC4TdqEF7gj9fVC9dbUWj5RtgjX37YjUSgq2 + 2dV/YITfy5T6JbgJe38a7opzmHxrLziLykWlrGA8KPjGV0iCduqt7S5zWNj3g+vypfTAzR/AovKB + 1Ja1qf/e6+4Pe3cneNrEV0WbGkHP0FsjLr1uMsbE6f2uQ7eu2dzKT4qGhW7nZDQ/8XzJeWHibDaf + E4yIH+4e8wYwBClpj0VK5a1OaI4ETERV8OcA/djNkBSVWFWrbOrFUJxce7hC/J60tfKSQSFrE29P + 8XU7919VoyGyCrT42ma75mRSCLe6i9BBmHd2PqFKmz0DT9yZUC+6qzKAjriMoqjXA/nokoBn1go0 + tuI2JpRZPDJGMdiRarZO+DNnjeVz7kYxcfwUctmEKQZPoXNoh2BAXcZEK8lHcTvlnJguBZeF4daR + bSppzqVrxUdx0PWLb56ULuJs7pWmiRfxwgLPQUvspobCdftsJe5xOopFxWRT8AFTUnJvtonJI5UN + JB9aDjWLFrU+0/RJ8mLB4EsUPGdTlJ5WzZ/fobqmcqXpI+/D2AWtREnlW3pNPWBbGy8+v0PcbMUL + FOtFwQ3jVQF28Xuj/UsYj96elzpkA2Yw4J+Y1JIyvlay4HoUz8Omxxa5bcdhnxEOJX2WvFrZ9Si+ + GA79mWneWKuq4BLT5KWA4KvAGISV7EalSbvFNTmwOHkJhjTBg6x0fkY8RgjLtCYhnpiqN1qs1tYf + GqUG8MrshYZD1Q9Ciy1bhWrw+2/nl3/+TS6G55/J1Gf4K2buoy9FRyAMAp6oJflOWSmkxCMvcDjX + hnwTuB4vzshYSjJz9hj/gNKPmGxTq7UMxndG1lTbimun88DesGKCkeObu9m4T77eTsez2z65G88m + fYLB/L5PrrUyZsaXhFYFub77Of0xmR2c174eelGa4BpZLwWYynKdAcue72EJvsKiw91LbcUxgwni + HFeqfGBQrDvZbWfrFsqXhfaOTIvaEqMZqkStpMLfxuMvWPJgksqj7bp/k4BnaiF58W+RVc+DIAxE + d38F6eDYAgYMsa2DJsZBF02cq3zYBihQhMiv905i7NRemvvIe3fv2FQ2JsxbasCZB1P560Mi4rgM + 89q62QIRMLjkuio8VfaCzGze7y7H04F4o06RiwHxnhmCIQhc51QYUsBldMzufQc94ko9ZKh0LH04 + f5r6vPDxuCRO3GrdWtD8MI8nVhtHC51v4dur04LV1qhBzQktVdVsbldqnDjb36MfRODTkEYRYaAs + qR6AwZz9i+DsbtO3BERwsZKLD9r4AAo5cQEA + headers: + cache-control: [no-cache] + connection: [keep-alive] + content-encoding: [gzip] + content-length: ['32061'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:25:15 GMT'] + expires: ['Fri, 03 Apr 2015 20:30:15 GMT'] + server: [NPG Webhosting/1.0] + set-cookie: [JSESSIONID=05E296C4097BDD877BD25063D1ABC3FF; Path=/] + vary: [Accept-Encoding] + x-varnish: ['1551401694'] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/doi2.yaml b/api/provider_registration/test_utils/vcr_cassettes/doi2.yaml new file mode 100644 index 00000000..45640277 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/doi2.yaml @@ -0,0 +1,662 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/sdf + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Fri, 03 Apr 2015 20:23:33 GMT'] + expires: ['Sat, 04 Apr 2015 20:23:33 GMT'] + location: ['https://dx.doi.org/10.1038/508312A'] + server: [Apache-Coyote/1.1] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/10.1038/508312A + response: + body: {string: !!python/unicode ' + + Handle Redirect + + http://www.nature.com/doifinder/10.1038/508312a'} + headers: + content-length: ['180'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:23:33 GMT'] + expires: ['Fri, 03 Apr 2015 21:32:15 GMT'] + location: ['http://www.nature.com/doifinder/10.1038/508312a'] + server: [Apache-Coyote/1.1] + vary: [Accept] + status: {code: 303, message: See Other} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/doifinder/10.1038/508312a + response: + body: + string: !!binary | + H4sIAAAAAAAE/wMAAAAAAAAAAAA= + headers: + connection: [keep-alive, Transfer-Encoding] + content-encoding: [gzip] + content-type: [text/html; charset=UTF-8] + date: ['Fri, 03 Apr 2015 20:23:34 GMT'] + expires: ['Thu, 01-Jan-1970 00:00:00 GMT'] + location: [/news/publishing-credit-where-credit-is-due-1.15033] + p3p: [CP="CAO DSP LAW IVA IVD HIS OUR UNR STP UNI COM"] + server: [Jetty(6.1.26)] + set-cookie: [SaneID=208.185.118.84.1428092613993639; path=/; domain=.nature.com, + JSESSIONID=14spnd1a99ehf1d45o2ew8rpvb;Path=/, 'login_encoded=null;Path=/;Expires=Thu, + 01-Jan-1970 00:00:00 GMT', JSESSIONID=14spnd1a99ehf1d45o2ew8rpvb;Path=/oa;Domain=.nature.com] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + webserver: [npgj2ee3.nature.com] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Cookie: [JSESSIONID=14spnd1a99ehf1d45o2ew8rpvb; SaneID=208.185.118.84.1428092613993639] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/news/publishing-credit-where-credit-is-due-1.15033 + response: + body: + string: !!binary | + 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 + qXkvprN0On+G6krPi3Q+y5NikqfFIs20ytJ8RclqOteLFzp5vLp6Q452d+LKUKmfo7Y6XR+bslfV + y/U4N4F4K3jX1pDlCsGPpyZDR0eh//Ljh3/awd3WBoOKQKsA+d7Rpj9J0tkwmQ3TxfUk+Wk6f6yy + WuL5k5XVK4t8S00yPqoqIF8DXJQJhdgrEI90jBHkAw8zTuwobK22pb1F1VRdrsda33sy1mV3zZ5d + wIUzCNf+7PZiXZed4zurySkGtiErfn/254RWFguuakrlEas2QiBcdbOFRppOtcdDUNrH8ZSaKlAV + xgGJNVwGeh82ryy0lxph5khAuzkSrNxNJGTACESChxknTyKBdDyYXn1tRW5P3jekyE969P9Q5NbM + Z1bkM2FOHwrzcjZbTZLFojk+a20O3WHoxFsdVFCued+crLXZ3Xaj2rfCu3zT5wTMB0Yb/1ft43lR + ezNGWeP8uBnpxwFHYVjtb4c6oxekl5SmVCznGS3zZZbpJFssU5Wu9OozwmzF29yG8CyibEVcGwL1 + ZQV5Pkxn1+kUwnsuyPxcJCmePynI11tVvfOx+buztety/qjXuyGBBC3y2jlIV3knsD157T1LIepk + UdH7IPZb5Yl7rVgw7A3lfNc7WvfuR3HcmnwrjqYsAdPBlgcSHtUybVF0kxOOPCmHEarS4kgfP/yt + RWkxKFixxRtOAeJgUN/0bCF21tH9J+T8SNzYutQCVgvuaLhqyahbSONCqOrubEFbB0cq3/aUF3vl + YtaJdrO5l73fS2JnCqJSFI6QpSzCUQWVB+QhYYq4lnK8SCBYH9B0fv/nyDNXPx+pLME+jVQ+qt/9 + MOqJ3hsr3vK73uuDKmvF6Ub8VqAZJde7aYeLa1d7lFjfTF5rgIq9FbbGScSEi8jRIPkFvzckEUB5 + D5X8DyrOc5KhkhEqToS8OTJChTt8zfs0QEsYwZIMljRVBEuegCWxNcAn38bW9kiD15PBMhmsVloy + XpxXGa+4XsQLM9uiaYu6TxkwGQGT8KLpypCPM+oW1LjA/HdnC3eAYULlJSMGu7GO8TKaPr3CmwYz + yZhJxoztyW3ETO4wfxFX5CgZFA0wCJjJwWTZgjaYJceWnQa1truVmPrNv+RXXW/bNhR9tn8FZ6BP + Ha0PS7JdqH5o0a5AkSBIMvTRoGXa5kKRAUnbTX/9DvUVF0mcDNmwwTMsJbJ4r0idw3PP1W+vPOHw + 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 + 8Sk9IvBYlYsvbM5WbjlxAQA= + headers: + cache-control: [no-cache] + connection: [keep-alive] + content-encoding: [gzip] + content-length: ['32051'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:23:34 GMT'] + expires: ['Fri, 03 Apr 2015 20:28:31 GMT'] + server: [NPG Webhosting/1.0] + set-cookie: [JSESSIONID=50FF734AD9D2FA298363D216E17A533A; Path=/] + vary: [Accept-Encoding] + x-varnish: [1488251280 1488251271] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/doi3.yaml b/api/provider_registration/test_utils/vcr_cassettes/doi3.yaml new file mode 100644 index 00000000..91e36c70 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/doi3.yaml @@ -0,0 +1,662 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/sdf + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Fri, 03 Apr 2015 20:23:32 GMT'] + expires: ['Sat, 04 Apr 2015 20:23:32 GMT'] + location: ['https://dx.doi.org/10.1038/508312A'] + server: [Apache-Coyote/1.1] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/10.1038/508312A + response: + body: {string: !!python/unicode ' + + Handle Redirect + + http://www.nature.com/doifinder/10.1038/508312a'} + headers: + content-length: ['180'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:23:32 GMT'] + expires: ['Fri, 03 Apr 2015 21:32:15 GMT'] + location: ['http://www.nature.com/doifinder/10.1038/508312a'] + server: [Apache-Coyote/1.1] + vary: [Accept] + status: {code: 303, message: See Other} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/doifinder/10.1038/508312a + response: + body: + string: !!binary | + H4sIAAAAAAAE/wMAAAAAAAAAAAA= + headers: + connection: [keep-alive, Transfer-Encoding] + content-encoding: [gzip] + content-type: [text/html; charset=UTF-8] + date: ['Fri, 03 Apr 2015 20:23:33 GMT'] + expires: ['Thu, 01-Jan-1970 00:00:00 GMT'] + location: [/news/publishing-credit-where-credit-is-due-1.15033] + p3p: [CP="CAO DSP LAW IVA IVD HIS OUR UNR STP UNI COM"] + server: [Jetty(6.1.26)] + set-cookie: [SaneID=208.185.118.111.1428092613058182; path=/; domain=.nature.com, + JSESSIONID=n9zlv6jfn3oux9fx8nfzfx9d;Path=/, 'login_encoded=null;Path=/;Expires=Thu, + 01-Jan-1970 00:00:00 GMT', JSESSIONID=n9zlv6jfn3oux9fx8nfzfx9d;Path=/oa;Domain=.nature.com] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + webserver: [npgj2ee7.nature.com] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Cookie: [JSESSIONID=n9zlv6jfn3oux9fx8nfzfx9d; SaneID=208.185.118.111.1428092613058182] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/news/publishing-credit-where-credit-is-due-1.15033 + response: + body: + string: !!binary | + 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 + qXkvprN0On+G6krPi3Q+y5NikqfFIs20ytJ8RclqOteLFzp5vLp6Q452d+LKUKmfo7Y6XR+bslfV + y/U4N4F4K3jX1pDlCsGPpyZDR0eh//Ljh3/awd3WBoOKQKsA+d7Rpj9J0tkwmQ3TxfUk+Wk6f6yy + WuL5k5XVK4t8S00yPqoqIF8DXJQJhdgrEI90jBHkAw8zTuwobK22pb1F1VRdrsda33sy1mV3zZ5d + wIUzCNf+7PZiXZed4zurySkGtiErfn/254RWFguuakrlEas2QiBcdbOFRppOtcdDUNrH8ZSaKlAV + xgGJNVwGeh82ryy0lxph5khAuzkSrNxNJGTACESChxknTyKBdDyYXn1tRW5P3jekyE969P9Q5NbM + Z1bkM2FOHwrzcjZbTZLFojk+a20O3WHoxFsdVFCued+crLXZ3Xaj2rfCu3zT5wTMB0Yb/1ft43lR + ezNGWeP8uBnpxwFHYVjtb4c6oxekl5SmVCznGS3zZZbpJFssU5Wu9OozwmzF29yG8CyibEVcGwL1 + ZQV5Pkxn1+kUwnsuyPxcJCmePynI11tVvfOx+buztety/qjXuyGBBC3y2jlIV3knsD157T1LIepk + UdH7IPZb5Yl7rVgw7A3lfNc7WvfuR3HcmnwrjqYsAdPBlgcSHtUybVF0kxOOPCmHEarS4kgfP/yt + RWkxKFixxRtOAeJgUN/0bCF21tH9J+T8SNzYutQCVgvuaLhqyahbSONCqOrubEFbB0cq3/aUF3vl + YtaJdrO5l73fS2JnCqJSFI6QpSzCUQWVB+QhYYq4lnK8SCBYH9B0fv/nyDNXPx+pLME+jVQ+qt/9 + MOqJ3hsr3vK73uuDKmvF6Ub8VqAZJde7aYeLa1d7lFjfTF5rgIq9FbbGScSEi8jRIPkFvzckEUB5 + D5X8DyrOc5KhkhEqToS8OTJChTt8zfs0QEsYwZIMljRVBEuegCWxNcAn38bW9kiD15PBMhmsVloy + XpxXGa+4XsQLM9uiaYu6TxkwGQGT8KLpypCPM+oW1LjA/HdnC3eAYULlJSMGu7GO8TKaPr3CmwYz + yZhJxoztyW3ETO4wfxFX5CgZFA0wCJjJwWTZgjaYJceWnQa1truVmPrNv+RXXW/bNhR9tn8FZ6BP + Ha0PS7JdqH5o0a5AkSBIMvTRoGXa5kKRAUnbTX/9DvUVF0mcDNmwwTMsJbJ4r0idw3PP1W+vPOHw + 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 + 8Sk9IvBYlYsvbM5WbjlxAQA= + headers: + cache-control: [no-cache] + connection: [keep-alive] + content-encoding: [gzip] + content-length: ['32051'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:23:33 GMT'] + expires: ['Fri, 03 Apr 2015 20:28:31 GMT'] + server: [NPG Webhosting/1.0] + set-cookie: [JSESSIONID=50FF734AD9D2FA298363D216E17A533A; Path=/] + vary: [Accept-Encoding] + x-varnish: [1488251276 1488251271] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/doi4.yaml b/api/provider_registration/test_utils/vcr_cassettes/doi4.yaml new file mode 100644 index 00000000..b69f9830 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/doi4.yaml @@ -0,0 +1,662 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/sdf + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Fri, 03 Apr 2015 20:23:31 GMT'] + expires: ['Sat, 04 Apr 2015 20:23:31 GMT'] + location: ['https://dx.doi.org/10.1038/508312A'] + server: [Apache-Coyote/1.1] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://dx.doi.org:443/10.1038/508312A + response: + body: {string: !!python/unicode ' + + Handle Redirect + + http://www.nature.com/doifinder/10.1038/508312a'} + headers: + content-length: ['180'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:23:31 GMT'] + expires: ['Fri, 03 Apr 2015 21:32:15 GMT'] + location: ['http://www.nature.com/doifinder/10.1038/508312a'] + server: [Apache-Coyote/1.1] + vary: [Accept] + status: {code: 303, message: See Other} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/doifinder/10.1038/508312a + response: + body: + string: !!binary | + H4sIAAAAAAAE/wMAAAAAAAAAAAA= + headers: + connection: [keep-alive, Transfer-Encoding] + content-encoding: [gzip] + content-type: [text/html; charset=UTF-8] + date: ['Fri, 03 Apr 2015 20:23:32 GMT'] + expires: ['Thu, 01-Jan-1970 00:00:00 GMT'] + location: [/news/publishing-credit-where-credit-is-due-1.15033] + p3p: [CP="CAO DSP LAW IVA IVD HIS OUR UNR STP UNI COM"] + server: [Jetty(6.1.26)] + set-cookie: [SaneID=208.185.118.111.1428092612128280; path=/; domain=.nature.com, + JSESSIONID=2xu3tyiyvhjhjpl8qvj98syy;Path=/, 'login_encoded=null;Path=/;Expires=Thu, + 01-Jan-1970 00:00:00 GMT', JSESSIONID=2xu3tyiyvhjhjpl8qvj98syy;Path=/oa;Domain=.nature.com] + transfer-encoding: [chunked] + vary: [Accept-Encoding] + webserver: [npgj2ee6.nature.com] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + Cookie: [JSESSIONID=2xu3tyiyvhjhjpl8qvj98syy; SaneID=208.185.118.111.1428092612128280] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.nature.com/news/publishing-credit-where-credit-is-due-1.15033 + response: + body: + string: !!binary | + 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 + qXkvprN0On+G6krPi3Q+y5NikqfFIs20ytJ8RclqOteLFzp5vLp6Q452d+LKUKmfo7Y6XR+bslfV + y/U4N4F4K3jX1pDlCsGPpyZDR0eh//Ljh3/awd3WBoOKQKsA+d7Rpj9J0tkwmQ3TxfUk+Wk6f6yy + WuL5k5XVK4t8S00yPqoqIF8DXJQJhdgrEI90jBHkAw8zTuwobK22pb1F1VRdrsda33sy1mV3zZ5d + wIUzCNf+7PZiXZed4zurySkGtiErfn/254RWFguuakrlEas2QiBcdbOFRppOtcdDUNrH8ZSaKlAV + xgGJNVwGeh82ryy0lxph5khAuzkSrNxNJGTACESChxknTyKBdDyYXn1tRW5P3jekyE969P9Q5NbM + Z1bkM2FOHwrzcjZbTZLFojk+a20O3WHoxFsdVFCued+crLXZ3Xaj2rfCu3zT5wTMB0Yb/1ft43lR + ezNGWeP8uBnpxwFHYVjtb4c6oxekl5SmVCznGS3zZZbpJFssU5Wu9OozwmzF29yG8CyibEVcGwL1 + ZQV5Pkxn1+kUwnsuyPxcJCmePynI11tVvfOx+buztety/qjXuyGBBC3y2jlIV3knsD157T1LIepk + UdH7IPZb5Yl7rVgw7A3lfNc7WvfuR3HcmnwrjqYsAdPBlgcSHtUybVF0kxOOPCmHEarS4kgfP/yt + RWkxKFixxRtOAeJgUN/0bCF21tH9J+T8SNzYutQCVgvuaLhqyahbSONCqOrubEFbB0cq3/aUF3vl + YtaJdrO5l73fS2JnCqJSFI6QpSzCUQWVB+QhYYq4lnK8SCBYH9B0fv/nyDNXPx+pLME+jVQ+qt/9 + MOqJ3hsr3vK73uuDKmvF6Ub8VqAZJde7aYeLa1d7lFjfTF5rgIq9FbbGScSEi8jRIPkFvzckEUB5 + D5X8DyrOc5KhkhEqToS8OTJChTt8zfs0QEsYwZIMljRVBEuegCWxNcAn38bW9kiD15PBMhmsVloy + XpxXGa+4XsQLM9uiaYu6TxkwGQGT8KLpypCPM+oW1LjA/HdnC3eAYULlJSMGu7GO8TKaPr3CmwYz + yZhJxoztyW3ETO4wfxFX5CgZFA0wCJjJwWTZgjaYJceWnQa1truVmPrNv+RXXW/bNhR9tn8FZ6BP + Ha0PS7JdqH5o0a5AkSBIMvTRoGXa5kKRAUnbTX/9DvUVF0mcDNmwwTMsJbJ4r0idw3PP1W+vPOHw + 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 + 8Sk9IvBYlYsvbM5WbjlxAQA= + headers: + cache-control: [no-cache] + connection: [keep-alive] + content-encoding: [gzip] + content-length: ['32051'] + content-type: [text/html;charset=utf-8] + date: ['Fri, 03 Apr 2015 20:23:32 GMT'] + expires: ['Fri, 03 Apr 2015 20:28:31 GMT'] + server: [NPG Webhosting/1.0] + set-cookie: [JSESSIONID=50FF734AD9D2FA298363D216E17A533A; Path=/] + vary: [Accept-Encoding] + x-varnish: [1488251274 1488251271] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery.yaml b/api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery.yaml new file mode 100644 index 00000000..c884354e --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery.yaml @@ -0,0 +1,471 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://wwe.com/?verb=ListSets + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Mon, 30 Mar 2015 14:03:44 GMT'] + location: ['http://www.wwe.com/?verb=ListSets'] + server: [squid/2.5.STABLE12] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.wwe.com/?verb=ListSets + response: + body: + string: !!binary | + H4sIAAAAAAAAAO296XLjRtIo+r8j5h3KnDhWdwzBBVxEqi35amtJtrYR2d32TE8wQLJIogUCHAAU + RXsc8b3D/XPOz/MC9wXuv3Pf5HuSm5lV2AHuavcsDqtJAlVZVVlZuVVWFvvum77Vc+cTzkbu2Dh6 + 9d03ivJXfcCuzlmD/e3oO3zKeobmOIc501I+O0znjRwzNHN4mONmjj2PDdM5GHQPcyPXnRwUi9Zw + UhjzoukUB90/5o6+++av3Ozrg78pSgD99dDl2ETzzT++eX11/gYagjcpra3XkqJEWxtxrQ8fY+5q + rDfSbIe7h7mpO1BgBEV4YejmIxvZfHCYKw60J71nmQX4J8dsbhzmnJFlu72py/B5qAK97GmmZeo9 + zch5AEQJV3cNftQecXY3GOg9XTNYS4fBWgPmwsOPH8/Ze1N/4tAX9g/8WehZ4++Koprs6sS2Jtx2 + 54c5a3iAc5Nj0AOXm9D7Ge86AE80liyN7zqmNg5XgUZSiw+6B9pk0tH7obJqs1av12vlyn6jXC3X + cn41hHmYc2e663L7oKfZ4VrOdDzW7HnH0Owh7+hjbcizaorO+zX/r9ksVDQyFAEmKIqT7sCsO7xX + gFqIt+Kg6LhzgztACp1y/blZnEy7ht4rwvtOnw+0qeEWPk+GqcP3ekTtHDh2b9W2ZMWOAxTFl7cY + Hb9obab33VGovWqltqTGiOvDkRuqUtlPqTKajrumphurDoVPOq6NC8YcroM6mJ2pHW8E2pjNZn4b + uWyMb1IXVwKukVDFlRZZBnH1udOz9Ymr48oOr5Q8QbB5zxqa+i+8zwzgIdxmusmGhtWFlpwJsAVH + gQoATdPNMXzLswHX3KkNeKT6U9PWnzQDqrem0KjjAu/xekeFdLNnTBHt7AdrZLJTbmp59qCZ/Tm7 + s13LzDMc3YPVe4Rv0FGDs0sGr+nxe7OPTT9yO880h824YeAnDvsMmnWo4DUfwsQ6hUy62gyd6bD+ + jdB59CqCgWGMP4+sMZ8Q44qhHcYfZpnlklrd368ni00nfc3lEZ5cKtdKlUoJy8ZJ2WvugFavM+L9 + jqtHuD/WVkoVpVJql6oH1fpBuanAl1IpZZE92Z64gS4MLTvUwGqlvVGlFtamLkjUUNeOp44LhNBy + dW4b3I7RFsgmgyu6OzW5o8CPUEX4pej9w1qtvN9s7DebMG9AuIYO/VAAe9rhj6cn+uPD5aNTvYJ3 + UBoE0xQp6zDJbTJIGmod4JMDfTKyzLg8zVhTWEnvJ6v4PV1UUbam9ddsK1Jh9ZaGljU0+MTQ5mu1 + l1oN0EjonCa4roDxb8Qf4gv6SeczHEJYh0Ppf9jnoHByhX7koYe6C4xXcUCl5IflQinPxtqzPp6O + w4+mDrfpt9aFR6YV0kpxKcJk8We32HMcT4UlMT/i3PXV1KdiuVaoFGoo6JWeZcMawOJj3tc1WFmG + sS3Mse70dg0TkDTkrlN7Ibj1F4JbfSG46gvBLb8Q3Eo6XMETwpA/a7Ce6GmOgUaeRq7lAliFR98V + RbFNoahbQ5FD2wBOisKLVpFTBMQUx1Z/ipo5vCFVHDtb/Ey/L7gFrX1vjsvq8+RFGx1ZM9eaaW5v + VAy+KoIhb9cFtER6fdMpDPXhXKNu/NAqOhYqncD/Ebg20R/5/LDSaeinlV9+uPvlsTSrq61ni/+l + cdqoHltTrfbjg9pT7LO/3D6dVk/qjV9+Orm2rZ/6d9rjyfyXP3cfW4MfLy6+1caTt5t1dQFu5LwX + vU9DE+YT4ahjcndm2Y9UUn7vDKbGFlhL6crnv085WNtCUyzaKIx7vDjV8f8xCJKBzvuyUGGqF7DU + RO+B/CrA252QkFACXG0I8gilmEMzCb+RVIcTd61VIdxCxSI6gL756+nZcfv4r8UiuXNePWk2A1ye + Tm0wU902qLaHJp+xMxjS672QalsuHZQqB2V1780rCehvfwO4O+pB52lmwUrs88PXg6nZQzXm9Ztf + /0DvtF7PmppuB/XRcrVRzv/hlcNd0GuHTse1QK3VzB4/VEulErwx9K6NjpLQixq9AMHe4c866sPD + jpi6w4FmOBzeFYvs7I7d3rXZ+dlVm52cX999ZO3Lqxa7vro9/8OrgSzZP+xbPdJy39octCPz1xSo + B6EBiFIspdTb3/KJrqbUTJSBegMgQGcULqwPXn8zePPr4NC1p/wt4eywX4DFc25w7O3J/Kr/eq/z + pDsda+J2Jpo76ox0UBn33ryFutobrTDRcPpvYQYKNh9bT/x0pBt9ePX2N69F3k/p4AAHYmmhV9qb + X7EHXehBzwYlkstOvN4TtABtdgtI7hp8ErXsxahlD17opsntNjyH76Dp27ZlH4Za9+mlIPr2Gvr5 + Njxk52Te1oa3oCC+3kMn5d6bv5b+VgANG3RIMbQuVMmjUhgeVUBYsBDsQ/iJK8Kauoi+eJN7+SQd + vnnrjnSngCh5vVcsggpaALRPNUO6FQH/+hj4sE3r+XNhMpp8rx3u/Skg8j/tfTuFB9zEtt4/XJ1a + 4wlgABDYL7x/uH4D7214fwOTWIAm+9b49Zs3/qTHUY7qw96bfPdwr2v1579aE62nu/ODEvtGH6PS + rAEtg2FH5ocxGWmvZYnD0ptwka7Wexza0MP+gQmdCb/6bS8/OlyK+rdaAZB17Lq23p0ia9H7e/kM + kowXRSKBwp5mJIm2QGNroWr0JvwDNSEknMPuWw6LlmmRWfcwhCWQ2oEM3rwdRYoAzUvijlIDrIS3 + vyGuiRJilBJQB5IUkOMfXv3h1a45ZYgcQzQrp15yphgF5CRY7JBcll7B1Bnzy+Oc/eGVRivVr2JY + PQ1bLUxsy7V6lvGnHNC4adZK9bnd1Yb2sNAzrGl/YIMlVgDxXETPhiOH7hRLJbVarKuNOsrInKDh + gWFZ9mtf5rzBfuEoX78pVuol/O8NdURz5mZPcDitkI474BUhPqabIDvdEz4ABe+1lu+++S3Pym/e + 7npSXHvOfn3FaKfh4r59DCYqdEIbO+ww5dk//sH++re3GcV/zYF5D+JB7+cOmO/qybMcYpE8QfDY + 9xflAYr4LwfaB21JwGss3gejGb+XqO4Ipkr+Cmo4oHZ6xbn5hF9hTvtTIip8SOj2gQTQAxATW6c9 + Ca3vGJYrINATrY9VHN7T+j6AJ1jblv+rb/MhtnPAZjpwsFlAWCPLcbGx396+gpZAMF+R2e5yBpjC + BTmdMLDODXiJu1wJLAoyYYeHMNXU1VAJWplyYG9wDpA/pBfyyvyGrrfeiL3mb2iSsU2cCGvwumeZ + DnB9YJPQ2B5wRg5ygQO3Y78y+Q6GNXy9d47CC/0tkmUwaomJ/gIzi5QGAcJ+e/Xbron0859JV4Ua + wOZen9nTCdgZHgvLA+F1NYffw3LMHeQ+FXP5HDLke7A39Wd4Ar8/9zRg/w43cge/5rTP2rNf2H/z + qYjPPxXRH+PkfsvnQsp8Z8itjqk9YW34Ct9I3Nk6dwDI+1ae3T/k2TF8frjKs4v38P0a/s7g7w7+ + 4NnxBfxhmRv4+wh/WOYveXYCdU5O4O9n+DuHP3z2A/xBuROoe/Jn+DuGP6hzAvU/AJyTW/jDz3fw + B7B/vMyzUyh/+gG+A5xTeN6Gtk+hD6cA40d8B+VP8RnAOIU6l/gJME+xPLR59iP8QbtnUPYM6pyf + 5lkL4F1A++dQ9hz6dt7Os3dQ7h28fwdl3wGcd/DuAtq7h78L6OcF1L+AshfQpwvEBb6HflxA2xf3 + AjcXAOcCxnAB7V9A+5fw+xJ+XwLsS3h/BTi5gvJXUO8HgPcj9O9HgPkjjhXg/QTlfoTxXEN719DH + ayh/Dc+vAc411L+B/t1AmRsocwNt3ACcG3h3A326gfHcQNkbKPczPvsJxgBt3EB7N9CHG4B1A23d + QJs38PwW2riF+reAj1t4dgt9uIX3twD7Ftq5h/f38P0exnEPz++h7H1b0MMD/H6AMg/Q1gP0owXt + XyNeoc0bxBnA/wC/T6DOx5agnxbUbUE/HvA7loV3LYDfgvG0oO0W0EoLYP4F2m1BmXP4+xHKt6C9 + FsxJC/rYgnbb0F4bfrfhdxtgtAFGG+q1AX4byrah7TbAfw/P3wOs99D/91D2A/T1A9T/cCto+Rz6 + /Bco+xecK2j7B5xbqHMFz67O5TLBZdHn3ekwdyAsjRyoYUYHt/EOpFX/qfiJvCKgqTiorjgTyyXn + ep6kQwc3Pw4CmSEeih2og9ylLzPoOTYXLy/ES0i65BKVoa/S4kYAIC5AceQdaaASL5g5n4qewfqp + eC9KtGSBvF9FIykTGh6Nzrd0u9pYtkNW76ciSgvHtUlCfCpKKJ+KwG9B0uQATIdEWAhTIHymNkcN + xN+EyOeAv+peq5+K5O/GRkABmRX61vf4edU/lJp4gUqLWqBwLa0W7mNB1IHKUBqxSErWkg5+KsI/ + oEr2YGSyD9TapNf57FjmBFSmSW4dwoDp0uxH0NE7yNzj2CY9rVYviCISQ7I8Bi088jkUR/sF6VPS + E8CAYfw1gBLydpHYSH+h2QWMO4m+l+/sT8Wqfnye+xt219SMuav3HBITWgcKQRkgl55rAHKhP44L + 3ch/5uYjaHf53rTL84DvPJDE8zzftye9PkyP4+M0787t/OPc5Xkabh4eTcCkyAPa87yn5jUQVPlQ + S7hjgMvion2j3J5d39x+iLw29Cfuv7//yw+t5jvxHmbTMvsghzk3o6Vu2/WHs3pKqXBTN/Xr+p/V + nL+8OmDUaTpCEoNO0Erepm9jAyxpuWry8EBWpxLed6/G37UUMF3upjxGynG4ZvdGOA/im+wS9QZ/ + h8vizo31xO1OX9eA8rGS/+g/Yv4/Yv7fS8wT3yUFechbLlguuB4+E0t7+iT3Nz5FN1sOyvm0d2rG + u9DGCL4l9/Un9F9/8hzYVO6Tv70BSrp4JDY4VqgVbEp8St2gIBCB/IluOHwq/tD69EJbDtTwp+Li + 3ksEfSr6X+QewqfoJsKntF2ERS1E9gU+eRsDn4pTXfx5ewOfFm0O+LjzBWWqs/8TevvFzEl/P9Yr + 0b9l+rdC/6rw72+//baZY2PpZowvkunXZ0d3OiMKIIhvQMi4Uy/s9G9H35FLLr6recQKQ1vr66DY + gJ0sPY8MfYpg934nouZiEa1FGWSKDkwvdJXCWMnLBHVdBaTOkPcVsLFNS3F0UKUxPgFVFsW0+jz4 + poS+St2X0Q/spuIpv2xiKH3QhZjNQedi1KnDXOADVUTEIAN16HVxUBxNig7oI0W1VFaLpQp9liol + FdUGfNGxtRlG+r15iza6Ph56EPu6g2EeYvzeXKwdOgiYZxdEQaytDdkNTNmQ24xw500Pwz2eDugg + ep8dsr29t8ETDOe51uZQ41C6pkJODihz7FEAejpijg5ynoQhh8ujI+/iWO+/Jl9LanuR4g53T0Ab + OYP3r+NlCcRvYbI2rWBs3+kDWxtzicDokhoLdJC7HZgUEs73ev8wpOExEfl5CGuLicAR/BabIqLQ + J93Ru7qBDvSR3u9zE1eAaBvpNOhSCO+Bp3aW7+edvJHX3/w6+6vxt0P85x//AJTjl8Jk6oxe/7o3 + dMcFjK5x94AqUnyief4ES+eAyn129n4Tnv9BlgPeQT9unn1O7Aw4b/J949D45nDPx/He93vfGod7 + fzIOgD4+h/2tn8kLzPYWoFb0BzG79yf9T33j7SDTFfs5P0An15vXwveX97zLeW+DKL8Xn/69fEBl + QApRtsPOzX7GAmA7435ORwjTPo8xPqC+vv7EYOC5mY3bCBhlh+TuPxb8MuexLo/9ARAs4TE0KqTQ + thfrDQiGGN398e05E6Yrhok4HbVUwrH58GPv/IYmmomcz+RKqESOIVKViQWDBqIkUqcnY3M67nL7 + MPf+9kw+QuCqCGMM9ZQgUj9jL2T0VXRcqK84+tCEGoplK58tsCF8pMkyGOg/H1tTx8OcJkNdQpHV + MRNlqfUuzHFufwskN9Ps/nvbSIlMLPrIoo4xF8PrgROAqWbAHPwAD78rarJXDozcKw6913FSj4pA + CfB8dx2nuVq11xKziY5fWxiRJ7v+XRF6m8D51B2hc6JHobCy+ySaaEloRV0qcMDVFOlxKUxMIXJ8 + 8vYmmRvQLRCrfCZoLZcsIxmpgs59LAhksgNsyZ7l0lrJHX0U/UI8+EiI9ko4arbvT4r3Z9U5lL4i + nDP4jPfVnzvxRXyk/IucopjFKl4lFrChOBw3IFzLznntBdxm6pKQ6wBXnnbKzWaE3cRfpvCbcJEE + wykvZjgIcW2GMzUYRdF5b1wD5YXieStFKF34SXSyYWpi7pJcAEmDwn/3fnaHsEYQY38/wujUW1GL + Ji3UMRy30retCYg3U3HGIFqQp7P4IhQxtlzw+wD95Z5ldAbGHN2O9VK9FkF//GUK+kNF1mX3BHEb + fg9Nr4Bcn111wTCD2fhIm2y31oxYVrx61LOVOzqZztPL4qKFYkZ/Boq7C0tgWOhNHWB0xoTWHIjn + omY6M247xcduH3QY3QDBD0pFsVyvF4EX4tdmOXd0Sm6rOTt+giKa0Pmi7YV6lTu64C67Ad2GXZkD + K1YOW8+FqYVdwpPQOg+j7wmWZbAgfRi4WwsGwTPYA2Nuo4oCOETH8mHuXDxkD+KphGMLMg0Yum9V + EDVK6vDMCnH+Qa13yqXScxk+JVCC2Tk7bp971kbQ7Qzuk0a7ryTbYq98LmbotF6TPBd94FMTsJ1J + LAGlyZIZ6/PUey/6nNoiMvmRNfGZsmUW+xzU2j4wbg56OIaG4kEdR0Hmgd+K0vwq4q6I0oJ5+X7q + jjuONbV7/BBmmWIi8RHG4k7Hh2eWCz3xn3oh6m1r8j/U0q32FLyBLxrIcwQCrwD0JHPs2OnEsFkY + I4AAhLB47JrY7g/JpIz2ZMEMTB+Lt5G2fOmmOThee06y4Ci0fGidghLlU/IHHeydezKscbV8DAp4 + aob/JIMje+9DPSlOjcUEmybr1pWX0kXetZ5B4qoRdh19lcKsgwIJXq0uU83V9Vm1bk6mYXPI79Hf + SWJK6lbwFT0APdHCXRMw+GAixtqzwc0hmshltDRIrrbEhkChkJMHMtBSCo17oHOjL1wV3uz/MaBk + f/oFmNxyFpPE9rrzRZsrNOHA+SLTFXmTMlv++8RkVZZNVnkrucodXem5EuNN+o/0nrjag9pkLiw6 + ZBV0bfmovqQfIf1TigrNcL2XgRkgLNMiFiuVSw3PCBBSLr7cheYjjCPUqmV/EuWgpyTTgoPgMyfM + HeTLsBKGvNYh4ggbYuEGySxHYyxTF1tHC5tOOiasgk6zGiWR0PM01Ve8XVfrRWDbkAcsBoasFsuO + qlEUzUZ4Ihw1EA899K/Ep3hShEqvYgBTW7etmURUrLDBB9incMMUYxaf1KKtwcMHbSbWedAh34TD + LZOjG8tkjeJ+z00r4utdUOh96zhQw+Vg5EdCu8J+2nTKO71XUX0JnuN2AbfHmv2IOlK11Cg3O4g3 + tNU6t3z2cPwxvB4iRtqO0QZ6W+8RaRhWAn49g6+LUdgeTW2nsBoWW/PBfBv0hXq3AhIrnfb5zf01 + 6JWdcrX+3FA7WK6DvKLTOlsNo2PQzTri3NQsyvEk70jXKojqxZlIZHR4hhFoMc98nOZFseCUI549 + BO2OvLH46mdr2p52OfvIu7pj9UNKd9dyXWusUKdADVYGluXiAqIuoA0ollx4DmzeVzTbxgn/1tb+ + PrXe+ujXgmGvbPvHeJaneMcYnjQyUmY75rIRBlKcMXr7ZXwyxJC+TrWqNqIsMrVECrOMlVtXpgqw + W1qrStlzt4ZfQG+UsDs3IorRA6/wCc2+X0p0C2lPKEFAVezeFiaCfGmSIrCvVhvNupriIhOAyfuv + iCUsg22/m0SLjIAec0f7EUoSb8a6OQVzJXd0UCmlrXlZitt6X+dgSt/fZJfCwPZfcGPq6Lztk8kk + 5pdKGwHtjilRb3jMORo4wyKWfYR3hPw1gnE0S2qnWmk8q9V6BzhvB7mw0wEkI44jekma62yTSQQp + 1Nfm7BaZHvuo2SkTWdl+Ihv/OlO0X6r4UySmR6CQMAgIfJFZQq5MDhsSQMkpqm4/Rc1/nSlCHcab + Ih9r6goTs8LUkA6qcLHHmJinmKsqOk/VakUNRrnKTEWLTSZPSm/Ee4+h9zFx5u8LtKZIk6GBLZr6 + 44ldUOuRmfXbUlDjdkfhPSAJih6surDTq69ORzFaiv9YRloZNCWOMCc9j1H6mtjWEA8yAD5w7zTw + JXo0FvYlpqh22bscrxKSWtH6fdcgBSui8ekmxnx4bmavK1kqoOeGDcp5huDUwPQQ4qls5cPV+Uf2 + 7v31NWudXp6fvb8+z9Lf/s//m1TdFiprmXrU2u4M9FeIDZ/yfrMadWhE36W5NPwSBEgBTJeZt49W + Suhk1SXbN9jI2irZiibrPfTontsKTmi26RpS6hJWnjXXDBs6HqKOYO+QA+8q1+ulRgXVswcsC7wK + C8dc+gIYLJEBsDtDM7OAqfVGs7xf3xfu/3eycDow2rFA37OuZXatrAKTrDLXmiiooI5AqBrCHvso + qt9g9VT4qXsHUfjQ0apaLwGDCfPprKFPtDkGRGWOvNRsNParYuT3omwqqDHwtLlugkHWJY9z+tCr + +w21sd8gvwCf42EqtOBOoEZW/7qaC4BEvFZmJ8uVcqNeF508CVVIBYo5+MAoNLRxVi/LlZJaqqoo + YLBoC4qmQjJx0qxBb6SNJ7CosiakXKs0yyqOWiigYKueelVS4Y64AQtZ63HM/5EBcr9eKqFGdIlJ + dgCPGjuFbxkDtp/0J8t2OAVwZ1JlSVURYksWZy0qnzUxrtHLBFWp1ss1OR/t69MD1sY0PGCvXwPn + 59IYBxzo8LVQKNDPlos/I/byQrmxZHNSdjTUxYw9EW/X8v7+g8MsMyxaVjfxVxATKdx9CwFRqe2X + 61kSgl5uLyJqi0WEaGVXMiLm+6N/72x9COvA2EhGhDmxYnMMUsvmH/v7zVIzyn7ZA9VJJf9eYKVk + QcSsoE2xAnztPGspmehoTl9KlWqtqjYbcuP5p3YWCMd3dGVAataaJeCSAlDgFsvYqI8rjrY2UyY2 + JyOA9lBRDtAhHmWiOc7yVeajBURTmfzGvlfl9+iCKrpw4oEA0eakczqQT8qYbF+F2L0yQ/fBgllX + 1RxltY37HFKhGyIZGpooTrb2AWCJ1+PUyfRpe+wSq8SAUjUZ5K2MNFCDrYEy0MbZoEug42OgBIK+ + RN8mCKd32jhTU1LUahasfTAYGqrsplrNhEAZ6BZIIrW+rzbqZQnowSvNsgDiXh7ZQ9mDrJVqNbkY + b6A0O8fiuxY1luRWq4ucsBUT8LoXEjq+xHgV90dnxK0s3xT0tvvSdgVD/EhsDQYPwrsOoWKRTcII + g/pCO4VoRmuU/cXpNKuViHSNvUsRrqESQrqW1w3aQriLxGmG5PRxFZGdx0F3wtJzlR3IlO2txVuI + wXRKo9sphrBRpJjSMecusW1/yhXbAuEMolkfmo4CKiC9hgYAZZoObF2DCvovmg0vMCJEgWaVJz4M + 7KpT3PlBwOwBQYHERlCkTd4jBKYB5yUIIgoF1E+HfQAIDsjksd6Df02MEdseiuAlIeTMRniqoFQt + qjVypbBy+aBUYmhIJBYdlLVhHn2weXb7YZUtyLXQjnh1FJRmXbATNMUF5cZJoHiME61NLEN3QDuE + wSmU0T2B7yClJ4q6E4TI2ggxgaybAGI60rcElYX5WrGkCsyXCPOTBZgPAcZTkTvH/eYkPxnphtbn + RsYU+Es/SboeWjNo+F4Chga07HnZNfwFk7UvJ6t6UFk8WWHIeB41e3N12Sz5TBwznSiYbDO0xeuP + PMzXt5LNgVROETQvs8UbEv/NaqZDEV6tayxuINt2505scYNHQyFo3tY0EpcZTFW1WqmhUynLWAqB + KBJ3zQBUa1RqtRpYBcTlsmEscyOplEUL8ZjpPQqAofJvDRap/uVaudSsLtf8A5jAqzRjOjb1LIxV + 62p5X5qYx1RyAbAeLrkF0HC4agn3ZT+eflwKjq8ArlErVfZzR+dZ4OT2w8SagX4Ly/MRkyplg1Ob + KvoI77E4psim4pkGGTIvzeYggOcmRhKkQm1Ua6VypQRDxuLsGP5AKFKU/Perbkck1/wWbqZmNdPJ + BK+2dzEtDafbnYPpnVD6+9HgudDa3ox7FLu21XtUQLSY2Y4BsD8bFXSWnWBhsOGxcDYxU4LRRSZ7 + ownLooWlsoGEVY1sWPX6Pp4UCYv3bJCfrRHILDNrY6PSrKHV7ieOX8Iui6TyZHZNVdV6E7pG+kU2 + qKmfcz6zV9UK8KQgN/0ClGGeewvT3GfAqper1Rr5jvyE+AsGqZk6N7r2XMsCV67BTNbxFogzKstO + sHA2RFN/fNRJfc/iH7XGfq1Zwo0GKCmU6WxwXVvnC6GVqmXoH1KtzsPA1mRC9a2ZUC2bCaUdnFqT + CS2Jz8c2dsWEfMk90icRRnSp4ymV+XpcyJcuNH0jAUKkFiHrYcS1p/mMTsUrvVDLWfPdVMslT34L + Nf4ygMCifU8Xc5GO6HjIElGiY9pbLXsvS21Wy8g5rmIV1m8Sj83wvoPpWjId4fUyMJY6cgQsyyi3 + i7N+U4tUvnKlBrhU61LnWx847q9pWSKg3NgvNzDKhrbXtCFrc20caSNTDYk0Yj6vRBZqvdwsV5qg + Od3+1F5/KNjKDKxKMHhXbayKJ2KwsY9Yb28D/GGjgEDFBcys0WxFNLsFTkHD09EwDLeZKX5rmEcX + N3ceRC3WS7a3Jq+t7djDG/baprh5RTpY4eEV30POXXoQc+x+oGdf0Kk7G2mu0xlZbqdZi+ZbiLxJ + kSL++7Vt3doGuRYyBAb7CL3Yc6KywnKjciKGcaHHKKTIAFKd3tRxuKMAiSpdfajMdJP8TOH90UpZ + EbnxFP7cM6aO/oRnpOzeSFGbiqpgYF+9oZZ9Qhb7FzSZB+HrgZjfHIPmGDSHmYHJOxTeWq2UD7wb + Hdm512Ce3WCLTG3mGfqCJEZliy/bCO5kwKhC1eWL/lQkAzjMNRryEXqLaAM4IASMZ4RflaLaLIag + dnsU3o73Q5ZAtILm7tk7wUVgHoTg3qfoWEEMghqjda2pS6MdE+ZnujtiLbAm2YOFsSJOfPSFeFwm + TV8spJSyahV9Oi+23t928P60DpFOkJkoTLDoV5iK80m1o//+r/95xfqW+d//9b9c9gh2LS031sMk + Ppg2EHgTvAIqrUH5ydE7nc5guKLUDATj0BI3U9nWdDgiB/AHHTgOVIK55VqfoYMQvrE+x3SMyCMR + Cc6E91ytNzU0OzrnDz/eMdeKYKZA4ZUew9OSyyU49xEKFTy+vmYfrs7O71o78vkl+NDLe/xq5Uy1 + uZZ6KHI9tXkpF9zgTEcGF/SkRogJnszpGA6zbMbFbu46mrPPKLM8MfVGo9RoqP4Jt2Td4KhUZuhG + Ff1rkVNeSTBbb2CnANw8niSAsZuAEh/RuwnY9Lr3YkGW3tzuIETQB7XD4DsJc2dxh+spl7Wto5qr + sVP1sXcv7k8UlsXLMqX4bvxaDGmXjq0kyF25KpOQd+TrSgLelRczCXk7Z2YKckFPhG+Zkc9qpVxq + AMQTUW75yLd3RqZRgDafzTV3kaipN+s0/dqcfcSiy3vK5+M5JmnTrSxk1vf3KxiS/sDn7EaWXQrX + pftFR1m7TWUV0eldQroBQ/PY0TauyVomQ4NXL++arO2OnbVljtLYvmqYx63FynBEmPg8FokLlmZg + YnoKeEZAoVqt7aulWFhupcx8AFnaBtm/jvaElxYpYwuAiUBLzZ7DT8qtSZEXqByUS56l21Donjx1 + v9wslxv7oW4lDdEWAf/2j6VK8y1MJTTB/CaYbEIcU2pbE1Yu+XZnI83u9IslrE5Vra5idjbSzE7Q + KSr75fLKZqfI64nW1tAC21o3wZLyrjUP7xDn0d8D2KeXNHQYt7hjWI7cu1L4W7CQ3Lc3Wm9kYTpP + iS7xlE04XmbtgAmj2fA1ZrF6cxClCPn0KDwJe5vgP51wQjQbC6AVpAH2q8iRtIBmK/WqWk9uq7NT + LIa/Vmo+vGRcC6OPfQV2UdvVcnU/tl7aWJsFtdObxjvbLEV3tbEO0lbrwQJxLXIZ6eOJYAxRjxFe + cyLapDWavlYuESq7QqhMQEXrHC14H2rUfieokbWRWBHN2ioLYj9tQVQa5QroNtVVF4Twcp3Copiz + C1sDfiMoOGBAjPY4sCfCJYPe4yB0KDR8kaoCXarHZt8WS+dC10yX3fCxZetg8YiDS0yYP5hrC9/O + YOVMpiaGLxHeXMxA7iIWI3jrztEFZnrXfB8/P+PCIl+2NbXxtKzpxl1CcuLiJCRY7mYzl05bU8PV + x3jj/EyzQe7beAjYnXKgsyeOd5EnvJEadV/2ptzMIK73EiwG1yNYJsAyD2zCISiwsoS6SttQV7VZ + KzVXpa5TPHlM7jCXHFx9Xdyd5jFPQx9gzt1fOAO93YQPOT54HR96HuhER7eg5rCp+cR1HD7QBJ0+ + ubsLbmpHN6nJgOKwISCzHsdbQs15Bq5SSKbcTCMZPOqy4XxkOQxCgZLo93eU7hyDUeGpZSpuV5BH + qV5Rs+R0OGKRICBGThECHvNqn7QWUwIIm1VIoZpKChW1Xmk2ViaFaHQlRQfSWbRwb3H9Scd33M+d + p4X5pPd0a0rOUQxbNPsM5tx0URzaPDGTAnPxmaSnR8tRt5H7QN3t3pRUHlP3pcRliWJfSnwP7UvR + g9i+1D09+532pSqZ+1JpBw222JdafL7g5falkifyipWyCHNSnkDTIPakjBRvZsIH/i9AicLrmBnF + O7Enp+CzswMmK6ywryEubcbTTivsa4im0ChzRp4m/N//9T+lx1DuZrQ4l+17HFtsAuu96PrEFkas + y90Z56bc4xjqBkh3TqsUn/yI7QEU/Fy0YxEj3fiOxf3lXftFdiy+UIxyLTtGubaDnAdL18fuYpQ9 + fpK+Y3G+/o6FmPnNdixk3W13LCSY3e1YBAA337EIYOxox8JD9G52LLzuvdiOhTe3O9ix8EHtcMdC + wvy9diy2jX9Wm+p+FkvCdy++Y0GNvDBT2mzHwqeWHXnUk/Acl09GuFkw7o21UaYfXFX3m3VkfC2v + PLvp3WCFpS3sIqA2CXXzuOYkrI1jdBfC3M02UBLy1ntWSZC72gBKQtY+Z3KhWr22j8cwjn+AkS+f + pNHUeBxZw8y9L2DrahPHfQkF2SWWXApzux21tdikx+S22gfJDtGufYEQ7druQrRT90GinHPTNCRo + 9OAJXFp/NuaHUOjK9Tmdy8WrfMB6cOdxMyhtW6RUFVkmHnB1ohXxgODgXwSHN9GLS/WwyLEH1zOX + liau8voZLGe00nDvUKHNw5U6KNNgBEudTLdgW3Gt3miGxZWuofV6ioMmkqJh/r2eJg80A+r0wdRY + qV9gAx8DNHaC0BhBY3vHApzIRuWB21urizZg/gnxhGJQQTmoiGh0RYSjC7+UQvF7K3UU+RnCJLz5 + UpMpLBq43kYQoGMD2LX6G4/Oj4QsKwYlalqjt6Ul4fsy9dMGHdXQYU4TPUSHObAO4TBXRGowhTT1 + FfpYR9tmJe/7Wt2L7272ddxlXNadShlEQnJnk/gMO0MQG+m7Ow7/9t0rKS42eO/l9qCvIQebeBV2 + r93yL5rzP3BdYFc6tXKzkeFi898vcrR1xIDW8yYQ0EVCKStZ4lLH2tIcHkGy2fBTgD5eJqDixNy1 + ufbogPrVs+w+udyr+/VSkALoAWN0j21X7xmYlTNGzaI2g5WFG7NgG5CkwjsOrMFA7+HWAMFNv+Eo + in7vjiNNNAbyCbBOvne8qvXjTaXcocXTKVfL4VuOYgQjmHAi8+jXg4pIR5MMYlU43tAzGcEq1IBS + jZNGZplKKAGx4KeN5n7G4O9s5PQUOhDrvgAXS7O3/fSHkyOHSKFSK+2EFL4UHmJzv2b19adcHnj/ + jLrPyBI6y8Tq9zD5c3Kklf1So5Qx0tORrTvsBwGIdoopIgN3yCVAsT8eqDHQ9+OJrRus/qLU4Kcx + bl++vznpyB5iDzr3omPrU8jXibYY8WwJulAopNPTcoUkQ/i+zO6BuPgdmqnXY9fpRt6kSXf53rc/ + 1XUlPAHeQMKzeD7k21ga5KUCfkXmnW5rOlMbptkJZyyLhl+QaCvVmxlEm212jsHMYx74UJab+M5/ + nok4GtDqZECNH6AgMsHG/Hhx2t5FD/ag8b0l7a5sKP9LIRm3EsD+SPGniu1KDwqd8pIhghT8B997 + 3OBdG4NANKmJsP16vrlflxoLp91Uds2fdDzj9X/+H7Ri8X7FlNN7HgtaQ3mhjSRxrlkz9IFlB5Fq + jmaCZe7EZmHGuWDS9XqmFMcoKocbwHswVgd6f+rDFlFPTAY/xqX0RwAeJ92tgC3IH/t1DtonJbl3 + xxzL6HsQdddJQoXnLWCYP0CnF7WQZ8Lyw/fvgN+yk//vfxsYBxUJuWtpzkjbgIzCK3ys/6KIzTXF + 1uhQrA4svqo4PZtzDLgT1ny1ri5YyTf6L2LRESD2oHEhjsXCvCGYrCqXqQ85FQFpRLWoiT0P+t4K + gJczvK8aHT65YSPi1i9rwHLUpAR6wG6sJ4TSptSsOWoYY9NC7choDo0iffFwqo4RKAzo1A+Hfm/i + aVSfRtehMak9at2hCEHXJpYIpC2XYUVmYO345MLPumdoGA8KA4CKbYYX3rsMN9enNo8TxorV0vNg + vWwPg7kSpUBZxfPDiGCyZNEnN9BdE+NYEa5razrNzgSUftCvcJagrTy9nMEMsa6Ixh2i+IEJ7dkW + Rsp9PKfDxEPD6gJEMJtcmMexE5+xmO8qHIAUvnEE75z76F1KTb/FoP1HD9OxFUpmG2QWPIYekp63 + o+CcuN677uaNgc5jtwMdnxouaenRje6U9ylKdLRUsJWz7jY3gd9Alb6m9iPK9IPoy6YOsxjzs7UZ + 2ZBKqaKowrTERORywLgo1FptP0uKUgJrbcZkcf8QQkUcQjgIJ9QUW6x4+TNnA61HqhV9ysyoDxZA + jsd9w2h6xjR8eWEiFshrPP1qCC8kKBhkPXjoD1MekKl7B2SIw1cyBu2HD7GH2LDr0WHnye7Mi31L + Rhdos0tu2nNY7KASTjDmHfQBTPoeGXRDgc8gSYtjTIcDeM2WRDMtRMQyr35owivlBuaCWMntJ6v5 + PRtyEy3yQCGK9Gm5bZ2xatdd/JiboQOstmNbE05gotu3Ke9TFn+01ILFv2T3lsBvsPjvnng057VY + JpM1M16vaEw7j3NDs5WhDdbdo96H3j1SBl8QTE+YWUWzcZ8UuAjKl8SRhsWRrQSaXQDoPPtR77Mr + 81HaWgibnRBsJmHHTSU/CjYm/HcDdWW9JkgdACbH1Db53FEwcJZ27hxrOhHOsEop4BuRLDK4IryK + IuJWnBPDSW1BdfErGuO/Vp2sOP/aFgeKmtVmubJfWjXOPxyokfdU4Tx66YDpBV3HKGB5SO5amwGN + 5Nn5k0Y6LM+zW80a6zSRN3pvpAG8UwsMclSzYsMHA8jAa0QRtwfsHk+F2Dppv6eGPiFL/Ge8Evcd + ipmrqyvZJii95994fsXEwQExg7FdisQ85Lw+5NLVLKljIgsB+iAGkqZ14RInnfBBlEioVTcWqK+7 + UakymOLudlPlNmnKXqo41eVtp3q/QjuqFGwb21Nti2JfcFtVPu53qDsdVY3fqZ5WIEVwRIutKy4E + 1CXy4vyn0+v3rasP5/Ic89U9O//p/vzh6vz29Hwt8TCxrXHkYuqUG2rE9BSBIoENTujT+6sAcwCr + OXEXSOqRhShi6J7PMvCWzu3xh0777n27A+NQIxsW2WcYcMj3oPrgGWimPWm6gXdwoZH1jTzCsOMB + ie2qW4K/SJuJr7ssqnqZDYPpBO81MIeiNUyZ14yQcMr7FAqOldp8DwHBb6D6vJftR9Sfa9zcoTj7 + 9RQg6Pd0bCZv95CERCH84cuM6ICBdwhGOuvyr9jpcf6VOLkywev9SOsvsErJO3A9SSc5we3GGiaF + INpDDSJy4xIaXL4nM+TjBGulUiKTRNBrsXxaKlXP6ueN0+Omerpf+h73Bx0X8Nyo1MEcIBNjrH22 + bDxp2T8sYz518VA3vYcY1J1xb4+4dbU7nSui07mjk+mceXx4ZSmUcbNECN2hExhe6jRQzUwrhuX2 + lHtYLm+C5cDQGxD4OHLLSeTuH5+Uzk7U/Uo1QG6zUgH8/tMgl86QSLS2oX8aYPXddQiro2ked0IL + TF2AVPPZlXJa4hbw1hPM00JG6L3UnMn3k8NypfbFBi7463rrO4yTew2szMc4Vt7ZusRKZXdYqapf + Fznc2dCHvsViY29prhx7dYcU8RWMPc7WmY+J4ykemAQ8tH+KcXXCQ30BHlz+rDld61kEJNH4vzDt + L9I2MuT/uh4UH4xldhzN4GgulNIViXCJRaqELLeVE3WjeIRUZeION+LwONsaikSUuFAdCRit9Ti3 + wNLVAFqMqfwwNWJMJdxHij+VBIGWKXbqQBBh2Rd61MdXcXMJZRwGvCguNq58nhrzkO9B9lCYkOzK + HFi7XFkrDJ64Cg2++mUGX93x4Ec2naJOGKnpmyfeMMjXHWiq1Lg9FpkvBmBrYeEUQ5+g4SaKR62e + prtGv1P0oiddG1pDi7hUa2LZrqPIjhahH8q5N6R09iVr547kFzlITDc80szhrjwTmcxmd76JwOeQ + 4p4gXXFkTcgj4fEO+YyhLyKKV3zsWZJJM7EFb8WIl/Up1GxGp6CBMR6ymMd75r+Id8+B/vkvfXM3 + 2ctTr8zqXQ13RlQoTo1VDGA8Td2hMH5Y0JsIoyG3Oqb2hFd8VqIn6CNvUoSPfJ+QNPWlVz9XNjgr + H3ooAyQ7UyA5lhytafVxc3GOoSLCQRWM1qvanbouLogx8AcYYL0WjfHPLpaCh7TC65ryAvZWSLFM + Z9pFf3E3UcHrIXVNEf3MMYqOPczJg3MHrGtYvce3Kd4qm2h9bHQLDuarwjsKB4Y1866yxRrojwo2 + 0B5da6KPNTzI6jupQnG1UYSVS5g8r1J6rtWC7BoheGOrqxs8Bi4KQmnhwLqKKFqYmBJK3MmF0bgK + xrujOz+ez0QcKOwaU568tHcZBlJu7YUVR3NE+xQBl05pcs4NAxn7qo0CXD5b1OQDFljYJIiTsIcY + w8CWjwS161srAjj1I9TaPydFSmpUaOq6qxPlAojlRj0N4kICJX183QDqxQxukcz3alq4p7I2Y7Ut + V6MsOYQTbLEclSZpBVKYabTYBmy0vJ1smUye1ifH5IXz8I9rzXC2i7rZD+XtuMQ4JYvNEnd46yZo + s6JkmrN/ISnTQQW1VO0Iwu3QMZZ3U8M4xX0pKOq7/ZeRsA9JEOwCSEKZX+ki8SzaWIUae5qp9bXd + yPlqs1lRl8t5KvZCcl7A/trkfNHD8gpsUxRVlnPP0+PVOedyoJKBhoFuxDxfVjxtiUjas1NLtU4W + RjsX3N0Kq1kt+OiNtvCF5JO/MF+tASlhuLyK1HrlL3Ktr3Q1sbyCHBOOYnS1vr/K8XrafgcmyS8p + Ii+YO5/AlLv82S1+1p408ZSCFgoX9+3jvlOQ5HDcf+1DfYPWOZWMdt5vHYw2v2naYwyxrgnySLn0 + O/HDx/GXKWwqXGRd9rTs2HEmc8LKtBwUBzO0j5XIEOkNC7/P4Y6r+C9CX8TNlb6GmuhRyhvqidiW + xbohtPFJh07yOZ1ypRkz52LvUpDml2BDW+8rlJNjhf3Y8/tTjQ7tGC2MMR6O3DZBCaOUWnwpju+4 + gZbk6mPsUyla2zH0Pp6xwVxgHgeTsSKlVSLXuDsCpYxuQ1LCyX+i19Gr+6WqWi5lBe5HbpvqYWJE + is7EzKM3lsnn+IPSZ4DCg3GpgMyeS96+Ph9g4o8gj5A81BRKMgrqVJdT6OviuyfTD4fCzA9Av/FO + hfJJkbiofyBUHgJtdq6PHy7OhUJ0f9dqdy7/3KF+UV8Ey5zpfXd0mGvuA6GMqHGQ+JUgiqWrD3Np + bBV1KzyTK2YpGmDoUcmO5wldsBXpMT764wkAo8i98yAs8tUFpsLH2NhTmDDlinILt0d8jJ5UGANV + j49EBk7kyEn9Ec+IcoA4Z12YZaVnT50RJcecTgz+HJ1W/5KuvDhbKuphpBG2C7zD6mN2eSSdfHT+ + LdOYw7LlM0pWixRD2TmQTkZTE9azPH+hYZZbvGixEKHHPAOEYmvwBWh2aBPZ2Vwb0wkQpFFrZhZY + 6AIyixl8kDhzhsHWXqLuxZQok3QmzPKVkgD9S61IyugC1XraZBNnfFYAduottuJEtswX6wIAzU3P + URMNsE0fgsicI88ztglYND2N3HWQyZ92M7ZgDyZ82eAR2mfMM9B2icbdxrEn8lF48eub9Hjzi0LE + tMh6yd4G94Pkjs6Du0I26WOKWy1xKEj6q0DrjqRjWHdDLUVtTjV4UpQB35wBPYO/lapBecUT4plZ + vtT9cq1ZKmclL4hl95I8xUvvFZHUWlEvPheG+gC7phm7Et/UUBtbFwk/VpPghvbLHC8NTTePdiDH + V0OqlN6IxTPAK7FeHe80PR5qydtMVxLWAfYZxoLi9ahj0GtJ5OPhMxHojReScA1EZVdcPWDjDSok + gIF4vL4U2BVtx5qUhFWe4QYO7+pPdLzOsaaGk4/TAAftdcjpmNIQt3hDHUJBBEgfojIiEnd5khnv + OSgA75saIhf2/Yib1pgNUFbDuuHjibgVATo3p8z2Axeaopr+jS+gunPt0T+SjnccmP3vtxHRL7ky + XkZirpOxLyoeV8rT9xLC8GuXUJtzf9pleXmNITLYTdSHF5E86ioqMCX/9zP/w4qq7JdLmSvKSzpB + a4nS838JATP6e2c0GlFXvxLZkoU2KU327qYuHqyxnT12auO9A+eT+H0EmIQeg35XEimRBKLfM9z6 + EHdRu1KkCLVaxP6jEXGmXOAZRxHP89M3Yq5AwEieT3ahP5suHhnqixNDdJh1APPj+ncl0G0K8H4g + juInL7kODDp9ELtZwRNFwl6ki1GkbTTQbZBB4h5tXeRQEhc3zLez6bYn6JeRCzu8ZuM/EuA/EmAl + CVBZYcGslDg1Zsdnp0v9EuIAHSb2CGOmN5EGYccltDkDPdoea/Zj8cxye9ZY8S1V7IBaapT2O3xy + Mh12MNcDFOj4Zq2IjvG2jQCEnJKUM2E7EDkL5ynig4xMj0xiK/yQpNdzC9gJiAI/LfBKEghjPjFj + ETMsc5jHFYZ79HuJS7DCxMAGFsbjYJJkP6N6Hl49aV6uBTQcnMBBNge2wjWRS1PrPZJLHqUNnWKl + S1sG9Omg3zF87U9mni7ooJcMS8eweUr3Dw+Du9dsPjV1mVQr7IuDQpjyQAgo+EZxf9t6HHe92BAL + KP4nlJEA05AZujD8yKu2K+kg0ns7nv2iYIBw7B5KXYtcU5K0bLC+N2NegDGSkHd5a4JqEdzRSbzW + BFMmyta+NF/vfS18vbpKqlRKhB5kQZfGcjlDjAcJKEkViiY391gFo0zoX4LHX/65g72mQahfidKf + iVHJfQl7Jzalsn9faBWkZ/sEOBlo7GO+Ep99N+Xy1kiZDB8zrwBZ5CMz5I5sC1V2ytOESQ1180k3 + ezoeLRbZ6jELoDah4+OkbVtTG1T+9GnFxPCRXZm5uPkSMzfR9gzxX2Th7NgdGRz0+sGUgv8lb37A + TBYjkXjJcXTMqnCtmdpWrPIl6fdlNPxtrh6I8ssNLxz4j2XwH8tgRQlS+3fKW/sF5JXvnLnHPBUg + vr4SmbXtHErRJubpWzFx15qQD3Q8nuH5+G9WdWLNWd8y98S+CCDEFglqju0xJs8xOPqIchRhYFou + ypMCO6ZtBp9oxlofk9quQCUkAVMv4Mmz9+9O2Ue8nX4P8y+ZrjaObadHCRNtEWC80wnBObG10RgE + PS5uvAxYRFtAp2ifnLZTQNaSDr6QLLeSjv86a5OYZAv9fjvehFnzeqekxbLJpU7/EcH/hiI4RRC7 + MniRhG1dLGhvlaNG3R2CSPJORP4xd2QkWCeJcj9IMRp7OdYmIcfTRAklzoSfzNTGPFZcVElAocdH + 32nodUm+BDnljDSM2p1YxtzvbaJQz8K7Tg5zpXy51MizUr6UZ6Csex/wMMc0A0Qf4SG9LXWVttSg + rXK9IlrDL9BQRVW9j5Xaq6zSXiVor6LWRXv4BRqqNmrex0rtVVdprxq0V200RXv4BRqqVxvex0rt + 1VZprxa0V6+poj38Ag01ymXvY6X26qu0Vw/aa5Rroj38Ag0196veR7i974pQL+K1DSlwvnbVCLSr + cgmEGzBqqJZoPrZspNKVWLtp4cQExVepfwF7u8+fD5j6NhwAnBIT618l2fHiq8oh5TJ6Ycpq8bHi + CpWIelmuhRCAqmbxKJbAgHCgevm6vGDFU3Gv+lUizAUkgs//ZF6DDBaXREklEvj0UiiJxxztACsi + 4AU0wmt0MT6gIRVDy/cbI6Ua2ZN/KaSE9skF2W+Fj+QOJCsUCuz24x09PPvp+282xkctskP1UvgI + Nop2gA7aZU/srHia3qaIqEdcui/IQHxvqkCFuhUuyCF1KtyLTppfamN87EccFLvFh7h7alWbfX2m + GjISkDM57M6MGglZ6yWiRPp6Iln9CUXRXjPRUsphnnXzWngHzfhk2HEweqFTran79dTjn7EyC85+ + +iUXnhNakmtJNHKUGNDqR4JEZ6UCzeT5wlw8i6UoBW86gaodP3GFb1G3jxWBQhOvCMW85I7ad7dX + F5dtdncrjKHz9se7hx/JHRCv4XDodT/t5gqJR6c34v2pwZeYXiwo5/UFLCPFeypvV/twdf6RvXt/ + fc1ap5fnZ++vz+XtY7JbWSbTH8uN/bc+VW9gGHpAh9z1L20TXbq8+8jad+zivB3F1drdkmU9JPvJ + SpOTSAsvmMXvJke35z+1mdQSjn9W7s8fFESVv5wnR3Fwkq+BEa7ZB13LHb3NBWVSE6UKEoOirjVe + QGWimGENrVAPNzHF0xLfemtzYltDWxv7v11bMx2RvMJLCZKRFEN0D81zv3tB2m9hl2KCu3ubK7iR + H8tqDbZOXU0sPjyN52FicrQfmW6RuW6sm5hgO3d0UCmFJuVVdC3JshzYjY7nJu9vMgthk79YJjR7 + 3paF0idtROnGCER6JgOJQkrCFMN57DBxqVlSO9VK41mt1jsPxx871zDJTgdQhZgK433h9ZIrzEAk + 3+BHzU6ZhcqSWWj8E+J3v1Tx8StwKxBBeAA07BLFuNROMYk9hnim4Le6BL/Nf0L8NspNH7/+2NWF + WE3nbmHMstAjKOMmMH3+7Np8jNveBnfimK5WK2ogh9OxHX+FeUtALPaAR2KKP7UeYTj+WwUluTuK + 5772BDiskBQ+FZm7KJ9acRpjsittOpfnVOECZzahLDqrkvV7ikFwc6s3sxLfhO4UYRDp35Il5Pkt + ZbapxJIQSOAT3cH8JIG4S4JLL7lQ8qQ3hpaFS/dN5NJX1siaQhdWFUKrkUCyVHTiw4SSuoxFJdqq + VGKqw1cilVaboIRg2mqSVl2BXzX6dya0VpuBqNzaCv3NfwX0byTTlqKdoSRTuAF81Fwm0ZJCMmMW + MqVYqpSjvP4aCsHWFOkpIcDSpnR1eegDkubZ6uIwtfpS+gg6niomM9SNVMr5ncVn8MWfAs8i5pOh + IgSnEJhkIjtfgXPgK3QMrOoUEEEYq2dbSnGCretP8xyXHUd/7tQajf3o1SfJ12mpiUKFwg401rNs + zOsDY3WU9a+Ao9ZWdqdhS4rwWGCyD1jK5F0LMjRFSyJlJstlZEPP2I6if/0jGuLSshWuWVk7cCCw + E1x/ASRjCSrljWLCQ12kjMUy8ZES3fKPxQEkn6XOCr2Klh7aeAFY5BFgxZ6H8SKTQEQyovR1pzd1 + HO4oM2iJjtWNuJKeEaQXCiXGIniShj/3RMBRTQ0CjiLZUvwWmGzBv9k3O9MJtnDgHR5gPin4t1s2 + RUL26A11X7hVccddlKBi993VGytcd1cppV13Vy3XK9V6RV31urvI4F3NeHTk4VEMDAdGYq6cZSZl + nzhucdNkR2hN7PREHnmBjWJzw+ME8T1+ko4pQZoTQ2xp+GGaRLyxvZ/ZuFIWR7U6kp47pbLY4KHQ + gi9HEXLM1EmGAZ9C5AvmV/NXpIF3AeoOnun5Mj2jexHS847ukKNgDqi5YtmYGjFgKCO8qlMfImNJ + 3NFZKYcYiEw8I2++bSoqcZR6Qw2dA8AW2B22EEIX0ja0gGhLodq1GcjLNrICv2iswi/UZjq/qJXU + cqm+Kr8IjzXOLsRxODo+HqHT+JHwOFugGfu62ALRZJQpvNgsr8sDXqgjX2bJ04UR/oFPBYqBrkIR + uahDDCzxg+6wxpvibVTTdBOKaUZUj5CcQSz5mhrceU+Xs/ktMGqBGCO2QPHj+ANbYFexFiJcMlue + fbGGVlj6lL5g47Vfre/Dyt/satwzy5iM2F/04ZBuvz3joCscj7s23jTIHpS2PXVHeQz8sPtTx82z + 6+kjZ5eaPcHSdKBW6+P5VLrl2OauK+LIAWe6jcikEPIE8wDkJPkHTv9XwD+coTKyBviro/c6Yggu + qBYVtQHkXG2GmMmL0s66DOUFO/NlmApoAKAbjLkJ5G85is17mCgQmANS3lyxRxbQseKnolJGQJPk + KHIEk6ErjEJ6hWQqjUCPwHudNXYjW2B+C+wMW2AP1II81BCkvBKXNQPN91kbW5OXN/ttrq1p/N7d + WIEhoUdiG12k1FyZH7U/4M3oDp7Ux2uEYsjB651MjhnWgJpFQmP/1OwZ5h0lJrQQhWPLcdlAG4vM + NBJb+QQ+C5E7zENsqfH1qDW0RDp0UXKnpIY40UoktbdralqXRa3dy1zQwdxaffsyHMsBJcfR5o4y + Rw9KtkWDehDRUqUccpNggl6oLKfiZ28O1vd8bA1oBYZQq2yjoDQalWpzZYYw4g5oEDOLjTm6MCn9 + h2cTvzfxKB68D6kZEWmFGUyAejAlsilyHAMUy8YruZMqB87HV7C2QeUIWS2wvCeWoxmocjTLtbBH + Y5uZXttJ4TWWg3ZyX82ai5kewP3xfjjNUbwkMLHzkEgPoB/QvdYD1EbB1rJoNdYajVqWvUEJ1iiL + jQ82SmYfMVEOGGl4Lfc7D+xCy2IrkCusULVc32KJqrV6pVJZdYlmDo0/Twxcc7hcHXRZiZcO9KZP + 6zgyOAa9R+U0gYbESqW5+gpWKi1TJKnO5HGYXKA7mvItVf/Nmv1CyzfiB1QVujmVkg31NQOqKnSp + saJNbN1QKig669IfWFdT93EYXoYi7jml7EFnBIa1EQzdoawb8s7bemx5bgVELMjEIsS7HzfXm+u1 + enllMYm3D8zpCD2b6YbBujLtL6rJoudsNgIZGB8nbgJQ1nlvkD+luPIwRvdrWW3jiuqpvIn1tukc + rr3CNmto4ZrK+pGxPZ2+p7zuzrQDVjPvd0Q0eEdVm9Xo7S8p71P2piOlPJgjrvUN3fRDjoI9aU93 + 9PekW1TjI1UPbU6L5rY56zFZetmZ30sa3H5k8LF3KQP3SwQ78lVvQ36MreJVCXwAVs26twmJFr+O + jfmR5u457NJyI3vylunpgFvtxmOug8VOYUPr4973ClmUFjuyrglOLIFSREABdYjUK+SqnCs4cVNx + 32doWN5TxeOCKYfWtP6Y7hbue/xsKPqY4GhFcTqNTrSWmpXgisD4zIm4BGc6HqOzK4hdihfJHYXH + CXbRfMTH3yThSUi5o8jdLF0uUrnLq1gyEVpYNfohzMHSLqHYymamK0FFSMgB+48B/XUY0NusKCIK + JVu7SNErspfchqb1dovvo+Au19BhUrz3CIsLll8b5iU6EXKSSIwyzGo07ZFaN8b8RW5i43XrlZjO + k2nFjfAKR2ugDIApKAi7h1s9S241oD0FHNIl5nzCWy+QpUBtJmp/Jby3VGl2Lu/e0U4OPhuPO6Vq + s6xUy/uVarlca1R3QQ8P/rDlqBeQQjTDbaoF14dZckS+V308wR9ID95ijiC8x21YqOb8pQhkxwmK + 0okhF9VIulOYSXj4LX55mxZPLtAu2aK4gFITTWemQCL0TqKn+hffl0RrAz1PkfUBcnRK+fIVD/VZ + 9ya1vZ23xKRdeTDYqQ8jfZVMBDtcMnavz7GSIq8/YOS4fXp5IEcd6Yg/GOZMOO+BCPFwE1ZIwyx5 + pYSZodigSOShug8kU1ez0pRFoiMocX8oFOUFSYd0ztyR3zBwH8ePgKGYmIcf7/zNVG3IV6Wg4L4Y + R+Hc1jkuSljhhhOPjlpEQ8HdMV5OZZ64dcLfdP9yhBR0a0/2aC/Wl13QEpCEzSmwZIh3Fiqkluhg + PIgbL4C05ppB10E090Oe3ShhnehDkWd8BhOsAh84Ns0p6LnHCJwm9YIuRLyRwNmJuE7jAYGz1z/q + vUdrMBC69puXJ8SPoKJjT0X3Ujv1fToFZlxR8Tg3NFsZ2nyuPIIBi1cUowsdpukJA/Y0G280AjkE + JD5OxO0tvs6CQLMLAJ1nP+p9YG0it16bYGN8CN55JGHHtZolOsIuUCq1ggyCvr+8a9+1PIoW9AvU + PAa1vwcYl92OEPNShMclZhfvzqLIBsyQJSKn66XqioJT1AbEubg7SpkZMYu+9Qw8fKD3UOMiuL+H + ZJV9S3ZmwwsJSdNR5OEdb9935WsJhZ5EtVm49hcTrNZQiwZWtrQnjW4lGFmmZa/HDeWBn+jtpaCM + 0s2lKJNIMwFiUhv7zSxiitxB6tUWEg10ki9CMqN5tBc6BXXQNXKg9c7lFUEhglnoDk3x471axY2a + 4QDdzo9ar1QrzQV+VHq/qh+VDqt1wApM+hCrKzpSRXsv60gNutmpgxlVigw//jJl7EGRsC+VvoK1 + opQ9t6ppKd2ps4I/9QoBtsNYoJa/rEt1oTdUHjf0Dqd6Rw6F3+KpVqvt15uNSjHm7iJjL8bhhC82 + OEMHViNQwGGu0zU0PMgUSXaIeEnPBqMj+pPJtNp379spyQmj5nEUe9pE8MFX341qUelAijQw9j5t + hmCW6AfKp0zjEveBgcIomLU7ArWAsqcm3FUoYfBmAmDs3TmbIWYSW8cCMaK1GIpWNorjCZutoZWO + Oz7pGLrLi1gCoxI6Q2M+GXX4M8DpB+c+I9s7S3ha2pLagKn53GhdptY1YJY75TLgMbyYg8cpy5he + iq8ohjTQa7S+UimVFLVWAjmuk6sjvnhrizdDqK2N2BfW1vodv11PTPeZfOR1LVRevtH6fnEYSQhI + aINoogQPhceVCTHn8me3+BmkvHhKe/KFi/v2cd8pyPT8x/3XoabeIMlR2eikek0BEViDCdCD1i8v + bYyltxaB8eYti7eY0pa6g7bUtLaiLQJ2XfQobyN1mvVGM0vo4LvfReZQw1+fyJEn3MFGmZDIicY9 + wVMG08xtvC2LTsJuLVCqxVKzSBdU6r02zsgtn3XUlSXIKeYboE0q6GBL9toXIJeo2uIOAeqO4oIc + 0KVcGAUwI3EhJiqVpjZkQEQ2G2hPmJ0RXe02BhT3McM97d1LD1i0VDSc5pt1JMfafN4j4ldrJHyM + suktNVe1UlUXaa74fgeaa31VzZXa+3Kaa6NUrmRqrvjy99FcqeWviI1kuXe5vDBWca3EEc+BburO + smuQPADeShaVcE0mzr551y9spNtWytXn8v4+6SgDzVSCnse6vbqSC1zinQY9pzFg//ci52WQUWGZ + AZaZoaFLiq3jTk1TXP+F453pRt8bNICIH5KKXYLo4AFusZmr26jRYICfg5H0HhrRon5ZjuUvmU00 + U4/bbG1uV0uLze1qmsm5LtPaX93crq5haO6CadUXMa20pLxfhmmtkan3d2Na2vMzOhcxPVJ1vYs5 + j6lmnp1pc1bdEUOK9IZ64chOrcyJRLdknvID/9o46PQ3Pidqg7X8CHxDd5hkSmyE8dqmNR2OWDj8 + yvmeBdpX+F5OyZ5BRcQMbsCFPHToZs+Y9tEav9ZdLc8uT34k1zQGj7w8L6pvbiVXS5vwImn4d9R6 + tRQ1lCNvUtagfB8swEawAP28Pg4gEogAo6yfdGeqGTb6RqY8sSIb8RV5fn+N8XuhmELqx1cRU9i2 + uUkkYlqzSFShvBk47OtZHl4YepiSXkcRKNx5lp2UcHb/FqqR5biO4mCwCuVdo5Q5RiikrRGEtFXp + fri0kDb/TioCx1oSnEyXiCHHB14AWiMtkm3j+hnh7KrqicANotZKjaraqFRXjVoLmA4gWTc0W8cD + m86jjns4T5bxhNTjD5A4Usr4EiFqAtliDLYiSahrPeNyQX7F4R/gjOX00CLMrS8pN/PGQKABJAGr + q401j2fTPXmpMT/IsP1R3GEdyn+LlwloQ003BcsWd+kFcwkK4+3J6Z7DciljzvkBCfIOWDwUTRz4 + Uadr7XDHmk7k4MY3KJ7QYc3oe6lmbA4QTWToYEbT5XZ4myxoqTrezJxr3V7nUEDYoGJimNp//9f/ + zaIDKLDAUW1NOOWwATDpXaXjQKDUztDVO8I4KlMeVLgHaQvLwHQlWoBJY6jO0MZbFSYRbIpr9Lyc + sv9Zlf/CqxINoNh6MRK3U66emi2kHPoeHm8FF6cmUKbpXYHen2lzUwScEDHhnb8OKF1LrhM0YC2j + Q0lE6DxhXDV6qhAyYHDMuhxWKw/iHZYiQc0dvaeOCfiTNS8ezFKM1j6AktB7tjTiypVafZERh+93 + YMQ1VzXiqL0vZ8TVS/XsPVN8+fsYcdTyP4ER91kxOFcmmj7kSpcbBnDbmQwsrDfVclYcxPEP7Bo4 + yrdg77xl91hbxBfSta8IhrURzIZGXev9badUqZQ6fQzeXdmAO6NQ3xaYaOjKZhcYNYmyt+Vi2knP + hDvT+0E3gQdPez0Owl0o0LrNxrrjoOvbwuiNvi/eBXBoW/feAg6+FWPPM1Ac+rq4ZT43kAFGIKGH + nD86OUpDBeP7/mWNOG8lbGLEeUxkS15Ur+wvdCjh+x3wonJiAWYxI2rwyzGj/Wa9kcmM8OXvw4yo + 5a+JGS0NXAuOMomiq4as+fU2ZT2xvOapgRwykNk/zbRZQEcyN69kUBd4nGyEp8vI2OhxM5n5K8/E + iQ7kTv6YQ0F6IiQNj6ItyIAZS0woXU1rhXisz6W8JbIJl/LYy7pcasitThwU/BdZqRllUhZsouQq + HCtxPdsFtzKZFra7DdMiW8aeOxxTUYII9MH3esDIDnNn5++O31+3U9pYi9VlO8/x5e/G6r5653mt + BKqW46YmWAFLitLiLzCPaiWG1dmVVzi0s5U4gsiU+FHL7YLaFIpC8JtemfX5keCJ3geMLzCSXTHM + nmUZWLaHsQZ99LuA3R8NMkg97TURrh5Q0wIcSQdpHw+oCtsxsUv44owv4mNfiQEu4FxrJ9MHPi+6 + ojaasTDb2Lu0NPpeiYUrN8n3Enn07wFQeMWKBr8K53oobFrcYHh3fd1a45C+jDBHVDlFj0IT+/mU + 29U70RMsc8vFswrozZtpcSJPHMAjsS9BfJ/ucvUnzHO44oNieqDqCYD/eHMuAXZoirjmcDtY3vFs + /P7tMd+N6kfBBRx0JehXgJGNqonljFdUwpiSJwe++CgCpE5d72oRAMdurVn2rR0ptygsZzMpvGE7 + S7DWrFYWZUSh97uwBFfNiSIa/IKWYL2xn60ewcvfST3Clr8m9Uiurc8Y4DiyFLx8G0bU7+G1T5ap + hMwxOiC9X2qUMlxSpyNbd9gPAhAGAeE2AaMQeQlQGEU/WCM8JWxSSL1IM1SPHwTYme1Y78gOYYPA + WKkfZE+urDl5I1JEpyUM2fkCq4fUpzACZtwQKaqC8QJONDyW3MOzj9dXH859xPgmpDGPoSIPVD3m + fV1z8d0A+IQ1Qy6FNwQG+PunOxbgLc8NrFCftb1Kc/2nwQvxWeyBXAWdcrMR0wc9XjGwgM2H7vQL + nuHN2j7nAP6TfmWZKIv8gwVfiX8YCsVD+iyLdgA7ZXjRUavRKIzoqxR2FRRYO0lTdYNjCaB/yRvS + YsaVTNx3efexJWjAuzMeasRgGTncEo4bZ7Y2w4sEZp78f5VSxsFNMnHVH+2X0XbZgvJAsmNNN+k8 + jujgDfxk5/g7o16wkUZub1GrbWH6IDJrFjXn2np36nLXAhvHtS1r4lUXz72w0Da9YqmQMMTdOSgW + Hd6b2rwwmhpTinGfAGfA4ZQFRFj0l/CK3cPjQGFauoaShLaughGCUKlVyo0sYqWX65FrwjkTJVcB + cdcEK+9hY63zh6vzDSk3ooPaHDhzP3ao+IEeLiKdXnCJZeROyyXUbT5Lur79qb2kaEDZ8RybiyrC + qsTzy7R7T3pAF5YdWvO4XeXQ1R/BJbVbAzrxnrF7eLZwqY24MqabRWUgxAyvX41fyLoIgkjM7eBV + kY4wO9m1eLTHLvHZEnwqlPHC1rnE54P3c1k9tSoqqNXNVq6/7nyZtZrkURdLnkplv1rPXM74cqfS + R0DcyXIOXc8YXtNrLub086zJw0MimuY2g9pTLuEMd6+lD002naxTPeOKzCOxByPu7xyjMtiSr1YF + POLG5I9ldNSeCk81O37SdEPr6nh3QToVh8dyAbbhDXrwrsyBlV4cm5BzIq/uvIQnG5K9R59biCy1 + WsnWrtJOx2wurhDe7oRVEf5xrZnIo3J//LNyf/6g0A2n5x/Ob9ubqlyYcsXGxLWY64uSwjzQr9TZ + 9DnYAIwVWAuSab6TvxayvXBKoIhoXFQrem9t5JrhJTx2os1RvIgO3osfi6qAJOFz3QSh0qU1foO/ + PWf1CTxa0p5I2oOZo0n0Q6MnoScLNdopGHa2Y2hjvNkYv7fg+6IaJO6sgR/lnjsS4s4aBAlDF9Uf + YSJgU+vBh+gqLEkDx6qBfWoYiztrP+lPlu1wIfZa8jdr8RUEn2v0pDp8fXrA2nhi1snLvKYO+xZ7 + r4eVkTXV2coGIrGyzBhTs9lF2kHCbYyxDQ4KprKLkJrXeg9sotU+flifPwRmUIjQltFXwnZaZDEF + hTEPnTXALHRFkbiNI3GFE7pl6qgBEDzlbkzHpp47OqbPTc2ijY50xdSz/UVmUZrTcTuzaA1n4iLS + ITMZMN++Ov3xfH2Z4lWne4fbGKztLtZJPNUGleInfaLw5wnyEbOHJkHvERPSCYbx4eqenfsvN9ea + 97dWH6rZ/KC63rQuudoa4e1kUmXkztGHq7Pzu7Xn1MtzHKwzb2PECwk68jas/ACatJn2b1dd5OPx + Glvg5Fl3MVe3nvFa9ozX1pvxxCZJfMZru5lx7ySfSAK37oyL2ktmShba5UzVNhDf1WXiO9OeVXds + zaq7smWpkN5DYXt93Gpdna49gQEE2klPmz6vSHHWg1n+ePpxSTGOxc6XFtNmoNwffzxe2qhodSm8 + GZ7/1mwOSvjcxH2Mj5Ri7dimQxRzNKL93eJXK+0hJIljG0EPOme2oMeXuxX0BHGnRFakLTyRtgqT + eV+1r8EcuGq17x5+3pTsIjBJtM8w7hEvm/DiHiMXJAgJn4yNpIO/Swgk0lT8GobcUSL//9owp6bu + 8j4IPhdVkff0CwPZ8Zq/tYGhCaQNpQmkDVkbL3wkKBlCMx1MWLVevxOwmnRKhR4+JI2JvulxrDtr + aljeethK3mauKDX1DpNtNKytVtPN3cM5e/dwdxPK87jSQjG5v/cA3zLkq6HNi0MNb4o8wjBrdoHf + M2wgqWID/51MgF2KdMlHvnufHQePV/XRpGVInwB96DLNCAYBVOv1/WTu1FCpbRpLpGPPSn++qbqx + H1M3vN3f5F5v13KTe7072OfN3DpTU28p2kY32W7bbG0XOiXm8rzMllkUOQxnIMkLyIR4saW74r4U + Bb/B+4EGc1m8tMZiH+n7qTvuONbU7vFDWCjf4k8Mf5iOD88s99Qa0xPZ2cN3hHTxCJiapg9NrPU/ + 1BLm2sIUcK5tmUNvf/oeBiQepBOofxA3VO3m7uTq+nxJRZJzM3HQPlT3493D9dlHsL6WVHemXf+o + qvCXTU06QBHux3vQCJfBgUEX+0/9aM2zD2dL6kljHDOR0RHSCRfbhu60r1uxfrTa78+u0LZYBDGW + rc3Qxj3dndOmShTY9fENO71q/5wAt+6ifoFdMbXazF6naSG626zTDbLcbrxOMcgApmKMKs7cX63B + zJze3dy8v4VZYXfv2w/nx6eXK892l2soeDTD0FHqFCx7GMA9OWfHDH2S7Pi2faWcvL++Tk78UsrM + Hd19OH9g7ctz9nB3723cZ1QcY5ZxI7aSjtvt8+vVGlYfxb7tI8Xth4CoP+JFsStgpWfZEwuvrkxF + 9MP93cNxewl/yIQEehX63Qg9eOqo8NmJMb374wexR7Tl8mq+gIe9VspcXrW0Q4pbLK/aBmcQN1pe + tO1ZRCBaz1WmaMvf3baPT9vsfTqhZs4t/EGj8+JA+7uYVp9Y2LvjP2fvuRaHmKxSM6BecYJxCr05 + nh3Qe2Dl3T9cfTg+/Xm1yj1rMpfZ00/v7n9+uLq4zIgzwTgrJV4dqGAsrjUGbPR1maNuhil0zh9u + Wrjpc3d7dtW+uruNYsajBxSD9tTBREAUUY9kZrqKo//CD8rlyfNbhild8cYH08ErDQ6mGBDf0xz+ + lgoKY/KgWiq9NbiLRAmz2NPN4QFWxpTr0GcqouIDP1yWPAprro9a6QVcWLXscMDajsMBa9uFAy5b + H360qdZFZvyOgljZ1MFYNgrIdywKiZXxBYIUNB97Wo93LetR3tCaFDpeAS/kIhm48U6W8G4k8OL6 + ZzoSRipg+S4bZlsUiIF8wrPvCXiO7Cm+BYjpAD/oYic9BM0/jpY5dr9Edkf9I1gx4EPLGhopnQXI + GHJYEO8Jbrlcq5eaYONX1FKjsl+vN5rlWjHZ1AVVWfXQQ5LYV7LKBlPDiJhlKUuNSJel2mxkoani + XbDwfG7XGTvDTrkZDRZJvE1ZfpEy665ABLn2CpwcHRsGxYpPgligPN7XgcmHTPQb5EXQNXxiOhcT + 72CD746BF3vAF2F7izv6nvANcFM02exHrGENLXGozx8a/JS3CwVnnvEuQtDOKJMe9CXPrsxegarp + LmZ36IIipWsYJFBg2F+MkLVXbygMXuSHgD5PeM/Ftq0Z4AfgfosV3/pXk8k+YGsPAtoDd0BF4n1M + kKFjGlPolcvx6o6u5vjJJ1jEzVdgJ3Ps/xjWOaIInSoWpg3UTbpCx8vP7IYhAjuDUZgO3QJgCe4W + Lt/lhG2QmC5GJwctF1qFPLb2mYskrNpkAkIbIyXoHTO0GfTI+4rXo+JN2X19MOC2vHJAQMK3Xiro + EeZZlYeRC9HTTj/99BMhnrVvZBaRGBIz8JehPQarOnUlJRZ2NGaf1mjoHIaU/4rcV/YUAJmm/YCZ + lsnfBu7EcBXJALQ+mgy6w8diZ/pVlAmIpO3RUiytapiBYBOiYgdz7Kd2is30vjs62FcbqKFIBaO5 + TwqGPCqwUcL9oN1Qwv0w3sJfwmxkhDnF1x8n1Vs6TBAHoWHWth+m3+yyUcY+kPyOyff4E94vadCY + xIpD6gsOuHjSGDlvAXR081lcXaL2v3etx8NKX+tWy7yqlMrVqlLlal3pNnhT6fe4ul+r9xvVivpt + nz8d/gqmJyjjV7cXndbPrfb5zW8Hv961OmCZtkCjhR9n5x+uTs87N3dn59e/fasfTg9+vXh/dfbb + t0+HzsHgoIyfIbfPQffg1/bD+/PO3UPn3fF16/y3b5252TsEFZh/O9GfuUFfcwLxtGMksI5fxfI7 + x1vgFuCg2LX6c9LS3LFx9Or/B7WgZ/ygwAEA + headers: + accept-ranges: [bytes] + cache-control: ['public, must-revalidate, max-age=249'] + connection: [keep-alive] + content-encoding: [gzip] + content-language: [en] + content-length: ['23739'] + content-type: [text/html; charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:44 GMT'] + etag: ['"1427724191"'] + last-modified: ['Mon, 30 Mar 2015 14:03:11 +0000'] + link: ['; rel="canonical",; rel="shortlink"'] + server: [Apache/2.2.15] + set-cookie: ['geo[0]=US; path=/; domain=.wwe.com'] + vary: [Accept-Encoding] + x-app: [p6tyr1] + x-cacheable: ['NO: beresp.status 1'] + x-cacheable-status: ['200'] + x-cachekyte: [MISS] + x-cachekyte-server: [p6kyte1] + x-cachetyr-server: [p6tyr1] + x-varnish: ['114104244', '1838653311'] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery3.yaml b/api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery3.yaml new file mode 100644 index 00000000..94f4222f --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery3.yaml @@ -0,0 +1,490 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://wwe.com/?verb=ListSets + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Tue, 31 Mar 2015 16:25:10 GMT'] + location: ['http://www.wwe.com/?verb=ListSets'] + server: [squid/2.5.STABLE12] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.wwe.com/?verb=ListSets + response: + body: + string: !!binary | + H4sIAAAAAAAAAO2923LjRrIo+t4R8w9lTmyrO4bgnRSptuStC1uSrduI7JY90xMMkCiSaIEABwBF + 0R5HrH84T+dxv+zH8wPnbZ8/WV9yMrMKVwK8S+65OKwmCVRlVWVl5a2ysth332hWz52NORu6I+Po + zXffKMpf9T67bLI6+9vRd/iU9QzVcQ4zpqV8cZjO6xlmqObgMMPNDHseGaZz0O8eZoauOz7I563B + ODfiedPJ97t/zBx9981fuanp/b8pSgD97cDl2ETj3T++eXvZfAcNwZuE1tZrSVGirQ25qsHHiLsq + 6w1V2+HuYWbi9hUYQR5eGLr5yIY27x9m8n31Se9ZZg7+yTCbG4cZZ2jZbm/iMnweqkAve6ppmXpP + NTIeAFHC1V2DH7WHnN32+3pPVw3W0mGwVp+58PDhock+mvoTh76wf+DPXM8afZcX1WRXx7Y15rY7 + O8xYgwOcmwyDHrjchN5PedcBeKKx+dL4rmOqo3AVaCSxeL97oI7HHV0LlS01qrVarVos79eLlWI1 + 41dDmIcZd6q7LrcPeqodruVMRiPVnnUM1R7wjj5SBzytpui8X/N/TqehopGhCDBBUZx0B2bd4b0c + 1EK85ft5x50Z3AFS6BRrz438eNI19F4e3nc03lcnhpv7Mh4kDt/rEbVz4Ni9VduSFTsOUBRf3mJ0 + /KK1qa65w1B7lXJ1SY0h1wdDN1SlvJ9QZTgZdU1VN1YdCh93XBsXjDlYB3UwOxM73gi0MZ1O/TYy + 6RjfpC6uBFwjoYorLbIU4tK407P1savjyg6vlCxBsHnPGpj6L1xjBvAQbjPdZAPD6kJLzhjYgqNA + BYCm6uYIvmVZn6vuxAY8Uv2JaetPqgHVWxNo1HGB93i9o0K62TMmiHb2gzU02Sk31Sy7V01txm5t + 1zKzDEd3b/Ue4Rt01ODsgsFrevzR1LDpR25nmeqwKTcM/MRhn0GzDhW84gOYWCeXSleboTMZ1r8R + Oo/eRDAwiPHnoTXiY2JcMbTD+MMss1goVfb3a/PFJmNNdXmEJxeK1UK5XMSycVL2mjug1esMudZx + 9Qj3x9pKoayUi+1C4aBcPqgUlULloFBIWGRPtiduoAsDyw41sFppb1SJhdWJCxI11LXjieMCIbRc + ndsGt2O0BbLJ4IruTkzuKPAjVBF+Kbp2WK0W9xv1/UYD5g0I19ChHwpgTz388fREf7y/eHQql/AO + SoNgmiBlHc5zmxSShloH+ORAHw8tMy5PU9YUVtK1+Sp+TxdVlK2p2pptRSqs3tLAsgYGHxvqbK32 + EqsBGgmdkzmuK2D8G/GH+IJ+0vkUhxDW4VD6H2ocFE6u0I8s9FB3gfEqDqiU/LCYK2TZSH3WR5NR + +NHE4Tb9VrvwyLRCWikuRZgs/uzme47jqbAk5oecu76a+pQvVnPlXBUFvdKzbFgDWHzENV2FlWUY + 28Ic6U5v1zABSQPuOtUXglt7IbiVF4JbeiG4xReCW06GK3hCGPIXFdYTPc0w0MiTyLWYA6vw6Lu8 + KLYplNLWUOTQNoCToPCiVeTkATH5kaVNUDOHN6SKY2fzX+j3Obegte/NUblSeH7RRofW1LWmqtsb + 5oOvimDI23UBLZGeZjq5gT6YqdSNH1p5x0KlE/g/AlfH+iOfHZY7df20/MsPt788Fqa1UuvZ4n+p + n9Yrx9ZErf54X+op9tlfbp5OKye1+i8/nVzZ1k/arfp4Mvvlz93HVv/H8/Nv1dH4/WZdXYAbOe95 + 79NQhflEOOqY3J1a9iOVlN87/YmxBdYSuvLl7xMO1rbQFPM2CuMez090/H8EgqSvc00Wyk30HJYa + 6z2QXzl4uxMSEkqAqw5AHqEUc2gm4TeS6mDsrrUqhFson0cH0Dd/PT07bh//NZ8nd86bJ9VmgMvT + iQ1mqtsG1fbQ5FN2BkN6uxdSbYulg1LhoFree/dGAvrb3wDujnrQeZpasBI1fvi2PzF7qMa8fffr + H+id2utZE9PtoD5arNSL2T+8cbgLeu3A6bgWqLWq2eOHpUKhAG8MvWujoyT0okovQLB3+LOO+vCg + I6busK8aDod3+Tw7u2U3t23WPLtss5Pm1e0Da19cttjV5U3zD2/6sqR2qFk90nLf2xy0I/PXBKgH + oQGIUiyh1PvfsnNdTag5Vwbq9YEAnWG4sN5/+03/3a/9Q9ee8PeEs0MtB4unaXDs7cnsUnu713nS + nY41djtj1R12hjqojHvv3kNd9Z2aG6s4/TcwAzmbj6wnfjrUDQ1evf/Na5FrCR3s40AsNfRKffcr + 9qALPejZoERy2Ym3e4IWoM1uDsldhU+ilr0YtezBC900ud2G5/AdNH3btuzDUOs+veRE395CP9+H + h+yczNrq4AYUxLd76KTce/fXwt9yoGGDDimG1oUqWVQKw6MKCAsWgn0IP3FFWBMX0Rdvci87T4fv + 3rtD3ckhSt7u5fOgguYA7RPVkG5FwL8+Aj5s03r+khsPx9+rh3t/Coj8T3vfTuABN7Gtj/eXp9Zo + DBgABGq5j/dX7+C9De+vYRJz0KRmjd6+e+dPehzlqD7svct2D/e6ljb71RqrPd2dHRTYN/oIlWYV + aBkMOzI/jPFQfStLHBbehYt01d7jwIYeagcmdCb86re97PBwKerfqzlA1rHr2np3gqxF1/ayKSQZ + L4pEAoU9zUgSbY7G1kLV6F34B2pCSDiH3fccFi1TI7PuYQhLILUDGbx7P4wUAZqXxB2lBlgJ739D + XBMlxCgloA4kKSDHP7z5w5tdc8oQOYZoVk695EwxCshIsNghuSy9gokz5pfHOfvDG5VWql/FsHoq + tpob25Zr9SzjTxmgcdOsFmozu6sO7EGuZ1gTrW+DJZYD8ZxHz4Yjh+7kC4VSJV8r1WsoIzOChvuG + ZdlvfZnzDvuFo3z7Ll+uFfC/d9QR1ZmZPcHh1Fwy7oBXhPiYboLsdE94HxS8t2q2++63LCu+e7/r + SXHtGfv1DaOdhvO79jGYqNAJdeSww4Rn//gH++vf3qcU/zUD5j2IB13LHDDf1ZNlGcQieYLgse8v + ygIU8V8GtA/akoDXWFwDoxm/F6juEKZK/gpqOKB2esW5+YRfYU61CREVPiR0+0AC6AGIsa3TnoSq + OYblCgj0RNWwisN7quYDeIK1bfm/NJsPsJ0DNtWBg00DwhpajouN/fb+DbQEgvmSzHaXM8AULsjJ + mIF1bsBL3OWaw6IgE3Z4CFNNXQ2VoJUpB/YO5wD5Q3Ihr8xv6HrrDdlb/o4mGdvEibD6b3uW6QDX + BzYJje0BZ+QgFzhwO/Yrk+9gWIO3e00UXuhvkSyDUUtM9BeYWaQ0CBD225vfdk2kX/5MuirUADb3 + 9syejMHO8FhYFgivqzr8DpZj5iDzOZ/JZpAh34G9qT/DE/j9pacC+3e4kTn4NaN+UZ/9wv6bz3l8 + /jmP/hgn81s2E1LmOwNudUz1CWvDV/hG4s7WuQNAPray7O4+y47h89Nllp1/hO9X8HcGf7fwB8+O + z+EPy1zD3wP8YZm/ZNkJ1Dk5gb+f4a8Jf/jsB/iDcidQ9+TP8HcMf1DnBOp/AjgnN/CHnx/gD2D/ + eJFlp1D+9BN8Bzin8LwNbZ9CH04Bxo/4Dsqf4jOAcQp1LvATYJ5ieWjz7Ef4g3bPoOwZ1GmeZlkL + 4J1D+00o24S+NdtZ9gHKfYD3H6DsB4DzAd6dQ3t38HcO/TyH+udQ9hz6dI64wPfQj3No+/xO4OYc + 4JzDGM6h/XNo/wJ+X8DvC4B9Ae8vASeXUP4S6v0A8H6E/v0IMH/EsQK8n6DcjzCeK2jvCvp4BeWv + 4PkVwLmC+tfQv2socw1lrqGNa4BzDe+uoU/XMJ5rKHsN5X7GZz/BGKCNa2jvGvpwDbCuoa1raPMa + nt9AGzdQ/wbwcQPPbqAPN/D+BmDfQDt38P4Ovt/BOO7g+R2UvWsLeriH3/dQ5h7auod+tKD9K8Qr + tHmNOAP4n+D3CdR5aAn6aUHdFvTjHr9jWXjXAvgtGE8L2m4BrbQA5l+g3RaUacLfj1C+Be21YE5a + 0McWtNuG9trwuw2/2wCjDTDaUK8N8NtQtg1ttwH+R3j+EWB9hP5/hLKfoK+foP6nG0HLTejzX6Ds + X3CuoO0fcG6hziU8u2zKZYLLQuPdySBzICyNDKhhRge38Q6kVf85/5m8IqCpOKiuOGPLJed6lqRD + Bzc/DgKZIR6KHaiDzIUvM+g5NhcvL8RLSLpk5ipDX6XFjQBAXIDiyDvSQCVeMHU+5z2D9XP+TpRo + yQJZv4pKUiY0PBqdb+l21ZFsh6zez3mUFo5rk4T4nJdQPueB34KkyQCYDomwEKZA+ExsjhqIvwmR + zQB/1b1WP+fJ342NgAIyzWnW9/h5qR1KTTxHpUUtULiWVgv3MSfqQGUojVgkJWtJBz/n4R9QJXsw + MtkHam3c63xxLHMMKtM4sw5hwHSp9iPo6B1k7nFsk55WreVEEYkhWR6DFh75DIqj/YL0KekJYMAw + /hpACXm7SGwkv1DtHMadRN/Ld/bnfEU/bmb+ht01VWPm6j2HxITagUJQBsil5xqAXOiP40I3sl+4 + +QjaXbY36fIs4DsLJPE8y2r2uKfB9Dg+TrPuzM4+zlyepeFm4dEYTIosoD3Le6WsCoIqG2oJdwxw + WZy3r5Wbs6vrm0+R14b+xP33d3/5odX4IN7DbFqmBnKYczNa6qZduz+rJZQKN3Vdu6r9uZTxl1cH + jDpVR0hi0HO0krXp28gAS1qumiw8kNWphPfdq/F3NQFMl7sJj5FyHK7avSHOg/gmu0S9wd/hsrhz + Yz1xu6PpKlA+VvIf/UfM/0fM/3uJeeK7pCAPeMsFywXXwxdiaU+f5f7G5+hmy0Exm/SulPIutDGC + b8l9/Rn91589BzaV++xvb4CSLh6JDY4VagWbEp8TNygIRCB/ohsOn/M/tD6/0JYDNfw5v7j3EkGf + 8/4XuYfwObqJ8DlpF2FRC5F9gc/exsDn/EQXf97ewOdFmwM+7nxBmejs/4zefjFz0t+P9Qr0b5H+ + LdO/Jfj3t99+28yxsXQzxhfJ9OuLozudIQUQxDcgZNypF3b6t6PvyCUX39U8YrmBrWo6KDZgJ0vP + I0OfIti934mouVhEa14GmaID0wtdpTBW8jJBXVcBqTPgmgI2tmkpjg6qNMYnoMqimJbGg29K6KvU + fRn9wG4qnvLLxoaigS7EbA46F6NOHWYCH6giIgYZqENv8/38cJx3QB/JlwrFUr5Qps9CuVBCtQFf + dGx1ipF+796jja6PBh5ETXcwzEOM35uLtUMHAfPsnCiItdUBu4YpG3CbEe686WG4x9MBHUTX2CHb + 23sfPMFwnit1BjUOpWsq5OSAMsceBaCnI+boIOdJGHK4PDryzo917S35WhLbixR3uHsC2sgZvH8b + L0sgfguTtWkFY/tO79vqiEsERpfUSKCD3O3ApJBwvte1w5CGx0Tk5yGsLSYCR/BbbIqIQp90R+/q + BjrQh7qmcRNXgGgb6TToUgjvgad2mtWyTtbI6u9+nf7V+Nsh/vOPfwDK8UtuPHGGb3/dG7ijHEbX + uHtAFQk+0Sx/gqVzQOW+OHu/Cc9/P80B76AfN8u+zO0MOO+ymnFofHO45+N47/u9b43DvT8ZB0Af + X8L+1i/kBWZ7C1Ar+oOY3fuT/ifNeN9PdcV+yfbRyfXurfD9ZT3vctbbIMruxad/LxtQGZBClO2w + pqmlLAC2M+7ndIQw1XiM8QH1afoTg4FnpjZuI2CUHZK7/1jwy4zHujz2B0CwhMfQqJBC216s1ycY + YnR3xzdNJkxXDBNxOqVCAcfmw4+98xsaqyZyPpMroRIZhkhVxhYMGoiSSJ2ejMzJqMvtw8zHmzP5 + CIGXRBhjqKcEkfoZeyGjr6LjQn3F0Qcm1FAsW/ligQ3hI02WwUD/2ciaOB7mVBnqEoqsjpkoS613 + YY5z+1sgualqax9tIyEyMe8jizrGXAyvB04AppoBc/ADPPwur8peOTByrzj0XsdJPcoDJcDz3XWc + 5mrVXkvMznX8ysKIPNn17/LQ2zmcT9whOid6FAoru0+iiZaEmtelAgdcTZEel9zYFCLHJ29vkrkB + 3QKxyqeC1jLzZSQjVdC5jwWBTHaALdmzTFIrmaMH0S/Eg4+EaK+Eo2b7/iR4f1adQ+krwjmDz3hf + /bkTX8RHwr/IKfJprOLN3AI2FIfjBoRr2RmvvYDbTFwSch3gypNOsdGIsJv4ywR+Ey4yx3CKixkO + Qlyb4UwMRlF03hvXQHmheN5KEUoXfhKdbJiamLskE0BSofDfvZ/dAawRxNjfjzA69UbUokkLdQzH + rWi2NQbxZirOCEQL8nQWX4QixpYLfh+gv9izjE7fmKHbsVaoVSPoj79MQH+oyLrsniBuw++h6RWQ + 67OrLhhmMBsPtMl2Y02JZcWrRz1bmaOTySy5LC5aKGZoU1DcXVgCg1xv4gCjM8a05kA851XTmXLb + yT92NdBhdAMEPygV+WKtlgdeiF8bxczRKbmtZuz4CYqoQueLthfqVebonLvsGnQbdmn2rVg5bD0T + phZ2AU9C6zyMvidYlsGC9GHgbi0YBM9gD4y4jSoK4BAdy4eZpnjI7sVTCccWZBowdN+qIGqU1OGZ + FeL8Q6nWKRYKz0X4lEAJZufsuN30rI2g2yncJ4l230i2xd74XMzQab3O81z0gU9MwHYqsQSUJkum + rM9T773oc2KLyOSH1thnypaZ1ziotRowbg56OIaG4kEdR0Hmgd/y0vzK466I0oJ5+X7ijjqONbF7 + /BBmmWIi8RHG4k5Gh2eWCz3xn3oh6m1r/D9KhRv1KXgDX1SQ5wgEXgHocerYsdNzw2ZhjAACEMLi + satiuz8kk1LakwVTMH0s3kba8qWb6uB47RnJgqPQ8qF1CkqUT8mfdLB37siwxtXyEBTw1Az/SQpH + 9t6HepKfGIsJNknWrSsvpYu8az2DxC1F2HX0VQKzDgrM8erSMtW8tD6r1s3xJGwO+T36O0lMSd0K + vqIHoCdauGsCBh9MxEh9Nrg5QBO5iJYGydWW2BDI5TLyQAZaSqFx93VuaMJV4c3+HwNK9qdfgMks + ZzHz2F53vmhzhSYcOF9kuiJvEmbLfz83WeVlk1XcSq5yR1d6rsR4g/4jvSeu9qA2mQmLDlkFXVs+ + qi/oR0j/lKJCNVzvZWAGCMs0j8UKxULdMwKElIsvd6H5COMItWrZn7ly0FOSacFB8KkT5g7yZVgJ + Q17rEHGEDbFwg2SWozGWqouto4VNxh0TVkGnUYmSSOh5kuor3q6r9SKwbcgDFgNDVotlh5UoiqZD + PBGOGoiHHvpX4lM8yUOlNzGAia3b1lQiKlbY4H3sU7hhijGLTyoqIL1HnAyYUvx6Bl/Fmg8655tz + uH1y1B5ObCfH6vn9nptUylfDLJO1Zv2ZPyj5MadlYX9tOu29qHdR7Qne4uYBt0eq/YgaU6VQL5Y7 + 7eb13RUoSJ1ipfZcL3WwXAeJvtM6Cy+ViP22Y4zaKjy8V6eLsXgN2FkJhR9bx4FhszkmqVcr4LDR + QUpE67dzw6f3xw+roW0EullHnJuaRjme5B3JWgVRvTgTiYwOzzAC5rLMJ8WsKBaccsSzh6DdkTcW + X/1sTdqTLmcPvKs7lhZSuruW61ojhToFarDStywXFxB1AW1AseTCeLe5pqi2jbP6ra3+fWK993Gt + BsNe2faP8SxP8Y4xPGlkJExtzGUjDKQ4Y/T2y/h4gCF9nUqlVI+yyMQSCcwyVm5dmSrAbmmtKkXP + 3Rp+Ab1Rwu7ciChGD7zCxzT7finRLaQ9oQS1rclgyJomfsiXJikC+6VquVyoJLjIBGDy/itizcpg + 2+/G0SJDoMfMUT1CSeINWIe6pnMwku+uk9a5KIUh67/gltNRs+0TwDjmcUrqG+17KVE/d8ztGbi5 + IjZ7hBHINzBUWx/L7Wx0HFpOntAmsIYs4fbqrFKuP5cqtbub84jqkeQd22SegC1q6ozdIBNjD6qd + MFfV7eeq8U87VyGvmeDY+4VyR85JB6fI6QgUEgYBgS8yS8h4ySdDonl+imrbT1Gx8K8zRyhVvTny + 0VZaYWZWmBvSMxUu9hHnJirmjopMVKVSKZeCUa4yVdFi4/GT0hvy3mPofUxk+b7/1gSJMjSwRXN/ + PLZzpVpkZv22FNSq3WF4n0eCogercuHk6qvTUYyW4j+WkVYKTYljyvPexSh9jW1rgIcVAB+4Pxr4 + Cz0aC/sLE9S39J2MN3PSWFE1zTVIiYpodbqJcR2e6PC6kqbmea7WoJxn7E0MTAEhnspWPl02H9iH + j1dXrHV60Tz7eNVM09H+z/87r54tVMhSdaW1XRbokxCbOsX9RiXqtIi+S3Jb+CUIkAKYLjJvr6ww + p3dVlmzRYCNrq10rmqV30KM7bis4oenmaUhxm7M7rJlq2NDxEHUE+4MceFexVivUyzVgRfdYFngV + Fo657QUwWCJ9YHeGaqYBK9XqjeJ+bV+4+D/IwsnAaFcC/cu6mtq1YgmYZIW51lhBJXQIUtUQBtaD + qH6N1RPhJ+4PROFDRyulWgEYTJhPpw19rM4w6Cl15IVGvb5fESO/E2UTQY2Ap810E4yuLnmVk4de + 2a+X6vt1slT5DA9MoZV2AjXS+tdVXQAkYrJSO1ksF+u1mujkSahCIlDMsweGn6GO0npZLBdKhUoJ + BQwWbUHRREgmTprV7w3V0RgWVdqEFKvlRrGEoxYaKNijp16VRLhDbsBCVnscc3ykgNyvFQo1mJcL + TKQDeFTZKXxLGbD9pD9ZtsMpSDuVKgulEkJsyeKsReXTJsY1eqmgypVasSrno311esDamGoHbPIr + 4PxcGtyAAx2+5nI5+tly8WfEJl4oN5ZsQMqOhrqYsu/h7Uze3X1ymGWGRcvqZvwKYiKBu28hIMrV + /WItTULQy+1FRHWxiBCt7EpGxLxR9O+trQ9gHRgbyYgwJ1ZsjoFo6fxjf79RaETZL7unOonk3wvM + lDSImPmzIVaAr52nLSUTncnJS6lcqVZKjbrcXP6pnQbC8Z1ZKZAa1UYBuKQAFLi+Ujbj44qjrU6V + sc3JCKB9UpQDdFBHGauOs3yV+WgB0VQkTya7s8Xm6u/RhZLowokHAkSbk8zpQD4pIzJ+FWL3yhT9 + BwtmvVTKUObauNMhEbohEp6hieKkax8Alng9Tp1MkbbHLrBKDChVk4HcylAFNdjqK311lA66ADo+ + BkMg6Av0X4Jw+qCOUjUlpVRJg7UPBkO9JLtZqqRCoCxzCyRRqbZfqteKEtC9V5qlAcT9OrKH0gdZ + LVSrcjFeQ2nWxOK7FjWW5Fari5ywFRPwuhcSOr7EeBP3OafEpizf+PO29JJ2/kL8SGz/BQ/C2wih + YpGNwAiDeqXdQDSjVcrw4nQalXJEusbeJQjXUAkhXYvrBmYh3EXiNEVy+riKyM7joDth6bnKLmPC + PtXibcJgOqXR7eRD2MhT3OiIc5fYtj/lim2BcAbRrA9MRwEVkF5DA4AyVQe2rkIF/RfVhhcY9aFA + s8oTHwR21Snu7iBgdo+gQGIjKNIm7xACU4HzEgQRaQLqp8M+AQQHZPJI78G/JsaBbQ9F8JIQcqZD + PDlQqORLVXKlsGLxoFBgaEjMLTooa8M8+mCz7ObTKnuJa6Ed8eooKM26YCeoigvKjTOH4hFOtDq2 + DN0B7RAGp1DW9jl8B2k7UdSdIETWRohzyLoOICYjfUtQaZiv5gslgfkCYX68APMhwHjycee435zk + x0PdUDVupEyBv/TnSddDawoN30nA0ICaPi+7hr9gsvblZFUOyosnKwwZz5ymb6AumyWfiWM2EwUT + aoa2cf2Rh/n6VrI5kMoJguZltnFD4r9RSXUowqt1jcUNZNvu3IktbvBoiAPN25pG4jKDqVKqlKvo + VEozlkIg8sRdUwBV6+VqtQpWAXG5dBjL3EglypSFeEz1HgXAUPm3+otU/2K1WGhUlmv+AUzgVaox + GZl6GsYqtVJxX5qYx1RyAbAeLrkF0HC4pUINVKKH04el4PgK4OrVQnk/c9RMAye3H8bWFPRbWJ6P + mDgpHVypUUIf4R0WxzTYVDzVIEPmpdocBPDMBJaRDLVeqRaK5QIMGYuzY/gDoUiR8N+vuh0xv+a3 + cDM1KqlOJni1vYtpacjc7hxMH4TSr0UD5EJrezPuke/aVu9RAdFipjsGwP6sl9FZdoKFwYbHwunE + TElEF5ns9QYsixaWSgcSVjXSYdVq+3gaJCze00F+sYYgs8y0jY1yo4pWu58cfgm7zJPKk9q1UqlU + a0DXSL9IBzXx88qn9qpSBp4U5J9fgDLMZW9hKvsUWLVipVIl35Gf9H7BIFVT50bXnqlp4IpVmMka + 3vRwRmXZCRZOh2jqj486qe9p/KNa3682CrjRACWFMp0OrmvrfCG0QqUI/UOq1XkY2JpMqLY1E6qm + M6Gkw1FrMqElMfjYxq6YkC+5h/o4wogudDyJMluPC/nShaZvKECI9CFkPQy5+jSb0sl3pRdqOW2+ + G6ViwZPfQo2/CCCwaN+TxVykIzoepESU6JjaVk3fyyo1KkXkHJexCus3iUdjuOZgSpZUR3itCIyl + hhwByzLK3+Ks39Qila9YrgIuSzWp860PHPfX1DQRUKzvF+sYZUPba+qAtbk6irSRqoZEGjGfVyKL + Uq3YKJYboDnd/NRefyjYyhSsSjB4V22sgqdesLEHrLe3Af6wUUCg4gJm1mi2LJrdAqeg4eloGIbb + TBW/VcyVi5s796IW6823tyavre7Ywxv22ia4eUXKV+HhFd9Dzl16EHPsfqJnr+jUnQ5V1+kMLbfT + qEZzKkTeJEgR//3atm51g3wKKQKDPUAv9pyorLDcqJyIYTxv8ifdMLjyBEtuYru6o6jPIG5xB22E + 56qUckGhtP8YWVksFes+gYp9CZqkA3YjwLAnJ8dOCQ47BjgHIpr+GiGxciHLEJQcvgSzQU3cSzjM + wHv5W5uIk/YiPYV4hn4a2noNpgAjCeFXOV8u5EPQuj0KHi9WyjXc9mgUCp6lEVyz5UEIblWi9oGY + 1d4QJALSv0gb4+BNRRiogpE6St+YYYZfb4xfrIlt8hkUsHB4+CFiVtgfccy0l5yLh7MS0mMBnhQi + nfepLo/hQTfqU5AEKEw3aN5PxFGg6pHXFYOrY4xhED35BqijCgXGtB2Z1HVUhx1447ABptaBaiqs + Fwve0LEu/gQqKXroAA0MU5ciIgYqmMlueFYxaCK62wmN5yio0WMz6jyRBicqQgF6x1dX7NPlWfO2 + tSNP29zqf3k/W7WYqqxWE48brqesLuU9G5yWSOE9Hq8OsZ6TGR1wYZbNuNhDXUdflewJTw2l2Ff1 + eqFeL/knnebrBme3UgMmKujVihw7mwez9bZxAsDNozgCGLsJ4/ARvZswSa97Lxba6M3tDgLzfFA7 + DHnzpOquov3WU+mqW8cSV2Ln1WPvXtyLJ/T5l2VK8T3wtRjSLt1J8yB35SCch7wjD9M84F35Duch + b+dCTEAuKInwLTXeuFQuFuoA8USUWz7y7V2ASRSgzqYzUAoXiJpao0bTD0rUAxZd3lM+G80w/Zlu + pSGztr9fxkDwez5j17LsUrgu3dw5TNvjKZYQnd71nhswNI8dbeMQrKYyNHj18g7B6u7YWVtm/4zt + ZoZ53HqsjLtDxbYwftxB+y/MfNIMwGI1HNMXtuNaAI3dC2hgzLEwd2IbWnP1/W2suXKxUqyuas09 + oO0SGYPGe3gBFSaUDRlq4WFlwQbyogU0luwJbSN2YOBoK6M1pJrwP7cmjjFjLnAQp2/ZIwdeoUWF + QZgTF107ljNvBxLuI7zAe3q0PvKT17aQEgqJCSQJzTLGQ+UXfTAweBpNFBrlRgpNhAUJGfhnCI/9 + RcDbjCgoxdzGRAEKV6G+vypRoDGMNozV73uBLN/+sVBuvHfYt2Bauu9/5s434humGWXcHGCAMB6x + MPEKZDBGddCRGbALV4kEjC90XwtymSMAgeg4AdDTow0wnUwBKHQVlLo0/RzIQB0BY3C4IvzlinCY + ixkGasA04Cm8olKop9CFL7ORVs+gEXYsGmEKi7raQ8tnQ3Kp17Ygl/1iA5M3r0EuNI9sRN4SHZay + wWEFukPVRceIjgtd4zA83LPPwm9ngk4WQIA1Bv7Tw1AMICLEg0r3WpGjhdJpMZGpDup2ZxT+djUx + YYw99gEv3Obz7ILQP8cu8OnR7vCfTEQoK/GyitjJinJR4c89Y+LoT1zxXDspAeKlSnW/VIgdsygX + mQ8gzY5FXUtx1Ce8aE4Z4cITgfOqPYOflA+ZIunQ7CwWJN2W6h7dFhvFIoqdRLoVilyLgHuMAJtg + fhNMNiGOnbatMSsWPJyV6gk0GxSbF3+lygqkW6onkS5Yq0C8xdqqpCtyMSONDiwuxRF6MeMRP1n0 + 3wP26SUNHcYt7oWXI/eugRds8VrtDS3kjRJdklmOObdB0XCAxm34GiNebw6iFCGfHoUnYW8T/C+l + 2diBCEEasHBFXrsFNFuuVUq1+TApdorF8NfaS8a18DSJ7xpZ1Dbwq/3YemljbRbU3sinUNrtNpFc + 94lbROJuQrFFJL6HtojoQWyL6I6e/U5bROXULaKkmP8ttogWh/q/3BaRf5gq71/8XFiiIsb38f3N + TakqeJMYPqZ/jkLPnh2wxUoMyKZUrcmTUBL8kt0SohrgDTfqUx5kWv7++KFTBMnYKZQqVArer7CV + cinUedrJkTu8/jZKi3PZGVz2kYGhIhkZGDAxvBFkfnRC+OIsIJku2CaJLY34NsndxW37RbZJXikc + uZoejlzdQXqDpetvd+HIHr9K3iZprr9NImZ+s20SWXfbbRIJZnfbJAHAzbdJAhg72ibxEL2bbRKv + ey+2TeLN7Q62SXxQO9wmkTB/r22SbUOdS43SfhpLwncvvk1CjbwwU9psm8Snlh258efhOS4fD1Gg + jnojdZjqfC+V9hs1ZHwtrzy77l1jhaUt7CJ2dh7q5iHM87A2DsddCHM3e0/zkLfeKJsHuatdp3nI + 6pdULlStVffxxMXxDzDy5ZM0nBiPQ2uQuuEGbL3UwHFfQEF2gSWXwtxuG28tNukxua02X9Kjsauv + EI1d3V00duLmS5RzrpWVKmpUCa8V7SVGz33alEUJ7azIbs0jjqOrD0SGi5hRleAjrmF+kdA2ZDZ6 + SPNbdk/tkNEV3kvIsh9xbr5lJ/qA1FTPxEpMsBAb1Kqu5HAka7KZmDSiUiXqx8wtdmTO+9fXGUpk + ayw+GcuD6NcYVSHKW+dmBAa2POR+gwECLXHl0errCp1NQ0LEA+DGBMahaLY6sMQmYY87qm0p7syB + Eo+6plEx1YF5dtDMX4UWgeUhPeHVtNAg+1E2CGQm/NrQJDsTTYqwUGozy9rYKBTXNFn02Gt24VDD + WvacQ7pnWQZ2DS+loFO2S0dQqRaRaccc02DES1DMB7V6r8rFPIaSkntRcS0l3su+burOcgLC+yvL + uIcvQTHpxRXVUW+O9XqtHsY7penoU1/Wp3IRpNy8H59YJztDEBup8DsOXvcdRwleSXjvZSahryGf + pHgV9kje8Fe9lSDwxmBXOtVio57ilfTfL/JNdsSA1nOQENBFcjYt1eNSX+TSDCRBqtzwU4A+SkoW + Skzcxuhj+Hfi8Fl0nemC5SEKaDE1aoWyT9ewpjR2bLt6z+AHwIwBCPyLQLyNIFRcafpgmRFzmrhD + y9bdmdwNxIszgHrnsqnKi5iic+BdxaSKFvPuEFBPDBtvlMWBgJSb8FmtUuqUwrcxxchGbNOmZU/9 + WhAS6S3q6wGwvTXgeONP5QlzhLGCgOgCY34ERYz3LFsTeNivFSopeIizOVGbqa6L+1MgFMj9i9dz + WP2+Dj8l3O1p4uG6XOwQV+0UK8X1SeLrQUWMGjaFsz41BEm1wym06RpLL2GXItxfNPZaNRT4Eht7 + KFsXWEquiYkspzqocaTLnducgw7+A7ftGWuNaQPfpmH8wPtA5LZwpeJpCRf6Js5YeF1g0gO3NcWE + 04RPR0A9pjt97IzB/rA6lOqtuj4V/XOhME5p2zSZy+WSKW65YpMixF9mY0VccQ/N1Gqxi4Mjb5K0 + BPneN81L62oKBHgDTYHFs0LfxJJBL1UUVuH8oOKiuJsXis7Ehtl2wnnbooKSOGGhlkbKKLTu0aZD + WgkLNxJgzAMfyvVDOZJCfC/LhFAFKSi+MC+qVubDjbk445S9ix7sQeN7S9pdyY74l0My7rKAHZPg + aqaKPpSePDmHJhmFzMD3Hjd411Zd6I0UXGy/lm3s16SA4xSNw674k/7f//V/O//n/0GHBt4kGe89 + iEaPBa2h+dAemzjdrRp637IR03R+T3FUU/mC3prILEw5fxShLrXGfspU4LlohxvAezCaFXp/6sMW + ZwOZDBmKi/YHAB4n3a2ALcii+3UO2iclua3JHMvQPIi668xDhectYJg/oNNrQQtZJixIfP8B+C07 + +f/+l2HZWXaB8Tjs0lVHehYgOUN1AzIKr/CR/osi9h0VW8UQUWiTKxXF6aH8hPaFV6BSKy1Yydf6 + L2LRESB2r3I2xEAvsTCvCSaryGXqQ05EQBJRLWpiz4O+twLg5Qzvq0aHT27YiLjfDIwsCmT1gB6w + a+sJobQpQW2GGuYahb577ciQPxmoCvoWHhm2GdCpH0T40dSfQJ3yaHQdGpPGqtodiMBNdYx3tAPW + ikVYkSlYOz4593MPGurE7A1hAFCxzb5YuukyjDuY2DxOGCtWS84G9rI9DOZKlNLxaMKUEEyGjw56 + bV8HpdURWRddGxRgnB2pypL776GZpZdTmCHWxVB1lw9Q/MCE9mwLqkIRFDRsYFhdgDg2VJeOKMRn + LOYDCwd0he9dwdv1Hrzrt+m3GLT/6H4yskIpfYP8isfQQ9LzdhS3FNd7193XMnAfwe1AxyeGS1p6 + NAYg4X2CEh0tFexyrRsBQOA3UKWvqP2IMn0v+rKp423xxgJl8Vanihyw2ALY319k9YnEClQ8Hm5+ + 4G2LEK1ykWkBfT9ZEpahaxpJ6YO3us3wdkkiOtYacnU0caTfSIUZ0c3+xGC0EYVxw37OgiBUTwbp + pUdVeX1Nvk/DC67ycVKqBQ99rMgo9Jp/egIFQpqvzQ/EYvdRLJVqHpbEvl6W9saycjB0szi74KaN + J49AgxwPYdWD+oCZ8iMioq7gYRY/s41jTAZ93NhYEhe2EBHLNhNC9FEu1uv1FZ1KsprfswEH8td7 + Ma9RpGPL7fGUlb4uw7BA4HWABDu2NeYEJrobnvA+gWFESy1gGEs2wwn8Bgzj9olHs4ULQ2u8Zq7w + FQ1w53FmqLYysMEifNQ16N0j5T4GYfakO0oXljIoUrDKUSZRCuQwHS2MLm4RaPTizLK4icguzUdp + nyFsdkKwmYQdN6/82OKYwrAbqCvrQkH6B8VLJoMx1xY56h1rMqYFtF8OOeojeXqQv/pZaOiUhziR + QSfdoLr4FT31slYdcapl/ixL1TuhsvAsy37SWZZyo9IolvcLq55lCce9ZD312fPbBV3HbWd5HOVK + nQKNZFnzSSW9F8WJao10mshrvTdUAd6pRRl8gGFGhw9GkzHBEAPA0wG70w2u2TppzKeGPibr/We8 + MPiD2uPs8vJStgmKcvMbz90YP70lZ3DePRmdh4zXh0yyaib1UmQhQB/EQJI0NVziJEnvRYk5Veza + ApV3N2pYClPc3U6u3KJN2McFEfLIXW8r1/sV2s2l2OXYfm5bFHvFLV35WOtQdzqlUvzG+aQCCYIj + WmxdcSGgLpEXzZ9Orz62Lj815Vn0yzvW/OmueX/ZvDltriUeaNchzOkS7vYR05MHigQ2OKZP768M + zAEs7blbVBIPgkQRQzekFoG3dG6OP3Xatx/bHRhHdE81/QwIDvkO9B88bcjUJ1U38PYyNMy8lFo7 + HtCtDQSHSZ6/WazNxNddGlW9zCbDZIw3QpgD0RomG2xESDjhfQIFx0ptvu+A4DdQfT7K9iPqzxWe + fqRjC+spQNDvycicvxdFEhIdPghOWMhjRB9AVzCt7Bt2epx9I87/jI/aE04afw4UYO9E4ziZ0gST + G6mYz4NIjq6Y8M2PPoEPe0HRaCuSFSKoM188LRQqZ/vHJ4Wzk9J+ufI97iU6LmC1US7XyzWyKkbq + F8sGoQxPi5h3XjzUTe8hRsSn3G8kbqftTmaK6Gvm6GQyYx7XXVnmpNzAEUIunRHxktxB/1TA6oer + EFaHkyzDi39ZaQFSzWdXCg6JW8BbT6xmC1em91J1xt+PD4vl6tc18DsVbJvH+NA/2Locenl3Q6+U + Xm3ogtett9bCWLm1oXuaxWJoaamuREtlhxTxemhJHXs8ASPzMXE8wXzygIf2TwEerjFemPBQW4AH + lz+rTtd6FkEYNP7ff6TzHPUMpKvqxEZIHJVGuL8dQ9UIukK4UAoVpbAf5qUF5KXN0tmH09NS5bRc + /9p56XKtIkXOr+sp8cFYZsdRDY5mQSFZYQiXWKQyyHJbOVg3ilVIVBpucZMOTwGuoTDEKNk/nodR + 3+5UBS2kjWZlcORYxdiWKZD29WWMt/8wMXOs2AjTdrjnFPkqyQTtUuzqgVgPRV/DoJ4nXtKI+SAU + F/qCv+iHI7oSuCAWDUCYl+zS7Fu7XPqopwUC33qcWYAHFerP4caIyb2tUSP1eg8bLjaufJkYs3IE + I9jD7QY/tOmE+pwBm7wZ4w0DnRohLZYat0fkqGF9sMOwcIITgKDhpoxH4Z4WvEa/Ezjqk64OrIFF + zLQ1tmzXUWRH89APpekNKZnlydqZI/lFDpI1n3tD1RzsymuRyqB257cI/BEJrguSMkNrTN4Kj9/I + Zwz9FFG84mPPypw3IVvwVox4WZ9CzaZ0ChoY4WmeWbxn/ot49xzon//SN4Xne3nqlVm9q+HOiAr5 + ibGKcYyhgh06XgALehMBNuBWx1Sf8OLUcjRZQeRNgsCS7+ekU22xdBLgFomnZeJFhmZ2JkBybH60 + pqXhZuWM8tGR8yoYrVe1O3FdXBAj4A8wwFo1evYgvVgCHpIKr2vmC9hbIcUynUkXfcnduQpeD6lr + iuhnhlHc7WFGnlE8YF3D6j2+T/Bk2UTrI6Obc7j9pOPNj33DmnoXBGMN9FUFO2yPrjXWRyqeGfYd + WKGI3SjCigVMYVUuPFerQeaSELyR1dUNHgMXBaG0cGBdRRTNjU0JJe4Aw5hfBcOtUQOIp6YRZze7 + xoTPX4W8DAMJdyHDiqM5oj2MgEsnNDnjhoGMfdVGAS6fLmryHgssbBLESdh7HIQ+LwKLGvmNFQGc + +BFq7Z+TIiU1KjR13dWJcgHEYr2WBHEhgZIOv25A9mIGt0jmezUt3G9Zm7HalqviTW0dwgm2WIxK + k6QCCcw0WmwDNlrcTraMx0/rk2PYMy6MC/jHtaY423nd1EIpUi4sujtjOnczum6CNitKJm0ELCRl + 1OUxF0pHEG6HDtR8mBjGKe5ZQVF/S2AZCfuQBMEugCSU+ZWuZ0+jjVWosaeaqqbuRs5XGo1yabmc + p2IvJOcF7K9Nzuc9LK/ANkVRZTn3PD1enXMuByoZaBjoRszzZcXTloik/bxSodpJw2jnnLtbYTWt + BR+90RZeST75C/PNGpDmDJc3kVpv/EWuakpXFcsrSOfhKEZX1fxVjpf+ah2YJL+kiMpg7mwMU+7y + Zzf/RX1SxVMKaMid37WPNScnyeFYe+tDfYfWOZWMdt5vHYw2v2nafwyxrjHySLn0O/FD0fGXCWwq + XGRd9rTsOHQqc8LKtBwUBzPwj5TIEOkNC7/P4G6s+C9CX8TNFU1FTfQo4Q31RGzZYt0Q2vi4Q2cE + nU6x3IiZc7F3CUjzS7CBrWsKpT9ZYa+2eXeq0iEgo4Uxy4Oh2yYoYZRSiy/F8R030JJcfYR9KkRr + O4au4ZkdTLvmcTAZR1L4N4qBTTxyCrMO9Q3vrCkf54mDBofVJTIK5XKhg6k2Kb/Jh2rn6vj+vCmP + LN8LdjnVNXd4mGnsA5GI+9RA2peD6JauPsh4TNvrBjQIiiC3cYheY5VCvdjoNO9OJoPODZ9Cq8Ke + 9Rg9YkPMZkKEByppsFJkgWgUo0duG044+mzL0sV8hBohTXQ0APuNyP9yjnmYT/DIhP2YhSlXNXli + rDVxxiLryTfAqwlcfAQyKiMj9vT6gBw6/ro4cUw0zQyGuXANTxbQpW94nBaVbToNG70DAWPQTrgK + BDNF6ulCRdzU6mWZRv5vOoIC5qUOS5x9UKqUlQS7gu46THTqWnY0yA5JDhCsjilFNBVVYVWqI9XM + yWb3HOblONFsLk5B6DaehJg/p5fFi+rwOgdDxfTpQ33EHMKhRvHPGsf0KC43ZmJ0KqZLAY4m8j3J + rKtzxv8qWZ3+ddb9HKlu4PNPxtFITDwKC0DWxBkCMNdSRlzTgQSVvtrTDd2dKX0L/Tt4XEpmYVJd + FzNjyRsSqyk4PcFkAd7Jk4MomYnWkBpla8xrjfmteTgXrTF0S2M+fFn+4xhDVzdCxlza7/lLFBKy + fosdHVmHEvKzC7/UQfxuhKPg3Uv1MUjHv6iPTb/UfB+Dd7sjqhdJ1xWNJt91ki4/DefmSHjhIxbR + IxUbMIKIXTH/480yhcs3GUGX4++l+lVMvNlI8DoYsTuxccqBrytq6Ii546jQewVstmj6cjxqEElw + LiheXrSCYbZJQfUea5XNeWIkOHIumsP942hGc0oFHopWX+G63Fdpa9HtO/VtrmQqFqv14lrXqXAD + 7zh5ALLSQU3wRi00iCxQxsSkM45zx0wJL117gnnUJfNeipKEG3cwBjqkbap5Pf+cG+h9pD7V2FYT + FhqwnNLVNGBD/WXGUA1mX5ce/OIrT6rOHv3fR+n/E96ag0kdVtOJ5XUnqBSn3ykQydoPpA68PJyt + AdQDOs0QJaosOwFmSudcT4BouSvVYjoXzSUp5qDAs5v1GQcIH3sgDuP993/9b6RuWIE91FtAKaXs + RkTI8APnY4rRZ3QlmUXKeExb+2Y1jfU/rPI/rHLnrFLMNbZwbQ3VKSZuA7TNhny0O+Xun+ICkhOB + zmNJYlvodq+ihHtLxS+zu+n6jxH8Yrpvad0EfkuT3UaXQ8wS8PI6pua53aGq5KtJmJhOwUtxvdZA + mxF60yb60g5cfZshWGov80mDTyUym16NlfSXO9V2vawrYzxD6Ix5Dzi3wcVdg7oTnTxdLBRuqF2L + 1JcRKEsO3iQ4HeqwvHqYdx8zCSWunylgKJS2Cm1dLitSH3QMvyGfnD9uZvA+9HBisy/q1PG0n75h + gWTSTVHHZ1tsIChuLV/b70vo9xOHP1FGdJBwH8c4QExn+/03O7PfC3mcUx0kWHRwhVUH1RLVY4Mr + JI3GK7o3X2hH4wm0wVBvJEuNdLAnQyR+d+ZaXiFbQbIrSaTGFHdjK5h8UnVXUT4W3R8sU8i1CdiC + y852wXRLDWmXioyyt6125+LPYtOGLg34Gvju5riP7MD88QRgEt01gywXb87xNgZc96eqM1QuvbzD + Iwx+X4k7P6BCzQEiYAAoSumhpxlVb2cC3XqO+g7lJgnXskIRF/Xw4Di22wWOibfFMnRVx25tsEww + CAe4+zFCYxb3MfA6OtRZhhNzYOsyBZeKuy8u2A652N0OyL2e0GQdggY2wFHjZoo6oiRgyKHx1jnM + Ficy0OEuCrH1uIdQFdJl+RbT5gz+q1lsQrHetas24qCO3sMevg2ktF+olIqFtExxsQ08R+b3wZm8 + BjqcCcnL2YlqPjK0Ymy1J+gFaCcXJUuRRTNEbehv4D1rxJfMceZIXHZ+z3vq+BWkx+kGAuP3dJwH + L3ZjDq58w3LMJEy/WHnrPZmESOi5vHAyxPicu+EHLyv1kXktFvqVRBcZhl0qqga8EU1OSrWDzGgi + HSgByo0Z+snCia9pe7JWr6Z4w1y6/duDPOeaybIQaNIxQ7iL+rq2h5TuySqVSqt4soopd6jXS7Bm + VvVkXctbpFWKWkBrmy6kxjgE8p/qMuLgkz7QDRB3mOEbU/mi2c7warjQ5dXO3ye049/TbbSMlAU4 + mL8+HSft5V3/OG0n1k5d//FIxUKxUO+cfDzvwHDlaMvzuwC0NhZsAtD7FfcAdrFeInqaF94duKek + qibI/pq8OeJkNzCZGfwJt86drff4GkEySG7CWx8mt36gAIE+IJpEjQnd9MIyBqsaXqOc7U8opY9O + xJUDdjsBPWvqe0U9f5PNwc7uTRyHIlhmsKIG7MTyhuBM+n3UCEl7I4emPRlTsxHKX1Gb+g8X+3fn + YmK2BHKjFXapwhJ9PTmeLr5EARe9QR+7lx495I6Ye7d7jftrC4746pWnFVwm1RVvWAjuA0V6Qeeu + Mp2prruYYnC9BDeEEnmcQFX2gFVf0xtCDbaxEyJ49StxiKyCWSlVEZVnQNdk3unIaY+J88SyU662 + le7PAcWMOhhf6XBDXNV0AxNIeQ+tPvvAMVoUU9bj2Ti+Jx0YQD9eX3LskjIQkAD2rkEAK9LVnyhD + tWNNDCcbJwQ+4rR5DuxygM7kUIeQfQLKB+jM6cIDg3ueDUPv8xzYjripj/Duhty0RkLUw9LhI2Lk + 1Dl0bUtGTjX5AO8dwitgXAwu9G91AFzCi++3cXG8+OJ4Ge/Fwm6X9ovVBuigC7LbhzouHRFez1/C + mfC1W/ibCwA6WPzK/vpN3C9LhE+CCHLlgRASMzWxkrzlhR7J7gC4vpdl4o+ZI2OOZ5EQ8w9+RM+z + jNRxyBgaK6Hk5vCTmbDAY8VFlTko9PjoO1DX1ISXIAucoYonocaWMfN7O1eoZ+H1ZaCNZsFyy7JC + tpBlsIa8D3iYYaoB4oXwkNxWaZW2SkFbxVpZtIZfoKFyqeR9rNReeZX2ykF75VJNtIdfoKFKvep9 + rNReZZX2KkF7lXpDtIdfoKFape59rNRedZX2qkF7tWpJtIdfoKF6seh9rNRebZX2akF79WJVtIdf + oKHGfsX7CLf3XR7qRZwHIR3J12DqgQZTLDQybOIAUxjPNR9bNlKxmVu7SUe0CIqvTP6i4CmM5wNW + eh8+VJVw1si/Cb3jOUCLIf0tdknmKueO2hcfr08iClyxGho+KnP5o1hKKMJAycuOGgoIiUWFt7xD + Jj7zk4miUvjbPD7KkSjnXeMjEn26A0x4wTUnGCTggFLnuPZEXgljoRG8MR4qkYiXLfGwQmiJoPKt + kOHFdcQ1Az/OY2NkVCM71DtBxrIt310sE7kthXuqHHOOJdxftjFKahH//QutE+Gq3cU6IfcGWA86 + ui0Dz2PMNbMpMvYj5vhL0UfcCN4BXoQNBnbhFR4mvEenQ4xGvk9BSkRt9DVDsqXnVEN7zRSXCUei + 180O5h3X5+NBx0H3WKdSLYFpm5REI1ZmQQYNv+TC09ZLslyKRo7mBrT6wWrRWakyM5mlIRPPEy5K + wZtOoFzHz63jW9TmY0Wg0Ngr0teBcDNH7duby/OLNru9ESum2X64vf+RLO94DYdDr7Wk+8QkHp3e + kGsTgy8xtlhQzusL2EKK91TehPvpsvnAPny8umKt04vm2cerprwTVnYrzUj6Y7G+/96n6g1MQQ/o + gLu+11506eL2gbVv2XmzHcXV2t2SZT0k++ng5yeRFl4wi9+Nj26aP7WZXOXHPyt3zXsFUeUv5/FR + HJzkamB2q/YBHnR4nwnKJKaiFyQGRV1rtIDKRDHDGlihHm5ifCddLeCtzbFtDWx15P9Gme+IFGBe + YrWU1GKie2iQ+90LNjaEJdq2JoMhKBL4EXf4g8yqzC0+zGngYWJ8VA+m0F8lInPwiAMj0TGvxN11 + aiEE9otlAsBmWxZKno4hpWMlEMmZniRyKEllFJseBRMyFIFbBafMydPgxdiv4MHt1VmlXH8uVWp3 + N+dh1C68+XsFJEdyZD+odgKiq0sQ3fj6ET23V7xfKHckQjuIX6cjEEF4ADTsEsW4mk5xGw5TZyfg + t7YEv8XCPyGC8Tyeh2B/8KWFaE3mYGHUstAjKOPOobr57Np8xNk9iConhupKpULZtOYTyYTQHX+F + Gd5A9PWAD2Iy5FItIkP8twpKa3cYv0HEE9LAi8LVkubOFxChakunMSafkqZzefY5LnBmE8qisyrZ + uyf8PS255s+sxDehO4HhR/q3ZA153kiZl3NuTQgk8LHuYCa3QKTNg0suuVC6JDeGtoNLW+aZ5JU1 + tCbQhVUnd75UdErDJJC4QEUl2r1TYoL/a5M8q83BnPDZah4a/4Tz8HKCabUZiMqmrdAPYupfAP8b + ya2leGcorRRu0Nm7JVJrXhCmTEOqpEqUZEBDCjaXOWpNkKDmhFTSnK4u83xA0sxaXeQlVl9KH0HH + E0VhikqRSDm/s4gMvvhT4HFnPh5IDi2EIpm6zldg5H+FBv6qxr2IW1g992SCM2tdv5jnfuw4+nOn + Wq/vRy+Jm3+dlKgxVCjsCGM9y8YshzBWR1n/slxqbWW3GLakCM8DnqOBpUxesiBfZbQkUuZ8uZT7 + ZEL7JvRvKKfT0ttk/k1OZgf2iusv0g3PaYfQSDdKyMSUSjR8IBZTMP8skU7oVbT0wMbLWyOPcDNq + Fp47L343fEToKX5KaC4nAEV/FqsVfzIjh4OenOhW5SrZNDatvyAit76/TYaMcrECMmXFiNyHITej + B6Q0DqCA1kzLpcNNIj4smttQ9SWCtvDImIhSQvJUTfifA9EYeMu6ajp4t46M5sU0yJRne6haznys + Ls5WhBTEBk/kkRcnKHY1PNYR384ncZoQ8jg2xF6GH/RItJW2P+rvmXfkbagURLAJHcjOU2sMAyGF + sBdsr+pTvoH3JesYALx2G3TTU3Im9V2uQS+1pDLqjTC1pGKNgXG6loIpI6NLEuZdGeoOTrhi9RU6 + bgeSSWatFCvWW6VBYP1c8kqGLSB9UlLKCCLwdACd0oy04OXFXGVJv0pjCzLk4B3Xm6//6n6xur9Z + RL7M/4n7sImjFNuxjqGCsY95muYQpZomdBcTHaiaRjqFarDxxNSdIQkrBBQkRr00QZCY0L+kRV/9 + Gha9M0CKLIKh1yEq7hCeRqo77CAvKFbDHOClyWZtdvGyHXol3vLiibj+k3vrXzr31u/PRCKag6QA + OYioCvHCxLE2/3jR/rwO+1icFS3ZPig0yoGxtzj32QpLfnMAi9ZxY4t1XC03CvWVNQRcx5jQBw/p + 4cTCOvUSAX0LdqL7/mfufCO+wTDwsMdAHdBRT/ihmz2wLPUu2AJjy3GVSGRbata4IA1wwpqGufna + 1jTNbdKK3mju112mGzTyOmvPnnUxFTkmUJkplo1XwUTSdqC1rg+IzJVH9CJFbPkU270WPoVCDWRh + hNACu8UWGN0LHU3RgZaSPiAizrIf0UUmCoXNqRUW8iu1tsAvUF7JLkg/qdsoNNZZ9TiM88nMO5I7 + lpzde3VmDTzvAD46nrhDy8Ys8TqmhTUskA4gvFlNQa7QVgesDeKE7hRl5FdPOpVb/+rW9jX0ly7b + jSzsl6eFdblAYo+W9mZ5T16HVXyxhqbS46ZKMpoDj1BHYHA5dA7f5ZpC/k5HpjUSiYxSGESlEDCI + HwAsKKGmimM/A7DsWIBlCuqaeHiyRYDD/qoVWMHO4S4Q9fXaFqJ+v9goFEtrqewog6W7WXcZBRqK + 5Il4lYhDF4PgbSHc5ln47UwoNQGaltxED55hYMppwINK517pBKg47KCazpTSN3RnxDCuJmD6g3Xw + Ac9FJLgAcCK/Nm6Acy6nOsIPdkkQ66783bX9OmsdZT5XHq2+rmAqbwf1AmMCpKNotjqwhGLQ445q + W1BA0yglh+r0xOU+qTp7I9DZkcs1Jav9EdphP8p25LMrbI2didZIZTql5rwq0Kj8SoLNa3oFxvA7 + tLzIStjKj1imHDlrsA4XZLyLMh6IQMduM6HcTziZ/ENMGzcZk2XAhhNgEvWoapCm8Te+Po2/Dh2H + fkd4wOvO/bpcQvYu3rMFvZI9WqE3r8M3BpahTcCGBO5gY5rZVAWgFuwbnIs6yBkpNe0KS3idKgvW + XnUbC32/Vi01Vs6q88GyR6CbR3m9n4FdpOR1SaDLfMMn+i94BwO7NZPEbu2r8LxHlpucExpKZM2t + OFnrLpaVwL4O1Zv8SQedimTixHZ1R1GfuZFG+6VioPzeiJpiTVNVdgxVV1gCG9RcYLUWCttIoep+ + sbay1SriMNQeHqXEtKvilJ3jZWLFm8OUvjETF5+JMX6xJrbJZ448ixva8v4jjpk8VfOLBPH8tS0S + GBFQMMdeR9bIerO57lJZB/rrrBj1i2JwvKpWH3DFVK2RTum3QInsQreByKfoXgLbQzVmaqoQqQQh + Isc/sCsO1s4dQpQi+gbhIn8Qu5kAl7URrv+aoK+w1l4G+CLBtE1wyX61XG7U1lEKz/QnWH2+Rgjk + MbRc3GsGm1I4goRCOO8ebunPiqi9REOkyfraViP1PLIOdz7T6y7VWAcWNL6w4VeyEsNBIxpm39FA + 9KXcUijcQvIyVrFFPOdLlrsHtcBKjKYbpxaAEBfFM0Wue13TffxazS2KK9t612hlV9Kl0DTxqiO6 + fDbUebF7tCj1NuboZvN517JJoSPMsKxHkt6o4jJ0goqEpBhmCTwlaQep9tVxCyKOCz7DpBIRm/Ll + iWZtQ/Klu7SQv6T9SInKTg6lXjcg2xliptGOOPbUKZUalegV8AnvE0KyI6U8mMDFNIwG9o7aBKHY + nu/GD8VuUY0Hqh6KyRbNbZOqQCDAxPMngC6KxOxnWBgBfi9pcPuRwcfeJQzcLxEEole8OPQRtor3 + E/A+V905JBTiSIjGo4sWv4p4dLzmZs9hF5YbCUsXyUvwbMi2Yemp26hymzV+ny/tqPr7qwuzJIb2 + jGJ3acg9LWph7jrfyJaWt7PkJ1WMCHigKJHDk27QmSk42ROg5ighek8VjyMnZGlRtZFudkZc83ir + vCQpxl2Br1D+lTblKEGhhmyWAvlKZclh8wlTLzQJZzICm2AWOvMTLwLalLffCbM+MVwdWNxkNA9Q + gsociS25KaizfcvuicSclFcT3abAe1wgOUfowmiHGsBl6ZwGpt/E9IIgRbnJRzp3cqtG7ocZ47/G + BYJfLVEVqjshqljI1QJySgivA9sK1+k3gDyOAXPAyAXavOyuMIf6SAfuiQ4Q9I+g7rQraornEiXK + GlJsf1/pqyPUzzU8OTLmS5K2Yk3SJy5UQfcfMJUs5fqm2q9ODb4Ai6tw1cJzsVIUG9em/viopw14 + F7Rx7yNAjn8BdeBNdMHchw4ZUWieMMkpmTyxIX00xh+ob3uRmBHU9zhocJY5eylS2XHa2WSyyETF + dhd4KuhRR9/il/dJZ40F2qWx484w6aQqmk5NbEvo9SZnpWtqaJWgURshHBALIkOg4qE+7boaZAPJ + 6+XSgwFswoORvF6wN5mlY/f6HCspNvcBI8ft04sDOepIR/zB4G2MHH2zHm7CWpvow8rC6l/ukN4L + Eqt/QauXfnk10gxSVzsK57bOcbUD6zAcRXWVxKzICcQZJLH2okb5GGVWeAH5tyq+HoUG3dqTPdqL + 9WUHRDrSQUkClQosHo57lkOUO5YCkkXvgQbVV3u6AQqk0gd92priPRHS3yVC3r0tnWoKUZ9gnnWx + lzHFy4tFa+zUQpObWkPmLltjXmvMb82/00wE2L8GKVLfvB5NxhpdGU9Hj4RbQXRlrfs1HmcGYGxg + 8xlGiwDrfKSjHzCLT7qjdGGRgvYK6xcPHMYJd8ldHASanQPoLG6GA0sVC75NsPEie1TRJey4t2qJ + lrILtEotNYXe7y5u27ctj+AFeQOxA6Mi7MtuR5OuLkN4XFJ3kQTxcE4P8y0jwVb2a4XKigJb1MZJ + x6sD6KYXwG7XesYbYfQe6nwE9/eQ6LJv851Z9f45EFClR2AF9MY/j5967RwIqNKPIMeFHy4o/loM + 0e+AdyEEGqJdMOqdns25uR43lFkmomexQcslfwW55wk9+6VSfb+RRi0RR6NXW/gQobOvQhPDWbQX + uHsFyhRdceWqM3mfVYgiFjojE7xob1ZxYqa4H7fzYtaK5WptgReT3q/qxaQMKR0XLM45D15lRTem + aO9l3ZhBNzu1eqFeiQw//jJh7EGRsCeTvoIZpBQ9p6ZpKd2Js4I38xIBtsNYoJZf16G52BeZyNgE + T9N0FbTC9Js0hd9TXIcGRicVPmAfSP3Ay91s0Eme0IXGwxp2l/fx2l6hY3u31JCPiZLphHpL05Gc + cFTHSZrfamnffmx3MET24Rr7M4ua5VHkqmPBJd98N6weyU57gbUg6oU8pb0KutuYNjjmw5rx3p4R + mRMjOmmN21KkRoNyFs/0jTGSwGGAnjBLggNY7Q2VyTh0yY48EXmlaqC9yuwKfVACVjbMQ7lsljCr + pLWyAbfy2cy63KqLDtBOsQiiOLxKg8cJ65Neiq9IpSruGGugiBcUMA6Vsa2TcyS+KquL9xiorY34 + EtZWtY7frid+NSYfeV0LlZdvVM0vDiMJAQntu4yV4KHYeWVCfrn82c1/UZ9U8TSDsj13ftc+1pyc + vKDsWHsbauodEgiVjU6q1xQQgdUfAz2oWnFpYyy5tQiMd+9ZvMWEtko7aKuU1Fa0RcCuq3ZJTdhY + nDRq9UaaNMF3v4swoYa/IlkSzZcG1sWYcqYFdyqBCtqCpwymmduYOYJyFjEQC8BKDjOdrqFiDqN1 + ZUAlX2jkzzn0Wu+1cUbAXu6UVub9gTcdOtiSvfYZ/wXqrBguwOS9lHizvePCKIAZqd4tH6A9DmIi + b8RtsNdNDU9Sk5CQPrNoKcKJLxy/eVE+7xHxmzWuAYiy6S1V0nKlUlikkuL7HaiktVVVUmrvVVXS + /UUqadLe+uuopK+9x77K9njcEQTLRqkq3sJRhLrlKLi0lLjbgvwU5WraxsItrkC8MzFYrDJNDi3U + mKtgJ0qpf//Nymypyj54vZOuS5nLx2dNp/KKSHT1+W7NLJjSJp+C+km+XNTJyesyAqX7G1RgMfsG + 2rgRNiRb8NDw3//1fzHcMoIf4jxfps3tkW7iMmfAaXVn5uQyL66UbmpC+4xmXX414FYnBgr/iyza + lDIJa3eu5Aq8az++Xs+5lca+qNlt2BeFCNozh+Ml3hpMtwe+1wOWdpg5a344/njVTmhjLaZXXcT0 + qr8b06t+VUxvzg6fD1z3L8BONclxE8i/LB63DKKxgJsxslhO5OhhWb+1NfQtPMraAtLTxM3g/mXh + YZ3LFkGeGMTwMdfKBfEiwWlYR9U1eQW9xvsyrRla0YQbf0sucmIWFTiTPKyi1Qirx8NU6vTlbe1q + RAlbhb0t4Evrsjg+7hjA8TulWqUQNb0jbxJWpXwfLMl6sCT9vLMOTILBKTT8SXcmIIDwCMCEz63R + enyNNu+uMNAuFPxH/fgqgv/atiQv04pmpZXhzeHcVsvjAEMPE5KtKgKFO8+5GmY20n9P7nsb88kr + 1IVZVJHSTTpVA2tQ7Pw0api4MFGjukcg8C8C8faBcfcVs6Wj0RNNICL20T13uXcxx5OtSBx1rWek + B4YEAf+Yj6yYHMmDl5TJqUm9z1yMzLUcX/Wim70Tw2qQPYWHsueEet32xhPrvohnHh8dz13sJwLa + 79FpNVLxWrdQbq3xGJicvyeGx6pB05qMxf7Hxw+n7AF1sT3chTRddSTjrYNTn6FeogEKmBM3iEcw + naOtY7RtDY7RK6D2dSe//EIpHYhxikh67IwJzZtgmGfhGTcDyNYjo0HjXVSsbetjYK0X1Oe59IM5 + utAqhFdxBbh3gcc/N/lRkAXY/fZs9bzKq1wgPo8ESofgdXb59edEXjgfEZJIpodgz3rpkEuZozs/ + wAx5nAeRfB67w0F06ED9LuZt42IPM0oQwjqhqIlyaT/NuIugAVbKMC7my0Vp5xwwQSsPXHzC6viC + p4JBvoJNJY+x0DULXBO/VsBbOXMk26ZB0JnsthjWGkhLUQnWPh8xJ+239uCUG4s9OOUkX+i6VlBj + dQ9OeQ0X6NYenP1yvZxqzODL38eYoZa/JmNmtTBQ3F9cwuDiC5dYEu01zja0ZsrFynNxf18eHx6B + VCN+MzHn2I221g7igp76ds0H9C6l8myQ9T1u8K7te5XpICfGr0E3Rapl2dEscmTQIuKNUnNeYHBP + Nfdc1uVspGMg8AvbNd7S2MxdU97Bua1qo1JedG6L3u+AORXnVmQKdxINvqZ/ubjIv1z83fzLxa/L + vyxdLclHjf1jL5HDVvDbtfDKJFJEC41AERWBARQDcZBySNJX2iP5/VEvuD07/jl6ingLCOJg8Pyp + 4OIWp4JL5Xq1UF05IQBYG2vhAJMGuCIaG52QqKnjgEIREfAHaz8eUAys7knvoTIeP/4rJmcz0XB5 + fd6pVgoN3ENcne+L80vxidmjgewFvnp/k9FcE0fw++bkFKSAQI2mO72J43i+rqX4eWlvVnFTJ73P + rrdUSUvlSmmRSorvd8H1524UT9NJqcFX5frpOim+/N24/j+DTupZmnSbSVxB7et4scWSs7UeAC8+ + QFRCXhZbkr7xvZ3iimKrT6eDvZ7Hur066wIu9EGFntMYsP97Xl+DuDco08cytGeI19SLrP5iW5BS + QOjAxuSgMfF/dNA5Fj2q5oDlLT0Kuo1xUqjyOg7zR0MBuC8bB+EvmU10VY/drH3pG7Bz0Xyp3ogZ + 0bF3Sde9eSUWrtd5pjV339sdAAqvU9HgV+FkD0Va0793t1dXrTVO1UuvIqIK1vlQ7w0V89lVHC+6 + RhmqQEcKboQrIzCpbAwKo0NmGu9OQpH7lotnGRBA9HQYAwBMpZ105gOgPTcC8H2yj9qfOs9DjQ/y + yaECuKsmynPV4XawkuN3tPm3nH43rB0FF0W61vgrw8gGlcRSHuOc1xIOHfyOownQPHG9SzEBGLux + pun3TSbctrec6SRwiy3VpFp5f2HsFb7fhZq0aloT0eAruu4asfHHX/5OrrvGOlh4BTUpuJo1vPGP + uzAK2BkD3VSR7DCsiGzhWrW86Eyud8Gsn/8iSBF0jseOsuwHbtsz1hpTNL24gOAH3gdDEJMK4TVW + lNMUypLh5HWBiS7sIKLBv/lcjEmUX1mF8gxeb5y3sn9ORIHy3ga3pwmDr4s5X5SEcYlz5hJnQ30s + 8abpNkerLoqhbAif7NsYQtey/8Jbd9bASkal3FLIYwnEZGdgzMbDDn8GOFpwo3Fkh2IdP6Jcp5vo + Zh6Pe5O0T5IEL8RwsQdyOXSKjXosRMNjGn0L+H3oXvrgWQdlr08k/ZRbt0VZZCQs+EqMxFDIXPJ5 + F+2ddorwolOqRAM1oq8S+FZQYO2ES5UNzkKAaiYv+Y5ZW6TTsdbF7UNL0IC8BxqVuRgsI4Nb6Ann + reVNwKok0fkyzkjtPYrr6lv49Qy+LioPJEvL5ok6jx3EK0AY3QGSUs+Pz0ZyUOWw2hYe1TnDB4ua + c20ddAfu4kaDa1vW2KsunntWY5tesURIGFfvHOTzDu9NbJ4bTowJBdaPjQkNpyggAqO8gFfsDh4H + OtTSNTRPaOtqGiEI5Wq5WE8jVnq5HrnOOV2i5Cog7ppg5VXirNW8v2xuSLkRm9zmU93UYmeQ7+nh + ItIhX62gbOzWqfdzCXWDUizH8VN7SdGAsuVS9X8vqogq9RgP7GLiMZSlmJUIag0wKa/jiEuo76AA + 5gvbGtCJ94zdwbOFS22IG3omuukpxk+ZqkAD1/SE3ZDEfVDtRRAMPuCYh3SIG3ICJVfi0R67wGdL + 8Kn4Mdei8r33c1m9UkVUKFU2W7n+uvNl1mqSp7RY8pTL+5Va6nLGlzuVPgLiTpZzoMZG1vSai1me + aJKQ8FQTMt75E0tiE+gmhdqj56KIdYe719IHJkZ+rVFdmsIShHdXN1ijFA5sW6Dzj0a4RdCSr1YF + POTG+I9FDCs/FbHh7PhJ1Q21S6lFkqk4PJZzMBKv0X6+NPtWcnFsIhNRiy/gyYZk79HnFiKrVCmn + a1dJzvPNxRXC252wysM/rjVF0ssc3R3/rNw175VPl80H1vzUvGlvqnJZM2BZmNwWU5LhD3ZPvxJn + 0+dgfRUkGwwmI73K4tdCthdOMBQRjYtq8WcXzB5uA00Dj22KX9BDYymPHauU5VJ08E78WFRlhPmL + dROESpfW+Fw+4yXtiTwbmBGbRD80ehJ6slCjnYxghI6hjoA50PcWfF9Ug8Sd1ff2rjFtP4k7qx/c + ubmo/hDT/5pqDz5EV2FJGiJX5Sl8W9xZ+0l/smzPIG/J32CUriD4XKMn1eGr0wPWRoebk5Xn3zFP + OfReDysja6qz5Q1EYnmZMVZKZxdJG43bGGMb7CMmsouQmtf6CGyi1T6+X58/BGZQiNCW0dec7bTI + YgoKY7o8q4/J8vIivxxH4grnnUvVUQMgeLTemIxMPXN0TJ+bmkUb7fjE1LP9RWZRUmjOdmbRGiE3 + i0iHzGTAfPvy9Mfm+jLFq07R02299wj6wUKdxFNtRBaSscKfx8hHzB6aBL1HMAOkav3p8o41/Zeb + a837W6sPlXR+kJRkZsG0zu3WxfnBGqljFk2qCIACdfHyrHm79pzK8KnQOvMOnyoeYO+0q4iLSlmo + 3i3CC308XmMLnDzrLubK1jNeTZ/xpOOMC2Z8brckPuNrHFJcNONe5IHIGbfujIvaS2ZKFtrlTFU3 + EN+VZeI71Z4t7diaLe3KlqVCeg+F7dVxq3V5uvYEBhBokz1p+rwi+WkPZvnh9GFJMY7FmkuLqVNQ + 7o8fjpc2KlpdCm+K4SGqzUEJn5m4j/FACduObbqkeoZGtL+B/GalPYR54thG0IPOmS7o8eVuBT1B + 3CmR5WkvT4QVYhryy/YVmAOXrfbt/c+bkl0E5pK4W9zuEhI+5baRJQQSaSqe1D5zNJeIfm2Y4sJq + cV915ijhAt51gKEJpA6kCeTdgkVQUoRmMpiwar1+J2A16ZTKPDQF6HwVj2PdWVPD8tbDVvI2dUWV + Eu8j2UbD2mo1Xd/eN9mH+9vrUNbIlRYKnnH0fGLTlJnHzAD5ARg+KMbx7qJz/J5iA0kVG/ivf86U + bHMv0uU4eLyqjybpBM/YxlS/IgoRk7lXarX9+VSroVLbNDaXNT4tS/um6sZ+TN3wdn/n93q7lju/ + 17uDfd7UrbNS4o1D2+gm222bre1Cp2xgnpfZMvPiYqkpSPIcMiGebwEfdWgTCL/B+74Kc5m/sEZi + H+n7iTvqONbE7vFDWCjf4k9MND0ZHZ5Z7qk1oieys4cfCOniETA1VR+YWOt/lAqY4Avzzrm2ZQ68 + /ek7GJB4kEyg/hHmULXr25PLq+aSiiTnpuIsfqjuw+391dkDWF9LqjuTrn+6QvjLJiZFvYT78RE0 + wmVwYNB57UmL1jz7dLaknjTGMf0ZnpOzxlxsG7oTTbdi/Wi1P55dom2xCGIsRZyhjnp4TB03VaLA + ro6v2ell++c5cOsu6hfYFStVGunrNCl6d5t1usHx1o3XKQYZwFSMUMWZ+as1mJnT2+vrjzcwK+z2 + Y/u+eXx6sfJsd/FWP5A4hqGj1MlZ9iCAe9Jkxwx9kuz4pn2pnHy8upqf+KWUmTm6/dS8Z+2LJru/ + vfM27lMqjjApuRFbScftdvNqtYZLj34G8CgQzLG9ElZ6lj22QP3hiYi+v7u9P24v4Q+pkECvQr8b + oQdPfeW+ODGmd3d8L/aItlxejRfwsFcLqcurmhSmucXyqm4QgrrR8qJtzzwCUXuuMkFb/vamfXza + Zh+TCTV1buEPGp3l++rfxbT6xMI+HP85fc81P8AMmaoB9fJjjFPozfBYgd4DK+/u/vLT8enPq1Xu + WeOZzMV+env38/3l+UVKnAnGWSnx6kAFI4eucABsaLo8wjLFLDvN++sWbvrc3pxdti9vb6KY8egB + xaA9cTBXEIXYI5mZruLov/CDYnH8/J5hHlm8IMJ08AaEgwnGyvdUh7+ngsKYPKgUCu8NTukmYBZ7 + ujk4wMqYEkQR94oflPCBHzdLHoU110e18AIurGp6OGB1x+GA1e3CAZetDz/aVO0iM5ZZuCd06JHy + pDpWTwcjXcYXCFJQfeypPd7FBDXiFtd5oeMV8EIu5gM3PsgS3v0GXoC/SNiRCFi+S4fpZfuIgnzC + WOY5eI7sKb4FiMkAP+liJz0EDTObqRjlkTp2v0R6Ry+9IjHgA8saGAmdBcgYcpgT7wlusVitFRpg + 45dLhXp5v1arN4rV/HxT51Rl1dMP88S+klWG1yhGzLKEpUakyxJtNrLQSuJdsPB8btcZOYNOsREN + Fpl7m7D8ImXWXYEIcu0VOD46NgyKSx8HsUBZmBQDM9Sb6DfIiqBr+DT0R2DOeCtWljmGNVDx4k9h + e2ME0Qh0CHgA3BRNNvsRa1gDS4So+0MTuaUwMsJPUohtA991Z3QU8qGZxTudc1QNz3yjaaPLGwZy + DPtLqThWbygMXpwmhD6Pec/Ftq0pRs7n2LdY8b1/g5rsA7Z2L6DdcwdUJK7lWBuPU0859Mrl4qpF + vD1PxntE3Hw5djLD/o90l3KvolOFsnPoJt2446XvcMMQgZ1hCiVMqYrviLuFy3c5YRskpovRyUHL + uVYui6194eKMpjoeg9Cmo0mUGdFQp9Aj7ytAmGHOD03v97lNjQ1VAQnfevmnh3gMU6b/zEXPbP70 + 00+EeNa+lle/xpCYgr8U7TFY1YkraW5hR2P2aY2GDmFI+a/IfWVPAZC54Q+YaZn8feBODFeRDEDV + 0GTQHbq3zQki+T3OT5nio6VYUtUwA8EmRMUOJvZP7BSb6po7PNgv1VFDkQpGY58UDHlUYKMs/0G7 + oSz/YbyFv4TZyBATma8/Tqq3dJggDkLDrG4/TL/ZZaOMfSD5HZPv8Se8BtOgMYkVh9QXHHDxpDFy + 3hzo6OYzCbinkva9az0eljW1WynyilIoVipKhZdqSrfOG4rW46X9ak2rV8qlbzX+dPgrmJ6gjF/e + nHdaP7fazevfDn69bXXAMm2BRgs/zpqfLk+bnevbs+bVb9/qh5ODX88/Xp799u3ToXPQPyjiZ8jt + c9A9+LV9/7HZub3vfDi+ajV/+9aZmb1DUIH5t2P9mRv0NSMQTztGAuv4VSy/JjDQRTjIdy1tRlqa + OzKO3vz/3hiFXKvZAQA= + headers: + accept-ranges: [bytes] + cache-control: ['public, must-revalidate, max-age=51'] + connection: [keep-alive] + content-encoding: [gzip] + content-language: [en] + content-length: ['24752'] + content-type: [text/html; charset=utf-8] + date: ['Tue, 31 Mar 2015 16:25:11 GMT'] + etag: ['"1427818853"'] + last-modified: ['Tue, 31 Mar 2015 16:20:53 +0000'] + link: ['; rel="canonical",; rel="shortlink"'] + server: [Apache/2.2.15] + set-cookie: ['geo[0]=US; path=/; domain=.wwe.com'] + vary: [Accept-Encoding] + x-app: [p6tyr3] + x-cacheable: ['NO: beresp.status 1'] + x-cacheable-status: ['200'] + x-cachekyte: [HIT] + x-cachekyte-hits: ['19'] + x-cachekyte-server: [p6kyte4] + x-cachetyr-server: [p6tyr3] + x-varnish: [1162602201 1162601375, 739021710 739020248] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/oai_response.yaml b/api/provider_registration/test_utils/vcr_cassettes/oai_response.yaml new file mode 100644 index 00000000..1d126c45 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/oai_response.yaml @@ -0,0 +1,31 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/ + response: + body: + string: !!binary | + H4sIAAAAAAAAA42RQWuEMBCFz/orQs5romsLRdSlUEoLu7TQ7VJ6y+pUA5rYTFy3/74x2MNCD0vm + FL43781Mvjn3HTmBQalVQRMWUwKq0rVUTUHf94/RHd2UYf5y/xy97p7CwOEKC9paO2ScT9PE9ABK + mKqVJ0CmTcMdy9cs5nShszPKC8WUem4dxwn/2G3fqhZ6EUmFVqgKZhnKDP3vVlfC+mjXOIZBcA22 + DMPOWNMyDHIDOGiF8CAslOs4uY3iNErjfXKTxamrz5xfIF7yPQLaeXPHgtJysTUwaJRWmx+Gtur0 + WLuZLDCoR15rroXkcy+vdc5BDsZoQ9y+oaBHUR9cO1oeRDcC0V/EtuAdiDDN2IOyRCJR2hJBOmhE + R5ZJPLS6xOGP7yWiu+aKOKN/G7rQ4ELWLOc+jgvmXz5fcr56+QtFOGa8JgIAAA== + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Mon, 30 Mar 2015 14:03:03 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=ca862eff8e5b78df1585ab8de11423a177c5797f; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery.yaml b/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery.yaml new file mode 100644 index 00000000..782b0691 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery.yaml @@ -0,0 +1,334 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=ListSets + response: + body: + string: !!binary | + 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 + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Mon, 30 Mar 2015 14:03:37 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=99fb1d23e1ebbf289a141f8bb2d21270946bb29d; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=ListRecords&metadataPrefix=oai_dc&from=2015-02-28T00:00:00Z + response: + body: + string: !!binary | + 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 + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Mon, 30 Mar 2015 14:03:43 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=78b74b1e186d9387529ac1b6d6f81e7d7c20a8c5; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery1.yaml b/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery1.yaml new file mode 100644 index 00000000..0969190c --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery1.yaml @@ -0,0 +1,335 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=ListSets + response: + body: + string: !!binary | + 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 + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Tue, 31 Mar 2015 16:25:07 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=44342ae0c8f3f4625ff058164bc208f7b2a58079; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=ListRecords&metadataPrefix=oai_dc&from=2015-03-01T00:00:00Z + response: + body: + string: !!binary | + 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 + v3h67/8AZt89gt+mAAA= + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Tue, 31 Mar 2015 16:25:09 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=bf1b659bd59cb2e5ca493febc9c5587ac1ff859f; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery2.yaml b/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery2.yaml new file mode 100644 index 00000000..35ef9e08 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/oai_response_datequery2.yaml @@ -0,0 +1,335 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=ListSets + response: + body: + string: !!binary | + H4sIAAAAAAAAA71bXXPbuhF9tn8Fxw/3qbbspJ12fB3f0VXiOLdW6kbK3E5fNDAFiUhJggFAK/73 + PQvqg5JBhoBkP3nGWuFgP7B7sFhd/fYjS6NHrrSQ+buTi7Pzk4jnsZyKfP7u5Ov45vQfJ79dH1/9 + q//p9H54e3wE8Vy/O0mMKS57vcVicSYLnjMVJ+KR6zOp5j3I9t6cnfdOltKXP7TY+sbirZV7c35+ + 0fvP8G4UJzxjpyLXhuUxp69pcantf+9kzIzdWhfE46OjLmJLZc5+6OnJ9fHRleK6kLnm75nh12/O + L/52ev729O3F+OLvlxdvLy/++t+r3paI/cr3kmtDlnt4d3IntBlxo0+ul/CKF1ILI9XTmTZxKssp + dDP8jE/L3lT2JBM9WtOugR1gwdUS18fHV5ob2hb+jAoeXxflQyoqM1yy3CSTGYvxP33VW0lUwp9Z + xq/7EFCykKmcP0U3LC5T8xTdb1aovmVFj+0CcG4b3tKxTqyvOXyOyAFCvy7nvfqExbHiUwEbwdc/ + xaoLR19gamUC1ZoUSvGUM83d1qxpeI8Q0ECrSfvrqYrlTq1ja26rAS0Vilg+jUamnIrl3vzRSvin + MVBqiHuEh8lit+X642E0UCLjlR48LhXFyWe+0Ck3hivr5e46PQrmjIv3vGDKZDw3kZxFfYitQ8hr + 8UmOnTkRblIxT0wqcq6Dt/8gZOpcfHv7v0MM59bPNLT2hJupe/eDMs1EDqPk8+heyW88NjoSeRQO + 1ZZ9lqseIPFYrQqcOXjWablnUJWsdX9lis7+t1iLohPMn1L9z9qSFUh9fp6KZ24fbQfBIBHp1J6a + G5aJ9CksCQDLPygOB90WJPtXJaIGTm/tWpJnqMzK80DR6q01dgABu+4B4jz+1ikmkElxitPoj1Ib + EXPPuPvWEgvjBGfMpgRK13uApO4EPZBpyuecsvOdeOAKSvS963Ussy4OHzKU6AFkUfkqwuR7QvHd + Vtc/RzhEDEhdeXSXFdRsN4oFeHlVTT/kc1QjrpCHPAOhiGddzk1lQSKO+ilObE36C+xagiOjDs7r + yQnho1jhe8Kwj4Ds9Crbmis2pVJCVxqnrT5CoASZt3mZeMeXunTnohOrLMAEoPMlHSFgylIhHoYs + Z3NO/MczFPTUqd1OBq2fpWgZg9r6/73QUk39a6CeBqj9AtsQblrxTP+iBFldqW41/5TPpMos0YjG + PE7yANIW49YUZIcX2o4RhbsODcb45LJGfCOZE7FHFUIYjhOREx3yiz0eN1zyto3/AWIyE8sLRueD + Rav7m3YfsDays173AHXCakb3lNoNardkbPBCr1oWRYPhoKvjjokNxqgSi0YoRr7XVIuzaAi7DcSK + Le5DvHmXXDfmDMxPRe/5I09l4Z9S+ZQF5LYP07KiKlF/CpsTr6xSC93/7zijFJuI6nLS/QwEbOQA + +rdSJ8f6hzgTaeLmTju5ZGVlJK2NUW06v8X1Hm5f+8Ezl+XzLjd7ULZU6IpQdPcivhSQyYKgGvpS + O1bMH4WSOR0N2JECdF3/bDkIalehbxqi5EvspKEDtGMEk+B2YbX/U8IUvzD0en/VYdd0JPPWQ/Oh + HewQBwg7aMzCP0HfJyfPRJo1At/gw5VB1zrugzbnSjr5LnpiYPwZtcQ+QiY3AWSOFvcP4XA4d6dq + O0o/ctKrSJ5soN6nLM+9edq8CNHqILhtlGqj2oobhDew6bbXrGQ/TaP1dc/VSfWrFYngLWCu9Sks + d+vTDk/w3YLucu+5BQ3B45X/2s22bFYvFAox0tC0XW7/IJkj0Q/OxHGLlz+ucPRxN0ykTKnB9Xup + 6ZnAs+mUlKoLhbgtM5bTA1TV4rbneoh+gIhXTYFACkP4rUXIA3lt8vAjKZhwXzu2E1z9Ft7XGl2R + VXus/snoSRueeTpEdOk11lGGeLusup+duZ0I6P7sC5mjkzEVOnbG86fVp6JAj48pNP+q0uhpvG/o + S6FT7Xbh5k7quSqaDF1o/j/p+IU8oqUNV13cFRQVznXDDTyPq0e04D0VAMAENbhkaeMbMNrjiuze + t2JADHjYJhiqnehgOr28wlhXTmp1gs3To2mARgTVNInwDCp4CIGUaqKouyj7kMSGoF1BhDkejcKE + hj+c7thOaUOIYhIGGb1qsY7IL/Te4+mZLOtyVoZoXTJ6J6lucmgkl3An2ssU7sFPDMDuxgG2XqNf + aC9asG6bqb+M17PsurBY73VO7ple+OOOZCzgCwpgP7QCjMMfLjhVFnif7hDM9xCTWuIG4qlN8uRO + Xdtn5R5iq3PSR8+MWsUBSK28x4lxAIYDm2hMHtnM67TkT4DDc7ZFbiDN7aD75NVCV57Z7VXveHT9 + 1ugZMPief/hvXjb90L7zh7iaXdrVZihykA9pGCr3HOUUZ3nVxbZcfXU5wENqjlE3KrjLGh+wg0k8 + ydyDcgOUc3oh3GznBXeR86ZtfMZQXoLBOvNKG1m0bmRBs5qvYhHdaJGRLF/TIihBDRFiN/J6FjGN + oTpeoL0xwFHA/MkLO0fH3x/cx3ZkzqIBTehiLIWz6N8lxgm5wtjV+rxWRNzvkOpYx5OHEqMvmLyz + X91NFxtconkccDXhzkwDOGVrDaMW1i5UbfRzfQ8IJuc6Sdz1etMWueUsNYlNglUrIYxJa+meMNoA + 4XwFDBdpzJhjatrppe0SRRTN9oetLvVRa8/okHGr0zY4B/CPxGi1bunkjtcDYEsG+qUahxcPIsXI + rr9m5XxCDKVxgOZrjjdNarzaKRqgWVFqda719gV133c2gRHYGQN9ZXYwuOXBfQNStbyi/mzGhAqf + FSZQJZzR2Ii1NuIn/IhCGIys+FqQMCdNY/CUu+husmYSQQ99uvjZ+d22oKcKRadX/rUqqwdhfxR/ + srkvKAqEP2i/QCOP028IwroIyx+uTGjizxmNd/igtP2J6B5sbyZTIT07FWjbPuI3JBP8ZgV/nCij + SiT6hWXFrxg4IsHLqB/9UfUZI8xiRdR/pT6GrS4Vn6DH6c9M0SzFI6YmQTBIZtVF7F5fF85NPS8L + QPe/uZtZp8EU8GijqtHP+sPos8g9uuptfkZ0Rb/Dot9sXf8foGXPcOQ1AAA= + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Tue, 31 Mar 2015 17:13:14 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=883c6b8308a5e8cdb252760988a889d17c6d64d2; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=ListRecords&metadataPrefix=oai_dc&from=2015-03-01T00:00:00Z + response: + body: + string: !!binary | + H4sIAAAAAAAAA+2d2XLc1pamr62nQKgjOuwITklqIi3rBDXL1lQibZ2qmxNgApmEhQTyAJmi6Kt+ + jb7uh6j7epR+kvr+tfYGkBQpUceD1NGKOFUySWDvtdc87YXbf3s3K5O3edMWdfXD1dHG1tUkr8Z1 + VlTTH67+fPhw/dbVv925cvvF/pP1l88eX/mGx6v2h6vHi8V8b3Pz5ORko57nVdqMj4u3ebtRN9NN + nt3c3tjavBqe3nvXFitvnOzYc9tbW6PNvz97ejA+zmfpelG1i7Qa53qtLfZa++3TepwuDLTL7Hjl + m28u81g4zMa7Nrt658o3t5u8nddVm99PF/md7a3R9fWtnfWd0eHo5t5oZ2904z9ub648Yq/8c5m3 + C2Hu6IerT4t28Sof103WXk1m+SLN0kX6ssknxbsfrtZp8Y9sfDVJJk09++FqXH9rdLi1tWf/+4+r + yZ0Ad5PP67ZY1M3pRrsYl/UyAymLfCPPlptZvclamwLGNgd0IBnszS+++eYKxxEkOthxnmZ5o1/f + LrK8WhSTgh9ZZO8D++wdFXX5j3yRteujra2t25uDV7USZ+Pk6WzeoWq0fTi6vjfiNLugqv+7wPnm + dpsvDub5+M58eVQWTs29aZNmtsXtzfjnix8WPJd97tKLjus2X1309maHrtuRhoY6J+BeNk6M+ff8 + 5xWOvlAG/NnNq+HVbNy9Nl82pYlBNt7My3wGedrN0caoe/YTpSb5V4UmgJhcRnL82Sg4Yobx3qJY + lPmd/eRgscxOk3qSLI7z5Jd8ihhIcpOist/8PC/TKkse1ojSQo8dLDaSH+vj6n/+j53d79tk/+go + P030yM8VqgSFtDhdS+7VZclSbwv+WUueFVWVt/UihcvixlcEw7jJU4Tmzr16kpflWvK0bpq0qPLk + NZs1y7k9Hx+yN7K8HTfFXBDeefnqxd2nD55dQf7T5CRv8mSacogmzyLwSwN+LTlOm+ykrrNk8inH + SBZ1MvouyfJF3swElTA0rmeI+q+GIp0akZrmwku7HI/zVvo4ItM3W0u2v7O3UgBMq4R/UlZKF0CV + JUd5XiXjMk+b9fFykUyKyeI0OeXHNkmndXJSLI7/6z/tnbZ/qcpB9JlX14wGO99lRTuu9eesmEzA + BZq5jeiox+NlY78ygJHugj8CcFU3i2NboK2X/FdbIhntxhUwfO/B/Z9fPbhyeJKXb4Ef4Hljkoy2 + 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 + TDqIit/mi/0n6y+fPb7z39BPvKLfpgAA + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Tue, 31 Mar 2015 17:13:16 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=a999e33453cc19c646476bdf500fec60d1e84f24; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/oai_response_identify.yaml b/api/provider_registration/test_utils/vcr_cassettes/oai_response_identify.yaml new file mode 100644 index 00000000..393ab2e6 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/oai_response_identify.yaml @@ -0,0 +1,39 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://repository.stcloudstate.edu/do/oai/?verb=Identify + response: + body: + string: !!binary | + H4sIAAAAAAAAA51V32+bMBB+Dn+FxUtfBoZmlTbk0E3rqlVqtqpNp21vBq7FE9jMNvnx3+9MSAvN + tDaN8pCYu+8+vvvuzE7XdUWWoI1QcubHYeQTkLkqhLyf+beL8+Cdf5p67NvHi+Bq/sWbYLg0M7+0 + tkkoXa1WoWpAcp2XYgkmVPqeYiw9DiPq99HJ2ohRxmraxR1HUUx/zC9v8hJqHghpLJc5uDQjEtOd + Xqqc247aSyp6k8lLwvqXCdem8FNvwjSYRkkDZ9xCehzFJ0E0DabRIn6bRNMkjn8xOgrpUv60YKxT + Lpv5FwVIK+42ftqX19AoI6zSm9DYvFJtge9mIYSipYWiigvqMDsMZICAOwjU+jH5K68htSVcP8AR + bsmNDcknh4m/ENQB7ap1CR7LuIHb68uD2OxyPNZoZVWuqu9bV6TYS0afHnqMF7WQn2suqtS0TaO0 + /VDkYQYNamXCXNWMDkI8BlxXAjVzKqMadYNSR1EQxUH8fhFFSfdFqffjPFZABRaKa8iVLlKpGB2f + eOxec9lWXAu7SX/iJ5jPg7OzRVkmdZ0Yg7jDCIdoci0a5y1nAexIILZdFKCJNyH95wC/jzHQxiOM + w6fgIf2V0zDmg7OxA3zJjIyTd6MyYd1YQoqPGe1/o1puhnYe7J2MMqaPh3tjMHTtIMNRdHDYXlEL + ixhJ1+v+T/fMoHcqGCQhmeQ/pZIMflsI4ig6Qc5Pk7H5bh4H3U+J52oO/PHULehxIa0hW3McPadn + HMa0Tzna5hxqBvKajTgoSw6g+NjrXEmLiw3nAztiYW2f3UWkvwgY7cJdJ+kAhdVgecEtv1KVyDcD + 4Hn/gORckgxIa6Ag2YbgGqlB54JXhMuCSCWDwZEBvRQ5EFxOS5xebYZ192uxf5Y+b6sK63SvSmq+ + wSLWUSi5xhsNt47joVWmsOErYUvVWiwolH5DVrhuUCHCG8cAOao78ty6Doccx4SYabNaGHcVPwqE + lt0/xS25tSBeFyOrot79YKC6zF3F7tpO/wK9vceF5wcAAA== + headers: + cache-control: [private] + connection: [keep-alive] + content-encoding: [gzip] + content-type: [text/xml; charset=UTF-8] + date: ['Mon, 30 Mar 2015 14:03:11 GMT'] + server: [nginx/1.2.1] + set-cookie: [bp_plack_session=a009c921cf0b6a38968432406b6312b345a8f0ac; path=/; + HttpOnly] + transfer-encoding: [chunked] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/oai_response_invalid_identify.yaml b/api/provider_registration/test_utils/vcr_cassettes/oai_response_invalid_identify.yaml new file mode 100644 index 00000000..353724de --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/oai_response_invalid_identify.yaml @@ -0,0 +1,35 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.osti.gov/scitech/scitechxml?EntryDateFrom=02%2F02%2F2015&page=0?verb=Identify + response: + body: + string: !!binary | + H4sIAAAAAAAAA7WU32/TMBDHn9lfcZQXkJakaWmH0mCpaEN927T1hUfXuTQGxw62U9ZN/d+5xl1b + 2CZAYk92znef++FvnFe+ViyvkBcs99IrZNOGiwphbmrBfTKO+/HwDCK4sNZYsNgY6/MkuObOr7fL + 6yiapXBfGu2jktdSrbM5r0zNT6dWcnXquHaRQyvLiTDK2OxHJT1OFlx8W1rT6iIK5jejwej8bDzp + QE7eYTYYNLeTDcwGL0JPx4E+fBn6+47+6fL8y7/wF4rQj/khLeH+Y60buPo72oGwQx6XetRxd1tT + uO+OIYPgsJnGmtf4yDy7Ppj2JUURy5OgK8iTIMyFKdYk0pTN5vMruPHctw5G/T7J8rNUHu1OnZdC + tNZiEVNgynLib8v62Et7oI2reEH73abH8obAzK8bzJMFg4tbgY2XRu813uxcanSOL4NX3rLnMrbs + EFKgE1Z2uIewOf1TNMwVhaIWNEqCYAFcg9xuNVeAHdJX3ENjcYVkL0B6KK2poWxVKZWSekke0lGV + 31t0/rfE+NBFSEsY9pWv+G28Ta3Qxzdh3XebPTPBk1dLs4qN8zJ2gm5cVHHZOcbXIXEIiwsTNm9/ + NW+TZh/SdydUGtVwKFAbj8cjobYUOE96AG+5QDAl9YdgjfEgeOsQqFmiScUXij50d/zkI6XM0h3m + 8Yfbr4ZPvnSknCHFB8Ul3ev4EyHZaQ4kBQAA + headers: + content-encoding: [gzip] + content-length: ['540'] + content-type: [text/html;charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:04 GMT'] + server: [Apache-Coyote/1.1] + set-cookie: [BIGipServerlbapp_scitech=3858760202.41030.0000; path=/, BIGipServerwww.osti.gov_pool=1132494278.20480.0000; + path=/] + vary: [Accept-Encoding] + x-cnection: [close, close] + status: {code: 500, message: Internal Server Error} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/other_response.yaml b/api/provider_registration/test_utils/vcr_cassettes/other_response.yaml new file mode 100644 index 00000000..01c4afc4 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/other_response.yaml @@ -0,0 +1,472 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://wwe.com/ + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Mon, 30 Mar 2015 14:03:04 GMT'] + location: ['http://www.wwe.com/'] + server: [squid/2.5.STABLE12] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.wwe.com/ + response: + body: + string: !!binary | + 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 + FrgFOCh2rf6ctDR3bBy9+v8ByI3dnqDAAQA= + headers: + accept-ranges: [bytes] + cache-control: ['public, must-revalidate, max-age=89'] + connection: [keep-alive] + content-encoding: [gzip] + content-language: [en] + content-length: ['23738'] + content-type: [text/html; charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:04 GMT'] + etag: ['"1427723964"'] + last-modified: ['Mon, 30 Mar 2015 13:59:24 +0000'] + link: ['; rel="canonical",; rel="shortlink"'] + server: [Apache/2.2.15] + set-cookie: ['geo[0]=US; path=/; domain=.wwe.com'] + vary: [Accept-Encoding] + x-app: [p6tyr2] + x-cacheable: ['NO: beresp.status 1'] + x-cacheable-status: ['200'] + x-cachekyte: [HIT] + x-cachekyte-hits: ['1'] + x-cachekyte-server: [p6kyte2] + x-cachetyr-server: [p6tyr2] + x-varnish: ['1564805401', 1299271404 1299271343] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/other_response_404.yaml b/api/provider_registration/test_utils/vcr_cassettes/other_response_404.yaml new file mode 100644 index 00000000..b11f8a0c --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/other_response_404.yaml @@ -0,0 +1,35 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://github.com:443/erinspace/thisisnotreal + response: + body: + string: !!binary | + H4sIAAAAAAAAA6tWSi0qyi9SslLyyy9RcMsvzUtRqgUAu/DzMBUAAAA= + headers: + cache-control: [no-cache] + content-encoding: [gzip] + content-security-policy: ['default-src ''none''; script-src ''self''; style-src + ''unsafe-inline''; img-src data:; connect-src ''self'''] + content-type: [application/json; charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:06 GMT'] + server: [GitHub.com] + status: [404 Not Found] + strict-transport-security: [max-age=31536000; includeSubdomains; preload] + transfer-encoding: [chunked] + vary: [X-PJAX] + x-content-type-options: [nosniff] + x-frame-options: [deny] + x-github-request-id: ['D8C54245:79C6:167B167:55195799'] + x-request-id: [377ad91dd0a602c7ab5c1795230fbe83] + x-runtime: ['0.009022'] + x-ua-compatible: ['IE=Edge,chrome=1'] + x-xss-protection: [1; mode=block] + status: {code: 404, message: Not Found} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/other_response_404_oai.yaml b/api/provider_registration/test_utils/vcr_cassettes/other_response_404_oai.yaml new file mode 100644 index 00000000..60417b7c --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/other_response_404_oai.yaml @@ -0,0 +1,35 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: https://github.com:443/erinspace/thisisnotreal?verb=Identify + response: + body: + string: !!binary | + H4sIAAAAAAAAA6tWSi0qyi9SslLyyy9RcMsvzUtRqgUAu/DzMBUAAAA= + headers: + cache-control: [no-cache] + content-encoding: [gzip] + content-security-policy: ['default-src ''none''; script-src ''self''; style-src + ''unsafe-inline''; img-src data:; connect-src ''self'''] + content-type: [application/json; charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:05 GMT'] + server: [GitHub.com] + status: [404 Not Found] + strict-transport-security: [max-age=31536000; includeSubdomains; preload] + transfer-encoding: [chunked] + vary: [X-PJAX] + x-content-type-options: [nosniff] + x-frame-options: [deny] + x-github-request-id: ['D8C54245:79C2:2F1132:55195799'] + x-request-id: [2f84d0cd9189284bf1e511954496647f] + x-runtime: ['0.008956'] + x-ua-compatible: ['IE=Edge,chrome=1'] + x-xss-protection: [1; mode=block] + status: {code: 404, message: Not Found} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/other_response_identify.yaml b/api/provider_registration/test_utils/vcr_cassettes/other_response_identify.yaml new file mode 100644 index 00000000..0a3ae473 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/other_response_identify.yaml @@ -0,0 +1,472 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://wwe.com/?verb=Identify + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Mon, 30 Mar 2015 14:03:04 GMT'] + location: ['http://www.wwe.com/?verb=Identify'] + server: [squid/2.5.STABLE12] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.wwe.com/?verb=Identify + response: + body: + string: !!binary | + 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 + FrgFOCh2rf6ctDR3bBy9+v8Br33puqDAAQA= + headers: + accept-ranges: [bytes] + cache-control: ['public, must-revalidate, max-age=14'] + connection: [keep-alive] + content-encoding: [gzip] + content-language: [en] + content-length: ['23738'] + content-type: [text/html; charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:04 GMT'] + etag: ['"1427723903"'] + last-modified: ['Mon, 30 Mar 2015 13:58:23 +0000'] + link: ['; rel="canonical",; rel="shortlink"'] + server: [Apache/2.2.15] + set-cookie: ['geo[0]=US; path=/; domain=.wwe.com'] + vary: [Accept-Encoding] + x-app: [p6tyr3] + x-cacheable: ['NO: beresp.status 1'] + x-cacheable-status: ['200'] + x-cachekyte: [HIT] + x-cachekyte-hits: ['3'] + x-cachekyte-server: [p6kyte3] + x-cachetyr-server: [p6tyr3] + x-varnish: [1162129047 1162127829, 1626036572 1626036023] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/test_utils/vcr_cassettes/other_response_oai.yaml b/api/provider_registration/test_utils/vcr_cassettes/other_response_oai.yaml new file mode 100644 index 00000000..537b4574 --- /dev/null +++ b/api/provider_registration/test_utils/vcr_cassettes/other_response_oai.yaml @@ -0,0 +1,471 @@ +interactions: +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://wwe.com/?verb=ListSets + response: + body: {string: !!python/unicode ''} + headers: + content-length: ['0'] + date: ['Mon, 30 Mar 2015 14:03:11 GMT'] + location: ['http://www.wwe.com/?verb=ListSets'] + server: [squid/2.5.STABLE12] + status: {code: 301, message: Moved Permanently} +- request: + body: null + headers: + Accept: ['*/*'] + Accept-Encoding: ['gzip, deflate'] + Connection: [keep-alive] + User-Agent: [python-requests/2.5.3 CPython/2.7.9 Darwin/13.4.0] + method: GET + uri: http://www.wwe.com/?verb=ListSets + response: + body: + string: !!binary | + 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 + x1vgFuCg2LX6c9LS3LFx9Or/B7WgZ/ygwAEA + headers: + accept-ranges: [bytes] + cache-control: ['public, must-revalidate, max-age=280'] + connection: [keep-alive] + content-encoding: [gzip] + content-language: [en] + content-length: ['23739'] + content-type: [text/html; charset=utf-8] + date: ['Mon, 30 Mar 2015 14:03:13 GMT'] + etag: ['"1427724191"'] + last-modified: ['Mon, 30 Mar 2015 14:03:11 +0000'] + link: ['; rel="canonical",; rel="shortlink"'] + server: [Apache/2.2.15] + set-cookie: ['geo[0]=US; path=/; domain=.wwe.com'] + vary: [Accept-Encoding] + x-app: [p6tyr1] + x-cacheable: ['NO: beresp.status 1'] + x-cacheable-status: ['200'] + x-cachekyte: [MISS] + x-cachekyte-server: [p6kyte1] + x-cachetyr-server: [p6tyr1] + x-varnish: ['114104244', '1838653311'] + status: {code: 200, message: OK} +version: 1 diff --git a/api/provider_registration/tests.py b/api/provider_registration/tests.py new file mode 100644 index 00000000..5ace5f97 --- /dev/null +++ b/api/provider_registration/tests.py @@ -0,0 +1,436 @@ +import vcr +import datetime +from lxml import etree + +import mock + +from django import forms +from django.utils import timezone +from django.test import TestCase, RequestFactory, Client + +from provider_registration import views +from provider_registration import utils +from provider_registration import validators +from provider_registration.models import RegistrationInfo +from provider_registration.forms import InitialProviderForm, OAIProviderForm, ContactInfoForm + + +class RegistrationMethodTests(TestCase): + + def test_was_published_recently_with_future_question(self): + """ + was_published_recently() should return False for questions whose + pub_date is in the future + """ + time = timezone.now() + datetime.timedelta(days=30) + future_question = RegistrationInfo(registration_date=time) + self.assertEqual(future_question.was_registered_recently(), False) + + def test_unicode_name(self): + time = timezone.now() + datetime.timedelta(days=30) + registraion = RegistrationInfo( + provider_long_name='SquaredCircle Digest', + registration_date=time + ) + self.assertEqual(unicode(registraion), 'SquaredCircle Digest') + + +class RegistrationFormTests(TestCase): + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response.yaml') + def test_valid_oai_data(self): + form = InitialProviderForm({ + 'provider_long_name': 'Booyaka Booyaka', + 'reg_id': 1, + 'base_url': 'http://repository.stcloudstate.edu/do/oai/', + 'description': 'A description', + 'oai_provider': True + }) + self.assertTrue(form.is_valid()) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/other_response.yaml') + def test_valid_other_data(self): + form = InitialProviderForm({ + 'provider_long_name': 'Devon - Get the Tables', + 'base_url': 'http://wwe.com', + 'description': 'A description', + 'reg_id': 1, + 'oai_provider': False + }) + self.assertTrue(form.is_valid()) + + def test_misformed_url(self): + form = InitialProviderForm({ + 'contact_name': 'BubbaRay Dudley', + 'contact_email': 'BullyRay@dudleyboyz.net', + 'provider_long_name': 'Devon - Get the Tables', + 'base_url': 'DEVONGETTHETABLLESSSSSS', + 'description': 'A description', + 'oai_provider': False + }) + self.assertFalse(form.is_valid()) + + def test_formed_not_valid(self): + form = InitialProviderForm({ + 'contact_name': 'BubbaRay Dudley', + 'contact_email': 'BullyRay@dudleyboyz.net', + 'provider_long_name': 'Devon - Get the Tables', + 'base_url': 'http://notreallyaurul.nope', + 'description': 'A description', + 'oai_provider': False + }) + self.assertFalse(form.is_valid()) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response.yaml') + def test_missing_contact_name(self): + form = InitialProviderForm({ + 'contact_name': '', + 'contact_email': 'BullyRay@dudleyboyz.net', + 'provider_long_name': 'Devon - Get the Tables', + 'base_url': 'http://repository.stcloudstate.edu/do/oai/', + 'description': 'A description', + 'oai_provider': True + }) + self.assertFalse(form.is_valid()) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response.yaml') + def test_missing_contact_email(self): + form = InitialProviderForm({ + 'contact_name': 'Spike Dudley', + 'contact_email': '', + 'provider_long_name': 'Devon - Get the Tables', + 'base_url': 'http://repository.stcloudstate.edu/do/oai/', + 'description': 'A description', + 'oai_provider': True + }) + self.assertFalse(form.is_valid()) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response.yaml') + def test_malformed_contact_email(self): + form = InitialProviderForm({ + 'contact_name': 'Spike Dudley', + 'contact_email': 'email', + 'provider_long_name': 'Devon - Get the Tables', + 'base_url': 'http://repository.stcloudstate.edu/do/oai/', + 'description': 'A description', + 'oai_provider': True + }) + self.assertFalse(form.is_valid()) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response.yaml') + def test_missing_provider_name(self): + form = InitialProviderForm({ + 'contact_name': 'Spike Dudley', + 'contact_email': 'email@email.com', + 'provider_long_name': '', + 'base_url': 'http://repository.stcloudstate.edu/do/oai/', + 'description': 'A description', + 'oai_provider': True + }) + self.assertFalse(form.is_valid()) + + def test_contact_info_valid(self): + form = ContactInfoForm({ + 'contact_email': 'email@email.com', + 'contact_name': 'A REAL NAME' + }) + self.assertTrue(form.is_valid()) + + +class TestOAIProviderForm(TestCase): + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response.yaml') + def test_valid_oai_data(self): + approved_set_set = [('totally', 'approved')] + form = OAIProviderForm({ + 'provider_long_name': 'SuperCena', + 'base_url': 'http://repository.stcloudstate.edu/do/oai/', + 'property_list': "some, properties", + 'approved_sets': ["totally"], + 'reg_id': 1 + }, choices=approved_set_set) + self.assertTrue(form.is_valid()) + + +class ViewTests(TestCase): + + def setUp(self): + self.factory = RequestFactory() + self.client = Client() + # self.tree = ElementTree() + + def test_get_index(self): + request = self.factory.get('/') + view = views.index(request) + self.assertEqual(view.status_code, 200) + + def test_get_provider_detail(self): + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://repository.stcloudstate.edu/do/oai/', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + + response = self.client.get('provider_registration/provider_detail/Stardust Weekly/') + self.assertEqual(response.status_code, 404) # TODO - this is broken + + def test_get_contact_info(self): + request = self.factory.get('provider_registration/contact_information/') + view_processing = views.get_contact_info(request) + self.assertEqual(view_processing.status_code, 200) + + def test_post_incorrect_contact_info(self): + request = self.factory.post('provider_registration/contact_information/') + view_processing = views.get_contact_info(request) + root = etree.fromstring(view_processing.content) + form_element = root.xpath('//form')[0] + error = form_element.getchildren()[0] + self.assertEqual(error.text, 'Please correct the errors below.') + + def test_post_contact_info(self): + info = {'contact_name': 'Fabulous Moolah', 'contact_email': 'moolah@moolah.com'} + request = self.factory.post('provider_registration/contact_information/', info) + view_processing = views.get_contact_info(request) + root = etree.fromstring(view_processing.content) + form_element = root.xpath('//form')[0] + new_form_title = form_element.getchildren()[0].text + self.assertEqual(new_form_title, 'Metadata Sharing') + + def test_post_some_incorrect_contact_info(self): + info = {'contact_name': '', 'contact_email': 'moolah@moolah.com'} + request = self.factory.post('provider_registration/contact_information/', info) + view_processing = views.get_contact_info(request) + root = etree.fromstring(view_processing.content) + form_element = root.xpath('//form')[0] + error = form_element.getchildren()[0] + self.assertEqual(error.text, 'Please correct the error below.') + + def test_save_metadata_render_provider(self): + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://repository.stcloudstate.edu/do/oai/', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + meta_form = { + 'meta_tos': True, + 'meta_rights': False, + 'meta_privacy': False, + 'meta_sharing': True, + 'meta_license_cc0': False, + 'reg_id': RegistrationInfo.objects.last().pk + } + request = self.factory.post('provider_registration/provider_information/', meta_form) + response = views.save_metadata_render_provider(request) + root = etree.fromstring(response.content) + form_element = root.xpath('//form') + new_form_title = form_element[0].getchildren()[0].text + self.assertEqual(new_form_title, 'Basic Provider Information') + + @mock.patch('provider_registration.utils.get_oai_properties') + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response_datequery1.yaml') + def test_render_oai_provider_form(self, mock_properties): + mock_properties.return_value = {'properties': 'shtuff', 'sets': [('star', 'dust')]} + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://repository.stcloudstate.edu/do/oai/', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + request = self.factory.post('provider_registration/register/') + name = "Some Name" + base_url = 'http://repository.stcloudstate.edu/do/oai/' + reg_id = RegistrationInfo.objects.last().pk + api_docs = '' + rate_limit = '' + description = 'A thing again!' + response = views.render_oai_provider_form(request, name, base_url, reg_id, api_docs, rate_limit, description) + root = etree.fromstring(response.content) + form_element = root.xpath('//form')[0] + title = form_element.getchildren()[0] + self.assertEqual(title.text, 'Provider Information') + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_dataquery3.yaml') + def test_render_oai_provider_form_invaid_xml(self): + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://wwe.com', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + request = self.factory.post('provider_registration/register/') + name = "Some Name" + base_url = 'http://wwe.com' + reg_id = RegistrationInfo.objects.last().pk + api_docs = '' + rate_limit = '' + description = 'A thing again!' + response = views.render_oai_provider_form(request, name, base_url, reg_id, api_docs, rate_limit, description) + root = etree.fromstring(response.content) + form_element = root.xpath('//form')[0] + title = form_element.getchildren()[0] + self.assertEqual(title.text, 'Simple Provider Information') + + @mock.patch('provider_registration.utils.get_session_item') + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/invalid_xml_oai_redirect.yaml') + def test_render_simple_oai_form(self, mocked_id): + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://wwe.com', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + mocked_id.return_value = RegistrationInfo.objects.last().pk + request = self.factory.post('provider_registration/register/') + response = views.redirect_to_simple_oai(request) + self.assertEqual(response.status_code, 200) + + root = etree.fromstring(response.content) + form_element = root.xpath('//form')[0] + title = form_element.getchildren()[0] + self.assertEqual(title.text, 'Simple Provider Information') + + def test_registration_complete(self): + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://wwe.com', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + request = self.factory.get('/') + provider_long_name = 'The COSMIC KEEEEEY' + base_url = 'http://wwe.com' + rate_limit = '' + api_docs = '' + description = 'A thing!' + new_registration = RegistrationInfo.objects.last() + reg_id = new_registration.pk + success = views.save_other_provider(request, provider_long_name, base_url, reg_id, api_docs, rate_limit, description) + self.assertTrue(success) + self.assertFalse(new_registration.registration_complete) + + +class ViewMethodTests(TestCase): + + @mock.patch('provider_registration.utils.get_oai_properties') + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response_datequery2.yaml') + def test_valid_oai_url(self, mock_properties): + RegistrationInfo( + provider_long_name='The Old Stardust Weekly', + base_url='http://aurl.com', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + mock_properties.return_value = {'properties': 'shtuff', 'sets': [('star', 'dust')]} + provider_long_name = 'New Stardust Weekly' + base_url = 'http://repository.stcloudstate.edu/do/oai/' + reg_id = RegistrationInfo.objects.last().pk + api_docs = '' + rate_limit = '' + description = 'COSMC EKEEEEEEYYYYy' + success = views.save_oai_info(provider_long_name, base_url, reg_id, api_docs, rate_limit, description) + self.assertTrue(success['value']) + self.assertEqual(success['reason'], 'New Stardust Weekly registered and saved successfully') + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/other_response_oai.yaml') + def test_invalid_oai_url(self): + RegistrationInfo( + provider_long_name='Golddust Monthly', + base_url='http://aurl.com', + property_list=['some', 'properties'], + approved_sets=['some', 'sets'], + registration_date=timezone.now() + ).save() + reg_id = RegistrationInfo.objects.last().pk + base_url = 'http://aurl.com' + api_docs = '' + rate_limit = '' + provider_long_name = 'Golddust Monthly' + description = 'SHAAAwwwwww' + success = views.save_oai_info(provider_long_name, base_url, reg_id, api_docs, rate_limit, description) + self.assertFalse(success['value']) + self.assertEqual(success['reason'], 'OAI Information could not be automatically processed.') + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/other_response_oai.yaml') + def test_save_other_provider(self): + RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://repository.stcloudstate.edu/do/oai/', + property_list=['some', 'properties'], + approved_sets="[('publication:some', 'sets')]", + registration_date=timezone.now() + ).save() + provider_long_name = 'The COSMIC KEEEEEY' + base_url = 'http://wwe.com' + rate_limit = '' + api_docs = '' + description = 'A thing!' + new_registration = RegistrationInfo.objects.last() + reg_id = new_registration.pk + success = views.save_other_info(provider_long_name, base_url, reg_id, api_docs, rate_limit, description) + self.assertTrue(success) + + +class TestUtils(TestCase): + + def test_format_set_choices(self): + test_data = RegistrationInfo( + provider_long_name='Stardust Weekly', + base_url='http://repository.stcloudstate.edu/do/oai/', + property_list=['some', 'properties'], + approved_sets="[('publication:some', 'sets')]", + registration_date=timezone.now() + ) + + formatted_sets = utils.format_set_choices(test_data) + self.assertEqual(formatted_sets, set([('some', 'sets')])) + + +class TestValidators(TestCase): + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response_identify.yaml') + def test_valid_oai_url(self): + url = 'http://repository.stcloudstate.edu/do/oai/' + oai_validator = validators.ValidOAIURL() + call = oai_validator(url) + self.assertTrue(call) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/other_response_identify.yaml') + def test_invalid_oai_url(self): + url = 'http://wwe.com' + oai_validator = validators.ValidOAIURL() + + with self.assertRaises(forms.ValidationError): + oai_validator(url) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/oai_response_invalid_identify.yaml') + def test_invalid_oai_url_with_xml(self): + url = 'http://www.osti.gov/scitech/scitechxml?EntryDateFrom=02%2F02%2F2015&page=0' + oai_validator = validators.ValidOAIURL() + + with self.assertRaises(forms.ValidationError): + oai_validator(url) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/other_response_404.yaml') + def test_url_returns_404(self): + url = 'https://github.com/erinspace/thisisnotreal' + url_validator = validators.URLResolves() + + with self.assertRaises(forms.ValidationError): + url_validator(url) + + @vcr.use_cassette('provider_registration/test_utils/vcr_cassettes/other_response_404_oai.yaml') + def test_oai_url_returns_404(self): + url = 'https://github.com/erinspace/thisisnotreal' + url_validator = validators.ValidOAIURL() + + with self.assertRaises(forms.ValidationError): + url_validator(url) diff --git a/api/provider_registration/urls.py b/api/provider_registration/urls.py new file mode 100644 index 00000000..ecdbbbdc --- /dev/null +++ b/api/provider_registration/urls.py @@ -0,0 +1,13 @@ +from django.conf.urls import include, url + +from api.provider_registration import views + +urlpatterns = [ + url(r'^/', include([ + url(r'^$', views.index, name='index'), + url(r'^register/$', views.register_provider, name='register'), + url(r'^contact_information/$', views.get_contact_info, name='contact_information'), + url(r'^provider_information/$', views.save_metadata_render_provider, name='provider_information'), + url(r'^simple_oai_registration/$', views.redirect_to_simple_oai, name='simple_oai_registration') + ])) +] diff --git a/api/provider_registration/utils.py b/api/provider_registration/utils.py new file mode 100644 index 00000000..f3716aa4 --- /dev/null +++ b/api/provider_registration/utils.py @@ -0,0 +1,77 @@ +import ast +import logging +from datetime import date, timedelta + +import requests +from lxml import etree + +NAMESPACES = {'dc': 'http://purl.org/dc/elements/1.1/', + 'oai_dc': 'http://www.openarchives.org/OAI/2.0/', + 'ns0': 'http://www.openarchives.org/OAI/2.0/'} +BASE_SCHEMA = ['title', 'contributor', 'creator', 'subject', 'description'] + +logger = logging.getLogger(__name__) + + +def format_set_choices(pre_saved_data): + + sets = pre_saved_data.approved_sets + sets = ast.literal_eval(sets) + approved_set_set = set((item[0].replace('publication:', ''), item[1]) for item in sets) + + return approved_set_set + + +def get_session_item(request, item): + return request.session[item] + + +def get_oai_properties(base_url): + """ Makes 2 requests to the provided base URL: + 1 for the sets available + 1 for the list of properties + + returns a dict with list of properties, and set_groups. + + Set groups is a list of tuples - first element is short name, + second element is the long descriptive name. + + The sets available are added as multiple selections for the next form, + the properties are pre-loaded into the properties field. + """ + try: + # request 1 for the setSpecs available + set_url = base_url.strip() + '?verb=ListSets' + set_data_request = requests.get(set_url) + all_content = etree.XML(set_data_request.content) + + all_sets = all_content.xpath('//oai_dc:set', namespaces=NAMESPACES) + all_set_info = [one.getchildren() for one in all_sets] + + set_groups = [] + for item in all_set_info: + one_group = (item[0].text, item[1].text) + set_groups.append(one_group) + + # request 2 for records 30 days back just in case + start_date = str(date.today() - timedelta(30)) + prop_url = base_url + '?verb=ListRecords&metadataPrefix=oai_dc&from={}T00:00:00Z'.format(start_date) + prop_data_request = requests.get(prop_url) + all_prop_content = etree.XML(prop_data_request.content) + try: + pre_names = all_prop_content.xpath('//ns0:metadata', namespaces=NAMESPACES)[0].getchildren()[0].getchildren() + except IndexError: + prop_url = base_url + '?verb=ListRecords&metadataPrefix=oai_dc&from={}'.format(start_date) + prop_data_request = requests.get(prop_url) + all_prop_content = etree.XML(prop_data_request.content) + pre_names = all_prop_content.xpath('//ns0:metadata', namespaces=NAMESPACES)[0].getchildren()[0].getchildren() + + all_names = [name.tag.replace('{' + NAMESPACES['dc'] + '}', '') for name in pre_names] + property_names = list({name for name in all_names if name not in BASE_SCHEMA}) + + return {'properties': property_names, 'sets': set_groups} + + # If anything at all goes wrong, just render a blank form... + except Exception as e: + logger.info(e) + raise ValueError('OAI Processing Error - {}'.format(e)) diff --git a/api/provider_registration/validators.py b/api/provider_registration/validators.py new file mode 100644 index 00000000..ef88db68 --- /dev/null +++ b/api/provider_registration/validators.py @@ -0,0 +1,46 @@ +import logging + +import requests + +from lxml import etree +from django import forms +from requests.exceptions import MissingSchema + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +IDENTIFY = '?verb=Identify' + +NAMESPACES = {'oai': 'http://www.openarchives.org/OAI/2.0/'} + + +class URLResolves(object): + def __call__(self, value): + ''' value is the serialized data to be validated ''' + try: + data = requests.get(value) + except (requests.exceptions.ConnectionError, MissingSchema): + raise forms.ValidationError('URL does not resolve, please enter a valid URL') + if data.status_code == 404: + raise forms.ValidationError('URL does not resolve, please enter a valid URL') + + +class ValidOAIURL(object): + def __call__(self, value): + ''' value is the serialized data to be validated ''' + + url = value + IDENTIFY + + data = requests.get(url) + if data.status_code == 404: + raise forms.ValidationError('URL does not resolve, please enter a valid URL') + + try: + doc = etree.XML(data.content) + except etree.XMLSyntaxError: + raise forms.ValidationError('URL does not return valid XML, please enter a valid OAI-PMH url') + + repository_name = doc.xpath('//oai:repositoryName/node()', namespaces=NAMESPACES) or [''] + if repository_name[0]: + logger.info('OAI link valid for: {}'.format(repository_name)) + return True diff --git a/api/provider_registration/views.py b/api/provider_registration/views.py new file mode 100644 index 00000000..54997e83 --- /dev/null +++ b/api/provider_registration/views.py @@ -0,0 +1,338 @@ +import logging + +import requests +import collections +from lxml.etree import XMLSyntaxError + +from django.utils import timezone +from django.shortcuts import render +from django.forms.util import ErrorList +from django.views.decorators.clickjacking import xframe_options_exempt + +from api.provider_registration import utils + +from api.provider_registration.models import RegistrationInfo +from api.provider_registration.forms import OAIProviderForm, OtherProviderForm, InitialProviderForm, ContactInfoForm, MetadataQuestionsForm, SimpleOAIProviderForm + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +PLACEHOLDER = 'temp_value' + + +@xframe_options_exempt +def index(request): + providers_orig = requests.get('https://osf.io/api/v1/share/providers/').json()['providerMap'] + doc_count = requests.get('https://osf.io/api/v1/share/search/?v=1').json()['count'] + doc_count = format(doc_count, ",d") + + providers = collections.OrderedDict(sorted(providers_orig.items())) + + number_of_providers = len(providers.keys()) + context = {'providers': providers, 'number_of_providers': number_of_providers, 'doc_count': doc_count} + + return render(request, 'provider_registration/index.html', context) + + +@xframe_options_exempt +def get_contact_info(request): + """ Shows initial provider form + """ + if request.method == 'GET': + form = ContactInfoForm() + return render( + request, + 'provider_registration/contact_information.html', + {'form': form} + ) + else: + form = ContactInfoForm(request.POST) + if form.is_valid(): + contact_name = request.POST.get('contact_name') + contact_email = request.POST.get('contact_email') + reg_id = save_contact_info(contact_name, contact_email) + form = MetadataQuestionsForm({'reg_id': reg_id, 'meta_license': ' '}) + return render( + request, + 'provider_registration/metadata_questions.html', + {'form': form} + ) + else: + return render( + request, + 'provider_registration/contact_information.html', + {'form': form} + ) + + +def save_contact_info(contact_name, contact_email): + logger.info('Saving provider with contact name {} and email {}'.format(contact_name, contact_email)) + RegistrationInfo( + base_url=PLACEHOLDER, + contact_name=contact_name, + contact_email=contact_email, + provider_long_name=PLACEHOLDER, + registration_date=timezone.now() + ).save() + new_registration = RegistrationInfo.objects.last() + return new_registration.id + + +@xframe_options_exempt +def save_metadata_render_provider(request): + """ + Saves metadata info + Shows basic provider questions form + """ + form = MetadataQuestionsForm(request.POST) + if form.is_valid(): + reg_id = request.POST.get('reg_id') + current_registration = RegistrationInfo.objects.get(id=reg_id) + + all_clear = [] + + if request.POST.get('meta_tos'): + current_registration.meta_tos = True + all_clear.append('meta_tos') + + if request.POST.get('meta_rights'): + current_registration.meta_rights = True + all_clear.append('meta_rights') + + if request.POST.get('meta_privacy'): + current_registration.meta_privacy = True + all_clear.append('meta_privacy') + + if request.POST.get('meta_sharing'): + current_registration.meta_sharing = True + all_clear.append('meta_sharing') + + if request.POST.get('meta_license_cc0'): + current_registration.meta_license_cc0 = True + all_clear.append('meta_license_cc0') + + current_registration.save() + + if len(all_clear) < 5: + current_registration.registration_complete = True + current_registration.save() + return render( + request, + 'provider_registration/registration_paused.html', + ) + else: + form = InitialProviderForm(initial={ + 'reg_id': reg_id + }) + return render( + request, + 'provider_registration/provider_questions.html', + {'form': form} + ) + + else: + return render( + request, + 'provider_registration/metadata_questions.html', + {'form': form} + ) + + +def save_other_info(provider_long_name, base_url, reg_id, api_docs, rate_limit, description): + object_to_update = RegistrationInfo.objects.get(id=reg_id) + + object_to_update.api_docs = api_docs + object_to_update.base_url = base_url + object_to_update.rate_limit = rate_limit + object_to_update.description = description + object_to_update.registration_date = timezone.now() + object_to_update.provider_long_name = provider_long_name + object_to_update.metadata_complete = True + object_to_update.save() + + return True + + +def save_oai_info(provider_long_name, base_url, reg_id, api_docs, rate_limit, description): + """ Gets and saves information about the OAI source + """ + success = {'value': False, 'reason': 'XML Not Valid'} + print('saving OAI info...') + object_to_update = RegistrationInfo.objects.get(id=reg_id) + object_to_update.api_docs = api_docs + object_to_update.base_url = base_url + object_to_update.description = description + object_to_update.rate_limit = rate_limit + object_to_update.registration_date = timezone.now() + object_to_update.provider_long_name = provider_long_name + object_to_update.metadata_complete = True + object_to_update.oai_provider = True + object_to_update.save() + + try: + oai_properties = utils.get_oai_properties(base_url) + + object_to_update.approved_sets = oai_properties['sets'] + object_to_update.property_list = oai_properties['properties'] + object_to_update.save() + + success['value'] = True + success['reason'] = '{} registered and saved successfully'.format(provider_long_name) + + except XMLSyntaxError: + success['reason'] = 'XML Not Valid' + + except ValueError: + success['reason'] = 'OAI Information could not be automatically processed.' + + logger.info(success['reason']) + return success + + +@xframe_options_exempt +def render_oai_provider_form(request, name, base_url, reg_id, api_docs, rate_limit, description): + saving_successful = save_oai_info(name, base_url, reg_id, api_docs, rate_limit, description) + if saving_successful['value']: + pre_saved_data = RegistrationInfo.objects.get(id=reg_id) + + approved_set_set = utils.format_set_choices(pre_saved_data) + + # render an OAI form with the request data filled in + form = OAIProviderForm( + { + 'reg_id': reg_id, + 'base_url': base_url, + 'provider_long_name': name, + 'property_list': pre_saved_data.property_list + }, + choices=sorted(approved_set_set, key=lambda x: x[1]) + ) + return render( + request, + 'provider_registration/oai_registration_form.html', + {'form': form, 'name': name, 'base_url': base_url} + ) + elif saving_successful['reason'] == 'XML Not Valid': + form = InitialProviderForm(request.POST) + form.is_valid() + form._errors["base_url"] = ErrorList(["OAI-PMH XML not valid, please enter a valid OAI PMH url"]) + return render( + request, + 'provider_registration/provider_questions.html', + {'form': form} + ) + elif saving_successful['reason'] == 'OAI Information could not be automatically processed.': + form = SimpleOAIProviderForm(initial={ + 'reg_id': reg_id, + 'base_url': base_url, + 'provider_long_name': name, + 'property_list': 'enter properties here' + }) + return render( + request, + 'provider_registration/simple_oai_registration_form.html', + {'form': form, 'name': name, 'base_url': base_url.strip()} + ) + + +@xframe_options_exempt +def redirect_to_simple_oai(request): + reg_id = utils.get_session_item(request, 'reg_id') + new_registration = RegistrationInfo.objects.get(id=reg_id) + + name = new_registration.provider_long_name + base_url = new_registration.base_url + reg_id = new_registration.id + + form = SimpleOAIProviderForm(initial={ + 'reg_id': reg_id, + 'base_url': base_url, + 'provider_long_name': name, + 'property_list': 'enter properties' + }) + return render( + request, + 'provider_registration/simple_oai_registration_form.html', + {'form': form, 'name': name, 'base_url': base_url.strip()} + ) + + +@xframe_options_exempt +def save_other_provider(request, name, base_url, reg_id, api_docs, rate_limit, description): + saving_successful = save_other_info(name, base_url, reg_id, api_docs, rate_limit, description) + object_to_update = RegistrationInfo.objects.get(id=reg_id) + if saving_successful: + object_to_update.registration_complete = True + object_to_update.save() + return render( + request, + 'provider_registration/confirmation.html', + {'provider': name} + ) + + +def update_oai_entry(request): + choices = {(item, item) for item in request.POST['approved_sets']} + form_data = OAIProviderForm(request.POST, choices=choices) + object_to_update = RegistrationInfo.objects.get(id=request.POST['reg_id']) + + object_to_update.property_list = form_data['property_list'].value() + object_to_update.approved_sets = str(form_data['approved_sets'].value()) + object_to_update.registration_complete = True + + object_to_update.save() + return form_data + + +def update_other_entry(request): + form_data = OtherProviderForm(request.POST) + object_to_update = RegistrationInfo.objects.get(id=request.POST['reg_id']) + object_to_update.property_list = form_data['property_list'].value() + object_to_update.registration_complete = True + + object_to_update.save() + return form_data + + +@xframe_options_exempt +def register_provider(request): + """ Function to register a provider. This does all the work for + registration, calling out to other functions for processing + """ + ## TODO - request.POST['property_list'] is '' here and so this needs to be fixed!!! + if not request.POST.get('property_list'): + request.session['reg_id'] = request.POST['reg_id'] + # this is the initial post, and needs to be checked + form = InitialProviderForm(request.POST) + if not form.is_valid(): + return render( + request, + 'provider_registration/provider_questions.html', + {'form': form} + ) + reg_id = request.POST['reg_id'] + api_docs = request.POST['api_docs'] + base_url = request.POST['base_url'] + rate_limit = request.POST['rate_limit'] + name = request.POST['provider_long_name'] + description = request.POST['description'] + # if it's a first request and not an oai request, render the other provider form + if not request.POST.get('oai_provider'): + form = save_other_provider(request, name, base_url, reg_id, api_docs, rate_limit, description) + return form + else: + # If it's made it this far, request is an OAI provider + form = render_oai_provider_form(request, name, base_url, reg_id, api_docs, rate_limit, description) + return form + else: + # Update the requested entries + if request.POST.get('approved_sets', False): + form_data = update_oai_entry(request) + else: + form_data = update_other_entry(request) + + return render( + request, + 'provider_registration/confirmation.html', + {'provider': form_data['provider_long_name'].value()} + ) From d863f05c124cc1a65513b19c3025e44bfe027d44 Mon Sep 17 00:00:00 2001 From: erinspace Date: Fri, 9 Oct 2015 12:14:14 -0400 Subject: [PATCH 66/92] Add bower components --- .../bower_components/bootstrap/.bower.json | 48 + .../bower_components/bootstrap/Gruntfile.js | 511 ++++++++ .../static/bower_components/bootstrap/LICENSE | 21 + .../bower_components/bootstrap/README.md | 134 +++ .../bower_components/bootstrap/bower.json | 39 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 +++++ .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../bootstrap/grunt/.jshintrc | 7 + .../bootstrap/grunt/bs-commonjs-generator.js | 23 + .../grunt/bs-glyphicons-data-generator.js | 41 + .../bootstrap/grunt/bs-lessdoc-parser.js | 238 ++++ .../bootstrap/grunt/bs-raw-files-generator.js | 46 + .../bootstrap/grunt/configBridge.json | 46 + .../bootstrap/grunt/sauce_browsers.yml | 82 ++ .../bower_components/bootstrap/js/.jscsrc | 36 + .../bower_components/bootstrap/js/.jshintrc | 15 + .../bower_components/bootstrap/js/affix.js | 162 +++ .../bower_components/bootstrap/js/alert.js | 94 ++ .../bower_components/bootstrap/js/button.js | 116 ++ .../bower_components/bootstrap/js/carousel.js | 237 ++++ .../bower_components/bootstrap/js/collapse.js | 211 ++++ .../bower_components/bootstrap/js/dropdown.js | 161 +++ .../bower_components/bootstrap/js/modal.js | 339 ++++++ .../bower_components/bootstrap/js/popover.js | 108 ++ .../bootstrap/js/scrollspy.js | 172 +++ .../bower_components/bootstrap/js/tab.js | 153 +++ .../bower_components/bootstrap/js/tooltip.js | 476 ++++++++ .../bootstrap/js/transition.js | 59 + .../bootstrap/less/.csscomb.json | 304 +++++ .../bootstrap/less/.csslintrc | 19 + .../bootstrap/less/alerts.less | 73 ++ .../bootstrap/less/badges.less | 66 ++ .../bootstrap/less/bootstrap.less | 50 + .../bootstrap/less/breadcrumbs.less | 26 + .../bootstrap/less/button-groups.less | 243 ++++ .../bootstrap/less/buttons.less | 160 +++ .../bootstrap/less/carousel.less | 269 +++++ .../bootstrap/less/close.less | 34 + .../bower_components/bootstrap/less/code.less | 69 ++ .../bootstrap/less/component-animations.less | 33 + .../bootstrap/less/dropdowns.less | 214 ++++ .../bootstrap/less/forms.less | 574 +++++++++ .../bootstrap/less/glyphicons.less | 305 +++++ .../bower_components/bootstrap/less/grid.less | 84 ++ .../bootstrap/less/input-groups.less | 166 +++ .../bootstrap/less/jumbotron.less | 50 + .../bootstrap/less/labels.less | 64 + .../bootstrap/less/list-group.less | 124 ++ .../bootstrap/less/media.less | 61 + .../bootstrap/less/mixins.less | 39 + .../bootstrap/less/mixins/alerts.less | 14 + .../less/mixins/background-variant.less | 8 + .../bootstrap/less/mixins/border-radius.less | 18 + .../bootstrap/less/mixins/buttons.less | 52 + .../bootstrap/less/mixins/center-block.less | 7 + .../bootstrap/less/mixins/clearfix.less | 22 + .../bootstrap/less/mixins/forms.less | 85 ++ .../bootstrap/less/mixins/gradients.less | 59 + .../bootstrap/less/mixins/grid-framework.less | 91 ++ .../bootstrap/less/mixins/grid.less | 122 ++ .../bootstrap/less/mixins/hide-text.less | 21 + .../bootstrap/less/mixins/image.less | 33 + .../bootstrap/less/mixins/labels.less | 12 + .../bootstrap/less/mixins/list-group.less | 29 + .../bootstrap/less/mixins/nav-divider.less | 10 + .../less/mixins/nav-vertical-align.less | 9 + .../bootstrap/less/mixins/opacity.less | 8 + .../bootstrap/less/mixins/pagination.less | 23 + .../bootstrap/less/mixins/panels.less | 24 + .../bootstrap/less/mixins/progress-bar.less | 10 + .../bootstrap/less/mixins/reset-filter.less | 8 + .../bootstrap/less/mixins/resize.less | 6 + .../less/mixins/responsive-visibility.less | 15 + .../bootstrap/less/mixins/size.less | 10 + .../bootstrap/less/mixins/tab-focus.less | 9 + .../bootstrap/less/mixins/table-row.less | 28 + .../bootstrap/less/mixins/text-emphasis.less | 8 + .../bootstrap/less/mixins/text-overflow.less | 8 + .../less/mixins/vendor-prefixes.less | 227 ++++ .../bootstrap/less/modals.less | 150 +++ .../bootstrap/less/navbar.less | 660 +++++++++++ .../bower_components/bootstrap/less/navs.less | 242 ++++ .../bootstrap/less/normalize.less | 427 +++++++ .../bootstrap/less/pager.less | 54 + .../bootstrap/less/pagination.less | 88 ++ .../bootstrap/less/panels.less | 265 +++++ .../bootstrap/less/popovers.less | 135 +++ .../bootstrap/less/print.less | 107 ++ .../bootstrap/less/progress-bars.less | 87 ++ .../bootstrap/less/responsive-embed.less | 35 + .../bootstrap/less/responsive-utilities.less | 194 +++ .../bootstrap/less/scaffolding.less | 162 +++ .../bootstrap/less/tables.less | 234 ++++ .../bootstrap/less/theme.less | 273 +++++ .../bootstrap/less/thumbnails.less | 36 + .../bootstrap/less/tooltip.less | 102 ++ .../bower_components/bootstrap/less/type.less | 302 +++++ .../bootstrap/less/utilities.less | 55 + .../bootstrap/less/variables.less | 861 ++++++++++++++ .../bootstrap/less/wells.less | 29 + .../bower_components/bootstrap/package.js | 22 + .../bower_components/bootstrap/package.json | 93 ++ .../bower_components/jquery/.bower.json | 37 + .../bower_components/jquery/MIT-LICENSE.txt | 21 + .../static/bower_components/jquery/bower.json | 27 + .../bower_components/jquery/src/ajax.js | 801 +++++++++++++ .../bower_components/jquery/src/ajax/jsonp.js | 89 ++ .../bower_components/jquery/src/ajax/load.js | 75 ++ .../jquery/src/ajax/parseJSON.js | 51 + .../jquery/src/ajax/parseXML.js | 31 + .../jquery/src/ajax/script.js | 93 ++ .../bower_components/jquery/src/ajax/xhr.js | 197 ++++ .../bower_components/jquery/src/attributes.js | 11 + .../jquery/src/attributes/attr.js | 271 +++++ .../jquery/src/attributes/classes.js | 157 +++ .../jquery/src/attributes/prop.js | 134 +++ .../jquery/src/attributes/support.js | 62 + .../jquery/src/attributes/val.js | 178 +++ .../bower_components/jquery/src/callbacks.js | 205 ++++ .../bower_components/jquery/src/core.js | 535 +++++++++ .../jquery/src/core/access.js | 60 + .../bower_components/jquery/src/core/init.js | 132 +++ .../jquery/src/core/parseHTML.js | 39 + .../bower_components/jquery/src/core/ready.js | 152 +++ .../static/bower_components/jquery/src/css.js | 504 ++++++++ .../jquery/src/css/addGetHookIf.js | 32 + .../bower_components/jquery/src/css/curCSS.js | 124 ++ .../jquery/src/css/defaultDisplay.js | 69 ++ .../jquery/src/css/hiddenVisibleSelectors.js | 20 + .../jquery/src/css/support.js | 151 +++ .../bower_components/jquery/src/css/swap.js | 28 + .../bower_components/jquery/src/data.js | 335 ++++++ .../jquery/src/data/accepts.js | 21 + .../jquery/src/data/support.js | 25 + .../bower_components/jquery/src/deferred.js | 150 +++ .../bower_components/jquery/src/deprecated.js | 13 + .../bower_components/jquery/src/dimensions.js | 50 + .../bower_components/jquery/src/effects.js | 656 +++++++++++ .../jquery/src/effects/Tween.js | 114 ++ .../jquery/src/effects/animatedSelector.js | 13 + .../jquery/src/effects/support.js | 55 + .../bower_components/jquery/src/event.js | 1037 +++++++++++++++++ .../bower_components/jquery/src/event/ajax.js | 13 + .../jquery/src/event/alias.js | 39 + .../jquery/src/event/support.js | 26 + .../jquery/src/exports/amd.js | 24 + .../jquery/src/exports/global.js | 32 + .../bower_components/jquery/src/intro.js | 44 + .../bower_components/jquery/src/jquery.js | 38 + .../jquery/src/manipulation.js | 744 ++++++++++++ .../jquery/src/manipulation/_evalUrl.js | 18 + .../jquery/src/manipulation/support.js | 76 ++ .../bower_components/jquery/src/offset.js | 211 ++++ .../bower_components/jquery/src/outro.js | 1 + .../bower_components/jquery/src/queue.js | 142 +++ .../jquery/src/queue/delay.js | 22 + .../jquery/src/selector-sizzle.js | 14 + .../bower_components/jquery/src/selector.js | 1 + .../bower_components/jquery/src/serialize.js | 110 ++ .../bower_components/jquery/src/support.js | 58 + .../bower_components/jquery/src/traversing.js | 200 ++++ .../jquery/src/traversing/findFilter.js | 100 ++ .../bower_components/jquery/src/wrap.js | 76 ++ .../bower_components/pym.js/.bower.json | 29 + .../static/bower_components/pym.js/CHANGELOG | 31 + .../bower_components/pym.js/Gruntfile.js | 87 ++ .../static/bower_components/pym.js/LICENSE | 22 + .../static/bower_components/pym.js/README.md | 57 + .../static/bower_components/pym.js/bower.json | 18 + .../bower_components/pym.js/package.json | 33 + .../static/bower_components/pym.js/src/pym.js | 507 ++++++++ 174 files changed, 22007 insertions(+) create mode 100644 api/api/static/bower_components/bootstrap/.bower.json create mode 100644 api/api/static/bower_components/bootstrap/Gruntfile.js create mode 100644 api/api/static/bower_components/bootstrap/LICENSE create mode 100644 api/api/static/bower_components/bootstrap/README.md create mode 100644 api/api/static/bower_components/bootstrap/bower.json create mode 100644 api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 api/api/static/bower_components/bootstrap/grunt/.jshintrc create mode 100644 api/api/static/bower_components/bootstrap/grunt/bs-commonjs-generator.js create mode 100644 api/api/static/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js create mode 100644 api/api/static/bower_components/bootstrap/grunt/bs-lessdoc-parser.js create mode 100644 api/api/static/bower_components/bootstrap/grunt/bs-raw-files-generator.js create mode 100644 api/api/static/bower_components/bootstrap/grunt/configBridge.json create mode 100644 api/api/static/bower_components/bootstrap/grunt/sauce_browsers.yml create mode 100644 api/api/static/bower_components/bootstrap/js/.jscsrc create mode 100644 api/api/static/bower_components/bootstrap/js/.jshintrc create mode 100644 api/api/static/bower_components/bootstrap/js/affix.js create mode 100644 api/api/static/bower_components/bootstrap/js/alert.js create mode 100644 api/api/static/bower_components/bootstrap/js/button.js create mode 100644 api/api/static/bower_components/bootstrap/js/carousel.js create mode 100644 api/api/static/bower_components/bootstrap/js/collapse.js create mode 100644 api/api/static/bower_components/bootstrap/js/dropdown.js create mode 100644 api/api/static/bower_components/bootstrap/js/modal.js create mode 100644 api/api/static/bower_components/bootstrap/js/popover.js create mode 100644 api/api/static/bower_components/bootstrap/js/scrollspy.js create mode 100644 api/api/static/bower_components/bootstrap/js/tab.js create mode 100644 api/api/static/bower_components/bootstrap/js/tooltip.js create mode 100644 api/api/static/bower_components/bootstrap/js/transition.js create mode 100644 api/api/static/bower_components/bootstrap/less/.csscomb.json create mode 100644 api/api/static/bower_components/bootstrap/less/.csslintrc create mode 100644 api/api/static/bower_components/bootstrap/less/alerts.less create mode 100644 api/api/static/bower_components/bootstrap/less/badges.less create mode 100644 api/api/static/bower_components/bootstrap/less/bootstrap.less create mode 100644 api/api/static/bower_components/bootstrap/less/breadcrumbs.less create mode 100644 api/api/static/bower_components/bootstrap/less/button-groups.less create mode 100644 api/api/static/bower_components/bootstrap/less/buttons.less create mode 100644 api/api/static/bower_components/bootstrap/less/carousel.less create mode 100644 api/api/static/bower_components/bootstrap/less/close.less create mode 100644 api/api/static/bower_components/bootstrap/less/code.less create mode 100644 api/api/static/bower_components/bootstrap/less/component-animations.less create mode 100644 api/api/static/bower_components/bootstrap/less/dropdowns.less create mode 100644 api/api/static/bower_components/bootstrap/less/forms.less create mode 100644 api/api/static/bower_components/bootstrap/less/glyphicons.less create mode 100644 api/api/static/bower_components/bootstrap/less/grid.less create mode 100644 api/api/static/bower_components/bootstrap/less/input-groups.less create mode 100644 api/api/static/bower_components/bootstrap/less/jumbotron.less create mode 100644 api/api/static/bower_components/bootstrap/less/labels.less create mode 100644 api/api/static/bower_components/bootstrap/less/list-group.less create mode 100644 api/api/static/bower_components/bootstrap/less/media.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/alerts.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/background-variant.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/border-radius.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/buttons.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/center-block.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/clearfix.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/forms.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/gradients.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/grid-framework.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/grid.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/hide-text.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/image.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/labels.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/list-group.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/nav-divider.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/nav-vertical-align.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/opacity.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/pagination.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/panels.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/progress-bar.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/reset-filter.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/resize.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/responsive-visibility.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/size.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/tab-focus.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/table-row.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/text-emphasis.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/text-overflow.less create mode 100644 api/api/static/bower_components/bootstrap/less/mixins/vendor-prefixes.less create mode 100644 api/api/static/bower_components/bootstrap/less/modals.less create mode 100644 api/api/static/bower_components/bootstrap/less/navbar.less create mode 100644 api/api/static/bower_components/bootstrap/less/navs.less create mode 100644 api/api/static/bower_components/bootstrap/less/normalize.less create mode 100644 api/api/static/bower_components/bootstrap/less/pager.less create mode 100644 api/api/static/bower_components/bootstrap/less/pagination.less create mode 100644 api/api/static/bower_components/bootstrap/less/panels.less create mode 100644 api/api/static/bower_components/bootstrap/less/popovers.less create mode 100644 api/api/static/bower_components/bootstrap/less/print.less create mode 100644 api/api/static/bower_components/bootstrap/less/progress-bars.less create mode 100644 api/api/static/bower_components/bootstrap/less/responsive-embed.less create mode 100644 api/api/static/bower_components/bootstrap/less/responsive-utilities.less create mode 100644 api/api/static/bower_components/bootstrap/less/scaffolding.less create mode 100644 api/api/static/bower_components/bootstrap/less/tables.less create mode 100644 api/api/static/bower_components/bootstrap/less/theme.less create mode 100644 api/api/static/bower_components/bootstrap/less/thumbnails.less create mode 100644 api/api/static/bower_components/bootstrap/less/tooltip.less create mode 100644 api/api/static/bower_components/bootstrap/less/type.less create mode 100644 api/api/static/bower_components/bootstrap/less/utilities.less create mode 100644 api/api/static/bower_components/bootstrap/less/variables.less create mode 100644 api/api/static/bower_components/bootstrap/less/wells.less create mode 100644 api/api/static/bower_components/bootstrap/package.js create mode 100644 api/api/static/bower_components/bootstrap/package.json create mode 100644 api/api/static/bower_components/jquery/.bower.json create mode 100644 api/api/static/bower_components/jquery/MIT-LICENSE.txt create mode 100644 api/api/static/bower_components/jquery/bower.json create mode 100644 api/api/static/bower_components/jquery/src/ajax.js create mode 100644 api/api/static/bower_components/jquery/src/ajax/jsonp.js create mode 100644 api/api/static/bower_components/jquery/src/ajax/load.js create mode 100644 api/api/static/bower_components/jquery/src/ajax/parseJSON.js create mode 100644 api/api/static/bower_components/jquery/src/ajax/parseXML.js create mode 100644 api/api/static/bower_components/jquery/src/ajax/script.js create mode 100644 api/api/static/bower_components/jquery/src/ajax/xhr.js create mode 100644 api/api/static/bower_components/jquery/src/attributes.js create mode 100644 api/api/static/bower_components/jquery/src/attributes/attr.js create mode 100644 api/api/static/bower_components/jquery/src/attributes/classes.js create mode 100644 api/api/static/bower_components/jquery/src/attributes/prop.js create mode 100644 api/api/static/bower_components/jquery/src/attributes/support.js create mode 100644 api/api/static/bower_components/jquery/src/attributes/val.js create mode 100644 api/api/static/bower_components/jquery/src/callbacks.js create mode 100644 api/api/static/bower_components/jquery/src/core.js create mode 100644 api/api/static/bower_components/jquery/src/core/access.js create mode 100644 api/api/static/bower_components/jquery/src/core/init.js create mode 100644 api/api/static/bower_components/jquery/src/core/parseHTML.js create mode 100644 api/api/static/bower_components/jquery/src/core/ready.js create mode 100644 api/api/static/bower_components/jquery/src/css.js create mode 100644 api/api/static/bower_components/jquery/src/css/addGetHookIf.js create mode 100644 api/api/static/bower_components/jquery/src/css/curCSS.js create mode 100644 api/api/static/bower_components/jquery/src/css/defaultDisplay.js create mode 100644 api/api/static/bower_components/jquery/src/css/hiddenVisibleSelectors.js create mode 100644 api/api/static/bower_components/jquery/src/css/support.js create mode 100644 api/api/static/bower_components/jquery/src/css/swap.js create mode 100644 api/api/static/bower_components/jquery/src/data.js create mode 100644 api/api/static/bower_components/jquery/src/data/accepts.js create mode 100644 api/api/static/bower_components/jquery/src/data/support.js create mode 100644 api/api/static/bower_components/jquery/src/deferred.js create mode 100644 api/api/static/bower_components/jquery/src/deprecated.js create mode 100644 api/api/static/bower_components/jquery/src/dimensions.js create mode 100644 api/api/static/bower_components/jquery/src/effects.js create mode 100644 api/api/static/bower_components/jquery/src/effects/Tween.js create mode 100644 api/api/static/bower_components/jquery/src/effects/animatedSelector.js create mode 100644 api/api/static/bower_components/jquery/src/effects/support.js create mode 100644 api/api/static/bower_components/jquery/src/event.js create mode 100644 api/api/static/bower_components/jquery/src/event/ajax.js create mode 100644 api/api/static/bower_components/jquery/src/event/alias.js create mode 100644 api/api/static/bower_components/jquery/src/event/support.js create mode 100644 api/api/static/bower_components/jquery/src/exports/amd.js create mode 100644 api/api/static/bower_components/jquery/src/exports/global.js create mode 100644 api/api/static/bower_components/jquery/src/intro.js create mode 100644 api/api/static/bower_components/jquery/src/jquery.js create mode 100644 api/api/static/bower_components/jquery/src/manipulation.js create mode 100644 api/api/static/bower_components/jquery/src/manipulation/_evalUrl.js create mode 100644 api/api/static/bower_components/jquery/src/manipulation/support.js create mode 100644 api/api/static/bower_components/jquery/src/offset.js create mode 100644 api/api/static/bower_components/jquery/src/outro.js create mode 100644 api/api/static/bower_components/jquery/src/queue.js create mode 100644 api/api/static/bower_components/jquery/src/queue/delay.js create mode 100644 api/api/static/bower_components/jquery/src/selector-sizzle.js create mode 100644 api/api/static/bower_components/jquery/src/selector.js create mode 100644 api/api/static/bower_components/jquery/src/serialize.js create mode 100644 api/api/static/bower_components/jquery/src/support.js create mode 100644 api/api/static/bower_components/jquery/src/traversing.js create mode 100644 api/api/static/bower_components/jquery/src/traversing/findFilter.js create mode 100644 api/api/static/bower_components/jquery/src/wrap.js create mode 100644 api/api/static/bower_components/pym.js/.bower.json create mode 100644 api/api/static/bower_components/pym.js/CHANGELOG create mode 100644 api/api/static/bower_components/pym.js/Gruntfile.js create mode 100644 api/api/static/bower_components/pym.js/LICENSE create mode 100644 api/api/static/bower_components/pym.js/README.md create mode 100644 api/api/static/bower_components/pym.js/bower.json create mode 100644 api/api/static/bower_components/pym.js/package.json create mode 100644 api/api/static/bower_components/pym.js/src/pym.js diff --git a/api/api/static/bower_components/bootstrap/.bower.json b/api/api/static/bower_components/bootstrap/.bower.json new file mode 100644 index 00000000..5400ea08 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/.bower.json @@ -0,0 +1,48 @@ +{ + "name": "bootstrap", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "version": "3.3.4", + "keywords": [ + "css", + "js", + "less", + "mobile-first", + "responsive", + "front-end", + "framework", + "web" + ], + "homepage": "http://getbootstrap.com", + "main": [ + "less/bootstrap.less", + "dist/css/bootstrap.css", + "dist/js/bootstrap.js", + "dist/fonts/glyphicons-halflings-regular.eot", + "dist/fonts/glyphicons-halflings-regular.svg", + "dist/fonts/glyphicons-halflings-regular.ttf", + "dist/fonts/glyphicons-halflings-regular.woff", + "dist/fonts/glyphicons-halflings-regular.woff2" + ], + "ignore": [ + "/.*", + "_config.yml", + "CNAME", + "composer.json", + "CONTRIBUTING.md", + "docs", + "js/tests", + "test-infra" + ], + "dependencies": { + "jquery": ">= 1.9.1" + }, + "_release": "3.3.4", + "_resolution": { + "type": "version", + "tag": "v3.3.4", + "commit": "a10eb60bc0b07b747fa0c4ebd8821eb7307bd07f" + }, + "_source": "git://github.com/twbs/bootstrap.git", + "_target": "~3.3.4", + "_originalSource": "bootstrap" +} \ No newline at end of file diff --git a/api/api/static/bower_components/bootstrap/Gruntfile.js b/api/api/static/bower_components/bootstrap/Gruntfile.js new file mode 100644 index 00000000..fe9eb323 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/Gruntfile.js @@ -0,0 +1,511 @@ +/*! + * Bootstrap's Gruntfile + * http://getbootstrap.com + * Copyright 2013-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +module.exports = function (grunt) { + 'use strict'; + + // Force use of Unix newlines + grunt.util.linefeed = '\n'; + + RegExp.quote = function (string) { + return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); + }; + + var fs = require('fs'); + var path = require('path'); + var npmShrinkwrap = require('npm-shrinkwrap'); + var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js'); + var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js'); + var getLessVarsData = function () { + var filePath = path.join(__dirname, 'less/variables.less'); + var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' }); + var parser = new BsLessdocParser(fileContent); + return { sections: parser.parseFile() }; + }; + var generateRawFiles = require('./grunt/bs-raw-files-generator.js'); + var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js'); + var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' }); + + Object.keys(configBridge.paths).forEach(function (key) { + configBridge.paths[key].forEach(function (val, i, arr) { + arr[i] = path.join('./docs/assets', val); + }); + }); + + // Project configuration. + grunt.initConfig({ + + // Metadata. + pkg: grunt.file.readJSON('package.json'), + banner: '/*!\n' + + ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\n' + + ' */\n', + jqueryCheck: configBridge.config.jqueryCheck.join('\n'), + jqueryVersionCheck: configBridge.config.jqueryVersionCheck.join('\n'), + + // Task configuration. + clean: { + dist: 'dist', + docs: 'docs/dist' + }, + + jshint: { + options: { + jshintrc: 'js/.jshintrc' + }, + grunt: { + options: { + jshintrc: 'grunt/.jshintrc' + }, + src: ['Gruntfile.js', 'grunt/*.js'] + }, + core: { + src: 'js/*.js' + }, + test: { + options: { + jshintrc: 'js/tests/unit/.jshintrc' + }, + src: 'js/tests/unit/*.js' + }, + assets: { + src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js'] + } + }, + + jscs: { + options: { + config: 'js/.jscsrc' + }, + grunt: { + src: '<%= jshint.grunt.src %>' + }, + core: { + src: '<%= jshint.core.src %>' + }, + test: { + src: '<%= jshint.test.src %>' + }, + assets: { + options: { + requireCamelCaseOrUpperCaseIdentifiers: null + }, + src: '<%= jshint.assets.src %>' + } + }, + + concat: { + options: { + banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>', + stripBanners: false + }, + bootstrap: { + src: [ + 'js/transition.js', + 'js/alert.js', + 'js/button.js', + 'js/carousel.js', + 'js/collapse.js', + 'js/dropdown.js', + 'js/modal.js', + 'js/tooltip.js', + 'js/popover.js', + 'js/scrollspy.js', + 'js/tab.js', + 'js/affix.js' + ], + dest: 'dist/js/<%= pkg.name %>.js' + } + }, + + uglify: { + options: { + preserveComments: 'some' + }, + core: { + src: '<%= concat.bootstrap.dest %>', + dest: 'dist/js/<%= pkg.name %>.min.js' + }, + customize: { + src: configBridge.paths.customizerJs, + dest: 'docs/assets/js/customize.min.js' + }, + docsJs: { + src: configBridge.paths.docsJs, + dest: 'docs/assets/js/docs.min.js' + } + }, + + qunit: { + options: { + inject: 'js/tests/unit/phantom.js' + }, + files: 'js/tests/index.html' + }, + + less: { + compileCore: { + options: { + strictMath: true, + sourceMap: true, + outputSourceFiles: true, + sourceMapURL: '<%= pkg.name %>.css.map', + sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map' + }, + src: 'less/bootstrap.less', + dest: 'dist/css/<%= pkg.name %>.css' + }, + compileTheme: { + options: { + strictMath: true, + sourceMap: true, + outputSourceFiles: true, + sourceMapURL: '<%= pkg.name %>-theme.css.map', + sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map' + }, + src: 'less/theme.less', + dest: 'dist/css/<%= pkg.name %>-theme.css' + } + }, + + autoprefixer: { + options: { + browsers: configBridge.config.autoprefixerBrowsers + }, + core: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>.css' + }, + theme: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>-theme.css' + }, + docs: { + src: ['docs/assets/css/anchor.css', 'docs/assets/css/src/docs.css'] + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: ['**/*.css'], + dest: 'docs/examples/' + } + }, + + csslint: { + options: { + csslintrc: 'less/.csslintrc' + }, + dist: [ + 'dist/css/bootstrap.css', + 'dist/css/bootstrap-theme.css' + ], + examples: [ + 'docs/examples/**/*.css' + ], + docs: { + options: { + ids: false, + 'overqualified-elements': false + }, + src: 'docs/assets/css/src/docs.css' + } + }, + + cssmin: { + options: { + // TODO: disable `zeroUnits` optimization once clean-css 3.2 is released + // and then simplify the fix for https://github.com/twbs/bootstrap/issues/14837 accordingly + compatibility: 'ie8', + keepSpecialComments: '*', + advanced: false + }, + minifyCore: { + src: 'dist/css/<%= pkg.name %>.css', + dest: 'dist/css/<%= pkg.name %>.min.css' + }, + minifyTheme: { + src: 'dist/css/<%= pkg.name %>-theme.css', + dest: 'dist/css/<%= pkg.name %>-theme.min.css' + }, + docs: { + src: [ + 'docs/assets/css/src/pygments-manni.css', + 'docs/assets/css/src/anchor.css', + 'docs/assets/css/src/docs.css' + + ], + dest: 'docs/assets/css/docs.min.css' + } + }, + + usebanner: { + options: { + position: 'top', + banner: '<%= banner %>' + }, + files: { + src: 'dist/css/*.css' + } + }, + + csscomb: { + options: { + config: 'less/.csscomb.json' + }, + dist: { + expand: true, + cwd: 'dist/css/', + src: ['*.css', '!*.min.css'], + dest: 'dist/css/' + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: '**/*.css', + dest: 'docs/examples/' + }, + docs: { + src: 'docs/assets/css/src/docs.css', + dest: 'docs/assets/css/src/docs.css' + } + }, + + copy: { + fonts: { + expand: true, + src: 'fonts/*', + dest: 'dist/' + }, + docs: { + expand: true, + cwd: 'dist/', + src: [ + '**/*' + ], + dest: 'docs/dist/' + } + }, + + connect: { + server: { + options: { + port: 3000, + base: '.' + } + } + }, + + jekyll: { + options: { + config: '_config.yml' + }, + docs: {}, + github: { + options: { + raw: 'github: true' + } + } + }, + + jade: { + options: { + pretty: true, + data: getLessVarsData + }, + customizerVars: { + src: 'docs/_jade/customizer-variables.jade', + dest: 'docs/_includes/customizer-variables.html' + }, + customizerNav: { + src: 'docs/_jade/customizer-nav.jade', + dest: 'docs/_includes/nav/customize.html' + } + }, + + htmllint: { + options: { + ignore: [ + 'Attribute "autocomplete" not allowed on element "button" at this point.', + 'Attribute "autocomplete" not allowed on element "input" at this point.', + 'Element "img" is missing required attribute "src".' + ] + }, + src: '_gh_pages/**/*.html' + }, + + watch: { + src: { + files: '<%= jshint.core.src %>', + tasks: ['jshint:src', 'qunit', 'concat'] + }, + test: { + files: '<%= jshint.test.src %>', + tasks: ['jshint:test', 'qunit'] + }, + less: { + files: 'less/**/*.less', + tasks: 'less' + } + }, + + sed: { + versionNumber: { + pattern: (function () { + var old = grunt.option('oldver'); + return old ? RegExp.quote(old) : old; + })(), + replacement: grunt.option('newver'), + recursive: true + } + }, + + 'saucelabs-qunit': { + all: { + options: { + build: process.env.TRAVIS_JOB_ID, + throttled: 10, + maxRetries: 3, + maxPollRetries: 4, + urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'], + browsers: grunt.file.readYAML('grunt/sauce_browsers.yml') + } + } + }, + + exec: { + npmUpdate: { + command: 'npm update' + } + }, + + compress: { + main: { + options: { + archive: 'bootstrap-<%= pkg.version %>-dist.zip', + mode: 'zip', + level: 9, + pretty: true + }, + files: [ + { + expand: true, + cwd: 'dist/', + src: ['**'], + dest: 'bootstrap-<%= pkg.version %>-dist' + } + ] + } + } + + }); + + + // These plugins provide necessary tasks. + require('load-grunt-tasks')(grunt, { scope: 'devDependencies' }); + require('time-grunt')(grunt); + + // Docs HTML validation task + grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint']); + + var runSubset = function (subset) { + return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset; + }; + var isUndefOrNonZero = function (val) { + return val === undefined || val !== '0'; + }; + + // Test task. + var testSubtasks = []; + // Skip core tests if running a different subset of the test suite + if (runSubset('core') && + // Skip core tests if this is a Savage build + process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') { + testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'csslint:dist', 'test-js', 'docs']); + } + // Skip HTML validation if running a different subset of the test suite + if (runSubset('validate-html') && + // Skip HTML5 validator on Travis when [skip validator] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) { + testSubtasks.push('validate-html'); + } + // Only run Sauce Labs tests if there's a Sauce access key + if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' && + // Skip Sauce if running a different subset of the test suite + runSubset('sauce-js-unit') && + // Skip Sauce on Travis when [skip sauce] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) { + testSubtasks.push('connect'); + testSubtasks.push('saucelabs-qunit'); + } + grunt.registerTask('test', testSubtasks); + grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']); + + // JS distribution task. + grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']); + + // CSS distribution task. + grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']); + grunt.registerTask('dist-css', ['less-compile', 'autoprefixer:core', 'autoprefixer:theme', 'usebanner', 'csscomb:dist', 'cssmin:minifyCore', 'cssmin:minifyTheme']); + + // Full distribution task. + grunt.registerTask('dist', ['clean:dist', 'dist-css', 'copy:fonts', 'dist-js']); + + // Default task. + grunt.registerTask('default', ['clean:dist', 'copy:fonts', 'test']); + + // Version numbering task. + // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z + // This can be overzealous, so its changes should always be manually reviewed! + grunt.registerTask('change-version-number', 'sed'); + + grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); }); + + // task for building customizer + grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']); + grunt.registerTask('build-customizer-html', 'jade'); + grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () { + var banner = grunt.template.process('<%= banner %>'); + generateRawFiles(grunt, banner); + }); + + grunt.registerTask('commonjs', 'Generate CommonJS entrypoint module in dist dir.', function () { + var srcFiles = grunt.config.get('concat.bootstrap.src'); + var destFilepath = 'dist/js/npm.js'; + generateCommonJSModule(grunt, srcFiles, destFilepath); + }); + + // Docs task. + grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']); + grunt.registerTask('lint-docs-css', ['csslint:docs', 'csslint:examples']); + grunt.registerTask('docs-js', ['uglify:docsJs', 'uglify:customize']); + grunt.registerTask('lint-docs-js', ['jshint:assets', 'jscs:assets']); + grunt.registerTask('docs', ['docs-css', 'lint-docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs', 'build-glyphicons-data', 'build-customizer']); + + grunt.registerTask('prep-release', ['jekyll:github', 'compress']); + + // Task for updating the cached npm packages used by the Travis build (which are controlled by test-infra/npm-shrinkwrap.json). + // This task should be run and the updated file should be committed whenever Bootstrap's dependencies change. + grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', '_update-shrinkwrap']); + grunt.registerTask('_update-shrinkwrap', function () { + var done = this.async(); + npmShrinkwrap({ dev: true, dirname: __dirname }, function (err) { + if (err) { + grunt.fail.warn(err); + } + var dest = 'test-infra/npm-shrinkwrap.json'; + fs.renameSync('npm-shrinkwrap.json', dest); + grunt.log.writeln('File ' + dest.cyan + ' updated.'); + done(); + }); + }); +}; diff --git a/api/api/static/bower_components/bootstrap/LICENSE b/api/api/static/bower_components/bootstrap/LICENSE new file mode 100644 index 00000000..f4c52d6a --- /dev/null +++ b/api/api/static/bower_components/bootstrap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2015 Twitter, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/api/api/static/bower_components/bootstrap/README.md b/api/api/static/bower_components/bootstrap/README.md new file mode 100644 index 00000000..06e17f0f --- /dev/null +++ b/api/api/static/bower_components/bootstrap/README.md @@ -0,0 +1,134 @@ +# [Bootstrap](http://getbootstrap.com) +![Bower version](https://img.shields.io/bower/v/bootstrap.svg?style=flat) +[![npm version](https://img.shields.io/npm/v/bootstrap.svg?style=flat)](https://www.npmjs.com/package/bootstrap) +[![Build Status](https://img.shields.io/travis/twbs/bootstrap/master.svg?style=flat)](https://travis-ci.org/twbs/bootstrap) +[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg?style=flat)](https://david-dm.org/twbs/bootstrap#info=devDependencies) +[![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap) + +Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thornton](https://twitter.com/fat), and maintained by the [core team](https://github.com/orgs/twbs/people) with the massive support and involvement of the community. + +To get started, check out ! + +## Table of contents + +- [Quick start](#quick-start) +- [Bugs and feature requests](#bugs-and-feature-requests) +- [Documentation](#documentation) +- [Contributing](#contributing) +- [Community](#community) +- [Versioning](#versioning) +- [Creators](#creators) +- [Copyright and license](#copyright-and-license) + +## Quick start + +Five quick start options are available: + +- [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.3.4.zip). +- Clone the repo: `git clone https://github.com/twbs/bootstrap.git`. +- Install with [Bower](http://bower.io): `bower install bootstrap`. +- Install with [npm](https://www.npmjs.com): `npm install bootstrap`. +- Install with [Meteor](https://www.meteor.com/): `meteor add twbs:bootstrap`. + +Read the [Getting started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more. + +### What's included + +Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: + +``` +bootstrap/ +├── css/ +│ ├── bootstrap.css +│ ├── bootstrap.css.map +│ ├── bootstrap.min.css +│ ├── bootstrap-theme.css +│ ├── bootstrap-theme.css.map +│ └── bootstrap-theme.min.css +├── js/ +│ ├── bootstrap.js +│ └── bootstrap.min.js +└── fonts/ + ├── glyphicons-halflings-regular.eot + ├── glyphicons-halflings-regular.svg + ├── glyphicons-halflings-regular.ttf + ├── glyphicons-halflings-regular.woff + └── glyphicons-halflings-regular.woff2 +``` + +We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). CSS [source maps](https://developers.google.com/chrome-developer-tools/docs/css-preprocessors) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Fonts from Glyphicons are included, as is the optional Bootstrap theme. + + + +## Bugs and feature requests + +Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new). + + +## Documentation + +Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at . The docs may also be run locally. + +### Running documentation locally + +1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v2.5.x). + - **Windows users:** Read [this unofficial guide](http://jekyll-windows.juthilo.com/) to get Jekyll up and running without problems. +2. Install the Ruby-based syntax highlighter, [Rouge](https://github.com/jneen/rouge), with `gem install rouge`. +3. From the root `/bootstrap` directory, run `jekyll serve` in the command line. +4. Open in your browser, and voilà. + +Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/). + +### Documentation for previous releases + +Documentation for v2.3.2 has been made available for the time being at while folks transition to Bootstrap 3. + +[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. + + + +## Contributing + +Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. + +Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/master/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo). + +Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at . + + + +## Community + +Keep track of development and community news. + +- Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap). +- Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com). +- Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel. +- Implementation help may be found at Stack Overflow (tagged [`twitter-bootstrap-3`](http://stackoverflow.com/questions/tagged/twitter-bootstrap-3)). +- Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability. + + + +## Versioning + +For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible. + + + +## Creators + +**Mark Otto** + +- +- + +**Jacob Thornton** + +- +- + + + +## Copyright and license + +Code and documentation copyright 2011-2015 Twitter, Inc. Code released under [the MIT license](https://github.com/twbs/bootstrap/blob/master/LICENSE). Docs released under [Creative Commons](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE). diff --git a/api/api/static/bower_components/bootstrap/bower.json b/api/api/static/bower_components/bootstrap/bower.json new file mode 100644 index 00000000..d7eea392 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/bower.json @@ -0,0 +1,39 @@ +{ + "name": "bootstrap", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "version": "3.3.4", + "keywords": [ + "css", + "js", + "less", + "mobile-first", + "responsive", + "front-end", + "framework", + "web" + ], + "homepage": "http://getbootstrap.com", + "main": [ + "less/bootstrap.less", + "dist/css/bootstrap.css", + "dist/js/bootstrap.js", + "dist/fonts/glyphicons-halflings-regular.eot", + "dist/fonts/glyphicons-halflings-regular.svg", + "dist/fonts/glyphicons-halflings-regular.ttf", + "dist/fonts/glyphicons-halflings-regular.woff", + "dist/fonts/glyphicons-halflings-regular.woff2" + ], + "ignore": [ + "/.*", + "_config.yml", + "CNAME", + "composer.json", + "CONTRIBUTING.md", + "docs", + "js/tests", + "test-infra" + ], + "dependencies": { + "jquery": ">= 1.9.1" + } +} diff --git a/api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot b/api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf b/api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/api/api/static/bower_components/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/api/api/static/bower_components/bootstrap/grunt/.jshintrc b/api/api/static/bower_components/bootstrap/grunt/.jshintrc new file mode 100644 index 00000000..0ea0495e --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/.jshintrc @@ -0,0 +1,7 @@ +{ + "extends" : "../js/.jshintrc", + "asi" : false, + "browser" : false, + "es3" : false, + "node" : true +} diff --git a/api/api/static/bower_components/bootstrap/grunt/bs-commonjs-generator.js b/api/api/static/bower_components/bootstrap/grunt/bs-commonjs-generator.js new file mode 100644 index 00000000..b0642cd8 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/bs-commonjs-generator.js @@ -0,0 +1,23 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); + +var COMMONJS_BANNER = '// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\n'; + +module.exports = function generateCommonJSModule(grunt, srcFiles, destFilepath) { + var destDir = path.dirname(destFilepath); + + function srcPathToDestRequire(srcFilepath) { + var requirePath = path.relative(destDir, srcFilepath).replace(/\\/g, '/'); + return 'require(\'' + requirePath + '\')'; + } + + var moduleOutputJs = COMMONJS_BANNER + srcFiles.map(srcPathToDestRequire).join('\n'); + try { + fs.writeFileSync(destFilepath, moduleOutputJs); + } + catch (err) { + grunt.fail.warn(err); + } + grunt.log.writeln('File ' + destFilepath.cyan + ' created.'); +}; diff --git a/api/api/static/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js b/api/api/static/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js new file mode 100644 index 00000000..339fd0ff --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/bs-glyphicons-data-generator.js @@ -0,0 +1,41 @@ +/*! + * Bootstrap Grunt task for Glyphicons data generation + * http://getbootstrap.com + * Copyright 2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +'use strict'; +var fs = require('fs'); + +module.exports = function generateGlyphiconsData(grunt) { + // Pass encoding, utf8, so `readFileSync` will return a string instead of a + // buffer + var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8'); + var glyphiconsLines = glyphiconsFile.split('\n'); + + // Use any line that starts with ".glyphicon-" and capture the class name + var iconClassName = /^\.(glyphicon-[a-zA-Z0-9-]+)/; + var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.**\n' + + '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n'; + var glyphiconsYml = 'docs/_data/glyphicons.yml'; + for (var i = 0, len = glyphiconsLines.length; i < len; i++) { + var match = glyphiconsLines[i].match(iconClassName); + + if (match !== null) { + glyphiconsData += '- ' + match[1] + '\n'; + } + } + + // Create the `_data` directory if it doesn't already exist + if (!fs.existsSync('docs/_data')) { + fs.mkdirSync('docs/_data'); + } + + try { + fs.writeFileSync(glyphiconsYml, glyphiconsData); + } + catch (err) { + grunt.fail.warn(err); + } + grunt.log.writeln('File ' + glyphiconsYml.cyan + ' created.'); +}; diff --git a/api/api/static/bower_components/bootstrap/grunt/bs-lessdoc-parser.js b/api/api/static/bower_components/bootstrap/grunt/bs-lessdoc-parser.js new file mode 100644 index 00000000..d6be7745 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/bs-lessdoc-parser.js @@ -0,0 +1,238 @@ +/*! + * Bootstrap Grunt task for parsing Less docstrings + * http://getbootstrap.com + * Copyright 2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +'use strict'; + +var Markdown = require('markdown-it'); + +function markdown2html(markdownString) { + var md = new Markdown(); + + // the slice removes the

    ...

    wrapper output by Markdown processor + return md.render(markdownString.trim()).slice(3, -5); +} + + +/* +Mini-language: + //== This is a normal heading, which starts a section. Sections group variables together. + //## Optional description for the heading + + //=== This is a subheading. + + //** Optional description for the following variable. You **can** use Markdown in descriptions to discuss `` stuff. + @foo: #fff; + + //-- This is a heading for a section whose variables shouldn't be customizable + + All other lines are ignored completely. +*/ + + +var CUSTOMIZABLE_HEADING = /^[/]{2}={2}(.*)$/; +var UNCUSTOMIZABLE_HEADING = /^[/]{2}-{2}(.*)$/; +var SUBSECTION_HEADING = /^[/]{2}={3}(.*)$/; +var SECTION_DOCSTRING = /^[/]{2}#{2}(.+)$/; +var VAR_ASSIGNMENT = /^(@[a-zA-Z0-9_-]+):[ ]*([^ ;][^;]*);[ ]*$/; +var VAR_DOCSTRING = /^[/]{2}[*]{2}(.+)$/; + +function Section(heading, customizable) { + this.heading = heading.trim(); + this.id = this.heading.replace(/\s+/g, '-').toLowerCase(); + this.customizable = customizable; + this.docstring = null; + this.subsections = []; +} + +Section.prototype.addSubSection = function (subsection) { + this.subsections.push(subsection); +}; + +function SubSection(heading) { + this.heading = heading.trim(); + this.id = this.heading.replace(/\s+/g, '-').toLowerCase(); + this.variables = []; +} + +SubSection.prototype.addVar = function (variable) { + this.variables.push(variable); +}; + +function VarDocstring(markdownString) { + this.html = markdown2html(markdownString); +} + +function SectionDocstring(markdownString) { + this.html = markdown2html(markdownString); +} + +function Variable(name, defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + this.docstring = null; +} + +function Tokenizer(fileContent) { + this._lines = fileContent.split('\n'); + this._next = undefined; +} + +Tokenizer.prototype.unshift = function (token) { + if (this._next !== undefined) { + throw new Error('Attempted to unshift twice!'); + } + this._next = token; +}; + +Tokenizer.prototype._shift = function () { + // returning null signals EOF + // returning undefined means the line was ignored + if (this._next !== undefined) { + var result = this._next; + this._next = undefined; + return result; + } + if (this._lines.length <= 0) { + return null; + } + var line = this._lines.shift(); + var match = null; + match = SUBSECTION_HEADING.exec(line); + if (match !== null) { + return new SubSection(match[1]); + } + match = CUSTOMIZABLE_HEADING.exec(line); + if (match !== null) { + return new Section(match[1], true); + } + match = UNCUSTOMIZABLE_HEADING.exec(line); + if (match !== null) { + return new Section(match[1], false); + } + match = SECTION_DOCSTRING.exec(line); + if (match !== null) { + return new SectionDocstring(match[1]); + } + match = VAR_DOCSTRING.exec(line); + if (match !== null) { + return new VarDocstring(match[1]); + } + var commentStart = line.lastIndexOf('//'); + var varLine = (commentStart === -1) ? line : line.slice(0, commentStart); + match = VAR_ASSIGNMENT.exec(varLine); + if (match !== null) { + return new Variable(match[1], match[2]); + } + return undefined; +}; + +Tokenizer.prototype.shift = function () { + while (true) { + var result = this._shift(); + if (result === undefined) { + continue; + } + return result; + } +}; + +function Parser(fileContent) { + this._tokenizer = new Tokenizer(fileContent); +} + +Parser.prototype.parseFile = function () { + var sections = []; + while (true) { + var section = this.parseSection(); + if (section === null) { + if (this._tokenizer.shift() !== null) { + throw new Error('Unexpected unparsed section of file remains!'); + } + return sections; + } + sections.push(section); + } +}; + +Parser.prototype.parseSection = function () { + var section = this._tokenizer.shift(); + if (section === null) { + return null; + } + if (!(section instanceof Section)) { + throw new Error('Expected section heading; got: ' + JSON.stringify(section)); + } + var docstring = this._tokenizer.shift(); + if (docstring instanceof SectionDocstring) { + section.docstring = docstring; + } + else { + this._tokenizer.unshift(docstring); + } + this.parseSubSections(section); + + return section; +}; + +Parser.prototype.parseSubSections = function (section) { + while (true) { + var subsection = this.parseSubSection(); + if (subsection === null) { + if (section.subsections.length === 0) { + // Presume an implicit initial subsection + subsection = new SubSection(''); + this.parseVars(subsection); + } + else { + break; + } + } + section.addSubSection(subsection); + } + + if (section.subsections.length === 1 && !(section.subsections[0].heading) && section.subsections[0].variables.length === 0) { + // Ignore lone empty implicit subsection + section.subsections = []; + } +}; + +Parser.prototype.parseSubSection = function () { + var subsection = this._tokenizer.shift(); + if (subsection instanceof SubSection) { + this.parseVars(subsection); + return subsection; + } + this._tokenizer.unshift(subsection); + return null; +}; + +Parser.prototype.parseVars = function (subsection) { + while (true) { + var variable = this.parseVar(); + if (variable === null) { + return; + } + subsection.addVar(variable); + } +}; + +Parser.prototype.parseVar = function () { + var docstring = this._tokenizer.shift(); + if (!(docstring instanceof VarDocstring)) { + this._tokenizer.unshift(docstring); + docstring = null; + } + var variable = this._tokenizer.shift(); + if (variable instanceof Variable) { + variable.docstring = docstring; + return variable; + } + this._tokenizer.unshift(variable); + return null; +}; + + +module.exports = Parser; diff --git a/api/api/static/bower_components/bootstrap/grunt/bs-raw-files-generator.js b/api/api/static/bower_components/bootstrap/grunt/bs-raw-files-generator.js new file mode 100644 index 00000000..ec8c5314 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/bs-raw-files-generator.js @@ -0,0 +1,46 @@ +/*! + * Bootstrap Grunt task for generating raw-files.min.js for the Customizer + * http://getbootstrap.com + * Copyright 2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/* global btoa: true */ + +'use strict'; +var fs = require('fs'); +var btoa = require('btoa'); +var glob = require('glob'); + +function getFiles(type) { + var files = {}; + var recursive = (type === 'less'); + var globExpr = (recursive ? '/**/*' : '/*'); + glob.sync(type + globExpr) + .filter(function (path) { + return type === 'fonts' ? true : new RegExp('\\.' + type + '$').test(path); + }) + .forEach(function (fullPath) { + var relativePath = fullPath.replace(/^[^/]+\//, ''); + files[relativePath] = (type === 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8')); + }); + return 'var __' + type + ' = ' + JSON.stringify(files) + '\n'; +} + +module.exports = function generateRawFilesJs(grunt, banner) { + if (!banner) { + banner = ''; + } + var dirs = ['js', 'less', 'fonts']; + var files = banner + dirs.map(getFiles).reduce(function (combined, file) { + return combined + file; + }, ''); + var rawFilesJs = 'docs/assets/js/raw-files.min.js'; + try { + fs.writeFileSync(rawFilesJs, files); + } + catch (err) { + grunt.fail.warn(err); + } + grunt.log.writeln('File ' + rawFilesJs.cyan + ' created.'); +}; diff --git a/api/api/static/bower_components/bootstrap/grunt/configBridge.json b/api/api/static/bower_components/bootstrap/grunt/configBridge.json new file mode 100644 index 00000000..b7080b0c --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/configBridge.json @@ -0,0 +1,46 @@ +{ + "paths": { + "customizerJs": [ + "../assets/js/vendor/autoprefixer.js", + "../assets/js/vendor/less.min.js", + "../assets/js/vendor/jszip.min.js", + "../assets/js/vendor/uglify.min.js", + "../assets/js/vendor/Blob.js", + "../assets/js/vendor/FileSaver.js", + "../assets/js/raw-files.min.js", + "../assets/js/src/customizer.js" + ], + "docsJs": [ + "../assets/js/vendor/holder.js", + "../assets/js/vendor/ZeroClipboard.min.js", + "../assets/js/vendor/anchor.js", + "../assets/js/src/application.js" + ] + }, + "config": { + "autoprefixerBrowsers": [ + "Android 2.3", + "Android >= 4", + "Chrome >= 20", + "Firefox >= 24", + "Explorer >= 8", + "iOS >= 6", + "Opera >= 12", + "Safari >= 6" + ], + "jqueryCheck": [ + "if (typeof jQuery === 'undefined') {", + " throw new Error('Bootstrap\\'s JavaScript requires jQuery')", + "}\n" + ], + "jqueryVersionCheck": [ + "+function ($) {", + " 'use strict';", + " var version = $.fn.jquery.split(' ')[0].split('.')", + " if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {", + " throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher')", + " }", + "}(jQuery);\n\n" + ] + } +} \ No newline at end of file diff --git a/api/api/static/bower_components/bootstrap/grunt/sauce_browsers.yml b/api/api/static/bower_components/bootstrap/grunt/sauce_browsers.yml new file mode 100644 index 00000000..e48a6f5b --- /dev/null +++ b/api/api/static/bower_components/bootstrap/grunt/sauce_browsers.yml @@ -0,0 +1,82 @@ +[ + # Docs: https://saucelabs.com/docs/platforms/webdriver + + { + browserName: "safari", + platform: "OS X 10.10" + }, + { + browserName: "chrome", + platform: "OS X 10.10" + }, + { + browserName: "firefox", + platform: "OS X 10.10" + }, + + # Mac Opera not currently supported by Sauce Labs + + { + browserName: "internet explorer", + version: "11", + platform: "Windows 8.1" + }, + { + browserName: "internet explorer", + version: "10", + platform: "Windows 8" + }, + { + browserName: "internet explorer", + version: "9", + platform: "Windows 7" + }, + { + browserName: "internet explorer", + version: "8", + platform: "Windows 7" + }, + + # { # Unofficial + # browserName: "internet explorer", + # version: "7", + # platform: "Windows XP" + # }, + + { + browserName: "chrome", + platform: "Windows 8.1" + }, + { + browserName: "firefox", + platform: "Windows 8.1" + }, + + # Win Opera 15+ not currently supported by Sauce Labs + + { + browserName: "iphone", + platform: "OS X 10.10", + version: "8.1" + }, + + # iOS Chrome not currently supported by Sauce Labs + + # Linux (unofficial) + { + browserName: "chrome", + platform: "Linux" + }, + { + browserName: "firefox", + platform: "Linux" + } + + # Android Chrome not currently supported by Sauce Labs + + # { # Android Browser (super-unofficial) + # browserName: "android", + # version: "4.0", + # platform: "Linux" + # } +] diff --git a/api/api/static/bower_components/bootstrap/js/.jscsrc b/api/api/static/bower_components/bootstrap/js/.jscsrc new file mode 100644 index 00000000..982676e1 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/.jscsrc @@ -0,0 +1,36 @@ +{ + "disallowEmptyBlocks": true, + "disallowKeywords": ["with"], + "disallowMixedSpacesAndTabs": true, + "disallowMultipleLineStrings": true, + "disallowMultipleVarDecl": true, + "disallowQuotedKeysInObjects": "allButReserved", + "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], + "disallowSpaceBeforeBinaryOperators": [","], + "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], + "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpacesInsideParentheses": true, + "disallowTrailingComma": true, + "disallowTrailingWhitespace": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "requireCapitalizedConstructors": true, + "requireCommaBeforeLineBreak": true, + "requireDotNotation": true, + "requireLineFeedAtFileEnd": true, + "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], + "requireSpaceAfterLineComment": true, + "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], + "requireSpaceBetweenArguments": true, + "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true }, + "requireSpacesInConditionalExpression": true, + "requireSpacesInForStatement": true, + "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, + "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true }, + "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, + "requireSpacesInsideObjectBrackets": "allButNested", + "validateIndentation": 2, + "validateLineBreaks": "LF", + "validateQuoteMarks": "'" +} diff --git a/api/api/static/bower_components/bootstrap/js/.jshintrc b/api/api/static/bower_components/bootstrap/js/.jshintrc new file mode 100644 index 00000000..a59e1d00 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/.jshintrc @@ -0,0 +1,15 @@ +{ + "asi" : true, + "browser" : true, + "eqeqeq" : false, + "eqnull" : true, + "es3" : true, + "expr" : true, + "jquery" : true, + "latedef" : true, + "laxbreak" : true, + "nonbsp" : true, + "strict" : true, + "undef" : true, + "unused" : true +} diff --git a/api/api/static/bower_components/bootstrap/js/affix.js b/api/api/static/bower_components/bootstrap/js/affix.js new file mode 100644 index 00000000..98197642 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/affix.js @@ -0,0 +1,162 @@ +/* ======================================================================== + * Bootstrap: affix.js v3.3.4 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.4' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = $(document.body).height() + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/api/api/static/bower_components/bootstrap/js/alert.js b/api/api/static/bower_components/bootstrap/js/alert.js new file mode 100644 index 00000000..1925ef01 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/alert.js @@ -0,0 +1,94 @@ +/* ======================================================================== + * Bootstrap: alert.js v3.3.4 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.4' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); diff --git a/api/api/static/bower_components/bootstrap/js/button.js b/api/api/static/bower_components/bootstrap/js/button.js new file mode 100644 index 00000000..7c7c021f --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/button.js @@ -0,0 +1,116 @@ +/* ======================================================================== + * Bootstrap: button.js v3.3.4 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.4' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); diff --git a/api/api/static/bower_components/bootstrap/js/carousel.js b/api/api/static/bower_components/bootstrap/js/carousel.js new file mode 100644 index 00000000..a38ef14d --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/carousel.js @@ -0,0 +1,237 @@ +/* ======================================================================== + * Bootstrap: carousel.js v3.3.4 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.4' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); diff --git a/api/api/static/bower_components/bootstrap/js/collapse.js b/api/api/static/bower_components/bootstrap/js/collapse.js new file mode 100644 index 00000000..954513c5 --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/collapse.js @@ -0,0 +1,211 @@ +/* ======================================================================== + * Bootstrap: collapse.js v3.3.4 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.4' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); diff --git a/api/api/static/bower_components/bootstrap/js/dropdown.js b/api/api/static/bower_components/bootstrap/js/dropdown.js new file mode 100644 index 00000000..9874600f --- /dev/null +++ b/api/api/static/bower_components/bootstrap/js/dropdown.js @@ -0,0 +1,161 @@ +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.4 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.4' + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('