From a7b4a07f45087f6d5cebd8d162a97c86921b5069 Mon Sep 17 00:00:00 2001 From: Tim Sherratt Date: Wed, 26 Jan 2022 15:59:39 +1100 Subject: [PATCH] Initial commit --- .gitignore | 1 + 00_core.ipynb | 48 - LICENSE | 222 +- Makefile | 37 + README.md | 28 +- api.ipynb | 2191 ++++++++++++++++++ docs/_config.yml | 66 + docs/_data/sidebars/home_sidebar.yml | 18 + docs/_data/topnav.yml | 10 + docs/api.html | 2075 +++++++++++++++++ docs/index.html | 100 + docs/sidebar.json | 6 + index.ipynb | 83 +- media/nla.news-article226799674-24144902.jpg | Bin 0 -> 298664 bytes omeka_s_tools/__init__.py | 1 + omeka_s_tools/_nbdev.py | 13 + omeka_s_tools/api.py | 409 ++++ settings.ini | 26 +- 18 files changed, 5051 insertions(+), 283 deletions(-) delete mode 100644 00_core.ipynb create mode 100644 Makefile create mode 100644 api.ipynb create mode 100644 docs/_config.yml create mode 100644 docs/_data/sidebars/home_sidebar.yml create mode 100644 docs/_data/topnav.yml create mode 100644 docs/api.html create mode 100644 docs/index.html create mode 100644 docs/sidebar.json create mode 100644 media/nla.news-article226799674-24144902.jpg create mode 100644 omeka_s_tools/__init__.py create mode 100644 omeka_s_tools/_nbdev.py create mode 100644 omeka_s_tools/api.py diff --git a/.gitignore b/.gitignore index 87230d5..d7b3982 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,4 @@ checklink/cookies.txt # .gitconfig is now autogenerated .gitconfig +*.sqlite diff --git a/00_core.ipynb b/00_core.ipynb deleted file mode 100644 index 6c17de9..0000000 --- a/00_core.ipynb +++ /dev/null @@ -1,48 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# default_exp core" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# module name here\n", - "\n", - "> API details." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#hide\n", - "from nbdev.showdoc import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/LICENSE b/LICENSE index 261eeb9..c5f4635 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,21 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +MIT License + +Copyright (c) 2022 Tim Sherratt + +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. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0fb8f0e --- /dev/null +++ b/Makefile @@ -0,0 +1,37 @@ +.ONESHELL: +SHELL := /bin/bash +SRC = $(wildcard ./*.ipynb) + +all: omeka_s_tools docs + +omeka_s_tools: $(SRC) + nbdev_build_lib + touch omeka_s_tools + +sync: + nbdev_update_lib + +docs_serve: docs + cd docs && bundle exec jekyll serve + +docs: $(SRC) + nbdev_build_docs + touch docs + +test: + nbdev_test_nbs + +release: pypi conda_release + nbdev_bump_version + +conda_release: + fastrelease_conda_package + +pypi: dist + twine upload --repository pypi dist/* + +dist: clean + python setup.py sdist bdist_wheel + +clean: + rm -rf dist \ No newline at end of file diff --git a/README.md b/README.md index 154894b..09566b1 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,24 @@ -# nbdev template +# Project name here +> Summary description here. -Use this template to more easily create your [nbdev](https://nbdev.fast.ai/) project. -_If you are using an older version of this template, and want to upgrade to the theme-based version, see [this helper script](https://gist.github.com/hamelsmu/977e82a23dcd8dcff9058079cb4a8f18) (more explanation of what this means is contained in the link to the script)_. +This file will become your README and also the index of your documentation. -## Troubleshooting Tips +## Install -- Make sure you are using the latest version of nbdev with `pip install -U nbdev` -- If you are using an older version of this template, see the instructions above on how to upgrade your template. -- It is important for you to spell the name of your user and repo correctly in `settings.ini` or the website will not have the correct address from which to source assets like CSS for your site. When in doubt, you can open your browser's developer console and see if there are any errors related to fetching assets for your website due to an incorrect URL generated by misspelled values from `settings.ini`. -- If you change the name of your repo, you have to make the appropriate changes in `settings.ini` -- After you make changes to `settings.ini`, run `nbdev_build_lib && nbdev_clean_nbs && nbdev_build_docs` to make sure all changes are propagated appropriately. +`pip install your_project_name` +## How to use -## Previewing Documents Locally +Fill me in please! Don't forget code examples: + +``` +1+1 +``` + + + + + 2 -It is often desirable to preview nbdev generated documentation locally before having it built and rendered by GitHub Pages. This requires you to run Jekyll locally, which requires installing Ruby and Jekyll. Instructions on how to install Jekyll are provided [on Jekyll's site](https://jekyllrb.com/). You can run the command `make docs_serve` from the root of your repo to serve the documentation locally after calling `nbdev_build_docs` to generate the docs. -In order to allow you to run Jekyll locally this project contains manifest files, called Gem files, that specify all Ruby dependencies for Jekyll & nbdev. **If you do not plan to preview documentation locally**, you can choose to delete `docs/Gemfile` and `docs/Gemfile.lock` from your nbdev project (for example, after creating a new repo from this template). diff --git a/api.ipynb b/api.ipynb new file mode 100644 index 0000000..7c0c1c7 --- /dev/null +++ b/api.ipynb @@ -0,0 +1,2191 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# default_exp api" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Omeka S API client\n", + "\n", + "> Tools to interact with the Omeka S REST API" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#hide\n", + "from nbdev.showdoc import *\n", + "import random\n", + "import os\n", + "%load_ext dotenv\n", + "%dotenv" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#export\n", + "import requests\n", + "import requests_cache\n", + "import json\n", + "from requests.adapters import HTTPAdapter\n", + "from requests.packages.urllib3.util.retry import Retry\n", + "from pathlib import Path\n", + "\n", + "class OmekaAPIClient(object):\n", + " \n", + " def __init__(self, api_url, key_identity=None, key_credential=None, use_cache=True):\n", + " self.api_url = api_url\n", + " self.params = {\n", + " 'key_identity': key_identity,\n", + " 'key_credential': key_credential\n", + " }\n", + " # Set up session and caching\n", + " if use_cache:\n", + " self.s = requests_cache.CachedSession()\n", + " self.s.cache.clear()\n", + " else:\n", + " self.s = requests.Session()\n", + " retries = Retry(total=10, backoff_factor=1, status_forcelist=[ 502, 503, 504, 524 ])\n", + " self.s.mount('http://', HTTPAdapter(max_retries=retries))\n", + " self.s.mount('https://', HTTPAdapter(max_retries=retries))\n", + " \n", + "\n", + " def format_resource_id(self, resource_id, resource_type):\n", + " '''\n", + " Generate a formatted id for the resource with the specified Omeka id number and resource type.\n", + " \n", + " Parameters:\n", + " * `resource_id` - numeric identifier used by Omeka for this resource\n", + " * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + " \n", + " Returns:\n", + " * a dict with values for '@id' and 'o:id'\n", + " '''\n", + " formatted_id = {\n", + " '@id': f'{self.api_url}/{resource_type}/{resource_id}',\n", + " 'o:id': resource_id\n", + " }\n", + " return formatted_id\n", + "\n", + " def get_resources(self, resource_type, **kwargs):\n", + " '''\n", + " Get a list of resources matching the supplied parameters.\n", + " This will return the first page of matching results. To retrieve additional pages, \n", + " you can supply the `page` parameter to move through the full result set.\n", + " \n", + " Parameters:\n", + " * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + " * there are many additional parameters you can supply as kwargs, see the Omeka documention\n", + " \n", + " Returns a dict with the following values:\n", + " * `total_results` - number of matching resources\n", + " * `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource\n", + " '''\n", + " response = self.s.get(f'{self.api_url}/{resource_type}/', params=kwargs)\n", + " results = response.json()\n", + " return {'total_results': int(response.headers['Omeka-S-Total-Results']), 'results': results}\n", + " \n", + " def get_resource(self, resource_type, **kwargs):\n", + " '''\n", + " Get the first resource matching the supplied parameters.\n", + " \n", + " Parameters:\n", + " * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + " * there are many additional parameters you can supply as kwargs, see the Omeka documention\n", + " \n", + " Returns\n", + " * a dict containing a JSON-LD formatted representation of the resource\n", + " '''\n", + " \n", + " data = self.get_resources(resource_type, **kwargs)\n", + " try:\n", + " resource = data['results'][0]\n", + " except IndexError:\n", + " return\n", + " else:\n", + " return resource\n", + "\n", + " def get_resource_by_id(self, resource_id, resource_type='items'):\n", + " '''\n", + " Get a resource from its Omeka id.\n", + " \n", + " Parameters:\n", + " * `resource_id` - numeric identifier used by Omeka for this resource\n", + " * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + " \n", + " Returns\n", + " * a dict containing a JSON-LD formatted representation of the resource\n", + " '''\n", + " response = self.s.get(f'{self.api_url}/{resource_type}/{resource_id}')\n", + " return response.json()\n", + "\n", + " def get_template_by_label(self, label):\n", + " '''\n", + " Get a resource template from its Omeka label.\n", + " \n", + " Parameters:\n", + " * `label` - the name of the resource template in Omeka (eg. 'NewspaperArticle')\n", + " \n", + " Returns:\n", + " * dict containing representation of the template\n", + " '''\n", + " return self.get_resource('resource_templates', label=label)\n", + " \n", + " def get_resource_by_term(self, term, resource_type='properties'):\n", + " '''\n", + " Get the resource (property or class) associated with the suppied term.\n", + " \n", + " Parameters:\n", + " * `term` - property label qualified with vocabulary prefix (eg: 'schema:name')\n", + " \n", + " Returns:\n", + " * dict containing representation of the resource\n", + " '''\n", + " return self.get_resource(resource_type, term=term)\n", + " \n", + " def get_resource_from_vocab(self, local_name, vocabulary_namespace_uri='http://schema.org/', resource_type='properties'):\n", + " '''\n", + " Get the resource (property or class) associated with the suppied vocabulary and label.\n", + " \n", + " Parameters:\n", + " * `local_name` - label of the property or class\n", + " * `vocabulary_namespace_uri` - URI defining the vocab\n", + " \n", + " Returns:\n", + " * dict containing representation of the resource\n", + " '''\n", + " return self.get_resource(resource_type, local_name=local_name, vocabulary_namespace_uri=vocabulary_namespace_uri)\n", + " \n", + " def get_property_id(self, term):\n", + " '''\n", + " Get the numeric identifier associated with the supplied property term.\n", + " \n", + " Parameters:\n", + " * `term` - property label qualified with vocabulary prefix (eg: 'schema:name')\n", + " \n", + " Returns:\n", + " * numeric identifier\n", + " '''\n", + " resource = self.get_resource_by_term(term=term)\n", + " if resource:\n", + " return resource['o:id']\n", + "\n", + " def filter_items(self, params, **extra_filters):\n", + " for filter_type in ['resource_template_id', 'resource_class_id', 'item_set_id', 'is_public']:\n", + " filter_value = extra_filters.get(filter_type)\n", + " if filter_value:\n", + " params[filter_type] = filter_value\n", + " return params\n", + " \n", + " def filter_items_by_property(self, filter_property='schema:name', filter_value='', filter_type='eq', page=1, **extra_filters):\n", + " '''\n", + " Filter the list of items by searching for a value in a particular property.\n", + " Additional filters can also limit to items associated with particular templates, classes, or item sets.\n", + " \n", + " Parameters:\n", + " * `filter_property` - property term (eg: 'schema:name')\n", + " * `filter_value` - the value you want to find\n", + " * `filter_type` - how `filter_value` should be compared to the stored values (eg: 'eq')\n", + " * `page` - number of results page\n", + " \n", + " Additional parameters:\n", + " * `resource_template_id` - numeric identifier\n", + " * `resource_class_id` - numeric identifier\n", + " * `item_set_id` - numeric identifier\n", + " * `is_public` - boolean, True or False\n", + " \n", + " Returns a dict with the following values:\n", + " * `total_results` - number of matching resources\n", + " * `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource\n", + " \n", + " '''\n", + " # We need to get the id of the property we're using\n", + " property_id = self.get_property_id(filter_property)\n", + " params = {\n", + " 'property[0][joiner]': 'and', # and / or joins multiple property searches\n", + " 'property[0][property]': property_id, # property id\n", + " 'property[0][type]': filter_type, # See above for options\n", + " 'property[0][text]': filter_value,\n", + " 'page': page\n", + " }\n", + " params = self.filter_items(params, **extra_filters)\n", + " # print(params)\n", + " data = self.get_resources('items', **params)\n", + " return data\n", + " \n", + " def search_items(self, query, search_type='fulltext_search', page=1, **extra_filters):\n", + " '''\n", + " Search for matching items.\n", + " Two search types are available:\n", + " * 'search` - looks for an exact match of the query in a property value\n", + " * 'fulltext_search` - looks for the occurance of the query anywhere\n", + " \n", + " Parameters:\n", + " * `query` - the text you want to search for\n", + " * `search_type` - one of 'fulltext_search' or 'search'\n", + " * `page` - number of results page\n", + " \n", + " Additional parameters:\n", + " * `resource_template_id` - numeric identifier\n", + " * `resource_class_id` - numeric identifier\n", + " * `item_set_id` - numeric identifier\n", + " * `is_public` - boolean, True or False\n", + " \n", + " Returns a dict with the following values:\n", + " * `total_results` - number of matching resources\n", + " * `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource\n", + " '''\n", + " params = {'page': page}\n", + " params[search_type] = query\n", + " params = self.filter_items(params, **extra_filters)\n", + " return self.get_resources('items', **params)\n", + "\n", + " def get_template_properties(self, template_id):\n", + " '''\n", + " List properties used by the specified template.\n", + " \n", + " The resource template objects returned by the API don't include property terms.\n", + " This function gets the additional details, and organises the properties in a dictionary, \n", + " organised by term. This makes it easy to check if a particular term is used by a template.\n", + " \n", + " Parameters:\n", + " * `template_id` - numeric identifier for a template\n", + " \n", + " Returns:\n", + " * a dict organised by property terms, with values for `property_id` and `type`\n", + " '''\n", + " properties = {}\n", + " template = self.get_resource_by_id(template_id, 'resource_templates')\n", + " for prop in template['o:resource_template_property']:\n", + " prop_url = prop['o:property']['@id']\n", + " # The resource template doesn't include property terms, so we have to go to the property data\n", + " response = self.s.get(prop_url)\n", + " data = response.json()\n", + " # Use default data types if they're not defined in the resource template\n", + " data_type = ['literal', 'uri', 'resource:item'] if prop['o:data_type'] == [] else prop['o:data_type']\n", + " properties[data['o:term']] = {'property_id': data['o:id'], 'type': data_type}\n", + " return properties\n", + " \n", + " def prepare_property_value(self, value, property_id):\n", + " '''\n", + " Formats a property value according to its datatype as expected by Omeka. \n", + " The formatted value can be used in a payload to create a new item.\n", + " \n", + " Parameters:\n", + " * `value` - a dict containing a `value` and (optionally) a `type`\n", + " * `property_id` - the numeric identifier of the property\n", + " \n", + " Note that is no `type` is supplied, 'literal' will be used by default.\n", + " \n", + " Returns:\n", + " * a dict with values for `property_id`, `type`, and either `@id` or `@value`.\n", + " '''\n", + " if not isinstance(value, dict):\n", + " value = {'value': value}\n", + " \n", + " try:\n", + " data_type = value['type']\n", + " except KeyError:\n", + " data_type = 'literal'\n", + " \n", + " property_value = {\n", + " 'property_id': property_id,\n", + " 'type': data_type\n", + " }\n", + " \n", + " if data_type == 'resource:item':\n", + " property_value['@id'] = f'{self.api_url}/items/{value[\"value\"]}'\n", + " property_value['value_resource_id'] = value['value']\n", + " property_value['value_resource_name'] = 'items'\n", + " elif data_type == 'uri':\n", + " property_value['@id'] = value['value']\n", + " else:\n", + " property_value['@value'] = value['value']\n", + " return property_value\n", + "\n", + " def add_item(self, payload, media_files=None, template_id=None, class_id=None, item_set_id=None):\n", + " '''\n", + " Create a new item from the supplied payload, optionally uploading attached media files.\n", + " \n", + " Parameters:\n", + " * `payload` - a dict generated by `prepare_item_payload()` or `prepare_item_payload_using_template()`\n", + " * `media_files` - a list of paths pointing to media files, or a list of dicts with `path` and `title` values\n", + " * `template_id` - internal Omeka identifier of a resource template you want to attach to this item\n", + " * `class_id` - internal Omeka identifier of a resource class you want to attach to this item\n", + " * `item_set_id` - internal Omeka identifier for an item set you want to add this item to\n", + " \n", + " Returns:\n", + " * a dict providing the JSON-LD representation of the new item from Omeka\n", + " '''\n", + " if template_id:\n", + " payload['o:resource_template'] = self.format_resource_id(template_id, 'resource_templates')\n", + " if class_id:\n", + " payload['o:resource_class'] = self.format_resource_id(class_id, 'resource_classes')\n", + " if item_set_id:\n", + " payload['o:item_set'] = self.format_resource_id(template_id, 'item_sets')\n", + " if media_files:\n", + " files = self.add_media_to_payload(payload, media_files)\n", + " response = self.s.post(f'{self.api_url}/items', files=files, params=self.params)\n", + " else:\n", + " response = self.s.post(f'{self.api_url}/items', json=payload, params=self.params)\n", + " return response.json()\n", + " \n", + " def prepare_item_payload(self, terms):\n", + " '''\n", + " Prepare an item payload, ready for upload.\n", + " \n", + " Parameters:\n", + " * `terms`: a dict of terms, values, and (optionally) data types\n", + " \n", + " Returns:\n", + " * the payload dict\n", + " '''\n", + " payload = {}\n", + " for term, values in terms.items():\n", + " # Get the property id of the supplied term\n", + " try:\n", + " property_id = self.get_property_id(term)\n", + " except IndexError:\n", + " print(f'Term \"{term}\" not found')\n", + " else:\n", + " payload[term] = []\n", + " for value in values:\n", + " # Add a value formatted according to the data type\n", + " payload[term].append(self.prepare_property_value(value, property_id))\n", + " return payload\n", + " \n", + " def prepare_item_payload_using_template(self, terms, template_id):\n", + " '''\n", + " Prepare an item payload, checking the supplied terms and values against the specified template.\n", + " Note:\n", + " * terms that are not in the template will generate a warning and be dropped from the payload\n", + " * data types that don't match the template definitions will generate a warning and the term will be dropped from the payload\n", + " * if no data type is supplied, a type that conforms with the template definition will be used\n", + " \n", + " Parameters:\n", + " * `terms`: a dict of terms, values, and (optionally) data types\n", + " * `template_id`: Omeka's internal numeric identifier for the template\n", + " \n", + " Returns:\n", + " * the payload dict\n", + " '''\n", + " template_properties = self.get_template_properties(template_id)\n", + " payload = {}\n", + " for term, values in terms.items():\n", + " if term in template_properties:\n", + " property_details = template_properties[term]\n", + " payload[term] = []\n", + " for value in values:\n", + " if not isinstance(value, dict):\n", + " value = {'value': value}\n", + " # The supplied data type doesn't match the template\n", + " if 'type' in value and value['type'] not in property_details['type']:\n", + " print(f'Data type \"{value[\"type\"]}\" for term \"{term}\" not allowed by template')\n", + " break\n", + " elif 'type' not in value:\n", + " # Use default datatype from template if none is supplied\n", + " if len(property_details['type']) == 1:\n", + " value['type'] = property_details['type'][0]\n", + " # Use literal if allowed by template and data type not supplied\n", + " elif 'literal' in property_details['type']:\n", + " value['type'] = 'literal'\n", + " # Don't know what data type to use\n", + " else:\n", + " print(f'Specify data type for term \"{term}\"')\n", + " break\n", + " # Add a value formatted according to the data type\n", + " payload[term].append(self.prepare_property_value(value, property_details['property_id']))\n", + " # The supplied term is not in the template\n", + " else:\n", + " print(f'Term {term} not in template') \n", + " return payload\n", + " \n", + " def add_media_to_payload(self, payload, media_files):\n", + " '''\n", + " Add media files to the item payload.\n", + " \n", + " Parameters:\n", + " * `payload` - the payload dict to be modified\n", + " * `media_files` - media files to be uploaded\n", + " \n", + " The value of `media_files` can be either:\n", + " * a list of paths to the image/media files (filename is used as title)\n", + " * a list of dicts, each containing `title`, and `path` values\n", + " \n", + " Returns: \n", + " * the modified payload dict\n", + " '''\n", + " payload['o:media'] = []\n", + " files = {}\n", + " for index, media_file in enumerate(media_files):\n", + " if isinstance(media_file, dict):\n", + " title = media_file['title']\n", + " path = media_file['path']\n", + " else:\n", + " title = media_file[:-4]\n", + " path = media_file\n", + " payload['o:media'].append({'o:ingester': 'upload', 'file_index': str(index), 'o:item': {}, 'dcterms:title': [{'property_id': 1, '@value': title, 'type': 'literal'}]})\n", + " files[f'file[{index}]'] = Path(path).read_bytes()\n", + " files['data'] = (None, json.dumps(payload), 'application/json')\n", + " return files" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To initialise the `OmekaAPIClient` you need to provide the base url of your Omeka instance's API." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "omeka = OmekaAPIClient('http://timsherratt.org/collections/api')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This will let you access details of all public resources provided by your Omeka instance. To access private resources, or create new resources, you'll have to authenticate your API requests by provide a `key_identity` and `key_credential`. See [Adding items](#Adding-items) for an example." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting resources\n", + "\n", + "You can find a [full list of Omeka's resources](https://omeka.org/s/docs/developer/api/#resources) in the API documentation. You're most likely to be interested in 'items', but accessing 'properties' and 'resource_templates' can be useful when you're creating new resources.\n", + "\n", + "You should be able to use `get_resources` with any of the resource types, though some of the parameters will be different. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_resources[source]

\n", + "\n", + "> OmekaAPIClient.get_resources(**`resource_type`**, **\\*\\*`kwargs`**)\n", + "\n", + "Get a list of resources matching the supplied parameters.\n", + "This will return the first page of matching results. To retrieve additional pages, \n", + "you can supply the `page` parameter to move through the full result set.\n", + "\n", + "Parameters:\n", + "* `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + "* there are many additional parameters you can supply as kwargs, see the Omeka documention\n", + "\n", + "Returns a dict with the following values:\n", + "* `total_results` - number of matching resources\n", + "* `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_resources)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "46" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = omeka.get_resources('items')\n", + "data['total_results']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(data['total_results'], int)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get a list of available resource templates\n", + "data = omeka.get_resources('resource_templates')\n", + "first_template = data['results'][0]\n", + "assert first_template['@type'] == 'o:ResourceTemplate'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_resource_by_id[source]

\n", + "\n", + "> OmekaAPIClient.get_resource_by_id(**`resource_id`**, **`resource_type`**=*`'items'`*)\n", + "\n", + "Get a resource from its Omeka id.\n", + "\n", + "Parameters:\n", + "* `resource_id` - numeric identifier used by Omeka for this resource\n", + "* `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + "\n", + "Returns\n", + "* a dict containing a JSON-LD formatted representation of the resource" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_resource_by_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get a random item from a list of items\n", + "data = omeka.get_resources('items')\n", + "random_item = random.choice(data['results'])\n", + "item_id = random_item['o:id']\n", + "\n", + "# Get the same item using its id\n", + "item_from_id = omeka.get_resource_by_id(item_id, 'items')\n", + "\n", + "# Check that they're the same\n", + "assert random_item == item_from_id" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It can be difficult to remember all the available parameters and the differences between resource types, so I've created a number of more specialised methods that are really just wrappers around `get_resources`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_template_by_label[source]

\n", + "\n", + "> OmekaAPIClient.get_template_by_label(**`label`**)\n", + "\n", + "Get a resource template from its Omeka label.\n", + "\n", + "Parameters:\n", + "* `label` - the name of the resource template in Omeka (eg. 'NewspaperArticle')\n", + "\n", + "Returns:\n", + "* dict containing representation of the template" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_template_by_label)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "newspaper_template = omeka.get_template_by_label('Newspaper')\n", + "\n", + "assert newspaper_template['@type'] == 'o:ResourceTemplate'\n", + "assert newspaper_template['o:label'] == 'Newspaper'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get a random template from list\n", + "template_from_list = random.choice(omeka.get_resources('resource_templates')['results'])\n", + "label = template_from_list['o:label']\n", + "\n", + "# Get the template using label\n", + "template_from_label = omeka.get_template_by_label(label)\n", + "\n", + "# Check they're both the same\n", + "assert template_from_list == template_from_label" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_resource_by_term[source]

\n", + "\n", + "> OmekaAPIClient.get_resource_by_term(**`term`**, **`resource_type`**=*`'properties'`*)\n", + "\n", + "Get the resource (property or class) associated with the suppied term.\n", + "\n", + "Parameters:\n", + "* `term` - property label qualified with vocabulary prefix (eg: 'schema:name')\n", + "\n", + "Returns:\n", + "* dict containing representation of the resource" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_resource_by_term)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'@context': 'http://timsherratt.org/collections/api-context',\n", + " '@id': 'http://timsherratt.org/collections/api/properties/1116',\n", + " '@type': 'o:Property',\n", + " 'o:id': 1116,\n", + " 'o:local_name': 'name',\n", + " 'o:label': 'name',\n", + " 'o:comment': 'The name of the item.',\n", + " 'o:term': 'schema:name',\n", + " 'o:vocabulary': {'@id': 'http://timsherratt.org/collections/api/vocabularies/5',\n", + " 'o:id': 5}}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prop = omeka.get_resource_by_term('schema:name')\n", + "prop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert prop['@type'] == 'o:Property'\n", + "assert prop['o:term'] == 'schema:name'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_resource_from_vocab[source]

\n", + "\n", + "> OmekaAPIClient.get_resource_from_vocab(**`local_name`**, **`vocabulary_namespace_uri`**=*`'http://schema.org/'`*, **`resource_type`**=*`'properties'`*)\n", + "\n", + "Get the resource (property or class) associated with the suppied vocabulary and label.\n", + "\n", + "Parameters:\n", + "* `local_name` - label of the property or class\n", + "* `vocabulary_namespace_uri` - URI defining the vocab\n", + "\n", + "Returns:\n", + "* dict containing representation of the resource" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_resource_from_vocab)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'@context': 'http://timsherratt.org/collections/api-context',\n", + " '@id': 'http://timsherratt.org/collections/api/properties/1116',\n", + " '@type': 'o:Property',\n", + " 'o:id': 1116,\n", + " 'o:local_name': 'name',\n", + " 'o:label': 'name',\n", + " 'o:comment': 'The name of the item.',\n", + " 'o:term': 'schema:name',\n", + " 'o:vocabulary': {'@id': 'http://timsherratt.org/collections/api/vocabularies/5',\n", + " 'o:id': 5}}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prop = omeka.get_resource_from_vocab(\n", + " 'name', \n", + " vocabulary_namespace_uri='http://schema.org/',\n", + " resource_type='properties')\n", + "prop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "vocab = requests.get(prop['o:vocabulary']['@id'])\n", + "namespace_uri = vocab.json()['o:namespace_uri']\n", + "\n", + "assert namespace_uri == 'http://schema.org/'\n", + "assert prop['o:local_name'] == 'name'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_property_id[source]

\n", + "\n", + "> OmekaAPIClient.get_property_id(**`term`**)\n", + "\n", + "Get the numeric identifier associated with the supplied property term.\n", + "\n", + "Parameters:\n", + "* `term` - property label qualified with vocabulary prefix (eg: 'schema:name')\n", + "\n", + "Returns:\n", + "* numeric identifier" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_property_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1116" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prop_id = omeka.get_property_id('schema:name')\n", + "prop_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert isinstance(prop_id, int)\n", + "\n", + "prop = omeka.get_resource_by_id(prop_id, 'properties')\n", + "assert prop['o:term'] == 'schema:name'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.filter_items_by_property[source]

\n", + "\n", + "> OmekaAPIClient.filter_items_by_property(**`filter_property`**=*`'schema:name'`*, **`filter_value`**=*`''`*, **`filter_type`**=*`'eq'`*, **`page`**=*`1`*, **\\*\\*`extra_filters`**)\n", + "\n", + "Filter the list of items by searching for a value in a particular property.\n", + "Additional filters can also limit to items associated with particular templates, classes, or item sets.\n", + "\n", + "Parameters:\n", + "* `filter_property` - property term (eg: 'schema:name')\n", + "* `filter_value` - the value you want to find\n", + "* `filter_type` - how `filter_value` should be compared to the stored values (eg: 'eq')\n", + "* `page` - number of results page\n", + "\n", + "Additional parameters:\n", + "* `resource_template_id` - numeric identifier\n", + "* `resource_class_id` - numeric identifier\n", + "* `item_set_id` - numeric identifier\n", + "* `is_public` - boolean, True or False\n", + "\n", + "Returns a dict with the following values:\n", + "* `total_results` - number of matching resources\n", + "* `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.filter_items_by_property)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "items = omeka.filter_items_by_property(filter_property='schema:name', filter_value='WRAGGE.')\n", + "\n", + "assert len(items['results']) > 0\n", + "assert items['results'][0]['schema:name'][0]['@value'] == 'WRAGGE.'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.search_items[source]

\n", + "\n", + "> OmekaAPIClient.search_items(**`query`**, **`search_type`**=*`'fulltext_search'`*, **`page`**=*`1`*, **\\*\\*`extra_filters`**)\n", + "\n", + "Search for matching items.\n", + "Two search types are available:\n", + "* 'search` - looks for an exact match of the query in a property value\n", + "* 'fulltext_search` - looks for the occurance of the query anywhere\n", + "\n", + "Parameters:\n", + "* `query` - the text you want to search for\n", + "* `search_type` - one of 'fulltext_search' or 'search'\n", + "* `page` - number of results page\n", + "\n", + "Additional parameters:\n", + "* `resource_template_id` - numeric identifier\n", + "* `resource_class_id` - numeric identifier\n", + "* `item_set_id` - numeric identifier\n", + "* `is_public` - boolean, True or False\n", + "\n", + "Returns a dict with the following values:\n", + "* `total_results` - number of matching resources\n", + "* `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.search_items)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "items = omeka.search_items('wragge')\n", + "items['total_results']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert items['total_results'] >= len(items['results'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adding items\n", + "\n", + "To add resources to Omeka you need authenticate your API requests by supplying `key_identity` and `key_credential` tokens as parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "omeka_auth = OmekaAPIClient(\n", + " api_url='https://timsherratt.org/collections/api',\n", + " key_identity=os.getenv('KEY_IDENTITY'), \n", + " key_credential=os.getenv('KEY_CREDENTIAL')\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are two stages in creating a new item:\n", + "\n", + "* prepare a payload containing the item data in the format expected by Omeka\n", + "* upload the payload to Omeka\n", + "\n", + "### Prepare an item payload" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.prepare_item_payload[source]

\n", + "\n", + "> OmekaAPIClient.prepare_item_payload(**`terms`**)\n", + "\n", + "Prepare an item payload, ready for upload.\n", + "\n", + "Parameters:\n", + "* `terms`: a dict of terms, values, and (optionally) data types\n", + "\n", + "Returns:\n", + "* the payload dict" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.prepare_item_payload)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_item = {\n", + " 'dcterms:title': [\n", + " {\n", + " 'value': 'My first resource!'\n", + " }\n", + " ]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'dcterms:title': [{'property_id': 1,\n", + " 'type': 'literal',\n", + " '@value': 'My first resource!'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "payload = omeka_auth.prepare_item_payload(test_item)\n", + "payload" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each term in the payload should have values for `property_id` and `type`, and the property value should be included as either `@id` or `@value` depending on the data type." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "first_property = list(payload.values())[0][0]\n", + "\n", + "assert 'property_id' in first_property\n", + "assert 'type' in first_property\n", + "assert '@value' in first_property or '@id' in first_property" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One of the powerful features of Omeka S is the ability to create resource templates that define a set of properties for a particular type of item. We can use templates to help create our payload, ensuring that the terms and data types we supply match those expected by the template. This is useful for identifying potential problems before we upload to Omeka, especially as Omeka will sometimes just fail silently." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.prepare_item_payload_using_template[source]

\n", + "\n", + "> OmekaAPIClient.prepare_item_payload_using_template(**`terms`**, **`template_id`**)\n", + "\n", + "Prepare an item payload, checking the supplied terms and values against the specified template.\n", + "Note:\n", + "* terms that are not in the template will generate a warning and be dropped from the payload\n", + "* data types that don't match the template definitions will generate a warning and the term will be dropped from the payload\n", + "* if no data type is supplied, a type that conforms with the template definition will be used\n", + "\n", + "Parameters:\n", + "* `terms`: a dict of terms, values, and (optionally) data types\n", + "* `template_id`: Omeka's internal numeric identifier for the template\n", + "\n", + "Returns:\n", + "* the payload dict" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.prepare_item_payload_using_template)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once you've created a payload, you can add paths to any media files that you want to be attached to the item." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_newspaper_item = {\n", + " 'schema:name': [\n", + " {\n", + " 'value': 'Wragge!'\n", + " }\n", + " ]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'schema:name': [{'property_id': 1116,\n", + " 'type': 'literal',\n", + " '@value': 'Wragge!'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_newspaper_payload = omeka_auth.prepare_item_payload_using_template(test_newspaper_item, 5)\n", + "test_newspaper_payload" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert test_newspaper_item['schema:name'][0]['value'] == test_newspaper_payload['schema:name'][0]['@value']\n", + "assert test_newspaper_payload['schema:name'][0]['type'] == 'literal'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.add_media_to_payload[source]

\n", + "\n", + "> OmekaAPIClient.add_media_to_payload(**`payload`**, **`media_files`**)\n", + "\n", + "Add media files to the item payload.\n", + "\n", + "Parameters:\n", + "* `payload` - the payload dict to be modified\n", + "* `media_files` - media files to be uploaded\n", + "\n", + "The value of `media_files` can be either:\n", + "* a list of paths to the image/media files (filename is used as title)\n", + "* a list of dicts, each containing `title`, and `path` values\n", + "\n", + "Returns: \n", + "* the modified payload dict" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.add_media_to_payload)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "payload_with_media = omeka_auth.add_media_to_payload({}, media_files=['media/nla.news-article226799674-24144902.jpg'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert json.loads(payload_with_media['data'][1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upload the payload to Omeka and create a new item" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.add_item[source]

\n", + "\n", + "> OmekaAPIClient.add_item(**`payload`**, **`media_files`**=*`None`*, **`template_id`**=*`None`*, **`class_id`**=*`None`*, **`item_set_id`**=*`None`*)\n", + "\n", + "Create a new item from the supplied payload, optionally uploading attached media files.\n", + "\n", + "Parameters:\n", + "* `payload` - a dict generated by `prepare_item_payload()` or `prepare_item_payload_using_template()`\n", + "* `media_files` - a list of paths pointing to media files, or a list of dicts with `path` and `title` values\n", + "* `template_id` - internal Omeka identifier of a resource template you want to attach to this item\n", + "* `class_id` - internal Omeka identifier of a resource class you want to attach to this item\n", + "* `item_set_id` - internal Omeka identifier for an item set you want to add this item to\n", + "\n", + "Returns:\n", + "* a dict providing the JSON-LD representation of the new item from Omeka" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.add_item)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add a simple item" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'@context': 'https://timsherratt.org/collections/api-context',\n", + " '@id': 'https://timsherratt.org/collections/api/items/729',\n", + " '@type': 'o:Item',\n", + " 'o:id': 729,\n", + " 'o:is_public': True,\n", + " 'o:owner': {'@id': 'https://timsherratt.org/collections/api/users/1',\n", + " 'o:id': 1},\n", + " 'o:resource_class': None,\n", + " 'o:resource_template': None,\n", + " 'o:thumbnail': None,\n", + " 'o:title': 'My first resource!',\n", + " 'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},\n", + " 'o:created': {'@value': '2022-01-26T04:46:35+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:modified': {'@value': '2022-01-26T04:46:35+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:media': [],\n", + " 'o:item_set': [],\n", + " 'o:site': [],\n", + " 'dcterms:title': [{'type': 'literal',\n", + " 'property_id': 1,\n", + " 'property_label': 'Title',\n", + " 'is_public': True,\n", + " '@value': 'My first resource!'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_item = omeka_auth.add_item(payload)\n", + "new_item" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert new_item['@type'] == 'o:Item'\n", + "assert test_item['dcterms:title'][0]['value'] == new_item['dcterms:title'][0]['@value']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Utilities" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.format_resource_id[source]

\n", + "\n", + "> OmekaAPIClient.format_resource_id(**`resource_id`**, **`resource_type`**)\n", + "\n", + "Generate a formatted id for the resource with the specified Omeka id number and resource type.\n", + "\n", + "Parameters:\n", + "* `resource_id` - numeric identifier used by Omeka for this resource\n", + "* `resource_type` - one of Omeka's resource types, eg: 'items', 'properties'\n", + "\n", + "Returns:\n", + "* a dict with values for '@id' and 'o:id'" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.format_resource_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "id_url = omeka.format_resource_id(5, 'resource_templates')\n", + "\n", + "assert id_url == {\n", + " '@id': 'http://timsherratt.org/collections/api/resource_templates/5',\n", + " 'o:id': 5\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.prepare_property_value[source]

\n", + "\n", + "> OmekaAPIClient.prepare_property_value(**`value`**, **`property_id`**)\n", + "\n", + "Formats a property value according to its datatype as expected by Omeka. \n", + "The formatted value can be used in a payload to create a new item.\n", + "\n", + "Parameters:\n", + "* `value` - a dict containing a `value` and (optionally) a `type`\n", + "* `property_id` - the numeric identifier of the property\n", + "\n", + "Note that is no `type` is supplied, 'literal' will be used by default.\n", + "\n", + "Returns:\n", + "* a dict with values for `property_id`, `type`, and either `@id` or `@value`." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.prepare_property_value)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'property_id': 393, 'type': 'uri', '@id': 'https://glam-workbench.net'}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prop_id = omeka_auth.get_property_id('schema:url')\n", + "prop_value = {'value': 'https://glam-workbench.net', 'type': 'uri'}\n", + "\n", + "formatted_prop = omeka_auth.prepare_property_value(prop_value, prop_id)\n", + "formatted_prop" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "assert prop_id == formatted_prop['property_id']\n", + "assert 'type' in formatted_prop\n", + "assert formatted_prop['@id'] == 'https://glam-workbench.net'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "

OmekaAPIClient.get_template_properties[source]

\n", + "\n", + "> OmekaAPIClient.get_template_properties(**`template_id`**)\n", + "\n", + "List properties used by the specified template.\n", + "\n", + "The resource template objects returned by the API don't include property terms.\n", + "This function gets the additional details, and organises the properties in a dictionary, \n", + "organised by term. This makes it easy to check if a particular term is used by a template.\n", + "\n", + "Parameters:\n", + "* `template_id` - numeric identifier for a template\n", + "\n", + "Returns:\n", + "* a dict organised by property terms, with values for `property_id` and `type`" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "show_doc(OmekaAPIClient.get_template_properties)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "template_id = omeka_auth.get_template_by_label('Newspaper')['o:id']\n", + "newspaper_properties = omeka_auth.get_template_properties(template_id)\n", + "\n", + "assert 'schema:name' in newspaper_properties" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example: adding a newspaper article from Trove" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the example below I'm going to manually step through the process of adding a new item to Omeka using the API in order to demonstrate the methods available. But of course the point of using the API is to automate such processes -- joining together the individual steps so they can be embedded into your own systems or workflows.\n", + "\n", + "Let's suppose we want to add this newspaper article in Trove to our Omeka instance. To take best advantage of Omeka's linked data infrastructure, we'll actually create two resources -- one for the article, and one for the newspaper it was published in.\n", + "\n", + "I've already created templates labelled 'Newspaper' and 'Newspaper article'.\n", + "\n", + "Let's start with the newspaper. First we need to find out the numeric identifier Omeka is using for the Newspaper template. We can use `OmekaAPIClient.get_template_by_label` to find out. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "omeka_auth = OmekaAPIClient(\n", + " api_url='http://timsherratt.org/collections/api',\n", + " key_identity=os.getenv('KEY_IDENTITY'), \n", + " key_credential=os.getenv('KEY_CREDENTIAL')\n", + ")\n", + "\n", + "newspaper_template_id = omeka_auth.get_template_by_label('Newspaper')['o:id']\n", + "newspaper_template_id" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For convenience, we can get a summary of the properties used in the Newspaper template using `OmekaAPIClient.get_template_properties`. This is useful if we want to check which properties are in use, and what data types are expected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'schema:name': {'property_id': 1116, 'type': ['literal']},\n", + " 'schema:additionalType': {'property_id': 1199, 'type': ['uri']},\n", + " 'schema:description': {'property_id': 528,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:alternateName': {'property_id': 282,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:editor': {'property_id': 752, 'type': ['resource:item']},\n", + " 'schema:publisher': {'property_id': 967, 'type': ['resource:item']},\n", + " 'schema:issn': {'property_id': 931,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:startDate': {'property_id': 513, 'type': ['numeric:timestamp']},\n", + " 'schema:endDate': {'property_id': 657, 'type': ['numeric:timestamp']},\n", + " 'schema:locationCreated': {'property_id': 706, 'type': ['resource:item']},\n", + " 'schema:hasPart': {'property_id': 1405, 'type': ['resource:item']},\n", + " 'schema:about': {'property_id': 1392, 'type': ['resource:item']},\n", + " 'schema:mentions': {'property_id': 747, 'type': ['resource:item']},\n", + " 'schema:contentLocation': {'property_id': 1419, 'type': ['resource:item']},\n", + " 'schema:temporalCoverage': {'property_id': 460,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:subjectOf': {'property_id': 1391, 'type': ['resource:item']},\n", + " 'schema:url': {'property_id': 393, 'type': ['uri']},\n", + " 'schema:image': {'property_id': 742, 'type': ['resource:item']},\n", + " 'schema:identifier': {'property_id': 190,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:sameAs': {'property_id': 246, 'type': ['uri']}}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "omeka_auth.get_template_properties(newspaper_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first step in preparing our data for upload is to create a dictionary, using the required property terms as keys. In this case, we'll assign data about the newspaper to `schema.name` and `schema.url`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "newspaper = {\n", + " 'schema.name': [\n", + " {\n", + " 'type': 'literal',\n", + " 'value': 'The Bendigo Independent (Vic. : 1891 - 1918)'\n", + " }\n", + " ],\n", + " 'schema:url': [\n", + " {\n", + " 'type': 'literal',\n", + " 'value': 'http://nla.gov.au/nla.news-title806'\n", + " }\n", + " ]\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use this data to create a payload for upload to Omeka. `OmekaAPIClient.prepare_item_payload_using_template` will check our data against the Newspaper template and build the payload." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Term schema.name not in template\n", + "Data type \"literal\" for term \"schema:url\" not allowed by template\n" + ] + } + ], + "source": [ + "payload = omeka_auth.prepare_item_payload_using_template(newspaper, newspaper_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whoops! It seems we have some problems with our data file! First of all we've used a full stop, rather than a colon in `schema:name`. Second, we've said the data type of `schema:url` is 'literal', but if we check the template properties we'll see it' should be 'uri'. Let's make these changes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "newspaper = {\n", + " 'schema:name': [\n", + " {\n", + " 'type': 'literal',\n", + " 'value': 'The Bendigo Independent (Vic. : 1891 - 1918)'\n", + " }\n", + " ],\n", + " 'schema:url': [\n", + " {\n", + " 'type': 'uri',\n", + " 'value': 'http://nla.gov.au/nla.news-title806'\n", + " }\n", + " ]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "payload = omeka_auth.prepare_item_payload_using_template(newspaper, newspaper_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That seems better! Now we can examine the payload." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'schema:name': [{'property_id': 1116,\n", + " 'type': 'literal',\n", + " '@value': 'The Bendigo Independent (Vic. : 1891 - 1918)'}],\n", + " 'schema:url': [{'property_id': 393,\n", + " 'type': 'uri',\n", + " '@id': 'http://nla.gov.au/nla.news-title806'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "payload" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice how the values have been reformatted? They should now be ready to upload to Omeka using `OmekaAPIClient.add_item`. We'll supply both the payload and the newspaper template id." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "newspaper_item = omeka_auth.add_item(payload, template_id=newspaper_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can check the contents of `newspaper_item` to make sure it's been added succesfully." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'@context': 'http://timsherratt.org/collections/api-context',\n", + " '@id': 'http://timsherratt.org/collections/api/items/730',\n", + " '@type': 'o:Item',\n", + " 'o:id': 730,\n", + " 'o:is_public': True,\n", + " 'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',\n", + " 'o:id': 1},\n", + " 'o:resource_class': None,\n", + " 'o:resource_template': {'@id': 'http://timsherratt.org/collections/api/resource_templates/5',\n", + " 'o:id': 5},\n", + " 'o:thumbnail': None,\n", + " 'o:title': 'The Bendigo Independent (Vic. : 1891 - 1918)',\n", + " 'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},\n", + " 'o:created': {'@value': '2022-01-26T04:46:55+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:modified': {'@value': '2022-01-26T04:46:55+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:media': [],\n", + " 'o:item_set': [],\n", + " 'o:site': [],\n", + " 'schema:name': [{'type': 'literal',\n", + " 'property_id': 1116,\n", + " 'property_label': 'name',\n", + " 'is_public': True,\n", + " '@value': 'The Bendigo Independent (Vic. : 1891 - 1918)'}],\n", + " 'schema:url': [{'type': 'uri',\n", + " 'property_id': 393,\n", + " 'property_label': 'url',\n", + " 'is_public': True,\n", + " '@id': 'http://nla.gov.au/nla.news-title806'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "newspaper_item" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great! Now what about the article? Again let's start by having a look at the 'Newspaper article' template." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'schema:name': {'property_id': 1116,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:additionalType': {'property_id': 1199, 'type': ['uri']},\n", + " 'schema:description': {'property_id': 528,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:alternateName': {'property_id': 282,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:datePublished': {'property_id': 928, 'type': ['numeric:timestamp']},\n", + " 'schema:pagination': {'property_id': 376,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:creator': {'property_id': 329, 'type': ['resource:item']},\n", + " 'schema:contributor': {'property_id': 1303, 'type': ['resource:item']},\n", + " 'schema:isPartOf': {'property_id': 736, 'type': ['resource:item']},\n", + " 'schema:license': {'property_id': 1348,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:about': {'property_id': 1392, 'type': ['resource:item']},\n", + " 'schema:mentions': {'property_id': 747, 'type': ['resource:item']},\n", + " 'schema:contentLocation': {'property_id': 1419, 'type': ['resource:item']},\n", + " 'schema:temporalCoverage': {'property_id': 460,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:subjectOf': {'property_id': 1391, 'type': ['resource:item']},\n", + " 'schema:image': {'property_id': 742, 'type': ['resource:item']},\n", + " 'schema:url': {'property_id': 393, 'type': ['uri']},\n", + " 'schema:identifier': {'property_id': 190,\n", + " 'type': ['literal', 'uri', 'resource:item']},\n", + " 'schema:sameAs': {'property_id': 246, 'type': ['uri']},\n", + " 'schema:text': {'property_id': 833,\n", + " 'type': ['literal', 'uri', 'resource:item']}}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "article_template_id = omeka_auth.get_template_by_label('Newspaper article')['o:id']\n", + "omeka_auth.get_template_properties(article_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This time we'll build our data file in stages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create an empty dictionary\n", + "article = {}\n", + "\n", + "# Add value for schema:name\n", + "article['schema:name'] = [\"MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD.\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You'll notice that this time I've only included the value of the property, not the data type. This is because `OmekaAPIClient.prepare_item_payload_using_template` will insert default data types if they're not specified. The basic rules it uses if you don't supply a data type are:\n", + "\n", + "* if the template defines a default data type, use that\n", + "* if 'literal' is in the template's list of expected data types, use that\n", + "* if 'literal' is not in the template's list of expected data types print a warning asking the user to specify a data type and drop the property from the payload\n", + "\n", + "In the case above, the 'literal' data type will be assigned to the `schema:name` value.\n", + "\n", + "To create a link between the article and the newspaper it was published in, we can use `schema.isPartOf`. If we look in the list of template properties we see that this property expects a data type of 'resource:item'.\n", + "\n", + "```\n", + "'schema:isPartOf': {'property_id': 736, 'type': ['resource:item']}\n", + "```\n", + "\n", + "The 'resource:item' data type means that the value will be an identifier pointing to another Omeka item. So we include the identifier of the newly-created newspaper record. Once again, the data type will be automatically added when we generate the payload." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "article['schema:isPartOf'] = [newspaper_item['o:id']]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we'll add the publication date. To recognise dates as specific data types, you need to install the [Numeric Data Types](https://omeka.org/s/modules/NumericDataTypes/) module. Once that's done, you can set the 'numeric:timestamp' data type as the default for any date fields in your template. In the list of properties from the newspaper article template, you can see:\n", + "\n", + "```\n", + "'schema:datePublished': {'property_id': 928, 'type': ['numeric:timestamp']}\n", + "```\n", + "\n", + "The date value itself is supplied in a standard ISO format -- 'YYYY-MM-DD'." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "article['schema:datePublished'] = ['1918-03-14']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we'll add a link to the article. Once again the template includes a default data type.\n", + "\n", + "```\n", + "'schema:url': {'property_id': 393, 'type': ['uri']}\n", + "```\n", + "\n", + "So we can just include the value." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "article['schema:url'] = ['http://nla.gov.au/nla.news-article226799674']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we've assembled the article metadata, we can generate a payload." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "article_payload = omeka_auth.prepare_item_payload_using_template(article, article_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see below, the default data types have been inserted into the payload, and some additional fields have been added to define the link to the newspaper item." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'schema:name': [{'property_id': 1116,\n", + " 'type': 'literal',\n", + " '@value': \"MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD.\"}],\n", + " 'schema:isPartOf': [{'property_id': 736,\n", + " 'type': 'resource:item',\n", + " '@id': 'http://timsherratt.org/collections/api/items/730',\n", + " 'value_resource_id': 730,\n", + " 'value_resource_name': 'items'}],\n", + " 'schema:datePublished': [{'property_id': 928,\n", + " 'type': 'numeric:timestamp',\n", + " '@value': '1918-03-14'}],\n", + " 'schema:url': [{'property_id': 393,\n", + " 'type': 'uri',\n", + " '@id': 'http://nla.gov.au/nla.news-article226799674'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "article_payload" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We could now go ahead and upload the payload to Omeka, but what if we want to include media files? In this case I have a JPG image of the article I want to attach. All you need to do is supply a list of paths pointing to media files using the `media_files` parameter. The list can just include the paths as strings, in which case the file name will be used as the media object's title. Alternatively, you can supply a list of dicts, each containing a `path` and `title` value." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a list of paths pointing to media files\n", + "media_files = ['media/nla.news-article226799674-24144902.jpg']\n", + "\n", + "# Include the media files when we upload the payload\n", + "article_item = omeka_auth.add_item(article_payload, media_files=media_files, template_id=article_template_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we look at the uploaded item, we'll see that the media files have been processed and added to the record." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'@context': 'http://timsherratt.org/collections/api-context',\n", + " '@id': 'http://timsherratt.org/collections/api/items/731',\n", + " '@type': 'o:Item',\n", + " 'o:id': 731,\n", + " 'o:is_public': True,\n", + " 'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',\n", + " 'o:id': 1},\n", + " 'o:resource_class': None,\n", + " 'o:resource_template': {'@id': 'http://timsherratt.org/collections/api/resource_templates/4',\n", + " 'o:id': 4},\n", + " 'o:thumbnail': None,\n", + " 'o:title': \"MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD.\",\n", + " 'thumbnail_display_urls': {'large': 'http://timsherratt.org/collections/files/large/aa9ef3fe881ee92c46bc8f1500d7f9fa9f3d6bb4.jpg',\n", + " 'medium': 'http://timsherratt.org/collections/files/medium/aa9ef3fe881ee92c46bc8f1500d7f9fa9f3d6bb4.jpg',\n", + " 'square': 'http://timsherratt.org/collections/files/square/aa9ef3fe881ee92c46bc8f1500d7f9fa9f3d6bb4.jpg'},\n", + " 'o:created': {'@value': '2022-01-26T04:47:02+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:modified': {'@value': '2022-01-26T04:47:02+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:media': [{'@id': 'http://timsherratt.org/collections/api/media/732',\n", + " 'o:id': 732}],\n", + " 'o:item_set': [],\n", + " 'o:site': [],\n", + " 'schema:name': [{'type': 'literal',\n", + " 'property_id': 1116,\n", + " 'property_label': 'name',\n", + " 'is_public': True,\n", + " '@value': \"MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD.\"}],\n", + " 'schema:datePublished': [{'type': 'numeric:timestamp',\n", + " 'property_id': 928,\n", + " 'property_label': 'datePublished',\n", + " 'is_public': True,\n", + " '@value': '1918-03-14',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#date'}],\n", + " 'schema:isPartOf': [{'type': 'resource:item',\n", + " 'property_id': 736,\n", + " 'property_label': 'isPartOf',\n", + " 'is_public': True,\n", + " '@id': 'http://timsherratt.org/collections/api/items/730',\n", + " 'value_resource_id': 730,\n", + " 'value_resource_name': 'items',\n", + " 'url': None,\n", + " 'display_title': 'The Bendigo Independent (Vic. : 1891 - 1918)'}],\n", + " 'schema:url': [{'type': 'uri',\n", + " 'property_id': 393,\n", + " 'property_label': 'url',\n", + " 'is_public': True,\n", + " '@id': 'http://nla.gov.au/nla.news-article226799674'}]}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "article_item" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## To do\n", + "\n", + "* update and delete methods" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..3d861f3 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,66 @@ +repository: wragge/omeka_s_tools +output: web +topnav_title: omeka_s_tools +site_title: omeka_s_tools +company_name: Copyright 2022, Tim Sherratt +description: Tools for working with Omeka S API +# Set to false to disable KaTeX math +use_math: true +# Add Google analytics id if you have one and want to use it here +google_analytics: +# See http://nbdev.fast.ai/search for help with adding Search +google_search: + +host: 127.0.0.1 +# the preview server used. Leave as is. +port: 4000 +# the port where the preview is rendered. + +exclude: + - .idea/ + - .gitignore + - vendor + +exclude: [vendor] + +highlighter: rouge +markdown: kramdown +kramdown: + input: GFM + auto_ids: true + hard_wrap: false + syntax_highlighter: rouge + +collections: + tooltips: + output: false + +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page" + comments: true + search: true + sidebar: home_sidebar + topnav: topnav + - + scope: + path: "" + type: "tooltips" + values: + layout: "page" + comments: true + search: true + tooltip: true + +sidebars: +- home_sidebar + +plugins: + - jekyll-remote-theme + +remote_theme: fastai/nbdev-jekyll-theme +baseurl: /omeka_s_tools/ \ No newline at end of file diff --git a/docs/_data/sidebars/home_sidebar.yml b/docs/_data/sidebars/home_sidebar.yml new file mode 100644 index 0000000..a783a1d --- /dev/null +++ b/docs/_data/sidebars/home_sidebar.yml @@ -0,0 +1,18 @@ + +################################################# +### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ### +################################################# +# Instead edit ../../sidebar.json +entries: +- folders: + - folderitems: + - output: web,pdf + title: Overview + url: / + - output: web,pdf + title: Omeka S API client + url: api.html + output: web + title: omeka_s_tools + output: web + title: Sidebar diff --git a/docs/_data/topnav.yml b/docs/_data/topnav.yml new file mode 100644 index 0000000..3675993 --- /dev/null +++ b/docs/_data/topnav.yml @@ -0,0 +1,10 @@ +topnav: +- title: Topnav + items: + - title: github + external_url: https://github.com/wragge/omeka_s_tools/tree/master/ + +#Topnav dropdowns +topnav_dropdowns: +- title: Topnav dropdowns + folders: \ No newline at end of file diff --git a/docs/api.html b/docs/api.html new file mode 100644 index 0000000..dd11dfb --- /dev/null +++ b/docs/api.html @@ -0,0 +1,2075 @@ +--- + +title: Omeka S API client + + +keywords: fastai +sidebar: home_sidebar + +summary: "Tools to interact with the Omeka S REST API" +description: "Tools to interact with the Omeka S REST API" +nb_path: "api.ipynb" +--- + + +
+ + {% raw %} + +
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

class OmekaAPIClient[source]

OmekaAPIClient(api_url, key_identity=None, key_credential=None)

+
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+ {% endraw %} + +
+
+

To initialise the OmekaAPIClient you need to provide the base url of your Omeka instance's API.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
omeka = OmekaAPIClient('http://timsherratt.org/collections/api')
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

This will let you access details of all public resources provided by your Omeka instance. To access private resources, or create new resources, you'll have to authenticate your API requests by provide a key_identity and key_credential. See Adding items for an example.

+ +
+
+
+
+
+

Getting resources

You can find a full list of Omeka's resources in the API documentation. You're most likely to be interested in 'items', but accessing 'properties' and 'resource_templates' can be useful when you're creating new resources.

+

You should be able to use get_resources with any of the resource types, though some of the parameters will be different.

+ +
+
+
+ {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.get_resources[source]

OmekaAPIClient.get_resources(resource_type, **kwargs)

+
+

Get a list of resources matching the supplied parameters. +This will return the first page of matching results. To retrieve additional pages, +you can supply the page parameter to move through the full result set.

+

Parameters:

+
    +
  • resource_type - one of Omeka's resource types, eg: 'items', 'properties'
  • +
  • there are many additional parameters you can supply as kwargs, see the Omeka documention
  • +
+

Returns a dict with the following values:

+
    +
  • total_results - number of matching resources
  • +
  • results - a list of dicts, each containing a JSON-LD formatted representation of a resource
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
data = omeka.get_resources('items')
+data['total_results']
+
+ +
+
+
+ +
+
+ +
+ + + +
+
30
+
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
assert isinstance(data['total_results'], int)
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
data = omeka.get_resources('resource_templates')
+first_template = data['results'][0]
+assert first_template['@type'] == 'o:ResourceTemplate'
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.get_resource_by_id[source]

OmekaAPIClient.get_resource_by_id(resource_id, resource_type='items')

+
+

Get a resource from its Omeka id.

+

Parameters:

+
    +
  • resource_id - numeric identifier used by Omeka for this resource
  • +
  • resource_type - one of Omeka's resource types, eg: 'items', 'properties'
  • +
+

Returns

+
    +
  • a dict containing a JSON-LD formatted representation of the resource
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
data = omeka.get_resources('items')
+random_item = random.choice(data['results'])
+item_id = random_item['o:id']
+
+# Get the same item using its id
+item_from_id = omeka.get_resource_by_id(item_id, 'items')
+
+# Check that they're the same
+assert random_item == item_from_id
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

It can be difficult to remember all the available parameters and the differences between resource types, so I've created a number of more specialised methods that are really just wrappers around get_resources.

+ +
+
+
+ {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.get_template_by_label[source]

OmekaAPIClient.get_template_by_label(label)

+
+

Get a resource template from its Omeka label.

+

Parameters:

+
    +
  • label - the name of the resource template in Omeka (eg. 'NewspaperArticle')
  • +
+

Returns:

+
    +
  • dict containing representation of the template
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
newspaper_template = omeka.get_template_by_label('Newspaper')
+
+assert newspaper_template['@type'] == 'o:ResourceTemplate'
+assert newspaper_template['o:label'] == 'Newspaper'
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
template_from_list = random.choice(omeka.get_resources('resource_templates')['results'])
+label = template_from_list['o:label']
+
+# Get the template using label
+template_from_label = omeka.get_template_by_label(label)
+
+# Check they're both the same
+assert template_from_list == template_from_label
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.get_resource_by_term[source]

OmekaAPIClient.get_resource_by_term(term, resource_type='properties')

+
+

Get the resource (property or class) associated with the suppied term.

+

Parameters:

+
    +
  • term - property label qualified with vocabulary prefix (eg: 'schema:name')
  • +
+

Returns:

+
    +
  • dict containing representation of the resource
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
prop = omeka.get_resource_by_term('schema:name')
+prop
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'@context': 'http://timsherratt.org/collections/api-context',
+ '@id': 'http://timsherratt.org/collections/api/properties/1116',
+ '@type': 'o:Property',
+ 'o:id': 1116,
+ 'o:local_name': 'name',
+ 'o:label': 'name',
+ 'o:comment': 'The name of the item.',
+ 'o:term': 'schema:name',
+ 'o:vocabulary': {'@id': 'http://timsherratt.org/collections/api/vocabularies/5',
+  'o:id': 5}}
+
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.get_resource_from_vocab[source]

OmekaAPIClient.get_resource_from_vocab(local_name, vocabulary_namespace_uri='http://schema.org/', resource_type='properties')

+
+

Get the resource (property or class) associated with the suppied vocabulary and label.

+

Parameters:

+
    +
  • local_name - label of the property or class
  • +
  • vocabulary_namespace_uri - URI defining the vocab
  • +
+

Returns:

+
    +
  • dict containing representation of the resource
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
omeka.get_resource_from_vocab(
+    'name', 
+    vocabulary_namespace_uri='http://schema.org/',
+    resource_type='properties')
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'@context': 'http://timsherratt.org/collections/api-context',
+ '@id': 'http://timsherratt.org/collections/api/properties/1116',
+ '@type': 'o:Property',
+ 'o:id': 1116,
+ 'o:local_name': 'name',
+ 'o:label': 'name',
+ 'o:comment': 'The name of the item.',
+ 'o:term': 'schema:name',
+ 'o:vocabulary': {'@id': 'http://timsherratt.org/collections/api/vocabularies/5',
+  'o:id': 5}}
+
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.get_property_id[source]

OmekaAPIClient.get_property_id(term)

+
+

Get the numeric identifier associated with the supplied property term.

+

Parameters:

+
    +
  • term - property label qualified with vocabulary prefix (eg: 'schema:name')
  • +
+

Returns:

+
    +
  • numeric identifier
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
omeka.get_property_id('schema:name')
+
+ +
+
+
+ +
+
+ +
+ + + +
+
1116
+
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.filter_items_by_property[source]

OmekaAPIClient.filter_items_by_property(filter_property='schema:name', filter_value='', filter_type='eq', page=1, **extra_filters)

+
+

Filter the list of items by searching for a value in a particular property. +Additional filters can also limit to items associated with particular templates, classes, or item sets.

+

Parameters:

+
    +
  • filter_property - property term (eg: 'schema:name')
  • +
  • filter_value - the value you want to find
  • +
  • filter_type - how filter_value should be compared to the stored values (eg: 'eq')
  • +
  • page - number of results page
  • +
+

Additional parameters:

+
    +
  • resource_template_id - numeric identifier
  • +
  • resource_class_id - numeric identifier
  • +
  • item_set_id - numeric identifier
  • +
  • is_public - boolean, True or False
  • +
+

Returns a dict with the following values:

+
    +
  • total_results - number of matching resources
  • +
  • results - a list of dicts, each containing a JSON-LD formatted representation of a resource
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
omeka.filter_items_by_property(search_property='schema:name', search_text='name1')
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'total_results': '3',
+ 'results': [{'@context': 'http://timsherratt.org/collections/api-context',
+   '@id': 'http://timsherratt.org/collections/api/items/694',
+   '@type': 'o:Item',
+   'o:id': 694,
+   'o:is_public': True,
+   'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',
+    'o:id': 1},
+   'o:resource_class': None,
+   'o:resource_template': None,
+   'o:thumbnail': None,
+   'o:title': None,
+   'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},
+   'o:created': {'@value': '2022-01-24T03:56:55+00:00',
+    '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+   'o:modified': {'@value': '2022-01-24T03:56:55+00:00',
+    '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+   'o:media': [],
+   'o:item_set': [],
+   'o:site': [],
+   'schema:name': [{'type': 'literal',
+     'property_id': 1116,
+     'property_label': 'name',
+     'is_public': True,
+     '@value': 'name1'},
+    {'type': 'literal',
+     'property_id': 1116,
+     'property_label': 'name',
+     'is_public': True,
+     '@value': 'name2'}]},
+  {'@context': 'http://timsherratt.org/collections/api-context',
+   '@id': 'http://timsherratt.org/collections/api/items/695',
+   '@type': 'o:Item',
+   'o:id': 695,
+   'o:is_public': True,
+   'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',
+    'o:id': 1},
+   'o:resource_class': None,
+   'o:resource_template': None,
+   'o:thumbnail': None,
+   'o:title': None,
+   'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},
+   'o:created': {'@value': '2022-01-24T04:05:41+00:00',
+    '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+   'o:modified': {'@value': '2022-01-24T04:05:41+00:00',
+    '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+   'o:media': [],
+   'o:item_set': [],
+   'o:site': [],
+   'schema:name': [{'type': 'literal',
+     'property_id': 1116,
+     'property_label': 'name',
+     'is_public': True,
+     '@value': 'name1'},
+    {'type': 'literal',
+     'property_id': 1116,
+     'property_label': 'name',
+     'is_public': True,
+     '@value': 'name2'}]},
+  {'@context': 'http://timsherratt.org/collections/api-context',
+   '@id': 'http://timsherratt.org/collections/api/items/696',
+   '@type': 'o:Item',
+   'o:id': 696,
+   'o:is_public': True,
+   'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',
+    'o:id': 1},
+   'o:resource_class': None,
+   'o:resource_template': None,
+   'o:thumbnail': None,
+   'o:title': None,
+   'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},
+   'o:created': {'@value': '2022-01-24T04:07:26+00:00',
+    '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+   'o:modified': {'@value': '2022-01-24T04:07:26+00:00',
+    '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+   'o:media': [],
+   'o:item_set': [],
+   'o:site': [],
+   'schema:name': [{'type': 'literal',
+     'property_id': 1116,
+     'property_label': 'name',
+     'is_public': True,
+     '@value': 'name1'},
+    {'type': 'literal',
+     'property_id': 1116,
+     'property_label': 'name',
+     'is_public': True,
+     '@value': 'name2'}]}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.search_items[source]

OmekaAPIClient.search_items(query, search_type='fulltext_search', page=1, **extra_filters)

+
+

Search for matching items. +Two search types are available:

+
    +
  • 'search` - looks for an exact match of the query in a property value
  • +
  • 'fulltext_search` - looks for the occurance of the query anywhere
  • +
+

Parameters:

+
    +
  • query - the text you want to search for
  • +
  • search_type - one of 'fulltext_search' or 'search'
  • +
  • page - number of results page
  • +
+

Additional parameters:

+
    +
  • resource_template_id - numeric identifier
  • +
  • resource_class_id - numeric identifier
  • +
  • item_set_id - numeric identifier
  • +
  • is_public - boolean, True or False
  • +
+

Returns a dict with the following values:

+
    +
  • total_results - number of matching resources
  • +
  • results - a list of dicts, each containing a JSON-LD formatted representation of a resource
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
data = omeka.search_items('Newcastle')
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
item_from_list = random.choice(omeka.get_resources('items'))
+
+# Get the same item using its id
+item_from_id = omeka.get_resource_by_id(item_from_list['o:id'])
+
+# Check that they're the same
+assert item_from_list == item_from_id
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
template_from_list = random.choice(omeka.get_resources('resource_templates'))
+template_from_label = omeka.get_resource_by_label(template_from_list['o:label'], 'resource_templates')
+assert template_from_list == template_from_label
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
property_from_list = random.choice(omeka.get_resources('properties'))
+vocabulary = s.get(property_from_list['o:vocabulary']['@id']).json()
+vocab_namespace_uri = vocabulary['o:namespace_uri']
+property_id = omeka.get_rdf_resource_id(property_from_list['o:local_name'], vocabulary_namespace_uri=vocab_namespace_uri)
+
+assert property_from_list['@id'] == property_id['@id']
+assert property_from_list['o:id'] == property_id['o:id']         
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
item_from_list = random.choice(omeka.get_resources('items'))
+name = item_from_list['schema:name'][0]['@value']
+
+found_item = omeka.find_item(name, property_name='name', vocabulary_namespace_uri='http://schema.org/')
+print(found_item)
+assert item_from_list == found_item
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

Adding items

To add resources to Omeka you need authenticate your API requests by supplying key_identity and key_credential tokens as parameters.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
omeka_auth = OmekaAPIClient(
+    api_url='http://timsherratt.org/collections/api',
+    key_identity=os.getenv('KEY_IDENTITY'), 
+    key_credential=os.getenv('KEY_CREDENTIAL')
+)
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

There are two stages in creating a new item:

+
    +
  • prepare a payload containing the item data in the format expected by Omeka
  • +
  • upload the payload to Omeka
  • +
+

Prepare an item payload

+
+
+
+ {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.prepare_item_payload[source]

OmekaAPIClient.prepare_item_payload(terms)

+
+

Prepare an item payload, ready for upload.

+

Parameters:

+
    +
  • terms: a dict of terms, values, and (optionally) data types
  • +
+

Returns:

+
    +
  • the payload dict
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
test_item = {
+    'dcterms:title': [
+        {
+            'value': 'My first resource!'
+        }
+    ]
+}
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
payload = omeka_auth.prepare_item(test_item)
+payload
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'dcterms:title': [{'property_id': 1,
+   'type': 'literal',
+   '@value': 'My first resource!'}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

Each term in the payload should have values for property_id and type, and the property value should be included as either @id or @value depending on the data type.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
first_property = list(payload.values())[0][0]
+assert 'property_id' in first_property
+assert 'type' in first_property
+assert '@value' in first_property or '@id' in first_property
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

One of the powerful features of Omeka S is the ability to create resource templates that define a set of properties for a particular type of item. We can use templates to help create our payload, ensuring that the terms and data types we supply match those expected by the template. This is useful for identifying potential problems before we upload to Omeka, especially as Omeka will sometimes just fail silently.

+ +
+
+
+ {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.prepare_item_payload_using_template[source]

OmekaAPIClient.prepare_item_payload_using_template(terms, template_id)

+
+

Prepare an item payload, checking the supplied terms and values against the specified template. +Note:

+
    +
  • terms that are not in the template will generate a warning and be dropped from the payload
  • +
  • data types that don't match the template definitions will generate a warning and the term will be dropped from the payload
  • +
  • if no data type is supplied, a type that conforms with the template definition will be used
  • +
+

Parameters:

+
    +
  • terms: a dict of terms, values, and (optionally) data types
  • +
  • template_id: Omeka's internal numeric identifier for the template
  • +
+

Returns:

+
    +
  • the payload dict
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

Once you've created a payload, you can add paths to any media files that you want to be attached to the item.

+ +
+
+
+ {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.add_media_to_payload[source]

OmekaAPIClient.add_media_to_payload(payload, media_files)

+
+

Add media files to the item payload.

+

Parameters:

+
    +
  • payload - the payload dict to be modified
  • +
  • media_files - media files to be uploaded
  • +
+

The value of media_files can be either:

+
    +
  • a list of paths to the image/media files (filename is used as title)
  • +
  • a list of dicts, each containing title, and path values
  • +
+

Returns:

+
    +
  • the modified payload dict
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

Upload the payload to Omeka and create a new item

+
+
+
+ {% raw %} + +
+ +
+
+ +
+ + +
+

OmekaAPIClient.add_item[source]

OmekaAPIClient.add_item(payload, media_files=None, template_id=None, class_id=None, item_set_id=None)

+
+

Create a new item from the supplied payload, optionally uploading attached media files.

+

Parameters:

+
    +
  • payload - a dict generated by prepare_item_payload() or prepare_item_payload_using_template()
  • +
  • media_files - a list of paths pointing to media files, or a list of dicts with path and title values
  • +
  • template_id - internal Omeka identifier of a resource template you want to attach to this item
  • +
  • class_id - internal Omeka identifier of a resource class you want to attach to this item
  • +
  • item_set_id - internal Omeka identifier for an item set you want to add this item to
  • +
+

Returns:

+
    +
  • a dict providing the JSON-LD representation of the new item from Omeka
  • +
+ +
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

Add a simple item

+
+
+
+ {% raw %} + +
+
+ +
+
+
omeka_auth.add_item(payload)
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'@context': 'http://timsherratt.org/collections/api-context',
+ '@id': 'http://timsherratt.org/collections/api/items/710',
+ '@type': 'o:Item',
+ 'o:id': 710,
+ 'o:is_public': True,
+ 'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',
+  'o:id': 1},
+ 'o:resource_class': None,
+ 'o:resource_template': None,
+ 'o:thumbnail': None,
+ 'o:title': 'My first resource!',
+ 'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},
+ 'o:created': {'@value': '2022-01-25T04:09:55+00:00',
+  '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+ 'o:modified': {'@value': '2022-01-25T04:09:55+00:00',
+  '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+ 'o:media': [],
+ 'o:item_set': [],
+ 'o:site': [],
+ 'dcterms:title': [{'type': 'literal',
+   'property_id': 1,
+   'property_label': 'Title',
+   'is_public': True,
+   '@value': 'My first resource!'}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
response['o:id']
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
id_url = omeka.format_resource_id(5, 'resource_templates')
+
+assert id_url == {
+    '@id': 'http://timsherratt.org/collections/api/resource_templates/5',
+    'o:id': 5
+}
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
media_files = ['images/image1.png', 'images/image2.png']
+item = omeka_auth.prepare_item_using_template(test_item, 5)
+print(item)
+omeka_auth.add_item(item, template_id=5, media_files=media_files)
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

Utilities

+
+
+
+
+
+

Example: adding a newspaper article from Trove

+
+
+
+
+
+

In the example below I'm going to manually step through the process of adding a new item to Omeka using the API in order to demonstrate the methods available. But of course the point of using the API is to automate such processes -- joining together the individual steps so they can be embedded into your own systems or workflows.

+

Let's suppose we want to add this newspaper article in Trove to our Omeka instance. To take best advantage of Omeka's linked data infrastructure, we'll actually create two resources -- one for the article, and one for the newspaper it was published in.

+

I've already created templates labelled 'Newspaper' and 'Newspaper article'.

+

Let's start with the newspaper. First we need to find out the numeric identifier Omeka is using for the Newspaper template. We can use OmekaAPIClient.get_template_by_label to find out.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
omeka_auth = OmekaAPIClient(
+    api_url='http://timsherratt.org/collections/api',
+    key_identity=os.getenv('KEY_IDENTITY'), 
+    key_credential=os.getenv('KEY_CREDENTIAL')
+)
+
+newspaper_template_id = omeka_auth.get_template_by_label('Newspaper')['o:id']
+newspaper_template_id
+
+ +
+
+
+ +
+
+ +
+ + + +
+
5
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

For convenience, we can get a summary of the properties used in the Newspaper template using OmekaAPIClient.get_template_properties. This is useful if we want to check which properties are in use, and what data types are expected.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
omeka_auth.get_template_properties(newspaper_template_id)
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'schema:name': {'property_id': 1116, 'type': ['literal']},
+ 'schema:additionalType': {'property_id': 1199, 'type': ['uri']},
+ 'schema:description': {'property_id': 528,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:alternateName': {'property_id': 282,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:editor': {'property_id': 752, 'type': ['resource:item']},
+ 'schema:publisher': {'property_id': 967, 'type': ['resource:item']},
+ 'schema:issn': {'property_id': 931,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:startDate': {'property_id': 513, 'type': ['numeric:timestamp']},
+ 'schema:endDate': {'property_id': 657, 'type': ['numeric:timestamp']},
+ 'schema:locationCreated': {'property_id': 706, 'type': ['resource:item']},
+ 'schema:hasPart': {'property_id': 1405, 'type': ['resource:item']},
+ 'schema:about': {'property_id': 1392, 'type': ['resource:item']},
+ 'schema:mentions': {'property_id': 747, 'type': ['resource:item']},
+ 'schema:contentLocation': {'property_id': 1419, 'type': ['resource:item']},
+ 'schema:temporalCoverage': {'property_id': 460,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:subjectOf': {'property_id': 1391, 'type': ['resource:item']},
+ 'schema:url': {'property_id': 393, 'type': ['uri']},
+ 'schema:image': {'property_id': 742, 'type': ['resource:item']},
+ 'schema:identifier': {'property_id': 190,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:sameAs': {'property_id': 246, 'type': ['uri']}}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

The first step in preparing our data for upload is to create a dictionary, using the required property terms as keys. In this case, we'll assign data about the newspaper to schema.name and schema.url.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
newspaper = {
+    'schema.name': [
+        {
+            'type': 'literal',
+            'value': 'The Bendigo Independent (Vic. : 1891 - 1918)'
+        }
+    ],
+    'schema:url': [
+        {
+            'type': 'literal',
+            'value': 'http://nla.gov.au/nla.news-title806'
+        }
+    ]
+}
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

Now we can use this data to create a payload for upload to Omeka. OmekaAPIClient.prepare_item_payload_using_template will check our data against the Newspaper template and build the payload.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
payload = omeka_auth.prepare_item_payload_using_template(newspaper, newspaper_template_id)
+
+ +
+
+
+ +
+
+ +
+ +
+
Term schema.name not in template
+Data type "literal" for term "schema:url" not allowed by template
+
+
+
+ +
+
+ +
+ {% endraw %} + +
+
+

Whoops! It seems we have some problems with our data file! First of all we've used a full stop, rather than a colon in schema:name. Second, we've said the data type of schema:url is 'literal', but if we check the template properties we'll see it' should be 'uri'. Let's make these changes.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
newspaper = {
+    'schema:name': [
+        {
+            'type': 'literal',
+            'value': 'The Bendigo Independent (Vic. : 1891 - 1918)'
+        }
+    ],
+    'schema:url': [
+        {
+            'type': 'uri',
+            'value': 'http://nla.gov.au/nla.news-title806'
+        }
+    ]
+}
+
+ +
+
+
+ +
+ {% endraw %} + + {% raw %} + +
+
+ +
+
+
payload = omeka_auth.prepare_item_payload_using_template(newspaper, newspaper_template_id)
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

That seems better! Now we can examine the payload.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
payload
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'schema:name': [{'property_id': 1116,
+   'type': 'literal',
+   '@value': 'The Bendigo Independent (Vic. : 1891 - 1918)'}],
+ 'schema:url': [{'property_id': 393,
+   'type': 'uri',
+   '@id': 'http://nla.gov.au/nla.news-title806'}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

Notice how the values have been reformatted? They should now be ready to upload to Omeka using OmekaAPIClient.add_item. We'll supply both the payload and the newspaper template id.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
newspaper_item = omeka_auth.add_item(payload, template_id=newspaper_template_id)
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

We can check the contents of newspaper_item to make sure it's been added succesfully.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
newspaper_item
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'@context': 'http://timsherratt.org/collections/api-context',
+ '@id': 'http://timsherratt.org/collections/api/items/712',
+ '@type': 'o:Item',
+ 'o:id': 712,
+ 'o:is_public': True,
+ 'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',
+  'o:id': 1},
+ 'o:resource_class': None,
+ 'o:resource_template': {'@id': 'http://timsherratt.org/collections/api/resource_templates/5',
+  'o:id': 5},
+ 'o:thumbnail': None,
+ 'o:title': 'The Bendigo Independent (Vic. : 1891 - 1918)',
+ 'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},
+ 'o:created': {'@value': '2022-01-25T12:11:22+00:00',
+  '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+ 'o:modified': {'@value': '2022-01-25T12:11:22+00:00',
+  '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+ 'o:media': [],
+ 'o:item_set': [],
+ 'o:site': [],
+ 'schema:name': [{'type': 'literal',
+   'property_id': 1116,
+   'property_label': 'name',
+   'is_public': True,
+   '@value': 'The Bendigo Independent (Vic. : 1891 - 1918)'}],
+ 'schema:url': [{'type': 'uri',
+   'property_id': 393,
+   'property_label': 'url',
+   'is_public': True,
+   '@id': 'http://nla.gov.au/nla.news-title806'}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

Great! Now what about the article? Again let's start by having a look at the 'Newspaper article' template.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article_template_id = omeka_auth.get_template_by_label('Newspaper article')['o:id']
+omeka_auth.get_template_properties(article_template_id)
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'schema:name': {'property_id': 1116,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:additionalType': {'property_id': 1199, 'type': ['uri']},
+ 'schema:description': {'property_id': 528,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:alternateName': {'property_id': 282,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:datePublished': {'property_id': 928, 'type': ['numeric:timestamp']},
+ 'schema:pagination': {'property_id': 376,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:creator': {'property_id': 329, 'type': ['resource:item']},
+ 'schema:contributor': {'property_id': 1303, 'type': ['resource:item']},
+ 'schema:isPartOf': {'property_id': 736, 'type': ['resource:item']},
+ 'schema:license': {'property_id': 1348,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:about': {'property_id': 1392, 'type': ['resource:item']},
+ 'schema:mentions': {'property_id': 747, 'type': ['resource:item']},
+ 'schema:contentLocation': {'property_id': 1419, 'type': ['resource:item']},
+ 'schema:temporalCoverage': {'property_id': 460,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:subjectOf': {'property_id': 1391, 'type': ['resource:item']},
+ 'schema:image': {'property_id': 742, 'type': ['resource:item']},
+ 'schema:url': {'property_id': 393, 'type': ['uri']},
+ 'schema:identifier': {'property_id': 190,
+  'type': ['literal', 'uri', 'resource:item']},
+ 'schema:sameAs': {'property_id': 246, 'type': ['uri']},
+ 'schema:text': {'property_id': 833,
+  'type': ['literal', 'uri', 'resource:item']}}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

This time we'll build our data file in stages.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article = {}
+
+# Add value for schema:name
+article['schema:name'] = ["MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD."]
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

You'll notice that this time I've only included the value of the property, not the data type. This is because OmekaAPIClient.prepare_item_payload_using_template will insert default data types if they're not specified. The basic rules it uses if you don't supply a data type are:

+
    +
  • if the template defines a default data type, use that
  • +
  • if 'literal' is in the template's list of expected data types, use that
  • +
  • if 'literal' is not in the template's list of expected data types print a warning asking the user to specify a data type and drop the property from the payload
  • +
+

In the case above, the 'literal' data type will be assigned to the schema:name value.

+

To create a link between the article and the newspaper it was published in, we can use schema.isPartOf. If we look in the list of template properties we see that this property expects a data type of 'resource:item'.

+ +
'schema:isPartOf': {'property_id': 736, 'type': ['resource:item']}
+

The 'resource:item' data type means that the value will be an identifier pointing to another Omeka item. So we include the identifier of the newly-created newspaper record. Once again, the data type will be automatically added when we generate the payload.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article['schema:isPartOf'] = [newspaper_item['o:id']]
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

Next we'll add the publication date. To recognise dates as specific data types, you need to install the Numeric Data Types module. Once that's done, you can set the 'numeric:timestamp' data type as the default for any date fields in your template. In the list of properties from the newspaper article template, you can see:

+ +
'schema:datePublished': {'property_id': 928, 'type': ['numeric:timestamp']}
+

The date value itself is supplied in a standard ISO format -- 'YYYY-MM-DD'.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article['schema:datePublished'] = ['1918-03-14']
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

Finally we'll add a link to the article. Once again the template includes a default data type.

+ +
'schema:url': {'property_id': 393, 'type': ['uri']}
+

So we can just include the value.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article['schema:url'] = ['http://nla.gov.au/nla.news-article226799674']
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

Now that we've assembled the article metadata, we can generate a payload.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article_payload = omeka_auth.prepare_item_payload_using_template(article, article_template_id)
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

As you can see below, the default data types have been inserted into the payload, and some additional fields have been added to define the link to the newspaper item.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article_payload
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'schema:name': [{'property_id': 1116,
+   'type': 'literal',
+   '@value': "MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD."}],
+ 'schema:datePublished': [{'property_id': 928,
+   'type': 'numeric:timestamp',
+   '@value': '1918-03-14'}],
+ 'schema:isPartOf': [{'property_id': 736,
+   'type': 'resource:item',
+   '@id': 'http://timsherratt.org/collections/api/items/712',
+   'value_resource_id': 712,
+   'value_resource_name': 'items'}],
+ 'schema:url': [{'property_id': 393,
+   'type': 'uri',
+   '@id': 'http://nla.gov.au/nla.news-article226799674'}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+
+

We could now go ahead and upload the payload to Omeka, but what if we want to include media files? In this case I have a JPG image of the article I want to attach. All you need to do is supply a list of paths pointing to media files using the media_files parameter. The list can just include the paths as strings, in which case the file name will be used as the media object's title. Alternatively, you can supply a list of dicts, each containing a path and title value.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
media_files = ['media/nla.news-article226799674-24144902.jpg']
+
+# Include the media files when we upload the payload
+article_item = omeka_auth.add_item(article_payload, media_files=media_files, template_id=article_template_id)
+
+ +
+
+
+ +
+ {% endraw %} + +
+
+

When we look at the uploaded item, we'll see that the media files have been processed and added to the record.

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
article_item
+
+ +
+
+
+ +
+
+ +
+ + + +
+
{'@context': 'http://timsherratt.org/collections/api-context',
+ '@id': 'http://timsherratt.org/collections/api/items/714',
+ '@type': 'o:Item',
+ 'o:id': 714,
+ 'o:is_public': True,
+ 'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',
+  'o:id': 1},
+ 'o:resource_class': None,
+ 'o:resource_template': {'@id': 'http://timsherratt.org/collections/api/resource_templates/4',
+  'o:id': 4},
+ 'o:thumbnail': None,
+ 'o:title': "MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD.",
+ 'thumbnail_display_urls': {'large': 'http://timsherratt.org/collections/files/large/1ba05f8df5df5f0003a4f4940aed209f0df53008.jpg',
+  'medium': 'http://timsherratt.org/collections/files/medium/1ba05f8df5df5f0003a4f4940aed209f0df53008.jpg',
+  'square': 'http://timsherratt.org/collections/files/square/1ba05f8df5df5f0003a4f4940aed209f0df53008.jpg'},
+ 'o:created': {'@value': '2022-01-26T01:56:28+00:00',
+  '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+ 'o:modified': {'@value': '2022-01-26T01:56:28+00:00',
+  '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},
+ 'o:media': [{'@id': 'http://timsherratt.org/collections/api/media/715',
+   'o:id': 715}],
+ 'o:item_set': [],
+ 'o:site': [],
+ 'schema:name': [{'type': 'literal',
+   'property_id': 1116,
+   'property_label': 'name',
+   'is_public': True,
+   '@value': "MR WRAGGE'S PREDICTION. RENEWAL OF CYCLONE FORETOLD."}],
+ 'schema:datePublished': [{'type': 'numeric:timestamp',
+   'property_id': 928,
+   'property_label': 'datePublished',
+   'is_public': True,
+   '@value': '1918-03-14',
+   '@type': 'http://www.w3.org/2001/XMLSchema#date'}],
+ 'schema:isPartOf': [{'type': 'resource:item',
+   'property_id': 736,
+   'property_label': 'isPartOf',
+   'is_public': True,
+   '@id': 'http://timsherratt.org/collections/api/items/712',
+   'value_resource_id': 712,
+   'value_resource_name': 'items',
+   'url': None,
+   'display_title': 'The Bendigo Independent (Vic. : 1891 - 1918)'}],
+ 'schema:url': [{'type': 'uri',
+   'property_id': 393,
+   'property_label': 'url',
+   'is_public': True,
+   '@id': 'http://nla.gov.au/nla.news-article226799674'}]}
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+ + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..efdf89f --- /dev/null +++ b/docs/index.html @@ -0,0 +1,100 @@ +--- + +title: Project name here + + +keywords: fastai +sidebar: home_sidebar + +summary: "Summary description here." +description: "Summary description here." +nb_path: "index.ipynb" +--- + + +
+ + {% raw %} + +
+ +
+ {% endraw %} + +
+
+

This file will become your README and also the index of your documentation.

+ +
+
+
+
+
+

Install

+
+
+
+
+
+

pip install your_project_name

+ +
+
+
+
+
+

How to use

+
+
+
+
+
+

Fill me in please! Don't forget code examples:

+ +
+
+
+ {% raw %} + +
+
+ +
+
+
1+1
+
+ +
+
+
+ +
+
+ +
+ + + +
+
2
+
+ +
+ +
+
+ +
+ {% endraw %} + +
+ + diff --git a/docs/sidebar.json b/docs/sidebar.json new file mode 100644 index 0000000..54e8b7a --- /dev/null +++ b/docs/sidebar.json @@ -0,0 +1,6 @@ +{ + "omeka_s_tools": { + "Overview": "/", + "Omeka S API client": "api.html" + } +} \ No newline at end of file diff --git a/index.ipynb b/index.ipynb index 31356b0..b9abe03 100644 --- a/index.ipynb +++ b/index.ipynb @@ -7,16 +7,16 @@ "outputs": [], "source": [ "#hide\n", - "from your_lib.core import *" + "from omeka_s_tools.api import OmekaAPIClient" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Project name here\n", + "# Omeka S Tools\n", "\n", - "> Summary description here." + "> Tools for working with data in an instance of Omeka S" ] }, { @@ -48,10 +48,33 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "omeka = OmekaAPIClient('http://timsherratt.org/collections/api')" + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "49" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "Fill me in please! Don't forget code examples:" + "items = omeka.get_resources('items')\n", + "items['total_results']" ] }, { @@ -62,7 +85,42 @@ { "data": { "text/plain": [ - "2" + "{'@context': 'http://timsherratt.org/collections/api-context',\n", + " '@id': 'http://timsherratt.org/collections/api/items/671',\n", + " '@type': ['o:Item', 'schema:Newspaper'],\n", + " 'o:id': 671,\n", + " 'o:is_public': True,\n", + " 'o:owner': {'@id': 'http://timsherratt.org/collections/api/users/1',\n", + " 'o:id': 1},\n", + " 'o:resource_class': {'@id': 'http://timsherratt.org/collections/api/resource_classes/161',\n", + " 'o:id': 161},\n", + " 'o:resource_template': {'@id': 'http://timsherratt.org/collections/api/resource_templates/5',\n", + " 'o:id': 5},\n", + " 'o:thumbnail': None,\n", + " 'o:title': \"Newcastle Morning Herald and Miners' Advocate (NSW : 1876 - 1954)\",\n", + " 'thumbnail_display_urls': {'large': None, 'medium': None, 'square': None},\n", + " 'o:created': {'@value': '2022-01-20T06:36:11+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:modified': {'@value': '2022-01-20T06:36:11+00:00',\n", + " '@type': 'http://www.w3.org/2001/XMLSchema#dateTime'},\n", + " 'o:media': [],\n", + " 'o:item_set': [],\n", + " 'o:site': [],\n", + " 'schema:name': [{'type': 'literal',\n", + " 'property_id': 1116,\n", + " 'property_label': 'name',\n", + " 'is_public': True,\n", + " '@value': \"Newcastle Morning Herald and Miners' Advocate (NSW : 1876 - 1954)\"}],\n", + " 'schema:url': [{'type': 'uri',\n", + " 'property_id': 393,\n", + " 'property_label': 'url',\n", + " 'is_public': True,\n", + " '@id': 'http://nla.gov.au/nla.news-title356'}],\n", + " 'schema:identifier': [{'type': 'literal',\n", + " 'property_id': 190,\n", + " 'property_label': 'identifier',\n", + " 'is_public': True,\n", + " '@value': '356'}]}" ] }, "execution_count": null, @@ -71,7 +129,14 @@ } ], "source": [ - "1+1" + "items['results'][0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See the documentation for more examples." ] }, { @@ -84,11 +149,11 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/media/nla.news-article226799674-24144902.jpg b/media/nla.news-article226799674-24144902.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e2a0349e22c5be6653cd4677d1cacd601290cd0e GIT binary patch literal 298664 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 =0Gw#*D)oO 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ǎotARK_vf)E4nu zz~KT6_CA$6x0cEmoKj(7P6B{wP@rx{2dy!V;hb|ys=FDOb4X@ah_u6~S`velBRtLYuVH`TEIBZCbaCJ7IyK%2O)WrqI}`rUHbxJk^CG$;s;7Xc}iJ zsY5h6`b;Ax9Q@2Fm+f<|YcazLv~VUc*z1bwNLf%sz!2WF*rARI0F6SC-hmlDCAgL? z8_J3@&Qz%tmEk+-Eo~%%c$hKABzDllt9%C`WwlC-f~#)=GJDQ?u5(>XsBX>(6HT*vdOAG=#xexicP zB!80&$TfXJ2{uS_rl6Bfw31)$spkTc5u7Bs)HM~7B33j#G1j-i`G(V+4k{Eu5!w_1 zj000g2GfxE2AB~sB3;9+J(~(x@@can^FCk1(y1V+^fZ9yyid)p^(AB+fu6O_#doeu zfnv8{r-AQXSBY#Sy^VaIzB$OJS!&9#EOJG)&~5v@YOXY4!8X5QRp*R|PgVywuAn4xXA-$!%Dk>S z*3@x>7zE@VqNz=#+RHXxB|nZR5lLp6{$yp!s`aba@_BYL9;{ZTTV#v{iwGBtb)l`2 zM8kjj=nalv!tyjXlB}^6+)p^`n%&nfl07a+)E1S2!K+Da3UDI;j`bmeDG1zv&?A@d zee2u8VwyGtp17?a5m*bz5_RQ}Ae7wzlh@SP*LC>6WrFEf~qGHuiDbFfgKzUMK>xzu9cp%^{c$L9SZFwU)aj;EBRM zdX6iyVG)o5yZu3;NaAo8$^?2)10lE{{VBSXPbH+Wj$0TNIw(l+6ey>zSy$SD z+~hnfESgNxMLa|)Iow4-;_tTVfuo8d(T+jIb~4+>{{S-}FWa?9sGd<$qw=6Gaefmw zsS?{y8z#~_dseTC42Mn-#H?M9VOx<1*8nIOK9uHI%z>E{?e(BXIpKTB1;3EcvXF2| z71FRIj%ppzrUY>+f_i~Y$!@(V0cG}xRD+XMUH26OnwK9Y2TFt;jetJ&07a|BB-3Oc zc2*ILXF{NFG=s-x+)(#gG40!~P(0h$bwPOT&LB;=kd&E!!} zWpIW?ASv%r-Z@)o65UVT#~!u7#e1mzrR^Oha_m8Dbj<)=@U4k$MpwaQjGP|bYq@ca zs0SFTIxUa(b(+Li_oQU7>&S7_kfn2TDvwE3av0JwbIil*r(Lv<{WM2BjR9iXFsdKqnn)$||&s8@)#QMWW@D z0o?Lw0hX_IsOl>^D+p7J`quQBDUvpjI@4e)9D4%%quQ8UZ#nst(*c{XKdnlmXbtO3 zA!IlM7^k!RficpM9QTQIu=f#O1!i<0{Iz=DSc}Mub0AF|{(@AiRzkfY_YmS4jgb7E#7{*Z>t3y{tB%3wXfW)YQ`9*Aj7>0ONdJsfm=q z0{o!$#cOzbP)V%ffDTo8tx=}gNCsk7C)S9x`)f%Fh$`pOs0%Sogk@opy(&H=EOCvs zDyo&?>LG(FpdWjwsoVgzHsoM>)P_bQ0B1DYi1vU9%_Kys;Pjw(IWHPm9m#(HCS|}} zcdgG1$0KP<_Ze9nV1rsWHt}3Tv4F?DOKyoAK?37#F&=q)rpp(JL~!m{-Ls#^n)C~M zbhCjYR>|AVHcNP9on~bL$9z<-ORyzz#|DrXz9z9cj+_Ad$atsdx{Od;M`=3k*fEn@ zyGoV^r9&l!y~FO2FnvMAG2E|zbhk_(g|c6x4%FR3-r^l1NY^glbC0E6TNrJ?F)u#k znwfVp@^~}|<2)eI+Dj+e(++X-H)@Z@SF3YuB7!2|6S#r&u9oXewVqPa{G@suW~NIk zQETLg#yw9oUc*KYhc!nQ(Awbc;BqUhVo<9O;uS{MOS89|%}BwM*Cb-DNZU@rIHkA` z-MDahrtRk=tuEVasQxGtGk)cG=|JpuxnP9z%|Ul~ENvQgUHf}xu0m4o1(AN{I3}~T z^;OX>0PDBbffDKZifT5(;ZtfiL07})Xag0;_)}Jf+eQ(|^D>jQYjz!K3Gtk#IOc#a z$&%uvUzBp$_M}wYakvmhbL~uc1VqSNh3%Sl0e0?ghaXyV;X>^k)`r zIjtxqOQNPX1Y33nUD!Qow^A%omvVNFl|~I_)Vl%$AMVowU5-=c10AZl z8(OGZ>ekmc1`^&|9)OzDNW(5z?({U6>@cT72Q>YsZYjVHKosD^7(HnSfPANG4jP{% zdw^9qsWzi$BbtaI67MGfQvut&sJ1ZOx|{Ot1PoNaD;_zh%ALe0plARJ7}BS6+M<%? z3wYhG7%DG()i3x+Y&_2?9S9xCG=S6?UU5S>UO=egaXN-m@{z$c9mT?0t30Roed&yp zMkP{q;QG^}QTKb*YkgwL@MDlRM?u!28nv6vv}8ZM0A7?1fvP?2h8s5uNXky4Ku6$e zeZVOg$GspRbtM5KX{vgjvbt0mkv9Y0n|rFkZIqG5Gt#j#-Bxvi!cQN~B5GDK32aEF1`n)uy-DaeWrLg3QKx!aDk zfO4=Z10E_jOfYQadTpXaB}F@kqApH0jwk~H^Ie+PR$EUch&>w_t+Bp98JBM1n#hk@ zv6A&xNR&!W0X?g65>fNz!*WDaQC^5?y0KZtENvgc@C2sH$rC$;_<8IX4r zSPfu$v7uQ>!mcq?EOj_FH)VkAW$bH304jcLk=Kd_Fz4stGN}6z#Z|XgH@lCm^Rz^nit(+0-vVRv8MSobqa<`lY3a{qZ4>wKm&Tg8u-R zMprZeY0G(opO?KW;3(QSJk&RLaa%-QKt)Gmsl$4uBT{id(k3#N`BZaA5+ZW(0?pqQ zR`*l4(~kKFKGj|PLlUaU@i15998en?$rNgL>>kwDExRX`^u-p_$9V{N*bsTeLwk6Z zkhzgb3)|L!xnm(?Cmm`iu|H5lmG zJ#krcYL_3{Np7$ZtNcQ=WGwLs(1Hlath;Xz!6o^$ctDh#ZX$sjig{mBIj6Qk;+v7Z zK;w?JQ&7~Svrax~4;yH(7D-ZaMom1f{9t2kbJJ@#R?-62>;rSV9jj`?P=`<%j~^)c zhrJd8!F|9CbfhdtdZT}<+v(4lRFwWyTIx3Ut%#0S8O;D(41w}jCZ<+W_zQ~1xYsRg z%XzVpv%jrfvAv5>kIjprqy>pv=1?ib6;MIIsIF#;+9r}-0{6{hpAjSE8+H(k{_uCF zU^i6n$vvruxT-dq)xF{@P-k~eYV#4oMOJO3b)$B`pe{`~5!hgwKm-Bu zc3Nt#NvAGL;Pj=+#>A2G&;o;jf-_M!&ex|ZY{cX3$Sg-&*fC+)Z>o*Y}4m#cI{SgFRkq1GDzEo(~MUKW341w^tUr1F)n`t+L)Q> zD}et1cLdPvGf>*yt?X+$sS3l4(p*Tku`^13VbYa=vXd89R$d3SMH+)C9RRGA@k9zr zyiB2gixqO$RJYVlZJPiELHfQp{&ZLiyH#5~O)eRaJt>H}QMmI`2G}_{pahVrFUmQn zVrFu9$Kg{qD#D?R5=aLWfR;_7FO*@avBnt(Jol$axLkwHLoLL1&@|F8RbP5&3tLJr z02;3Q4p^L@O2q#Fgs$Aa86V0A?+VkkzJm0JLNSg9b4&|DAkhaW1Nl~VtExw&L}hKK zJrtg`qRa#=&TzeR^sh7VCa85yRw$!VEzz3*_r^0scLSiX@u%A_(%N`JtNqp$)*x9z zus}?uJPs|PlKEi*rTO`alJu8s$ zp0f;+MFKG-KhN~8qer`nO)eFGKM{-`ty7P^_Qc^{tzf z+ifTuGWBfyM%&a4&HZSw9+v)Ia87>;V`IxZD>e1|UoaBw?*m1IZK%q1z@`}pkPgdKG>ux{ zQQRWH+uXHYlN&~Ppa7B>w_VlGMjk&Alb*HGf(&B0v6k@>qy}xAO&^J5c^Bq2*hjU2 z%JW?9x6k4iX6F^r?IfOXC;~ZSGbl$HLUD@WhMNq&EMz$0zUZ#?w_|APd)E~NZ6A$^ zX6k4fJ1CVRQygdIPyrR2uf|T3FjKX=pK7sle-*6aB16dMJXLLaV7eT#Zowmr_Mj|a z_#;gZYS(TC-Q)#5s&5xX_Guz`fK@!?3ZKEbeJsYK9ZC14@r#jZ5Fl|tSlQC#64=7W zIobwmpYd+A@!UmW58ig5OJl?|jr(`y06a-JyD!t0RENdTO6`c(+phexqXR18Bu zmzH9Bk}D&_*CxkZn#{8_c^D+{I@d`ajzyGFte-y6Luaw9=F_6nZv$=yMm(AT=-2}b z#Mos#@-tjkfn=w|v%HU$1mSD1F2WXka7A)H8e-ldxhz6}PACHIr{Vc#)e`mzF&gzj zT`jtKcB-d6DW5a0%m5T;>rQvr0dJK+>S;0D5r}fkdQOssOdeT^YS+JD)k zAyrD8laWg*g1pj4$;B)4!RbH?5DK~NN(vVz+M_H$+u5mA0+pa>E z+B#LeUrM%3AiAog$U1?^s`uLT=UQtBM$&%i>sK#rCrv6zXOnSdJAwLB0-u8JXS#&O z&UTCeT@}ruTmusvw&1~wo%VB8J zF~-&6u)HMRWYaLh;J4#PjG32C3Q>`z9U3sI7+>rpX;7 ztF&T``ApP8Fx@z(0rHR!gYt1yBhS29Y8P077*5^z&MURktRaHJ z8*>uwWdyMqu3N>wHoIy-8?p!MU8H{`aOVSR`q9u1J)-*`iWOt|R~@*n!W@fmIvV6J zt^@e0IKUlx*Iu#=Z6FQ>ND9N{Tz)hLP`JiT0Oy?GQyI8BS03~Lo>&ac-!$-X$)*lQ zOHzOWcl z=&yuxk0wkOepaQkvWm_yA^0LJ1=P%}+<=da-kq*x^li{sR!?r7T4S-?&kT16(3Mk_IOC;odNl2(_=W8xazSi>E4*S-BPI?S@ul8wU^BkVNy(?Q=vrDZOWgM{o03xV(H56F1M;pfn z=}C^m{8?`w_Ai(a2F7zv@PmV*rrxWHx#9*?(Wdjj^6`UI{4I~{g=Hga9zQxkVV*8) zg|hP@1cm$RJJoFy#JY5r@mkFnl-o~H`PSa2JaDp!K4gBpRarbYV|c!7LvDItRRxA= zwieH+HSMde)<1VR#cwtwaOCq`ZMK^>m8~pMOzj!!wbrt-j=Ygch@9XNgU9hyJ!kf% zj5f|qG_Y3pqy(UVd87qhu){RQJY>?w8|L*i0m}H!#TLzGiwNv_KBBI8W5duxrlj{M zvb*vbsxKR(oj8H~B>w<9(D2>M+~{z8-3BVU0gK|RQ>IBB+yl!%{Ouj9pwg~>*JPIp z*)A}0eXBFZ&dsHm0)}F81wo=Tnr4c#PNaZ16p-v!xY2ILyY|L>#1G81Z^Vya+BssX zvSSKsA$5zrUr-kD6Bj)FD`#BN;)_O*%t2*bsn2{>2#3J)$v&P;tV)I=x*OP|Ybi^h zASuRvmC1M#?ih6E6G#ANAyoZquDN7;2UTD}LTCel@W!1Up{&mHV`^uPo$Fsx@YK(F z8(PV=LC+Om!LUlYgy0ZV9&5H-4p+5H8f8|oS#4GshU_Q=n&Nb81-kJhu*-s>h{v^h z2>HZ;x#J?ZeIyt>Q8qs5Y>`YyZvw0`c{l-A0Ajh16kk29;>zmYOn-X=t!vGz#+MBq z-bGbg%Nen5F%8_HbHyT} z6)dNo^yQ2k&{QrkX#m)WGGlM!Tt|p6#m>DQh+-93xyU&=GR8Firgobjg=!NAVgApC#WLdslB5%9%kMKp-5~4dPr)u3JJrX3p+D zw7~3(<#I+tAJEqc;(Iu3^;o1#Vpqvu?$>z=$`TeU!hyQDzZ}Sodv3&I40?VPAUg{b zfLcOAC| z6#G@M?~z?RcTvTo$25Z~pmF$Bp%P2K?D8_7n-%AJewqEL;&%h0u*G^DHxb;}ys7tC z9xIOU+cNm3P@i-jX#u<99WpqycM+{W*!VU!>v3XD{06y+3nU8Y#iMJo6bYZYZ(z)f`FNhh3YC;(b2=&L@ za?R4W+{D`mUQbwy@fQHtpROx>bBP3&le` z4=kB2k=Rf>nEGy?aW&w(x)?pPS2f!UjZVsEMWh_DGKq-tKpV+YNyr$e zb$FiVO_nrrtOrq6#sEEmsN{*{jD$F2Kpe+}-tbD$&g{|TV>Q=0V}N+7w$`g_3ZMXE zCqG)XljTwZAmlQI9Mj}rsp`g|1(AWxNw7D~o_o*$ju>Mc(w7)3kGBrlVNN} zo^f3~*4G0~FXvtHC_u!VoYm|2bz9895GXyx zbf_2|!>ubmI8pO80dthmG>hFPB z!K;6~!($Z9`v>o23sfVL)bu<1%}H*-$c*JdJu6{8-fb92FhIb?YGL?vU`04N&nf|_ z9gZ}3e^Gnmb_gUMja@~gS0P8Aj-9I75?dhRlosA-5ZM8Vn3K|Zax@C!jKQ?kJKqyns%mqdldv(F500H@qb3+50ztHZEqAzW^ z8T_d)G`&kz&9tsWcpJJ`N@RbTRNxwNxCD1&NDd+&2HjiTf|H%A)DKGR3OZSNae`Pb z0nJR)g(L&X>rV%4cpXImaw(x|DSY=!*18)5apiveVAa-{l?Od(i-5V#Nu~oX19@3d zlU%gE7rT=DUip|{enDMpkO0S3qs-3I4=X?wEup!N1v9ShF;y?LRk{8AEw*aaXF0{Fw;2@IO9MbU9kYiE$Kyo<@|Exw35o% za(OjV!s~l!qGdAKIYCqFT6Na1bM|k$7x7iSD$@GIt*1@XLo8*%wfj_{*;4bj=S*n&5o>ZEqRQ825A-Ecv4GJADMDG(-G&EeiFZiWZdLJ4s+7FOPw=OHl9Vir{);kK(2)W3BNeS zG%;dG{U`&H({vqENpR|OxaGa;s(_V*2j!1ZQZu+5Wt*@xk>QUx+^A_F4IdgNN#RM{VQ$uHVe+mRNl22YK;dd~>$E`*;bA!by??7V zbCy6&N#<@+r-AKE1~4ccLw4f0-DAUAma^H%P!2&S71ywQou-D7(luQ4pbVc6SYBAb zBD!$Ea5>FvyX|aaAk=a0LD#KJgf@3`Lmk9oN(ILTnviWd6)tv`$jGHkgN)=J)Pm%4 zxKsrP%qfwnVdl4Ef+^q+G*Yt%lNrSWM>FF6CT&7Ap4*vFgO6&eCcnFaDlyw+ZA#%Rm6;L4nf;M(;0bex0a0) zjm*NaAcpr!1tU`NXYPvVm^R#l#UjXdVDtD;JDlXPUTZgT#c&!peLZWViU^^NV~6Fy z!8FiZ=W32UsYz!I@@+n}3gAO-+D}gP&qpiU_>GkGd{;t>!E!qq=h{@0#KRp2N(47W zKy?Y^&moO;EW1YRuzDZyJ?M^&~$I3@~=Pfl$$Y;i&rZjWLMRZ}7R9&nJk)6Vwgfj;@ zCp7)a-L{`v#GhP^Zw;lV&oJv%F13A1)Si*l70;<_uCG;EN ze1qDTQkYrUmv+I&S}X*tk%@Ar3sMjy8xJ9e70M;XuX4U*G4F>w9168#tX?(RTU;R- z_7qrlIvAPbW{eDq!T!;?m&7L5sz>*QZ(K9SZ0#Q`2g_VVnYeEgGaToPiUfA$K_vJ7 zR4HxzbBaU_usiSp85K)VzD+hF@*KPHgZWWlFOXT=aORgEE-Rjz{{UBpA30$26!LiO zS{iPz9-#u9e)pp%r2t)(OCs&3j0nIgOM6rrliXWdNcP|}D9F!hYLY*XHOJX_vg+}qNRfQNa79Tzsjk^ueWF-Z<0t0oFen46JM)k?Q{ygv z`r@hST8O^1M^XtR=Eq}Kck|MKCC?bB*cD(!J0PN(isn-k48UcFNhc(1#cV#tsB8YO#dQb;<6CX2^ikXwXb6lPF zrKsuid6OagI6r$8zoqI6s9O1`ayHNf#egx*Kja(&0Uq^3S=5f1YLkEoCm22JCfTob zH2X|W0`v0Yr2urYG26x|69zU1sWr~&TD1QFZfi@%1@nQ%E1@8-%)Jz5oq**$NUd#q z6zJqLI9z7Bh(C8}7EV}>PvKmLiJAWZwc$DAgI#^GL1`X-@dNo%0oM~4ZJIzb`$-># zaA|pct31+V<|Bnc$6x;dRcrXBeNAoND|Ezo&f!^}61KXUDF8osu1~);NDc1|Np{x6 zUSz&`UuxTsp*RbV#+a%0NYrf^?r2@ooz2pd8Wk0RBvk2=TXD@banglm$vF8(IiwaG z>NxB8R8kcZ1sNmWu-{O+)$e4pvvU|j$sOpF>Q*s%#Y~D02s8-Z;N?K5rMOF2UP&-Q z1AuA`I`uBWD01pK9+gMLam_BC(nF9*!Ky%GNvvK-vt3)|wzmo^qtP!VzOWNa2#}l* zMk|}}y^NAZT!I3&4o_O_5f%^vfCF{K7Xid>;L}+L%Yn@~NX}^)xyTfl0w!N^?N7jG zVh2iY{4WQSQOPm3wt0GhrjQ)grLLuhwvgum+ZEJ<=0dKgs)O~fH}M^#$#4CpGR#OI z`e4^%;oU`Vw5XeQUuYQmQ?MGU9n^|Jh}&@kZ+>ZA!miWQ^sXmZ)%9yT!vIg+vEZLd z0PUQE^9%sg;D}MSFx}~z&a!F7kR_Cs354J6!4BWUrPO4OF~dw@;?xAbg@SezjY| zHn(YRGt4Yb^`~&Yq}W-Cm@WIT~T7OumhgPxt|A3wi$pR zb;WGm{h&h685s+l9`pf53v2h(_wr+Ize?Ybgds@D0~N|?J|wxG`|PvEqXz?Rbh64) z29jO^jL~7HDMc&^=kcfQ2cZX!mCD*{6Y9E~TUz5_Jm!myPV+{(B5(|3{orX>M^CuA zkb4?>9x&Z18#z+u$tDLoxy3x3ZSag) zqxLkrjP@Ip)LtF&6JO43?l2t*6j%<8c_d>8v88yyUzv~LO?je*CTTjadgackbE@Ag zRz#`;hGESs0oEdqF9D8y>48``t#Ome^PPvN41`4PLgBRFcHq%)=PYc@*piUJH4f2m{kQnY|yJg3!{ zjw@$K)e}^MXpnh|IiL*!#B?7@LaXJLJeHwJukMnX18A96O@uZNdc84AL5B zM2m+6ocmMck3V#BDm!wmDRwyA0Tq*~YsqatlL-a$j2bK>Wg+7&PTCW_a`!sEuV-$v zJ+O3cc=WA}F8y^SP!1Rmn0irQG?|9bF~v7>0m@c>t#xx_0hZl7%yk&7Z8yYsT9wkm zApqx)MLQ11RHP8t7!=e}GoF=^s%n>3Ae9Ti=tUYPp?#^7B*?1}=mOFavZI;_$zehq z5?EkRIdaQL1sN#791y0teI5@xTAiijs{p;dYo+WSb7*%zMZj_0=A?Cw;y-C07G{xL#N2V^Nzli$oNwAr_`B9G?AY3dd$aEJ-=Yt`o)@jKA9uL^4u55We-)$*6DCMXU@NJCV&~ z_=8FFFQU3+$X3Co7Bm-CmGtC3SuW9#02Phlw7rj8X(Wk~B2PH3uEp)v#R}}tL!YHU zZ-Jaa8mnix0+5Td%eDs?&d_U?@R$;6w=%H73~)yk(p|{0S;$=AbLW9DibLc>t6*1KNQbI*q&+ zP?WlGu`fG~XIo!GYi{dhxsV<<_o_ZOl5t{-3vE)vb5-36YcK4SB&JnxPH<1HFga^| zLTld@s}S6AgI7htnBp?fDSP<$O78beow(^{Ey_3g%ad^r=aB*7Nz0|2<@WUA;*A+oxpN0Pbcc)0W z`L}iaYiY5w+*c!_T-|B%eU@ux%Qi#TUYlF*3=$~_MZf@>akL?^_KtFl0?8)IELc3c~Ii{blkpk)5E@0-m7HE|AuV z3EHc`#bx*^^X%7+Yc@h;arxJvJZrIos+H(YItud*UCxc-FESz>O9PKiYJl{)W8Z_0 z`8CUU%Y=$X`^wlA(pcXmF!jK&XnfvW3C2V}r@yAXp z$@P0jw(&zQ-b?2{je3@gcN6Jww*8C-2sOocnn(|bp_U~qr1F0%YeCrVtRHTZ0u=!5 z9jltwtncE~zTaTqG7cBkx?4$7TL{Ew2WZV_Hnf)dhuLKW4_s0a&)fK)R5uF^{jmz& z@N2Qs?qQxB$BYrksBV_d;@$UcBOfhN@Z3IBQe+;YkQRJJpX@mR>59(qlar+sEONwi zS{nZL(WMEFz3Y|JwMlGr$3$GX`=E0`9pDN`NKQcJxXb5ByjqcwoVPix-5Tm&vKxt% zsXT%F>yvrG@n_m|wlI31T+;)%lFl2Y3pxhccoitKwzq|b)d+g=(v~@+nM1_D`u2;anvaSfH~H@wu4mrKAjS~$a2gFN~7ZIi_u}WXuozy3s87|U+nE^u6|KkTAP&7iL0Z&$s7c=Ys$nDfpD zO6)vCa`EYIo?hb0awr2U!T4z1y=$u8RT%cirE#7QzKRstA~4)XYV2hjVkEE%!zVNW z!&t&(@qydI=O-23%M@~3w)ezX!&d=qcO9>ZnoZk*IO4i3dgfE5yjEeGE0RajfGNiI z8b$N1mLzkMNI9&J7hhal!5T>sMIaDyR{RpS>hk@l;!J0AQh3hkCO%wC=6|%Kr2uq( z9%3{|06gujKm!hIknsMyy&W|nS6R57yLcGpkPC(_wN3>)X^a=nTBBlj@%Yrq zhh3(S7~Un3Mu#Vv$zx6M$UoStx1gqYsuq(QtTc@={8*T+(oEn?V0e0hxLLzp;DaB{& z@)h2PT*~Le%)cxA!Wee5-S(Q=%W4^h6C>d(z+cfBV9HC zuY#aw@~&UT6UY6d1B18;2Sd`39d(vo+7=_`#y?8L)ig^O^#!|@U?c}Bnd@6Na&NVb z)w6&({40^YX{GT>Ecx3KhIKfsXPQjl^MOF@dMco1@`%W8wda$hnlFp|=HlF*{VTY%x@qmir{yd% z4l57ERv&HC-0`~|K%i(%O8PxkTX?NqWGqQ-r>9Ek6n&Z)00nPo-a900|03OA^CYHk_~g# z5wtq&%!eU}LeyN%>Acl>WKk0~FF%jlF3L7D6*XT+2-YI4_Odb8^PBW3%N+XX%nEhT}Iaa#llFnSfHDurTB4FV}mZw=5e&Y_dus3(UlA>0;0 zwYl1BbgHr73Ttd9b6`*hKK>ZfrUEbmW1&&jwQRJTZ9dz`fNck<$6AtkL{T#VxG$wr zw%6gF>+H;h9Cs#x+?ljnT$XSfJo8gqTSsbejmM=<*e*sm^`bb=^PZFi%6HmLz4IxR ziB{|?ym}3-tm`CMQ_-tN>QAyoEXupsbAjnuwi^68oXZZ(F*qaAn2jbtuByDC6)0hx z5rn6gT#x|cibes(I#F@laa^I>(uD*j4@wi|8*{}e$-oqXCwBsY4I2xo1D~xTsYy=W6w|!1yK7Ll1`>?j?Ht`IT^!xhNJYa)LP*iOOa`IvMhn$oem zi%@{Ksqa;FO=WaggpC&X^MZQS2z7>)9g5;VxV;8VX*#RILykYXMrx&%^jFcO$+Oc&#Y4p%r$}Eg=kSGIPV2GnH1#!}; z{{UlH64*dnJ@ZDBcDJ#I9M*$^ukwsg1W?(<5@85kwDBQBf-)(7Qo}uJHw+t&lmP_# zRjteUj}nr7MG;uYnm{bM`@QH37-`{a z5W&mhMCx*Rt$6IBhS8w}75Aye0AYcS)YTt*cS>S1j)P=3Fk%aJ#Y~z#pOVNFIBvU% zHFZ}R^rw8I?utNX*yy&}e9a_47H_W=pau!g-4x|-oNnn(a0%joBUDn&f!3s0_Hqw2 zj6hrk%{DOV9J%Y$+JF*8jzn=H=XVvGABXK$Q2cG`MQJNY3vrQ3Lk>p@I*KkkkQ+GF ze54>JpcP(S0>JGc0R2J9t9#2j{{VGq#mQ`TqTzBE(<1vgQgBG%=Br1eTSUT5fth}_ zq|2NdP)vOK(Qy&&7zA`Zu~jZ~$ZnSmpzy9n?r$CQbXL|emZs<9~P z)}$NJxd40OpN#Tpj^q)pGsQ|5A*p1^Tz8~a+aJ9vh>cW-HAe4AOSumB`5UOsX{2TO zC#@S45-7M7q0{2Ck7~aRF@S0VqTA0iPchw(yOMg=qab8Bs`6aJ1WGPAT=k{{VY7}X ziU~H8=~?$49I&{MJhGDAM<%r`?xMSlyi6Nu!8ESB&Il9$mUdCu#IYlO?Rm~>uBD;F zsTFTC%XR3&uWfHD0N@H#$&74}8!&nEKW0X*zao&_2O|SoZql+O4`r_H((q@m*Z8$2h|xkUd2>MQ;>gqlI!k z02BqtY;DD*nkfSq$rWZ9a!6G97rjK>$C2OoY5Bw(hYQ@(5zY9ANrLxLjg;ZR;VcvVRb*jW1P;R<|-nFc*VB7m-TF#g2Cj;;^)`8(EOoKo@vr zJuzJNk+f@*rgMY-G=`Z^!)ocO%u8{_bgmSFaa{L@m5!rv>Bsf0;=~~y^ay%&2iBsV z;wT&UgarE1O(U(eg?i$-JsqxZb%|EtT*r_(=|CNFO$3X&7Y9D3qy=%e878=`dw!1V zI?8!&fa4X`>2rOjO^V_9S6X%gR%lCYX>sjR8R3Q<+ms^pY}Y5^OB;ybmf|^?RC*er z;f*@;P`2|Wnc6&jz_m242V$2IPQ}u3?V6pp7445&Z#?ONv5;#b2rN&u9)d3(dI zG1&B~sjAvEzF3_L=b^3$!KjUY`#w3`hCJZcXD5c>`z{oPn{VD7b3huVPMdOb`BRw3 z9BlGFE1J+RWk;6A;mb^ojGy8azj0~y%Xt*G0aK4-PQWnTMKb)7FCO&kd&pR{QMP1L z$n~xlMz*>>B9__ZVu(&^=ZGyYZLZ*J66$g?SG@psq$_;9hWF`E&3kJCvP&Z5cB)e9 z2T#(YxSw%wpk&rYi*F{oaMzANj4{S&1A5z0vbu2`a^=TGtE_+kr9cPJ=QWM2X%N9= z*A~yVX#E9Cq2K+s#x#7FUI`|U9LB1v4~gOl@}_ykbZ_DtXdFVQ+$hU+&2yUKnfy|* z0k!O^x@6U5usPbfBlE4F z5y@~gqL$o922MRF0(*^e#@bhji7Y!Q%{?z|@8V^R_Mbyp9v{*Ydm}a9-#O*00(*zj z{7SG1HwS)5qQG~tTlsP9ZhO}ws+g_(QyXL`AZEKvhl(~+&N=+6&pbqi@5M2~%s|`) zFgs(Y+pLH;VM6t*Q99g2Bv}FUtk3vIgxNqKW z$rRfiM_t&jK8_ohbwOo4%aB_Ex0+}VP!hnTW@Pu~o#rQ0l~{Uaxf{<8%V}h1 z7cBT0`^KzjI(5KBxSB#hJOX=A2TDsfL!WF?Y|qxFCvxsw3XA4e$)o}-hCJ>W29&Rx z$T*~I?qWXW4si=QE=?dM5i)=QBzsYX0}PGNdgJv!7F^iQP{ekQD&>X#qj_oPm0gYR z`BMXTpCnunL9C5Y$)>h2&-2_~3S` z(#>si6Qs@n^fig1$*5eoYn~$+<2k2zw##On=3BXpg~`F9!@03%YYZ`;C4r2d#;N$E zM05#Jlx|_cH5Y{o{{Ul#l0wG=B=@S`E0K)7$?#J**-r8D=DJjHB*_?D*Dv5w-(-Kh-;wuw z(QvUK8A1(a>qxJpN~(i9dYaJ76*~tQtc^}a8eGgr-CR(ZSjzCWqZPG-jBa(#;awD3 z#5XKeen#3iF|KRD+H%SyxR;P~#ZBW#e2Zj~-{b&;#XAV;;(f{=?;k-+b#oo9yG-qj zcB(ox*O{e7KT@hQ?_9p4dfMlRmdZCV#)l*W){6nt!K=k91USp|tHBc>#^H(UgIHSa zyisV<7%(0+7~9vSN8s&6?=;|yNp<0~Kpi+!j%abf3reMc+o4>PKDE|~O9DIhpb3-)BaCB= z&|eY-6o}xR^9jGim|6mt-P`U>vl(k+urXyZjLsn_tMU^H#+W4pH#z~HNY4NRCI1{lq8 zJ{=QV>atrGC2|N~&bo{HlVfi4INSi~Ne;xChN~5fL@`_sdaYrt+Fl$+!*+YuH{rD! zz2(K-(=#qeMJJ_K@hZosYB0-ab_{^n7|lBcj`m4ojRVR;=b;r$URxPMnU{{)sI5_T zO*agADtY&=Cr@9qc!{m4NlM=Wl}2>U(w<=4>VGF zcm(IxvAiSXUQS?@{&hIy_2Pg#7S-%g^3$)%hYUwPj zKFg;pag3H;x$jAVW%XM~WDzqA`YUrygHy7WK&c@zH)2I|HaZ)_ubJ-Kba~)0;->Le z*|ghnEwcoWleL%YMUWkHs{nceI$+jjy$Z{t$=TDK(|kWX*BV4JNJ(Nkp7d)&c9}Lh z?V`YEcsP-zxF;tfx-}U!&UiN_!NK(v(W7AfXaUSd;3=->7+#br?vtLBj-WRbfOna- zIp&3BbvXG?ttbTGV~Wkz^%(U1K1l$_Z^nQvNq+^iY?Nf4;+ES{f?2$^9eOG6SRNXQ z?yWx6c0;s>IX#AI$B1DT)+XlM?DCH!Qv-TH6^L(?k4nkbwMbyorHE&HdR3hg`}<2x zj%MY6#!V&loD=Eu$sz*5cr?%)Zi5xQ<+Q6h%*JA5Di&vk}C8_bpg{6|{w6 zkdz1anH==RbusauN=yfzxZLA|T<(slx~;>5&mI1?y&|#Qo`f7%JE8|oTH|rGv#8SKxkiy2Nrl>j%TY8@t2&TmJyYw+a>mAA2+iQbcgcBcGKyBDpyAlXIxF zR&jyXpL*(VVrlH9L^#|r_}2@g%l(OYDY-&MP7d7nplK2Ky2kA-)=8guZgHCH{5V_w z5y%wdb_WF4E3eOYt@8vdBOHT_XB9Vxj-_*P9BhpoG4MyNP_}0O0E#5?^hpjn3TK0I z`ab33DsxeInoEi88qNsJfRCS!hMS>HE}5ps1koMj;f6hES^#*sD6mC1BZ|?`_O^t(;VOHHOCC3WeJlmX4z$XCX!(Sx@HMM3dr^-$? z;Qky}H{g<3O(x@nJ^EFf`YeD}3jZLIW3AmNoG`yE9`g z$*#N2fWp%GiUAnw?O0bH92ZwjJktE*?w?8*K%EBBbj1far+WcM!?w)Yt-f^#b}4Ahdw&zS%yDNC z{VNYwvU^_;LafF~Go8b=Yw4F4mKL97l~_9PgbKyF()G5#`(vXN&P7nHdNr=rf*g~( z9sZTX>$_s{EH2A|<_>FLLH^X5QuiB#YB&UXRxY<5p{Z)ZSZ#=nALaJN1F_ztt17t} zQUI?#jvzd8$_{riJBMoM(^a^KPe^>0Hww5Mcc^qN5?HQZP`Lj9Ugtdaq}Yy*Jo#*^ z$We}KmeV6|_(|p)K>&}#t#sE<eD~Yy)SBF|_qi)+6@@Z}dd=LkA<0O2w z#rV@r^2*&nxc)4P>fo9DwKENwUUOA-BWZP}$Qnh?Fgd1xw6 z3~{0X$NvCYxsL~F0@~(Ff&d2tBv)8|Qa`&*fSU*ahWshbCiKDn8Zn-GQ0x>8el&nZ zW!S;G8i|-F_RTnudQxl;_l9W!hvI!cIdrC#5O3?6t>Il#6Qy|$*p&b{BhtEOiaUt> zm*~S4=GwKS)_Tj^TeB)i++b4z4PNZeuA9J^+Sp3Iv^WCkr!nctda4}VV2V=L>VKCV!ZUc;rip=q1<40r9Ty^bT3n(CQ+W=QD z;x@axwl=XLV#kg;QVSFKNN>@(JOfVgaw=%K##^81QTTEji%W3?$W=R>RGuM@=Jw6t zf<3~43E@f7T_F`$sI5&!cIh(`e}=IlN)x&dg(7Bne1g)MjY~@lNv>UqbgN^{A#-b(~!p^ zx&HtSwc}q)9n&)^1QCvV;)?~q zrqFvWVd_fhrre+5#cu-Ae7!iVEpcvUwUW*R+)W7#tKk4z$@v4VKgQ~@=Ho5Tn$ATMgdgkryzY;_#x!AK zQhL&%#s{wy=NK7kgzg{}>6$DwVR(;KI(j5=uIZfoquQ>)Z7trIk2`G)H#n^C6zNmm zPZh^cCL3p|HaRNbTOd{$CDi zkluN*g1J1A-n-p8-b*_u)>28wIiqn4ETbC~VAQdxL=Du^6cRS!{4~B}Cje(O4G8j* z%i5(INCXZ*G{;cNqz-%3GNg)xr{2dD4CQ=5A(zC^BcSbr>0OGU#CgHRaaX!Vvw5j~ zrK9_Y}P1e z9}`F&K{?}^*zqDeX>+n1kT}PBz=KQG;?$bsVEMm@cCND84>rs#(dq~^kZf{Z3b+3N zLzRq#9Fw;g=C)_h?e4cpaCiVP59?JQNx9Q+T6+>allPO>rk(XIO;#jLo}^V=W~P}U zBrO~vPScIU(z#z5X)bnOT4h-YEJxv8b%ml@LL>elK4a=?TdPH$&Ejk};BY7vjwU@t z^^Gzs6=Gy;2F+$VOX0n6O2F(OWRF_k@YaDno~t9wenLS}kF8(vK8|%8av}gYJ!lIR zY@F-bjCT>KSODkiT{O(L@V7VtbH{vE002S%zITW0f3mc7iH2D6Yeke?+dLTi!1bwY zEOHi_h2FKP$}N`xGBZu_c9^kgW6XX~Wmi9+^r19uOF`6{>dY67iO3w&b&E}3TeoKN zN&q-gI@3%nZ1`I8FZf5|S7GLK12ubBP}(HUgXb$;Z-;bkUf$_N#(cCq3|CLD%Il`I zaRz2QFciYYUj`B^NPkgX9I6n42TJ4o81uypkj{*f7bQvbuFX-TTu6Bx4JIKAuJEck zB9+h#l4>$`J7bb*k%yIX-7`oD;gga(detJ%An;+)o6{@iI|K`@dL&xYqz`B;z*VzjX#efnCwB| zhHGsz5;0_c-j&ebxc*uEmCl8?a3&9_X3!T{tT4J zv*#EL)zyf|AMBA_evzT-dR&`VJ0v-3>?7S2YBQ6LMJ57CAo9wdeJh^RW&Z$))Y%%mrj16hm_=%)DmAp8Nw|8xv{KJpVx)2JCjLZK)`H~3bKj*icb305U*Y15jS;+XqWN(~r|2Q;7C3*CFu9mKeTIn!*28Am+UaPaP&&R>C( zk}_*dF(Yvq#W#AEQ^!522+e&1Op$gAb#tDlHK7HxcF+WkRAZnOFu>>rO>>?hzPZz( zSz;#)d7uu5<{)mxG{#B!j}=!;xRQG)rE$v+wR!Rr4mShRfEWfd&lJMj5twr8&{N{) zaP8?$Y$Thp_i2H~4KGvw0EB?*FCI~k10Acejr`AZfNkUxflLM55a33neJRVy&M{9cy8y_| zFcLuuFnwqNZ~@2^u2sk~BDZmoOhQgUIW;G0Rsj%aQ-M`b033T%M|!t76b8m}GfLyRDDwA$QAzqz$%Z(_1wy5>ki7P(K`t>>X{7??~(ET&A0(>a8!?Ze6y6 zo|WBh!KX%{+_LcAv{(qDwiec_2*6+mH7Ge%R~&lQ7m77uroalm9IyhkG<&7L)1set zK|E7HUGoB+xZ<2qSY(>3B)cRljOL|PErXm20C|WnUX+{)UP)oJoO)Am+54n@X#k`W zatGs7=F)AhWfQWE>)h4cs8f%K+`JNTD7^7MqE1{zSU#P-oOr`vMx2{i&>7z zdE8EYt8Ga~Wz!~jK^2vS5aZfH7U<_1Q zB=gX5K<+EbBVv9~M{`0vWeTBF&PW~VwDyAeS~BEkrE^+bmo_@%*~=k3g1J4ZjU9n4 zx2D{5rj~8!*`~70$2kZ4)cDkshBOFy!)`bk`cz8HGN9pVPvanQ{c0lnSb({r;v`%V zihfSuJ5(cZ831!nB!vf|qyZ*a?L7@7S&gxdDZrD-sRzyoP%}Y9Ot@l4IqE6EAYYUP zEkh}bmg`80j_S-ZR*(Y{N{`lwK>&uOkhc7e1u@BC!KR58H5)opgA$mei!K>)igwV9 zv<~A&7wbyfahy_Mm-)I!-0(PQJGnr1X8EpVT=k00Ptyyes=TsjWND% zK*2QRp@XvgxZ;5^iHOt^GfxDMnGQ2a);u;UINYP{9Et=g{G{aaY5DnB{{RA1+nSFBGnMO9 zJBzSn59><7ivyemp&N0>PkLTAVV6GO&=&<{cHBoR#%eYPB=)DeFd0$up2mDxFtq7sc=F!$}>#Fg*nD5S_^=13a)-$^yZK@(3~1gfuB) z8~v(jfgI)374K6R)z182(>Ia|flNa@h(oDVP(Z1IfIs^5!lhR{pQSh!W%*S8GzG3k zcy2!$mNSLGsNOjU$ODel;I0=uXVQxaisJ(-NEG8a=A7A71mu(0QwtNf~IN0VvBRClclm2+(VxFA<0rR!GqH?l!>8h{x5%~fHeqK8|B+ic;XC+?{o zYQ)z@7#ejRVv)sj_g`VuE>dVN72Eif9+lHsTZ3p2_oN0bmxUNE1Il;=G7RM@+d*#5Zr{Ydb?1;!tc-cCiYI1VkU90P z7GRM0yAg~LitUVw(Xr3WshU7Rd#hX7{H}7}!UacSj!|Z{gync=b-vfI~_z0WK?X7bq2Yw8qQZwR3F~0O&#QqOoz_S@BqQAPaQVv zD1bd%pUhI~BF2@fT`rjyl?il3$KzHld{O31Ev7;wC!rOkqT9y?k8cravhl$HSC0aUyk z*9~aV&W*I=0MY{Xy{gR(q>y=Js{_ati{S=$fsxm8$a>?YbsDT{`W3;EL40seYRK?9 zp|fxR%9;S_Z7t)7VN?PSII4QSvlWb+B3;rqYPxpDjUnI;waRG{rm?I|D-G)zAbu19 zX|=2HcS`|C4?D5~wDs-9bN&N>f22Dv1pM56X#s0Z z@d{jB7;bVOpct-z$cqC=!vn73dsZ}F8Gvdg?Fq{^aB4ppUwwy5SXbrVLXs+y0>s`S zW_DW`jKz338Ro6&x}0}_tjw!$I-uazXNM%SvC~7D13ywvy>piunTy5gExNCly9eH# ztOugAD=t)UDBKFD6xguwf<^-Xc%~Dzus9Vg2bBk{IdLB6>^jp~fM0s8e|7e22^+hP zDFMTHtWT=lIEhI_&*54=2Gm)hdp_tuKdo1{d$}N;e51X`%5hkFM6+l*xH9Dgjg!Z{ zGzY1&=cumno8}dHg6~bFJeUW}C}` zCdnLOb5FJLP3gJYJ+Mg0<(Lsw{1Uv~iXldUUMM1zq`;#y-1nKb>xCsuxJOVgYCGiU7>9@h!%u12i#Zldlw6 zc#dhWg}kwCB;bQp{1pPjWh}(ui#97sbO@JJ7p81?+eiyKh4l7HBv^Mx#_>jztEQ-A zSil=NC)TCDVszVvBRNl${VSR941|55NaR2G(O^2|3mkHZJq>bR909yRaO3WRIQ;9U zxn^i2W$FR0Pr~JntvJRGf5w;{h;}c9;AWMS7aOUOu^e~JSY4#$sW2iZFMui=%ipou zmd;zSsq=}r7#_6+#-5ilhj-y=4#%G9^2slZ1e517oRCModPKS0q;~0CM7Hs#jnL{*6oKEjZ(0cQ|@8alH5(?HWMPkFCEhUd#ZQ1%@wUq{y? z)nbexB0LIuEQ3L3Z58_)z#>RShV=kb<2h6Kp0n^Gm_dv9FT1QszIS7*gQ( zCcNKS-xrGZMxRF&Zne~SgG>I^h(xR04mjeaf;2641-`V7Xt9R$rfOQ077?o+TOTUs zs_1q<+4hFb-+RV#Ppxw|_pNo}(Q7~M;f&{Rtvdm?{{RUUz>y5L#yHPL$7!TpSssB=D2ut__wN`nYQMxc$(p@^l5e-ryXma@V28ZjjWS- zWyuGeP#c<>Ub4-2ZEybocIT&T)xA<{%UDd-h%xRnn&h=_11zHiQvzKlUc9@VqcEMJuy_@-s9hzL23cQdBi5*CS25YxB%W8#Cnt*J{8g(@ zc`{q=z*gl?8K8DHntf*U8LeYqEM%@nTDPHilkG3|T|lV0Q?wu$sWkihsPtqDA0UQfBZ$bC=(r63XHP)$mzHQQ#Oz;R5wU$>T@j|MkK@eaC08%F;gVvDK z9=I=-Y=2tD)OCBkI$Vo=(O~Xs*a$-$)^~{AV$vkY`A9T%5t*m!*LthChAp9f@vAr5 zjqaGyw2_95vAly(ctuq-&D?z6)o;a47e#i*8K+^UX{_F4LTJ8V06lA+*0p=hCNq1t za_8=vv*8<-y3s~knA--b_|esLtT@ljMeHUr9amD+?2YVkgj{;n%?n(YQJld1mEikT z-5w=AAC5FoH!r0wpQJ&ixtbz3Ir*uLB96PQG#6=Q8z^_gO>HX6?XcV#Bm;IB z@M}L^wUSR2z()#tewEVy0AhWvKeJ0K2!iBengYYL9YwVbHD;ASm!n|Tnz}K_>OCty z%Ff?Ti|nw-Sm&lHh4=Qa+A(OEN=z(tEZmH#G-Wcl1bu6jcy+OdlOr90u9r^T_Ek4I z-;VTzNxy4t9qXH#W&Z$#flv-R*GO4RgrVp&T;;M0uMj+kou?E57l#4<)0;lk(v=$y zIOe&}59M_kv)GF0PDx--L&X5f+J(y7*gS=Ewz=5!3oT`S(C!qT!>x38a5dx&0XtE; zx20tN0Af$4LR!{hoT2dH!6xY@~28?Uu@>QSYQ!5a#We+tXgG&rw+et;y+)00fL zw!iy7*@r>KYJnr4)RrjxSLTNp$<1`K5%vjZkLJn|!S<}XuL-o0iRGN`J*#TU$H}tt zGx8D6dCed>zXY61aAf&gcYnsZ>9z=DXUCQXMr#4IiL7q?+hxiz$pWl8-s&J)$r(sT z-f9D3+GMib%*I9i*f?BPXN|-kXM_gm=ZyU;r?j?;);}b2agFtpsQ6fFGwzap3CI+> zh`*+6Z88T&{t;Z4iRDMv;M#c4C*Hd2OBS`Z`#2!%7zVPg{4ov0=1F8bk2OGT+7Q;U z;N;`4;Ziu<$=ss=b5qG4c?X5G)O6J4A}Z zJ5E^jIi?mS)}A4wOwAw}U%T&EUI>~cj#Os~NdynhuWDK}x`U9?kf*2>TTbw-mX|9c z%0M3U1&)H^BQ3n?)DUr8M~5VBA6A~)VYD-o&!uM^RYXwuu$&=H@&k{f#c6 z(7hu^_IV~UC{R6XkI*cde-O(ugXH9p-t}@n4qvpPCAn>fwri!ZvWmtd8eoyuoxr8y z2_s!HV(hBhZ~?531>7pc{%b0+$3yv6&aI&hQNv3%(T)XEhr+%{#8(3&?+OHO$2pB~ zK44E;=Ycc)}p9E|p&9V&a9gqrZ3f}O`>W(f=1M#uZS3{$p-ZfZb@fU%q^ zj8Z!78O~@C8;F6-j;f36T=t`?L2+=F=`w6q=C`gb687DrVtMqec)THOkGY)l&oqG6 ziLG`ih#^%2kz5CkCA5<5C4s?pJORab@mRra50DNeKnr@ZYv!*Fl9F`8%wcym#T z?@x+7;Tr%Pky;w0h`MC)o_{J6B1+;f5J)|edcgD)dS zmI)XE$pF^>0Ei`9Z5C6IL0&Lxj_~%FH5;ZWF2jOB&2>}gvR)WtmQ%7Z$S17>v7g|J zSAyN>jE}8sc&hDfv}w+Bo`SUD5yc8a5{xLv6`!c+qf}2V-v~QUBQL?OkEVR? z0}_5yT`5)G$G2+6wD8OpcM9=b9lg{V*O7W4=sVH^Im~HcIFW_|8s$71@vPS&TdV&7 zjc;liTj~Ulv=vNa1HD0G;i0C0(97;=fv)bcLnCJy2b$!3Hp>1Xx;wxb7(bnK_ZF`` zv58*+hbFNtJU04$;?EStyP5}MrC9RW4T^9oBmwyq3}b+#=WR+*5tB)XM`O6-?$Cuo zIcCNwI5`;U(xaN&?J=}__Gi5z+~TH?N#hh|Kf4XqyOt{Q2_tNPqOqj#ye0Ru<^KS^ zn!jsk)@VO?SP#4nF%~D4VL>d7v=hxzvDIyLIo>E(ZbOc>X6_ZdwUK3Qp@$XC_IvyiRof;3&U;V;mPL(;+m1Ok#lv*~@ry_Z z+TBU@uGynm0Y+>BD@&YsOl;kZx32QawS4V0A9U>Y8rjQj!xbyo$$g9Jst_RDF^R0b)bYHRN+9!*0V1( zNUr282~*sPU^?Sdw}RRHmyStJc+EFRFC->eh#Sx3Dm#A!X;5>YYQUGl>2Y!ANk1UvYf3#CqkzRE#Eg8r z)d=S2F~5vMNCCm%*Gs5at=+th6Av^m1a_?U@TU8ZH_bb{b6Xa+uVWBE<;Q%|1B&pJ ztz)gpZ90|tzV<3ItR|k8ct2#a7fb*slI?0?F9WAqrdG6Wd99qqI?+Saoh;3+npmbhlR|4 zN(XVez3fn1{EDq1I0CL%JIQ8}Nyg#R6-F-)qRuCtQy^2E6I(3t`Fjy_#sHv3cZe)w z)U=r++Be|f9)TMRbRsv465oEaQ8I8z2=Eke5O_&)gf>bX&5JhX)P_%)-{QGRws$| zY4qreLl}MCr~)4u>C17ZZvYlvb5#5jr%4nKJfjRq!9R^yhVtiD(^5Bw@AdW-&|6!j zy|i$rMI4WMU|0n~3EWW1Rrd-*7~B|jr!(=2kQLaSr_!>#N`_qyQ=gPAX@*u-QaaXO zh%W8o(q)O*ZYn@ue9_c)F+3G|E^JyN09n?olh9qu6;DcIh+lDcYM>SH{NQT->#(z^+w)2C|C=HCw zV@*~Ga)22lsDHL6TYoHDv2roGwaVpY7Y{g-j8lY}Es;(Nxg-q#07_}(9Ew66v}}=+f(JhJ%;?Sk027&j z9IFrOT_NHY3)F*L_JHgCtveBras6r7252s=e>fj|Bl_0ssSZzi=e#hxuV|PIVO2GH2IQ(d^ z0=DMayDU#*QcBEQX+J6Uu4}^AuX%epcKf8_x{aZj9OTdhKWIp{f^qdVF7m)IYWbvHSWb-n(I3G%o0H`o|rj{V}pe{KHVg`Ar z%KrT1=8l|>v?w3z3Fp#_2SHoq=qZ6@4ZArWl_IkhCm9scDMEf)EF{e7HLFFqF}Weo zyyoQA;#7(JM577VS>LEQG@F_^8)#FUdKmB6O8Qhf+SY=`Stg2Qqx! zIqgM&mA+*6sIIO)$z;=&$d9P0B6X0mhF3VwL8z|2YdO`rFvS)Eot~{8q*)>5l=JON zsp(Q`2qRa*W073%f?LbKyj)}h!2Ij7QJMQ;SKFASFTVT+f3Y-p%~Z zcCg3mU15<40OF8{l3+nr9XrzPEu0)0MkvgFUY#fzUzqe-0H;0tb_hCN2z+yN?*dr%_GO3v6Ol4U5Ty&!*` ziZCGd6)DRrWKsecq;0rhaYo?pz{V-+Kw40}(Rri<7a6%8P#Zw%YCBU5W66wy2VVTt zmlF91&n_2(&2wHHzDK{f5p46!!w%21|A|r17Jv zFN_arDl{hvyda-gZfUwW@4#0W_;fu6>l9H`ue1bZ4R1g$SX zM>QEkoy63V6;uvJMNxbEZR@&Fgme^GcP)azbJCZ7)!at!Y6BTiFd(Su?@Thrhc3Z! z>r6z8BVaikdQt#qlRK~l9(-<%w5c7iY8AMRh+j1U^aq+&0?y#Av#DP65O?G;=iY`; zv4RLW?@_B21g}~ER(3;=?^BicCOTApV;0F2ug=x$nm`O$xDAo%PmQ*Yy(s_@XVs}Y z6F>^U{LFjMj1LRemP3dMH4V5svq0=f>{R2uIan(K!y=MQ5`AemVR;##K<)EpJ_Ryq zyogM$agO+@19`t93>wAph2(a6M3EuPhk;E2t7|IWMzcpILF0;;hE3h;jqnDhCyni- zC*^JduChb9@J=?KX|x2ZBW>Kv$mvg4+=n#8Z5`4u@3991vK9vJ$mbY{6kOt>CKD9C~|-#EkjCIG|~rrWYHr&(@I4cIT}%oqV8FWKdOCB)-HWCXk0Lm>I_;(9Xh8 zIw9*-(@?W%k`=f|a(W82E?I^^>DbX=A|NYdQZ)WbGlkxB(w@Z`agYf0HAre!vCrif zIh>0<{)@HX!?O2*|D<#FHet^}5H6p}LCgqH*?Ug7!f}0m}J~ zO!2i%bABFh+O(>?0DnF!p>*FH=liC)&ksfhqbmc>MG1iK4PkW~kiMh(*F(`9hQZBq z-XBvQt8_EV5s%ioDIzE3>4VK67}EWk2bJ(ud9HdhajxATCH$zArsCz%$7BO~DB z6jo38}#;a&GH4s7!-583i;)&+| z$`}NP$zk}_AsgCOpf7FKMH_u;J$Y_^#%F={v_O;FBB1b^teRA0;YjzbElh)BGKI<5 zMJ5M3;ajVnMcmxTahxYLHoW?cf;6ckY*WTPDc%!B^5g&vsr|IkPYzl z+?U#F%*5pIa%nZlC2I+JKPWh+_+5OP0J-@=HE&qn+EmY;i&O_S;LAzZdwH12=ku<; zoufjdsW>LN-v@%$&CXjj(xPR+d}Q(|FgZTGL1F_9%n%%{%_t-TjEh`_C=C<`4TbXSgU|^4ogPyg=_?LWM zC$^F?#_&2rZ0g>U&N=;4@ue&IAoSwC{oUs_>8s>Z;rEV@4INHobbvWIV zj(uq`9;7Jey(54IMGh38IOdJxW?Q8zfYRnT-d@NnlAiMSSG+OV%dlq#y4GFsI^*SW z*0_nSue9w-Nv%QhGr5!=v=4M$p8HYJp~b?PJ;3W)mfFM;TCB$)oMla5+xVbQFpE%w zjNoLGTGCj@eqxf@KtM-I1d)y7X`W#V?fuiY6=TD`9+K+IeZ=gs5yw3$-;E%RbhrY6 zxG=?TXo@4!t@Fs*D!GPoF2-ZJKeIfnlrS@rGgbuG3IOI(*C26eWF) zFgZT~TubL%q_Q)Gd@fHx&2`sdMU1WAn&i9&gU`Dpe-~fQy1TGG#VG@>X#vUjJe0k= zY-i?b>F07H^K*csn&!M9Lfze|{_|GHh$J!S?X!=R^ri+qoR=ErqQEg0@wpCauZc8! z%L^GMNlQXojDL2Y;Ax#9cu(=1oYza@c0};(i7q<%z_u8gkfG6o9w zu3NzFWU`ykKOe1iVah1aEP7P1B-%L5EA{|&p%semCp4h2-AD|*WF(cdXu4ln^ z65kn&vJnCkmG`cvUCGeqKr(TWSw0MZ_?EaFWQ^4T2Z^m)Ns2p*c^OKdn+CV^n~{H| zLo+d8M>+MZ&l#(}irD0@T6cr+x)NoM6mlpXjJ;=5n&VlH!WU!&ka1V_eJN~olF>L> za0@Uz))|o|@o@?;Nv@jfNxHo_X-QTX$F%|*;Z0II+hYM@&YN;i<6H6)LB~#&hofl` z=~pfD4o?ENh+ms;0McWz7Sn-Bxl>O$3CCIxt_JQ+D}{<0rJ%jFk{+CK&wAxNDW+oX z;5&WNa((+(XL-aOUD_s)?a9vauIqOxtC4cshHW$kU zCmhr_x=rHg-fY(eR1M6$R6Y)PZDo;N!91Q#0Cr3Wi#f>ykzA&p@u!KMSYSU&>Y`+m z4ZvN!L9acXE-!pvEH;c+94Qq&N4hojT_#)YSgoV5h&Rp6bQW4_*~9mX6O4juoYL<< zvNc0%c_SHE{M)Orj}E!WD#Id}7=9?#4xgu;qwf$aKSR<6r(-1ZvEIP!=b`OT{6IOj zi7;`R)6#4vi${f`kb+bm4FWT?ZAN=NMA_UpBrpS?^V+v{dpEm}az4?FwPGI+JUWbb zvP-w-CG*_Y{L;VndzIv>@Mr^s@bns$-nS$kb9rzv2PgdcS4FPqv!#fh-gD-I^AS}% z9{aUBfJQQTKb>^CtlwwSWqrBpKoop8c-NL8SdvqMPpxeM<>wX7_%khP&AST3oPIUY zl1aeoDKHq)f3u2J18^!irDSO~h5>Qjlqg@693NUhG0?N~Oa%Fx4@RpccJ0Z@H3tSm zyYQd{n3M7jK&GU-PTXTX>c-HkynWHsR4fA=f%5uLJBVb@^MyJM0tIjjvkL%EVucfVt~;L|{Inrxrg zek)|oBQ1_A(pZTVWmCg*TsMj|IW+y(?Ayw)!LF;q*OBTvBFg774lz{2siAc^wX%8G zZrVCm7pGhQ0Bl`JG?z{k=Lw#b-QB7SM-pRc7{RU@Zw}uXT5UQ_h;xt)N*Oighka*z z43JzFPPol=KyJ2A?**<7-c46YyI0g%q)gy*UV&)h;?_Ap;f8TT5ZK5g2Ox@*4cG39 zdu<#Q%_5*)PdV*K2Q|P0ZZJseT(^ks%s0_OS(X#Y0Pt(4`5fVg6^X1`+iF)oX5=~J zj%t8xmR5I`3N2()D=t6>nv27leD*TPXJX682d8?;z3`T$Zam8yv&Y?B)}M!NZc;;O zc6Z1+oaTTnc&gcMbUCH|>Btp@;9WXNk)>uK6dVfa_1JTyOa~aO&jxX(I)Q?$bM&L2 z9Uwyy`_;-`UtPAiAYH{+{HyIXFtQ*}*)L#g#kUiMo(14#>wrg!T-A3C= zjFF!8XTw+Rs%hZK%P$<&Ep`jm(c8@6V3r=0Q^4|hc1I_XKVW?m0DHOhEAFWWAO8B)zf#C6cd=nQNDUe(BJT9n$Bw3=O` zn8^PCSV8MuGu=c{qgKq@a;u)T=N5L?SKcm`I9-zEo1bAw4vzl-K}|1ClJHz&Wf@Qp zHE+WD=k}eEiOV#IFbS&{ng!kJZJtxe0I2Ou()7!18JR)kboZtOKNRY%Z4yBd%gAtj zt4~kT;QJCIozgmP+)qPXSBPixd_@@{m3QD*q*%m)(k^rI1DXe8fY+>LvGEPEteM(;H8i>1H^I4nZQXN2glD$`6=&lTu~8!IO}EC<~lkhXguyrz+p> z-WVL8#;@yh!>C(H9llDfbXPVumuGabjl;R6hfcLv3}~PO*S#>c&LhLxoa#lCXuyWX zaoW3?fRw)S#b(-4lAdUQ5+JN`B!cL`cg*}P;E$o0D9A;Rk-~{37((Z8`n=t5CnJt7{&oP0ALCL<1{OwW2i`H45C7CFGBjf za5$_TBUXhsTip-dHyIUAkIP;=;(;6#gVbrS5gV`F*yRXpTt&>q0U-DIOC;Uk+%Yyaz2#@_EoH( zGeV_@;YEPJ(X1xF*IQAQ4$O>Zx{LUpc-k~?zA!zh(UiA~%Z&no)`XDmIO7xn#aLR& zpz6{i=V2t02VB;kqpmg8qrqz%ZarHatD-ix(gI{aeKSm3OGt_G;$C<(z~sCr@@eIv znkG{-5*r=6*H5WSDq1j!a&g65jUo&&8u7*z?Gsz0ma*C4Y6EIH@&#Lhn_z@}rEE1GRTA z3Qo9q_ipyhI9pr88mdANj=2oGR(1se^K72 zAm^tYsb1m@%7f)RQU)2ojk`d z5yk_3O-Q7z0dt$xGzYi77xuvUfae3!v`)H<009_GtAe=iTOfjPd)0TewrL0Ml=GSd zW@(UI++3TRpg_;d+ltteA&%3*saceu01SFmVM2lr0Mi}CEWTLC$)ONFNo-OD%AcEx zj3yt0O2b2?i_Jzu+#DL^^t6{sy1Fc+?jVEt*Hl|`0BKAymfXrRzO)j|TPr4>;M|;r z{^_n`#2OXkdZ5&8*Ky8q^shnB%2hxCdjU)it@60ym>iwO#-plfzh+o=lDkf8n}{qF z+1#Uk2p-e|qoM;ycR3FcTS=(xk_d>n41R1@j*B(iX&t@HY#0n~t>!-|a*M}KDWOaJ z_yh2uMIR99vFcVk3Wj`SH>F_d+MU*tJeif5Q;ooMuDFxaJQ|GK#L7uU_s@D@b8mHb zuHLG|jJD&b$5U7D%+~g10H>xsYhDD7G}wr#?gb%?NX#5=#QqbG`k7sc2~HjF)A<*6ag_) z5b6ea$2F*_ z8hph-W8RTAtDXe_a^5Oyi^z?tL{59wPlsXEbcsT|4dk)Oz^?jCmdH?kqMi#n6e_!Z zl)%f>q?YGQe=MIc_Qg`uFK5&2z`u-voP&z!N@N_W;L{}8BJFsA29g7v)MkrZPbwIW z;z#cY#cf*Ky{)=MoRFfYiq<3_A_)EQLlUj!jAz!E0+FAbXVRQPj(Yo021X7uN+TP$ zWPWr2o?Lt|7(SKFYL?g0>cZmL4&P8~ree#;0Yg-Iae|{hv;ml!oT~vxi20boBvEAs zCV7frxy@=7iH3H9-%3?gA#k{$3i_l*Z876S-1yEbozZSnO0kyS;4<7Z9su>Ot(agc z@xjeP*3e0D<~&Nw200V~pQgif(8(?e#@zv~W(a1|d`#Dqra?XZE4)#)b}s|46%^1z zDf!SbVd3>g3U`lIK^Xla_U=9ZJAm*1~|rZUDS4QK!isa8TAzmT5L-w zlgm)UoX}A9SDM0D_WaH|o-38n#nz8;a+1VIY>~xwX(AS3j4+_AWwPoEcFiV3IqecF znRNqobqN8oKMI2DNS?!1I*bXHCoF5J5_xJs10PCF=1{=&qy`N7B&p>=t#-GC8}6wm+MGtwx3TR&82aXe1^Dx0j5Ej6wKm^VxVE*9)#D|A#&O!W zW890A(wbt3knDpey#u-D`p%nwajeC9v9XB=HQZUx=G!Mxg#!kzA1`JKf;}oA5MTuW z3Ir^Ue#2_d?r|5U8y{7Y6h6!4{u#cZO7)w&2)sU zd$2xIc&rZ(sFM2TL)?shwYW*)Pa=U5MnaW;z3o}jYV6nI5V+5LRs8uemg+q#C|qgg z>=59|+nryBv8xhXs{NXWZ-`lOB!rn zyfaxc>o&_UQ!0=u+!uEDOXkBOuswmGXqCdVkOmK}H-8L-53M=583z==0ptvA?^4D+ zOXFZTZpM_kQHB{lxTI3d_y_AxU=Ie10T57IB;|c73z-TbG4}0K`C9?O`_$A$$vCEj zWB&lcOt80-SNDMZ(koWl=1YyP*#Wy^xNC(U@R@;*ja}-f-Z&Lj5cXmp`qSL9CPQ_o zZsm^JKQWvStyCJVqmVc7dg7IUy(!wEyYWhSE4Qc>5SlBr1~v>kQ<=rQd!#&21c0x8 zwB$T7tkJ6J?!+5~QaxJ~l54hW`?!whJ;BWu0{bt`m8YpYxitly(%mWY*f*^u%&Th& zo@2_KVt_1?dJ)AkHOV~HSasVQw^UgGbH*udF4olK<%Tmzb}ked<*Fj395Ccn8y!~L zP?cj@Fx-q*fpv%w&760kp`i&Q<^u+ppb`so?^#!#AdFmjP>(a|`qS<8RAusKK3t4@ z{*;mtr@R?(I#Zb#a{W-|qyyECDXt0WQtbq`IK>J$U|N6~80VS`s<{o*8KF+bAoIJWQPw4UODC2! z+;M?G73}pk~~Hl5jFVI`6H)5c!U~OD;$> z4H&wXxp$_?hd>uUE`2Lj*5XTxG@ex%kYr%jGvlWq!oYlsS{6E?O)4KQJ^uhFK~-R8 z^lUNrX{CwCUMn|G*I~TEACg?-VXZkgG?`W4_oUEjm{!vZt(sW%;*55|B2v=B+b?NchTauxZmx959!10Z+Wd)*I{0&cX;I@XlI_bY!7P-tLUb!J?xGhqvs>sXqGw(&?U;5nD3Dzuu$qh`w2 zF%b#pI1~ZW#$*h6;+-RWoOP;pT9kLtnIb=0edWwnmhCLfwLNIC5-WO|ljb9n#b8_N z7nen(hCR@O!(**kgIoygNmBr}F1&UWD-v3{*}PRdxk#;! z(fnBJSG3J;JL9$fLO2RVI{~a)yz57k%laO=oQ5H<5dPI?O|=E zL(2*P*OSE-i!RXLCULmd>{CM}yl#!Sw>8Ar=~lXyj|>?q>e&pv>#nr4j@H#7`Hs*z zGy#2-7f=RxrpX%QZR<{1eo#j_6wW~>J!t^Y9fJ^hRtBkisM@Q^3XO}NwZ6F}j(GH_ zt`OY7@L+StN&w@u?-X9&Ot6v!tZ*@k>aL=^7J@G)S! z;oGyRX>q$8wgAllH(r|d3t>I68Sk3T(xldIrB{@L7kmL)n!__fw(2)-Ju3CIeod5d zV*rjtCIq3Be2h=ZIHl|NS04GQ*K?({t4inPPg=w}t=;Qyu~Jhwai6z!xZKRcPiU97c z=aNVwl0ZRkTAkdUhO+eQ$u735Ay9x0m7wkAmUcLgxuWB^)xdJy>EQ2r!kb$r`R(mt zGAjQ77^}8AnzhH1C&>PWff{bx2n17A$T-FWQ*S0IY+V;~t#jY-m4=vFNgl}<@x>rI z7LB~jsm(ar^Ws+=t^VqMd-yR%62+DXxxA7oyiA z{{RW9til(FiAlyWS{E9oq_O$Y!VGxJWKm!@m5+7CDW{#p^sL<*R{qjfNeZmJ#c7o} z+NX*D7ERI19y5g`dsZKX(H8#WJ$bFfkINE!j8{A1$u{d3s(NJ79ftT)MmIMRw_-o7 zbVoZ*M>*?QJ{nEBg~21!`qx0E&Oqd5fe2wNnJ1{OGTPNgj7nz;dB$tB%K?J5#z~00 zT#^IHHAAu1T-qh%O$)FK+Pv=a&8_@GmgvVI@@vx3M2rbI1a+<}QBZtbq;@@M3mp}{ zjcnGeAMZMR%m>}94H7YFtv#mZWDSv?E3r~MkM@F&mB`qD{wkH1u^s-jn9j7vhdJrm zkT54`{Ax)<@t&Bd_NXMN=B0pxF~7;hIzU(h-jHJ|O)g20W2Fgzl5T_@+=40yi?fnA z6&Am$uA5+IU>hBcRM0hptHK#nAT>fci0E8f`Q9>6gP}P!+j$|_ z9{3boEOFi|i&2{3M+WaCdRC2wn-J3&Ou<`kJOCd-;J(q~Er0A%rL=K|k+@NcRMGAx zv}>8B!!qQ7#wpw^Q1I2kU0O>(#i3Kd^{%!^7Ug7xxK^$s!tNsR6p@ph9<|>jsAOfv zX$6lk)O3XZ0EC$>BVs{p^)=naq*`0r1db&vsn_tVCXP6~RArMGJu_WsjficeU@m_O zVPlQZCz>64dvzqH;qv}<)ZE$qsW90q&lSw*it%`=a@g8P&30UXLB~18CL_)?`&CaE zv}F9C@H1Y4aRNF#cn2$7MXW5oGc3mdo(*@3xZWLxcJOHp9509AF!-i*>==Jq>@VPZ zi)Y!xHv+kxHAnm;^6YR1c{S8uUag&svuExDf$xe2b6Q52+FqdTb%z9G5^A@L8rWZ3 zOB9%sBRKTUH$wYPxig!FDHzVv_|$$cv5M8<+aNA6-!(#KU109^amf8~!S=;w__jD7 zNir}2fFnPZUehiklS_ba87cr7tnU_;{>$>anx3GM7lgF?QKJw?E~lJks%gF%k{wCr zCBSAR=C-^&Z{=x_vc7UFWtf1tIX_ARW1I0FhYb2_DwDl_?%Ji`i|D|63yq=UY!6!N z)lr}4>T8C&u}v?;(p?rS6pC;F>S>})o68ulbr6aJAZ(Lckt}H5Twr{F4l0j_;c;xz zI3b+pC(^V;CN@0vG%=wWkC+a6P@uCC4k@Ns8MX<5e@dL7P%%gZC{Sda=A$2Y)S1b} z8x;;1=QIG->qMbm2{O6jo>OUFavQZrJ8g-;A2A$I2O;4j8P;yqv6N$hU3-Hh;GUf; zgz(X1@eRpyv=%uv)x)eT`h#1l1Gl3J2APNBiA=G_8jKRaeQSR~vx?VEkIcqfujO3- z0F5wipuzc91bu6%($GGe3CPX`P>v&0gj)FCCxDdQMl?Q*)L#`DBUVp}nW&MUD<*Bfz+*Aa7TBt9(?Z6QN_`k|wL zRMU;sp|^D1p@$@)%T~Ue>n@c7i7_I8548e0-xpdfjkI?$ zj4(Ol@U5*P=1aXcDI^C4Ml(=&t7~bZE*?YtHFraSqtVlH;jzG^z{{Ubwzj-C^Gq_Q zi1So@ORlZPoFNgOcqbJEiZ8rKA-Iu}6hAP|D@Vk(mS5R&2&6`Qe7Pco1fCR7G<0Bl z^{pL#*X?>cqKvntbG{kW;Ih-BwRr%MnDnjt+w%ZG#B<2aG1%uc-FjUb$Xibq)&$^@ z+O#cZvDI%>`HGG(Mk`i(OFc#lOUSBVsu!GhCE7PZw}@hVMX*z<@~sG3inHdr4r}Cac}*qTc9RqGieD zs>ux7Sd4K=fEe&W>S!;5qa7&21w7EIe!1&NX^vy%sE`0i_O3_7da}!N4Y)kBaz85T zU4Bly*8}29GX}K<&cal-F+gs1cGfoQWftWF=Z1ubhA z0D`NU<$PxoOFR*xl0gIkR3og4K|P8}PZA6d%DBH8=y9#G-7DnhInPS#>~^k|0yrls zG7V$+y>{sg2S%hj5AcepYrONbp5 zf;i4ISANB(c#6m83AmrT--^Y)@VjX>31Vo z7X^M*Kb>`$%C-(EtU-^bBfSA~EyZo}2hPJ4fgX=@Z+vf)C79=Dt#oL`LbfxSk)$MU z92zbcE5#$p7w-lb^!6YgV^OSxj&Nv0K0%0TD6BEX}V4?zqBP@Ph(pO z;S@>S9+WqmC<>%tdr~xO!j>DTu#R_L(Pg^4OZYx-EOIKcUuu_7{fS{<7-M!Tt3)xj z-0@06DI_Qd*AxZLD^1d_^u0{V(V0o-K9$tOZW0qP<^KS?inksazj?^*QZNd4FHCfx zE^^c9mv&0&Fl`~LFg)A z`_Q@j)Q5ABu+eX9@6E$xpIYcAvNyI(1ivYMwQ-4b!Z2^|3XL6u?PcK57ck(_XVZq* zTXOToL3QDqjYId6%0TQ5bq%6RBdaPp*=bbm_L3&|k<6&PdWsLx7J*(;yUm=x}{ zi)&f@qr)DRoqA%_Z)1;OVjFPBYL`>+=i8jh(qN92qowKVV+iMa9_N|>wF<0J?Ngiq zkxIb%WUo_AAnqV>ns5bFVDp1aHaOdBTf^dz3o}NXvGuOen6E5z$4aSeiy3JE0hsb? zc3sFx=8%U6Tmm}OY^1j1-jx&{6mw4?4jOX#{bh<0h=bVSg30a0x+3 z_zXXawSaYE3Cj9YS&HsB>(dm#=49~A-R1eYl1@c$S;o-B6`MHXtw$q;IVPcV!2_Y| zKozfa&$LP|5rB{ijySK?e4)_ytLu%J!9R^TBW6E%p+Ks#A7ru8+hs}8Ln2?<@i(7(H+Eh5&r3cG*}6D5~G?jPZ_0A zwSH{4z@{w5 zZW@<3a1TlV#JljkSF^Rqm?VaXJTGjBR(VU7^sT}GY@foL$#u_4Rs$9v2wO#ZZbY0Z z1Or!ZbeQkiLqEy}1z%=6fF$5iCOof@awr;Ra%jtH09k(TOd1nPQE=B%xs)D@o|SkK z@!)l*AluiiP{lxG4!HRaIIMfE4E?X|5x>ozzLl!V+ldDhhG$W<4ECf+OjtCNB+@qG z1!yrPMh|L;lCdbq2Bbm}6!j zvWn_0u7I%UYRO^-0j6QdA&&-uqKrv%ZExkAwm#|fq76CaxEEI=C$Kf3WeBC%fCsHt zT}IYNKfX}Iu{6ZXPNA?ffsOzb%=m-t7t#HWI8G1oS4Az-#~$Fr2f3wrBS=dmQJnkI=N~BkDpg!m zOb+Eg-J}DQ5XUB+fZg)c(3^^u=9~hne50SO03=|={5j4+tgCGn8(meePy?LtTGA53 z1k*+a0qH>QEKD4Y$7^SfDuv#Zmv?C{?3Am@qs+-4N*m=aSFHjiISK(eY+%y~W$JUD z*s51LqS!)YlyD9)MYf@Bdc(?WkTPkG<)%>JuNzMWvqq4xOwvIqUEM&d+ktXG!ite! zab??pv<1pAX&Yx*UQOezUca^%mX8KN2fw9AcB(N0nqfQB8K6cTzlUYhkJ>EdFDdL# z6*^em+&1fjfu2^h%d)D4I29ri!;_joGt2VeU7%q&BC~akDRn|5Ua8uzOFAe!pA0%v z;kZU#U4FGdWJ9FN?uJJtQ?adFM<6juK2k6#TISspA(ak0DW!}FNEuST=9PfN8ZG6W z#E)-270(KKVy>p2aWPlAlsFxRYf4sP#0JUffl0W91DyS60FpOoN=JYQ$I`i`@Oyow z?nLBBPIH>+QzVjFr33|S&BX(`O48Zv?ZTN$k~z&jSRUdMu|CEe8k8N`3UfvP;C1gx z;yKBDAn$ayO)ez$txxQ!Uf4!%4;)s6k}{wGoKgpEzLWuiz7T*;w<2w_4x}DUZ6f&* zEN3SiWSWsqHxo@}-NSUCXjsle{Mf7w1P|?dqnz?O>M}t#2ZEfQ;jseF+=pjm)_De}C zZEoa|^`wC3^$!t8YpW%io=L67VJvC4fq-*fZLHYbwfWRRJ2!A^yV35&)}H{+&4H6t z28xmt0x~ICvWJQt&h3$|eGOx48q;ZWMjbMzgT*9=V^em~nsT<`l6b1|Il8kGDB;Hf zvG28+EN6}vOmq3t5x&F|z{We!WCUZ*q!$?~ zqn~bGWo8Qvmspi&;#{bg7a}UagQU_e-xouxtpH06I?jScs zrPL0XA@jT7RLrC|Ag|WBC%e@lMZ0tRyk{A$oj+0j(Y09vWUo`6lP$^{T!g z)`pzo9O6drMS$Jf(qsdVtteMepql1Ubp^CHu}WAl%B5P-b>nDdt_j zA?RtiD(3@=M~sn@XaVr67Rs6!mzM_wuimKQ+zv%^I{yIng@X&gRCe$G98LBrgbEIl0ts@XmuWEJ!uHebH9XizL7j^>X ztD|m>8F}6T6-QXr4w|`D-tWL)dH~sC4&X^2N{QbC9OK@x?X2|~<5{GXj`-=7Ibrm!4*Kg>(xz9qnnsDa;AXn*I_6ugB_~|7Fz2!MqQGHldaK@RE2mqA zQW#~8b%hL8>mG93MooFbLvsEq!(>QLUrO{uS432PWKcPv46hMNvFP%%47X~B!cfXI zmAH|E2IMI|^*@N=Gw9OB22OdbPYOYGac?Ah*<)71VACCr(Xit=UVCPu2r_Wo*DHN4 zp`u+YTu507;<`&)gLMp2ZTrHL5kAcPq~~=xp)sa&k?BH(4T3ZMDo0lG_&l0GK!7M_ zGy#*9q>wp}8Kh0=9tT%jlnoJIXFse%)DLz+i!Lf?qv}kp0MkkQS!aR31cS5|nk64!0a?XH( z*FLm>?BveTpS{@BJDhDS!z)$wZB=YE=aA!gI0CY4tgdw{adgs@-_x8>2I-WsQLAh7GtN<8RuhH>V7 zYtQ^gJ?5XNs>LjrW6&DbwD9hwHMqPpki~ZZ%~jA2wMcfy2l1tT;0oa(*X}JYmdbDS z`>GQIMk?S2v<+w=&e!`aC9*nF0WvX?C;-0%bK0C6Z)$SLUDRWW299@AmP^~wV{P|` zUTS~%M2Rzq1uQlG0;sJWOF~2w;=ianzd}V7otWvQ@CnS!v>TnWZQKt*UDR>3HW9$%_nSs}tm7?}{nASrMseRf){KG6A?QaL%{_#9{{V>5hNTpC z?tIo@Nc?NPvSA&(0z;SBG6itnDGqhmQ8<%#Tvtw-Ez8<&dxj1W5!!(r0dRhl*$4mt zIcnoPJFQN2$@J@z&H(`l{A;d|vLPAC>J2Llk*AIrb2BRc0JWNiJE-Mv-N+7m*B@gg z-mR@o4BOTeYyf&v>oLBFeCTA(Jq;EEwQ#{R)}k^Zu3kW|?^SdQ>2GxSt|T9Pb*erf z)1;mWC5g(i{oEQX2B^DKDqcj}^{1`EN=wJI?f0$&LDMx2RLH)2FhY6FO+5E{Znp)j zTiF2{&s_6B9hLp6UfIZG0Bse`_*xe8=D{Q@kO;1l?b=-;c2yu?pTfEC3qtRw+=XyC z^`gVE*F_rb85kd08y;>D=hnFUZ8uW5zL6f~(hT(mx_e7Tvx5dklRe3xMTRB#6%v*O z!Rb;Wux38Ar2q_Z%^(;#>-baEwy@%u2c;=2sCl3Y*LrBZX2a~jCpE!YO+Wl3pJiE| zNKuF*@vlW@#kAb;ROj-qIMCiZPZ3D-oNaPPKJ`cr^ZPD0$KF;wIIeG6xV!NE%xu!D zD;|LJkMe7wlUuaUn6AffI2Fn2jsE}%KC2qUI75zq&$S2+&c=VW+eLB}hEx)#y<07} znE+AlYOR&5mR87{hswRpa|cnm)V0>NXEDW`00&xNbs|7yIAsItRuJT}s0ZG-&k)&a z8fBN-ZRI6Y^YpFl15o>RnG1zGfWsepKx?AmkIVt1Xc93bH{puqb>!A9m8Z62jomZa zsQ719yuZBit{9hGhRb)Nz;`8=g(MBshZ$5SHOBagEmqq26`7VM907{j&|$fb+Bt5V zklhPX16D$-v?!(p?@p1FI|8{Ur8EZ!+~hZEL%4vUF0K3^^H?4qUoTm>amt(z=UY-I z`YgHr?PU0C4J6|@+DBi;fVkfbNL~p^IXSL^Fm@B1S2y7`{nUW<$gYca*!Ok8rXfQ# zjkmR9_=4bD+N4T1mg*~QSrtUCLZXgyTgWs)lelr1ltPJJ3 z{VR40p?7T?p!DXld|e*vWSA~hI?@_6G}F4m4l#wzVR*6CZ|#U2k~8_%-jj80Hk%1o z#~1+DFXI`9_LLh>-EoRRW3{ww#U6PWAIh;cd8f3x`%SvBARd*cr^+rZQb>;FRly$k ztW&K={h=fmD~@oSQyMCd7&%gxu0Zjl!bvyhP~=4?#}xENpaQvGwk2Gfvc@k3{=AyDXqk z7CO8x;0Xi+>s)_`RVVR0JJ1yen%>e&`Fp1&lyuEt>u(v?qmi3zWvK;@nrk@jtbBuo z7ywjuT6{WiF(Qqh#45xy!7`zZvNny>`@9H?qUFH*zO(^@HkGEqsT(Avw9gM#RgA_7x_l;liENv!=`%Z8< z6`$bixHgz&CvoI)R(wSy?`-fug|}ve7AEksteP^G7z@TTORL-1ODKDlUoc|?nyKMv zZmsS7nbhn9AXZ%p-W>0x)PyIPB^Z2!x9;Fw*+DLb6qQ6 zX_nefP=_T3FgYg`$>_I{TI+J$Hc^{9Mko!BMC!zjhpjm6BY|1=m(3-kO2g$`oYpnB ziY@Ln6KJKp&Dc>%i0TyZL#`H)2nDu`3ROFk4m(prDx3}}0M_NQI?|$ZlSoM{O461X z_n-x30P=H9L5%02r3EpPIi*w2wE!HS|6j&_2vFJ80&%wX;ZrDXV@5@{zq zhB!5b0JvAjvDt=#aWXvC@OimRYIEk7@17#uR=70c@v22T`00X#-|{{TOQbb3wX65B!p z5Xzt$=e$Q|&}%Du5Xs&18bEcN;41Joj+M#yrcbi!mhvF^!3MYNwVNr_7L+5ZfZ41q zLNTptYGT7igmNi?)WIo|2;3YNUVkd$mH{V@cSyUid)HnWp};5P3I=^Ek!!eN@si6S zZJdTU??4@l_IB4;62=$~)h)DfTgmc(7aRdmB%WfDt&rTBTyzBX;($3tQ74Rx0oJ<- zSvLk_f(9#yTez&eRr~h|j)c~|?x>fVgmK$BWG5u8AT9WZDW%AIcP6X&Q)totQGyP0 z?@)M~Qbx2k>ON*r2{fJ=yM`MdA&)PN;(?*QH=Db%b zT!^EHmv7-X>C(ClHsM~%1dI~FKyEwGCSQ#}k%{k5c0C0lR^arg-yxT2=8zBA;tMt_oUqMxVr4+jA+9r8ycar@Pqdwl!NoD8 zc872akGeqP@TwZm&7{mb?W-|e$8iE|$sl0jR%^&>Dqpy9lfk}(`8DG9w--5pN$zK(V9#R+2XEvQbuhG7jSpuip(#EpC})tdH%I8ov+6JTVg&5 z0=qG)+eZX!`?9#>9jb!IE2vq*JZ6~#lbY?q;Rpnf6Ma2+X0n!u5HJsVp%Z|O zz!c(f^5+7ffc(cMq;*{7jYtMP57wfTvoFd%Z(5ZMYK|1-(-JaVF+2`v8Z%2-UEa05 z*4J=4H9>db8yn1+fQgSxX0opqVd6172zCw$71LX4R^^JxAyzog9qEHOOPvc*@b$`E zETr2h`Hgp4Rl;9s={hmv025R^LwOa=pV^_ztkouw8(3*yyyG0=i-_j6#s2_`t^!VS zYrJpx^y9pI{#E6=mEGK)B1?^=qPH0xvt7i#A-5JQx0VTvVwfD>h7fqJU`AVaAFX$@ z1PG=35^K#Yu4Ri{H;9EpHF^xJ_qtn{)R_wRCgdIfO7s03-X@)NVJ(8$IS1C06E7@{*EH!eP#)Bgp(xoo9+Yo5+x#m?1Ox>bpn}4M zQIc`RKNwa$1pq?e7@Q7)O?k$bZ58K<gGT$`OsbYmM<72gA1ucW0DB-!L5i06OYUwPPR5(&Ul%aa@mx-uuK- z2%q*i4UXy`}(9krd()3NLph(Jd^~G{p zZ=0uhhH37T0I?y+r*N^ct}Xn!E1Q5v8OAzP-U@BnFaQ9+{{UL8tLw5~Sxapk1(AW; zz;&)~!>Hrb(M5oPukkA3EbS>|q&6%}^P37L8*Vj6P9%Rp}#&c$sAx zL;N(4l>tcNnlO7}lO4=&>?BG2$Yj`nncJ!?n|E?2E8@XAkG0_72=5c}FvQ~R}SaexoX zDa_xzr|sT3phQvfP&R|N-mDYqG6<@0>JVJFmaZMM%7a(E6m;~U zMqTcYYk4S|MZ}LAZ6H69XCGP!}O3m5O7A z_M-B_8{2;_VYyFkwLi+oBy^U(bYKDfh0DRSkjsC#^>`mb!EXS8#(FqTon( zMBzxn;0)(9_Jow)wa>qcEFMjz)BzU-JKT1p0>(^-c5&@Zc4cpnVEWWy z&zijRPiYuF(0@t*nlf;?8-eRk%WZ2d!#e;^r6}GB$>NdOBSv@N08VLuji*{T2V$Cu z^y@I$F)n&jEHwna^9)1~hZz-UIS4W`*`t&QQqmZXVNegXK4>DjkN4QzD#muGVNglP zEsW3xc<}YBlEdZCrC+qOg3VSqN7Rv0DGwVAVxEejc+clR43$;aVGLK=t4pNXkXlHy zxa4N6%Or^#x-M8&EIuPL--}6C1o6!Ux5w$irg zVhm~}(=4GSp+Xq-;-@n2g&1dZ0CFkpa=i#3b)+=P!ouA)yF^%ydQ^~@pyCuG*NT=V zJ4nf;#sQ=u-eSqPp0yBG-|a|&K_t}7%o8iXrUEmCASvdULlh>X2+aGcW+W&SfQX=y zCs_~PsFu#t8(9It?^aZGG{yuRpXEiynDj`Z3b6nMA-9FyjIpa{)|VMT-ju9KQI52O zsa-AYqhb{maC=nixA;#=h~zgs)0wtJ>=)+86u^+~>IVb8S8F?4hC9?29cvR!)-@Zg zRju9wmyJn2 zwD~P<_eb*|t&r#8z)#N||7c$FY;;_NM}@*&~|D)%6>z z2#nFLRDJ3YT)K3dHE|*?Sar{8c6NfJpsE@!p!%(^n&1LG4PD6to=-{`gtiPmc0KCb zIU}A$RZ>n7SA$atag-ycdO#w_mdNQ+xeAAGQN>09Ly&sXwn8yu)`6x$1aYI15PZjz zOrK1GX?G9;im?#DW7?b!0}onaD@CS36r0p!4|7%@W1}fiw9`mrTy4lS&o?J-%0O3b zKHZ&nM7SQ+A+)qW7s*e`ttM~?70>HB>e^g+D4CbqscHt8vb8cPF(^H-D)d0aeozoxM*PNFtFGApSF!E#9T1X3DfE-Y>CKh`4WInF7u#cYLe6cPG_s~JahhOgHKnY>GDJ6Hsi@+xw1|-$ zOM}*|jH;iPjMPZ%(rr8sr6Hy@?QMZpSXVvjNaBtm@~9Z}sU8ihxp_2-r})Pd0}y3S z2YP!SmzsuCA$%tz(w^N0;mraT5=&s7J5!i|a7WUk4}*p4PnYG0AH4K{fvjzulOklA zV`;Xn{{Sq(9^$dDb?cie^p0q83!V*h2`8Hxy7VJ7>^qRXjl5tVB?wiB$E?S>-xWf^u`n;*cEQiDuLqFl-Tt9dTIpaO#?c%qw{b^3w+= z*1JSMIYwNARz6U>6#$@QaLBN)mV-PDfGTa@Fk{cPF;{NxC>bQvB>dT z7_OQqRDh&mQ~){aNRgsT<`n?rtu&We{#@-ehheu3w$^Q<03~4fN0+)jtUs-8-?nU} zUA(fN!&>N-)=ty<}3E@S4S(04So(Y?~r;BXHZq`q{hvGS1jx)Yl(ldp4i1t)dd}yL3Id zuEP4rUP2YJgpc8-1W9vh#{%I?dS;|+m=FxG!S9;$oBMfmy>(Hfkz#i0-8$E8b!7q4 z(ZikF3Eh)G7v-7&>#|{zI#kLPmm#a3(KN%f-d#v~;RmgB3I^Qg8RkcAC)V|=Urf(42(p8v91>BCVv;mE%@Ya z#dWh22auI!7#aG~9gf5a8Zbz~ z6pE4-``E=;Mh%XB@XaGB`LRHRWx{0g7NeHtD|=;W7%qKj>cFnk+}APUg}IjQC5=wS zVhA6F1F^IHqh+`=N)!+8Rm8fAY%(0LsjP{#n|bujuHjfFN$xnTzY5$+_j6hnF9cw0 zZ|_q|;yR|2XPC^&6by{l5#l{fFR$USSHyV)l{MQvy3G-WLxpv&A5zhxw(%4ZBLZBC zl=TC4=ffIx#guFa0Z#Re_q zm>-m8tPY~z!`7{+{jD9`6T$2&dQUDS%9jYEl4+4bEn^C#l?&6}xnCLU6I-I%TY{y! zoYLKaw)(Y-%k#*jk3&}yRF*yPNC-Wv0?S3QyV4Mu{{VW+o_%VLhkf=fb*veQLHA7- z9ge1EOGw^%p9-TmHO`L^UR}ys*4&T}r)qDEu4Wr8#|t3`ir&)n%e zhO-^Q2x`bIxm*@O_Q4>8mLKz5w0nT{E|lZ!@9D11CPUKvL8-OHDZn zJN(D0Qd#Pj_W(z`>P>OFbjz#j(zWAb2LnEprQ#T3vam+AlLR(?UiBq|V*+r)Rc9M*1$a`(1zI|GotYahfnjV`waoe9oHO%@Y37g@G93lL&5GraV!OQykZb%gMrRyOh=%F5g-A1#Vaq#$g5^VThO=$U~8nis}mmRwQoYrE@+qfXitXTLp+1raKp+)@>5a z2x4|%D67``g}v@XZVPwzs+vxXX>X@Q%r|bxAd}v(9v9H{^;LYuDarPvBd>X4goTjp zZ(51<8&KX`Org7S1ts08UBDy_mf6L5%uqP-6UTSCV-0{?r2u*<)GXCobgBn)xKrT1 zf^+3W;fJvXuysum${j4oUnR%OinrnYAuP1@e7Bg~l13UA=MzcgUv?|&n0~-ZCgx-P_UIG#!8YuD&{;S(ZbW& zNx|d=J;gAwy(YJ73hZ~-N#L58>bA(6hs+4hMRR^H)1wy2GIJsv1qbg{uMa#|T4_lX zZj57-)_}2jyhUl23depx#wyLmtK`}V+B3HuF1#Zwh#ohy#Gpvrmh`PF%gF4Mw4|SLTuzo_v++B|oQ>Tpwv)=AVtTw$*L!=MhAA9`&DRd!*_X zi3{vfQ=Ih%jTcRd%Tbb8WmW|60nHWzplmQZM3e&MxUX5`D3MPe5;fZ1OZ#;>vC+6nF}UOA$agBzo% z8To1%bh~+@Wo1Cb5DqJw@YUKusLx={ovv|Cz;v30;IW6yRNd+Yd9=EY?-aGmsgVXg zTJ;8kInmZ$;{v?(^w_MtSgDXfV}VU*2SH_~+UggpcI$>*V~XiyWhDT>RT!vXgh3Ec z6bxsjIg}MSqyp#6Y=OY2uI?JzCzBaqIH_YePCHVxA7~p`WOtwsJC6758vg*=N)SoL z(_QtXo@_z(kl3zCV1Rhb%R~VVGlSl{NbwY<1^^V$82%t({gpocp?I!a!rJ57ShNww zWR$tsFP zzQf}s;k;L7V%OkN@~biF z^%dV*+alRR3mgrDaqB=B(fFd(?|g?pH%uDYW+LCt117xRTd_zyTNK5wouwZJ~M$gJ{YbwGYvleu>5X7i3pq@yoC&lR;&6r4KIKdQ#kCn4w*%!b$Oe#XNpPXylRlNs=n6%|zF(-_Tk`zY z(*x8gu5-g~R`PM`NA;jYz7_yOG-H4dU(UA6vY--j+2*l)Du>9B=cxv_TLhM4l4w9z zx^QhJP`#^`@Ng08_n72loL5Vz%pkIms^sIfa^4nc?Qd=+c$*KBawzIM9S*olXw!w@ zVzWFK7nh}y3CTXSHo12!x_{Z@jGgLEF;#p$ES69hB#D=t=BO-bc%hhR?sLaVhr=k* zX;FjIIi_ouO?zhcamGs%oYk!qN-UB#LJFREq{JHLsTPv}W>u0#BLMcO?54iCQN1=M zHv+%Kn$Pi8n=JPWI%Sn{fm6k-%(fm{Tae1Q=|C9v3!fM=%06FHUD0v~B;XZs+M+*LTc}8| zTT0m6F~F}r)9>CbX|7Th5t4WSoYzTttS!Zp>{bPb$}vD#rQp@wcXKEh1BUd1X$h-DkGpF|awxc1t*2@88w4g}^K{28N37%f!4BihNQ_s?G>fkmn;bTxi*jGKw~_#yF|fw<~1RRJyO00A>RK z((Pp6j!guxP`@(cIj(P8@ekQAqPK|yO2n#+XRxl6WeCqDtBluldEZ)F*wcD1Y6gvV zu#@a=(zY3plaARH&v-)UTWYhwSO8Cd#<)vfBc&A(5+}l8qJ-H?^g5J2N#{~MN;#^FP8ZQBJNsi?&71+GC@!lXg zh;Y8Op`+{8^6AketRs;|2xE%akrB~jlkOdLEPj7V_U6a<$HQ!s8G{o<3#fx+YL?dJcxUj}%y4>Ue@7#z7|(4(9flLuv8g z=RNC`@g`^0?ct36^L|D>IIWE`Yn?Yw5V{s%F`9zgOqOk3Z|3ZH1W+TPju5d#6}lkL z*169XX@Tt4=@%0r>N|?*E@zGv-p2sdNp7v@v~wXsxFGXN!?DZhci-BtZ)b)mpL^?F zqeMh_QhH)Z^44;RXX^y>#VHK_`MLzO7*%rDOJTaC=i3gJ&?-=4l8e z6>t{0>r2MbbxEUjVy?#myNw%6T_OXInX^^z^a$_u1fOUalUGXy zC5i1x9A+>h&M+}dnkHpsL-REk5yHR+{3Y_|{eZ+Mo#-e|IId=$%laao#gho;i+4CRcBPFVV8x;BNTwRqTL zeK8!Tf_Al}kGJLkj2}^2`qYhWq)g9^%)KfIwAr+ml1NpVNzN9i>ULV5vl+uG4x4-8 zknCFUdhOGhxC;F3^{Z1{Lw9!8b0Es_Nvhr-v!6|0CSnK&v8L-fJ;l}6+F+2Y0uK}g zh$iq&w7Hr&UN<=*cMuIjpd;98Ceh0>k9^j^n*1-8=yS9H)RsDH#fzy1CduT}5wZfD zxZ@Ogn}Y$yI+}$f;FmbfN`ZQY;*$akM8164^?c3=oq&sySiI9Y_l-~&V{b5=kOy9Cg473_<5fGsO!lt2`YEn03R^bG2N|wr9}3^cdM_G6#2)kk z+9(}!#?eXNZYns#i*zoyY-2St5ZhRskx78p8&hKa>Qr{m%6blI82WpDUQakm*gYo)r@QVmWkPyuG{Dvqn6%5RqT)BR!36#YL!b9wfwy!o7QR0RGe z#JV(tIKa>8S^fldO)-&h8=iAoy2hDts6-%zwx%)bSoZ!F)GU!>x40?}bBbKZb}D%8 zNW@WPfs=3m1KPT84`66;Hw5RUbJxBLySe%1xh07Qn%&W~`Si$k$tiGqVvcPDV0f+q z+O568;Rz!jm2}n`WvH@^h~7$!;L>UuSkz(Lfsk@4h#HhFvLILig4pRw;7=qr*0(7X z5q|KTlUogiUIr9_ipSG!CKGx00JC};*pb!Z-H)K7a1ar8i#c@~u9KO4~OZFIaVUMMCcF8Z4g@?`n%`qHrjo7ZK0epeG zgO8K z4D(%GiDk5lk&rn2tDMzzJFQ0OO3ZgD$gO=c3#(NLaDG#Yks1!H-5ZXiVyaE1*<4H> zNRxMSj8(TeE$K~F8*)0(G|H={*rb36Q2rHkEO3CTeqO`UgaH{zrc6fs_Mk(i<_SG8 zYo74wPqxkg=Og;pMJXR*lRa@<=Z4iy-NS*#Mn75yVSF$NNe1i;*6>givF5P6G&d}R z>07}zlb)0biX)C#{$G-;rDFEUSfJ(3BNjmwKvPQgQaf(%p`B~0s>bp^odSki8 zX}V?PR}w6Rh;j%u*hO#T+X%>5s&}~=hl{Bb}3U$04u&mY55p9 z7@$L0#BqW~O*AZWs|gSgeQHvnlaZPgM%)p_A>55E?W6m!C;jt8u-ht(K)LJEq(SrX zPAU#}bQA@~qk@G(;8c4~?_*D2o-L0?*tR}5SZR8S%{AUQ1G@DojNy>VRhT7;LL zA@bDXHQ?g9CsCYGG|17`H~CZ(^r_R!&UTH*+L;nA;<)QfA<}+2QxPd4p9i3)5{$!z zKYa+es8#n5hHaroc%5 z06u7lOR%W!tFuHrxeeAYBL&^$Qw_tXaVg1 z03w2*H?AoOB0Pce_u`mhEH`e>De06x?y9I*hOrADgbBN_M2JR=os zf-&hp2&|}afywPkyy*_*p3 zi4GpQTVDy^t;S@zJ2RXUUA94e!15?}-mD47^`twMVTjgJ1+H2~-lXo%Dnlxw29*4@nWRe7>1jDU$=a;mTRq*Yz^%2hOlY>U zM>oulqU~L?Vc~V9J;+mr> z;AcMcz+)V?2UU2OB`7Qp0tk}wgPR>=Ssje*|%~4Uusn$!5)Hv19BXmJp~{@ ziy#N6#V{)^)B;_;Xbd>UYSbi*BOjrz2K8mP@ghd@ovir+yR>2;O~dBE$)E+fnkZF^ zunXRZOfMS9j0kUf&ertlukF?-9|U%%X?8ajHfs#c^RMGb3y#XN<8F6T&cY9BNY#rH zaZ%2s{oE<_!J^Cw0CmAu;-v(EkItC@D;On}i+&XB5_q5l53sWO(mwoTwnwErBA%oV zQ&9QHBq}6RM=A@lPzYR-e>#oi+NUFRPE?rjjAyv0g5d1mllW4w2(x^d+l*9!$COkI zQaDhU;I#@qU!SEG0yNAR!OrS@i~GIV$?PcxGI7#?q>w?zC_qMz@vio4DC?SP-&t=s zkYx0%4-x7_T}5RK*l9`5G3{3uL;nCkXN>QgW=B5M*zReIxMj&n6z8>0nL(4tJ*&^W zEe+T9{LoxT*h~-)L0*b@Dmvs*V7Q)U<^hE_=Z(P!gW8)s%K~nd)kx?M@l$PXBe@wz zR`$&T9t$fB9-S#SfIwgfJ$R`d4?I*(r)Nyl9m!V#fd_-w8fhcXOepuLVHN4Dta6u)H%7 zjpPh?&2$boMIsKYGguk~#9z-AGJuSJw1$Q7!!9QvagqINaJE$E*06jm5WyzTQCq2u z;PJT746UkNrk@Crl#!0rjcMY`d#Q{tsWT2RYooeIq%RzZ907{+{T{_%#d8DzC?w!h zO5!?6JWm92c~h>|Ue$5$)LDy&mwLBq%h!B0_Uovg0k?17IqO?i_VHWU$8JDitIyVu z8P*!yH#efxL$X%yTR1H+P&oCjKHY)wc2fY3IIgnh;Vt22WAh3CrL5}FY0-ksx!ZsR zQ9AT~LJ6Z}-O$!fkN*G@T~=8xF!7@t1KzLrhef#5*-fF?xW)%;Qyq?m(nOvF^3TeB zYQCeX#c2Le!#AZfM6{m9#bTZJ6dmgyQqpc8RZG(-5h?kGXbTr5)?~I_@g6B^{*RT+SsRQoT&Y7rN>Q>@d zPs)91nx(9Fx^>KMp@A8}_7#EPv?$X?c|{InSwzSdbm#)$Bk9x%LebjGjB+`-{$vdd98n&9c#Xs5ZM#&iPD^f@b5C%GDgPP)e zSAHeb;7dgz`tJiZ*4Rxm*vIDQa8Z(b&^r?EKXmh&kx|b9_+Hfkkdi{K53M~o`^TC> z9>9ai%~ijeXzb-Na^*-Lm01Cp@_44m0`f+2(t+6FJU1-st`i_2lk)@XUA&hYVRtE( z&2pL ztRPDtLMmSlYcSnu1{ug#3$?N_nqWkHOy=XsXb6*c9CoW(j_QTz^x5cB5Mh9fboyQguvvid|7v@%j7{AGLwN*-QMb&dq*Vs0gpk_qwpkgM=jgz zUEBC1eQTrE6(-T9-l2%j&&sF??Jpy}fh2^EgY%|p8iaavv%9cnZ{em5B9)sw=cP7V_+!x4IHBG0 zV;Js5VR%pCqv-?$v%?F^(#%12nx^Z?{6nGp0i?p{+Tg zVQyM6^KJF6FTuH=Te+2vHxhZS_C_)60+1Y!{3N#)cRyyCH$Hp*m2%?$098vva>}6q z$Qi0Sy|gm;k|)5tkAaYjIXyBz zt#yF7VAs+slh0K~#1OBfc zF!$oO^#dXW5uK-@HI?G5u8fMuIqN{~FNUF(Jt_v5g~v6}0HCvh)K*rHBEE}msyd3% zNB!ADjycUSqs{M4%pNP*ZZOVsT`lB#rL~#4Ml7l_z#7lC3pb0I-9s?qy6r@mtYs^J z0x-v|G$v;Fb5dPaHge<@;eqw5nw`kAwUScUMXqDPKpC!xI9=IM`PR>h6`x6TQ_BE& zqT)03*xG4Gmp&_#QFPUgyC zZF)Fk!(*jx47vqF!*iPFd|Q*JET6`#Fy7UrquqI$RBjGfFIqPX6*XN&Et~AneDl8> zL8xb!P}8hddGbl+hoG){E9sxbGRlK<0s!K=T~hXI?KR;R=W`4wpe$a~ujAA$qn1CH zJRW=1PZMh6Otd>r9R1PjR6HqTb!ibxf>npjk4n_nq|=c@-GIeM$`5)-Mje%|yK!VM zOynzk%OACAXqx=Db2Xf!6CuGgkm@gUY{?1`n-4*b+*d#0Ga=XIX+aIUy-*$P$~@7s zLfCfiUVo@x>pE_!_HjEI3F(|ypefrSU~7oiaW9Ku$KE7%S0LB3{nSAjtkI z>pVNC$*NcxoM0&fJ?iA?6wstoL>)aU#jG(~L=ps4L(T;NdH$p3%i|?7=K;8{LkD~b z##?BvH&+Y)00}HC*vM+@+0ZmcZxZW52-4aDM6TE-t3~16N^4H~d+T23K zmE?eX*0zs-BiXDhgyC_LKf;h4q`JnevbLU%&nV+|>e}$g)MJs3qQvJI{Ho=iidR-Q zk_Es$FBBK*YUdSaf~J5T9I00k&^gGu+0kMC2- z!eoF)r7>5dW1R3P1I{(;TZ?ZLBP$cQ{GQd^Y0%#bQnEKx&p}+Dh^7zXYjxYopYX2s z33FGQ;=sKETF zxa@QKed=qvoTg|007s7?ZuLL@s;#SPv1s~~FxfW_esVdgz7^9<{{U!#iH~Cwob@@b zmR$o+0d6ipV!Z(;tst?lZ!*nlk`^Cy6I{*iqjjq4#?MWBBzU`{?t;;rHF zC4nLkOlsSLdWsSP(ypm*tfi!lCfxNtmE0=ri2ym`xg9se5;fqDQipBX;5W5($}$yyl5R6Y1(|=`LT&RwDiI39)sY&4IWVjnh3Jyy8(@w#;yKiw7&AgJU93DZgV?~}7 z@id{nQOVt1Gh0Okn6`xA5rJ9ocybu!^LJs-Lz+li8XA=G+SyGio(f|%gW)!aB!w7m zbCX)ShMPU*m)N>1^fgCK@a4{q;gs&jUTJ})tibc=lf;Xb#z3sE2*Q!+?G&m+nZd4= zL+u`5`AF%C$(K%=8-|+K7$-Q*G1#8&#?Arex`0RV8na;HSaTTt*!!laeTwSohuY)| z81$_;N<$fjA@VPOT1;qj95BT)Uz7$NY0N=6r-W7`cS=ODqIHTu9A_hnbopCHker+x z3d_E^32=xx0Q9XVb(S^BE0yU$(Z~3B5BNwY!)@MA{{UXLnrUU#OiFT|pj2z2h_21e zyKQ6C=CrNg7K&uXTe&{836qpbA!uY7Cysm9ooZGW7Fz1tTjWN^I2F*`_?kF%AG1uS z1Cz&EmdG7jP;1O#Q-P684XY@=%VMglhbjp^^vk`iVKz@8Gx*iNnnXB1H%^tAdhuIX z%w=#3FM3uTj#t6AkwtxT9Idn#`A6qnPOp0mI#kFAEI|qfxUM_G@!QLLD#+nUIS*ZI znlvsFStKu$&UmW0iardolHLg}SnV={)KxDQ>5MfvuCb6Y(z@kTi4`Ik0Aq@d<|VrU zB^!bD?MMo?g3enA*X7)x5)DB2OZK4*3KSlsccpCxWt6;f;ai{;J-(c<72LUT-!#B( zrKu*9Y|=`nYL2ws4_t>?Ohz!k_p3U+t-b!7@XRxnBoCmjf5N(amiH|vU8o5HrLa1~ z^1cD$f_{7v^fWAaa?9(@I#3cKRAG;L09fF$p)Wok1T`9p_PdqlmWwd z!R{MXg_scrPFL5ZbY5w~r+XD` z4nsrL1(vlj+%^pD$JV_PJLG#2G>mqI2c>06;VTf!Bx=FED_`u0)+=t<2%{f0D~iVz zbA27xiQ(GCR1>(@apu6WWXKK@vRA_zc$`kAP5%InD%sP)Ay;rw#!VLs9JZSzFXBge z7>-6OuGF9xmNNm)M-^T_4_QYt${XkGYep+`3+-dMD7cP0!iY49CbhdeH@U~q*0+eY zD|mE=hBpjb)~#y#GCHQi#(#kLwvo3C7S2C9>zT3+ z(cZIcw0mteU+mkI9=SDjOEP1oJJ7@^K*dSxPI6ZxJW}idGn|@)E9LXZ^rQnmd7PFx z1Fsc{;^b!2GP&c@w+2<11H&FgEycVyP<@_oJgGkM^q>w>&r*sX52~vXC>UDa(i&5x z`PV>)!8tr+Rbk=l2xU-=O6Mb!TGGKAz$0!IMg~178fOt}a|Avqc}_|bT{YgL6t=R0 zP>~d;Pu-on1B7$k&z;d1wks!F0T(I7FKZcmOPn$eb z9mhK=?NA2dDn-FwPa>dWm(S%+04oN@O-l=o^KjdLyGkU>j^d!s`41gw>-(eg91hf2 zE@Ak&KjKu!JxxR5Tk|%IB5{@tjQdo+DV+|Q>WW#9Ppw7a%XEW8K`+{cg&SbJBNMJ2vb+JqN4$fA266N`pG zu#>?x+?njnuzxX012`1hn=4DG);Sd9cLJ&n5+!W;hi^eHHJS9ol#(2$ju|W;2OB6t3y+?Pa+h4>Ym46x$EW=$^!rMzw7kyX(Z7oA=0bKU zUEfOXe$5-%G;Nf|kF(=_i3>UPVc#S_W4Wjt}(wyt!$8=1d*7V}9Sm8UGEh{EUF6+m+yGMHV6 z!U9z~kUI3O%@+RNO)(+_hgGd9bh{QtQUe3n)2y`nSOF0r0QICaaQ-5Ds4q{EArZGY zs4dTlSqIrSEO_n*HMOm1^9^o0q*86us*2xTTG3-g+qY_gj8h97b(XEJY1e4Fk!(5R zy?0T+nHoP)fOh?B9{nTMT|hyVIRsX!;4ES@hQJ5#q{795LZ~?V-KsDcu_Wi(o^!Nk zlT2RpgiNXk-P}|+6RZinx(>B4I84=fk!2WhkxUK;S-*zo#F5N{3ay4DS8)!b57@)2 zsZ~r=GH6y4#C*tt_xja{>}?X*KmjAT#WC38bjy@q6*RlX82VRz9HK_tyLNHNs%xXz z?`IKV`y5rJNa8^hc?vyg49mH&pHI9qS)lUWiEum8JXiXgubi7;{w^zNoZth;WVu7QS@kCM`THatVi;S9{ z{{U1=*)6T@UoN8zMRXHE4dOI&$DQ5rRqgbvTSq1+uzgK3S%lTxlzf; z{$)E`3jobLLC?76C z?^A`^yq>iiggqQ@?aeC~L>p%uWlGxkr zNFpoHezd6`Tb3F6(-4F+5CQ4lp_5RC(2+EoSGhGimW=LI1b61Jd{Ji<+HssdGt^Kt zjntkin2W^wliGxnU^(WqJUojQjEb+jb!cO52Xjm|9V7XGg%~}4wNv{-*%XP0jDv*- zjMcK~f{(RMdgi$w8bcbiE+yqy@DI|MTsJoh zRHgq& z-lbXLxr;G6xb`()S+j!UO_Ag~NCy>>;Q0VXRw`6*Gfu&|ZtKIAT7}WMVng@EX~Af= zw&77oUVzfHk+g*o)SUDNr&n@?SYm+;PyiS_)E9bmH*x;^IQFU4e6m=Mw5H(;Dw#m` zqQgd7_;$h|3~I{2=OVQ{t;jln1_3nU#EdEAccexIb`o+(Z~@6&=9?U2c6Q>XcEZpckSJq909Bar`BZ@sLEJJ= zsityy%_A{v0mctnECN5=JcUtFLebo0$0p!7Jl1E5Zhpt4Oz9`itAM{+t>IbKw8Z(c z>~cw}uw37ev=Ttu=#ABxwXEmwn+OF=Wa z1Pr!0AFWBTS$7fmRaU;W^AvrdNcO3WsU{g15$tFL1F0CmsR_dE^{DdCz&|%?U%URa zg)2+}M#GWbl!gzyebw#jLb}MmD}(Jy4tP<3DFDVy{QkYDb@>4!J8DG)9Ovbsfa}_j z5d{skxcXwH5$``YN<=HafyFF@D{f}n7!(e|uti`O8K!Lki6bVf$9Hb$Dss!*8fV*~ zm5=W^Cm5pF5pbz>!hu}wrL9Y)+!bXZGC1|E&`tr*4P3{KkQIRAjmP>?upKqK{ie=2 zNH{B+kYSS*UrvAcm%=*~6=AU&?`*1$OL|iQRR$Cv;ii|^{EjM&y2X&V0cBRl2NiV6 zmoNv3hG{ed!YLt%p~A6U+=`_n%@!D|Z9PpiYSuzlQ7V&XhE ztzbY3s9X+lRBiPeX(kaFHnBVdR_;fW1CVzH98<6rEw2(=vl5)Q@~gW};`#YcTI75& zc^CGr$hdRnhr;{yuDp$n<%764IiY}<+E~-rhCqAMWM7m5bL~MOAOLep*BWB30(0Jz zU_x+u`_bk6idg254#I&CNW*Ub02)+Xt`r(?J6jZp8w8U;3m_YgM^5ykb}`ToN>=1A z826_t;(#M)$X8&wKIXBmb+xo|E>~zB4Q%gaW4Q6!xxX4g8)(li0Daia9YC575v|MZ zw^GABMQp|iK<-XkwR1iOwn3+?#X)90>#YmClhBG_M~_Ml02_LWa-W~eEBMnV9$4V_ zqyw5g!ARix(gfJqCp94Gqq!Ac>gL|bPoFxY4n}&Kpd@tMSBiNcCI=Ocy5w&fxQ&$w zJdwby8%wBe;`1Y5!=V(cJCl!@Hn7Mv!)pQS5}(4EEZ$O=1CL70ZxPx>#H=GZ$35wV z&1Hr-xk%J~DTND4Tyaz-*5VOvKp9UwQp>{opF~o}+Jh5O`c1jt6>H5n)^tw;0EIM;LX$&OY(=rzl2`mFAH*0916K0FuQ> z7*(TUvFZBKGoQK-6tQw~K<+q&8+!h9(5E>((#%&sG=TvABUDbYY7gGr6yVSoG)Mt) zif5KUXIg69M>}qcKvZ_kN*IiM*yA{)7Y+)Hj!hsq{A(`bTZv_8;zG@U`h%MS@JSePt zcD~fu$s6rZa4Smo5qD`MUv;}0wY#V9LB(`vGY`yg0L^h;98n*Lu3g4K&ON!Vr&FEa z(xz}Z3B@J`Jldtj_4%~383=iC+NF}-^2#GV<00-nDwlyznl2`hesbOa02=Bp1}!C0 zxda+RMI9de-pBKtobt6t#8>);nQUjYP*XkYFTs*X`n~G0Jd=azf@@#J1pfeHk=ais zm@;i1_FY3y^Jg0zkCckb)@Rf-*q-Gu$_@r=TRs(L9jeZ& zs3x6d_KACN1yk^+$)hBV*l;T=#}k&fgaAU885G1^)9r4xRBNFtDv^~H&3KY4n{7fA zl(QqAwcPlBof;#I5Vg*D=3(dCE&(NgA58O22hNNSO0QIIu$C3To3EbH<0bf*)&C{mCV++l2z8H??>iS4wVv#Aq zBD;-5AMD$MoDG%F_#!n}=3+-J{xs0;N2%%edOWLp4DBw%%9`l(yVTTd(&+rG!x$A) z#8MCJYk`lK6;Huz$3y$1kVZ2|EplB~Rd&3N&Nd3(wGN@D$!!nXVwsuMcLdE~>I*XX zv^Y|6+cnoTGtX_dL$O_PoOGr%LE-&P^$T_qe6k_ItzfOc%u~%`=$b*&*|$x&GZHgf zoJSc&7&*>qF)=~O$vHI1WZD-4G^Z+=?rGp6nwbNaGK(? zc(UJae(=sH5!YT>t;{SELL>{GD~ZzMy}R)fS(yr;B=T#&jW&?wx!a6>702jBzu_vl zAcM)r6u{ZM(IfI6Smcv@Ly_-Qd@-occ#_8CVk`hhTHd;o%eJ^A@MErH!J%316-Ey3 zznvkZbn#2(s8;706!?krS#!r~iC}2+&UYHJfGW@%0UXkRPbBcYsl0=lR^VoV9N&v9 zfwOCZ#0=vZruZ{XSnPc17@fr9+O7Dv4Wc)xU~1onz+DPITx6P{EDJJ|JkhzsR|Db= zJ*V*`aYWloed_ORwFREx;EV34Ir`TrdmsE&@nrnjT1*Wu_(o#3waJ}~n>S-7sQ6=2 zl;6!~CS(MR6WgtIT7|#}>$jqiO>uq~%WKygN4|d=0PSUFw}s^(e1kdmu43NeU3&6R zlbF*O#cb=deV<5>43;a}xlat~w`z}ck`d++fknq-Lr{Cq4otFdGepD&TIuaB4egp9 zn}&Xsm8fX5YD%vpgsS5LwJcTQw-KQQP+-#BM8Ukj-I2PaWBa~1q~4@uPIJ^y*~dK% z07iqH_oy|3&8ADU?{rnEkl}?xs@lUU)J0fP_3|BL+$Nit;C>TEGX9F3{FtO-C8_12fazL(Y#u;>h2*z0R z`By;<#qHy4f=)QiV)(;|AajiFJbqL#v9V$Vb~fl&qK<19#yX6)_QKjGIgx-MdK%rd z`Lw%s$jMRoS0UpIXa3NJQb_r_(1dDfS|ywsKrZ=q8;gU|sc71(N8$r!qkKakHEh^v z!dnQ2_9)6TiX+o3^x6FA{{YrG??VGpYkxA{P~As0#Az0Zcj9St!bP4dwo8!A=tl*5 z*E8Y8L#*DAM(xIx$6>n8jXavdTw3LJ<2bIEAvQ!g$=T1>6+5{_3C4E%R1y>RDZkvN zm{{a|FJhM(-Oa?G!ICSoO{zc#Cb=I9-bekVaRaV59>1M+5nM$r!$uFzoEjKduoQ1% z{VB%>g&b3Jm15lmJx-lr*>_wR3(r-nuT_^kH2s zxp2fW;<>*ZIDIBeo~$V9A>IgI_>}{@Cb~F@5BS$D@cjP(#J)|JL zHMh0ChSnqmxg(##s0|0Twi+|7#EQ6&u6?VX@Kwx){##XI@TO1eTXJZ=W}M$>n3pTL zmppwdobYwR#jRW+U=c|i(*wVnJjgfw(_Vez9X>m+62os6LW7fDfU_&iHn1uA*ByB( zf5Kv=SZ6q-2UBmQ+sAF>kO)}De=6avtkz!<$!)m#LAqC>gM{2jBV}+pRKdJmI+6g~ zFn>B@vDe9CYaNk@s5?hB%Xnr%{kd?c$IDW1I|}QbK(I($jkv~Zjqs+=?Yp!LF}RvR zW4j~}Te+cf25E%ujWBvUpIzZBs3s?stFsbSA*?iE?#jYt>+86KFR4m-lFB40@fE<(RM zx>rNuJL6@hNZ@_phO2IEtfWVY7tGEGTEX$EO!{yLq=q}NC<4cZEaQ&FCtw+z=jIuu z@okE>nzvC6rX!v>t9~9K^f+0t8yFyUqr}e`(b-x0s@I4t#2n7Yf2aUt} z*GL;KbN6$_b6yG{eV~z*EC=(hoX4~bb;+QXQ`Rm8t(cK=8`_IInC|Tt&5d%s*j33P zS!3Gj7G+R36k0o8L^X*v z#&%~LtFX9?Ph>=moQzdu)2(A%02GdMR)JlB1CS^KpV4AnHsVPB>XHp<>Y9{R_Hy}W z%xrK4S)S6~<#OwS-NCA`=+HqSlOczpB+?pYSA}d$am{qVtIN&}Ue@4iy&^~>Uznb? zrb3`%fDfRhi2RNZdH}@Grb~MzvYRNwy;AX2>b0lYqEg(Gk@c=gE@ek#;Vc1;4pT(RdBvu|k?vk;(u6*F4JA0S2OmoB=CY1i0SYloC7cYPG9kwtjMKR+sis|}#hh_342l6Yakno+ z^`^yaksQXVK7ywJH{ayYz>P9bAB{gBIA8BmFj3ClDeWgCcQl7%H($9}blIX+CER0< z_0ITSU_v zrz8wH9G}Lli&&$5%NX5C;K`ERs2PW==`NbISL)bRZgJkVKeiwd(|b61*2*>y$KqjJbPrYoe~giu8%mmI29h6Otg<#p7p zp4DV5SB@6B`)gS>O?+Q$D-?VR=>Gt+ZMS9l2BnS&;cc-16n3GAhVDZgQaBlGV0~+i z(oN2tskPLW?BYf}x>s@XyqierQj}gnRmad$Kw|0_b4hB^`6Y|59CWOI4n=#W%0K5HXq?IRsE3-W!d* zDBceQQ`r2Rb*2>zxjkqDFT_@lb)>q)ySDbK7CM*NG-bAAZ#}+VohzdmECCro)|w!M zN?l`Ik7{6NY4%^)kQ<2!F5KhmT;2^hu-j8N#RHw0hGfFQcG7j{n;GQ@YRZ4pkJ zD@PzZ194pfOOBt7F`$I=AUvMcHXX{Bm&eI5K&LEfdnj7k*KuN5xy4x!#0VlWlhY=S z0m0|mn1-qb8~Pe+?>q*lmR!=PRXef807ifUGs&vD&7a%so+ay!D#=n@ziN=gtBT>uODxJMldRKG;mHBq$cBL!jpkgzg)CJCWMzFh%LnX#> z{3A6MzoJ~~(xM4S3Ua2pU5rLS)w_W z0OXEn=-*m)I%0sh<{$!9a%-8_G@Gqv2ZavMO?2f(-J`t$#Bt*k2;;PS3*8DYvvVf% z*A>*m<}^xOaB)(oCDo1y?d?r2-gXJ%f!IQ!dj0Oym}AMQSwU^b_-IaKKQ3qyT#}Op zBP1Hb@eYFbcPo1nZQ4HQ^{$ivu1{0xLkzLTFa=N?{j%O(S*^PQn+7);=jHI7+Ufz~ zkfo~eS)qa2#SJ{P%dSn4d?=O9;BWsR|h zT>Bc4T#?s4)hrCDVY+)_6rI3gxrFew>=(akB<0S2nEwFv*L3Vb;)BT>j(w@2+{wC* z=3O{Nv*%%g-^#EwpAOvV+K<|dgsW#G72E)z;~Z2{mDw8SgKPs~j*IV>BcKP=0-l>EuXATl-GC3O{9)B!AH5Pp=F+Kt7v zs>aZlZh@;@ZqCt8j@~HP^y94nXIWZLJ;&N-1ZSYFDbQRiKu{3F86u<-fEWRcQyVOq zpbSK_xYDF;pE47b0-G(Q+N`M40d&<_s&RjMs=xi?2(xh#kf} zhLQP1910Lv>ZH_?-qhT>{Gjy3TY^-(g=bEOwre+Ai|sZI8sQgcH70_)G~l80jwy)K z!3U;kF}3mr1w}rfmMUbJe3A*&^p_0n?=x19_A8jNJt!VR!JjKD7nC(q7vv zv7WstWtpSPh5=M$lTN@(BC^T3xfJq9Kta#7VE+KZRcRvab|^PswmmCO+VVS%jRD;e z`=+Oq3qgn7J!!ZDbq)x9#04I?tgF3l2xJkX7hrkCI}YQobyw4n$t-wI!`7_X-5dL1 zaH>L@=6pk|ThC&sxvmQ0w}t|%F#=hmATQ@^!hCyMmBuoc^LZ~+vP>mmg6N-&G7 z8g>!4xCX+EQ(3Ti8LGN|r4FMHodL@B%~?T}`MKtmhKmRROqRt&NEs)QOl9eg)Zz}! zr=BQ6VSsQ)N{3Rtio(gIVN$`k#z5?P*D2!tO=E-X_&E*9#W5WQnRst4Ov8YBQ?(f7 zmdU)QD&QOuSza2yNwnpNAsai^_J4IQPC*<~*bZMo)^29LYZ-yv8Np&}tC7OvY0Fod z+TII46G+IUhHh)8xYy^mUC(Y=2j1e7Ky*Lj~E5-RlNzWVOS^Y^B+H5mCe9IlSL4>Jk*3DI$P6Mi?U}G=m?+ z*rZn75Nv(nkW1yiF@~ z6_*~XHOzoQ3odyebQJ6c&m*=!8hW2v!~WPXY68~hqP+RF!Pxisml-Q1(ty(-}MrR8OqxbAu(kM8rl<6j%F-%u zZnG802*eqBGS;Q!tsSX&&@(8`C>@Mlx5HHhnT#OtD{-V&ASlZYwai<1p=8xXypa)} zKN{Y;GAtY88Ibf8gjr~bRT%)9lVf>dT}U3HxW@5g*p53BB%y% zeJZR6M%#j8kiPXLvknF`SQ;j}m&M|ge)l~yTIjAAp1XT{QUeg^sKq> zb!8YRr;Xd!uhNSF)-$rO!2tTwv36b$HHD#Tk!oPT$W~MbIrXc$tkYXZ`;bn1k6Hk} zs@UWc^r=xe;F0yNKFh?i&vW)rnSO^nb60O)P_l#VPWe&E8Rgm=;Ag!dk6;Hm z&1dO1%cKXpkIfa5$bdwp}NO$72Ygvi0J#1P6A#xYzDgMH-qhT~!##IYmP*6qfjd2Zfx zu^%UHXt2{dOsXggNTHbWc&xo6Q-@NtX%m)Hj8&_v_-t*B#O;6qz@ow}h{u`GpQS$l zHV#1dt~%euS9*-3*{=$EdWw@y@h|#+*|iUnT;XtNupMC7jK$v^a4QqU8iQC{Mn?}R z;MM%I%7Z)}LH4dE#xmSB>~YPNKu4BE76Z4jibS)DM|`s`XbxIaS^6{Fyb+m+*c1WB zTGCciD{(;XIe}&sI=9Jz+L)`xPfCQ$%KQw2NJO~#^I4kJ{{Yw{QT$A6OdO7xJ#k!T zi`wPPZsQz~r`M59Fgm*v{)&w+C5CBlB3p=d1B2_Dp`;7Lry-d++rjp$ac(h4(l+9c2PYpltwzJ0)ByBT^LkTB+6Z2>=4TP^ zUj3akC7%E`eQJ)Oe%8BVQJEOv3Z)>_ZT|px{PI|+r(ib^ zE&~oJ>_Uuotc@#EYspwJ+82RW?xsi~GfLQ1qQFW4>PA4PhH#k+k?&mH#m=Rwwrp~+ zjyF^bd8ug9ESK!f7jBeT4yBZxr@y5mM9s4!A4-l3wY;%ggzEhTaoV=Cs%e^(aj{_( zhmHjn1G!dY{oWVq4>Z;+TL6RWRhcd)(v_n5WMv06%(khhS?V#tD-sytxD;3p$R*nD|zCi+;r%kZR)E}lkC6pFpBHq91gC*~uM%BXlFCrw~`8lp|R%TaR{*#_lR zJXaZ{=`mdElSJ#7Mt)lF9PWw9=s~Vq!&#G6x@8$TVVYo2)Vwh$)#7^*h?kR&)z+J2 zn!{|%xs@<;^r=iFIx)$(71X2_(!>4~*v*6+vN_-Dm z&hdStHOvyf+y~|~2+*{%(;r4pF;tdbbKKTGm3r2i-`F81$p;|y0=g?L4k>No^4yq; z0vH~Z2lic!h2Uf-%+FIm5_pdBtgKmq$j7Zz@YS`nwts4q4J?@4O*6&tGie+D0EeFc z07{?2p|}VqOpe|$G*}Cs)zN4qzJmg&=N)So#&aLCBte1pt*;LUIxH9) zb`GAjbP=is*whn)NHC`$=8068x922wsL=@-2L_}GiC{Ckb?a{(#4NKYV4#on7ilo5knWx@XdMwD*(vBgl1XTktO zb#o6;tZ)T&Y*A1UIj%>-fc?7bE&N9{)<~#ur=OOS8WmfNnnv7Llf^aTWMm<-Jt@LX z-zgZRA&HUSy>mV?jeg9m6mH1ox{|m9>s+smq}gPIwl^9rs94p}t>RrCCPfOwa%)*) z-EP?Al{Jl~?~B9HN(duvYP#ze652RHw*d1@EMe(3vCHDg5>N_)4_fVYOL(NyZhl4L zG6isc9*|Aq6DCP**fr=^sE1FNEy-W$Oe}If1%;AJwFl)A5IwQa^{$Itx%(!QBMu7; zX0SXHD#Ja}IsPWk^sW7B)Zb|mMyr+sB9mcboA6caNVB}FmoN8^r!@V2((oX$jPB1Q zeiYvaS}nRtw*YR)9R4-aT$@`fW^jtkzLc&O9i(}Wr^IDqT}Ci!=b6bQXBC~L-1+Lv z0o&MCf<8$bXb|Ob^JRYZH-&7D^(3R@%A8aQkK!5Tf!MnA-Lo;k-ajhq?e6X6f+!$}XuExj9*YKv8jxS3uapK8dZ=9=O zeJiz=DBXOOPzw)A<7^{q4-vcF5)wi-99L%ZLlU%&Ale2?P}uBn@B^jzt)m}x{VTa} zB(-HDBrfIlHOfN-T9=5L;yk=+cs10^x+s{pLbxWD;bV&M%nIHio>>$TytaMosn?Lt zqfVpmcE_c2nl$kyxjIHLrG`(xHPdPmc~(<9KLL3Bs0$e04n~gJMeWD+u8A81AH$w& zn((FMN*!e+7bhHh*GO07!8v2d`cNQ5JBb|)D=QL7I0Bs(;lmy&lM>*CpaDnmD91f( zj`4H>00u$%zBLah@H48^yN+0}Gn!HT6Z&=M92( zb6mECJTUmW;!XbmyE*2%EqZ%nrO15Vt4s{P11L6wu?Ubu!`a@pWc3oj&f z9qV_&mayGv(oJ&X%yvCZWq7FDTkCe_+>N6FfS?ZY(NB=F5y2TA)y;U-Vr91^WP(4X zZfW|IHx_ZMXDS9U_*XmQK_=)=MBI0NlmXM(5&e~HdId_c7+h{V*FXKO5@^v!3#-k5 zFukj8$sAfo=AF()dSeur7FtY=qkw6OFxbaV^r3qeiz21i=b)34NM>nx`kQ}YhA!pA+~$dve|;&7n4k^wc+>&ic|reF4Qam8|8AJk)m z#Ixj|C9}>u*G1wjQs4VJNMmffCwgIHAHa|0+gz%zTpa#&zpUS#KTCN>Ew_cmbAAT8 ziZMJT_Pb+g$JVd-)#Qs$3cQA1!>s{fbPG#+n@734`R0^op5C1*fxK-e#Ay*9x|5(4 zr{SGGRng;F8$J2&nwL=0AQKDAgY&5v=76!#Lg2=&oPq(xBl7B2p|+RKhYBz-Flt?- zE*rN>Ohn4WE<)!u6pq9Ut~sR)!FZ^HN+0LxjEY0CiQ-FJnGjrCjnXe6DJZJYL9##sHcx*_29e!IkRu12psX!M&svh_7V?o9>(aF#nJ-c~ zqF_}N0zvOqmPXzH%^=w2(@WNpWZiP-+luNShFGnDobGIMQZDZ^EZO#@X53g(5f#7& z(YVO~n&*5t{$=#xcmld$Xc`y865=WG*}ulOm*-(hLO$>! zt;zevJm6DM0GKBTl=2k(2;kAU^7QQv!yi zVHN$0+bKIw-R8OLFSqFg+sALZFnZTyp+evaiI6eokkQ8KdOo47I!HkZ26ooYf-d2V zTgZegd~~ho@&-2ydSaTg1(R;jJ@G);zF86$&V8wvJMwB{ls$3}YGEAZx=_5-Yx5C;YTkD*6zI+l z3t?yx&)H}a*xj|lpPQ+xmvCJ={^;X9O<%d46&uWzRD;fY)M-33AP~r`r=|{Rh0I$m z7UIc_w#}0v%hv31GR7IsT#ji&IKm2fY>lU?(zsk`Yz56dlrRmBR*_UNVeYd>1iV%4p@r#n{}&1hqsel+vW52XQfmKsi_1+cV^LM_Jt_2coY=R+~t7~*f7 z518lHwOP66k=Rq582|v|6j&~EHoh4)R|ZRW9%gcWwWTe!?9ntJ<*MY7GPrdl8ktVi z$v-!(0dt+xbO~(l3zx@sLC$NS-7r-FepVQ%BP4RepHoUn2P!{WEEh3m(&R}qZNX!g z`qP(2nt7F{l(PQ-5UqCJ!*@(k8x|@D9`sl)2^L6X$1gk7SVg!Ro1bGIj@1GvkZbh?AfnEb8$UX_?Mscqx(?cXsEQ(EP>E&$Fc zkxYvzFDmiSQwy2#=>Bu7-4JoxCbfuNp(FdNfj}!V?*&iNf?0;ukM}OF zJwd5M5nG~({f`6ur(xMvAA?J2(NpmTixw40l0Lk52H;X#Ew=W*P7Zq zFUT^~sO%JO>qUohorQ(Ao--P7I`Vm`uOjjjs-o6 zu?MvbW>vnJBW0FZixuDxYSEt5URxO0l~dCKoJ?b_BDv%SIH3r{i^A46u3k5Nez|GVAKWnDR=0sS1O=w-(!F_Dd$U`fC7o{#i;8cJf z0HFcT+UPH*F<2Z3LC!sCv-nol^_pgO5@$JTzkjSPwc^|D+|BLMv_tQVHZhT!0HLSp zFzNB^Q@Hx(r@gR)QnzTX20`h?Si@`tE@{cQE=a+k3=2OD+Sy%sptf_y;&`p#R44%F z6#b!wPg-Lx-g8s~oMepCI-D9(>_`OhK`Ns?=~w|yS7`51-dfw;#3Hy{q3ukXQygyK z^clrx>HZ*&{y_-g@r*-O1X@$(_Gz%M7GD4e3>sM~H z*flF-9Dp$cfNA7yU{^V(i2!ZK@t`hq_D1(koWSvBB|k1Id6MG%?J0!KUAww_c+9Gs zzrvu?^{ZRygfad90OAzV(&2LK5hM^QFWyeID-g;kn2@cvwPVMt#Vy&jOos=aC=squ z6kJmZ9D;gOg^uh2fCpNRNl80Fq&tWV@{ekTG;taj(nb*z(zFyYUQZOP08kX3 zJ?VwW?JT3T&c@tZ*P54~H1G&LYNn&9!KGP?i3lW|ZK*A07f~##cB_nvVkpm{Tg@{_ z8I_68%TI?#w}a-9%d+$hS_t1RK*lr8HWz1Xw z+8pd1b5}?RKmw!l5AceVFl24b%?LLb;c}#PrvN`nh+sF$xc8}FE3~QXXb^$(Z8mG1 z@beG1PCIgc8s1_O%2LO%tRD@=9`0A{awr-d;g&$ts``xnwX{ei^NwpD!-%VHJ*q7)#1C_Puuh&_jnEn_2SPv!0j7j(e4wAD z4*Rg%exj)A8mHND9l6~xBjp`M0AFbej5a~{qj}q&wawmYT8*se)4<+S4yLwZm`QA| zUwAm+cc2SPZX4%0_r*f(vGKKt?OgAObsbMhK=4PtHtI>~Ot-zipG-;I9mHoDplO{- zayJsoyY7QhsbR(s)K@*>{c=r0X)UBh{o4GjrmFalSJX7P#l&a=gZa^69a$T9ZU-&v zNHVb!IIeF@)in)P(Ik#ONaWH*uj4=p7&lW=NN~LT+o=V{5?>A4oZ+^G^`b?aE>v6e(~419A` zJQ54pNY2?i$Q7Hd$*I~{IFld_rnS5pkv@`2aM;N{^y~*pvtfY)413c{<+)`9`}M3( z5^G0AiF~B<9q<)v657jHyn(MJm4P2HL65?nfbP`bV}rZU)J9a@<%V7T`K|?gQGE$` z5(asfim~Cjbt|1q?H7?T3_&^LAC(qBcOlm&B%Qr+PA-hUET4g{Q&rX_n*7*VorICS zs+OXc`bOE*Jm_(_=8FN@WS3CGBeh6ZXwPruS^8DzytGLd=J|OU=xZ-p)+C2e77)l6 zco~rPrC>S_J}`C(6qDODrPPgufn(CJ*FxJ7kuM}^h~1vqr)aG@T*xk$BoT%Olf@PT zdjuyn87DO>Ht0)(!0k}P8eEgWqym7%aCoT@oM2KDuy8umn|7dK)w!SqBp% z+_@Z_nqXScqq&C68Ogyt`_{LZLj&5H6-;;>Q~a_cTpB<;>|zPz(@sNsQ({k>Il-sC z2Mx%eX^qL=32ZHKek9ezy4+UYXUU$UwRQIj&k2q*hBfCm8gRPt7ug+%`LbU$#Cj#0 zV%{!ye4_@a>(+7HX>%4oI9!A2S8ZSxkfpptvZ9PJ?^HGU{H-QnKJi+fpk(+yNRFQ8 z%urE)A-@{vR_@kWa3@m3sIFtf8amHr_YElpyH#HjpwchWNF+HRXB9)S-$rqgzjmT0 z5*8-{tLYQ9)|m{2zWC>g%hvT@vdtZ=e7lp+;3){zxzw%B6L84wRwKAZh%{^pk-+q< zN79lj7P>FKLb==cR!@ZQnrq2nm5%Yw4?)c!I}%P5jtQkF115>oBV_t!tE{G1#xNFu zCIAzW)}?HWbDD%;zA3=+MF2>fcV)VFu2Wmo3+s?uE97p@N2PSrqnMZhn&Bh2n(M@V zTatxO2B>yB!y>-lE%G)DR8n6>0+o@KbKKKx?N-(>n~7o6)h%w?F{WHh_$me|2(ooc z1W)++3{OC`vEN!;uvn!T`qwex-2ywCN4RN;W6^4@g^ks&yO4}w-N!V*?%6^n)5$b1 zm*wH40Iy?IHB0r=trlin$-o0OK{VUlMSjxrnAQ0J0YDq4%f>-j57v-OisQ_}4|?Wh znoSD!HF*mxzQ4ncKdn%|)E?(uhSi+mxd408upOJ-+oR-4F;w4Hu}K?zpdV3O*0}8r z%2`I(EsUJjl6YF&Y2_MMX_<16Zq6_>n&LDv*4ng|5)x5) z9M@3`)!Dwo(k@8L)bvfSIl4rGui^vzd~P=v6|zbWZlu8lKzj^aj{N}wkIQh1c6oY33C zjh|3Spbpj9PTi~sAFgUEtIK;>^CN&qYN?}_xUz-hCvXE9u5Vt7^5b4bm=%Pa15E+a zN2^*)cPyYUeATv^DUcZ4Khn8Y{2?^6BLd{0Y!37R*a!o}OCH@T zhtnV*@R`2Rf$VFwmQ9w@J8~6C#d01P{{T+b=e$qw`}+F1S-ECyr;$m>r~pla*o_3w`Re^aHxNnmcgJ=L!cVvTa{XlIf?0RWr9yS~rm_mc=9+ zzFOhDI~M-{5l9OV5S~AkNbGmYt&Hrz9{p-FHLP;{(kNrwH6EpQ);1GP6Mod;L9RDM zShah{mhxs-Vs@tNVv7jw(&iRyB#KAYmjFq_40Sch-{|w(&XQY9*bR-K=ZffK43NhW zC7G0D&^sJ2i*NkRayU01C0~(U#+vb)NF#{k1Q;OK3*sF(Nv}g{8*4Ls@Aa}cF;_K7+~=gVR`p7n5C#Vxwri9S=_xQ`b?w;Hv*zub8ke8bZ<+S_T# z7MmTTHtvT%g#sKk8$G`?;YsXj5v*zEO@d|5u4~WyO8#!TEv>_k;UP()e-B*PD!0!e za1L^KrtAl$#X30o7!Z4kRvR0U*16p#Y3wYOZi{4cNvq?;HWF|oAdb9L@3BbQjg^-H zaf)Wv-geehJ|MDbRTf@awWE-@5+@3K(j}Gd)HSTAI^gZBe-E-1c*pw1JpOgHa_W&w zAQ?D2SJtq6ITq{5=g&DGFQ-}tnEwC_<+P*hf30jWCOi+uvphE$k4ZW1YfT1o&L|Tp z>al~Q$Qd#)de%RK6&l)h*aIsZR`#VRI&8o%Md?^R4Uu-tgXJFeKy=D>fIU{Y-xMK} zTesYPOpZSq>Mf*s?w&KyXACQv@nb6MFa_tQG=S@1U@f9VL5v#X{G?AB0i1w&9+lYI zY%xGfa2NVlD=NmmDf1T%lgkQVbuzIISw{tHin6(L;+K~Nm>goecV*gn;eZ*gYCAZz z?-3a!JA?8Y(vt%AwRJVdp6Ib>aOsMR!nV@eX{XKyBoYDbTauLt=6sB}=xPXO^NX^s z0OJ5s124q~%(6(Ap*3>S(Hlufe(81O)>nuwOi2;J&g$K=xQa_e0k;yPKGXpfmX8&b zN66X>XCw|yW_YU5Txmo<-v_O4qcb)KMXYZV$WEH;jJIkBVowjmv1pO504f2<;}GGNrbt+E2YWBN$>N^e5OtEMXLa0kJ?#*P)qg`BTOLQ|BW7E?W z(dl=wwYsJ@vH-X}>J3LyD&AZ%=0-n!QE;&RWtuMzI_~+x;GbS9kAq_ePAqbT!!bz4)9kr`te#@pJM!Q>PFh+T-FBr)+ zo}&xJm&g3G9qTqNQ&^HkacIhb@$%9U(dgbC^6$<3_%btObNvN$(v<$-7#%>xarV0X z=$R7Y7C_h;#dZ;uk`No6!}-t$nf~L&r7JYHz4t*pyg`GmK*$Dmkr2ldOHY z=Uv{l z%VkqI3sm(vORzzG8$JU@w5s6?)KJ_tG+mBw<2#;Yel{p8sDOE3nNF2rvKMEB2 zpLFeST0k|>Z@?T^85AnsGr{X!$C$BX9$Orm;Vu?SKNBtEju`P&2V*mfbN7Jh#bWrb zA^nu|cOLa5)BgZyYB2d@D7|s(QFyIqn@;;INxYDG^r`9r;Ul|AUO$GiJZzxL6oho* zwERCKS?P%bp%NkIj@6ywkoUxSP_qHnsCPOoAwbe?aljx~Ij-CJo+!6Gg+BiPO6YVc z9N0w*##N&o>6)IK=UfTYecqIqi;`M2)?zLEGS*g^qC=+Y2H?sWo3?7wYXa5*43ReC zFbzRt47WOgnbm?0MIbiiW_M7->rLB(@~+yjtdE8rMMmwtum?&2BMOIeE@&lLxEK`f zLeoeX=|Br1e=i{N1#&jhEBLEseroJ+WRC!5xJ#Ix$HfhC&N`AQjUAkzi5Yi%++wP0 zkOt8uRy0Jpwy~*eYN&w`1Snc-fcuqnRE33BV#xOsG99BPww23ccTctTMkU*=J zI<2f$X%v9&Rl@?V8ykKML6KGrq3~iq)cT*m@JNpN$J zDfT+e%$i^xONYkY#8jc!&)Ci4d07A$$jGg&5?~%gZmLZthoeax&vP-$$&<}Zb85C8 zWYLVXXQfbB1`~Jk>oJOM+UhY-6m}-To-GW1oR#0h?`x~ zE*nQ_UQ%#A=6llk6{C*Kqp%E~wLYam4^`>R69Ym5IQvSHP}C{n^hUk2QZ-)b4Mr zUe+6O81+BOvV0vJ+I`!kv9a?{EsmU34##&WM~Jg^RjwPug%iYgL#SeFtkh+a-pPt1 zI~?N`#c1%~+UpWri+1wZ^N~ns?q>)iV)!wY=O?9c+K+{&nsaqwHr>adY+|}SQ7$Ia z9L1gFecwufm{woN}bDUuN*H?9Y9iuMn5=a|!mBj)^TyIh!K+Sxlg`{J==@Psorp3?sL zc?6!ds|r1pph9=HFenkk+W_7%D$Bc^^Igb5-0T@1)x_fB(_d@jZdeoPU91ze#jukb zN$hDf1ad(g!kFb!!Mb2o1L2!3#J*G>dChIdjBXq<^)%AKpXM2)v>nWQe+=0{KbSck zdYaly03uV62O^X@0gazZ0}PS|C=pigI3}?? zEb1hkeF*-v0b|3hoi&N*NX2M`B!C+gm*L)QijTT0Wz;eNIG}7tR9K!i;lVjE)tg;=QT)RR@NbSrDQeAj=QIqGWE zb8k|hUr2tnNQu)An%s}@wp&rN-qVtaR41A0*`cqqW zNbN`nZY<)xaIAx9>S(vKwzYLsB!%}iC?x|C)YOVqhs?at1KLGG&Yw56Rl2r<@-=A} zfOCx1u%Ho<#Wli{fxw`mqT2Zcq-O|u#TPna-ADV!=B|u7;0$f1U>5YpA6f-+y}q9v zqwS5e7hzX64E)?J3%8~ykSnNKVjPjK<~_Sp$=JM9ag{-XLx9V}=h~18n_MwtOmeb( zhk-~JXGsA1Dxj-wFp??3f%EkG}&XgwEITPZt0rO*0p&w$hQO~Nv0!OWl57{ zqbu8rjOp;;5Zj0MbJC#GFWUOqU8BHp)}q!g#+d+qNn?SEU}&z`un+(}spV2aHz+?* zSvpRvnxtixJZ<0_)s2A%0|Zb4OJ@^A6d(#cDbYr%nv-xCyHm7KK3)7)E8D>PALHLm{W$%?$p3J!KI9#UzFs~&;~Kmrnq%C7X^?Xx@$!uTU&OH5CZxEOSJ9DIRMm> zoWuh4paw!oL!N12au|Em|EsFPY1p)tzVJn`?{YwIHh= z^+0rrRb*CB6l0(i{fY^|`D!nPX1CD#%!n-33Y&S$b42j)Sd3dw!aAgIr7eGy!Xj z;MHrJDDI>I)L_+JGX3>56Q>FEtJl!UJ-#4qvJT+UVWuya6j7=u0FIS82-sFoa4U|m z)umq%rkyckj^?`de2_c#phA{J<7mY&C}YPMr)&gey3w2~0B8XQ+?8kHyH#h?Eo5@o zTn}oMV+4Xa(zfL^Sa%q<*0HHbV^G9k;8uOMlGc~ca~K_Y9<{2QOZ4V~NuL1VQeru6 za?1Nqx>+sPY9Z$)x3tLBEP_gk&BlJUdPE7dD+ULsq9s5A?HDu;;z{y=RN(qk6t9+5 z*Klrmr;w&bUeyrwFj)a3r8OATd<)P(zSQeAunHw+m?5hw$eV zSPKkE+S`C1g)x{(5sAj()K(_3Wp?(jG!im}Jb-GqgYPB0TZEe~V_=|@^`QZ_RRi#Y zk7|-38Bzi&p1H*&W9D{YfK599l2l_9G2C=gkPh|FI2=&yg>tF^`c&~othw)1qW#y%N%0?06w)U{lSCHV>Ymt zI>T8*!Ct1d3}t@nebM^R1mFfjgahhLFf>s%)Ib<_70h^>QM=PZJVb;&PAhXqoiA)s zV%cH_b4&|N<*`w_F~XC@NhU@Do++rHoV6exa#WCU#Vlkn!>)ZPr0#I42>Mix@R%t2>@srIv0X)}H+U<^PDaJv~Q*A~DVyh-eu4hq? zQMuRGe(x)QYW}lmEj05aSPn6Rnk)wAn&vzZHlFnvmN-b?CKZk`?^(VXxt8lo24>vb zh^yL-g4|iY(fifp9G)n!6Q$e_$dPuAI@4cJv=VI%TyKXh?rwD{V|iGpCAQZ~sMsgj zS))t^T$7&kSPdX|k`#|o?@o*Nq-`BKRu6@4WV?ylS1jv=`c{ssel)!nRiDlb>4W zX1Yl=&$8Z15-!Sn){MG+n?!!iAmDIIPzJb>3WFPFn}!ao57w(`md_oq^Z9)BtDpi% z^q^^qWF%uWkF+P4++)2e$Bo3C(=HYt3|C?ODRt|gMBN9VGWmx ze$LEV1w0J&uF882H7$PB$iH_3lS2bSEk@R7+YE((>S_z!PfVH27kDSOX__vd6jtpn zG1UJ6g=F}*NJO;zWFrnh$;qh$sIs0ZP$WQkYmK<9zZgcZq%#0Bx|hQ-lcgj701@hF z@lux38FP%9b^^|V5p-DaImH^~s?DRy%raAvnoSH3?3hk|QaP(Sz$ZwQ4gnM}Io|~k zAdqeTBHxX5s~8-U)MmMV1gY{R&-ci#sUzIyJp~{mEDV?frAF>nRjURexwxoZK4qW? zFLfJx7+P5r)^uJh(%mx0zfXG8)NNs&$&rvAD}(UXkqy?hJa+^b)rnR5RV_g3AH{Y_ zD#jvjnDyqi)>M`>k~YX;oK+n|NwSjIptnF(G7mkg8^X8pNj#R0cNq8{-jo504Y_Kg;msvJ$j0~Pkgo@(DS^FXa}D4k83yd~ z4Oozvt1;U%(fmZSR!Wf-G?64=&OtZKKEXc4Fj>$T2CF)7l`FaaJE-|`8jkTAeTTNwR zs(RgS%3P(w7Dof|L6y3@DEC+|q$gU)Jw z64FQ+gJg#2b4tK%#zBKU#Ygv#G~tnuyi%MZwbz(dH4Lf&J?gpv zg{b&~3k!vYRU~xHXu)wE&7iqLe6lzdjpFMV#fP1+22<9x^ccjtEI=>Ij%g0YOr9*Z zwVYeLWIl14=wp=60?!j?a0a<=7wLBKEOW;g^K;3`u8&3;({0#xQAjLT)iqYq<1Zw9 z9;UO$jACfVlM@&ERqq!fzKreA=NYQr9@DL)(9_I?Ooe!AcS0Sfc#7KgU5p^M(pH$XaWxgYDq1c!iaXS1pC)c%G-l) zcv?uE2V<~LHq(wd$jjjn_ejf`82)-Q!-f>)a6Qd!A7 zA4-eG5Q#6My0k-qjDbq_3mvNvh*^GPjDuYL$BC`&=VY7|alk&cx2H&2%G|gmihxP3 zOU5=3zNG+#K-|Z7ze*Tb*gDyc)ZOjf8R=TuexVkjW+jaM?xLs-7AZ8ewIc{n9;dBM zqv@@tTNGy80pwBD7$@Xw9xmZ65hyD7gF8e@(w#N)a?!*g70mG`jAcb7E3bHxZ0t zwDb{bmN>Q}9eVVp2D3`At301@4)xC6Yj-B-i)cYWcr@P_>JMve3M&vKARJbPk!*uc ziS~vh=bB(rhs2vENbh6vi+$G>vn|1Eb1k}VE;C%;j?6IWs6wi_BL^MpSHo8#^G1pC zTML6g8J9jUg4*xwt`DBv1;={bFD#ZKZNIz&gdNGQ55)G0o+5)_3zk!#dh~l0#gt0N zJtzZ{kHoB+qFPF)aX&KpS5YLJ({^|u5G#$>?NSdE#VP@oHP=MJu&gi@LB&3RaQf}s z-`j9+1hITK9jmssnoleV6R6|qT&BFKH;FBfFBu=syJRS^s}X{uAEhpULwzHEWXwn2 zAmj3`Bf}T7Lp1S1Gb6ab{Oh*6A#}-`BWOd9t#bYfg$$PxFbu@-PijC~)HR!pJ^uiH zfFV3%^{wk0xUTJ0&~U(3SBzqfv@*p(Wgjg!!Q;)+6u;ib6fim{xCa#!xh}OJASm~y zbDWw;b{-KhFgdDMGyRcdmmern8m)qJ%~!dNWQtW`k%CPDW6!jE=U)>v!4A^LchbEI zDH+B}kaNenq7o`S1r`m3gy6c(|Ua5>|( zPve{o5lKBwUGUryL#0CD0B2ki>M4Oz*TkrA{>yZxIUAs^gCE~G?g;d*6UESdn_IP# zA_3fU`HJnKZ}d2v^2G*d0~1r%|=s?BBim|si8E3 zNsU6~v5I~D+*X!^>|Ocdt3h*fW4a$Bd}F0Y6_mP!!dWsEPu-v_SiiV?j}3W)Ah079 z&G;4M?QOLL?gz3#&(;|Y> z*T{^J1w(bIOEg6wjH^Ec`c%+BZS36`mzjo1G{DT%belb1W@M0g{Wn%Q(6yaC@e8vc z<+-cYuw7YSysD(eTPC$`HFkJiRyN#5DclF>HZ_n3~lf1Y1|HiJ9UB-kBo)EtZx@F{>CZLGXQw4#U=}~yFY|%X2^PZH?4o7`t770`2&!tJ? z8w;&WeV!rmk=m&-5_o?Np~JNG>sGa9DW$$o7^plyVK$#<qa5#irYqRR%-BGy$LD zU2tje0ELXL!jD>qOSitdMVX0MQJkx222tMzZIEft6tezHKDg+!{rCo zi-FDFT(zf))VbjgQ_p(zm~P;fHF(@-89$YIuA`x9w^t2#U?8!`uEWC?R}k6>ZZaH< zV9?kST&0G&aMth3^dhnD{3|}5Jo^&Bu6U{C(=Tl`hP|~?S3Kgip8HUi5P||XbtZw_ zXNB%ATEwN!cP>6tS9LphFCkcEBg{PkIH`2#{Dm8b%y~6KRkFC2?JjM|GAHn#;-E$y z--NHNRLN-MDCYpxuMgi`+fFT~Cnu(Pty8IA{hTbYeBfi{s`_S^ESLWPYm{R>r~_=c zP_669sTc_rN$HAfBCx^d98%)|DCj9L8?Ss6z00X6RPo&>nY69;kAn{#12<8A}A29D!23Ly|zL3Liam`xrfzAc?&h9x9!cE?|(Zs>%6WyBYt z9M%>0hi-K|OEk-ncOU?a8rst!xv{np$;z*9S`hjbyj!>X755%D3QrGQLUgFYNxDw{ z)niq#ZB`KzHr46{RnqhkVIfp}j;ES-M4N|j0gYk!x$~ptj|A4p2V)>Simi8L9;0e) zra2$NC<8x8yNVwV$02{XI#sUwUoQ3c{PnYtnn0ze^S5jRA`@(WLHFj+&XNzmdat0{4 z>~ek)nHyZV55kfM*R6EkCXPvTnUD>{bM*A6to$))XE2!@?gt~2TQet}6GrFnjAz=5 zjO4rz1RrH{Ba<%xj8{u@Z)pX&nn8>MjMijYGg-{*5S)Su_32$4R?3!w+9Fp2IW>)Q;p2BNnDUTw@`^4adKog241@BF z)Wv{fnxSEC)`3!2CvQyEmu$9GZU%s^IC*w&P> zd9ds!AdC@MpV>DSa<|xs`Ho1<0B88>GcB}G#sf{iA!}R1){SGPMGiLcpTyH6(u}vC zYPys(>w&aZ%77GS1P+3ZfN?%9v@57Vc60K+1$DO50c93geb7r(T7`mYXwk|}Pu=6C zWTumO19?w4Sl5K-wJVilA6UGOZxh=rZ;_sVO70OOm?Q8&O6F(qq8S$HWMMC_t#0Y? zJ-h)Nl6`9LbV5Z{%SQ~TBXwFSPKe8dwu!t|-V zhhcR|Je>i&=H-VXvAho=ZMe*sBRK}Td%Za|2wE56Mldthvn;$WmJ*kWO}o#|0jF@V z&lOCc*#%wl!D#Sk<5XAw7EywDaj<0|M0E+b_0MkCm0O0kkyPXPqYv;MQKfG^ByQk?=EXL-3WNdLjtY-M-k#xwT z&PidBTK*lDDfD<%M=Aj8P-`9@I;x$|k3mvt77wLBVGX%oxA$ncSmu0LD#@$crtWtg z-=%i2Fk4tQ5am~=;av6Sg_8Q=t_!y8=Zf92)6J9vF3d&;J*nI*aQF8TPvUlp<+eh{ zoSat1wP~b9q7+k=`^s{9)cVhdp}4p=F}LpxC8vhc;r86f<~}&hG{VO};cadmJ(?$R zhi{Z0;;#DM=t*YNKG3*0tOoEkq&k4PMl1(rHNPdIy|0jmX~sCECvdUGXtOW;B@d63 zG3#Bm`)1C3HvxM4)(Uu7+T8i--!SJnt+Q+9Ss0zZ@T7vrGvMPKH!}%bZYRBV4!{Bd z&!u2P;mdeuGRGk<4snxP0ybFJBk`som#7Y%F)N>zvwSU+Z6L-#BZ}3%V076*{_SRX zS;AV&x7Yk=9mLUCHKEDQ8n#(OL=9m0ZYN7krM>HBS8p$G@n?!i2%g?I19I-F?P+g- ztbh+nx`Pp@&nK-#CggR<$e=b0OIvse@{j}GkiK`&ey9wOYZ!0c!NzFy_rpl9h(A2nM8nzb8j45V>Th9*+D;+2PRDit>{ z8K%bjRD~cKE)b$|#_xKJ5|XGR@t`hDayZTj?@v;wIUt_-rEnR3@6BAtiCXT#1uM|S|~UH2g^b! zZ1aGoobnBv4n;5-CPo+>5l&YOyqua;A=BpKlgZk04FE9#$qRg-CY6;-m>+8DpN*^oV&ESA^JaRJK{lGP`QwNJ9fk;K_@dRFF;#k8oIzViynPC#0BH3u^f}f(xi&| z+T;a-MSOJt)qQ5cZmi6V*ktMc)pC9hcZ*lJS8OP5Gx*T81GwZ&U$N~>Z!E|@QIX#i zDIAjONbAiuG&_lINT~vNSg71_?ZqMaixG@_P)IAVQYi?fLyY=W0OW2$fk`B#MoNry z#WXKFv7CAua8-UsL)w5M^P?;j$O8_GPidGp%Y*f-Ikfw$jbUaoZB*%x;uW&dugVyZ zK`=i=6`T=;Pz6TKge&Vqy6_Z+KBK)c*+$*&7k6V$!?@U&EOXL{9f{kXDe1Ix zxiRaSNfkDdT|YW37al%nz%;vpxMDI-N??(Er78i(p`;E0-67-BhJ+-_3-0eyD`iTa z^%)Aykjsy)G3AVKCQxahCWi>;cOsHhEha}wjU-kWEC}_@FWO=b7tCFw-hd?o<>ceF zP`cD%wQnv{v>x?s*fNcT5uD^!FNrNyZ8BN$mfAU_JDT?QF-)7HZQ`sXoqJa|;cJMa z(bP1UBi6U0o+-}Q-AfO81WK|3uTc{CPT0k4z&;rFL??~H{ zz41vbyBly`X(G6QCRvmN-!(anB~shfy)jPA3h}eb+?*fEr;$)D*26P;)KX1vY@4Kz zF5cBnJx0;xE@!}{W;>c7`El(dBl%O1fHVE-X74sK>Oo$_QwPh`b?;8X8#KFEU}lj? zZcQZD7O)Jwh!6Wln+(uSGaSqK8de?4C_>Y-lT6#d%W>;U`BepZ-A2K2Wl^_-ibNYz zIn6YZ>xSwnsl88LC<~GSxlcUMW5CYtX@eoMdQ;d8WOblpQHwU-l;#_I(-liLbAYt& zbI(cukOeErrek4Jg!QNAY<)oYG{Gcta3oSiG$GSUM5+gI%|h$*ZqFu$WD~FlrSAS(?UJhibJt;!i~P&_jbi= z825eCfttwh+icU{vB=4-V$936Pc$KvbsO*OxDCS%>bz~J^u1MeX4->pJJgz_9(J7~ zzb6K#?U)COO?EK)e66s57ENdPPCRLC zk;XUEg(7j1s zw1;C}J!&Udq5z4XqT;kK?po5^&Lhvukyx;Og8uXEut=f5xm(CY(7bLkO7TFBcTMp+ zY8P)BuF|I;jcDKMS9ZWUpehD=u2V&|5%{V|m3~m!;=Kk%6I)9ZfD^RiBifyS#?iI^ z0PSg=1Yvd@9Cy$E0IIcTxkw{tC`LNsxjzar+v^umG7ZYZKK*N{yn$|Dbz)RLMF4Y? zYnM0k80}CxgUL~oQQPa6HrHZ1sIW2sVh>8v(qOjIM3F$j+>Dm2FBRO2i@2h}Q^z@? zz;^M^=0>c&7z14Y0F1wRqqatKTDDKOO}0VQCtA(%GM3ULEZhUr6j%xTF8I)4J9({j zZSr*at2e`>u8R-{09L9Y+^!ERKn>aDk`H=pir4`M)YXY|w>isqsMH**6U879BC-Gv z%qa5MbvYF0+nkCreQAIl&B6?jE0)##QT7>{-B2@%>OtD4-nnbP4?>!gUR_MSTAZ*n zCIm3+`ijCXWVZd#^sb9c)Du)d>xE;~Rz|O>!TpZWTgQ~g1P@Bh@KoqMP&`a;ELgNJ48Mwoy=-*+zfqay@z7e z)}^c31eKxrI3y2B-_dn5sau(tU@5>EsdWVs>GPLRMh*u|aa{L;hUU0VP6;ELO@)r5 zhh~yS+Letzh+NF^S->PK#(iqnh-PbT8b{A0VyO5o4C$V0;Ika$iV)G8u4+>18g!6P z3dJJU$A%&UM@Ggo+N$`<2)@LuiWRxZ_32uE89ru}8-3m}^{3F5Xzlj<)CkJ-sW}Wm zJW`R|RDjh74U>UY=D>}JT()smasBFuvY8Mbln&>gc(%q^Z{l|(uJ66;n(XwrnmY)a zc0(xQvb=1H_K^TM3@c|&<4b^(f>3NEe*qg`g7Z_BXn8OLH8o>($4lZs^*YY8GL!h64tr*H|u(Fg+`s z@MK$~mHFGe;-n6q=2f?|d6-}*CpF4i-D(=u+s_74-A*tETGjD{l8qKcLxImqq2WuW zT`?5IaHp@WP!j3d{EMs&I^{6k+}BK07}&;g&A=kKokGHU{dq1_6pdSxiteF*EJPRh zMhT#HIJ@my>cdz|S0$S~oL5}Mq_+nc1wK*eeQS{MFwco#+As@qU7T23WFxK(Asi07 zbE)Z?X@AP)7r;*zU}2>` zP?u7)CQ-`Z56ZT7usrmr?Cg@tEJT4aa&cA(a-%2oq##x->NC(%!s z8*)DJpa^c2jjW<2`IH=20T!jJUFr{G8x}jg2LinyDKRlUFl&R;5n}O_pElecnWmT; zO`%@JXXgE(jDT(;uXul2YtYb2yG&m$-&0#{z2R}x5%Td|9+G5-#!nE)RwSBt1Gl-l zOFI|2af||MiME>O#8*!y^Bh2&VDzq+#V@}^o)N+J?_9@(boX$u-nXq3Qw#WxHZgazL!@6;yb}V}XFoYrUC<$p8Q-L!LdT5ytpWR+?+MV33oH zE)U~fRpc*uXjL0);GNaUcw#*3cP=nKVf|~iDgh%rW12vDa^K#KcvU6!FK`y8O3yu9&410%wBt#xGSC?tXuX0K~;?9pal;VW4F3N7Yc z9@~y9XT%2@G^897w1DM&F{eG#fTb>wKO$H`m^Ly1V8)0<#+ipob z{*-kciqYx!GI)GUWn%ksDc%&lzc(!e=)qJRF|GY9BzhD9j#p<&v1_qWf*@D*$7(r* zaQ+~<)MeI|7KwyJ<8T$Hd!fM&jQ0yZ*$VE)d*ZKZ`ph=>322e4%=~BjxT<&7H@A9w zySCgZ$j7x%5Aar}E!~q_%*2Es0)HCluV-63DJEqHU^T<|9fUVB!e5~o&*NPei`rA8 zOd;!o$e<2;N`_ApUdiXmV}xe}cBwUF9vHiXLn})eJkoeV)@Reh#z_A6=UQ5ih0Xke zNp1*1*qT=zj)vWg_EAVqL#RJWlx0;%57$O$Qf#lfLGXg%@3H)0pRwacLJLn;QYPla!TZM zT0ywypS?;01vsIxp|e|yyH<=g);;UbZkqlLWNGlqNhj}SyVsO~uyn3n;?IbY@;@3A z5oxp;&9g{un4P%*8phMLOR4W$OW4_Cjpn<|0Up8z(1y7E2_kP2OvOQ9c&fd`T)pt* zw$|@)9my`gG5-Jxe}wg8sjQL8q!_Zi_r-Km$D2u1@R&8ncr+8KUXXM1wgn(M4Q_dD zbh#cBXL7vb^sZyWP)n*in}X4t9;DZ6dvKPPFD!sI7dbV{>9{f+f}uaN69QRpRIZnDw0^o<+$1a!u#Tz z*bWz4w$!xgjK*hl8ToyE4Q^n**l~*BtaX`uHYL-p zRhmP>F+Q~@3vFq4KCISoPVB03SQ_qh%TsM`v6%~yInQdu@Rg*Co2iCNlFORu)wYei zXEZP=-agGXeZwPdVfai5MCC>>NA<1yu6h3NRiI>7n3C3RdBt-c4U=W%z+ylQ*!tI2Kqqc87*<#IB$kZt z2?|(~iUe8LrV!|J5*L;0p8cyY!Z!;hma&HE)}y=8Z#57D$iV^oq|@}>3VkkJ!Lo$s zXrZvNt*GC{XBb&mA&+{2^j$ktgUk_tSalTbOG_H1x~OfeI#e*(-P%NBfy)J=<1#Mv zA){(BOAC?mmAh(u6SA{v|u=R}$-(98D4kK_mrvCtB-d)CHGvRT7L8oxBpW&twYg5Wd zET^B=x@}tGSag}B0B`3Ni)rDR>?SQ7y?G|LrMEL!c`}|z=iZj$Igbo7NtTd|kaLq% z{9O3;p3K}?rVlybRJJ=CRyPTEY-L_XY3_I+^sLVfMt!Q{ZK_T{u9n}zZqV(xnVmZV#;Ui4 z1UF&O?u;Ips^$^U+v*YBTfFRiwJLjb#d3ND+CPYX471Yh9t=68l>U_RAtmw20 zdsFg0-hFz|G-zKEntbfU9Oo6z_&QkNnpepKI5pDCW#(Ck!<=;MRin^ij4H?Sfyu=o zi{gmd>qd|x6W;=;_$px9d&I=3KswhzBaI>`=XfI(gL9%tcZ*3HHE-_w(R%?$#}{#Z zl_5sUXP$c2$A@43B@np-k<&GYCxR{}`Q@K+{{U%?ZD|@*x=`CBp`-K%r90>*YnB;S z1MhaJH-ucV&Uy-AQbz3OJq1MSN#>GbC;tFggw<`oFl_P-JzbOK>}Y%!2ACZG0E>{l zss#rllTfa?ANE96>aFHu9V@1uC~lA=jP|PVXtvNeWktyKrEn|S-F=%yc_vaBlZ@9f z;jKto>XST(N)j=}cK0^XOoAeysr0IgqglW*sBn28b49?Xs_JoEY4Wd3681%%nF@Y-e zC%tVHhDi);gJ|niZuB*fx0K#dJqV@*dX}LLyeV#*eAhV`=M}4D+iZhP!yFveO}2>~ z2XyXaamXars**I-T2OUjFieyhp1VzbixTpC=x*VD$hYOwD)1w5V1#iZH8p=?8 z?3zHkhVJy;gc3_rfl@GjUwQyQ8z-JA{zxmF;}sYLz;0p6S zPVekKFW#s4jd}yIw~6K3lY?A6lxF9|4RdvGlqBGhOb*U1UNc}NToQ}Q)=q_{%QmX| zoXddy0s2Hx=4(zFz$ad}}zJ*fds{tvau?9ivpIx&cm-3w@qiMxnh*ifjsCb=n5%297@N7tp*$ZWw&B zl1o;+z9EEKIaSM*Ju7DF-aF5hXqCRTQcW(_Hd13yaoUkA1%U*CP8K$5ftD4|txl>HLED}<6anYfQal>;myV8d*aH>Q-gt#gqsEZ2mDe3T zt6R!}-{yr+;Zi&n#N>*c^w2rkc{>;dt0?Io*!NwESCmv1!`^7TgF`ABAkpv4#dXl|uK$ zA&Luy0!V{n)_^%53hIxh+ZZmQe=WvTk9wC}oa?tR+u9>2Q^_^eeUjY90fjIR0E%>0 z@WqCXB~k1;(O@C8w`)sC;J{!MXX{+oiSK2)i|n!6mci?a>&k9?gMsNuwibP+HP5LO zSa&&n4^wI4OCpWA1{jgvx|pLrSS)hgkEKACP(?W_8ma4%-mDfON-4z%M+>ajPp9kS zP%31PBjpvdeXOMR0vmW;rIB{y9V?({qLD*Lp^v>rvA`SUMN&F(PhdRS+fKjJH2?}T zJdKveY}b7D?Jkln3w{WGwAMGnSL7CZ~KTB#hI~ z7~4SFdW??r#8-u~?~#F4K4O^dNKtdWNaM9G{jueb6o6tW$R?5SU1(Co-TWX$ouGebrAdSM9*0!%8 zlgUuSy%r0QNq-b}hEjyFOab^;DWc8xU1Cd_k%BQe;=6W&2TW`O6&bX(3Cv1K??77S zZT7goVwEFCVtO2Ou7ARJ32AdPY;WFl$ga(8ZNl>susx_2w(7Z#6+%1E7BlthY4sfz zNKtUdBv&=ztNFC3O`|}?hkSe2bfHNO{Rb5j+uJLvm{)_=jY7wtc%d)u$hi@*3)>%+ zZ1^@?*-$0GAdaD{uDF6bfDlBxF;K%CcJdWXxg)M9y9*ODMjs80&CoHf8^pRg>K-GH z%OC@em16GOR!wWoP5w%pgPtpEP10E|8t&nVcITR)v8QhW+FQjEwsxre>G?addeA`M zj`Y{bY<8p;BfFGGXEEEA+s$J5Vo*zfKm_!yO-WDobiSKU@~&^ew(^^clI(UbAbxa$ z#)pSg7#IQaw>7!2s)3x3O2_cA{{TWhqpfWKO8zte1_SV>$mQ5EJc?f^o`WW%D#~%e z9lE z*=*K}%;W-81w9BoY1l44GqjcLX&uK(iZaaEAPRhi5pqu_)YC{qc9l{^BED4m(s`yq zwHZ(2O$q@c)2$4586vRU!mL3v7{cQp)|-s(^rr#>;~z>cA(5c-aJ+iedz(W%xRJ7| zcok|eUQNVO$l)J>$)wQkKH3$EFsOJG<1W|Rij5A>otpxhE+Uc6*95IJB1bIzbQINA z4c4Apb~gY8FiL>21aazUvmVGBIp&nMR|cSawB3SN^QRf13znHjr!?#djto>c%tceU z)M19|HGVgJ(VD!IMk99Nhplj{clN&)VaWk{QqWB9mO$ya9As5|rs9k_9qGbFoma~_ zRTwxFvfSF*KxCDM1r{C0pupj>DN8nfQ`fH*h@L9a%)U`9tWR3lisC7w4ulmWAkkpC zAOv>K>T?hm-k>_2q+5ipGt#S1s9MCknqh|N%_f57{FxW64Ic0T?NwmEx0SZRDzPJ` zMObe$AQ9G!2yzdZj_$Qm{_NR8@)*l~Dt*fj?;Wtc@@l-g?wufbbLM*SLO^5L_^J!L zg|`Spob|1!&IVn1Zk5C7t!+1p0fY=>?E<^$vKc|?O@R2LD*Lm6L!7>QP!P5-c=V!1 z-ST3Ut^2;Cxr9EylMHKuV)?UA>g>+-dM+oxw)q z=}y8Qe=6F>@{EO1+No&z@@g_PE1c(?)#rHbA(cqTjYuQbxLqqzO*d7Q+!Z_e0os5) z0%UGZH!n<6RtQXa5P?}M;>#WTdFQT0YujEV(Fr3Ut5IMiSKzMP6Vjc+kC@RUh=^om z04U_vO#URaw`K(kXSkxkYNUfF2lS+sw+*<>P}B9BJyRkl`P1(y7_9`6OB@cAngS(l zn?YK6EOCx0Ukv>ya>YOttO64mQ@G)W-KuwT-T4Q}QI3GslOB5VMM!`)6b>og!$%)^ zuiWWi8@0h54Oq3-FRl>Iv3~3>K&qb*qTOnk020F|9jjBq5=SnWi???eHGKeNdi>Fa zmUuB9IX~U4TP;H0Q;nszJHY$d?MbOyz%=QLpj2mwbXvg7d`t-)l3Z#~GRU^SGh9EHU{HJxRwSzb?oDMbja_eiN|2?^k-=}@Th^XO_&RH(tpsHI{`jAohv zz~-D7D=RR_6vX;sm5<110A|Z>QH;`cJvsHK#Jh*hNL$KcLj0bzbpfxRlWF92rFP!I zm#1pRz3~;Tw5+I}W1hIG*1ji=oFs_R1MO8{IzptbN$E_IWP%5gh5`)ch~-znarxVE-3Tf`W#;PFXl20o?Zc?HHTlPH9OYp2omW2#t*MilXy<9su1ZF6kqSbWTq za(h>Grs?ol!l?=cR#4dHs#XH>{mc`{riLuo9DCG-7v?=GINvXTDgam9qk~G@O|zZY zY<_f0xr%^rDR37GdCdTFx4O;VnG;IrcI53irdoKC=K9~vNDBfv;;i`65&eq5FCgSp zo(h2%Mpk79CyKP}fUOscRvEmh;wUTM)%YT019!Spn42EMmmq@T+?rj4 zF4h=tT-7ZzT(P}vfq{{}=*>S-)a~^70hr*QUX)mOE-%W24zz&htz>_~Riu_Xt`rX9 zpnn%>$oNy0>_rv}odGIiATHWqASTus9cmkGN-Ovm$!xKyC6yvqW?z&qBi?|yk$K_; zO=cSijzjL?cIjIvxj-MNuQjv3i~bV{CzKMKum`6#=wEF|xATA}Z)yVNjAUSr1tghe z0Q41yKZ~p_oJBg2M;NQgs(JBwkjIq9O)$Bn7v&6k(?P>?SW@_=7^GNQB3S;Ft7$m7 zQ6b8x9+ZOP^#U7Am=3#Z3&Lxd?mc;}%b*_0P^Yo1p9!c~=Hu@gLqxtCSjD`XPaI~o zx8d19zz3~jczBsDTn+&uwb+#)W9dQ@3%UNwZ1b_eQCw^nnwGVxFo2b}=aF3(i6$|4 zer6}{EpomGn&l&ASjmjlAV}I5ucY2AS525m;F{TYl3Ny@4oM#``&G*8Iz{%SaRQ`mM6R zh*73rml&g{334=;ATI-vDO`XF>slTiyt=y6+`m1LwObk z&S}8ld(%d7f^+RiMsbeRSP4+EJk(|;X?Z+Tg8(QGxyBAKDFK14YDF%ivVi5=t!L`? zT8@bUf2ey}r5BS__+k0{!o5 z+_KTN8@a&~vs>q_Woxm;YpVISyg5HUE4$HdA$>M9g#5$}-&(7?2^THxM0SSU5=a~z z*Bb?x{{V!7MOGW~Fnzn%b(|nU)PtJg?8*NCgute17UQ|sMGx6y@{txhxiUs?yrz8f(z!i$z|GtZXjaQ)Jca${ z-WZe3aT6IN@u?sk!Hz4??b+HeC2U}I#Q=^2N4GY9F7l5XPX@grTr-2z*8%1O;_ zGL75w>sX#KCP}TNEPiIm{VS-p3f540M3mSDKb;^somSnnTj*rAW)L|UCc3L>gpi2? zlb*GM;;nE=C!oAyuC6KM@9Lm0dsPr?gJ#%CcZ6o<>T*Fz+)V@0-}oA7M#jH z_iktc-aH!$!@|hfahsGl)f7hH;85~K4F?x9gWWtX_heP%{)=6ziO@Ed1biMT*=ND z)`y9P-3`MLk_Qz-z(B5p&da%$jG4Nw;F5$lHO&GhT-gR*e`85}==Y$kepWI@Olp zhGhqg)}#)m2;>X*#{!cAa-c9YjM(KzKf_8}dSONlCU!0lQAlr|eCW>xCzq6XeKLfvuB(O0}CY$DuaAhE_l^~H2;Dy^J`P`gwR*{?X#o!7;s zEz200vcPofOe}WZA=Bj4tXep78G*(>3e51fmHnM=P4>{>9=?^WuWBu&=}k0bXZTds zCWmcvt}K^R&cH~&bx%P+j6Gg!Yflj@x@&C=esDc&yNY=~vleA1c>v#9(D5DM;RoZPC8cVg3@lz5DrCR=br#)brr**IEfB!GHTP~dY;A%`nc1C_RtJ63myuRh15ODg^2z!i0z3<9}s z^^4+kmVF`B27BUwDrhzlO{cB=sv2iG3V(*Qb$vPq(q3a4i2%-Vim%~K!$?j1y7o1x zt+K9-DI^9f(wG!HBX(!g3OCK=5HVBuhT7J98D(e&^&M)rgRRybJ(@yt#1s80--zX8 z(q>j4G3b4$9gJ@R!wYHhuFwYaT~KVv&q2VhL%_frNkKR}&MT~p9P)ZoVPaWuPZZT( z?)9L^oQ=6OtCehnk?B$)Ne5`pJ?U8lVOaCW6v-pp;fGptd7fS~*NO*Yp7CU*^fqEL z0W}we^(bS}5E6P|anRJBFqL7_e2{aJc>HS4gKGiMV;dBc&*N3lEM@EZr}l-TTUx7g zkVqZsZwYA9X;!S$t{KjGu7*2XOL%gTC?w?fqCvewt7M+ul#q%(Bo8KuC{CaX&hRsC z)8rd*wU0HcuF4ZbX6S1(!Az~DN6+}id`UwBr)R@0!B`-BC*zDI&T^17qxcL*+Ht<#4eDr zW#cuTbbUJAzSSvVBJd7tYRl)hQVNyrwDUk7cX6ZJ9}*iBQ?orWU96rL(-%!K1Od=w zXT5Ur6Bms#N!y>AyTC&RB=lZ$MaQATcur{})~B~8Q>V=j9ZF$DU}GFv;S%)$GT8dn0gj``=I3V$yS4zsQ9>!0R$NlqOb*kFk zX&SkT$xoFb$RpmEj+)BO9Y<7Ye6{kB;~w?Wph#272ml|-vvg}Ou~|m0cRP*DeJf4W z72L0kQe&|N(<0bR0^u5 zM=Krb06x?(Mt$z15QTz1@_J&d>E3_X)XFe>XVQ>qw$Oq$1|Z~Bm3InqxCenk20^IA zvgz_5K-mQC6^-G$29OgtDg$s2(z;wKrcZiEkVd~K0DUMBq_PGjcpWP?`pI=K-ku~+ zx!SbY{_U66n1Bw{0fqKmRmYO+`?J74)v0Grvjv9zZ9W*nM6PEl6Tp9Ih(cIN99K`Qqhgx z^dLErX9MXa?jj;@UgoH1`h~@f)2NM_H3W_;x_fvEg)xlN63W?kFpX5>A6jX#g{Q+2CT!j9^yLoA_M;2ik-RNnikKn}yCV z#1U#5tkJSSa zkF~_P3-4FH!}iHRxLhjZiqi~G_a3>Y5s=IXG@4*$>iSf7_NNEuL4~O7Zzr|1SRO8% z1B%vH<$hX?z-P!$tq2ThEn8H(KPzKzn3%A>?EM%R&iC+5ygSG*0%$bz~YpiHn7~Zt|AN3BH0LFPn&Kyu2RQG)a>;Jo;6U+ zc`aRknpEXR1w2n7aKzvbYA!pR)~RQz-$WvCx%L#A7L|Xc$+ftRx`ACzNi57s2BUT- z13Y%7A-52llrc&=ipxuRH1f*|oO@QZk_hnbaDRxJhwT=`nGEZ<(=;oANp$&dT_u|& zFJoFvqBT@h&ITzUoI8?(<;N7Bd|R8%kr(U5Qvo+i8v=PAl_4Tl864ALni*7um07!B z)0km~-nAn`&|!!t<@Bo8t0bckaZ)&Ak5fq3R`&9NJgSS1^fWUb_d}Odg;MeI6y;Z? zKTp#xY)_XF#6z`eoBJM#IR*CjX}^{gF<+Bg+ph7q5eIH55KI{m8B zNS#K<7(UhKFzNR;UL*S~V3acX$Vrffam6%(qaz2}g?A-MI0v;Mqn^FduC-NRGkm$^)bsx`^GllO= z^Bgu#d7uXXs-t-49Mmzd`bK|-q;efPXLy3z;(JpZJn!QbPe9V{^p_EJ zQOoeZjNs zQZXTapA>^*pB7hoi-_(ImkxO%x(MMmmZCU*Yz$_VWE&Ud1Mr|pgU5eL1aeneCH%Ut z+RzS8d9AW<1S|@!{kY@3YQF9c@6w`RRkNP74(BhY=(liQweB#)*HD18V92;)FikaC zv%#mZByxJt7ddN>4P4vmEq!N#=eBCrnWsti#+LCwe2#{?1a@DSJX07Q`Qrnglw2-i z>Ruv>&r(}PBj!IgY6%o;8tO7*%Ufv3ohjS=Kb>UwX>gM{Iq#23+mPnYVtQh+ zJTspOiElXIxxZf>wG5Y*puF|JSqfsvZHcA>-pBXa2Fkz&?Y#1pmR1Zb&X2tUe{AZ0jiYP1({-A9#}2X2acQbryb zPZ=F^MS+%tEw`4Y7GO9XDy!>O%HwkdWBe!DqLW>0vL@MOtic717wTI1+jyqKtb)}sp2@xs>S`Zl) zI{nDiUd~9cRNx<4>YR;=7p^jWtIu?qn&-vL=QzmXy$)7l=V%=Uc%guVZ3&)tQ-Y8( zF-!%B>56c06yvQI0o@emtwD1$!2y&E;B@t=!>bIi%{7RXb`gL%pblaDXppE40TMAF zDeqcVSNC_x=bLYn85PZVy4EXwVj0u`8yLlQntPb+;xS`mD8*MmF|Re*tRvpg7CW(w zR2p8rKBaPZKv(7?k4jG(%;QdE2ry21RqqNUDWS);aL1BQG_D51fPif{VM+!L>|pxU zYnkGN`t6x&aiaP5J!7**7J`kf$v(kmw#r7 zrWr8~!C$+rD4YFDGW{qEo9q_|2Q>Y=mkc

;P$X5!Ob2KwM;P&(e}L$}{IDJPPNf@htJ%M5}Dvucbdu z)+f4`%6J)2p0qRu{^pcpvedDW7{~yVP|Ye@!@as=HHS96E!Dw}!Vx2X4>Zsn7-Cy2 zDht+{I~kr341i<Y-;ycS5hny zFo_S}6w%^qp>U9kX4*~(H0%dYw3W#m(gMeVc&97yob>>jdVn_*)3pFFGJ}lbg2+#; zDL}-s@G2%b;0$BEAQnxS>x$&{oofF8OYt+E<6A+Sm5UT3C5Eys%*Sc7?Cx{j6U5=hZN(&Hf)oYHIw2qT>5+L+ky#dDV0 z`)X53911~ylDQbJKUmgp zwCuaW*d&2Y!DF-t$%3i~`qJ(!R22j9u1`zUH9bbzWB{h_l}u||j5?sTWN9*S)1?gs zj@{RtqzoDhB8`~lqL0juC26y~fO+jf3!UBSY$4Ku7b+>dGGiRnyN8y*98(aIa^J&6 zfO0yjFkzZvFlQvM3(}<7xUn2me8vdR-k=KFjfuU0pp}=70IxUHW7Kr(w~ivtgy)l9 zpA(Zh0DBtBHnB;n&eCA3ag0;A6+9`ewaN(O3%z(Cb*K1_$&4*Lavz-I1F^1N`Z>HO zto@}Fn4P)&O?DSoQQc_~$r}c9f>-NLa2G++g{7jIq%7y0^sR;%U_)dYhSdK6qDG{4 z>r<%DUV@PBH_X|BMn-Fw@e~Hh^yQ|Vhp0R7_dY1r~uMsa{J0Q8}c%HEYM1qE1h$)yUUa4J5FnvfhQ z{_lD$0J}!u2Q=cl1_A3v0Nh7<7YBCg0B9jWrYqt26cz>WdQ-5fNduYyc|yY^kH)K$ z8Xja&+3B9N%Zqs~V=A&0z^*upi*0^59#$kjJkzipzTmC{z7*0rhI}l_2Wp1)-L4_p zr{>v_Ty~8;(D5O(mPR0-%8LQrpu{6^1h0Bjl~~}FIPFnQ1d_neqhbAPgVe9Dbp1@) zhhofd4Hg}bL3verGLOcECwAb#gXvu4T2=Jc={dS!Ffy1G9)+yCYENS#lh+67Kv?Or z7dv}(rkT+W8L^sk0Eq6#_;Xyc-oCM@y|jNKMsP^yum1q5kXX~zZ0)A8oy5vX?V85$ zIare6dX;02Y5LZUacyff&`jH79E|le&jQA;1G}EbDtnrwBduHxhiM}@rSsH2*K|LP zV)%bb>P zKiWDju(%I87QyzQOzu%auyN4Tgm>&|h(FQeVtHi*k4jViuZHPJLzL}oicNu>wF=o% z2*oifk1X?oM_T9ZwZiwp+TC|!sUNKX&VaJWpkwaRZ41+i z=Z3pAmDyN6FUA1^$SLji_B z&5+6f_od#4_|zY*aGI6f<%YPh#?9rEk6PB$EvK~8{@cBsh|VY-j+uZ9oPtlK0y023 ztWOVKTwcHo;DS2lwWpn8iz_PSduD;6a}ZIIX(D9YMk<_oovezgWCi<-)wS}<@9COC zAelw%PW?39HSP$> zUe(R%3w5i%+J59DkC*VO1Xa`uSZncl5@kzr0qI?GZ=NM^Gk`N(ZmVKp@eEM;o0y#7 zb6uQs2t2q+!{gW5fH`j%X~H;u)f;mB5m!7bqsJbcw-*?8a0uLK-Yioto}rHb=CrgW zX40Yxc-x9P1&(vXR_SA{TRbhbNf`k9*JW(Ve5MP*9e)bsJa3h}w!sWR99LIv#dO#= ze7Rnqg&hLNFRx!c*0~jule0XJ%DT&IOM81ow+IGPlU!88Z;FFBI~lr~?nGzhCBYcU zKG>v!#|LKz*!)_+bCaA`cH?sIUJDB1Qe=M`u~0UzaBH_MxG~Qd98knD2Ew@+R_jfX z7(dE*J*ri0%ZySm3Ml}KkhrA-aVOf3lqfXxKQYHlP&*t~j>gA?ZO9no-mTfqs6}N0 z#EeM*{RKtiS6{c=ZpRp|mIqe0fq($A0r*t~jyuIN-TjS3>Oo=+bXp@SXp!vW0A$q< z8HSR}01TXBuK0ZeX)vRG{8AAnqozr!*qD+{g}c^1g<_f+kj*%hW3Q!ZYubs@^od^} zvkU=QJ{Pq&@Okr>{ou(Ac%^1L85-lqCa(#%8%wak9A}#EB8_FSjb9ny9QWe5j}nOO zb?8_Q7aZ49W2wb(u|pXJh~}7%Ys5NCRyxFYOOGU;N4<3rC9K+Dkz^$SGH^cW+>g=lfwyR(ROe}Qzb+?hH#6SvKxnB^tI`kfC`A4teU94rd2>$?tVz@sM z#rE$LLlT@SoDx3@o}x7duWfm9wrLp70A|H>ky^)XZkSd2*C(uLCr`IY;6J?MCbhJU zRc|fQCOm)hkTQb8mBPbg%K|zIOl^L&;tT!LflUZh5^@53*d~^+4Kv^pkel$ zj(7%-2%K0ZamQm_0Ax@}b=%H9v>>s`XxfZAefsIMMg+OW^Ic@|v%=65lFN|C(ANWX z0o1%%8{2|W4j6&&UCyk{9+M!8IaI;N(wJDv(_ymGnf6E;Oc2UB>sY=qoXqz75U6gI zCxj6vd8C>`WK+?qFB#50*$i>6I%E!Z(*v*4_a>DSXK~sp4RcL8rk>ys9~sH0v^_;G zE#QJNl8b{{-^2p|0r#cU4l}~qsI~KK=Nk+o9QUoQ5(9gECHVji*dF!G_=`ul{?=I_ z;auYj{cEq%ZB2!WKu$?eO*X>i*_gW#o&lzn7y}&Dd+V`bZu2)GMnJ6nAH*=~@)*LD zbu@%)t{Cknr9XatOmR%|)n(i{H1avfI5dD&BoaGRGLlIE)ADz5#W!#}^VWb8IN5nE zoYs5{tFAhZhOe~n+Qej$!mpvOUOiqRt~0sHo(3o#jeisAU)s8BC^_A^RK=T(^m|m6BMlpj;3~BAx6bsDQB3p<*!1GgA4efGHR~%|&M0 ztf5?-?EvPnyiushrpA&YrNMPVE+KK zisigdadoNQt-8YN8lIp~I}zyGY})>+_Y<>ud-IdhyY^(YuscT)j-N`()2`stG`Qke zFmN|xu4)Va01_hGz93_eM@ngklTFo*rEwz+ou?SBn3&4MX9{bL@QkwkqEqFSRv`5H z*2cA~ohAUv3EX(Vp|RN9KP;OYkwlI1;drWgO~};k7H|q+a!pXb@g1$Eplvp>Y=8|R z8>&mgwN4pns>kLBhV`i7Cu+*0hX9I|Ri0hPjkEy@oH^agcBw(Y&NEGPR*`VHJTol6a0O(OY7-r+NmC`W7-HARANzfsXaY>CyRqCz#}5lZxu%y+^fK z+Z#aSFVeWkXLa!t%u$4Sopt1_G|Peq&9j4Cmx3G{tDWQK-PHay*PLBx?i2Wi z7P&n-+4MbCg6Y$Su;Zc#Bn0rb!GWw(-$<=CV8) zaxEcbmm*0zWO~&AzBZObzqE{#u#uYRV2a>cM!}8>@CVYWc#}n&Q&_H5vE^X&>sppK z(0zs=6y*li9`pf+XQEs~t}Wz}9k1J^bQeP(ms)|Yyz7KTLI!%&+N8~I78GPM^{H&6 zbDkJoy5#OaJDR%LRV0)%AS^m&xeXR?u<8#ZsX006T~v1qayKaNMa0oOm}tN)v?<0Z zT_cSL%z32(V^^CFPSDm%mpB0OZ ztRfr}itdu;DdAaEkT|5m$1~z6v*Ige0|=+{>0Mmu9mSwlOn{=e&3jPuHE3N?ilIFR zu&$!U{Vr`)fH}r6MJ|IROLX!|A@bYQRy5ukmPt#s(-3*aaa*yFOB_>%C5Yhi4FGfY z-V|tVMBaHjed~A2+PgP$JJhJ<6;~KOv@~W;b3lsMaqY2^MQx-C$?&1bpC^J3HLIvZ z&0{QKzGGRQ7+)e81Fy^&kF5hjcxQ<206)Yy{Oet%B$ZLcV|Z+ui9=n3NJaX1YK}o49nT0aDn&+tz@&#NYT^Q@EJk z34wBQHl9Uj==xpVvlqFMz)Y^1cb~<{* z<1D>#TPrw}?J5ta6xSraK*o6KNG@`Ej)#A!T`l7@FxXXd#V7$- zngB$MumGNFIh4i=1D|T2B?B?!R7%B(Gz}cKr=s2J*C{Y#@}2>$MuPPgIMf1FK<2g7 z{OjvLEF>p1#&Z|iR->rl91M2FUDEXH>m>^(Dl281o=!f3g6)hek|`otQvSvbLfgua zZqHCfVcTdrg|zOG$+jlwGupamxP}!5MgaRBY4OOeyTK5f;zZlGZUCo9p;G{2q+k(p zI@D+89MNF7Ml!rpwiDiwSSLzTx=sZGA(lPrM(%4eeI@PzStQ*bp{-9oD5UbsjmDNk zxOBiB=xBE`V$mMmcE=$_K9s-M(jGq0*v@NVFz6RN_NEZQh&<32D%$DLS)f>y7yc%z zW*yNO&wjM@jYrH54L=_tVshQ71{O^opn$-KhGgM;- zCpZF_T%)Av0>dnKa(UZWI_|e~r|J*3GV!0f7qxYwVcR)A^%Gj!-8T6lQp35T;xY8Y zJ@PH&igHKYBDS`b+E3+D#)}r!i~t8=Opu>3d*+LQ4fJU(l%8PE9X)Fk!}?i<<*pEI z0lra+=pA_4#~}8lR1qjx@S>0pXz=_T(;p#*Y0AY|FTXedQ$(49K=Ab$?ra)v|j;9r(2m^u*HHPK}f!tt)L}e8G zql{AoDx+%v!>~0wum}S6q(jC?%_bpAh`=Krz*Re&Xm3L-(S!A?n8z$~Jt?E-la7=i zA-1%N7`&+P5OxBkXrqyaB3?R@DM%{Dl~1h$xWfzug6sr(Qzo*taj?R>YH}3v2Q=M} zyC3en_JVJ*qpMIvd1Tr9kSv&0HXkML&-xjTp>VM;|+M=9&?s9wS5;!l=bJ_mV#3AOTE*Up55Y{9P+M zS-*WLcK}RaWa5hftg1|zYz@8X@+eiwJQ~E(b;vbTWrsV*->tNKMS^pl)K~^8p&OLs zp48imNG>BjVuMN)hbK7AN_PeIpm!*LXIllv&{xu>{?D*z)kH`e*A*`22W|k(NLLZ$ zU{Dtm%ZMpJK2R}LpH8)L^INNT>6)^wlsOpprmLK=CyD~(X#!)*3Gy(;F+`SDhXcw3 z98{wq5>FI><+6LwA*iboDn@u-)XA-&n11m_Te+zlA;x-Br1?}DKv9oMfm?{xkoC<2 zO|?sbBC3W{k%7{!uPc*IR1Bh+2xD0z+rKN^Qw5x0HWX9#m1f(`CiWZ=Oaw$#IM@P? z^-A$tQ-&E{)gHa7u9>C0%z3KXHT=4cnH=m7Cya_s4KPGjlVFSnKX~G{ZSB@LfFh|x zhwY$&gIdm@Au4`qNe!|o1_uM??M(#idN{rdbO|)UT~+ z6%n1Gcmo&}GZM>{Y*Rw9E zt8v2`M5w3&4wWh@;DSFoU7<#CKwN=rEgY73l%INdw}>fJK$!HWFdIX3 z+f8}VA~HV;o#~AM1x5j;sue#c1F5Y2CskcWNw$s3Y+>-`Or4nZe{5b_1daN*)PsYH$G;kPlL&}KmcIiMGiz#8ZBWqGI+xJvgKNIS9 zXzg*0i^wM&)9m$WZ;4%?Fg-;(4(8ZpC$3MWJm-T@C}XtyRH2-(40xm$6p}f{YQCj( zwwiR8Kme=Or;vqQ_w8KPyqbiTa+e`3`Q4gn>KmNGwxz7xOD(f8LC;$0d@Xx)u(-Zr zRaXEJ-m^R%Z+6nTSlB{vHy($rb?;#x*?g;TbDx_O*o$IcF%+&kXRQl>a#?>m;We#K zQL)rM$8RP}V`yGTrN3QT$4&cOvTSpLs(PAs1G_9Y?kWK22s9QE#8Lb7tWOW!U0&Iv z+>9nNSdNtztEo*$>w1mLMy}g8 z5xSUY!zmf*nvtR@mMI3w03+VG_|>V1Cv{N?32Xt8*_#yADwdgx0rlE z3{Yj0DC8@51EQS0se( zAcGhft|w2mC&iK}kdcC%u9eWn$Wer<>AQY_Gi-0}h|lJQ8qvyvwV zYAHPaReBo%f2X9WDK1x!n-x|Ad|brR;bdHTW{0?pF<&$&#~k;sKDCl~^|NU-rEquv z=DK}PObcXWj$$MOAmq_tH#e-&m5xBz>qyb8Q0{Y)-m`QIStGDA%1@gq$OpDR{dJw< zeOg2@*~EW%?TiYLHWyW~3{|BZaf+}fj!YH7-O~oSbkNbQ73D4GG0yDts@@*IkZST; z%O+7W6pm?*$7-OC`1h*vYF5_L1)gA}^fjO24PA8m5<&UTLF-vI`daE5L7wVDvarg6 zaYc}ho*R_9`H{g~^{FMDAx3E=!iwVbYuW5I5oGRKBhwt$S$k&{)th9VMsuE&>^lnD z#-HVn-U8h^(_2}x-V#Z6vFTh+mtyx?yTQDe6}wjcyQ4rf_L4vKhzZ@3OJN-ZQ^z>W zL=o##7hSBq>y+?Z^G#*@!cRaeq`=-!T$%uMBQD;VsU&O+FIp4`##fBfNC%zRIiv-7 zFQb7^o6ST0v1|b#l}f_#OtRRB#f3g~)@Ky5bV8-@yj*0WEEtk&o3&c#XN zcfB4Tx)=INPC@B{4RgLR)0Qi!8XSD=2?MWMb_23YxJ(Nn8Roc{m~ zKGF!=Ooll?`G@1uxNTm?#6nG;=EO1Y}%|L04&Y(3TO_Z&i>ls!V?KBRX{$}YIdu8r%JE$40NK`Op4aV zHID$EaZ^a5D+#wgFqFXKJTY??n{h9hj-Ubg*G{_Kfpv_QR?TvL8nyd=qbo2tje*GT zTmB-lv`sPYfMk(41Yl%P2KqnR3c4^ccB*=m_b^49W0Ra#cZ054^G7cEz+wO-R=l%8 zZ3mk<`9F!hDFBx8N^RBVA3iGJksdHH^HwtWhfHGRNyoVBOAfJbbo*lC9mN1>-Q1;( zshU{;MfR*!@jaUmz%WvAoK`1^HG?hSwA=(a8?#pLPMUl^A%RyRcxBIAQv<5Eyo%}t zXzHwpZzRo^)zV zM2r*Ou`g!P^*dpS6uv%O@rv2eVMw&`3Bw+|dQb;5pa%%U4HCX4;;e}%= zfZ%b~j~H7a(?e_pw~n=~qG|T_np_4X11b(bx@k5A#s}>nvSZNImjr-2Qwu9F&+yWR z$-p##dSodXz^3dZl3JWsaORo->eK+d9n1zX-l1pm6v*S`^{Ml{aJ~CiKjQ1TEiBR$ zz}$U)ln%tt;tPK?qHtHeXxm-eUO-(XRz1aK={kLpu#QWB33cZ+k7IEimb~_gPR2O` zn2yKHiaSm6w$&NMWPid#XlC-$=l9KC)omK@NRl|RuET;W2g907dU%oVawa2?S2(9& zHf=SVOPRKA0H1!9q^zZ|22^*iIoBmiU2RR7z+wp)#drE_j`k4}2P!i~fMmC@+Y%*z zpQsgCb*Kv;JQYFSuyvXIond9T$c=agtX=AwJrm zvFlj=8x8gb9rIf-Gl=ompGpCc>WC9ela0(2{{SlG{2`^rZY8>qVTm8sx~)K!u#~SO z2Q`o3!ynn4ZvE*$H|JCXFMKHl-SD~&2R)7}C&k?d{w6X zs@WbqmRA}2PywRfn6#uQq_|#d4K(dU_=Ru$t*M^1)oDuzvq;wf;0Dbl)#Cl7Ah&K0 z-Xf6ErV18vC zYC(eSfxziW0M@}cHJ#!S=4g(f;~A|9hs(ubc%tyZrR+rv?Zzk?7s7#}(!ythTWG>L zFf)VSHO%-@?ERIXoB&D4BeisQGKeB9fMGkD7+B=4pjmug8-l^JU2WZz7mBMd%m5e_ z!5i{?P-ajzbQRv)GRqKjVS+iqr_d}{)YU9>DTEowPL<7gDU60`8#!hje;Vs9?Urj< zQ2fe4<2B3ZL;EiFM3e~QEJ)2tVPmS2KQ=c*oM6`@pdTy5b40u#HPt?$X%)M>Ob+01 zgS}zsT3n+3OZVYi{JE!bn;O%3dR+J&16B`%3pI?5gVc~~W5hF*)1`?Qb2v4N;YsGR zv@pzs0(xV%Xt=Ci@ml`?#E|6m9MrxRL`@ksjyC4Ayh%01-Lpe)8DM*2wEQq6ios%? zN|hXgO)#-n#`1Y~aOac%0P3whD4*<$e!q6GyjEwv#k^=pRs?ZdI#bH_v4;dl8h}PA zwiYy^9OkBJ20$Y?s8zr}AnQ+36|#BFN*Xcs8UFy{WfEhdBns#3*;~eJ2;^5qsD)ib zOj9bL{J)KIkwbhuLH6Gyj(+#GJJ?L`WQhHiaCr_ZhwzlMCa-fEf-vXiu9|&W{>$Y= zhkFiqrf6Dc*mKjV=+w=kk)f-Rh@3g-COUC ze|U!~ed(HZqSm&#yWN!Mr>#&GA4KwXCA*!0+(zuzOp^~Sh#C1ftQPxDvv2?eTjwJq z6}fE)LL<(0t}{u2%Xny!;yaz)82q^z$6D#$>J)D(R|WIH_O5KCx^B5Wz=v{n0-9kW>)Cb71~Z1-(^;=38)j(A!oeZht?TrIbU=a0mt z&>tmEe_Eg`>biZ-oqU(dK*u>e*0r7O#;bE}8-QXxaa{(tW-oN+x7rJ0vpg%NNnnlV zE_fIQf!OHGTN`L$kfQ>;_Vy_cj6o#*?l*L<{{SSm;rH{w_N+}$NLe){yNu!2rASz~ zY#My47X9EHuN6+uOtjOlSVsAlL(buvu`Z!=3JtLx;A1|t`%5NyR`%oX9&mWYF`U#coZfG`8_!@wrAZQfqoZzGS)13g;i4K^CtyvTT+D#W+)rw8deT`c0;p zbS0KwpSDeDY8(FmvSnc06*%MCvtzQl)h?FeRr2HPm3L8TR@vf>H-a|elVdRa6xmt# z^Oo=U*4DnG`zA~dD-TAo)O6dHK^Q8>cRjOP7vF4}7Kzg;!=lo-tU=)Y-`P(g#&-|~ zD{ci=+)rHA9)|_pq-_$$%8YVyD}5qRzUQc?aStOr140FJf_WXN3x#04O(LmA&q8Sd zfvLr1sa#8Gcn${%f@++85Q-HhDF|$5KgzA$=@ZGQ8NtZTONZj8Hiij4;Gh`>lCAxd5Q`iE zSw1g_-07m+f2?NtaB9u6U)kaa(|ilkq)Q2JCtHh>aUTI`Tr649ZJOUph9WVsIT)^M z#5 z!G?PJR*V;Vq;d0a+Zn8Bv^(~_OO{eYHtc#(7CTk|ZBxj=#w(A#P<&Vwxf_NBbymVx zh9KiE2VY9a)U?O`(M!k%_Z?^ve^JzPcje` zVzl)uf3)dMX%UZ6xmfy)wv?!$Q>!% z4D`@+-G_tEwOE5owSYK@amN`IIE!h|Kb=Y!lr7O|0p_Dm&x%=Yc8JO2eRk`kS!@xN z!hxLjrs{ek-pscMK#@9BNHrEF7eZH{G+YUyhR)tkCfYE#;GA`=-xO*STBK_e?JvV% z*1R@C0%UBL?lV;NeI`9pH1ibh9Wg^-M{A~r(oB;xWUg{gwQ@QW!w-o{d7mPa&syta zvcG87(U^I7#&g=MKZN6gQ1Ox&{o_qaz-zty1sumNTENG6Mkl)Ou>Hj!i=APdRD`&4>8jF(o+CCsFm2Iks*YJG1-O>L+N7BB}YRfYbAQkD=Sg(MZ78J$0P7_jGDN*4EA@AcW)+3 zHgHW^W2xLngj--$cX4vTKX?G*W+!M&nY-E4}^G#^T`Ll{(MYOEE zRMINT5M6+S&T2Q50f4zQ=*eN6;(#-y(t@_+lVLq^RxNa>VqL)H^T{TscUOEKHq)>I zouuZF?lS38OLH0HBN?hT+7-RFWkLk4-zKlNb}mLuChskB+@9Xl1@5o_dlW(AAime3>)?Mb{kWi;SOe$Q`Prnq9P#nI!wirYgkB6@w|~xTvPMTWGx5 z4+pg&Ty#(*3$`@cx#^Cz4aT1h({7P@H8gTFByuZcH$hP9w^tT%86ZvkWQ(T$bzFsodB>E2))3W~~_m9o+z>EEs=U2Xd{pn+3QSP(bFa%8NR*ZH=S0Ddh^N zV%ek)GPoHu17V#u!%3NT2RE>byW0C1d8wZY*!s8E^k{k?*j%x^S zNAJ+DxD{!Xu>>Ay-;uO%eQ8)OW-o`Wx9(|Js`Li65-_od@$xT9MccH4$)yqvrB6yM z7b2S3U4u3meJQJJ7;VHT1E8xB{HG$Llr)XjkX%y~VlK&J+S_ zzLThZz9w)mGDp^)$Szv)lXl{uk?TfOL{SrB`g+ugLV(Ad(w0~4M&WWeRH~4A8kChz z-Fc?`*vD#c$sac~Ah{d)a*??~rC8AiDltxE??KC;0QBuc3y}FpA9lfyrC8mxU~n-} z^SB`&c9fj9C_(^K0uOp)TE}p5$}qI{QIC36EETa-0;DmctG_b2jl0l`7HlYeY;-gZYTN32^RC76o12ScTjP0VpTU10{t;wWT8;QWk z_N+Z4S$$IOL}<1ux>5^@0{MZM1B!H*`^qtzVPM~MaYpQnFvT#qo7-z-0di>eA@v8aralCj0);>ox&l2-2j^Ua(xrvTHv`ZNFG+rkIYYAmBU%;vtRhN z;@`Cq&38{H%BLGh7|*RX1$TI&$$0=Hj!jAzDhUGvkZY9jgc3n+vd1Y#Cn`a$Uk+c% zbEihr1ClYHTu?O4gl=#t5R)MQ;-iiC7TO5G>S>Pbvhuk1phbsLuaJ7vMn*}c40aMu zX*X_8MJo>D6rOme9m+x7pK59`P*3-%3pRP@GzG!km!7!oQ!8(Wb}{WuQV?YP+3iTj za-D+|1;xlJe6h5SGfh$DfyXDUA~6RU0Mf_{0n&jES&;@9s9$kTNuu+AcPh4f3>u-R zY5xG)7EKDv<+udyu0z9D5=XDSsgRJQ4ox+v9rKgHJktpzalofDwn@M~^%SgdA00bV zXa)%|O+jvm<$Ya?MOp5<#IaHfo6<`Jvvjs0dNH{CP^6sZ8S8-Wu1;k1KOlry(zn2b~lVs zv~J*x{b@8ITVg&y#UnFq>+^P_%iP^X31i@U=!AW9UQBI6@VkIXn6qt0G5mS z)>fgXywI71r3`(6`_+lzlP!rnNOnO};E*GZM2 z6G=N6B*A6$p|RN4H!+xZM!}i8QY*${%jY%C>SOyN{we&zAtwi(_0mG=bppwd6@cdy z2#DX>#@O>hmGz_hM$$jt8HdeW&x-WXYZ}gyu*+ir(%a|{E{JC`HsU^2CYl4OhIp<< z^0j&bc>BkGoz z8;Q$yHNxrE6Ww^OSj(NN$9KOq)%cFdMv%rlDG`yFBsRp%SoFJu^Vk9wRu|+|m?b@{RziaBCJ|kkY0X->q0%`0iN! zos{v~fUz`^EHP!+1;={M8r_5?kjOmD zPHEUjK#r4OB%y;0=hCJKB7i)u6<6;QTtA1kDN|RP&z4ZYDfZ^K{6`(d#+&5C*mnFW z0czu2uz^Y6za51-&sDd(Ia7u`0j_()nocdh(-#f98GiLj@jqJyYL=yRw=stfIUs{hz-9Q$R|%&)5oda^1mdLd zmG1pG4VceUQ+TUSiS*w*0Hh9{^(Tg{(hV&zxg_R>I~z(5ew6HYr!ZZhsllWGgwE=l z*eoDyoKuxczC9_SKZrLpq_T8xtrrUwwJk*~V0Umfr|Vc&z9P80iKK$qkc8lhxvy!> zso42OO@tn_nplfR)6&^Uk-MB{HA#huY<1|aomN!YDd4H%wJyJR0h&HobQQtc$}W6t z9Aq!2O7EmxzE48DP{eZ=ekqdDeX~J;-RjC}mv_YZ7UfqN&#hy4vJob&ZvqS}Fwf^* zm8=PEX$%OU6<&WT0L{|1f40nRXC7RD;|INJu-Xh~pL*giOI!H1He8IiIIiK@Ru*h< z6dFKf-f9u)(X-%4f4fv<@hpbT$jMrGK%yLIPtBmlFDStd5VOJy%#=Aoz;|Jv;lMt*64oyJox2H8P z%H0lWgMxi20U=*5-H98w4wcK_c$!Ttm6ig@o=tToMG1^&jMo|CbytZLs2hmwRDiI) zCYt#PwzpsqXR)Sfz9oB^*h~tjI4Vba-qEdLw$WfnqfpMHCv9?GA+bv>W(PsEv*h67 zi;l-}8>?I8cxL6RBT?2xq~Zt;>6^7{Yy#F2qX3}Et`a2Q<4v!Y9foN!8h44WNXse` zJKzCY8cwq$_a?&Rd2XYIJ?nJ<5_=CTe$&7^<$5vb+sze*T@tL;o_OK=yZARH7kC@qQ@g>Aiu zdalaSZ6}Si;&KA#CV|+TkOpd|p>SZeX_NSB#~X0fLs*69)806Epe$y>x7V>7fcrqn zT6UYQ+%?aUBrTqq{tzJ7=vD5 z)7-)0hw?!(ZaoEhoKlj^0Of(MA5DZu;>lT%7bmR?K(VlHwHWOT%%xB+NX1K`>gQ8N zjg*Is<29pp;OWyT7~uZ^D&{;E%$HMrXklZmaLlBr#~A!;nU7YU9c6U+1{|D|j-tA8 zxxo+9c13ZQZXd>|Pw<*UM`bC=*f=3_O?mH%Qt}JPmS!>u91+0aX1x<=GLnAjO5?nA zcHP^s9n@1qvtLBBm2Hq*w&34%9>T0^vB-4Ch9E#AwM(Zq`$!yvl>kDILJo$}Vx9O?pBjd1IfLeznPXMT1=2?Z6=M`qyHmS;B?{clyx4UQX)N(1|`BhtvuH!|^otb^y$-NKZ~j})7yca9(JmdOQ;uuAwr0D9COigA z;<+yxF?nr^E(pgb@UE)Bm9T-A`+youMlXpqXR&CYjfxov2B){v?%vPs2{~d$IDu!1;H8bO~?QdO&th52YNxBq=Sr9fiIfTfO}Ux z;w!t`6#HZfOhA0<1#Xrt9t}r(i;D>$AU5S73TO;H0`_fE)!%Rpw~fabtZiRh)O6dy z3k+o7u&3x(Cr#B_!f%k4$m6J~JXohuW>}Ll#5Xe!N?>m3%Xc-8pDcqcxf!ezb*Rax z`AFr4?2tVw_l5O^eIfqQfa#SA)o(B-<9;xS=D zS6I|nSc=Z!@=>tZTFQn^UqrcZsLc>O;;&e1ab4=Li@=hO^}MJNH}cQDm*o*v0^W{B#;5AVPmh7RpnMi2kI%21|;Rb8su#JF{nj; zB%1A=K^$(b#S|<`JE*}qpe$$WA(F;iw-r;vC;bqwQfl6`Nz+DPmoQM;N3Q z8R6%}ie$sBzMfSENd(ppg-hF9%p{D3Y;pO}G;M0JhtcK9z#S?L1gq&-$ILkg=~3%EdTtfa1zhc8$E9U!+H|^wvZQB}ITQhBd~xY<7W;t)SJs=S+s6t#yRuyI z>?)Eq#IZ*Vkr04wJawz(970k)S%v`grZjVULJ{I=-3aPyds&Iji*Tg;$C|;k({FU` zZRL=cL(c=PZeE!uv?vgr;f5((49^FkTNc`S5t`b)vt3F78xlKYRyT*NZnWX$%m~X8 zMRaVyw$LyIJB=8h@QYfaZ4)_a($lnf?1*G?bHT`~n{o%Yy#-D>;*gobc*@zO@dda! z2*jSAn69SVOWkaWWIIUtuzji8o}MniU;&U0rn9Z?uWhAkXNZt~=@eeVE=Q$X*xW3L zph!x@OhB9LyH?XVsUv8eWz9NIQn{-nA`le#K?vgSmjJxh&@VNU8n1YqfznQb*%m zSRzGIgl7Xai9d&0>hxX9Ap{?mwV|{Tpiv<$j8F$7sYw)`C`<$LHVLlIRTA2=;A6}F zm7LxmiRbgl86Caq#k4acpE0=T2ekll-WiL_*C!Zk0y}+cuDja}q|-6l06ZS`PU}l$ zB3n!(+2oG(6#9ML5K+#j4|S4_V;mCh?F z^F~X_H%jDSq1E=9!zltPD^@u}~0B+UO!(w5LcDK;gYn>J=sl<|u zk=~b4qWmr9TSS4nD8+J@RtC$&qU?jP^flALZeW+?ZQNjcQ|Gl892mj(G|6L9;w2(Y z{{VGzL9S`6hOOcudk`WdI3l+$tQJj*vXI00MO=;rh$6{w74+vfuw zwJ_R7HV>_Fz97^ttS=Gb2g)2`x*aO@rm#sE{LVU33l^qdyNY5a*UddkGv$vIr1OF@ zD7e9wCnB>onV#CrNTc|MewC@X?O-^^N^8R$@a>pnb;TC~g{94v%)KpKV|**fIH=)S5tCW90n(R4+BeS=`2+E0RJ9Q(drJ zvnzelDvD^<;!ihX@6K~Yz>@k{n$AZRz(| z*G{vy$wWoZpv416DdRc3*&^D7yu5eErF2?8q?6dfsDvG$9&=Xbw6mDy;}UJ{w=|H! z4Z8m3FuvPyK`iAwVA4k_NDl3%kUe`=U>fDYS)ql3?fE#yYkyX?k#z;QkQpP--NkB0 ztHpo>1$KZq6z&HrVXf+#W#T3LP35`9>~yZ}Boo52AG+f;g)$9Z@iwLrI^1Tjseypk^I9AUS5cCBlelIq=|k#n4b?@4WJw$Ox(1yMlG25mm* zYd%CkqL$AdmEPFEEv+MohFA`1#?}Kkm4Nd-Y2-P4<8C|9gl71cPHjg@DHa2#IjVXM ze_wXqQ^K>DC$V8U3LpQtHk>n0Of}& zE2eD<&4>`L#`RH8w$dQ9kbI?>9OTouT(bmbJ4lhaI{-PS#|ewLAoi&r8-_lV&ogPo z8->B}dviwB10;0!r8`(;FEqoJR$Tnusf?+sm6J)75!$QxZ5R6}3~^R3;}L0+?inm9 zmxg3!uqt?5(gHsXuoe;l{oz`pAQRU$kKuw1l!F=Ow&9cH#@@6NG&m~2Ek?p1!^%Ls z@M^#TPDgs>^<7{tqLw!24o@`Jqenq=4jXpCoN{Sx#AP<5U={0uQbY%kH)Od{oYF+< zuZ(r13`J)Iq2+xktg*KSF;hqa9n0RM4hcTA2u4vFZ5aAgk(TngJX0A4GHL2?pb^CY zKWTL&95EO^;+Rj_;T(+pDaQ*LAk;=TmMK1Nam6qij*?)K1D|@Ae%1p7=D4jATc`0H zw)4u&19Zi9(Xb7GGm0z&rE;pr03W465j?p+HA^&X+zcG{r9cAhWd!|b9mW8=KyG{U zQZ~c4fyFV^g6_u)+M1-{Nk4^6hJ}%v%nsd1=ZaLrIV^alvuB3sO4062N5wG`l2?#; zsM+`M4>Z)sLaj=Xg2b-`P$5&0?9b#xlhp1u!AhjyyBK@1>oe=M{#fuN=9vu%8$;ATxp6J zvMvVFy-p}qB<{!E?@rEFJbn~1w2QPHeQDT4xH~dwv9T?;G|k2|+Dei2qA4O-Gv+Bi znWDf}ywoDGDrIBOZ(6f>p)?3xz!^J5)<+w+Xlh?UPsSLPKh(qyU4GDcEV26NAaX z6v-qx%6z+f(?cttm4WxqN*$AS(&$gtm6(YVK*Q!aG{?X>6%t|Q+8J^6sihbr9jLPb z@tv=Zyk@JT7oD4?D!`E=i_C0s$2C;QrJD!xG$g>V4(8lA$9g5*<>gNznvQ(6%K$y; zcMR|c)KJqM$6LtEm}8%6B>)_tvE*YpZKTmxXM$JvgqK+T{vI8hQ?T z&?ZbyCETM2y-cp4Wc8}ISFqYH>xbGZyjsqh>%`lSr6C#$NszaCdCn9Lo$8&oqh~DQ zG?ORL)x(l74i8!^0vbE zqA0t{qJ_sy3eNukgo4gY6y3Er-Hx>Lu39b|a3AeaV7ae`3cjL(SaLelR@d;}!X$v? z9`!Vb7VmfK>Epo2=t4&E=`Mz88BOl{!P zZTNr&``xL#outDads7|B3_FvK)CI!eoYJ(87ahNfpb`~)bq)GZ7bFT0or4V2svCI( z(kp)O6Zlfx-N9)ImRdp*UoSs013*}I?(&y+PL-V&vuQh$kGKw_(xiQE&Jl?Y!Rt=I zT7)7NRZs?gT5}Pdz3Pp=v0*vF$+|`8MOJSRSqZi?A21wIU^Ol-R?^(b)PYqj^&x*A zV?wQ-wHBkOMGb(sl{X{wsWi)rYnxRzssI3I>p&MSCKh&&EQggDCaUSWhxUcJnmzz- zwVC4GL+tt_%D*d18wuY;?7Tj_v+dwy`oxb#IkUsTgS?lR7>)AOXZ18;r zY{eGGZa!8WD}lV4C_G|ib_%14Lq~rb0>C#cJJgae$ZX&W&W8RLV&gji2Q@qwcKV8u z1LUqj8KS_;%Gg44kx}GeupH9DJh+Hs#XPRzk@q{&XcHKSx!sOw%mX+CaZM*{jBqG& z*vK?kL!E{&ykeuvD}u!0ksEA>aL#$9W+os{3Ob)kEISV%o>rJo=iag}yh&?n;bMLG zKQJ8BPJJHNY88Awo3axvDWSpz4_$E^cIdbU5ZW=91M@^Tgmr6Zkeus!m6Sf zRP%x>pbR$P^ckR$BpXqkdBCqS7dyOO)9obg`A6ekmkW7-=c&l95ZXqbFDet|&PV4> zJ29iWjzc6XAs8&RUgB|W6VA*RAFWw%*j4Nofn1l2?^+`a36)YgKa~w?43T8B^qFgDMgYPF=$9V$C@P2ra>^{ibI)_6Qkk0_$4$filyYWLDvz^xc3 z9JdvXY2v9aKXnu)Npr}@YUuA{S>bqDHwPVmopK%=w-){(nkO0HuhSGEl3n<|TU&*K zcua0v^scVbf3(^xqdzj{v$byz+1^|w#Ic>j(4K2jD8xw|Y6`@wftoG{C19m|QzLrg zHPhXhA%WgA_j$#0wz*FdIBw^f>WKM3W7mQ)+JHEi{9QZhuWYEm^u{~Z#Fv_i+ce@W zpm(Y|-io%D!v4)djOD8Ax1VX#VTnoeBp@Et4#lk>R+{!D5+MgaF~w@gyBMCrpwg_8 z(#vUIo2^YNvo73V3I>6I^L>p3I-IW*B9*1B*9NxdxQ^NfnofzI#<6@K&XQGlAmXO+ zOEPG#xx+UZrhv&BhO4bJi&g!`;ujdBZn>qEY4>?WhW6m`SG*G$heI1%EL_&syi4fP zZaE+m`cTJWJ1eiZSiF|!0LDN$zb63jPS(@H(p!r~r z>rL^7oXs3pkf~>0cB%|=MX_YT0ftxbDy zx~!J)!r_logIx?H+bTo{-Cn-*hhvWMHJtV{{h=fwx(euQVwLnrnVgo8RSz4CTSVY+ z2*|B{HH&FB#nm$OolZ z@Zcj!Mqj&*ezfiuIeks8^j%8b8fH6~2KO1R>Nz~vV`V%LGx=91f70_ue zE_8?_91;Z=xQ=thdcD=NM{fb-o|yaHDn--vDQqI0rrR?vNEKtm@LRIRTn{x5%1vC0 zQIJ?7Fd5s=IH5KN9R{VXKBCq|vKOHuyIl+IuDfo^fIX_Ni=`F1d&wUz$1C%8t?U&W znCIG)U=F#*priqZN_^{4a28;VGX^1yWXUB01OIvWeJ>aK9m5%Hy<$z^=AdSB;T|*vP?Z<8JibOHFwu(@A7t~tzcpi zVnqWDfm?|S+*qQ^%PH~-%ic;G_Q9z3N?Sfrt?#?+?Y*#Db z{T3^$xnAhyV<0HW`MTF@di%7gn;?Rju5ZC;%5Eioer`WnL1GCsoA`W7=i34y4ac>0 z8imK$G`F~B{oq_5t}1Ug_oV0VcC2q089%a0MhOj)arLHx#T^GvOt?>F4(PA5LagcFYJ}R~H?=7634hgHcj*c~HEaPna%mJ=1#Bxh>uEz+< zpg1SiyJ)1}Z6ENGfM&Tpert1hkmn9gNuUjf(=21K3FR*-lG#0RT&9hsHRh)($)6}3 zE_!1Xw=SUyTck}sS8fTd9WHG+Tlscw8cwav1F>UI(<0Nsjwbm}AOo7V!GSp#_otth zFw6LVT7XR@Bq$eNf`0aQEPw_2GA(-)tC}8X&4N#r>W!K zivWx;a5xne=J_ooMEm$S#YvYW^TkIz{{UjQmU2KSGBZZNVQ5-pu(YQ5XS#z~J|$(d z)Gg++lWU*82jN>fE!?`xz08b>@@I(g zxMXIp_)(PTnZV8sSMhi6H26=Wtst?tr_J_@C;`sn(EC;oiS-qZ{yPi$FMz+2qmd;V~woPdG!phz)D=08} z5fcxLigmm_;{Yp>Bkk^w8PEHj*9ox;QQ+hrOAkTUTY$Tdg7`=ipCzl%Kn zb*JJPRvjK-?l+LZL9DL_xqAYc`Nv=BNrj7kEVhbGAkN@?x%}!M3F+|1rKH)zImrWx zpT&$;v1j@BP8IIlX?>=x_AqBb}guKLNIOdZ?+aa@h? zRq=EqJh5ET8aiQV92$9sG0034_*W<48;6HmxwpwESe#dPbG2Z8ojza6xL*nt{{V!R z=XXuUsWBbXk&G`wDZ#cz%g`EQsV+$2a4FlBk(U@gw1hVylN9i9n@?(DE)O);B+11q zfU2i{NvLmw&21zJ)QXcW<^WAIP?+1>JAudWINYNZvg{Ttbs~Y3^)0KXOP{({sd#b!0MQ7?f9qB?MlYnzk=m;GWd8u5 zF~)jQ0uKzTh-LtN(mBu8wqx70mixSl#qh%~*(KZSira0XHXV%wgbEXOd!7YxmuzG4 zYLk$=xomc>-ALGu2TIG-w3NFhVTE@6Xc}YhwGScVMfs#Bh8~sAc)r$K)rw&m0YJ&E zt9uz$)ZC5Rcv5Rl;uO2KFwKpprxX-tX!h}qIXGR|8O=KG^42Se{DciFaLhYUbom0R z!zK#wd8sY*n4)d+K3TaZ-hx?tHZ8ZlI34Sc(Qe>x5Zvd6-Hg{&eE^mcs_l{KSk{^p z7V~-P%p}hwiV%(WWhuePrA@6K!g1-%M7*dC+r24WJ^&GNWua!n&xzPByCXn>O^s# z53NgWt=`C5D~N(II2&tn&LW^Q4mnQZD1a0P|PlA1^J7G}a@nu~3yii%*tgBDUrGzWAyZ-XF8Km`f=IhutQpn@5h}_lbT%{4`t)ZwhJBi)xl=HDr4hhTWD&f0qNb zXx-_NUSZsoKEkV7=vLPA`N~T;^`QpA;oUsg=_OcWcg#oDuTACLTf9Vn4i=?w-cbVz z4KY7<7d)D5N1og16G!4NDNu-+v(mdgb3~3!9Kxy#Dw4RZ4=N^b<}tl`8hWwamgIU= zj^`)f{W42&=FX>Z#xv<%dX3H;@TQuPEO{sZ^rklO2nVe&xy^X8;^OCRybzYb%P_6I z9!V##j7c8S036k!65|Cy-Pa?>X@$;5#nVZB8bt(q$RGkMXF-xdr=(1USx+^tEuf9JDybc~ z??|d5Jg;9tOh+T)&}X?tw>zX6%8vajH7qsR{urrm1#ZStG7ZHE2tRS4(h8MYJ{E# zew3ILb%`ea&-)|*mMehYg=2ViFSPkgazu8Ml53?BDU^bnvEHoi+__*E(vS>9R|_Xr zJ*jTtTgyjZT6OrIRFgQw^Plj!q)ppQ|((4lOQ+% zx45P#F{Vfg{b$XMf|jJIx}e+iU=Kw zAG%FzgL-87P=!5tsYDL)hjMocR~^e){ntNuj1ydw{jS@@A~@KzN^(VYxW)%lRTjxj z-Ozz^hU*+XkeJZh& zETnH#HY5?Zp5oAzL8Ri|_eJ&gy81dY-flgOwP^dMq?n)NJFp zwRC=@a4NosU@V|2-ATx+q!QUsCx1}m4-bgSzvT-*q-k`s~r+Uua1 zPIAhp(3+h5{G59cMS|l|Pn4wc*y%{44b4boJ$mMvety&laSPNAX^aB=z+}*J7z0gt zm3YTmEC4pk%8U_7br86$AF}j*EK5m|r?>)FuGrPVzQn2oF&}p~YNh<_qM#(g~ zj*R-fp?i$1J5=OXQ5%=s4L#*$bse$kLdVG= zz41(CJyCO|$_MvquZFQ5iO)tq)~st1`C4q=l?R8T&X|nHB$7a&4F3QMAy_BL&&|{G zt-?IabH}A(_&}UovvawI-`2MRuIvHJ8U}n9CA<(twQ}a`JfL$PQXR>8)TEt zBQ2h4=gZ}SohmTFqX=DUR8V8sjm-nN4Xqvsrb_}yqs&l1r?M0SpRED>#M`$Rq!%mh zRddH)20K%hCi~l|vIR_WQbtUQJ5V46*Y6zC1qHB2T6Q+M4Z^7TjX;-{&$$)BBdt3D zZ)hWF=M@${a=oe1OtK8FHlMrA82#=St5Cp+@w@;(8eIF-7dO`Stl{KP-kGRvwM$8) z+O7kh*`;Q{y@B%3csx~cb+j>IoxL$nhVt3YUPT1@!7%i@9cO6U77~tx8xk+qgUR_8;0#dNJt=n7$3ZAD)(N3 z&f{obGd(fQBn2H?#J3uDs311y%l`du+gux)WpTzvYlra$wHBo;R{mbXNGis=YZ0?a zfJV6+K*d#nd!P1mO-1CLxT;#Vryi86yO|rEf~v#fMUj+A5k-FFQm`8C`~mMzl;zNl z!lOl56Uzs*?S_bz>6&0`%A!QZIjD>aUSBFC6rsa`jN+DQ65i0XyKp(@y=SJY9FX~nrDF#iQWHjtZCqq# znQ~@Ja?yS4aaG{Hj^}6$2dAxEiI1CyIT+%dfWfiXCYMqB9I+gq;^|xCv6?7R~4z+sH@owT*LKJj0 z2BW?^ImjEnS^~yrg|4N&vXSNoD}l{x2Kj;P4Py9CMtfQiDH6T#9rXjdhlL4|%YDYp?XQfC~WnUdS z(gVG*+KUCmB|@O|q?OrJZ12{bQ|9@p%vA<4_o%Rll#eeYVEWVIk0&(T?&>fqMd{B$ zLIO98G??I;UCg6z6`iV2J*+Kr8t)03!qc^#Lsyla7{V Mc_+wHU@pJ^koxKOkV& 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 literal 0 HcmV?d00001 diff --git a/omeka_s_tools/__init__.py b/omeka_s_tools/__init__.py new file mode 100644 index 0000000..3047ba3 --- /dev/null +++ b/omeka_s_tools/__init__.py @@ -0,0 +1 @@ +__version__ = "0.0.1a" diff --git a/omeka_s_tools/_nbdev.py b/omeka_s_tools/_nbdev.py new file mode 100644 index 0000000..6c56d75 --- /dev/null +++ b/omeka_s_tools/_nbdev.py @@ -0,0 +1,13 @@ +# AUTOGENERATED BY NBDEV! DO NOT EDIT! + +__all__ = ["index", "modules", "custom_doc_links", "git_url"] + +index = {"OmekaAPIClient": "api.ipynb"} + +modules = ["api.py"] + +doc_url = "https://wragge.github.io/omeka_s_tools/" + +git_url = "https://github.com/wragge/omeka_s_tools/tree/master/" + +def custom_doc_links(name): return None diff --git a/omeka_s_tools/api.py b/omeka_s_tools/api.py new file mode 100644 index 0000000..85be8b6 --- /dev/null +++ b/omeka_s_tools/api.py @@ -0,0 +1,409 @@ +# AUTOGENERATED! DO NOT EDIT! File to edit: api.ipynb (unless otherwise specified). + +__all__ = ['OmekaAPIClient'] + +# Cell +import requests +import requests_cache +import json +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.retry import Retry +from pathlib import Path + +class OmekaAPIClient(object): + + def __init__(self, api_url, key_identity=None, key_credential=None, use_cache=True): + self.api_url = api_url + self.params = { + 'key_identity': key_identity, + 'key_credential': key_credential + } + # Set up session and caching + if use_cache: + self.s = requests_cache.CachedSession() + self.s.cache.clear() + else: + self.s = requests.Session() + retries = Retry(total=10, backoff_factor=1, status_forcelist=[ 502, 503, 504, 524 ]) + self.s.mount('http://', HTTPAdapter(max_retries=retries)) + self.s.mount('https://', HTTPAdapter(max_retries=retries)) + + + def format_resource_id(self, resource_id, resource_type): + ''' + Generate a formatted id for the resource with the specified Omeka id number and resource type. + + Parameters: + * `resource_id` - numeric identifier used by Omeka for this resource + * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties' + + Returns: + * a dict with values for '@id' and 'o:id' + ''' + formatted_id = { + '@id': f'{self.api_url}/{resource_type}/{resource_id}', + 'o:id': resource_id + } + return formatted_id + + def get_resources(self, resource_type, **kwargs): + ''' + Get a list of resources matching the supplied parameters. + This will return the first page of matching results. To retrieve additional pages, + you can supply the `page` parameter to move through the full result set. + + Parameters: + * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties' + * there are many additional parameters you can supply as kwargs, see the Omeka documention + + Returns a dict with the following values: + * `total_results` - number of matching resources + * `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource + ''' + response = self.s.get(f'{self.api_url}/{resource_type}/', params=kwargs) + results = response.json() + return {'total_results': int(response.headers['Omeka-S-Total-Results']), 'results': results} + + def get_resource(self, resource_type, **kwargs): + ''' + Get the first resource matching the supplied parameters. + + Parameters: + * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties' + * there are many additional parameters you can supply as kwargs, see the Omeka documention + + Returns + * a dict containing a JSON-LD formatted representation of the resource + ''' + + data = self.get_resources(resource_type, **kwargs) + try: + resource = data['results'][0] + except IndexError: + return + else: + return resource + + def get_resource_by_id(self, resource_id, resource_type='items'): + ''' + Get a resource from its Omeka id. + + Parameters: + * `resource_id` - numeric identifier used by Omeka for this resource + * `resource_type` - one of Omeka's resource types, eg: 'items', 'properties' + + Returns + * a dict containing a JSON-LD formatted representation of the resource + ''' + response = self.s.get(f'{self.api_url}/{resource_type}/{resource_id}') + return response.json() + + def get_template_by_label(self, label): + ''' + Get a resource template from its Omeka label. + + Parameters: + * `label` - the name of the resource template in Omeka (eg. 'NewspaperArticle') + + Returns: + * dict containing representation of the template + ''' + return self.get_resource('resource_templates', label=label) + + def get_resource_by_term(self, term, resource_type='properties'): + ''' + Get the resource (property or class) associated with the suppied term. + + Parameters: + * `term` - property label qualified with vocabulary prefix (eg: 'schema:name') + + Returns: + * dict containing representation of the resource + ''' + return self.get_resource(resource_type, term=term) + + def get_resource_from_vocab(self, local_name, vocabulary_namespace_uri='http://schema.org/', resource_type='properties'): + ''' + Get the resource (property or class) associated with the suppied vocabulary and label. + + Parameters: + * `local_name` - label of the property or class + * `vocabulary_namespace_uri` - URI defining the vocab + + Returns: + * dict containing representation of the resource + ''' + return self.get_resource(resource_type, local_name=local_name, vocabulary_namespace_uri=vocabulary_namespace_uri) + + def get_property_id(self, term): + ''' + Get the numeric identifier associated with the supplied property term. + + Parameters: + * `term` - property label qualified with vocabulary prefix (eg: 'schema:name') + + Returns: + * numeric identifier + ''' + resource = self.get_resource_by_term(term=term) + if resource: + return resource['o:id'] + + def filter_items(self, params, **extra_filters): + for filter_type in ['resource_template_id', 'resource_class_id', 'item_set_id', 'is_public']: + filter_value = extra_filters.get(filter_type) + if filter_value: + params[filter_type] = filter_value + return params + + def filter_items_by_property(self, filter_property='schema:name', filter_value='', filter_type='eq', page=1, **extra_filters): + ''' + Filter the list of items by searching for a value in a particular property. + Additional filters can also limit to items associated with particular templates, classes, or item sets. + + Parameters: + * `filter_property` - property term (eg: 'schema:name') + * `filter_value` - the value you want to find + * `filter_type` - how `filter_value` should be compared to the stored values (eg: 'eq') + * `page` - number of results page + + Additional parameters: + * `resource_template_id` - numeric identifier + * `resource_class_id` - numeric identifier + * `item_set_id` - numeric identifier + * `is_public` - boolean, True or False + + Returns a dict with the following values: + * `total_results` - number of matching resources + * `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource + + ''' + # We need to get the id of the property we're using + property_id = self.get_property_id(filter_property) + params = { + 'property[0][joiner]': 'and', # and / or joins multiple property searches + 'property[0][property]': property_id, # property id + 'property[0][type]': filter_type, # See above for options + 'property[0][text]': filter_value, + 'page': page + } + params = self.filter_items(params, **extra_filters) + # print(params) + data = self.get_resources('items', **params) + return data + + def search_items(self, query, search_type='fulltext_search', page=1, **extra_filters): + ''' + Search for matching items. + Two search types are available: + * 'search` - looks for an exact match of the query in a property value + * 'fulltext_search` - looks for the occurance of the query anywhere + + Parameters: + * `query` - the text you want to search for + * `search_type` - one of 'fulltext_search' or 'search' + * `page` - number of results page + + Additional parameters: + * `resource_template_id` - numeric identifier + * `resource_class_id` - numeric identifier + * `item_set_id` - numeric identifier + * `is_public` - boolean, True or False + + Returns a dict with the following values: + * `total_results` - number of matching resources + * `results` - a list of dicts, each containing a JSON-LD formatted representation of a resource + ''' + params = {'page': page} + params[search_type] = query + params = self.filter_items(params, **extra_filters) + return self.get_resources('items', **params) + + def get_template_properties(self, template_id): + ''' + List properties used by the specified template. + + The resource template objects returned by the API don't include property terms. + This function gets the additional details, and organises the properties in a dictionary, + organised by term. This makes it easy to check if a particular term is used by a template. + + Parameters: + * `template_id` - numeric identifier for a template + + Returns: + * a dict organised by property terms, with values for `property_id` and `type` + ''' + properties = {} + template = self.get_resource_by_id(template_id, 'resource_templates') + for prop in template['o:resource_template_property']: + prop_url = prop['o:property']['@id'] + # The resource template doesn't include property terms, so we have to go to the property data + response = self.s.get(prop_url) + data = response.json() + # Use default data types if they're not defined in the resource template + data_type = ['literal', 'uri', 'resource:item'] if prop['o:data_type'] == [] else prop['o:data_type'] + properties[data['o:term']] = {'property_id': data['o:id'], 'type': data_type} + return properties + + def prepare_property_value(self, value, property_id): + ''' + Formats a property value according to its datatype as expected by Omeka. + The formatted value can be used in a payload to create a new item. + + Parameters: + * `value` - a dict containing a `value` and (optionally) a `type` + * `property_id` - the numeric identifier of the property + + Note that is no `type` is supplied, 'literal' will be used by default. + + Returns: + * a dict with values for `property_id`, `type`, and either `@id` or `@value`. + ''' + if not isinstance(value, dict): + value = {'value': value} + + try: + data_type = value['type'] + except KeyError: + data_type = 'literal' + + property_value = { + 'property_id': property_id, + 'type': data_type + } + + if data_type == 'resource:item': + property_value['@id'] = f'{self.api_url}/items/{value["value"]}' + property_value['value_resource_id'] = value['value'] + property_value['value_resource_name'] = 'items' + elif data_type == 'uri': + property_value['@id'] = value['value'] + else: + property_value['@value'] = value['value'] + return property_value + + def add_item(self, payload, media_files=None, template_id=None, class_id=None, item_set_id=None): + ''' + Create a new item from the supplied payload, optionally uploading attached media files. + + Parameters: + * `payload` - a dict generated by `prepare_item_payload()` or `prepare_item_payload_using_template()` + * `media_files` - a list of paths pointing to media files, or a list of dicts with `path` and `title` values + * `template_id` - internal Omeka identifier of a resource template you want to attach to this item + * `class_id` - internal Omeka identifier of a resource class you want to attach to this item + * `item_set_id` - internal Omeka identifier for an item set you want to add this item to + + Returns: + * a dict providing the JSON-LD representation of the new item from Omeka + ''' + if template_id: + payload['o:resource_template'] = self.format_resource_id(template_id, 'resource_templates') + if class_id: + payload['o:resource_class'] = self.format_resource_id(class_id, 'resource_classes') + if item_set_id: + payload['o:item_set'] = self.format_resource_id(template_id, 'item_sets') + if media_files: + files = self.add_media_to_payload(payload, media_files) + response = self.s.post(f'{self.api_url}/items', files=files, params=self.params) + else: + response = self.s.post(f'{self.api_url}/items', json=payload, params=self.params) + return response.json() + + def prepare_item_payload(self, terms): + ''' + Prepare an item payload, ready for upload. + + Parameters: + * `terms`: a dict of terms, values, and (optionally) data types + + Returns: + * the payload dict + ''' + payload = {} + for term, values in terms.items(): + # Get the property id of the supplied term + try: + property_id = self.get_property_id(term) + except IndexError: + print(f'Term "{term}" not found') + else: + payload[term] = [] + for value in values: + # Add a value formatted according to the data type + payload[term].append(self.prepare_property_value(value, property_id)) + return payload + + def prepare_item_payload_using_template(self, terms, template_id): + ''' + Prepare an item payload, checking the supplied terms and values against the specified template. + Note: + * terms that are not in the template will generate a warning and be dropped from the payload + * data types that don't match the template definitions will generate a warning and the term will be dropped from the payload + * if no data type is supplied, a type that conforms with the template definition will be used + + Parameters: + * `terms`: a dict of terms, values, and (optionally) data types + * `template_id`: Omeka's internal numeric identifier for the template + + Returns: + * the payload dict + ''' + template_properties = self.get_template_properties(template_id) + payload = {} + for term, values in terms.items(): + if term in template_properties: + property_details = template_properties[term] + payload[term] = [] + for value in values: + if not isinstance(value, dict): + value = {'value': value} + # The supplied data type doesn't match the template + if 'type' in value and value['type'] not in property_details['type']: + print(f'Data type "{value["type"]}" for term "{term}" not allowed by template') + break + elif 'type' not in value: + # Use default datatype from template if none is supplied + if len(property_details['type']) == 1: + value['type'] = property_details['type'][0] + # Use literal if allowed by template and data type not supplied + elif 'literal' in property_details['type']: + value['type'] = 'literal' + # Don't know what data type to use + else: + print(f'Specify data type for term "{term}"') + break + # Add a value formatted according to the data type + payload[term].append(self.prepare_property_value(value, property_details['property_id'])) + # The supplied term is not in the template + else: + print(f'Term {term} not in template') + return payload + + def add_media_to_payload(self, payload, media_files): + ''' + Add media files to the item payload. + + Parameters: + * `payload` - the payload dict to be modified + * `media_files` - media files to be uploaded + + The value of `media_files` can be either: + * a list of paths to the image/media files (filename is used as title) + * a list of dicts, each containing `title`, and `path` values + + Returns: + * the modified payload dict + ''' + payload['o:media'] = [] + files = {} + for index, media_file in enumerate(media_files): + if isinstance(media_file, dict): + title = media_file['title'] + path = media_file['path'] + else: + title = media_file[:-4] + path = media_file + payload['o:media'].append({'o:ingester': 'upload', 'file_index': str(index), 'o:item': {}, 'dcterms:title': [{'property_id': 1, '@value': title, 'type': 'literal'}]}) + files[f'file[{index}]'] = Path(path).read_bytes() + files['data'] = (None, json.dumps(payload), 'application/json') + return files \ No newline at end of file diff --git a/settings.ini b/settings.ini index 959a6d8..110d01d 100644 --- a/settings.ini +++ b/settings.ini @@ -1,31 +1,31 @@ [DEFAULT] # All sections below are required unless otherwise specified host = github -lib_name = {lib_name} +lib_name = omeka_s_tools # For Enterprise Git add variable repo_name and company name -# repo_name = analytics +repo_name = omeka_s_tools # company_name = nike -user = {user} -# description = A description of your project -# keywords = some keywords -author = {author} -author_email = {author_email} -# copyright = Put your copyright information here -branch = {branch} -version = 0.0.1 +user = wragge +description = Tools for working with Omeka S API +keywords = Omeka +author = Tim Sherratt +author_email = tim@timsherratt.org +copyright = Tim Sherratt +branch = master +version = 0.0.1a min_python = 3.6 audience = Developers language = English # Set to True if you want to create a more fancy sidebar.json than the default custom_sidebar = False # Add licenses and see current list in `setup.py` -license = apache2 +license = mit # From 1-7: Planning Pre-Alpha Alpha Beta Production Mature Inactive -status = 2 +status = 3 # Optional. Same format as setuptools requirements -# requirements = +requirements = requests requests-cache # Optional. Same format as setuptools console_scripts # console_scripts = # Optional. Same format as setuptools dependency-links