From bea3940ee694c33de4699de879cf7b6d0583daad Mon Sep 17 00:00:00 2001 From: Hirotaka Wakabayashi Date: Fri, 4 Mar 2022 17:10:42 +0900 Subject: [PATCH] secondary commit --- .github/ISSUE_TEMPLATE.md | 20 + .github/PULL_REQUEST_TEMPLATE.md | 5 + .github/scripts/install_dependencies.sh | 64 ++ .github/scripts/lint_with_pylint.sh | 46 ++ .github/scripts/test_with_unittest.sh | 64 ++ .github/workflows/python-package.yml | 76 +++ .gitignore | 156 +++++ AUTHORS.rst | 13 + HISTORY.rst | 8 + LICENSE | 22 + MANIFEST.in | 34 + README.rst | 111 ++- cluster/hosts | 26 + cluster/k2hdkc.sh | 96 +++ cluster/server.yaml | 127 ++++ cluster/slave.yaml | 96 +++ cluster/start_server.sh | 359 ++++++++++ docs/Makefile | 42 ++ docs/authors.rst | 1 + docs/conf.py | 83 +++ docs/history.rst | 1 + docs/images/top_k2hdkc_python.png | Bin 0 -> 297389 bytes docs/index.rst | 19 + docs/k2hdkc.rst | 21 + docs/locale/ja/LC_MESSAGES/authors.po | 55 ++ docs/locale/ja/LC_MESSAGES/history.po | 47 ++ docs/locale/ja/LC_MESSAGES/index.po | 59 ++ docs/locale/ja/LC_MESSAGES/k2hdkc.po | 155 +++++ docs/locale/ja/LC_MESSAGES/modules.po | 39 ++ docs/locale/ja/LC_MESSAGES/readme.po | 118 ++++ docs/make.bat | 58 ++ docs/modules.rst | 7 + docs/readme.rst | 1 + docs/requirements.txt | 25 + pylintrc | 562 +++++++++++++++ pyproject.toml | 31 + setup.cfg | 51 ++ src/k2hdkc/__init__.py | 525 ++++++++++++++ src/k2hdkc/k2hdkc.py | 874 ++++++++++++++++++++++++ src/k2hdkc/tests/test_k2hdkc.py | 313 +++++++++ src/k2hdkc/tests/test_k2hdkc_package.py | 48 ++ 41 files changed, 4457 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100755 .github/scripts/install_dependencies.sh create mode 100755 .github/scripts/lint_with_pylint.sh create mode 100755 .github/scripts/test_with_unittest.sh create mode 100644 .github/workflows/python-package.yml create mode 100644 .gitignore create mode 100644 AUTHORS.rst create mode 100644 HISTORY.rst create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 cluster/hosts create mode 100755 cluster/k2hdkc.sh create mode 100644 cluster/server.yaml create mode 100644 cluster/slave.yaml create mode 100755 cluster/start_server.sh create mode 100644 docs/Makefile create mode 100644 docs/authors.rst create mode 100644 docs/conf.py create mode 100644 docs/history.rst create mode 100644 docs/images/top_k2hdkc_python.png create mode 100644 docs/index.rst create mode 100644 docs/k2hdkc.rst create mode 100644 docs/locale/ja/LC_MESSAGES/authors.po create mode 100644 docs/locale/ja/LC_MESSAGES/history.po create mode 100644 docs/locale/ja/LC_MESSAGES/index.po create mode 100644 docs/locale/ja/LC_MESSAGES/k2hdkc.po create mode 100644 docs/locale/ja/LC_MESSAGES/modules.po create mode 100644 docs/locale/ja/LC_MESSAGES/readme.po create mode 100644 docs/make.bat create mode 100644 docs/modules.rst create mode 100644 docs/readme.rst create mode 100644 docs/requirements.txt create mode 100644 pylintrc create mode 100644 pyproject.toml create mode 100644 setup.cfg create mode 100644 src/k2hdkc/__init__.py create mode 100644 src/k2hdkc/k2hdkc.py create mode 100644 src/k2hdkc/tests/test_k2hdkc.py create mode 100644 src/k2hdkc/tests/test_k2hdkc_package.py diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..7b35e57 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ +## Additional Information +(The following information is very important in order to help us to help you. Omission of the following details may delay your support request or receive no attention at all.) + +- Version of python (python --version) + ``` + ``` + +- Version of K2HR3 OpenStack Notification Listener (k2hr3-osnl -v) + ``` + ``` + +- System information (uname -a) + ``` + ``` + +- Distro (cat /etc/issue) + ``` + ``` + +## Details about issue diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..40f1ac1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +## Relevant Issue (if applicable) +(If there are Issues related to this PullRequest, please list it.) + +## Details +(Please describe the details of PullRequest.) diff --git a/.github/scripts/install_dependencies.sh b/.github/scripts/install_dependencies.sh new file mode 100755 index 0000000..801ce5f --- /dev/null +++ b/.github/scripts/install_dependencies.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +echo $(basename $0) + +if test -f "/etc/os-release"; then + . /etc/os-release + OS_NAME=$ID + OS_VERSION=$VERSION_ID +elif test -f "/etc/centos-release"; then + echo "[OK] /etc/centos-release falling back to CentOS-7" + OS_NAME=centos + OS_VERSION=7 +else + echo "Unknown OS, neither /etc/os-release nor /etc/centos-release" + exit 1 +fi + +echo "[OK] HOSTNAME=${HOSTNAME} OS_NAME=${OS_NAME} OS_VERSION=${OS_VERSION}" + +case "${OS_NAME}-${OS_VERSION}" in + ubuntu*|debian*) + DEBIAN_FRONTEND="noninteractive" sudo apt-get update -y + DEBIAN_FRONTEND="noninteractive" sudo apt-get install -y curl pylint + curl -s https://packagecloud.io/install/repositories/antpickax/stable/script.deb.sh | sudo bash + ;; + centos-7) + sudo yum install -y epel-release-7 + sudo yum install -y --enablerepo=epel pylint python3 git curl which + curl -s https://packagecloud.io/install/repositories/antpickax/stable/script.rpm.sh | sudo bash + ;; + centos-8|fedora*) + sudo dnf install -y epel-release-8 + sudo dnf install -y python3-pylint git curl + curl -s https://packagecloud.io/install/repositories/antpickax/stable/script.rpm.sh | sudo bash + ;; +esac + +cd cluster +sh start_server.sh + +exit $? + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/.github/scripts/lint_with_pylint.sh b/.github/scripts/lint_with_pylint.sh new file mode 100755 index 0000000..f8b58a2 --- /dev/null +++ b/.github/scripts/lint_with_pylint.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +echo $(basename $0) + +if test -f "/etc/os-release"; then + . /etc/os-release + OS_NAME=$ID + OS_VERSION=$VERSION_ID +elif test -f "/etc/centos-release"; then + echo "[OK] /etc/centos-release falling back to CentOS-7" + OS_NAME=centos + OS_VERSION=7 +else + echo "Unknown OS, neither /etc/os-release nor /etc/centos-release" + exit 1 +fi + +echo "[OK] HOSTNAME=${HOSTNAME} OS_NAME=${OS_NAME} OS_VERSION=${OS_VERSION}" +cd src + +pylint k2hdkc --py3k -r n + +exit $? + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/.github/scripts/test_with_unittest.sh b/.github/scripts/test_with_unittest.sh new file mode 100755 index 0000000..6514bcc --- /dev/null +++ b/.github/scripts/test_with_unittest.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +echo $(basename $0) + +if test -f "/etc/os-release"; then + . /etc/os-release + OS_NAME=$ID + OS_VERSION=$VERSION_ID +elif test -f "/etc/centos-release"; then + echo "[OK] /etc/centos-release falling back to CentOS-7" + OS_NAME=centos + OS_VERSION=7 +else + echo "[NO] Unknown OS, neither /etc/os-release nor /etc/centos-release" + exit 1 +fi + +echo "[OK] HOSTNAME=${HOSTNAME} OS_NAME=${OS_NAME} OS_VERSION=${OS_VERSION}" +PYTHON="" +case "${OS_NAME}-${OS_VERSION}" in + ubuntu*|debian*) + PYTHON=$(which python) + ;; + centos*|fedora*) + PYTHON=$(which python3) + ;; +esac + +cd src + +TEST_FILES="test_k2hdkc.py test_k2hdkc_package.py" +for TEST_FILE in ${TEST_FILES} +do + ${PYTHON} -m unittest k2hdkc/tests/${TEST_FILE} + if test $? -ne 0; then + echo "[NO] ${PYTHON} -m unittest k2hdkc/tests/${TEST_FILE}" + exit 1 + fi +done + +exit 0 + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 0000000..d226dc2 --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Python package + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + release: + types: [published] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.x", "3.10", "3.9", "3.8", "3.7"] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + ./.github/scripts/install_dependencies.sh + shell: sh + - name: Lint with pylint + run: | + ./.github/scripts/lint_with_pylint.sh + shell: sh + - name: Test with unittest + run: | + ./.github/scripts/test_with_unittest.sh + shell: sh + - name: Install dependencies for upload pypi package + if: startsWith(github.ref, 'refs/tags') + run: | + python -m pip install --upgrade pip + pip install build + - name: Build package + if: startsWith(github.ref, 'refs/tags') + run: python -m build + - name: Publish distribution to PyPI + if: ${{ matrix.python-version == '3.x' && startsWith(github.ref, 'refs/tags') }} + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.PYPI_API_TOKEN }} + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3461dea --- /dev/null +++ b/.gitignore @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + + +# emacs backup files +*~ + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..89ee6c6 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,13 @@ +======= +Credits +======= + +Development Lead +---------------- + +* Hirotaka Wakabayashi + +Contributors +------------ + +* Takeshi Nakatani diff --git a/HISTORY.rst b/HISTORY.rst new file mode 100644 index 0000000..3ac6634 --- /dev/null +++ b/HISTORY.rst @@ -0,0 +1,8 @@ +======= +History +======= + +1.0.0 (2022-02-07) +------------------- + +* First release on PyPI. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7294404 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022 Yahoo Japan Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..73ad466 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# +include AUTHORS.rst +include HISTORY.rst +include LICENSE +include README.rst + +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + +recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# + diff --git a/README.rst b/README.rst index 3de796c..9f39b56 100644 --- a/README.rst +++ b/README.rst @@ -1 +1,110 @@ -# k2hdkc_python +============== +k2hdkc_python +============== + +.. image:: https://img.shields.io/badge/license-MIT-blue.svg + :target: https://github.com/yahoojapan/k2hdkc_python/blob/master/LICENSE +.. image:: https://img.shields.io/pypi/pyversions/k2hdkc.svg + :target: https://pypi.python.org/pypi/k2hdkc +.. image:: https://img.shields.io/github/forks/yahoojapan/k2hdkc_python.svg + :target: https://github.com/yahoojapan/k2hdkc_python/network +.. image:: https://img.shields.io/github/stars/yahoojapan/k2hdkc_python.svg + :target: https://github.com/yahoojapan/k2hdkc_python/stargazers +.. image:: https://img.shields.io/github/issues/yahoojapan/k2hdkc_python.svg + :target: https://github.com/yahoojapan/k2hdkc_python/issues +.. image:: https://github.com/yahoojapan/k2hdkc_python/workflows/Python%20package/badge.svg + :target: https://github.com/yahoojapan/k2hdkc_python/actions +.. image:: https://readthedocs.org/projects/k2hdkc-python/badge/?version=latest + :target: https://k2hdkc-python.readthedocs.io/en/latest/?badge=latest +.. image:: https://img.shields.io/pypi/v/k2hdkc + :target: https://pypi.org/project/k2hdkc/ + + + +Overview +--------- + +k2hdkc_python is an official python driver for `k2hdkc`_. + +.. _`k2hdkc`: https://k2hdkc.antpick.ax/ + +.. image:: https://raw.githubusercontent.com/yahoojapan/k2hdkc_python/main/docs/images/top_k2hdkc_python.png + + +Install +-------- + +Let's install k2hdkc using pip:: + + pip install k2hdkc + + +Usage +------ + +Firstly you must install the k2hdkc shared library:: + + $ curl -o- https://raw.github.com/yahoojapan/k2hdkc_python/master/cluster/start_server.sh | bash + + +Then, Let's try to set a key and get it:: + + import k2hdkc + + k = k2hdkc.K2hdkc('slave.yaml') + k.set('hello', 'world') + v = k.get('hello') + print(v) // world + + +Development +------------ + +Clone this repository and go into the directory, then run the following command:: + + $ python3 -m pip install --upgrade build + $ python3 -m build + + +Documents +---------- + +Here are documents including other components. + +`Document top page`_ + +`About K2HDKC`_ + +`About AntPickax`_ + +.. _`Document top page`: https://k2hdkc-python.readthedocs.io/ +.. _`ドキュメントトップ`: https://k2hdkc-python.readthedocs.io/ +.. _`About K2HDKC`: https://k2hdkc.antpick.ax/ +.. _`K2HDKCについて`: https://k2hdkc.antpick.ax/ +.. _`About AntPickax`: https://antpick.ax +.. _`AntPickaxについて`: https://antpick.ax + + +Packages +-------- + +Here are packages including other components. + +`k2hdkc(python packages)`_ + +.. _`k2hdkc(python packages)`: https://pypi.org/project/k2hdkc/ + + +License +-------- + +MIT License. See the LICENSE file. + +AntPickax +--------- + +**k2hdkc_python** is a project by AntPickax_, which is an open source team in `Yahoo Japan Corporation`_. + +.. _AntPickax: https://antpick.ax/ +.. _`Yahoo Japan Corporation`: https://about.yahoo.co.jp/info/en/company/ + diff --git a/cluster/hosts b/cluster/hosts new file mode 100644 index 0000000..255b543 --- /dev/null +++ b/cluster/hosts @@ -0,0 +1,26 @@ +# +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 virtualbox.vagrant.example.com +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 virtualbox.vagrant.example.com + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/cluster/k2hdkc.sh b/cluster/k2hdkc.sh new file mode 100755 index 0000000..0b0961b --- /dev/null +++ b/cluster/k2hdkc.sh @@ -0,0 +1,96 @@ +#!/bin/sh +# +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# + +# A K2hdkc Cluster management script. + +USER=$(whoami) +BASEDIR=$(dirname "$0") + +start_process() { + echo "chmpx -conf ${BASEDIR}/server.yaml -d dump > ${BASEDIR}/chmpx.log 2>&1" + nohup chmpx -conf ${BASEDIR}/server.yaml -d dump > ${BASEDIR}/chmpx.log 2>&1 & + echo "sleep 3" + sleep 3 + echo "k2hdkc -conf ${BASEDIR}/server.yaml -d dump > ${BASEDIR}/k2hdkc.log 2>&1" + nohup k2hdkc -conf ${BASEDIR}/server.yaml -d dump > ${BASEDIR}/k2hdkc.log 2>&1 & + echo "sleep 3" + sleep 3 + echo "chmpx -conf ${BASEDIR}/slave.yaml -d dump > ${BASEDIR}/slave.log 2>&1" + nohup chmpx -conf ${BASEDIR}/slave.yaml -d dump > ${BASEDIR}/slave.log 2>&1 & + echo "sleep 3" + sleep 3 +} + +stop_process() { + for PROC in chmpx k2hdkc; do + echo "pgrep -u ${USER} -x ${PROC}" + pgrep -u ${USER} -x ${PROC} + if test "${?}" = "0"; then + echo "pkill -x ${PROC}" + pkill -x ${PROC} + fi + done +} + +status_process() { + RET=0 + for PROC in chmpx k2hdkc; do + echo "pgrep -u ${USER} -x ${PROC}" + pgrep -u ${USER} -x ${PROC} + RET=$(echo ${?} + ${RET}|bc) + done + return ${RET} +} + +case $1 in +startifnotexist) + status_process + if test "${RET}" = "2" ; then + echo "start_process" + start_process + elif test "${RET}" = "1" ; then + echo "stop_process" + stop_process + echo "start_process" + start_process + fi + ;; +start) + start_process + ;; +stop) + stop_process + ;; +status) + status_process + ;; +*) + echo "$0 (start|stop|status|startifnotexist)" + exit 1 + ;; +esac +exit 0 + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# + diff --git a/cluster/server.yaml b/cluster/server.yaml new file mode 100644 index 0000000..38ade50 --- /dev/null +++ b/cluster/server.yaml @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +################################################################ +# CONFIGRATION FILE FOR STANDALONE TEST +# +# NOTE: +# - k2hdkc server node must not be use MQACK +# - k2hash for k2hdkc is memory mode, because multi server node +# run on one server and we do not use configration files for +# each process. +################################################################ + +# +# GLOBAL SECTION +# +GLOBAL: + { + FILEVERSION: 2, + DATE: "Wed, 07 Sep 2016 13:55:04 +0900", + GROUP: TESTDKC, + MODE: SERVER, + DELIVERMODE: hash, + MAXCHMPX: 8, + REPLICA: 1, + MAXMQSERVER: 2, + MAXMQCLIENT: 2, + MQPERATTACH: 1, + MAXQPERSERVERMQ: 2, + MAXQPERCLIENTMQ: 1, + MAXMQPERCLIENT: 1, + MAXHISTLOG: 10000, + PORT: 8020, + CTLPORT: 8021, + SELFCTLPORT: 8021, + RWTIMEOUT: 100000, + RETRYCNT: 1000, + CONTIMEOUT: 500000, + MQRWTIMEOUT: 1000, + MQRETRYCNT: 10000, + MQACK: no, + AUTOMERGE: on, + DOMERGE: on, + MERGETIMEOUT: 0, + SOCKTHREADCNT: 4, + MQTHREADCNT: 4, + MAXSOCKPOOL: 10, + SOCKPOOLTIMEOUT: 0, + SSL: no, + K2HFULLMAP: on, + K2HMASKBIT: 4, + K2HCMASKBIT: 4, + K2HMAXELE: 4 + } + +# +# SERVER NODES SECTION +# +SVRNODE: + [ + { + NAME: localhost, + PORT: 8020, + CTLPORT: 8021, + SSL: no + } + ] + +# +# SLAVE NODES SECTION +# +SLVNODE: + [ + { + NAME: "[.]*", + CTLPORT: 8031 + } + ] + +# +# K2HDKC SECTION +# +K2HDKC: + { + #RCVTIMEOUT: 1000, + #SVRNODEINI: , + #REPLCLUSTERINI: , + #DTORTHREADCNT: 1, + #DTORCTP: path.so, + K2HTYPE: mem, + #K2HTYPE: file, + #K2HFILE: /tmp/k2hdkc.k2h, + K2HFULLMAP: on, + K2HINIT: yes, + K2HMASKBIT: 8, + K2HCMASKBIT: 4, + K2HMAXELE: 16, + K2HPAGESIZE: 128, + #PASSPHRASES: , + #PASSFILE: , + #HISTORY: on, + #EXPIRE: 300, + #ATTRPLUGIN: , + #MINTHREAD: 1, + MAXTHREAD: 20, + #REDUCETIME: 30 + } + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/cluster/slave.yaml b/cluster/slave.yaml new file mode 100644 index 0000000..6914b53 --- /dev/null +++ b/cluster/slave.yaml @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# + +################################################################ +# CONFIGRATION FILE FOR STANDALONE TEST +# +# NOTE: +# - k2hdkc server node must not be use MQACK +################################################################ + +# +# GLOBAL SECTION +# +GLOBAL: + { + FILEVERSION: 2, + DATE: "Wed, 07 Sep 2016 13:55:04 +0900", + GROUP: TESTDKC, + MODE: SLAVE, + DELIVERMODE: hash, + MAXCHMPX: 8, + REPLICA: 1, + MAXMQSERVER: 2, + MAXMQCLIENT: 2, + MQPERATTACH: 1, + MAXQPERSERVERMQ: 2, + MAXQPERCLIENTMQ: 1, + MAXMQPERCLIENT: 1, + MAXHISTLOG: 10000, + #PORT: 8020, + CTLPORT: 8031, + SELFCTLPORT: 8031, + RWTIMEOUT: 100000, + RETRYCNT: 1000, + CONTIMEOUT: 500000, + MQRWTIMEOUT: 1000, + MQRETRYCNT: 10000, + MQACK: no, + AUTOMERGE: on, + DOMERGE: on, + MERGETIMEOUT: 0, + SOCKTHREADCNT: 4, + MQTHREADCNT: 4, + MAXSOCKPOOL: 10, + SOCKPOOLTIMEOUT: 0, + SSL: no, + K2HFULLMAP: on, + K2HMASKBIT: 4, + K2HCMASKBIT: 4, + K2HMAXELE: 4 + } + +# +# SERVER NODES SECTION +# +SVRNODE: + [ + { + NAME: localhost, + PORT: 8020, + CTLPORT: 8021, + SSL: no + } + ] + +# +# SLAVE NODES SECTION +# +SLVNODE: + [ + { + NAME: "[.]*", + CTLPORT: 8031 + } + ] + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/cluster/start_server.sh b/cluster/start_server.sh new file mode 100755 index 0000000..c9d6e85 --- /dev/null +++ b/cluster/start_server.sh @@ -0,0 +1,359 @@ +#!/bin/sh +# +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +# Sets PATH. setup_*.sh uses useradd command +PATH=${PATH}:/usr/sbin:/sbin + +# an unset parameter expansion will fail +set -u + +# umask 022 is enough +umask 022 + +# environments +SRCDIR=$(cd $(dirname "$0") && pwd) +DEBUG=1 +if test "${DEBUG}" -eq 1; then + TAG="$(basename $0) -s" +else + TAG=$(basename $0) +fi +USER=$(whoami) +LOGLEVEL=info + +# Starts chmpx and k2hdkc +# +start_process() { + echo "chmpx -conf ${SRCDIR}/server.yaml -d ${LOGLEVEL} > ${SRCDIR}/chmpx.log 2>&1" + nohup chmpx -conf ${SRCDIR}/server.yaml -d ${LOGLEVEL} > ${SRCDIR}/chmpx.log 2>&1 & + echo "sleep 3" + sleep 3 + echo "k2hdkc -conf ${SRCDIR}/server.yaml -d ${LOGLEVEL} > ${SRCDIR}/k2hdkc.log 2>&1" + nohup k2hdkc -conf ${SRCDIR}/server.yaml -d ${LOGLEVEL} > ${SRCDIR}/k2hdkc.log 2>&1 & + echo "sleep 3" + sleep 3 + echo "chmpx -conf ${SRCDIR}/slave.yaml -d ${LOGLEVEL} > ${SRCDIR}/slave.log 2>&1" + nohup chmpx -conf ${SRCDIR}/slave.yaml -d ${LOGLEVEL} > ${SRCDIR}/slave.log 2>&1 & + echo "sleep 3" + sleep 3 +} + +# Stops chmpx and k2hdkc +# +stop_process() { + for PROC in chmpx k2hdkc; do + echo "pgrep -u ${USER} -x ${PROC}" + pgrep -u ${USER} -x ${PROC} + if test "${?}" = "0"; then + echo "pkill -9 -x ${PROC}" + pkill -9 -x ${PROC} + fi + done +} + +# Shows status of chmpx and k2hdkc +# +status_process() { + RET=0 + for PROC in chmpx k2hdkc; do + echo "pgrep -u ${USER} -x ${PROC}" + pgrep -u ${USER} -x ${PROC} + RET=$(echo ${?} + ${RET}|bc) + done + return ${RET} +} + +# Starts chmpx and k2hdkc if no chmpx and k2hdkc processes are running +# +startifnotexist() { + status_process + if test "${RET}" = "2" ; then + echo "start_process" + start_process + elif test "${RET}" = "1" ; then + echo "stop_process" + stop_process + echo "start_process" + start_process + fi +} + +# Checks if k2hdkc is installed +# +# Params:: +# no params +# +# Returns:: +# 0 on installed +# 1 on not installed +# +which_k2hdkc() { + which k2hdkc + if test "${?}" = "0"; then + echo "[OK] k2hdkc already installed" + return 0 + fi + return 1 +} + +# Determines the current OS +# +# Params:: +# no params +# +# Returns:: +# 0 on success +# 1 on failure +# +setup_os_env() { + if test -f "/etc/os-release"; then + . /etc/os-release + OS_NAME=$ID + OS_VERSION=$VERSION_ID + else + echo "[OK] unknown OS, no /etc/os-release and /etc/centos-release falling back to CentOS-7" + OS_NAME=centos + OS_VERSION=7 + fi + + if test "${OS_NAME}" = "ubuntu"; then + echo "[OK] ubuntu configurations are currently equal to debian one" + OS_NAME=debian + fi + + HOSTNAME=$(hostname) + echo "[OK] HOSTNAME=${HOSTNAME} OS_NAME=${OS_NAME} OS_VERSION=${OS_VERSION}" +} + +# Builds k2hash from source code +# +# Params:: +# $1 os_name +# +# Returns:: +# 0 on success +# 1 on failure(exit) +# +make_k2hash() { + + _os_name=${1:?"os_name should be nonzero"} + + if test "${_os_name}" = "debian" -o "${_os_name}" = "ubuntu"; then + _configure_opt="--with-gcrypt" + sudo apt-get update -y + sudo apt-get install -y git curl autoconf autotools-dev gcc g++ make gdb libtool pkg-config libyaml-dev libgcrypt20-dev + elif test "${_os_name}" = "fedora"; then + _configure_opt="--with-nss" + sudo dnf install -y git curl autoconf automake gcc gcc-c++ gdb make libtool pkgconfig libyaml-devel nss-devel + elif test "${_os_name}" = "centos" -o "${_os_name}" = "rhel"; then + _configure_opt="--with-nss" + if test "${OS_VERSION}" = "7"; then + sudo yum install -y git curl autoconf automake gcc gcc-c++ gdb make libtool pkgconfig libyaml-devel nss-devel + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y git curl autoconf automake gcc gcc-c++ gdb make libtool pkgconfig + sudo dnf install -y --enablerepo=powertools nss-devel libyaml-devel + fi + else + echo "[NO] OS should be debian, ubuntu, fedora, centos or rhel" + exit 1 + fi + + echo "[OK] git clone https://github.com/yahoojapan/fullock" + git clone https://github.com/yahoojapan/fullock + echo "[OK] git clone https://github.com/yahoojapan/k2hash" + git clone https://github.com/yahoojapan/k2hash + + if ! test -d "fullock"; then + echo "no fullock" + exit 1 + fi + cd fullock + ./autogen.sh + ./configure --prefix=/usr + make + sudo make install + + if ! test -d "../k2hash"; then + echo "no k2hash" + exit 1 + fi + cd ../k2hash + ./autogen.sh + ./configure --prefix=/usr ${_configure_opt} + make + sudo make install + + return 0 +} + +# Builds k2hdkc from source code +# +# Params:: +# $1 os_name +# +# Returns:: +# 0 on success +# 1 on failure(exit) +# +make_k2hdkc() { + + _os_name=${1:?"os_name should be nonzero"} + + make_k2hash ${_os_name} + + if test "${_os_name}" = "debian" -o "${_os_name}" = "ubuntu"; then + _configure_opt="--with-gnutls" + sudo apt-get update -y + sudo apt-get install -y git curl autoconf autotools-dev gcc g++ make gdb libtool pkg-config libyaml-dev libgnutls28-dev + elif test "${_os_name}" = "fedora"; then + _configure_opt="--with-nss" + sudo dnf install -y git curl autoconf automake gcc gcc-c++ gdb make libtool pkgconfig libyaml-devel nss-devel + elif test "${_os_name}" = "centos" -o "${_os_name}" = "rhel"; then + _configure_opt="--with-nss" + if test "${OS_VERSION}" = "7"; then + sudo yum install -y git curl autoconf automake gcc gcc-c++ gdb make libtool pkgconfig libyaml-devel nss-devel + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y git curl autoconf automake gcc gcc-c++ gdb make libtool pkgconfig + sudo dnf install -y --enablerepo=powertools nss-devel libyaml-devel + fi + else + echo "[NO] OS should be debian, ubuntu, fedora, centos or rhel" + exit 1 + fi + + echo "[OK] git clone https://github.com/yahoojapan/k2hdkc" + git clone https://github.com/yahoojapan/k2hdkc + cd k2hdkc + + echo "[OK] git clone https://github.com/yahoojapan/chmpx" + git clone https://github.com/yahoojapan/chmpx + + cd chmpx + ./autogen.sh + ./configure --prefix=/usr ${_configure_opt} + make + sudo make install + + cd .. + ./autogen.sh + ./configure --prefix=/usr ${_configure_opt} + make + sudo make install + + which k2hdkc + if test "${?}" != "0"; then + echo "[NO] no k2hdkc installed" + exit 1 + fi + return 0 +} + +# +# main loop +# + +setup_os_env + +which_k2hdkc +if test "${?}" = "0"; then + startifnotexist + exit 0 +fi + +if test "${OS_NAME}" = "fedora"; then + which sudo + if test "${?}" = "1"; then + dnf install -y sudo + fi + which bc + if test "${?}" = "1"; then + sudo dnf install -y bc + fi + sudo dnf install -y curl + curl -s https://packagecloud.io/install/repositories/antpickax/current/script.rpm.sh | sudo bash + sudo dnf install k2hdkc-devel -y +elif test "${OS_NAME}" = "debian" -o "${OS_NAME}" = "ubuntu"; then + which sudo + if test "${?}" = "1"; then + apt-get update -y + apt-get install -y sudo + fi + which bc + if test "${?}" = "1"; then + sudo apt-get install -y bc + fi + sudo apt-get install -y curl + curl -s https://packagecloud.io/install/repositories/antpickax/stable/script.deb.sh | sudo bash + sudo apt-get install -y k2hdkc-dev +elif test "${OS_NAME}" = "centos" -o "${OS_NAME}" = "rhel"; then + which sudo + if test "${?}" = "1"; then + if test "${OS_VERSION}" = "7"; then + sudo yum install -y sudo + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y sudo + fi + fi + which bc + if test "${?}" = "1"; then + if test "${OS_VERSION}" = "7"; then + sudo yum install -y bc + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y bc + fi + fi + if test "${OS_VERSION}" = "7"; then + sudo yum install -y k2hdkc-devel + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y k2hdkc-devel + fi + if test "${?}" != "0"; then + if test "${OS_VERSION}" = "7"; then + sudo yum install -y curl + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y curl + fi + curl -s https://packagecloud.io/install/repositories/antpickax/stable/script.rpm.sh | sudo bash + if test "${OS_VERSION}" = "7"; then + sudo yum install -y k2hdkc-devel + elif test "${OS_VERSION}" = "8"; then + sudo dnf install -y k2hdkc-devel + fi + fi +else + echo "[NO] OS must be either fedora or centos or debian or ubuntu, not ${OS_NAME}" + exit 1 +fi + +which_k2hdkc +if test "${?}" = "0"; then + startifnotexist + exit 0 +else + echo "[NO] k2hdkc" + exit 1 +fi + +exit 0 + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..2fc4cc2 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/authors.rst b/docs/authors.rst new file mode 100644 index 0000000..e122f91 --- /dev/null +++ b/docs/authors.rst @@ -0,0 +1 @@ +.. include:: ../AUTHORS.rst diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..17ef659 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../src/')) + + +# -- Project information ----------------------------------------------------- + +project = 'k2hdkc' +copyright = '2022, Yahoo Japan Corporation' +author = 'Hirotaka Wakabayashi, Takeshi Nakatani' + +# The full version, including alpha/beta/rc tags +release = '1.0.0' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +locale_dirs = ['locale/'] # path is example but recommended. +gettext_compact = False # optional. + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + + +# -- Extension configuration ------------------------------------------------- + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/history.rst b/docs/history.rst new file mode 100644 index 0000000..2506499 --- /dev/null +++ b/docs/history.rst @@ -0,0 +1 @@ +.. include:: ../HISTORY.rst diff --git a/docs/images/top_k2hdkc_python.png b/docs/images/top_k2hdkc_python.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d3385a551bd6a7cff18e568adcc67c59b0825a GIT binary patch literal 297389 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�S+2>&l?~~oO@DB8(L}O9|AvBw5uz-kEG9&_m>?%%Y zHzPP@HRb4$;>`i&|Kl;TkaMVXmus;Zv-cfw-yO-~YtF80lH8#S zZ0$ZZ7_3B4-G%-w(-apunVdR!W(pC$p#Qo|tr8z|J3^RNT|21+LgLd=E`Pom*F}mg zCoQ;__U@k1eD+a{B_M%p_!&U9z6!rj+!LgP7CVNZQiPz<>(+hg&Eiswv;W`4Bm|)G zY#2uOk?9tn)R_Vz%ZnH|ye}DjL=kjiFySFZ2o0|usthKcpV@~{!W87>VNdx z&;gndl=^-J*}ME=oYcF^VlF5?Ye#bI@{*S@*j$=rU@nF{Tk$f@ErH7A#YdI8SI}^# zrs9$3XIA@*sl7E ztLz`Rh+&%|?AE^7o)%^L|COTtr*RBM4v^Dha07cHjSVGHv`qc93=%l4aN6+LaIdD; zPt-l}a-9%NfUYy{wSevuaiT7KCMC!C|rx93ref zr9yMRdG;EyKE1Rg1cDJ7-d)qsWx`mmBk)l0ars7C%woj#jcmA%+=vNeeU+5`#1s=v zx)lqB^>&B~{^ua6bY0=^kA_taPyoaHf2Rchx?>bbu9lcl$I2u1ZrrVCI{2#+hx@WzxZ$)-C4|Mv(4m&fZFb_J+Jz6BqADcgoML&VU|d9{l9)u-3M{(I^HwQ z18=k*-(q=Yxh8asXsj$6w!)S~hs~&AXR0u~XKdK6I=ip>zA6U>MTh@XX6nYZV0x#= z|MSih>&>~aS=T$1tXaXY*%4r5o?geZ=z0G~ydOMYEwh3G8p%}eKcFsDXN9Il&drSY z&wh{=oSM~ZKfh6X$T~9$ML7~?tFBqQQeyb*yjTQrC3A{cS|e zNE9pkw|4bE0+xT>2RapyeLyGQ-7rYHkvcJOIFmj^C$jN|xqTp_l~S>HPQcGo&6pn{ zwtn5_gLy7R2&=I&x$`arzO#VEzL)vx!x8!+YEruvU5;U8ZLT4eX}onL&p!T;-Ih#y z&lzODy67;g(H*AKvU5Bt7u!mcQwM;(<4ncN3`q0wDX3E16WaGs6x`=`Bg;7E*8iL2 z;S*rbSq=U?qu?stt%vdtdt4RRMv#fd0o?W-yYdnl)3PxncT5+MYK(_gn3LD)RNiIA z<_kRwRd~ig#D$rJcsry2e$B|>9-yi+1VPW#g7RXtI0U z#l|#=c5qjNCu^N!)lQ)9m7#BfaZYHk5A07-$9ZxroNladW&L#%Lw?`=Nu4&>{Ety> z_2k?)@4X&;c;ybf=)?Ay#_bSLL$oHYJO_Nv7VMe-4_kw^>{!_J0*bk+L`ke4_1mejw^^?G? zvx7(9aY&ae>~JGd%@Gl#3YQG(L#kmk+8p?>J(}+P5|>eNd>mh7xvz}2fOpwv*ETrs z|6%wWz!hY>+rD9YR>9w5Rz?+Bt_cg5HHgHa&e&FmHTQW6c4^hntBQ>GOP+aX@EP9| z-@fUpZZn~m5|zE~s^MVpUoK0+d$RVy&HcQ^#5(%7@cW+EQVwbCF>6fjJt0`Sn~`L3 z=wEGdyX0t^%_TN{O}>R#x#yEKL^gcM}{^BXo@uj3cw)) zplbrN(Ok>X#;|?(JdaKA^vuymb|d?V&+i;av3rY?5dak7SZ(7i$z~=Xd!(_M5CfGzjUzncniZNJ!3O_|D=Qbi&{ zFi(!b>PfbaJ;Ja5YOyQ=0{isPfdBJWRC`}%@>g=!TjILWSbxY;Jxj5qhQb?15dSA6e80yE>djz>1)+n}iV#Dx|HSoI@w-P-;ck3aLVKK1+Jjdi_{OEE067)SRYRY) zu#-dLxrR)S3IG#B>{tJv4@VSp9*;2dI{es7O$bB5XQb+TOf&O&D47EMQLIGEkU$i@(N>1IB?f~)dHK^<1g1X97FNekRf7Gvl0{Gef zh1l;A&ulx@LqMfJar#fSTz4Vnb7;w~HxOSj&PDXBAqirE;GYrkyv$Po2B*xN9 zNkAhe54^+t4Wm1r{#&#D2qc0`7pvU@4VaS%M&V%>$m7+~{hPsE&lCh0PY`+3k!D;y z6Lof<%Z=*hXwk`&pkY9dy+7_T4p((Pd~a9 z%ZS6+^*+~2!ciC$+_2eaW|7Y7xJLQkuGk*zsnUON3OUew@VNj6^+*JjGogj~NoG?= zbK*+y52U9X=-GxXvKg^1Vsz3~~%5J90DSBqS$Z+}^YzO*#{h+7q8cPJ=rrGojamoa!feo!cCI8_-bdYWE)YX;Cw0oG%g(!%(39GVPlf_ca(Wcphmr*;w~TAP zYu*Z3ruhz@b!vn%NM)%AaN>qDx-&@uPQcQNikBp8Zw=cXKWL0?H`b&An?^Sk z8Pp>uShE)0xQ51z3CHK12e|wAm}A_kh_X`d4T6VmkjIot@SL$181m`s9%NC0vlmia zHw}1h0`>a!5&hY_)r_xP0`I|~4JzGqpFCMz4D)Edq62VP3_{tHXT|$!pAa*G?&MzA zi|bGblBi_Jo_F9)9O)DWFE8)J2NE9p$xt+mLlLO{R5Lv-1rP~6(bG+v{G|R*oNIiX zfQ7f*zmNm*2MO;!=Yvq;^+wb{6b_m8JGS!?~vPAt#J@PJWYfOwaGXYR2IhW<6j&0^WP>AOjP#u_18O&HV;k8mf66CM@> z3*1!CgS@=K#=h7BTylrUo?O6_{z(P_TQ-1CFA{cMwRbK)EHuA7aQx;(It1F36AUON zg>t0l0d)7euN3AuSiIkruO7TQ<^80y%qJnbMHEtVbvG8m+{B>Xtp11iklwcz(HuM2 z*9&#Nuw`MY4MvBR(ols@fDO4(a~iXE(j=)~V`Q@Jh4!zRA(Owl7u^!T-GYUlQ=LPT zY@Kb1vib@;v~IWCpEou%D3AbdF6MhYpA=s~|4l4gcp@+tsQlCP;-QpFiVGNQse?|M zIw39DpC-fK0v}+V24=lhBCqLIBY!tv5iai#01=x*l%(U44(Cg<9ajxjIxP0C(b2l& zkEB@6TeKkv7K}|#1r?E~fe!bx-H5DQhdMSi~RY`k3Tx4!WuYF34ZD5)Ug__q3(~bx$$AI_k!|Ytr5I!pI^<-{?8Ru)99pw-wl@Dc1pHTn zp3(vVG*kR^Z^^U8S^A6AR)S?#$pKT;U&SI75|e1IKmm#}1*yGV{mQVHL<#T_0%~(k zF0H^?`lMIckHWs^X0H~-sZQAQYd#3F{qin{{^eD{*1HJ7w$@L|C}!&8@4J^JsY;*# z=V{F=xtFauv`r3%9zX9e<`n=Ah~g(RpL!qW@W!Z$pUiwh8%jcQCG048uUasm={NOA zW&2O+mEWs2JEyA3O%Vdoj(&L)R@#4Nc6D*!#aH+nkeyr!4kj<@P-&102tuE+q(*r6 zTq)BH^=PshP`n!YaNkZcD4Nu9SCqJApE}qjk;Go|CpyRgeTIoEV*1~WnAEPTwnXQB}r40 z#t-ZTSFGs(m%TPRJTb$~+>Ng+zTVS3tih{tv`gG^!dkvsXXqZVa2ISzcu08jpPBY{ z40w&)_Af}x)oqUBZ#(_5t)U=`&#YqbdG{b};RShwl^>Yx>^ppA;;~@EYd-`Z9_$aMz_@1+eD@AIEf-t*IqnBvvTkm-Zq zk4H0}-}^%mQDNfQV*6Y^E>r>e)3bElju=t%sAmuNBt=r3Z} z2580R2BahdS6C24M*KF`RF0MDO`6JrL%-6q7Zz=58>dz6z4wIJ_qpc*B@iIs20{DB zLnnjgjFrtnZ0OCN^J54E6Mu-+J$WJfJoa{xxwkQ)Z(*48^K-RBngA<#+sA37AqvN= zxu4)CeD&I|+4$~Z!eG>iSyr@mO*#r%4JaWk(6?-)Lw zzvM=4dSc@>Mv+#B6*YU%A-bf?7sujaFn&$1g6*eAaMo^dsJ3}Fqu#xQ2s|Y?e#*4{ z?H>KIb7PHDOVd!oY*If>#=&?XPElpiuT&kbU~&T+4+{-{<1yRuOI-WIuLf+PN2)(& z_HCR4+g&%!gT7TSbDw543fK^17fp4(mJ8?8B-wE)FX%ApdbL}%n*2Ht_d?X0(B8F3 z{j)%lT_kgubG6EVNWxxL#O4sk%brj2nv&xfDpW+j4QsXeEpxV^Z{yn+IxnJ0D?Z|z z$(w2MU0HnFI%@K+5#F=*woRTkQMwQt(0mt2z})WUW+>}D@9FYB?9b|gTPSxy+7-(V znKCXjXY7H(C%91Br==FqAVua+q_xdj58pqFG)eFCDxB!`n!C@ z0Sx9euRdY4v9VKjonxJTJ)Lb9m}I?-WU!9Jq2zF^9O>}e86Ko$%ojLuVgTc*$7e4d zJs0`?bNZERxWXi91YI0?-<*mFnz>5pJ#TE-xmrpH8BlP%$ zZJr*bk5)TpGGc1aafw}bS{10f*YmLqdxlGR8Xur67grF$q~5wuYA?R^iY#c#B`dMC zx~knIGUuCfE&LImuYNLSquuUA5pf-II{n(qxpryDWGZUpGGC59KrNZi@naL^FZpj@ zC32HH-u{%_c=OV! zaZv3|O{+w~<&WH>SFr|m-a=XToM|?Kh`yxWUoJ6W+Ag`^q!ZSvP8n7w-i^7YCep4?;;)+~x!vQ-a^* z-8>9XX`c&J;S=GPaY@-O&W-Upqx2>@x#v}AiTCmN?H2x#oY7@RkOsz9PkzL>jYKn3`?1GZ=uDzH zr0Ue($>s^gf-cLd)-B@8yUpZyatX3SX(nrSQ59G9m0~9|38B_BpFNg_zQ`3zW_`ER zhpUHoUmbQT#}ad>JmKI_A>r|18@>GTK6P*%6`70I!MqQ;w(=BY=$PZ)eg=X1d^BEB zq+zoU`^{nNmdr`aY)dfU-2OG!WvL@SCh>Ddt06)*R8v_f1fzz5!adyj>-kNfVcp{g zqc21uxnK1J>}!DK8cNPO2`ut{nC4qr*{ z^b{tbcTt?@Fbumky(xRTv}mtWG&W4%UH;}gsfjHpc|?GXz(%buew3e;0F^>@<#wKY ztIf+~3I^LQY^=lA?C(Ft7;rYM7sSj>1@^v);oX9i%$gai-F=~px&NueMAbo!)cuE7 zoe);rOusN-a{5Lr%A)`Mu2atGmLHDD^Gk|A#`aGK_97I=0#kc-1I-<(r--=Hr15vt zhoeuW+Qhhi{ZNBq)f7Mey(S*lzRgawUqvagr|wggCF%54oF*%Aa!h9ZhVhdM{q5_* zUQx}iiL1PnY~q2xSV{Ht;59V;HFYeVLyM7<&HD%qpGGc_Vg@^62pSWe(xYqC^l>C6 zmdadXyxUzFRd_^4#Ie|nS0lu>$)R$6w(wEX>h?*RIFTu(lt(=K3ziRjSr1c zp@8l6k$B~d-Cag}+E)gSzHb@J0&C3+Dxv3BPJv}9Oh-RS>J~%ZfjA_Y7JdhP2W;RO z**KyTK(w2_%sO}6YjHnb{e9KtW0xYqw*N8S^?FbunUYFQ4KT3=Yiu`YL)bd)h}rcK zKf7+yv-O`!mS83L`|P<7YTzmBl)k2kxYc7~JTT?$ZKYw`sfPLRx1xYovQ9}R%vxR2Y^jB^CYcVTzO;jpF(--ad{MANHfd+@bGN^&S)h57x$UOmr zXjF#mw(EkT)SV~bA>2{cf@@tJARm%EAx9qx zn-1FB?XSwS_M_C69uPBN3p-+_kv}e?<5ytsUaa}P%2xEToq6fw)n~1;)pHSo=hMbr z@%zp1OIu$FTP$gle!oqIPRSFYbd@_&r$hzOtz%olswr<8e?4pVNhvTZqRj@Caq9ES z66G!DVzG=p;g^(uO`tIBo?-B8Pm!t4;pyjrVBu4m%3CO-1a7v51{~f-QWA+Am9#W^ zO=-qLN39VMi*jbQo1Km4JR50vF#Ubo5evM)V?!#{nQtR3-!eY^R!uF5SujL;L{^Mz zeijrCw^7!~Lp%7(YSwFhbd)^Igx7t_jruP9ZODa#mbHIIjj_6}IA*D7Z*a*Z@>GTP zc@+m7DWH%_UHqMk-11va_hTRP{Y+6~s-!s*QA2z3g>Oz>GUPk2?M`9-W8E^4&L;$< z5_LXRUB`IYP$Rgn5{bvsTdUrc*fJ^t4FrIuL0JSjH2 z|0#R^afH$FJr7;(V$rj-X*v$*9q2X+&3~jI*Omc*ZgWx_ABMLN=KwA!~B>& zc6`&8rF-|2za(Wn>SuUyrtVKG8O;VS zD`rD{LKz(8Td-LTjLo`jJ)#%l(pOYsb~E&Y!*sw}>82|Qbl&41E}R_w425IA|4i2X z`Jf$(!rC(vTNULXEVv0aGdDZgb=VqZc&_z=IsKh<zR#>He5`ES(S(SBHsC=Mt$6sSMnBQ)JTRuMn@}m(oy={ge*Yx`3nJ5zN8LbBv4jY%`b*~rof^yt*D{WaABqZxmsoDl6Jk!T zXuV3zz_2Z5A~t!-j7=h}{j8A23XtEBj1;3Q$pwEoyV%ZpomZ4Al1#8nXJe0_`A2$IrWN_R=;+g$JczW=@djlp0zhC@88z4zK{&o$>0n4n<`1PzLvy9v45iDR;D&|k;Y^EGJd4*WS}z=jx~Sjl{5>2s*vutx{ZoWFAGgPa zN(#OGjX{p`tAxJADY>y@>|?I@0L`^4i;(!%5ib2%rbodyCtRUC6O7sROB67U)!jDx zeaV+HIfUZIQ0ajluzIDfeEK#@--xojut7|h3Ld@n)#I7x%61skH)PjYH;K$uf;t+RH|8mfVg-(4>cV3D3XJsi7-^?|}rg`nM$mDIefH~{8 z>38GCB^vTxr;o9XWmM`j);QxnGV}52hWX1hkvC8X{Bxv*5Birg;TB)v_3GAxQ z-hXKW@qBhTIl5e@NUdb6pemSCHRivPwrK`MVt;*1iD%1xa|(z-62biZ8D z*z@WUyyn2`xYDfaUldluk?3LgOFf>7IIr0MGMQDAj`S zlRKK)`sLyw?Mz5qAb_`-781pqZr4V z5~?xSN`i@0@<}hdlmYuul;u(+YcC#_&2Y2NcXfDsZmLmyb#v!^HOw((sH7)ckV~Em z7j}KS7lz$4HT(tVJ+Q=#bLvOi8+9Mq`JpDZmd3adnDX5F=l!evlV84Vq+qWmhDi(@ijf_X1G@{}9*PTYeW3F5ZH@4XOV50eWj( zRQg3k`TPDs!VCgKbeFif+oOd6y9={&5}%cze5p^(=6Hy#QT6K+Saup(o%tGcu zr9XZfp#)xBN)t5|%o}t~%v>s#{gDljpf4&l!hCugY&4BTV&DXMvt&_)i0z@2z7DXp z*3mGIC-B;!zBH%ms6>%1q$?(St~UklT)C-!l#N+T2XkEtn!35v4l5A<0WE_ zJ#sHoZX>v3-EO#R%Ct(dgxm|WA-ZbSEkMsV~4?S^j$))McvL!VI=XAcxPM%Dr z0Zu^b86-bz8A<^r`)Q{nqY>##4C7`hdrq>RQFL`$;;?b`rr4w+H`VqXY>tm#y4`TY z9p(|zzf7c2 zRdUJsJ!vN9-@?%v>A9lcGm~Y%B!R&qeT?UzeU^a^F{kqCTTv;8#;8kV@~eh)_4&XW zU!^$>cGx93kHq35w^j5lxr==pwr_j1n;=nv9M~v$lpJeAA*H!I9uAoP_(eHwu&l=h zv%4-0KM3V zxv^7Rj$U_|AsSpYjVz>+WoUbrfj2aoQ_|O&EV6kt>QwNhS;fWrf}YsJv8rr zE-!hZf##}*_#>Z_h(1Zbk3jGi0u%Bce$@htul9?oug(Z~+Fs||EKzyHtC)pn z1dhn3ggyv7Rh}+sQAyTZW3vr)Y7>(j`rE2JBhJ%~>_(%H-Ulg%!O?xt*GhA^#4~e$ z)>Z92bakF6y}y`ns#6Sz0s?fCzQ^f>Q^WmG1-lagYD6sjzo2jdc-ul@3N=2*?AGTr zWE1-@AJ$|z5DxFdbV^9JQHVnEkL;-Fgr4smJ|&!0oMVaQJ+Mrp1PDFk`MFS!550VK zTp}LdxT|M7N0Wexgx=oVuW4>*Jt9l~@K0#)6`rApv|WmKDXtO`Bi-vY6i<82u)%V% zWawM*!ESsZ$4m}n#LY;*;ULtLO+GIOJOjpCU@L2N+vpmV!0UKycGW3EEkRVAm-msl zUaK*AdIe1=MN#1Pq`*0Z2MIpzxz1?aGxGM?8fR*OvmOe1@`hmL6^MdsquzKl(xu1Q zw!}@sP>t=5X3>0;)-S~6q@(df{=huV&~XU8(yd#PkO0rUf_%H%_Zk$~cTZ1(R>Spq zQ9hrW%DtL|51_!zTzq0kuoVSnBi51_=F~W+VVFA2*XqHX4||m&o6O$MyEQwV&$?R< z&Ii$K{-J(DmjkaJR>m_jn(zRS&hfV7x9Zt z)1W2b_J2%rn~>2P-ns!55vBNB(M(`5$H0a83YD63?df*tQ$SfK+;#kW28g)U-C*_%VH zX2)s3IClC9Z@4>asd+4-% z{adkHV})5+S+`p;5w>o83vNG%R$Y+82-A-PXwXP&;KGvG?sI!r3yT%{DkJlS6cGe| z)Sce$$7X|fY|+C?Rcy4$&PaTq(2v123VctT#C0o;%w09ofrG*8Rm!U*MGjVqetK$&DpdSifqbx z0^ZZ~*aN7h=srZ^gRZ&-c0d~OT9)np##P~+tP`gY+F!E=r+viE>r>o1IItbggQ($mYY^-;}uNL<+a6oI>yFImXT*K#B|B6wXOSG=$$mB)k)YV zG2zd+e)rWz_6uiW5EJEjxU)5}3{xClUIC9HJ9qA_~x_}ZjI>b9aLc`qq2x0JQyBIc+HDu`0 zOUZ6F%{+2D>&~16NB8R-J3hW%W%Wp!0+Hvs`A-2}7;S8U+3VMsOMDf`5#p!6 z9(AZCcj4#XUS=(uG+tEp7v$vR+-@=c5G;#-yWN?tS+=hl-xp#UA(Zx+|7uhHqjE_Z zA*3X|tu@l^j-Q%_uju4e}yH)H;q|8wSi zrOK|w(?kYEs_{ADSYSB4@0u0n16o@& ztNchA+wR3B2QJZ`iZ=0pKip2;vz4r_Q6KDHeclv-dEPItiwg3)i#V!n27inzlZ7ic z-!3|=ua8~GwOaYoZnK=}snc`+Wt?S@K|W#`O_V2}lFgS)4W9)Rl4f{A+~VFdCrfN# zs^S-We}8l`!!~HWfzAs*&P6SUZ(lMx-^@428$nzrY3XWq! zOnNa5>2oYads%N&gM+YN0gR`ZIeHPSd)%Vd^xM0TOFJWe-oxk6Q7JzZ-5l8(PN(r# zyg?y$%dx3^ZsMxFT{aYXU+>%fT`ps_Lbpb9OGltEeYk2q$Eg^a@%i!befi@cEkk!A zqUk#O<3~4(&ilJF?0?3T)QIz4;nJ)Rw{6N^Po)J&n6Hlf7JPdkpwsMNyn{h=zur;S zw&dm9xAKa`4=k@bIn$cUT!du$t?~C$^==v-hnJ|=ohY`5vA9OLkD%aPHdyc2paKyA*I&G5G@!AE*72}=G7f>Te&Y=iJ* z3{HQ)MWogE#vU{OB-zidb|xyQ0`!e!p^k|4Fj{sBi5Ba&O8#(GRi_&2_olf>2?JDp z3{Jm%lSY4`3X)_QzwmmrIp}>BOM1M}PFfg!TI+Qvl@6`FyP`V^mQsxkV`_d_uF0|J9{Hsalw!SzQ@g2WP#<;+uY+jEL%Mvg{=Z1ACl6dPM+NcH15N{ zsy*Qk(5Dpb)&<9yzVGo79wZqtR7Pgsg6B)#(bmo)i*v;!SK)VW7>>R}X3x&sJK}g! z=r7SL2Ji2J&8(Y%SUml06bf9A_G_4DZ-PI*u6{OE*7o%cU4zq`D_4v(f4^?T=IgV$ zYL_DunUY!_VEw*9wFf zDWhlb-Pv~=>fb8=o3Y>_A2Eyq#Te9Ef&>)E7B--$^bGQV@~MmhpMxLiPATfojBWfb z=Tk6!*|+EV?C`}4qWh5KOazh|`fw)6cLhTFKp8`phBgu=v07~dRuv_xG@__o6}-V_x>!)tsNcs)S%hfwou z^worm9fr|fb_sZ%9KY`0+~ZoBe^?3rD~-C!${fkaD|_>k=?a%_?U1oAl&?zyQdhBz zZdo^QXOC9mWwaZYg4GJ94(TlKPNJi??fYFua_IO%g=2AyKpuE*3p-R*t##iw8|upn z(Hc1L(iz_Y&`S9$xw_D8?Ba^fR55JEWP;+xy=FoPeHu_vBBa+1l68HnbRWt|N=;r- z&@cPX3n1rtXk}RA$n+nJP~u{@DOH`TpB!1&UE4-x@S5pjL%ENBAS>Npbq*94dUaO9 zUP+`29e)f&qOdm}3h53-`%90Zr7!}MX`S``k_c{S#n7F>0r(`^zHYP}DcYnmuMn0V zj245t8!8|A3R7Gi`cfZ zILLmeIkqUvt-FvtR%)hRvMpD$4dqm&MIq-S63tXIm(V{BgH~ z!cPj4TZ1XMmzNtSgJAIOQ~BQo1@#Gcj&jz8&3~b-T=o%%dW=sf9peTd>aq402>=|o zP~Eq{i&q&k#v5j;B9<-k-4Zdi+H_QM-z?67+limK&mk(#otb(ka6Nj6owoBUY#Oh1 z9a-mMo5!R{!ahAxL~5b@rEv@i4-_W$xh1^uREVunUnWie>z3QPgdT62*N2S)rM%nVkoPqn+9&h^{k?7pHLE|PFZO=sxV;kh3lxaQ zH$C|a!$=Fk-=dVm#*4QFi1kvG?hQU5kQ%`t^)jUcqkn>*r*-?WMjPW^B9-r&&%CSW z=@psMy6QQQsK&eGA~MI2BmJj%_St+}VVWg?h)C&Y2@{pcOvOiny;+y$)#8|aoGjcf z4NXhu3^PSA++S-P^}h+<77yYzzJ)17G9V?VhmRH_P2!5;6-0()GS z{%Yc!9yt!@_4l4gmqi4;9QN^f9%svS>hv6TNt=x~b;)_s2?iCedWF9IlR@JR>sNP~2LwH&A$Q?4AK*u7WDZ z4>}U$PP{U{wjN~tT6{dTS)LRqplcJyXqr*5^FB{5h|&(Fij!KUciuQ&C7 zwsH&zH2h-cTF{9+);+Tl_HJEqOK&#Qv#!3|&_8TWya>{5aNfaJwXpCxq+}NGqHf6; zN)SLOF@|a2=k-+Vj4x~cG`755()wI~!uC2rJ~Ad%lfX{esWEt$>Xx`OcoZubkt!^~ z2+Ox>^nI6Q7SKvvUgt(M4+i7DLMFt|kM-+({kl-k)~W_R`h#C2(!kx7&6UZzd@qKB zN`Isj34=9%#1FCih66zrZ!C`1!{som&BNazNv?%KAdpxfka>%~LK+&H`)tgC*=FZb z*EHw5Ghz|^7e?1=G(=1NH&uLuG~s0K7CZ?nLK zUcCYzKu9zdih^8p&R&J0Kgu7wTjG7`?dX`weBeidCl~&2Q|l3cAf^4& zX!zZt#?J2o2aklv5AZnk2KO>3MWIbFVCE06Y3WnW7666Egp2b1T}V<_X<2Du=C$?-cVQm`FrWt#5>-^{ zer_k^a#~Jbkz&CH4csPER2@zS2&&*!1>=P51FqWjSvw+Pm$fZT@r1zl*{R^gRXw8& zLp#3L0E0T`uatUcDm5O@Sxe-roOkH>-uq!OYOLfh*b2N>@=rP~)c%Wd3p!8g6%o~E z2vtIN67vv*#oJA_Dj_e}GBO`2pR9qp||I<^PurK&Y|1`)4+c;1R z!`RB)>fP)&$W2SNA(N7rU($9?L(hbd9&oK8gbv_Rb9wv;hpbHJ#FtyS5 zt;51ksoJm31mc9g`xdy_i@t)%zXQ3djG_B)?YkN6BYKM9k}=wM_TK=nC zaEO+l{Ok~5H+*uZb`fU3RXA$DGUI{XE&|j+jIt#R1C13ES568MQ`2KgWOH}s(yg+I zUNo5?i|C&4!>vtl?qqnhW>cb5!eIi&fCQIK(Q7GyY4#Ue5Y9Ecu_J_fG>76d28RRS@%6_uWY;Zusl^Od;O{8-xlZlXsX044)4NNg zwr$Va6xz4>WL>$~>2;DD36L5?OMJ@_4JEp|Qu9?NY`{66AL(LK%mK8l&`bW`p+h~9 z6B;LZ0J!42npk-PT+Y>=?jK;E62HSg<>PNvRsopwMZX|bepCMHS4OW}m~~0X7qfY? zA9rEkrl%{c$XR_2uA47CZ&LB7i5~8kpT&Mtf6F5siVR)&xH=l?a1O!J(kHus{sDR? z!DZtWU-+Nd?irALuiu7!PSE78D*b+Mu6%}h`0o9aW5s3C}}I6S@9T$I)yJpkwy0_suPI!{=@t8}Hd^qMd^+0DFUdt3>5S@_9I zJOk-Ybn|6o%-4%`OQZQD-Y>JHcJn;2jc%7dpsQY{2~-f_syJhY`Ek7LLWFrHFhnpX z=g^+d`wH<8?vkNB!)ri*?QAS5w0*r$#)SNw=g0T$-7RpYp=pm|?SiRWjCxgWl&@H} z=R8@~AjJI90?7*QF58fc zVCuLHnB9CXh+&u$HQtWp9;NH2(Qrzjb7Xwu;;Py(ZrY>5ei$5-g_fTKXR~+`vRYae zVI4%Qcm}8$D};sxuX5q~;}T_}zuqX~x)ckxq|kDf#+dEyf1n!6$R?JtE}^tf6?OHj zrJSg9rbaC1#SXdU{b%1z@A%{Y$GaHLg`>l<%uI5!5@oY7ePK)qa+?mKuvcze?55?D zwj&+G-qF#@lj>L7WM7O;tlVV@%~&Z6wXZdhDozqPJP&#D1h5HhBH%_tt?dU->{#xf z4(shuE2#+|eC-el$25XRdDW&%6$Z;-=`?0Uw2WzYmglaFM3O!+=w^-_+>(DoQ7sK- zhBI4%_WW_LX#VHwka9b)7N~DamMyT<7QWm#~k&&zcxsImj9H$(NMK1Cbjc_@UNmU`5^};Yu|~ z4PctCus3nEp$cKdISO)1@~#QezMgKJVeMxeO=zzek$p@jbaXDRE~9cw1K{K?obtp# z2}AAWJ&g5_k%Dk4)P<(qdKqt$z|mMgRToXu-_HjL#B0Ci)KiQ;HyMwd{uzUsW?Cv? zBJMNo95l70ok!z(2U( zFjEF^K7~LK$0x^!ADu7!XvOYha>6kBT%wSoNUhLtZC42k@Lq~i_2YO026cnyIrMtN zVvF>kaRn`|S2)S00UX=Gn-jGpK0c2=?r&dw?R&Dbjy5d|V;+=^aSYl~eHgah*JnFY zTKaU1M4Gx52Zldh>`e>EKeSC+*kwr)Zd%6U??6Fw3-H2fi`&rxw_pJ)*5rbv zi=8gF=o)X4GNhQqDXx7&Rmt`~TKYUkJg*n-t!8v|oP#+U>5Fl1&KYmflHL;Saoub) zZmgujE_-vU-T$B;B?T9OxnA5~|G6px%FuQGx;qp^``tldyZEvbcDQRV2{ox5VZiM$ zLk@yrXl1J1fLNRsQZ9WzHK)-=su}0OoIjoE!8c}1I{GUA1Mhmw2jQ1}MAv*=+8Aq! zXsyrL-a#TQVXkj2so%Zdq~U-Mi_JANR}p#Wf2~p;f*0S(+D3XmUr4BA+b>WEP9Oe$ zPY)uhG1Ua zERz$HRAVi2=_95;MqgN@POLT0D!w9XpRGUinQh)B($*iMH6l+%F%5G8LH+lE9`*9h z94{Wcs|BOY=qaB>s`{-lf*0k_TXEb!0;h9UcP@@9s4Fi_TzRZIat)(rwnL{%O27X5 z0Jkm6pCf5TaL>RXg;LFD3A_kbu`n1Zqo}o?n7M4bPPhG_1}n? zrTpA!mw?ycOXf}Qw!s*t2gW(#4e|l8#_tj3s=^9PJKwRFNS-aQ;B<8I@fw&9)_)w5 zOwy)(USteW1CqHSS~`whf9^5#?WOdu^*XSa$S3pf~*I zB0FOAYbqah?Xy`@4fx3gdVDQ4)9m4`<=Uo`P&&(B86u8zFN;cwz_g|NJNGQ}_dD-A zq|>Na6Dvb<54_@Xk7A1SytZ=L-)<@wevGyyq=dpW<~Byo5AtzS=`sD%I+Zfuu}u#s zDG^|?x@`}H!k8X2k<%CSH^-P$Or%v^GzBd>_%bx@eLFsI;k^?_+o7)tp zGwP0m%DatOIbFFtJ70cop>sMz(yK-tzFFnUide2A^YShgAYXNTo1TnEeHjRU;nXCg zO+`PzO#`|d>A?Zx2deC6#QJ$or-oAA z6c>hNXKF(3uBa$#NbG%KJlkTU)!`;eKsa5;r0>1pij@2(*o>bwF@_R^7|`3KDiM`7 z(!gLwuO2d*ChE1T)%A5SI=VG+*X?Mj*YNE=k4~GLZQtD?{9BKKri8I)@hk%&&ytGsSx z8Uz@^HEKp=ek)mWvXHMc_TJ4Ffy@v0_4SeRm3z7UW*Cjzk;}>^Sr0rO( zFYW;|{1`)` zPLtNOnF^Zp5+rF6FnwHVzV#%Ru@DSI?#xoqs47rXjagCT_W#ViT@Vu##p}KPFZ3Z6 zqfgg*pJv{C*H|EUgnv%L{e`jZxbLlkx>|k!C?T767uX8TH>hTA(!BQcDrZemSOKWv zNFDF%z^GxbOAY9`0@ovC`E8WFFj-XcLb&2{Bm8%L#g&N$|7ucte{7`tI`>~GyN$s0 zF%k;v1y3tiByFGF474U|NDCV7_+c2;L`mQ9=|kwV4;sGHeZc)&Y+6%g(7|i6H5tzg z*y&|GlOy1l$ zcet4l#Kgo5|Hh_Pt+QJokE{osQLF1(+wWcco^-1X4QWMiJHHFnLgr{BX3E^{8-EY^ zD!zMVhh8Vw$Lg^Q;|24n$Ri7|!kf%S$RGGQiOTwoCD;}z-kjmYY*ZuTMFm>2el=FT zoz+$qF64D*hx1*p+1HzgX4AKwN~+=hLwNQ~q$;UDrk{}D{@$6+X)H_S3bb}FB~PY{ z@W!S4bTiEwHnT%s$rIN5^YdOJC6d~DNTQw`qy+a&!s?+6v$4cj$+DgU;$|;LaHZ1{+Z)74fF)>!8y$MX~&a@J)93mbq2W z8#L!?+7wghHl6qC`QvX8sEZujGGu|V^ebVQcxRFMNcnqX{YwOkaiw+>HZ?mIxtY+1 z-Am*DtUrG26W6NT;LE}a)~9Db+5ptBS7$gM$wTr}2K^xcs6_}V>iXVlu;TDzP50)f z^^p_qqc~0jNizYLT@ILVgn@@>030}wHau4|gDi*k7m(&ctcI(!m>M@n2i7oPF(05-B*z(Wuzpkkd!3iO-98jNgTCO4OWE}4i$En__70@VAKrYuAf?jx2yGKTsa7L#s1lW6!4vUU|htBfrP$2{T8C+pf zY)*K?C(&OG7HOH`1f0*i78rewrKK!VTs7nW>?!?=Hw~QSvwNn1UA(q6wzV-)OnI7) z^10FVK#?=nlM zE}yr3Jw$wN!=Lx&tN<-JD%bRl{Vx(l-ViFqwE4T3qKH^5(97^i60ju<{4i>W{oJun zOnscshgUuq0p>L_HP8}Udw&>cwqx%&ZPin8PI(fm^c)Sra^Z$=<|bW^Q;4Ks$yiJE zKnyE?XAE@2aZZNanMlN1yCr4b<(e`hmItUQ<-_#@g5L#lCU_G(Bnf<^O-aANU`*?I z1CW_dB--D+R?5Mfq3NtXD3tJiXZgmSv?I#*Hg!g`Z=j-ADDtC)FuM{e6R|v=JZYy{ z7C-LqF0*g`2pdVJ{vlLG~(rPO0&?Z=$4WA0=3?cbG0eJ1zWw&`aNe(m&bZ{jb6hw-|V-TT#+ zdIjRs<;rl)_6^6zE3N!Y?`_?g)m7@cDdhltGBZG#u{w>v|GX8gN&9fuscwPnP8Z&| z5m1KlU(Flo#|VWn{KhSsU66mdcZ$UE74HoYbW3By6E_6qKVnIAtm0OX%jl_Aa1C}L zquxw05pR+Cjt4{}0m@}~5c7Wfdo42S$^OvodGs@Z=zKamNp|{FrfS}KvG2;RC67vm z(f!NXu0mU{L>o70Qw9P;u(!UeDMliU#tkNKB~quycdUJ_g{d#iXB&ay`=d=tvud7-fRg3~_-d4^gqYnd`1so-n5$V$bp3!$Tbi7(9B%?@idTZcdd zWZc)I4DGDj|DTKt`oRQ`#$j|rLFOEc_zy8uj)RLBkL({sODe@Mq>&R8sN$%&rzSr0 zMUc>e+#D2S4AAUl@DieeY4VJ;dZ9AySDreC9c@zypOiBhA25`!r^8hoJp3BP`e~cI z9_x>ngfrOSea7szZ_nk@MEACVBgv!dvpxRQmt~#5nHRhPpU27^JxLb!Hnf4RtbuAj z_@2wv`lW!uyd-{syoO(m-5~ze(w`x^?JZZ|8;ZT9{D=&mjlop8bf24wj9P1(@8`dt zX&EZK;Ad+17#amBX%tu*i>mt?6N47<*!5TacSyerD2+r&7`)HrivJXNojbG;8UAX$$EAhA7W$j~ zJ{D@Mn0%uGDsOfSqp5&-1hh(?0jmT;wY)GmaoA{d-9G{^!uR@Di8UPLP}r;v6D*k* zKB!+*`|_>5bm~h4Yd#HlO)+nQ1Rh?AAEqFFfH5W-dpDXhr?%3MmqteK(DxnB$$ zpFEOEyW@U#LYR)>*$DO?vr?y`4*v>0pi5!R7Ir`8@0%_dTf&O*D4*~tMJ}(uRp3ar z?483?9^SEWl~QX1_e-muHHML+4Unk(zfS8qkjNPUiCpAaAu|Uf&Oc`r-M@sNkB60E zE0M4&FIHF$H7sD_;nSaHu$cg11Pr>K~@^ zngRnkps;mTDHDzu8iiWv|71N<>`xPqb^yjBF~1#BQh5J5i-C+axp-OT(N?m@=tQ!3 zh8|n3*sO$(N6+w#W%NJacam5hM@n@Q);1J|>^E%?$K}b*EqzdXX5=UwA$Y^Qw^&0* zMOR3t$bV@DK$fUq#vi_sD)|0Jm@W5d`6amZCLuOf!uM*&kVZ*3smo>dg^e9}M9n{@ zS+_Y2%;yBPDTGxQ3uS2(&?(L|4`AX;z7CIS0%}fUK2Y!_OQv57&gci0P9xk-R)P%( ztFmG7zQ04oK?_8q6xiO_Qr2ZXjy3L1#Fo@li68xaDi$d7GKHj(G;v0ipRb;t~cvCMlG*5D?L$kl*hfXpCL zR*wK1Wgvz7nf1VU%|kr2grV+UTRyrLEGoSgPwIH1ZhF*eIUXCdq>6cX?d5_VX7b%v zPWvbC1|dF&M|F&t+l%7FT$1LXT(Z?I#9aFSSh0Moz&c5yKaM_RPV%!XHg;N?_kIKW zN;sD)u>mstB$y~IVd#A%(N~K|^y?4_dvjGy>Des*DC4j5u`v078sL1TavNj!rb1_H zcBd@g;Ce6rWISq+I*_zaUr*BX=e7J7fRw&XnjG>qP@WSHKlUJ$&i?t9TBSceaDBuZ!mI)viFN|OOZm! z^TU~4nv9S)hlXWc{T}c&3d7ITlptZWW0md9JE6Z#8IBHv3qR{ z=7#`D;jSXeYdlg)Rap$z(HG?OR=BKf$zk&50glq*Rp#i|de|{%l5$x*D(Dbv()R4; z`Y_PuOdK~tdjkir0)5L~@)#GDF4z*5RiEkT1(9ANOh>mCA;t7x>yI0m1Mkg(#LX)j z_a%iH`q_~AHE`{`OcPbv?oeyrn`&|&Fn)K{A_Y6i&+G0^uw52jwYheCixF?%eEbP2R9_p>s;+2nC4V!Onmi}H(EZ|AS z^Pabn1`z82WeT^=vEt=V640OEH9A>B2+w^CkIQwkQD&c$Dl~*?=FCelQ^jhvS~x^a z*}CkuBjVR}d&n8fW;|{P^u0QFs-vSe-$TaT=WQbq?V2VB0LNIO@kw~w$1}bQ9hK|? z1;4Ivu8uV98fh?s@gcq$ypSYZBZM2{qT*q51BZz{=<|neoMgKRhnix=BO0OE;9qd$ zCF5ssc$zpaL-Mv5A5Ol~oRg={NOMYb$MkCjZ=XCRWh`-iZGErfHwr0A(dl@bP1!NX*FT|I>2k7l!u~z6T#!;&P08< z(ZgLwLt_&gIGxP3YfKn-q3{zJ1z*4B-OszHubvTl53snLIR20kw5x`v1AJX$Tz{GE zWe4tHsiVruYKNmxESigYRQ|oi%?eYBynhzo!(Sp^r%m&!fH8IEkF?5t5^L@sE0waT zGF_>IN}Q;gnwqRDnFa0-0{*Ti6+cEn7kZHR&3I5S%nBaYFj^zsKoO|F^Q!sHivy_) ztG?*3e7Zkh2GPpcS7ll~kGYYLT*2DB8 z7K-X&A^75Oi7a}PgBMrzhS~QBAA(dKy2OALN)rVqC>8?!xK4V==dW$(BXc9QeVpHR z7YhjLl&9q^Kdy(`?iD69G+1_`OS$hmP^>P#J)z!hebbBOaggf%ioUZ(i&){)oQk^M zym=5{2J$~!*(qz41&nITDz(p#s%GTRg)WTnzWGl#G#fB^pY>9IpHlqn8fJlxr;AD? zm_kM32#s}B5~Njb<{8z92XyvHjiIqd`*g+LwfDD=%U>zjBNB_*f@kAf?$!M8u>8@o z{w2KKAU)J~>Y&rUCowmvUfY+)kn|A>$7T8+nQyBhCIq|ab!qzQ_+&VPRYOB>UM}Eoqm7yZ4aA+ z(D#yh;GQ@nNn$(q?Y&j1bOczAr3-t3y@oTN-_QSUc26if9pJpYS2tW6BX)#=jFO=P z(SFD2WQOcXD_^77&OC!896(82F=$NYo~iF8_2|qGuHP>VEj}B|p`Jb_HsU=-F;g8K84$Z=f71t*NETS96t46M(* zAfwp>!D88pY>nQ%yvIy?rch$ss-~>9H7$-_M?7ps=@DOC6^tGi9}EgtNa9aKMn+jn zp|v%YBlB|ruy?{ALG0Z}5qH&xHGdH5A|}fZjN`}df^KMZG{&8+ag1v4b((Bw993o) z2kCH>Az|b5N8ZH~t!6$u`hL&Ck(A12u#ms>lHWDmmC>c;o&L#{ ziLj~F-s;(jlVoGr=0PlH4DF*#jFws~|KeSz!YKD%^IVVh&B&9#p%-`vy|vLY9SJrl zBpzP6I8cXdE#%Pd7mvv49c@tI;~We?F>MhTcSZf{!Li~av(7zTsV}+!Dwv^lUX|Z+ zdO*h?ljcV^C;OE!`Q(wQ_yeznk+UHJNxL3HuCD`uY9qxxEk=xr(B@x}F+f{v+s7~# zyHweelLv{Sb?Wmp&~ksg`l zz;}Ky7Ia1EApCM$qgK3wh2~AP=_e8)aGjOlF-``Xi-{b3V?U13%GQt&__5Tv-siRu6b= zRvjG$)zbr)eIAVu{*Hf393&)5Rllw>;Id>Lwe0I7D*RAlX81xP$BDb7U32bZ<0i#| z%LD#^3X+=+z#LVga;6wP<|^g8z;g&0(J~cCVXeFo#w^-;-(=m`^$Ad>2`aI$flV=s zG_t=D;M*#9_1C_`8IP2Mq@Y z2QVRdJlFirIY5LVtX5M?OGMUFT<8x1&fS z-XV$;4kfEgI&2d_j*dOsox#>-i}-JF)U|F9<2?1=DZ2R!-1GMY{0 zh^UVY4RuC* z`~k-(3*9F$1m!DlzP5arF@!pNdgu*x990y`j{r$&Y;OJ}e_#*j1b&w)j{UHOcy9!4Y4T9dP}aHN@pgz%866#1OjL;H%H z7G$1sk?Tp5Rql_c>vY<0WGiA_b5>{`FWCw>H^-b8v%$1P1UfAgy| z-)JEA3acg4399tRwmKZS57!KIrX}+e$d3y2d-3mX!`);{CZ_@ zEWbV!XygLH(c5}Wxpw}@3USTi(+dEd|Ib$z_Qk&v{Si8ew7q|6{#hQkjo`v)`-Pz5 zz09%iyvgJ8Yg%`iLqtCb$!I9|9X#`2LnH9UVW(~vz4{h2NstOq5Fcv4VE$=jRct>* zI!={&_D_R(&I%KZ=rsYD@WpI+&5z*~+pVt!l8D)1(-^$ufCS5{BcG@*f-jl~Z~FFc z1@+H&{{rZwmnVU(AqSgv>NH?th~m57$+IQ~3g8eSvyU`yNvX82Jmb?CIHOSVO+ohf z9HAW%dV<}aCU=kD4*B~dR*@_f{Q^%u^fGaJfM)oOBxzJ%u*3*+qT>@hPf;C6_yj$X zG21AnTV~(gIC7JP8&5d4K9c&r<+cZw1qjeABCzP`>#M74>4pbE^vh=v9(47w7Rj+_ zp)XwZAw|txm1ZIR=SYI(c{rGG5ZyQ-NdnyFml?U`R1aonUslpGKYhBGT7R^NfA#uI z2r#*wj31#`z6LH5%dvlE=BeOIM_%ef%Qr?Pi2wX;*-MKEt3l{3xoQUI5g8fP(L*V@Pv`Q=d8(NP`7GlKbVgK+sO`c$~ zlXmM|u)jmW)Ra2pd2rUkTx_C<{ajXW8F4`H(1L@9PTwD=h&GoYk_J-YQ(}aC)acAI zz689vY`IrqGj9{baZ8@#{O_?61`yMMfk0AHF&%cbs=F(&p#pG21XiA)dL3SO1)Aqi zZW~mk2i#ED9?DJuj*v);t-!@2NFUZOnl~d7g{Wo`jQKz38~our_H_NGQ1!bl z-DSR_+$T*u%t*@t%jjz3Z}+2CqN>ii`ii_a%R{}^Lo!7|ytxr@XL?uDrsn^X zWkmmG8D@|7ej`YS!O!1ODzYYGzUbWaBul+>#?)Le0KDw(XH&n-jo%aXoJp^Jr6QkK zQ-VXD0QR+jU!7Uv6LJV>F#qX{21d+2r9gwlskS^^gczMG^Fy4)!(5ifB(fQWd_ni$oiU)n0XO56NNR2 zOiM4iyT0=$nGR=Qeg?2so0^zE^F)m2GM6aOwF&D%f~)cH&}m&I{d}eF z81OY=7HQvz$e>?7Dg$`%VgBrYUtf~olu+t+7f^b24XICuqarM7wG%J4wfksZkX=qc zSLOkW*jLdl|97=VF#y7d0*V&xH=iI7NeZKyWbJK{xF|#fsJf_MSh;l~Vt=sJ`ojl8 z5j3P-27BmDmn^@&5TGv=Ivo{JO?CHL7Cx zZ@7>j&H*Cjmv5|S;DPtWL-`eRwc01RHf2I z%QX#mUnt-)F-t6=_JX23i*LJ$cB0rkDdbDr~@@B6>cyVfk%$kN5k{oD7BYwvwsz`RZmCkg(l zp$sAAB<4TFq`-z7i!xe0aAS6_CG|MLa}1je$uLvQ7J*})dWH_-TWmhz{can+C?-HY zivaR|yeeR?&^uwNcNVM}wjWyh|L z_zcH#!q=^zJ;An()&vcShW!WaHodJEE->?neOs1I81jVnQV|De1|S-p3eXh=yZBI3 z+(IRVQGd(D*5E1Jh6exQp40UQy>32fHxiNIPu%1^x>MrPPMl<ixeT| zKB$|tw1HhN8$|s3T5GL9x479|w&~(G#G1MH|6F7-S6Vnp#=jG-VcA>;io%g9kJ5k{ zmF0G@u>N)gO~-YINMi{>PzIJd0XSyLh|5#C3_fm|vz$5ZAIB#76nTugN2eQGZr4P8 zK;j#ic;alxp}i|X{-ge#P$e%o?6L*+Ud9>)NAH|3bL*((iYwBOu#f{Q_%viJXC{zp4y?{j;fg5gfb}uVww%U1bWg$7JA@lo5LWO-mbGyy;?4!0^zuY!1J zVRi^)$z`6X#fJyEAVkd<{r6`)gc=$3Zrd+Psm^_7*(fX4s7aR&@|KXoeL8ke11IU- z0WH=wkMVsv31VYLL(10VbRX(gcUY>Jt(Xz-!S9E9lw8QCV(;#6X`KUzxu_wxMXcmDI{1gZl->7}vcPb)(bSFSp!;tN^@N-Hv#~jJ~1e<*KdE&lcD*sF|i#`vjoo~ztoX7ZBuf{GWgbR6z z_uu^EZVEDtdh9sg!D_|A+fmP{z^eXtB>ngM26@RwNTo(in8SBI$5JBKUpy3K1Z3l}cpFnS zmycr+5`{ePEnL_kq$YchQXl^9kp631{}>r~Bk7M(s)qou*6{OZe?foll0V_qw7_@rRaCX|X>~R#xWUkJf;dW#i)O=!vAais(GseE(fQHHf`+8BdihtWC4U9GfGYw91 z1|hg8qIx6wT9!@w^xpqr{8%wE+YIx_fda!w0DlEqvmu@-+TW;)vGTvt%mPju+Ll-7WUt~@c(t3f7>QE z6{;>~&0AF|ph8Fbgnt9L7=#_;HHH1QOX~j95r#6llOC1Lc&4n@F z*Cd`;>CZQtqrTE53{vYNi5`-E%&D3h<_w-_XY)37%&Dhb#VAj z8>{u-HAaJyl?QB}*{LUIY4_9eEaFAcEE79aeot&ReCkLxMgq7ot3cK-ttm?I0_i$y zax>W(EWUlQ-70g}Yyjgg{PhiozT9%g73hxt&VBxEkLU7|UXV(~k)jUv9sEC0yPpQJ zC*rn|tE3OTRGnOQ#|;a%7`qJ1M4Y@TFPm3?Eic<0t&Y)1oeM`z<>W7c2Wy7eS&GNE*cCKOwTxo#lIdwPbDk#NiL)#$P?u|MRCkO|A%7xy{bWAa~W~=5+LG^+UbEh*m zFG|^Bg<>5T;2Grc1-aIQ9T@bFX;2rQ&!(wM1CZL=-I_K(CsdJ#@PFQdNLu8Fac+GT z-13#p0dMLq^o4wPx^vMeMds9Mco#ZTZc6Dxli>s~qG`e$g`X|S3@;`lp2G&!qT~bU zC}5bf+;8Vq@jcU;DDTE+fPIC{ep3mU!=G0xRAp$fbG!4$qj_^=+{yf3k3v$C1ggUT z*w33a=HA$vBEkqjC_05lMv5xAh3HVV-PIj~8Z8EDaxP;;%m#+czN0m>L6VxBVCWp{ z{WcoBKmiX$0z#ab?jA!SJ88cE#BEbk2O>tvN#a|u7lMe2*?6CI<%<63|J@A&Pk=zj zC{;r2INs5cX;crnYrzYCqy_ceW}`v{`{XYayH^Mc2g$sC=WOpwB@VKkd~vEgNovMm zc}0*UjfEU(p&e#^PhMXXA*qa|3C5x}Z9a5qp36~}EI!oBd}yZDL;gP_&?F317cBgz zUt*F3@z;5nGr|gk5K%?9N4RX%z36!5$o8z18sQoq+w@@VU06;rkj}aqitJ=cl1bB4 zPNIWt_YF(wCnQ>wY_XJQEV9%T4tZBf_t0+9gxU7;+gx8nStAHt3y zmlZWN;|Xgs1lflQI>+0vAM^FU50YhGR4!$b+0toGsV@-Gr7U7Pu6X7Tj_*5KP&uRT z0-k(#Xx-`I_Hh4ox_duQ5{6{8zD?v zRhU+ax$_n`4a_bSCH`5;P`;TB^;L?z9=7d>JfaAveElO$r(KG!A|wM~jdmeGI(y0ASZvP3W3 z&Dw~CZK9aS!-DC5x`n-P1S=SUJ1ko*H&s=P$jx*{Q;?K2f<#u*aj3s21_KAtS=+9) z9&BA1TJO8D(a|0O&Nrcpm^v}(Ud$e?H8G7 zi6?2a_a~G1w?F>(dr)_RcE$&S!YkICx34Wd!4at9gCkJoB!8iYKv7?LKXXx@x1A#N z&WXRQhfsAHF(H*E48zPoXqW&37of}baIAdyAaa=zeqw~H>s zRQ&&?0?2HD45L&Ua9O^0p%pCu$mmYC0MQ1roU$M)=xgR~5W=`2K>XBd! z%*ra!;@l`;?DxdFAEH^)#`)4$5!-$K1eEsKNpC}c z!^NUL^@z!*O!PExEk!Q+T7nB&ri-OnHm-1WOr%xL}AQ7~n2wl7*W zOAR$xk_MDvdEn~NmewDLSU#erj*--RCenJpQIuqujA{Ad1Bi3a_k;@13W+rTq@fo+ zv?vRm*$L*i{-=4_sZsAkD!(^*moFdA1?2C6T(LUG+lD@UD0s}7SEA%CYdDDt> zGMDU2JsjfJxnx0YG&Yl(N`HEbN2#>bvYV}PRPM!eN99HHbK6N6mn)@tBP3UE zd4K3|2Rwud#ftt;KtugoN$CIHH0s=YL4{Z~0b{*}(gB7qkQG4?B`lIW3(bbqy1wt1 z!);DqR7f`L>n_vtI7T)D>UYu)E5e(_CD;9bAJ5Dz|3K$7=qeZ_fOGSqdhY>p-K4c3 zM?x7cooMX1Y%+4kfc|_7D9n>F!7M|{n`vA-JAFg=f1k)h1AAD|EvD|>kQ*(*q9tmV z$Q)V+MkSQr%1la=%irolHP)Ri^4>P;^?10E~_nj_@0xn`KV?kEO$jp?PPaD zq9iG6i;GF{Rb5>jGY8HBX|zRtE-U0nx^?V0jIlbalCVHNmR8@tt(=G5tmy?AIl1m! zl#bBrUv!OON7T8Y-PPoRS`&{tk_mNn(2sA+rD?$aoBOLsA-|Y)i8}89t3?8JLNN4H zNo?Ddrb8W*^FeWCFiQI)J{_hZx#zm$;+|$l>z$a)^z`M{XFX^YY;FMb{|Gwi zhspYfjJ+M2A30yjDa^0Wt9|Q5yT5^DvMpPynny{W#x(BK!a1S z+kGY`Ci+2EPL{mRz-z4!&wiE`HW2o*Yggvh-dAiIot<4a7bG#s zDBBwi6LCGM#-BqDxYttD_(4FyXY%RsTN(2C>XNQUu2Oq%DatCRk9;MV8N%HEYgOiV zAPf`$q971ejN(8g;s5wnnr@Oz{Uy^ySjxd|~#R z1T4LD1??WWqj_S7Zy$^O7ty-q;oNsoVHDU+)GXW-zh0DAoNF4_aG=@7urNwX;_i;i z4o0+5CtyP|pZ!ev(t7>H+LNP79k3{bgk$I3x+9h_(&m*k&q=1lfz+a!_qS?_A~2}; z_fqt2^d8IjKrXrqCb__BS65fu1qKudHp)EsZ)U*F7*vRfyc4Z5H|`{VE>AYbHeqqn z`;U8XF(yC`*9(x2e$_?i%`j<;Xyuh{cTwgNMN@xN`|Qt?8fyaHL`zFQ%L_iMBu+fj}U- zDHS#w2DFm8`{0E$pxNR3ksA_8SqG=i4F~E$4t9A?tOP)wld|LYm-hZ~ebZZz$~UrK z$^L6_k_ZfXBq{Odl23yudVg4+o-vvGEHdY;*}%c`;=z#haELY(4uZ4}0PkUZU#=8i zlU!8ks~@Xs-*vickJ1K;oGx4u5>$EPnfRJ;>x4d6J)JZ2p#S$c&gBPT8)B1b+4@ks z)v7!@lWFcLY}lTBw*!P7{T1Uc7Si?=7e23LK1&~VD2y3s@TB4^F(-{cFVBLtaX8JI z*lE#WHMIFXcm8|giuOpunbT>|;6@ONvIIgcPXP(0WU*_)R~QopQW47u@(ymkl<{20kk zmZXm{hAJ3hNQSb2|L4KW`&Yayqz@_td?hj4YpEkP2n$cHu=^<7FNz&Z|);$8KkSu-&-P*6*pLw_6AHVE6s(}2w zp5lv{{?I1pHKpUO3#y-&eYnv~xTvX?I?VqPp=Xh!wui8rd9d;8{LsP_UFOlO~=i3f1u6o#g z0AYXBNFx(5ZU6Z7!#lUN=#0;pQ}2T*hiz9`wognNy1H`rV4HKeSj3T^UA#!v;pXYj zfAah-`-8NU$zaLpKUAp>F4%TFObr+iYI7}Mzlv*C(?xwXNwShpc_n3CnOANGGJ)&bVwVY129gLK={xOR1n;Q1aF?v7E^NcH^GLFG0wc*Dl^W zFkz6&n{1Cyt8sHaPPRjXp3@{?Lf9Ewhg#e`!JOQ|EuxOJm*5T-n+RYV(FSE?kX<1s zlzzSSo1G`lSz(77;FCaA|C?JQ!eI2O2wiO&Ef#1nv2;`!FjIQz?k^46ovtq=!C#n} zCfQxa1)?$=+Ct&@gvmAuV=k(4sO>Krd{f%Zyto&PlF>;j?@aqbQ9bY!FNB!e;cs4l zGHTq8Z!%rIwuk2^IIP}Hl5lv@y$5v_=e@$T2=K>OBtlJ9EtKoLT6SdNk}y+$yZ2re zO5M#nWoc2Wg@IHUP`LL@@vQTwUf~b5!*xQSDEA6I_Ftdc21XAiFkRm0W@fP8!Xp4^ zn_`w^@uf}E?XFQZ3VI_&7UV>LgZ=anP2UKM^h)rNjw$DA^=#`{L>#}`eLc8)&$L<^ z_~6O@##VL2v;yIzx#krj>-B9#=U{-Ef8C5;Agl3GxM zU#aGM?`_^s^@oB?dW$w;a9m`KSC)+H2#W27gPkJTy#YNZ{IvbbfB4HR_rfE5!}^%J z?NI~dMltLg!9>R+xl}OvoWHU<%6Io*^5%AsU!U|GN-;E^X6>tEKM=+qheI!)b5yjY zkwLi8Eyy5c^xf`Y^K8s(LDSZ@*na-@tvRIR=~b<~`XH@q-{I1>^Ghpi-~nsri3|SK z@+p8TMx(qpzDNC}LyaZrg*4emWN1|E9vK(GV~VAurVf&v`($hCGB0B4J;G6I8?E8J zQ@Q@~uEGP^LjUL^dWsA?;M8+N5R<99#D2r+E~==GLwqN9B~WjkP)LZ*>Znn-Q)f@# zr$*OR!)B;bqE3MtybZst@>(ScSA4PjeUu-AB#<(NZse7hf%COF*y-E&FEr6j2z^Q0 zUB2?E08u?hh~QQP*Y5~poA~2k;rHaJkU1Fi){%}j&Ge^zxNzA1_Nl>HF{P+k?Jd3h z9u^(plyW`1ug#ik^R`tP3hls8kl`!VFEOh}8XVmb3Ur8E@>H!yX#q{`U&J?NPHhAC zHxZ4UYCJUf*urucg<#!FQ1I0oqWvZ~XogDGp&2;$emff%_Gr7q_GMvrEKN#SSlDer zVPKZVTo#ph9k8O|+;nz_a}jq5-90OJK%W01@( zVv&sHkHU(u#98B9FZe*DW~=kmIw*yj=uVUe90JwKM(9B*f8DzMQn~OZhVV$*iyQ_W zKEBXSQVi5J)|Ppz8sGAxX=QkS`bz|@|0rtUFjImPYU&MXo*Z05zB>}aZbPTQ^51ZX zf?5xs1k;0rW&#VzpFb{Iq{?**Nl~X@Y%DC6y}e3%N()`&?^~$saFkDV^>WAZVPXrP zSW&{66Svnsv&JN;3^;Oe=|)pt*2<%SD`KKXDDGzHvqRzBy-JwR3p@{=U_?()b#bzU z#_~RX(FeNQekG+(8OJ5i4KT53TA>a2=3`m>F{fCVgz9e^8&gJ_o$?qYeye;4Jj3A^ z5MX^%(X?Ts|L9?njg3P^-rE7B1)ZP`p3~xkQCwQGLtxAQyb@$3eNgq3wJTf?6MX8m z@o)11SIJ>&{Zal%$lRWibV+Swcy4^^;pYC6aIY~_kbHA}!?%9OLt6kJ zCS35Oa&wMA3DRLi8gq5T!snvrfKzF1eqPD!b=geu)FlQ%VRJ=sPg9e?>5qWznw7*m zJlHK@s@*+`FHzv+7IOy#!tVU=jA!C`mcuM5!-KM>g2`sD*K8B5x`oD#Q5S8dH~W4n zY}p)81Eq)WIEKdKDegqbxbzX*aooiY*CH$_DIq_7V1?SB2KoCO_SC==OZ9BVSWC>4 z0bkq@%InduilA79CJYc972ZKLoyI-b_>??KRIxHI4WvJR!PAWG(U&Nem%@9{lz-I$ zqn^zC%Z;Aw)UU55O_}|*Rh7GUyfxJDC@xjn5qDb%A%LstWLxj% z6zjqFuYFpdmRb`#nA8AOl33jt=lNJ%%;-RzUl*r9eC;WlQKRpT zS*zK0=@FGVMoLPmqh+LIL#t|O*zA%w1okfCwo?5o%gXZPut>Dz1Ntwz(wvW&Km1(Kj?_U|K2@xo4zhq*-z%seOG;zKD>tG4ox`EcJ&Np8!JSgwo&a(=N$8h_?#=?>p z6mna;>{6`8;p+_vhY_KY)aY&;`U#0h1Wb+HeER~cOFd0F$d?P}E?*=%7UNo*5AIPt zE6FI<-!(&}qNF~m-qV%u$q)6QQNkb6_PSo3vsql|V%gC#oKwM$BZ2MN6Sz4P%v&>C& z+Bt^PYoWkaGd)dm5>mX*JxT?LgYedALm4Bc^Z^qmT6y*v}2~l+{ zW2F00>)x!>euOa%nC7y%#XsVGoxeS7e7q1~{>KAXv0zX3NwIgaha8e&s(ece`E;99 z1SN=&DS@%GW`fN-#>4rL>qwg-g{9=fDm=GX+v7ZVY5*Knu+#s5oV+q1e z{A83cAI;Eh>~LusJi%y-ss165$)>C{y(4oN^>zlm54ZE+OhMUw|>Lut5(SQ=JJEVB@C11>*+GnIx_C3D4jPw_v3V z8XZOH%fZVc_Chn1$;M8q7i?;1x~7~I{d{qr@ga3sjaGND8?Z>&k9PBT82NA^Eb0hK z`%~q$WZMwxUe?>U$c_2tE=vbi98y>;s6fWev8p-~_MQbKCn<<2G=q!PKp*C?oY8N> zH<5I9`EU<bpfOEsZ=`Z8&95G4+61un(}_ba$M6XK$08h`GD65taT zNFj&3 zgA!_RiWU_xZa&n_C4SAG?639i>K%LExGTG4>^2{fx|tD1jnL1n_r0buVIxNU);*hu zcS((QWX}J9!-}-PoGV;1<00Y!cpUaeli0Ad43uYq&d7{4N%pUF4$QD@6SltFX=1WZ zUG`r2gL)vEvTx?w<~c20d!}tjr!Zi4;370=zi~y=P3Vw5tIZARhc%$Bl!0z<73$GU z1HFLOteP(5wF)3RZ`bm=N)v>I_N%hHzofkXcr5=WI5;$8r$H78md(!EisdG$Kj2TE zW?%2Az5m|$$=kfBH0IYlexb}eiyz|(5^4GKULB^HP;$X8q?j@I&$I?F$%h@ zo-G_$O>fd!luia0raoU)D8c5_*v`2f_bHy|Ka{0EQU$n|5oF-#*F*bg4SG-~WRFsTJq^uG8ws3z7z47G zQ42xGjjP~-)p!r;J$j_3E`AcaX_6}<-*)`#dPXXO0$*RLGfqH6qVDnlBQe-{Cz>c* zko>#w#P5W@JKB8W0B*pj5hsb$e}bhTq4v%`nHj|MdVm38Vqp=Gy>vpIXFYjzHBk_c zkM-(Xr2Pe#+^PZzK)tqT@xu(V zB|VVTnhic(BO~feKE?dnGxT&s?vJ7(C^$21BOVvDEXDKbXKc##QRlJ+y>Mc(+3ro3 z*WY_7;)pjM9SbIfle+b%Yo=5%@y$y*da0I+d6c9o)9RvNcXbgvXFvALeAeW2Q&Ohw z$J>7SkGvbxUHihixpgwCt*!}Zs}9=yb(uNX3X($m^wWJ`2wG#*#7UgU8lCsyHUuoy z`9|coy=HrmJ)Xl8;(vZv)&@8pL}`sr&nC_*h1PGO2Cmlm9Gd>9*rZdKW+};*XYW>~ zH&E#do*0n$nXGufZNX;fp7*aPBDgsNXE$#?xyi2A1pXbsWOTGtp}#v;{`x(k`HAqi z#0aW3|FzsTDy-^FWrA~ZG;qTkFoodzZt(|L<*T{OFjcBWcJp| za{%@sXdzkC02!9^AbFU%CXZ%AMa$OtU_kZ6fs&%Xjk9!~(*WM$!w|PXZSDfmBksv~ zYD4?tQ9zTc!v=A6?UQ-AyAK3Pm{F^==}VaPR95JrKxEAUpXDWVP;L~~a=$Ww1?zSu|zE?XtDlwMjx%-2CF&bhTlV@|f$%$oZ zCRnKR_XzcGPL+o-SV=!$3^6B5T%WyuI?Y3i^O*MJs-l{Vv8pt~Z_%k~^5l_@2}L6r z)F29@=0=)u6#K{hnc+>sePP1{AoLqE|R~;rLqzYg|`< z>E41{7^x;Hh?=T@L%YbfDvAVd%T&8Lp;SNCLc4DPup~DP1uM;PxYElS=F^59(>Bw{ zhv9?omLx`+2wFs00LDf4KgWQ4qN9e^2#2}2w-Q|Iw*O#s>BOrSYWw5)0<~1q;^Fd6 zIuN)&nU@VW=L6VXfc!|ub7TreP$Urt{C-diQ;ta!aVCq+;g-^!0ikxP<6>22>``^O z|2uXu*GcM(XX}2+g96W4Wl~X;ZJM=Wj(J=tC<6~`%a;KWwCEcz$A#$vT#3pG$Jp|) zXpPISbaA;+NsMxfatYytt9U=zQ45lEE%1aR2-~P-|9B6fV_tGvB zr#@cJujI8GIt~eo`CK?VYU=Vcn^#@3kqMi@44JIUe;-#+KhmcDz!vJ)nL|;VlFq=< zRblwnWhJLaoQoKF$Y0OXY=GjI{4Ga@dSq7x=U%Fmy}&m!BS&!|49Zz2d*Uudm!!#; zSBzQv0C({Q`))Pz!)O)KtJFNZ7bTdFqb#WtM4;3CuZI1$vQV2fKECnm{y^;RcMtmjbqP3qj?lbp&)t*D9j2-}p}-Pc>bJb@tulS&Aie*5F5>o4c8 z2-Gyh_`Li4&H>}o+(=6F=euRpF}&lyS3Z=gf9Na^w?PAnyJ@=*KK5b}O+1(bOhRuZ z03~??P%Ri3eW6#=(2&eYoKK+kyo|5X{m!c6amW5}L0q(uGZlCp*9imR_VJ!k1qJAhcKLmU zLfIv|HwnM^Nz>yg2vA~;t|PSJoFPE;%OQMm4iOVVQ%2Lho7_v4?ogh~4l@Wx==R^P zCGOvJ4W&o~eXJPW^NXJn97eM057sxE9&ZA0+zCO6;jIsZ*M>w zEt+hBs{*hRbf}4*sgUuw7v>i!d!eSLhcRZ8q^(^50s2Kh?b%(A4*^Ny*V{>@Hd|}y zuV1UR_69MFie}dJ-@~#v_ zTeu>Tm+JNg;CRkD040}hD>du?IXN5XZq()1Tw-7nDv&SOw{3_D-#g(u2O(@Q_yC(m z*?RT+8xxn?JA{U39q;V(51Ir%_wwj53CjUTmGWDJU+<~uh2Wgz-N_V;M_yP`2CmCDW3- z-@RA?4n)a(@Az4cD<8jK&0@mLiH$WYf!^6$;cxks8y7zk0OP~N(?cnl0V{gJHy}ls z5%t)e29SZZm+C81FQQs3gBDQ7cc6R@+kIVt_Tl-xJ0qNH=Zb1X8x_koAt10WO zWALYmdfKQK&*WBGo>@*JIQo;Ls{FIPX3(0`sjL!DRj_G|Lnv12a4|BatAV4cHzo0U zRHf6-W54g0UJqxzx1V@t5nGH~-VxsY+h*QCVO07-kPh6uO!dJqVb_lXHvexsujX#W zYJ^a_8o*}j^{ZhFzZT!R_CWki3*TBwCA`?sQK@%n30ifr`R!x)5HVnx=2+b&zAZ@@ zV*^fb-Tx!b6)2;uXrdjvv?-p;gx@Jby@jq(4432Q6VQ5UOg=X|J6TS|Rw|u;S!RWZ z0E_afS$t(5ZTg1}4jkIRGBNEJ{q~Su|L?-P@RDcR_|Cz74**>UU_sQ=60=S3D^V+o zlHMler0&*Y>PEU&J7*#OlEbgo)*4(VhLaUOPqubfNw7{0LM!CHJ`MUnpwz1bsg(Hn zW5RRwWQZ+YVB{b4Zx0ONp{6FfJUi$nGzCAErPf${5HjsFui{2*F|vpaDF^xS`jzuo zTa;Y`Fb<-g*5 zKYKh%&A*RJ!eOE~A^x-B#TOap(uePh8&TNU*kZ15DHOB9Yg<}`l7rmPav0BTeA4g#x0=H zAk#wY=4?g6>>UzK#5==T92GFQoAq2A2R_u4VUD*#>}Pm`O9*tPkZJ89>^#%Gq+c@NTJ5%lqALp|D7<3X0!j!W#w@!PN+`@zknL5Oy zJ%?`ymR^ewaZ?Zi4F>z^ua?(jufieu@PIIb+Ad{;AeJ-+F=JD*if{9Udyq_6{uU$( zuLjTs$%!-NxMSL2T(I!hZUa!_dA!7%Vx`%-p=?*kPy36tf>exV?P8Q%S(p~5KDFYe zn;jq_N_Jw(3UD`|K`H66`Vycr@?yG9Do;HNC^#|AEhkaaZhH#?v|<4 z=;K#aRRNX0_$ehC`IkiZIo~E+oga}mwgL{s$!P{Fkm)hMVdDpK5F;<*&PygcAJG-SGV6?zd6R-;wOAM!oD)-)xhr?Wei(m)+|OHdkMX3AJ@Kqiia>&qhj&PlG!ojhcLX=`kRS!3`*%zrd(@}wtt zo0w;T!?}aoe9mi1Qp3n(Q|9Sf{|1k`AUnwkI-Eej zR1KY$HA;VLDY%p^9UC_J0_8c?LQHZ9K$z>rC%IwtnJ78xnC-@AWZX+mQ(d(f27tIM z-c?LwyQVKvd$J5C9a7kvPusS2Q1Ov$NMJMA{esdb@^{2ez%N!WM56HT@k3m(J!%p2 zQ)|nTT*V&RL=rP!sW$BioZd~AjKz?lq;g2*f^3_zckoN1bZLV#!A%i;1B24?hg}m2 zxL6A`hH3^MnN)HCEMG<@qhKLUEYfdqh&?#*{Q1vJgNm{;``c5q46n@80JwT=Cq4I( z%FCzTF^CMNbuoH{92%;FH{9JxLFrE8ogg8Nl{=LvT)URv0e}_ab*{A zp|jxbU{-&5)z=y`*Y<4(4gQW6VCwa72H^;RWmN>VYdb`Ae*qr zWAaiLN32Hl?SLhUH}S43ydI|8@4UlTY_6RD^u%X>ztoP8ay)_!Z=n)*owR_<0=r*^jQTD1t-%l+VivT7uv8COgv?f}@S|C7KiKHjAa zxc_W?Oi&rG(6iy`_txF%4H_AdN8y1ga;U`ZTx;}D%-EN4KIl)&6@vtM$1gsBAiTGE zn+n!0o+z+h*AS7vro z`Eva%3N}LK!dYrKlr&DC*9I|iiBN{- z2alm||9oheUFa|)Sb0K9r+ zAbK8KMe?&F-Ys=X8D$HI9-eva=W#%~Xuo=SVllJAV!CApxL2S5KFd*x8DjUzc5T|! zF+LeY<}^&bM6&YCs)>xoAl*Z1Q?NXEV0yy0m>89vZXNdW+_;PxpiKd|>pnT`qkNv1 zt|DiL^#l&boHS{r%v>MxaKyt6REY2mYKIS+cW*?%KpJO6E2YTfK3YtZ(AZYIv}dDi zVcJJRC*F{?olmP?uMQY#y02~-hQR06m}Oh)Xz`eu!mx-Z&nCp^9GUY7({F^~9M)Jh zyt2zuYPasb4@wx)F*Q|f{@{*P%dMlg$|~!`9xU@uT&K?g*Ps$Tv9o8P@>q3e+iCy? zQYaAu*WwuRFj|{C0NpWv{P#S=hq8Ag_EMSTxBBfbUr=~Q#GbxyQ2u#~gq^Nhd=MQH zMXsN$7CCv)6==1o$f7vexqDkR-~Ldi9GAj<-O9;vYa=139nU}P#m|!uO~OPOT4jV zrmU#pxyDc09%kGpxJOr#08UvPi9lrbXljA`R5~o;IdqjR;9|NfU zbw#``+Ii?Zrt+Y-E8&W$Is7!yYgO7 zo;=HZ(#}zQrYB9A3l;_b>YpMkAsJXT4y;DZr5;KQ1N910Afq*f83>Q1bD~T|*j{0J=|YTt8StO=S2Oj@7i$l8ks z<<~x8qv~1DDxn$hPKXXLFnA8k=_^nr2S4~vj)bW+$T?m0^g=_V-;Tis{N|1=Ojd$@ z$&|s{$DPXe-u~{K-r{)=Fm?hw%>Nvw3$%gAJc>{z6HB>8Bv?mSobfkc^43)o7*6MNZjS6`zz%D347P584S~981*=%ZAF#lv^VO1$s8k*hzRDM3<1!+dGq(!_6 z%@+5729F{=;k|>Zx83)!4CONtO4qfFwdvnfppYV9QdKG~Lk{*9 z;66y!Ag4?*guUPGv7^yO%suHw5qUoN!fx%TA%4bF{MTNAsB^r}t^c1n*#vb-ZGbG8 zFmD&g#Q*?F5FOV8b0)JX=Qj_Zt=N>086w^ zHX3=vp1*(6@MzLAIyAB2U6k2Rz-*fJbS48f!~1E|#xeyM=GK%j0E->1wiavmmdBl( zr`G*|%v`Bp@WsQ@GIyHucH_dh6e7XsA4TnS&wsOMBfjlExG1!eEjQ<fuLjs-+z4H8>w zsZ+Fn*L@`g$Z<`!q@EPmUa0gljpRoUa)nxdI6T}dkU`9yWZW~{;MFhG%3#vMwkHy9 zZT0MtBhhqu^!k8vam=>Z)ltb7lV>hO&rm9gE(SDd?k19*_9v<936C5N7#kb!XRuYj zsBmdf(jU(voulC(LNoA*Yq{Hk>YJ7(;73UWbpEqsstU7X?JlqGCt1y?BqKvZCBPfTv&4NR zH$cT`gpNH|2wj|Fp>`pxr&g9X>PT4865MRE?t!5%%Pm_~vpgRB{F2M0ra=j{U(IpO zcq77!`=6Ri5bXlWw6{!A7+L=Vf3#VLmwys4~IQ6=h2F>UsC z-n*e!PAbZgc9 z-Oeiouc%~}ZmmecjH~x9u=_k7}WcP6f~a6 zL;T%KQ6ZxE=7Q{9irT~bm_IwI8wXB)j0i4X%4ZT4XtrcD_>O&c$p5y?CkP{{6cO%n zYS=mn5e`D=!fN_xL@8;1QExnPDGJX((W?Cw1f7uF@PTkPhqy<(j$cy3UK_kdtb?)g z5jAa~c9`2R`*@Q$YDV1cimB0U&gPZjGOBVET~s2}Kp(3XV5-L{W78B@ZCrqt(`D?QWAQoYmatX$RonXV<}Y8nQtkQlYys=Y$lVT`OE4K)x}^O2xL6SLJis^RHPD>=uslK?CH zi@u(xyggQvwigh{V@40L3wYU~j!RORar&tx^yxd>kY8XTa~5wSxj1W?P->fq#h^p6 z2RXh@i(gYG>d^ntN1QsTHpM!U8zQGrtK=}|{>`L~Wos{v0^JU+^9o&2P}*)x^_FAPX!WXr>M*FlaSysnRQ zG#^nR?acZu)5w6q7h-pe`H|T3M#6e5bHmUhk5GU zbd-v@5Au!1nN?C4^~lCo%-_T5a$Y81K}48^!+Q%5m#a2X#3gLl=)t0MO{X}1)vn&B zm=R3%3bt{s%}vtF_*xs;xUiIXJVhn!}9&iBKb#CJyk2N7P9Ke^ZoUq1?Y6M2}~#P>N90z6)o;`q|l(@L5x;8M|(& z>eZd(Cw2NU$wNmkwfO1n-$}29n~aQvDyOR!XmYc)nA<~1#)1(iK(r4zWI_JKoGiYy zsxkW@^pZ8}uHnZwQ(~~Rmy#|~5m}s7oZ>1`&=9~M01}uR@q24D{lZ=^wQ|FZi=X|x zp84_o+PKBkqWS0NH|>#>LX~9xST$)MacBee2A@b1@SD84xw-!n%-786L>Yb8+iV%k zf2#=6@XE)p{iC1VY(^+5>NxAWJC!+TMD!m1@|sxlaXjeP*U*rZ30sWLeshI;SMtu# z_y-IL5W2Or>ZB1wKXNsJ{sPENi(2#E`Kr4*j0&1PAX#*c|pm-hvWdy=d{MuGO%;I#8Y5C(65#TlMlsP zFJG3fz4PqeiW?WdFd<_%c|JP`{-5%_&flHO4i@i4!w43}c(PhRkoX3=(bM{70eGqD z%dr7YsuIUyjdQ)JW}Qx?&TDNcr)Q_k`Zr+bD`NG%)0WXATd}`0O5RND#uP4D{q`?S zu8n|o* z7bTj5jlQ-wOd_{}tO;tC!eABs&JS<*zi~>mZDhj(dvG?;%B*4|Qq*K62FN>N^G1w? z_2-z6^P{6NL0tVjRHSbrrPNQJ6L5~#ao^`na_#xvQW9s|xfYA_{!-*9`7g0Apg5c| z<7$!oMra+S)$%cG)g;5~=Qquv1W@l0x71Fm%KM5@wfWDpZw<-jBXf`TAD^;K$}WFq zvd!1ZB%}=WR(|*;z0!X+%FM#p9v7t@>n?HRM8nAv9UZg3A%k0#*nXJ57cet*gj4@G zsksbvGgjl_=5q2SpsxA$%52)P`Yk@vQC_C)oT=$~H$@vgC)}A(P>V6vH@+SkguXud zyMeB03%(>~N&%bb3|7&Uz|Y?n_Rl87SM1wg;@m0mxUD%q{QnU4)=^!k zP1`6fA>G|wBHc(!r*sPvl2VdCIwceY3F&U>ZjkPf2I+2)JU9E@`}xlIu4kXK7E4(E z0l&Luu9>;!npkS9Kn#hXh@+N2!G;g5k0`awrM40wsMN0W9}2u$Z|}jVnGd-*l-f-& z#jQqeq}<#*J={m7@k*k5#VQTmrSnrQXb1sZ>WJ^mgVdnkXlmjPVRi`Vw6leRASk@3 zeu`OZyc1o7Kx@$<{%??^QD@L<9{{!IhT{%~8vR`!{|4cKVL737-^lIq?W6cuYKaB} zAY@<;0cUI@c`t&O^dy}b9263qHM4F$H%8p(=ZYlbSV>@H5A@5soGIgYr<2UMDAKv1 z6Xsv>OHE^IJA^MbFpL}1}KpU!fL0w#3OvN5b zM48WGohnh%KUjJ45|{=}BO_(rMF$BDHfz_@+dX7TIwlOp>orhjO@2Hr~YLr5cj#Ks9V16}WwJsNHv1$K}UqoTIT`QW?+v`gemOWZv79y7i_~ zgHCeD&p|e6nE%m>Rti;J8U=6>>_%7GojdyI)!)Q%If_s=eFR>{s&B1Z?PH2-4t#YJ+8IFj)0o;}xa+Yg!;F~Fmi!!_s`$jx zXC?c?FY0=i)3`{giRCjX2kC}2%cH>CI^SFN&2#(#wcZLQif!oC>{qdmp;iWA(Cd{) z;1w{n-K=LtZ>QFO$jVS{j)tdC@fc!MgJD8)752O=$lJ~X1DMqGRllvS3HRgp%)a_YTJ-aJtutvX`>1s<0|KGTyo-LiQfKitZN2M4mXM*IjI z4TaZZnMMw)@xgwN8|L^{+A(c+TUH+WjSP9c`14*Xq(-+r=}-Q=D5~1-wDO_jW9XtU zuWT$v4x1SF&on?|$L(R%ydBB_P3$MoG35LigDyU-*RtZ{L~ab!KK|>1X@Q&Y4G-5( zvM4h|h|W05+b72b>Q*2Xo^Ks6!ui;+#|D^FnwspotM2gH`yxM&Ug>c7bifISXZx<7 zIKz#&O%-Yaa^uU>+xxD}YRg!Vn~dH&6g-S!LpYdf1*9-uhQx zK&{}REm?F(X~U&%|IeSHzYzZK4qvg9r{m$CzAnglJuKy&awg6VOc4!Mx#0Vb`tC1X znCUiP!5n$d>#aL9T8afL6O5Jo~ zvPG%EZX~ZkSicvTliLfghlo)D_9!U0z1dudl@-lLdFqUyfyS$Jf6b>ngpH=53oj^b zz-lKcXi%DOP=5P!#>j`TIx;EM>-TNo7o|+f&fxCio{oUpCHH`qo3)5U^C=v@_x(6? z@0PvI-i%2=a6e#Rp(vzqF|POE6!n3V;K0X&slbqPEuUWiX;qZ41CR6VSBrrwQCWoz zNnl{A6;RqgugpI8Ozr(1`|b6GD17JYfwi+>MR%^DoL+ zqWzKJNObGae{AO^Ykx>^cvXZErN(VKBuJ%RJaWOiG<))L-|PoSvmxFAzz|5PM@1~W zR%v`3L)q1O{Mg}KnUoPGG3n}L}f9GKDbCgA1o`&)t+Pmi~vf%9X8jvi zHmPF1QTx0~4KPwkwwZdNi}B(aw0&w?6YAVz`U?_x*LJ2Misawuf}X$3iVG|=C`ioT znn?lk;|_zCm+AySxq8iWiKzM<4zW*b3(AaCP2B5L#wuUwR}}EK0!(W+w!)AAcmX}9 zR7ZngikR1VtVKlUA+y#*3c4Un3Fc0{ zHXMzhcAVqG@`JSZ?S=Ye73f~=l#Wd292SrtYXaNZ4Keh3__$Lrg5#HAwMJGxyhwXS9RvzvE>yxad0Xq;Ts9=^Dfn)OI=R;z8+bCSeqV%!J6rn32M z12SVw{5yzPgwJ-Lu#fUzZF8}AXY!4FCbe8O53bGaGgPmvac8J9_Rvq7s4p0oUzqq= z1>1BRkbCU#Ylh#ahUqiU>o6al&{t4gw zz6(=KNBO)#qE7r{v!PT|q;_ao)+2}tGtTWQdh&AGKHm;w?I`{6B-$)|w?G3YQA)u0 zrZH+O!F*s_G+JcNr82in2WPI#_c7G_3G4>kKDFI2noy%nwh8i0t?F#0WXZ)mgZ}D= zk0bF9G5QO33?NMr-*Mw^-fwlU?}e=fKqwK{QEKrT)fd@go^v>0qh(gi$>8o075F4a z?{*nU(2CX|as(L(*=OLDr8t*2eb@O|s$$(&40FQpppDTHE!F(8pvo8TgnbK>BAwRH zV%2|K!)D3oH*E)9t3ry_s((D9_$0^@go?F&*~nHnAuQvu9!Qp$p>WaD6Q7~Xu)%aB zRU4V1obp)>Wx>&K3>+Hv2ZVsojeciD%(_$|al}Ks!$SB)VU2Nmv&Ihzs5429D^j?i z>pMMPCimwSwj-}A1VW1lPNUmc^l_il14KgHX8R}Z;%wS?1gzFUu>Gw^Ey+N6CJUEy zzeU9RcD&yAzG&@ST?i9!KA&jt;7}aE;$4wF(D-g@5HG;5wtMpIl`eLdQVz=$@4bE zvn_I;dI|{f4Q1_W1$ea(%Ll9a37G$``zA&}oT2gbaRyzWjH_0W+-;-^v0<0i-??S_ z9}=!UvxSrlb?iXk#XhFAbgUaKy$dCd{Yb?c9qYeHT~qu%-N?5fZ)jl8Y9jn5X1gEJ zOrbK2%W7?QpNAr%AHl-jmn4SNsq#g~^%^0pAPnIc?$4bXRmY=Z_uOooR9#1jCFVau zy6n?5OT;&+^l7XMhC(`X4d>O!ZuPs0r)t)GLD&Wsr5=8gTOVaShuJZU_yb@k?7HY4T6=FqLQ?FA3pVFAo zP(G5_3`$$7QBMol%+plj7Un zjj!$#hZ7x(0E*c(FK7QFT%~=*TweAr) z=wF?*O>bb2o2(+Y*TFMt5qL+aY5$d;FVv0YX*h_BZ(V%F-so^^rWBiu>`@n_EuYV;&fwsk;ZsrK>a9B4DbYJbW+j_}(aLVH zcHfVQQ4l_JudT@3T9k>qtf|)QFwNyr&QK(a7 zPO>Xb^s#zYW$7(kBvYGdB+AxE9vD&jhBLGD+&PKg<||cgqJ7IvxS{tS^PwK9MiW=z zKSd6rjM!`p)}6>O#p+6epIixrb*CnuxGyt*@ovby&wCL9ME9nf1rQN>rI`b1UlFfWLc=_NB{zZ6H3 z$mP6*cAYzaE92TBZ_bn0=z>T900kQNQ=Fk_pmX`l%}4-%XektHJQFoLJGNBXE{2oP zGJ-&zO+u@&O9I}gD3Qxq*+y!+5I_v$Dr-JP_6EHLf_7Xh%y>yDpl*r7oNAe!A$l_^ z@!E~&$FG`4MET%>rHnN%p4TZelfkuM7G@%6NRqQ$t$-XNjWV8ipR5TNh*>7sCAA+v zu49^NNm5IHcMul3IG-qZS7zvljt)~?HDHZ?>haSp_CP=9c+lw92Jt5T0Psh{-Bz9x>9A*`Qnz>M6B$RB8( zP+~SPdK)?!z|!(E6YAsq4V~`YYxt5BEyeaXXW^x;0uZ116&yRS``*oo7)SU?GuhG{ zsqe7_#)3c$YGv3tn1ne#PKprY1@lwqcj6BFKthO}yG{2D)jfP zDR1#Kgu_=`#CSza;J&z$!JzI}H!(Vj{%VsaP&o)qFSy3P4d->!+!f^iI|ZZLJPZUn;< zmGPQugIat(nhiQxFtqW?=y++ejL&QnLL0?whE*jPJuV|y+i`8;Cnp`tQWH_CVJqQ? z7q5xjywrM0j#wV260VN`!vboSW+JA;qmKbKE|G1-CM zmq;bN5e(RA(5$AP-vu~ukh}>H_yrM;ETPT7SBUfO;P>Tsw%Fe`>R&< zH*dU_8Aa$wzP~|SEt+n(Q=A$6PFg_>{Hg##(^`Vjb`HK_`rO=Hl;Z1;>lY%&=>e9H zu;?^C-z~);@eHpf|HF$7l@x1$DmtB+`~xG3rSYCu6ncR|vnIF*Ut_{EI@IgaG>!7=$YXgGsKKve5Er+ zfSv|wgX67_f0T#7KGaTV&ge_9AgU072D;455s^QEvy2Si+SfjrMG3O4dr_N_fDrtt zcQ(T3nlf(g1%;Y>9~xc?DW!hdL)Gme5;rQKuX(Wq|9Q%mnVlrO=Vehc=oRk-UC%#Z zqs-7F%D-cG^k3{vcdP0d;D%s)QcUEFy`1;;m3vft(YN!=zWGGDu&79VMmur*pYXxt zvTLb}5i#xKE~9R>llguJQrybfA#3e2nJU*?fESgUb8><xV2 zK!P(!wnHYE>NP+R`<1Q+wY9jOhZoNBu$kF%Cqd7g+v>*kRBqgA*Sxb}gzaN+A_{2F zWCg?~(9r4%7gTnjP&<}?KVW(8xA>D)QpW;C->A!w1K7LrU24=_xw*w~ zDDy4eF4R-D7mP(QFgbkOtJh|ps;;W0hlGp}WOW5-nD;a>kzD(X5Il7*3}{Zoa)Ox& zWs%pQjVqh5Ui7H`oorWj4J@9G7f2dcfkBgt6Ihq{J2O2fSEZQLGClE5?Bn{?V9vAA z1=SRB#PsG!GQCuB8%&_^)m+5vA12QBDm@|4&73HHZY(XzqAj)@c5VZjVxkPSPnQ4z zVj`|Uy#P>cKI=VX@#Bqof!b*j@{sHOL|Q1k+Uj_q4=8k>gU*0^j&!~>M>$Q`1k+e` zp>~ob?_1lo6HCIG3Uw{lYjWSjSCFap;1Sy==^tlkJ|v6n918KRG73eZ+7> zL4dc%p2dyj!#2dqhguF{0odN6_VlhoN6H!T(KGB|JAM1eQUe#7aczipitu?=>fI&x z71}msvpCkge(X^$D!PdL`bakm^Tg-XDBwx1qmY3>q>vJ&Aew*)=Cm;Pl*7K!#hdYcD!5 zI!NKCT@_lr>nxZBWP_{~jSsz_yCbYtJA$fSg?=CoN=}SiasCXtBGKzfe(Y(w!i^*|PadbGnf<-}#jalc za$ftC#X#K~&qW4aWH8y2r^6ETkDD6qcN+spKj(YrIrbP6vCg$xT?^t!P_6FHO~+yR zmy=`q??@<)%C4`*YQLwB~QE5yf8gq&Kyc8k5YOcVF6{i%}@S0H$B| zBO=vsMivq9)}Ij_JUVRkYJ*Aqc~BB4T#>CY{E^czt^*$ew;57?_F7cN4s2j;k!bxS z4GAKG7te3=WvMZJMj>oRW5e3EtBq$-?sK54+u&>^Th(IGoUtTlOpitw>5V8 z!2l^~(z6vOizuRsuQpm`x!g9>DmfUP)8X8k8eyx$W=$4%E#@aEl_u?PUt3wpI&^PU zsGTgtf48$B3GW@YV*NAwtK7$XyLoK?A~@ypI#v|rTBrxj_`;u-)9lS1*@}$F(Z#_$ zFHMuF&;QYoz<41DT>!&k?+t0XaB$|hedTw8y^3IUokhVg9@*l(%wFYKP=nXG>Y30u z#kPPJl`Q-j;ec(qgKu0`)crlK_gR0BY-2?;ieKi^H|PGLEXKwc{6=p8zsmfTMhh5o z1j7;^q9EQaqri~SEJ?(XH$Q8q4Nksw@J(Y2-}T+A*UEW%&A;Tyg=&%teYjhVMebCy zhTgbJrwVyfTo9V0spj$Ej9N2cuk0N(Gw^-zWDI$oRO+XQ%B(vH_k zVc)FVVOV@xf7lR@d|$5g2$d{pE~S(RdxvU<5i zu-)qvd};dZEU+)bz23@;dB1KJy$_ls`_@OxAKv)aPWG5S+P2*zER*a+i!a) zu{C??AD*eTR{U9|FPxZ86Jg7Vs%z2i4ry4?mMfyT~c|g6M9@hiEcb8I6m6Z9k)Yic!3CD*43(nFi~DX z;Gy4i1xR#~&Ie(82RewierQVCS-CNNrweR5-%2rbhfbx#*6ZCW+7|xJ!#4FEpBX8Wp~uU-lg1vXtKu%29dY1 z+hW7rP0q#n>Tet8y^%sv+z98uclS2DPCJQ)e>p3hC!rFb-(Cdi z%#_>={%zWHbnt#obme9gPHn5T-TR!{$7X+~Y3|_pPqvO&+ng^G=+Zbxk9QP*r;ru; zwJH5i%L6U_{gqNcJHpdvAN2z(5)hNd|C^fdpEHROe=@^`JiO|SKc7Vb9l<9fEc(V_ zZ;sC6V%S_<-|FG&(u5OX!Y<_E+RTYaRPRgzSD5pb-qCQfE(^!Xrz;Rkz+)3}(E{)Y zO!Fz9&};=Y!^zye6cL{*jZh%R+9UET?phH?H|tYK?nTl zGh?AI(&_nH2#U>K3^|@8<8zV{PcIHs4o>A3rAf(pKpQ=nvjkKF|1aS1cWK%$j*dbR zG6lq~HItheQL(?&q5*im*zy%MUc}?iH0`?W3t#K8zKLh!-zPkFTw|t@W!ie#?v}9j zoda^yvtUQa#C}KZmZZO3lL9X!lJf5t(pO+GEgF%l|1uCrJMg2@%_5hw*T7bdUvvZD zhVpLc2V8XIb&=NnZcgptpP-~&m=j+ABo3r=vRL^LgBP<7r5+s5qJZMYXULGBcqxPD`QI$l)EPHV(j%+vT|Z0%yU zZ_#pr<0kA+bt3E>91!CU_jrp%`$(`oIe~c9do?ct9#DAcLj=l` zKj1qZ{!=RayG#R=UV%QdE)ndc_8#xGGlvk6*`%1VkMX&j6wp2Geq&z#T;Ccz%Q5J8 zsFN;%&_=|IqW5}Wnc(AN@~y2=a#{SSDW(3uK6>kAX^1m^f#nza#8tx8n+~EG{61H4 z(}Z!YBW*d&)}-YejR!%4dAtKOVp5l>7fgrLB>rI2RR5=9|0%X%CNq@di2wkL35KJK zMfhd>@BIcH%Cgv?AMkG7wvD}<)j`1+*NgSzo4R}}3*DCZfe*Msrm*2xCS z-uCaulBwopjlCBj9mYvE|7Dz$BuSAJT$oYuzb_0=HGS%MLa;K!Sgs>{$=XfF-3)%C z0#gnW{cgf^-JS{VQ%3Jsj`O!a26BzVLo8)~h}LIy8e`~X8f`Et%iH)$UQ;lOrY?Nr zYbmL3NW=wrNef7-|GyaG|FJz#Fku)mbZuZrk!nOOcWgyE8zMolSm6?d!QYltwbA4& zRjFU3a6YkOy``nT3wFUIjXu2$AB=dfCglwNYPyU1K(U%w09WBjQXL7-G2qt z9T~BcLud(~qMBXdHr&o=%t`86WRYF1Qqjnb6uu};@Rm5vwENyHS67|y*&6Wvt{#T# zzj-${$sGK7(Qcyto%1u8IqaWbFs&e+^|IfB+kcpbhsN`hP!N7D=(BzeUFo z%UPV?XP;}Roge^_aK-bv)Pek|WsBYFW#DuKPESqZzJATU6^dk;9U~1!BhB^Pckbi- z%`G2mx_%+_a1+br9&Jj>(7O!(WQMwZ&n@*Tfn_B19y-oOqzBpOgE{M8H|fI2I}pwr z^(4i|y@;rfL4l{}C>cT>7;vtFRe}eOZck^}>_sp}!#ww(hbeFkr~+o1effuEHYRs%=;u_%s0I(XU;8)9 zB)0Z8d7es-!C)GrAgS_fI;kHu8=1Hno!d+{EI{C$$k2EoP$qpfH*JyE2u=1P6nQiR${lA2<|Z z*Q=+i<)n@sTYos;>xZJL79>`q#`EoE1eBAhsI>T(w<_b) zBWbo-BWXHC*$n+Oer+1DH@fy5@33;i*wjNIi&lAe;Mb{H_Hlsm09H@K70yr1PX9Ly zp-6>*oK@Zu7;O?S!pDUO(?=D<#49W6X-&%d$JFM>3;CVek)J{WCp}|=NMYGrrRA}? zM56a+lVzv}WZh^cw2kJp7^#6KZDyDAB|MwR|8PM6 zF?Ms-xY`j~FSx^MRRxk84U^n8eb-V>G{ z_dh3>S0nh8j_gRIb~O;_x(H%R#6HX}_Qg}IcSq!3ydl9KL%7@dVq>+FFrSIrE&_{@ z=qzVMB=Sm>BM&+^l2SWG46|`ST;1|Sv*#RGi$q}h_|X2h*?@w3iv^aoX7qN(*5)fe z8z73jrZv7G&bGmu9&JP~14A7~4`C~J*7an*2u^&PGz${+y=)-2n!4M4e0OxHLloS> z0F|a|CR=2iUxjto#;SqA(y+ZkXD5KzfQYunzP&~lmAOK(wqlPV$*{do7a9;?Y~`pD zBe0!0o1|NYNGO-L`I&g)3nS}#bG@=S(N8PGjoYy%SlG<&mHufyh1aZ-rNd;7j{1^W zOG2OLMpRk-hra0Sux1jpox181wwXc=%oDCJPuG7$nUL>ndH(Yj#VAo2^)p$R8Ku31 z7Rlj5YS(;aUDW$!ghRI(YzJ9h9?6yaBW37a2~SGe%_=WESse}|z4IF(VKf3#||3hGK(xKr0`Z4_sE*q}AkUYv#S@S?hc$lvW#>7WV z_oI97&JrofnBie7+qW^kX;-HgH?rxMZs9jX>(q4J|0_@mU%N(qf zqnnWDEStTOb%F$xNoQG9{k&!E(4U*=lgPTY6tf$MKcg@+@p8N~k*<>36!!xX8k`7R z-K^T3D?j=F-;4M^>v8_th7JV<_4r6Mad`UASgrlkXYO&`mp#kpORxoTV&X^{)D)%? z7`V6uLQG;aeY4_bocN_$%RCq>x+76 zpZLs!V~D=vqm`8jx5&+vwMN`z!?J8eQdnw-<5(vwCMI!l;Jf)Zc)y4AzA~-KXJJFX z@~OM7cqKa&Zr7B(_uH+^uH!DcX3tu^sG=g_o#`xLYE=?{@qLP0jp>qSeTaejMt8m2 zR(fwaT4CKpCVAS3b~J6}lovUmk;67i6AYADYSAvWdYVVPcUKjLf$hmQ?&7~`38~_e zJ7m|*%+ zt-_U&I;EnYOKOORzBIdD9U8j+)9TCcJKFi}V9uiBx=t$US;4SQG=AA1QqM;Q-ePoR z)GJ{TBy79k%PO7Z3&u8U?C61H9ODA!ws3j0&d^GO&`*Ivt%aF*nx?*5I){=jI;>0s zB>7m;8{OQqt+jI-MCIy1DwK(dr$3?K;E6qF2k(QDil}lWWINx<)?pwNsEK%*lGc>5 zs&OGcpCdS#CdSw2SUcYus4|&oF13c9k59Ets{u{WjXY;w4hP zEX7MUxC~5dL^aKIi8NUV+<*T{r+v~5>c7!xFXc!maa^>5O z9qez1c34;;oApc{cx^VQ`Z`7EuMIH8ExkzXYtFX*QuSB2WAvBjF+`Ffd6Y%Pn0b3#21s zd0zk9PKen*?ZjIgIGJj1^`srt_{)9ewiz_pt(GqlQ)j2Pf*h)AD$cvq0T}dX)f!CP z@zw6vDQPN3c~M$fQs+gO2-2+r&e>&4<%ohj`LR?C+?>b>!ouq+S6rfbK&xCFq<-}v zQ_e2?eXLT4r=~3T9$EneMLXVtO<&VEzM$eMIrwHw%Y|ZOZXoeqNjpEQ?pl2LV>A57 ztq6V~h!<(cgy4gYTUTCiWB$&f?YBaQz68PY>j8uQ2;rPIZd%UqM!z4pNDSf>ENa=v znlu}YRI=L$NHI|V{i}{9Jp!u8QW-Y|EpK30+YfGEye$DuHo?0R{Pxd}-FH+?P4+XPmXK zr)^y+n+h1jNDr@lAP=FP!0N{d`mtWJ$R3E*7*o6Cql&NGT0uYV*=wnHXIr)TkcrAi zw~QQt{2s%oJA4E^Ualky&3>^-LlVDcNT3~z*`_HORv zFwxi17_>P{yeefFX)Hv{R^|M-%f+7+<2?U;#b774rGR?bbc;cJ{s$(Yr_U}>HDQNz z-4DIQj4%|!$b3^RM?wKj`o}?_$sI ze~-maS-Tqk#mN)Om2Vv`l!I|Vb+X~7QZcM8+g1waFAhVj);2%od!zW@EZ$#c@C^n~ zXwrJk%la*he`guld_4ee9Gf9*u$GOcY|If=&w8}IL6iNKx&y)N<4-=2r~pv zrW$*>rHQbfIUK#Yc>e?A;J2G=it9fSytuH)SNI5G7o%@w6GfFCJ!>%Bis(W1;?J^# zO}VH1w~(xttqs2E%iJ~0)v2e~*7z8+w zS(@tc%3Ut5BuZ#3ivRxAi3kJ&nSL_!4!$CygJwpYy@ym)l@pQQdvY_$S(mis)sMuK zL+KwI`(|Hov7yFU&D~aW}s>bXeeSawqB$ zHj-v3q5u1#1EbiE7!?^aw(MaEo0PK{6Sdx{>a9KQ(w{A4t*N*=(VKC*Z4Q<(HKW4* z)a&b5Zqzkpc~Yy4GvGcITFQJ;+}y+9_Fqv@w2?b9TIX0+KjZg!{VxYU`W?v<&$v&b zx+C@SHS5H8`eZY=G)OACtPK-7i8SsZpAc@`ZB}iKg-WRCaBHimz*b`Na8I(TsK5!m z#@7N$r-5zq2*yXU?V%T3)gPVu*%=t$v(=5hos8&tX|SRAXpSt-K1w(p2*ct6ug%{} zw>qfz!zIlVcwrGcqtqh{28=Te!p87ccp)XTco7jQ*-(y#&dj=LAa zu}L|0Z-;P~4|+z(?^dVXi;KD5>N5pLDc6n%1$Zam^B=c{Xk|I4U3kU@DBb^Ak4*Mt zZeB{d8JMAQV1O3&^`*&HgSaqYi_rh~I{@y6791B!`EHlVd(zxbXcNnndu(t6n zIA`bFB4}UR$X_SA>@2sy#C9DY89akuKnOAzH8^;l9y&IRmxDFaJ1RAc?qAo={&WNQ zt#`{sm%qolHofh!H~`aH(EsDm_$3~oeG;ADq5TNf1!r&I?pYhZniVpW{zD^s0gLgv z7>_d5TaSDK{m9Z^RP377JqZBVqyoPgiJ+F;?*R?6)1Tmj_sVS^f zjL6qlmr^PY5GOXDKl=#lZ0t3IWr=8%+q0}#jEh+@3&L1x1Z*>8C`hy4#QZUgt7}Fo z&g!-W|J5}RNQqTK73KDaefDR{y2~=aDi4H^qW{MqBC(gG-h_Q<`d~Nkstl8~D(OeD zw~Lf*07el&8l(UYUnA(UHm9s2YrU1QOUII1UX+1ZlS|*cY%r z`qYN)Cn#2a0$WR zBPq^l$fCY0k;y+O;h_%-WMlntEJ^8RnehBeK1*jz`~B2K9eXR;-2d{~t{xHrHpy@)@P#W*zYX>NPMCLKtdftt2G2Xw>aEbKk;?d@^X3Ow~lqo;UH z1%pjby}je*glFUWQfg~VhemEVBbA=N`W$K(fA`LrnUFMktR!iC%f^TXBLOEELUCfz zFa9qk7P!|HJm?{q;zFlq{o&RNyOHs-Kze-NSu80{FG`tAFG4pKZ8EAmQkKhgeSC83 z=H@0~2W{XH$67PA*9lWoUfPuJbZ}TPnczk@+&-=boisq{|ZTut+^%Z8V2y8SZ;-I{vmi=9%E#Ya(s z)dNqrVlhXb`1xFO=c1^W4e{5nF)>TA#t9euZQYBv&)_n##4)g>p)*I6xt_`X%OR!{ zKb>IsJ@?x2U`Db8mm~}mMtLW+m0}Jyx#$msAVDTgvCRr}`fyp~PWnXR>OM32U!V;< zc2g}k)%zqVs2}kW2Il_7eWw`)PO*JB4sv;tax1+SP}6UPDQ=ka*q=98b*dlqWXCVs z%#ZDr*^MM#j$tpKJg;30dqAtH8!d} zFS`)ZpMxIJGV2#q=~|`DuCk9U;2ie!Y~9{D7vWK!P$7|s|4*ogV@&EFsQj<-O}gUK z%YAvDt|0Lfymd*j3)t~t{)%g-9*?_<+^(;)G6r#ev0obI#;-2-ofYG;L6Ev;{6Wyi zX2W3uS!72z%drnTz~xBS9QrHCdx!iMf6iv;X@OnUEu3&+_z1!RWt7voGAMbakE>Bm zp@RjsUrCAOIOMZOHLD|As)#+F%TG=TAF?}l{~DYv=Nu1IVJP|KGQ|$!AbdQpDgzx} z`o%?jB&(Zn%uht`bxcr~8oUW9mVD7Z+0nvlh3%{!qaSk?+RV{Hr%_{IVn>$eQ=}2& zKa>2Ia}|S;#vEm7`^-36$ULP$Zid4(ci|0FNFHOSS5IEFRY1(0U4rX$UT@%V7qmE6 z*x?zD8ACKzPdpuk${Hj#<@L4Ur;^&OI<}NPX`QGxH7 z+`lX^{TsvrditSx%0WXNlJk+yQj8IXi99AZ%u-ZvdY60bUzVA@{X`8pON_swg|X z;Z@a+wVbbqJ@K32U%v~JXs;$bB+c#=o1G7mZ$a*#jEl!u0a-d_VrRvsQTXH0a6H3O zmWAAoNUw8O1-^4NvD%G13{5($UwJ5nWEcFNaTwiy&q9EhJlz`uoEOtDJ|>#=T$ID8 zh>BAjxTG7fYK=~Z+(MYxN4qv!SM#aMzYKnDdCy^U6RH+d=U7A2K#3xkso*3|KI zN*Jx)v@9>mn%=P9hhz8grcTou>UZgZAKSfY{At)Q2pkh7D7b_$VoxYHoqG)bbp>tD z5CP!A4a4D7!e_Mbf?$V?4kI2zG#-(Tcqq{Dg)GZ(cy82HmNT;&(9FBJhn8k$?&6~P z?YEeCAz6}LU$EJD=n9G8wfhxo?a)-8j$mLBQTx{Qjq#>%k#n+MGpfO{n5d*1;?xie z@N^kMmig*OmMN}TEwTM*M7*o7O$^~5Jkv5CpWQ*MI1#8B_}bvG_Wj{x#kgT8P5eT! zc7$~P^}|Ep7O2w=Ak{@!!xB{4bu+9sv5+}9cQNb1yOfXeJWf%HFMIe(tf^G=)I(11 zqwv)G?TpkT*}pG^3dH)WR689Mbz-JrS%m807!&$yB4vSZ>}^bQtd}9xr4l!MHhU+h z)e&)CzOfN5`y1c3MQ99bT|hu=$AHeswfW37j?2s zcf-EE40Re~7{8TKF-dxGF=4D-U;WFISfPG$QkO{3(;19~UV$hfW5YgMtHQS@5iaFw5)nwe7r9n8XL@$m_6H>JG&wq+_dZa@Q zyr}w0oC`Ie4gDsylI+%1vrc&AXt4t3WlnXtd0^-dUSoxDyHZEr4C4OI=Tcp8Ca2!_ zASu!+t5~$PVRk53AM!~i9)G7f)A45cfY?9*H|jh9ZeNaqfd-00K-#a0`Pu(R+sOy+ zw==SNIw7hx$kZ41-y&c*$hgxsF8;_yTyFXCIvYd%47J590a5>CAM^O^iW4#p{RP~u z;Ay8$@QuFh^Vqo@N|A8VZ==UrQu&s-4OQYwrYllfN#U(s`rXxsj=FDOZX+t~2VR8? zulBf@LN>^kXZ@?sP@b0;FRuUPcrEX#+N`cZ@xa>{q`{y7{XRIx-@;P7WB&yV&87g$ z`{tEl{SfA;H*Mr<&n#nq`Hdwd8iDzqdqM9 z!`xj@<4p<@m*ro%FWukA@bk5+^a4YLQ06 znN&uMDXXARF0dh&8WCrHM14L5oyBpX!A31mgUC!6OJ>NVhKJK zJuYGcAO|jojfi+Gqc4{@E;7#lZ+Q|dl`se$^w&r)O$I9Cr?faGIF}PnCiDx0w9gh^ zG6zl12-^#R>(HcPQnV>RK$ohz9!R}D_|hc7&Un={-^QnZ+y>Qo4{}QmU0+?qpuhTn z$-{@mrTMsPMY@yx&GK3e@8k(ZJS;z%?`4!kH6ow%F|M7-m37<)8Pe$0ei-~i_>;dz zVhuhD(AES8BbH?FZ%NH-WN2Fe zx;$_Wi;r>fNS+~)(6qsh2QWPM#3I8DEixhsK29|5ys;b!PK^@K2o2SGNt!6wt)mx0 zzO)ejsTH?Dees8Y&qLeB2#H^IX>9NmCG#1^jVwXCwMcZ?(xCXFk=v{E)2N z($)IuFqS!;u&X1Tf~iQ#1NF*Ghn}Hkm&&0h!=}fL12TOdj`pHoRE(5MeEe{u7Kbkw z=j<{!5rB!qQdRu)J$x$^%Z;rf>V6$0`YNab%Q1H2m<+D^lTh#3{Z zt=m*kejMu~cyzl*s~I}cJutK`Ovz_)X;VD_iwOU$JLuyId-%7LMy_sl+rF!x528N zZ94B}!H(4{7k?zZF;y1lQ@wbH{DSaX&zJv)uCI*Ba%;O4#4Rn2bW4XI-Q6JFEh60^ zEg+pD-Q6YK-7VcI9g+{tS@?e6IOpAG?=kqrkm2*(Yu#7OIj?ysMyh?88?_K9KoQ8- zHH;Rrxeg^m!NvIyTmuaSxy?O2OwHyKHOy-n_{o)e zkLxvT%+E2b@1VYYp~)#+44SdhE)M1nxJCsC1Hwaz-hk2(BXXztP6*tD8yN-5z!={- z)5AJzhzL37@lWTyaW8W=Q2pC>+Y4(p4)25SdFUr#$OZb<4~3jE|MtoezbsjHX4W$KkKA_8J0#WeQmih5>@S{G@G(4$5@&xDGq3qo3I*U83gcE+fC!||1S0!$=~hW+Pc>={SGg9# zl_!sIHMvZY3U7C6ZDg!L)ou2-FSA)shu?;Llt65ZjKuP0Pob z;ec{DHh;#-yqdM&c_55L8v!&NDRgYwymi(QqOaq>))8$O(DN|r>tmjey71*P3Di!8 zG$3gu2IFNh9)_cuII`6$;X&R^AgabpW#$%67b!@rOrLO8SG6#`S`WSGr-+ivE=Idxmq)mGJEY)ILy)V59cXD|0`V9wx|>{ zCb?S3-K9Ely|b@QU;C=ub9|+Eb&wBqL{;b#5=bUAiifXF|1C+Sr=X0Hw|yh^{^nEY zOsu6Ud$m({{qPgV$JuID6Zf{gj z`$ookW_u@`W50$k7a|Q6yW1zb9|?3bFzRKxt*}!u%dNFI^)8^xW%B8ScG&d+6*N7BUPKCy!XY{c@7n$ z6IJ~P!yV+A$eSIqRghutsE^o~kST+xf@xymE4Efp%=Nmz%~Io|9}g*vv)+IXO`r5j zUA7Gj%-fe4L49+W{}$xJ;NE*1Z}eyF_dF#bTZ@GsJlD%DeO#m!B{YZYsWP1^IwYAo zL4B{~0+iz3GA1;mw|XQ7xOxoju1C|7p}rNY+ll%jae%Q_SV#f^85O1oO$<1;g3o2^aZ7bti^wWzlvIBt)(@i6^d=cdPXd2AIchxFU;h1xQvI_%>iO6QQS zgxZg8Gw~(hs=NCOBnSFqqmZATJO%B4`vIhytTzP=bk6N051l=yohtDcHqZc6A#wb* z{6q-HFd_oXlKYOVHPA{$hk{fmhFgJ*@PdZ9c^pz^DRvZW*esK1NJ+e_R*=eA-Fq9WSTP=bNP* zo>Kmf$nlGnGH=zD7&3KKxD@o%^30E~7Y0s-5%3fg)w7CpvckUlzg&fmI;CZ$o!=>) zuaXDTXD${V(SPp!Q?cBAts+%g6hcTC7+6QF!*1qj>9W21%d?=K8|S=mF*Oc531Ooo(#TR z@bf^`92BGAm?XmHVS2XPY(xi1gr*zJYh!x(pL;)IIrtqjME5RDFjC?A{6Ck68}H$Z zCkLbyzbp7t5>3o@nKl*7EX`+!wm83YCYgq!GS~2NGVsWio^Cabm6O=NbS?V!PZ5*U zOj-j~31!|LY3v^B>C(KQdZW9?##AckXJi=X@9g;A0bCeP0=do`du2`l0GG^O-STzb zFb&wGOYnYvxW6CIu`X87arqDjO&4J^SI7)l3Apm*Oe~mu?9Ea zXWX1DxLpa2Sc6H@x^U+%oR z94L(j^SqJsB|tecJvyLK`!Q?ut>iR!X8ZF>5w$P|tfTy{nNe$HwlKA(Eb&!IJbp?B6thGZ2>^8azG_j^t81VtW!%zPPx#riyIx+lU z>i?jbXBua*C`7T;RD7YquX?@*{H4w&e-IB^TqNkX1c05XkT>~vP7uvTRv_tF(GUqT zqM0_N1D9N%1!Uf8&yGwqAKQzNP876K`FYApu}z1`APKAyeKJP1(n{Q4p1!e$XWxwUj2K--XWg>;zw=gKoaTE4}f0#E)Lt4i0e#75nL&C)otCe4w&0Q03Ue)Y~e%{waLfz zQCSek$^uvCAAb&GpYl^qpts5htootT$<=AwXMw_=gMmJ>36b-!n^p>D9Orr1jw7y< zuoWs{C_0>l<_gwPAJa3lu~wSuP`TM-X}WuLOqg%F*YTsAnBI~0ExpN|2DeCgG1m$7 zxSG&(;$i5FdX2M_tgBWg2B=VVS3&JZs?Hh_w+L~8G6lpC?Cr%=-!8c|5L#6!)A(AD zKkrM=7aGnrOLxt`!hC$G4#NFBBdDh4j~DGX|M6>pU#6muy=kMtgf7095!~T)s(GLC z?3Kh+LWW#(*4v8;&;z1pyr!cIPvqiwz|fiEDwdC~cGlwj$X^Qu^h^i^E-Q{{Q3Ol| zu0&TaHMz?y!@Qx3Yj$RD316t2!Iet^Ti+C~()V@>08?1Y6o0w5h4+N_Oj=OYYh_>I z?;-Jfnezv1np{sCcPI85`F%NipdeLtQf3s&K{d*eMI-(a3u4X`Gqx_pzf=m~Ux1`A zg@&nX4tXjOrqMVq8VFxIC?*!j^-p@Ts#FU(Q240{xvS`zSedog{MBgX3ANP{jbKv3 z#aI2ydcuvldNXo@i-d%=c$Yp$7a)+64m*2@e?GsHB~52;V_!za?Do`*)NAP^$KCnuNfctYU%WC;no6FV3HY=glnB=m$+f@oEWbsw{1l znT(Nw)Vcz|IJ9~u2ju7-Gl%*{`TGjp*)D#?0To6@Mv~v8%^+Ds6)UJ)=QE9t-GGjZ zqHP}F5PHq!3jLxn(=50fkK@wpD^zVik#ZRPKLq#xZ*x~Tfx9s*+_NGt_gE=1M#qg#7i^54?&J{;%|RK9b(SLnd- zo0ccz9ZM2$<0QU7H&MLU+YQxB9)Ze=29T0lt;=Xq2y=&uWf+P!Tt!T%%`au*5`C== z8(6(3F`k5y@}w%O@i9gA*R`%e7Sy;?waKFRa06I)Rfzs~XgcG#=#Kz@P?YwrHk0Gq zYK|-VtQ*D@$tqLcP}OLaTmMvFTlu>pd>KCx`t(61Ds%4zk!5Y+E!!;t4Vh{<3p=!F z67px8vzbTB-qYht;%ag7hRX)aWkz#!ziK90BB5nN1C%xQ8r&a3h=}Hb;B<5{`3suo3=t? zUZ4v*C^Gpxf%Uyu&A0L5J-=0{+=HT+2q6m!tA$);4DR38EO_sKi`QGa^G%K)WO3DfFQ{l}gd`;;JLNxr<}55Me6OJamp4J}Nr|a?S{#Nm;VbZs0k z708NC>R^-QNHe#%O%4zkcMCs-;^H#VoAzN+q>NzW&90FhN>Zjh70|PVWVbjKFY0{{ z8HKRtF-|!PaA`;n1a@iE8t;D?=3&94sCL=NrLc5*jf(Eaz$p|;0iyv5vc#aS1&g61 z^09F6(Jy8`sHv$L?N67?)>z`%+1p3O#RVkd-naH);Nyp$pF21l&SUB{I0%Y~{UszM z^kC;V`fvT}cZzgLZxw1qlvtJ*89$<>dz&a%2VZ6rG>WYPKAwbwE*&aTrW^90L;GIw z{UI+Cx>h(xBl=&-@rH&G(~dE zRb0i!+=k3psfQNAU-0ew3PIbVjM)`D14U2$)P+>MjQ>@eYr(M-Z(D^V)N8Poz)W~jUXBQb6sb7O|5b-ad zZJX>YQ0ONk)tt{s9`Z2=7PYfSLj}=9ebvkMpgYS%sYq;6`%`nEJ$EA#b=Hu}pRKug$Q-`BO7_JIbqxLbN*{by zxu(0?Zc^)F?&{$(`z`u8iK9|IGp-}Xp)_G)fVxz8nqiiss9XAIeELfuoW?UVC$KG2&n> zedl_2NQHf#EA=-eC8f76zx5GcGd+unx;az`)t7v#cmLsMZ22iqE`Lnka18NgB#i8V z<p+s1zNj-SQGBD??W(KhpiW&KqNOQqiDT`^A=Hw-9)bGZjB#@*nh!KHdv!2nv}$ ze+75eJHBlkIO%faLA$`;Msz}5BHm|KLR47_GH2Mk|9Kdf7Sx^MuS#t53Mm|O?;80( zoWE)YRhVnkyPj~coU;CS%kW~+-RQ5J@x7pl2C_3)2;U5=Q;xKKeV)hdv~fd@RXAD{ zSL1oKVX=DlMX;FnY-4$(fEy`F%Io0OvCh_}jiQY>(-&UXzvBD@)l@|qPQMq0hEk9j z5;#sOAnn5QT8`fQ!!!8vU~c|YJm{$9!8lOTkER)-MNcweQwJfYH!{Z)A1A4BYK z!Cyk{mD?@MG^f9*@{oPY=Vm7y0;$sduJDt~SRCQ4s+%tF-{4a-&}4so#x<@|v2sVqv&n`8;mgM&(;QLKcwAN<82k<0(c^!&G z`U~h52LW6hJn}BJW>kun=0(*g)aQJ4UYPLCvt;n9G65(u4S9^vzV4K0?M=?L22+c? zma@@ykZdM{*(-;0qG&{ZuhGX@qB#80qB=o&5FkvmB%!cgs2>%lkEUt|9GXil7MQuF zz(l!P{M6xWxCBgDDF@QqkKGT3Gr7#}cY%pftK<=9L_5~7=47FsXFuOqXjYBFP6W)I zqc4nZhEkDq1q=G4eCW<8#2Y_j>b>@X;UQlggf0e-2dn#KtvyFejl9{JRu`L_A3_PZ zvF7IH_P8YfB}%ph{3%F+VAYL7y?=EMX5AwXt07DLVn55dqG6kB7S1S<4q>{z4y#GH zB9oKtM$OAx=vkS@k6CA@ZqdAtPTUR9JmV&zN6caz^m9M2$#>5O38J>rHJ#wk#n%*6 z`6btM5VuRB_km&<*w!&az+)VvgIa%}Gw8W#+ zZD4qvH)r||f4xlj@Q37{S{L@iZt~)}Kqnny|+#jyDXB!-g z7-bYfjQaZe+6wYggU=mqA4?b4pM8${=OBnd0RSBp-H;!dW}*RNwGwS^&@DCsxVVH* z0$%^n)iuc|g>s-ucKO-$qv3({=4ZV#MASlYVZ52nek?3J=gRCzt6rVOs|>Gts^F)! zGFmuKV|1Wy&Y{2?X13QEQG$Dj2PpDXZCo(^*z(kEfJ2%3p+UI}@pKVh>Kx6YbQWFN z;BLV67l+ihu0CW|zc`zwAM83-G0Sx#;v*sOm6Nj^b~G+6yE1s?nOZ+==e0@Lq?8u# zulzOTwuhKJv;dwy4TEcy6-o~jlqxD~MP)4=WvvhJ39e%^Au^&I?pHR+4nHMfk*bf6 z2V3~$@rnNF=6hQ|)o`_2(OKg`-b=3}e1-h3_K2FtD$MrWpMg{&U#^f+wqnCesAgHM6PT+r~Ml# zY3U2LlBVYTe5z!(qx!y~O}D7iXwjGdSeshNKY;~8B5m_|(?s=_{ABpvXfOxv0=QHU z0-ivZu|Y#*>%&K?_FneO^TDkA3zVlSamlao`K!4* zvMxe4QSfmCce+r9>B5*m)yr0hp%08@r{U-8D=^Y{8fu;-U1tc-a(Q`Sz6jnBa@l*e z-;0_fXgNaNaXudSBJ1#AU)HkeHkXxQ-WCvbw@6hppDvErbBF{^6PN(7f>!%9zm1B`GSAiY0HMe)C^Rn#&Y5BPt7~nusFLm?qk6>LeDC)%!JvZb!Kad7;~7SmbfQdd zri(aZ^tNzT^zuru&48cixb>0G>1eSa!ME(Sgsg1$W`Fc}MOF)StjE_^z5k*Y(0qbD zV~7`S$)UIjBX4eR4Gv-wB42)R{T|W1cEtexFe$uZ1+M=!XMz31pj3Ni(Od%s#=ARjzjv%;W}r-PV0F0!xM4L=#OkKLIH`c*KZ!_#J>8^yV7Ym` zp1s2LYKdiGd@K{1emwhHyrRChzmJzj=>C1T4VNLrYtyK6G;M~BaV|h3q6qI^3YpYR z&B|fxogM$i?(~w{i59kH8z8d4v!MG@~e@qMmsP$WmSPa+^EOwM(KI4-t3_w z(~FY)SoSbXu!V_MjtX#hCYT+3q@ST{Wg3-#9XCS=@sTh552uI3^zlfiI zxfy`0nj6Bkon}UeNVu0*NNtCFQE~D)uI24(57Re79bsW~SZQd;IL6Y|LQt_aI3NJ% zK&h^5d}A_bU=6SWf-{$sy{}SYg`5uE5sfu38_p-NWKZ9_g^kv?KC5f}q>VI8#Ll=J zP^PyydFM~6_S02t1C;4(uL*uZ}%v-|H0UZkD(7Qm*av>nIC~@=LVQLOWsT z52x`HrFq^Ipm?!k2fDpze~Bkaa=)9G7LH0LcD1?_il_Kl11C5nq(bjbSy{D%T2Xr% zHcGGL4t4YwJF<_DFNvsC`}$iBau|~Jw`>f^Cvb2`GofeUvHuu5l!?LX4PPlh^quTU z9lOCeByb!>;IMtQ>orYctrK+Q6viCCNUsflCvFg+n1TSoe(7!J zHGbM*H_0K2+mRDVeW6S*o-%=R-%C!rmO7yk5J99H0%kra?o9W(3T7?@w(;-3Cd=Ng znWHg%6VO(y3-r!e#-`B3wb#)hXt`QPxVt+WrC-{r#)1vS=S17+2}4(Sf3b2_HI`z@ zAo+G`gn+x;a)Hg_apTpdUxGh~5+vJ-%w=O_+j-Cy6! zcm_d6&kekCk&EK69T^l()|1-TzHn(xS%pK>St9;9hF$oZy=x@(tGV#pxEMG3EXnZt z;zklrTQA#Zv=HnP#UrvbdNx8vWQ zGaE1D$Ri7-BPrEZza!K&Zv_OOXtw6b?U%joT?e*oeC=wpn7vY(Z9O?TIbo>|?`K9? zgtY9x-yrw1R!Ii($1-U6sL-lq=FVSzdSph^Fw?~S3z;yqUD%(Plr%F)&As5|7qGwB z>*UtDb=LsC*%i`5F_F7#I7mkpg2mAFlEq|iUdJ#1Io@-@vSF^cw6LR+<)c2NRHtFi z!T8h8?==p$brH2Gm$bi^Mm%po%ls?9wDX}khR}K7FY$P#gh6wQ@LC{j7W`nJ}#XXqhD|js~AD_n#Ezh|~?)FBPjR^I4a|pX{KCCkW+~KZ! zear+8xKn~aO5`e8zpbeK?r2^n8)D_ws-L})1Kt$ zh3g0U)Sj}8YO%WQjxis^TcFkRp6T=HrV|dFbZJ_5>tlG?$5AoUAjk36oM#N;L!BpC zVyuBbc;fj~9R&eT0@A|iBPhO`e1J`4eZ1to6@-WbC3=*-BjmWGV_UwYbBkh6?3{CQBOS#{ zo9^c;T+C|!+mO~zwUGO6J#u6(RVC`5C=W)|$<;UF$vjPzmSvlsJDaqXW1_HOLkvY* zN0{SfHJQ3=>6v2ioWong5A*C_`~coBuNLC$?D+%n6pvuTqW*y-B}p=Bg+l@s5D8%E-^(`zJaT!pFxVf4N8v|t zo!lWXV(4XCtSCG#8gz60t+QQ51$6(Pp$Z^1IUcKw8GupdCq87Sfg>9|G{o(g8?|f$ z_&f@Egt55@)$ zyMC5Aul3f}1X6j!7m+72u>qm>LGW!z=a<`?hxOm%4Uc>-bUE z6J8)-xlDYw)Figqj1pfDWf}Rj7H+LW!@$sEVt81r%weYKQg=n*v8U`XI&@Bdg%#@m zXU6MnYovR-@?$~`%?J2?1jZKiyOPnX!0TM3V1mC1<*3A;3dzzMpqMO5QIzIfcj&`{ zQRX8)WF>R;-o8Y*h@I@Y5&9jRaFxN!|KUE{b7=c6a|?9W$i7a~V}jW$O7 z9Tt{(ORL4LCU!jr536(cJ+`*ujKtH(o=DeUTKuNLpFxtXfjcpUigg);MTF-ncp92PN!Q1h zemSmDsIG7HY@lu~j>{T~q;AEbViTc@!IHK0682^9&<~%)`iBNOfJLQ$dO9&ngAvi+ zF7IKyHycze$ESr_5c8axJl&mkfc87pP8JIw@GL3!?2MKjxuUl+$7<36WFxzNP)3T# z@hC50GYr1K1|gaSDrR+;a$6FRitZ22&D9Mq(qjDx7z!mm*`F!}>!|Hc0?jQk^|16Mp*;Ir%)VnOXJx0ugTZ{m-UhUTd2O(v z&J9*fGqDlzWX^Rytogl`k#-lu5o2O>?fpaMb)-W*^W$R;Ez$1o*q56iItDO0Xt1-p z3kx^Hm?K@_0@hJq%K=UZ#Sw^&2nJrfIu~{bc+XuYMI;I47yd})kjyK?Rls(XKGEZr z+ftRKTld!OG%voJi~Vi;jm4z22yDNr!m8{pHlt{2xL)~qZ(tTX-(xa`pYu$b7fN;c z^3Vks%C6-Xyfv+;N;)>6y;VaW9f@h!jQ4jHWUm7G?$_$ z@!)vm)rj#-4~U8-TnoPEH@a|WsA3aty~IWWbPeZW!s_3*sdYcV zls7rv;$`Ys0>|b?*fR3|D#G#CUP_D}89#C1)PW8SDO_Gb-n-fjV#RYd#A3tIy|BU*x)HxU#J@7Ov-Mb@S5c33STCud~|ThrL$Hp9?#es@MiOIw+8{BuoOWHVKF zZm#Bh$t(}B&eGm0+RA=7@_a!*e<~`)isg-@*j~q|k&=I3cTw`L{JT&E&|#9Er`}Ot zVcf$2&#IL=ZmqWz3Iv-q?n>iD8p0cIuLV}^hTj6&pY(0eZm5wv~nW<1^g_VvkTt^6sNy-yK~XY0;Q8*>>{?xogH zfQ^8|Ff7*h6Mq?;MvSU5)+)HEuCs;m*qa=g*}J}^0>X$V#$hR2H$NE{r>&;*2f`?Q zKht?~s0p}ysC*FJ&WjWR~Es}t- zBWH$J-O@ip?tD1bqpfiA6dXkPJjDe4M~Y3`S%^@6gP#T!>4tZ$4zFOFD12jp}9j%*1BpO|(c53y3@qLyz)Pp& zaN!a4J~p7NVaxYKKCI2?eSWb&Q^I0gLLLO`sitd>L`tRk?khX@-vlLBAy4w}3<>F6 zXV=))#SIp;a{s4Wxy`p7Rsz62YanHALQli>r%lBRCPuYv-}&J<$JgZ1c>h>u{*IFD zK*`$}M&;PDkgkpE(4X+Ni(w+f*FKBlg}Rl1Vzv|@5$aaIKv{hzn_!kAQH==<{Uy8h zkm+dVw5ZqRfQago)Iw@pV0#-Ps&~-Vp~0>BvX^@Rg+o$AWd99m)*oY&$Z%i3<-+2*`6WP(4O*22c=PFH%juz|bmlU_=yRr2`b(>wOHzM-F4=~4n z5~2&$y5h`Fz8uJz$jvZ0Ugl#$JM#yb78klWg8v2NviPgTe%9#p^leFF*65+n z2IIk&qn8|Y*SsE?VplyjDu`Y+3JbPgz)vSa60%7=EfCf5pTXdsnzfVC92mJ~x$LZ= zHNmu;=(Z6@N)!yVz<6Y{Kr6o61C}QMpdms*-WLuIuI_p(iI?qqCo3YeynJlK=_A`~ zPCIfr?!$L1jgvWLhEdBW87~RFWju17gTg|5FJqD_h<;6$Ro74ca!aZv}H1Z5&}ZP>51gO%35hCHbng|Nk4eRec)dqxmyZZyNJ> z5C?-u0%ZL)6|uk|AUv>VwRr0BRe~j?_|OW{e!}ti@Gu`*^;0u9JJI$88Wrj5aX<+% z^Bs`G`IBAdKZh>|0{Tzw>hC$(s9}JR7+;WN9^|q~KjUs>j=}{jLtC%$OOXXfFCaKa zlxuD=S@4~3aXwlQx_gLj?mET|ut?eh6Xr~7Sh>DGhW*ABYT^9+UXaqXyFyI^Qsrb) zNgjtZ(-gr!^opF!x?U@s|G@g3-;%MED79kKw@5PK> z1mIzu3u%>1rhADt;?g{SPNkLN;BY8pCkzb@n2ncev-}vX=YI$s7#P6X|J3Z#5&!nJ z+iAb%a8=SJc$AcF0}Cw#qx`pY_^hn{W$X!7@5Nfa?Y{i~#=Y94o@PM1g}haOJ~_s| zuLX%1DC}q6d!^PR(R$8qG-MjGjSHkry+^XM9{&eq$uYxBjfF&-yuiR;pB$}+?nPNX3^U9+dcD0om2n_4T&z7LV3oUD z@hDPA)|(2&VN@4yV|>POJI%K_p+eD=I1`YCGQBZI7h5-0bG*s1BiYq$y;Hkx0XO zot~clo;NSc$jt08=5D4rKbWih5~6!KRDRah3^8mCl*m!TAtC*eV!M@Kl@PsNRAw^T zq-dKxd!| z28JTkOwQ12)vSV;|86*7XXlf))12|n?8$G&0}1|Y6!WvKt=%o-y>^36|Fw9d@RRw` zdi!ld;DJw{OM0-}%q_>U2IH{rqsT))6-C5R2s#ydp>G}vk z?Q&s~mQI6Hcg&2oulKW2zU>v)4Wwet3L$oWT%@Hp6DZ8Xnq=W@L;%Rp^H$MO`D$V^ z)OMuPIG>EiYvunnU}K=DOiaqGkZ|jh?|&8K03msY{uB(T^TlLU7IszNxk)}J*JlQL z--eg&?E!#=z}t9CUr%K}n!yDG8Ks;#r?K~~>O*1u-R)BR#npT(!|wzN7$CrcaRa^S z6DLs=(z%YOV`upG*UIx%qE(Y(N+B{OjU$1tD0DM31SlXLtP$EZ9x>iT$n}76u|{?Y zMsxamGfJ#G#?irPi(JYtK<=A-Kgzexr0a&O#CxAfk2V$};G&GuVN{H%-~77+VYXo^ znX1#));6Ba5_f$8rMgc-T`{oQbmGnV;Q}_9Sg3#+$+N{xEkFn^Okq$5Ag#xtXy

&fj0En$!R-iuM1CY#Ojp#+T}xl9gTeE8hwpH= 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

k1;J7IcT4hK8kHL~t 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 E4?cPg^#A|> literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..73e02c0 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,19 @@ +Welcome to k2hdkc's documentation! +================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + readme + modules + authors + history + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/k2hdkc.rst b/docs/k2hdkc.rst new file mode 100644 index 0000000..46f49f1 --- /dev/null +++ b/docs/k2hdkc.rst @@ -0,0 +1,21 @@ +k2hdkc package +============== + +Submodules +---------- + +k2hdkc.k2hdkc module +-------------------- + +.. automodule:: k2hdkc.k2hdkc + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: k2hdkc + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/locale/ja/LC_MESSAGES/authors.po b/docs/locale/ja/LC_MESSAGES/authors.po new file mode 100644 index 0000000..44ea7e0 --- /dev/null +++ b/docs/locale/ja/LC_MESSAGES/authors.po @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: k2hdkc \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-04 05:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hirotaka Wakabayashi \n" +"Language-Team: AntPickax \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: ../../../AUTHORS.rst:3 +msgid "Credits" +msgstr "功績" + +#: ../../../AUTHORS.rst:6 +msgid "Development Lead" +msgstr "開発者" + +#: ../../../AUTHORS.rst:8 +msgid "Hirotaka Wakabayashi " +msgstr "若林 大崇" + +#: ../../../AUTHORS.rst:11 +msgid "Contributors" +msgstr "貢献者" + +#: ../../../AUTHORS.rst:13 +msgid "Takeshi Nakatani " +msgstr "中谷 武史" + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/locale/ja/LC_MESSAGES/history.po b/docs/locale/ja/LC_MESSAGES/history.po new file mode 100644 index 0000000..d601ea3 --- /dev/null +++ b/docs/locale/ja/LC_MESSAGES/history.po @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: k2hdkc \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-04 05:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hirotaka Wakabayashi \n" +"Language-Team: AntPickax \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: ../../../HISTORY.rst:3 +msgid "History" +msgstr "歴史" + +#: ../../../HISTORY.rst:6 +msgid "1.0.0 (2022-02-07)" +msgstr "" + +#: ../../../HISTORY.rst:8 +msgid "First release on PyPI." +msgstr "最初のリリース" + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/locale/ja/LC_MESSAGES/index.po b/docs/locale/ja/LC_MESSAGES/index.po new file mode 100644 index 0000000..eccdc5a --- /dev/null +++ b/docs/locale/ja/LC_MESSAGES/index.po @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: k2hdkc \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-04 05:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hirotaka Wakabayashi \n" +"Language-Team: AntPickax \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: ../../index.rst:4 +msgid "Contents:" +msgstr "内容" + +#: ../../index.rst:2 +msgid "Welcome to k2hdkc's documentation!" +msgstr "k2hdkcのドキュメントへようこそ" + +#: ../../index.rst:15 +msgid "Indices and tables" +msgstr "一覧" + +#: ../../index.rst:17 +msgid ":ref:`genindex`" +msgstr "索引" + +#: ../../index.rst:18 +msgid ":ref:`modindex`" +msgstr "モジュール索引" + +#: ../../index.rst:19 +msgid ":ref:`search`" +msgstr "検索ページ" + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/locale/ja/LC_MESSAGES/k2hdkc.po b/docs/locale/ja/LC_MESSAGES/k2hdkc.po new file mode 100644 index 0000000..d28c741 --- /dev/null +++ b/docs/locale/ja/LC_MESSAGES/k2hdkc.po @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: k2hdkc \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-04 05:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hirotaka Wakabayashi \n" +"Language-Team: AntPickax \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: ../../k2hdkc.rst:2 k2hdkc:1 of +msgid "k2hdkc package" +msgstr "k2hdkcパッケージ" + +#: ../../k2hdkc.rst:5 +msgid "Submodules" +msgstr "サブモジュール" + +#: ../../k2hdkc.rst:8 +msgid "k2hdkc.k2hdkc module" +msgstr "" + +#: k2hdkc.k2hdkc:1 of +msgid "K2hdkc Python Driver" +msgstr "" + +#: k2hdkc.k2hdkc.K2hdkc:1 of +msgid "Bases: :py:class:`object`" +msgstr "" + +#: k2hdkc.k2hdkc.K2hdkc:1 of +msgid "" +"K2hdkc class provides methods to handle key/value pairs in k2hdkc hash " +"database." +msgstr "K2hdkcクラスはk2hdkcハッシュデータベースのkey/valueペアを操作するメソッドを提供します。" + +#: k2hdkc.k2hdkc.K2hdkc.add_subkey:1 of +msgid "Adds a new subkey to a current subkey." +msgstr "サブキーを追加します。" + +#: k2hdkc.k2hdkc.K2hdkc.cas_decrement:1 of +msgid "Decrements a variable in a cluster by using a CAS operation." +msgstr "CAS操作によって、値を一つ減じます。" + +#: k2hdkc.k2hdkc.K2hdkc.cas_get:1 of +msgid "Gets a variable from a cluster using a CAS operation." +msgstr "CAS操作によって、値を取得します。" + +#: k2hdkc.k2hdkc.K2hdkc.cas_increment:1 of +msgid "Increments a variable in a cluster by using a CAS operation." +msgstr "CAS操作によって、値を一つ足します。" + +#: k2hdkc.k2hdkc.K2hdkc.cas_init:1 of +msgid "Initializes a variable in a cluster by using a CAS operation." +msgstr "CAS操作によって、値を初期化します。" + +#: k2hdkc.k2hdkc.K2hdkc.cas_set:1 of +msgid "Sets a value in a cluster by using a CAS operation." +msgstr "CAS操作によって、値をセットします。" + +#: k2hdkc.k2hdkc.K2hdkc.clear_subkeys:1 of +msgid "" +"Clears subkeys of a key. Another subkeys that a subkey has will be " +"removed recursively." +msgstr "サブキーを削除します。" + +#: k2hdkc.k2hdkc.K2hdkc.close:1 of +msgid "Closes the handle" +msgstr "接続を閉じます。" + +#: k2hdkc.k2hdkc.K2hdkc.get:1 of +msgid "Gets the value" +msgstr "値を取得します。" + +#: k2hdkc.k2hdkc.K2hdkc.get_attributes:1 of +msgid "Retrievs attributes of a key." +msgstr "キーの属性を取得します。" + +#: k2hdkc.k2hdkc.K2hdkc.get_subkeys:1 of +msgid "Retrievs subkeys of a key." +msgstr "キーのサブキーを取得します。" + +#: k2hdkc.k2hdkc.K2hdkc.keyqueue_get:1 of +msgid "Gets a new key/value element from queue." +msgstr "キューからキーと値のセットを取得します。" + +#: k2hdkc.k2hdkc.K2hdkc.keyqueue_put:1 of +msgid "Adds a new key/value pair element to a queue." +msgstr "キューにキーと値のセットを追加します。" + +#: k2hdkc.K2hdkc.libc:1 k2hdkc.k2hdkc.K2hdkc.libc:1 of +msgid "returns libc handle" +msgstr "libcライブラリハンドルを返します。" + +#: k2hdkc.K2hdkc.libk2hdkc:1 k2hdkc.k2hdkc.K2hdkc.libk2hdkc:1 of +msgid "returns libk2hkc handle" +msgstr "" + +#: k2hdkc.k2hdkc.K2hdkc.queue_get:1 of +msgid "Gets a new element to a queue." +msgstr "キューの要素を取得します。" + +#: k2hdkc.k2hdkc.K2hdkc.queue_put:1 of +msgid "Adds a new element to a queue." +msgstr "キューに要素を追加します。" + +#: k2hdkc.k2hdkc.K2hdkc.remove:1 of +msgid "Removes a key from a cluster." +msgstr "キーを削除します。" + +#: k2hdkc.k2hdkc.K2hdkc.remove_subkeys:1 of +msgid "Removes a subkey from the current subkeys." +msgstr "サブキーを削除します。" + +#: k2hdkc.k2hdkc.K2hdkc.rename:1 of +msgid "Renames a key in a cluster." +msgstr "キーの名前を変えます。" + +#: k2hdkc.k2hdkc.K2hdkc.set:1 of +msgid "Sets a key/value pair" +msgstr "キーと値をセットします。" + +#: k2hdkc.k2hdkc.K2hdkc.set_subkeys:1 of +msgid "Replaces current subkeys with new one." +msgstr "サブキーをセットします。" + +#: ../../k2hdkc.rst:16 +msgid "Module contents" +msgstr "モジュール" + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/locale/ja/LC_MESSAGES/modules.po b/docs/locale/ja/LC_MESSAGES/modules.po new file mode 100644 index 0000000..dc580f5 --- /dev/null +++ b/docs/locale/ja/LC_MESSAGES/modules.po @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: k2hdkc \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-04 05:10+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hirotaka Wakabayashi \n" +"Language-Team: AntPickax \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: ../../modules.rst:2 +msgid "k2hdkc" +msgstr "" + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/locale/ja/LC_MESSAGES/readme.po b/docs/locale/ja/LC_MESSAGES/readme.po new file mode 100644 index 0000000..3e7df5d --- /dev/null +++ b/docs/locale/ja/LC_MESSAGES/readme.po @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# Copyright (c) 2022 Yahoo Japan Corporation +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: k2hdkc \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-04 16:47+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Hirotaka Wakabayashi \n" +"Language-Team: AntPickax \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.9.1\n" + +#: ../../../README.rst:3 +msgid "k2hdkc_python" +msgstr "" + +#: ../../../README.rst:25 +msgid "Overview" +msgstr "概要" + +#: ../../../README.rst:27 +msgid "k2hdkc_python is an official python driver for `k2hdkc`_." +msgstr "k2hdkc_pythonは、k2hdkc_ のPython版(公式)です。" + +#: ../../../README.rst:35 +msgid "Install" +msgstr "インストール" + +#: ../../../README.rst:37 +msgid "Let's install k2hdkc using pip::" +msgstr "pipコマンドを使って、k2hdkcのPython版をインストールしましょう。" + +#: ../../../README.rst:43 +msgid "Usage" +msgstr "使い方" + +#: ../../../README.rst:45 +msgid "Firstly you must install the k2hdkc shared library::" +msgstr "最初に、k2hdkcの共有ライブラリをインストールしなければなりません。" + +#: ../../../README.rst:50 +#, fuzzy +msgid "Then, Let's try to set a key and get it::" +msgstr "それでは、キーに値をセットして、ゲットしてみましょう。" + +#: ../../../README.rst:61 +msgid "Development" +msgstr "開発" + +#: ../../../README.rst:63 +msgid "" +"Clone this repository and go into the directory, then run the following " +"command::" +msgstr "このレポジトリをクローンして、以下のコマンドを打ち込んでください。" + +#: ../../../README.rst:70 +msgid "Documents" +msgstr "ドキュメント" + +#: ../../../README.rst:72 +msgid "Here are documents including other components." +msgstr "k2hdkcのPython版以外のコンポーネントのドキュメントはこちらです。" + +#: ../../../README.rst:74 +msgid "`Document top page`_" +msgstr "`ドキュメントトップ`_" + +#: ../../../README.rst:76 +msgid "`About K2HDKC`_" +msgstr "`K2HDKCについて`_" + +#: ../../../README.rst:78 +msgid "`About AntPickax`_" +msgstr "`AntPickaxについて`_" + +#: ../../../README.rst:89 +msgid "Packages" +msgstr "パッケージについて" + +#: ../../../README.rst:91 +msgid "Here are packages including other components." +msgstr "この他のコンポーネントのパッケージはこちらです。" + +#: ../../../README.rst:93 +msgid "`k2hdkc(python packages)`_" +msgstr "" + +#: ../../../README.rst:99 +msgid "License" +msgstr "ライセンス" + +#: ../../../README.rst:101 +msgid "MIT License. See the LICENSE file." +msgstr "MITライセンスです。詳しくは、LICENSEファイルを見てください。" + +#: ../../../README.rst:104 +msgid "AntPickax" +msgstr "" + +#: ../../../README.rst:106 +msgid "" +"**k2hdkc_python** is a project by AntPickax_, which is an open source " +"team in `Yahoo Japan Corporation`_." +msgstr "" +"k2hdkc_pythonは、 AntPickax_ によるプロジェクトの一つです。 AntPickax_ " +"は、ヤフー株式会社のオープンソース開発チームの一つです。" + diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9994a8b --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 0000000..1188809 --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,7 @@ +k2hdkc +====== + +.. toctree:: + :maxdepth: 4 + + k2hdkc diff --git a/docs/readme.rst b/docs/readme.rst new file mode 100644 index 0000000..72a3355 --- /dev/null +++ b/docs/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..90b1ded --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +sphinx-autoapi +sphinx-rtd-theme + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/pylintrc b/pylintrc new file mode 100644 index 0000000..b152645 --- /dev/null +++ b/pylintrc @@ -0,0 +1,562 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) +extension-pkg-whitelist= + +# Specify a score threshold to be exceeded before program exits with error. +fail-under=10 + +# Files or directories to be skipped. They should be base names, not paths. +ignore=CVS + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. +ignore-patterns= + +# Add files or directories matching the regex patterns to the ignore-list. +# The regex matches against paths. NOTE: Because "\" represents the directory +# delimiter on Windows systems it can't be used as the escape character +# in these regular expressions. +ignore-paths= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then re-enable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + too-many-arguments, + too-many-instance-attributes, + too-many-public-methods, + consider-using-f-string, + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', 'convention' and 'info' +# which contain the number of messages in each category, as well as 'statement' +# which is the total number of statements analyzed. This score is used by the +# global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit + + +[LOGGING] + +# Format style used to check logging format string. `old` means using % +# formatting and `new` is for `{}` formatting. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + +# Regular expression of note tags to take in consideration. +#notes-rgx= + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma, + dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. +#class-attribute-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _ + +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. +#variable-rgx= + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. +check-str-concat-over-line-jumps=no + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled). +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled). +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[DESIGN] + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "BaseException, Exception". +overgeneral-exceptions=BaseException, + Exception + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..283eec2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +# + +[build-system] +requires = [ + "setuptools>=42", + "wheel" +] +build-backend = "setuptools.build_meta" + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..449c2a3 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +[metadata] +# This includes the license file(s) in the wheel. +# https://wheel.readthedocs.io/en/stable/user_guide.html#including-license-files-in-the-generated-wheel-file +license_files = LICENSE + +name = k2hdkc +version = 1.0.0 +author = Hirotaka Wakabayashi +author_email = hiwakaba@yahoo-corp.jp +description = A module for k2hdkc from antpickax +long_description = file: README.rst +long_description_content_type = text/x-rst +url = https://github.com/yahoojapan/k2hdkc_python +project_urls = + Bug Tracker = https://github.com/yahoojapan/k2hdkc_python/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: MIT License + Operating System :: POSIX :: Linux + +[options] +package_dir = + = src +packages = find: +python_requires = >=3.6 + +[options.packages.find] +where = src + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# + diff --git a/src/k2hdkc/__init__.py b/src/k2hdkc/__init__.py new file mode 100644 index 0000000..6da5731 --- /dev/null +++ b/src/k2hdkc/__init__.py @@ -0,0 +1,525 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +""" +k2hdkc package +""" +from __future__ import absolute_import + +__all__ = ['K2hdkc'] + +from typing import List, Set, Dict, Tuple, Optional, Union # noqa: pylint: disable=unused-import + +import ctypes +from ctypes.util import find_library +from ctypes import pointer, byref, cast, POINTER, Structure +from ctypes import c_bool, c_ubyte, c_size_t, c_short, c_int, c_ulonglong, c_char_p, c_ulong +from ctypes import c_uint8, c_uint16, c_uint32, c_uint64 +from enum import Enum +import logging +from logging.handlers import TimedRotatingFileHandler +from logging import StreamHandler +import sys + +LOG = logging.getLogger(__name__) + +# Library handles +_HANDLE: Dict[str, str] = {} + + +# https://docs.python.org/3/library/ctypes.html#incomplete-types +class FILE(Structure): # noqa: pylint:disable=too-few-public-methods + """C FILE structure + """ + + +# https://docs.python.org/3/library/ctypes.html#incomplete-types +class time_t(Structure): # noqa: pylint:disable=too-few-public-methods,invalid-name + """C time_t structure + """ + + +# KeyPack structure +# See: https://github.com/yahoojapan/k2hdkc/blob/master/lib/k2hdkc.h#L75 +# +# typedef struct k2h_key_pack{ +# unsigned char* pkey; +# size_t length; +# }K2HKEYPCK, *PK2HKEYPCK; +# +class KeyPack(Structure): # noqa: pylint:disable=too-few-public-methods + """C KeyPack structure + """ + _fields_ = [("pkey", POINTER(c_ubyte)), ("length", c_size_t)] + + +# AttrPack structure +# See: https://github.com/yahoojapan/k2hdkc/blob/master/lib/k2hdkc.h#L81 +# +# typedef struct k2h_attr_pack{ +# unsigned char* pkey; +# size_t keylength; +# unsigned char* pval; +# size_t vallength; +# }K2HATTRPCK, *PK2HATTRPCK; +# +class AttrPack(Structure): # noqa: pylint:disable=too-few-public-methods + """C Attr structure + """ + _fields_ = [("pkey", POINTER(c_ubyte)), ("keylength", c_size_t), + ("pval", POINTER(c_ubyte)), ("vallength", c_size_t)] + + +class TimeUnit(Enum): + """k2hdkc time units + """ + DAYS = 1 + HOURS = 2 + MILLISECONDS = 3 + MINUTES = 4 + SECONDS = 5 + + +class LayerLogLevel(Enum): + """k2hdkc layer log level + """ + # Silent disables logging. + SILENT = 1 + # logs on errors + COMMUCATION = 2 + # logs on (errors || warnings) + K2HDKC = 3 + # logs on (errors || warnings || info) + CHMPX = 4 + # logs on (errors || warnings || info || debug) + K2HASH = 5 + + +class DataType(Enum): + """DataType for CAS API + """ + U_BYTE = 1 + U_SHORT = 2 + U_INT32 = 4 + U_LONGLONG = 8 + + +# Initializes library handles and stores the result in the _HANDLE cache +def _init_library_handle(): + global _HANDLE # noqa: pylint: disable=global-statement + if _HANDLE: + return _HANDLE + + # Loads libc and libk2hdkc and ... + result = {} + result['c'] = _load_libc() + result['k2hash'] = _load_libk2hash() + result['chmpx'] = _load_libchmpx() + result['k2hdkc'] = _load_libk2hdkc() + _HANDLE = result + + # 0. sets the common loglevel as logging.WARNING + LOG.setLevel(logging.WARNING) + formatter = logging.Formatter( + '%(asctime)-15s %(levelname)s %(name)s:%(lineno)d %(message)s' + ) # hardcoding + stream_handler = StreamHandler(sys.stderr) + stream_handler.setFormatter(formatter) + LOG.addHandler(stream_handler) + + # 1. sets the each layered log level. + # 1.1. comlog + if _HANDLE['k2hdkc']: + _HANDLE['k2hdkc'].k2hdkc_disable_comlog() + # 1.1. k2hdkc + if _HANDLE['k2hdkc']: + _HANDLE['k2hdkc'].k2hdkc_set_debug_level_warning() + # 1.2. chmpx + if _HANDLE['chmpx']: + _HANDLE['chmpx'].chmpx_set_debug_level_warning() + # 1.3. k2hash + if _HANDLE['k2hash']: + _HANDLE['k2hash'].k2h_set_debug_level_warning() + + return result + + +def _load_libc(): + ret = ctypes.cdll.LoadLibrary(find_library("c")) + if ret is None: + raise FileNotFoundError + return ret + + +def _load_libk2hash(): + ret = ctypes.cdll.LoadLibrary(find_library("k2hash")) + if ret._name is None: + return None + return ret + + +def _load_libchmpx(): + ret = ctypes.cdll.LoadLibrary(find_library("chmpx")) + if ret._name is None: + return None + return ret + + +def _load_libk2hdkc(): # noqa: pylint: disable=too-many-statements + ret = ctypes.cdll.LoadLibrary(find_library("k2hdkc")) + if ret._name is None: + return None + + # k2hdkc api + # add_subkey API + # bool k2hdkc_pm_set_str_subkey_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* psubkey, const char* pskeyval, bool checkattr, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_set_str_subkey_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, c_char_p, c_bool, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_set_str_subkey_wa.restype = c_bool + + # cas_get API + # bool k2hdkc_pm_cas64_str_get_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, uint64_t* pval) + ret.k2hdkc_pm_cas8_str_get_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_uint8) + ] + ret.k2hdkc_pm_cas8_str_get_wa.restype = c_bool + ret.k2hdkc_pm_cas16_str_get_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_uint16) + ] + ret.k2hdkc_pm_cas16_str_get_wa.restype = c_bool + ret.k2hdkc_pm_cas32_str_get_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_uint32) + ] + ret.k2hdkc_pm_cas32_str_get_wa.restype = c_bool + ret.k2hdkc_pm_cas64_str_get_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_uint64) + ] + ret.k2hdkc_pm_cas64_str_get_wa.restype = c_bool + + # cas_decrement API + # bool k2hdkc_pm_cas_str_decrement_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_cas_str_decrement_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas_str_decrement_wa.restype = c_bool + + # cas_increment API + # bool k2hdkc_pm_cas_str_increment_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_cas_str_increment_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas_str_increment_wa.restype = c_bool + + # cas_init API + # bool k2hdkc_pm_cas8_str_init_wa(k2hdkc_chmpx_h handle, const char* pkey, uint8_t val, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_cas8_str_init_wa.argtypes = [ + c_uint64, c_char_p, c_uint8, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas8_str_init_wa.restype = c_bool + ret.k2hdkc_pm_cas16_str_init_wa.argtypes = [ + c_uint64, c_char_p, c_uint16, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas16_str_init_wa.restype = c_bool + ret.k2hdkc_pm_cas32_str_init_wa.argtypes = [ + c_uint64, c_char_p, c_uint32, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas32_str_init_wa.restype = c_bool + ret.k2hdkc_pm_cas64_str_init_wa.argtypes = [ + c_uint64, c_char_p, c_uint64, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas64_str_init_wa.restype = c_bool + + # cas_set API + # bool k2hdkc_pm_cas8_str_set_wa(k2hdkc_chmpx_h handle, const char* pkey, uint8_t oldval, uint8_t newval, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_cas8_str_set_wa.argtypes = [ + c_uint64, c_char_p, c_uint8, c_uint8, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas8_str_set_wa.restype = c_bool + ret.k2hdkc_pm_cas16_str_set_wa.argtypes = [ + c_uint64, c_char_p, c_uint16, c_uint16, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas16_str_set_wa.restype = c_bool + ret.k2hdkc_pm_cas32_str_set_wa.argtypes = [ + c_uint64, c_char_p, c_uint32, c_uint32, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas32_str_set_wa.restype = c_bool + ret.k2hdkc_pm_cas64_str_set_wa.argtypes = [ + c_uint64, c_char_p, c_uint64, c_uint64, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_cas64_str_set_wa.restype = c_bool + + # clear_subkeys API + # bool k2hdkc_pm_clear_str_subkeys(k2hdkc_chmpx_h handle, const char* pkey) + ret.k2hdkc_pm_clear_str_subkeys.argtypes = [c_uint64, c_char_p] + ret.k2hdkc_pm_clear_str_subkeys.restype = c_bool + + # get_attributes API + # PK2HDKCATTRPCK k2hdkc_pm_get_str_direct_attrs(k2hdkc_chmpx_h handle, const char* pkey, int* pattrspckcnt) + ret.k2hdkc_pm_get_str_direct_attrs.argtypes = [ + c_uint64, c_char_p, POINTER(c_int) + ] + ret.k2hdkc_pm_get_str_direct_attrs.restype = POINTER(AttrPack) + + # get_subkeys API + # int k2hdkc_pm_get_str_subkeys(k2hdkc_chmpx_h handle, const char* pkey, char*** ppskeyarray) + # char** k2hdkc_pm_get_str_direct_subkeys(k2hdkc_chmpx_h handle, const char* pkey) + # PK2HDKCKEYPCK k2hdkc_pm_get_direct_subkeys(k2hdkc_chmpx_h handle, const unsigned char* pkey, size_t keylength, int* pskeypckcnt) + ret.k2hdkc_pm_get_direct_subkeys.argtypes = [ + c_uint64, c_char_p, c_size_t, + POINTER(c_int) + ] + ret.k2hdkc_pm_get_direct_subkeys.restype = POINTER(KeyPack) + + # queue_get API + # bool k2hdkc_pm_q_str_push_wa(k2hdkc_chmpx_h handle, const char* pprefix, const char* pval, bool is_fifo, bool checkattr, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_q_str_push_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, c_bool, c_bool, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_q_str_push_wa.restype = c_bool + + # queue_put API + # bool k2hdkc_pm_q_str_pop_wp(k2hdkc_chmpx_h handle, const char* pprefix, bool is_fifo, const char* encpass, const char** ppval) + ret.k2hdkc_pm_q_str_pop_wp.argtypes = [ + c_uint64, c_char_p, c_bool, c_char_p, + POINTER(c_char_p) + ] + ret.k2hdkc_pm_q_str_pop_wp.restype = c_bool + + # keyqueue_get API + # bool k2hdkc_pm_keyq_str_pop_wp(k2hdkc_chmpx_h handle, const char* pprefix, bool is_fifo, const char* encpass, const char** ppkey, const char** ppval) + ret.k2hdkc_pm_keyq_str_pop_wp.argtypes = [ + c_uint64, c_char_p, c_bool, c_char_p, + POINTER(c_char_p), + POINTER(c_char_p) + ] + ret.k2hdkc_pm_keyq_str_pop_wp.restype = c_bool + + # keyqueue_put API + # bool k2hdkc_pm_keyq_str_push_wa(k2hdkc_chmpx_h handle, const char* pprefix, const char* pkey, const char* pval, bool is_fifo, bool checkattr, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_keyq_str_push_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, c_char_p, c_bool, c_bool, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_keyq_str_push_wa.restype = c_bool + + # remove API + # bool k2hdkc_pm_remove_str(k2hdkc_chmpx_h handle, const char* pkey) + ret.k2hdkc_pm_remove_str.argtypes = [c_uint64, c_char_p] + ret.k2hdkc_pm_remove_str.restype = c_bool + + # remove_subkeys API # NOTE subkeys accept multiple subkeys + # bool k2hdkc_pm_remove_str_subkey(k2hdkc_chmpx_h handle, const char* pkey, const char* psubkey, size_t subkeylength, bool is_nest) + ret.k2hdkc_pm_remove_str_subkey.argtypes = [ + c_uint64, c_char_p, c_char_p, c_char_p, c_size_t, c_bool + ] + ret.k2hdkc_pm_remove_str_subkey.restype = c_bool + + # rename API + # bool k2hdkc_pm_rename_with_parent_str_wa(k2hdkc_chmpx_h handle, const char* poldkey, const char* pnewkey, const char* pparentkey, bool checkattr, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_rename_with_parent_str_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, c_char_p, c_bool, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_rename_with_parent_str_wa.restype = c_bool + + # set_all API + # bool k2hdkc_pm_set_str_all_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* pval, const char** pskeyarray, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_set_str_all_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_char_p), c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_set_str_all_wa.restype = c_bool + # bool k2hdkc_pm_set_all_wa(k2hdkc_chmpx_h handle, const unsigned char* pkey, size_t keylength, const unsigned char* pval, size_t vallength, const PK2HDKCKEYPCK pskeypck, int skeypckcnt, const char* encpass, const time_t* expire) + ret.k2hdkc_pm_set_all_wa.argtypes = [ + c_uint64, c_char_p, c_size_t, c_char_p, c_size_t, + POINTER(KeyPack), c_int, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_set_all_wa.restype = c_bool + + # set_subkeys API + # bool k2hdkc_pm_set_str_subkeys(k2hdkc_chmpx_h handle, const char* pkey, const char** pskeyarray) + ret.k2hdkc_pm_set_str_subkeys.argtypes = [ + c_uint64, c_char_p, POINTER(c_char_p) + ] + ret.k2hdkc_pm_set_str_subkeys.restype = c_bool + # + # k2hdkc_pm_set_subkeys + # bool k2hdkc_pm_set_subkeys(k2hdkc_chmpx_h handle, const unsigned char* pkey, size_t keylength, const PK2HDKCKEYPCK pskeypck, int skeypckcnt) + ret.k2hdkc_pm_set_subkeys.argtypes = [ + c_uint64, + POINTER(c_ubyte), c_size_t, + POINTER(KeyPack), c_int + ] + ret.k2hdkc_pm_set_subkeys.restype = c_bool + + # get API + # bool k2hdkc_pm_get_str_value_wp(k2hdkc_chmpx_h handle, + # const char* pkey, const char* encpass, char** ppval); + ret.k2hdkc_pm_get_str_value_wp.argtypes = [ + c_uint64, c_char_p, c_char_p, + POINTER(c_char_p) + ] + ret.k2hdkc_pm_get_str_value_wp.restype = c_bool + + # set API + # k2hdkc_pm_set_str_value_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* pval, bool rmsubkeylist, const char* encpass, const time_t* expire); + ret.k2hdkc_pm_set_str_value_wa.argtypes = [ + c_uint64, c_char_p, c_char_p, c_bool, c_char_p, + POINTER(c_ulong) + ] + ret.k2hdkc_pm_set_str_value_wa.restype = c_bool + + # open API + # k2hdkc_chmpx_h k2hdkc_open_chmpx_full(const char* config, + # short ctlport, const char* cuk, bool is_auto_rejoin, bool no_giveup_rejoin, + # bool is_clean_bup) + ret.k2hdkc_open_chmpx_full.argtypes = [ + c_char_p, c_short, c_char_p, c_bool, c_bool, c_bool + ] + ret.k2hdkc_open_chmpx_full.restype = c_uint64 + ret.k2hdkc_open_chmpx_ex.argtypes = [ + c_char_p, c_short, c_bool, c_bool, c_bool + ] + ret.k2hdkc_open_chmpx_ex.restype = c_uint64 + ret.k2hdkc_open_chmpx.argtypes = [c_char_p] + ret.k2hdkc_open_chmpx.restype = c_uint64 + + # close API + # bool k2hdkc_close_chmpx_ex(k2hdkc_chmpx_h handle, bool is_clean_bup) + ret.k2hdkc_close_chmpx_ex.argtypes = [c_uint64, c_bool] + ret.k2hdkc_close_chmpx_ex.restype = c_bool + return ret + + +# Initializes library handlers +_init_library_handle() + + +# Gets library handler +def get_library_handle(): + """Gets C library handles + """ + return _init_library_handle() + + +# Configures the loglevel. +def set_log_level(log_level): + """Sets the log level + """ + LOG.setLevel(log_level) + + +# TODO +# support function to set a logfile as package level function + + +# Configures the layer loglevel. +def set_layer_log_level(log_level): + """Sets the layer log level + """ + if not isinstance(log_level, LayerLogLevel): + TypeError("log_level shoube a LayerLogLevel object") + # 1. gets the current loglevel + # current_log_level = logging.getLevelName(LOG.level) + + global _HANDLE # noqa: pylint: disable=global-statement + if not _HANDLE: + raise RuntimeError("library handle should be defined") + + # 2. sets the each layer loglevel + if LOG.level == logging.NOTSET: + # 1. set network layer silent + _HANDLE['k2hdkc'].k2hdkc_disable_comlog() + # 2. set k2hdkc layer silent + _HANDLE['k2hdkc'].k2hdkc_set_debug_level_silent() + # 3. set chmpx layer silent + _HANDLE['chmpx'].chmpx_set_debug_level_silent() + # 4. set k2hash layer silent + _HANDLE['k2hash'].k2h_set_debug_level_silent() + elif LOG.level == logging.DEBUG: + # 1. set network layer silent + _HANDLE['k2hdkc'].k2hdkc_enable_comlog() + # 2. set k2hdkc layer silent + _HANDLE['k2hdkc'].k2hdkc_set_debug_level_dump() + # 3. set chmpx layer silent + _HANDLE['chmpx'].chmpx_set_debug_level_dump() + # 4. set k2hash layer silent + _HANDLE['k2hash'].k2h_set_debug_level_dump() + elif LOG.level == logging.INFO: + # 1. set network layer silent + _HANDLE['k2hdkc'].k2hdkc_disable_comlog() + # 2. set k2hdkc layer silent + _HANDLE['k2hdkc'].k2hdkc_set_debug_level_message() + # 3. set chmpx layer silent + _HANDLE['chmpx'].chmpx_set_debug_level_message() + # 4. set k2hash layer silent + _HANDLE['k2hash'].k2h_set_debug_level_message() + elif LOG.level == logging.WARNING: + # 1. set network layer silent + _HANDLE['k2hdkc'].k2hdkc_disable_comlog() + # 2. set k2hdkc layer silent + _HANDLE['k2hdkc'].k2hdkc_set_debug_level_warning() + # 3. set chmpx layer silent + _HANDLE['chmpx'].chmpx_set_debug_level_warning() + # 4. set k2hash layer silent + _HANDLE['k2hash'].k2h_set_debug_level_warning() + elif LOG.level == logging.ERROR: + # 1. set network layer silent + _HANDLE['k2hdkc'].k2hdkc_disable_comlog() + # 2. set k2hdkc layer silent + _HANDLE['k2hdkc'].k2hdkc_set_debug_level_error() + # 3. set chmpx layer silent + _HANDLE['chmpx'].chmpx_set_debug_level_error() + # 4. set k2hash layer silent + _HANDLE['k2hash'].k2h_set_debug_level_error() + else: + # level unknown + raise ValueError("unknown logging level:{}".format( + logging.getLevelName(LOG.level))) + + return True + + +# +# import k2hdkc modules +# +from k2hdkc.k2hdkc import K2hdkc + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/src/k2hdkc/k2hdkc.py b/src/k2hdkc/k2hdkc.py new file mode 100644 index 0000000..f2da6db --- /dev/null +++ b/src/k2hdkc/k2hdkc.py @@ -0,0 +1,874 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# +"""K2hdkc Python Driver""" +from __future__ import absolute_import +from copy import deepcopy +import ctypes +from ctypes import pointer, byref, cast, POINTER, Structure +from ctypes import c_bool, c_ubyte, c_size_t, c_short, c_int, c_ulonglong, c_char_p +from ctypes import c_uint8, c_uint16, c_uint32, c_uint64 +import logging +import os +from pathlib import Path +from struct import pack, unpack +import sys +from k2hdkc import TimeUnit +import k2hdkc + +LOG = logging.getLogger(__name__) + + +class K2hdkc: + """ + K2hdkc class provides methods to handle key/value pairs in k2hdkc hash database. + """ + K2H_INVALID_HANDLE = 0 + + def _set_k2h_handle(self): + """Sets the k2h handle""" + # handle = self._libk2hdkc.k2hdkc_open_chmpx( + # c_char_p(self._conf_file.encode())) + # handle = self._libk2hdkc.k2hdkc_open_chmpx_ex( + # c_char_p(self._conf_file.encode()), c_short(self._port), + # c_bool(self._rejoin), c_bool(self._rejoin_forever), + # c_bool(self._clear_backup)) + handle = self._libk2hdkc.k2hdkc_open_chmpx_full( + c_char_p(self._conf_file.encode()), c_short(self._port), + (c_char_p(self._cuk.encode()) if self._cuk else None), + c_bool(self._rejoin), c_bool(self._rejoin_forever), + c_bool(self._clear_backup)) + + if handle == self.__class__.K2H_INVALID_HANDLE: + raise RuntimeError("handle should not be K2H_INVALID_HANDLE") + self._handle = handle + + def __init__(self, + conf_file, + port=8031, + cuk=None, + rejoin=True, + rejoin_forever=True, + clear_backup=True): + """ + K2hdkc constructor. + """ + self._handle = 0 + + if not isinstance(conf_file, str): + raise TypeError("conf_file should be a str object") + if not os.path.exists(Path(conf_file)): + raise RuntimeError("conf_file:{} should exists".format(conf_file)) + if not isinstance(port, int): + raise TypeError("port should be a int object") + if cuk and not isinstance(cuk, str): + raise TypeError("cuk should be a str object") + if not isinstance(rejoin, bool): + raise TypeError("rejoin should be a bool object") + if not isinstance(rejoin_forever, bool): + raise TypeError("rejoin_forever should be a bool object") + if not isinstance(clear_backup, bool): + raise TypeError("clear_backup should be a bool object") + + self._conf_file = conf_file + self._port = port + self._cuk = cuk + self._rejoin = rejoin + self._rejoin_forever = rejoin_forever + self._clear_backup = clear_backup + + try: + # https://docs.python.org/3/library/ctypes.html#ctypes.LibraryLoader.LoadLibrary + self._libc = k2hdkc.get_library_handle()["c"] + if not self._libc: + raise Exception('unable to load c library') + self._libk2hash = k2hdkc.get_library_handle()["k2hash"] + if not self._libk2hash: + raise Exception('unable to load k2hash library') + self._libchmpx = k2hdkc.get_library_handle()["chmpx"] + if not self._libchmpx: + raise Exception('unable to load chmpx library') + self._libk2hdkc = k2hdkc.get_library_handle()["k2hdkc"] + if not self._libk2hdkc: + raise Exception('unable to load k2hdkc library') + except: + LOG.error("Unexpected error:{%s}", sys.exc_info()[0]) + raise + + self._set_k2h_handle() + + @property + def libk2hdkc(self): + """returns libk2hkc handle """ + return self._libk2hdkc + + @property + def libc(self): + """returns libc handle """ + return self._libc + + def set( # noqa: pylint: disable=too-many-branches + self, + key, + val, + clear_subkeys=False, + subkeys=None, + password=None, + expire_duration=None, + time_unit=TimeUnit.SECONDS): + """Sets a key/value pair """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + if not isinstance(val, str): + raise TypeError("val should currently be a str object") + + # checks subkeys + subkeylist = [] + if subkeys: + if not isinstance(subkeys, list) and not isinstance(subkeys, str): + raise TypeError("subkeyes should be a str or list object") + if isinstance(subkeys, list): + subkeylist += subkeys + elif isinstance(subkeys, str): + subkeylist.append(subkeys) + + if password and not isinstance(password, str): + raise TypeError("password should be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + if time_unit and not isinstance(time_unit, TimeUnit): + raise TypeError("time_unit should be a TimeUnit object") + + # 1. calls k2hdkc_pm_set_str_all_wa if subkeylist exists + # bool k2hdkc_pm_set_all_wa(k2hdkc_chmpx_h handle, const unsigned char* pkey, size_t keylength, const unsigned char* pval, size_t vallength, const PK2HDKCKEYPCK pskeypck, int skeypckcnt, const char* encpass, const time_t* expire) + if len(subkeylist) > 0: + keypack_array = (k2hdkc.KeyPack * len(subkeylist))() + i = 0 + for i in subkeylist: + skey = subkeylist[i] + skey_bin = skey.encode() + keypack_array[i].pkey = cast(skey_bin, POINTER(c_ubyte)) + keypack_array[i].length = c_size_t(len(skey_bin) + 1) + keypack_array_pointer = cast(keypack_array, + POINTER(k2hdkc.KeyPack)) + res = self._libk2hdkc.k2hdkc_pm_set_all_wa( + self._handle, c_char_p(key.encode()), c_size_t(len(key) + 1), + c_char_p(val.encode()), c_size_t(len(val) + 1), + (keypack_array_pointer if keypack_array_pointer else None), + len(subkeylist), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + else: + res = self._libk2hdkc.k2hdkc_pm_set_str_value_wa( + self._handle, c_char_p(key.encode()), c_char_p(val.encode()), + c_bool(clear_subkeys), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + + LOG.debug("ret:%s", res) + + # TODO keeps code and subcode or not + # k2hdkc_get_res_code(self._handle) + # k2hdkc_get_res_subcode(self._handle) + return res + + # bool k2hdkc_pm_get_str_value_wp(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, char** ppval); + def get(self, key, password=None): + """Gets the value """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + if password and not isinstance(password, str): + raise TypeError("password should be a str object") + if password and password == "": + raise ValueError("password should not be empty") + ppval = pointer(c_char_p("".encode())) + res = self._libk2hdkc.k2hdkc_pm_get_str_value_wp( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), ppval) + + # TODO keeps code and subcode or not + # k2hdkc_get_res_code(self._handle) + # k2hdkc_get_res_subcode(self._handle) + + if res and ppval.contents.value: + pval = ppval.contents.value.decode() + if ppval.contents: + self._libc.free(ppval.contents) + return pval + return "" + + # bool k2hdkc_pm_set_str_subkey_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* psubkey, const char* pskeyval, bool checkattr, const char* encpass, const time_t* expire) + def add_subkey(self, + key, + subkey, + subval, + check_attr=True, + password=None, + expire_duration=None, + time_unit=TimeUnit.SECONDS): + """Adds a new subkey to a current subkey. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + if not isinstance(subkey, str): + raise TypeError("subkey should be a str object") + if not subkey: + raise ValueError("subkey should not be empty") + if not isinstance(subval, str): + raise TypeError("subval should be a str object") + if check_attr and not isinstance(check_attr, bool): + raise TypeError("check_attr should currently be a bool object") + if password and not isinstance(password, str): + raise TypeError("password should currently be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + if time_unit and not isinstance(time_unit, TimeUnit): + raise TypeError("time_unit should be a TimeUnit object") + + # bool k2hdkc_pm_set_str_subkey_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* psubkey, const char* pskeyval, bool checkattr, const char* encpass, const time_t* expire) + res = self._libk2hdkc.k2hdkc_pm_set_str_subkey_wa( + self._handle, + c_char_p(key.encode()), + c_char_p(subkey.encode()), + c_char_p(subval.encode()), + c_bool(check_attr), + (c_char_p(password.encode()) if password else None), + (pointer(c_uint64(expire_duration)) if expire_duration else None), + ) + + if not res: + LOG.error('error in k2hdkc_pm_set_str_subkey_wa') + return res + + # bool k2hdkc_pm_cas64_str_get_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, uint64_t* pval) + def cas_get(self, key, data_type, password=None, expire_duration=None): # noqa: pylint: disable=too-many-statements,too-many-branches + """Gets a variable from a cluster using a CAS operation. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + # data_ type is either byte, short, int or longlong. + if not data_type: + raise ValueError("data_type should not be empty") + if not isinstance(data_type, k2hdkc.DataType): + raise TypeError("data_type should be a k2hdkc.DataType object") + + if password and not isinstance(password, str): + raise TypeError("password should currently be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + if data_type == k2hdkc.DataType.U_BYTE: + val = c_uint8() + res = self._libk2hdkc.k2hdkc_pm_cas8_str_get_wa( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), + byref(val)) + elif data_type == k2hdkc.DataType.U_SHORT: + val = c_uint16() + res = self._libk2hdkc.k2hdkc_pm_cas16_str_get_wa( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), + byref(val)) + elif data_type == k2hdkc.DataType.U_INT32: + val = c_uint32() + res = self._libk2hdkc.k2hdkc_pm_cas32_str_get_wa( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), + byref(val)) + elif data_type == k2hdkc.DataType.U_LONGLONG: + val = c_ulonglong() + res = self._libk2hdkc.k2hdkc_pm_cas64_str_get_wa( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), + byref(val)) + else: + raise ValueError( + "data_type should be a k2hdkc.DataType object(unknown data_type)" + ) + + if res: + return val.value + LOG.error('error in k2hdkc_pm_cas??_str_get_wa') + return 0 + + # bool k2hdkc_pm_cas_str_decrement_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, const time_t* expire) + def cas_decrement(self, key, password=None, expire_duration=None): # noqa: pylint: disable=too-many-branches + """Decrements a variable in a cluster by using a CAS operation. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + if password and not isinstance(password, str): + raise TypeError("password should currently be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + res = self._libk2hdkc.k2hdkc_pm_cas_str_decrement_wa( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), + (pointer(c_uint64(expire_duration)) if expire_duration else None)) + if not res: + LOG.error('error in k2hdkc_pm_cas_decrement_wa') + return res + + # bool k2hdkc_pm_cas_str_increment_wa(k2hdkc_chmpx_h handle, const char* pkey, const char* encpass, const time_t* expire) + def cas_increment(self, key, password=None, expire_duration=None): # noqa: pylint: disable=too-many-branches + """Increments a variable in a cluster by using a CAS operation. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + if password and not isinstance(password, str): + raise TypeError("password should currently be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + res = self._libk2hdkc.k2hdkc_pm_cas_str_increment_wa( + self._handle, c_char_p(key.encode()), + (c_char_p(password.encode()) if password else None), + (pointer(c_uint64(expire_duration)) if expire_duration else None)) + if not res: + LOG.error('error in k2hdkc_pm_cas_increment_wa') + return res + + # bool k2hdkc_pm_cas8_str_init_wa(k2hdkc_chmpx_h handle, const char* pkey, uint8_t val, const char* encpass, const time_t* expire) + def cas_init(self, key, val=None, password=None, expire_duration=None): # noqa: pylint: disable=too-many-branches + """Initializes a variable in a cluster by using a CAS operation. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + # val type is either byte, short, int or longlong. + if val: + if not isinstance(val, bytes): + raise TypeError("val should be a bytes object") + else: + val = pack('B', 0) # default value is 0 in 8bit. + + if password and not isinstance(password, str): + raise TypeError("password should currently be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + if len(val) == 1: + res = self._libk2hdkc.k2hdkc_pm_cas8_str_init_wa( + self._handle, c_char_p(key.encode()), + c_uint8(unpack('B', val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + elif len(val) == 2: + res = self._libk2hdkc.k2hdkc_pm_cas16_str_init_wa( + self._handle, c_char_p(key.encode()), + c_uint16(unpack('H', val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + elif len(val) == 4: + res = self._libk2hdkc.k2hdkc_pm_cas32_str_init_wa( + self._handle, c_char_p(key.encode()), + c_uint32(unpack('I', val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + elif len(val) == 8: + res = self._libk2hdkc.k2hdkc_pm_cas64_str_init_wa( + self._handle, c_char_p(key.encode()), + c_ulonglong(unpack('Q', val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + if not res: + LOG.error('error in k2hdkc_pm_cas??_str_init_wa') + return res + + # bool k2hdkc_pm_cas8_str_set_wa(k2hdkc_chmpx_h handle, const char* pkey, uint8_t oldval, uint8_t newval, const char* encpass, const time_t* expire) + def cas_set( # noqa: pylint: disable=too-many-branches + self, + key, + old_val, + new_val, + password=None, + expire_duration=None): + """Sets a value in a cluster by using a CAS operation. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + # val type is either byte, short, int or longlong. + if not old_val or not new_val: + raise ValueError("old_val as well as new_val should not be empty") + + if not isinstance(old_val, bytes): + raise TypeError("old_val should be a bytes object") + if not isinstance(new_val, bytes): + raise TypeError("new_val should be a bytes object") + if len(old_val) != len(new_val): + raise ValueError( + "length of old_val and new_val should not be same") + + if password and not isinstance(password, str): + raise TypeError("password should currently be a str object") + if password and password == "": + raise ValueError("password should not be empty") + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a int object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + if len(old_val) == 1: + res = self._libk2hdkc.k2hdkc_pm_cas8_str_set_wa( + self._handle, c_char_p(key.encode()), + c_uint8(unpack('B', old_val)[0]), + c_uint8(unpack('B', new_val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + elif len(old_val) == 2: + res = self._libk2hdkc.k2hdkc_pm_cas16_str_set_wa( + self._handle, c_char_p(key.encode()), + c_uint16(unpack('H', old_val)[0]), + c_uint16(unpack('H', new_val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + elif len(old_val) == 4: + res = self._libk2hdkc.k2hdkc_pm_cas32_str_set_wa( + self._handle, c_char_p(key.encode()), + c_uint32(unpack('I', old_val)[0]), + c_uint32(unpack('I', new_val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + elif len(old_val) == 8: + res = self._libk2hdkc.k2hdkc_pm_cas64_str_set_wa( + self._handle, c_char_p(key.encode()), + c_uint64(unpack('Q', old_val)[0]), + c_uint64(unpack('Q', new_val)[0]), + (c_char_p(password.encode()) if password else None), (pointer( + c_uint64(expire_duration)) if expire_duration else None)) + if not res: + LOG.error('error in k2hdkc_pm_cas??_str_set_wa') + return res + + # bool k2hdkc_pm_clear_str_subkeys(k2hdkc_chmpx_h handle, const char* pkey) + def clear_subkeys(self, key): + """Clears subkeys of a key. Another subkeys that a subkey has will be removed recursively. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + + res = self._libk2hdkc.k2hdkc_pm_clear_str_subkeys( + self._handle, c_char_p(key.encode())) + + if not res: + LOG.error('error in k2hdkc_pm_set_str_subkey_wa') + return res + + # bool k2hdkc_close_chmpx_ex(k2hdkc_chmpx_h handle, bool is_clean_bup) + def close(self): + """Closes the handle + """ + res = self._libk2hdkc.k2hdkc_close_chmpx_ex(self._handle, c_bool(True)) + + if not res: + LOG.error('error in k2hdkc_close_chmpx_ex') + return res + + # PK2HDKCATTRPCK k2hdkc_pm_get_str_direct_attrs(k2hdkc_chmpx_h handle, const char* pkey, int* pattrspckcnt) + def get_attributes(self, key, use_str=True): + """Retrievs attributes of a key. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + + pattrspckcnt = c_int() + res = self._libk2hdkc.k2hdkc_pm_get_str_direct_attrs( + self._handle, c_char_p(key.encode()), byref(pattrspckcnt)) + LOG.debug("type(res):{%s} pattrspckcnt.value{%s}", type(res), + pattrspckcnt.value) + attrs = {} + for i in range(pattrspckcnt.value): + key_buf = ctypes.create_string_buffer(res[i].keylength) + val_buf = ctypes.create_string_buffer(res[i].vallength) + for j in range(res[i].keylength): + key_buf[j] = res[i].pkey[j] + for k in range(res[i].vallength): + val_buf[k] = res[i].pval[k] + if use_str: + # TODO UnicodeDecodeError occurs calling decode() w/o errors='ignore' + attrs[key_buf.value.decode()] = val_buf.value.decode( + errors='ignore') + else: + attrs[key_buf.value] = val_buf.value + return attrs + + # int k2hdkc_pm_get_str_subkeys(k2hdkc_chmpx_h handle, const char* pkey, char*** ppskeyarray) + # char** k2hdkc_pm_get_str_direct_subkeys(k2hdkc_chmpx_h handle, const char* pkey) + # PK2HDKCKEYPCK k2hdkc_pm_get_direct_subkeys(k2hdkc_chmpx_h handle, const unsigned char* pkey, size_t keylength, int* pskeypckcnt) + # ret.k2hdkc_pm_get_direct_subkeys.argtypes = [ + # c_uint64, c_char_p, c_size_t, + # POINTER(c_int) + # ] + # ret.k2hdkc_pm_get_direct_subkeys.restype = POINTER(KeyPack) + def get_subkeys(self, key, use_str=True): + """Retrievs subkeys of a key. + """ + if not isinstance(key, str): + raise TypeError("key should currently be a str object") + if not key: + raise ValueError("key should not be empty") + + pskeypckcnt = c_int() + res = self._libk2hdkc.k2hdkc_pm_get_direct_subkeys( + self._handle, c_char_p(key.encode()), c_size_t(len(key) + 1), + byref(pskeypckcnt)) + LOG.debug("%s", pskeypckcnt.value) + subkeys = [] + for i in range(pskeypckcnt.value): + buf = ctypes.create_string_buffer(res[i].length) + for j in range(res[i].length): + buf[j] = res[i].pkey[j] + if use_str: + subkeys.append(buf.value.decode()) + else: + subkeys.append(buf.value) + return subkeys + + # bool k2hdkc_pm_q_str_pop_wp(k2hdkc_chmpx_h handle, const char* pprefix, bool is_fifo, const char* encpass, const char** ppval) + def queue_get(self, + prefix, + is_fifo=True, + password=None, + expire_duration=None): + """Gets a new element to a queue. + """ + # prefix + if not isinstance(prefix, str): + raise TypeError("prefix should be a string object") + # fifo + if not isinstance(is_fifo, bool): + raise TypeError("fifo should be a boolean object") + # password + if password and not isinstance(password, str): + raise TypeError("password should be a string object") + # expire_duration + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a boolean object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + ppval = c_char_p() + res = self._libk2hdkc.k2hdkc_pm_q_str_pop_wp( + self._handle, c_char_p(prefix.encode()), is_fifo, + (c_char_p(password.encode()) if password else None), byref(ppval)) + + if res and ppval.value: + pval = ppval.value.decode() + if ppval: + self._libc.free(ppval) + return pval + return "" + + # bool k2hdkc_pm_q_str_push_wa(k2hdkc_chmpx_h handle, const char* pprefix, const char* pval, bool is_fifo, bool checkattr, const char* encpass, const time_t* expire) + def queue_put(self, + prefix, + val, + is_fifo=True, + is_check_attr=True, + password=None, + expire_duration=None): + """Adds a new element to a queue. + """ + # prefix + if not isinstance(prefix, str): + raise TypeError("prefix should be a string object") + # val + if not isinstance(val, str): + raise TypeError("val should be a string object") + # fifo + if not isinstance(is_fifo, bool): + raise TypeError("fifo should be a boolean object") + # check_attr + if not isinstance(is_check_attr, bool): + raise TypeError("check_attr should be a boolean object") + # password + if password and not isinstance(password, str): + raise TypeError("password should be a string object") + # expire_duration + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a boolean object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + res = self._libk2hdkc.k2hdkc_pm_q_str_push_wa( + self._handle, c_char_p(prefix.encode()), c_char_p(val.encode()), + is_fifo, is_check_attr, + (c_char_p(password.encode()) if password else None), + (pointer(c_uint64(expire_duration)) if expire_duration else None)) + if res: + LOG.debug("k2hdkc_pm_q_str_push_wa:{%s}", res) + else: + return False + return True + + # bool k2hdkc_pm_keyq_str_pop_wp(k2hdkc_chmpx_h handle, const char* pprefix, bool is_fifo, const char* encpass, const char** ppkey, const char** ppval) + def keyqueue_get(self, + prefix, + is_fifo=True, + password=None, + expire_duration=None): + """Gets a new key/value element from queue. + """ + # prefix + if not isinstance(prefix, str): + raise TypeError("prefix should be a string object") + # fifo + if not isinstance(is_fifo, bool): + raise TypeError("fifo should be a boolean object") + # password + if password and not isinstance(password, str): + raise TypeError("password should be a string object") + # expire_duration + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a boolean object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + + ppkey = c_char_p() + ppval = c_char_p() + res = self._libk2hdkc.k2hdkc_pm_keyq_str_pop_wp( + self._handle, c_char_p(prefix.encode()), is_fifo, + (c_char_p(password.encode()) if password else None), byref(ppkey), + byref(ppval)) + + if res and ppkey.value and ppval.value: + pkey = ppkey.value.decode() + pval = ppval.value.decode() + if ppkey: + self._libc.free(ppkey) + if ppval: + self._libc.free(ppval) + return {pkey: pval} + return {} + + # bool k2hdkc_pm_keyq_str_push_wa(k2hdkc_chmpx_h handle, const char* pprefix, const char* pkey, const char* pval, bool is_fifo, bool checkattr, const char* encpass, const time_t* expire) + def keyqueue_put(self, + prefix, + key, + val, + is_fifo=True, + is_check_attr=True, + password=None, + expire_duration=None): + """Adds a new key/value pair element to a queue. + """ + # prefix + if not isinstance(prefix, str): + raise TypeError("prefix should be a string object") + # key + if not isinstance(key, str): + raise TypeError("key should be a string object") + # val + if not isinstance(val, str): + raise TypeError("val should be a string object") + # fifo + if not isinstance(is_fifo, bool): + raise TypeError("fifo should be a boolean object") + # check_attr + if not isinstance(is_check_attr, bool): + raise TypeError("check_attr should be a boolean object") + # password + if password and not isinstance(password, str): + raise TypeError("password should be a string object") + # expire_duration + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a boolean object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + res = self._libk2hdkc.k2hdkc_pm_keyq_str_push_wa( + self._handle, c_char_p(prefix.encode()), c_char_p(key.encode()), + c_char_p(val.encode()), is_fifo, is_check_attr, + (c_char_p(password.encode()) if password else None), + (pointer(c_uint64(expire_duration)) if expire_duration else None)) + if res: + LOG.debug("k2hdkc_pm_keyq_str_push_wa:{%s}", res) + else: + return False + return True + + # bool k2hdkc_pm_remove_str(k2hdkc_chmpx_h handle, const char* pkey) + def remove(self, key): + """Removes a key from a cluster. + """ + if not isinstance(key, str): + raise TypeError("key should be a str object") + if not key: + raise ValueError("key should not be empty") + res = self._libk2hdkc.k2hdkc_pm_remove_str(self._handle, + c_char_p(key.encode())) + return res + + # bool k2hdkc_pm_remove_str_subkey(k2hdkc_chmpx_h handle, const char* pkey, const char* psubkey, size_t subkeylength, bool is_nest) + def remove_subkeys(self, + key, + subkeys, + nested=False): # NOTE subkeys accept multiple subkeys + """Removes a subkey from the current subkeys. + """ + if not isinstance(key, str): + raise TypeError("key should be a str object") + if not key: + raise ValueError("key should not be empty") + subkeylist = [] + if not isinstance(subkeys, list) and not isinstance(subkeys, str): + raise TypeError("subkeyes should be a str or list object") + if not subkeys: + raise ValueError("subkeys should not be empty") + if isinstance(subkeys, list): + subkeylist += deepcopy(subkeys) + elif isinstance(subkeys, str): + subkeylist.append(subkeys) + if not isinstance(nested, bool): + raise TypeError("nested should be a boolean object") + + for subkey in subkeylist: + if not isinstance(subkey, str): + LOG.warning("subkey should be a str object") + continue + if not subkey: + LOG.warning("subkey should not be empty") + continue + res = self._libk2hdkc.k2hdkc_pm_remove_str_subkey( + self._handle, c_char_p(key.encode()), + c_char_p(subkey.encode()), c_bool(nested)) + if not res: + return False + return True + + # bool k2hdkc_pm_rename_with_parent_str_wa(k2hdkc_chmpx_h handle, const char* poldkey, const char* pnewkey, const char* pparentkey, bool checkattr, const char* encpass, const time_t* expire) + def rename(self, + key, + newkey, + parent_key=None, + is_check_attr=True, + password=None, + expire_duration=None): + """Renames a key in a cluster. + """ + if not isinstance(key, str): + raise TypeError("key should be a str object") + if not key: + raise ValueError("key should not be empty") + if not isinstance(newkey, str): + raise TypeError("newkey should be a str object") + if not newkey: + raise ValueError("newkey should not be empty") + if parent_key and not isinstance(parent_key, str): + raise TypeError("parent_key should be a str object") + # check_attr + if not isinstance(is_check_attr, bool): + raise TypeError("check_attr should be a boolean object") + # password + if password and not isinstance(password, str): + raise TypeError("password should be a string object") + # expire_duration + if expire_duration and not isinstance(expire_duration, int): + raise TypeError("expire_duration should be a boolean object") + if expire_duration and expire_duration <= 0: + raise ValueError("expire_duration should not be positive") + res = self._libk2hdkc.k2hdkc_pm_rename_with_parent_str_wa( + self._handle, c_char_p(key.encode()), c_char_p(newkey.encode()), + (c_char_p(parent_key.encode()) if parent_key else None), + is_check_attr, (c_char_p(password.encode()) if password else None), + (pointer(c_uint64(expire_duration)) if expire_duration else None)) + return res + + def set_subkeys(self, key, subkeys): + """Replaces current subkeys with new one. + """ + if not isinstance(key, str): + raise TypeError("key should be a str object") + if not key: + raise ValueError("key should not be empty") + subkeylist = [] + if not isinstance(subkeys, list) and not isinstance(subkeys, str): + raise TypeError("subkeyes should be a str or list object") + if not subkeys: + raise ValueError("subkeys should not be empty") + if isinstance(subkeys, list): + subkeylist += subkeys + elif isinstance(subkeys, str): + subkeylist.append(subkeys) + + if len(subkeylist) > 0: + keypack_array = (k2hdkc.KeyPack * len(subkeylist))() + i = 0 + for i in subkeylist: + skey = subkeylist[i] + skey_bin = skey.encode() + keypack_array[i].pkey = cast(skey_bin, POINTER(c_ubyte)) + keypack_array[i].length = c_size_t(len(skey_bin) + 1) + keypack_array_pointer = cast(keypack_array, + POINTER(k2hdkc.KeyPack)) + + # bool k2hdkc_pm_set_subkeys(k2hdkc_chmpx_h handle, const unsigned char* pkey, size_t keylength, const PK2HDKCKEYPCK pskeypck, int skeypckcnt) + key_bin = key.encode() + res = self._libk2hdkc.k2hdkc_pm_set_subkeys( + self._handle, cast(key_bin, POINTER(c_ubyte)), + c_size_t(len(key_bin) + 1), + (keypack_array_pointer if keypack_array_pointer else None), + len(subkeylist)) + return res + + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/src/k2hdkc/tests/test_k2hdkc.py b/src/k2hdkc/tests/test_k2hdkc.py new file mode 100644 index 0000000..0ad56d6 --- /dev/null +++ b/src/k2hdkc/tests/test_k2hdkc.py @@ -0,0 +1,313 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +import unittest +import k2hdkc +import logging +import ctypes +import time +from struct import pack + + +class TestK2hdkc(unittest.TestCase): + def test_K2hdkc_construct(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + db.close() + + def test_K2hdkc_add_subkey(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + subkey = "sub_hello" + subval = "sub_world" + self.assertTrue(db.add_subkey(key, subkey, subval), True) + self.assertTrue(db.get_subkeys(key), [subkey]) + db.close() + + def test_K2hdkc_clear_subkeys(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + subkey = "sub_hello" + subval = "sub_world" + self.assertTrue(db.add_subkey(key, subkey, subval), True) + self.assertTrue(db.get_subkeys(key), [subkey]) + self.assertTrue(db.clear_subkeys(key), True) + # TODO error + # self.assertTrue(db.get_subkeys(key), []) + db.close() + + def test_K2hdkc_get(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + db.close() + + @unittest.skip("skipping because no attrs") + def test_K2hdkc_get_attrs(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + db.close() + + def test_K2hdkc_get_subkeys(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + subkey = "sub_hello" + subval = "sub_world" + self.assertTrue(db.add_subkey(key, subkey, subval), True) + self.assertTrue(db.get_subkeys(key), [subkey]) + db.close() + + def test_K2hdkc_queue_get(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + qkey = "q_hello" + qval = "q_world" + self.assertTrue(db.queue_put(qkey, qval), True) + self.assertTrue(db.queue_get(qkey), qval) + db.close() + + def test_K2hdkc_queue_put(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + qkey = "q_hello" + qval = "q_world" + self.assertTrue(db.queue_put(qkey, qval), True) + self.assertTrue(db.queue_get(qkey), qval) + db.close() + + def test_K2hdkc_keyqueue_get(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + qprefix = "q_prefix" + qkey = "q_hello" + qval = "q_world" + self.assertTrue(db.keyqueue_put(qprefix, qkey, qval), True) + self.assertTrue(db.keyqueue_get(qprefix), {qkey, qval}) + db.close() + + def test_K2hdkc_keyqueue_put(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + qprefix = "q_prefix" + qkey = "q_hello" + qval = "q_world" + self.assertTrue(db.keyqueue_put(qprefix, qkey, qval), True) + self.assertTrue(db.keyqueue_get(qprefix), {qkey, qval}) + db.close() + + def test_K2hdkc_remove(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + self.assertTrue(db.remove(key), True) + self.assertFalse(db.get(key), val) + db.close() + + def test_K2hdkc_remove_subkeys(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + subkey = "sub_hello" + subval = "sub_world" + self.assertTrue(db.add_subkey(key, subkey, subval), True) + self.assertTrue(db.get_subkeys(key), [subkey]) + # TODO error + # self.assertTrue(db.remove_subkeys(key, subkey), True) + db.close() + + def test_K2hdkc_rename(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + newkey = "olleh" + self.assertTrue(db.rename(key, newkey), True) + self.assertTrue(db.get(newkey), val) + db.close() + + def test_K2hdkc_set(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + db.close() + + def test_K2hdkc_set_subkeys(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + subkey = "sub_hello" + subval = "sub_world" + self.assertTrue(db.add_subkey(key, subkey, subval), True) + self.assertTrue(db.get_subkeys(key), [subkey]) + db.close() + + def test_K2hdkc_cas_init(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + cas_key = "cas_hello" + cas_value = 65530 + self.assertTrue(db.cas_init(cas_key, pack('H', cas_value)), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + db.close() + + def test_K2hdkc_cas_get(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + cas_key = "cas_hello" + cas_value = 65530 + self.assertTrue(db.cas_init(cas_key, pack('H', cas_value)), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + db.close() + + def test_K2hdkc_cas_decrement(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + cas_key = "cas_hello" + cas_value = 65530 + self.assertTrue(db.cas_init(cas_key, pack('H', cas_value)), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + self.assertTrue(db.cas_increment(cas_key), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value + 1) + self.assertTrue(db.cas_decrement(cas_key), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + db.close() + + def test_K2hdkc_cas_increment(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + cas_key = "cas_hello" + cas_value = 65530 + self.assertTrue(db.cas_init(cas_key, pack('H', cas_value)), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + self.assertTrue(db.cas_increment(cas_key), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value + 1) + self.assertTrue(db.cas_decrement(cas_key), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + db.close() + + def test_K2hdkc_cas_set(self): + db = k2hdkc.K2hdkc('../cluster/slave.yaml') + self.assertTrue(isinstance(db, k2hdkc.K2hdkc)) + key = "hello" + val = "world" + self.assertTrue(db.set(key, val), True) + self.assertTrue(db.get(key), val) + cas_key = "cas_hello" + cas_value = 65530 + self.assertTrue(db.cas_init(cas_key, pack('H', cas_value)), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + self.assertTrue(db.cas_increment(cas_key), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value + 1) + self.assertTrue(db.cas_decrement(cas_key), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + cas_value) + new_cas_value = 1 + self.assertTrue( + db.cas_set(cas_key, pack('H', cas_value), + pack('H', new_cas_value)), True) + self.assertTrue(db.cas_get(cas_key, k2hdkc.DataType.U_SHORT), + new_cas_value) + db.close() + + +if __name__ == '__main__': + unittest.main() + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +# diff --git a/src/k2hdkc/tests/test_k2hdkc_package.py b/src/k2hdkc/tests/test_k2hdkc_package.py new file mode 100644 index 0000000..33a4d56 --- /dev/null +++ b/src/k2hdkc/tests/test_k2hdkc_package.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# +# K2hdkc Python Driver under MIT License +# +# Copyright (c) 2022 Yahoo Japan Corporation +# +# For the full copyright and license information, please view +# the license file that was distributed with this source code. +# +# AUTHOR: Hirotaka Wakabayashi +# CREATE: Tue Feb 08 2022 +# REVISION: +# + +import unittest +import k2hdkc +import logging + + +class TestK2hdkcPackage(unittest.TestCase): + def test_get_library_handle(self): + libk2hdkc = k2hdkc.get_library_handle() + self.assertTrue(libk2hdkc) + self.assertTrue(isinstance(libk2hdkc, dict)) + self.assertTrue(libk2hdkc['c']) + self.assertTrue(libk2hdkc['k2hdkc']) + + def test_set_log_level(self): + k2hdkc.set_log_level(logging.INFO) + logger = logging.getLogger('k2hdkc') + self.assertEqual(logging.getLevelName(logger.level), 'INFO') + + def test_set_layer_log_level(self): + self.assertEqual( + k2hdkc.set_layer_log_level(k2hdkc.LayerLogLevel.K2HDKC), True) + + +if __name__ == '__main__': + unittest.main() + +# +# Local variables: +# tab-width: 4 +# c-basic-offset: 4 +# End: +# vim600: expandtab sw=4 ts=4 fdm=marker +# vim<600: expandtab sw=4 ts=4 +#