diff --git a/.gitattributes b/.gitattributes
index fbab4e69abe..04a84d3e098 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8,6 +8,7 @@
# These are binary so should never be modified by git.
*.a binary
+*.FLM binary
*.ico binary
*.png binary
*.jpg binary
diff --git a/.github/workflows/ports_psoc-edge-ifx.yml b/.github/workflows/ports_psoc-edge-ifx.yml
new file mode 100644
index 00000000000..5dce41e9358
--- /dev/null
+++ b/.github/workflows/ports_psoc-edge-ifx.yml
@@ -0,0 +1,127 @@
+name: psoc-edge port ifx
+
+on:
+ push:
+ pull_request:
+ paths:
+ - '.github/workflows/*.yml'
+ - 'tools/**'
+ - 'py/**'
+ - 'extmod/**'
+ - 'shared/**'
+ - 'lib/**'
+ - 'drivers/**'
+ - 'ports/psoc-edge/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ mpy_hex_file: firmware.hex
+
+jobs:
+ server-build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ board:
+ - KIT_PSE84_AI
+ outputs:
+ commit_sha: ${{ steps.commit_sha.outputs.sha_short }}
+
+ steps:
+ - uses: actions/checkout@v6
+ - name: Install packages
+ run: source tools/ci.sh && ci_psoc_edge_setup
+ - name: Build
+ run: source tools/ci.sh && ci_psoc_edge_build ${{ matrix.board }}
+ - name: Gets commit SHA
+ if: success()
+ id: commit_sha
+ run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
+ - name: Save firmware bin
+ if: success()
+ uses: actions/upload-artifact@v4
+ with:
+ name: mpy-psoc-edge_${{ matrix.board }}_${{ steps.commit_sha.outputs.sha_short }}
+ path: ports/psoc-edge/build-${{ matrix.board }}/${{ env.mpy_hex_file }}
+
+ on-target-test:
+ runs-on:
+ - self-hosted
+ - Linux
+ - PSOC-EDGE
+ needs: server-build
+ env:
+ LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }}
+ pse_test_dir: ../../tests/ports/psoc-edge
+ strategy:
+ matrix:
+ board:
+ - KIT_PSE84_AI
+ steps:
+ - name: Fix permissions
+ run: echo ${{ secrets.SELF_HOSTED_PASSWORD }} | sudo -S chown -R $(whoami):$(whoami) .
+ - name: Checkout code
+ uses: actions/checkout@v6
+ - name: Download binaries
+ uses: actions/download-artifact@v4
+ - name: Container setup
+ run: |
+ echo ${{ secrets.SELF_HOSTED_PASSWORD }} | sudo -S chmod 666 /var/run/docker.sock
+ source tools/ci.sh && ci_psoc_edge_setup_hil ${{ matrix.board }}
+ - name: Setup devices
+ run: |
+ cp mpy-psoc-edge_${{ matrix.board }}_${{ needs.server-build.outputs.commit_sha }}/${{ env.mpy_hex_file }} tools/psoc-edge
+ source tools/ci.sh && ci_psoc_edge_deploy_hil ${{ matrix.board }} ${{ env.mpy_hex_file }} tests/ports/psoc-edge/${{ runner.name }}-devs.yml
+ - name: Decrypt Wi-Fi secrets
+ if: ${{ hashFiles('tests/ports/psoc-edge/mp_custom/secrets.py.gpg') != '' && env.LARGE_SECRET_PASSPHRASE != '' }}
+ run: sh tools/psoc-edge/decrypt_secrets.sh
+
+ - name: Run psoc-edge tests
+ timeout-minutes: 20
+ run: |
+ cd lib/mpy-test-ext
+ python -u run_test_plan.py \
+ --board ${{ matrix.board }} --max-retries 2 \
+ --test-plan $pse_test_dir/test-plan.yml \
+ --hil-devs $pse_test_dir/${{ runner.name }}-devs.yml
+
+ - name: Remove decrypted Wi-Fi secrets
+ if: ${{ always() && hashFiles('tests/ports/psoc-edge/mp_custom/secrets.py.gpg') != '' }}
+ run: rm -f tests/ports/psoc-edge/mp_custom/secrets.py
+
+ - name: Container teardown
+ if: always()
+ run: |
+ source tools/ci.sh && ci_psoc_edge_teardown_hil
+
+ release:
+ runs-on: ubuntu-latest
+ needs: [server-build, on-target-test]
+ permissions:
+ contents: write
+ strategy:
+ matrix:
+ board:
+ - KIT_PSE84_AI
+ if: startsWith(github.ref, 'refs/tags/v')
+ steps:
+ - name: Download binaries
+ uses: actions/download-artifact@v4
+ - name: Prepare release assets
+ run: |
+ cd mpy-psoc-edge_${{ matrix.board }}_${{ needs.server-build.outputs.commit_sha }}
+ mv ${{ env.mpy_hex_file }} ../mpy-psoc-edge_${{ matrix.board }}.hex
+ - name: Build release changelog
+ id: build_changelog
+ uses: mikepenz/release-changelog-builder-action@v3
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Release
+ uses: softprops/action-gh-release@v1
+ with:
+ name: MicroPython PSOC Edge ${{ github.ref_name }}
+ files: mpy-psoc-edge_${{ matrix.board }}.hex
+ body: ${{steps.build_changelog.outputs.changelog}}
diff --git a/.github/workflows/ports_psoc-edge.yml b/.github/workflows/ports_psoc-edge.yml
new file mode 100644
index 00000000000..15b2504e413
--- /dev/null
+++ b/.github/workflows/ports_psoc-edge.yml
@@ -0,0 +1,28 @@
+name: psoc-edge port
+
+on:
+ push:
+ pull_request:
+ paths:
+ - '.github/workflows/*.yml'
+ - 'tools/**'
+ - 'py/**'
+ - 'extmod/**'
+ - 'shared/**'
+ - 'lib/**'
+ - 'drivers/**'
+ - 'ports/psoc-edge/**'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ build_psoc_edge:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - name: Install packages
+ run: tools/ci.sh psoc_edge_setup
+ - name: Build
+ run: tools/ci.sh psoc_edge_build
diff --git a/.github/workflows/stale_issues.yml b/.github/workflows/stale_issues.yml
new file mode 100644
index 00000000000..82f817a4949
--- /dev/null
+++ b/.github/workflows/stale_issues.yml
@@ -0,0 +1,8 @@
+name: 'Close stale issues/PRs'
+on:
+ schedule:
+ - cron: "50 14 */2 * *"
+
+jobs:
+ call-workflow:
+ uses: Infineon/workflows/.github/workflows/epe_stale_issues.yml@master
\ No newline at end of file
diff --git a/.github/workflows/synch_upstream.yml b/.github/workflows/synch_upstream.yml
new file mode 100644
index 00000000000..e3c98199de7
--- /dev/null
+++ b/.github/workflows/synch_upstream.yml
@@ -0,0 +1,72 @@
+name: Sync Upstream
+
+on:
+ schedule:
+ - cron: '0 0 */1 * *' # daily 00:00
+ workflow_dispatch: # on button click
+
+jobs:
+ synch_master:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout target repo
+ uses: actions/checkout@v4
+ with:
+ ref: master
+ token: ${{ secrets.GH_ACT_SYNCH_UPSTREAM }}
+
+ - name: Sync upstream changes
+ id: sync
+ uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
+ with:
+ target_sync_branch: master
+ target_repo_token: ${{ secrets.GH_ACT_SYNCH_UPSTREAM }}
+ upstream_sync_branch: master
+ upstream_sync_repo: micropython/micropython
+ git_config_pull_rebase: true
+
+
+ - name: New commits found
+ if: steps.sync.outputs.has_new_commits == 'true'
+ run: echo "New commits were found to sync."
+
+ - name: No new commits
+ if: steps.sync.outputs.has_new_commits == 'false'
+ run: echo "There were no new commits."
+
+ - name: Show value of 'has_new_commits'
+ run: echo ${{ steps.sync.outputs.has_new_commits }}
+
+ synch_port_psoc_edge:
+ runs-on: ubuntu-latest
+ needs: synch_master
+
+ steps:
+ - name: Checkout target repo
+ uses: actions/checkout@v4
+ with:
+ ref: psoc-edge-main
+ token: ${{ secrets.GH_ACT_SYNCH_UPSTREAM }}
+
+ - name: Sync upstream changes
+ id: sync
+ uses: aormsby/Fork-Sync-With-Upstream-action@v3.4.1
+ with:
+ target_sync_branch: psoc-edge-main
+ target_repo_token: ${{ secrets.GH_ACT_SYNCH_UPSTREAM }}
+ upstream_sync_branch: master
+ upstream_sync_repo: micropython/micropython
+ git_config_pull_rebase: true
+ target_branch_push_args: '--force'
+
+ - name: New commits found
+ if: steps.sync.outputs.has_new_commits == 'true'
+ run: echo "New commits were found to sync."
+
+ - name: No new commits
+ if: steps.sync.outputs.has_new_commits == 'false'
+ run: echo "There were no new commits."
+
+ - name: Show value of 'has_new_commits'
+ run: echo ${{ steps.sync.outputs.has_new_commits }}
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 9220232ac36..3c52b8a5e4d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -80,3 +80,78 @@
[submodule "lib/CMSIS_6"]
path = lib/CMSIS_6
url = https://github.com/ARM-software/CMSIS_6.git
+[submodule "lib/mpy-test-ext"]
+ path = lib/mpy-test-ext
+ url = https://github.com/Infineon/mpy-test-ext.git
+[submodule "lib/psoc-edge/TARGET_KIT_PSE84_AI"]
+ path = lib/psoc-edge/TARGET_KIT_PSE84_AI
+ url = https://github.com/Infineon/TARGET_KIT_PSE84_AI.git
+[submodule "lib/psoc-edge/core-lib"]
+ path = lib/psoc-edge/core-lib
+ url = https://github.com/Infineon/core-lib.git
+[submodule "lib/psoc-edge/mtb-dsl-pse8xxgp"]
+ path = lib/psoc-edge/mtb-dsl-pse8xxgp
+ url = https://github.com/Infineon/mtb-dsl-pse8xxgp.git
+[submodule "lib/psoc-edge/mtb-srf"]
+ path = lib/psoc-edge/mtb-srf
+ url = https://github.com/Infineon/mtb-srf.git
+[submodule "lib/psoc-edge/se-rt-services-utils"]
+ path = lib/psoc-edge/se-rt-services-utils
+ url = https://github.com/Infineon/se-rt-services-utils.git
+[submodule "lib/psoc-edge/serial-memory"]
+ path = lib/psoc-edge/serial-memory
+ url = https://github.com/Infineon/serial-memory.git
+[submodule "lib/psoc-edge/retarget-io"]
+ path = lib/psoc-edge/retarget-io
+ url = https://github.com/Infineon/retarget-io.git
+[submodule "lib/psoc-edge/mtb-ipc"]
+ path = lib/psoc-edge/mtb-ipc
+ url = https://github.com/Infineon/mtb-ipc.git
+[submodule "lib/psoc-edge/async-transfer"]
+ path = lib/psoc-edge/async-transfer
+ url = https://github.com/Infineon/async-transfer.git
+[submodule "lib/psoc-edge/abstraction-rtos"]
+ path = lib/psoc-edge/abstraction-rtos
+ url = https://github.com/Infineon/abstraction-rtos.git
+[submodule "lib/psoc-edge/clib-support"]
+ path = lib/psoc-edge/clib-support
+ url = https://github.com/Infineon/clib-support.git
+[submodule "lib/psoc-edge/connectivity-utilities"]
+ path = lib/psoc-edge/connectivity-utilities
+ url = https://github.com/cypresssemiconductorco/connectivity-utilities.git
+[submodule "lib/psoc-edge/cy-mbedtls-acceleration"]
+ path = lib/psoc-edge/cy-mbedtls-acceleration
+ url = https://github.com/Infineon/cy-mbedtls-acceleration.git
+[submodule "lib/psoc-edge/freertos"]
+ path = lib/psoc-edge/freertos
+ url = https://github.com/Infineon/freertos.git
+[submodule "lib/psoc-edge/lwip-freertos-integration"]
+ path = lib/psoc-edge/lwip-freertos-integration
+ url = https://github.com/Infineon/lwip-freertos-integration.git
+[submodule "lib/psoc-edge/lwip-network-interface-integration"]
+ path = lib/psoc-edge/lwip-network-interface-integration
+ url = https://github.com/Infineon/lwip-network-interface-integration.git
+[submodule "lib/psoc-edge/lwip"]
+ path = lib/psoc-edge/lwip
+ url = https://git.savannah.nongnu.org/git/lwip
+[submodule "lib/psoc-edge/secure-sockets"]
+ path = lib/psoc-edge/secure-sockets
+ url = https://github.com/cypresssemiconductorco/secure-sockets.git
+[submodule "lib/psoc-edge/whd-bsp-integration"]
+ path = lib/psoc-edge/whd-bsp-integration
+ url = https://github.com/cypresssemiconductorco/whd-bsp-integration.git
+[submodule "lib/psoc-edge/wifi-connection-manager"]
+ path = lib/psoc-edge/wifi-connection-manager
+ url = https://github.com/cypresssemiconductorco/wifi-connection-manager.git
+[submodule "lib/psoc-edge/wifi-host-driver"]
+ path = lib/psoc-edge/wifi-host-driver
+ url = https://github.com/cypresssemiconductorco/wifi-host-driver.git
+[submodule "lib/psoc-edge/wpa3-external-supplicant"]
+ path = lib/psoc-edge/wpa3-external-supplicant
+ url = https://github.com/Infineon/wpa3-external-supplicant.git
+[submodule "lib/psoc-edge/wifi-resources"]
+ path = lib/psoc-edge/wifi-resources
+ url = https://github.com/Infineon/wifi-resources.git
+[submodule "lib/micropython-deepcraft-model-interface"]
+ path = lib/micropython-deepcraft-model-interface
+ url = https://github.com/Infineon/micropython-deepcraft-model-interface
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index ad4136c59fc..e33a337358e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,12 +5,14 @@ repos:
name: MicroPython codeformat.py for changed C files
entry: tools/codeformat.py -v -c -f
language: python
+ language_version: python3
additional_dependencies:
- micropython-uncrustify==1.0.0.post1
- id: verifygitlog
name: MicroPython git commit message format checker
entry: tools/verifygitlog.py --check-file --ignore-rebase
language: python
+ language_version: python3
verbose: true
stages: [commit-msg]
- repo: https://github.com/charliermarsh/ruff-pre-commit
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 00000000000..c1049bfaa97
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,22 @@
+# .readthedocs.yaml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the version of Python and other tools you might need
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.11"
+
+# Build documentation in the docs/ directory with Sphinx
+sphinx:
+ configuration: docs/conf.py
+
+# We recommend specifying your dependencies to enable reproducible builds:
+# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
+python:
+ install:
+ - requirements: docs/requirements.txt
\ No newline at end of file
diff --git a/README.md b/README.md
index 5f6d4288bf2..23ce8f375e0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[](https://github.com/micropython/micropython/actions?query=branch%3Amaster+event%3Apush) [](https://github.com/micropython/micropython/actions?query=branch%3Amaster+event%3Apush) [](https://docs.micropython.org/) [](https://codecov.io/gh/micropython/micropython)
+[](https://github.com/Infineon/micropython-psoc-edge/actions/workflows/ports_psoc-edge.yml?query=branch%3Apsoc-edge-main++) [](https://ifx-micropython.readthedocs.io/en/latest/psoc6/quickref.html) [](https://codecov.io/gh/micropython/micropython)
The MicroPython project
=======================
@@ -32,23 +32,19 @@ DAC, PWM, SPI, I2C, CAN, Bluetooth, and USB.
Getting started
---------------
-See the [online documentation](https://docs.micropython.org/) for the API
+See the [online documentation (Infineon PSOC™ Edge port ReadTheDocs fork)](https://ifx-micropython-psoc-edge.readthedocs.io/en/latest/psoc-edge/quickref.html) for the API
reference and information about using MicroPython and information about how
it is implemented.
-We use [GitHub Discussions](https://github.com/micropython/micropython/discussions)
+We use [GitHub Discussions (Infineon PSOC™ Edge fork)](https://github.com/Infineon/micropython-psoc-edge/discussions)
as our forum, and [Discord](https://discord.gg/RB8HZSAExQ) for chat. These
are great places to ask questions and advice from the community or to discuss your
MicroPython-based projects.
-For bugs and feature requests, please [raise an issue](https://github.com/micropython/micropython/issues/new/choose)
+For bugs and feature requests, please [raise an issue (Infineon PSOC™ Edge fork)](https://github.com/Infineon/micropython-psoc-edge/issues/new/choose)
and follow the templates there.
-For information about the [MicroPython pyboard](https://store.micropython.org/pyb-features),
-the officially supported board from the
-[original Kickstarter campaign](https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers),
-see the [schematics and pinouts](http://github.com/micropython/pyboard) and
-[documentation](https://docs.micropython.org/en/latest/pyboard/quickref.html).
+For information about the MicroPython PSoC supported boards see the [documentation (Infineon PSOC™ Edge port ReadTheDocs fork)](https://ifx-micropython-psoc-edge.readthedocs.io/en/latest/psoc-edge/general.html#supported-boards).
MicroPython design values
-------------------------
@@ -147,6 +143,7 @@ are mature and have the most active development, support and testing:
|--------------------------|----------------------------------------------------------------------------------------|----------------------------------------------------------------------|
| [esp32](ports/esp32)* | Espressif ESP32 SoCs (ESP32, ESP32S2, ESP32S3, ESP32C3, ESP32C6) | [here](https://docs.micropython.org/en/latest/esp32/quickref.html) |
| [mimxrt](ports/mimxrt) | NXP m.iMX RT | [here](https://docs.micropython.org/en/latest/mimxrt/quickref.html) |
+| [psoc-edge](ports/edge) | Infineon PSOC™ Edge | [here](https://ifx-micropython-psoc-edge.readthedocs.io/en/latest/psoc-edge/quickref.html) |
| [rp2](ports/rp2) | Raspberry Pi RP2040 and RP2350 | [here](https://docs.micropython.org/en/latest/rp2/quickref.html) |
| [samd](ports/samd) | Microchip (formerly Atmel) SAMD21 and SAMD51 | [here](https://docs.micropython.org/en/latest/samd/quickref.html) |
| [stm32](ports/stm32) | STMicroelectronics STM32 MCUs (F0, F4, F7, G0, G4, H5, H7, L0, L1, L4, N6, WB, WL) | [here](https://docs.micropython.org/en/latest/pyboard/quickref.html) |
diff --git a/docs/conf.py b/docs/conf.py
index f80ca97edca..ab0a81f1ffd 100755
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -129,9 +129,14 @@
# -- Options for HTML output ----------------------------------------------
-import sphinx_rtd_theme
-
-html_theme = "sphinx_rtd_theme"
+# on_rtd is whether we are on readthedocs.org
+try:
+ import sphinx_rtd_theme
+
+ html_theme = "sphinx_rtd_theme"
+ html_theme_path = ["."]
+except:
+ html_theme = "default"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
diff --git a/docs/index.rst b/docs/index.rst
index 64b83618da1..a6b68e8e898 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -13,6 +13,7 @@ MicroPython documentation and references
esp32/quickref.rst
rp2/quickref.rst
mimxrt/quickref.rst
+ psoc-edge/quickref.rst
wipy/quickref.rst
unix/quickref.rst
zephyr/quickref.rst
diff --git a/docs/library/machine.Pin.rst b/docs/library/machine.Pin.rst
index 37dcac877fa..e9a5ec1575a 100644
--- a/docs/library/machine.Pin.rst
+++ b/docs/library/machine.Pin.rst
@@ -209,40 +209,40 @@ The following methods are not part of the core Pin API and only implemented on c
Set pin to "0" output level.
- Availability: mimxrt, nrf, renesas-ra, rp2, samd, stm32 ports.
+ Availability: mimxrt, nrf, psoc-edge, renesas-ra, rp2, samd, stm32 ports.
.. method:: Pin.high()
Set pin to "1" output level.
- Availability: mimxrt, nrf, renesas-ra, rp2, samd, stm32 ports.
+ Availability: mimxrt, nrf, psoc-edge, renesas-ra, rp2, samd, stm32 ports.
.. method:: Pin.mode([mode])
Get or set the pin mode.
See the constructor documentation for details of the ``mode`` argument.
- Availability: cc3200, stm32 ports.
+ Availability: cc3200, psoc-edge, stm32 ports.
.. method:: Pin.pull([pull])
Get or set the pin pull state.
See the constructor documentation for details of the ``pull`` argument.
- Availability: cc3200, stm32 ports.
+ Availability: cc3200, psoc-edge, stm32 ports.
.. method:: Pin.drive([drive])
Get or set the pin drive strength.
See the constructor documentation for details of the ``drive`` argument.
- Availability: cc3200 port.
+ Availability: cc3200, psoc-edge ports.
.. method:: Pin.toggle()
Toggle output pin from "0" to "1" or vice-versa.
- Availability: cc3200, esp32, esp8266, mimxrt, rp2, samd ports.
+ Availability: cc3200, esp32, esp8266, mimxrt, psoc-edge, rp2, samd ports.
Attributes
----------
diff --git a/docs/library/machine.UART.rst b/docs/library/machine.UART.rst
index fbad3fc5922..cbbee69edb0 100644
--- a/docs/library/machine.UART.rst
+++ b/docs/library/machine.UART.rst
@@ -163,7 +163,7 @@ Methods
For the esp8266 and nrf ports the call returns while the last byte is sent.
If required, a one character wait time has to be added in the calling script.
- Availability: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ports, renesas-ra
+ Availability: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ports, psoc-edge, renesas-ra
.. method:: UART.txdone()
@@ -176,7 +176,7 @@ Methods
of a transfer is still being sent. If required, a one character wait time has to be
added in the calling script.
- Availability: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ports, renesas-ra
+ Availability: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ports, psoc-edge, renesas-ra
.. method:: UART.irq(handler=None, trigger=0, hard=False)
@@ -216,6 +216,7 @@ Methods
ESP32 yes yes yes
MIMXRT yes yes
NRF yes yes
+ PSOC-EDGE yes yes yes
RENESAS-RA yes yes
RP2 yes yes yes
SAMD yes yes yes
@@ -241,7 +242,7 @@ Methods
idle.
- Availability: cc3200, esp32, mimxrt, nrf, renesas-ra, rp2, samd, stm32.
+ Availability: cc3200, esp32, mimxrt, nrf, psoc-edge, renesas-ra, rp2, samd, stm32.
Constants
---------
@@ -260,4 +261,4 @@ Constants
IRQ trigger sources.
- Availability: renesas-ra, stm32, esp32, rp2040, mimxrt, samd, cc3200.
+ Availability: renesas-ra, stm32, esp32, rp2040, mimxrt, samd, cc3200, psoc-edge.
diff --git a/docs/psoc-edge/general.rst b/docs/psoc-edge/general.rst
new file mode 100644
index 00000000000..ce8a2c6957c
--- /dev/null
+++ b/docs/psoc-edge/general.rst
@@ -0,0 +1,53 @@
+.. _psoc_edge_general:
+
+.. include:: links.rst
+
+General information about the PSOC™ Edge port
+==============================================
+
+The PSOC™ Edge is designed for next generation responsive compute and control applications, featuring hardware-assisted machine learning (ML) acceleration.
+The PSOC™ Edge devices are based on high performance Arm® Cortex®-M55, including Helium™ DSP support paired with Arm® Ethos™-U55 and Cortex®-M33 paired Infineon’s ultra-low power NNLite neural network accelerator.
+
+The PSOC™ Edge port supports boards powered by the `Infineon PSOC™ Edge family of microcontrollers `_ and currently supports the following MCUs:
+
+* PSoC™ Edge 84
+
+.. _Supported boards:
+
+Supported boards
+^^^^^^^^^^^^^^^^^
+
+The following boards are supported on this port:
+
+.. list-table::
+ :widths: 20 20 50
+ :header-rows: 1
+
+ * - Board name
+ - Connectivity
+ - Special feature
+ * - KIT_PSE84_AI
+ - Wi-Fi, BT
+ - 60GHz radar, analog microphone, digital microphone, barometric pressure sensor, external flash, speaker interface, IMU sensor, magnetometer, image sensor
+
+
+For more hardware-related details, refer to the following sections.
+
+KIT_PSE84_AI
+------------
+
+Pinout
+******
+
+.. image:: img/kit_pse84_ai_pinout.png
+ :width: 500
+
+
+Technical specifications
+************************
+Links for product details:
+
+* `KIT_PSE84_AI PSOC™ Edge E84 AI product page `_
+* `KIT_PSE84_AI PSOC™ Edge E84 AI Kit guide `_
+* `PSOC™ Edge E8x2, E8x3, E8x5, E8x6 Consumer Datasheet `_
+* `PSOC™ Edge E8x2, E8x3, E8x5, E8x6 Architecture Reference Manual `_
\ No newline at end of file
diff --git a/docs/psoc-edge/img/gh-releases.png b/docs/psoc-edge/img/gh-releases.png
new file mode 100644
index 00000000000..1365932ce97
Binary files /dev/null and b/docs/psoc-edge/img/gh-releases.png differ
diff --git a/docs/psoc-edge/img/kit-pse84-ai.png b/docs/psoc-edge/img/kit-pse84-ai.png
new file mode 100644
index 00000000000..d529b31f7a5
Binary files /dev/null and b/docs/psoc-edge/img/kit-pse84-ai.png differ
diff --git a/docs/psoc-edge/img/kit_pse84_ai_pinout.png b/docs/psoc-edge/img/kit_pse84_ai_pinout.png
new file mode 100644
index 00000000000..4df13ebc801
Binary files /dev/null and b/docs/psoc-edge/img/kit_pse84_ai_pinout.png differ
diff --git a/docs/psoc-edge/img/mpy-psoc-edge-repl.jpg b/docs/psoc-edge/img/mpy-psoc-edge-repl.jpg
new file mode 100644
index 00000000000..62c814634cd
Binary files /dev/null and b/docs/psoc-edge/img/mpy-psoc-edge-repl.jpg differ
diff --git a/docs/psoc-edge/img/mpy-thonny-filesystem.jpg b/docs/psoc-edge/img/mpy-thonny-filesystem.jpg
new file mode 100644
index 00000000000..0d1bcf6c946
Binary files /dev/null and b/docs/psoc-edge/img/mpy-thonny-filesystem.jpg differ
diff --git a/docs/psoc-edge/img/mtb-programmer.png b/docs/psoc-edge/img/mtb-programmer.png
new file mode 100644
index 00000000000..0ac88fa3623
Binary files /dev/null and b/docs/psoc-edge/img/mtb-programmer.png differ
diff --git a/docs/psoc-edge/installation.rst b/docs/psoc-edge/installation.rst
new file mode 100644
index 00000000000..62dbc734c26
--- /dev/null
+++ b/docs/psoc-edge/installation.rst
@@ -0,0 +1,165 @@
+.. _pse_mpy_install:
+
+Installing MicroPython
+======================
+
+To facilitate the installation of the MicroPython PSOC™ Edge port, the ``mpy-pse.py`` Python script is provided. It is compatible with Windows,
+Linux and MacOS.
+
+Before downloading and running the script, it is recommended to create a new folder to keep all the related files together.
+For example:
+
+.. code-block:: bash
+
+ $ mkdir mp-install
+ $ cd mp-install
+
+You can easily download the script from the terminal using the following command:
+
+.. code-block:: bash
+
+ $ curl -s -L https://raw.githubusercontent.com/infineon/micropython-psoc-edge/psoc-edge-main/tools/psoc-edge/mpy-pse.py > mpy-pse.py
+
+Ensure you have a recent version of `Python3.x `_ installed and the `pip `_ package installer.
+Then install the following packages:
+
+.. code-block:: bash
+
+ $ pip install requests
+
+Find all available commands and options by running the script with the following command:
+
+.. code-block:: bash
+
+ $ python mpy-pse.py --help
+
+.. _pse_device_setup:
+
+Device setup
+-------------
+
+In order to setup MicroPython in a PSOC™ Edge board, the ``device-setup`` command of the ``mpy-pse.py``
+utility can be executed. Follow the instructions to select the target PSOC™ Edge board, and deploy the latest
+MicroPython firmware version:
+
+.. code-block:: bash
+
+ $ python mpy-pse.py device-setup
+
+You can run this command whenever you want to upgrade to the latest MicroPython firmware version.
+This command will take care of the following steps:
+
+* Download and install openocd, which is the software required to deploy a firmware file on PSOC™ Edge controllers
+* Download the latest ``.hex`` file for your selected board
+* Deploy the latest version of MicroPython firmware on your board
+
+To flash a specific ``.hex`` to CM55 core of this device:
+.. code-block:: bash
+
+ $ python mpy-pse.py device-setup --hex-file pathtodir/mpy-psoc-edge_KIT_PSE84_AI_CM55.hex
+
+Install a specific version
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you want to setup the device with a specific firmware version, you can check the list of available releases in the `GitHub release section `_.
+
+The ``device-setup`` command can also assist you with this process. In this case, the board and the desired
+version needs to be passed as arguments.
+
+.. code-block:: bash
+
+ $ python mpy-pse.py device-setup -b KIT_PSE84_AI -v v0.1.0
+
+.. warning::
+
+ Be sure to provide the board name as shown in the ``device-setup`` command when running in interactive mode.
+ Also, provide a valid tag that exists in the release section, in the format *vx.y.z*.
+ No fail-safe mechanisms or error verifications are (yet) implemented on the ``mpy-pse.py`` utility, and the script will fail to retrieve the necessary firmware file.
+
+Direct binary deployment
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Another way to program the board is by directly providing the binary file. This can be also done using the ``device-setup`` command.
+Specify the board and the path and name of the ``.hex`` file using the ``-f`` flag as shown below:
+
+.. code-block:: bash
+
+ $ python mpy-pse.py firmware-deploy -b KIT_PSE84_AI -f pathtodir/mpy-psoc-edge_KIT_PSE84_AI.hex
+
+Multiple devices deployment
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you have multiple PSOC™ Edge boards connected to your computer, you can distinguish them by their serial number, and flash them one by one.
+To do so, use the ``-n`` flag to provide the serial number of the target board as shown below:
+
+.. code-block:: bash
+
+ $ python mpy-pse.py device-setup -b KIT_PSE84_AI -n 181F0D5A01212300
+
+Alternatively, you can deploy a firmware file to all connected boards if you have a device YAML file following the `etdevs `_ specification.
+
+.. note::
+
+ This option is only supported on **Linux** and **MacOS** systems. etdevs is not currently enabled for Windows.
+
+First, ensure that the etdevs package is installed:
+
+.. code-block:: bash
+
+ $ pip install etdevs
+
+Then, create a YAML file (e.g., *devs.yaml*) with the board ``name`` and the ``uid`` (debugger serial number) for all the connected available boards:
+
+.. code-block:: yaml
+
+ - name: KIT_PSE84_AI
+ uid: 181F0D5A01212300
+
+ - name: KIT_PSE84_AI
+ uid: 181F0D5A01212400
+
+ ...
+
+
+Finally, run the ``device-setup`` command providing the YAML file with the ``-d`` flag:
+
+.. code-block:: bash
+
+ $ python mpy-pse.py device-setup -b KIT_PSE84_AI -d devs.yml
+
+Getting the firmware
+^^^^^^^^^^^^^^^^^^^^
+
+The binary *.hex* files are available in the `GitHub release section `_.
+All PSOC™ Edge firmware versions for each of the supported boards can be found there.
+
+
+ .. image:: img/gh-releases.png
+ :alt: GitHub MicroPython PSOC Edge Releases
+ :width: 520px
+
+
+Other installation methods
+--------------------------
+
+Cypress Programmer
+^^^^^^^^^^^^^^^^^^
+
+Alternatively, you can directly flash the firmware binary file with the `ModusToolbox™ Programming Tools
+`_ (minimum version required is 1.6.0).
+
+It allows you to program the PSOC™ Edge microcontroller family with just a few clicks from your Windows, Linux, or MacOS machine.
+Follow the instructions at the provided link to download and install the tool.
+
+After that, select the downloaded MicroPython firmware *.hex* file to be deployed on the PSOC™ Edge. Then, in
+the upper menu, select the connected *Board*, click on *Connect*, and finally click on *Program*.
+The log section will show the progress and notify you when the firmware deployment on the controller is completed.
+
+.. image:: img/mtb-programmer.png
+ :alt: ModusToolbox Programmer GUI
+ :width: 520px
+
+For a detailed description on how to use the ModusToolbox™ Programmer tool, please consult the `ModusToolbox™ Programmer User Guide
+`_.
+
+
diff --git a/docs/psoc-edge/links.rst b/docs/psoc-edge/links.rst
new file mode 100644
index 00000000000..eccc46bb9d7
--- /dev/null
+++ b/docs/psoc-edge/links.rst
@@ -0,0 +1,6 @@
+.. _links.rst:
+
+.. _pse84_kit_ai_product_page: https://www.infineon.com/evaluation-board/KIT-PSE84-AI
+.. _pse84_kit_ai_guide: https://www.infineon.com/assets/row/public/documents/30/44/infineon-kit-pse84-ai-user-guide-usermanual-en.pdf
+.. _pse8x_consumer_datasheet: https://www.infineon.com/assets/row/public/documents/30/49/infineon-psoc-edge-e8x-consumer-datasheet-datasheet-en.pdf
+.. _pse8x_arch_ref_manual: https://www.infineon.com/assets/row/public/documents/30/57/infineon-psoc-edge-e8x-architecture-reference-manual-additionaltechnicalinformation-en.pdf
\ No newline at end of file
diff --git a/docs/psoc-edge/mpy-usage.rst b/docs/psoc-edge/mpy-usage.rst
new file mode 100644
index 00000000000..d15ac3783d2
--- /dev/null
+++ b/docs/psoc-edge/mpy-usage.rst
@@ -0,0 +1,198 @@
+.. _psoc_edge_mpy_usage:
+
+Working with MicroPython
+=========================
+
+With MicroPython already installed on your board, there are several flavors and tools to work with MicroPython. (See :ref:`pse_mpy_install` for installation instructions).
+In this section, we introduce some of the ways you can work with MicroPython.
+
+Serial prompt (REPL Mode)
+-------------------------
+
+With MicroPython deployed on your PSOC™ Edge board, you can access the REPL mode using
+the USB-UART interface from the on-board debugger.
+
+REPL stands for Read Evaluate Print Loop and is the name given to the interactive MicroPython
+prompt that you can access on the PSOC™ Edge board. Using the REPL is by far the easiest way to test out your
+code and run commands. This is equivalent to running the *python* command (without passing a script) in the command line terminal of your machine.
+
+Use your preferred serial terminal software to connect to the board. Examples of serial
+terminal tools are `Putty `_, which works for Windows and
+Unix machines; or other platform-specific such as `Tera Term `_, or `minicom `_.
+
+Configure the serial connection with **115200 bauds** and **8-N-1** (8 bits frame, no parity and 1 stop
+bit), and connect to the board's serial port, the MicroPython REPL prompt will appear, and you can start
+typing some Python code :)
+
+.. image:: img/mpy-psoc-edge-repl.jpg
+ :alt: MicroPython REPL prompt
+ :width: 520px
+
+Running a script
+----------------
+
+To implement more elaborate programs, and use the embedded device stand-alone you can write
+Python scripts.
+
+There are several IDEs that you can install that integrate a text editor with the tools to run your
+Python script on your MicroPython device, as well as handling the file system of your MicroPython
+device. The most popular are:
+
+* `Thonny `_
+* `Mu Editor `_
+* `Arduino Lab for MicroPython `_
+
+Alternatively, MicroPython offers :ref:`mpremote` as a command line tool that can be as well used for executing
+scripts. Find more information in the provided link.
+
+In MicroPython there are primarily two ways to execute a script:
+
+Host REPL mode
+~~~~~~~~~~~~~~
+
+In this mode, the MicroPython PSOC™ Edge board is connected through the serial interface to the
+host development machine.
+Each of the lines will be executed in the controller. Any output like print messages in your application or
+exceptions will be sent through the serial connection to the host machine, which will display them
+in the serial terminal console.
+
+The REPL mode is used, but the IDE or command line tool will take care of sending
+each line of the script and process its output to show it in the terminal.
+
+On-target file system mode
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When the board provides a file system and data storage, you will have the possibility to store your
+scripts in the device.
+
+You can split your program into different files, and use ``import`` to make use of the provided features
+in other scripts.
+To run a script in the device at boot, two scripts need to be present in the file
+system: ``boot.py`` and ``main.py``. The scripts are executed in the sequence, first ``boot.py`` followed by ``main.py``.
+
+User-defined Python modules or code can also be converted into bytecode (:ref:`mpy files `) by using the ``mpy-cross`` tool and then copied onto the
+filesystem for getting speed benefits in execution.
+
+A more advanced and efficient mode of script execution is also available, where the scripts to be executed are :ref:`frozen ` as part of the application. However, this is only possible if the user has access to the build flow of the specific port.
+
+The filesystem is described in the section below with some examples.
+
+The MicroPython filesystem
+---------------------------
+
+The PSOC™ Edge port offers ``LFS2`` (LittleFS v2) filesystem, implemented in :ref:`MicroPython `. The ``LFS2`` filesystem is selected as the default given its stability and reliability. The filesystem is located on the external QSPI flash, which has a capacity of 64 MB.
+
+The filesystem is automatically mounted at boot with the help of frozen scripts, located in the ``ports/psoc-edge/freeze`` directory. The default mount point of the filesystem is ``/`` (root directory).
+
+Given below are a few examples of various operations on the filesystem:
+
+Creating and reading files
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+MicroPython on the PSOC™ Edge supports the standard way of accessing files in
+CPython, using the built-in ``open()`` function. The ``open()`` function returns a file pointer. The file is created if not already present and otherwise its contents are overwritten.
+
+To create a file::
+
+ >>> f = open('data.txt', 'w')
+ >>> f.write('some data')
+ 9
+ >>> f.close()
+
+The number "9" returned from the function, is the number of bytes that were written with the ``write()`` method.
+Then the user can read back the contents of this new file using::
+
+ >>> f = open('data.txt')
+ >>> f.read()
+ 'some data'
+ >>> f.close()
+
+Note that the default mode when opening a file is to open it in read-only mode
+and as a text file. Specify ``'wb'`` as the second argument to ``open()`` to
+open for writing in binary mode, and ``'rb'`` to open for reading in binary
+mode.
+
+Listing files and more
+~~~~~~~~~~~~~~~~~~~~~~
+
+The ``os`` module can be used for further control over the filesystem. First,
+the ``os`` module needs to be imported::
+
+ >>> import os
+
+Then the contents of the filesystem can be listed::
+
+ >>> os.listdir()
+ ['boot.py', 'port_config.py', 'data.txt']
+
+New directories can be created::
+
+ >>> os.mkdir('dir')
+
+And entries can be removed::
+
+ >>> os.remove('data.txt')
+
+Also, entries can be renamed::
+
+ >>> os.rename('data.txt','data_new.txt') # os.rename('old_filepath','new_filepath')
+
+Start-up scripts
+~~~~~~~~~~~~~~~~
+
+As mentioned above, two files are treated specially by the port when it starts up:
+``boot.py`` and ``main.py``. The user can create these files and populate them with the code that can run at startup.
+
+Using MicroPython remote control (mpremote) for filesystem operations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The :ref:`mpremote ` tool can be used to transfer files located on the user's host filesystem into the MicroPython filesystem.
+
+
+Resetting the board
+-------------------
+
+If something goes wrong, you can reset the board in two ways.
+The first way is to press CTRL-D at the MicroPython prompt, which performs a soft reset.
+
+If that does not work, you can perform a hard reset by pressing the RESET button.
+This will end your session, disconnecting whatever program (PuTTY, Thonny, etc.) you used to connect to the board.
+
+Boot modes
+----------
+
+There are 2 boot modes:
+
+ * Normal boot mode
+ * Safe boot mode
+
+``boot.py`` and ``main.py`` are executed in "Normal boot mode".
+
+``boot.py`` and ``main.py`` are **not** executed in "Safe boot mode".
+
+Changing boot mode:
+
+ * For normal boot mode, just press and release the RESET button on the board.
+
+ * For safe boot mode, press and release the RESET button while pressing the USER button on the board. Release the USER button after the LED on the board flashes twice.
+
+
+If you change the boot mode to safe boot mode, the MicroPython starts without
+the execution of ``main.py``. Then you can remove the ``main.py`` by following command: ::
+
+ import os
+ os.remove('main.py')
+
+Using third-party IDEs for filesystem operations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Thonny
+^^^^^^
+
+The MicroPython port for PSOC™ Edge can be detected by the `Thonny IDE `_ when the ``MicroPython (generic)`` option is selected at the bottom right corner, as shown. Additionally, the filesystem is detected by the IDE, as shown in the lower left column.
+Using the GUI, you can perform file operations such as creating a new file, adding contents to it, and then saving it to the filesystem on the MicroPython device.
+
+.. image:: img/mpy-thonny-filesystem.jpg
+ :alt: Filesystem operation using Thonny IDE
+ :width: 800px
+
diff --git a/docs/psoc-edge/quickref.rst b/docs/psoc-edge/quickref.rst
new file mode 100644
index 00000000000..99645bf8c82
--- /dev/null
+++ b/docs/psoc-edge/quickref.rst
@@ -0,0 +1,998 @@
+.. _psoc_edge_quickref:
+
+.. include:: links.rst
+
+Quick reference for the PSOC™ Edge
+===================================
+
+.. image:: img/kit-pse84-ai.png
+ :alt: KIT_PSE84_AI board
+ :width: 540px
+
+The `PSOC™ Edge E84 AI Kit `_.
+
+Below is a quick reference for PSOC™ Edge E84 boards. If it is your first time
+working with this port it may be useful to get an overview of the microcontroller:
+
+.. toctree::
+ :maxdepth: 1
+ :includehidden:
+
+ general.rst
+ installation.rst
+ mpy-usage.rst
+
+Pins and GPIO
+-------------
+
+See :ref:`machine.Pin ` for the complete Pin API reference.
+This section focuses on the specific PSOC™ Edge port variations and particularities.
+
+The constructor
+^^^^^^^^^^^^^^^
+
+The controller pin naming follows the nomenclature ``P_``, where:
+
+ - ```` is a numeric identifier for the port (e.g., 0-21 for the PSOC™ Edge E84)
+ - ```` is the pin number within that port.
+
+Use the respective board pinout diagram to find the available pins and their locations.
+
+This is the ``id`` that needs to be passed to the constructor in one of the following formats:
+
+ - As a **string label**, single or double quoted: ``'P_'`` or ``"P_"``
+ - A **pre-instantiated object** ``Pin.cpu.`` or ``Pin.board.``.
+
+::
+
+ from machine import Pin
+
+ p_in = Pin('P0_0', Pin.IN)
+ p_out = Pin("P7_0", Pin.OUT, value=False)
+
+ p = Pin(Pin.cpu.P17_1, Pin.OPEN_DRAIN)
+
+
+The pre-instantiated object can be used directly without calling the constructor.
+Instead, you can use ``init()`` to configure it.
+
+::
+
+ from machine import Pin
+
+ pin = Pin.cpu.P17_0
+ pin.init(mode=Pin.IN)
+
+
+.. tip::
+ Use the REPL interface to discover the available user pins, using tab for completion:
+
+ >>> from machine import Pin
+ >>> Pin.cpu.P
+ P10_5 P10_7 P11_3 P12_3
+ P13_0 P13_1 P13_2 P13_3
+ P13_4 P13_5 P13_6 P13_7
+ P14_0 P14_1 P14_2 P14_3
+ P14_4 P14_5 P14_6 P14_7
+ P15_0 P15_1 P15_2 P15_3
+ P15_4 P15_5 P15_6 P15_7
+ P16_0 P16_1 P16_2 P16_3
+ P16_4 P16_5 P16_6 P16_7
+ P17_0 P17_1 P17_2 P17_3
+ P17_4 P17_5 P17_7 P20_3
+ P20_4 P20_5 P20_6 P20_7
+ P21_1 P21_2 P21_3 P21_4
+ P21_5 P21_6 P21_7 P3_0
+ P3_1 P6_4 P6_6 P7_0
+ P7_7 P8_0 P8_1 P8_5
+ P8_6 P9_0 P9_1 P9_2
+ P9_3
+
+ >>> from machine import Pin
+ >>> Pin.board.
+ AMIC1_CTB_INN AMIC1_CTB_INP AMIC1_CTB_OUT AMIC1_CTB_REF
+ AMIC2_CTB_INN AMIC2_CTB_INP AMIC2_CTB_OUT AMIC2_CTB_REF
+ I2C_SCL_1V8 I2C_SCL_3V3 I2C_SDA_1V8 I2C_SDA_3V3
+ I2S_TX_FYSYNC I2S_TX_MCK I2S_TX_SCK I2S_TX_SD
+ I3C_SCL I3C_SDA IMU0_INT IMU1_INT
+ MAG_INT PDM_CLK PDM_DATA PRESS_SENS_INT
+ RADAR_INT RADAR_RESET RADAR_SPI_CLK RADAR_SPI_CS
+ RADAR_SPI_MISO RADAR_SPI_MOSI SERIAL_INT0 SERIAL_INT1
+ SERIAL_INT2 SERIAL_INT3 USER_BUTTON USER_LED1
+ USER_LED2 USER_LED_B USER_LED_G USER_LED_R
+
+
+In addition to the supported ``pull`` configuration values, ``PULL_UP_DOWN`` is also available in this port.
+
+The ``drive`` parameter accepts up to 8 levels, which set the following drive strength for the pin:
+
+ - ``DRIVE_0``: 1mA/2mA drive current (normal/high speed IO)
+ - ``DRIVE_1``: 2mA/4mA drive current (normal/high speed IO)
+ - ``DRIVE_2``: 3mA/6mA drive current (normal/high speed IO)
+ - ``DRIVE_3``: 4mA/8mA drive current (normal/high speed IO)
+ - ``DRIVE_4``: 5mA/10mA drive current (normal/high speed IO)
+ - ``DRIVE_5``: 6mA/12mA drive current (normal/high speed IO)
+ - ``DRIVE_6``: 7mA/14mA drive current (normal/high speed IO)
+ - ``DRIVE_7``: 8mA/16mA drive current (normal/high speed IO)
+
+For more information about drive strength, check the PSOC™ Edge `Datasheet `_ and `Architecture Reference Manual `_.
+
+.. note::
+
+ The following constructor arguments and/or configuration values are NOT supported in this port:
+
+ - ``alt``: Alternate functionality is not supported.
+ - ``mode``: ``Pin.ALT``, ``Pin.ALT_OPEN_DRAIN``, and ``Pin.ANALOG`` modes are not supported.
+
+Methods
+^^^^^^^
+
+.. method:: Pin.irq(handler=None, trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING), priority=7)
+
+The following parameters have port-specific behavior:
+
+ - ``priority``: Priority values range from 7 (lowest) to 0 (highest). Default is 7.
+
+ .. note::
+
+ All pins on the same port share the same interrupt line. Therefore, only one priority can be set for all pins on the same port.
+ If multiple pins configure interrupts for the same port, the highest priority will be used.
+ If only one pin is configured for an interrupt, its priority can be reconfigured to any value.
+
+.. note::
+
+ The following ``irq()`` features are not supported in this port:
+
+ - ``trigger``: The ``Pin.IRQ_LOW_LEVEL`` and ``Pin.IRQ_HIGH_LEVEL`` triggers are not supported.
+ - ``wake``: The wake parameter is currently not supported.
+ - ``hard``: This parameter is ignored. It can be passed but currently has no effect.
+
+.. note::
+
+ **None** of the non-core methods from the Pin API are currently implemented for this port.
+
+
+Real time clock (RTC)
+---------------------
+
+See :ref:`machine.RTC `: ::
+
+ from machine import RTC
+ import time
+
+ irq_counter = 0
+
+ def cback(event):
+ global irq_counter
+ irq_counter += 1
+
+ rtc = RTC()
+ rtc.init((2023, 1, 1, 0, 0, 0, 0, 0)) # initialise rtc with specific date and time,
+ # eg. 2023/1/1 00:00:00
+ rtc.datetime((2017, 8, 23, 2, 12, 48, 0, 0)) # set a specific date and
+ # time, eg. 2017/8/23 1:12:48
+ rtc.datetime() # get date and time
+
+ rtc.irq(trigger=RTC.ALARM0, handler=cback)
+ rtc.alarm(1000, repeat=False) # set one-shot short alarm in ms
+ rtc.alarm_left() # Read the time left for the alarm to expire
+ time.sleep_ms(1008) # wait sufficient time
+ print(irq_counter) # Check irq counter
+
+ rtc.irq(trigger=RTC.ALARM0, handler=cback)
+ rtc.alarm(3000, repeat=True) # set periodic short alarm in ms
+ rtc.cancel() # cancel the alarm
+
+ rtc.irq(trigger=RTC.ALARM0, handler=cback)
+ rtc.alarm((2023, 1, 1, 0, 0, 1, 0, 0), repeat=False) # set one-shot longer duration alarm
+
+ rtc.memory(b"hello") # write bytes into RTC user memory
+ rtc.memory() # read bytes from RTC user memory
+
+
+.. note::
+ Setting a random week day in 'wday' field is not valid. The underlying library implements the logic to always
+ calculate the right weekday based on the year, date and month passed. However, datetime() will not raise an error
+ for this but rather re-write the field with the last calculated actual value.
+
+.. note::
+ RTC API behavior on this port has the following specifics:
+
+ - ``RTC()`` is a singleton constructor with no ``id`` or additional constructor arguments.
+ - ``rtc.irq()`` accepts alarm trigger ``0`` (``RTC.ALARM0``); ``wake`` is not implemented.
+ - ``rtc.alarm()`` accepts ``time`` and optional ``repeat``; no positional alarm ``id`` argument is used.
+ - Input ``weekday`` in datetime tuples is ignored and hardware computes the weekday from date fields.
+ - The current ``rtc.memory([data])`` maximum payload on KIT_PSE84_AI is 28 bytes.
+
+.. warning::
+ RTC alarm timing on this port has second-level resolution. Millisecond alarm values are accepted, but are rounded
+ up to whole seconds internally.
+
+
+Hardware I2C bus
+----------------
+
+See :ref:`machine.I2C ` and :ref:`machine.I2CTarget ` for the complete I2C API reference.
+
+Hardware I2C is available on the PSOC™ Edge E84 using the SCB (Serial Communication Block)
+peripheral. The port supports both controller (master) and target (slave) modes.
+
+.. note::
+ External pull-up resistors (typically 4.7kΩ) are required on both SCL and SDA lines.
+ Only one I2C instance (controller or target) can be active at a time, as both modes
+ share the same SCB peripheral and pins.
+
+
+Controller mode (Master)
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+Use the ``I2C`` class for controller (master) operations::
+
+ from machine import I2C
+
+ i2c = I2C(scl='P17_0', sda='P17_1', freq=100000)
+
+Constructor arguments:
+
+ - ``id``: I2C bus number (currently only 0 is available).
+ **This parameter is ignored**.
+ - ``scl``: SCL pin (string 'P_' or Pin object).
+ - ``sda``: SDA pin (string 'P_' or Pin object).
+ - ``freq``: I2C clock frequency in Hz. Supported: 100000 (100kHz) or
+ 400000 (400kHz). Default is 400000.
+ - ``timeout``: Transfer timeout in microseconds. Must be > 0.
+ Default is 50000 (50ms).
+
+The ``scl`` and ``sda`` pins are the only mandatory arguments.
+
+Methods
+~~~~~~~
+
+All the methods(functions) given in :ref:`machine.I2C ` class have been implemented in this port except:
+
+.. method:: I2C.init()
+
+Additionally, the following functions are enabled:
+
+.. method:: I2C.deinit()
+
+Target mode (Slave)
+^^^^^^^^^^^^^^^^^^^
+
+Use the ``I2CTarget`` class for target (slave) operations::
+
+ from machine import I2CTarget
+
+ mem = bytearray([0xAA, 0xBB, 0xCC, 0xDD])
+ i2c_target = I2CTarget(scl="P17_0", sda="P17_1", addr=0x43, mem=mem)
+
+
+The I2CTarget implementation on PSoC Edge has the following port-specific details:
+
+**Memory Addressing:**
+ - ``addrsize``: 7-bit and 10-bit addresses are accepted.
+ - ``mem_addrsize``: Only ``0`` is supported.
+ - EEPROM-like internal address phase (8/16/24/32-bit ``mem_addrsize``) is not implemented.
+
+**IRQ triggers:**
+
+The ``hard`` argument in ``i2c_target.irq(..., hard=True)`` is supported.
+When using hard IRQ callbacks, keep handlers short and allocation-free.
+
+Current implementation notes for IRQ data-phase events:
+
+
+ - PSoC hardware events are limited and do not map
+ 1:1 to MicroPython ``IRQ_READ_REQ``/ ``IRQ_WRITE_REQ`` semantics.
+ - Treat these two flags as optional notifications, not required control points.
+ - In the current PSOC Edge port implementation, data-path behavior is
+ strongly tied to ``mem`` buffer configuration. After address match,
+ hardware/port state handling performs most data movement automatically (when ``mem`` is configured).
+
+
+Practical guidance for this port:
+
+ - For robust target-mode operation, configure ``mem`` and size it to cover
+ expected master write payloads.
+ - With ``mem`` configured, explicit ``I2CTarget.readinto()``/
+ ``I2CTarget.write()`` calls are usually optional, and mainly needed for
+ custom protocol handling in IRQ callbacks.
+
+
+Hardware SPI bus
+----------------
+
+See :ref:`machine.SPI ` for the complete SPI master API reference.
+``SPITarget`` is a PSOC™ Edge-specific class and has no separate library page.
+
+Hardware SPI on PSOC™ Edge uses the SCB peripheral and supports both controller
+(master) and target (slave) modes.
+
+Controller mode (Master)
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+Use the ``SPI`` class for controller-mode transfers::
+
+ from machine import SPI, Pin
+
+ spi = SPI(
+ baudrate=1_000_000,
+ polarity=0,
+ phase=0,
+ bits=8,
+ firstbit=SPI.MSB,
+ sck='P16_0',
+ mosi='P16_1',
+ miso='P16_2',
+ )
+
+ cs = Pin('P16_3', Pin.OUT, value=1)
+ tx = b'\x9f\x00\x00\x00'
+ rx = bytearray(4)
+
+ cs(0)
+ spi.write_readinto(tx, rx)
+ cs(1)
+ print(rx)
+
+Constructor arguments:
+
+ - ``id``: accepted for API compatibility, currently ignored.
+ - ``baudrate``: SPI clock in Hz. Default is ``1_000_000``.
+ - ``polarity`` / ``phase``: must be ``0`` or ``1``.
+ - ``bits``: only ``8`` is supported.
+ - ``firstbit``: ``SPI.MSB`` or ``SPI.LSB``.
+ - ``sck``, ``mosi``, ``miso``: required SPI signal pins.
+
+.. note::
+
+ Chip select (CS/SS) is controlled by user code with ``machine.Pin``.
+ It is not driven automatically by ``machine.SPI``.
+
+
+Target mode (Slave)
+^^^^^^^^^^^^^^^^^^^
+
+Use the ``SPITarget`` class for target-mode communication::
+
+ from machine import SPITarget
+
+ spi_t = SPITarget(
+ sck='P16_0',
+ mosi='P16_1',
+ miso='P16_2',
+ ssel='P16_3',
+ polarity=0,
+ phase=0,
+ bits=8,
+ firstbit=SPITarget.MSB,
+ )
+
+ tx = b'\x11\x22\x33\x44'
+ rx = bytearray(4)
+ spi_t.write_readinto(tx, rx)
+
+ spi_t.deinit()
+
+Constructor arguments:
+
+ - ``sck``: SPI clock pin.
+ - ``mosi``: target TX pin.
+ - ``miso``: target RX pin.
+ - ``ssel``: chip-select input pin.
+ - ``polarity`` / ``phase``: must be ``0`` or ``1``.
+ - ``bits``: only ``8`` is supported.
+ - ``firstbit``: ``SPITarget.MSB`` or ``SPITarget.LSB``.
+
+Constants:
+
+ - ``SPITarget.MSB``: most-significant-bit first.
+ - ``SPITarget.LSB``: least-significant-bit first.
+
+Methods:
+
+.. method:: SPITarget.readinto(buf)
+
+ Read bytes from the SPI target RX FIFO into writable buffer ``buf``.
+ Returns the number of bytes read.
+
+ Raises ``OSError`` on timeout.
+
+.. method:: SPITarget.write(buf)
+
+ Write bytes from buffer ``buf`` to the SPI target TX FIFO.
+ Returns the number of bytes written.
+
+ Raises ``OSError`` on timeout.
+
+.. method:: SPITarget.write_readinto(tx_buf, rx_buf)
+
+ Full-duplex transfer in target mode. Writes bytes from ``tx_buf`` and
+ reads bytes into ``rx_buf``.
+
+ ``tx_buf`` and ``rx_buf`` must have the same length.
+ Returns the number of bytes transferred.
+
+ Raises ``ValueError`` if buffer lengths differ.
+ Raises ``OSError`` on timeout.
+
+.. method:: SPITarget.deinit()
+
+ Deinitialise the SPITarget instance and release its underlying SCB resource.
+
+The SPITarget implementation on PSoC Edge has the following port-specific details:
+
+- ``sck``, ``mosi``, ``miso``, and ``ssel`` are all required.
+- ``bits`` is fixed to 8.
+- ``readinto()``, ``write()``, and ``write_readinto()`` are blocking and use an
+ internal timeout.
+- A single ``SPITarget`` instance is supported in this port configuration.
+
+
+
+Inter-Processor Communication (IPC)
+-------------------------------------
+
+The ``IPC`` class provides message-passing between the two cores using the
+hardware IPC pipe peripheral. This is a PSOC™ Edge-specific module — it is not part of
+the standard MicroPython ``machine`` API. Currently, for this port, IPC is supported to enable communication from the CM33 core to the CM55 core.
+.. note::
+
+ IPC is only available on builds compiled with the ``MULTI_CORE`` flag. The module is
+ not present on single-core firmware images. By default it is enabled for this port.
+
+.. note::
+
+ Only CM33 → CM55 communication is currently supported. The CM33 core always acts as
+ the initiating side; the CM55 firmware must be built and deployed separately.
+
+The constructor
+^^^^^^^^^^^^^^^
+
+::
+
+ from machine import IPC
+
+ ipc = IPC(src_core=IPC.CM33, target_core=IPC.CM55)
+
+Constructor arguments:
+
+ - ``src_core``: Source core ID. Currently only ``IPC.CM33`` (``0``) is supported.
+ Default is ``IPC.CM33``.
+ - ``target_core``: Destination core ID. Currently only ``IPC.CM55`` (``1``) is supported.
+ Default is ``IPC.CM55``.
+
+Up to 5 IPC object instances can be created and this is enforced by the constructor. Each instance can be configured with different source and target cores, but currently only CM33 → CM55 communication is supported regardless of the constructor arguments.
+
+Core ID and command constants
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following class-level constants are available on every ``IPC`` object:
+
+ - ``IPC.CM33``: Core ID for the CM33 core (``0``).
+ - ``IPC.CM55``: Core ID for the CM55 core (``1``).
+ - ``IPC.CMD_START``: Pre-defined start command (``0x82``).
+ - ``IPC.CMD_STOP``: Pre-defined stop command (``0x83``).
+
+Methods
+^^^^^^^
+
+.. method:: IPC.init()
+
+ Initialise the IPC pipe hardware. Must be called once after construction and before
+ any other IPC operation::
+
+ ipc.init()
+
+.. method:: IPC.register_client(client_id, callback, endpoint_id, endpoint_addr)
+
+ Register a client on the source endpoint so that incoming messages addressed
+ to ``client_id`` invoke ``callback``.
+
+ - ``client_id``: Unique client identifier (``0``–``7``). Each registered client
+ must have a unique ID.
+ - ``callback``: A callable invoked as ``callback(client)`` when a message arrives
+ for this client. The callback receives a single ``IPCClient`` object with the
+ following read-only attributes:
+
+ - ``client.cmd``: Command byte received from the target core.
+ - ``client.value``: 32-bit value received from the target core.
+ - ``client.id``: The client ID this message was addressed to.
+
+ The callback is deferred and runs in the MicroPython scheduler context (not in
+ the ISR), so it is safe to allocate memory and call any MicroPython function.
+
+ - ``endpoint_id``: Endpoint index for source core.
+ - ``endpoint_addr``: Endpoint address for the source core.
+
+ Returns ``True`` on success, ``False`` otherwise.
+
+ Maximum of 8 clients can be registered per endpoint. This is a PSOC™ Edge-specific limit.
+
+ Example — registering two independent services::
+
+ def svc1_cb(client):
+ print("Service1 received cmd=0x{:02X}".format(client.cmd))
+
+ def svc2_cb(client):
+ print("Service2 received cmd=0x{:02X}".format(client.cmd))
+
+ ipc.register_client(3, svc1_cb, 1, 1) # Service 1
+ ipc.register_client(4, svc2_cb, 1, 1) # Service 2
+
+.. method:: IPC.enable_core(core_id=IPC.CM55)
+
+ Boot the target core and wait for it to start. Currently only ``IPC.CM55`` is
+ supported.
+
+ - ``core_id``: The core to enable. Default is ``IPC.CM55``.
+
+ Calling this when the CM55 is already running prints a notice and returns immediately.
+ Allow a short delay after this call for CM55 initialisation
+ to complete before sending messages::
+
+ ipc.enable_core(IPC.CM55)
+ time.sleep(1) # Wait for CM55 firmware to initialise
+
+.. method:: IPC.send(cmd, value=0, client_id)
+
+ Send a message to a client on the target core.
+
+ - ``cmd``: Command byte. Use ``IPC.CMD_START``, ``IPC.CMD_STOP``, or any
+ application-defined value.
+ - ``value``: Optional 32-bit data payload. Default is ``0``.
+ - ``client_id``: Client ID on the target core.
+
+ Raises ``OSError`` if the send fails after the maximum number of retries
+
+ ipc.send(IPC.CMD_START, 0, 5) # Send CMD_START to CM55 client 5
+ ipc.send(IPC.CMD_STOP, 0, 6) # Send CMD_STOP to CM55 client 6
+
+.. method:: IPC.is_busy([core_id])
+
+ Check whether the IPC channel for the given core is currently locked.
+
+ - ``core_id``: ``IPC.CM33`` or ``IPC.CM55``
+
+ Returns ``True`` if the channel is busy, ``False`` otherwise::
+
+ if not ipc.is_busy():
+ ipc.send(IPC.CMD_START, 0, 5)
+
+ # Check a specific core explicitly
+ if ipc.is_busy(IPC.CM55):
+ print("CM33 channel is locked")
+
+Complete example
+^^^^^^^^^^^^^^^^
+
+The following example demonstrates two independent services sharing a single IPC endpoint,
+with each service using its own client IDs on both the CM33 and CM55 sides::
+
+ import time
+ from machine import IPC
+
+ ipc = IPC(src_core=IPC.CM33, target_core=IPC.CM55)
+ ipc.init()
+
+ # Per-service receive state
+ svc1 = {"received": False, "cmd": None}
+ svc2 = {"received": False, "cmd": None}
+
+ def svc1_cb(client):
+ svc1["received"] = True
+ svc1["cmd"] = client.cmd
+
+ def svc2_cb(client):
+ svc2["received"] = True
+ svc2["cmd"] = client.cmd
+
+ # Register both services on the CM33 endpoint (endpoint_id=1, endpoint_addr=1)
+ ipc.register_client(3, svc1_cb, 1, 1) # Service 1 -- CM33 client_id=3
+ ipc.register_client(4, svc2_cb, 1, 1) # Service 2 -- CM33 client_id=4
+
+ # Boot CM55 and wait for it to initialise
+ ipc.enable_core(IPC.CM55)
+ time.sleep(1)
+
+ # Send CMD_START to CM55 Service 1 (client_id=5); echo comes back to CM33 client_id=3
+ ipc.send(IPC.CMD_START, 0, 5)
+
+ # Send CMD_STOP to CM55 Service 2 (client_id=6); echo comes back to CM33 client_id=4
+ ipc.send(IPC.CMD_STOP, 0, 6)
+
+PDM - PCM bus
+--------------
+
+PDM/PCM is a asynchronous operation used to connect digital audio devices.
+At the physical level, a bus consists of 2 lines: CLK, DATA.
+
+.. warning::
+ This is not part of the core MicroPython libraries. Therefore, not mapping any existing machine class API and neither supported by other ports.
+
+PDM-PCM objects can be created and initialized using::
+
+ from machine import PDM_PCM
+
+ clk_pin = "P8_5"
+ data_pin = "P8_6"
+
+ pdm_pcm = PDM_PCM(
+ sck=clk_pin,
+ data=data_pin,
+ sample_rate=16000,
+ bits=PDM_PCM.BITS_16,
+ format=PDM_PCM.MONO,
+ gain=0,
+ )
+
+2 modes of operation are supported:
+ - blocking
+ - non-blocking
+
+
+Constructor
+^^^^^^^^^^^^
+
+.. class:: PDM_PCM(clk, data, sample_rate, bits, format, gain, ibuf)
+
+ Keyword-only parameters that are supported on this port:
+
+ - ``clk`` is a pin object for the clock line
+ - ``data`` is a pin object for the data line
+ - ``sample_rate`` specifies audio sampling rate. **Currently only 16 KHz sample rate is supported**.
+ - ``bits`` specifies word length - 16 and 32 being accepted values.
+ - ``format`` specifies channel format - STEREO or MONO.
+ - ``gain`` is the gain in dB. In case of STEREO format is applies to both channels. The range goes from -103 to +83 dB with 6 dB step. Values will be rounded to the closest step.
+ - ``ibuf`` is the size of the internal ring buffer (in bytes) storing the incoming audio data stream. Default is 20000.
+
+Methods
+^^^^^^^^
+
+.. method:: PDM_PCM.init(clk, data, sample_rate, bits, format, gain, ibuf)
+
+ Initializes the PDM_PCM hardware as per the specified parameters. See the constructor for details on the supported parameters.
+
+.. method:: PDM_PCM.deinit()
+
+ Deinitializes the PDM_PCM object.
+
+.. method:: PDM_PCM.readinto(buf)
+
+ Read audio samples into the buffer specified by ``buf``. ``buf`` must support the buffer protocol, such as bytearray or array.
+ Sample size can be calculated as (PCM_bits/8) * (format_size); where format_size is 2(stereo mode) and 1(mono mode).
+ Returns number of bytes read.
+
+.. method:: PDM_PCM.irq(handler)
+
+ Set the callback.``handler`` is called when ``buf`` becomes full (``readinto`` method).
+ Setting a callback changes the ``readinto`` method to non-blocking operation.
+ ``handler`` is called in the context of the MicroPython scheduler.
+
+.. method:: PDM_PCM.gain([gain])
+
+ Set/get the gain for of all the channels. The gain is specified in dB. The range goes from -103 to +83 dB with 6 dB step. Values will be rounded to the closest step.
+ Default is 0 dB.
+
+Constants
+^^^^^^^^^^
+
+.. data:: PDM_PCM.STEREO
+
+ for initialising the PDM_PCM ``format`` to stereo
+
+.. data:: PDM_PCM.MONO
+
+ for initialising the PDM_PCM ``format`` to mono
+
+.. data:: PDM_PCM.BITS_16
+
+ for initialising the PDM_PCM ``bits`` to 16
+
+.. data:: PDM_PCM.BITS_32
+
+ for initialising the PDM_PCM ``bits`` to 32
+
+
+UART
+----
+
+See :ref:`machine.UART `.
+
+The following specialization applies to this port:
+
+Constructor
+^^^^^^^^^^^^
+
+.. class:: UART(id)
+
+ The following parameters are supported with limited configuration:
+
+ - ``bits``. Only 8 bits.
+
+ These are planned for future implementation, but yet unavailable:
+
+ - ``rts``
+ - ``cts``
+ - ``flow``
+
+.. Note::
+
+ These parameters are not implemented:
+
+ - ``txbuf``
+ - ``invert``
+
+
+Methods
+^^^^^^^
+
+.. method:: UART.init(baudrate=9600, bits=8, parity=None, stop=1, *, ...)
+
+ The same parameters as the constructor are supported, with the same limitations.
+
+
+PWM
+----
+
+Pulse Width Modulation (PWM) signal output on the PSOC™ Edge. See :ref:`machine.PWM ` for the standard MicroPython PWM API.
+
+.. note::
+
+ On this port, PWM output is available exclusively on pins **P16_1** through **P16_7**. Each pin is backed by an independent TCPWM0 counter,
+ so each instance can run at a different frequency simultaneously. A maximum of **7** PWM instances can be active at the same time.
+
+.. note::
+
+ The base clock driving all counters is **1 MHz** (derived from the 100 MHz PCLK via a shared 16-bit divider).
+ This gives a frequency range of **1 Hz - 500 kHz** and a period resolution of 1 µs.
+
+A PWM object can be created and started using::
+
+ from machine import PWM
+
+ pwm = PWM("P16_1", freq=1000, duty_u16=32767) # 1 kHz, 50 % duty cycle
+
+Constructor
+^^^^^^^^^^^^
+
+.. class:: PWM(pin, *, freq, duty_u16, duty_ns, invert=False)
+
+ Construct and immediately start a PWM signal on *pin*.
+
+ - ``pin`` — the output pin. Accepts a string label (``"P16_1"``), a ``Pin.cpu.`` object, or a ``Pin.board.`` object.
+ The pin must be one of the PWM-capable pins P16_1 - P16_7.
+ - ``freq`` — output frequency in Hz (**required**). Must be in the range 1 - 500 000.
+ - ``duty_u16`` — duty cycle as a 16-bit unsigned integer 0-65535 (0 % - ~100 %).
+ - ``duty_ns`` — duty cycle (high pulse width) in nanoseconds. Must not exceed the period (``1 000 000 000 / freq`` ns).
+ - ``invert`` — if ``True``, inverts the output polarity. Default is ``False``.
+
+ Raises ``ValueError`` if the pin does not support PWM, if a PWM instance for that pin already exists without calling ``deinit()``
+ first, or if the frequency or duty arguments are out of range.
+
+Complete example
+^^^^^^^^^^^^^^^^
+
+::
+
+ from machine import PWM
+
+ # Start a 1 kHz signal at 50 % duty cycle on P16_1
+ pwm = PWM("P16_1", freq=1000, duty_u16=32767)
+ print(pwm) # PWM(Pin.cpu.P16_1, freq=1000, duty=50.00%)
+
+ # Read back the current settings
+ print(pwm.freq()) # 1000
+ print(pwm.duty_u16()) # 32767
+ print(pwm.duty_ns()) # 500000 (0.5 ms duty cycle at 1 kHz)
+
+ # Update frequency only — duty ratio preserved
+ pwm.freq(2000)
+ print(pwm.freq()) # 2000
+
+ # Switch to nanosecond duty control: 250 µs duty cycle at 2 kHz = 50 %
+ pwm.duty_ns(250000)
+ print(pwm.duty_ns()) # 250000
+
+ # Reconfigure completely
+ pwm.init(freq=500, duty_u16=16383) # 500 Hz, 25 %
+
+ # Stop and release the pin
+ pwm.deinit()
+
+
+Timer
+-----
+
+Hardware timer using the TCPWM0 peripheral on the PSOC™ Edge. See :ref:`machine.Timer ` for the standard MicroPython Timer API.
+
+.. note::
+
+ This port provides **32** independent hardware timer instances (IDs ``0`` to ``31``).
+
+ - **32-bit timers**: IDs ``0`` through ``7`` (TCPWM0 counters ``0`` through ``7``).
+ - **16-bit timers**: IDs ``8`` through ``31`` (TCPWM0 counters ``256`` through ``279``).
+
+ Only one instance per ID can exist at a time; constructing a second ``Timer(id)`` without calling ``deinit()`` first raises a ``ValueError``.
+
+.. note::
+
+ The timer clock is **1 MHz** (shared with the system tick). This means:
+
+ - The minimum resolvable period is **1 µs**.
+ - With ``period``, the minimum value is **1 ms**.
+ - For **32-bit timers** (IDs ``0`` to ``7``), the maximum period is **4 294 967 ms** (~49.7 days).
+ - For **16-bit timers** (IDs ``8`` to ``31``), the maximum period is **65 ms**.
+ - With ``freq``, the minimum frequency is **1 Hz** and the maximum is **1 000 000 Hz** (1 MHz).
+ - Computed period ticks must fit the selected counter width: **1-4 294 967 295** for 32-bit timers, **1-65 535** for 16-bit timers.
+ - The ``hard`` parameter for ``Timer`` is still under development for this port and is not yet completely implemented.
+
+Complete example
+^^^^^^^^^^^^^^^^
+
+::
+
+ from machine import Timer
+ import micropython
+ import time
+
+ # --- Periodic soft timer (default) ---
+ count = 0
+
+ def on_tick(timer):
+ global count
+ count += 1
+ print("tick", count)
+
+ tim = Timer(0, mode=Timer.PERIODIC, period=500, callback=on_tick)
+ time.sleep(3) # let it fire ~6 times
+ tim.deinit()
+
+ # --- One-shot timer ---
+ def on_done(timer):
+ print("one-shot fired")
+
+ tim = Timer(1, mode=Timer.ONE_SHOT, period=1000, callback=on_done)
+ time.sleep(2)
+ tim.deinit()
+
+ # --- Frequency-based timer ---
+ def on_freq(timer):
+ print("2 Hz tick")
+
+ tim = Timer(2, mode=Timer.PERIODIC, freq=2, callback=on_freq)
+ time.sleep(3)
+ tim.deinit()
+
+ # --- Hard IRQ timer (allocation-free callback required) ---
+ micropython.alloc_emergency_exception_buf(100)
+ fired = [False]
+
+ def on_hard(timer):
+ fired[0] = True # list index write is allocation-free
+
+ tim = Timer(0, mode=Timer.ONE_SHOT, period=100, callback=on_hard, hard=True)
+ time.sleep_ms(200)
+ tim.deinit()
+ print("hard fired:", fired[0])
+
+Network Module
+--------------
+
+The :mod:`network` module.
+
+See :ref:`network.WLAN `:
+
+This section documents only the PSOC™ Edge-specific WLAN behaviour.
+
+.. method:: WLAN.active([is_active])
+
+ Interface activation differs by interface type:
+
+ * STA: ``WLAN.active()`` returns the current connection state. Setting the STA active state is not supported.
+ * AP: ``WLAN.active()`` returns whether the access point is running, and ``WLAN.active(True/False)`` starts or stops it.
+
+.. method:: WLAN.scan(ssid=None, bssid=None)
+
+ STA only. Accepts one optional filter per call:
+
+ * ``ssid`` — return only networks matching this SSID.
+ * ``bssid`` — return only networks matching this BSSID (bytes of length 6).
+
+ Passing both filters together is not supported.
+
+.. method:: WLAN.connect(ssid, key=None, *, bssid=None)
+
+ Connect the STA interface to an access point.
+
+ * ``ssid`` is required.
+ * ``key`` is optional and may be omitted for open networks.
+ * ``bssid`` is optional and, if provided, must be 6 bytes.
+
+.. method:: WLAN.isconnected()
+
+ Return the interface connection state:
+
+ * STA: ``True`` when connected to an access point.
+ * AP: ``True`` when the access point is running and at least one station is associated.
+
+.. method:: WLAN.status('param')
+
+ .. warning::
+ This function does not provide link-up/down connection state. Use
+ ``isconnected()`` to check connection status.
+
+ The following query parameters are allowed:
+
+ * ``rssi`` — received signal strength in dBm (STA only).
+ * ``stations`` — list of connected station MAC addresses as bytes (AP only).
+
+.. method:: WLAN.config('param')
+ WLAN.config(param=value, ...)
+
+ Supported configuration parameters are:
+
+ * AP query parameters:
+
+ - ``channel``
+ - ``ssid``
+ - ``security``
+ - ``key`` / ``password`` — only queryable when the default AP password is set.
+ - ``mac``
+
+ * AP set parameters:
+
+ - ``channel``
+ - ``ssid``
+ - ``security``
+ - ``key`` / ``password``
+
+ * STA query parameters:
+
+ - ``channel``
+ - ``ssid``
+ - ``security``
+ - ``mac``
+
+ .. note::
+ STA has no settable config parameters. Use ``WLAN.connect(ssid, key)`` to associate to a network.
+
+Constants
+^^^^^^^^^
+
+Security mode constants:
+
+.. data:: WLAN.OPEN
+ WLAN.WEP
+ WLAN.WPA
+ WLAN.WPA2
+ WLAN.WPA3
+ WLAN.WPA2_WPA_PSK
+ WLAN.SEC_UNKNOWN
+
+The following helper can be run manually (or placed in ``boot.py``) to connect
+to a Wi-Fi network:
+
+::
+
+ def network_connect(ssid, key, timeout_s=30):
+ import network
+ import time
+
+ wlan = network.WLAN(network.STA_IF)
+
+ if wlan.isconnected():
+ print("[Network] Already connected")
+ print(wlan.ifconfig())
+ return
+
+ wlan.connect(ssid, key)
+
+ for _ in range(timeout_s):
+ if wlan.isconnected():
+ print("[Network] Connected")
+ print(wlan.ifconfig())
+ return
+ time.sleep(1)
+
+ print("[Network] Connection failed")
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 4d9b9558575..895f02a2409 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,3 +1,4 @@
sphinx~=7.2.6
sphinxcontrib.jquery==4.1
sphinx-rtd-theme==3.0.2
+sphinxemoji==0.1.8
diff --git a/docs/templates/topindex.html b/docs/templates/topindex.html
index e3bcd7cce14..a5df317339b 100644
--- a/docs/templates/topindex.html
+++ b/docs/templates/topindex.html
@@ -57,6 +57,10 @@ MicroPython documentation
Quick reference for the ESP32
pinout for ESP32-based boards, snippets of useful code, and a tutorial
+
+ Quick reference for the PSOC™ Edge
+ general information for PSOC™ Edge based boards, snippets of useful code, and a tutorial
+
Quick reference for the Raspberry Pi RP2xxx
pinout for rp2xxx-based boards, snippets of useful code, and a tutorial
diff --git a/lib/micropython-deepcraft-model-interface b/lib/micropython-deepcraft-model-interface
new file mode 160000
index 00000000000..8ece820135f
--- /dev/null
+++ b/lib/micropython-deepcraft-model-interface
@@ -0,0 +1 @@
+Subproject commit 8ece820135f37a7f8a2b4195a0e3ca81b889bc27
diff --git a/lib/mpy-test-ext b/lib/mpy-test-ext
new file mode 160000
index 00000000000..9c8d81c3d15
--- /dev/null
+++ b/lib/mpy-test-ext
@@ -0,0 +1 @@
+Subproject commit 9c8d81c3d15871a2483a7dce5cce7090e813e37d
diff --git a/lib/psoc-edge/TARGET_KIT_PSE84_AI b/lib/psoc-edge/TARGET_KIT_PSE84_AI
new file mode 160000
index 00000000000..41147b656e8
--- /dev/null
+++ b/lib/psoc-edge/TARGET_KIT_PSE84_AI
@@ -0,0 +1 @@
+Subproject commit 41147b656e87c9c195f243c39d8f5575909982c8
diff --git a/lib/psoc-edge/abstraction-rtos b/lib/psoc-edge/abstraction-rtos
new file mode 160000
index 00000000000..1b07347f980
--- /dev/null
+++ b/lib/psoc-edge/abstraction-rtos
@@ -0,0 +1 @@
+Subproject commit 1b07347f980c42d22ed93f296541dcb10f014332
diff --git a/lib/psoc-edge/async-transfer b/lib/psoc-edge/async-transfer
new file mode 160000
index 00000000000..d4d7f347f8b
--- /dev/null
+++ b/lib/psoc-edge/async-transfer
@@ -0,0 +1 @@
+Subproject commit d4d7f347f8b5e3a7c8feb6089fa2ba3b9aba822c
diff --git a/lib/psoc-edge/clib-support b/lib/psoc-edge/clib-support
new file mode 160000
index 00000000000..5e534ad3812
--- /dev/null
+++ b/lib/psoc-edge/clib-support
@@ -0,0 +1 @@
+Subproject commit 5e534ad3812f12d28c501b8efe4f0be711de8087
diff --git a/lib/psoc-edge/connectivity-utilities b/lib/psoc-edge/connectivity-utilities
new file mode 160000
index 00000000000..369f1deb812
--- /dev/null
+++ b/lib/psoc-edge/connectivity-utilities
@@ -0,0 +1 @@
+Subproject commit 369f1deb81264f4a4d20d7163f1f6dcf5f69e269
diff --git a/lib/psoc-edge/core-lib b/lib/psoc-edge/core-lib
new file mode 160000
index 00000000000..b2a7ce7e3a9
--- /dev/null
+++ b/lib/psoc-edge/core-lib
@@ -0,0 +1 @@
+Subproject commit b2a7ce7e3a96265358cc3512c883befa24d0da06
diff --git a/lib/psoc-edge/cy-mbedtls-acceleration b/lib/psoc-edge/cy-mbedtls-acceleration
new file mode 160000
index 00000000000..e5f61c39079
--- /dev/null
+++ b/lib/psoc-edge/cy-mbedtls-acceleration
@@ -0,0 +1 @@
+Subproject commit e5f61c3907900547c6a05d9eca58335444b1ae68
diff --git a/lib/psoc-edge/freertos b/lib/psoc-edge/freertos
new file mode 160000
index 00000000000..8a19c8db81b
--- /dev/null
+++ b/lib/psoc-edge/freertos
@@ -0,0 +1 @@
+Subproject commit 8a19c8db81becf1e981a5f94630952160fddf8c5
diff --git a/lib/psoc-edge/lwip b/lib/psoc-edge/lwip
new file mode 160000
index 00000000000..4599f551dea
--- /dev/null
+++ b/lib/psoc-edge/lwip
@@ -0,0 +1 @@
+Subproject commit 4599f551dead9eac233b91c0b9ee5879f5d0620a
diff --git a/lib/psoc-edge/lwip-freertos-integration b/lib/psoc-edge/lwip-freertos-integration
new file mode 160000
index 00000000000..d06f395b7a1
--- /dev/null
+++ b/lib/psoc-edge/lwip-freertos-integration
@@ -0,0 +1 @@
+Subproject commit d06f395b7a1b89244ad0fbdc01cafd2e65f4ae40
diff --git a/lib/psoc-edge/lwip-network-interface-integration b/lib/psoc-edge/lwip-network-interface-integration
new file mode 160000
index 00000000000..ff858e9915a
--- /dev/null
+++ b/lib/psoc-edge/lwip-network-interface-integration
@@ -0,0 +1 @@
+Subproject commit ff858e9915ae57cf31ecbee2029b7874acf9752c
diff --git a/lib/psoc-edge/mtb-dsl-pse8xxgp b/lib/psoc-edge/mtb-dsl-pse8xxgp
new file mode 160000
index 00000000000..15d032bd4cd
--- /dev/null
+++ b/lib/psoc-edge/mtb-dsl-pse8xxgp
@@ -0,0 +1 @@
+Subproject commit 15d032bd4cd1090a10f544a881ae7d0aa4869caf
diff --git a/lib/psoc-edge/mtb-ipc b/lib/psoc-edge/mtb-ipc
new file mode 160000
index 00000000000..760f4772bd4
--- /dev/null
+++ b/lib/psoc-edge/mtb-ipc
@@ -0,0 +1 @@
+Subproject commit 760f4772bd4b37abe08062d7229de91e9a23a54f
diff --git a/lib/psoc-edge/mtb-srf b/lib/psoc-edge/mtb-srf
new file mode 160000
index 00000000000..3c43b49a7e0
--- /dev/null
+++ b/lib/psoc-edge/mtb-srf
@@ -0,0 +1 @@
+Subproject commit 3c43b49a7e001836d63b60daa19d2616396e014a
diff --git a/lib/psoc-edge/retarget-io b/lib/psoc-edge/retarget-io
new file mode 160000
index 00000000000..b12aaf1e6ff
--- /dev/null
+++ b/lib/psoc-edge/retarget-io
@@ -0,0 +1 @@
+Subproject commit b12aaf1e6ff27cb9b44293c21813f83f35c40628
diff --git a/lib/psoc-edge/se-rt-services-utils b/lib/psoc-edge/se-rt-services-utils
new file mode 160000
index 00000000000..5da80102ec1
--- /dev/null
+++ b/lib/psoc-edge/se-rt-services-utils
@@ -0,0 +1 @@
+Subproject commit 5da80102ec10b8a3e1676aed02073f7f9dcae3f5
diff --git a/lib/psoc-edge/secure-sockets b/lib/psoc-edge/secure-sockets
new file mode 160000
index 00000000000..48178fc16b5
--- /dev/null
+++ b/lib/psoc-edge/secure-sockets
@@ -0,0 +1 @@
+Subproject commit 48178fc16b5c3524a44b52523a31c7b395c368e4
diff --git a/lib/psoc-edge/serial-memory b/lib/psoc-edge/serial-memory
new file mode 160000
index 00000000000..ae90b884dd1
--- /dev/null
+++ b/lib/psoc-edge/serial-memory
@@ -0,0 +1 @@
+Subproject commit ae90b884dd16959230c33e5368d18a09bee0df72
diff --git a/lib/psoc-edge/whd-bsp-integration b/lib/psoc-edge/whd-bsp-integration
new file mode 160000
index 00000000000..c972383a406
--- /dev/null
+++ b/lib/psoc-edge/whd-bsp-integration
@@ -0,0 +1 @@
+Subproject commit c972383a4060f99bc36151c0f2371ccf329a9f97
diff --git a/lib/psoc-edge/wifi-connection-manager b/lib/psoc-edge/wifi-connection-manager
new file mode 160000
index 00000000000..6705d3a4263
--- /dev/null
+++ b/lib/psoc-edge/wifi-connection-manager
@@ -0,0 +1 @@
+Subproject commit 6705d3a4263d69e90287a76b1b79233104e0af20
diff --git a/lib/psoc-edge/wifi-host-driver b/lib/psoc-edge/wifi-host-driver
new file mode 160000
index 00000000000..3d708039d2b
--- /dev/null
+++ b/lib/psoc-edge/wifi-host-driver
@@ -0,0 +1 @@
+Subproject commit 3d708039d2b603fafc3f27c998156197b2cf8248
diff --git a/lib/psoc-edge/wifi-resources b/lib/psoc-edge/wifi-resources
new file mode 160000
index 00000000000..c89862c7e75
--- /dev/null
+++ b/lib/psoc-edge/wifi-resources
@@ -0,0 +1 @@
+Subproject commit c89862c7e758efccedd510851f3c93bc32656598
diff --git a/lib/psoc-edge/wpa3-external-supplicant b/lib/psoc-edge/wpa3-external-supplicant
new file mode 160000
index 00000000000..61ab33c2f6e
--- /dev/null
+++ b/lib/psoc-edge/wpa3-external-supplicant
@@ -0,0 +1 @@
+Subproject commit 61ab33c2f6e3a43651aa31fa80bb9019aead4af9
diff --git a/ports/psoc-edge/Makefile b/ports/psoc-edge/Makefile
new file mode 100644
index 00000000000..4ca5f9d8080
--- /dev/null
+++ b/ports/psoc-edge/Makefile
@@ -0,0 +1,838 @@
+################################################################################
+# Initial setup of Makefile environment
+
+BOARD ?= KIT_PSE84_AI
+BOARD_DIR ?= boards/$(BOARD)
+BUILD ?= build-$(BOARD)
+
+ifeq ($(wildcard $(BOARD_DIR)/.),)
+$(error Invalid BOARD specified: $(BOARD_DIR))
+endif
+
+# qstr definitions (must come before including py.mk).
+QSTR_DEFS += qstrdefsport.h
+QSTR_GLOBAL_DEPENDENCIES += $(BOARD_DIR)/mpconfigboard.h
+
+# Frozen manifest for VFS support
+FROZEN_MANIFEST ?= boards/manifest.py
+
+ifneq ($(FROZEN_MANIFEST),)
+ CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool
+ CFLAGS += -DMICROPY_MODULE_FROZEN_MPY=1
+ CFLAGS += -DMICROPY_MODULE_FROZEN_STR=1
+endif
+
+# Include the core environment definitions; this will set $(TOP).
+include ../../py/mkenv.mk
+
+# Port and board specific make settings.
+include mpconfigport.mk
+include $(BOARD_DIR)/mpconfigboard.mk
+
+# extmod/extmod.mk enables mbedTLS sources based on MICROPY_SSL_MBEDTLS.
+ifeq ($(MICROPY_SSL_MBEDTLS),1)
+MBEDTLS_CONFIG_FILE = \"mbedtls/mbedtls_config_port.h\"
+endif
+
+# Include py core make definitions.
+include $(TOP)/py/py.mk
+include $(TOP)/extmod/extmod.mk
+
+################################################################################
+# Project specific settings and compiler/linker flags
+
+# Required git submodules.
+GIT_SUBMODULES += \
+ lib/CMSIS_6 \
+ lib/mbedtls \
+
+GIT_SUBMODULES += $(addprefix lib/psoc-edge/,\
+ abstraction-rtos \
+ async-transfer \
+ clib-support \
+ connectivity-utilities \
+ core-lib \
+ cy-mbedtls-acceleration \
+ freertos \
+ lwip \
+ lwip-freertos-integration \
+ lwip-network-interface-integration \
+ mtb-dsl-pse8xxgp \
+ mtb-ipc \
+ mtb-srf \
+ retarget-io \
+ secure-sockets \
+ se-rt-services-utils \
+ serial-memory \
+ TARGET_KIT_PSE84_AI \
+ whd-bsp-integration \
+ wifi-connection-manager \
+ wifi-host-driver \
+ wifi-resources \
+ wpa3-external-supplicant \
+)
+
+GIT_SUBMODULES += lib/mpy-test-ext
+
+ifeq ($(MICROPY_PY_DEEPCRAFT),1)
+GIT_SUBMODULES += lib/micropython-deepcraft-model-interface
+DEEPCRAFT_MODEL_LIB_DIR := $(TOP)/lib/micropython-deepcraft-model-interface/
+-include $(TOP)/lib/micropython-deepcraft-model-interface/deepcraft_interface.mk
+endif
+
+
+# Define toolchain and other tools.
+CROSS_COMPILE ?= arm-none-eabi-
+EDGEPROTECTTOOLS ?= edgeprotecttools
+OPENOCD ?= openocd
+
+# SDK locations.
+PSE_LIB_TOP_DIR ?= lib/psoc-edge
+PSE_LIB_DIR ?= $(TOP)/$(PSE_LIB_TOP_DIR)
+
+################################################################################
+# Pin generation
+
+HEADER_BUILD := $(BUILD)/genhdr
+MAKE_PINS = boards/make-pins.py
+BOARD_PINS = $(BOARD_DIR)/pins.csv
+AF_FILE = boards/pse8x_af.csv
+PREFIX_FILE = boards/pse84_prefix.c
+GEN_PINS_SRC = $(BUILD)/pins_$(BOARD).c
+GEN_PINS_HDR = $(HEADER_BUILD)/pins.h
+GEN_PINS_AF_HDR= $(HEADER_BUILD)/pins_af.h
+
+# Making OBJ use an order-only dependency on the generated pins.h file
+# has the side effect of making the pins.h file before we actually compile
+# any of the objects. The normal dependency generation will deal with the
+# case when pins.h is modified. But when it doesn't exist, we don't know
+# which source files might need it.
+$(OBJ): | $(GEN_PINS_HDR)
+
+# With conditional pins, we may need to regenerate qstrdefs.h when config
+# options change.
+$(HEADER_BUILD)/qstrdefs.generated.h: $(BOARD_DIR)/mpconfigboard.h
+
+# Use a pattern rule here so that make will only call make-pins.py once to make
+# both pins_$(BOARD).c and pins.h
+$(BUILD)/%_$(BOARD).c $(HEADER_BUILD)/%.h : $(BOARD_DIR)/%.csv $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
+ $(ECHO) "GEN $@"
+ $(Q)$(PYTHON) $(MAKE_PINS) --board-csv $(BOARD_PINS) --af-csv $(AF_FILE) --prefix $(PREFIX_FILE) \
+ --output-source $(GEN_PINS_SRC) --output-header $(GEN_PINS_HDR) --output-af-header $(GEN_PINS_AF_HDR)
+
+#################################################################################
+# libs source files and libraries
+
+INC += $(addprefix -I$(TOP)/lib/,\
+ CMSIS_6/CMSIS/Core/Include \
+ CMSIS_6/CMSIS/Core/Include/a-profile \
+ CMSIS_6/CMSIS/Core/Include/m-profile \
+ CMSIS_6/CMSIS/Core/Include/r-profile \
+)
+
+#################################################################################
+# PSOC Edge source files and libraries
+
+DEFINES = \
+ -DCOMPONENT_CM33 \
+ -DCORE_NAME_CM33_0=1 \
+ -DCOMPONENT_MTB_HAL \
+ -DCOMPONENT_MW_ASYNC_TRANSFER \
+ -DCOMPONENT_MW_MTB_IPC \
+ -DCOMPONENT_MW_MTB_SRF \
+ -DCOMPONENT_NON_SECURE_DEVICE \
+ -DCYBSP_MCUBOOT_HEADER_SIZE=0x400 \
+ -DCY_RETARGET_IO_CONVERT_LF_TO_CRLF \
+
+ifeq ($(MICROPY_PY_FREERTOS),1)
+DEFINES += \
+ -DCOMPONENT_FREERTOS \
+ -DCY_RTOS_AWARE
+endif
+
+ifeq ($(MICROPY_PY_NETWORK_IFX_WCM),1)
+# WHD resource configuration for standalone MicroPython build.
+WHD_FW_FILE ?= $(TOP)/$(PSE_LIB_TOP_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/resources/firmware/COMPONENT_55500/COMPONENT_SM/55500A1.trxcse
+WHD_NVRAM_FILE ?= $(TOP)/$(PSE_LIB_TOP_DIR)/wifi-resources/nvram/COMPONENT_WIFI6/COMPONENT_55500/COMPONENT_MURATA-2FY/cyw55500-sdio-mur-2FY.txt
+WHD_CLM_FILE ?= $(TOP)/$(PSE_LIB_TOP_DIR)/wifi-resources/clm/COMPONENT_WIFI6/COMPONENT_55500/COMPONENT_CYW55513_MOD_PSE84_SOM/55500A1.clm_blob
+
+WHD_FW_SIZE := $(shell stat -c%s $(WHD_FW_FILE))
+WHD_NVRAM_SIZE := $(shell stat -c%s $(WHD_NVRAM_FILE))
+WHD_CLM_SIZE := $(shell stat -c%s $(WHD_CLM_FILE))
+
+DEFINES += \
+ -DCOMPONENT_PSE84 \
+ -DCYBSP_WIFI_CAPABLE \
+ -DCOMPONENT_WIFI_INTERFACE_SDIO \
+ -DBLHS_SUPPORT \
+ -DCY_WIFI_COUNTRY=WHD_COUNTRY_UNITED_STATES \
+ -DCYBSP_WIFI_WL_HOSTWAKE_DRIVE_MODE=MTB_HAL_GPIO_DRIVE_OPENDRAINDRIVESLOW \
+ -DCYBSP_WIFI_WL_HOSTWAKE_INIT_STATE=WHD_TRUE \
+ -DFW_IMAGE_SIZE=$(WHD_FW_SIZE) -DFW_IMAGE_NAME=\"$(WHD_FW_FILE)\" \
+ -DNVRAM_IMAGE_SIZE=$(WHD_NVRAM_SIZE) -DNVRAM_IMAGE_NAME=\"$(WHD_NVRAM_FILE)\" \
+ -DCLM_IMAGE_SIZE=$(WHD_CLM_SIZE) -DCLM_IMAGE_NAME=\"$(WHD_CLM_FILE)\" \
+ -UWHD_PRINT_VERSION_ENABLE \
+ -DWHD_PRINT_DISABLE
+endif
+
+INC += $(addprefix -I$(PSE_LIB_DIR)/,\
+ async-transfer/include \
+ \
+ core-lib/include \
+ \
+ mtb-dsl-pse8xxgp/device-utils/syspm/hobto/pdm_pcm/audioss_pdm \
+ mtb-dsl-pse8xxgp/device-utils/syspm/hobto/pdm_pcm/mxpdm \
+ mtb-dsl-pse8xxgp/device-utils/syspm/include \
+ \
+ mtb-dsl-pse8xxgp/hal/include \
+ \
+ mtb-dsl-pse8xxgp/nnkernel/COMPONENT_CM33/include \
+ \
+ mtb-dsl-pse8xxgp/pdl/devices/include \
+ mtb-dsl-pse8xxgp/pdl/devices/include/ip \
+ mtb-dsl-pse8xxgp/pdl/drivers/include \
+ mtb-dsl-pse8xxgp/pdl/drivers/third_party/ethernet/include \
+ \
+ mtb-ipc/include \
+ \
+ mtb-srf/include \
+ mtb-srf/include/COMPONENT_NON_SECURE_DEVICE \
+ mtb-srf/include/COMPONENT_NON_SECURE_DEVICE/COMPONENT_MW_MTB_IPC \
+ \
+ retarget-io/include \
+ \
+ serial-memory/include \
+ \
+ se-rt-services-utils \
+ \
+ TARGET_$(BOARD) \
+ TARGET_$(BOARD)/bluetooth \
+ )
+
+INC += \
+ -I$(BOARD_DIR) \
+ -I$(BOARD_DIR)/bsp-cfg \
+ -I$(BOARD_DIR)/mtb-prj \
+ -Idualcore/include
+
+ifeq ($(MICROPY_PY_FREERTOS),1)
+INC += \
+ -I$(PSE_LIB_DIR)/abstraction-rtos/include \
+ -I$(PSE_LIB_DIR)/abstraction-rtos/include/COMPONENT_FREERTOS \
+ -I$(PSE_LIB_DIR)/freertos/Source/include \
+ -I$(PSE_LIB_DIR)/freertos/Source/portable/COMPONENT_CM33 \
+ -I$(PSE_LIB_DIR)/freertos/Source/portable/COMPONENT_CM33/TOOLCHAIN_GCC_ARM/COMPONENT_FREERTOS_NTZ
+endif
+
+ifeq ($(MICROPY_PSOC_EDGE_LWIP),1)
+INC += \
+ -I$(PSE_LIB_DIR)/lwip-network-interface-integration/include \
+ -I$(PSE_LIB_DIR)/lwip-network-interface-integration/source \
+ \
+ -I$(PSE_LIB_DIR)/lwip-freertos-integration/arch \
+ \
+ -I$(PSE_LIB_DIR)/lwip/src/include
+endif
+
+ifeq ($(MICROPY_PY_NETWORK_IFX_WCM),1)
+INC += \
+ -I$(PSE_LIB_DIR)/clib-support/include \
+ -I$(PSE_LIB_DIR)/clib-support/source/TOOLCHAIN_GCC_ARM \
+ \
+ -I$(PSE_LIB_DIR)/connectivity-utilities \
+ -I$(PSE_LIB_DIR)/connectivity-utilities/cy_log \
+ -I$(PSE_LIB_DIR)/connectivity-utilities/network \
+ \
+ -I$(PSE_LIB_DIR)/whd-bsp-integration \
+ \
+ -I$(PSE_LIB_DIR)/wifi-connection-manager/include \
+ -I$(PSE_LIB_DIR)/wifi-connection-manager/source/COMPONENT_55500 \
+ \
+ -I$(PSE_LIB_DIR)/wifi-host-driver \
+ -I$(PSE_LIB_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/inc \
+ -I$(PSE_LIB_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/resources \
+ -I$(PSE_LIB_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/resources/firmware \
+ -I$(PSE_LIB_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/resources/resource_imp \
+ -I$(PSE_LIB_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/src \
+ -I$(PSE_LIB_DIR)/wifi-host-driver/WHD/COMPONENT_WIFI6/src/include
+endif
+
+MACHINE_FLAGS = \
+ -mcpu=cortex-m33 \
+ --specs=nano.specs \
+ --specs=nosys.specs \
+ -mfloat-abi=hard \
+ -mfpu=fpv5-sp-d16 \
+ -mthumb
+
+CFLAGS += -c $(MACHINE_FLAGS) \
+ -ffat-lto-objects \
+ -g \
+ -Wall \
+ -pipe \
+ $(DEFINES)
+
+LDFLAGS += $(MACHINE_FLAGS) \
+ -Wl,--gc-sections \
+ -Wl,--print-memory-usage \
+ -Xlinker -L $(PSE_LIB_DIR)/TARGET_$(BOARD)/COMPONENT_CM33/TOOLCHAIN_GCC_ARM \
+ -Xlinker -L $(BOARD_DIR)/bsp-cfg \
+ -T$(PSE_LIB_DIR)/TARGET_$(BOARD)/COMPONENT_CM33/TOOLCHAIN_GCC_ARM/pse84_ns_cm33.ld \
+ -Wl,-Map,$(BUILD)/firmware.map
+
+ifeq ($(MICROPY_PY_FREERTOS),1)
+LDFLAGS += -T$(TOP)/ports/psoc-edge/mpy_gc_assert.ld
+endif
+
+PSE_BSP_CFG_C += $(addprefix $(BOARD_DIR)/bsp-cfg/,\
+ cycfg.c \
+ cycfg_clocks.c \
+ cycfg_dmas.c \
+ cycfg_peripheral_clocks.c \
+ cycfg_peripherals.c \
+ cycfg_pins.c \
+ cycfg_protection.c \
+ cycfg_qspi_memslot.c \
+ cycfg_routing.c \
+ cycfg_system.c \
+ )
+
+# TODO: Move this retarget init to the uart driver.
+PSE_BSP_SRC_C += $(addprefix $(BOARD_DIR)/,\
+ mtb-prj/retarget_io_init.c \
+ )
+
+PSE_BSP_SRC_C += \
+ dualcore/source/COMPONENT_CM33/cm33_ipc_communication.c \
+
+
+PSE_LIB_SRC_C += $(addprefix $(PSE_LIB_TOP_DIR)/, \
+ async-transfer/source/mtb_async_transfer.c \
+ \
+ mtb-dsl-pse8xxgp/device-utils/syspm/source/mtb_syspm_callbacks_scb_uart.c \
+ \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_clock.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_gpio.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_lptimer.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_lptimer_common.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_sdhc.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_syspm.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_system.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_timer.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_uart.c \
+ mtb-dsl-pse8xxgp/hal/source/mtb_hal_utils_impl.c \
+ \
+ mtb-dsl-pse8xxgp/pdl/devices/source/cy_device.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_gpio.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_ipc_drv.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_ipc_pipe.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_ipc_sema.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_pdm_pcm_v2.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_crypto_core_hw.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_crypto_core_trng.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_rtc.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_scb_common.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_scb_i2c.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_sd_host.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_scb_spi.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_scb_uart.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_smif.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_smif_hb_flash.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_smif_memnum.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_smif_memslot.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_smif_sfdp.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_sysclk_v2.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_sysint_v2.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syslib.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syspm_pdcm.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syspm_ppu.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syspm_v4.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_systick_v2.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_tcpwm_counter.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_tcpwm_pwm.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/ppu_v1.c \
+ \
+ mtb-dsl-pse8xxgp/support/source/mtb_stdlib_stubs.c \
+ \
+ mtb-ipc/source/mtb_ipc.c \
+ \
+ mtb-srf/source/COMPONENT_NON_SECURE_DEVICE/mtb_srf_pool.c \
+ mtb-srf/source/COMPONENT_NON_SECURE_DEVICE/COMPONENT_MW_MTB_IPC/mtb_srf_ipc.c \
+ \
+ retarget-io/source/cy_retarget_io.c \
+ \
+ serial-memory/source/mtb_serial_memory.c \
+ \
+ TARGET_$(BOARD)/cybsp.c \
+ TARGET_$(BOARD)/system_edge.c \
+ TARGET_$(BOARD)/COMPONENT_CM33/COMPONENT_NON_SECURE_DEVICE/ns_start_pse84.c \
+ TARGET_$(BOARD)/COMPONENT_CM33/COMPONENT_NON_SECURE_DEVICE/ns_system_pse84.c \
+ )
+
+ifeq ($(MICROPY_PY_FREERTOS),1)
+PSE_LIB_SRC_C += $(addprefix $(PSE_LIB_TOP_DIR)/, \
+ abstraction-rtos/source/cy_worker_thread.c \
+ abstraction-rtos/source/COMPONENT_FREERTOS/cyabs_freertos_common.c \
+ abstraction-rtos/source/COMPONENT_FREERTOS/cyabs_freertos_helpers.c \
+ abstraction-rtos/source/COMPONENT_FREERTOS/cyabs_rtos_freertos.c \
+ \
+ freertos/Source/croutine.c \
+ freertos/Source/event_groups.c \
+ freertos/Source/list.c \
+ freertos/Source/queue.c \
+ freertos/Source/stream_buffer.c \
+ freertos/Source/tasks.c \
+ freertos/Source/timers.c \
+ freertos/Source/portable/COMPONENT_CM33/TOOLCHAIN_GCC_ARM/COMPONENT_FREERTOS_NTZ/port.c \
+ freertos/Source/portable/COMPONENT_CM33/TOOLCHAIN_GCC_ARM/COMPONENT_FREERTOS_NTZ/portasm.c \
+ freertos/Source/portable/COMPONENT_CM33/TOOLCHAIN_GCC_ARM/COMPONENT_FREERTOS_NTZ/portdsram.c \
+ freertos/Source/portable/MemMang/heap_3.c \
+ )
+endif
+
+ifeq ($(MICROPY_PSOC_EDGE_LWIP), 1)
+PSE_LIB_SRC_C += $(addprefix $(PSE_LIB_TOP_DIR)/, \
+ lwip-network-interface-integration/source/cy_ethernetif.c \
+ lwip-network-interface-integration/source/cy_lwip_dhcp_server.c \
+ lwip-network-interface-integration/source/cy_network_mw_core.c \
+ \
+ lwip-freertos-integration/arch/sys_arch.c \
+ \
+ lwip/src/api/api_lib.c \
+ lwip/src/api/api_msg.c \
+ lwip/src/api/err.c \
+ lwip/src/api/netbuf.c \
+ lwip/src/api/netdb.c \
+ lwip/src/api/netifapi.c \
+ lwip/src/api/sockets.c \
+ lwip/src/api/tcpip.c \
+ lwip/src/core/def.c \
+ lwip/src/core/dns.c \
+ lwip/src/core/inet_chksum.c \
+ lwip/src/core/init.c \
+ lwip/src/core/ip.c \
+ lwip/src/core/mem.c \
+ lwip/src/core/memp.c \
+ lwip/src/core/netif.c \
+ lwip/src/core/pbuf.c \
+ lwip/src/core/raw.c \
+ lwip/src/core/tcp.c \
+ lwip/src/core/tcp_in.c \
+ lwip/src/core/tcp_out.c \
+ lwip/src/core/timeouts.c \
+ lwip/src/core/udp.c \
+ lwip/src/core/ipv4/acd.c \
+ lwip/src/core/ipv4/dhcp.c \
+ lwip/src/core/ipv4/etharp.c \
+ lwip/src/core/ipv4/icmp.c \
+ lwip/src/core/ipv4/igmp.c \
+ lwip/src/core/ipv4/ip4.c \
+ lwip/src/core/ipv4/ip4_addr.c \
+ lwip/src/core/ipv4/ip4_frag.c \
+ lwip/src/netif/ethernet.c \
+ )
+endif
+
+ifeq ($(MICROPY_PY_NETWORK_IFX_WCM),1)
+PSE_LIB_SRC_C += $(addprefix $(PSE_LIB_TOP_DIR)/, \
+ clib-support/source/cy_time.c \
+ clib-support/source/COMPONENT_FREERTOS/cy_mutex_pool.c \
+ clib-support/source/TOOLCHAIN_GCC_ARM/cy_clib_support_newlib.c \
+ \
+ connectivity-utilities/network/cy_nw_helper_common.c \
+ \
+ wifi-connection-manager/source/cy_wcm.c \
+ \
+ whd-bsp-integration/COMPONENT_LWIP/cy_network_buffer_lwip.c \
+ whd-bsp-integration/cybsp_wifi.c \
+ \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/resources/resource_imp/whd_resources.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_ap.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_buffer_api.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_cdc_bdc.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_chip.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_chip_constants.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_clm.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_debug.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_events.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_hal_port.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_management.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_network_if.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_proto.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_resource_if.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_sdpcm.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_thread.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_utils.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_wifi.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/whd_wifi_api.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/bus_protocols/whd_bus.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/bus_protocols/whd_bus_common.c \
+ wifi-host-driver/WHD/COMPONENT_WIFI6/src/bus_protocols/whd_bus_sdio_protocol.c \
+ )
+endif
+
+PSE_SRC_ASM = $(PSE_LIB_TOP_DIR)/mtb-dsl-pse8xxgp/pdl/drivers/source/TOOLCHAIN_GCC_ARM/cy_syslib_ext.S \
+
+PSE_SRC_O = secboot/nsc_veneer.o
+
+OBJ += $(PSE_SRC_O)
+OBJ += $(addprefix $(BUILD)/, $(PSE_BSP_SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(PSE_BSP_CFG_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(PSE_LIB_SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(PSE_SRC_ASM:.S=.o))
+
+################################################################################
+# MicroPython source files and libraries
+
+INC += -I.
+INC += -I$(TOP)
+INC += -I$(BUILD)
+
+ifeq ($(MICROPY_PSOC_EDGE_LWIP),1)
+INC += -Ilwip_inc
+endif
+
+ifeq ($(MICROPY_SSL_MBEDTLS),1)
+INC += -I$(TOP)/extmod/mbedtls
+INC += -I$(TOP)/ports/psoc-edge/mbedtls
+endif
+
+CFLAGS += $(INC)
+
+ifeq ($(MICROPY_PY_FREERTOS),1)
+CFLAGS += -DMICROPY_PY_FREERTOS=1
+endif
+
+ifeq ($(MICROPY_PY_EXT_FLASH),1)
+CFLAGS += -DMICROPY_ENABLE_EXT_QSPI_FLASH=1
+endif
+
+ifeq ($(MICROPY_PY_NETWORK_IFX_WCM),1)
+CFLAGS += \
+ -DMICROPY_PY_NETWORK=1 \
+ -DMICROPY_PY_NETWORK_IFX_WCM=1 \
+ -Wno-stringop-truncation
+endif
+
+ifeq ($(MICROPY_SSL_MBEDTLS),1)
+CFLAGS += \
+ -DMICROPY_SSL_MBEDTLS=1 \
+ -DMICROPY_MBEDTLS_USE_MTB_ENTROPY=1
+endif
+
+# Select debugging or optimisation build.
+ifeq ($(DEBUG), 1)
+CFLAGS += -Og
+else
+CFLAGS += -Os -DNDEBUG
+CFLAGS += -fdata-sections -ffunction-sections
+endif
+
+AFLAGS = -mthumb -march=armv8.1-m.main+fp+mve.fp
+
+LDFLAGS +=
+
+ifeq ($(MICROPY_PY_FREERTOS),1)
+# Size of the C-malloc heap carved from the linker .heap zone (sbrk/malloc).
+# FreeRTOS uses its own static heap (configTOTAL_HEAP_SIZE) and does NOT draw
+# from this zone. WiFi (WHD/WCM/LwIP) does, so it needs a larger reservation.
+# The GC heap receives the remainder: [__HeapBase+MICROPY_C_HEAP_SIZE .. __HeapLimit].
+# Defaults can be overridden on the make command line, e.g. make MICROPY_C_HEAP_SIZE=0x20000.
+ifeq ($(MICROPY_PY_NETWORK_IFX_WCM),1)
+MICROPY_C_HEAP_SIZE ?= 0x16000
+else
+MICROPY_C_HEAP_SIZE ?= 0x8000
+endif
+
+# GC heap split: carve [__HeapBase .. __HeapBase+MICROPY_C_HEAP_SIZE) for C malloc
+# and give the remainder to the MicroPython GC heap.
+LDFLAGS += -Wl,--defsym=__GcHeapStart=__HeapBase+$(MICROPY_C_HEAP_SIZE)
+LDFLAGS += -Wl,--defsym=__GcHeapEnd=__HeapLimit
+endif
+
+LIBS += -lm
+
+# PSOC Edge uses Cortex-M33 and Cortex-M55 (ARMv8-M architecture)
+# However, since ARMv8-M is not directly supported by mpy-cross,
+# we use armv7emsp as the closest compatible architecture
+MPY_CROSS_FLAGS += -march=armv7emsp
+
+SRC_O += \
+ shared/runtime/gchelper_thumb2.o \
+
+SHARED_SRC_C += $(addprefix shared/,\
+ readline/readline.c \
+ \
+ runtime/gchelper_native.c \
+ runtime/interrupt_char.c \
+ runtime/mpirq.c \
+ runtime/pyexec.c \
+ runtime/stdout_helpers.c \
+ runtime/sys_stdio_mphal.c \
+ \
+ timeutils/timeutils.c \
+ )
+
+ifeq ($(MICROPY_PSOC_EDGE_LWIP),1)
+SHARED_SRC_C += $(addprefix shared/,\
+ netutils/dhcpserver.c \
+ netutils/netutils.c \
+ netutils/trace.c \
+ )
+endif
+
+MOD_SRC_C += \
+ machine_pin.c \
+ machine_pin_af.c \
+ machine_pin_irq.c \
+ machine_pdm_pcm_extmod.c\
+ machine_i2c.c\
+ machine_spi.c \
+ machine_spi_target.c \
+ machine_rtc.c \
+ machine_ipc.c \
+ machine_scb.c \
+ tcpwm.c \
+ machine_timer.c \
+ modpsocedge.c \
+
+ifeq ($(MICROPY_PY_EXT_FLASH),1)
+MOD_SRC_C += psoc_edge_qspi_flash.c
+endif
+
+ifeq ($(MICROPY_PY_NETWORK_IFX_WCM),1)
+MOD_SRC_C += \
+ network_ifx_wcm.c \
+ modsocket.c
+endif
+
+SRC_C += \
+ help.c \
+ main.c \
+ mphalport.c \
+ systick.c \
+ sys_int.c \
+
+# List of sources for qstr extraction
+SRC_QSTR += $(SRC_C) $(SHARED_SRC_C) $(MOD_SRC_C) $(GEN_PINS_SRC)
+
+# Define the required object files.
+OBJ += $(PY_O)
+OBJ += $(addprefix $(BUILD)/, $(SRC_O))
+OBJ += $(addprefix $(BUILD)/, $(LIBM_SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SHARED_SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(MOD_SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
+OBJ += $(GEN_PINS_SRC:.c=.o)
+
+################################################################################
+# Secondary targets
+
+## Secure targets
+##
+## Build, sign and flash separately
+## the secure boot hex.
+
+build_s: $(BUILD)/secboot/secboot.hex
+
+$(BUILD)/secboot/secboot.hex:
+ $(Q)$(MAKE) -C secboot BOARD=$(BOARD) BUILD=$(abspath $(BUILD)/secboot)
+
+deploy_s: $(BUILD)/secboot/secboot.signed.hex
+ $(call flash_target,$<)
+
+sign_s: $(BUILD)/secboot/secboot.signed.hex
+$(BUILD)/secboot/secboot.signed.hex: $(BUILD)/secboot/secboot.hex
+ @echo "Reallocating hex file..."
+ @$(EDGEPROTECTTOOLS) run-config -i config/sign_s.json \
+ --set s_hex $^ \
+ --set s_signed_hex $@ \
+ --symbol-search $(BOARD_DIR)/bsp-cfg
+
+clean_s:
+ $(Q)$(MAKE) -C secboot BOARD=$(BOARD) BUILD=$(abspath $(BUILD)/secboot) clean
+
+.PHONY: build_s sign_s deploy_s clean_s
+
+## Non-secure targets
+##
+## Build, shift and deploy separately
+## the non-secure hex file when the secure hex
+## is already build, signed and flashed in the
+## device
+
+build_ns: $(BUILD)/firmware.unshifted.hex
+
+shift_ns: $(BUILD)/firmware.shifted.hex
+$(BUILD)/firmware.shifted.hex: $(BUILD)/firmware.unshifted.hex
+ @echo "Reallocating hex file..."
+ @$(EDGEPROTECTTOOLS) run-config -i config/shift_ns.json \
+ --set ns_hex $^ \
+ --set ns_shifted_hex $@ \
+ --symbol-search $(BOARD_DIR)/bsp-cfg
+
+deploy_ns: $(BUILD)/firmware.shifted.hex
+ $(call flash_target,$<)
+
+.PHONY: build_ns shift_ns deploy_ns
+
+## Openocd reusable flashing target
+
+# Deploy on an specific serial device if passed
+ifndef DEV_SERIAL_NUMBER
+SERIAL_ADAPTER_CMD =
+else
+SERIAL_ADAPTER_CMD = -c "adapter serial $(DEV_SERIAL_NUMBER)"
+endif
+
+FLM_FILE = $(BOARD_DIR)/bsp-cfg/PSE84_SMIF.FLM
+QSPI_CFG_FILE = $(BOARD_DIR)/bsp-cfg/qspi_config.cfg
+
+OPENOCD_OPEN_CMDS = \
+ -s $(BOARD_DIR)/bsp-cfg \
+ -c "set QSPI_FLASHLOADER $(FLM_FILE)" \
+ -c "source [find interface/kitprog3.cfg]" \
+ $(SERIAL_ADAPTER_CMD) \
+ -c "transport select swd" \
+ -c "source [find target/infineon/pse84xgxs2.cfg]" \
+ -c "init" \
+ -c "reset init" \
+ -c "adapter speed 12000" \
+
+OPENOCD_CLOSE_CMDS = \
+ -c "reset run; shutdown" \
+
+
+define flash_target
+ $(Q)$(OPENOCD) \
+ $(OPENOCD_OPEN_CMDS) \
+ -c "flash write_image erase $(1)" \
+ -c "verify_image $(1)" \
+ $(OPENOCD_CLOSE_CMDS)
+endef
+
+## Multiple devices deploy targets
+##
+## Supports test and CI HIL operations.
+
+ifndef EXT_HEX_FILE
+HEX_FILE = $(BUILD)/firmware.hex
+else
+HEX_FILE = $(EXT_HEX_FILE)
+endif
+
+qdeploy:
+ $(call flash_target,$(HEX_FILE))
+
+# When multiple types of boards are connected, a devs file needs to be provided.
+# When working locally, if a "local-devs.yml" file is placed in "tools/psoc-edge"
+# it will be used
+ifneq ($(DEVS_FILE),)
+MULTI_BOARD_DEVS_OPTS = -f name=$(BOARD) --devs-yml $(DEVS_FILE)
+else
+DFLT_LOCAL_DEVS_FILE_NAME = local-devs.yml
+LOCAL_DEVS_FILE=$(TOP)/tools/psoc-edge/$(DFLT_LOCAL_DEVS_FILE_NAME)
+ifneq (,$(wildcard $(LOCAL_DEVS_FILE)))
+MULTI_BOARD_DEVS_OPTS = -f name=$(BOARD) --devs-yml $(LOCAL_DEVS_FILE)
+endif
+endif
+
+attached_devs:
+ @:
+ $(eval ATTACHED_TARGET_LIST = $(shell etdevs-query serial_number $(MULTI_BOARD_DEVS_OPTS)))
+ $(eval ATTACHED_TARGETS_NUMBER = $(words $(ATTACHED_TARGET_LIST)))
+ $(info Number of attached targets : $(ATTACHED_TARGETS_NUMBER))
+ $(info List of attached targets : $(ATTACHED_TARGET_LIST))
+
+qdeploy_multi: attached_devs
+ $(foreach ATTACHED_TARGET, $(ATTACHED_TARGET_LIST), $(MAKE) qdeploy DEV_SERIAL_NUMBER=$(ATTACHED_TARGET);)
+
+deploy_multi: all qdeploy_multi
+
+.PHONY: qdeploy qdeploy_multi deploy_multi attached_devs
+
+################################################################################
+# Main targets
+
+all: $(BUILD)/firmware.hex $(BUILD)/firmware.zip
+
+$(BUILD)/firmware.unshifted.elf: $(OBJ)
+ $(ECHO) "Link $@"
+ @$(Q)$(CC) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
+ @$(Q)$(SIZE) $@
+
+$(BUILD)/firmware.unshifted.hex: $(BUILD)/firmware.unshifted.elf
+ $(ECHO) "Create $@"
+ @$(Q)$(OBJCOPY) -O ihex $^ $@
+
+sign_merge: $(BUILD)/firmware.hex
+$(BUILD)/firmware.hex: $(BUILD)/secboot/secboot.hex $(BUILD)/firmware.unshifted.hex
+ @echo "Signing and combining hex files..."
+ @$(EDGEPROTECTTOOLS) run-config -i config/sign_shift_merge.json \
+ --set s_hex $(word 1,$^) \
+ --set s_signed_hex $(BUILD)/secboot/secboot.signed.hex \
+ --set ns_hex $(word 2,$^) \
+ --set ns_shifted_hex $(BUILD)/firmware.shifted.hex \
+ --set signed_merged_hex $@ \
+ --symbol-search $(BOARD_DIR)/bsp-cfg
+
+deploy: $(BUILD)/firmware.hex
+ $(call flash_target,$<)
+
+zip: $(BUILD)/firmware.zip
+$(BUILD)/firmware.zip: $(BUILD)/firmware.hex $(FLM_FILE) $(QSPI_CFG_FILE)
+ $(ECHO) "Create $@"
+ $(Q)$(ZIP) -q -j $@ $^
+
+.PHONY: all sign_merge deploy zip
+
+###############################################################################
+# Help target
+
+help:
+ @:
+ $(info )
+ $(info Main targets:)
+ $(info )
+ $(info all Build the MicroPython firmware)
+ $(info submodules Initialize port required port submodules)
+ $(info deploy Deploy the MicroPython firmware on the board)
+ $(info clean Remove the board build directory)
+ $(info help Show this help message)
+ $(info )
+ $(info Secondary targets:)
+ $(info )
+ $(info build_s Build separately the secure boot signed firmware)
+ $(info deploy_s Deploy separately the secure boot signed firmware)
+ $(info clean_s Remove the secure boot build directory)
+ $(info build_ns Build separately the non secure firmware.)
+ $(info deploy_ns Deploy separately the non secure shifted firmware)
+ $(info sign_s Sign the secure boot firmware)
+ $(info shift_ns Reallocate the non secure firmware )
+ $(info sign_merge Sign the secure boot firmware, reallocate the non)
+ $(info .. secure firmware, and merge them into a single file)
+ $(info )
+ $(info Test and CI support targets:)
+ $(info )
+ $(info qdeploy Deploy the MicroPython firmware without rebuilding)
+ $(info qdeploy_multi Deploy the MicroPython firmware on multiple devices)
+ $(info .. without rebuilding)
+ $(info deploy_multi Deploy the MicroPython firmware on multiple devices)
+ $(info )
+ $(info Options for build targets:)
+ $(info - BOARD Target PSOC Edge MicroPython board)
+ $(info )
+ $(info Options for deploy targets:)
+ $(info - DEV_SERIAL_NUMBER Serial number of the target to program)
+ $(info .. when multiple devices are connected)
+ $(info - EXT_HEX_FILE An external .hex file can be provided to the deploy)
+ $(info .. targets, instead of building from the sources)
+ $(info )
+
+.PHONY: help
+
+################################################################################
+# Remaining make rules
+
+# Include remaining core make rules.
+include $(TOP)/py/mkrules.mk
diff --git a/ports/psoc-edge/README.md b/ports/psoc-edge/README.md
new file mode 100644
index 00000000000..626c09d4880
--- /dev/null
+++ b/ports/psoc-edge/README.md
@@ -0,0 +1,80 @@
+# PSOC™ Edge port
+
+This port is intended to run on PSOC™ Edge microcontrollers.
+
+## Build environment
+
+Install the following tools on your Linux host machine:
+
+ - An ARM cross compiler such as `arm-none-eabi-gcc` and associated binary utilities and libc. The minimum required version is 14.2.1.
+
+ Download the [Infineon MTB GCC package](https://softwaretools.infineon.com/tools/com.ifx.tb.tool.mtbgccpackage) and install it with the command:
+
+ sudo apt install ./mtbgccpackage_14.2.1.265_Linux_x64.deb
+
+ Alternatively, you can also install the `gcc-arm-none-eabi` official package:
+
+ sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi
+
+- [edgeprotecttools](https://github.com/Infineon/edgeprotecttools/). The minimum required version is 1.6.0.
+
+ It can be installed from PyPi via `pip`:
+
+ sudo pip install edgeprotecttools
+
+- [Infineon OpenOCD](https://github.com/Infineon/openocd). Download the latest [release](https://github.com/Infineon/openocd/releases) manually or via `wget`. The minimum required version is v5.8.0. For example:
+
+ wget -O openocd.tar.gz https://github.com/Infineon/openocd/releases/download/release-v5.16.1/openocd-5.16.1.4486-linux.tar.gz
+
+ And unarchive it in the desired location. For example, in the `/opt/openocd` dir:
+
+ mkdir -p /opt/openocd
+ tar -xzf openocd.tar.gz -C /opt/openocd --strip-components=1
+
+### Setting up the environment
+
+Make sure that `arm-none-eabi-gcc`, `edgeprotecttools` and `openocd` are added to the system `PATH`.
+
+## Building and running on Linux
+
+As we are working on the `psoc-edge-main` branch, first checkout that branch after cloning this repo:
+
+ git checkout --track origin/psoc-edge-main
+
+Before building the firmware for a given board the MicroPython cross-compiler
+must be built; it will be used to pre-compile some of the built-in scripts to
+bytecode. The cross-compiler is built and run on the host machine, using:
+
+ make -C mpy-cross
+
+The following build commands should be run from the `ports/psoc-edge` directory:
+
+Retrieve submodules:
+
+ make submodules
+
+Build the firmware:
+
+ make BOARD=KIT_PSE84_AI
+
+And flash it to the board:
+
+ make deploy
+
+> [!NOTE]
+> This will also build the firmware if it has not been built yet.
+> Use `qdeploy` target to avoid rebuilding the firmware.
+
+If you have multiple boards connected, you can specify the serial number of the board to be programmed:
+
+ make deploy DEV_SERIAL_NUMBER=123456
+
+Find more information about all the available makefile targets:
+
+ make help
+-----------------------------------------------------
+
+# Run micropython
+
+Use any serial terminal (e.g. putty, minicom..) and establish a session with your device with 115200 bauds and 8-N-1 configuration.
+
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/board.json b/ports/psoc-edge/boards/KIT_PSE84_AI/board.json
new file mode 100644
index 00000000000..7071b44c51f
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/board.json
@@ -0,0 +1,24 @@
+{
+ "deploy": [
+ "../deploy.md"
+ ],
+ "docs": "",
+ "features": [
+ "BLE",
+ "Dual-core",
+ "External Flash",
+ "WiFi",
+ "Microphone",
+ "IMU",
+ "RGB LED",
+ "USB-C"
+ ],
+ "images": [
+ "kit_pse84_ai.jpg"
+ ],
+ "mcu": "PSE846GPS2DBZC4",
+ "product": "KIT_PSE84_AI",
+ "thumbnail": "",
+ "url": "https://www.infineon.com/evaluation-board/kit-pse84-ai",
+ "vendor": "Infineon Technologies"
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/PSE84_SMIF.FLM b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/PSE84_SMIF.FLM
new file mode 100644
index 00000000000..0b2a0915db0
Binary files /dev/null and b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/PSE84_SMIF.FLM differ
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.c
new file mode 100644
index 00000000000..111d8851ccd
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.c
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * File Name: cycfg.c
+ *
+ * Description:
+ * Simple wrapper containing all generated files and function to initialize
+ * all generated code.
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg.h"
+
+/* This function is provided for compatibility with older 2.X style projects. */
+void init_cycfg_all(void) {
+ cycfg_config_init();
+ cycfg_config_reservations();
+}
+void cycfg_config_init(void) {
+ init_cycfg_clocks();
+ init_cycfg_peripheral_clocks();
+ init_cycfg_system();
+ init_cycfg_peripherals();
+ init_cycfg_routing();
+ init_cycfg_pins();
+ init_cycfg_protection();
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.h
new file mode 100644
index 00000000000..bc1e3cf9a45
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.h
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * File Name: cycfg.h
+ *
+ * Description:
+ * Simple wrapper containing all generated files and function to initialize
+ * all generated code.
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_H)
+#define CYCFG_H
+
+#include "cycfg_notices.h"
+#include "cycfg_memory.h"
+#include "cymem_memory_types.h"
+#include "cymem_memory_locations.h"
+#include "cymem_CM33_0.h"
+#include "cymem_CM33_0_S.h"
+#include "cymem_CM55_0.h"
+#include "cycfg_clocks.h"
+#include "cycfg_clock_types.h"
+#include "cycfg_peripheral_clocks.h"
+#include "cycfg_system.h"
+#include "cycfg_ppc.h"
+#include "cycfg_dmas.h"
+#include "cycfg_peripherals.h"
+#include "cycfg_routing.h"
+#include "cycfg_pins.h"
+#include "cycfg_protection.h"
+#include "cycfg_connectivity_wifi.h"
+#include "cycfg_connectivity_bt.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+void init_cycfg_all(void);
+void cycfg_config_init(void);
+static inline void cycfg_config_reservations(void) {
+}
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.timestamp b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.timestamp
new file mode 100644
index 00000000000..ecda2dbaab1
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg.timestamp
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * File Name: cycfg.timestamp
+ *
+ * Description:
+ * Sentinel file for determining if generated source is up to date.
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clock_types.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clock_types.h
new file mode 100644
index 00000000000..98b2953d99e
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clock_types.h
@@ -0,0 +1,27 @@
+/* This file is automatically generated. */
+#if !defined(CYCFG_CLOCK_TYPES_H)
+#define CYCFG_CLOCK_TYPES_H
+
+#include "cy_sysclk.h"
+
+/** HF Clock Configuration */
+typedef struct
+{
+ /** HF clock source */
+ cy_en_clkhf_in_sources_t source;
+ /** HF clock divider */
+ cy_en_clkhf_dividers_t divider;
+} cycfg_clkhf_config_t;
+
+/** HF Clock Supervisor Configuration */
+typedef struct
+{
+ /** HF Clock Supervisor reference clock */
+ cy_en_clkhf_csv_ref_clk_t refClk;
+ /** HF Clock Supervisor accuracy */
+ uint32_t accuracy;
+ /** HF Clock Supervisor action */
+ cy_en_clkhf_csv_action_t action;
+} cycfg_clkhf_csv_config_t;
+
+#endif /* CYCFG_CLOCK_TYPES_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clocks.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clocks.c
new file mode 100644
index 00000000000..db7553a70a1
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clocks.c
@@ -0,0 +1,643 @@
+/*******************************************************************************
+ * File Name: cycfg_clocks.c
+ *
+ * Description:
+ * Clock configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_clocks.h"
+
+#define CY_CFG_SYSCLK_ECO_ERROR 1
+#define CY_CFG_SYSCLK_ALTHF_ERROR 2
+#define CY_CFG_SYSCLK_PLL_ERROR 3
+#define CY_CFG_SYSCLK_FLL_ERROR 4
+#define CY_CFG_SYSCLK_WCO_ERROR 5
+#define CY_CFG_SYSCLK_LPECO_ERROR 6
+
+#if !defined(COMPONENT_CM7) && !defined(COMPONENT_CM55)
+#define CY_CFG_SYSCLK_ACTIVE_CORE_HF CY_CFG_SYSCLK_CLKHF0
+#endif /* !defined(COMPONENT_CM7) && !defined(COMPONENT_CM55) */
+
+#if defined(COMPONENT_CM7) || defined(COMPONENT_CM55)
+#define CY_CFG_SYSCLK_ACTIVE_CORE_HF CY_CFG_SYSCLK_CLKHF1
+#endif /* defined(COMPONENT_CM7) || defined(COMPONENT_CM55) */
+
+#define CY_CFG_SYSCLK_FIRST_CLKPATH_DIRECT ((cy_en_clkhf_in_sources_t)CY_SRSS_NUM_PLL)
+#define CY_CFG_SYSCLK_ECO_ENABLED 1
+#define CY_CFG_SYSCLK_ECO_FREQ 17203200UL
+#define CY_CFG_SYSCLK_ECO_GPIO_IN_PRT GPIO_PRT19
+#define CY_CFG_SYSCLK_ECO_GPIO_IN_PIN 0
+#define CY_CFG_SYSCLK_ECO_GPIO_OUT_PRT GPIO_PRT19
+#define CY_CFG_SYSCLK_ECO_GPIO_OUT_PIN 1
+#define CY_CFG_SYSCLK_EXTCLK_ENABLED 1
+#define CY_CFG_SYSCLK_EXTCLK_FREQ 24000000UL
+#define CY_CFG_SYSCLK_EXTCLK_GPIO_PRT GPIO_PRT7
+#define CY_CFG_SYSCLK_EXTCLK_GPIO_PIN 4
+#define CY_CFG_SYSCLK_EXTCLK_GPIO_HSIOM P7_4_SRSS_EXT_CLK
+#define CY_CFG_SYSCLK_IHO_ENABLED 1
+#define CY_CFG_SYSCLK_WCO_ENABLED 1
+#define CY_CFG_SYSCLK_WCO_IN_PRT GPIO_PRT18
+#define CY_CFG_SYSCLK_WCO_IN_PIN 1U
+#define CY_CFG_SYSCLK_WCO_OUT_PRT GPIO_PRT18
+#define CY_CFG_SYSCLK_WCO_OUT_PIN 0U
+#define CY_CFG_SYSCLK_WCO_BYPASS CY_SYSCLK_WCO_NOT_BYPASSED
+#define CY_CFG_SYSCLK_PILO_ENABLED 1
+#define CY_CFG_SYSCLK_CLKLF_ENABLED 1
+#define CY_CFG_SYSCLK_CLKPATH0_SOURCE CY_SYSCLK_CLKPATH_IN_EXT
+#define CY_CFG_SYSCLK_CLKPATH1_SOURCE CY_SYSCLK_CLKPATH_IN_ECO
+#define CY_CFG_SYSCLK_CLKPATH2_SOURCE CY_SYSCLK_CLKPATH_IN_IHO
+#define CY_CFG_SYSCLK_CLKPATH3_SOURCE CY_SYSCLK_CLKPATH_IN_IHO
+#define CY_CFG_SYSCLK_CLKPATH4_SOURCE CY_SYSCLK_CLKPATH_IN_EXT
+#define CY_CFG_SYSCLK_CLKPATH5_SOURCE CY_SYSCLK_CLKPATH_IN_IHO
+#define CY_CFG_SYSCLK_CLKBAK_ENABLED 1
+#define CY_CFG_SYSCLK_CLKBAK_SOURCE CY_SYSCLK_BAK_IN_WCO
+#define CY_CFG_SYSCLK_DPLL_LP0_ENABLED 1
+#define CY_CFG_SYSCLK_DPLL_LP0_FEEDBACK_DIV 50
+#define CY_CFG_SYSCLK_DPLL_LP0_REFERENCE_DIV 3
+#define CY_CFG_SYSCLK_DPLL_LP0_OUTPUT_DIV 1
+#define CY_CFG_SYSCLK_DPLL_LP0_FRAC_DIV 0
+#define CY_CFG_SYSCLK_DPLL_LP0_FRAC_DITHER_EN false
+#define CY_CFG_SYSCLK_DPLL_LP0_FRAC_EN true
+#define CY_CFG_SYSCLK_DPLL_LP0_LF_MODE false
+#define CY_CFG_SYSCLK_DPLL_LP0_OUTPUT_MODE CY_SYSCLK_FLLPLL_OUTPUT_AUTO
+#define CY_CFG_SYSCLK_DPLL_LP0_OUTPUT_FREQ 400000000
+#define CY_CFG_SYSCLK_DPLL_LP1_ENABLED 1
+#define CY_CFG_SYSCLK_DPLL_LP1_FEEDBACK_DIV 34
+#define CY_CFG_SYSCLK_DPLL_LP1_REFERENCE_DIV 3
+#define CY_CFG_SYSCLK_DPLL_LP1_OUTPUT_DIV 4
+#define CY_CFG_SYSCLK_DPLL_LP1_FRAC_DIV 4793490
+#define CY_CFG_SYSCLK_DPLL_LP1_FRAC_DITHER_EN false
+#define CY_CFG_SYSCLK_DPLL_LP1_FRAC_EN true
+#define CY_CFG_SYSCLK_DPLL_LP1_LF_MODE false
+#define CY_CFG_SYSCLK_DPLL_LP1_OUTPUT_MODE CY_SYSCLK_FLLPLL_OUTPUT_AUTO
+#define CY_CFG_SYSCLK_DPLL_LP1_OUTPUT_FREQ 49151999
+#define CY_CFG_SYSCLK_DPLL_HP0_ENABLED 1
+#define CY_CFG_SYSCLK_DPLL_HP0_P_DIV 0
+#define CY_CFG_SYSCLK_DPLL_HP0_N_DIV 11
+#define CY_CFG_SYSCLK_DPLL_HP0_K_DIV 1
+#define CY_CFG_SYSCLK_DPLL_HP0_FRAC_DIV 0
+#define CY_CFG_SYSCLK_DPLL_HP0_OUTPUT_MODE CY_SYSCLK_FLLPLL_OUTPUT_AUTO
+#define CY_CFG_SYSCLK_DPLL_HP0_OUTPUT_FREQ 300000000
+#define CY_CFG_SYSCLK_CLKHF0_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF0_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_2
+#define CY_CFG_SYSCLK_CLKHF0_FREQ_MHZ 200UL
+#define CY_CFG_SYSCLK_CLKHF0_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF0_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF1_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF1_DIVIDER CY_SYSCLK_CLKHF_NO_DIVIDE
+#define CY_CFG_SYSCLK_CLKHF1_FREQ_MHZ 400UL
+#define CY_CFG_SYSCLK_CLKHF1_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF1_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF2_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF2_DIVIDER CY_SYSCLK_CLKHF_NO_DIVIDE
+#define CY_CFG_SYSCLK_CLKHF2_FREQ_MHZ 300UL
+#define CY_CFG_SYSCLK_CLKHF2_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH2
+#define CY_CFG_SYSCLK_CLKHF2_CLKPATH_NUM 2UL
+#define CY_CFG_SYSCLK_CLKHF3_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF3_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_2
+#define CY_CFG_SYSCLK_CLKHF3_FREQ_MHZ 200UL
+#define CY_CFG_SYSCLK_CLKHF3_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF3_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF4_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF4_DIVIDER CY_SYSCLK_CLKHF_NO_DIVIDE
+#define CY_CFG_SYSCLK_CLKHF4_FREQ_MHZ 400UL
+#define CY_CFG_SYSCLK_CLKHF4_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF4_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF5_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF5_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_2
+#define CY_CFG_SYSCLK_CLKHF5_FREQ_MHZ 200UL
+#define CY_CFG_SYSCLK_CLKHF5_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF5_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF6_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF6_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_2
+#define CY_CFG_SYSCLK_CLKHF6_FREQ_MHZ 200UL
+#define CY_CFG_SYSCLK_CLKHF6_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF6_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF7_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF7_DIVIDER CY_SYSCLK_CLKHF_NO_DIVIDE
+#define CY_CFG_SYSCLK_CLKHF7_FREQ_MHZ 49UL
+#define CY_CFG_SYSCLK_CLKHF7_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH1
+#define CY_CFG_SYSCLK_CLKHF7_CLKPATH_NUM 1UL
+#define CY_CFG_SYSCLK_CLKHF8_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF8_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_8
+#define CY_CFG_SYSCLK_CLKHF8_FREQ_MHZ 50UL
+#define CY_CFG_SYSCLK_CLKHF8_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF8_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF9_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF9_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_5
+#define CY_CFG_SYSCLK_CLKHF9_FREQ_MHZ 80UL
+#define CY_CFG_SYSCLK_CLKHF9_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF9_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF10_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF10_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_4
+#define CY_CFG_SYSCLK_CLKHF10_FREQ_MHZ 100UL
+#define CY_CFG_SYSCLK_CLKHF10_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF10_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF11_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF11_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_2
+#define CY_CFG_SYSCLK_CLKHF11_FREQ_MHZ 200UL
+#define CY_CFG_SYSCLK_CLKHF11_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF11_CLKPATH_NUM 0UL
+#define CY_CFG_SYSCLK_CLKHF12_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF12_DIVIDER CY_SYSCLK_CLKHF_NO_DIVIDE
+#define CY_CFG_SYSCLK_CLKHF12_FREQ_MHZ 24UL
+#define CY_CFG_SYSCLK_CLKHF12_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH4
+#define CY_CFG_SYSCLK_CLKHF12_CLKPATH_NUM 4UL
+#define CY_CFG_SYSCLK_CLKHF13_ENABLED 1
+#define CY_CFG_SYSCLK_CLKHF13_DIVIDER CY_SYSCLK_CLKHF_DIVIDE_BY_4
+#define CY_CFG_SYSCLK_CLKHF13_FREQ_MHZ 100UL
+#define CY_CFG_SYSCLK_CLKHF13_CLKPATH CY_SYSCLK_CLKHF_IN_CLKPATH0
+#define CY_CFG_SYSCLK_CLKHF13_CLKPATH_NUM 0UL
+
+static const cycfg_clkhf_config_t *cycfg_clkhf_configs[] =
+{
+ &cycfg_hf0Config,
+ &cycfg_hf1Config,
+ &cycfg_hf2Config,
+ &cycfg_hf3Config,
+ &cycfg_hf4Config,
+ &cycfg_hf5Config,
+ &cycfg_hf6Config,
+ &cycfg_hf7Config,
+ &cycfg_hf8Config,
+ &cycfg_hf9Config,
+ &cycfg_hf10Config,
+ &cycfg_hf11Config,
+ &cycfg_hf12Config,
+ &cycfg_hf13Config,
+};
+static const cycfg_clkhf_csv_config_t *cycfg_clkhf_csv_configs[] =
+{
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+static const cy_en_clkpath_in_sources_t cycfg_clkpath_configs[] =
+{
+ CY_CFG_SYSCLK_CLKPATH0_SOURCE,
+ CY_CFG_SYSCLK_CLKPATH1_SOURCE,
+ CY_CFG_SYSCLK_CLKPATH2_SOURCE,
+ CY_CFG_SYSCLK_CLKPATH3_SOURCE,
+ CY_CFG_SYSCLK_CLKPATH4_SOURCE,
+ CY_CFG_SYSCLK_CLKPATH5_SOURCE,
+};
+const cy_stc_rtc_config_t CYBSP_RTC_config =
+{
+ .sec = 0U,
+ .min = 0U,
+ .hour = 12U,
+ .amPm = CY_RTC_AM,
+ .hrFormat = CY_RTC_24_HOURS,
+ .dayOfWeek = CY_RTC_MONDAY,
+ .date = 1U,
+ .month = CY_RTC_JANUARY,
+ .year = 24U,
+};
+static const cy_stc_clk_eco_config_t srss_0_clock_0_eco_0_config =
+{
+ .ecoClkfreq = 17203200U,
+ .ecoCtrim = 6U,
+ .ecoGtrim = 2U,
+ .ecoIboost = 1U,
+};
+static cy_stc_dpll_lp_config_t srss_0_clock_0_pll250m_0_lp_pllConfig =
+{
+ .feedbackDiv = 50,
+ .referenceDiv = 3,
+ .outputDiv = 1,
+ .pllDcoMode = true,
+ .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO,
+ .fracDiv = 0,
+ .fracDitherEn = false,
+ .fracEn = true,
+ .dcoCode = 0xFU,
+ .kiInt = 0xAU,
+ .kiFrac = 0xBU,
+ .kiSscg = 0x7U,
+ .kpInt = 0x8U,
+ .kpFrac = 0x9U,
+ .kpSscg = 0x7U,
+};
+static cy_stc_pll_manual_config_t srss_0_clock_0_pll250m_0_pllConfig =
+{
+ .lpPllCfg = &srss_0_clock_0_pll250m_0_lp_pllConfig,
+};
+static cy_stc_dpll_lp_config_t srss_0_clock_0_pll250m_1_lp_pllConfig =
+{
+ .feedbackDiv = 34,
+ .referenceDiv = 3,
+ .outputDiv = 4,
+ .pllDcoMode = false,
+ .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO,
+ .fracDiv = 4793490,
+ .fracDitherEn = false,
+ .fracEn = true,
+ .dcoCode = 0xFU,
+ .kiInt = 0xAU,
+ .kiFrac = 0xBU,
+ .kiSscg = 0x7U,
+ .kpInt = 0x8U,
+ .kpFrac = 0x9U,
+ .kpSscg = 0x7U,
+};
+static cy_stc_pll_manual_config_t srss_0_clock_0_pll250m_1_pllConfig =
+{
+ .lpPllCfg = &srss_0_clock_0_pll250m_1_lp_pllConfig,
+};
+static cy_stc_dpll_hp_config_t srss_0_clock_0_pll500m_0_hp_pllConfig =
+{
+ .pDiv = 0,
+ .nDiv = 11,
+ .kDiv = 1,
+ .nDivFract = 0,
+ .freqModeSel = (cy_en_wait_mode_select_t)7,
+ .ivrTrim = 0x8U,
+ .clkrSel = 0x1U,
+ .alphaCoarse = 0xCU,
+ .betaCoarse = 0x5U,
+ .flockThresh = 3,
+ .flockWait = 0x6U,
+ .flockLkThres = 0x7U,
+ .flockLkWait = 0x4U,
+ .alphaExt = 0x14U,
+ .betaExt = 20,
+ .lfEn = 0x1U,
+ .dcEn = 0x1U,
+ .outputMode = CY_SYSCLK_FLLPLL_OUTPUT_AUTO,
+};
+static cy_stc_pll_manual_config_t srss_0_clock_0_pll500m_0_pllConfig =
+{
+ .hpPllCfg = &srss_0_clock_0_pll500m_0_hp_pllConfig,
+};
+const cycfg_clkhf_config_t cycfg_hf0Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF0_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF0_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf1Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF1_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF1_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf2Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF2_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF2_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf3Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF3_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF3_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf4Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF4_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF4_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf5Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF5_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF5_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf6Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF6_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF6_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf7Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF7_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF7_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf8Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF8_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF8_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf9Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF9_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF9_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf10Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF10_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF10_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf11Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF11_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF11_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf12Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF12_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF12_DIVIDER,
+};
+const cycfg_clkhf_config_t cycfg_hf13Config =
+{
+ .source = CY_CFG_SYSCLK_CLKHF13_CLKPATH,
+ .divider = CY_CFG_SYSCLK_CLKHF13_DIVIDER,
+};
+
+static void cycfg_SysClk_ClkHfInit(uint32_t clkHf, cy_en_clkhf_in_sources_t source, cy_en_clkhf_dividers_t divider);
+static void cycfg_SysClk_ClkHfCsvInit(uint32_t clkHf, cy_en_clkhf_csv_ref_clk_t refClk, uint32_t accuracy, cy_en_clkhf_csv_action_t action);
+__WEAK void __NO_RETURN cycfg_ClockStartupError(uint32_t error);
+__STATIC_INLINE void Cy_SysClk_EcoInit(void);
+__STATIC_INLINE void Cy_SysClk_ExtClkInit(void);
+__STATIC_INLINE void Cy_SysClk_IhoInit(void);
+__STATIC_INLINE void Cy_SysClk_WcoInit(void);
+__STATIC_INLINE void Cy_SysClk_PiloInit(void);
+__STATIC_INLINE void Cy_SysClk_ClkLfInit(void);
+__STATIC_INLINE void Cy_SysClk_ClkBakInit(void);
+__STATIC_INLINE void Cy_SysClk_Dpll_Lp0_Init(void);
+__STATIC_INLINE void Cy_SysClk_Dpll_Lp1_Init(void);
+__STATIC_INLINE void Cy_SysClk_Dpll_Hp0_Init(void);
+
+static void cycfg_SysClk_ClkHfInit(uint32_t clkHf, cy_en_clkhf_in_sources_t source, cy_en_clkhf_dividers_t divider) {
+ Cy_SysClk_ClkHfSetDivider(clkHf, divider);
+ Cy_SysClk_ClkHfSetSource(clkHf, source);
+ if (clkHf != 0U) {
+ Cy_SysClk_ClkHfEnable(clkHf);
+ }
+}
+static void cycfg_SysClk_ClkHfCsvInit(uint32_t clkHf, cy_en_clkhf_csv_ref_clk_t refClk, uint32_t accuracy, cy_en_clkhf_csv_action_t action) {
+ const cy_stc_clkhf_csv_hf_config_t csvConfig = { clkHf, refClk };
+ Cy_SysClk_ClkHfCsvConfigure(&csvConfig, accuracy);
+ Cy_SysClk_ClkHfCsvAction(clkHf, action);
+ Cy_SysClk_ClkHfCsvEnable(clkHf);
+}
+__WEAK void __NO_RETURN cycfg_ClockStartupError(uint32_t error) {
+ (void)error; /* Suppress the compiler warning */
+ while (1) {
+ ;
+ }
+}
+void init_cycfg_ns_clocks(void) {
+ #if (!defined(COMPONENT_SECURE_DEVICE))
+ /* Update global variables used in sysclock driver */
+ #ifdef CY_CFG_SYSCLK_ECO_ENABLED
+ Cy_SysClk_EcoSetFrequency(CY_CFG_SYSCLK_ECO_FREQ);
+ #endif
+ #ifdef CY_CFG_SYSCLK_EXTCLK_ENABLED
+ Cy_SysClk_ExtClkSetFrequency(CY_CFG_SYSCLK_EXTCLK_FREQ);
+ #endif
+
+ /* Update global variables used by Cy_SysLib_Delay functions */
+ uint32_t clk_hf0_freq_hz = 0;
+ #if (CY_CFG_SYSCLK_CLKHF0_FREQ_MHZ)
+ clk_hf0_freq_hz = CY_CFG_SYSCLK_CLKHF0_FREQ_MHZ * 1000000;
+ #endif /* CY_CFG_SYSCLK_CLKHF0_FREQ_MHZ */
+ uint32_t clk_hf1_freq_hz = 0;
+ #if (CY_CFG_SYSCLK_CLKHF1_FREQ_MHZ)
+ clk_hf1_freq_hz = CY_CFG_SYSCLK_CLKHF1_FREQ_MHZ * 1000000;
+ #endif /* CY_CFG_SYSCLK_CLKHF1_FREQ_MHZ */
+ SystemCoreClockSetup((CY_SYSCLK_CLK_CORE_HF_PATH_NUM == 0 ? clk_hf0_freq_hz : clk_hf1_freq_hz), clk_hf0_freq_hz);
+
+ #endif /* (!defined(COMPONENT_SECURE_DEVICE)) */
+}
+__STATIC_INLINE void Cy_SysClk_EcoInit(void) {
+ (void)Cy_GPIO_Pin_FastInit(GPIO_PRT19, 0, CY_GPIO_DM_ANALOG, 0UL, HSIOM_SEL_GPIO);
+ (void)Cy_GPIO_Pin_FastInit(GPIO_PRT19, 1, CY_GPIO_DM_ANALOG, 0UL, HSIOM_SEL_GPIO);
+ if (CY_SYSCLK_BAD_PARAM == Cy_SysClk_EcoManualConfigure(&srss_0_clock_0_eco_0_config)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_ECO_ERROR);
+ }
+ if (CY_SYSCLK_TIMEOUT == Cy_SysClk_EcoEnable(3000UL)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_ECO_ERROR);
+ }
+ Cy_SysClk_EcoSetFrequency(CY_CFG_SYSCLK_ECO_FREQ);
+}
+__STATIC_INLINE void Cy_SysClk_ExtClkInit(void) {
+ (void)Cy_GPIO_Pin_SecFastInit(GPIO_PRT7, 4, CY_GPIO_DM_HIGHZ, 0UL, P7_4_SRSS_EXT_CLK);
+ Cy_SysClk_ExtClkSetFrequency(CY_CFG_SYSCLK_EXTCLK_FREQ);
+}
+__STATIC_INLINE void Cy_SysClk_IhoInit(void) {
+ Cy_SysClk_IhoEnable();
+}
+__STATIC_INLINE void Cy_SysClk_WcoInit(void) {
+ (void)Cy_GPIO_Pin_FastInit(GPIO_PRT18, 1U, 0x00U, 0x00U, HSIOM_SEL_GPIO);
+ (void)Cy_GPIO_Pin_FastInit(GPIO_PRT18, 0U, 0x00U, 0x00U, HSIOM_SEL_GPIO);
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_WcoEnable(1000000UL)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_WCO_ERROR);
+ }
+}
+__STATIC_INLINE void Cy_SysClk_PiloInit(void) {
+ Cy_SysClk_PiloEnable();
+}
+__STATIC_INLINE void Cy_SysClk_ClkLfInit(void) {
+ /* The WDT is unlocked in the default startup code */
+ Cy_SysClk_ClkLfSetSource(CY_SYSCLK_CLKLF_IN_PILO);
+}
+__STATIC_INLINE void Cy_SysClk_ClkBakInit(void) {
+ Cy_SysClk_ClkBakSetSource(CY_SYSCLK_BAK_IN_WCO);
+}
+__STATIC_INLINE void Cy_SysClk_Dpll_Lp0_Init(void) {
+ #if !defined(CY_PDL_TZ_ENABLED)
+ if (Cy_SysClk_PllIsEnabled(SRSS_DPLL_LP_0_PATH_NUM)) {
+ return;
+ }
+ #endif
+
+ Cy_SysClk_PllDisable(SRSS_DPLL_LP_0_PATH_NUM);
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllManualConfigure(SRSS_DPLL_LP_0_PATH_NUM, &srss_0_clock_0_pll250m_0_pllConfig)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR);
+ }
+
+ #if (defined(CY_IP_MXS22SRSS_VERSION) && defined(CY_IP_MXS22SRSS_VERSION)) && \
+ ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0))
+ /* The workaround for devices with MXS22SRSS block 1.0 */
+ uint32_t clkHfMask = Cy_SysClk_ClkHfGetMaskOnPath((cy_en_clkhf_in_sources_t)SRSS_DPLL_LP_0_PATH_NUM);
+ if (clkHfMask) {
+ Cy_SysClk_ClkHfEnableDirectMuxWithMask(clkHfMask, true);
+ }
+ #endif /* ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0)) */
+
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllEnable(SRSS_DPLL_LP_0_PATH_NUM, 10000u)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR);
+ } else {
+ /* The workaround for devices with MXS22SRSS block 1.0 */
+ #if (defined(CY_IP_MXS22SRSS_VERSION) && defined(CY_IP_MXS22SRSS_VERSION)) && \
+ ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0))
+ Cy_SysLib_DelayUs(SRSS_DPLL_LP_INIT_DELAY_USEC);
+ Cy_SysClk_ClkHfEnableDirectMuxWithMask(clkHfMask, false);
+ #endif /* ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0)) */
+ }
+}
+__STATIC_INLINE void Cy_SysClk_Dpll_Lp1_Init(void) {
+ #if !defined(CY_PDL_TZ_ENABLED)
+ if (Cy_SysClk_PllIsEnabled(SRSS_DPLL_LP_1_PATH_NUM)) {
+ return;
+ }
+ #endif
+
+ Cy_SysClk_PllDisable(SRSS_DPLL_LP_1_PATH_NUM);
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllManualConfigure(SRSS_DPLL_LP_1_PATH_NUM, &srss_0_clock_0_pll250m_1_pllConfig)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR);
+ }
+
+ #if (defined(CY_IP_MXS22SRSS_VERSION) && defined(CY_IP_MXS22SRSS_VERSION)) && \
+ ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0))
+ /* The workaround for devices with MXS22SRSS block 1.0 */
+ uint32_t clkHfMask = Cy_SysClk_ClkHfGetMaskOnPath((cy_en_clkhf_in_sources_t)SRSS_DPLL_LP_1_PATH_NUM);
+ if (clkHfMask) {
+ Cy_SysClk_ClkHfEnableDirectMuxWithMask(clkHfMask, true);
+ }
+ #endif /* ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0)) */
+
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllEnable(SRSS_DPLL_LP_1_PATH_NUM, 10000u)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR);
+ } else {
+ /* The workaround for devices with MXS22SRSS block 1.0 */
+ #if (defined(CY_IP_MXS22SRSS_VERSION) && defined(CY_IP_MXS22SRSS_VERSION)) && \
+ ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0))
+ Cy_SysLib_DelayUs(SRSS_DPLL_LP_INIT_DELAY_USEC);
+ Cy_SysClk_ClkHfEnableDirectMuxWithMask(clkHfMask, false);
+ #endif /* ((CY_IP_MXS22SRSS_VERSION == 1) && (CY_IP_MXS22SRSS_VERSION_MINOR == 0)) */
+ }
+}
+__STATIC_INLINE void Cy_SysClk_Dpll_Hp0_Init(void) {
+ #if !defined(CY_PDL_TZ_ENABLED)
+ if (Cy_SysClk_PllIsEnabled(SRSS_DPLL_HP_0_PATH_NUM)) {
+ return;
+ }
+ #endif
+ Cy_SysClk_PllDisable(SRSS_DPLL_HP_0_PATH_NUM);
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllManualConfigure(SRSS_DPLL_HP_0_PATH_NUM, &srss_0_clock_0_pll500m_0_pllConfig)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR);
+ }
+ if (CY_SYSCLK_SUCCESS != Cy_SysClk_PllEnable(SRSS_DPLL_HP_0_PATH_NUM, 10000u)) {
+ cycfg_ClockStartupError(CY_CFG_SYSCLK_PLL_ERROR);
+ }
+}
+void init_cycfg_clocks(void) {
+ #if (CY_CFG_PWR_VBACKUP_USING_VDDD)
+ if (0u == Cy_SysLib_GetResetReason() /* POR, XRES, or BOD */) {
+ Cy_SysLib_ResetBackupDomain();
+ }
+ #endif /* CY_CFG_PWR_VBACKUP_USING_VDDD */
+
+ /* Set up a temporary fail-safe bypass for the IHO/IMO to the active core */
+ Cy_SysClk_IhoInit();
+ Cy_SysClk_ClkPathSetSource(CY_CFG_SYSCLK_FIRST_CLKPATH_DIRECT, CY_SYSCLK_CLKPATH_IN_IHO);
+ Cy_SysClk_ClkHfSetSource(CY_CFG_SYSCLK_ACTIVE_CORE_HF, CY_CFG_SYSCLK_FIRST_CLKPATH_DIRECT);
+ Cy_SysClk_ClkHfSetDivider(CY_CFG_SYSCLK_ACTIVE_CORE_HF, CY_SYSCLK_CLKHF_NO_DIVIDE);
+ /* Reset and configure platform clocks */
+ Cy_WDT_Unlock(); /* Unlock WDT to be able to modify LFCLK registers */
+ for (uint32_t pll = (CY_SRSS_NUM_PLL - 1); pll > 0UL; --pll) /* PLL 1 is the first PLL. 0 is invalid. */
+ {
+ (void)Cy_SysClk_PllDisable(pll);
+ }
+
+ /* Enable all source clocks */
+ Cy_SysClk_PiloInit();
+ Cy_SysClk_WcoInit();
+ Cy_SysClk_EcoInit();
+ Cy_SysClk_ClkLfInit();
+ Cy_SysClk_ExtClkInit();
+
+ /* Configure the path clocks, except for the fail-safe bypass for the IHO/IMO */
+ for (uint32_t i = 0; i < CY_SRSS_NUM_CLKPATH; i++)
+ {
+ if (i != CY_CFG_SYSCLK_FIRST_CLKPATH_DIRECT) {
+ Cy_SysClk_ClkPathSetSource(i, cycfg_clkpath_configs[i]);
+ }
+ }
+
+ /* Configure PLL clocks */
+
+ /* Configure the HF clocks, excluding the HF clock of the active core */
+ for (uint32_t i = 0U; i < CY_SRSS_NUM_HFROOT; i++)
+ {
+ if (i != CY_CFG_SYSCLK_ACTIVE_CORE_HF) {
+ const cycfg_clkhf_config_t *hfConfig = cycfg_clkhf_configs[i];
+ if (hfConfig != NULL) {
+ cycfg_SysClk_ClkHfInit(i, hfConfig->source, hfConfig->divider);
+ }
+ }
+ }
+ /* Configure miscellaneous clocks */
+ Cy_SysClk_ClkBakInit();
+ Cy_SysClk_Dpll_Hp0_Init();
+ #ifdef UPDATE_DPLL_LP_TRIM_VALUES
+ /* Workaround: update DPLL_LP trim values */
+ CY_SET_REG32(0x52403218, 0x921F190A); /* DPLL_LP0_TEST3 */
+ CY_SET_REG32(0x5240321C, 0x08100000); /* DPLL_LP0_TEST4 */
+ #endif
+ Cy_SysClk_Dpll_Lp0_Init();
+ #ifdef UPDATE_DPLL_LP_TRIM_VALUES
+ /* Workaround: update DPLL_LP trim values */
+ CY_SET_REG32(0x52403238, 0x921F190A); /* DPLL_LP1_TEST3 */
+ CY_SET_REG32(0x5240323C, 0x08100000); /* DPLL_LP1_TEST4 */
+ #endif
+ Cy_SysClk_Dpll_Lp1_Init();
+ /* Configure HF0 clock and disable any unused HF clocks */
+ for (uint32_t i = 0U; i < CY_SRSS_NUM_HFROOT; i++)
+ {
+ const cycfg_clkhf_config_t *hfConfig = cycfg_clkhf_configs[i];
+ if (hfConfig != NULL) {
+ if (i == CY_CFG_SYSCLK_ACTIVE_CORE_HF) {
+ cycfg_SysClk_ClkHfInit(i, hfConfig->source, hfConfig->divider);
+ }
+ } else {
+ (void)Cy_SysClk_ClkHfDisable(i);
+ }
+ }
+ /* Configure the path clocks used for the fail-safe bypass for the IHO/IMO */
+ Cy_SysClk_ClkPathSetSource(CY_CFG_SYSCLK_FIRST_CLKPATH_DIRECT, cycfg_clkpath_configs[CY_CFG_SYSCLK_FIRST_CLKPATH_DIRECT]);
+ #ifdef CY_CFG_SYSCLK_CLKALTSYSTICK_ENABLED
+ Cy_SysClk_ClkAltSysTickInit();
+ #endif
+
+ /* Configure default enabled clocks */
+ /* Disable unused clock sources */
+ /* Wait 4 ILO cycles in case of unfinished CLKLF clock source transition */
+ Cy_SysLib_DelayUs(200U);
+
+ /* Update System configuration based on clock configuration */
+ SystemCoreClockUpdate();
+
+ /* Configure clock supervisors */
+ for (uint32_t i = 0U; i < CY_SRSS_NUM_HFROOT; i++)
+ {
+ const cycfg_clkhf_csv_config_t *hfCsvConfig = cycfg_clkhf_csv_configs[i];
+ if (hfCsvConfig != NULL) {
+ cycfg_SysClk_ClkHfCsvInit(i, hfCsvConfig->refClk, hfCsvConfig->accuracy, hfCsvConfig->action);
+ } else {
+ Cy_SysClk_ClkHfCsvDisable(i);
+ }
+ }
+
+
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clocks.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clocks.h
new file mode 100644
index 00000000000..18855bfc7cc
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_clocks.h
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * File Name: cycfg_clocks.h
+ *
+ * Description:
+ * Clock configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_CLOCKS_H)
+#define CYCFG_CLOCKS_H
+
+#include "cycfg_notices.h"
+#include "cy_sysclk.h"
+#include "cy_wdt.h"
+#include "cycfg_clock_types.h"
+#include "cy_rtc.h"
+#include "cy_gpio.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define CYBSP_RTC_ENABLED 1U
+#define CYBSP_RTC_10_MONTH_OFFSET (28U)
+#define CYBSP_RTC_MONTH_OFFSET (24U)
+#define CYBSP_RTC_10_DAY_OFFSET (20U)
+#define CYBSP_RTC_DAY_OFFSET (16U)
+#define CYBSP_RTC_1000_YEAR_OFFSET (12U)
+#define CYBSP_RTC_100_YEAR_OFFSET (8U)
+#define CYBSP_RTC_10_YEAR_OFFSET (4U)
+#define CYBSP_RTC_YEAR_OFFSET (0U)
+#define srss_0_clock_0_eco_0_ENABLED 1U
+#define srss_0_clock_0_ext_0_ENABLED 1U
+#define srss_0_clock_0_iho_0_ENABLED 1U
+#define srss_0_clock_0_wco_0_ENABLED 1U
+#define srss_0_clock_0_timerclk_0_ENABLED 1U
+#define srss_0_clock_0_pilo_0_ENABLED 1U
+#define srss_0_clock_0_lfclk_0_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKLF_FREQ_HZ 32768
+#define CY_CFG_SYSCLK_CLKLF_SOURCE CY_SYSCLK_CLKLF_IN_PILO
+#define srss_0_clock_0_pathmux_0_ENABLED 1U
+#define srss_0_clock_0_pathmux_1_ENABLED 1U
+#define srss_0_clock_0_pathmux_2_ENABLED 1U
+#define srss_0_clock_0_pathmux_3_ENABLED 1U
+#define srss_0_clock_0_pathmux_4_ENABLED 1U
+#define srss_0_clock_0_pathmux_5_ENABLED 1U
+#define srss_0_clock_0_bakclk_0_ENABLED 1U
+#define srss_0_clock_0_pll250m_0_ENABLED 1U
+#define srss_0_clock_0_pll250m_1_ENABLED 1U
+#define srss_0_clock_0_pll500m_0_ENABLED 1U
+#define srss_0_clock_0_hfclk_0_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF0 0UL
+#define srss_0_clock_0_hfclk_1_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF1 1UL
+#define srss_0_clock_0_hfclk_2_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF2 2UL
+#define srss_0_clock_0_hfclk_3_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF3 3UL
+#define srss_0_clock_0_hfclk_4_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF4 4UL
+#define srss_0_clock_0_hfclk_5_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF5 5UL
+#define srss_0_clock_0_hfclk_6_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF6 6UL
+#define srss_0_clock_0_hfclk_7_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF7 7UL
+#define srss_0_clock_0_hfclk_8_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF8 8UL
+#define srss_0_clock_0_hfclk_9_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF9 9UL
+#define srss_0_clock_0_hfclk_10_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF10 10UL
+#define srss_0_clock_0_hfclk_11_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF11 11UL
+#define srss_0_clock_0_hfclk_12_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF12 12UL
+#define srss_0_clock_0_hfclk_13_ENABLED 1U
+#define CY_CFG_SYSCLK_CLKHF13 13UL
+
+extern const cy_stc_rtc_config_t CYBSP_RTC_config;
+extern const cycfg_clkhf_config_t cycfg_hf0Config;
+extern const cycfg_clkhf_config_t cycfg_hf1Config;
+extern const cycfg_clkhf_config_t cycfg_hf2Config;
+extern const cycfg_clkhf_config_t cycfg_hf3Config;
+extern const cycfg_clkhf_config_t cycfg_hf4Config;
+extern const cycfg_clkhf_config_t cycfg_hf5Config;
+extern const cycfg_clkhf_config_t cycfg_hf6Config;
+extern const cycfg_clkhf_config_t cycfg_hf7Config;
+extern const cycfg_clkhf_config_t cycfg_hf8Config;
+extern const cycfg_clkhf_config_t cycfg_hf9Config;
+extern const cycfg_clkhf_config_t cycfg_hf10Config;
+extern const cycfg_clkhf_config_t cycfg_hf11Config;
+extern const cycfg_clkhf_config_t cycfg_hf12Config;
+extern const cycfg_clkhf_config_t cycfg_hf13Config;
+
+void init_cycfg_ns_clocks(void);
+void init_cycfg_clocks(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_CLOCKS_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_connectivity_bt.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_connectivity_bt.h
new file mode 100644
index 00000000000..b61fbba9c03
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_connectivity_bt.h
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * File Name: cycfg_connectivity_bt.h
+ *
+ * Description:
+ * Connectivity BT configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_CONNECTIVITY_BT_H)
+#define CYCFG_CONNECTIVITY_BT_H
+
+#include "cycfg_notices.h"
+#include "cycfg_pins.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define bt_0_power_0_ENABLED 1U
+#define CYCFG_BT_LP_ENABLED (1u)
+#define CYCFG_BT_WAKE_EVENT_ACTIVE_LOW (0)
+#define CYCFG_BT_WAKE_EVENT_ACTIVE_HIGH (1)
+#define CYCFG_BT_HOST_WAKE_GPIO CYBSP_BT_HOST_WAKE_HAL_PORT_PIN
+#define CYCFG_BT_HOST_WAKE_IRQ_EVENT CYCFG_BT_WAKE_EVENT_ACTIVE_HIGH
+#define CYCFG_BT_DEV_WAKE_GPIO CYBSP_BT_DEVICE_WAKE_HAL_PORT_PIN
+#define CYCFG_BT_DEV_WAKE_POLARITY CYCFG_BT_WAKE_EVENT_ACTIVE_LOW
+#define CYCFG_BT_HOST_WAKE_PORT_NUM CYBSP_BT_HOST_WAKE_HAL_PORT_PIN
+#define CYCFG_BT_HOST_WAKE_PIN CYCFG_BT_WAKE_EVENT_ACTIVE_HIGH
+#define CYCFG_BT_DEVICE_WAKE_PORT_NUM CYBSP_BT_HOST_WAKE_HAL_PORT_PIN
+#define CYCFG_BT_DEVICE_WAKE_PIN CYCFG_BT_WAKE_EVENT_ACTIVE_HIGH
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_CONNECTIVITY_BT_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_connectivity_wifi.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_connectivity_wifi.h
new file mode 100644
index 00000000000..2de04102a17
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_connectivity_wifi.h
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * File Name: cycfg_connectivity_wifi.h
+ *
+ * Description:
+ * Connectivity Wi-Fi configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_CONNECTIVITY_WIFI_H)
+#define CYCFG_CONNECTIVITY_WIFI_H
+
+#include "cycfg_notices.h"
+#include "cycfg_pins.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define wifi_0_power_0_ENABLED 1U
+#define CYCFG_WIFI_HOST_WAKE_ENABLED (1u)
+#define CYCFG_WIFI_HOST_WAKE_GPIO CYBSP_WIFI_HOST_WAKE_HAL_PORT_PIN
+#define CYCFG_WIFI_HOST_WAKE_IRQ_EVENT CYBSP_WIFI_HOST_WAKE_HAL_IRQ
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_CONNECTIVITY_WIFI_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_dmas.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_dmas.c
new file mode 100644
index 00000000000..da8e659eca3
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_dmas.c
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * File Name: cycfg_dmas.c
+ *
+ * Description:
+ * DMA configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_dmas.h"
+
+const cy_stc_dma_descriptor_config_t CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0_config =
+{
+ .retrigger = CY_DMA_RETRIG_IM,
+ .interruptType = CY_DMA_DESCR,
+ .triggerOutType = CY_DMA_DESCR,
+ .channelState = CY_DMA_CHANNEL_DISABLED,
+ .triggerInType = CY_DMA_1ELEMENT,
+ .dataSize = CY_DMA_BYTE,
+ .srcTransferSize = CY_DMA_TRANSFER_SIZE_WORD,
+ .dstTransferSize = CY_DMA_TRANSFER_SIZE_DATA,
+ .descriptorType = CY_DMA_2D_TRANSFER,
+ .srcAddress = NULL,
+ .dstAddress = NULL,
+ .srcXincrement = 0,
+ .dstXincrement = 1,
+ .xCount = 160,
+ .srcYincrement = 0,
+ .dstYincrement = 160,
+ .yCount = 4,
+ .nextDescriptor = &CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0,
+};
+CY_SECTION(".cy_socmem_data") CY_ALIGN(8) cy_stc_dma_descriptor_t CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0 =
+{
+ .ctl = 0UL,
+ .src = 0UL,
+ .dst = 0UL,
+ .xCtl = 0UL,
+ .yCtl = 0UL,
+ .nextPtr = 0UL,
+};
+const cy_stc_dma_channel_config_t CYBSP_DMA_DVP_CAM_CONTROLLER_channelConfig =
+{
+ .descriptor = &CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0,
+ .preemptable = false,
+ .priority = 3,
+ .enable = false,
+ .bufferable = true,
+};
+const cy_stc_dma_crc_config_t CYBSP_DMA_DVP_CAM_CONTROLLER_crcConfig =
+{
+ .dataReverse = false,
+ .dataXor = 0,
+ .reminderReverse = false,
+ .reminderXor = 0,
+ .polynomial = 79764919,
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA)
+const mtb_hal_dma_configurator_t CYBSP_DMA_DVP_CAM_CONTROLLER_hal_config =
+{
+ .dma_type = MTB_HAL_DMA_DW,
+ .channel = CYBSP_DMA_DVP_CAM_CONTROLLER_CHANNEL,
+ .dw_base = CYBSP_DMA_DVP_CAM_CONTROLLER_HW,
+ .dw_descriptor = &CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA) */
+
+const cy_stc_dma_descriptor_config_t CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0_config =
+{
+ .retrigger = CY_DMA_RETRIG_IM,
+ .interruptType = CY_DMA_DESCR,
+ .triggerOutType = CY_DMA_1ELEMENT,
+ .channelState = CY_DMA_CHANNEL_DISABLED,
+ .triggerInType = CY_DMA_1ELEMENT,
+ .dataSize = CY_DMA_BYTE,
+ .srcTransferSize = CY_DMA_TRANSFER_SIZE_DATA,
+ .dstTransferSize = CY_DMA_TRANSFER_SIZE_WORD,
+ .descriptorType = CY_DMA_1D_TRANSFER,
+ .srcAddress = NULL,
+ .dstAddress = NULL,
+ .srcXincrement = 1,
+ .dstXincrement = 0,
+ .xCount = 12,
+ .srcYincrement = 0,
+ .dstYincrement = 0,
+ .yCount = 1,
+ .nextDescriptor = &CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0,
+};
+CY_SECTION(".cy_socmem_data") CY_ALIGN(8) cy_stc_dma_descriptor_t CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0 =
+{
+ .ctl = 0UL,
+ .src = 0UL,
+ .dst = 0UL,
+ .xCtl = 0UL,
+ .yCtl = 0UL,
+ .nextPtr = 0UL,
+};
+const cy_stc_dma_channel_config_t CYBSP_DMA_TX_SPI_CONTROLLER_channelConfig =
+{
+ .descriptor = &CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0,
+ .preemptable = false,
+ .priority = 3,
+ .enable = false,
+ .bufferable = false,
+};
+const cy_stc_dma_crc_config_t CYBSP_DMA_TX_SPI_CONTROLLER_crcConfig =
+{
+ .dataReverse = false,
+ .dataXor = 0,
+ .reminderReverse = false,
+ .reminderXor = 0,
+ .polynomial = 79764919,
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA)
+const mtb_hal_dma_configurator_t CYBSP_DMA_TX_SPI_CONTROLLER_hal_config =
+{
+ .dma_type = MTB_HAL_DMA_DW,
+ .channel = CYBSP_DMA_TX_SPI_CONTROLLER_CHANNEL,
+ .dw_base = CYBSP_DMA_TX_SPI_CONTROLLER_HW,
+ .dw_descriptor = &CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA) */
+
+const cy_stc_axidmac_descriptor_config_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0_config =
+{
+ .retrigger = CY_AXIDMAC_WAIT_FOR_REACT,
+ .interruptType = CY_AXIDMAC_DESCR,
+ .triggerOutType = CY_AXIDMAC_DESCR,
+ .channelState = CY_AXIDMAC_CHANNEL_DISABLED,
+ .triggerInType = CY_AXIDMAC_M_LOOP,
+ .dataPrefetch = false,
+ .descriptorType = CY_AXIDMAC_3D_MEMORY_COPY,
+ .srcAddress = NULL,
+ .dstAddress = NULL,
+ .mCount = 640,
+ .srcXincrement = 640,
+ .dstXincrement = 640,
+ .xCount = 2,
+ .srcYincrement = 0,
+ .dstYincrement = 1280,
+ .yCount = 120,
+ .nextDescriptor = &CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0,
+};
+CY_SECTION(".cy_socmem_data") CY_ALIGN(8) cy_stc_axidmac_descriptor_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0 =
+{
+ .ctl = 0UL,
+ .src = 0UL,
+ .dst = 0UL,
+ .mSize = 0UL,
+ .xSize = 0UL,
+ .xIncr = 0UL,
+ .ySize = 0UL,
+ .yIncr = 0UL,
+ .nextPtr = 0UL,
+};
+const cy_stc_axidmac_channel_config_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_channelConfig =
+{
+ .descriptor = &CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0,
+ .priority = 3,
+ .enable = false,
+ .bufferable = false,
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA)
+const mtb_hal_dma_configurator_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_hal_config =
+{
+ .dma_type = MTB_HAL_DMA_DMAC,
+ .channel = CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_CHANNEL,
+ .dmac_base = CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_HW,
+ .dmac_descriptor = &CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA) */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_dmas.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_dmas.h
new file mode 100644
index 00000000000..6f56ab3208e
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_dmas.h
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * File Name: cycfg_dmas.h
+ *
+ * Description:
+ * DMA configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_DMAS_H)
+#define CYCFG_DMAS_H
+
+#include "cycfg_notices.h"
+#include "cy_dma.h"
+#include "cy_axidmac.h"
+
+#if defined(COMPONENT_MTB_HAL)
+#include "mtb_hal.h"
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define CYBSP_DMA_DVP_CAM_CONTROLLER_ENABLED 1U
+#define CYBSP_DMA_DVP_CAM_CONTROLLER_HW DW0
+#define CYBSP_DMA_DVP_CAM_CONTROLLER_CHANNEL 0U
+#define CYBSP_DMA_DVP_CAM_CONTROLLER_IRQ cpuss_interrupts_dw0_0_IRQn
+#define CYBSP_DMA_TX_SPI_CONTROLLER_ENABLED 1U
+#define CYBSP_DMA_TX_SPI_CONTROLLER_HW DW0
+#define CYBSP_DMA_TX_SPI_CONTROLLER_CHANNEL 1U
+#define CYBSP_DMA_TX_SPI_CONTROLLER_IRQ cpuss_interrupts_dw0_1_IRQn
+#define CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_ENABLED 1U
+#define CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_HW SAXI_DMAC
+#define CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_CHANNEL 0U
+#define CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_IRQ m55appcpuss_interrupts_axidmac_0_IRQn
+
+extern const cy_stc_dma_descriptor_config_t CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0_config;
+extern CY_SECTION(".cy_socmem_data") CY_ALIGN(8) cy_stc_dma_descriptor_t CYBSP_DMA_DVP_CAM_CONTROLLER_Descriptor_0;
+extern const cy_stc_dma_channel_config_t CYBSP_DMA_DVP_CAM_CONTROLLER_channelConfig;
+extern const cy_stc_dma_crc_config_t CYBSP_DMA_DVP_CAM_CONTROLLER_crcConfig;
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA)
+extern const mtb_hal_dma_configurator_t CYBSP_DMA_DVP_CAM_CONTROLLER_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA) */
+
+extern const cy_stc_dma_descriptor_config_t CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0_config;
+extern CY_SECTION(".cy_socmem_data") CY_ALIGN(8) cy_stc_dma_descriptor_t CYBSP_DMA_TX_SPI_CONTROLLER_Descriptor_0;
+extern const cy_stc_dma_channel_config_t CYBSP_DMA_TX_SPI_CONTROLLER_channelConfig;
+extern const cy_stc_dma_crc_config_t CYBSP_DMA_TX_SPI_CONTROLLER_crcConfig;
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA)
+extern const mtb_hal_dma_configurator_t CYBSP_DMA_TX_SPI_CONTROLLER_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA) */
+
+extern const cy_stc_axidmac_descriptor_config_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0_config;
+extern CY_SECTION(".cy_socmem_data") CY_ALIGN(8) cy_stc_axidmac_descriptor_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_Descriptor_0;
+extern const cy_stc_axidmac_channel_config_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_channelConfig;
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA)
+extern const mtb_hal_dma_configurator_t CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_DMA) */
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_DMAS_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_memory.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_memory.h
new file mode 100644
index 00000000000..8cb98f418df
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_memory.h
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * File Name: cycfg_memory.h
+ *
+ * Description:
+ * Memory configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_MEMORY_H)
+#define CYCFG_MEMORY_H
+
+#include "cycfg_notices.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define vres_0_memory_region_data_0_ENABLED 1U
+#define vres_0_memory_region_data_1_ENABLED 1U
+#define vres_0_memory_region_data_2_ENABLED 1U
+#define vres_0_memory_region_data_3_ENABLED 1U
+#define vres_0_memory_region_data_4_ENABLED 1U
+#define vres_0_memory_region_data_5_ENABLED 1U
+#define vres_0_memory_region_data_6_ENABLED 1U
+#define vres_0_memory_region_data_7_ENABLED 1U
+#define vres_0_memory_region_data_8_ENABLED 1U
+#define vres_0_memory_region_data_9_ENABLED 1U
+#define vres_0_memory_region_data_10_ENABLED 1U
+#define vres_0_memory_region_data_11_ENABLED 1U
+#define vres_0_memory_region_data_12_ENABLED 1U
+#define vres_0_memory_region_data_13_ENABLED 1U
+#define vres_0_memory_region_data_14_ENABLED 1U
+#define vres_0_memory_region_data_15_ENABLED 1U
+#define vres_0_memory_region_data_16_ENABLED 1U
+#define vres_0_memory_region_data_17_ENABLED 1U
+#define vres_0_memory_region_data_18_ENABLED 1U
+#define vres_0_memory_region_data_19_ENABLED 1U
+#define vres_0_memory_region_data_20_ENABLED 1U
+#define vres_0_memory_region_data_21_ENABLED 1U
+#define vres_0_memory_region_data_22_ENABLED 1U
+#define vres_0_memory_region_data_23_ENABLED 1U
+#define vres_0_memory_region_data_24_ENABLED 1U
+#define vres_0_memory_0_ENABLED 1U
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_MEMORY_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_notices.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_notices.h
new file mode 100644
index 00000000000..5faea957171
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_notices.h
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * File Name: cycfg_notices.h
+ *
+ * Description:
+ * Contains warnings and errors that occurred while generating code for the
+ * design.
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_NOTICES_H)
+#define CYCFG_NOTICES_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#if defined(CY_SUPPORTS_DEVICE_VALIDATION)
+#if !defined(PSE846GPS2DBZC4A)
+#error "Unexpected MPN; expected DEVICE:=PSE846GPS2DBZC4A. There may be an inconsistency between the *.modus file and the makefile target configuration device sets."
+#endif /* !defined(PSE846GPS2DBZC4A) */
+#endif /* defined(CY_SUPPORTS_DEVICE_VALIDATION) */
+
+#if defined(CY_SUPPORTS_COMPLETE_DEVICE_VALIDATION)
+#if !defined(PSE846GPS2DBZC4A)
+#error "Unexpected MPN; expected DEVICE:=PSE846GPS2DBZC4A, ADDITIONAL_DEVICES:=CYW55513IUBG. There may be an inconsistency between the *.modus file and the makefile target configuration device sets."
+#endif /* !defined(PSE846GPS2DBZC4A) */
+#if !defined(CYW55513IUBG)
+#error "Unexpected MPN; expected DEVICE:=PSE846GPS2DBZC4A, ADDITIONAL_DEVICES:=CYW55513IUBG. There may be an inconsistency between the *.modus file and the makefile target configuration device sets."
+#endif /* !defined(CYW55513IUBG) */
+#endif /* defined(CY_SUPPORTS_COMPLETE_DEVICE_VALIDATION) */
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_NOTICES_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripheral_clocks.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripheral_clocks.c
new file mode 100644
index 00000000000..1629bbd8abc
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripheral_clocks.c
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * File Name: cycfg_peripheral_clocks.c
+ *
+ * Description:
+ * Peripheral clock divider configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_peripheral_clocks.h"
+
+void init_cycfg_peripheral_clocks(void) {
+ Cy_SysClk_PeriGroupSetDivider((0 << 8) | 2, 1U);
+ Cy_SysClk_PeriGroupSetDivider((1 << 8) | 1, 1U);
+ Cy_SysClk_PeriGroupSetDivider((1 << 8) | 3, 3U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U, 31U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 1U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 1U, 0U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 1U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 2U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 2U, 0U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 2U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_PWM_DT_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 3U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_PWM_DT_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 3U, 249U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_PWM_DT_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 3U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 0U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 0U, 9U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 1U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 1U, 86U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 1U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 2U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 2U, 9999U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 2U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 3U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 3U, 49999U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_BIT, 3U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_BT_UART_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriPclkSetFracDivider((en_clk_dst_t)CYBSP_BT_UART_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U, 107U, 16U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_BT_UART_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 1U);
+ Cy_SysClk_PeriPclkSetFracDivider((en_clk_dst_t)CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 1U, 3U, 5U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 1U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_SMART_IO_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_24_5_BIT, 0U);
+ Cy_SysClk_PeriPclkSetFracDivider((en_clk_dst_t)CYBSP_SMART_IO_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_24_5_BIT, 0U, 505049U, 0U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_SMART_IO_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_24_5_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_TRACE_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriPclkSetFracDivider((en_clk_dst_t)CYBSP_TRACE_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U, 0U, 0U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_TRACE_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U, 7U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriPclkSetFracDivider((en_clk_dst_t)CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U, 23U, 0U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_PDM_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 1U);
+ Cy_SysClk_PeriPclkSetFracDivider((en_clk_dst_t)CYBSP_PDM_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 1U, 3U, 0U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_PDM_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_16_5_BIT, 1U);
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_SDHC_0_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_SDHC_0_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U, 1U);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_SDHC_0_CLK_DIV_GRP_NUM, CY_SYSCLK_DIV_8_BIT, 0U);
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripheral_clocks.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripheral_clocks.h
new file mode 100644
index 00000000000..182e8cc1374
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripheral_clocks.h
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * File Name: cycfg_peripheral_clocks.h
+ *
+ * Description:
+ * Peripheral clock divider configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_PERIPHERAL_CLOCKS_H)
+#define CYCFG_PERIPHERAL_CLOCKS_H
+
+#include "cycfg_notices.h"
+#include "cy_sysclk.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define peri_0_mmio_0_ENABLED 1U
+#define peri_1_mmio_0_ENABLED 1U
+#define CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_NUM 0U
+#define CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM)
+#define CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_SPI_CONTROLLER_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_SPI_CONTROLLER_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_SPI_CONTROLLER_CLK_DIV_NUM 1U
+#define CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM)
+#define CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_SPI_CONTROLLER_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_USB_OS_TIMER_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_USB_OS_TIMER_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_USB_OS_TIMER_CLK_DIV_NUM 2U
+#define CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM)
+#define CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_USB_OS_TIMER_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_PWM_DT_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_PWM_DT_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_PWM_DT_CLK_DIV_NUM 3U
+#define CYBSP_PWM_DT_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_PWM_DT_CLK_DIV_GRP_NUM)
+#define CYBSP_PWM_DT_CLK_DIV_GRP_NUM CYBSP_PWM_DT_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_PWM_DT_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_I2C_CONTROLLER_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_I2C_CONTROLLER_CLK_DIV_HW CY_SYSCLK_DIV_16_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_I2C_CONTROLLER_CLK_DIV_NUM 0U
+#define CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM)
+#define CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_DEBUG_UART_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_DEBUG_UART_CLK_DIV_HW CY_SYSCLK_DIV_16_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_DEBUG_UART_CLK_DIV_NUM 1U
+#define CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM)
+#define CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_HW CY_SYSCLK_DIV_16_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_NUM 2U
+#define CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM)
+#define CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_PWM_LED_CTRL_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_PWM_LED_CTRL_CLK_DIV_HW CY_SYSCLK_DIV_16_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_PWM_LED_CTRL_CLK_DIV_NUM 3U
+#define CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM)
+#define CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_BT_UART_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_BT_UART_CLK_DIV_HW CY_SYSCLK_DIV_16_5_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_BT_UART_CLK_DIV_NUM 0U
+#define CYBSP_BT_UART_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_BT_UART_CLK_DIV_GRP_NUM)
+#define CYBSP_BT_UART_CLK_DIV_GRP_NUM CYBSP_BT_UART_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_BT_UART_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_HW CY_SYSCLK_DIV_16_5_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_NUM 1U
+#define CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM)
+#define CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_PWM_DVP_CAM_CTRL_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_SMART_IO_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_SMART_IO_CLK_DIV_HW CY_SYSCLK_DIV_24_5_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_SMART_IO_CLK_DIV_NUM 0U
+#define CYBSP_SMART_IO_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_SMART_IO_CLK_DIV_GRP_NUM)
+#define CYBSP_SMART_IO_CLK_DIV_GRP_NUM CYBSP_SMART_IO_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_SMART_IO_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_TRACE_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_TRACE_CLK_DIV_HW CY_SYSCLK_DIV_16_5_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_TRACE_CLK_DIV_NUM 0U
+#define CYBSP_TRACE_CLK_DIV_GRP_NUM ((7U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_TRACE_CLK_DIV_GRP_NUM)
+#define CYBSP_TRACE_CLK_DIV_GRP_NUM CYBSP_TRACE_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_TRACE_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_I3C_CONTROLLER_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_I3C_CONTROLLER_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_I3C_CONTROLLER_CLK_DIV_NUM 0U
+#define CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM ((9U << PERI_PCLK_GR_NUM_Pos) | (0U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM)
+#define CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_I3C_CONTROLLER_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_TDM_CONTROLLER_0_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_TDM_CONTROLLER_0_CLK_DIV_HW CY_SYSCLK_DIV_16_5_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_TDM_CONTROLLER_0_CLK_DIV_NUM 0U
+#define CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (1U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM)
+#define CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_TDM_CONTROLLER_0_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_PDM_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_PDM_CLK_DIV_HW CY_SYSCLK_DIV_16_5_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_PDM_CLK_DIV_NUM 1U
+#define CYBSP_PDM_CLK_DIV_GRP_NUM ((1U << PERI_PCLK_GR_NUM_Pos) | (1U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_PDM_CLK_DIV_GRP_NUM)
+#define CYBSP_PDM_CLK_DIV_GRP_NUM CYBSP_PDM_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_PDM_CLK_DIV_GRP_NUM) */
+
+#define CYBSP_SDHC_0_CLK_DIV_ENABLED 1U
+
+#if !defined(CY_USING_HAL) && !defined(CY_USING_HAL_LITE)
+#define CYBSP_SDHC_0_CLK_DIV_HW CY_SYSCLK_DIV_8_BIT
+#endif /* !defined (CY_USING_HAL) && !defined (CY_USING_HAL_LITE) */
+
+#define CYBSP_SDHC_0_CLK_DIV_NUM 0U
+#define CYBSP_SDHC_0_CLK_DIV_GRP_NUM ((2U << PERI_PCLK_GR_NUM_Pos) | (1U << PERI_PCLK_INST_NUM_Pos))
+
+#if !defined(CYBSP_SDHC_0_CLK_DIV_GRP_NUM)
+#define CYBSP_SDHC_0_CLK_DIV_GRP_NUM CYBSP_SDHC_0_CLK_DIV_GRP_NUM
+#endif /* !defined (CYBSP_SDHC_0_CLK_DIV_GRP_NUM) */
+
+void init_cycfg_peripheral_clocks(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_PERIPHERAL_CLOCKS_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripherals.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripherals.c
new file mode 100644
index 00000000000..bf046412ae5
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripherals.c
@@ -0,0 +1,1338 @@
+/*******************************************************************************
+ * File Name: cycfg_peripherals.c
+ *
+ * Description:
+ * Analog configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_peripherals.h"
+
+#define CYBSP_PWM_LED_CTRL_INPUT_DISABLED 0x7U
+#define emUSB_OS_Timer_INPUT_DISABLED 0x7U
+#define CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED 0x7U
+#define CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED 0x7U
+#define CYBSP_DEAD_TIME_PWM_INPUT_DISABLED 0x7U
+
+cy_stc_autanalog_cfg_t autonomous_analog_cfg =
+{
+ .prb = NULL,
+ .ac = &CYBSP_AUTONOMOUS_CONTROLLER_cfg,
+ .ctb =
+ {
+ NULL,
+ NULL,
+ },
+ .ptcomp =
+ {
+ NULL,
+ },
+ .dac =
+ {
+ NULL,
+ NULL,
+ },
+ .sar =
+ {
+ &CYBSP_SAR_ADC_cfg,
+ },
+};
+cy_stc_autanalog_stt_t autonomous_analog_stt[] =
+{
+ {
+ .ac = &CYBSP_AUTONOMOUS_CONTROLLER_stt[0U],
+ .prb = NULL,
+ .ctb =
+ {
+ NULL,
+ NULL,
+ },
+ .ptcomp =
+ {
+ NULL,
+ },
+ .dac =
+ {
+ NULL,
+ NULL,
+ },
+ .sar =
+ {
+ &CYBSP_SAR_ADC_stt[0U],
+ },
+ },
+ {
+ .ac = &CYBSP_AUTONOMOUS_CONTROLLER_stt[1U],
+ .prb = NULL,
+ .ctb =
+ {
+ NULL,
+ NULL,
+ },
+ .ptcomp =
+ {
+ NULL,
+ },
+ .dac =
+ {
+ NULL,
+ NULL,
+ },
+ .sar =
+ {
+ &CYBSP_SAR_ADC_stt[1U],
+ },
+ },
+ {
+ .ac = &CYBSP_AUTONOMOUS_CONTROLLER_stt[2U],
+ .prb = NULL,
+ .ctb =
+ {
+ NULL,
+ NULL,
+ },
+ .ptcomp =
+ {
+ NULL,
+ },
+ .dac =
+ {
+ NULL,
+ NULL,
+ },
+ .sar =
+ {
+ &CYBSP_SAR_ADC_stt[2U],
+ },
+ },
+};
+cy_stc_autanalog_t autonomous_analog_init =
+{
+ .configuration = &autonomous_analog_cfg,
+ .numSttEntries = sizeof(autonomous_analog_stt) / sizeof(autonomous_analog_stt[0U]),
+ .stateTransitionTable = &autonomous_analog_stt[0U],
+};
+cy_en_autanalog_ac_out_trigger_mask_t CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[] =
+{
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+ CY_AUTANALOG_AC_OUT_TRIG_MASK_EMPTY,
+};
+cy_stc_autanalog_ac_t CYBSP_AUTONOMOUS_CONTROLLER_cfg =
+{
+ .gpioOutEn =
+ CY_AUTANALOG_STT_AC_GPIO_OUT_DISABLED,
+ .mask =
+ {
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[0U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[1U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[2U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[3U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[4U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[5U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[6U],
+ &CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[7U],
+ },
+ .timer =
+ {
+ .enable = false,
+ .clkSrc = CY_AUTANALOG_TIMER_CLK_LP,
+ .period = 0U,
+ },
+};
+cy_stc_autanalog_stt_ac_t CYBSP_AUTONOMOUS_CONTROLLER_stt[] =
+{
+ {
+ .unlock = true,
+ .lpMode = false,
+ .condition = CY_AUTANALOG_STT_AC_CONDITION_BLOCK_READY,
+ .action = CY_AUTANALOG_STT_AC_ACTION_WAIT_FOR,
+ .branchState = 1U,
+ .trigInt = false,
+ .count = 0U,
+ .unlockGpioOut = false,
+ .gpioOut = CY_AUTANALOG_STT_AC_GPIO_OUT_DISABLED,
+ },
+ {
+ .unlock = false,
+ .lpMode = false,
+ .condition = CY_AUTANALOG_STT_AC_CONDITION_SAR_DONE,
+ .action = CY_AUTANALOG_STT_AC_ACTION_WAIT_FOR,
+ .branchState = 0U,
+ .trigInt = false,
+ .count = 0U,
+ .unlockGpioOut = false,
+ .gpioOut = CY_AUTANALOG_STT_AC_GPIO_OUT_DISABLED,
+ },
+ {
+ .unlock = false,
+ .lpMode = false,
+ .condition = CY_AUTANALOG_STT_AC_CONDITION_FALSE,
+ .action = CY_AUTANALOG_STT_AC_ACTION_STOP,
+ .branchState = 0U,
+ .trigInt = false,
+ .count = 0U,
+ .unlockGpioOut = false,
+ .gpioOut = CY_AUTANALOG_STT_AC_GPIO_OUT_DISABLED,
+ },
+};
+cy_stc_autanalog_sar_hs_chan_t CYBSP_SAR_ADC_gpio_ch_cfg[] =
+{
+ {
+ .posPin = CY_AUTANALOG_SAR_PIN_GPIO1,
+ .hsDiffEn = false,
+ .sign = false,
+ .posCoeff = CY_AUTANALOG_SAR_CH_COEFF_DISABLED,
+ .negPin = CY_AUTANALOG_SAR_PIN_GPIO0,
+ .accShift = false,
+ .negCoeff = CY_AUTANALOG_SAR_CH_COEFF_DISABLED,
+ .hsLimit = CY_AUTANALOG_SAR_LIMIT_STATUS_DISABLED,
+ .fifoSel = CY_AUTANALOG_FIFO_DISABLED,
+ },
+};
+cy_stc_autanalog_sar_sta_hs_t CYBSP_SAR_ADC_sta_hs_cfg =
+{
+ .hsVref = CY_AUTANALOG_SAR_VREF_VDDA,
+ .hsSampleTime =
+ {
+ 31U,
+ 31U,
+ 31U,
+ 31U,
+ },
+ .hsGpioChan =
+ {
+ &CYBSP_SAR_ADC_gpio_ch_cfg[0U],
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ },
+ .hsGpioResultMask =
+ CY_AUTANALOG_SAR_CHAN_MASK_GPIO0,
+};
+cy_stc_autanalog_sar_sta_t CYBSP_SAR_ADC_sta_cfg =
+{
+ .lpStaCfg = NULL,
+ .hsStaCfg = &CYBSP_SAR_ADC_sta_hs_cfg,
+ .posBufPwr = CY_AUTANALOG_SAR_BUF_PWR_OFF,
+ .negBufPwr = CY_AUTANALOG_SAR_BUF_PWR_OFF,
+ .accMode = CY_AUTANALOG_SAR_ACC_DISABLED,
+ .startupCal = CY_AUTANALOG_SAR_CAL_DISABLED,
+ .chanID = false,
+ .shiftMode = false,
+ .intMuxChan =
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ },
+ .limitCond =
+ {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ },
+ .muxResultMask =
+ CY_AUTANALOG_SAR_CHAN_MASK_MUX_DISABLED,
+ .firResultMask =
+ CY_AUTANALOG_SAR_MASK_FIR_DISABLED,
+};
+cy_stc_autanalog_sar_seq_tab_hs_t CYBSP_SAR_ADC_seq_hs_cfg[] =
+{
+ {
+ .chanEn = CY_AUTANALOG_SAR_CHAN_MASK_GPIO0,
+ .muxMode = CY_AUTANALOG_SAR_CHAN_CFG_MUX_DISABLED,
+ .mux0Sel = CY_AUTANALOG_SAR_CHAN_CFG_MUX0,
+ .mux1Sel = CY_AUTANALOG_SAR_CHAN_CFG_MUX0,
+ .sampleTimeEn = true,
+ .sampleTime = CY_AUTANALOG_SAR_SAMPLE_TIME0,
+ .accEn = false,
+ .accCount = CY_AUTANALOG_SAR_ACC_CNT2,
+ .calReq = CY_AUTANALOG_SAR_CAL_DISABLED,
+ .nextAction = CY_AUTANALOG_SAR_NEXT_ACTION_GO_TO_ENTRY_ADDR,
+ },
+};
+cy_stc_autanalog_sar_t CYBSP_SAR_ADC_cfg =
+{
+ .sarStaCfg = &CYBSP_SAR_ADC_sta_cfg,
+ .hsSeqTabNum = sizeof(CYBSP_SAR_ADC_seq_hs_cfg) / sizeof(CYBSP_SAR_ADC_seq_hs_cfg[0U]),
+ .hsSeqTabArr = &CYBSP_SAR_ADC_seq_hs_cfg[0U],
+ .lpSeqTabNum = 0U,
+ .lpSeqTabArr = NULL,
+ .firNum = 0U,
+ .firCfg = NULL,
+ .fifoCfg = NULL,
+};
+cy_stc_autanalog_stt_sar_t CYBSP_SAR_ADC_stt[] =
+{
+ {
+ .unlock = true,
+ .enable = true,
+ .trigger = false,
+ .entryState = 0U,
+ },
+ {
+ .unlock = true,
+ .enable = true,
+ .trigger = true,
+ .entryState = 0U,
+ },
+ {
+ .unlock = true,
+ .enable = true,
+ .trigger = false,
+ .entryState = 0U,
+ },
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_ADC)
+mtb_hal_adc_configurator_t CYBSP_SAR_ADC_hal_config =
+{
+ .config = &CYBSP_SAR_ADC_cfg,
+ .num_channels = sizeof(CYBSP_SAR_ADC_seq_hs_cfg) / sizeof(CYBSP_SAR_ADC_seq_hs_cfg[0U]),
+ .clock = NULL,
+ .adc_index = 0U,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_ADC) */
+
+const cy_stc_i3c_config_t CYBSP_I3C_CONTROLLER_config =
+{
+ .i3cMode = CY_I3C_CONTROLLER,
+ .i3cBusMode = CY_I3C_BUS_PURE,
+ .useDma = false,
+ .manualDataRate = false,
+ .i3cClockHz = 12500000U,
+ .i3cSclRate = 12500000U,
+ .openDrainSclRate = 4000000U,
+ .txEmptyBufThld = CY_I3C_1_WORD_DEPTH,
+ .rxBufThld = CY_I3C_1_WORD_DEPTH,
+ .txBufStartThld = CY_I3C_1_WORD_DEPTH,
+ .rxBufStartThld = CY_I3C_1_WORD_DEPTH,
+ .ibaInclude = false,
+ .hotJoinCtrl = false,
+ .dynamicAddr = 8U,
+ .cmdQueueEmptyThld = 1U,
+ .respQueueThld = 0U,
+ .ibiQueueThld = 0U,
+ .ibiDataThld = 15U,
+ .extLowCnt1 = 11U,
+ .extLowCnt2 = 16U,
+ .extLowCnt3 = 27U,
+ .extLowCnt4 = 58U,
+ .extTerminationLowCnt = 0U,
+ .sdaHoldTime = 1U,
+ .busFreeTime = 32U,
+ .openDrainLowCnt = 0U,
+ .openDrainHighCnt = 0U,
+ .pushPullLowCnt = 0U,
+ .pushPullHighCnt = 0U,
+ .i2cFMLowCnt = 0U,
+ .i2cFMHighCnt = 0U,
+ .i2cFMPlusLowCnt = 0U,
+ .i2cFMPlusHighCnt = 0U,
+ .adaptiveI2CI3C = false,
+ .staticAddress = 0U,
+ .pid = 0U,
+ .dcr = 0U,
+ .speedLimit = false,
+ .hdrCapable = false,
+ .deviceRoleCap = CY_I3C_SECONDARY_CONTROLLER,
+ .hotjoinEnable = false,
+ .busAvailTime = 0U,
+ .busIdleTime = 0U,
+};
+const cy_stc_pdm_pcm_config_v2_t CYBSP_PDM_config =
+{
+ .clkDiv = 7,
+ .clksel = CY_PDM_PCM_SEL_SRSS_CLOCK,
+ .halverate = CY_PDM_PCM_RATE_FULL,
+ .route = 4,
+ .fir0_coeff_user_value = false,
+ .fir1_coeff_user_value = false,
+};
+const cy_stc_pdm_pcm_channel_config_t channel_2_config =
+{
+ .sampledelay = 1,
+ .wordSize = CY_PDM_PCM_WSIZE_16_BIT,
+ .signExtension = true,
+ .rxFifoTriggerLevel = 31,
+ .fir0_enable = false,
+ .cic_decim_code = CY_PDM_PCM_CHAN_CIC_DECIM_32,
+ .fir0_decim_code = CY_PDM_PCM_CHAN_FIR0_DECIM_1,
+ .fir0_scale = 0,
+ .fir1_decim_code = CY_PDM_PCM_CHAN_FIR1_DECIM_3,
+ .fir1_scale = 10,
+ .dc_block_disable = false,
+ .dc_block_code = CY_PDM_PCM_CHAN_DCBLOCK_CODE_16,
+};
+const cy_stc_pdm_pcm_channel_config_t channel_3_config =
+{
+ .sampledelay = 5,
+ .wordSize = CY_PDM_PCM_WSIZE_16_BIT,
+ .signExtension = true,
+ .rxFifoTriggerLevel = 31,
+ .fir0_enable = false,
+ .cic_decim_code = CY_PDM_PCM_CHAN_CIC_DECIM_32,
+ .fir0_decim_code = CY_PDM_PCM_CHAN_FIR0_DECIM_1,
+ .fir0_scale = 0,
+ .fir1_decim_code = CY_PDM_PCM_CHAN_FIR1_DECIM_3,
+ .fir1_scale = 10,
+ .dc_block_disable = false,
+ .dc_block_code = CY_PDM_PCM_CHAN_DCBLOCK_CODE_16,
+};
+const cy_stc_scb_i2c_config_t CYBSP_I2C_CONTROLLER_config =
+{
+ .i2cMode = CY_SCB_I2C_MASTER,
+ .useRxFifo = true,
+ .useTxFifo = true,
+ .slaveAddress = 0U,
+ .slaveAddressMask = 0U,
+ .acceptAddrInFifo = false,
+ .ackGeneralAddr = false,
+ .enableWakeFromSleep = false,
+ .enableDigitalFilter = false,
+ .lowPhaseDutyCycle = 16,
+ .highPhaseDutyCycle = 9,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_I2C_CONTROLLER_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)CYBSP_I2C_CONTROLLER_CLK_DIV_GRP_NUM,
+ .div_type = CYBSP_I2C_CONTROLLER_CLK_DIV_HW,
+ .div_num = CYBSP_I2C_CONTROLLER_CLK_DIV_NUM,
+};
+const mtb_hal_clock_t CYBSP_I2C_CONTROLLER_hal_clock =
+{
+ .clock_ref = &CYBSP_I2C_CONTROLLER_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C)
+const mtb_hal_i2c_configurator_t CYBSP_I2C_CONTROLLER_hal_config =
+{
+ .base = CYBSP_I2C_CONTROLLER_HW,
+ .config = &CYBSP_I2C_CONTROLLER_config,
+ .clock = &CYBSP_I2C_CONTROLLER_hal_clock,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C) */
+
+const cy_stc_scb_uart_config_t CYBSP_DEBUG_UART_config =
+{
+ .uartMode = CY_SCB_UART_STANDARD,
+ .enableMultiProcessorMode = false,
+ .smartCardRetryOnNack = false,
+ .irdaInvertRx = false,
+ .irdaEnableLowPowerReceiver = false,
+ .oversample = 10,
+ .enableMsbFirst = false,
+ .dataWidth = 8UL,
+ .parity = CY_SCB_UART_PARITY_NONE,
+ .stopBits = CY_SCB_UART_STOP_BITS_1,
+ .enableInputFilter = false,
+ .breakWidth = 11UL,
+ .dropOnFrameError = false,
+ .dropOnParityError = false,
+ .breaklevel = false,
+ .receiverAddress = 0x0UL,
+ .receiverAddressMask = 0x0UL,
+ .acceptAddrInFifo = false,
+ .enableCts = false,
+ .ctsPolarity = CY_SCB_UART_ACTIVE_LOW,
+ .rtsRxFifoLevel = 0UL,
+ .rtsPolarity = CY_SCB_UART_ACTIVE_LOW,
+ .rxFifoTriggerLevel = 63UL,
+ .rxFifoIntEnableMask = 0UL,
+ .txFifoTriggerLevel = 63UL,
+ .txFifoIntEnableMask = 0UL,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_DEBUG_UART_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)CYBSP_DEBUG_UART_CLK_DIV_GRP_NUM,
+ .div_type = CYBSP_DEBUG_UART_CLK_DIV_HW,
+ .div_num = CYBSP_DEBUG_UART_CLK_DIV_NUM,
+};
+const mtb_hal_clock_t CYBSP_DEBUG_UART_hal_clock =
+{
+ .clock_ref = &CYBSP_DEBUG_UART_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART)
+const mtb_hal_uart_configurator_t CYBSP_DEBUG_UART_hal_config =
+{
+ .base = CYBSP_DEBUG_UART_HW,
+ .clock = &CYBSP_DEBUG_UART_hal_clock,
+ .tx_pin = 7,
+ #if defined(COMPONENT_MW_ASYNC_TRANSFER)
+ .rts_pin = 0xFF,
+ #endif /* defined (COMPONENT_MW_ASYNC_TRANSFER) */
+ .tx_port = 6,
+ #if defined(COMPONENT_MW_ASYNC_TRANSFER)
+ .rts_port = 0xFF,
+ .rts_enable = 0UL,
+ #endif /* defined (COMPONENT_MW_ASYNC_TRANSFER) */
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART) */
+
+const cy_stc_scb_spi_config_t CYBSP_SPI_CONTROLLER_config =
+{
+ .spiMode = CY_SCB_SPI_MASTER,
+ .subMode = CY_SCB_SPI_MOTOROLA,
+ .sclkMode = CY_SCB_SPI_CPHA0_CPOL0,
+ .parity = CY_SCB_SPI_PARITY_NONE,
+ .dropOnParityError = false,
+ .oversample = 4,
+ .rxDataWidth = 8UL,
+ .txDataWidth = 8UL,
+ .enableMsbFirst = true,
+ .enableInputFilter = false,
+ .enableFreeRunSclk = false,
+ .enableMisoLateSample = true,
+ .enableTransferSeparation = false,
+ .ssPolarity = ((CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT0) | \
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT1) | \
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT2) | \
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT3)),
+ .ssSetupDelay = false,
+ .ssHoldDelay = false,
+ .ssInterFrameDelay = false,
+ .enableWakeFromSleep = false,
+ .rxFifoTriggerLevel = 63UL,
+ .rxFifoIntEnableMask = 0UL,
+ .txFifoTriggerLevel = 63UL,
+ .txFifoIntEnableMask = 0UL,
+ .masterSlaveIntEnableMask = 0UL,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_SPI_CONTROLLER_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)PCLK_SCB3_CLOCK_SCB_EN,
+ .div_type = CY_SYSCLK_DIV_8_BIT,
+ .div_num = 1,
+};
+const mtb_hal_clock_t CYBSP_SPI_CONTROLLER_hal_clock =
+{
+ .clock_ref = &CYBSP_SPI_CONTROLLER_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SPI)
+const mtb_hal_spi_configurator_t CYBSP_SPI_CONTROLLER_hal_config =
+{
+ .base = CYBSP_SPI_CONTROLLER_HW,
+ .clock = &CYBSP_SPI_CONTROLLER_hal_clock,
+ .config = &CYBSP_SPI_CONTROLLER_config,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SPI) */
+
+const cy_stc_scb_uart_config_t CYBSP_BT_UART_config =
+{
+ .uartMode = CY_SCB_UART_STANDARD,
+ .enableMultiProcessorMode = false,
+ .smartCardRetryOnNack = false,
+ .irdaInvertRx = false,
+ .irdaEnableLowPowerReceiver = false,
+ .oversample = 8,
+ .enableMsbFirst = false,
+ .dataWidth = 8UL,
+ .parity = CY_SCB_UART_PARITY_NONE,
+ .stopBits = CY_SCB_UART_STOP_BITS_1,
+ .enableInputFilter = false,
+ .breakWidth = 11UL,
+ .dropOnFrameError = false,
+ .dropOnParityError = false,
+ .breaklevel = false,
+ .receiverAddress = 0x0UL,
+ .receiverAddressMask = 0x0UL,
+ .acceptAddrInFifo = false,
+ .enableCts = true,
+ .ctsPolarity = CY_SCB_UART_ACTIVE_LOW,
+ .rtsRxFifoLevel = 63,
+ .rtsPolarity = CY_SCB_UART_ACTIVE_LOW,
+ .rxFifoTriggerLevel = 63UL,
+ .rxFifoIntEnableMask = 0UL,
+ .txFifoTriggerLevel = 63UL,
+ .txFifoIntEnableMask = 0UL,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_BT_UART_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)CYBSP_BT_UART_CLK_DIV_GRP_NUM,
+ .div_type = CYBSP_BT_UART_CLK_DIV_HW,
+ .div_num = CYBSP_BT_UART_CLK_DIV_NUM,
+};
+const mtb_hal_clock_t CYBSP_BT_UART_hal_clock =
+{
+ .clock_ref = &CYBSP_BT_UART_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART)
+const mtb_hal_uart_configurator_t CYBSP_BT_UART_hal_config =
+{
+ .base = CYBSP_BT_UART_HW,
+ .clock = &CYBSP_BT_UART_hal_clock,
+ .tx_pin = 1,
+ #if defined(COMPONENT_MW_ASYNC_TRANSFER)
+ .rts_pin = 3,
+ #endif /* defined (COMPONENT_MW_ASYNC_TRANSFER) */
+ .tx_port = 10,
+ #if defined(COMPONENT_MW_ASYNC_TRANSFER)
+ .rts_port = 10,
+ .rts_enable = 1UL,
+ #endif /* defined (COMPONENT_MW_ASYNC_TRANSFER) */
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART) */
+
+const cy_stc_scb_i2c_config_t CYBSP_I2C_CAM_CONTROLLER_config =
+{
+ .i2cMode = CY_SCB_I2C_MASTER_SLAVE,
+ .useRxFifo = true,
+ .useTxFifo = true,
+ .slaveAddress = 8,
+ .slaveAddressMask = 254,
+ .acceptAddrInFifo = false,
+ .ackGeneralAddr = false,
+ .enableWakeFromSleep = false,
+ .enableDigitalFilter = false,
+ .lowPhaseDutyCycle = 0,
+ .highPhaseDutyCycle = 0,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_I2C_CAM_CONTROLLER_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_GRP_NUM,
+ .div_type = CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_HW,
+ .div_num = CYBSP_I2C_CONTROLLER_3V3_CLK_DIV_NUM,
+};
+const mtb_hal_clock_t CYBSP_I2C_CAM_CONTROLLER_hal_clock =
+{
+ .clock_ref = &CYBSP_I2C_CAM_CONTROLLER_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C)
+const mtb_hal_i2c_configurator_t CYBSP_I2C_CAM_CONTROLLER_hal_config =
+{
+ .base = CYBSP_I2C_CAM_CONTROLLER_HW,
+ .config = &CYBSP_I2C_CAM_CONTROLLER_config,
+ .clock = &CYBSP_I2C_CAM_CONTROLLER_hal_clock,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C) */
+
+cy_en_sd_host_card_capacity_t CYBSP_WIFI_SDIO_cardCapacity = CY_SD_HOST_SDSC;
+cy_en_sd_host_card_type_t CYBSP_WIFI_SDIO_cardType = CY_SD_HOST_NOT_EMMC;
+uint32_t CYBSP_WIFI_SDIO_rca = 0u;
+const cy_stc_sd_host_init_config_t CYBSP_WIFI_SDIO_config =
+{
+ .emmc = false,
+ .dmaType = CY_SD_HOST_DMA_ADMA2,
+ .enableLedControl = false,
+};
+cy_stc_sd_host_sd_card_config_t CYBSP_WIFI_SDIO_card_cfg =
+{
+ .lowVoltageSignaling = false,
+ .busWidth = CY_SD_HOST_BUS_WIDTH_4_BIT,
+ .cardType = &CYBSP_WIFI_SDIO_cardType,
+ .rca = &CYBSP_WIFI_SDIO_rca,
+ .cardCapacity = &CYBSP_WIFI_SDIO_cardCapacity,
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDHC)
+const mtb_hal_peri_div_t CYBSP_WIFI_SDIO_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)CYBSP_SDHC_0_CLK_DIV_GRP_NUM,
+ .div_type = CYBSP_SDHC_0_CLK_DIV_HW,
+ .div_num = CYBSP_SDHC_0_CLK_DIV_NUM,
+};
+const mtb_hal_clock_t CYBSP_WIFI_SDIO_hal_clock =
+{
+ .clock_ref = &CYBSP_WIFI_SDIO_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+const mtb_hal_sdhc_configurator_t CYBSP_WIFI_SDIO_sdhc_hal_config =
+{
+ .base = CYBSP_WIFI_SDIO_HW,
+ .host_config = &CYBSP_WIFI_SDIO_config,
+ .card_config = &CYBSP_WIFI_SDIO_card_cfg,
+ .clock = &CYBSP_WIFI_SDIO_hal_clock,
+ .gpios = {.clk = { .pin_num = 0, .port_num = 12}, .cmd = { .pin_num = 0, .port_num = 21}, .data = {{ .pin_num = 1, .port_num = 12}, { .pin_num = 2, .port_num = 12}, { .pin_num = 4, .port_num = 12}, { .pin_num = 5, .port_num = 12}, { .pin_num = NC, .port_num = NC}, { .pin_num = NC, .port_num = NC}, { .pin_num = NC, .port_num = NC}, { .pin_num = NC, .port_num = NC}}},
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDHC) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDIO)
+const mtb_hal_sdio_configurator_t CYBSP_WIFI_SDIO_sdio_hal_config =
+{
+ .base = CYBSP_WIFI_SDIO_HW,
+ .host_config = &CYBSP_WIFI_SDIO_config,
+ .clock = &CYBSP_WIFI_SDIO_hal_clock,
+ .gpios = {.clk = { .pin_num = 0, .port_num = 12}, .cmd = { .pin_num = 0, .port_num = 21}, .data = {{ .pin_num = 1, .port_num = 12}, { .pin_num = 2, .port_num = 12}, { .pin_num = 4, .port_num = 12}, { .pin_num = 5, .port_num = 12}}},
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDIO) */
+
+const cy_stc_smif_config_t CYBSP_SMIF_CORE_0_XSPI_FLASH_config =
+{
+ .mode = (uint32_t)CY_SMIF_NORMAL,
+ .deselectDelay = CYBSP_SMIF_CORE_0_XSPI_FLASH_DESELECT_DELAY,
+ .blockEvent = (uint32_t)CY_SMIF_BUS_ERROR,
+ .inputFrequencyMHz = 200,
+ .enable_internal_dll = false,
+ .dll_divider_value = CY_SMIF_DLL_DIVIDE_BY_2,
+ .rx_capture_mode = CY_SMIF_SEL_NORMAL_SPI,
+ .mdl_tap = CY_SMIF_MDL_8_TAP_DELAY,
+ .device0_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .device1_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .device2_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .device3_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .tx_sdr_extra = CY_SMIF_TX_TWO_PERIOD_AHEAD,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_hf_clock_t CYBSP_SMIF_CORE_0_XSPI_FLASH_clock_ref =
+{
+ .inst_num = 3U,
+};
+const mtb_hal_clock_t CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_clock =
+{
+ .clock_ref = &CYBSP_SMIF_CORE_0_XSPI_FLASH_clock_ref,
+ .interface = &mtb_hal_clock_hf_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI)
+const mtb_hal_memoryspi_configurator_t CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_config =
+{
+ .base = SMIF0_CORE,
+ .clock = &CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_clock,
+ .config = &CYBSP_SMIF_CORE_0_XSPI_FLASH_config,
+ .csel = {false, true, false, false},
+ .irqs = CYBSP_SMIF_CORE_0_XSPI_FLASH_MEMORY_MODE_ALIGMENT_ERROR << 5 | CYBSP_SMIF_CORE_0_XSPI_FLASH_RX_DATA_FIFO_UNDERFLOW << 4 | CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_COMMAND_FIFO_OVERFLOW << 3 | CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_DATA_FIFO_OVERFLOW << 2 | (uint8_t)(CYBSP_SMIF_CORE_0_XSPI_FLASH_RX_FIFO_TRIGGER_LEVEL != 0) << 1 | (uint8_t)(CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_FIFO_TRIGGER_LEVEL != 0) << 0,
+ .dmas = CYBSP_SMIF_CORE_0_XSPI_FLASH_RX_DMA_TRIGGER_OUT_USED << 1 | CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_DMA_TRIGGER_OUT_USED << 0,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI) */
+
+const cy_stc_smif_config_t CYBSP_SMIF_CORE_1_PSRAM_config =
+{
+ .mode = (uint32_t)CY_SMIF_NORMAL,
+ .deselectDelay = CYBSP_SMIF_CORE_1_PSRAM_DESELECT_DELAY,
+ .blockEvent = (uint32_t)CY_SMIF_BUS_ERROR,
+ .inputFrequencyMHz = 400,
+ .enable_internal_dll = false,
+ .dll_divider_value = CY_SMIF_DLL_DIVIDE_BY_2,
+ .rx_capture_mode = CY_SMIF_SEL_NORMAL_SPI,
+ .mdl_tap = CY_SMIF_MDL_8_TAP_DELAY,
+ .device0_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .device1_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .device2_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .device3_sdl_tap = CY_SMIF_SDL_8_TAP_DELAY,
+ .tx_sdr_extra = CY_SMIF_TX_TWO_PERIOD_AHEAD,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_hf_clock_t CYBSP_SMIF_CORE_1_PSRAM_clock_ref =
+{
+ .inst_num = 4U,
+};
+const mtb_hal_clock_t CYBSP_SMIF_CORE_1_PSRAM_hal_clock =
+{
+ .clock_ref = &CYBSP_SMIF_CORE_1_PSRAM_clock_ref,
+ .interface = &mtb_hal_clock_hf_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI)
+const mtb_hal_memoryspi_configurator_t CYBSP_SMIF_CORE_1_PSRAM_hal_config =
+{
+ .base = SMIF1_CORE,
+ .clock = &CYBSP_SMIF_CORE_1_PSRAM_hal_clock,
+ .config = &CYBSP_SMIF_CORE_1_PSRAM_config,
+ .csel = {false, false, true, false},
+ .irqs = CYBSP_SMIF_CORE_1_PSRAM_MEMORY_MODE_ALIGMENT_ERROR << 5 | CYBSP_SMIF_CORE_1_PSRAM_RX_DATA_FIFO_UNDERFLOW << 4 | CYBSP_SMIF_CORE_1_PSRAM_TX_COMMAND_FIFO_OVERFLOW << 3 | CYBSP_SMIF_CORE_1_PSRAM_TX_DATA_FIFO_OVERFLOW << 2 | (uint8_t)(CYBSP_SMIF_CORE_1_PSRAM_RX_FIFO_TRIGGER_LEVEL != 0) << 1 | (uint8_t)(CYBSP_SMIF_CORE_1_PSRAM_TX_FIFO_TRIGGER_LEVEL != 0) << 0,
+ .dmas = CYBSP_SMIF_CORE_1_PSRAM_RX_DMA_TRIGGER_OUT_USED << 1 | CYBSP_SMIF_CORE_1_PSRAM_TX_DMA_TRIGGER_OUT_USED << 0,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI) */
+
+const cy_stc_mcwdt_config_t CYBSP_CM33_LPTIMER_0_config =
+{
+ .c0Match = 32768U,
+ .c1Match = 32768U,
+ .c0Mode = CY_MCWDT_MODE_INT,
+ .c1Mode = CY_MCWDT_MODE_INT,
+ .c2ToggleBit = 0U,
+ .c2Mode = CY_MCWDT_MODE_NONE,
+ .c0ClearOnMatch = false,
+ .c1ClearOnMatch = false,
+ .c0c1Cascade = true,
+ .c1c2Cascade = false,
+ .c0LowerLimitMode = CY_MCWDT_LOWER_LIMIT_MODE_NOTHING,
+ .c0LowerLimit = 0U,
+ .c1LowerLimitMode = CY_MCWDT_LOWER_LIMIT_MODE_NOTHING,
+ .c1LowerLimit = 0U,
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER)
+const mtb_hal_lptimer_configurator_t CYBSP_CM33_LPTIMER_0_hal_config =
+{
+ .base = CYBSP_CM33_LPTIMER_0_HW,
+ .lfclk_freqhz = 32768,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER) */
+
+const cy_stc_mcwdt_config_t CYBSP_CM55_LPTIMER_1_config =
+{
+ .c0Match = 32768U,
+ .c1Match = 32768U,
+ .c0Mode = CY_MCWDT_MODE_INT,
+ .c1Mode = CY_MCWDT_MODE_INT,
+ .c2ToggleBit = 0U,
+ .c2Mode = CY_MCWDT_MODE_NONE,
+ .c0ClearOnMatch = false,
+ .c1ClearOnMatch = false,
+ .c0c1Cascade = true,
+ .c1c2Cascade = false,
+ .c0LowerLimitMode = CY_MCWDT_LOWER_LIMIT_MODE_NOTHING,
+ .c0LowerLimit = 0U,
+ .c1LowerLimitMode = CY_MCWDT_LOWER_LIMIT_MODE_NOTHING,
+ .c1LowerLimit = 0U,
+};
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER)
+const mtb_hal_lptimer_configurator_t CYBSP_CM55_LPTIMER_1_hal_config =
+{
+ .base = CYBSP_CM55_LPTIMER_1_HW,
+ .lfclk_freqhz = 32768,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER) */
+
+cy_stc_tdm_config_tx_t CYBSP_TDM_CONTROLLER_0_tx_config =
+{
+ .enable = true,
+ .masterMode = CY_TDM_DEVICE_MASTER,
+ .wordSize = CY_TDM_SIZE_16,
+ .format = CY_TDM_LEFT_DELAYED,
+ .clkDiv = 4,
+ .clkSel = CY_TDM_SEL_SRSS_CLK0,
+ .sckPolarity = CY_TDM_CLK,
+ .fsyncPolarity = CY_TDM_SIGN_INVERTED,
+ .fsyncFormat = CY_TDM_CH_PERIOD,
+ .channelNum = 2,
+ .channelSize = 16,
+ .fifoTriggerLevel = 64,
+ .chEn = 0x3,
+ .signalInput = 0,
+ .i2sMode = true,
+};
+cy_stc_tdm_config_rx_t CYBSP_TDM_CONTROLLER_0_rx_config =
+{
+ .enable = false,
+ .masterMode = CY_TDM_DEVICE_SLAVE,
+ .wordSize = CY_TDM_SIZE_16,
+ .signExtend = CY_ZERO_EXTEND,
+ .format = CY_TDM_LEFT_DELAYED,
+ .clkDiv = 16,
+ .clkSel = CY_TDM_SEL_SRSS_CLK0,
+ .sckPolarity = CY_TDM_CLK,
+ .fsyncPolarity = CY_TDM_SIGN,
+ .lateSample = false,
+ .fsyncFormat = CY_TDM_BIT_PERIOD,
+ .channelNum = 2,
+ .channelSize = 16,
+ .fifoTriggerLevel = 0,
+ .chEn = 0x3,
+ .signalInput = 0,
+ .i2sMode = true,
+};
+const cy_stc_tdm_config_t CYBSP_TDM_CONTROLLER_0_config =
+{
+ .tx_config = &CYBSP_TDM_CONTROLLER_0_tx_config,
+ .rx_config = &CYBSP_TDM_CONTROLLER_0_rx_config,
+};
+const cy_stc_tcpwm_pwm_config_t CYBSP_PWM_LED_CTRL_config =
+{
+ .pwmMode = CY_TCPWM_PWM_MODE_PWM,
+ .clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
+ .pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
+ .deadTimeClocks = 0,
+ .runMode = CY_TCPWM_PWM_CONTINUOUS,
+ .period0 = 2000,
+ .period1 = 32768,
+ .enablePeriodSwap = false,
+ .compare0 = 1000,
+ .compare1 = 16384,
+ .enableCompareSwap = false,
+ .interruptSources = (CY_TCPWM_INT_ON_TC & 0U) | (CY_TCPWM_INT_ON_CC0 & 0U) | (CY_TCPWM_INT_ON_CC1 & 0U),
+ .invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
+ .invertPWMOutN = CY_TCPWM_PWM_INVERT_ENABLE,
+ .killMode = CY_TCPWM_PWM_ASYNC_KILL,
+ .swapInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U,
+ .swapInput = CY_TCPWM_INPUT_0,
+ .reloadInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U,
+ .reloadInput = CY_TCPWM_INPUT_0,
+ .startInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U,
+ .startInput = CY_TCPWM_INPUT_0,
+ .killInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U,
+ .killInput = CY_TCPWM_INPUT_0,
+ .countInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U,
+ .countInput = CY_TCPWM_INPUT_1,
+ .swapOverflowUnderflow = false,
+ .immediateKill = false,
+ .tapsEnabled = 45,
+ .compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT,
+ .compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT,
+ .enableCompare1Swap = false,
+ .compare0MatchUp = true,
+ .compare0MatchDown = false,
+ .compare1MatchUp = true,
+ .compare1MatchDown = false,
+ .kill1InputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U,
+ .kill1Input = CY_TCPWM_INPUT_0,
+ .pwmOnDisable = CY_TCPWM_PWM_OUTPUT_HIGHZ,
+ .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .reloadLineSelect = false,
+ .line_out_sel = CY_TCPWM_OUTPUT_PWM_SIGNAL,
+ .linecompl_out_sel = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
+ .line_out_sel_buff = CY_TCPWM_OUTPUT_PWM_SIGNAL,
+ .linecompl_out_sel_buff = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
+ .deadTimeClocks_linecompl_out = 0,
+ #if defined(CY_IP_MXS40TCPWM)
+ .hrpwm_enable = false,
+ .hrpwm_input_freq = CY_TCPWM_HRPWM_FREQ_80MHZ_OR_100MHZ,
+ .kill_line_polarity = CY_TCPWM_LINEOUT_AND_LINECMPOUT_IS_LOW,
+ .deadTimeClocksBuff = 0,
+ .deadTimeClocksBuff_linecompl_out = 0,
+ .buffer_swap_enable = false,
+ .glitch_filter_enable = false,
+ .gf_depth = CY_GLITCH_FILTER_DEPTH_SUPPORT_VALUE_0,
+ .dithering_mode = CY_TCPWM_DITHERING_DISABLE,
+ .period_dithering_value = 128,
+ .duty_dithering_value = 128,
+ .limiter = CY_TCPWM_DITHERING_LIMITER_7,
+ .pwm_tc_sync_kill_dt = false,
+ .pwm_sync_kill_dt = false,
+ #endif /* defined (CY_IP_MXS40TCPWM) */
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_PWM_LED_CTRL_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)PCLK_TCPWM0_CLOCK_COUNTER_EN0,
+ .div_type = CY_SYSCLK_DIV_16_BIT,
+ .div_num = 3,
+};
+const mtb_hal_clock_t CYBSP_PWM_LED_CTRL_hal_clock =
+{
+ .clock_ref = &CYBSP_PWM_LED_CTRL_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM)
+const mtb_hal_pwm_configurator_t CYBSP_PWM_LED_CTRL_hal_config =
+{
+ .base = CYBSP_PWM_LED_CTRL_HW,
+ .clock = &CYBSP_PWM_LED_CTRL_hal_clock,
+ .group = 0UL,
+ .cntnum = 0UL,
+ .max_count = 2000,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM) */
+
+cy_stc_tcpwm_counter_config_t emUSB_OS_Timer_config =
+{
+ .period = 99999,
+ .clockPrescaler = CY_TCPWM_COUNTER_PRESCALER_DIVBY_1,
+ .runMode = CY_TCPWM_COUNTER_CONTINUOUS,
+ .countDirection = CY_TCPWM_COUNTER_COUNT_UP,
+ .compareOrCapture = CY_TCPWM_COUNTER_MODE_CAPTURE,
+ .compare0 = 16384U,
+ .compare1 = 16384U,
+ .enableCompareSwap = false,
+ .interruptSources = (CY_TCPWM_INT_ON_TC & 0U) | (CY_TCPWM_INT_ON_CC0) | (CY_TCPWM_INT_ON_CC1 & 0U),
+ .captureInputMode = emUSB_OS_Timer_INPUT_DISABLED & 0x3U,
+ .captureInput = CY_TCPWM_INPUT_0,
+ .reloadInputMode = emUSB_OS_Timer_INPUT_DISABLED & 0x3U,
+ .reloadInput = CY_TCPWM_INPUT_0,
+ .startInputMode = emUSB_OS_Timer_INPUT_DISABLED & 0x3U,
+ .startInput = CY_TCPWM_INPUT_0,
+ .stopInputMode = emUSB_OS_Timer_INPUT_DISABLED & 0x3U,
+ .stopInput = CY_TCPWM_INPUT_0,
+ .countInputMode = emUSB_OS_Timer_INPUT_DISABLED & 0x3U,
+ .countInput = CY_TCPWM_INPUT_1,
+ .capture1InputMode = emUSB_OS_Timer_INPUT_DISABLED & 0x3U,
+ .capture1Input = CY_TCPWM_INPUT_0,
+ .compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT,
+ .compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT,
+ .enableCompare1Swap = false,
+ .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+};
+
+#if defined(COMPONENT_MTB_HAL)
+mtb_hal_peri_div_t emUSB_OS_Timer_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)PCLK_TCPWM0_CLOCK_COUNTER_EN1,
+ .div_type = CY_SYSCLK_DIV_8_BIT,
+ .div_num = 2,
+};
+mtb_hal_clock_t emUSB_OS_Timer_hal_clock =
+{
+ .clock_ref = &emUSB_OS_Timer_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER)
+mtb_hal_timer_configurator_t emUSB_OS_Timer_hal_config =
+{
+ .tcpwm_base = emUSB_OS_Timer_HW,
+ .clock = &emUSB_OS_Timer_hal_clock,
+ .tcpwm_cntnum = 1U,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER) */
+
+const cy_stc_tcpwm_counter_config_t CYBSP_GENERAL_PURPOSE_TIMER_config =
+{
+ .period = 9999,
+ .clockPrescaler = CY_TCPWM_COUNTER_PRESCALER_DIVBY_1,
+ .runMode = CY_TCPWM_COUNTER_CONTINUOUS,
+ .countDirection = CY_TCPWM_COUNTER_COUNT_UP,
+ .compareOrCapture = CY_TCPWM_COUNTER_MODE_COMPARE,
+ .compare0 = 9999,
+ .compare1 = 16384,
+ .enableCompareSwap = false,
+ .interruptSources = (CY_TCPWM_INT_ON_TC) | (CY_TCPWM_INT_ON_CC0 & 0U) | (CY_TCPWM_INT_ON_CC1 & 0U),
+ .captureInputMode = CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED & 0x3U,
+ .captureInput = CY_TCPWM_INPUT_0,
+ .reloadInputMode = CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED & 0x3U,
+ .reloadInput = CY_TCPWM_INPUT_0,
+ .startInputMode = CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED & 0x3U,
+ .startInput = CY_TCPWM_INPUT_0,
+ .stopInputMode = CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED & 0x3U,
+ .stopInput = CY_TCPWM_INPUT_0,
+ .countInputMode = CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED & 0x3U,
+ .countInput = CY_TCPWM_INPUT_1,
+ .capture1InputMode = CYBSP_GENERAL_PURPOSE_TIMER_INPUT_DISABLED & 0x3U,
+ .capture1Input = CY_TCPWM_INPUT_0,
+ .compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT,
+ .compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT,
+ .enableCompare1Swap = false,
+ .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ #if defined(CY_IP_MXS40TCPWM)
+ .buffer_swap_enable = false,
+ .direction_mode = CY_TCPWM_COUNTER_DIRECTION_DISABLE,
+ .glitch_filter_enable = false,
+ .gf_depth = CY_GLITCH_FILTER_DEPTH_SUPPORT_VALUE_0,
+ #endif /* defined (CY_IP_MXS40TCPWM) */
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_GENERAL_PURPOSE_TIMER_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)PCLK_TCPWM0_CLOCK_COUNTER_EN2,
+ .div_type = CY_SYSCLK_DIV_16_BIT,
+ .div_num = 2,
+};
+const mtb_hal_clock_t CYBSP_GENERAL_PURPOSE_TIMER_hal_clock =
+{
+ .clock_ref = &CYBSP_GENERAL_PURPOSE_TIMER_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER)
+const mtb_hal_timer_configurator_t CYBSP_GENERAL_PURPOSE_TIMER_hal_config =
+{
+ .tcpwm_base = CYBSP_GENERAL_PURPOSE_TIMER_HW,
+ .clock = &CYBSP_GENERAL_PURPOSE_TIMER_hal_clock,
+ .tcpwm_cntnum = 2U,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER) */
+
+const cy_stc_tcpwm_pwm_config_t CYBSP_PWM_DVP_CAM_CTRL_config =
+{
+ .pwmMode = CY_TCPWM_PWM_MODE_PWM,
+ .clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
+ .pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
+ .deadTimeClocks = 0,
+ .runMode = CY_TCPWM_PWM_CONTINUOUS,
+ .period0 = 1,
+ .period1 = 32768,
+ .enablePeriodSwap = false,
+ .compare0 = 1,
+ .compare1 = 16384,
+ .enableCompareSwap = false,
+ .interruptSources = (CY_TCPWM_INT_ON_TC & 0U) | (CY_TCPWM_INT_ON_CC0 & 0U) | (CY_TCPWM_INT_ON_CC1 & 0U),
+ .invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
+ .invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
+ .killMode = CY_TCPWM_PWM_STOP_ON_KILL,
+ .swapInputMode = CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED & 0x3U,
+ .swapInput = CY_TCPWM_INPUT_0,
+ .reloadInputMode = CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED & 0x3U,
+ .reloadInput = CY_TCPWM_INPUT_0,
+ .startInputMode = CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED & 0x3U,
+ .startInput = CY_TCPWM_INPUT_0,
+ .killInputMode = CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED & 0x3U,
+ .killInput = CY_TCPWM_INPUT_0,
+ .countInputMode = CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED & 0x3U,
+ .countInput = CY_TCPWM_INPUT_1,
+ .swapOverflowUnderflow = false,
+ .immediateKill = false,
+ .tapsEnabled = 45,
+ .compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT,
+ .compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT,
+ .enableCompare1Swap = false,
+ .compare0MatchUp = true,
+ .compare0MatchDown = false,
+ .compare1MatchUp = true,
+ .compare1MatchDown = false,
+ .kill1InputMode = CYBSP_PWM_DVP_CAM_CTRL_INPUT_DISABLED & 0x3U,
+ .kill1Input = CY_TCPWM_INPUT_0,
+ .pwmOnDisable = CY_TCPWM_PWM_OUTPUT_HIGHZ,
+ .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .reloadLineSelect = false,
+ .line_out_sel = CY_TCPWM_OUTPUT_PWM_SIGNAL,
+ .linecompl_out_sel = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
+ .line_out_sel_buff = CY_TCPWM_OUTPUT_PWM_SIGNAL,
+ .linecompl_out_sel_buff = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
+ .deadTimeClocks_linecompl_out = 0,
+ #if defined(CY_IP_MXS40TCPWM)
+ .hrpwm_enable = false,
+ .hrpwm_input_freq = CY_TCPWM_HRPWM_FREQ_80MHZ_OR_100MHZ,
+ .kill_line_polarity = CY_TCPWM_LINEOUT_AND_LINECMPOUT_IS_LOW,
+ .deadTimeClocksBuff = 0,
+ .deadTimeClocksBuff_linecompl_out = 0,
+ .buffer_swap_enable = false,
+ .glitch_filter_enable = false,
+ .gf_depth = CY_GLITCH_FILTER_DEPTH_SUPPORT_VALUE_0,
+ .dithering_mode = CY_TCPWM_DITHERING_DISABLE,
+ .period_dithering_value = 128,
+ .duty_dithering_value = 128,
+ .limiter = CY_TCPWM_DITHERING_LIMITER_7,
+ .pwm_tc_sync_kill_dt = false,
+ .pwm_sync_kill_dt = false,
+ #endif /* defined (CY_IP_MXS40TCPWM) */
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_PWM_DVP_CAM_CTRL_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)PCLK_TCPWM0_CLOCK_COUNTER_EN4,
+ .div_type = CY_SYSCLK_DIV_16_5_BIT,
+ .div_num = 1,
+};
+const mtb_hal_clock_t CYBSP_PWM_DVP_CAM_CTRL_hal_clock =
+{
+ .clock_ref = &CYBSP_PWM_DVP_CAM_CTRL_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM)
+const mtb_hal_pwm_configurator_t CYBSP_PWM_DVP_CAM_CTRL_hal_config =
+{
+ .base = CYBSP_PWM_DVP_CAM_CTRL_HW,
+ .clock = &CYBSP_PWM_DVP_CAM_CTRL_hal_clock,
+ .group = 0UL,
+ .cntnum = 4UL,
+ .max_count = 1,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM) */
+
+const cy_stc_tcpwm_pwm_config_t CYBSP_DEAD_TIME_PWM_config =
+{
+ .pwmMode = CY_TCPWM_PWM_MODE_DEADTIME,
+ .clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1,
+ .pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN,
+ .deadTimeClocks = 100,
+ .runMode = CY_TCPWM_PWM_CONTINUOUS,
+ .period0 = 400,
+ .period1 = 32768,
+ .enablePeriodSwap = false,
+ .compare0 = 200,
+ .compare1 = 16384,
+ .enableCompareSwap = false,
+ .interruptSources = (CY_TCPWM_INT_ON_TC & 0U) | (CY_TCPWM_INT_ON_CC0 & 0U) | (CY_TCPWM_INT_ON_CC1 & 0U),
+ .invertPWMOut = CY_TCPWM_PWM_INVERT_DISABLE,
+ .invertPWMOutN = CY_TCPWM_PWM_INVERT_DISABLE,
+ .killMode = CY_TCPWM_PWM_STOP_ON_KILL,
+ .swapInputMode = CYBSP_DEAD_TIME_PWM_INPUT_DISABLED & 0x3U,
+ .swapInput = CY_TCPWM_INPUT_0,
+ .reloadInputMode = CYBSP_DEAD_TIME_PWM_INPUT_DISABLED & 0x3U,
+ .reloadInput = CY_TCPWM_INPUT_0,
+ .startInputMode = CYBSP_DEAD_TIME_PWM_INPUT_DISABLED & 0x3U,
+ .startInput = CY_TCPWM_INPUT_0,
+ .killInputMode = CYBSP_DEAD_TIME_PWM_INPUT_DISABLED & 0x3U,
+ .killInput = CY_TCPWM_INPUT_0,
+ .countInputMode = CYBSP_DEAD_TIME_PWM_INPUT_DISABLED & 0x3U,
+ .countInput = CY_TCPWM_INPUT_1,
+ .swapOverflowUnderflow = false,
+ .immediateKill = false,
+ .tapsEnabled = 45,
+ .compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT,
+ .compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT,
+ .enableCompare1Swap = false,
+ .compare0MatchUp = true,
+ .compare0MatchDown = false,
+ .compare1MatchUp = true,
+ .compare1MatchDown = false,
+ .kill1InputMode = CYBSP_DEAD_TIME_PWM_INPUT_DISABLED & 0x3U,
+ .kill1Input = CY_TCPWM_INPUT_0,
+ .pwmOnDisable = CY_TCPWM_PWM_OUTPUT_HIGHZ,
+ .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .reloadLineSelect = false,
+ .line_out_sel = CY_TCPWM_OUTPUT_PWM_SIGNAL,
+ .linecompl_out_sel = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
+ .line_out_sel_buff = CY_TCPWM_OUTPUT_PWM_SIGNAL,
+ .linecompl_out_sel_buff = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL,
+ .deadTimeClocks_linecompl_out = 100,
+ #if defined(CY_IP_MXS40TCPWM)
+ .hrpwm_enable = false,
+ .hrpwm_input_freq = CY_TCPWM_HRPWM_FREQ_80MHZ_OR_100MHZ,
+ .kill_line_polarity = CY_TCPWM_LINEOUT_AND_LINECMPOUT_IS_LOW,
+ .deadTimeClocksBuff = 0,
+ .deadTimeClocksBuff_linecompl_out = 0,
+ .buffer_swap_enable = false,
+ .glitch_filter_enable = false,
+ .gf_depth = CY_GLITCH_FILTER_DEPTH_SUPPORT_VALUE_0,
+ .dithering_mode = CY_TCPWM_DITHERING_DISABLE,
+ .period_dithering_value = 128,
+ .duty_dithering_value = 128,
+ .limiter = CY_TCPWM_DITHERING_LIMITER_7,
+ .pwm_tc_sync_kill_dt = false,
+ .pwm_sync_kill_dt = false,
+ #endif /* defined (CY_IP_MXS40TCPWM) */
+};
+
+#if defined(COMPONENT_MTB_HAL)
+const mtb_hal_peri_div_t CYBSP_DEAD_TIME_PWM_clock_ref =
+{
+ .clk_dst = (en_clk_dst_t)PCLK_TCPWM0_CLOCK_COUNTER_EN7,
+ .div_type = CY_SYSCLK_DIV_8_BIT,
+ .div_num = 3,
+};
+const mtb_hal_clock_t CYBSP_DEAD_TIME_PWM_hal_clock =
+{
+ .clock_ref = &CYBSP_DEAD_TIME_PWM_clock_ref,
+ .interface = &mtb_hal_clock_peri_interface,
+};
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM)
+const mtb_hal_pwm_configurator_t CYBSP_DEAD_TIME_PWM_hal_config =
+{
+ .base = CYBSP_DEAD_TIME_PWM_HW,
+ .clock = &CYBSP_DEAD_TIME_PWM_hal_clock,
+ .group = 0UL,
+ .cntnum = 7UL,
+ .max_count = 400,
+};
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM) */
+
+void init_cycfg_peripherals(void) {
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_PASS_PERI_NR, CY_MMIO_PASS_GROUP_NR, CY_MMIO_PASS_SLAVE_NR, CY_MMIO_PASS_CLK_HF_NR);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_I3C_PERI_NR, CY_MMIO_I3C_GROUP_NR, CY_MMIO_I3C_SLAVE_NR, CY_MMIO_I3C_CLK_HF_NR);
+ Cy_SysClk_PeriphAssignDivider(PCLK_I3C_CLOCK_I3C_EN, CY_SYSCLK_DIV_8_BIT, 0U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_PDM0_PERI_NR, CY_MMIO_PDM0_GROUP_NR, CY_MMIO_PDM0_SLAVE_NR, CY_MMIO_PDM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_PDM0_CLK_IF_SRSS, CY_SYSCLK_DIV_16_5_BIT, 1U);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SCB0_PERI_NR, CY_MMIO_SCB0_GROUP_NR, CY_MMIO_SCB0_SLAVE_NR, CY_MMIO_SCB0_CLK_HF_NR);
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_SCB0_CLOCK_SCB_EN, CY_SYSCLK_DIV_16_BIT, 0U);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SCB2_PERI_NR, CY_MMIO_SCB2_GROUP_NR, CY_MMIO_SCB2_SLAVE_NR, CY_MMIO_SCB2_CLK_HF_NR);
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_SCB2_CLOCK_SCB_EN, CY_SYSCLK_DIV_16_BIT, 1U);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SCB3_PERI_NR, CY_MMIO_SCB3_GROUP_NR, CY_MMIO_SCB3_SLAVE_NR, CY_MMIO_SCB3_CLK_HF_NR);
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_SCB3_CLOCK_SCB_EN, CY_SYSCLK_DIV_8_BIT, 1U);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SCB4_PERI_NR, CY_MMIO_SCB4_GROUP_NR, CY_MMIO_SCB4_SLAVE_NR, CY_MMIO_SCB4_CLK_HF_NR);
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_SCB4_CLOCK_SCB_EN, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SCB5_PERI_NR, CY_MMIO_SCB5_GROUP_NR, CY_MMIO_SCB5_SLAVE_NR, CY_MMIO_SCB5_CLK_HF_NR);
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_SCB5_CLOCK_SCB_EN, CY_SYSCLK_DIV_8_BIT, 0U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SDHC0_PERI_NR, CY_MMIO_SDHC0_GROUP_NR, CY_MMIO_SDHC0_SLAVE_NR, CY_MMIO_SDHC0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_SDHC0_CLK_HF, CY_SYSCLK_DIV_8_BIT, 0U);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_USBHS_PERI_NR, CY_MMIO_USBHS_GROUP_NR, CY_MMIO_USBHS_SLAVE_NR, CY_MMIO_USBHS_CLK_HF_NR);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SMIF0_PERI_NR, CY_MMIO_SMIF0_GROUP_NR, CY_MMIO_SMIF0_SLAVE_NR, CY_MMIO_SMIF0_CLK_HF_NR);
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_SMIF01_PERI_NR, CY_MMIO_SMIF01_GROUP_NR, CY_MMIO_SMIF01_SLAVE_NR, CY_MMIO_SMIF01_CLK_HF_NR);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TDM0_PERI_NR, CY_MMIO_TDM0_GROUP_NR, CY_MMIO_TDM0_SLAVE_NR, CY_MMIO_TDM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriPclkAssignDivider(PCLK_TDM0_CLK_IF_SRSS0, CY_SYSCLK_DIV_16_5_BIT, 0U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TCPWM0_PERI_NR, CY_MMIO_TCPWM0_GROUP_NR, CY_MMIO_TCPWM0_SLAVE_NR, CY_MMIO_TCPWM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCK_COUNTER_EN0, CY_SYSCLK_DIV_16_BIT, 3U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TCPWM0_PERI_NR, CY_MMIO_TCPWM0_GROUP_NR, CY_MMIO_TCPWM0_SLAVE_NR, CY_MMIO_TCPWM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCK_COUNTER_EN1, CY_SYSCLK_DIV_8_BIT, 2U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TCPWM0_PERI_NR, CY_MMIO_TCPWM0_GROUP_NR, CY_MMIO_TCPWM0_SLAVE_NR, CY_MMIO_TCPWM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCK_COUNTER_EN2, CY_SYSCLK_DIV_16_BIT, 2U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TCPWM0_PERI_NR, CY_MMIO_TCPWM0_GROUP_NR, CY_MMIO_TCPWM0_SLAVE_NR, CY_MMIO_TCPWM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCK_COUNTER_EN4, CY_SYSCLK_DIV_16_5_BIT, 1U);
+ #if defined(CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE)
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_TCPWM0_PERI_NR, CY_MMIO_TCPWM0_GROUP_NR, CY_MMIO_TCPWM0_SLAVE_NR, CY_MMIO_TCPWM0_CLK_HF_NR);
+ #endif /* defined (CY_DEVICE_CONFIGURATOR_IP_ENABLE_FEATURE) */
+ Cy_SysClk_PeriphAssignDivider(PCLK_TCPWM0_CLOCK_COUNTER_EN7, CY_SYSCLK_DIV_8_BIT, 3U);
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripherals.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripherals.h
new file mode 100644
index 00000000000..a69a6466591
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_peripherals.h
@@ -0,0 +1,366 @@
+/*******************************************************************************
+ * File Name: cycfg_peripherals.h
+ *
+ * Description:
+ * Analog configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_PERIPHERALS_H)
+#define CYCFG_PERIPHERALS_H
+
+#include "cycfg_notices.h"
+#include "cy_autanalog.h"
+#include "cy_sysclk.h"
+#include "cy_i3c.h"
+#include "cy_pdm_pcm_v2.h"
+#include "cy_scb_i2c.h"
+#include "cy_scb_uart.h"
+#include "cy_scb_spi.h"
+#include "cy_sd_host.h"
+#include "cy_smif.h"
+#include "cycfg_qspi_memslot.h"
+#include "cy_mcwdt.h"
+#include "cy_tdm.h"
+#include "cy_tcpwm_pwm.h"
+#include "cycfg_routing.h"
+#include "cy_tcpwm_counter.h"
+
+#if defined(COMPONENT_MTB_HAL)
+#include "mtb_hal.h"
+#include "cycfg_peripheral_clocks.h"
+#include "mtb_hal_hw_types.h"
+#include "mtb_hal_clock.h"
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define CYBSP_AUTONOMOUS_ANALOG_ENABLED 1U
+#define AUTANALOG_CLOCK_DIV_PRIO_HS_DEFAULT 20
+#define CYBSP_AUTONOMOUS_ANALOG_lppass_IRQ pass_interrupt_lppass_IRQn
+#define CYBSP_AUTONOMOUS_ANALOG_fifo_IRQ pass_interrupt_fifo_IRQn
+#define CYBSP_AUTONOMOUS_CONTROLLER_ENABLED 1U
+#define CYBSP_SAR_ADC_ENABLED 1U
+#define CYBSP_AUTONOMOUS_CONTROLLER_STATE_0_ENABLED 1U
+#define CYBSP_AUTONOMOUS_CONTROLLER_STATE_1_ENABLED 1U
+#define CYBSP_AUTONOMOUS_CONTROLLER_STATE_2_ENABLED 1U
+#define CYBSP_SAR_ADC_GPIO_CH_0_ENABLED 1U
+#define CYBSP_SAR_ADC_SCAN_GRP_0_ENABLED 1U
+#define CYBSP_SAR_ADC_SCAN_GRP_0_SCAN_0_ENABLED 1U
+#define CYBSP_I3C_CONTROLLER_ENABLED 1U
+#define CYBSP_I3C_CONTROLLER_HW I3C_CORE
+#define CYBSP_I3C_CONTROLLER_IRQ i3c_interrupt_IRQn
+#define CYBSP_PDM_ENABLED 1U
+#define CYBSP_PDM_HW PDM0
+#define CYBSP_PDM_CHANNEL_2_IRQ pdm_0_interrupts_2_IRQn
+#define CYBSP_PDM_CHANNEL_3_IRQ pdm_0_interrupts_3_IRQn
+#define CYBSP_I2C_CONTROLLER_ENABLED 1U
+#define CYBSP_I2C_CONTROLLER_HW SCB0
+#define CYBSP_I2C_CONTROLLER_IRQ scb_0_interrupt_IRQn
+#define CYBSP_DEBUG_UART_ENABLED 1U
+#define CYBSP_DEBUG_UART_HW SCB2
+#define CYBSP_DEBUG_UART_IRQ scb_2_interrupt_IRQn
+#define CYBSP_SPI_CONTROLLER_ENABLED 1U
+#define CYBSP_SPI_CONTROLLER_HW SCB3
+#define CYBSP_SPI_CONTROLLER_IRQ scb_3_interrupt_IRQn
+#define CYBSP_BT_UART_ENABLED 1U
+#define CYBSP_BT_UART_HW SCB4
+#define CYBSP_BT_UART_IRQ scb_4_interrupt_IRQn
+#define CYBSP_I2C_CAM_CONTROLLER_ENABLED 1U
+#define CYBSP_I2C_DISPLAY_CONTROLLER_ENABLED CYBSP_I2C_CAM_CONTROLLER_ENABLED
+#define CYBSP_I2C_CAM_CONTROLLER_HW SCB5
+#define CYBSP_I2C_DISPLAY_CONTROLLER_HW CYBSP_I2C_CAM_CONTROLLER_HW
+#define CYBSP_I2C_CAM_CONTROLLER_IRQ scb_5_interrupt_IRQn
+#define CYBSP_I2C_DISPLAY_CONTROLLER_IRQ CYBSP_I2C_CAM_CONTROLLER_IRQ
+#define CYBSP_WIFI_SDIO_ENABLED 1U
+#define CYBSP_WIFI_SDIO_HW SDHC0
+#define CYBSP_WIFI_SDIO_IRQ sdhc_0_interrupt_general_IRQn
+#define CYBSP_USB_DEVICE_0_ENABLED 1U
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_ENABLED 1U
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_HW SMIF0_CORE
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_IRQ smif_0_smif0_interrupt_nsec_IRQn
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_MEMORY_MODE_ALIGMENT_ERROR (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_RX_DATA_FIFO_UNDERFLOW (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_COMMAND_FIFO_OVERFLOW (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_DATA_FIFO_OVERFLOW (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_RX_DMA_TRIGGER_OUT_USED (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_DMA_TRIGGER_OUT_USED (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_RX_FIFO_TRIGGER_LEVEL (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_TX_FIFO_TRIGGER_LEVEL (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_DATALINES0_1 (1UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_DATALINES2_3 (1UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_DATALINES4_5 (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_DATALINES6_7 (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_SS0 (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_SS1 (1UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_SS2 (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_SS3 (0UL)
+#define CYBSP_SMIF_CORE_0_XSPI_FLASH_DESELECT_DELAY 7
+#define CYBSP_SMIF_CORE_1_PSRAM_ENABLED 1U
+#define CYBSP_SMIF_CORE_1_PSRAM_HW SMIF1_CORE
+#define CYBSP_SMIF_CORE_1_PSRAM_IRQ smif_1_smif0_interrupt_nsec_IRQn
+#define CYBSP_SMIF_CORE_1_PSRAM_MEMORY_MODE_ALIGMENT_ERROR (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_RX_DATA_FIFO_UNDERFLOW (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_TX_COMMAND_FIFO_OVERFLOW (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_TX_DATA_FIFO_OVERFLOW (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_RX_DMA_TRIGGER_OUT_USED (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_TX_DMA_TRIGGER_OUT_USED (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_RX_FIFO_TRIGGER_LEVEL (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_TX_FIFO_TRIGGER_LEVEL (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_DATALINES0_1 (1UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_DATALINES2_3 (1UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_DATALINES4_5 (1UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_DATALINES6_7 (1UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_SS0 (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_SS1 (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_SS2 (1UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_SS3 (0UL)
+#define CYBSP_SMIF_CORE_1_PSRAM_DESELECT_DELAY 7
+#define CYBSP_CM33_LPTIMER_0_ENABLED 1U
+#define CYBSP_CM33_LPTIMER_0_HW MCWDT_STRUCT0
+#define CYBSP_CM33_LPTIMER_0_IRQ srss_interrupt_mcwdt_0_IRQn
+#define CYBSP_CM55_LPTIMER_1_ENABLED 1U
+#define CYBSP_CM55_LPTIMER_1_HW MCWDT_STRUCT1
+#define CYBSP_CM55_LPTIMER_1_IRQ srss_interrupt_mcwdt_1_IRQn
+#define CYBSP_TDM_CONTROLLER_0_ENABLED 1U
+#define CYBSP_TDM_CONTROLLER_0_HW TDM_STRUCT0
+#define CYBSP_TDM_CONTROLLER_0_TX_HW TDM_STRUCT0_TX
+#define CYBSP_TDM_CONTROLLER_0_RX_HW TDM_STRUCT0_RX
+#define CYBSP_TDM_CONTROLLER_0_TX_IRQ tdm_0_interrupts_tx_0_IRQn
+#define CYBSP_TDM_CONTROLLER_0_RX_IRQ tdm_0_interrupts_rx_0_IRQn
+#define CYBSP_PWM_LED_CTRL_ENABLED 1U
+#define CYBSP_PWM_LED_CTRL_HW TCPWM0
+#define CYBSP_PWM_LED_CTRL_NUM 0UL
+#define CYBSP_USB_OS_TIMER_COUNTER_ENABLED 1U
+#define emUSB_OS_Timer_HW TCPWM0
+#define emUSB_OS_Timer_NUM 1UL
+#define emUSB_OS_Timer_IRQ tcpwm_0_interrupts_1_IRQn
+#define CYBSP_GENERAL_PURPOSE_TIMER_ENABLED 1U
+#define CYBSP_GENERAL_PURPOSE_TIMER_HW TCPWM0
+#define CYBSP_GENERAL_PURPOSE_TIMER_NUM 2UL
+#define CYBSP_GENERAL_PURPOSE_TIMER_IRQ tcpwm_0_interrupts_2_IRQn
+#define CYBSP_PWM_DVP_CAM_CTRL_ENABLED 1U
+#define CYBSP_PWM_DVP_CAM_CTRL_HW TCPWM0
+#define CYBSP_PWM_DVP_CAM_CTRL_NUM 4UL
+#define CYBSP_DEAD_TIME_PWM_ENABLED 1U
+#define CYBSP_DEAD_TIME_PWM_HW TCPWM0
+#define CYBSP_DEAD_TIME_PWM_NUM 7UL
+
+extern cy_stc_autanalog_cfg_t autonomous_analog_cfg;
+extern cy_stc_autanalog_stt_t autonomous_analog_stt[];
+extern cy_stc_autanalog_t autonomous_analog_init;
+extern cy_en_autanalog_ac_out_trigger_mask_t CYBSP_AUTONOMOUS_CONTROLLER_out_trig_mask[];
+extern cy_stc_autanalog_ac_t CYBSP_AUTONOMOUS_CONTROLLER_cfg;
+extern cy_stc_autanalog_stt_ac_t CYBSP_AUTONOMOUS_CONTROLLER_stt[];
+extern cy_stc_autanalog_sar_hs_chan_t CYBSP_SAR_ADC_gpio_ch_cfg[];
+extern cy_stc_autanalog_sar_sta_hs_t CYBSP_SAR_ADC_sta_hs_cfg;
+extern cy_stc_autanalog_sar_sta_t CYBSP_SAR_ADC_sta_cfg;
+extern cy_stc_autanalog_sar_seq_tab_hs_t CYBSP_SAR_ADC_seq_hs_cfg[];
+extern cy_stc_autanalog_sar_t CYBSP_SAR_ADC_cfg;
+extern cy_stc_autanalog_stt_sar_t CYBSP_SAR_ADC_stt[];
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_ADC)
+extern mtb_hal_adc_configurator_t CYBSP_SAR_ADC_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_ADC) */
+
+extern const cy_stc_i3c_config_t CYBSP_I3C_CONTROLLER_config;
+extern const cy_stc_pdm_pcm_config_v2_t CYBSP_PDM_config;
+extern const cy_stc_pdm_pcm_channel_config_t channel_2_config;
+extern const cy_stc_pdm_pcm_channel_config_t channel_3_config;
+extern const cy_stc_scb_i2c_config_t CYBSP_I2C_CONTROLLER_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_I2C_CONTROLLER_clock_ref;
+extern const mtb_hal_clock_t CYBSP_I2C_CONTROLLER_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C)
+extern const mtb_hal_i2c_configurator_t CYBSP_I2C_CONTROLLER_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C) */
+
+extern const cy_stc_scb_uart_config_t CYBSP_DEBUG_UART_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_DEBUG_UART_clock_ref;
+extern const mtb_hal_clock_t CYBSP_DEBUG_UART_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART)
+extern const mtb_hal_uart_configurator_t CYBSP_DEBUG_UART_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART) */
+
+extern const cy_stc_scb_spi_config_t CYBSP_SPI_CONTROLLER_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_SPI_CONTROLLER_clock_ref;
+extern const mtb_hal_clock_t CYBSP_SPI_CONTROLLER_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SPI)
+extern const mtb_hal_spi_configurator_t CYBSP_SPI_CONTROLLER_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SPI) */
+
+extern const cy_stc_scb_uart_config_t CYBSP_BT_UART_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_BT_UART_clock_ref;
+extern const mtb_hal_clock_t CYBSP_BT_UART_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART)
+extern const mtb_hal_uart_configurator_t CYBSP_BT_UART_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_UART) */
+
+extern const cy_stc_scb_i2c_config_t CYBSP_I2C_CAM_CONTROLLER_config;
+
+#define CYBSP_I2C_DISPLAY_CONTROLLER_config CYBSP_I2C_CAM_CONTROLLER_config
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_I2C_CAM_CONTROLLER_clock_ref;
+#define CYBSP_I2C_DISPLAY_CONTROLLER_clock_ref CYBSP_I2C_CAM_CONTROLLER_clock_ref
+extern const mtb_hal_clock_t CYBSP_I2C_CAM_CONTROLLER_hal_clock;
+#define CYBSP_I2C_DISPLAY_CONTROLLER_hal_clock CYBSP_I2C_CAM_CONTROLLER_hal_clock
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C)
+extern const mtb_hal_i2c_configurator_t CYBSP_I2C_CAM_CONTROLLER_hal_config;
+#define CYBSP_I2C_DISPLAY_CONTROLLER_hal_config CYBSP_I2C_CAM_CONTROLLER_hal_config
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_I2C) */
+
+extern cy_en_sd_host_card_capacity_t CYBSP_WIFI_SDIO_cardCapacity;
+extern cy_en_sd_host_card_type_t CYBSP_WIFI_SDIO_cardType;
+extern uint32_t CYBSP_WIFI_SDIO_rca;
+extern const cy_stc_sd_host_init_config_t CYBSP_WIFI_SDIO_config;
+extern cy_stc_sd_host_sd_card_config_t CYBSP_WIFI_SDIO_card_cfg;
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDHC)
+extern const mtb_hal_peri_div_t CYBSP_WIFI_SDIO_clock_ref;
+extern const mtb_hal_clock_t CYBSP_WIFI_SDIO_hal_clock;
+extern const mtb_hal_sdhc_configurator_t CYBSP_WIFI_SDIO_sdhc_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDHC) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDIO)
+extern const mtb_hal_sdio_configurator_t CYBSP_WIFI_SDIO_sdio_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_SDIO) */
+
+extern const cy_stc_smif_config_t CYBSP_SMIF_CORE_0_XSPI_FLASH_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_hf_clock_t CYBSP_SMIF_CORE_0_XSPI_FLASH_clock_ref;
+extern const mtb_hal_clock_t CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI)
+extern const mtb_hal_memoryspi_configurator_t CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI) */
+
+extern const cy_stc_smif_config_t CYBSP_SMIF_CORE_1_PSRAM_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_hf_clock_t CYBSP_SMIF_CORE_1_PSRAM_clock_ref;
+extern const mtb_hal_clock_t CYBSP_SMIF_CORE_1_PSRAM_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI)
+extern const mtb_hal_memoryspi_configurator_t CYBSP_SMIF_CORE_1_PSRAM_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_MEMORYSPI) */
+
+extern const cy_stc_mcwdt_config_t CYBSP_CM33_LPTIMER_0_config;
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER)
+extern const mtb_hal_lptimer_configurator_t CYBSP_CM33_LPTIMER_0_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER) */
+
+extern const cy_stc_mcwdt_config_t CYBSP_CM55_LPTIMER_1_config;
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER)
+extern const mtb_hal_lptimer_configurator_t CYBSP_CM55_LPTIMER_1_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_LPTIMER) */
+
+extern cy_stc_tdm_config_tx_t CYBSP_TDM_CONTROLLER_0_tx_config;
+extern cy_stc_tdm_config_rx_t CYBSP_TDM_CONTROLLER_0_rx_config;
+extern const cy_stc_tdm_config_t CYBSP_TDM_CONTROLLER_0_config;
+extern const cy_stc_tcpwm_pwm_config_t CYBSP_PWM_LED_CTRL_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_PWM_LED_CTRL_clock_ref;
+extern const mtb_hal_clock_t CYBSP_PWM_LED_CTRL_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM)
+extern const mtb_hal_pwm_configurator_t CYBSP_PWM_LED_CTRL_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM) */
+
+extern cy_stc_tcpwm_counter_config_t emUSB_OS_Timer_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern mtb_hal_peri_div_t emUSB_OS_Timer_clock_ref;
+extern mtb_hal_clock_t emUSB_OS_Timer_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER)
+extern mtb_hal_timer_configurator_t emUSB_OS_Timer_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER) */
+
+extern const cy_stc_tcpwm_counter_config_t CYBSP_GENERAL_PURPOSE_TIMER_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_GENERAL_PURPOSE_TIMER_clock_ref;
+extern const mtb_hal_clock_t CYBSP_GENERAL_PURPOSE_TIMER_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER)
+extern const mtb_hal_timer_configurator_t CYBSP_GENERAL_PURPOSE_TIMER_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_TIMER) */
+
+extern const cy_stc_tcpwm_pwm_config_t CYBSP_PWM_DVP_CAM_CTRL_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_PWM_DVP_CAM_CTRL_clock_ref;
+extern const mtb_hal_clock_t CYBSP_PWM_DVP_CAM_CTRL_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM)
+extern const mtb_hal_pwm_configurator_t CYBSP_PWM_DVP_CAM_CTRL_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM) */
+
+extern const cy_stc_tcpwm_pwm_config_t CYBSP_DEAD_TIME_PWM_config;
+
+#if defined(COMPONENT_MTB_HAL)
+extern const mtb_hal_peri_div_t CYBSP_DEAD_TIME_PWM_clock_ref;
+extern const mtb_hal_clock_t CYBSP_DEAD_TIME_PWM_hal_clock;
+#endif /* defined (COMPONENT_MTB_HAL) */
+
+#if defined(COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM)
+extern const mtb_hal_pwm_configurator_t CYBSP_DEAD_TIME_PWM_hal_config;
+#endif /* defined (COMPONENT_MTB_HAL) && (MTB_HAL_DRIVER_AVAILABLE_PWM) */
+
+void init_cycfg_peripherals(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_PERIPHERALS_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_pins.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_pins.c
new file mode 100644
index 00000000000..7c7b064661c
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_pins.c
@@ -0,0 +1,1472 @@
+/*******************************************************************************
+ * File Name: cycfg_pins.c
+ *
+ * Description:
+ * Pin configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_pins.h"
+
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_CS_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_OSPI_RAM_CS_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_QSPI_D0_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_QSPI_D0_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_QSPI_D1_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_QSPI_D1_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_QSPI_D2_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_QSPI_D2_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_QSPI_D3_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_QSPI_D3_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_QSPI_CS_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_QSPI_CS_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I3C_SCL_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_CFGOUT3_STRONG_PULLUP_HIGHZ,
+ .hsiom = CYBSP_I3C_SCL_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I3C_SDA_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_CFGOUT3_STRONG_PULLUP_HIGHZ,
+ .hsiom = CYBSP_I3C_SDA_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D0_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D0_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D1_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D1_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D2_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D2_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D3_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D3_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D4_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D4_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D5_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D5_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D6_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D6_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D7_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_OSPI_RAM_D7_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DEBUG_UART_RX_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DEBUG_UART_RX_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DEBUG_UART_TX_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_DEBUG_UART_TX_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_SW1_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_PULLUP,
+ .hsiom = CYBSP_SW1_HSIOM,
+ .intEdge = CY_GPIO_INTR_FALLING,
+ .intMask = 1UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_EXT_CLK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_ANALOG,
+ .hsiom = CYBSP_EXT_CLK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2C_SCL_1V8_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_OD_DRIVESLOW,
+ .hsiom = CYBSP_I2C_SCL_1V8_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2C_SDA_1V8_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_OD_DRIVESLOW,
+ .hsiom = CYBSP_I2C_SDA_1V8_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_PDM_CLK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_PDM_CLK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_PDM_DATA_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_PDM_DATA_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_SERIAL_INT_0_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_SERIAL_INT_0_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_SERIAL_INT_2_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_SERIAL_INT_2_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_UART_RX_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_BT_UART_RX_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_UART_TX_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_BT_UART_TX_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_UART_CTS_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_BT_UART_CTS_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_UART_RTS_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_BT_UART_RTS_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_HOST_WAKE_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_BT_HOST_WAKE_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_USER_LED2_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_USER_LED2_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_DEVICE_WAKE_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_BT_DEVICE_WAKE_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_USER_LED1_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_USER_LED1_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_BT_POWER_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_PULLUP,
+ .hsiom = CYBSP_BT_POWER_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_PCLK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_PCLK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_WL_REG_ON_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_OD_DRIVESLOW,
+ .hsiom = CYBSP_WIFI_WL_REG_ON_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_HOST_WAKE_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_OD_DRIVESLOW,
+ .hsiom = CYBSP_WIFI_HOST_WAKE_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_CLK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_WIFI_SDIO_CLK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D0_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_WIFI_SDIO_D0_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D1_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_WIFI_SDIO_D1_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_FSYNC_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_I2S_TX_FSYNC_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D2_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_WIFI_SDIO_D2_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D3_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_WIFI_SDIO_D3_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D0_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D0_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D1_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D1_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D2_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D2_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D3_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D3_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D4_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D4_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D5_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D5_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D6_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D6_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D7_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_D7_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2C_SCL_3V3_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_OD_DRIVESLOW,
+ .hsiom = CYBSP_I2C_SCL_3V3_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2C_SDA_3V3_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_OD_DRIVESLOW,
+ .hsiom = CYBSP_I2C_SDA_3V3_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_VSYNC_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_VSYNC_HSIOM,
+ .intEdge = CY_GPIO_INTR_FALLING,
+ .intMask = 1UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_HREF_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_DVP_CAM_HREF_HSIOM,
+ .intEdge = CY_GPIO_INTR_FALLING,
+ .intMask = 1UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_XCLK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_DVP_CAM_XCLK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_RESET_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_DVP_CAM_RESET_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_PWDN_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_DVP_CAM_PWDN_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WCO_OUT_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_ANALOG,
+ .hsiom = CYBSP_WCO_OUT_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WCO_IN_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_ANALOG,
+ .hsiom = CYBSP_WCO_IN_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_ECO_IN_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_ANALOG,
+ .hsiom = CYBSP_ECO_IN_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_ECO_OUT_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_ANALOG,
+ .hsiom = CYBSP_ECO_OUT_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_RADAR_INT_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_PULLDOWN_IN_OFF,
+ .hsiom = CYBSP_RADAR_INT_HSIOM,
+ .intEdge = CY_GPIO_INTR_RISING,
+ .intMask = 1UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_LED_RGB_GREEN_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_LED_RGB_GREEN_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_LED_RGB_BLUE_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_LED_RGB_BLUE_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_LED_RGB_RED_config =
+{
+ .outVal = 0,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_LED_RGB_RED_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_RXRES_L_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_RXRES_L_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_CMD_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG,
+ .hsiom = CYBSP_WIFI_SDIO_CMD_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_SD_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_I2S_TX_SD_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_SCK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_I2S_TX_SCK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_MCK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_I2S_TX_MCK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_RSPI_MISO_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_HIGHZ,
+ .hsiom = CYBSP_RSPI_MISO_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_RSPI_MOSI_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_RSPI_MOSI_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_RSPI_CLK_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_RSPI_CLK_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+const cy_stc_gpio_pin_config_t CYBSP_RSPI_CS_config =
+{
+ .outVal = 1,
+ .driveMode = CY_GPIO_DM_STRONG_IN_OFF,
+ .hsiom = CYBSP_RSPI_CS_HSIOM,
+ .intEdge = CY_GPIO_INTR_DISABLE,
+ .intMask = 0UL,
+ .vtrip = CY_GPIO_VTRIP_CMOS,
+ .slewRate = CY_GPIO_SLEW_FAST,
+ .driveSel = CY_GPIO_DRIVE_1_2,
+ .vregEn = 0UL,
+ .ibufMode = 0UL,
+ .vtripSel = 0UL,
+ .vrefSel = 0UL,
+ .vohSel = 0UL,
+ .pullUpRes = CY_GPIO_PULLUP_RES_DISABLE,
+ .nonSec = 1,
+};
+
+void init_cycfg_pins(void) {
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_CS_PORT, CYBSP_OSPI_RAM_CS_PIN, &CYBSP_OSPI_RAM_CS_config);
+ Cy_GPIO_Pin_Init(CYBSP_QSPI_D0_PORT, CYBSP_QSPI_D0_PIN, &CYBSP_QSPI_D0_config);
+ Cy_GPIO_Pin_Init(CYBSP_QSPI_D1_PORT, CYBSP_QSPI_D1_PIN, &CYBSP_QSPI_D1_config);
+ Cy_GPIO_Pin_Init(CYBSP_QSPI_D2_PORT, CYBSP_QSPI_D2_PIN, &CYBSP_QSPI_D2_config);
+ Cy_GPIO_Pin_Init(CYBSP_QSPI_D3_PORT, CYBSP_QSPI_D3_PIN, &CYBSP_QSPI_D3_config);
+ Cy_GPIO_Pin_Init(CYBSP_QSPI_CS_PORT, CYBSP_QSPI_CS_PIN, &CYBSP_QSPI_CS_config);
+ Cy_GPIO_Pin_Init(CYBSP_I3C_SCL_PORT, CYBSP_I3C_SCL_PIN, &CYBSP_I3C_SCL_config);
+ Cy_GPIO_Pin_Init(CYBSP_I3C_SDA_PORT, CYBSP_I3C_SDA_PIN, &CYBSP_I3C_SDA_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D0_PORT, CYBSP_OSPI_RAM_D0_PIN, &CYBSP_OSPI_RAM_D0_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D1_PORT, CYBSP_OSPI_RAM_D1_PIN, &CYBSP_OSPI_RAM_D1_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D2_PORT, CYBSP_OSPI_RAM_D2_PIN, &CYBSP_OSPI_RAM_D2_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D3_PORT, CYBSP_OSPI_RAM_D3_PIN, &CYBSP_OSPI_RAM_D3_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D4_PORT, CYBSP_OSPI_RAM_D4_PIN, &CYBSP_OSPI_RAM_D4_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D5_PORT, CYBSP_OSPI_RAM_D5_PIN, &CYBSP_OSPI_RAM_D5_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D6_PORT, CYBSP_OSPI_RAM_D6_PIN, &CYBSP_OSPI_RAM_D6_config);
+ Cy_GPIO_Pin_Init(CYBSP_OSPI_RAM_D7_PORT, CYBSP_OSPI_RAM_D7_PIN, &CYBSP_OSPI_RAM_D7_config);
+ Cy_GPIO_Pin_Init(CYBSP_DEBUG_UART_RX_PORT, CYBSP_DEBUG_UART_RX_PIN, &CYBSP_DEBUG_UART_RX_config);
+ Cy_GPIO_Pin_Init(CYBSP_DEBUG_UART_TX_PORT, CYBSP_DEBUG_UART_TX_PIN, &CYBSP_DEBUG_UART_TX_config);
+ Cy_GPIO_Pin_Init(CYBSP_SW1_PORT, CYBSP_SW1_PIN, &CYBSP_SW1_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2C_SCL_1V8_PORT, CYBSP_I2C_SCL_1V8_PIN, &CYBSP_I2C_SCL_1V8_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2C_SDA_1V8_PORT, CYBSP_I2C_SDA_1V8_PIN, &CYBSP_I2C_SDA_1V8_config);
+ Cy_GPIO_Pin_Init(CYBSP_PDM_CLK_PORT, CYBSP_PDM_CLK_PIN, &CYBSP_PDM_CLK_config);
+ Cy_GPIO_Pin_Init(CYBSP_PDM_DATA_PORT, CYBSP_PDM_DATA_PIN, &CYBSP_PDM_DATA_config);
+ Cy_GPIO_Pin_Init(CYBSP_SERIAL_INT_0_PORT, CYBSP_SERIAL_INT_0_PIN, &CYBSP_SERIAL_INT_0_config);
+ Cy_GPIO_Pin_Init(CYBSP_SERIAL_INT_2_PORT, CYBSP_SERIAL_INT_2_PIN, &CYBSP_SERIAL_INT_2_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_UART_RX_PORT, CYBSP_BT_UART_RX_PIN, &CYBSP_BT_UART_RX_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_UART_TX_PORT, CYBSP_BT_UART_TX_PIN, &CYBSP_BT_UART_TX_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_UART_CTS_PORT, CYBSP_BT_UART_CTS_PIN, &CYBSP_BT_UART_CTS_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_UART_RTS_PORT, CYBSP_BT_UART_RTS_PIN, &CYBSP_BT_UART_RTS_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_HOST_WAKE_PORT, CYBSP_BT_HOST_WAKE_PIN, &CYBSP_BT_HOST_WAKE_config);
+ Cy_GPIO_Pin_Init(CYBSP_USER_LED2_PORT, CYBSP_USER_LED2_PIN, &CYBSP_USER_LED2_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_DEVICE_WAKE_PORT, CYBSP_BT_DEVICE_WAKE_PIN, &CYBSP_BT_DEVICE_WAKE_config);
+ Cy_GPIO_Pin_Init(CYBSP_USER_LED1_PORT, CYBSP_USER_LED1_PIN, &CYBSP_USER_LED1_config);
+ Cy_GPIO_Pin_Init(CYBSP_BT_POWER_PORT, CYBSP_BT_POWER_PIN, &CYBSP_BT_POWER_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_PCLK_PORT, CYBSP_DVP_CAM_PCLK_PIN, &CYBSP_DVP_CAM_PCLK_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_WL_REG_ON_PORT, CYBSP_WIFI_WL_REG_ON_PIN, &CYBSP_WIFI_WL_REG_ON_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_HOST_WAKE_PORT, CYBSP_WIFI_HOST_WAKE_PIN, &CYBSP_WIFI_HOST_WAKE_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_SDIO_CLK_PORT, CYBSP_WIFI_SDIO_CLK_PIN, &CYBSP_WIFI_SDIO_CLK_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_SDIO_D0_PORT, CYBSP_WIFI_SDIO_D0_PIN, &CYBSP_WIFI_SDIO_D0_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_SDIO_D1_PORT, CYBSP_WIFI_SDIO_D1_PIN, &CYBSP_WIFI_SDIO_D1_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2S_TX_FSYNC_PORT, CYBSP_I2S_TX_FSYNC_PIN, &CYBSP_I2S_TX_FSYNC_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_SDIO_D2_PORT, CYBSP_WIFI_SDIO_D2_PIN, &CYBSP_WIFI_SDIO_D2_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_SDIO_D3_PORT, CYBSP_WIFI_SDIO_D3_PIN, &CYBSP_WIFI_SDIO_D3_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D0_PORT, CYBSP_DVP_CAM_D0_PIN, &CYBSP_DVP_CAM_D0_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D1_PORT, CYBSP_DVP_CAM_D1_PIN, &CYBSP_DVP_CAM_D1_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D2_PORT, CYBSP_DVP_CAM_D2_PIN, &CYBSP_DVP_CAM_D2_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D3_PORT, CYBSP_DVP_CAM_D3_PIN, &CYBSP_DVP_CAM_D3_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D4_PORT, CYBSP_DVP_CAM_D4_PIN, &CYBSP_DVP_CAM_D4_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D5_PORT, CYBSP_DVP_CAM_D5_PIN, &CYBSP_DVP_CAM_D5_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D6_PORT, CYBSP_DVP_CAM_D6_PIN, &CYBSP_DVP_CAM_D6_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_D7_PORT, CYBSP_DVP_CAM_D7_PIN, &CYBSP_DVP_CAM_D7_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2C_SCL_3V3_PORT, CYBSP_I2C_SCL_3V3_PIN, &CYBSP_I2C_SCL_3V3_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2C_SDA_3V3_PORT, CYBSP_I2C_SDA_3V3_PIN, &CYBSP_I2C_SDA_3V3_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_VSYNC_PORT, CYBSP_DVP_CAM_VSYNC_PIN, &CYBSP_DVP_CAM_VSYNC_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_HREF_PORT, CYBSP_DVP_CAM_HREF_PIN, &CYBSP_DVP_CAM_HREF_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_XCLK_PORT, CYBSP_DVP_CAM_XCLK_PIN, &CYBSP_DVP_CAM_XCLK_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_RESET_PORT, CYBSP_DVP_CAM_RESET_PIN, &CYBSP_DVP_CAM_RESET_config);
+ Cy_GPIO_Pin_Init(CYBSP_DVP_CAM_PWDN_PORT, CYBSP_DVP_CAM_PWDN_PIN, &CYBSP_DVP_CAM_PWDN_config);
+ Cy_GPIO_Pin_Init(CYBSP_RADAR_INT_PORT, CYBSP_RADAR_INT_PIN, &CYBSP_RADAR_INT_config);
+ Cy_GPIO_Pin_Init(CYBSP_LED_RGB_GREEN_PORT, CYBSP_LED_RGB_GREEN_PIN, &CYBSP_LED_RGB_GREEN_config);
+ Cy_GPIO_Pin_Init(CYBSP_LED_RGB_BLUE_PORT, CYBSP_LED_RGB_BLUE_PIN, &CYBSP_LED_RGB_BLUE_config);
+ Cy_GPIO_Pin_Init(CYBSP_LED_RGB_RED_PORT, CYBSP_LED_RGB_RED_PIN, &CYBSP_LED_RGB_RED_config);
+ Cy_GPIO_Pin_Init(CYBSP_RXRES_L_PORT, CYBSP_RXRES_L_PIN, &CYBSP_RXRES_L_config);
+ Cy_GPIO_Pin_Init(CYBSP_WIFI_SDIO_CMD_PORT, CYBSP_WIFI_SDIO_CMD_PIN, &CYBSP_WIFI_SDIO_CMD_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2S_TX_SD_PORT, CYBSP_I2S_TX_SD_PIN, &CYBSP_I2S_TX_SD_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2S_TX_SCK_PORT, CYBSP_I2S_TX_SCK_PIN, &CYBSP_I2S_TX_SCK_config);
+ Cy_GPIO_Pin_Init(CYBSP_I2S_TX_MCK_PORT, CYBSP_I2S_TX_MCK_PIN, &CYBSP_I2S_TX_MCK_config);
+ Cy_GPIO_Pin_Init(CYBSP_RSPI_MISO_PORT, CYBSP_RSPI_MISO_PIN, &CYBSP_RSPI_MISO_config);
+ Cy_GPIO_Pin_Init(CYBSP_RSPI_MOSI_PORT, CYBSP_RSPI_MOSI_PIN, &CYBSP_RSPI_MOSI_config);
+ Cy_GPIO_Pin_Init(CYBSP_RSPI_CLK_PORT, CYBSP_RSPI_CLK_PIN, &CYBSP_RSPI_CLK_config);
+ Cy_GPIO_Pin_Init(CYBSP_RSPI_CS_PORT, CYBSP_RSPI_CS_PIN, &CYBSP_RSPI_CS_config);
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_pins.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_pins.h
new file mode 100644
index 00000000000..cc63bba0ed5
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_pins.h
@@ -0,0 +1,1213 @@
+/*******************************************************************************
+ * File Name: cycfg_pins.h
+ *
+ * Description:
+ * Pin configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_PINS_H)
+#define CYCFG_PINS_H
+
+#include "cycfg_notices.h"
+#include "cy_gpio.h"
+#include "cycfg_routing.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define CYBSP_OSPI_RAM_CS_ENABLED 1U
+#define CYBSP_OSPI_RAM_SS_ENABLED CYBSP_OSPI_RAM_CS_ENABLED
+#define CYBSP_OSPI_RAM_CS_PORT GPIO_PRT0
+#define CYBSP_OSPI_RAM_SS_PORT CYBSP_OSPI_RAM_CS_PORT
+#define CYBSP_OSPI_RAM_CS_PORT_NUM 0U
+#define CYBSP_OSPI_RAM_SS_PORT_NUM CYBSP_OSPI_RAM_CS_PORT_NUM
+#define CYBSP_OSPI_RAM_CS_PIN 1U
+#define CYBSP_OSPI_RAM_SS_PIN CYBSP_OSPI_RAM_CS_PIN
+#define CYBSP_OSPI_RAM_CS_NUM 1U
+#define CYBSP_OSPI_RAM_SS_NUM CYBSP_OSPI_RAM_CS_NUM
+#define CYBSP_OSPI_RAM_CS_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_OSPI_RAM_SS_DRIVEMODE CYBSP_OSPI_RAM_CS_DRIVEMODE
+#define CYBSP_OSPI_RAM_CS_INIT_DRIVESTATE 1
+#define CYBSP_OSPI_RAM_SS_INIT_DRIVESTATE CYBSP_OSPI_RAM_CS_INIT_DRIVESTATE
+#ifndef ioss_0_port_0_pin_1_HSIOM
+ #define ioss_0_port_0_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_OSPI_RAM_CS_HSIOM ioss_0_port_0_pin_1_HSIOM
+#define CYBSP_OSPI_RAM_SS_HSIOM CYBSP_OSPI_RAM_CS_HSIOM
+#define CYBSP_OSPI_RAM_CS_IRQ ioss_interrupts_gpio_0_IRQn
+#define CYBSP_OSPI_RAM_SS_IRQ CYBSP_OSPI_RAM_CS_IRQ
+#define CYBSP_QSPI_D0_ENABLED 1U
+#define CYBSP_QSPI_D0_PORT (GPIO_PRT_Type *)SMIF0_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_QSPI_D0_PORT_NUM 1U
+#define CYBSP_QSPI_D0_PIN 0U
+#define CYBSP_QSPI_D0_NUM 0U
+#define CYBSP_QSPI_D0_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_QSPI_D0_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_1_pin_0_HSIOM
+ #define ioss_0_port_1_pin_0_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_QSPI_D0_HSIOM ioss_0_port_1_pin_0_HSIOM
+#define CYBSP_QSPI_D0_IRQ ioss_interrupts_gpio_1_IRQn
+#define CYBSP_QSPI_D1_ENABLED 1U
+#define CYBSP_QSPI_D1_PORT (GPIO_PRT_Type *)SMIF0_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_QSPI_D1_PORT_NUM 1U
+#define CYBSP_QSPI_D1_PIN 1U
+#define CYBSP_QSPI_D1_NUM 1U
+#define CYBSP_QSPI_D1_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_QSPI_D1_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_1_pin_1_HSIOM
+ #define ioss_0_port_1_pin_1_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_QSPI_D1_HSIOM ioss_0_port_1_pin_1_HSIOM
+#define CYBSP_QSPI_D1_IRQ ioss_interrupts_gpio_1_IRQn
+#define CYBSP_QSPI_D2_ENABLED 1U
+#define CYBSP_QSPI_D2_PORT (GPIO_PRT_Type *)SMIF0_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_QSPI_D2_PORT_NUM 1U
+#define CYBSP_QSPI_D2_PIN 2U
+#define CYBSP_QSPI_D2_NUM 2U
+#define CYBSP_QSPI_D2_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_QSPI_D2_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_1_pin_2_HSIOM
+ #define ioss_0_port_1_pin_2_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_QSPI_D2_HSIOM ioss_0_port_1_pin_2_HSIOM
+#define CYBSP_QSPI_D2_IRQ ioss_interrupts_gpio_1_IRQn
+#define CYBSP_QSPI_D3_ENABLED 1U
+#define CYBSP_QSPI_D3_PORT (GPIO_PRT_Type *)SMIF0_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_QSPI_D3_PORT_NUM 1U
+#define CYBSP_QSPI_D3_PIN 3U
+#define CYBSP_QSPI_D3_NUM 3U
+#define CYBSP_QSPI_D3_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_QSPI_D3_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_1_pin_3_HSIOM
+ #define ioss_0_port_1_pin_3_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_QSPI_D3_HSIOM ioss_0_port_1_pin_3_HSIOM
+#define CYBSP_QSPI_D3_IRQ ioss_interrupts_gpio_1_IRQn
+#define CYBSP_QSPI_CS_ENABLED 1U
+#define CYBSP_QSPI_SS_ENABLED CYBSP_QSPI_CS_ENABLED
+#define CYBSP_QSPI_CS_PORT GPIO_PRT2
+#define CYBSP_QSPI_SS_PORT CYBSP_QSPI_CS_PORT
+#define CYBSP_QSPI_CS_PORT_NUM 2U
+#define CYBSP_QSPI_SS_PORT_NUM CYBSP_QSPI_CS_PORT_NUM
+#define CYBSP_QSPI_CS_PIN 0U
+#define CYBSP_QSPI_SS_PIN CYBSP_QSPI_CS_PIN
+#define CYBSP_QSPI_CS_NUM 0U
+#define CYBSP_QSPI_SS_NUM CYBSP_QSPI_CS_NUM
+#define CYBSP_QSPI_CS_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_QSPI_SS_DRIVEMODE CYBSP_QSPI_CS_DRIVEMODE
+#define CYBSP_QSPI_CS_INIT_DRIVESTATE 1
+#define CYBSP_QSPI_SS_INIT_DRIVESTATE CYBSP_QSPI_CS_INIT_DRIVESTATE
+#ifndef ioss_0_port_2_pin_0_HSIOM
+ #define ioss_0_port_2_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_QSPI_CS_HSIOM ioss_0_port_2_pin_0_HSIOM
+#define CYBSP_QSPI_SS_HSIOM CYBSP_QSPI_CS_HSIOM
+#define CYBSP_QSPI_CS_IRQ ioss_interrupts_gpio_2_IRQn
+#define CYBSP_QSPI_SS_IRQ CYBSP_QSPI_CS_IRQ
+#define CYBSP_I3C_SCL_ENABLED 1U
+#define CYBSP_I3C_SCL_PORT GPIO_PRT3
+#define CYBSP_I3C_SCL_PORT_NUM 3U
+#define CYBSP_I3C_SCL_PIN 0U
+#define CYBSP_I3C_SCL_NUM 0U
+#define CYBSP_I3C_SCL_DRIVEMODE CY_GPIO_DM_CFGOUT3_STRONG_PULLUP_HIGHZ
+#define CYBSP_I3C_SCL_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_3_pin_0_HSIOM
+ #define ioss_0_port_3_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I3C_SCL_HSIOM ioss_0_port_3_pin_0_HSIOM
+#define CYBSP_I3C_SCL_IRQ ioss_interrupts_gpio_3_IRQn
+#define CYBSP_I3C_SDA_ENABLED 1U
+#define CYBSP_I3C_SDA_PORT GPIO_PRT3
+#define CYBSP_I3C_SDA_PORT_NUM 3U
+#define CYBSP_I3C_SDA_PIN 1U
+#define CYBSP_I3C_SDA_NUM 1U
+#define CYBSP_I3C_SDA_DRIVEMODE CY_GPIO_DM_CFGOUT3_STRONG_PULLUP_HIGHZ
+#define CYBSP_I3C_SDA_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_3_pin_1_HSIOM
+ #define ioss_0_port_3_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I3C_SDA_HSIOM ioss_0_port_3_pin_1_HSIOM
+#define CYBSP_I3C_SDA_IRQ ioss_interrupts_gpio_3_IRQn
+#define CYBSP_OSPI_RAM_D0_ENABLED 1U
+#define CYBSP_OSPI_RAM_D0_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D0_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D0_PIN 0U
+#define CYBSP_OSPI_RAM_D0_NUM 0U
+#define CYBSP_OSPI_RAM_D0_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D0_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_0_HSIOM
+ #define ioss_0_port_4_pin_0_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D0_HSIOM ioss_0_port_4_pin_0_HSIOM
+#define CYBSP_OSPI_RAM_D0_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D1_ENABLED 1U
+#define CYBSP_OSPI_RAM_D1_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D1_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D1_PIN 1U
+#define CYBSP_OSPI_RAM_D1_NUM 1U
+#define CYBSP_OSPI_RAM_D1_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D1_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_1_HSIOM
+ #define ioss_0_port_4_pin_1_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D1_HSIOM ioss_0_port_4_pin_1_HSIOM
+#define CYBSP_OSPI_RAM_D1_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D2_ENABLED 1U
+#define CYBSP_OSPI_RAM_D2_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D2_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D2_PIN 2U
+#define CYBSP_OSPI_RAM_D2_NUM 2U
+#define CYBSP_OSPI_RAM_D2_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D2_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_2_HSIOM
+ #define ioss_0_port_4_pin_2_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D2_HSIOM ioss_0_port_4_pin_2_HSIOM
+#define CYBSP_OSPI_RAM_D2_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D3_ENABLED 1U
+#define CYBSP_OSPI_RAM_D3_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D3_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D3_PIN 3U
+#define CYBSP_OSPI_RAM_D3_NUM 3U
+#define CYBSP_OSPI_RAM_D3_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D3_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_3_HSIOM
+ #define ioss_0_port_4_pin_3_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D3_HSIOM ioss_0_port_4_pin_3_HSIOM
+#define CYBSP_OSPI_RAM_D3_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D4_ENABLED 1U
+#define CYBSP_OSPI_RAM_D4_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D4_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D4_PIN 4U
+#define CYBSP_OSPI_RAM_D4_NUM 4U
+#define CYBSP_OSPI_RAM_D4_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D4_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_4_HSIOM
+ #define ioss_0_port_4_pin_4_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D4_HSIOM ioss_0_port_4_pin_4_HSIOM
+#define CYBSP_OSPI_RAM_D4_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D5_ENABLED 1U
+#define CYBSP_OSPI_RAM_D5_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D5_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D5_PIN 5U
+#define CYBSP_OSPI_RAM_D5_NUM 5U
+#define CYBSP_OSPI_RAM_D5_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D5_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_5_HSIOM
+ #define ioss_0_port_4_pin_5_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D5_HSIOM ioss_0_port_4_pin_5_HSIOM
+#define CYBSP_OSPI_RAM_D5_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D6_ENABLED 1U
+#define CYBSP_OSPI_RAM_D6_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D6_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D6_PIN 6U
+#define CYBSP_OSPI_RAM_D6_NUM 6U
+#define CYBSP_OSPI_RAM_D6_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D6_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_6_HSIOM
+ #define ioss_0_port_4_pin_6_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D6_HSIOM ioss_0_port_4_pin_6_HSIOM
+#define CYBSP_OSPI_RAM_D6_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_OSPI_RAM_D7_ENABLED 1U
+#define CYBSP_OSPI_RAM_D7_PORT (GPIO_PRT_Type *)SMIF1_CORE_SMIF_GPIO_SMIF_PRT0
+#define CYBSP_OSPI_RAM_D7_PORT_NUM 4U
+#define CYBSP_OSPI_RAM_D7_PIN 7U
+#define CYBSP_OSPI_RAM_D7_NUM 7U
+#define CYBSP_OSPI_RAM_D7_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_OSPI_RAM_D7_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_4_pin_7_HSIOM
+ #define ioss_0_port_4_pin_7_HSIOM HSIOM_SEL_ACT_15
+#endif
+#define CYBSP_OSPI_RAM_D7_HSIOM ioss_0_port_4_pin_7_HSIOM
+#define CYBSP_OSPI_RAM_D7_IRQ ioss_interrupts_gpio_4_IRQn
+#define CYBSP_DEBUG_UART_RX_ENABLED 1U
+#define CYBSP_DEBUG_UART_RX_PORT GPIO_PRT6
+#define CYBSP_DEBUG_UART_RX_PORT_NUM 6U
+#define CYBSP_DEBUG_UART_RX_PIN 5U
+#define CYBSP_DEBUG_UART_RX_NUM 5U
+#define CYBSP_DEBUG_UART_RX_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DEBUG_UART_RX_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_6_pin_5_HSIOM
+ #define ioss_0_port_6_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DEBUG_UART_RX_HSIOM ioss_0_port_6_pin_5_HSIOM
+#define CYBSP_DEBUG_UART_RX_IRQ ioss_interrupts_gpio_6_IRQn
+#define CYBSP_DEBUG_UART_TX_ENABLED 1U
+#define CYBSP_DEBUG_UART_TX_PORT GPIO_PRT6
+#define CYBSP_DEBUG_UART_TX_PORT_NUM 6U
+#define CYBSP_DEBUG_UART_TX_PIN 7U
+#define CYBSP_DEBUG_UART_TX_NUM 7U
+#define CYBSP_DEBUG_UART_TX_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_DEBUG_UART_TX_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_6_pin_7_HSIOM
+ #define ioss_0_port_6_pin_7_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DEBUG_UART_TX_HSIOM ioss_0_port_6_pin_7_HSIOM
+#define CYBSP_DEBUG_UART_TX_IRQ ioss_interrupts_gpio_6_IRQn
+#define CYBSP_SW1_ENABLED 1U
+#define CYBSP_USER_BTN1_ENABLED CYBSP_SW1_ENABLED
+#define CYBSP_USER_BTN_ENABLED CYBSP_SW1_ENABLED
+#define CYBSP_SW1_PORT GPIO_PRT7
+#define CYBSP_USER_BTN1_PORT CYBSP_SW1_PORT
+#define CYBSP_USER_BTN_PORT CYBSP_SW1_PORT
+#define CYBSP_SW1_PORT_NUM 7U
+#define CYBSP_USER_BTN1_PORT_NUM CYBSP_SW1_PORT_NUM
+#define CYBSP_USER_BTN_PORT_NUM CYBSP_SW1_PORT_NUM
+#define CYBSP_SW1_PIN 0U
+#define CYBSP_USER_BTN1_PIN CYBSP_SW1_PIN
+#define CYBSP_USER_BTN_PIN CYBSP_SW1_PIN
+#define CYBSP_SW1_NUM 0U
+#define CYBSP_USER_BTN1_NUM CYBSP_SW1_NUM
+#define CYBSP_USER_BTN_NUM CYBSP_SW1_NUM
+#define CYBSP_SW1_DRIVEMODE CY_GPIO_DM_PULLUP
+#define CYBSP_USER_BTN1_DRIVEMODE CYBSP_SW1_DRIVEMODE
+#define CYBSP_USER_BTN_DRIVEMODE CYBSP_SW1_DRIVEMODE
+#define CYBSP_SW1_INIT_DRIVESTATE 1
+#define CYBSP_USER_BTN1_INIT_DRIVESTATE CYBSP_SW1_INIT_DRIVESTATE
+#define CYBSP_USER_BTN_INIT_DRIVESTATE CYBSP_SW1_INIT_DRIVESTATE
+#ifndef ioss_0_port_7_pin_0_HSIOM
+ #define ioss_0_port_7_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_SW1_HSIOM ioss_0_port_7_pin_0_HSIOM
+#define CYBSP_USER_BTN1_HSIOM CYBSP_SW1_HSIOM
+#define CYBSP_USER_BTN_HSIOM CYBSP_SW1_HSIOM
+#define CYBSP_SW1_IRQ ioss_interrupts_gpio_7_IRQn
+#define CYBSP_USER_BTN1_IRQ CYBSP_SW1_IRQ
+#define CYBSP_USER_BTN_IRQ CYBSP_SW1_IRQ
+#define CYBSP_EXT_CLK_ENABLED 1U
+#define CYBSP_EXT_CLK_PORT GPIO_PRT7
+#define CYBSP_EXT_CLK_PORT_NUM 7U
+#define CYBSP_EXT_CLK_PIN 4U
+#define CYBSP_EXT_CLK_NUM 4U
+#define CYBSP_EXT_CLK_DRIVEMODE CY_GPIO_DM_ANALOG
+#define CYBSP_EXT_CLK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_7_pin_4_HSIOM
+ #define ioss_0_port_7_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_EXT_CLK_HSIOM ioss_0_port_7_pin_4_HSIOM
+#define CYBSP_EXT_CLK_IRQ ioss_interrupts_gpio_7_IRQn
+#define CYBSP_I2C_SCL_1V8_ENABLED 1U
+#define CYBSP_I2C_SCL_ENABLED CYBSP_I2C_SCL_1V8_ENABLED
+#define CYBSP_I2C_SCL_1V8_PORT GPIO_PRT8
+#define CYBSP_I2C_SCL_PORT CYBSP_I2C_SCL_1V8_PORT
+#define CYBSP_I2C_SCL_1V8_PORT_NUM 8U
+#define CYBSP_I2C_SCL_PORT_NUM CYBSP_I2C_SCL_1V8_PORT_NUM
+#define CYBSP_I2C_SCL_1V8_PIN 0U
+#define CYBSP_I2C_SCL_PIN CYBSP_I2C_SCL_1V8_PIN
+#define CYBSP_I2C_SCL_1V8_NUM 0U
+#define CYBSP_I2C_SCL_NUM CYBSP_I2C_SCL_1V8_NUM
+#define CYBSP_I2C_SCL_1V8_DRIVEMODE CY_GPIO_DM_OD_DRIVESLOW
+#define CYBSP_I2C_SCL_DRIVEMODE CYBSP_I2C_SCL_1V8_DRIVEMODE
+#define CYBSP_I2C_SCL_1V8_INIT_DRIVESTATE 1
+#define CYBSP_I2C_SCL_INIT_DRIVESTATE CYBSP_I2C_SCL_1V8_INIT_DRIVESTATE
+#ifndef ioss_0_port_8_pin_0_HSIOM
+ #define ioss_0_port_8_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2C_SCL_1V8_HSIOM ioss_0_port_8_pin_0_HSIOM
+#define CYBSP_I2C_SCL_HSIOM CYBSP_I2C_SCL_1V8_HSIOM
+#define CYBSP_I2C_SCL_1V8_IRQ ioss_interrupts_gpio_8_IRQn
+#define CYBSP_I2C_SCL_IRQ CYBSP_I2C_SCL_1V8_IRQ
+#define CYBSP_I2C_SDA_1V8_ENABLED 1U
+#define CYBSP_I2C_SDA_ENABLED CYBSP_I2C_SDA_1V8_ENABLED
+#define CYBSP_I2C_SDA_1V8_PORT GPIO_PRT8
+#define CYBSP_I2C_SDA_PORT CYBSP_I2C_SDA_1V8_PORT
+#define CYBSP_I2C_SDA_1V8_PORT_NUM 8U
+#define CYBSP_I2C_SDA_PORT_NUM CYBSP_I2C_SDA_1V8_PORT_NUM
+#define CYBSP_I2C_SDA_1V8_PIN 1U
+#define CYBSP_I2C_SDA_PIN CYBSP_I2C_SDA_1V8_PIN
+#define CYBSP_I2C_SDA_1V8_NUM 1U
+#define CYBSP_I2C_SDA_NUM CYBSP_I2C_SDA_1V8_NUM
+#define CYBSP_I2C_SDA_1V8_DRIVEMODE CY_GPIO_DM_OD_DRIVESLOW
+#define CYBSP_I2C_SDA_DRIVEMODE CYBSP_I2C_SDA_1V8_DRIVEMODE
+#define CYBSP_I2C_SDA_1V8_INIT_DRIVESTATE 1
+#define CYBSP_I2C_SDA_INIT_DRIVESTATE CYBSP_I2C_SDA_1V8_INIT_DRIVESTATE
+#ifndef ioss_0_port_8_pin_1_HSIOM
+ #define ioss_0_port_8_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2C_SDA_1V8_HSIOM ioss_0_port_8_pin_1_HSIOM
+#define CYBSP_I2C_SDA_HSIOM CYBSP_I2C_SDA_1V8_HSIOM
+#define CYBSP_I2C_SDA_1V8_IRQ ioss_interrupts_gpio_8_IRQn
+#define CYBSP_I2C_SDA_IRQ CYBSP_I2C_SDA_1V8_IRQ
+#define CYBSP_PDM_CLK_ENABLED 1U
+#define CYBSP_PDM_CLK_PORT GPIO_PRT8
+#define CYBSP_PDM_CLK_PORT_NUM 8U
+#define CYBSP_PDM_CLK_PIN 5U
+#define CYBSP_PDM_CLK_NUM 5U
+#define CYBSP_PDM_CLK_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_PDM_CLK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_8_pin_5_HSIOM
+ #define ioss_0_port_8_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_PDM_CLK_HSIOM ioss_0_port_8_pin_5_HSIOM
+#define CYBSP_PDM_CLK_IRQ ioss_interrupts_gpio_8_IRQn
+#define CYBSP_PDM_DATA_ENABLED 1U
+#define CYBSP_PDM_DATA_PORT GPIO_PRT8
+#define CYBSP_PDM_DATA_PORT_NUM 8U
+#define CYBSP_PDM_DATA_PIN 6U
+#define CYBSP_PDM_DATA_NUM 6U
+#define CYBSP_PDM_DATA_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_PDM_DATA_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_8_pin_6_HSIOM
+ #define ioss_0_port_8_pin_6_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_PDM_DATA_HSIOM ioss_0_port_8_pin_6_HSIOM
+#define CYBSP_PDM_DATA_IRQ ioss_interrupts_gpio_8_IRQn
+#define CYBSP_SERIAL_INT_0_ENABLED 1U
+#define CYBSP_SERIAL_INT_0_PORT GPIO_PRT9
+#define CYBSP_SERIAL_INT_0_PORT_NUM 9U
+#define CYBSP_SERIAL_INT_0_PIN 0U
+#define CYBSP_SERIAL_INT_0_NUM 0U
+#define CYBSP_SERIAL_INT_0_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_SERIAL_INT_0_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_9_pin_0_HSIOM
+ #define ioss_0_port_9_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_SERIAL_INT_0_HSIOM ioss_0_port_9_pin_0_HSIOM
+#define CYBSP_SERIAL_INT_0_IRQ ioss_interrupts_gpio_9_IRQn
+#define CYBSP_SERIAL_INT_2_ENABLED 1U
+#define CYBSP_SERIAL_INT_2_PORT GPIO_PRT9
+#define CYBSP_SERIAL_INT_2_PORT_NUM 9U
+#define CYBSP_SERIAL_INT_2_PIN 2U
+#define CYBSP_SERIAL_INT_2_NUM 2U
+#define CYBSP_SERIAL_INT_2_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_SERIAL_INT_2_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_9_pin_2_HSIOM
+ #define ioss_0_port_9_pin_2_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_SERIAL_INT_2_HSIOM ioss_0_port_9_pin_2_HSIOM
+#define CYBSP_SERIAL_INT_2_IRQ ioss_interrupts_gpio_9_IRQn
+#define CYBSP_BT_UART_RX_ENABLED 1U
+#define CYBSP_BT_UART_RX_PORT GPIO_PRT10
+#define CYBSP_BT_UART_RX_PORT_NUM 10U
+#define CYBSP_BT_UART_RX_PIN 0U
+#define CYBSP_BT_UART_RX_NUM 0U
+#define CYBSP_BT_UART_RX_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_BT_UART_RX_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_10_pin_0_HSIOM
+ #define ioss_0_port_10_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_UART_RX_HSIOM ioss_0_port_10_pin_0_HSIOM
+#define CYBSP_BT_UART_RX_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_BT_UART_TX_ENABLED 1U
+#define CYBSP_BT_UART_TX_PORT GPIO_PRT10
+#define CYBSP_BT_UART_TX_PORT_NUM 10U
+#define CYBSP_BT_UART_TX_PIN 1U
+#define CYBSP_BT_UART_TX_NUM 1U
+#define CYBSP_BT_UART_TX_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_BT_UART_TX_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_10_pin_1_HSIOM
+ #define ioss_0_port_10_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_UART_TX_HSIOM ioss_0_port_10_pin_1_HSIOM
+#define CYBSP_BT_UART_TX_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_BT_UART_CTS_ENABLED 1U
+#define CYBSP_BT_UART_CTS_PORT GPIO_PRT10
+#define CYBSP_BT_UART_CTS_PORT_NUM 10U
+#define CYBSP_BT_UART_CTS_PIN 2U
+#define CYBSP_BT_UART_CTS_NUM 2U
+#define CYBSP_BT_UART_CTS_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_BT_UART_CTS_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_10_pin_2_HSIOM
+ #define ioss_0_port_10_pin_2_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_UART_CTS_HSIOM ioss_0_port_10_pin_2_HSIOM
+#define CYBSP_BT_UART_CTS_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_BT_UART_RTS_ENABLED 1U
+#define CYBSP_BT_UART_RTS_PORT GPIO_PRT10
+#define CYBSP_BT_UART_RTS_PORT_NUM 10U
+#define CYBSP_BT_UART_RTS_PIN 3U
+#define CYBSP_BT_UART_RTS_NUM 3U
+#define CYBSP_BT_UART_RTS_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_BT_UART_RTS_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_10_pin_3_HSIOM
+ #define ioss_0_port_10_pin_3_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_UART_RTS_HSIOM ioss_0_port_10_pin_3_HSIOM
+#define CYBSP_BT_UART_RTS_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_BT_HOST_WAKE_ENABLED 1U
+#define CYBSP_BT_HOST_WAKE_PORT GPIO_PRT10
+#define CYBSP_BT_HOST_WAKE_PORT_NUM 10U
+#define CYBSP_BT_HOST_WAKE_PIN 4U
+#define CYBSP_BT_HOST_WAKE_NUM 4U
+#define CYBSP_BT_HOST_WAKE_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_BT_HOST_WAKE_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_10_pin_4_HSIOM
+ #define ioss_0_port_10_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_HOST_WAKE_HSIOM ioss_0_port_10_pin_4_HSIOM
+#define CYBSP_BT_HOST_WAKE_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_USER_LED2_ENABLED 1U
+#define CYBSP_USER_LED2_PORT GPIO_PRT10
+#define CYBSP_USER_LED2_PORT_NUM 10U
+#define CYBSP_USER_LED2_PIN 5U
+#define CYBSP_USER_LED2_NUM 5U
+#define CYBSP_USER_LED2_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_USER_LED2_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_10_pin_5_HSIOM
+ #define ioss_0_port_10_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_USER_LED2_HSIOM ioss_0_port_10_pin_5_HSIOM
+#define CYBSP_USER_LED2_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_BT_DEVICE_WAKE_ENABLED 1U
+#define CYBSP_BT_DEVICE_WAKE_PORT GPIO_PRT10
+#define CYBSP_BT_DEVICE_WAKE_PORT_NUM 10U
+#define CYBSP_BT_DEVICE_WAKE_PIN 6U
+#define CYBSP_BT_DEVICE_WAKE_NUM 6U
+#define CYBSP_BT_DEVICE_WAKE_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_BT_DEVICE_WAKE_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_10_pin_6_HSIOM
+ #define ioss_0_port_10_pin_6_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_DEVICE_WAKE_HSIOM ioss_0_port_10_pin_6_HSIOM
+#define CYBSP_BT_DEVICE_WAKE_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_USER_LED1_ENABLED 1U
+#define CYBSP_USER_LED_ENABLED CYBSP_USER_LED1_ENABLED
+#define CYBSP_USER_LED1_PORT GPIO_PRT10
+#define CYBSP_USER_LED_PORT CYBSP_USER_LED1_PORT
+#define CYBSP_USER_LED1_PORT_NUM 10U
+#define CYBSP_USER_LED_PORT_NUM CYBSP_USER_LED1_PORT_NUM
+#define CYBSP_USER_LED1_PIN 7U
+#define CYBSP_USER_LED_PIN CYBSP_USER_LED1_PIN
+#define CYBSP_USER_LED1_NUM 7U
+#define CYBSP_USER_LED_NUM CYBSP_USER_LED1_NUM
+#define CYBSP_USER_LED1_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_USER_LED_DRIVEMODE CYBSP_USER_LED1_DRIVEMODE
+#define CYBSP_USER_LED1_INIT_DRIVESTATE 0
+#define CYBSP_USER_LED_INIT_DRIVESTATE CYBSP_USER_LED1_INIT_DRIVESTATE
+#ifndef ioss_0_port_10_pin_7_HSIOM
+ #define ioss_0_port_10_pin_7_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_USER_LED1_HSIOM ioss_0_port_10_pin_7_HSIOM
+#define CYBSP_USER_LED_HSIOM CYBSP_USER_LED1_HSIOM
+#define CYBSP_USER_LED1_IRQ ioss_interrupts_gpio_10_IRQn
+#define CYBSP_USER_LED_IRQ CYBSP_USER_LED1_IRQ
+#define CYBSP_BT_POWER_ENABLED 1U
+#define CYBSP_BT_POWER_PORT GPIO_PRT11
+#define CYBSP_BT_POWER_PORT_NUM 11U
+#define CYBSP_BT_POWER_PIN 0U
+#define CYBSP_BT_POWER_NUM 0U
+#define CYBSP_BT_POWER_DRIVEMODE CY_GPIO_DM_PULLUP
+#define CYBSP_BT_POWER_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_11_pin_0_HSIOM
+ #define ioss_0_port_11_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_BT_POWER_HSIOM ioss_0_port_11_pin_0_HSIOM
+#define CYBSP_BT_POWER_IRQ ioss_interrupts_gpio_11_IRQn
+#define CYBSP_DVP_CAM_PCLK_ENABLED 1U
+#define CYBSP_DVP_CAM_PCLK_PORT GPIO_PRT11
+#define CYBSP_DVP_CAM_PCLK_PORT_NUM 11U
+#define CYBSP_DVP_CAM_PCLK_PIN 1U
+#define CYBSP_DVP_CAM_PCLK_NUM 1U
+#define CYBSP_DVP_CAM_PCLK_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_PCLK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_11_pin_1_HSIOM
+ #define ioss_0_port_11_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_PCLK_HSIOM ioss_0_port_11_pin_1_HSIOM
+#define CYBSP_DVP_CAM_PCLK_IRQ ioss_interrupts_gpio_11_IRQn
+#define CYBSP_WIFI_WL_REG_ON_ENABLED 1U
+#define CYBSP_WIFI_WL_REG_ON_PORT GPIO_PRT11
+#define CYBSP_WIFI_WL_REG_ON_PORT_NUM 11U
+#define CYBSP_WIFI_WL_REG_ON_PIN 4U
+#define CYBSP_WIFI_WL_REG_ON_NUM 4U
+#define CYBSP_WIFI_WL_REG_ON_DRIVEMODE CY_GPIO_DM_OD_DRIVESLOW
+#define CYBSP_WIFI_WL_REG_ON_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_11_pin_4_HSIOM
+ #define ioss_0_port_11_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_WL_REG_ON_HSIOM ioss_0_port_11_pin_4_HSIOM
+#define CYBSP_WIFI_WL_REG_ON_IRQ ioss_interrupts_gpio_11_IRQn
+#define CYBSP_WIFI_HOST_WAKE_ENABLED 1U
+#define CYBSP_WIFI_HOST_WAKE_PORT GPIO_PRT11
+#define CYBSP_WIFI_HOST_WAKE_PORT_NUM 11U
+#define CYBSP_WIFI_HOST_WAKE_PIN 6U
+#define CYBSP_WIFI_HOST_WAKE_NUM 6U
+#define CYBSP_WIFI_HOST_WAKE_DRIVEMODE CY_GPIO_DM_OD_DRIVESLOW
+#define CYBSP_WIFI_HOST_WAKE_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_11_pin_6_HSIOM
+ #define ioss_0_port_11_pin_6_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_HOST_WAKE_HSIOM ioss_0_port_11_pin_6_HSIOM
+#define CYBSP_WIFI_HOST_WAKE_IRQ ioss_interrupts_gpio_11_IRQn
+#define CYBSP_WIFI_SDIO_CLK_ENABLED 1U
+#define CYBSP_WIFI_SDIO_CLK_PORT GPIO_PRT12
+#define CYBSP_WIFI_SDIO_CLK_PORT_NUM 12U
+#define CYBSP_WIFI_SDIO_CLK_PIN 0U
+#define CYBSP_WIFI_SDIO_CLK_NUM 0U
+#define CYBSP_WIFI_SDIO_CLK_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_WIFI_SDIO_CLK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_12_pin_0_HSIOM
+ #define ioss_0_port_12_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_SDIO_CLK_HSIOM ioss_0_port_12_pin_0_HSIOM
+#define CYBSP_WIFI_SDIO_CLK_IRQ ioss_interrupts_gpio_12_IRQn
+#define CYBSP_WIFI_SDIO_D0_ENABLED 1U
+#define CYBSP_WIFI_SDIO_D0_PORT GPIO_PRT12
+#define CYBSP_WIFI_SDIO_D0_PORT_NUM 12U
+#define CYBSP_WIFI_SDIO_D0_PIN 1U
+#define CYBSP_WIFI_SDIO_D0_NUM 1U
+#define CYBSP_WIFI_SDIO_D0_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_WIFI_SDIO_D0_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_12_pin_1_HSIOM
+ #define ioss_0_port_12_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_SDIO_D0_HSIOM ioss_0_port_12_pin_1_HSIOM
+#define CYBSP_WIFI_SDIO_D0_IRQ ioss_interrupts_gpio_12_IRQn
+#define CYBSP_WIFI_SDIO_D1_ENABLED 1U
+#define CYBSP_WIFI_SDIO_D1_PORT GPIO_PRT12
+#define CYBSP_WIFI_SDIO_D1_PORT_NUM 12U
+#define CYBSP_WIFI_SDIO_D1_PIN 2U
+#define CYBSP_WIFI_SDIO_D1_NUM 2U
+#define CYBSP_WIFI_SDIO_D1_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_WIFI_SDIO_D1_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_12_pin_2_HSIOM
+ #define ioss_0_port_12_pin_2_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_SDIO_D1_HSIOM ioss_0_port_12_pin_2_HSIOM
+#define CYBSP_WIFI_SDIO_D1_IRQ ioss_interrupts_gpio_12_IRQn
+#define CYBSP_I2S_TX_FSYNC_ENABLED 1U
+#define CYBSP_I2S_TX_FSYNC_PORT GPIO_PRT12
+#define CYBSP_I2S_TX_FSYNC_PORT_NUM 12U
+#define CYBSP_I2S_TX_FSYNC_PIN 3U
+#define CYBSP_I2S_TX_FSYNC_NUM 3U
+#define CYBSP_I2S_TX_FSYNC_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_I2S_TX_FSYNC_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_12_pin_3_HSIOM
+ #define ioss_0_port_12_pin_3_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2S_TX_FSYNC_HSIOM ioss_0_port_12_pin_3_HSIOM
+#define CYBSP_I2S_TX_FSYNC_IRQ ioss_interrupts_gpio_12_IRQn
+#define CYBSP_WIFI_SDIO_D2_ENABLED 1U
+#define CYBSP_WIFI_SDIO_D2_PORT GPIO_PRT12
+#define CYBSP_WIFI_SDIO_D2_PORT_NUM 12U
+#define CYBSP_WIFI_SDIO_D2_PIN 4U
+#define CYBSP_WIFI_SDIO_D2_NUM 4U
+#define CYBSP_WIFI_SDIO_D2_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_WIFI_SDIO_D2_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_12_pin_4_HSIOM
+ #define ioss_0_port_12_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_SDIO_D2_HSIOM ioss_0_port_12_pin_4_HSIOM
+#define CYBSP_WIFI_SDIO_D2_IRQ ioss_interrupts_gpio_12_IRQn
+#define CYBSP_WIFI_SDIO_D3_ENABLED 1U
+#define CYBSP_WIFI_SDIO_D3_PORT GPIO_PRT12
+#define CYBSP_WIFI_SDIO_D3_PORT_NUM 12U
+#define CYBSP_WIFI_SDIO_D3_PIN 5U
+#define CYBSP_WIFI_SDIO_D3_NUM 5U
+#define CYBSP_WIFI_SDIO_D3_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_WIFI_SDIO_D3_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_12_pin_5_HSIOM
+ #define ioss_0_port_12_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_SDIO_D3_HSIOM ioss_0_port_12_pin_5_HSIOM
+#define CYBSP_WIFI_SDIO_D3_IRQ ioss_interrupts_gpio_12_IRQn
+#define CYBSP_DVP_CAM_D0_ENABLED 1U
+#define CYBSP_DVP_CAM_D0_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D0_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D0_PIN 0U
+#define CYBSP_DVP_CAM_D0_NUM 0U
+#define CYBSP_DVP_CAM_D0_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D0_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_0_HSIOM
+ #define ioss_0_port_16_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D0_HSIOM ioss_0_port_16_pin_0_HSIOM
+#define CYBSP_DVP_CAM_D0_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D1_ENABLED 1U
+#define CYBSP_DVP_CAM_D1_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D1_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D1_PIN 1U
+#define CYBSP_DVP_CAM_D1_NUM 1U
+#define CYBSP_DVP_CAM_D1_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D1_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_1_HSIOM
+ #define ioss_0_port_16_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D1_HSIOM ioss_0_port_16_pin_1_HSIOM
+#define CYBSP_DVP_CAM_D1_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D2_ENABLED 1U
+#define CYBSP_DVP_CAM_D2_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D2_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D2_PIN 2U
+#define CYBSP_DVP_CAM_D2_NUM 2U
+#define CYBSP_DVP_CAM_D2_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D2_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_2_HSIOM
+ #define ioss_0_port_16_pin_2_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D2_HSIOM ioss_0_port_16_pin_2_HSIOM
+#define CYBSP_DVP_CAM_D2_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D3_ENABLED 1U
+#define CYBSP_DVP_CAM_D3_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D3_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D3_PIN 3U
+#define CYBSP_DVP_CAM_D3_NUM 3U
+#define CYBSP_DVP_CAM_D3_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D3_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_3_HSIOM
+ #define ioss_0_port_16_pin_3_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D3_HSIOM ioss_0_port_16_pin_3_HSIOM
+#define CYBSP_DVP_CAM_D3_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D4_ENABLED 1U
+#define CYBSP_DVP_CAM_D4_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D4_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D4_PIN 4U
+#define CYBSP_DVP_CAM_D4_NUM 4U
+#define CYBSP_DVP_CAM_D4_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D4_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_4_HSIOM
+ #define ioss_0_port_16_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D4_HSIOM ioss_0_port_16_pin_4_HSIOM
+#define CYBSP_DVP_CAM_D4_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D5_ENABLED 1U
+#define CYBSP_DVP_CAM_D5_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D5_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D5_PIN 5U
+#define CYBSP_DVP_CAM_D5_NUM 5U
+#define CYBSP_DVP_CAM_D5_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D5_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_5_HSIOM
+ #define ioss_0_port_16_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D5_HSIOM ioss_0_port_16_pin_5_HSIOM
+#define CYBSP_DVP_CAM_D5_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D6_ENABLED 1U
+#define CYBSP_DVP_CAM_D6_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D6_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D6_PIN 6U
+#define CYBSP_DVP_CAM_D6_NUM 6U
+#define CYBSP_DVP_CAM_D6_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D6_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_6_HSIOM
+ #define ioss_0_port_16_pin_6_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D6_HSIOM ioss_0_port_16_pin_6_HSIOM
+#define CYBSP_DVP_CAM_D6_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_DVP_CAM_D7_ENABLED 1U
+#define CYBSP_DVP_CAM_D7_PORT GPIO_PRT16
+#define CYBSP_DVP_CAM_D7_PORT_NUM 16U
+#define CYBSP_DVP_CAM_D7_PIN 7U
+#define CYBSP_DVP_CAM_D7_NUM 7U
+#define CYBSP_DVP_CAM_D7_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_D7_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_16_pin_7_HSIOM
+ #define ioss_0_port_16_pin_7_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_D7_HSIOM ioss_0_port_16_pin_7_HSIOM
+#define CYBSP_DVP_CAM_D7_IRQ ioss_interrupts_gpio_16_IRQn
+#define CYBSP_I2C_SCL_3V3_ENABLED 1U
+#define CYBSP_I2C_SCL_3V3_PORT GPIO_PRT17
+#define CYBSP_I2C_SCL_3V3_PORT_NUM 17U
+#define CYBSP_I2C_SCL_3V3_PIN 0U
+#define CYBSP_I2C_SCL_3V3_NUM 0U
+#define CYBSP_I2C_SCL_3V3_DRIVEMODE CY_GPIO_DM_OD_DRIVESLOW
+#define CYBSP_I2C_SCL_3V3_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_17_pin_0_HSIOM
+ #define ioss_0_port_17_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2C_SCL_3V3_HSIOM ioss_0_port_17_pin_0_HSIOM
+#define CYBSP_I2C_SCL_3V3_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_I2C_SDA_3V3_ENABLED 1U
+#define CYBSP_I2C_SDA_3V3_PORT GPIO_PRT17
+#define CYBSP_I2C_SDA_3V3_PORT_NUM 17U
+#define CYBSP_I2C_SDA_3V3_PIN 1U
+#define CYBSP_I2C_SDA_3V3_NUM 1U
+#define CYBSP_I2C_SDA_3V3_DRIVEMODE CY_GPIO_DM_OD_DRIVESLOW
+#define CYBSP_I2C_SDA_3V3_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_17_pin_1_HSIOM
+ #define ioss_0_port_17_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2C_SDA_3V3_HSIOM ioss_0_port_17_pin_1_HSIOM
+#define CYBSP_I2C_SDA_3V3_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_DVP_CAM_VSYNC_ENABLED 1U
+#define CYBSP_DVP_CAM_VSYNC_PORT GPIO_PRT17
+#define CYBSP_DVP_CAM_VSYNC_PORT_NUM 17U
+#define CYBSP_DVP_CAM_VSYNC_PIN 2U
+#define CYBSP_DVP_CAM_VSYNC_NUM 2U
+#define CYBSP_DVP_CAM_VSYNC_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_VSYNC_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_17_pin_2_HSIOM
+ #define ioss_0_port_17_pin_2_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_VSYNC_HSIOM ioss_0_port_17_pin_2_HSIOM
+#define CYBSP_DVP_CAM_VSYNC_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_DVP_CAM_HREF_ENABLED 1U
+#define CYBSP_DVP_CAM_HREF_PORT GPIO_PRT17
+#define CYBSP_DVP_CAM_HREF_PORT_NUM 17U
+#define CYBSP_DVP_CAM_HREF_PIN 3U
+#define CYBSP_DVP_CAM_HREF_NUM 3U
+#define CYBSP_DVP_CAM_HREF_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_DVP_CAM_HREF_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_17_pin_3_HSIOM
+ #define ioss_0_port_17_pin_3_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_HREF_HSIOM ioss_0_port_17_pin_3_HSIOM
+#define CYBSP_DVP_CAM_HREF_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_DVP_CAM_XCLK_ENABLED 1U
+#define CYBSP_DVP_CAM_XCLK_PORT GPIO_PRT17
+#define CYBSP_DVP_CAM_XCLK_PORT_NUM 17U
+#define CYBSP_DVP_CAM_XCLK_PIN 4U
+#define CYBSP_DVP_CAM_XCLK_NUM 4U
+#define CYBSP_DVP_CAM_XCLK_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_DVP_CAM_XCLK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_17_pin_4_HSIOM
+ #define ioss_0_port_17_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_XCLK_HSIOM ioss_0_port_17_pin_4_HSIOM
+#define CYBSP_DVP_CAM_XCLK_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_DVP_CAM_RESET_ENABLED 1U
+#define CYBSP_DVP_CAM_RESET_PORT GPIO_PRT17
+#define CYBSP_DVP_CAM_RESET_PORT_NUM 17U
+#define CYBSP_DVP_CAM_RESET_PIN 5U
+#define CYBSP_DVP_CAM_RESET_NUM 5U
+#define CYBSP_DVP_CAM_RESET_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_DVP_CAM_RESET_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_17_pin_5_HSIOM
+ #define ioss_0_port_17_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_RESET_HSIOM ioss_0_port_17_pin_5_HSIOM
+#define CYBSP_DVP_CAM_RESET_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_DVP_CAM_PWDN_ENABLED 1U
+#define CYBSP_DVP_CAM_PWDN_PORT GPIO_PRT17
+#define CYBSP_DVP_CAM_PWDN_PORT_NUM 17U
+#define CYBSP_DVP_CAM_PWDN_PIN 7U
+#define CYBSP_DVP_CAM_PWDN_NUM 7U
+#define CYBSP_DVP_CAM_PWDN_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_DVP_CAM_PWDN_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_17_pin_7_HSIOM
+ #define ioss_0_port_17_pin_7_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_DVP_CAM_PWDN_HSIOM ioss_0_port_17_pin_7_HSIOM
+#define CYBSP_DVP_CAM_PWDN_IRQ ioss_interrupts_gpio_17_IRQn
+#define CYBSP_WCO_OUT_ENABLED 1U
+#define CYBSP_WCO_OUT_PORT GPIO_PRT18
+#define CYBSP_WCO_OUT_PORT_NUM 18U
+#define CYBSP_WCO_OUT_PIN 0U
+#define CYBSP_WCO_OUT_NUM 0U
+#define CYBSP_WCO_OUT_DRIVEMODE CY_GPIO_DM_ANALOG
+#define CYBSP_WCO_OUT_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_18_pin_0_HSIOM
+ #define ioss_0_port_18_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WCO_OUT_HSIOM ioss_0_port_18_pin_0_HSIOM
+#define CYBSP_WCO_OUT_IRQ ioss_interrupts_gpio_18_IRQn
+#define CYBSP_WCO_IN_ENABLED 1U
+#define CYBSP_WCO_IN_PORT GPIO_PRT18
+#define CYBSP_WCO_IN_PORT_NUM 18U
+#define CYBSP_WCO_IN_PIN 1U
+#define CYBSP_WCO_IN_NUM 1U
+#define CYBSP_WCO_IN_DRIVEMODE CY_GPIO_DM_ANALOG
+#define CYBSP_WCO_IN_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_18_pin_1_HSIOM
+ #define ioss_0_port_18_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WCO_IN_HSIOM ioss_0_port_18_pin_1_HSIOM
+#define CYBSP_WCO_IN_IRQ ioss_interrupts_gpio_18_IRQn
+#define CYBSP_ECO_IN_ENABLED 1U
+#define CYBSP_ECO_IN_PORT GPIO_PRT19
+#define CYBSP_ECO_IN_PORT_NUM 19U
+#define CYBSP_ECO_IN_PIN 0U
+#define CYBSP_ECO_IN_NUM 0U
+#define CYBSP_ECO_IN_DRIVEMODE CY_GPIO_DM_ANALOG
+#define CYBSP_ECO_IN_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_19_pin_0_HSIOM
+ #define ioss_0_port_19_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_ECO_IN_HSIOM ioss_0_port_19_pin_0_HSIOM
+#define CYBSP_ECO_IN_IRQ ioss_interrupts_gpio_19_IRQn
+#define CYBSP_ECO_OUT_ENABLED 1U
+#define CYBSP_ECO_OUT_PORT GPIO_PRT19
+#define CYBSP_ECO_OUT_PORT_NUM 19U
+#define CYBSP_ECO_OUT_PIN 1U
+#define CYBSP_ECO_OUT_NUM 1U
+#define CYBSP_ECO_OUT_DRIVEMODE CY_GPIO_DM_ANALOG
+#define CYBSP_ECO_OUT_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_19_pin_1_HSIOM
+ #define ioss_0_port_19_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_ECO_OUT_HSIOM ioss_0_port_19_pin_1_HSIOM
+#define CYBSP_ECO_OUT_IRQ ioss_interrupts_gpio_19_IRQn
+#define CYBSP_RADAR_INT_ENABLED 1U
+#define CYBSP_RADAR_INT_PORT GPIO_PRT20
+#define CYBSP_RADAR_INT_PORT_NUM 20U
+#define CYBSP_RADAR_INT_PIN 3U
+#define CYBSP_RADAR_INT_NUM 3U
+#define CYBSP_RADAR_INT_DRIVEMODE CY_GPIO_DM_PULLDOWN_IN_OFF
+#define CYBSP_RADAR_INT_INIT_DRIVESTATE 0
+#ifndef ioss_0_port_20_pin_3_HSIOM
+ #define ioss_0_port_20_pin_3_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_RADAR_INT_HSIOM ioss_0_port_20_pin_3_HSIOM
+#define CYBSP_RADAR_INT_IRQ ioss_interrupts_gpio_20_IRQn
+#define CYBSP_LED_RGB_GREEN_ENABLED 1U
+#define CYBSP_USER_LED5_ENABLED CYBSP_LED_RGB_GREEN_ENABLED
+#define CYBSP_LED_RGB_GREEN_PORT GPIO_PRT20
+#define CYBSP_USER_LED5_PORT CYBSP_LED_RGB_GREEN_PORT
+#define CYBSP_LED_RGB_GREEN_PORT_NUM 20U
+#define CYBSP_USER_LED5_PORT_NUM CYBSP_LED_RGB_GREEN_PORT_NUM
+#define CYBSP_LED_RGB_GREEN_PIN 4U
+#define CYBSP_USER_LED5_PIN CYBSP_LED_RGB_GREEN_PIN
+#define CYBSP_LED_RGB_GREEN_NUM 4U
+#define CYBSP_USER_LED5_NUM CYBSP_LED_RGB_GREEN_NUM
+#define CYBSP_LED_RGB_GREEN_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_USER_LED5_DRIVEMODE CYBSP_LED_RGB_GREEN_DRIVEMODE
+#define CYBSP_LED_RGB_GREEN_INIT_DRIVESTATE 0
+#define CYBSP_USER_LED5_INIT_DRIVESTATE CYBSP_LED_RGB_GREEN_INIT_DRIVESTATE
+#ifndef ioss_0_port_20_pin_4_HSIOM
+ #define ioss_0_port_20_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_LED_RGB_GREEN_HSIOM ioss_0_port_20_pin_4_HSIOM
+#define CYBSP_USER_LED5_HSIOM CYBSP_LED_RGB_GREEN_HSIOM
+#define CYBSP_LED_RGB_GREEN_IRQ ioss_interrupts_gpio_20_IRQn
+#define CYBSP_USER_LED5_IRQ CYBSP_LED_RGB_GREEN_IRQ
+#define CYBSP_LED_RGB_BLUE_ENABLED 1U
+#define CYBSP_USER_LED4_ENABLED CYBSP_LED_RGB_BLUE_ENABLED
+#define CYBSP_LED_RGB_BLUE_PORT GPIO_PRT20
+#define CYBSP_USER_LED4_PORT CYBSP_LED_RGB_BLUE_PORT
+#define CYBSP_LED_RGB_BLUE_PORT_NUM 20U
+#define CYBSP_USER_LED4_PORT_NUM CYBSP_LED_RGB_BLUE_PORT_NUM
+#define CYBSP_LED_RGB_BLUE_PIN 5U
+#define CYBSP_USER_LED4_PIN CYBSP_LED_RGB_BLUE_PIN
+#define CYBSP_LED_RGB_BLUE_NUM 5U
+#define CYBSP_USER_LED4_NUM CYBSP_LED_RGB_BLUE_NUM
+#define CYBSP_LED_RGB_BLUE_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_USER_LED4_DRIVEMODE CYBSP_LED_RGB_BLUE_DRIVEMODE
+#define CYBSP_LED_RGB_BLUE_INIT_DRIVESTATE 0
+#define CYBSP_USER_LED4_INIT_DRIVESTATE CYBSP_LED_RGB_BLUE_INIT_DRIVESTATE
+#ifndef ioss_0_port_20_pin_5_HSIOM
+ #define ioss_0_port_20_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_LED_RGB_BLUE_HSIOM ioss_0_port_20_pin_5_HSIOM
+#define CYBSP_USER_LED4_HSIOM CYBSP_LED_RGB_BLUE_HSIOM
+#define CYBSP_LED_RGB_BLUE_IRQ ioss_interrupts_gpio_20_IRQn
+#define CYBSP_USER_LED4_IRQ CYBSP_LED_RGB_BLUE_IRQ
+#define CYBSP_LED_RGB_RED_ENABLED 1U
+#define CYBSP_USER_LED3_ENABLED CYBSP_LED_RGB_RED_ENABLED
+#define CYBSP_LED_RGB_RED_PORT GPIO_PRT20
+#define CYBSP_USER_LED3_PORT CYBSP_LED_RGB_RED_PORT
+#define CYBSP_LED_RGB_RED_PORT_NUM 20U
+#define CYBSP_USER_LED3_PORT_NUM CYBSP_LED_RGB_RED_PORT_NUM
+#define CYBSP_LED_RGB_RED_PIN 6U
+#define CYBSP_USER_LED3_PIN CYBSP_LED_RGB_RED_PIN
+#define CYBSP_LED_RGB_RED_NUM 6U
+#define CYBSP_USER_LED3_NUM CYBSP_LED_RGB_RED_NUM
+#define CYBSP_LED_RGB_RED_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_USER_LED3_DRIVEMODE CYBSP_LED_RGB_RED_DRIVEMODE
+#define CYBSP_LED_RGB_RED_INIT_DRIVESTATE 0
+#define CYBSP_USER_LED3_INIT_DRIVESTATE CYBSP_LED_RGB_RED_INIT_DRIVESTATE
+#ifndef ioss_0_port_20_pin_6_HSIOM
+ #define ioss_0_port_20_pin_6_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_LED_RGB_RED_HSIOM ioss_0_port_20_pin_6_HSIOM
+#define CYBSP_USER_LED3_HSIOM CYBSP_LED_RGB_RED_HSIOM
+#define CYBSP_LED_RGB_RED_IRQ ioss_interrupts_gpio_20_IRQn
+#define CYBSP_USER_LED3_IRQ CYBSP_LED_RGB_RED_IRQ
+#define CYBSP_RXRES_L_ENABLED 1U
+#define CYBSP_RADAR_RESET_ENABLED CYBSP_RXRES_L_ENABLED
+#define CYBSP_RXRES_L_PORT GPIO_PRT20
+#define CYBSP_RADAR_RESET_PORT CYBSP_RXRES_L_PORT
+#define CYBSP_RXRES_L_PORT_NUM 20U
+#define CYBSP_RADAR_RESET_PORT_NUM CYBSP_RXRES_L_PORT_NUM
+#define CYBSP_RXRES_L_PIN 7U
+#define CYBSP_RADAR_RESET_PIN CYBSP_RXRES_L_PIN
+#define CYBSP_RXRES_L_NUM 7U
+#define CYBSP_RADAR_RESET_NUM CYBSP_RXRES_L_NUM
+#define CYBSP_RXRES_L_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_RADAR_RESET_DRIVEMODE CYBSP_RXRES_L_DRIVEMODE
+#define CYBSP_RXRES_L_INIT_DRIVESTATE 1
+#define CYBSP_RADAR_RESET_INIT_DRIVESTATE CYBSP_RXRES_L_INIT_DRIVESTATE
+#ifndef ioss_0_port_20_pin_7_HSIOM
+ #define ioss_0_port_20_pin_7_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_RXRES_L_HSIOM ioss_0_port_20_pin_7_HSIOM
+#define CYBSP_RADAR_RESET_HSIOM CYBSP_RXRES_L_HSIOM
+#define CYBSP_RXRES_L_IRQ ioss_interrupts_gpio_20_IRQn
+#define CYBSP_RADAR_RESET_IRQ CYBSP_RXRES_L_IRQ
+#define CYBSP_WIFI_SDIO_CMD_ENABLED 1U
+#define CYBSP_WIFI_SDIO_CMD_PORT GPIO_PRT21
+#define CYBSP_WIFI_SDIO_CMD_PORT_NUM 21U
+#define CYBSP_WIFI_SDIO_CMD_PIN 0U
+#define CYBSP_WIFI_SDIO_CMD_NUM 0U
+#define CYBSP_WIFI_SDIO_CMD_DRIVEMODE CY_GPIO_DM_STRONG
+#define CYBSP_WIFI_SDIO_CMD_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_21_pin_0_HSIOM
+ #define ioss_0_port_21_pin_0_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_WIFI_SDIO_CMD_HSIOM ioss_0_port_21_pin_0_HSIOM
+#define CYBSP_WIFI_SDIO_CMD_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_I2S_TX_SD_ENABLED 1U
+#define CYBSP_I2S_TX_SD_PORT GPIO_PRT21
+#define CYBSP_I2S_TX_SD_PORT_NUM 21U
+#define CYBSP_I2S_TX_SD_PIN 1U
+#define CYBSP_I2S_TX_SD_NUM 1U
+#define CYBSP_I2S_TX_SD_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_I2S_TX_SD_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_21_pin_1_HSIOM
+ #define ioss_0_port_21_pin_1_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2S_TX_SD_HSIOM ioss_0_port_21_pin_1_HSIOM
+#define CYBSP_I2S_TX_SD_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_I2S_TX_SCK_ENABLED 1U
+#define CYBSP_I2S_TX_SCK_PORT GPIO_PRT21
+#define CYBSP_I2S_TX_SCK_PORT_NUM 21U
+#define CYBSP_I2S_TX_SCK_PIN 2U
+#define CYBSP_I2S_TX_SCK_NUM 2U
+#define CYBSP_I2S_TX_SCK_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_I2S_TX_SCK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_21_pin_2_HSIOM
+ #define ioss_0_port_21_pin_2_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2S_TX_SCK_HSIOM ioss_0_port_21_pin_2_HSIOM
+#define CYBSP_I2S_TX_SCK_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_I2S_TX_MCK_ENABLED 1U
+#define CYBSP_I2S_TX_MCK_PORT GPIO_PRT21
+#define CYBSP_I2S_TX_MCK_PORT_NUM 21U
+#define CYBSP_I2S_TX_MCK_PIN 3U
+#define CYBSP_I2S_TX_MCK_NUM 3U
+#define CYBSP_I2S_TX_MCK_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_I2S_TX_MCK_INIT_DRIVESTATE 1
+#ifndef ioss_0_port_21_pin_3_HSIOM
+ #define ioss_0_port_21_pin_3_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_I2S_TX_MCK_HSIOM ioss_0_port_21_pin_3_HSIOM
+#define CYBSP_I2S_TX_MCK_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_RSPI_MISO_ENABLED 1U
+#define CYBSP_SPI_MISO_ENABLED CYBSP_RSPI_MISO_ENABLED
+#define CYBSP_RSPI_MISO_PORT GPIO_PRT21
+#define CYBSP_SPI_MISO_PORT CYBSP_RSPI_MISO_PORT
+#define CYBSP_RSPI_MISO_PORT_NUM 21U
+#define CYBSP_SPI_MISO_PORT_NUM CYBSP_RSPI_MISO_PORT_NUM
+#define CYBSP_RSPI_MISO_PIN 4U
+#define CYBSP_SPI_MISO_PIN CYBSP_RSPI_MISO_PIN
+#define CYBSP_RSPI_MISO_NUM 4U
+#define CYBSP_SPI_MISO_NUM CYBSP_RSPI_MISO_NUM
+#define CYBSP_RSPI_MISO_DRIVEMODE CY_GPIO_DM_HIGHZ
+#define CYBSP_SPI_MISO_DRIVEMODE CYBSP_RSPI_MISO_DRIVEMODE
+#define CYBSP_RSPI_MISO_INIT_DRIVESTATE 1
+#define CYBSP_SPI_MISO_INIT_DRIVESTATE CYBSP_RSPI_MISO_INIT_DRIVESTATE
+#ifndef ioss_0_port_21_pin_4_HSIOM
+ #define ioss_0_port_21_pin_4_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_RSPI_MISO_HSIOM ioss_0_port_21_pin_4_HSIOM
+#define CYBSP_SPI_MISO_HSIOM CYBSP_RSPI_MISO_HSIOM
+#define CYBSP_RSPI_MISO_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_SPI_MISO_IRQ CYBSP_RSPI_MISO_IRQ
+#define CYBSP_RSPI_MOSI_ENABLED 1U
+#define CYBSP_SPI_MOSI_ENABLED CYBSP_RSPI_MOSI_ENABLED
+#define CYBSP_RSPI_MOSI_PORT GPIO_PRT21
+#define CYBSP_SPI_MOSI_PORT CYBSP_RSPI_MOSI_PORT
+#define CYBSP_RSPI_MOSI_PORT_NUM 21U
+#define CYBSP_SPI_MOSI_PORT_NUM CYBSP_RSPI_MOSI_PORT_NUM
+#define CYBSP_RSPI_MOSI_PIN 5U
+#define CYBSP_SPI_MOSI_PIN CYBSP_RSPI_MOSI_PIN
+#define CYBSP_RSPI_MOSI_NUM 5U
+#define CYBSP_SPI_MOSI_NUM CYBSP_RSPI_MOSI_NUM
+#define CYBSP_RSPI_MOSI_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_SPI_MOSI_DRIVEMODE CYBSP_RSPI_MOSI_DRIVEMODE
+#define CYBSP_RSPI_MOSI_INIT_DRIVESTATE 1
+#define CYBSP_SPI_MOSI_INIT_DRIVESTATE CYBSP_RSPI_MOSI_INIT_DRIVESTATE
+#ifndef ioss_0_port_21_pin_5_HSIOM
+ #define ioss_0_port_21_pin_5_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_RSPI_MOSI_HSIOM ioss_0_port_21_pin_5_HSIOM
+#define CYBSP_SPI_MOSI_HSIOM CYBSP_RSPI_MOSI_HSIOM
+#define CYBSP_RSPI_MOSI_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_SPI_MOSI_IRQ CYBSP_RSPI_MOSI_IRQ
+#define CYBSP_RSPI_CLK_ENABLED 1U
+#define CYBSP_SPI_CLK_ENABLED CYBSP_RSPI_CLK_ENABLED
+#define CYBSP_RSPI_CLK_PORT GPIO_PRT21
+#define CYBSP_SPI_CLK_PORT CYBSP_RSPI_CLK_PORT
+#define CYBSP_RSPI_CLK_PORT_NUM 21U
+#define CYBSP_SPI_CLK_PORT_NUM CYBSP_RSPI_CLK_PORT_NUM
+#define CYBSP_RSPI_CLK_PIN 6U
+#define CYBSP_SPI_CLK_PIN CYBSP_RSPI_CLK_PIN
+#define CYBSP_RSPI_CLK_NUM 6U
+#define CYBSP_SPI_CLK_NUM CYBSP_RSPI_CLK_NUM
+#define CYBSP_RSPI_CLK_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_SPI_CLK_DRIVEMODE CYBSP_RSPI_CLK_DRIVEMODE
+#define CYBSP_RSPI_CLK_INIT_DRIVESTATE 1
+#define CYBSP_SPI_CLK_INIT_DRIVESTATE CYBSP_RSPI_CLK_INIT_DRIVESTATE
+#ifndef ioss_0_port_21_pin_6_HSIOM
+ #define ioss_0_port_21_pin_6_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_RSPI_CLK_HSIOM ioss_0_port_21_pin_6_HSIOM
+#define CYBSP_SPI_CLK_HSIOM CYBSP_RSPI_CLK_HSIOM
+#define CYBSP_RSPI_CLK_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_SPI_CLK_IRQ CYBSP_RSPI_CLK_IRQ
+#define CYBSP_RSPI_CS_ENABLED 1U
+#define CYBSP_SPI_CS_ENABLED CYBSP_RSPI_CS_ENABLED
+#define CYBSP_RSPI_CS_PORT GPIO_PRT21
+#define CYBSP_SPI_CS_PORT CYBSP_RSPI_CS_PORT
+#define CYBSP_RSPI_CS_PORT_NUM 21U
+#define CYBSP_SPI_CS_PORT_NUM CYBSP_RSPI_CS_PORT_NUM
+#define CYBSP_RSPI_CS_PIN 7U
+#define CYBSP_SPI_CS_PIN CYBSP_RSPI_CS_PIN
+#define CYBSP_RSPI_CS_NUM 7U
+#define CYBSP_SPI_CS_NUM CYBSP_RSPI_CS_NUM
+#define CYBSP_RSPI_CS_DRIVEMODE CY_GPIO_DM_STRONG_IN_OFF
+#define CYBSP_SPI_CS_DRIVEMODE CYBSP_RSPI_CS_DRIVEMODE
+#define CYBSP_RSPI_CS_INIT_DRIVESTATE 1
+#define CYBSP_SPI_CS_INIT_DRIVESTATE CYBSP_RSPI_CS_INIT_DRIVESTATE
+#ifndef ioss_0_port_21_pin_7_HSIOM
+ #define ioss_0_port_21_pin_7_HSIOM HSIOM_SEL_GPIO
+#endif
+#define CYBSP_RSPI_CS_HSIOM ioss_0_port_21_pin_7_HSIOM
+#define CYBSP_SPI_CS_HSIOM CYBSP_RSPI_CS_HSIOM
+#define CYBSP_RSPI_CS_IRQ ioss_interrupts_gpio_21_IRQn
+#define CYBSP_SPI_CS_IRQ CYBSP_RSPI_CS_IRQ
+
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_CS_config;
+
+#define CYBSP_OSPI_RAM_SS_config CYBSP_OSPI_RAM_CS_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_QSPI_D0_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_QSPI_D1_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_QSPI_D2_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_QSPI_D3_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_QSPI_CS_config;
+
+#define CYBSP_QSPI_SS_config CYBSP_QSPI_CS_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_I3C_SCL_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I3C_SDA_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D0_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D1_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D2_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D3_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D4_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D5_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D6_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_OSPI_RAM_D7_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DEBUG_UART_RX_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DEBUG_UART_TX_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_SW1_config;
+
+#define CYBSP_USER_BTN1_config CYBSP_SW1_config
+#define CYBSP_USER_BTN_config CYBSP_SW1_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_EXT_CLK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2C_SCL_1V8_config;
+
+#define CYBSP_I2C_SCL_config CYBSP_I2C_SCL_1V8_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_I2C_SDA_1V8_config;
+
+#define CYBSP_I2C_SDA_config CYBSP_I2C_SDA_1V8_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_PDM_CLK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_PDM_DATA_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_SERIAL_INT_0_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_SERIAL_INT_2_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_UART_RX_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_UART_TX_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_UART_CTS_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_UART_RTS_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_HOST_WAKE_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_USER_LED2_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_DEVICE_WAKE_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_USER_LED1_config;
+
+#define CYBSP_USER_LED_config CYBSP_USER_LED1_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_BT_POWER_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_PCLK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_WL_REG_ON_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_HOST_WAKE_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_CLK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D0_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D1_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_FSYNC_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D2_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_D3_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D0_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D1_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D2_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D3_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D4_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D5_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D6_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_D7_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2C_SCL_3V3_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2C_SDA_3V3_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_VSYNC_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_HREF_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_XCLK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_RESET_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_DVP_CAM_PWDN_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WCO_OUT_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_WCO_IN_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_ECO_IN_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_ECO_OUT_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_RADAR_INT_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_LED_RGB_GREEN_config;
+
+#define CYBSP_USER_LED5_config CYBSP_LED_RGB_GREEN_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_LED_RGB_BLUE_config;
+
+#define CYBSP_USER_LED4_config CYBSP_LED_RGB_BLUE_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_LED_RGB_RED_config;
+
+#define CYBSP_USER_LED3_config CYBSP_LED_RGB_RED_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_RXRES_L_config;
+
+#define CYBSP_RADAR_RESET_config CYBSP_RXRES_L_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_WIFI_SDIO_CMD_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_SD_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_SCK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_I2S_TX_MCK_config;
+extern const cy_stc_gpio_pin_config_t CYBSP_RSPI_MISO_config;
+
+#define CYBSP_SPI_MISO_config CYBSP_RSPI_MISO_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_RSPI_MOSI_config;
+
+#define CYBSP_SPI_MOSI_config CYBSP_RSPI_MOSI_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_RSPI_CLK_config;
+
+#define CYBSP_SPI_CLK_config CYBSP_RSPI_CLK_config
+
+extern const cy_stc_gpio_pin_config_t CYBSP_RSPI_CS_config;
+
+#define CYBSP_SPI_CS_config CYBSP_RSPI_CS_config
+
+void init_cycfg_pins(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_PINS_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_ppc.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_ppc.h
new file mode 100644
index 00000000000..9d84655e6b1
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_ppc.h
@@ -0,0 +1,489 @@
+/* This file is automatically generated. */
+#ifndef CYCFG_PPC_H
+#define CYCFG_PPC_H
+
+#define CYCFG_PPC_SECURED_PERI0_MAIN 0U
+#define CYCFG_PPC_SECURED_PERI0_GR0_GROUP 1U
+#define CYCFG_PPC_SECURED_PERI0_GR1_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI0_GR2_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI0_GR3_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI0_GR4_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI0_GR5_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI0_GR0_BOOT 1U
+#define CYCFG_PPC_SECURED_PERI0_GR1_BOOT 1U
+#define CYCFG_PPC_SECURED_PERI0_GR2_BOOT 1U
+#define CYCFG_PPC_SECURED_PERI0_GR3_BOOT 1U
+#define CYCFG_PPC_SECURED_PERI0_GR4_BOOT 1U
+#define CYCFG_PPC_SECURED_PERI0_GR5_BOOT 1U
+#define CYCFG_PPC_SECURED_PERI0_TR 0U
+#define CYCFG_PPC_SECURED_PPC0_PPC_PPC_SECURE 1U
+#define CYCFG_PPC_SECURED_PPC0_PPC_PPC_NONSECURE 1U
+#define CYCFG_PPC_SECURED_PERI_PCLK0_MAIN 0U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_EXTRA_AREA_RRAMC_PROTECTED 1U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_EXTRA_AREA_RRAMC_GENERAL 0U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_EXTRA_AREA_RRAMC_REPAIR 1U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_EXTRA_AREA_RRAMC_EXTRA 1U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAMC0_RRAMC_USER 0U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAMC0_RRAMC_ALLUSER 0U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAMC0_RRAMC_M0SEC 1U
+#define CYCFG_PPC_SECURED_RRAMC0_MPC0_PPC_MPC_MAIN 1U
+#define CYCFG_PPC_SECURED_RRAMC0_MPC1_PPC_MPC_MAIN 1U
+#define CYCFG_PPC_SECURED_RRAMC0_MPC0_PPC_MPC_PC 1U
+#define CYCFG_PPC_SECURED_RRAMC0_MPC1_PPC_MPC_PC 1U
+#define CYCFG_PPC_SECURED_RRAMC0_MPC0_PPC_MPC_ROT 1U
+#define CYCFG_PPC_SECURED_RRAMC0_MPC1_PPC_MPC_ROT 1U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_SFR_RRAMC_SFR_USER 0U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_SFR_RRAMC_SFR_FPGA 1U
+#define CYCFG_PPC_SECURED_RRAMC0_RRAM_SFR_RRAMC_SFR_NONUSER 1U
+#define CYCFG_PPC_SECURED_M33SYSCPUSS 0U
+#define CYCFG_PPC_SECURED_PASS 0U
+#define CYCFG_PPC_SECURED_RAMC0_CM33 0U
+#define CYCFG_PPC_SECURED_RAMC1_CM33 0U
+#define CYCFG_PPC_SECURED_RAMC0_BOOT 1U
+#define CYCFG_PPC_SECURED_RAMC1_BOOT 1U
+#define CYCFG_PPC_SECURED_RAMC0_RAM_PWR 0U
+#define CYCFG_PPC_SECURED_RAMC1_RAM_PWR 0U
+#define CYCFG_PPC_SECURED_RAMC0_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_RAMC1_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_RAMC0_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_RAMC1_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_RAMC0_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_RAMC1_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_MXCM33_CM33 0U
+#define CYCFG_PPC_SECURED_MXCM33_CM33_S 0U
+#define CYCFG_PPC_SECURED_MXCM33_CM33_NS 0U
+#define CYCFG_PPC_SECURED_MXCM33_BOOT_PC0 1U
+#define CYCFG_PPC_SECURED_MXCM33_BOOT_PC1 1U
+#define CYCFG_PPC_SECURED_MXCM33_BOOT_PC2 0U
+#define CYCFG_PPC_SECURED_MXCM33_BOOT_PC3 1U
+#define CYCFG_PPC_SECURED_MXCM33_BOOT 1U
+#define CYCFG_PPC_SECURED_MXCM33_CM33_INT 0U
+#define CYCFG_PPC_SECURED_DW0_DW 0U
+#define CYCFG_PPC_SECURED_DW1_DW 0U
+#define CYCFG_PPC_SECURED_DW0_DW_CRC 0U
+#define CYCFG_PPC_SECURED_DW1_DW_CRC 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT0_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT1_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT2_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT3_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT4_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT5_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT6_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT7_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT8_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT9_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT10_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT11_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT12_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT13_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT14_CH 0U
+#define CYCFG_PPC_SECURED_DW0_CH_STRUCT15_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT0_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT1_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT2_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT3_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT4_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT5_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT6_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT7_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT8_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT9_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT10_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT11_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT12_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT13_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT14_CH 0U
+#define CYCFG_PPC_SECURED_DW1_CH_STRUCT15_CH 0U
+#define CYCFG_PPC_SECURED_CPUSS_ALL_PC 0U
+#define CYCFG_PPC_SECURED_CPUSS_DDFT 0U
+#define CYCFG_PPC_SECURED_CPUSS_CM33_S 0U
+#define CYCFG_PPC_SECURED_CPUSS_CM33_NS 0U
+#define CYCFG_PPC_SECURED_CPUSS_MSC_INT 0U
+#define CYCFG_PPC_SECURED_CPUSS_AP 1U
+#define CYCFG_PPC_SECURED_CPUSS_BOOT 0U
+#define CYCFG_PPC_SECURED_MS0_MAIN 1U
+#define CYCFG_PPC_SECURED_MS4_MAIN 1U
+#define CYCFG_PPC_SECURED_MS5_MAIN 1U
+#define CYCFG_PPC_SECURED_MS6_MAIN 1U
+#define CYCFG_PPC_SECURED_MS7_MAIN 1U
+#define CYCFG_PPC_SECURED_MS8_MAIN 1U
+#define CYCFG_PPC_SECURED_MS9_MAIN 1U
+#define CYCFG_PPC_SECURED_MS10_MAIN 1U
+#define CYCFG_PPC_SECURED_MS11_MAIN 1U
+#define CYCFG_PPC_SECURED_MS29_MAIN 1U
+#define CYCFG_PPC_SECURED_MS31_MAIN 1U
+#define CYCFG_PPC_SECURED_MS_PC0_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_PC6_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_PC9_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_PC11_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_PC31_PRIV 1U
+#define CYCFG_PPC_SECURED_MS_PC0_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_PC6_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_PC9_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_PC11_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_PC31_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MSC_ACG 0U
+#define CYCFG_PPC_SECURED_CPUSS_SL_CTL_GROUP 1U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT0_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT1_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT2_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT3_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT4_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT5_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT6_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT7_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT8_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT9_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT10_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT11_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT12_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT13_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT14_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_STRUCT15_IPC 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT0_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT1_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT2_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT3_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT4_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT5_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT6_INTR 0U
+#define CYCFG_PPC_SECURED_IPC0_INTR_STRUCT7_INTR 0U
+#define CYCFG_PPC_SECURED_FAULT_STRUCT0_MAIN 0U
+#define CYCFG_PPC_SECURED_FAULT_STRUCT1_MAIN 0U
+#define CYCFG_PPC_SECURED_SRSS_GENERAL 0U
+#define CYCFG_PPC_SECURED_SRSS_GENERAL2 0U
+#define CYCFG_PPC_SECURED_SRSS_HIB_DATA 0U
+#define CYCFG_PPC_SECURED_SRSS_SECURE2 1U
+#define CYCFG_PPC_SECURED_SRSS_MAIN 0U
+#define CYCFG_PPC_SECURED_SRSS_SECURE 1U
+#define CYCFG_PPC_SECURED_RAM_TRIM_SRSS_SRAM 0U
+#define CYCFG_PPC_SECURED_SRSS_WDT 0U
+#define CYCFG_PPC_SECURED_SRSS_MCWDTA 0U
+#define CYCFG_PPC_SECURED_PWRMODE_PWRMODE 0U
+#define CYCFG_PPC_SECURED_RTC_BACKUP 0U
+#define CYCFG_PPC_SECURED_RTC_B_BREG0 0U
+#define CYCFG_PPC_SECURED_RTC_B_BREG1 0U
+#define CYCFG_PPC_SECURED_RTC_B_BREG2 0U
+#define CYCFG_PPC_SECURED_DEBUG600_DEBUG600 0U
+#define CYCFG_PPC_SECURED_M0SECCPUSS_STATUS_MAIN 1U
+#define CYCFG_PPC_SECURED_M0SECCPUSS_STATUS_PC1 1U
+#define CYCFG_PPC_SECURED_CRYPTO_MAIN 0U
+#define CYCFG_PPC_SECURED_CRYPTO_CRYPTO 0U
+#define CYCFG_PPC_SECURED_CRYPTO_BOOT 0U
+#define CYCFG_PPC_SECURED_CRYPTO_KEY0 0U
+#define CYCFG_PPC_SECURED_CRYPTO_KEY1 0U
+#define CYCFG_PPC_SECURED_CRYPTO_BUF 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT0_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT1_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT2_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT3_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT4_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT5_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT6_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT7_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT8_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT9_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT10_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT11_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT12_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT13_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT14_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT15_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT16_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT17_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT18_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT19_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT20_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_PRT21_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT0_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT1_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT2_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT3_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT4_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT5_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT6_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT7_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT8_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT9_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT10_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT11_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT12_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT13_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT14_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT15_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT16_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT17_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT18_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT19_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT20_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_SECURE_PRT21_SECURE_PRT 0U
+#define CYCFG_PPC_SECURED_HSIOM_AMUX 0U
+#define CYCFG_PPC_SECURED_HSIOM_MON 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT0_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT1_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT2_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT3_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT4_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT5_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT6_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT7_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT8_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT9_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT10_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT11_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT12_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT13_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT14_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT15_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT16_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT17_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT18_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT19_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT20_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT21_PRT 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT0_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT1_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT2_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT3_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT4_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT5_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT6_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT7_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT8_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT9_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT10_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT11_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT12_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT13_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT14_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT15_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT16_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT17_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT18_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT19_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT20_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_PRT21_CFG 0U
+#define CYCFG_PPC_SECURED_GPIO_SEC_GPIO 0U
+#define CYCFG_PPC_SECURED_GPIO_GPIO 0U
+#define CYCFG_PPC_SECURED_GPIO_TEST 0U
+#define CYCFG_PPC_SECURED_SMARTIO_PRT11_PRT 0U
+#define CYCFG_PPC_SECURED_SMARTIO_PRT17_PRT 0U
+#define CYCFG_PPC_SECURED_CANFD0_CH0_CH 0U
+#define CYCFG_PPC_SECURED_CANFD0_CH1_CH 0U
+#define CYCFG_PPC_SECURED_CANFD0_MAIN 0U
+#define CYCFG_PPC_SECURED_CANFD0_BUF 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT0_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT1_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT2_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT3_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT4_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT5_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT6_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP0_CNT7_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT0_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT1_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT2_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT3_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT4_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT5_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT6_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT7_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT8_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT9_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT10_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT11_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT12_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT13_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT14_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT15_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT16_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT17_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT18_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT19_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT20_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT21_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT22_CNT 0U
+#define CYCFG_PPC_SECURED_TCPWM0_GRP1_CNT23_CNT 0U
+#define CYCFG_PPC_SECURED_LPCOMP 0U
+#define CYCFG_PPC_SECURED_SCB0 0U
+#define CYCFG_PPC_SECURED_SCB2 0U
+#define CYCFG_PPC_SECURED_SCB3 0U
+#define CYCFG_PPC_SECURED_SCB4 0U
+#define CYCFG_PPC_SECURED_SCB5 0U
+#define CYCFG_PPC_SECURED_SCB6 0U
+#define CYCFG_PPC_SECURED_SCB7 0U
+#define CYCFG_PPC_SECURED_SCB8 0U
+#define CYCFG_PPC_SECURED_SCB9 0U
+#define CYCFG_PPC_SECURED_SCB10 0U
+#define CYCFG_PPC_SECURED_SCB11 0U
+#define CYCFG_PPC_SECURED_SCB1 0U
+#define CYCFG_PPC_SECURED_I3C 0U
+#define CYCFG_PPC_SECURED_DFT 0U
+#define CYCFG_PPC_SECURED_ETH0 0U
+#define CYCFG_PPC_SECURED_MXNNLITE_2_0 0U
+#define CYCFG_PPC_SECURED_PERI1_MAIN 0U
+#define CYCFG_PPC_SECURED_PERI1_GR0_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI1_GR1_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI1_GR2_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI1_GR3_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI1_GR4_GROUP 0U
+#define CYCFG_PPC_SECURED_PERI1_GR0_BOOT 0U
+#define CYCFG_PPC_SECURED_PERI1_GR1_BOOT 0U
+#define CYCFG_PPC_SECURED_PERI1_GR2_BOOT 0U
+#define CYCFG_PPC_SECURED_PERI1_GR3_BOOT 0U
+#define CYCFG_PPC_SECURED_PERI1_GR4_BOOT 0U
+#define CYCFG_PPC_SECURED_PERI1_TR 0U
+#define CYCFG_PPC_SECURED_PPC1_PPC_PPC_SECURE 1U
+#define CYCFG_PPC_SECURED_PPC1_PPC_PPC_NONSECURE 1U
+#define CYCFG_PPC_SECURED_PERI_PCLK1_MAIN 0U
+#define CYCFG_PPC_SECURED_M55APPCPUSS 0U
+#define CYCFG_PPC_SECURED_MXCM55_CM55 0U
+#define CYCFG_PPC_SECURED_MXCM55_CM55_S 0U
+#define CYCFG_PPC_SECURED_MXCM55_CM55_NS 0U
+#define CYCFG_PPC_SECURED_MXCM55_BOOT 0U
+#define CYCFG_PPC_SECURED_MXCM55_CM55_INT 0U
+#define CYCFG_PPC_SECURED_SAXI_DMAC_TOP 0U
+#define CYCFG_PPC_SECURED_SAXI_DMAC_CH0_CH 0U
+#define CYCFG_PPC_SECURED_SAXI_DMAC_CH1_CH 0U
+#define CYCFG_PPC_SECURED_SAXI_DMAC_CH2_CH 0U
+#define CYCFG_PPC_SECURED_SAXI_DMAC_CH3_CH 0U
+#define CYCFG_PPC_SECURED_APPCPUSS_ALL_PC 0U
+#define CYCFG_PPC_SECURED_APPCPUSS_CM33_NS 0U
+#define CYCFG_PPC_SECURED_APPCPUSS_MSC_INT 0U
+#define CYCFG_PPC_SECURED_APPCPUSS_AHB2AXI_INT 0U
+#define CYCFG_PPC_SECURED_APPCPUSS_AP 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS13_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS14_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS15_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS19_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS23_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS25_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS26_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS27_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS28_MAIN 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC13_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC14_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC15_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC19_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC25_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC26_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC27_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC28_PRIV 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC13_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC14_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC15_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC19_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC25_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC26_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC27_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MS_PC28_PRIV_MIR 0U
+#define CYCFG_PPC_SECURED_MS_CTL_MSC_ACG 0U
+#define CYCFG_PPC_SECURED_APPCPUSS_SL_CTL_GROUP 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT0_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT1_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT2_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT3_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT4_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT5_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT6_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT7_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT8_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT9_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT10_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT11_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT12_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT13_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT14_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_STRUCT15_IPC 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT0_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT1_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT2_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT3_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT4_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT5_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT6_INTR 0U
+#define CYCFG_PPC_SECURED_IPC1_INTR_STRUCT7_INTR 0U
+#define CYCFG_PPC_SECURED_PDM0_MAIN 0U
+#define CYCFG_PPC_SECURED_PDM0_CH0_RX 0U
+#define CYCFG_PPC_SECURED_PDM0_CH1_RX 0U
+#define CYCFG_PPC_SECURED_PDM0_CH2_RX 0U
+#define CYCFG_PPC_SECURED_PDM0_CH3_RX 0U
+#define CYCFG_PPC_SECURED_PDM0_CH4_RX 0U
+#define CYCFG_PPC_SECURED_PDM0_CH5_RX 0U
+#define CYCFG_PPC_SECURED_TDM0_TDM_STRUCT0_TDM_TX_STRUCT_TX 0U
+#define CYCFG_PPC_SECURED_TDM0_TDM_STRUCT1_TDM_TX_STRUCT_TX 0U
+#define CYCFG_PPC_SECURED_TDM0_TDM_STRUCT0_TDM_RX_STRUCT_RX 0U
+#define CYCFG_PPC_SECURED_TDM0_TDM_STRUCT1_TDM_RX_STRUCT_RX 0U
+#define CYCFG_PPC_SECURED_SMIF0_CACHE_BLOCK_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF1_CACHE_BLOCK_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF0_CACHE_BLOCK_MMIO_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF1_CACHE_BLOCK_MMIO_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF1_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_SMIF1_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_CRYPTO 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_CRYPTO 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_MAIN2 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_MAIN2 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_DEVICE 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_DEVICE 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_AXI_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_AXI_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_AXI_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_AXI_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_AXI_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_AXI_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_HSIOM_SMIF_PRT0_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_HSIOM_SMIF_PRT1_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_HSIOM_SMIF_PRT2_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_HSIOM_SMIF_PRT0_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_HSIOM_SMIF_PRT1_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_HSIOM_SMIF_PRT2_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_HSIOM_MON 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_HSIOM_MON 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_SMIF_PRT0_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_SMIF_PRT1_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_SMIF_PRT2_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_SMIF_PRT0_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_SMIF_PRT1_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_SMIF_PRT2_PRT 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_SMIF_PRT0_CFG 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_SMIF_PRT1_CFG 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_SMIF_PRT2_CFG 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_SMIF_PRT0_CFG 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_SMIF_PRT1_CFG 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_SMIF_PRT2_CFG 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_GPIO 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_GPIO 0U
+#define CYCFG_PPC_SECURED_SMIF0_CORE_SMIF_GPIO_TEST 0U
+#define CYCFG_PPC_SECURED_SMIF1_CORE_SMIF_GPIO_TEST 0U
+#define CYCFG_PPC_SECURED_U550_U55 0U
+#define CYCFG_PPC_SECURED_U550_ROT 0U
+#define CYCFG_PPC_SECURED_U550_ACG 0U
+#define CYCFG_PPC_SECURED_U550_MXU55_PPU_PPU 0U
+#define CYCFG_PPC_SECURED_U550_PD_PD 0U
+#define CYCFG_PPC_SECURED_SOCMEM_MAIN 0U
+#define CYCFG_PPC_SECURED_SOCMEM_BOOT 0U
+#define CYCFG_PPC_SECURED_SOCMEM_SOCMEM_PWR 0U
+#define CYCFG_PPC_SECURED_SOCMEM_SRAM_MPC0_PPC_MPC_MAIN 0U
+#define CYCFG_PPC_SECURED_SOCMEM_SRAM_MPC0_PPC_MPC_PC 0U
+#define CYCFG_PPC_SECURED_SOCMEM_SRAM_MPC0_PPC_MPC_ROT 0U
+#define CYCFG_PPC_SECURED_SOCMEM_MAIN_PORT 0U
+#define CYCFG_PPC_SECURED_SOCMEM_PPU_SOCMEM_PPU 0U
+#define CYCFG_PPC_SECURED_SOCMEM_SOCMEM_PD_PD 0U
+#define CYCFG_PPC_SECURED_GFXSS_GPU_GFXSS 0U
+#define CYCFG_PPC_SECURED_GFXSS_DC_GFXSS 0U
+#define CYCFG_PPC_SECURED_GFXSS_MIPIDSI_GFXSS 0U
+#define CYCFG_PPC_SECURED_SDHC0 0U
+#define CYCFG_PPC_SECURED_SDHC1 0U
+#define CYCFG_PPC_SECURED_USBHS_DWC_otg_intreg_CONTROLLER 0U
+#define CYCFG_PPC_SECURED_USBHS_SS_SUBSYSTEM 0U
+#define CYCFG_PPC_SECURED_ITCM 0U
+#define CYCFG_PPC_SECURED_DTCM 0U
+
+#endif /* #ifndef CYCFG_PPC_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_protection.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_protection.c
new file mode 100644
index 00000000000..2c93a61dd18
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_protection.c
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * File Name: cycfg_protection.c
+ *
+ * Description:
+ * System configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_protection.h"
+#include "cycfg_system.h"
+
+void init_cycfg_protection(void) {
+ #if (CY_SYSTEM_CPU_M33) && defined(COMPONENT_SECURE_DEVICE) && !defined(CYBSP_SKIP_SAU_INIT)
+ Cy_SAU_Init(SAU, SAU_config, sizeof(SAU_config) / sizeof(SAU_config[0]));
+ #endif /* (CY_SYSTEM_CPU_M33) && defined(COMPONENT_SECURE_DEVICE) && !defined(CYBSP_SKIP_SAU_INIT) */
+ #if (CY_SYSTEM_CPU_M33) && defined(COMPONENT_SECURE_DEVICE) && defined(CY_PDL_TZ_ENABLED) && !defined(CYBSP_SKIP_MPC_INIT)
+ init_cycfg_mpc();
+ #endif /* (CY_SYSTEM_CPU_M33) && defined(COMPONENT_SECURE_DEVICE) && defined(CY_PDL_TZ_ENABLED) && !defined(CYBSP_SKIP_MPC_INIT) */
+ #if (CY_SYSTEM_CPU_M33) && defined(COMPONENT_SECURE_DEVICE) && defined(CY_PDL_TZ_ENABLED) && !defined(CYBSP_SKIP_PPC_INIT)
+ init_cycfg_ppc0();
+ init_cycfg_ppc1();
+ #endif /* (CY_SYSTEM_CPU_M33) && defined(COMPONENT_SECURE_DEVICE) && defined(CY_PDL_TZ_ENABLED) && !defined(CYBSP_SKIP_PPC_INIT) */
+ #if (CY_SYSTEM_CPU_M55) && !defined(CYBSP_SKIP_MPU_INIT)
+ Cy_MPU_Init(cycfg_mpu_cm55_ns_0_config, sizeof(cycfg_mpu_cm55_ns_0_config) / sizeof(cycfg_mpu_cm55_ns_0_config[0]));
+ #endif /* (CY_SYSTEM_CPU_M55) && !defined(CYBSP_SKIP_MPU_INIT) */
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_protection.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_protection.h
new file mode 100644
index 00000000000..2f2e1cf5a1c
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_protection.h
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * File Name: cycfg_protection.h
+ *
+ * Description:
+ * System configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_PROTECTION_H)
+#define CYCFG_PROTECTION_H
+
+#include "cycfg_notices.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define vres_0_protection_0_ENABLED 1U
+
+void init_cycfg_protection(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_PROTECTION_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.c
new file mode 100644
index 00000000000..86f9d2dfff3
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.c
@@ -0,0 +1,550 @@
+/*******************************************************************************
+ * File Name: cycfg_qspi_memslot.c
+ *
+ * Description:
+ * Provides definitions of the SMIF-driver memory configuration.
+ * This file was automatically generated and should not be modified.
+ * QSPI Configurator 4.60.0.2742
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_qspi_memslot.h"
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_readCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0xECU,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_QUAD,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0x01U,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_QUAD,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 8U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_QUAD,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_PRESENT_1BYTE,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_writeEnCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x06U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_writeDisCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x04U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_eraseCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0xDCU,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_chipEraseCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x60U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_programCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x12U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_readStsRegQeCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x35U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_readStsRegWipCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x05U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_writeStsRegQeCmd =
+{
+ /* The 8-bit command. 1 x I/O read command. */
+ .command = 0x01U,
+ /* The width of the command transfer. */
+ .cmdWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The width of the address transfer. */
+ .addrWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The 8-bit mode byte. This value is 0xFFFFFFFF when there is no mode present. */
+ .mode = 0xFFFFFFFFU,
+ /* The width of the mode command transfer. */
+ .modeWidth = CY_SMIF_WIDTH_SINGLE,
+ /* The number of dummy cycles. A zero value suggests no dummy cycles. */
+ .dummyCycles = 0U,
+ /* The width of the data transfer. */
+ .dataWidth = CY_SMIF_WIDTH_SINGLE,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* The Data rate of data */
+ .dataRate = CY_SMIF_SDR,
+ /* This specifies the presence of the dummy field */
+ .dummyCyclesPresence = CY_SMIF_NOT_PRESENT,
+ /* This specifies the presence of the mode field */
+ .modePresence = CY_SMIF_NOT_PRESENT,
+ /* The high byte of a 16-bit mode. This value is 0x0 when there is no higher byte mode present */
+ .modeH = 0x00,
+ /* The Data rate of mode */
+ .modeRate = CY_SMIF_SDR,
+ /* The Data rate of address */
+ .addrRate = CY_SMIF_SDR,
+ /* This specifies the width of the command field */
+ .cmdPresence = CY_SMIF_PRESENT_1BYTE,
+ /* The high byte of a 16-bit command. This value is 0x0 when there is no higher byte command present */
+ .commandH = 0x00,
+ /* The Data rate of command */
+ .cmdRate = CY_SMIF_SDR,
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+#if (CY_SMIF_DRV_VERSION_MAJOR > 1) || (CY_SMIF_DRV_VERSION_MINOR >= 50)
+static cy_stc_smif_hybrid_region_info_t S25HS512T_SMIF0_SlaveSlot_1_region0 =
+{
+ /* The region start address. */
+ .regionAddress = 0x0U,
+ /* The number of sectors in this region. */
+ .sectorsCount = 32U,
+ /* The erase command to use for erasing sectors in this region. */
+ .eraseCmd = 0x21U,
+ /* The sector size in bytes. */
+ .eraseSize = 0x1000U,
+ /* The erase time for these sectors in ms. */
+ .eraseTime = 335U,
+};
+
+static cy_stc_smif_hybrid_region_info_t S25HS512T_SMIF0_SlaveSlot_1_region1 =
+{
+ /* The region start address. */
+ .regionAddress = 0x20000U,
+ /* The number of sectors in this region. */
+ .sectorsCount = 1U,
+ /* The erase command to use for erasing sectors in this region. */
+ .eraseCmd = 0xDCU,
+ /* The sector size in bytes. */
+ .eraseSize = 0x20000U,
+ /* The erase time for these sectors in ms. */
+ .eraseTime = 5869U,
+};
+
+static cy_stc_smif_hybrid_region_info_t S25HS512T_SMIF0_SlaveSlot_1_region2 =
+{
+ /* The region start address. */
+ .regionAddress = 0x40000U,
+ /* The number of sectors in this region. */
+ .sectorsCount = 255U,
+ /* The erase command to use for erasing sectors in this region. */
+ .eraseCmd = 0xDCU,
+ /* The sector size in bytes. */
+ .eraseSize = 0x40000U,
+ /* The erase time for these sectors in ms. */
+ .eraseTime = 5869U,
+};
+
+static cy_stc_smif_hybrid_region_info_t *S25HS512T_SMIF0_SlaveSlot_1_regionInfo[3] = {
+ &S25HS512T_SMIF0_SlaveSlot_1_region0,
+ &S25HS512T_SMIF0_SlaveSlot_1_region1,
+ &S25HS512T_SMIF0_SlaveSlot_1_region2
+};
+
+#endif
+
+cy_stc_smif_mem_device_cfg_t deviceCfg_S25HS512T_SMIF0_SlaveSlot_1 =
+{
+ /* Specifies the number of address bytes used by the memory slave device. */
+ .numOfAddrBytes = 0x04U,
+ /* The size of the memory. */
+ .memSize = 0x04000000U,
+ /* Specifies the Read command. */
+ .readCmd = &S25HS512T_SMIF0_SlaveSlot_1_readCmd,
+ /* Specifies the Write Enable command. */
+ .writeEnCmd = &S25HS512T_SMIF0_SlaveSlot_1_writeEnCmd,
+ /* Specifies the Write Disable command. */
+ .writeDisCmd = &S25HS512T_SMIF0_SlaveSlot_1_writeDisCmd,
+ /* Specifies the Erase command. */
+ .eraseCmd = &S25HS512T_SMIF0_SlaveSlot_1_eraseCmd,
+ /* Specifies the sector size of each erase. */
+ .eraseSize = 0x0040000U,
+ /* Specifies the Chip Erase command. */
+ .chipEraseCmd = &S25HS512T_SMIF0_SlaveSlot_1_chipEraseCmd,
+ /* Specifies the Program command. */
+ .programCmd = &S25HS512T_SMIF0_SlaveSlot_1_programCmd,
+ /* Specifies the page size for programming. */
+ .programSize = 0x0000100U,
+ /* Specifies the command to read the QE-containing status register. */
+ .readStsRegQeCmd = &S25HS512T_SMIF0_SlaveSlot_1_readStsRegQeCmd,
+ /* Specifies the command to read the WIP-containing status register. */
+ .readStsRegWipCmd = &S25HS512T_SMIF0_SlaveSlot_1_readStsRegWipCmd,
+ /* Specifies the command to write into the QE-containing status register. */
+ .writeStsRegQeCmd = &S25HS512T_SMIF0_SlaveSlot_1_writeStsRegQeCmd,
+ /* The mask for the status register. */
+ .stsRegBusyMask = 0x01U,
+ /* The mask for the status register. */
+ .stsRegQuadEnableMask = 0x02U,
+ /* The max time for the erase type-1 cycle-time in ms. */
+ .eraseTime = 5869U,
+ /* The max time for the chip-erase cycle-time in ms. */
+ .chipEraseTime = 696000U,
+ /* The max time for the page-program cycle-time in us. */
+ .programTime = 2175U,
+ #if (CY_SMIF_DRV_VERSION_MAJOR > 1) || (CY_SMIF_DRV_VERSION_MINOR >= 50)
+ /* Points to NULL or to structure with info about sectors for hybrid memory. */
+ .hybridRegionCount = 3U,
+ .hybridRegionInfo = S25HS512T_SMIF0_SlaveSlot_1_regionInfo,
+ #else
+ #error Hybrid erase sectors require SMIF driver 1.50 or greater.
+ #endif
+ /* Specifies the command to read variable latency cycles configuration register */
+ .readLatencyCmd = 0,
+ /* Specifies the command to write variable latency cycles configuration register */
+ .writeLatencyCmd = 0,
+ /* Specifies the address for variable latency cycle address */
+ .latencyCyclesRegAddr = 0x00U,
+ /* Specifies variable latency cycles Mask */
+ .latencyCyclesMask = 0x00U,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /* Specifies data for memory with hybrid sectors */
+ .octalDDREnableSeq = 0,
+ /* Specifies the command to read the OE-containing status register. */
+ .readStsRegOeCmd = 0,
+ /* Specifies the command to write the OE-containing status register. */
+ .writeStsRegOeCmd = 0,
+ /* QE mask for the status registers */
+ .stsRegOctalEnableMask = 0x00U,
+ /* Octal enable register address */
+ .octalEnableRegAddr = 0x00U,
+ /* Frequency of operation used in Octal mode */
+ .freq_of_operation = CY_SMIF_100MHZ_OPERATION,
+ #endif
+};
+
+cy_stc_smif_mem_config_t S25HS512T_SMIF0_SlaveSlot_1 =
+{
+ /* Determines the slot number where the memory device is placed. */
+ .slaveSelect = CY_SMIF_SLAVE_SELECT_1,
+ /* Flags. */
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ .flags = CY_SMIF_FLAG_SMIF_REV_3 | CY_SMIF_FLAG_MEMORY_MAPPED | CY_SMIF_FLAG_WR_EN | CY_SMIF_FLAG_MERGE_ENABLE,
+ #else
+ .flags = CY_SMIF_FLAG_MEMORY_MAPPED | CY_SMIF_FLAG_WR_EN | CY_SMIF_FLAG_MERGE_ENABLE,
+ #endif /* CY_IP_MXSMIF_VERSION */
+ /* The data-line selection options for a slave device. */
+ .dataSelect = CY_SMIF_DATA_SEL0,
+ /* The base address the memory slave is mapped to in the PSoC memory map.
+ Valid when the memory-mapped mode is enabled. */
+ .baseAddress = 0x60000000U,
+ /* The size allocated in the PSoC memory map, for the memory slave device.
+ The size is allocated from the base address. Valid when the memory mapped mode is enabled. */
+ .memMappedSize = 0x4000000U,
+ /* If this memory device is one of the devices in the dual quad SPI configuration.
+ Valid when the memory mapped mode is enabled. */
+ .dualQuadSlots = 0,
+ /* The configuration of the device. */
+ .deviceCfg = &deviceCfg_S25HS512T_SMIF0_SlaveSlot_1,
+ #if (CY_IP_MXSMIF_VERSION >= 2)
+ /** Continous transfer merge timeout.
+ * After this period the memory device is deselected. A later transfer, even from a
+ * continuous address, starts with the overhead phases (command, address, mode, dummy cycles).
+ * This configuration parameter is available for CAT1B devices. */
+ .mergeTimeout = CY_SMIF_MERGE_TIMEOUT_256_CYCLES,
+ #else
+ #error Features used by this file require CY_IP_MXSMIF_VERSION >= 2.
+ #endif /* CY_IP_MXSMIF_VERSION */
+};
+
+cy_stc_smif_mem_config_t *smif0MemConfigs[CY_SMIF_DEVICE_NUM0] = {
+ &S25HS512T_SMIF0_SlaveSlot_1,
+};
+
+cy_stc_smif_block_config_t smif0BlockConfig =
+{
+ /* The number of SMIF memories defined. */
+ .memCount = CY_SMIF_DEVICE_NUM0,
+ /* The pointer to the array of memory config structures of size memCount. */
+ .memConfig = (cy_stc_smif_mem_config_t **)smif0MemConfigs,
+ /* The version of the SMIF driver. */
+ .majorVersion = CY_SMIF_DRV_VERSION_MAJOR,
+ /* The version of the SMIF driver. */
+ .minorVersion = CY_SMIF_DRV_VERSION_MINOR,
+};
+cy_stc_smif_block_config_t smif1BlockConfig =
+{
+ /* The number of SMIF memories defined. */
+ .memCount = CY_SMIF_DEVICE_NUM1,
+ /* The pointer to the array of memory config structures of size memCount. */
+ .memConfig = 0,
+ /* The version of the SMIF driver. */
+ .majorVersion = CY_SMIF_DRV_VERSION_MAJOR,
+ /* The version of the SMIF driver. */
+ .minorVersion = CY_SMIF_DRV_VERSION_MINOR,
+};
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.h
new file mode 100644
index 00000000000..83cc09046d7
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.h
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * File Name: cycfg_qspi_memslot.h
+ *
+ * Description:
+ * Provides declarations of the SMIF-driver memory configuration.
+ * This file was automatically generated and should not be modified.
+ * QSPI Configurator 4.60.0.2742
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#ifndef CYCFG_QSPI_MEMSLOT_H
+#define CYCFG_QSPI_MEMSLOT_H
+#include "cy_smif_memslot.h"
+
+#define CY_SMIF_CFG_TOOL_VERSION (460)
+
+/* Supported QSPI Driver version */
+#define CY_SMIF_DRV_VERSION_REQUIRED (100)
+
+#if !defined(CY_SMIF_DRV_VERSION)
+ #define CY_SMIF_DRV_VERSION (100)
+#endif
+
+/* Check the used Driver version */
+#if (CY_SMIF_DRV_VERSION_REQUIRED > CY_SMIF_DRV_VERSION)
+ #error The QSPI Configurator requires a newer version of the PDL. Update the PDL in your project.
+#endif
+
+typedef cy_stc_smif_mem_config_t cy_serial_flash_mem_config_t;
+typedef cy_stc_smif_block_config_t cy_serial_flash_block_config_t;
+
+#define CY_SMIF_DEVICE_NUM0 1
+
+#define CY_SMIF_DEVICE_NUM1 0
+
+#define smifBlockConfig smif0BlockConfig
+#define smifMemConfigs smif0MemConfigs
+
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_readCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_writeEnCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_writeDisCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_eraseCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_chipEraseCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_programCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_readStsRegQeCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_readStsRegWipCmd;
+extern cy_stc_smif_mem_cmd_t S25HS512T_SMIF0_SlaveSlot_1_writeStsRegQeCmd;
+
+extern cy_stc_smif_mem_device_cfg_t deviceCfg_S25HS512T_SMIF0_SlaveSlot_1;
+
+extern cy_stc_smif_mem_config_t S25HS512T_SMIF0_SlaveSlot_1;
+
+extern cy_stc_smif_mem_config_t *smif0MemConfigs[CY_SMIF_DEVICE_NUM0];
+
+extern cy_stc_smif_block_config_t smif0BlockConfig;
+
+extern cy_stc_smif_block_config_t smif1BlockConfig;
+
+
+#endif /*CYCFG_QSPI_MEMSLOT_H*/
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.timestamp b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.timestamp
new file mode 100644
index 00000000000..8d7d13aaa47
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_qspi_memslot.timestamp
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * File Name: cycfg_qspi_memslot.timestamp
+ *
+ * Description:
+ * Sentinel file for determining if generated source is up to date.
+ * This file was automatically generated and should not be modified.
+ * QSPI Configurator 4.60.0.2742
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_routing.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_routing.c
new file mode 100644
index 00000000000..676d9ca453f
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_routing.c
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * File Name: cycfg_routing.c
+ *
+ * Description:
+ * Establishes all necessary connections between hardware elements.
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_routing.h"
+#include "cy_trigmux.h"
+#include "stdbool.h"
+#include "cy_device_headers.h"
+
+void init_cycfg_routing(void) {
+ Cy_TrigMux_Connect(PERI_0_TRIG_IN_MUX_0_PERI0_HSIOM_TR_OUT1, PERI_0_TRIG_OUT_MUX_0_PDMA0_TR_IN0, false, TRIGGER_TYPE_LEVEL);
+ Cy_TrigMux_Connect(PERI_1_TRIG_IN_MUX_0_PDMA0_TR_OUT0, PERI_1_TRIG_OUT_MUX_0_AXIDMAC_TR_IN0, false, TRIGGER_TYPE_EDGE);
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_routing.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_routing.h
new file mode 100644
index 00000000000..2bdea29957e
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_routing.h
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * File Name: cycfg_routing.h
+ *
+ * Description:
+ * Establishes all necessary connections between hardware elements.
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_ROUTING_H)
+#define CYCFG_ROUTING_H
+
+#include "cycfg_notices.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define ioss_0_port_0_pin_1_HSIOM P0_1_SMIF1_SMIF0_SPIHB_SELECT2
+#define ioss_0_port_2_pin_0_HSIOM P2_0_SMIF0_SMIF0_SPIHB_SELECT1
+#define ioss_0_port_3_pin_0_HSIOM P3_0_I3C_I3C_SCL
+#define ioss_0_port_3_pin_1_HSIOM P3_1_I3C_I3C_SDA
+#define ioss_0_port_6_pin_5_HSIOM P6_5_SCB2_UART_RX
+#define ioss_0_port_6_pin_7_HSIOM P6_7_SCB2_UART_TX
+#define ioss_0_port_7_pin_4_HSIOM P7_4_SRSS_EXT_CLK
+#define ioss_0_port_8_pin_0_HSIOM P8_0_SCB0_I2C_SCL
+#define ioss_0_port_8_pin_1_HSIOM P8_1_SCB0_I2C_SDA
+#define ioss_0_port_8_pin_5_HSIOM P8_5_PDM_PDM_CLK3
+#define ioss_0_port_8_pin_6_HSIOM P8_6_PDM_PDM_DATA3
+#define ioss_0_port_9_pin_0_HSIOM P9_0_TCPWM0_LINE7
+#define ioss_0_port_9_pin_2_HSIOM P9_2_TCPWM0_LINE_COMPL7
+#define ioss_0_port_10_pin_0_HSIOM P10_0_SCB4_UART_RX
+#define ioss_0_port_10_pin_1_HSIOM P10_1_SCB4_UART_TX
+#define ioss_0_port_10_pin_2_HSIOM P10_2_SCB4_UART_CTS
+#define ioss_0_port_10_pin_3_HSIOM P10_3_SCB4_UART_RTS
+#define ioss_0_port_11_pin_1_HSIOM P11_1_PERI0_TR_IO_INPUT1
+#define ioss_0_port_12_pin_0_HSIOM P12_0_SDHC0_CLK_CARD
+#define ioss_0_port_12_pin_1_HSIOM P12_1_SDHC0_CARD_DAT_3TO00
+#define ioss_0_port_12_pin_2_HSIOM P12_2_SDHC0_CARD_DAT_3TO01
+#define ioss_0_port_12_pin_3_HSIOM P12_3_TDM_TDM_TX_FSYNC0
+#define ioss_0_port_12_pin_4_HSIOM P12_4_SDHC0_CARD_DAT_3TO02
+#define ioss_0_port_12_pin_5_HSIOM P12_5_SDHC0_CARD_DAT_3TO03
+#define ioss_0_port_17_pin_0_HSIOM P17_0_SCB5_I2C_SCL
+#define ioss_0_port_17_pin_1_HSIOM P17_1_SCB5_I2C_SDA
+#define ioss_0_port_17_pin_4_HSIOM P17_4_TCPWM0_LINE_COMPL4
+#define ioss_0_port_20_pin_5_HSIOM P20_5_TCPWM0_LINE_COMPL0
+#define ioss_0_port_21_pin_0_HSIOM P21_0_SDHC0_CARD_CMD
+#define ioss_0_port_21_pin_1_HSIOM P21_1_TDM_TDM_TX_SD0
+#define ioss_0_port_21_pin_2_HSIOM P21_2_TDM_TDM_TX_SCK0
+#define ioss_0_port_21_pin_3_HSIOM P21_3_TDM_TDM_TX_MCK0
+#define ioss_0_port_21_pin_4_HSIOM P21_4_SCB3_SPI_MISO
+#define ioss_0_port_21_pin_5_HSIOM P21_5_SCB3_SPI_MOSI
+#define ioss_0_port_21_pin_6_HSIOM P21_6_SCB3_SPI_CLK
+#define ioss_0_port_21_pin_7_HSIOM P21_7_SCB3_SPI_SELECT1
+#define CYBSP_AXIDMAC_DVP_CAM_CONTROLLER_tr_in_0_TRIGGER_OUT PERI_1_TRIG_OUT_MUX_0_AXIDMAC_TR_IN0
+#define CYBSP_DMA_DVP_CAM_CONTROLLER_tr_in_0_TRIGGER_OUT PERI_0_TRIG_OUT_MUX_0_PDMA0_TR_IN0
+#define CYBSP_DMA_DVP_CAM_CONTROLLER_tr_out_0_TRIGGER_IN PERI_1_TRIG_IN_MUX_0_PDMA0_TR_OUT0
+#define CYBSP_DVP_CAM_PCLK_digital_in_0_TRIGGER_IN PERI_0_TRIG_IN_MUX_0_PERI0_HSIOM_TR_OUT1
+
+void init_cycfg_routing(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_ROUTING_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_system.c b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_system.c
new file mode 100644
index 00000000000..6c6ac5a5ba0
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_system.c
@@ -0,0 +1,1169 @@
+/*******************************************************************************
+ * File Name: cycfg_system.c
+ *
+ * Description:
+ * System configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "cycfg_system.h"
+#include "stdbool.h"
+#include "stdint.h"
+#include "string.h"
+
+#if defined(CY_PDL_TZ_ENABLED)
+#include "ifx_se_platform.h"
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+#if (smif_0_mpc_0_REGION_COUNT > 0U) || (smif_1_mpc_0_REGION_COUNT > 0U)
+#include "cy_smif.h"
+#endif /* (smif_0_mpc_0_REGION_COUNT > 0U) || (smif_1_mpc_0_REGION_COUNT > 0U) */
+
+#define CY_CFG_PWR_ENABLED 1
+#define CY_CFG_PWR_INIT 1
+#define CY_CFG_PWR_USING_PMIC 0
+#define CY_CFG_PWR_VBACKUP_USING_VDDD 1
+#define CY_CFG_PWR_REGULATOR_MODE_MIN 0
+#define CY_CFG_PWR_USING_ULP 0
+#define CY_CFG_PWR_USING_LP 0
+#define CY_CFG_PWR_USING_HP 1
+
+#if (smif_0_mpc_0_REGION_COUNT > 0U) || (smif_1_mpc_0_REGION_COUNT > 0U)
+#define SMIF_DESELECT_DELAY (7U)
+#define TIMEOUT_1_MS (1000U)
+#endif /* (smif_0_mpc_0_REGION_COUNT > 0U) || (smif_1_mpc_0_REGION_COUNT > 0U) */
+
+#define CY_MPC_PC_LAST (8)
+
+#if defined(CY_PDL_TZ_ENABLED)
+const cy_stc_mpc_rot_cfg_t M33S_mpc_cfg[] =
+{
+ {
+ .pc = CY_MPC_PC_2,
+ .secure = CY_MPC_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_7,
+ .secure = CY_MPC_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+};
+const cy_stc_mpc_rot_cfg_t M33_mpc_cfg[] =
+{
+ {
+ .pc = CY_MPC_PC_2,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_5,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_7,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+};
+const cy_stc_mpc_rot_cfg_t M55_mpc_cfg[] =
+{
+ {
+ .pc = CY_MPC_PC_2,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_6,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_7,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+};
+const cy_stc_mpc_rot_cfg_t M33NSC_mpc_cfg[] =
+{
+ {
+ .pc = CY_MPC_PC_2,
+ .secure = CY_MPC_SECURE,
+ .access = CY_MPC_ACCESS_R,
+ },
+ {
+ .pc = CY_MPC_PC_5,
+ .secure = CY_MPC_SECURE,
+ .access = CY_MPC_ACCESS_R,
+ },
+ {
+ .pc = CY_MPC_PC_6,
+ .secure = CY_MPC_SECURE,
+ .access = CY_MPC_ACCESS_R,
+ },
+ {
+ .pc = CY_MPC_PC_7,
+ .secure = CY_MPC_SECURE,
+ .access = CY_MPC_ACCESS_R,
+ },
+};
+const cy_stc_mpc_rot_cfg_t M33_M55_mpc_cfg[] =
+{
+ {
+ .pc = CY_MPC_PC_2,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_5,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_6,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+ {
+ .pc = CY_MPC_PC_7,
+ .secure = CY_MPC_NON_SECURE,
+ .access = CY_MPC_ACCESS_RW,
+ },
+};
+const cy_stc_mpc_regions_t M33S_mpc_regions[] =
+{
+ {
+ .base = (MPC_Type *)RRAMC0_MPC0,
+ .offset = 0x00011000,
+ .size = 0x0004A000,
+ },
+ {
+ .base = (MPC_Type *)SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0,
+ .offset = 0x00100000,
+ .size = 0x00240000,
+ },
+ {
+ .base = (MPC_Type *)SMIF0_CORE_AXI_MPC0,
+ .offset = 0x00100000,
+ .size = 0x00240000,
+ },
+ {
+ .base = (MPC_Type *)RAMC0_MPC0,
+ .offset = 0x00001000,
+ .size = 0x00057000,
+ },
+};
+const cy_stc_mpc_regions_t M33_mpc_regions[] =
+{
+ {
+ .base = (MPC_Type *)SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0,
+ .offset = 0x00340000,
+ .size = 0x00240000,
+ },
+ {
+ .base = (MPC_Type *)SMIF0_CORE_AXI_MPC0,
+ .offset = 0x00340000,
+ .size = 0x00240000,
+ },
+ {
+ .base = (MPC_Type *)RAMC0_MPC0,
+ .offset = 0x00058000,
+ .size = 0x00028000,
+ },
+ {
+ .base = (MPC_Type *)RAMC1_MPC0,
+ .offset = 0x00000000,
+ .size = 0x0003D000,
+ },
+};
+const cy_stc_mpc_regions_t M55_mpc_regions[] =
+{
+ {
+ .base = (MPC_Type *)SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0,
+ .offset = 0x00580000,
+ .size = 0x00300000,
+ },
+ {
+ .base = (MPC_Type *)SMIF0_CORE_AXI_MPC0,
+ .offset = 0x00580000,
+ .size = 0x00300000,
+ },
+ {
+ .base = (MPC_Type *)SOCMEM_SRAM_MPC0,
+ .offset = 0x00000000,
+ .size = 0x00040000,
+ },
+};
+const cy_stc_mpc_regions_t M33NSC_mpc_regions[] = {0};
+const cy_stc_mpc_regions_t M33_M55_mpc_regions[] =
+{
+ {
+ .base = (MPC_Type *)RRAMC0_MPC0,
+ .offset = 0x0005B000,
+ .size = 0x00008000,
+ },
+ {
+ .base = (MPC_Type *)SOCMEM_SRAM_MPC0,
+ .offset = 0x00040000,
+ .size = 0x004C0000,
+ },
+ {
+ .base = (MPC_Type *)RAMC1_MPC0,
+ .offset = 0x0003D000,
+ .size = 0x00043000,
+ },
+};
+const cy_stc_mpc_resp_cfg_t cy_response_mpcs[] =
+{
+ {
+ .base = (MPC_Type *)SOCMEM_SRAM_MPC0,
+ .response = CY_MPC_BUS_ERR,
+ },
+ {
+ .base = (MPC_Type *)RAMC0_MPC0,
+ .response = CY_MPC_BUS_ERR,
+ },
+ {
+ .base = (MPC_Type *)RAMC1_MPC0,
+ .response = CY_MPC_BUS_ERR,
+ },
+ {
+ .base = (MPC_Type *)SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0,
+ .response = CY_MPC_BUS_ERR,
+ },
+ {
+ .base = (MPC_Type *)SMIF0_CORE_AXI_MPC0,
+ .response = CY_MPC_BUS_ERR,
+ },
+};
+const size_t cy_response_mpcs_count = sizeof(cy_response_mpcs) / sizeof(cy_stc_mpc_resp_cfg_t);
+const cy_stc_mpc_unified_t unified_mpc_domains[] =
+{
+ {
+ .regions = M33S_mpc_regions,
+ .region_count = sizeof(M33S_mpc_regions) / sizeof(cy_stc_mpc_regions_t),
+ .cfg = M33S_mpc_cfg,
+ .cfg_count = sizeof(M33S_mpc_cfg) / sizeof(cy_stc_mpc_rot_cfg_t),
+ },
+ {
+ .regions = M33_mpc_regions,
+ .region_count = sizeof(M33_mpc_regions) / sizeof(cy_stc_mpc_regions_t),
+ .cfg = M33_mpc_cfg,
+ .cfg_count = sizeof(M33_mpc_cfg) / sizeof(cy_stc_mpc_rot_cfg_t),
+ },
+ {
+ .regions = M55_mpc_regions,
+ .region_count = sizeof(M55_mpc_regions) / sizeof(cy_stc_mpc_regions_t),
+ .cfg = M55_mpc_cfg,
+ .cfg_count = sizeof(M55_mpc_cfg) / sizeof(cy_stc_mpc_rot_cfg_t),
+ },
+ {
+ .regions = M33NSC_mpc_regions,
+ .region_count = sizeof(M33NSC_mpc_regions) / sizeof(cy_stc_mpc_regions_t),
+ .cfg = M33NSC_mpc_cfg,
+ .cfg_count = sizeof(M33NSC_mpc_cfg) / sizeof(cy_stc_mpc_rot_cfg_t),
+ },
+ {
+ .regions = M33_M55_mpc_regions,
+ .region_count = sizeof(M33_M55_mpc_regions) / sizeof(cy_stc_mpc_regions_t),
+ .cfg = M33_M55_mpc_cfg,
+ .cfg_count = sizeof(M33_M55_mpc_cfg) / sizeof(cy_stc_mpc_rot_cfg_t),
+ },
+};
+const size_t unified_mpc_domains_count = sizeof(unified_mpc_domains) / sizeof(cy_stc_mpc_unified_t);
+#endif /* defined (CY_PDL_TZ_ENABLED) */
+
+#if defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF)
+const mtb_srf_memory_protection_s_t mtb_srf_memory_protection_s[] =
+{
+ {
+ .ranges = mxrramc_0_mpc_0_srf_protection_range_s,
+ .size = 4U,
+ },
+ {
+ .ranges = smif_0_mpc_0_srf_protection_range_s,
+ .size = 6U,
+ },
+ {
+ .ranges = socmem_0_mpc_0_srf_protection_range_s,
+ .size = 2U,
+ },
+ {
+ .ranges = mxsramc_0_mpc_0_srf_protection_range_s,
+ .size = 3U,
+ },
+ {
+ .ranges = mxsramc_1_mpc_0_srf_protection_range_s,
+ .size = 2U,
+ },
+};
+const uint8_t mtb_srf_protection_range_s_count = sizeof(mtb_srf_memory_protection_s) / sizeof(mtb_srf_memory_protection_s_t);
+#endif /* defined (COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF) */
+
+const cy_stc_ppc_attribute_t cycfg_unused_ppc_cfg =
+{
+ .pcMask = 0xFF,
+ .secAttribute = CY_PPC_NON_SECURE,
+ .privAttribute = CY_PPC_NONPRIV,
+};
+const cy_en_prot_region_t cycfg_unused_ppc_0_regions[] =
+{
+ PROT_PERI0_MAIN,
+ PROT_PERI0_GR1_GROUP,
+ PROT_PERI0_GR2_GROUP,
+ PROT_PERI0_GR3_GROUP,
+ PROT_PERI0_GR4_GROUP,
+ PROT_PERI0_GR5_GROUP,
+ PROT_PERI0_TR,
+ PROT_PERI0_PERI_PCLK0_MAIN,
+ PROT_PERI0_RRAMC0_RRAM_EXTRA_AREA_RRAMC_GENERAL,
+ PROT_PERI0_RRAMC0_RRAMC0_RRAMC_USER,
+ PROT_PERI0_RRAMC0_RRAMC0_RRAMC_ALLUSER,
+ PROT_PERI0_RRAMC0_RRAM_SFR_RRAMC_SFR_USER,
+ PROT_PERI0_M33SYSCPUSS,
+ PROT_PERI0_PASS,
+ PROT_PERI0_RAMC0_CM33,
+ PROT_PERI0_RAMC1_CM33,
+ PROT_PERI0_RAMC0_RAM_PWR,
+ PROT_PERI0_RAMC1_RAM_PWR,
+ PROT_PERI0_RAMC0_MPC0_PPC_MPC_MAIN,
+ PROT_PERI0_RAMC1_MPC0_PPC_MPC_MAIN,
+ PROT_PERI0_RAMC0_MPC0_PPC_MPC_PC,
+ PROT_PERI0_RAMC1_MPC0_PPC_MPC_PC,
+ PROT_PERI0_RAMC0_MPC0_PPC_MPC_ROT,
+ PROT_PERI0_RAMC1_MPC0_PPC_MPC_ROT,
+ PROT_PERI0_MXCM33_CM33,
+ PROT_PERI0_MXCM33_CM33_S,
+ PROT_PERI0_MXCM33_CM33_NS,
+ PROT_PERI0_MXCM33_BOOT_PC2,
+ PROT_PERI0_MXCM33_CM33_INT,
+ PROT_PERI0_DW0_DW,
+ PROT_PERI0_DW1_DW,
+ PROT_PERI0_DW0_DW_CRC,
+ PROT_PERI0_DW1_DW_CRC,
+ PROT_PERI0_DW0_CH_STRUCT0_CH,
+ PROT_PERI0_DW0_CH_STRUCT1_CH,
+ PROT_PERI0_DW0_CH_STRUCT2_CH,
+ PROT_PERI0_DW0_CH_STRUCT3_CH,
+ PROT_PERI0_DW0_CH_STRUCT4_CH,
+ PROT_PERI0_DW0_CH_STRUCT5_CH,
+ PROT_PERI0_DW0_CH_STRUCT6_CH,
+ PROT_PERI0_DW0_CH_STRUCT7_CH,
+ PROT_PERI0_DW0_CH_STRUCT8_CH,
+ PROT_PERI0_DW0_CH_STRUCT9_CH,
+ PROT_PERI0_DW0_CH_STRUCT10_CH,
+ PROT_PERI0_DW0_CH_STRUCT11_CH,
+ PROT_PERI0_DW0_CH_STRUCT12_CH,
+ PROT_PERI0_DW0_CH_STRUCT13_CH,
+ PROT_PERI0_DW0_CH_STRUCT14_CH,
+ PROT_PERI0_DW0_CH_STRUCT15_CH,
+ PROT_PERI0_DW1_CH_STRUCT0_CH,
+ PROT_PERI0_DW1_CH_STRUCT1_CH,
+ PROT_PERI0_DW1_CH_STRUCT2_CH,
+ PROT_PERI0_DW1_CH_STRUCT3_CH,
+ PROT_PERI0_DW1_CH_STRUCT4_CH,
+ PROT_PERI0_DW1_CH_STRUCT5_CH,
+ PROT_PERI0_DW1_CH_STRUCT6_CH,
+ PROT_PERI0_DW1_CH_STRUCT7_CH,
+ PROT_PERI0_DW1_CH_STRUCT8_CH,
+ PROT_PERI0_DW1_CH_STRUCT9_CH,
+ PROT_PERI0_DW1_CH_STRUCT10_CH,
+ PROT_PERI0_DW1_CH_STRUCT11_CH,
+ PROT_PERI0_DW1_CH_STRUCT12_CH,
+ PROT_PERI0_DW1_CH_STRUCT13_CH,
+ PROT_PERI0_DW1_CH_STRUCT14_CH,
+ PROT_PERI0_DW1_CH_STRUCT15_CH,
+ PROT_PERI0_CPUSS_ALL_PC,
+ PROT_PERI0_CPUSS_DDFT,
+ PROT_PERI0_CPUSS_CM33_S,
+ PROT_PERI0_CPUSS_CM33_NS,
+ PROT_PERI0_CPUSS_MSC_INT,
+ PROT_PERI0_CPUSS_BOOT,
+ PROT_PERI0_MS_PC0_PRIV,
+ PROT_PERI0_MS_PC6_PRIV,
+ PROT_PERI0_MS_PC9_PRIV,
+ PROT_PERI0_MS_PC11_PRIV,
+ PROT_PERI0_MS_PC0_PRIV_MIR,
+ PROT_PERI0_MS_PC6_PRIV_MIR,
+ PROT_PERI0_MS_PC9_PRIV_MIR,
+ PROT_PERI0_MS_PC11_PRIV_MIR,
+ PROT_PERI0_MS_PC31_PRIV_MIR,
+ PROT_PERI0_MSC_ACG,
+ PROT_PERI0_IPC0_STRUCT0_IPC,
+ PROT_PERI0_IPC0_STRUCT1_IPC,
+ PROT_PERI0_IPC0_STRUCT2_IPC,
+ PROT_PERI0_IPC0_STRUCT3_IPC,
+ PROT_PERI0_IPC0_STRUCT4_IPC,
+ PROT_PERI0_IPC0_STRUCT5_IPC,
+ PROT_PERI0_IPC0_STRUCT6_IPC,
+ PROT_PERI0_IPC0_STRUCT7_IPC,
+ PROT_PERI0_IPC0_STRUCT8_IPC,
+ PROT_PERI0_IPC0_STRUCT9_IPC,
+ PROT_PERI0_IPC0_STRUCT10_IPC,
+ PROT_PERI0_IPC0_STRUCT11_IPC,
+ PROT_PERI0_IPC0_STRUCT12_IPC,
+ PROT_PERI0_IPC0_STRUCT13_IPC,
+ PROT_PERI0_IPC0_STRUCT14_IPC,
+ PROT_PERI0_IPC0_STRUCT15_IPC,
+ PROT_PERI0_IPC0_INTR_STRUCT0_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT1_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT2_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT3_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT4_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT5_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT6_INTR,
+ PROT_PERI0_IPC0_INTR_STRUCT7_INTR,
+ PROT_PERI0_FAULT_STRUCT0_MAIN,
+ PROT_PERI0_FAULT_STRUCT1_MAIN,
+ PROT_PERI0_SRSS_GENERAL,
+ PROT_PERI0_SRSS_GENERAL2,
+ PROT_PERI0_SRSS_HIB_DATA,
+ PROT_PERI0_SRSS_MAIN,
+ PROT_PERI0_RAM_TRIM_SRSS_SRAM,
+ PROT_PERI0_SRSS_WDT,
+ PROT_PERI0_SRSS_MCWDTA,
+ PROT_PERI0_PWRMODE_PWRMODE,
+ PROT_PERI0_RTC_BACKUP,
+ PROT_PERI0_RTC_B_BREG0,
+ PROT_PERI0_RTC_B_BREG1,
+ PROT_PERI0_RTC_B_BREG2,
+ PROT_PERI0_DEBUG600_DEBUG600,
+ PROT_PERI0_CRYPTO_MAIN,
+ PROT_PERI0_CRYPTO_CRYPTO,
+ PROT_PERI0_CRYPTO_BOOT,
+ PROT_PERI0_CRYPTO_KEY0,
+ PROT_PERI0_CRYPTO_KEY1,
+ PROT_PERI0_CRYPTO_BUF,
+ PROT_PERI0_HSIOM_PRT0_PRT,
+ PROT_PERI0_HSIOM_PRT1_PRT,
+ PROT_PERI0_HSIOM_PRT2_PRT,
+ PROT_PERI0_HSIOM_PRT3_PRT,
+ PROT_PERI0_HSIOM_PRT4_PRT,
+ PROT_PERI0_HSIOM_PRT5_PRT,
+ PROT_PERI0_HSIOM_PRT6_PRT,
+ PROT_PERI0_HSIOM_PRT7_PRT,
+ PROT_PERI0_HSIOM_PRT8_PRT,
+ PROT_PERI0_HSIOM_PRT9_PRT,
+ PROT_PERI0_HSIOM_PRT10_PRT,
+ PROT_PERI0_HSIOM_PRT11_PRT,
+ PROT_PERI0_HSIOM_PRT12_PRT,
+ PROT_PERI0_HSIOM_PRT13_PRT,
+ PROT_PERI0_HSIOM_PRT14_PRT,
+ PROT_PERI0_HSIOM_PRT15_PRT,
+ PROT_PERI0_HSIOM_PRT16_PRT,
+ PROT_PERI0_HSIOM_PRT17_PRT,
+ PROT_PERI0_HSIOM_PRT18_PRT,
+ PROT_PERI0_HSIOM_PRT19_PRT,
+ PROT_PERI0_HSIOM_PRT20_PRT,
+ PROT_PERI0_HSIOM_PRT21_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT0_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT1_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT2_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT3_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT4_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT5_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT6_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT7_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT8_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT9_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT10_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT11_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT12_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT13_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT14_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT15_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT16_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT17_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT18_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT19_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT20_SECURE_PRT,
+ PROT_PERI0_HSIOM_SECURE_PRT21_SECURE_PRT,
+ PROT_PERI0_HSIOM_AMUX,
+ PROT_PERI0_HSIOM_MON,
+ PROT_PERI0_GPIO_PRT0_PRT,
+ PROT_PERI0_GPIO_PRT1_PRT,
+ PROT_PERI0_GPIO_PRT2_PRT,
+ PROT_PERI0_GPIO_PRT3_PRT,
+ PROT_PERI0_GPIO_PRT4_PRT,
+ PROT_PERI0_GPIO_PRT5_PRT,
+ PROT_PERI0_GPIO_PRT6_PRT,
+ PROT_PERI0_GPIO_PRT7_PRT,
+ PROT_PERI0_GPIO_PRT8_PRT,
+ PROT_PERI0_GPIO_PRT9_PRT,
+ PROT_PERI0_GPIO_PRT10_PRT,
+ PROT_PERI0_GPIO_PRT11_PRT,
+ PROT_PERI0_GPIO_PRT12_PRT,
+ PROT_PERI0_GPIO_PRT13_PRT,
+ PROT_PERI0_GPIO_PRT14_PRT,
+ PROT_PERI0_GPIO_PRT15_PRT,
+ PROT_PERI0_GPIO_PRT16_PRT,
+ PROT_PERI0_GPIO_PRT17_PRT,
+ PROT_PERI0_GPIO_PRT18_PRT,
+ PROT_PERI0_GPIO_PRT19_PRT,
+ PROT_PERI0_GPIO_PRT20_PRT,
+ PROT_PERI0_GPIO_PRT21_PRT,
+ PROT_PERI0_GPIO_PRT0_CFG,
+ PROT_PERI0_GPIO_PRT1_CFG,
+ PROT_PERI0_GPIO_PRT2_CFG,
+ PROT_PERI0_GPIO_PRT3_CFG,
+ PROT_PERI0_GPIO_PRT4_CFG,
+ PROT_PERI0_GPIO_PRT5_CFG,
+ PROT_PERI0_GPIO_PRT6_CFG,
+ PROT_PERI0_GPIO_PRT7_CFG,
+ PROT_PERI0_GPIO_PRT8_CFG,
+ PROT_PERI0_GPIO_PRT9_CFG,
+ PROT_PERI0_GPIO_PRT10_CFG,
+ PROT_PERI0_GPIO_PRT11_CFG,
+ PROT_PERI0_GPIO_PRT12_CFG,
+ PROT_PERI0_GPIO_PRT13_CFG,
+ PROT_PERI0_GPIO_PRT14_CFG,
+ PROT_PERI0_GPIO_PRT15_CFG,
+ PROT_PERI0_GPIO_PRT16_CFG,
+ PROT_PERI0_GPIO_PRT17_CFG,
+ PROT_PERI0_GPIO_PRT18_CFG,
+ PROT_PERI0_GPIO_PRT19_CFG,
+ PROT_PERI0_GPIO_PRT20_CFG,
+ PROT_PERI0_GPIO_PRT21_CFG,
+ PROT_PERI0_GPIO_SEC_GPIO,
+ PROT_PERI0_GPIO_GPIO,
+ PROT_PERI0_GPIO_TEST,
+ PROT_PERI0_SMARTIO_PRT11_PRT,
+ PROT_PERI0_SMARTIO_PRT17_PRT,
+ PROT_PERI0_CANFD0_CH0_CH,
+ PROT_PERI0_CANFD0_CH1_CH,
+ PROT_PERI0_CANFD0_MAIN,
+ PROT_PERI0_CANFD0_BUF,
+ PROT_PERI0_TCPWM0_GRP0_CNT0_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT1_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT2_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT3_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT4_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT5_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT6_CNT,
+ PROT_PERI0_TCPWM0_GRP0_CNT7_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT0_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT1_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT2_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT3_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT4_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT5_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT6_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT7_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT8_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT9_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT10_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT11_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT12_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT13_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT14_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT15_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT16_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT17_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT18_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT19_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT20_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT21_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT22_CNT,
+ PROT_PERI0_TCPWM0_GRP1_CNT23_CNT,
+ PROT_PERI0_LPCOMP,
+ PROT_PERI0_SCB0,
+ PROT_PERI0_SCB2,
+ PROT_PERI0_SCB3,
+ PROT_PERI0_SCB4,
+ PROT_PERI0_SCB5,
+ PROT_PERI0_SCB6,
+ PROT_PERI0_SCB7,
+ PROT_PERI0_SCB8,
+ PROT_PERI0_SCB9,
+ PROT_PERI0_SCB10,
+ PROT_PERI0_SCB11,
+ PROT_PERI0_SCB1,
+ PROT_PERI0_I3C,
+ PROT_PERI0_DFT,
+ PROT_PERI0_ETH0,
+ PROT_PERI0_MXNNLITE_2_0,
+};
+const cy_en_prot_region_t cycfg_unused_ppc_1_regions[] =
+{
+ PROT_PERI1_MAIN,
+ PROT_PERI1_GR0_GROUP,
+ PROT_PERI1_GR1_GROUP,
+ PROT_PERI1_GR2_GROUP,
+ PROT_PERI1_GR3_GROUP,
+ PROT_PERI1_GR4_GROUP,
+ PROT_PERI1_GR0_BOOT,
+ PROT_PERI1_GR1_BOOT,
+ PROT_PERI1_GR2_BOOT,
+ PROT_PERI1_GR3_BOOT,
+ PROT_PERI1_GR4_BOOT,
+ PROT_PERI1_TR,
+ PROT_PERI1_PERI_PCLK1_MAIN,
+ PROT_PERI1_M55APPCPUSS,
+ PROT_PERI1_MXCM55_CM55,
+ PROT_PERI1_MXCM55_CM55_S,
+ PROT_PERI1_MXCM55_CM55_NS,
+ PROT_PERI1_MXCM55_BOOT,
+ PROT_PERI1_MXCM55_CM55_INT,
+ PROT_PERI1_SAXI_DMAC_TOP,
+ PROT_PERI1_SAXI_DMAC_CH0_CH,
+ PROT_PERI1_SAXI_DMAC_CH1_CH,
+ PROT_PERI1_SAXI_DMAC_CH2_CH,
+ PROT_PERI1_SAXI_DMAC_CH3_CH,
+ PROT_PERI1_APPCPUSS_ALL_PC,
+ PROT_PERI1_APPCPUSS_CM33_NS,
+ PROT_PERI1_APPCPUSS_MSC_INT,
+ PROT_PERI1_APPCPUSS_AHB2AXI_INT,
+ PROT_PERI1_APPCPUSS_AP,
+ PROT_PERI1_MS_CTL_MS13_MAIN,
+ PROT_PERI1_MS_CTL_MS14_MAIN,
+ PROT_PERI1_MS_CTL_MS15_MAIN,
+ PROT_PERI1_MS_CTL_MS19_MAIN,
+ PROT_PERI1_MS_CTL_MS23_MAIN,
+ PROT_PERI1_MS_CTL_MS25_MAIN,
+ PROT_PERI1_MS_CTL_MS26_MAIN,
+ PROT_PERI1_MS_CTL_MS27_MAIN,
+ PROT_PERI1_MS_CTL_MS28_MAIN,
+ PROT_PERI1_MS_CTL_MS_PC13_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC14_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC15_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC19_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC25_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC26_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC27_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC28_PRIV,
+ PROT_PERI1_MS_CTL_MS_PC13_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC14_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC15_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC19_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC25_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC26_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC27_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MS_PC28_PRIV_MIR,
+ PROT_PERI1_MS_CTL_MSC_ACG,
+ PROT_PERI1_APPCPUSS_SL_CTL_GROUP,
+ PROT_PERI1_IPC1_STRUCT0_IPC,
+ PROT_PERI1_IPC1_STRUCT1_IPC,
+ PROT_PERI1_IPC1_STRUCT2_IPC,
+ PROT_PERI1_IPC1_STRUCT3_IPC,
+ PROT_PERI1_IPC1_STRUCT4_IPC,
+ PROT_PERI1_IPC1_STRUCT5_IPC,
+ PROT_PERI1_IPC1_STRUCT6_IPC,
+ PROT_PERI1_IPC1_STRUCT7_IPC,
+ PROT_PERI1_IPC1_STRUCT8_IPC,
+ PROT_PERI1_IPC1_STRUCT9_IPC,
+ PROT_PERI1_IPC1_STRUCT10_IPC,
+ PROT_PERI1_IPC1_STRUCT11_IPC,
+ PROT_PERI1_IPC1_STRUCT12_IPC,
+ PROT_PERI1_IPC1_STRUCT13_IPC,
+ PROT_PERI1_IPC1_STRUCT14_IPC,
+ PROT_PERI1_IPC1_STRUCT15_IPC,
+ PROT_PERI1_IPC1_INTR_STRUCT0_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT1_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT2_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT3_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT4_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT5_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT6_INTR,
+ PROT_PERI1_IPC1_INTR_STRUCT7_INTR,
+ PROT_PERI1_PDM0_MAIN,
+ PROT_PERI1_PDM0_CH0_RX,
+ PROT_PERI1_PDM0_CH1_RX,
+ PROT_PERI1_PDM0_CH2_RX,
+ PROT_PERI1_PDM0_CH3_RX,
+ PROT_PERI1_PDM0_CH4_RX,
+ PROT_PERI1_PDM0_CH5_RX,
+ PROT_PERI1_TDM0_TDM_STRUCT0_TDM_TX_STRUCT_TX,
+ PROT_PERI1_TDM0_TDM_STRUCT1_TDM_TX_STRUCT_TX,
+ PROT_PERI1_TDM0_TDM_STRUCT0_TDM_RX_STRUCT_RX,
+ PROT_PERI1_TDM0_TDM_STRUCT1_TDM_RX_STRUCT_RX,
+ PROT_PERI1_SMIF0_CACHE_BLOCK_MAIN,
+ PROT_PERI1_SMIF1_CACHE_BLOCK_MAIN,
+ PROT_PERI1_SMIF0_CACHE_BLOCK_MMIO_MAIN,
+ PROT_PERI1_SMIF1_CACHE_BLOCK_MMIO_MAIN,
+ PROT_PERI1_SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_MAIN,
+ PROT_PERI1_SMIF1_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_MAIN,
+ PROT_PERI1_SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_PC,
+ PROT_PERI1_SMIF1_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_PC,
+ PROT_PERI1_SMIF0_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_ROT,
+ PROT_PERI1_SMIF1_CACHE_BLOCK_CACHEBLK_AHB_MPC0_PPC_MPC_ROT,
+ PROT_PERI1_SMIF0_CORE_MAIN,
+ PROT_PERI1_SMIF1_CORE_MAIN,
+ PROT_PERI1_SMIF0_CORE_CRYPTO,
+ PROT_PERI1_SMIF1_CORE_CRYPTO,
+ PROT_PERI1_SMIF0_CORE_MAIN2,
+ PROT_PERI1_SMIF1_CORE_MAIN2,
+ PROT_PERI1_SMIF0_CORE_DEVICE,
+ PROT_PERI1_SMIF1_CORE_DEVICE,
+ PROT_PERI1_SMIF0_CORE_AXI_MPC0_PPC_MPC_MAIN,
+ PROT_PERI1_SMIF1_CORE_AXI_MPC0_PPC_MPC_MAIN,
+ PROT_PERI1_SMIF0_CORE_AXI_MPC0_PPC_MPC_PC,
+ PROT_PERI1_SMIF1_CORE_AXI_MPC0_PPC_MPC_PC,
+ PROT_PERI1_SMIF0_CORE_AXI_MPC0_PPC_MPC_ROT,
+ PROT_PERI1_SMIF1_CORE_AXI_MPC0_PPC_MPC_ROT,
+ PROT_PERI1_SMIF0_CORE_SMIF_HSIOM_SMIF_PRT0_PRT,
+ PROT_PERI1_SMIF0_CORE_SMIF_HSIOM_SMIF_PRT1_PRT,
+ PROT_PERI1_SMIF0_CORE_SMIF_HSIOM_SMIF_PRT2_PRT,
+ PROT_PERI1_SMIF1_CORE_SMIF_HSIOM_SMIF_PRT0_PRT,
+ PROT_PERI1_SMIF1_CORE_SMIF_HSIOM_SMIF_PRT1_PRT,
+ PROT_PERI1_SMIF1_CORE_SMIF_HSIOM_SMIF_PRT2_PRT,
+ PROT_PERI1_SMIF0_CORE_SMIF_HSIOM_MON,
+ PROT_PERI1_SMIF1_CORE_SMIF_HSIOM_MON,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_SMIF_PRT0_PRT,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_SMIF_PRT1_PRT,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_SMIF_PRT2_PRT,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_SMIF_PRT0_PRT,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_SMIF_PRT1_PRT,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_SMIF_PRT2_PRT,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_SMIF_PRT0_CFG,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_SMIF_PRT1_CFG,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_SMIF_PRT2_CFG,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_SMIF_PRT0_CFG,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_SMIF_PRT1_CFG,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_SMIF_PRT2_CFG,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_GPIO,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_GPIO,
+ PROT_PERI1_SMIF0_CORE_SMIF_GPIO_TEST,
+ PROT_PERI1_SMIF1_CORE_SMIF_GPIO_TEST,
+ PROT_PERI1_U550_U55,
+ PROT_PERI1_U550_ROT,
+ PROT_PERI1_U550_ACG,
+ PROT_PERI1_U550_MXU55_PPU_PPU,
+ PROT_PERI1_U550_PD_PD,
+ PROT_PERI1_SOCMEM_MAIN,
+ PROT_PERI1_SOCMEM_BOOT,
+ PROT_PERI1_SOCMEM_SOCMEM_PWR,
+ PROT_PERI1_SOCMEM_SRAM_MPC0_PPC_MPC_MAIN,
+ PROT_PERI1_SOCMEM_SRAM_MPC0_PPC_MPC_PC,
+ PROT_PERI1_SOCMEM_SRAM_MPC0_PPC_MPC_ROT,
+ PROT_PERI1_SOCMEM_MAIN_PORT,
+ PROT_PERI1_SOCMEM_PPU_SOCMEM_PPU,
+ PROT_PERI1_SOCMEM_SOCMEM_PD_PD,
+ PROT_PERI1_GFXSS_GPU_GFXSS,
+ PROT_PERI1_GFXSS_DC_GFXSS,
+ PROT_PERI1_GFXSS_MIPIDSI_GFXSS,
+ PROT_PERI1_SDHC0,
+ PROT_PERI1_SDHC1,
+ PROT_PERI1_USBHS_DWC_otg_intreg_CONTROLLER,
+ PROT_PERI1_USBHS_SS_SUBSYSTEM,
+ PROT_PERI1_ITCM,
+ PROT_PERI1_DTCM,
+};
+const size_t cycfg_unused_ppc_0_regions_count = sizeof(cycfg_unused_ppc_0_regions) / sizeof(cy_en_prot_region_t);
+const size_t cycfg_unused_ppc_1_regions_count = sizeof(cycfg_unused_ppc_1_regions) / sizeof(cy_en_prot_region_t);
+
+#if defined(CY_PDL_TZ_ENABLED)
+const cy_stc_sau_config_t SAU_config[4] =
+{
+ {
+ .reg_num = 0U,
+ .base_addr = 0x00000000,
+ .size = 0x10000000,
+ .nsc = false,
+ },
+ {
+ .reg_num = 1U,
+ .base_addr = 0x20000000,
+ .size = 0x10000000,
+ .nsc = false,
+ },
+ {
+ .reg_num = 2U,
+ .base_addr = 0x40000000,
+ .size = 0xc0000000,
+ .nsc = false,
+ },
+ {
+ .reg_num = 3,
+ .base_addr = NSC_START_ADDRESS,
+ .size = NSC_SIZE,
+ .nsc = true,
+ },
+};
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+const cy_stc_mpu_config_t cycfg_mpu_cm55_ns_0_config[3] =
+{
+ {
+ .reg_num = 1U,
+ .base_addr = 0x240FD000,
+ .end_addr = 0x240FFFFF,
+ .writable = true,
+ .require_privileged = false,
+ .shareable = false,
+ .executable = false,
+ .cacheable = 4,
+ .is_device = false,
+ .device_attrs = 0,
+ },
+ {
+ .reg_num = 2U,
+ .base_addr = 0x262FC000,
+ .end_addr = 0x2633BFFF,
+ .writable = true,
+ .require_privileged = false,
+ .shareable = false,
+ .executable = false,
+ .cacheable = 4,
+ .is_device = false,
+ .device_attrs = 0,
+ },
+ {
+ .reg_num = 3U,
+ .base_addr = 0x2633C000,
+ .end_addr = 0x264FFFFF,
+ .writable = true,
+ .require_privileged = false,
+ .shareable = false,
+ .executable = false,
+ .cacheable = 4,
+ .is_device = false,
+ .device_attrs = 0,
+ },
+};
+
+#if defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF)
+const mtb_srf_protection_range_s_t mxrramc_0_mpc_0_srf_protection_range_s[mxrramc_0_mpc_0_REGION_COUNT] =
+{
+ {
+ .start = (void *)0x22011000,
+ .length = 0x4A000U,
+ .is_secure = true,
+ },
+ {
+ .start = (void *)0x2205B000,
+ .length = 0x8000U,
+ .is_secure = false,
+ },
+};
+const mtb_srf_protection_range_s_t mxsramc_0_mpc_0_srf_protection_range_s[mxsramc_0_mpc_0_REGION_COUNT] =
+{
+ {
+ .start = (void *)0x24001000,
+ .length = 0x57000U,
+ .is_secure = true,
+ },
+ {
+ .start = (void *)0x24058000,
+ .length = 0x28000U,
+ .is_secure = false,
+ },
+};
+const mtb_srf_protection_range_s_t mxsramc_1_mpc_0_srf_protection_range_s[mxsramc_1_mpc_0_REGION_COUNT] =
+{
+ {
+ .start = (void *)0x24080000,
+ .length = 0x3D000U,
+ .is_secure = false,
+ },
+ {
+ .start = (void *)0x240BD000,
+ .length = 0x43000U,
+ .is_secure = false,
+ },
+};
+const mtb_srf_protection_range_s_t smif_0_mpc_0_srf_protection_range_s[smif_0_mpc_0_REGION_COUNT] =
+{
+ {
+ .start = (void *)0x60100000,
+ .length = 0x240000U,
+ .is_secure = true,
+ },
+ {
+ .start = (void *)0x60340000,
+ .length = 0x240000U,
+ .is_secure = false,
+ },
+ {
+ .start = (void *)0x60580000,
+ .length = 0x300000U,
+ .is_secure = false,
+ },
+ {
+ .start = (void *)0x60100000,
+ .length = 0x240000U,
+ .is_secure = true,
+ },
+ {
+ .start = (void *)0x60340000,
+ .length = 0x240000U,
+ .is_secure = false,
+ },
+ {
+ .start = (void *)0x60580000,
+ .length = 0x300000U,
+ .is_secure = false,
+ },
+};
+const mtb_srf_protection_range_s_t socmem_0_mpc_0_srf_protection_range_s[socmem_0_mpc_0_REGION_COUNT] =
+{
+ {
+ .start = (void *)0x26000000,
+ .length = 0x40000U,
+ .is_secure = false,
+ },
+ {
+ .start = (void *)0x26040000,
+ .length = 0x4C0000U,
+ .is_secure = false,
+ },
+};
+#endif /* defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF) */
+
+#if defined(CY_PDL_TZ_ENABLED)
+cy_rslt_t _cycfg_mpc_init_regions_rram(const cy_stc_mpc_regions_t *region, const cy_stc_mpc_rot_cfg_t *cfg, uint8_t cfg_count);
+cy_rslt_t _cycfg_mpc_init_regions(const cy_stc_mpc_regions_t *region, const cy_stc_mpc_rot_cfg_t *config, uint8_t cfg_count);
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+cy_rslt_t cycfg_ppc_init_unsecure(PPC_Type *base, const cy_en_prot_region_t regions[], size_t count);
+
+void init_cycfg_ns_power(void) {
+ /* Update global variables used by DeepSleep functions */
+ #if (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP)
+ Cy_SysPm_DeepSleepSetup(CY_SYSPM_MODE_DEEPSLEEP);
+ #elif (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP_RAM)
+ Cy_SysPm_DeepSleepSetup(CY_SYSPM_MODE_DEEPSLEEP_RAM);
+ #elif (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP_OFF)
+ Cy_SysPm_DeepSleepSetup(CY_SYSPM_MODE_DEEPSLEEP_OFF);
+ #endif /* CY_CFG_PWR_SYS_IDLE_MODE */
+
+}
+void init_cycfg_power(void) {
+ Cy_SysPm_Init();
+
+ /* **System Active Power Mode Profile Configuration** */
+ #if (CY_CFG_PWR_SYS_ACTIVE_PROFILE == CY_CFG_PWR_MODE_HP)
+ Cy_SysPm_SystemEnterHp();
+ #elif (CY_CFG_PWR_SYS_ACTIVE_PROFILE == CY_CFG_PWR_MODE_ULP)
+ Cy_SysPm_SystemEnterUlp();
+ #elif (CY_CFG_PWR_SYS_ACTIVE_PROFILE == CY_CFG_PWR_MODE_LP)
+ Cy_SysPm_SystemEnterLp();
+ #endif /* CY_CFG_PWR_SYS_IDLE_MODE */
+
+ /* **System Domain Idle Power Mode Configuration** */
+ #if (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP)
+ Cy_SysPm_SetDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP);
+ Cy_SysPm_SetAppDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP);
+ #elif (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP_RAM)
+ Cy_SysPm_SetDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP_RAM);
+ Cy_SysPm_SetAppDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP_RAM);
+ #elif (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP_OFF)
+ Cy_SysPm_SetDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP_OFF);
+ Cy_SysPm_SetAppDeepSleepMode(CY_SYSPM_MODE_DEEPSLEEP_OFF);
+ #endif /* CY_CFG_PWR_SYS_IDLE_MODE */
+
+
+ Cy_SysPm_DeepSleepUpdate();
+
+ /* **Power domains Configuration** */
+ #if (CY_CFG_PWR_PD1_DOMAIN)
+ #if defined(CORE_NAME_CM33_0) && defined(CY_PDL_TZ_ENABLED)
+ /* Enables PD1 power domain */
+ Cy_System_EnablePD1();
+ /* Enables APP_MMIO_TCM memory for CM55 core */
+ Cy_SysClk_PeriGroupSlaveInit(CY_MMIO_CM55_TCM_512K_PERI_NR, CY_MMIO_CM55_TCM_512K_GROUP_NR, \
+ CY_MMIO_CM55_TCM_512K_SLAVE_NR, CY_MMIO_CM55_TCM_512K_CLK_HF_NR);
+
+ /* Clear SYSCPU and APPCPU power domain dependency set by boot code */
+ cy_pd_pdcm_clear_dependency(CY_PD_PDCM_APPCPU, CY_PD_PDCM_SYSCPU);
+
+ #endif /* defined(CORE_NAME_CM33_0) && defined(CY_PDL_TZ_ENABLED) */
+ #endif /* (CY_CFG_PWR_PD1_DOMAIN) */
+}
+
+#if defined(CY_PDL_TZ_ENABLED)
+cy_rslt_t _cycfg_mpc_init_regions_rram(const cy_stc_mpc_regions_t *region, const cy_stc_mpc_rot_cfg_t *cfg, uint8_t cfg_count) {
+ cy_rslt_t result = CY_RSLT_SUCCESS;
+ ifx_se_mpc_rot_cfg_t rotConfigRram;
+ ifx_se_mpc_rot_cfg_crc_t rotConfigCrcRram;
+
+ memset((void *)&rotConfigRram, 0, sizeof(ifx_se_mpc_rot_cfg_t));
+ memset((void *)&rotConfigCrcRram, 0, sizeof(ifx_se_mpc_rot_cfg_crc_t));
+
+ // Set up rotConfig based on region
+ rotConfigRram.addr_offset = region->offset;
+ rotConfigRram.size = region->size;
+ rotConfigRram.region_size = IFX_SE_MPC_SIZE_4KB;
+
+ for (uint32_t cfg_idx = 0; cfg_idx < cfg_count; ++cfg_idx)
+ {
+ rotConfigRram.pc = (ifx_se_mpc_prot_context_t)cfg[cfg_idx].pc;
+ rotConfigRram.secure = (ifx_se_mpc_sec_attr_t)cfg[cfg_idx].secure;
+ rotConfigRram.access = (ifx_se_mpc_access_attr_t)cfg[cfg_idx].access;
+ rotConfigCrcRram.mpc_config = rotConfigRram;
+ rotConfigCrcRram.crc =
+ IFX_CRC32_CALC((uint8_t *)(&rotConfigCrcRram), sizeof(rotConfigCrcRram) - sizeof(uint32_t));
+ // Call the configuration function for each region and config
+ ifx_se_status_t cfg_rslt = ifx_se_mpc_config_rot_mpc_struct(&rotConfigCrcRram,
+ IFX_SE_NULL_CTX);
+
+ if (!IFX_SE_IS_STATUS_SUCCESS(cfg_rslt)) {
+ result = CY_MPC_FAILURE;
+ }
+ }
+
+ return result;
+}
+cy_rslt_t _cycfg_mpc_init_regions(const cy_stc_mpc_regions_t *region, const cy_stc_mpc_rot_cfg_t *config, uint8_t cfg_count) {
+ // Will return an error if one occurs at all in the setup process
+ cy_rslt_t retResult = CY_RSLT_SUCCESS;
+ // Will track the current iteration for errors
+ cy_rslt_t currentResult = CY_RSLT_SUCCESS;
+
+ for (uint32_t cfg_idx = 0; cfg_idx < cfg_count; ++cfg_idx)
+ {
+ // Call the configuration function for each region and config
+ currentResult = Cy_Mpc_ConfigRotMpcStruct(region->base, region->offset, region->size, &config[cfg_idx]);
+ if (CY_RSLT_SUCCESS != currentResult) {
+ retResult = currentResult;
+ }
+ }
+
+ return retResult;
+}
+cy_rslt_t init_cycfg_mpc(void) {
+ // Will return an error if one occurs at all in the setup process
+ cy_rslt_t retResult = CY_RSLT_SUCCESS;
+ // Will track the current iteration for errors
+ cy_rslt_t currentResult = CY_RSLT_SUCCESS;
+
+ // When executing from RRAM, the SMIF must be initialized and enabled to
+ // hold onto any MPC configurations performed on the SMIF memory regions.
+ // We can disable them after performing the MPC configurations.
+ #if (smif_0_mpc_0_REGION_COUNT > 0U)
+ bool isSmif0Uninitialized = false;
+ if (!Cy_SMIF_IsEnabled(SMIF0_CORE)) {
+ isSmif0Uninitialized = true;
+
+ cy_stc_smif_context_t SMIF_CORE0_Context;
+
+ static const cy_stc_smif_config_t SMIF_0_CORE_0_config =
+ {
+ .mode = (uint32_t)CY_SMIF_NORMAL,
+ .deselectDelay = SMIF_DESELECT_DELAY,
+ .blockEvent = (uint32_t)CY_SMIF_BUS_ERROR,
+ .enable_internal_dll = false
+ };
+
+ /* Enable IP with default configuration */
+ (void)Cy_SMIF_Init(SMIF0_CORE, &SMIF_0_CORE_0_config, TIMEOUT_1_MS, &SMIF_CORE0_Context);
+ Cy_SMIF_Enable(SMIF0_CORE, &SMIF_CORE0_Context);
+ }
+ #endif // (smif_0_mpc_0_REGION_COUNT > 0U)
+
+ #if (smif_1_mpc_0_REGION_COUNT > 0U)
+ bool isSmif1Uninitialized = false;
+ if (!Cy_SMIF_IsEnabled(SMIF1_CORE)) {
+ isSmif1Uninitialized = true;
+
+ cy_stc_smif_context_t SMIF_CORE1_Context;
+
+ static const cy_stc_smif_config_t SMIF_0_CORE_1_config =
+ {
+ .mode = (uint32_t)CY_SMIF_NORMAL,
+ .deselectDelay = SMIF_DESELECT_DELAY,
+ .blockEvent = (uint32_t)CY_SMIF_BUS_ERROR,
+ .enable_internal_dll = false
+ };
+
+ /* Enable IP with default configuration */
+ (void)Cy_SMIF_Init(SMIF1_CORE, &SMIF_0_CORE_1_config, TIMEOUT_1_MS, &SMIF_CORE1_Context);
+ Cy_SMIF_Enable(SMIF1_CORE, &SMIF_CORE1_Context);
+ }
+ #endif // (smif_1_mpc_0_REGION_COUNT > 0U)
+
+ #if (socmem_0_mpc_0_REGION_COUNT > 0U)
+ /* Enable SOCMEM */
+ Cy_SysEnableSOCMEM(true);
+ #endif // (socmem_0_mpc_0_REGION_COUNT > 0U)
+
+ for (size_t memory_idx = 0; memory_idx < cy_response_mpcs_count; memory_idx++)
+ {
+ Cy_Mpc_SetViolationResponse(cy_response_mpcs[memory_idx].base, cy_response_mpcs[memory_idx].response);
+ }
+
+
+ for (size_t domain_idx = 0; domain_idx < unified_mpc_domains_count; ++domain_idx)
+ {
+ const cy_stc_mpc_unified_t *domain = &unified_mpc_domains[domain_idx];
+
+ for (uint32_t region_idx = 0; region_idx < domain->region_count; ++region_idx)
+ {
+ const cy_stc_mpc_regions_t *region = &domain->regions[region_idx];
+
+ if (region->base == (MPC_Type *)RRAMC0_MPC0) {
+ currentResult = _cycfg_mpc_init_regions_rram(region, &(domain->cfg[0]), domain->cfg_count);
+ } else {
+ // Check for an empty regions struct
+ if (region->base != NULL) {
+ currentResult = _cycfg_mpc_init_regions(region, &(domain->cfg[0]), domain->cfg_count);
+ }
+ }
+
+ if (CY_RSLT_SUCCESS != currentResult) {
+ retResult = currentResult;
+ }
+ }
+ }
+
+ #if (smif_1_mpc_0_REGION_COUNT > 0U)
+ if (isSmif1Uninitialized) {
+ /* Disable IP as MPC configuration is complete*/
+ Cy_SMIF_Disable(SMIF1_CORE);
+ }
+ #endif // (smif_1_mpc_0_REGION_COUNT > 0U)
+
+ #if (smif_0_mpc_0_REGION_COUNT > 0U)
+ if (isSmif0Uninitialized) {
+ /* Disable IP as MPC configuration is complete*/
+ Cy_SMIF_Disable(SMIF0_CORE);
+ }
+ #endif // (smif_0_mpc_0_REGION_COUNT > 0U)
+
+ return retResult;
+}
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+cy_rslt_t cycfg_ppc_init_unsecure(PPC_Type *base, const cy_en_prot_region_t regions[], size_t count) {
+ cy_rslt_t ret = Cy_Ppc_InitPpc(base, CY_PPC_BUS_ERR);
+
+ for (size_t index = 0; ret == CY_PPC_SUCCESS && index < count; index++)
+ {
+ ret = Cy_Ppc_ConfigAttrib(base, regions[index], &cycfg_unused_ppc_cfg);
+ if (ret == CY_RSLT_SUCCESS) {
+ ret = Cy_Ppc_SetPcMask(base, regions[index], PPC_PC_MASK_ALL_ACCESS);
+ }
+ }
+ return ret;
+}
+cy_rslt_t init_cycfg_ppc0(void) {
+ return cycfg_ppc_init_unsecure(PPC0, cycfg_unused_ppc_0_regions, cycfg_unused_ppc_0_regions_count);
+}
+cy_rslt_t init_cycfg_ppc1(void) {
+ return cycfg_ppc_init_unsecure(PPC1, cycfg_unused_ppc_1_regions, cycfg_unused_ppc_1_regions_count);
+}
+void init_cycfg_system(void) {
+ #if defined(CY_CFG_PWR_ENABLED) && defined(CY_CFG_PWR_INIT)
+ init_cycfg_power();
+ #endif /* defined (CY_CFG_PWR_ENABLED) && defined (CY_CFG_PWR_INIT) */
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_system.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_system.h
new file mode 100644
index 00000000000..1b9cab5a442
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cycfg_system.h
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * File Name: cycfg_system.h
+ *
+ * Description:
+ * System configuration
+ * This file was automatically generated and should not be modified.
+ * Configurator Backend 3.60.0
+ * device-db 4.34.0.9502
+ * mtb-dsl-pse8xxgp 1.2.0.895
+ *
+ *******************************************************************************
+ * Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+ * an affiliate of Cypress Semiconductor Corporation.
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#if !defined(CYCFG_SYSTEM_H)
+#define CYCFG_SYSTEM_H
+
+#include "cycfg_notices.h"
+#include "cy_syspm.h"
+#include "system_edge.h"
+#include "cy_sysclk.h"
+#include "cy_syspm_pdcm.h"
+#include "cy_device.h"
+#include "cy_mpc.h"
+#include "cy_ppc.h"
+#include "cy_cmsis_utils.h"
+
+#if defined(CY_PDL_TZ_ENABLED)
+#include "cy_cmsis_utils.h"
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+#if defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF)
+#include "mtb_srf.h"
+#endif /* defined (COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF) */
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+#define srss_0_power_0_ENABLED 1U
+#define CY_CFG_PWR_MODE_LP 0x01UL
+#define CY_CFG_PWR_MODE_ULP 0x02UL
+#define CY_CFG_PWR_MODE_HP 0x03UL
+#define CY_CFG_PWR_MODE_ACTIVE 0x04UL
+#define CY_CFG_PWR_MODE_SLEEP 0x08UL
+#define CY_CFG_PWR_MODE_DEEPSLEEP 0x10UL
+#define CY_CFG_PWR_MODE_DEEPSLEEP_RAM 0x11UL
+#define CY_CFG_PWR_MODE_DEEPSLEEP_OFF 0x12UL
+#define CY_CFG_PWR_SYS_IDLE_MODE CY_CFG_PWR_MODE_DEEPSLEEP
+#define CY_CFG_PWR_DEEPSLEEP_LATENCY 20UL
+#define CY_CFG_PWR_SYS_ACTIVE_MODE CY_CFG_PWR_MODE_HP
+#define CY_CFG_PWR_SYS_ACTIVE_PROFILE CY_CFG_PWR_MODE_HP
+#define CY_CFG_PWR_VDDA_MV 1800
+#define CY_CFG_PWR_VDDD_MV 1800
+#define CY_CFG_PWR_VDDIO0_MV 1800
+#define CY_CFG_PWR_VDDIO1_MV 1800
+#define CY_CFG_PWR_CBUCK_VOLT CY_SYSPM_CORE_BUCK_VOLTAGE_0_90V
+#define CY_CFG_PWR_CBUCK_MODE CY_SYSPM_CORE_BUCK_MODE_HP
+#define CY_CFG_PWR_SRAMLDO_VOLT CY_SYSPM_SRAMLDO_VOLTAGE_0_80V
+#define CY_CFG_PWR_PD1_DOMAIN 1
+#define CY_CFG_PWR_PPU_MAIN PPU_V1_MODE_FULL_RET
+#define CY_CFG_PWR_PPU_PD1 PPU_V1_MODE_FULL_RET
+#define CY_CFG_PWR_PPU_SRAM0 PPU_V1_MODE_MEM_RET
+#define CY_CFG_PWR_PPU_SRAM1 PPU_V1_MODE_MEM_RET
+#define CY_CFG_PWR_PPU_SYSCPU PPU_V1_MODE_FULL_RET
+#define CY_CFG_PWR_PPU_APPCPUSS PPU_V1_MODE_FULL_RET
+#define CY_CFG_PWR_PPU_APPCPU PPU_V1_MODE_FULL_RET
+#define CY_CFG_PWR_PPU_SOCMEM PPU_V1_MODE_MEM_RET
+#define CY_CFG_PWR_PPU_U55 PPU_V1_MODE_ON
+#define M33S_ENABLED 1U
+#define M33_ENABLED 1U
+#define M55_ENABLED 1U
+#define M33NSC_ENABLED 1U
+#define M33_M55_ENABLED 1U
+#define reserved_ENABLED 1U
+#define vres_0_protection_0_mpc_0_ENABLED 1U
+#define M33S_UNIFIED_MPC_DOMAIN_IDX 0U
+#define M33_UNIFIED_MPC_DOMAIN_IDX 1U
+#define M55_UNIFIED_MPC_DOMAIN_IDX 2U
+#define M33NSC_UNIFIED_MPC_DOMAIN_IDX 3U
+#define M33_M55_UNIFIED_MPC_DOMAIN_IDX 4U
+#define Cy_MPC_Init init_cycfg_mpc
+#define PPC_PC_MASK_ALL_ACCESS 0xFFU
+#define Cy_PPC0_Init init_cycfg_ppc0
+#define Cy_PPC1_Init init_cycfg_ppc1
+#define m33syscpuss_0_cm33_0_sau_0_ENABLED 1U
+#define m55appcpuss_0_cm55_0_mpu_ns_0_ENABLED 1U
+#define mxrramc_0_mpc_0_RESPONSE CY_MPC_BUS_ERR
+#define mxrramc_0_mpc_0_REGION_COUNT 4U
+#define mxsramc_0_mpc_0_RESPONSE CY_MPC_BUS_ERR
+#define mxsramc_0_mpc_0_REGION_COUNT 3U
+#define mxsramc_1_mpc_0_RESPONSE CY_MPC_BUS_ERR
+#define mxsramc_1_mpc_0_REGION_COUNT 2U
+#define smif_0_mpc_0_RESPONSE CY_MPC_BUS_ERR
+#define smif_0_mpc_0_REGION_COUNT 6U
+#define smif_1_mpc_0_RESPONSE CY_MPC_RZWI
+#define smif_1_mpc_0_REGION_COUNT 0U
+#define socmem_0_mpc_0_RESPONSE CY_MPC_BUS_ERR
+#define socmem_0_mpc_0_REGION_COUNT 2U
+
+#if defined(CY_PDL_TZ_ENABLED)
+extern const cy_stc_mpc_rot_cfg_t M33S_mpc_cfg[];
+extern const cy_stc_mpc_rot_cfg_t M33_mpc_cfg[];
+extern const cy_stc_mpc_rot_cfg_t M55_mpc_cfg[];
+extern const cy_stc_mpc_rot_cfg_t M33NSC_mpc_cfg[];
+extern const cy_stc_mpc_rot_cfg_t M33_M55_mpc_cfg[];
+extern const cy_stc_mpc_regions_t M33S_mpc_regions[];
+extern const cy_stc_mpc_regions_t M33_mpc_regions[];
+extern const cy_stc_mpc_regions_t M55_mpc_regions[];
+extern const cy_stc_mpc_regions_t M33NSC_mpc_regions[];
+extern const cy_stc_mpc_regions_t M33_M55_mpc_regions[];
+extern const cy_stc_mpc_resp_cfg_t cy_response_mpcs[];
+extern const size_t cy_response_mpcs_count;
+extern const cy_stc_mpc_unified_t unified_mpc_domains[];
+extern const size_t unified_mpc_domains_count;
+#endif /* defined (CY_PDL_TZ_ENABLED) */
+
+#if defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF)
+extern const mtb_srf_memory_protection_s_t mtb_srf_memory_protection_s[];
+extern const uint8_t mtb_srf_protection_range_s_count;
+#endif /* defined (COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF) */
+
+extern const cy_stc_ppc_attribute_t cycfg_unused_ppc_cfg;
+extern const cy_en_prot_region_t cycfg_unused_ppc_0_regions[];
+extern const cy_en_prot_region_t cycfg_unused_ppc_1_regions[];
+extern const size_t cycfg_unused_ppc_0_regions_count;
+extern const size_t cycfg_unused_ppc_1_regions_count;
+
+#if defined(CY_PDL_TZ_ENABLED)
+extern const cy_stc_sau_config_t SAU_config[4];
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+extern const cy_stc_mpu_config_t cycfg_mpu_cm55_ns_0_config[3];
+
+#if defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF)
+extern const mtb_srf_protection_range_s_t mxrramc_0_mpc_0_srf_protection_range_s[mxrramc_0_mpc_0_REGION_COUNT];
+extern const mtb_srf_protection_range_s_t mxsramc_0_mpc_0_srf_protection_range_s[mxsramc_0_mpc_0_REGION_COUNT];
+extern const mtb_srf_protection_range_s_t mxsramc_1_mpc_0_srf_protection_range_s[mxsramc_1_mpc_0_REGION_COUNT];
+extern const mtb_srf_protection_range_s_t smif_0_mpc_0_srf_protection_range_s[smif_0_mpc_0_REGION_COUNT];
+extern const mtb_srf_protection_range_s_t socmem_0_mpc_0_srf_protection_range_s[socmem_0_mpc_0_REGION_COUNT];
+#endif /* defined(COMPONENT_SECURE_DEVICE) && defined(COMPONENT_MW_MTB_SRF) */
+
+void init_cycfg_ns_power(void);
+void init_cycfg_power(void);
+
+#if defined(CY_PDL_TZ_ENABLED)
+cy_rslt_t init_cycfg_mpc(void);
+#endif /* defined(CY_PDL_TZ_ENABLED) */
+
+cy_rslt_t init_cycfg_ppc0(void);
+cy_rslt_t init_cycfg_ppc1(void);
+void init_cycfg_system(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* CYCFG_SYSTEM_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM33_0.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM33_0.h
new file mode 100644
index 00000000000..fb2a3e11379
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM33_0.h
@@ -0,0 +1,92 @@
+/* This file is automatically generated. */
+#if !defined(CYMEM_CM33_0_H)
+#define CYMEM_CM33_0_H
+
+#define CYMEM_CM33_0_m55_data_START 0x48040000u
+#define CYMEM_CM33_0_m55_data_SIZE 0x00040000u
+#define CYMEM_CM33_0_m55_data_OFFSET 0x00000000u
+#define CYMEM_CM33_0_m55_code_START 0x48000000u
+#define CYMEM_CM33_0_m55_code_SIZE 0x00040000u
+#define CYMEM_CM33_0_m55_code_OFFSET 0x00000000u
+#define CYMEM_CM33_0_user_programmable_START 0x22011000u
+#define CYMEM_CM33_0_user_programmable_C_START 0x02011000u
+#define CYMEM_CM33_0_user_programmable_SIZE 0x0004A000u
+#define CYMEM_CM33_0_user_programmable_OFFSET 0x00011000u
+#define CYMEM_CM33_0_user_nvm_START 0x2205B000u
+#define CYMEM_CM33_0_user_nvm_C_START 0x0205B000u
+#define CYMEM_CM33_0_user_nvm_SIZE 0x00008000u
+#define CYMEM_CM33_0_user_nvm_OFFSET 0x0005B000u
+#define CYMEM_CM33_0_m33s_nvm_START 0x60100000u
+#define CYMEM_CM33_0_m33s_nvm_C_START 0x08100000u
+#define CYMEM_CM33_0_m33s_nvm_SIZE 0x00200000u
+#define CYMEM_CM33_0_m33s_nvm_OFFSET 0x00100000u
+#define CYMEM_CM33_0_m33s_trailer_START 0x60300000u
+#define CYMEM_CM33_0_m33s_trailer_C_START 0x08300000u
+#define CYMEM_CM33_0_m33s_trailer_SIZE 0x00040000u
+#define CYMEM_CM33_0_m33s_trailer_OFFSET 0x00300000u
+#define CYMEM_CM33_0_m33_nvm_START 0x60340000u
+#define CYMEM_CM33_0_m33_nvm_C_START 0x08340000u
+#define CYMEM_CM33_0_m33_nvm_SIZE 0x00200000u
+#define CYMEM_CM33_0_m33_nvm_OFFSET 0x00340000u
+#define CYMEM_CM33_0_m33_trailer_START 0x60540000u
+#define CYMEM_CM33_0_m33_trailer_C_START 0x08540000u
+#define CYMEM_CM33_0_m33_trailer_SIZE 0x00040000u
+#define CYMEM_CM33_0_m33_trailer_OFFSET 0x00540000u
+#define CYMEM_CM33_0_m55_nvm_START 0x60580000u
+#define CYMEM_CM33_0_m55_nvm_C_START 0x08580000u
+#define CYMEM_CM33_0_m55_nvm_SIZE 0x002C0000u
+#define CYMEM_CM33_0_m55_nvm_OFFSET 0x00580000u
+#define CYMEM_CM33_0_m55_trailer_START 0x60840000u
+#define CYMEM_CM33_0_m55_trailer_C_START 0x08840000u
+#define CYMEM_CM33_0_m55_trailer_SIZE 0x00040000u
+#define CYMEM_CM33_0_m55_trailer_OFFSET 0x00840000u
+#define CYMEM_CM33_0_m55_code_secondary_START 0x26000000u
+#define CYMEM_CM33_0_m55_code_secondary_C_START 0x06000000u
+#define CYMEM_CM33_0_m55_code_secondary_SIZE 0x00040000u
+#define CYMEM_CM33_0_m55_code_secondary_OFFSET 0x00000000u
+#define CYMEM_CM33_0_m55_data_secondary_START 0x26040000u
+#define CYMEM_CM33_0_m55_data_secondary_C_START 0x06040000u
+#define CYMEM_CM33_0_m55_data_secondary_SIZE 0x002BC000u
+#define CYMEM_CM33_0_m55_data_secondary_OFFSET 0x00040000u
+#define CYMEM_CM33_0_m33_m55_shared_START 0x262FC000u
+#define CYMEM_CM33_0_m33_m55_shared_C_START 0x062FC000u
+#define CYMEM_CM33_0_m33_m55_shared_SIZE 0x00040000u
+#define CYMEM_CM33_0_m33_m55_shared_OFFSET 0x002FC000u
+#define CYMEM_CM33_0_gfx_mem_START 0x2633C000u
+#define CYMEM_CM33_0_gfx_mem_C_START 0x0633C000u
+#define CYMEM_CM33_0_gfx_mem_SIZE 0x001C4000u
+#define CYMEM_CM33_0_gfx_mem_OFFSET 0x0033C000u
+#define CYMEM_CM33_0_m33s_shared_START 0x24001000u
+#define CYMEM_CM33_0_m33s_shared_C_START 0x04001000u
+#define CYMEM_CM33_0_m33s_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_m33s_shared_OFFSET 0x00001000u
+#define CYMEM_CM33_0_m33s_code_START 0x24002000u
+#define CYMEM_CM33_0_m33s_code_C_START 0x04002000u
+#define CYMEM_CM33_0_m33s_code_SIZE 0x00035000u
+#define CYMEM_CM33_0_m33s_code_OFFSET 0x00002000u
+#define CYMEM_CM33_0_m33s_data_START 0x24037000u
+#define CYMEM_CM33_0_m33s_data_C_START 0x04037000u
+#define CYMEM_CM33_0_m33s_data_SIZE 0x00021000u
+#define CYMEM_CM33_0_m33s_data_OFFSET 0x00037000u
+#define CYMEM_CM33_0_m33_code_START 0x24058000u
+#define CYMEM_CM33_0_m33_code_C_START 0x04058000u
+#define CYMEM_CM33_0_m33_code_SIZE 0x00065000u
+#define CYMEM_CM33_0_m33_code_OFFSET 0x00058000u
+#define CYMEM_CM33_0_m33_data_START 0x240BD000u
+#define CYMEM_CM33_0_m33_data_C_START 0x040BD000u
+#define CYMEM_CM33_0_m33_data_SIZE 0x00040000u
+#define CYMEM_CM33_0_m33_data_OFFSET 0x000BD000u
+#define CYMEM_CM33_0_m33s_allocatable_shared_START 0x240FD000u
+#define CYMEM_CM33_0_m33s_allocatable_shared_C_START 0x040FD000u
+#define CYMEM_CM33_0_m33s_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_m33s_allocatable_shared_OFFSET 0x000FD000u
+#define CYMEM_CM33_0_m33_allocatable_shared_START 0x240FE000u
+#define CYMEM_CM33_0_m33_allocatable_shared_C_START 0x040FE000u
+#define CYMEM_CM33_0_m33_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_m33_allocatable_shared_OFFSET 0x000FE000u
+#define CYMEM_CM33_0_m55_allocatable_shared_START 0x240FF000u
+#define CYMEM_CM33_0_m55_allocatable_shared_C_START 0x040FF000u
+#define CYMEM_CM33_0_m55_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_m55_allocatable_shared_OFFSET 0x000FF000u
+
+#endif /* CYMEM_CM33_0_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM33_0_S.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM33_0_S.h
new file mode 100644
index 00000000000..bc7a5281c9a
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM33_0_S.h
@@ -0,0 +1,134 @@
+/* This file is automatically generated. */
+#if !defined(CYMEM_CM33_0_S_H)
+#define CYMEM_CM33_0_S_H
+
+#define CYMEM_CM33_0_S_m55_data_START 0x48040000u
+#define CYMEM_CM33_0_S_m55_data_S_START 0x58040000u
+#define CYMEM_CM33_0_S_m55_data_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m55_data_OFFSET 0x00000000u
+#define CYMEM_CM33_0_S_m55_code_START 0x48000000u
+#define CYMEM_CM33_0_S_m55_code_S_START 0x58000000u
+#define CYMEM_CM33_0_S_m55_code_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m55_code_OFFSET 0x00000000u
+#define CYMEM_CM33_0_S_user_programmable_START 0x22011000u
+#define CYMEM_CM33_0_S_user_programmable_C_START 0x02011000u
+#define CYMEM_CM33_0_S_user_programmable_C_S_START 0x12011000u
+#define CYMEM_CM33_0_S_user_programmable_S_START 0x32011000u
+#define CYMEM_CM33_0_S_user_programmable_SIZE 0x0004A000u
+#define CYMEM_CM33_0_S_user_programmable_OFFSET 0x00011000u
+#define CYMEM_CM33_0_S_user_nvm_START 0x2205B000u
+#define CYMEM_CM33_0_S_user_nvm_C_START 0x0205B000u
+#define CYMEM_CM33_0_S_user_nvm_C_S_START 0x1205B000u
+#define CYMEM_CM33_0_S_user_nvm_S_START 0x3205B000u
+#define CYMEM_CM33_0_S_user_nvm_SIZE 0x00008000u
+#define CYMEM_CM33_0_S_user_nvm_OFFSET 0x0005B000u
+#define CYMEM_CM33_0_S_m33s_nvm_START 0x60100000u
+#define CYMEM_CM33_0_S_m33s_nvm_C_START 0x08100000u
+#define CYMEM_CM33_0_S_m33s_nvm_C_S_START 0x18100000u
+#define CYMEM_CM33_0_S_m33s_nvm_S_START 0x70100000u
+#define CYMEM_CM33_0_S_m33s_nvm_SIZE 0x00200000u
+#define CYMEM_CM33_0_S_m33s_nvm_OFFSET 0x00100000u
+#define CYMEM_CM33_0_S_m33s_trailer_START 0x60300000u
+#define CYMEM_CM33_0_S_m33s_trailer_C_START 0x08300000u
+#define CYMEM_CM33_0_S_m33s_trailer_C_S_START 0x18300000u
+#define CYMEM_CM33_0_S_m33s_trailer_S_START 0x70300000u
+#define CYMEM_CM33_0_S_m33s_trailer_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m33s_trailer_OFFSET 0x00300000u
+#define CYMEM_CM33_0_S_m33_nvm_START 0x60340000u
+#define CYMEM_CM33_0_S_m33_nvm_C_START 0x08340000u
+#define CYMEM_CM33_0_S_m33_nvm_C_S_START 0x18340000u
+#define CYMEM_CM33_0_S_m33_nvm_S_START 0x70340000u
+#define CYMEM_CM33_0_S_m33_nvm_SIZE 0x00200000u
+#define CYMEM_CM33_0_S_m33_nvm_OFFSET 0x00340000u
+#define CYMEM_CM33_0_S_m33_trailer_START 0x60540000u
+#define CYMEM_CM33_0_S_m33_trailer_C_START 0x08540000u
+#define CYMEM_CM33_0_S_m33_trailer_C_S_START 0x18540000u
+#define CYMEM_CM33_0_S_m33_trailer_S_START 0x70540000u
+#define CYMEM_CM33_0_S_m33_trailer_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m33_trailer_OFFSET 0x00540000u
+#define CYMEM_CM33_0_S_m55_nvm_START 0x60580000u
+#define CYMEM_CM33_0_S_m55_nvm_C_START 0x08580000u
+#define CYMEM_CM33_0_S_m55_nvm_C_S_START 0x18580000u
+#define CYMEM_CM33_0_S_m55_nvm_S_START 0x70580000u
+#define CYMEM_CM33_0_S_m55_nvm_SIZE 0x002C0000u
+#define CYMEM_CM33_0_S_m55_nvm_OFFSET 0x00580000u
+#define CYMEM_CM33_0_S_m55_trailer_START 0x60840000u
+#define CYMEM_CM33_0_S_m55_trailer_C_START 0x08840000u
+#define CYMEM_CM33_0_S_m55_trailer_C_S_START 0x18840000u
+#define CYMEM_CM33_0_S_m55_trailer_S_START 0x70840000u
+#define CYMEM_CM33_0_S_m55_trailer_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m55_trailer_OFFSET 0x00840000u
+#define CYMEM_CM33_0_S_m55_code_secondary_START 0x26000000u
+#define CYMEM_CM33_0_S_m55_code_secondary_C_START 0x06000000u
+#define CYMEM_CM33_0_S_m55_code_secondary_C_S_START 0x16000000u
+#define CYMEM_CM33_0_S_m55_code_secondary_S_START 0x36000000u
+#define CYMEM_CM33_0_S_m55_code_secondary_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m55_code_secondary_OFFSET 0x00000000u
+#define CYMEM_CM33_0_S_m55_data_secondary_START 0x26040000u
+#define CYMEM_CM33_0_S_m55_data_secondary_C_START 0x06040000u
+#define CYMEM_CM33_0_S_m55_data_secondary_C_S_START 0x16040000u
+#define CYMEM_CM33_0_S_m55_data_secondary_S_START 0x36040000u
+#define CYMEM_CM33_0_S_m55_data_secondary_SIZE 0x002BC000u
+#define CYMEM_CM33_0_S_m55_data_secondary_OFFSET 0x00040000u
+#define CYMEM_CM33_0_S_m33_m55_shared_START 0x262FC000u
+#define CYMEM_CM33_0_S_m33_m55_shared_C_START 0x062FC000u
+#define CYMEM_CM33_0_S_m33_m55_shared_C_S_START 0x162FC000u
+#define CYMEM_CM33_0_S_m33_m55_shared_S_START 0x362FC000u
+#define CYMEM_CM33_0_S_m33_m55_shared_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m33_m55_shared_OFFSET 0x002FC000u
+#define CYMEM_CM33_0_S_gfx_mem_START 0x2633C000u
+#define CYMEM_CM33_0_S_gfx_mem_C_START 0x0633C000u
+#define CYMEM_CM33_0_S_gfx_mem_C_S_START 0x1633C000u
+#define CYMEM_CM33_0_S_gfx_mem_S_START 0x3633C000u
+#define CYMEM_CM33_0_S_gfx_mem_SIZE 0x001C4000u
+#define CYMEM_CM33_0_S_gfx_mem_OFFSET 0x0033C000u
+#define CYMEM_CM33_0_S_m33s_shared_START 0x24001000u
+#define CYMEM_CM33_0_S_m33s_shared_C_START 0x04001000u
+#define CYMEM_CM33_0_S_m33s_shared_C_S_START 0x14001000u
+#define CYMEM_CM33_0_S_m33s_shared_S_START 0x34001000u
+#define CYMEM_CM33_0_S_m33s_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_S_m33s_shared_OFFSET 0x00001000u
+#define CYMEM_CM33_0_S_m33s_code_START 0x24002000u
+#define CYMEM_CM33_0_S_m33s_code_C_START 0x04002000u
+#define CYMEM_CM33_0_S_m33s_code_C_S_START 0x14002000u
+#define CYMEM_CM33_0_S_m33s_code_S_START 0x34002000u
+#define CYMEM_CM33_0_S_m33s_code_SIZE 0x00035000u
+#define CYMEM_CM33_0_S_m33s_code_OFFSET 0x00002000u
+#define CYMEM_CM33_0_S_m33s_data_START 0x24037000u
+#define CYMEM_CM33_0_S_m33s_data_C_START 0x04037000u
+#define CYMEM_CM33_0_S_m33s_data_C_S_START 0x14037000u
+#define CYMEM_CM33_0_S_m33s_data_S_START 0x34037000u
+#define CYMEM_CM33_0_S_m33s_data_SIZE 0x00021000u
+#define CYMEM_CM33_0_S_m33s_data_OFFSET 0x00037000u
+#define CYMEM_CM33_0_S_m33_code_START 0x24058000u
+#define CYMEM_CM33_0_S_m33_code_C_START 0x04058000u
+#define CYMEM_CM33_0_S_m33_code_C_S_START 0x14058000u
+#define CYMEM_CM33_0_S_m33_code_S_START 0x34058000u
+#define CYMEM_CM33_0_S_m33_code_SIZE 0x00065000u
+#define CYMEM_CM33_0_S_m33_code_OFFSET 0x00058000u
+#define CYMEM_CM33_0_S_m33_data_START 0x240BD000u
+#define CYMEM_CM33_0_S_m33_data_C_START 0x040BD000u
+#define CYMEM_CM33_0_S_m33_data_C_S_START 0x140BD000u
+#define CYMEM_CM33_0_S_m33_data_S_START 0x340BD000u
+#define CYMEM_CM33_0_S_m33_data_SIZE 0x00040000u
+#define CYMEM_CM33_0_S_m33_data_OFFSET 0x000BD000u
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_START 0x240FD000u
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_C_START 0x040FD000u
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START 0x140FD000u
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_S_START 0x340FD000u
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_OFFSET 0x000FD000u
+#define CYMEM_CM33_0_S_m33_allocatable_shared_START 0x240FE000u
+#define CYMEM_CM33_0_S_m33_allocatable_shared_C_START 0x040FE000u
+#define CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START 0x140FE000u
+#define CYMEM_CM33_0_S_m33_allocatable_shared_S_START 0x340FE000u
+#define CYMEM_CM33_0_S_m33_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_S_m33_allocatable_shared_OFFSET 0x000FE000u
+#define CYMEM_CM33_0_S_m55_allocatable_shared_START 0x240FF000u
+#define CYMEM_CM33_0_S_m55_allocatable_shared_C_START 0x040FF000u
+#define CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START 0x140FF000u
+#define CYMEM_CM33_0_S_m55_allocatable_shared_S_START 0x340FF000u
+#define CYMEM_CM33_0_S_m55_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM33_0_S_m55_allocatable_shared_OFFSET 0x000FF000u
+
+#endif /* CYMEM_CM33_0_S_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM55_0.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM55_0.h
new file mode 100644
index 00000000000..f83e6e5ddb2
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_CM55_0.h
@@ -0,0 +1,45 @@
+/* This file is automatically generated. */
+#if !defined(CYMEM_CM55_0_H)
+#define CYMEM_CM55_0_H
+
+#define CYMEM_CM55_0_m55_data_INTERNAL_START 0x20000000u
+#define CYMEM_CM55_0_m55_data_SIZE 0x00040000u
+#define CYMEM_CM55_0_m55_data_OFFSET 0x00000000u
+#define CYMEM_CM55_0_m55_code_INTERNAL_START 0x00000000u
+#define CYMEM_CM55_0_m55_code_SIZE 0x00040000u
+#define CYMEM_CM55_0_m55_code_OFFSET 0x00000000u
+#define CYMEM_CM55_0_user_nvm_C_START 0x0205B000u
+#define CYMEM_CM55_0_user_nvm_SIZE 0x00008000u
+#define CYMEM_CM55_0_user_nvm_OFFSET 0x0005B000u
+#define CYMEM_CM55_0_m55_nvm_START 0x60580000u
+#define CYMEM_CM55_0_m55_nvm_SIZE 0x002C0000u
+#define CYMEM_CM55_0_m55_nvm_OFFSET 0x00580000u
+#define CYMEM_CM55_0_m55_trailer_START 0x60840000u
+#define CYMEM_CM55_0_m55_trailer_SIZE 0x00040000u
+#define CYMEM_CM55_0_m55_trailer_OFFSET 0x00840000u
+#define CYMEM_CM55_0_m55_code_secondary_START 0x26000000u
+#define CYMEM_CM55_0_m55_code_secondary_SIZE 0x00040000u
+#define CYMEM_CM55_0_m55_code_secondary_OFFSET 0x00000000u
+#define CYMEM_CM55_0_m55_data_secondary_START 0x26040000u
+#define CYMEM_CM55_0_m55_data_secondary_SIZE 0x002BC000u
+#define CYMEM_CM55_0_m55_data_secondary_OFFSET 0x00040000u
+#define CYMEM_CM55_0_m33_m55_shared_START 0x262FC000u
+#define CYMEM_CM55_0_m33_m55_shared_SIZE 0x00040000u
+#define CYMEM_CM55_0_m33_m55_shared_OFFSET 0x002FC000u
+#define CYMEM_CM55_0_gfx_mem_START 0x2633C000u
+#define CYMEM_CM55_0_gfx_mem_SIZE 0x001C4000u
+#define CYMEM_CM55_0_gfx_mem_OFFSET 0x0033C000u
+#define CYMEM_CM55_0_m33_data_START 0x240BD000u
+#define CYMEM_CM55_0_m33_data_SIZE 0x00040000u
+#define CYMEM_CM55_0_m33_data_OFFSET 0x000BD000u
+#define CYMEM_CM55_0_m33s_allocatable_shared_START 0x240FD000u
+#define CYMEM_CM55_0_m33s_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM55_0_m33s_allocatable_shared_OFFSET 0x000FD000u
+#define CYMEM_CM55_0_m33_allocatable_shared_START 0x240FE000u
+#define CYMEM_CM55_0_m33_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM55_0_m33_allocatable_shared_OFFSET 0x000FE000u
+#define CYMEM_CM55_0_m55_allocatable_shared_START 0x240FF000u
+#define CYMEM_CM55_0_m55_allocatable_shared_SIZE 0x00001000u
+#define CYMEM_CM55_0_m55_allocatable_shared_OFFSET 0x000FF000u
+
+#endif /* CYMEM_CM55_0_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM33_0.sct b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM33_0.sct
new file mode 100644
index 00000000000..ccf5ef994d7
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM33_0.sct
@@ -0,0 +1,109 @@
+; This file is automatically generated.
+#define CYMEM_CM33_0_m55_data_START 0x48040000
+#define CYMEM_CM33_0_m55_data_SIZE 0x00040000
+#define CYMEM_CM33_0_m55_data_OFFSET 0x00000000
+#define CYMEM_CM33_0_m55_data_sel_START CYMEM_CM33_0_m55_data_START
+#define CYMEM_CM33_0_m55_code_START 0x48000000
+#define CYMEM_CM33_0_m55_code_SIZE 0x00040000
+#define CYMEM_CM33_0_m55_code_OFFSET 0x00000000
+#define CYMEM_CM33_0_m55_code_sel_START CYMEM_CM33_0_m55_code_START
+#define CYMEM_CM33_0_user_programmable_START 0x22011000
+#define CYMEM_CM33_0_user_programmable_C_START 0x02011000
+#define CYMEM_CM33_0_user_programmable_SIZE 0x0004A000
+#define CYMEM_CM33_0_user_programmable_OFFSET 0x00011000
+#define CYMEM_CM33_0_user_programmable_sel_START CYMEM_CM33_0_user_programmable_C_START
+#define CYMEM_CM33_0_user_nvm_START 0x2205B000
+#define CYMEM_CM33_0_user_nvm_C_START 0x0205B000
+#define CYMEM_CM33_0_user_nvm_SIZE 0x00008000
+#define CYMEM_CM33_0_user_nvm_OFFSET 0x0005B000
+#define CYMEM_CM33_0_user_nvm_sel_START CYMEM_CM33_0_user_nvm_C_START
+#define CYMEM_CM33_0_m33s_nvm_START 0x60100000
+#define CYMEM_CM33_0_m33s_nvm_C_START 0x08100000
+#define CYMEM_CM33_0_m33s_nvm_SIZE 0x00200000
+#define CYMEM_CM33_0_m33s_nvm_OFFSET 0x00100000
+#define CYMEM_CM33_0_m33s_nvm_sel_START CYMEM_CM33_0_m33s_nvm_C_START
+#define CYMEM_CM33_0_m33s_trailer_START 0x60300000
+#define CYMEM_CM33_0_m33s_trailer_C_START 0x08300000
+#define CYMEM_CM33_0_m33s_trailer_SIZE 0x00040000
+#define CYMEM_CM33_0_m33s_trailer_OFFSET 0x00300000
+#define CYMEM_CM33_0_m33s_trailer_sel_START CYMEM_CM33_0_m33s_trailer_C_START
+#define CYMEM_CM33_0_m33_nvm_START 0x60340000
+#define CYMEM_CM33_0_m33_nvm_C_START 0x08340000
+#define CYMEM_CM33_0_m33_nvm_SIZE 0x00200000
+#define CYMEM_CM33_0_m33_nvm_OFFSET 0x00340000
+#define CYMEM_CM33_0_m33_nvm_sel_START CYMEM_CM33_0_m33_nvm_C_START
+#define CYMEM_CM33_0_m33_trailer_START 0x60540000
+#define CYMEM_CM33_0_m33_trailer_C_START 0x08540000
+#define CYMEM_CM33_0_m33_trailer_SIZE 0x00040000
+#define CYMEM_CM33_0_m33_trailer_OFFSET 0x00540000
+#define CYMEM_CM33_0_m33_trailer_sel_START CYMEM_CM33_0_m33_trailer_C_START
+#define CYMEM_CM33_0_m55_nvm_START 0x60580000
+#define CYMEM_CM33_0_m55_nvm_C_START 0x08580000
+#define CYMEM_CM33_0_m55_nvm_SIZE 0x002C0000
+#define CYMEM_CM33_0_m55_nvm_OFFSET 0x00580000
+#define CYMEM_CM33_0_m55_nvm_sel_START CYMEM_CM33_0_m55_nvm_C_START
+#define CYMEM_CM33_0_m55_trailer_START 0x60840000
+#define CYMEM_CM33_0_m55_trailer_C_START 0x08840000
+#define CYMEM_CM33_0_m55_trailer_SIZE 0x00040000
+#define CYMEM_CM33_0_m55_trailer_OFFSET 0x00840000
+#define CYMEM_CM33_0_m55_trailer_sel_START CYMEM_CM33_0_m55_trailer_C_START
+#define CYMEM_CM33_0_m55_code_secondary_START 0x26000000
+#define CYMEM_CM33_0_m55_code_secondary_C_START 0x06000000
+#define CYMEM_CM33_0_m55_code_secondary_SIZE 0x00040000
+#define CYMEM_CM33_0_m55_code_secondary_OFFSET 0x00000000
+#define CYMEM_CM33_0_m55_code_secondary_sel_START CYMEM_CM33_0_m55_code_secondary_C_START
+#define CYMEM_CM33_0_m55_data_secondary_START 0x26040000
+#define CYMEM_CM33_0_m55_data_secondary_C_START 0x06040000
+#define CYMEM_CM33_0_m55_data_secondary_SIZE 0x002BC000
+#define CYMEM_CM33_0_m55_data_secondary_OFFSET 0x00040000
+#define CYMEM_CM33_0_m55_data_secondary_sel_START CYMEM_CM33_0_m55_data_secondary_C_START
+#define CYMEM_CM33_0_m33_m55_shared_START 0x262FC000
+#define CYMEM_CM33_0_m33_m55_shared_C_START 0x062FC000
+#define CYMEM_CM33_0_m33_m55_shared_SIZE 0x00040000
+#define CYMEM_CM33_0_m33_m55_shared_OFFSET 0x002FC000
+#define CYMEM_CM33_0_m33_m55_shared_sel_START CYMEM_CM33_0_m33_m55_shared_C_START
+#define CYMEM_CM33_0_gfx_mem_START 0x2633C000
+#define CYMEM_CM33_0_gfx_mem_C_START 0x0633C000
+#define CYMEM_CM33_0_gfx_mem_SIZE 0x001C4000
+#define CYMEM_CM33_0_gfx_mem_OFFSET 0x0033C000
+#define CYMEM_CM33_0_gfx_mem_sel_START CYMEM_CM33_0_gfx_mem_C_START
+#define CYMEM_CM33_0_m33s_shared_START 0x24001000
+#define CYMEM_CM33_0_m33s_shared_C_START 0x04001000
+#define CYMEM_CM33_0_m33s_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_m33s_shared_OFFSET 0x00001000
+#define CYMEM_CM33_0_m33s_shared_sel_START CYMEM_CM33_0_m33s_shared_C_START
+#define CYMEM_CM33_0_m33s_code_START 0x24002000
+#define CYMEM_CM33_0_m33s_code_C_START 0x04002000
+#define CYMEM_CM33_0_m33s_code_SIZE 0x00035000
+#define CYMEM_CM33_0_m33s_code_OFFSET 0x00002000
+#define CYMEM_CM33_0_m33s_code_sel_START CYMEM_CM33_0_m33s_code_C_START
+#define CYMEM_CM33_0_m33s_data_START 0x24037000
+#define CYMEM_CM33_0_m33s_data_C_START 0x04037000
+#define CYMEM_CM33_0_m33s_data_SIZE 0x00021000
+#define CYMEM_CM33_0_m33s_data_OFFSET 0x00037000
+#define CYMEM_CM33_0_m33s_data_sel_START CYMEM_CM33_0_m33s_data_C_START
+#define CYMEM_CM33_0_m33_code_START 0x24058000
+#define CYMEM_CM33_0_m33_code_C_START 0x04058000
+#define CYMEM_CM33_0_m33_code_SIZE 0x00065000
+#define CYMEM_CM33_0_m33_code_OFFSET 0x00058000
+#define CYMEM_CM33_0_m33_code_sel_START CYMEM_CM33_0_m33_code_C_START
+#define CYMEM_CM33_0_m33_data_START 0x240BD000
+#define CYMEM_CM33_0_m33_data_C_START 0x040BD000
+#define CYMEM_CM33_0_m33_data_SIZE 0x00040000
+#define CYMEM_CM33_0_m33_data_OFFSET 0x000BD000
+#define CYMEM_CM33_0_m33_data_sel_START CYMEM_CM33_0_m33_data_C_START
+#define CYMEM_CM33_0_m33s_allocatable_shared_START 0x240FD000
+#define CYMEM_CM33_0_m33s_allocatable_shared_C_START 0x040FD000
+#define CYMEM_CM33_0_m33s_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_m33s_allocatable_shared_OFFSET 0x000FD000
+#define CYMEM_CM33_0_m33s_allocatable_shared_sel_START CYMEM_CM33_0_m33s_allocatable_shared_C_START
+#define CYMEM_CM33_0_m33_allocatable_shared_START 0x240FE000
+#define CYMEM_CM33_0_m33_allocatable_shared_C_START 0x040FE000
+#define CYMEM_CM33_0_m33_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_m33_allocatable_shared_OFFSET 0x000FE000
+#define CYMEM_CM33_0_m33_allocatable_shared_sel_START CYMEM_CM33_0_m33_allocatable_shared_C_START
+#define CYMEM_CM33_0_m55_allocatable_shared_START 0x240FF000
+#define CYMEM_CM33_0_m55_allocatable_shared_C_START 0x040FF000
+#define CYMEM_CM33_0_m55_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_m55_allocatable_shared_OFFSET 0x000FF000
+#define CYMEM_CM33_0_m55_allocatable_shared_sel_START CYMEM_CM33_0_m55_allocatable_shared_C_START
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM33_0_S.sct b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM33_0_S.sct
new file mode 100644
index 00000000000..f73b0c497b1
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM33_0_S.sct
@@ -0,0 +1,173 @@
+; This file is automatically generated.
+#define CYMEM_CM33_0_S_m55_data_START 0x48040000
+#define CYMEM_CM33_0_S_m55_data_S_START 0x58040000
+#define CYMEM_CM33_0_S_m55_data_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m55_data_OFFSET 0x00000000
+#define CYMEM_CM33_0_S_m55_data_sel_START CYMEM_CM33_0_S_m55_data_START
+#define CYMEM_CM33_0_S_m55_data_sel_S_START CYMEM_CM33_0_S_m55_data_S_START
+#define CYMEM_CM33_0_S_m55_code_START 0x48000000
+#define CYMEM_CM33_0_S_m55_code_S_START 0x58000000
+#define CYMEM_CM33_0_S_m55_code_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m55_code_OFFSET 0x00000000
+#define CYMEM_CM33_0_S_m55_code_sel_START CYMEM_CM33_0_S_m55_code_START
+#define CYMEM_CM33_0_S_m55_code_sel_S_START CYMEM_CM33_0_S_m55_code_S_START
+#define CYMEM_CM33_0_S_user_programmable_START 0x22011000
+#define CYMEM_CM33_0_S_user_programmable_C_START 0x02011000
+#define CYMEM_CM33_0_S_user_programmable_C_S_START 0x12011000
+#define CYMEM_CM33_0_S_user_programmable_S_START 0x32011000
+#define CYMEM_CM33_0_S_user_programmable_SIZE 0x0004A000
+#define CYMEM_CM33_0_S_user_programmable_OFFSET 0x00011000
+#define CYMEM_CM33_0_S_user_programmable_sel_START CYMEM_CM33_0_S_user_programmable_C_START
+#define CYMEM_CM33_0_S_user_programmable_sel_S_START CYMEM_CM33_0_S_user_programmable_C_S_START
+#define CYMEM_CM33_0_S_user_nvm_START 0x2205B000
+#define CYMEM_CM33_0_S_user_nvm_C_START 0x0205B000
+#define CYMEM_CM33_0_S_user_nvm_C_S_START 0x1205B000
+#define CYMEM_CM33_0_S_user_nvm_S_START 0x3205B000
+#define CYMEM_CM33_0_S_user_nvm_SIZE 0x00008000
+#define CYMEM_CM33_0_S_user_nvm_OFFSET 0x0005B000
+#define CYMEM_CM33_0_S_user_nvm_sel_START CYMEM_CM33_0_S_user_nvm_C_START
+#define CYMEM_CM33_0_S_user_nvm_sel_S_START CYMEM_CM33_0_S_user_nvm_C_S_START
+#define CYMEM_CM33_0_S_m33s_nvm_START 0x60100000
+#define CYMEM_CM33_0_S_m33s_nvm_C_START 0x08100000
+#define CYMEM_CM33_0_S_m33s_nvm_C_S_START 0x18100000
+#define CYMEM_CM33_0_S_m33s_nvm_S_START 0x70100000
+#define CYMEM_CM33_0_S_m33s_nvm_SIZE 0x00200000
+#define CYMEM_CM33_0_S_m33s_nvm_OFFSET 0x00100000
+#define CYMEM_CM33_0_S_m33s_nvm_sel_START CYMEM_CM33_0_S_m33s_nvm_C_START
+#define CYMEM_CM33_0_S_m33s_nvm_sel_S_START CYMEM_CM33_0_S_m33s_nvm_C_S_START
+#define CYMEM_CM33_0_S_m33s_trailer_START 0x60300000
+#define CYMEM_CM33_0_S_m33s_trailer_C_START 0x08300000
+#define CYMEM_CM33_0_S_m33s_trailer_C_S_START 0x18300000
+#define CYMEM_CM33_0_S_m33s_trailer_S_START 0x70300000
+#define CYMEM_CM33_0_S_m33s_trailer_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m33s_trailer_OFFSET 0x00300000
+#define CYMEM_CM33_0_S_m33s_trailer_sel_START CYMEM_CM33_0_S_m33s_trailer_C_START
+#define CYMEM_CM33_0_S_m33s_trailer_sel_S_START CYMEM_CM33_0_S_m33s_trailer_C_S_START
+#define CYMEM_CM33_0_S_m33_nvm_START 0x60340000
+#define CYMEM_CM33_0_S_m33_nvm_C_START 0x08340000
+#define CYMEM_CM33_0_S_m33_nvm_C_S_START 0x18340000
+#define CYMEM_CM33_0_S_m33_nvm_S_START 0x70340000
+#define CYMEM_CM33_0_S_m33_nvm_SIZE 0x00200000
+#define CYMEM_CM33_0_S_m33_nvm_OFFSET 0x00340000
+#define CYMEM_CM33_0_S_m33_nvm_sel_START CYMEM_CM33_0_S_m33_nvm_C_START
+#define CYMEM_CM33_0_S_m33_nvm_sel_S_START CYMEM_CM33_0_S_m33_nvm_C_S_START
+#define CYMEM_CM33_0_S_m33_trailer_START 0x60540000
+#define CYMEM_CM33_0_S_m33_trailer_C_START 0x08540000
+#define CYMEM_CM33_0_S_m33_trailer_C_S_START 0x18540000
+#define CYMEM_CM33_0_S_m33_trailer_S_START 0x70540000
+#define CYMEM_CM33_0_S_m33_trailer_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m33_trailer_OFFSET 0x00540000
+#define CYMEM_CM33_0_S_m33_trailer_sel_START CYMEM_CM33_0_S_m33_trailer_C_START
+#define CYMEM_CM33_0_S_m33_trailer_sel_S_START CYMEM_CM33_0_S_m33_trailer_C_S_START
+#define CYMEM_CM33_0_S_m55_nvm_START 0x60580000
+#define CYMEM_CM33_0_S_m55_nvm_C_START 0x08580000
+#define CYMEM_CM33_0_S_m55_nvm_C_S_START 0x18580000
+#define CYMEM_CM33_0_S_m55_nvm_S_START 0x70580000
+#define CYMEM_CM33_0_S_m55_nvm_SIZE 0x002C0000
+#define CYMEM_CM33_0_S_m55_nvm_OFFSET 0x00580000
+#define CYMEM_CM33_0_S_m55_nvm_sel_START CYMEM_CM33_0_S_m55_nvm_C_START
+#define CYMEM_CM33_0_S_m55_nvm_sel_S_START CYMEM_CM33_0_S_m55_nvm_C_S_START
+#define CYMEM_CM33_0_S_m55_trailer_START 0x60840000
+#define CYMEM_CM33_0_S_m55_trailer_C_START 0x08840000
+#define CYMEM_CM33_0_S_m55_trailer_C_S_START 0x18840000
+#define CYMEM_CM33_0_S_m55_trailer_S_START 0x70840000
+#define CYMEM_CM33_0_S_m55_trailer_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m55_trailer_OFFSET 0x00840000
+#define CYMEM_CM33_0_S_m55_trailer_sel_START CYMEM_CM33_0_S_m55_trailer_C_START
+#define CYMEM_CM33_0_S_m55_trailer_sel_S_START CYMEM_CM33_0_S_m55_trailer_C_S_START
+#define CYMEM_CM33_0_S_m55_code_secondary_START 0x26000000
+#define CYMEM_CM33_0_S_m55_code_secondary_C_START 0x06000000
+#define CYMEM_CM33_0_S_m55_code_secondary_C_S_START 0x16000000
+#define CYMEM_CM33_0_S_m55_code_secondary_S_START 0x36000000
+#define CYMEM_CM33_0_S_m55_code_secondary_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m55_code_secondary_OFFSET 0x00000000
+#define CYMEM_CM33_0_S_m55_code_secondary_sel_START CYMEM_CM33_0_S_m55_code_secondary_C_START
+#define CYMEM_CM33_0_S_m55_code_secondary_sel_S_START CYMEM_CM33_0_S_m55_code_secondary_C_S_START
+#define CYMEM_CM33_0_S_m55_data_secondary_START 0x26040000
+#define CYMEM_CM33_0_S_m55_data_secondary_C_START 0x06040000
+#define CYMEM_CM33_0_S_m55_data_secondary_C_S_START 0x16040000
+#define CYMEM_CM33_0_S_m55_data_secondary_S_START 0x36040000
+#define CYMEM_CM33_0_S_m55_data_secondary_SIZE 0x002BC000
+#define CYMEM_CM33_0_S_m55_data_secondary_OFFSET 0x00040000
+#define CYMEM_CM33_0_S_m55_data_secondary_sel_START CYMEM_CM33_0_S_m55_data_secondary_C_START
+#define CYMEM_CM33_0_S_m55_data_secondary_sel_S_START CYMEM_CM33_0_S_m55_data_secondary_C_S_START
+#define CYMEM_CM33_0_S_m33_m55_shared_START 0x262FC000
+#define CYMEM_CM33_0_S_m33_m55_shared_C_START 0x062FC000
+#define CYMEM_CM33_0_S_m33_m55_shared_C_S_START 0x162FC000
+#define CYMEM_CM33_0_S_m33_m55_shared_S_START 0x362FC000
+#define CYMEM_CM33_0_S_m33_m55_shared_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m33_m55_shared_OFFSET 0x002FC000
+#define CYMEM_CM33_0_S_m33_m55_shared_sel_START CYMEM_CM33_0_S_m33_m55_shared_C_START
+#define CYMEM_CM33_0_S_m33_m55_shared_sel_S_START CYMEM_CM33_0_S_m33_m55_shared_C_S_START
+#define CYMEM_CM33_0_S_gfx_mem_START 0x2633C000
+#define CYMEM_CM33_0_S_gfx_mem_C_START 0x0633C000
+#define CYMEM_CM33_0_S_gfx_mem_C_S_START 0x1633C000
+#define CYMEM_CM33_0_S_gfx_mem_S_START 0x3633C000
+#define CYMEM_CM33_0_S_gfx_mem_SIZE 0x001C4000
+#define CYMEM_CM33_0_S_gfx_mem_OFFSET 0x0033C000
+#define CYMEM_CM33_0_S_gfx_mem_sel_START CYMEM_CM33_0_S_gfx_mem_C_START
+#define CYMEM_CM33_0_S_gfx_mem_sel_S_START CYMEM_CM33_0_S_gfx_mem_C_S_START
+#define CYMEM_CM33_0_S_m33s_shared_START 0x24001000
+#define CYMEM_CM33_0_S_m33s_shared_C_START 0x04001000
+#define CYMEM_CM33_0_S_m33s_shared_C_S_START 0x14001000
+#define CYMEM_CM33_0_S_m33s_shared_S_START 0x34001000
+#define CYMEM_CM33_0_S_m33s_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_S_m33s_shared_OFFSET 0x00001000
+#define CYMEM_CM33_0_S_m33s_shared_sel_START CYMEM_CM33_0_S_m33s_shared_C_START
+#define CYMEM_CM33_0_S_m33s_shared_sel_S_START CYMEM_CM33_0_S_m33s_shared_C_S_START
+#define CYMEM_CM33_0_S_m33s_code_START 0x24002000
+#define CYMEM_CM33_0_S_m33s_code_C_START 0x04002000
+#define CYMEM_CM33_0_S_m33s_code_C_S_START 0x14002000
+#define CYMEM_CM33_0_S_m33s_code_S_START 0x34002000
+#define CYMEM_CM33_0_S_m33s_code_SIZE 0x00035000
+#define CYMEM_CM33_0_S_m33s_code_OFFSET 0x00002000
+#define CYMEM_CM33_0_S_m33s_code_sel_START CYMEM_CM33_0_S_m33s_code_C_START
+#define CYMEM_CM33_0_S_m33s_code_sel_S_START CYMEM_CM33_0_S_m33s_code_C_S_START
+#define CYMEM_CM33_0_S_m33s_data_START 0x24037000
+#define CYMEM_CM33_0_S_m33s_data_C_START 0x04037000
+#define CYMEM_CM33_0_S_m33s_data_C_S_START 0x14037000
+#define CYMEM_CM33_0_S_m33s_data_S_START 0x34037000
+#define CYMEM_CM33_0_S_m33s_data_SIZE 0x00021000
+#define CYMEM_CM33_0_S_m33s_data_OFFSET 0x00037000
+#define CYMEM_CM33_0_S_m33s_data_sel_START CYMEM_CM33_0_S_m33s_data_C_START
+#define CYMEM_CM33_0_S_m33s_data_sel_S_START CYMEM_CM33_0_S_m33s_data_C_S_START
+#define CYMEM_CM33_0_S_m33_code_START 0x24058000
+#define CYMEM_CM33_0_S_m33_code_C_START 0x04058000
+#define CYMEM_CM33_0_S_m33_code_C_S_START 0x14058000
+#define CYMEM_CM33_0_S_m33_code_S_START 0x34058000
+#define CYMEM_CM33_0_S_m33_code_SIZE 0x00065000
+#define CYMEM_CM33_0_S_m33_code_OFFSET 0x00058000
+#define CYMEM_CM33_0_S_m33_code_sel_START CYMEM_CM33_0_S_m33_code_C_START
+#define CYMEM_CM33_0_S_m33_code_sel_S_START CYMEM_CM33_0_S_m33_code_C_S_START
+#define CYMEM_CM33_0_S_m33_data_START 0x240BD000
+#define CYMEM_CM33_0_S_m33_data_C_START 0x040BD000
+#define CYMEM_CM33_0_S_m33_data_C_S_START 0x140BD000
+#define CYMEM_CM33_0_S_m33_data_S_START 0x340BD000
+#define CYMEM_CM33_0_S_m33_data_SIZE 0x00040000
+#define CYMEM_CM33_0_S_m33_data_OFFSET 0x000BD000
+#define CYMEM_CM33_0_S_m33_data_sel_START CYMEM_CM33_0_S_m33_data_C_START
+#define CYMEM_CM33_0_S_m33_data_sel_S_START CYMEM_CM33_0_S_m33_data_C_S_START
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_START 0x240FD000
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_C_START 0x040FD000
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START 0x140FD000
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_S_START 0x340FD000
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_OFFSET 0x000FD000
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_sel_START CYMEM_CM33_0_S_m33s_allocatable_shared_C_START
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_sel_S_START CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START
+#define CYMEM_CM33_0_S_m33_allocatable_shared_START 0x240FE000
+#define CYMEM_CM33_0_S_m33_allocatable_shared_C_START 0x040FE000
+#define CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START 0x140FE000
+#define CYMEM_CM33_0_S_m33_allocatable_shared_S_START 0x340FE000
+#define CYMEM_CM33_0_S_m33_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_S_m33_allocatable_shared_OFFSET 0x000FE000
+#define CYMEM_CM33_0_S_m33_allocatable_shared_sel_START CYMEM_CM33_0_S_m33_allocatable_shared_C_START
+#define CYMEM_CM33_0_S_m33_allocatable_shared_sel_S_START CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START
+#define CYMEM_CM33_0_S_m55_allocatable_shared_START 0x240FF000
+#define CYMEM_CM33_0_S_m55_allocatable_shared_C_START 0x040FF000
+#define CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START 0x140FF000
+#define CYMEM_CM33_0_S_m55_allocatable_shared_S_START 0x340FF000
+#define CYMEM_CM33_0_S_m55_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM33_0_S_m55_allocatable_shared_OFFSET 0x000FF000
+#define CYMEM_CM33_0_S_m55_allocatable_shared_sel_START CYMEM_CM33_0_S_m55_allocatable_shared_C_START
+#define CYMEM_CM33_0_S_m55_allocatable_shared_sel_S_START CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM55_0.sct b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM55_0.sct
new file mode 100644
index 00000000000..b8eba3deae5
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_armlink_CM55_0.sct
@@ -0,0 +1,53 @@
+; This file is automatically generated.
+#define CYMEM_CM55_0_m55_data_INTERNAL_START 0x20000000
+#define CYMEM_CM55_0_m55_data_SIZE 0x00040000
+#define CYMEM_CM55_0_m55_data_OFFSET 0x00000000
+#define CYMEM_CM55_0_m55_data_sel_START CYMEM_CM55_0_m55_data_INTERNAL_START
+#define CYMEM_CM55_0_m55_code_INTERNAL_START 0x00000000
+#define CYMEM_CM55_0_m55_code_SIZE 0x00040000
+#define CYMEM_CM55_0_m55_code_OFFSET 0x00000000
+#define CYMEM_CM55_0_m55_code_sel_START CYMEM_CM55_0_m55_code_INTERNAL_START
+#define CYMEM_CM55_0_user_nvm_C_START 0x0205B000
+#define CYMEM_CM55_0_user_nvm_SIZE 0x00008000
+#define CYMEM_CM55_0_user_nvm_OFFSET 0x0005B000
+#define CYMEM_CM55_0_user_nvm_sel_START CYMEM_CM55_0_user_nvm_C_START
+#define CYMEM_CM55_0_m55_nvm_START 0x60580000
+#define CYMEM_CM55_0_m55_nvm_SIZE 0x002C0000
+#define CYMEM_CM55_0_m55_nvm_OFFSET 0x00580000
+#define CYMEM_CM55_0_m55_nvm_sel_START CYMEM_CM55_0_m55_nvm_START
+#define CYMEM_CM55_0_m55_trailer_START 0x60840000
+#define CYMEM_CM55_0_m55_trailer_SIZE 0x00040000
+#define CYMEM_CM55_0_m55_trailer_OFFSET 0x00840000
+#define CYMEM_CM55_0_m55_trailer_sel_START CYMEM_CM55_0_m55_trailer_START
+#define CYMEM_CM55_0_m55_code_secondary_START 0x26000000
+#define CYMEM_CM55_0_m55_code_secondary_SIZE 0x00040000
+#define CYMEM_CM55_0_m55_code_secondary_OFFSET 0x00000000
+#define CYMEM_CM55_0_m55_code_secondary_sel_START CYMEM_CM55_0_m55_code_secondary_START
+#define CYMEM_CM55_0_m55_data_secondary_START 0x26040000
+#define CYMEM_CM55_0_m55_data_secondary_SIZE 0x002BC000
+#define CYMEM_CM55_0_m55_data_secondary_OFFSET 0x00040000
+#define CYMEM_CM55_0_m55_data_secondary_sel_START CYMEM_CM55_0_m55_data_secondary_START
+#define CYMEM_CM55_0_m33_m55_shared_START 0x262FC000
+#define CYMEM_CM55_0_m33_m55_shared_SIZE 0x00040000
+#define CYMEM_CM55_0_m33_m55_shared_OFFSET 0x002FC000
+#define CYMEM_CM55_0_m33_m55_shared_sel_START CYMEM_CM55_0_m33_m55_shared_START
+#define CYMEM_CM55_0_gfx_mem_START 0x2633C000
+#define CYMEM_CM55_0_gfx_mem_SIZE 0x001C4000
+#define CYMEM_CM55_0_gfx_mem_OFFSET 0x0033C000
+#define CYMEM_CM55_0_gfx_mem_sel_START CYMEM_CM55_0_gfx_mem_START
+#define CYMEM_CM55_0_m33_data_START 0x240BD000
+#define CYMEM_CM55_0_m33_data_SIZE 0x00040000
+#define CYMEM_CM55_0_m33_data_OFFSET 0x000BD000
+#define CYMEM_CM55_0_m33_data_sel_START CYMEM_CM55_0_m33_data_START
+#define CYMEM_CM55_0_m33s_allocatable_shared_START 0x240FD000
+#define CYMEM_CM55_0_m33s_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM55_0_m33s_allocatable_shared_OFFSET 0x000FD000
+#define CYMEM_CM55_0_m33s_allocatable_shared_sel_START CYMEM_CM55_0_m33s_allocatable_shared_START
+#define CYMEM_CM55_0_m33_allocatable_shared_START 0x240FE000
+#define CYMEM_CM55_0_m33_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM55_0_m33_allocatable_shared_OFFSET 0x000FE000
+#define CYMEM_CM55_0_m33_allocatable_shared_sel_START CYMEM_CM55_0_m33_allocatable_shared_START
+#define CYMEM_CM55_0_m55_allocatable_shared_START 0x240FF000
+#define CYMEM_CM55_0_m55_allocatable_shared_SIZE 0x00001000
+#define CYMEM_CM55_0_m55_allocatable_shared_OFFSET 0x000FF000
+#define CYMEM_CM55_0_m55_allocatable_shared_sel_START CYMEM_CM55_0_m55_allocatable_shared_START
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM33_0.ld b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM33_0.ld
new file mode 100644
index 00000000000..dce74513018
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM33_0.ld
@@ -0,0 +1,157 @@
+/* This file is automatically generated. */
+
+CYMEM_CM33_0_m55_data_START = 0x48040000;
+CYMEM_CM33_0_m55_data_SIZE = 0x00040000;
+CYMEM_CM33_0_m55_data_OFFSET = 0x00000000;
+CYMEM_CM33_0_m55_code_START = 0x48000000;
+CYMEM_CM33_0_m55_code_SIZE = 0x00040000;
+CYMEM_CM33_0_m55_code_OFFSET = 0x00000000;
+CYMEM_CM33_0_user_programmable_START = 0x22011000;
+CYMEM_CM33_0_user_programmable_C_START = 0x02011000;
+CYMEM_CM33_0_user_programmable_SIZE = 0x0004A000;
+CYMEM_CM33_0_user_programmable_OFFSET = 0x00011000;
+CYMEM_CM33_0_user_nvm_START = 0x2205B000;
+CYMEM_CM33_0_user_nvm_C_START = 0x0205B000;
+CYMEM_CM33_0_user_nvm_SIZE = 0x00008000;
+CYMEM_CM33_0_user_nvm_OFFSET = 0x0005B000;
+CYMEM_CM33_0_m33s_nvm_START = 0x60100000;
+CYMEM_CM33_0_m33s_nvm_C_START = 0x08100000;
+CYMEM_CM33_0_m33s_nvm_SIZE = 0x00200000;
+CYMEM_CM33_0_m33s_nvm_OFFSET = 0x00100000;
+CYMEM_CM33_0_m33s_trailer_START = 0x60300000;
+CYMEM_CM33_0_m33s_trailer_C_START = 0x08300000;
+CYMEM_CM33_0_m33s_trailer_SIZE = 0x00040000;
+CYMEM_CM33_0_m33s_trailer_OFFSET = 0x00300000;
+CYMEM_CM33_0_m33_nvm_START = 0x60340000;
+CYMEM_CM33_0_m33_nvm_C_START = 0x08340000;
+CYMEM_CM33_0_m33_nvm_SIZE = 0x00200000;
+CYMEM_CM33_0_m33_nvm_OFFSET = 0x00340000;
+CYMEM_CM33_0_m33_trailer_START = 0x60540000;
+CYMEM_CM33_0_m33_trailer_C_START = 0x08540000;
+CYMEM_CM33_0_m33_trailer_SIZE = 0x00040000;
+CYMEM_CM33_0_m33_trailer_OFFSET = 0x00540000;
+CYMEM_CM33_0_m55_nvm_START = 0x60580000;
+CYMEM_CM33_0_m55_nvm_C_START = 0x08580000;
+CYMEM_CM33_0_m55_nvm_SIZE = 0x002C0000;
+CYMEM_CM33_0_m55_nvm_OFFSET = 0x00580000;
+CYMEM_CM33_0_m55_trailer_START = 0x60840000;
+CYMEM_CM33_0_m55_trailer_C_START = 0x08840000;
+CYMEM_CM33_0_m55_trailer_SIZE = 0x00040000;
+CYMEM_CM33_0_m55_trailer_OFFSET = 0x00840000;
+CYMEM_CM33_0_m55_code_secondary_START = 0x26000000;
+CYMEM_CM33_0_m55_code_secondary_C_START = 0x06000000;
+CYMEM_CM33_0_m55_code_secondary_SIZE = 0x00040000;
+CYMEM_CM33_0_m55_code_secondary_OFFSET = 0x00000000;
+CYMEM_CM33_0_m55_data_secondary_START = 0x26040000;
+CYMEM_CM33_0_m55_data_secondary_C_START = 0x06040000;
+CYMEM_CM33_0_m55_data_secondary_SIZE = 0x002BC000;
+CYMEM_CM33_0_m55_data_secondary_OFFSET = 0x00040000;
+CYMEM_CM33_0_m33_m55_shared_START = 0x262FC000;
+CYMEM_CM33_0_m33_m55_shared_C_START = 0x062FC000;
+CYMEM_CM33_0_m33_m55_shared_SIZE = 0x00040000;
+CYMEM_CM33_0_m33_m55_shared_OFFSET = 0x002FC000;
+CYMEM_CM33_0_gfx_mem_START = 0x2633C000;
+CYMEM_CM33_0_gfx_mem_C_START = 0x0633C000;
+CYMEM_CM33_0_gfx_mem_SIZE = 0x001C4000;
+CYMEM_CM33_0_gfx_mem_OFFSET = 0x0033C000;
+CYMEM_CM33_0_m33s_shared_START = 0x24001000;
+CYMEM_CM33_0_m33s_shared_C_START = 0x04001000;
+CYMEM_CM33_0_m33s_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_m33s_shared_OFFSET = 0x00001000;
+CYMEM_CM33_0_m33s_code_START = 0x24002000;
+CYMEM_CM33_0_m33s_code_C_START = 0x04002000;
+CYMEM_CM33_0_m33s_code_SIZE = 0x00035000;
+CYMEM_CM33_0_m33s_code_OFFSET = 0x00002000;
+CYMEM_CM33_0_m33s_data_START = 0x24037000;
+CYMEM_CM33_0_m33s_data_C_START = 0x04037000;
+CYMEM_CM33_0_m33s_data_SIZE = 0x00021000;
+CYMEM_CM33_0_m33s_data_OFFSET = 0x00037000;
+CYMEM_CM33_0_m33_code_START = 0x24058000;
+CYMEM_CM33_0_m33_code_C_START = 0x04058000;
+CYMEM_CM33_0_m33_code_SIZE = 0x00065000;
+CYMEM_CM33_0_m33_code_OFFSET = 0x00058000;
+CYMEM_CM33_0_m33_data_START = 0x240BD000;
+CYMEM_CM33_0_m33_data_C_START = 0x040BD000;
+CYMEM_CM33_0_m33_data_SIZE = 0x00040000;
+CYMEM_CM33_0_m33_data_OFFSET = 0x000BD000;
+CYMEM_CM33_0_m33s_allocatable_shared_START = 0x240FD000;
+CYMEM_CM33_0_m33s_allocatable_shared_C_START = 0x040FD000;
+CYMEM_CM33_0_m33s_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_m33s_allocatable_shared_OFFSET = 0x000FD000;
+CYMEM_CM33_0_m33_allocatable_shared_START = 0x240FE000;
+CYMEM_CM33_0_m33_allocatable_shared_C_START = 0x040FE000;
+CYMEM_CM33_0_m33_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_m33_allocatable_shared_OFFSET = 0x000FE000;
+CYMEM_CM33_0_m55_allocatable_shared_START = 0x240FF000;
+CYMEM_CM33_0_m55_allocatable_shared_C_START = 0x040FF000;
+CYMEM_CM33_0_m55_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_m55_allocatable_shared_OFFSET = 0x000FF000;
+
+MEMORY
+{
+ m55_data : ORIGIN = 0x48040000, LENGTH = 0x00040000
+ m55_code : ORIGIN = 0x48000000, LENGTH = 0x00040000
+ user_programmable : ORIGIN = 0x22011000, LENGTH = 0x0004A000
+ user_programmable_C : ORIGIN = 0x02011000, LENGTH = 0x0004A000
+ user_nvm : ORIGIN = 0x2205B000, LENGTH = 0x00008000
+ user_nvm_C : ORIGIN = 0x0205B000, LENGTH = 0x00008000
+ m33s_nvm : ORIGIN = 0x60100000, LENGTH = 0x00200000
+ m33s_nvm_C : ORIGIN = 0x08100000, LENGTH = 0x00200000
+ m33s_trailer : ORIGIN = 0x60300000, LENGTH = 0x00040000
+ m33s_trailer_C : ORIGIN = 0x08300000, LENGTH = 0x00040000
+ m33_nvm : ORIGIN = 0x60340000, LENGTH = 0x00200000
+ m33_nvm_C : ORIGIN = 0x08340000, LENGTH = 0x00200000
+ m33_trailer : ORIGIN = 0x60540000, LENGTH = 0x00040000
+ m33_trailer_C : ORIGIN = 0x08540000, LENGTH = 0x00040000
+ m55_nvm : ORIGIN = 0x60580000, LENGTH = 0x002C0000
+ m55_nvm_C : ORIGIN = 0x08580000, LENGTH = 0x002C0000
+ m55_trailer : ORIGIN = 0x60840000, LENGTH = 0x00040000
+ m55_trailer_C : ORIGIN = 0x08840000, LENGTH = 0x00040000
+ m55_code_secondary : ORIGIN = 0x26000000, LENGTH = 0x00040000
+ m55_code_secondary_C : ORIGIN = 0x06000000, LENGTH = 0x00040000
+ m55_data_secondary : ORIGIN = 0x26040000, LENGTH = 0x002BC000
+ m55_data_secondary_C : ORIGIN = 0x06040000, LENGTH = 0x002BC000
+ m33_m55_shared : ORIGIN = 0x262FC000, LENGTH = 0x00040000
+ m33_m55_shared_C : ORIGIN = 0x062FC000, LENGTH = 0x00040000
+ gfx_mem : ORIGIN = 0x2633C000, LENGTH = 0x001C4000
+ gfx_mem_C : ORIGIN = 0x0633C000, LENGTH = 0x001C4000
+ m33s_shared : ORIGIN = 0x24001000, LENGTH = 0x00001000
+ m33s_shared_C : ORIGIN = 0x04001000, LENGTH = 0x00001000
+ m33s_code : ORIGIN = 0x24002000, LENGTH = 0x00035000
+ m33s_code_C : ORIGIN = 0x04002000, LENGTH = 0x00035000
+ m33s_data : ORIGIN = 0x24037000, LENGTH = 0x00021000
+ m33s_data_C : ORIGIN = 0x04037000, LENGTH = 0x00021000
+ m33_code : ORIGIN = 0x24058000, LENGTH = 0x00065000
+ m33_code_C : ORIGIN = 0x04058000, LENGTH = 0x00065000
+ m33_data : ORIGIN = 0x240BD000, LENGTH = 0x00040000
+ m33_data_C : ORIGIN = 0x040BD000, LENGTH = 0x00040000
+ m33s_allocatable_shared : ORIGIN = 0x240FD000, LENGTH = 0x00001000
+ m33s_allocatable_shared_C : ORIGIN = 0x040FD000, LENGTH = 0x00001000
+ m33_allocatable_shared : ORIGIN = 0x240FE000, LENGTH = 0x00001000
+ m33_allocatable_shared_C : ORIGIN = 0x040FE000, LENGTH = 0x00001000
+ m55_allocatable_shared : ORIGIN = 0x240FF000, LENGTH = 0x00001000
+ m55_allocatable_shared_C : ORIGIN = 0x040FF000, LENGTH = 0x00001000
+}
+
+REGION_ALIAS("m55_data_sel", m55_data)
+REGION_ALIAS("m55_code_sel", m55_code)
+REGION_ALIAS("user_programmable_sel", user_programmable_C)
+REGION_ALIAS("user_nvm_sel", user_nvm_C)
+REGION_ALIAS("m33s_nvm_sel", m33s_nvm_C)
+REGION_ALIAS("m33s_trailer_sel", m33s_trailer_C)
+REGION_ALIAS("m33_nvm_sel", m33_nvm_C)
+REGION_ALIAS("m33_trailer_sel", m33_trailer_C)
+REGION_ALIAS("m55_nvm_sel", m55_nvm_C)
+REGION_ALIAS("m55_trailer_sel", m55_trailer_C)
+REGION_ALIAS("m55_code_secondary_sel", m55_code_secondary_C)
+REGION_ALIAS("m55_data_secondary_sel", m55_data_secondary_C)
+REGION_ALIAS("m33_m55_shared_sel", m33_m55_shared_C)
+REGION_ALIAS("gfx_mem_sel", gfx_mem_C)
+REGION_ALIAS("m33s_shared_sel", m33s_shared_C)
+REGION_ALIAS("m33s_code_sel", m33s_code_C)
+REGION_ALIAS("m33s_data_sel", m33s_data_C)
+REGION_ALIAS("m33_code_sel", m33_code_C)
+REGION_ALIAS("m33_data_sel", m33_data_C)
+REGION_ALIAS("m33s_allocatable_shared_sel", m33s_allocatable_shared_C)
+REGION_ALIAS("m33_allocatable_shared_sel", m33_allocatable_shared_C)
+REGION_ALIAS("m55_allocatable_shared_sel", m55_allocatable_shared_C)
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM33_0_S.ld b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM33_0_S.ld
new file mode 100644
index 00000000000..910aea74878
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM33_0_S.ld
@@ -0,0 +1,263 @@
+/* This file is automatically generated. */
+
+CYMEM_CM33_0_S_m55_data_START = 0x48040000;
+CYMEM_CM33_0_S_m55_data_S_START = 0x58040000;
+CYMEM_CM33_0_S_m55_data_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m55_data_OFFSET = 0x00000000;
+CYMEM_CM33_0_S_m55_code_START = 0x48000000;
+CYMEM_CM33_0_S_m55_code_S_START = 0x58000000;
+CYMEM_CM33_0_S_m55_code_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m55_code_OFFSET = 0x00000000;
+CYMEM_CM33_0_S_user_programmable_START = 0x22011000;
+CYMEM_CM33_0_S_user_programmable_C_START = 0x02011000;
+CYMEM_CM33_0_S_user_programmable_C_S_START = 0x12011000;
+CYMEM_CM33_0_S_user_programmable_S_START = 0x32011000;
+CYMEM_CM33_0_S_user_programmable_SIZE = 0x0004A000;
+CYMEM_CM33_0_S_user_programmable_OFFSET = 0x00011000;
+CYMEM_CM33_0_S_user_nvm_START = 0x2205B000;
+CYMEM_CM33_0_S_user_nvm_C_START = 0x0205B000;
+CYMEM_CM33_0_S_user_nvm_C_S_START = 0x1205B000;
+CYMEM_CM33_0_S_user_nvm_S_START = 0x3205B000;
+CYMEM_CM33_0_S_user_nvm_SIZE = 0x00008000;
+CYMEM_CM33_0_S_user_nvm_OFFSET = 0x0005B000;
+CYMEM_CM33_0_S_m33s_nvm_START = 0x60100000;
+CYMEM_CM33_0_S_m33s_nvm_C_START = 0x08100000;
+CYMEM_CM33_0_S_m33s_nvm_C_S_START = 0x18100000;
+CYMEM_CM33_0_S_m33s_nvm_S_START = 0x70100000;
+CYMEM_CM33_0_S_m33s_nvm_SIZE = 0x00200000;
+CYMEM_CM33_0_S_m33s_nvm_OFFSET = 0x00100000;
+CYMEM_CM33_0_S_m33s_trailer_START = 0x60300000;
+CYMEM_CM33_0_S_m33s_trailer_C_START = 0x08300000;
+CYMEM_CM33_0_S_m33s_trailer_C_S_START = 0x18300000;
+CYMEM_CM33_0_S_m33s_trailer_S_START = 0x70300000;
+CYMEM_CM33_0_S_m33s_trailer_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m33s_trailer_OFFSET = 0x00300000;
+CYMEM_CM33_0_S_m33_nvm_START = 0x60340000;
+CYMEM_CM33_0_S_m33_nvm_C_START = 0x08340000;
+CYMEM_CM33_0_S_m33_nvm_C_S_START = 0x18340000;
+CYMEM_CM33_0_S_m33_nvm_S_START = 0x70340000;
+CYMEM_CM33_0_S_m33_nvm_SIZE = 0x00200000;
+CYMEM_CM33_0_S_m33_nvm_OFFSET = 0x00340000;
+CYMEM_CM33_0_S_m33_trailer_START = 0x60540000;
+CYMEM_CM33_0_S_m33_trailer_C_START = 0x08540000;
+CYMEM_CM33_0_S_m33_trailer_C_S_START = 0x18540000;
+CYMEM_CM33_0_S_m33_trailer_S_START = 0x70540000;
+CYMEM_CM33_0_S_m33_trailer_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m33_trailer_OFFSET = 0x00540000;
+CYMEM_CM33_0_S_m55_nvm_START = 0x60580000;
+CYMEM_CM33_0_S_m55_nvm_C_START = 0x08580000;
+CYMEM_CM33_0_S_m55_nvm_C_S_START = 0x18580000;
+CYMEM_CM33_0_S_m55_nvm_S_START = 0x70580000;
+CYMEM_CM33_0_S_m55_nvm_SIZE = 0x002C0000;
+CYMEM_CM33_0_S_m55_nvm_OFFSET = 0x00580000;
+CYMEM_CM33_0_S_m55_trailer_START = 0x60840000;
+CYMEM_CM33_0_S_m55_trailer_C_START = 0x08840000;
+CYMEM_CM33_0_S_m55_trailer_C_S_START = 0x18840000;
+CYMEM_CM33_0_S_m55_trailer_S_START = 0x70840000;
+CYMEM_CM33_0_S_m55_trailer_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m55_trailer_OFFSET = 0x00840000;
+CYMEM_CM33_0_S_m55_code_secondary_START = 0x26000000;
+CYMEM_CM33_0_S_m55_code_secondary_C_START = 0x06000000;
+CYMEM_CM33_0_S_m55_code_secondary_C_S_START = 0x16000000;
+CYMEM_CM33_0_S_m55_code_secondary_S_START = 0x36000000;
+CYMEM_CM33_0_S_m55_code_secondary_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m55_code_secondary_OFFSET = 0x00000000;
+CYMEM_CM33_0_S_m55_data_secondary_START = 0x26040000;
+CYMEM_CM33_0_S_m55_data_secondary_C_START = 0x06040000;
+CYMEM_CM33_0_S_m55_data_secondary_C_S_START = 0x16040000;
+CYMEM_CM33_0_S_m55_data_secondary_S_START = 0x36040000;
+CYMEM_CM33_0_S_m55_data_secondary_SIZE = 0x002BC000;
+CYMEM_CM33_0_S_m55_data_secondary_OFFSET = 0x00040000;
+CYMEM_CM33_0_S_m33_m55_shared_START = 0x262FC000;
+CYMEM_CM33_0_S_m33_m55_shared_C_START = 0x062FC000;
+CYMEM_CM33_0_S_m33_m55_shared_C_S_START = 0x162FC000;
+CYMEM_CM33_0_S_m33_m55_shared_S_START = 0x362FC000;
+CYMEM_CM33_0_S_m33_m55_shared_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m33_m55_shared_OFFSET = 0x002FC000;
+CYMEM_CM33_0_S_gfx_mem_START = 0x2633C000;
+CYMEM_CM33_0_S_gfx_mem_C_START = 0x0633C000;
+CYMEM_CM33_0_S_gfx_mem_C_S_START = 0x1633C000;
+CYMEM_CM33_0_S_gfx_mem_S_START = 0x3633C000;
+CYMEM_CM33_0_S_gfx_mem_SIZE = 0x001C4000;
+CYMEM_CM33_0_S_gfx_mem_OFFSET = 0x0033C000;
+CYMEM_CM33_0_S_m33s_shared_START = 0x24001000;
+CYMEM_CM33_0_S_m33s_shared_C_START = 0x04001000;
+CYMEM_CM33_0_S_m33s_shared_C_S_START = 0x14001000;
+CYMEM_CM33_0_S_m33s_shared_S_START = 0x34001000;
+CYMEM_CM33_0_S_m33s_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_S_m33s_shared_OFFSET = 0x00001000;
+CYMEM_CM33_0_S_m33s_code_START = 0x24002000;
+CYMEM_CM33_0_S_m33s_code_C_START = 0x04002000;
+CYMEM_CM33_0_S_m33s_code_C_S_START = 0x14002000;
+CYMEM_CM33_0_S_m33s_code_S_START = 0x34002000;
+CYMEM_CM33_0_S_m33s_code_SIZE = 0x00035000;
+CYMEM_CM33_0_S_m33s_code_OFFSET = 0x00002000;
+CYMEM_CM33_0_S_m33s_data_START = 0x24037000;
+CYMEM_CM33_0_S_m33s_data_C_START = 0x04037000;
+CYMEM_CM33_0_S_m33s_data_C_S_START = 0x14037000;
+CYMEM_CM33_0_S_m33s_data_S_START = 0x34037000;
+CYMEM_CM33_0_S_m33s_data_SIZE = 0x00021000;
+CYMEM_CM33_0_S_m33s_data_OFFSET = 0x00037000;
+CYMEM_CM33_0_S_m33_code_START = 0x24058000;
+CYMEM_CM33_0_S_m33_code_C_START = 0x04058000;
+CYMEM_CM33_0_S_m33_code_C_S_START = 0x14058000;
+CYMEM_CM33_0_S_m33_code_S_START = 0x34058000;
+CYMEM_CM33_0_S_m33_code_SIZE = 0x00065000;
+CYMEM_CM33_0_S_m33_code_OFFSET = 0x00058000;
+CYMEM_CM33_0_S_m33_data_START = 0x240BD000;
+CYMEM_CM33_0_S_m33_data_C_START = 0x040BD000;
+CYMEM_CM33_0_S_m33_data_C_S_START = 0x140BD000;
+CYMEM_CM33_0_S_m33_data_S_START = 0x340BD000;
+CYMEM_CM33_0_S_m33_data_SIZE = 0x00040000;
+CYMEM_CM33_0_S_m33_data_OFFSET = 0x000BD000;
+CYMEM_CM33_0_S_m33s_allocatable_shared_START = 0x240FD000;
+CYMEM_CM33_0_S_m33s_allocatable_shared_C_START = 0x040FD000;
+CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START = 0x140FD000;
+CYMEM_CM33_0_S_m33s_allocatable_shared_S_START = 0x340FD000;
+CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_S_m33s_allocatable_shared_OFFSET = 0x000FD000;
+CYMEM_CM33_0_S_m33_allocatable_shared_START = 0x240FE000;
+CYMEM_CM33_0_S_m33_allocatable_shared_C_START = 0x040FE000;
+CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START = 0x140FE000;
+CYMEM_CM33_0_S_m33_allocatable_shared_S_START = 0x340FE000;
+CYMEM_CM33_0_S_m33_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_S_m33_allocatable_shared_OFFSET = 0x000FE000;
+CYMEM_CM33_0_S_m55_allocatable_shared_START = 0x240FF000;
+CYMEM_CM33_0_S_m55_allocatable_shared_C_START = 0x040FF000;
+CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START = 0x140FF000;
+CYMEM_CM33_0_S_m55_allocatable_shared_S_START = 0x340FF000;
+CYMEM_CM33_0_S_m55_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM33_0_S_m55_allocatable_shared_OFFSET = 0x000FF000;
+
+MEMORY
+{
+ m55_data : ORIGIN = 0x48040000, LENGTH = 0x00040000
+ m55_data_S : ORIGIN = 0x58040000, LENGTH = 0x00040000
+ m55_code : ORIGIN = 0x48000000, LENGTH = 0x00040000
+ m55_code_S : ORIGIN = 0x58000000, LENGTH = 0x00040000
+ user_programmable : ORIGIN = 0x22011000, LENGTH = 0x0004A000
+ user_programmable_C : ORIGIN = 0x02011000, LENGTH = 0x0004A000
+ user_programmable_C_S : ORIGIN = 0x12011000, LENGTH = 0x0004A000
+ user_programmable_S : ORIGIN = 0x32011000, LENGTH = 0x0004A000
+ user_nvm : ORIGIN = 0x2205B000, LENGTH = 0x00008000
+ user_nvm_C : ORIGIN = 0x0205B000, LENGTH = 0x00008000
+ user_nvm_C_S : ORIGIN = 0x1205B000, LENGTH = 0x00008000
+ user_nvm_S : ORIGIN = 0x3205B000, LENGTH = 0x00008000
+ m33s_nvm : ORIGIN = 0x60100000, LENGTH = 0x00200000
+ m33s_nvm_C : ORIGIN = 0x08100000, LENGTH = 0x00200000
+ m33s_nvm_C_S : ORIGIN = 0x18100000, LENGTH = 0x00200000
+ m33s_nvm_S : ORIGIN = 0x70100000, LENGTH = 0x00200000
+ m33s_trailer : ORIGIN = 0x60300000, LENGTH = 0x00040000
+ m33s_trailer_C : ORIGIN = 0x08300000, LENGTH = 0x00040000
+ m33s_trailer_C_S : ORIGIN = 0x18300000, LENGTH = 0x00040000
+ m33s_trailer_S : ORIGIN = 0x70300000, LENGTH = 0x00040000
+ m33_nvm : ORIGIN = 0x60340000, LENGTH = 0x00200000
+ m33_nvm_C : ORIGIN = 0x08340000, LENGTH = 0x00200000
+ m33_nvm_C_S : ORIGIN = 0x18340000, LENGTH = 0x00200000
+ m33_nvm_S : ORIGIN = 0x70340000, LENGTH = 0x00200000
+ m33_trailer : ORIGIN = 0x60540000, LENGTH = 0x00040000
+ m33_trailer_C : ORIGIN = 0x08540000, LENGTH = 0x00040000
+ m33_trailer_C_S : ORIGIN = 0x18540000, LENGTH = 0x00040000
+ m33_trailer_S : ORIGIN = 0x70540000, LENGTH = 0x00040000
+ m55_nvm : ORIGIN = 0x60580000, LENGTH = 0x002C0000
+ m55_nvm_C : ORIGIN = 0x08580000, LENGTH = 0x002C0000
+ m55_nvm_C_S : ORIGIN = 0x18580000, LENGTH = 0x002C0000
+ m55_nvm_S : ORIGIN = 0x70580000, LENGTH = 0x002C0000
+ m55_trailer : ORIGIN = 0x60840000, LENGTH = 0x00040000
+ m55_trailer_C : ORIGIN = 0x08840000, LENGTH = 0x00040000
+ m55_trailer_C_S : ORIGIN = 0x18840000, LENGTH = 0x00040000
+ m55_trailer_S : ORIGIN = 0x70840000, LENGTH = 0x00040000
+ m55_code_secondary : ORIGIN = 0x26000000, LENGTH = 0x00040000
+ m55_code_secondary_C : ORIGIN = 0x06000000, LENGTH = 0x00040000
+ m55_code_secondary_C_S : ORIGIN = 0x16000000, LENGTH = 0x00040000
+ m55_code_secondary_S : ORIGIN = 0x36000000, LENGTH = 0x00040000
+ m55_data_secondary : ORIGIN = 0x26040000, LENGTH = 0x002BC000
+ m55_data_secondary_C : ORIGIN = 0x06040000, LENGTH = 0x002BC000
+ m55_data_secondary_C_S : ORIGIN = 0x16040000, LENGTH = 0x002BC000
+ m55_data_secondary_S : ORIGIN = 0x36040000, LENGTH = 0x002BC000
+ m33_m55_shared : ORIGIN = 0x262FC000, LENGTH = 0x00040000
+ m33_m55_shared_C : ORIGIN = 0x062FC000, LENGTH = 0x00040000
+ m33_m55_shared_C_S : ORIGIN = 0x162FC000, LENGTH = 0x00040000
+ m33_m55_shared_S : ORIGIN = 0x362FC000, LENGTH = 0x00040000
+ gfx_mem : ORIGIN = 0x2633C000, LENGTH = 0x001C4000
+ gfx_mem_C : ORIGIN = 0x0633C000, LENGTH = 0x001C4000
+ gfx_mem_C_S : ORIGIN = 0x1633C000, LENGTH = 0x001C4000
+ gfx_mem_S : ORIGIN = 0x3633C000, LENGTH = 0x001C4000
+ m33s_shared : ORIGIN = 0x24001000, LENGTH = 0x00001000
+ m33s_shared_C : ORIGIN = 0x04001000, LENGTH = 0x00001000
+ m33s_shared_C_S : ORIGIN = 0x14001000, LENGTH = 0x00001000
+ m33s_shared_S : ORIGIN = 0x34001000, LENGTH = 0x00001000
+ m33s_code : ORIGIN = 0x24002000, LENGTH = 0x00035000
+ m33s_code_C : ORIGIN = 0x04002000, LENGTH = 0x00035000
+ m33s_code_C_S : ORIGIN = 0x14002000, LENGTH = 0x00035000
+ m33s_code_S : ORIGIN = 0x34002000, LENGTH = 0x00035000
+ m33s_data : ORIGIN = 0x24037000, LENGTH = 0x00021000
+ m33s_data_C : ORIGIN = 0x04037000, LENGTH = 0x00021000
+ m33s_data_C_S : ORIGIN = 0x14037000, LENGTH = 0x00021000
+ m33s_data_S : ORIGIN = 0x34037000, LENGTH = 0x00021000
+ m33_code : ORIGIN = 0x24058000, LENGTH = 0x00065000
+ m33_code_C : ORIGIN = 0x04058000, LENGTH = 0x00065000
+ m33_code_C_S : ORIGIN = 0x14058000, LENGTH = 0x00065000
+ m33_code_S : ORIGIN = 0x34058000, LENGTH = 0x00065000
+ m33_data : ORIGIN = 0x240BD000, LENGTH = 0x00040000
+ m33_data_C : ORIGIN = 0x040BD000, LENGTH = 0x00040000
+ m33_data_C_S : ORIGIN = 0x140BD000, LENGTH = 0x00040000
+ m33_data_S : ORIGIN = 0x340BD000, LENGTH = 0x00040000
+ m33s_allocatable_shared : ORIGIN = 0x240FD000, LENGTH = 0x00001000
+ m33s_allocatable_shared_C : ORIGIN = 0x040FD000, LENGTH = 0x00001000
+ m33s_allocatable_shared_C_S : ORIGIN = 0x140FD000, LENGTH = 0x00001000
+ m33s_allocatable_shared_S : ORIGIN = 0x340FD000, LENGTH = 0x00001000
+ m33_allocatable_shared : ORIGIN = 0x240FE000, LENGTH = 0x00001000
+ m33_allocatable_shared_C : ORIGIN = 0x040FE000, LENGTH = 0x00001000
+ m33_allocatable_shared_C_S : ORIGIN = 0x140FE000, LENGTH = 0x00001000
+ m33_allocatable_shared_S : ORIGIN = 0x340FE000, LENGTH = 0x00001000
+ m55_allocatable_shared : ORIGIN = 0x240FF000, LENGTH = 0x00001000
+ m55_allocatable_shared_C : ORIGIN = 0x040FF000, LENGTH = 0x00001000
+ m55_allocatable_shared_C_S : ORIGIN = 0x140FF000, LENGTH = 0x00001000
+ m55_allocatable_shared_S : ORIGIN = 0x340FF000, LENGTH = 0x00001000
+}
+
+REGION_ALIAS("m55_data_sel", m55_data)
+REGION_ALIAS("m55_data_sel_S", m55_data_S)
+REGION_ALIAS("m55_code_sel", m55_code)
+REGION_ALIAS("m55_code_sel_S", m55_code_S)
+REGION_ALIAS("user_programmable_sel", user_programmable_C)
+REGION_ALIAS("user_programmable_sel_S", user_programmable_C_S)
+REGION_ALIAS("user_nvm_sel", user_nvm_C)
+REGION_ALIAS("user_nvm_sel_S", user_nvm_C_S)
+REGION_ALIAS("m33s_nvm_sel", m33s_nvm_C)
+REGION_ALIAS("m33s_nvm_sel_S", m33s_nvm_C_S)
+REGION_ALIAS("m33s_trailer_sel", m33s_trailer_C)
+REGION_ALIAS("m33s_trailer_sel_S", m33s_trailer_C_S)
+REGION_ALIAS("m33_nvm_sel", m33_nvm_C)
+REGION_ALIAS("m33_nvm_sel_S", m33_nvm_C_S)
+REGION_ALIAS("m33_trailer_sel", m33_trailer_C)
+REGION_ALIAS("m33_trailer_sel_S", m33_trailer_C_S)
+REGION_ALIAS("m55_nvm_sel", m55_nvm_C)
+REGION_ALIAS("m55_nvm_sel_S", m55_nvm_C_S)
+REGION_ALIAS("m55_trailer_sel", m55_trailer_C)
+REGION_ALIAS("m55_trailer_sel_S", m55_trailer_C_S)
+REGION_ALIAS("m55_code_secondary_sel", m55_code_secondary_C)
+REGION_ALIAS("m55_code_secondary_sel_S", m55_code_secondary_C_S)
+REGION_ALIAS("m55_data_secondary_sel", m55_data_secondary_C)
+REGION_ALIAS("m55_data_secondary_sel_S", m55_data_secondary_C_S)
+REGION_ALIAS("m33_m55_shared_sel", m33_m55_shared_C)
+REGION_ALIAS("m33_m55_shared_sel_S", m33_m55_shared_C_S)
+REGION_ALIAS("gfx_mem_sel", gfx_mem_C)
+REGION_ALIAS("gfx_mem_sel_S", gfx_mem_C_S)
+REGION_ALIAS("m33s_shared_sel", m33s_shared_C)
+REGION_ALIAS("m33s_shared_sel_S", m33s_shared_C_S)
+REGION_ALIAS("m33s_code_sel", m33s_code_C)
+REGION_ALIAS("m33s_code_sel_S", m33s_code_C_S)
+REGION_ALIAS("m33s_data_sel", m33s_data_C)
+REGION_ALIAS("m33s_data_sel_S", m33s_data_C_S)
+REGION_ALIAS("m33_code_sel", m33_code_C)
+REGION_ALIAS("m33_code_sel_S", m33_code_C_S)
+REGION_ALIAS("m33_data_sel", m33_data_C)
+REGION_ALIAS("m33_data_sel_S", m33_data_C_S)
+REGION_ALIAS("m33s_allocatable_shared_sel", m33s_allocatable_shared_C)
+REGION_ALIAS("m33s_allocatable_shared_sel_S", m33s_allocatable_shared_C_S)
+REGION_ALIAS("m33_allocatable_shared_sel", m33_allocatable_shared_C)
+REGION_ALIAS("m33_allocatable_shared_sel_S", m33_allocatable_shared_C_S)
+REGION_ALIAS("m55_allocatable_shared_sel", m55_allocatable_shared_C)
+REGION_ALIAS("m55_allocatable_shared_sel_S", m55_allocatable_shared_C_S)
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM55_0.ld b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM55_0.ld
new file mode 100644
index 00000000000..14f631ec105
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_gnu_CM55_0.ld
@@ -0,0 +1,72 @@
+/* This file is automatically generated. */
+
+CYMEM_CM55_0_m55_data_INTERNAL_START = 0x20000000;
+CYMEM_CM55_0_m55_data_SIZE = 0x00040000;
+CYMEM_CM55_0_m55_data_OFFSET = 0x00000000;
+CYMEM_CM55_0_m55_code_INTERNAL_START = 0x00000000;
+CYMEM_CM55_0_m55_code_SIZE = 0x00040000;
+CYMEM_CM55_0_m55_code_OFFSET = 0x00000000;
+CYMEM_CM55_0_user_nvm_C_START = 0x0205B000;
+CYMEM_CM55_0_user_nvm_SIZE = 0x00008000;
+CYMEM_CM55_0_user_nvm_OFFSET = 0x0005B000;
+CYMEM_CM55_0_m55_nvm_START = 0x60580000;
+CYMEM_CM55_0_m55_nvm_SIZE = 0x002C0000;
+CYMEM_CM55_0_m55_nvm_OFFSET = 0x00580000;
+CYMEM_CM55_0_m55_trailer_START = 0x60840000;
+CYMEM_CM55_0_m55_trailer_SIZE = 0x00040000;
+CYMEM_CM55_0_m55_trailer_OFFSET = 0x00840000;
+CYMEM_CM55_0_m55_code_secondary_START = 0x26000000;
+CYMEM_CM55_0_m55_code_secondary_SIZE = 0x00040000;
+CYMEM_CM55_0_m55_code_secondary_OFFSET = 0x00000000;
+CYMEM_CM55_0_m55_data_secondary_START = 0x26040000;
+CYMEM_CM55_0_m55_data_secondary_SIZE = 0x002BC000;
+CYMEM_CM55_0_m55_data_secondary_OFFSET = 0x00040000;
+CYMEM_CM55_0_m33_m55_shared_START = 0x262FC000;
+CYMEM_CM55_0_m33_m55_shared_SIZE = 0x00040000;
+CYMEM_CM55_0_m33_m55_shared_OFFSET = 0x002FC000;
+CYMEM_CM55_0_gfx_mem_START = 0x2633C000;
+CYMEM_CM55_0_gfx_mem_SIZE = 0x001C4000;
+CYMEM_CM55_0_gfx_mem_OFFSET = 0x0033C000;
+CYMEM_CM55_0_m33_data_START = 0x240BD000;
+CYMEM_CM55_0_m33_data_SIZE = 0x00040000;
+CYMEM_CM55_0_m33_data_OFFSET = 0x000BD000;
+CYMEM_CM55_0_m33s_allocatable_shared_START = 0x240FD000;
+CYMEM_CM55_0_m33s_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM55_0_m33s_allocatable_shared_OFFSET = 0x000FD000;
+CYMEM_CM55_0_m33_allocatable_shared_START = 0x240FE000;
+CYMEM_CM55_0_m33_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM55_0_m33_allocatable_shared_OFFSET = 0x000FE000;
+CYMEM_CM55_0_m55_allocatable_shared_START = 0x240FF000;
+CYMEM_CM55_0_m55_allocatable_shared_SIZE = 0x00001000;
+CYMEM_CM55_0_m55_allocatable_shared_OFFSET = 0x000FF000;
+
+MEMORY
+{
+ m55_data_INTERNAL : ORIGIN = 0x20000000, LENGTH = 0x00040000
+ m55_code_INTERNAL : ORIGIN = 0x00000000, LENGTH = 0x00040000
+ user_nvm_C : ORIGIN = 0x0205B000, LENGTH = 0x00008000
+ m55_nvm : ORIGIN = 0x60580000, LENGTH = 0x002C0000
+ m55_trailer : ORIGIN = 0x60840000, LENGTH = 0x00040000
+ m55_code_secondary : ORIGIN = 0x26000000, LENGTH = 0x00040000
+ m55_data_secondary : ORIGIN = 0x26040000, LENGTH = 0x002BC000
+ m33_m55_shared : ORIGIN = 0x262FC000, LENGTH = 0x00040000
+ gfx_mem : ORIGIN = 0x2633C000, LENGTH = 0x001C4000
+ m33_data : ORIGIN = 0x240BD000, LENGTH = 0x00040000
+ m33s_allocatable_shared : ORIGIN = 0x240FD000, LENGTH = 0x00001000
+ m33_allocatable_shared : ORIGIN = 0x240FE000, LENGTH = 0x00001000
+ m55_allocatable_shared : ORIGIN = 0x240FF000, LENGTH = 0x00001000
+}
+
+REGION_ALIAS("m55_data_sel", m55_data_INTERNAL)
+REGION_ALIAS("m55_code_sel", m55_code_INTERNAL)
+REGION_ALIAS("user_nvm_sel", user_nvm_C)
+REGION_ALIAS("m55_nvm_sel", m55_nvm)
+REGION_ALIAS("m55_trailer_sel", m55_trailer)
+REGION_ALIAS("m55_code_secondary_sel", m55_code_secondary)
+REGION_ALIAS("m55_data_secondary_sel", m55_data_secondary)
+REGION_ALIAS("m33_m55_shared_sel", m33_m55_shared)
+REGION_ALIAS("gfx_mem_sel", gfx_mem)
+REGION_ALIAS("m33_data_sel", m33_data)
+REGION_ALIAS("m33s_allocatable_shared_sel", m33s_allocatable_shared)
+REGION_ALIAS("m33_allocatable_shared_sel", m33_allocatable_shared)
+REGION_ALIAS("m55_allocatable_shared_sel", m55_allocatable_shared)
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM33_0.icf b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM33_0.icf
new file mode 100644
index 00000000000..d988272a7e9
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM33_0.icf
@@ -0,0 +1,109 @@
+// This file is automatically generated.
+define exported symbol CYMEM_CM33_0_m55_data_START = 0x48040000;
+define exported symbol CYMEM_CM33_0_m55_data_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m55_data_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM33_0_m55_data_sel_START = CYMEM_CM33_0_m55_data_START;
+define exported symbol CYMEM_CM33_0_m55_code_START = 0x48000000;
+define exported symbol CYMEM_CM33_0_m55_code_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m55_code_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM33_0_m55_code_sel_START = CYMEM_CM33_0_m55_code_START;
+define exported symbol CYMEM_CM33_0_user_programmable_START = 0x22011000;
+define exported symbol CYMEM_CM33_0_user_programmable_C_START = 0x02011000;
+define exported symbol CYMEM_CM33_0_user_programmable_SIZE = 0x0004A000;
+define exported symbol CYMEM_CM33_0_user_programmable_OFFSET = 0x00011000;
+define exported symbol CYMEM_CM33_0_user_programmable_sel_START = CYMEM_CM33_0_user_programmable_C_START;
+define exported symbol CYMEM_CM33_0_user_nvm_START = 0x2205B000;
+define exported symbol CYMEM_CM33_0_user_nvm_C_START = 0x0205B000;
+define exported symbol CYMEM_CM33_0_user_nvm_SIZE = 0x00008000;
+define exported symbol CYMEM_CM33_0_user_nvm_OFFSET = 0x0005B000;
+define exported symbol CYMEM_CM33_0_user_nvm_sel_START = CYMEM_CM33_0_user_nvm_C_START;
+define exported symbol CYMEM_CM33_0_m33s_nvm_START = 0x60100000;
+define exported symbol CYMEM_CM33_0_m33s_nvm_C_START = 0x08100000;
+define exported symbol CYMEM_CM33_0_m33s_nvm_SIZE = 0x00200000;
+define exported symbol CYMEM_CM33_0_m33s_nvm_OFFSET = 0x00100000;
+define exported symbol CYMEM_CM33_0_m33s_nvm_sel_START = CYMEM_CM33_0_m33s_nvm_C_START;
+define exported symbol CYMEM_CM33_0_m33s_trailer_START = 0x60300000;
+define exported symbol CYMEM_CM33_0_m33s_trailer_C_START = 0x08300000;
+define exported symbol CYMEM_CM33_0_m33s_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m33s_trailer_OFFSET = 0x00300000;
+define exported symbol CYMEM_CM33_0_m33s_trailer_sel_START = CYMEM_CM33_0_m33s_trailer_C_START;
+define exported symbol CYMEM_CM33_0_m33_nvm_START = 0x60340000;
+define exported symbol CYMEM_CM33_0_m33_nvm_C_START = 0x08340000;
+define exported symbol CYMEM_CM33_0_m33_nvm_SIZE = 0x00200000;
+define exported symbol CYMEM_CM33_0_m33_nvm_OFFSET = 0x00340000;
+define exported symbol CYMEM_CM33_0_m33_nvm_sel_START = CYMEM_CM33_0_m33_nvm_C_START;
+define exported symbol CYMEM_CM33_0_m33_trailer_START = 0x60540000;
+define exported symbol CYMEM_CM33_0_m33_trailer_C_START = 0x08540000;
+define exported symbol CYMEM_CM33_0_m33_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m33_trailer_OFFSET = 0x00540000;
+define exported symbol CYMEM_CM33_0_m33_trailer_sel_START = CYMEM_CM33_0_m33_trailer_C_START;
+define exported symbol CYMEM_CM33_0_m55_nvm_START = 0x60580000;
+define exported symbol CYMEM_CM33_0_m55_nvm_C_START = 0x08580000;
+define exported symbol CYMEM_CM33_0_m55_nvm_SIZE = 0x002C0000;
+define exported symbol CYMEM_CM33_0_m55_nvm_OFFSET = 0x00580000;
+define exported symbol CYMEM_CM33_0_m55_nvm_sel_START = CYMEM_CM33_0_m55_nvm_C_START;
+define exported symbol CYMEM_CM33_0_m55_trailer_START = 0x60840000;
+define exported symbol CYMEM_CM33_0_m55_trailer_C_START = 0x08840000;
+define exported symbol CYMEM_CM33_0_m55_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m55_trailer_OFFSET = 0x00840000;
+define exported symbol CYMEM_CM33_0_m55_trailer_sel_START = CYMEM_CM33_0_m55_trailer_C_START;
+define exported symbol CYMEM_CM33_0_m55_code_secondary_START = 0x26000000;
+define exported symbol CYMEM_CM33_0_m55_code_secondary_C_START = 0x06000000;
+define exported symbol CYMEM_CM33_0_m55_code_secondary_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m55_code_secondary_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM33_0_m55_code_secondary_sel_START = CYMEM_CM33_0_m55_code_secondary_C_START;
+define exported symbol CYMEM_CM33_0_m55_data_secondary_START = 0x26040000;
+define exported symbol CYMEM_CM33_0_m55_data_secondary_C_START = 0x06040000;
+define exported symbol CYMEM_CM33_0_m55_data_secondary_SIZE = 0x002BC000;
+define exported symbol CYMEM_CM33_0_m55_data_secondary_OFFSET = 0x00040000;
+define exported symbol CYMEM_CM33_0_m55_data_secondary_sel_START = CYMEM_CM33_0_m55_data_secondary_C_START;
+define exported symbol CYMEM_CM33_0_m33_m55_shared_START = 0x262FC000;
+define exported symbol CYMEM_CM33_0_m33_m55_shared_C_START = 0x062FC000;
+define exported symbol CYMEM_CM33_0_m33_m55_shared_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m33_m55_shared_OFFSET = 0x002FC000;
+define exported symbol CYMEM_CM33_0_m33_m55_shared_sel_START = CYMEM_CM33_0_m33_m55_shared_C_START;
+define exported symbol CYMEM_CM33_0_gfx_mem_START = 0x2633C000;
+define exported symbol CYMEM_CM33_0_gfx_mem_C_START = 0x0633C000;
+define exported symbol CYMEM_CM33_0_gfx_mem_SIZE = 0x001C4000;
+define exported symbol CYMEM_CM33_0_gfx_mem_OFFSET = 0x0033C000;
+define exported symbol CYMEM_CM33_0_gfx_mem_sel_START = CYMEM_CM33_0_gfx_mem_C_START;
+define exported symbol CYMEM_CM33_0_m33s_shared_START = 0x24001000;
+define exported symbol CYMEM_CM33_0_m33s_shared_C_START = 0x04001000;
+define exported symbol CYMEM_CM33_0_m33s_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_m33s_shared_OFFSET = 0x00001000;
+define exported symbol CYMEM_CM33_0_m33s_shared_sel_START = CYMEM_CM33_0_m33s_shared_C_START;
+define exported symbol CYMEM_CM33_0_m33s_code_START = 0x24002000;
+define exported symbol CYMEM_CM33_0_m33s_code_C_START = 0x04002000;
+define exported symbol CYMEM_CM33_0_m33s_code_SIZE = 0x00035000;
+define exported symbol CYMEM_CM33_0_m33s_code_OFFSET = 0x00002000;
+define exported symbol CYMEM_CM33_0_m33s_code_sel_START = CYMEM_CM33_0_m33s_code_C_START;
+define exported symbol CYMEM_CM33_0_m33s_data_START = 0x24037000;
+define exported symbol CYMEM_CM33_0_m33s_data_C_START = 0x04037000;
+define exported symbol CYMEM_CM33_0_m33s_data_SIZE = 0x00021000;
+define exported symbol CYMEM_CM33_0_m33s_data_OFFSET = 0x00037000;
+define exported symbol CYMEM_CM33_0_m33s_data_sel_START = CYMEM_CM33_0_m33s_data_C_START;
+define exported symbol CYMEM_CM33_0_m33_code_START = 0x24058000;
+define exported symbol CYMEM_CM33_0_m33_code_C_START = 0x04058000;
+define exported symbol CYMEM_CM33_0_m33_code_SIZE = 0x00065000;
+define exported symbol CYMEM_CM33_0_m33_code_OFFSET = 0x00058000;
+define exported symbol CYMEM_CM33_0_m33_code_sel_START = CYMEM_CM33_0_m33_code_C_START;
+define exported symbol CYMEM_CM33_0_m33_data_START = 0x240BD000;
+define exported symbol CYMEM_CM33_0_m33_data_C_START = 0x040BD000;
+define exported symbol CYMEM_CM33_0_m33_data_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_m33_data_OFFSET = 0x000BD000;
+define exported symbol CYMEM_CM33_0_m33_data_sel_START = CYMEM_CM33_0_m33_data_C_START;
+define exported symbol CYMEM_CM33_0_m33s_allocatable_shared_START = 0x240FD000;
+define exported symbol CYMEM_CM33_0_m33s_allocatable_shared_C_START = 0x040FD000;
+define exported symbol CYMEM_CM33_0_m33s_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_m33s_allocatable_shared_OFFSET = 0x000FD000;
+define exported symbol CYMEM_CM33_0_m33s_allocatable_shared_sel_START = CYMEM_CM33_0_m33s_allocatable_shared_C_START;
+define exported symbol CYMEM_CM33_0_m33_allocatable_shared_START = 0x240FE000;
+define exported symbol CYMEM_CM33_0_m33_allocatable_shared_C_START = 0x040FE000;
+define exported symbol CYMEM_CM33_0_m33_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_m33_allocatable_shared_OFFSET = 0x000FE000;
+define exported symbol CYMEM_CM33_0_m33_allocatable_shared_sel_START = CYMEM_CM33_0_m33_allocatable_shared_C_START;
+define exported symbol CYMEM_CM33_0_m55_allocatable_shared_START = 0x240FF000;
+define exported symbol CYMEM_CM33_0_m55_allocatable_shared_C_START = 0x040FF000;
+define exported symbol CYMEM_CM33_0_m55_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_m55_allocatable_shared_OFFSET = 0x000FF000;
+define exported symbol CYMEM_CM33_0_m55_allocatable_shared_sel_START = CYMEM_CM33_0_m55_allocatable_shared_C_START;
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM33_0_S.icf b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM33_0_S.icf
new file mode 100644
index 00000000000..1d6f82dbeff
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM33_0_S.icf
@@ -0,0 +1,173 @@
+// This file is automatically generated.
+define exported symbol CYMEM_CM33_0_S_m55_data_START = 0x48040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_S_START = 0x58040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM33_0_S_m55_data_sel_START = CYMEM_CM33_0_S_m55_data_START;
+define exported symbol CYMEM_CM33_0_S_m55_data_sel_S_START = CYMEM_CM33_0_S_m55_data_S_START;
+define exported symbol CYMEM_CM33_0_S_m55_code_START = 0x48000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_S_START = 0x58000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m55_code_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_sel_START = CYMEM_CM33_0_S_m55_code_START;
+define exported symbol CYMEM_CM33_0_S_m55_code_sel_S_START = CYMEM_CM33_0_S_m55_code_S_START;
+define exported symbol CYMEM_CM33_0_S_user_programmable_START = 0x22011000;
+define exported symbol CYMEM_CM33_0_S_user_programmable_C_START = 0x02011000;
+define exported symbol CYMEM_CM33_0_S_user_programmable_C_S_START = 0x12011000;
+define exported symbol CYMEM_CM33_0_S_user_programmable_S_START = 0x32011000;
+define exported symbol CYMEM_CM33_0_S_user_programmable_SIZE = 0x0004A000;
+define exported symbol CYMEM_CM33_0_S_user_programmable_OFFSET = 0x00011000;
+define exported symbol CYMEM_CM33_0_S_user_programmable_sel_START = CYMEM_CM33_0_S_user_programmable_C_START;
+define exported symbol CYMEM_CM33_0_S_user_programmable_sel_S_START = CYMEM_CM33_0_S_user_programmable_C_S_START;
+define exported symbol CYMEM_CM33_0_S_user_nvm_START = 0x2205B000;
+define exported symbol CYMEM_CM33_0_S_user_nvm_C_START = 0x0205B000;
+define exported symbol CYMEM_CM33_0_S_user_nvm_C_S_START = 0x1205B000;
+define exported symbol CYMEM_CM33_0_S_user_nvm_S_START = 0x3205B000;
+define exported symbol CYMEM_CM33_0_S_user_nvm_SIZE = 0x00008000;
+define exported symbol CYMEM_CM33_0_S_user_nvm_OFFSET = 0x0005B000;
+define exported symbol CYMEM_CM33_0_S_user_nvm_sel_START = CYMEM_CM33_0_S_user_nvm_C_START;
+define exported symbol CYMEM_CM33_0_S_user_nvm_sel_S_START = CYMEM_CM33_0_S_user_nvm_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_START = 0x60100000;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_C_START = 0x08100000;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_C_S_START = 0x18100000;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_S_START = 0x70100000;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_SIZE = 0x00200000;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_OFFSET = 0x00100000;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_sel_START = CYMEM_CM33_0_S_m33s_nvm_C_START;
+define exported symbol CYMEM_CM33_0_S_m33s_nvm_sel_S_START = CYMEM_CM33_0_S_m33s_nvm_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_START = 0x60300000;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_C_START = 0x08300000;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_C_S_START = 0x18300000;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_S_START = 0x70300000;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_OFFSET = 0x00300000;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_sel_START = CYMEM_CM33_0_S_m33s_trailer_C_START;
+define exported symbol CYMEM_CM33_0_S_m33s_trailer_sel_S_START = CYMEM_CM33_0_S_m33s_trailer_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_START = 0x60340000;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_C_START = 0x08340000;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_C_S_START = 0x18340000;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_S_START = 0x70340000;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_SIZE = 0x00200000;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_OFFSET = 0x00340000;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_sel_START = CYMEM_CM33_0_S_m33_nvm_C_START;
+define exported symbol CYMEM_CM33_0_S_m33_nvm_sel_S_START = CYMEM_CM33_0_S_m33_nvm_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_START = 0x60540000;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_C_START = 0x08540000;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_C_S_START = 0x18540000;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_S_START = 0x70540000;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_OFFSET = 0x00540000;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_sel_START = CYMEM_CM33_0_S_m33_trailer_C_START;
+define exported symbol CYMEM_CM33_0_S_m33_trailer_sel_S_START = CYMEM_CM33_0_S_m33_trailer_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_START = 0x60580000;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_C_START = 0x08580000;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_C_S_START = 0x18580000;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_S_START = 0x70580000;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_SIZE = 0x002C0000;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_OFFSET = 0x00580000;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_sel_START = CYMEM_CM33_0_S_m55_nvm_C_START;
+define exported symbol CYMEM_CM33_0_S_m55_nvm_sel_S_START = CYMEM_CM33_0_S_m55_nvm_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_START = 0x60840000;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_C_START = 0x08840000;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_C_S_START = 0x18840000;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_S_START = 0x70840000;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_OFFSET = 0x00840000;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_sel_START = CYMEM_CM33_0_S_m55_trailer_C_START;
+define exported symbol CYMEM_CM33_0_S_m55_trailer_sel_S_START = CYMEM_CM33_0_S_m55_trailer_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_START = 0x26000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_C_START = 0x06000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_C_S_START = 0x16000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_S_START = 0x36000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_sel_START = CYMEM_CM33_0_S_m55_code_secondary_C_START;
+define exported symbol CYMEM_CM33_0_S_m55_code_secondary_sel_S_START = CYMEM_CM33_0_S_m55_code_secondary_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_START = 0x26040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_C_START = 0x06040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_C_S_START = 0x16040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_S_START = 0x36040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_SIZE = 0x002BC000;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_OFFSET = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_sel_START = CYMEM_CM33_0_S_m55_data_secondary_C_START;
+define exported symbol CYMEM_CM33_0_S_m55_data_secondary_sel_S_START = CYMEM_CM33_0_S_m55_data_secondary_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_START = 0x262FC000;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_C_START = 0x062FC000;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_C_S_START = 0x162FC000;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_S_START = 0x362FC000;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_OFFSET = 0x002FC000;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_sel_START = CYMEM_CM33_0_S_m33_m55_shared_C_START;
+define exported symbol CYMEM_CM33_0_S_m33_m55_shared_sel_S_START = CYMEM_CM33_0_S_m33_m55_shared_C_S_START;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_START = 0x2633C000;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_C_START = 0x0633C000;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_C_S_START = 0x1633C000;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_S_START = 0x3633C000;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_SIZE = 0x001C4000;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_OFFSET = 0x0033C000;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_sel_START = CYMEM_CM33_0_S_gfx_mem_C_START;
+define exported symbol CYMEM_CM33_0_S_gfx_mem_sel_S_START = CYMEM_CM33_0_S_gfx_mem_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_START = 0x24001000;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_C_START = 0x04001000;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_C_S_START = 0x14001000;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_S_START = 0x34001000;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_OFFSET = 0x00001000;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_sel_START = CYMEM_CM33_0_S_m33s_shared_C_START;
+define exported symbol CYMEM_CM33_0_S_m33s_shared_sel_S_START = CYMEM_CM33_0_S_m33s_shared_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33s_code_START = 0x24002000;
+define exported symbol CYMEM_CM33_0_S_m33s_code_C_START = 0x04002000;
+define exported symbol CYMEM_CM33_0_S_m33s_code_C_S_START = 0x14002000;
+define exported symbol CYMEM_CM33_0_S_m33s_code_S_START = 0x34002000;
+define exported symbol CYMEM_CM33_0_S_m33s_code_SIZE = 0x00035000;
+define exported symbol CYMEM_CM33_0_S_m33s_code_OFFSET = 0x00002000;
+define exported symbol CYMEM_CM33_0_S_m33s_code_sel_START = CYMEM_CM33_0_S_m33s_code_C_START;
+define exported symbol CYMEM_CM33_0_S_m33s_code_sel_S_START = CYMEM_CM33_0_S_m33s_code_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33s_data_START = 0x24037000;
+define exported symbol CYMEM_CM33_0_S_m33s_data_C_START = 0x04037000;
+define exported symbol CYMEM_CM33_0_S_m33s_data_C_S_START = 0x14037000;
+define exported symbol CYMEM_CM33_0_S_m33s_data_S_START = 0x34037000;
+define exported symbol CYMEM_CM33_0_S_m33s_data_SIZE = 0x00021000;
+define exported symbol CYMEM_CM33_0_S_m33s_data_OFFSET = 0x00037000;
+define exported symbol CYMEM_CM33_0_S_m33s_data_sel_START = CYMEM_CM33_0_S_m33s_data_C_START;
+define exported symbol CYMEM_CM33_0_S_m33s_data_sel_S_START = CYMEM_CM33_0_S_m33s_data_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33_code_START = 0x24058000;
+define exported symbol CYMEM_CM33_0_S_m33_code_C_START = 0x04058000;
+define exported symbol CYMEM_CM33_0_S_m33_code_C_S_START = 0x14058000;
+define exported symbol CYMEM_CM33_0_S_m33_code_S_START = 0x34058000;
+define exported symbol CYMEM_CM33_0_S_m33_code_SIZE = 0x00065000;
+define exported symbol CYMEM_CM33_0_S_m33_code_OFFSET = 0x00058000;
+define exported symbol CYMEM_CM33_0_S_m33_code_sel_START = CYMEM_CM33_0_S_m33_code_C_START;
+define exported symbol CYMEM_CM33_0_S_m33_code_sel_S_START = CYMEM_CM33_0_S_m33_code_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33_data_START = 0x240BD000;
+define exported symbol CYMEM_CM33_0_S_m33_data_C_START = 0x040BD000;
+define exported symbol CYMEM_CM33_0_S_m33_data_C_S_START = 0x140BD000;
+define exported symbol CYMEM_CM33_0_S_m33_data_S_START = 0x340BD000;
+define exported symbol CYMEM_CM33_0_S_m33_data_SIZE = 0x00040000;
+define exported symbol CYMEM_CM33_0_S_m33_data_OFFSET = 0x000BD000;
+define exported symbol CYMEM_CM33_0_S_m33_data_sel_START = CYMEM_CM33_0_S_m33_data_C_START;
+define exported symbol CYMEM_CM33_0_S_m33_data_sel_S_START = CYMEM_CM33_0_S_m33_data_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_START = 0x240FD000;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_C_START = 0x040FD000;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START = 0x140FD000;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_S_START = 0x340FD000;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_OFFSET = 0x000FD000;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_sel_START = CYMEM_CM33_0_S_m33s_allocatable_shared_C_START;
+define exported symbol CYMEM_CM33_0_S_m33s_allocatable_shared_sel_S_START = CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_START = 0x240FE000;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_C_START = 0x040FE000;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START = 0x140FE000;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_S_START = 0x340FE000;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_OFFSET = 0x000FE000;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_sel_START = CYMEM_CM33_0_S_m33_allocatable_shared_C_START;
+define exported symbol CYMEM_CM33_0_S_m33_allocatable_shared_sel_S_START = CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_START = 0x240FF000;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_C_START = 0x040FF000;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START = 0x140FF000;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_S_START = 0x340FF000;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_OFFSET = 0x000FF000;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_sel_START = CYMEM_CM33_0_S_m55_allocatable_shared_C_START;
+define exported symbol CYMEM_CM33_0_S_m55_allocatable_shared_sel_S_START = CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START;
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM55_0.icf b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM55_0.icf
new file mode 100644
index 00000000000..83a3e249e53
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_CM55_0.icf
@@ -0,0 +1,53 @@
+// This file is automatically generated.
+define exported symbol CYMEM_CM55_0_m55_data_INTERNAL_START = 0x20000000;
+define exported symbol CYMEM_CM55_0_m55_data_SIZE = 0x00040000;
+define exported symbol CYMEM_CM55_0_m55_data_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM55_0_m55_data_sel_START = CYMEM_CM55_0_m55_data_INTERNAL_START;
+define exported symbol CYMEM_CM55_0_m55_code_INTERNAL_START = 0x00000000;
+define exported symbol CYMEM_CM55_0_m55_code_SIZE = 0x00040000;
+define exported symbol CYMEM_CM55_0_m55_code_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM55_0_m55_code_sel_START = CYMEM_CM55_0_m55_code_INTERNAL_START;
+define exported symbol CYMEM_CM55_0_user_nvm_C_START = 0x0205B000;
+define exported symbol CYMEM_CM55_0_user_nvm_SIZE = 0x00008000;
+define exported symbol CYMEM_CM55_0_user_nvm_OFFSET = 0x0005B000;
+define exported symbol CYMEM_CM55_0_user_nvm_sel_START = CYMEM_CM55_0_user_nvm_C_START;
+define exported symbol CYMEM_CM55_0_m55_nvm_START = 0x60580000;
+define exported symbol CYMEM_CM55_0_m55_nvm_SIZE = 0x002C0000;
+define exported symbol CYMEM_CM55_0_m55_nvm_OFFSET = 0x00580000;
+define exported symbol CYMEM_CM55_0_m55_nvm_sel_START = CYMEM_CM55_0_m55_nvm_START;
+define exported symbol CYMEM_CM55_0_m55_trailer_START = 0x60840000;
+define exported symbol CYMEM_CM55_0_m55_trailer_SIZE = 0x00040000;
+define exported symbol CYMEM_CM55_0_m55_trailer_OFFSET = 0x00840000;
+define exported symbol CYMEM_CM55_0_m55_trailer_sel_START = CYMEM_CM55_0_m55_trailer_START;
+define exported symbol CYMEM_CM55_0_m55_code_secondary_START = 0x26000000;
+define exported symbol CYMEM_CM55_0_m55_code_secondary_SIZE = 0x00040000;
+define exported symbol CYMEM_CM55_0_m55_code_secondary_OFFSET = 0x00000000;
+define exported symbol CYMEM_CM55_0_m55_code_secondary_sel_START = CYMEM_CM55_0_m55_code_secondary_START;
+define exported symbol CYMEM_CM55_0_m55_data_secondary_START = 0x26040000;
+define exported symbol CYMEM_CM55_0_m55_data_secondary_SIZE = 0x002BC000;
+define exported symbol CYMEM_CM55_0_m55_data_secondary_OFFSET = 0x00040000;
+define exported symbol CYMEM_CM55_0_m55_data_secondary_sel_START = CYMEM_CM55_0_m55_data_secondary_START;
+define exported symbol CYMEM_CM55_0_m33_m55_shared_START = 0x262FC000;
+define exported symbol CYMEM_CM55_0_m33_m55_shared_SIZE = 0x00040000;
+define exported symbol CYMEM_CM55_0_m33_m55_shared_OFFSET = 0x002FC000;
+define exported symbol CYMEM_CM55_0_m33_m55_shared_sel_START = CYMEM_CM55_0_m33_m55_shared_START;
+define exported symbol CYMEM_CM55_0_gfx_mem_START = 0x2633C000;
+define exported symbol CYMEM_CM55_0_gfx_mem_SIZE = 0x001C4000;
+define exported symbol CYMEM_CM55_0_gfx_mem_OFFSET = 0x0033C000;
+define exported symbol CYMEM_CM55_0_gfx_mem_sel_START = CYMEM_CM55_0_gfx_mem_START;
+define exported symbol CYMEM_CM55_0_m33_data_START = 0x240BD000;
+define exported symbol CYMEM_CM55_0_m33_data_SIZE = 0x00040000;
+define exported symbol CYMEM_CM55_0_m33_data_OFFSET = 0x000BD000;
+define exported symbol CYMEM_CM55_0_m33_data_sel_START = CYMEM_CM55_0_m33_data_START;
+define exported symbol CYMEM_CM55_0_m33s_allocatable_shared_START = 0x240FD000;
+define exported symbol CYMEM_CM55_0_m33s_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM55_0_m33s_allocatable_shared_OFFSET = 0x000FD000;
+define exported symbol CYMEM_CM55_0_m33s_allocatable_shared_sel_START = CYMEM_CM55_0_m33s_allocatable_shared_START;
+define exported symbol CYMEM_CM55_0_m33_allocatable_shared_START = 0x240FE000;
+define exported symbol CYMEM_CM55_0_m33_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM55_0_m33_allocatable_shared_OFFSET = 0x000FE000;
+define exported symbol CYMEM_CM55_0_m33_allocatable_shared_sel_START = CYMEM_CM55_0_m33_allocatable_shared_START;
+define exported symbol CYMEM_CM55_0_m55_allocatable_shared_START = 0x240FF000;
+define exported symbol CYMEM_CM55_0_m55_allocatable_shared_SIZE = 0x00001000;
+define exported symbol CYMEM_CM55_0_m55_allocatable_shared_OFFSET = 0x000FF000;
+define exported symbol CYMEM_CM55_0_m55_allocatable_shared_sel_START = CYMEM_CM55_0_m55_allocatable_shared_START;
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM33_0.icf b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM33_0.icf
new file mode 100644
index 00000000000..02a1d18cad3
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM33_0.icf
@@ -0,0 +1,66 @@
+// This file is automatically generated.
+// define memory with size = 4G;
+define region m55_data = [from CYMEM_CM33_0_m55_data_START size CYMEM_CM33_0_m55_data_SIZE];
+define region m55_data_sel = [from CYMEM_CM33_0_m55_data_START size CYMEM_CM33_0_m55_data_SIZE];
+define region m55_code = [from CYMEM_CM33_0_m55_code_START size CYMEM_CM33_0_m55_code_SIZE];
+define region m55_code_sel = [from CYMEM_CM33_0_m55_code_START size CYMEM_CM33_0_m55_code_SIZE];
+define region user_programmable = [from CYMEM_CM33_0_user_programmable_START size CYMEM_CM33_0_user_programmable_SIZE];
+define region user_programmable_C = [from CYMEM_CM33_0_user_programmable_C_START size CYMEM_CM33_0_user_programmable_SIZE];
+define region user_programmable_sel = [from CYMEM_CM33_0_user_programmable_C_START size CYMEM_CM33_0_user_programmable_SIZE];
+define region user_nvm = [from CYMEM_CM33_0_user_nvm_START size CYMEM_CM33_0_user_nvm_SIZE];
+define region user_nvm_C = [from CYMEM_CM33_0_user_nvm_C_START size CYMEM_CM33_0_user_nvm_SIZE];
+define region user_nvm_sel = [from CYMEM_CM33_0_user_nvm_C_START size CYMEM_CM33_0_user_nvm_SIZE];
+define region m33s_nvm = [from CYMEM_CM33_0_m33s_nvm_START size CYMEM_CM33_0_m33s_nvm_SIZE];
+define region m33s_nvm_C = [from CYMEM_CM33_0_m33s_nvm_C_START size CYMEM_CM33_0_m33s_nvm_SIZE];
+define region m33s_nvm_sel = [from CYMEM_CM33_0_m33s_nvm_C_START size CYMEM_CM33_0_m33s_nvm_SIZE];
+define region m33s_trailer = [from CYMEM_CM33_0_m33s_trailer_START size CYMEM_CM33_0_m33s_trailer_SIZE];
+define region m33s_trailer_C = [from CYMEM_CM33_0_m33s_trailer_C_START size CYMEM_CM33_0_m33s_trailer_SIZE];
+define region m33s_trailer_sel = [from CYMEM_CM33_0_m33s_trailer_C_START size CYMEM_CM33_0_m33s_trailer_SIZE];
+define region m33_nvm = [from CYMEM_CM33_0_m33_nvm_START size CYMEM_CM33_0_m33_nvm_SIZE];
+define region m33_nvm_C = [from CYMEM_CM33_0_m33_nvm_C_START size CYMEM_CM33_0_m33_nvm_SIZE];
+define region m33_nvm_sel = [from CYMEM_CM33_0_m33_nvm_C_START size CYMEM_CM33_0_m33_nvm_SIZE];
+define region m33_trailer = [from CYMEM_CM33_0_m33_trailer_START size CYMEM_CM33_0_m33_trailer_SIZE];
+define region m33_trailer_C = [from CYMEM_CM33_0_m33_trailer_C_START size CYMEM_CM33_0_m33_trailer_SIZE];
+define region m33_trailer_sel = [from CYMEM_CM33_0_m33_trailer_C_START size CYMEM_CM33_0_m33_trailer_SIZE];
+define region m55_nvm = [from CYMEM_CM33_0_m55_nvm_START size CYMEM_CM33_0_m55_nvm_SIZE];
+define region m55_nvm_C = [from CYMEM_CM33_0_m55_nvm_C_START size CYMEM_CM33_0_m55_nvm_SIZE];
+define region m55_nvm_sel = [from CYMEM_CM33_0_m55_nvm_C_START size CYMEM_CM33_0_m55_nvm_SIZE];
+define region m55_trailer = [from CYMEM_CM33_0_m55_trailer_START size CYMEM_CM33_0_m55_trailer_SIZE];
+define region m55_trailer_C = [from CYMEM_CM33_0_m55_trailer_C_START size CYMEM_CM33_0_m55_trailer_SIZE];
+define region m55_trailer_sel = [from CYMEM_CM33_0_m55_trailer_C_START size CYMEM_CM33_0_m55_trailer_SIZE];
+define region m55_code_secondary = [from CYMEM_CM33_0_m55_code_secondary_START size CYMEM_CM33_0_m55_code_secondary_SIZE];
+define region m55_code_secondary_C = [from CYMEM_CM33_0_m55_code_secondary_C_START size CYMEM_CM33_0_m55_code_secondary_SIZE];
+define region m55_code_secondary_sel = [from CYMEM_CM33_0_m55_code_secondary_C_START size CYMEM_CM33_0_m55_code_secondary_SIZE];
+define region m55_data_secondary = [from CYMEM_CM33_0_m55_data_secondary_START size CYMEM_CM33_0_m55_data_secondary_SIZE];
+define region m55_data_secondary_C = [from CYMEM_CM33_0_m55_data_secondary_C_START size CYMEM_CM33_0_m55_data_secondary_SIZE];
+define region m55_data_secondary_sel = [from CYMEM_CM33_0_m55_data_secondary_C_START size CYMEM_CM33_0_m55_data_secondary_SIZE];
+define region m33_m55_shared = [from CYMEM_CM33_0_m33_m55_shared_START size CYMEM_CM33_0_m33_m55_shared_SIZE];
+define region m33_m55_shared_C = [from CYMEM_CM33_0_m33_m55_shared_C_START size CYMEM_CM33_0_m33_m55_shared_SIZE];
+define region m33_m55_shared_sel = [from CYMEM_CM33_0_m33_m55_shared_C_START size CYMEM_CM33_0_m33_m55_shared_SIZE];
+define region gfx_mem = [from CYMEM_CM33_0_gfx_mem_START size CYMEM_CM33_0_gfx_mem_SIZE];
+define region gfx_mem_C = [from CYMEM_CM33_0_gfx_mem_C_START size CYMEM_CM33_0_gfx_mem_SIZE];
+define region gfx_mem_sel = [from CYMEM_CM33_0_gfx_mem_C_START size CYMEM_CM33_0_gfx_mem_SIZE];
+define region m33s_shared = [from CYMEM_CM33_0_m33s_shared_START size CYMEM_CM33_0_m33s_shared_SIZE];
+define region m33s_shared_C = [from CYMEM_CM33_0_m33s_shared_C_START size CYMEM_CM33_0_m33s_shared_SIZE];
+define region m33s_shared_sel = [from CYMEM_CM33_0_m33s_shared_C_START size CYMEM_CM33_0_m33s_shared_SIZE];
+define region m33s_code = [from CYMEM_CM33_0_m33s_code_START size CYMEM_CM33_0_m33s_code_SIZE];
+define region m33s_code_C = [from CYMEM_CM33_0_m33s_code_C_START size CYMEM_CM33_0_m33s_code_SIZE];
+define region m33s_code_sel = [from CYMEM_CM33_0_m33s_code_C_START size CYMEM_CM33_0_m33s_code_SIZE];
+define region m33s_data = [from CYMEM_CM33_0_m33s_data_START size CYMEM_CM33_0_m33s_data_SIZE];
+define region m33s_data_C = [from CYMEM_CM33_0_m33s_data_C_START size CYMEM_CM33_0_m33s_data_SIZE];
+define region m33s_data_sel = [from CYMEM_CM33_0_m33s_data_C_START size CYMEM_CM33_0_m33s_data_SIZE];
+define region m33_code = [from CYMEM_CM33_0_m33_code_START size CYMEM_CM33_0_m33_code_SIZE];
+define region m33_code_C = [from CYMEM_CM33_0_m33_code_C_START size CYMEM_CM33_0_m33_code_SIZE];
+define region m33_code_sel = [from CYMEM_CM33_0_m33_code_C_START size CYMEM_CM33_0_m33_code_SIZE];
+define region m33_data = [from CYMEM_CM33_0_m33_data_START size CYMEM_CM33_0_m33_data_SIZE];
+define region m33_data_C = [from CYMEM_CM33_0_m33_data_C_START size CYMEM_CM33_0_m33_data_SIZE];
+define region m33_data_sel = [from CYMEM_CM33_0_m33_data_C_START size CYMEM_CM33_0_m33_data_SIZE];
+define region m33s_allocatable_shared = [from CYMEM_CM33_0_m33s_allocatable_shared_START size CYMEM_CM33_0_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_C = [from CYMEM_CM33_0_m33s_allocatable_shared_C_START size CYMEM_CM33_0_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_sel = [from CYMEM_CM33_0_m33s_allocatable_shared_C_START size CYMEM_CM33_0_m33s_allocatable_shared_SIZE];
+define region m33_allocatable_shared = [from CYMEM_CM33_0_m33_allocatable_shared_START size CYMEM_CM33_0_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_C = [from CYMEM_CM33_0_m33_allocatable_shared_C_START size CYMEM_CM33_0_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_sel = [from CYMEM_CM33_0_m33_allocatable_shared_C_START size CYMEM_CM33_0_m33_allocatable_shared_SIZE];
+define region m55_allocatable_shared = [from CYMEM_CM33_0_m55_allocatable_shared_START size CYMEM_CM33_0_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_C = [from CYMEM_CM33_0_m55_allocatable_shared_C_START size CYMEM_CM33_0_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_sel = [from CYMEM_CM33_0_m55_allocatable_shared_C_START size CYMEM_CM33_0_m55_allocatable_shared_SIZE];
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM33_0_S.icf b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM33_0_S.icf
new file mode 100644
index 00000000000..ed4864e728b
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM33_0_S.icf
@@ -0,0 +1,130 @@
+// This file is automatically generated.
+// define memory with size = 4G;
+define region m55_data = [from CYMEM_CM33_0_S_m55_data_START size CYMEM_CM33_0_S_m55_data_SIZE];
+define region m55_data_S = [from CYMEM_CM33_0_S_m55_data_S_START size CYMEM_CM33_0_S_m55_data_SIZE];
+define region m55_data_sel = [from CYMEM_CM33_0_S_m55_data_START size CYMEM_CM33_0_S_m55_data_SIZE];
+define region m55_data_sel_S = [from CYMEM_CM33_0_S_m55_data_S_START size CYMEM_CM33_0_S_m55_data_SIZE];
+define region m55_code = [from CYMEM_CM33_0_S_m55_code_START size CYMEM_CM33_0_S_m55_code_SIZE];
+define region m55_code_S = [from CYMEM_CM33_0_S_m55_code_S_START size CYMEM_CM33_0_S_m55_code_SIZE];
+define region m55_code_sel = [from CYMEM_CM33_0_S_m55_code_START size CYMEM_CM33_0_S_m55_code_SIZE];
+define region m55_code_sel_S = [from CYMEM_CM33_0_S_m55_code_S_START size CYMEM_CM33_0_S_m55_code_SIZE];
+define region user_programmable = [from CYMEM_CM33_0_S_user_programmable_START size CYMEM_CM33_0_S_user_programmable_SIZE];
+define region user_programmable_C = [from CYMEM_CM33_0_S_user_programmable_C_START size CYMEM_CM33_0_S_user_programmable_SIZE];
+define region user_programmable_C_S = [from CYMEM_CM33_0_S_user_programmable_C_S_START size CYMEM_CM33_0_S_user_programmable_SIZE];
+define region user_programmable_S = [from CYMEM_CM33_0_S_user_programmable_S_START size CYMEM_CM33_0_S_user_programmable_SIZE];
+define region user_programmable_sel = [from CYMEM_CM33_0_S_user_programmable_C_START size CYMEM_CM33_0_S_user_programmable_SIZE];
+define region user_programmable_sel_S = [from CYMEM_CM33_0_S_user_programmable_C_S_START size CYMEM_CM33_0_S_user_programmable_SIZE];
+define region user_nvm = [from CYMEM_CM33_0_S_user_nvm_START size CYMEM_CM33_0_S_user_nvm_SIZE];
+define region user_nvm_C = [from CYMEM_CM33_0_S_user_nvm_C_START size CYMEM_CM33_0_S_user_nvm_SIZE];
+define region user_nvm_C_S = [from CYMEM_CM33_0_S_user_nvm_C_S_START size CYMEM_CM33_0_S_user_nvm_SIZE];
+define region user_nvm_S = [from CYMEM_CM33_0_S_user_nvm_S_START size CYMEM_CM33_0_S_user_nvm_SIZE];
+define region user_nvm_sel = [from CYMEM_CM33_0_S_user_nvm_C_START size CYMEM_CM33_0_S_user_nvm_SIZE];
+define region user_nvm_sel_S = [from CYMEM_CM33_0_S_user_nvm_C_S_START size CYMEM_CM33_0_S_user_nvm_SIZE];
+define region m33s_nvm = [from CYMEM_CM33_0_S_m33s_nvm_START size CYMEM_CM33_0_S_m33s_nvm_SIZE];
+define region m33s_nvm_C = [from CYMEM_CM33_0_S_m33s_nvm_C_START size CYMEM_CM33_0_S_m33s_nvm_SIZE];
+define region m33s_nvm_C_S = [from CYMEM_CM33_0_S_m33s_nvm_C_S_START size CYMEM_CM33_0_S_m33s_nvm_SIZE];
+define region m33s_nvm_S = [from CYMEM_CM33_0_S_m33s_nvm_S_START size CYMEM_CM33_0_S_m33s_nvm_SIZE];
+define region m33s_nvm_sel = [from CYMEM_CM33_0_S_m33s_nvm_C_START size CYMEM_CM33_0_S_m33s_nvm_SIZE];
+define region m33s_nvm_sel_S = [from CYMEM_CM33_0_S_m33s_nvm_C_S_START size CYMEM_CM33_0_S_m33s_nvm_SIZE];
+define region m33s_trailer = [from CYMEM_CM33_0_S_m33s_trailer_START size CYMEM_CM33_0_S_m33s_trailer_SIZE];
+define region m33s_trailer_C = [from CYMEM_CM33_0_S_m33s_trailer_C_START size CYMEM_CM33_0_S_m33s_trailer_SIZE];
+define region m33s_trailer_C_S = [from CYMEM_CM33_0_S_m33s_trailer_C_S_START size CYMEM_CM33_0_S_m33s_trailer_SIZE];
+define region m33s_trailer_S = [from CYMEM_CM33_0_S_m33s_trailer_S_START size CYMEM_CM33_0_S_m33s_trailer_SIZE];
+define region m33s_trailer_sel = [from CYMEM_CM33_0_S_m33s_trailer_C_START size CYMEM_CM33_0_S_m33s_trailer_SIZE];
+define region m33s_trailer_sel_S = [from CYMEM_CM33_0_S_m33s_trailer_C_S_START size CYMEM_CM33_0_S_m33s_trailer_SIZE];
+define region m33_nvm = [from CYMEM_CM33_0_S_m33_nvm_START size CYMEM_CM33_0_S_m33_nvm_SIZE];
+define region m33_nvm_C = [from CYMEM_CM33_0_S_m33_nvm_C_START size CYMEM_CM33_0_S_m33_nvm_SIZE];
+define region m33_nvm_C_S = [from CYMEM_CM33_0_S_m33_nvm_C_S_START size CYMEM_CM33_0_S_m33_nvm_SIZE];
+define region m33_nvm_S = [from CYMEM_CM33_0_S_m33_nvm_S_START size CYMEM_CM33_0_S_m33_nvm_SIZE];
+define region m33_nvm_sel = [from CYMEM_CM33_0_S_m33_nvm_C_START size CYMEM_CM33_0_S_m33_nvm_SIZE];
+define region m33_nvm_sel_S = [from CYMEM_CM33_0_S_m33_nvm_C_S_START size CYMEM_CM33_0_S_m33_nvm_SIZE];
+define region m33_trailer = [from CYMEM_CM33_0_S_m33_trailer_START size CYMEM_CM33_0_S_m33_trailer_SIZE];
+define region m33_trailer_C = [from CYMEM_CM33_0_S_m33_trailer_C_START size CYMEM_CM33_0_S_m33_trailer_SIZE];
+define region m33_trailer_C_S = [from CYMEM_CM33_0_S_m33_trailer_C_S_START size CYMEM_CM33_0_S_m33_trailer_SIZE];
+define region m33_trailer_S = [from CYMEM_CM33_0_S_m33_trailer_S_START size CYMEM_CM33_0_S_m33_trailer_SIZE];
+define region m33_trailer_sel = [from CYMEM_CM33_0_S_m33_trailer_C_START size CYMEM_CM33_0_S_m33_trailer_SIZE];
+define region m33_trailer_sel_S = [from CYMEM_CM33_0_S_m33_trailer_C_S_START size CYMEM_CM33_0_S_m33_trailer_SIZE];
+define region m55_nvm = [from CYMEM_CM33_0_S_m55_nvm_START size CYMEM_CM33_0_S_m55_nvm_SIZE];
+define region m55_nvm_C = [from CYMEM_CM33_0_S_m55_nvm_C_START size CYMEM_CM33_0_S_m55_nvm_SIZE];
+define region m55_nvm_C_S = [from CYMEM_CM33_0_S_m55_nvm_C_S_START size CYMEM_CM33_0_S_m55_nvm_SIZE];
+define region m55_nvm_S = [from CYMEM_CM33_0_S_m55_nvm_S_START size CYMEM_CM33_0_S_m55_nvm_SIZE];
+define region m55_nvm_sel = [from CYMEM_CM33_0_S_m55_nvm_C_START size CYMEM_CM33_0_S_m55_nvm_SIZE];
+define region m55_nvm_sel_S = [from CYMEM_CM33_0_S_m55_nvm_C_S_START size CYMEM_CM33_0_S_m55_nvm_SIZE];
+define region m55_trailer = [from CYMEM_CM33_0_S_m55_trailer_START size CYMEM_CM33_0_S_m55_trailer_SIZE];
+define region m55_trailer_C = [from CYMEM_CM33_0_S_m55_trailer_C_START size CYMEM_CM33_0_S_m55_trailer_SIZE];
+define region m55_trailer_C_S = [from CYMEM_CM33_0_S_m55_trailer_C_S_START size CYMEM_CM33_0_S_m55_trailer_SIZE];
+define region m55_trailer_S = [from CYMEM_CM33_0_S_m55_trailer_S_START size CYMEM_CM33_0_S_m55_trailer_SIZE];
+define region m55_trailer_sel = [from CYMEM_CM33_0_S_m55_trailer_C_START size CYMEM_CM33_0_S_m55_trailer_SIZE];
+define region m55_trailer_sel_S = [from CYMEM_CM33_0_S_m55_trailer_C_S_START size CYMEM_CM33_0_S_m55_trailer_SIZE];
+define region m55_code_secondary = [from CYMEM_CM33_0_S_m55_code_secondary_START size CYMEM_CM33_0_S_m55_code_secondary_SIZE];
+define region m55_code_secondary_C = [from CYMEM_CM33_0_S_m55_code_secondary_C_START size CYMEM_CM33_0_S_m55_code_secondary_SIZE];
+define region m55_code_secondary_C_S = [from CYMEM_CM33_0_S_m55_code_secondary_C_S_START size CYMEM_CM33_0_S_m55_code_secondary_SIZE];
+define region m55_code_secondary_S = [from CYMEM_CM33_0_S_m55_code_secondary_S_START size CYMEM_CM33_0_S_m55_code_secondary_SIZE];
+define region m55_code_secondary_sel = [from CYMEM_CM33_0_S_m55_code_secondary_C_START size CYMEM_CM33_0_S_m55_code_secondary_SIZE];
+define region m55_code_secondary_sel_S = [from CYMEM_CM33_0_S_m55_code_secondary_C_S_START size CYMEM_CM33_0_S_m55_code_secondary_SIZE];
+define region m55_data_secondary = [from CYMEM_CM33_0_S_m55_data_secondary_START size CYMEM_CM33_0_S_m55_data_secondary_SIZE];
+define region m55_data_secondary_C = [from CYMEM_CM33_0_S_m55_data_secondary_C_START size CYMEM_CM33_0_S_m55_data_secondary_SIZE];
+define region m55_data_secondary_C_S = [from CYMEM_CM33_0_S_m55_data_secondary_C_S_START size CYMEM_CM33_0_S_m55_data_secondary_SIZE];
+define region m55_data_secondary_S = [from CYMEM_CM33_0_S_m55_data_secondary_S_START size CYMEM_CM33_0_S_m55_data_secondary_SIZE];
+define region m55_data_secondary_sel = [from CYMEM_CM33_0_S_m55_data_secondary_C_START size CYMEM_CM33_0_S_m55_data_secondary_SIZE];
+define region m55_data_secondary_sel_S = [from CYMEM_CM33_0_S_m55_data_secondary_C_S_START size CYMEM_CM33_0_S_m55_data_secondary_SIZE];
+define region m33_m55_shared = [from CYMEM_CM33_0_S_m33_m55_shared_START size CYMEM_CM33_0_S_m33_m55_shared_SIZE];
+define region m33_m55_shared_C = [from CYMEM_CM33_0_S_m33_m55_shared_C_START size CYMEM_CM33_0_S_m33_m55_shared_SIZE];
+define region m33_m55_shared_C_S = [from CYMEM_CM33_0_S_m33_m55_shared_C_S_START size CYMEM_CM33_0_S_m33_m55_shared_SIZE];
+define region m33_m55_shared_S = [from CYMEM_CM33_0_S_m33_m55_shared_S_START size CYMEM_CM33_0_S_m33_m55_shared_SIZE];
+define region m33_m55_shared_sel = [from CYMEM_CM33_0_S_m33_m55_shared_C_START size CYMEM_CM33_0_S_m33_m55_shared_SIZE];
+define region m33_m55_shared_sel_S = [from CYMEM_CM33_0_S_m33_m55_shared_C_S_START size CYMEM_CM33_0_S_m33_m55_shared_SIZE];
+define region gfx_mem = [from CYMEM_CM33_0_S_gfx_mem_START size CYMEM_CM33_0_S_gfx_mem_SIZE];
+define region gfx_mem_C = [from CYMEM_CM33_0_S_gfx_mem_C_START size CYMEM_CM33_0_S_gfx_mem_SIZE];
+define region gfx_mem_C_S = [from CYMEM_CM33_0_S_gfx_mem_C_S_START size CYMEM_CM33_0_S_gfx_mem_SIZE];
+define region gfx_mem_S = [from CYMEM_CM33_0_S_gfx_mem_S_START size CYMEM_CM33_0_S_gfx_mem_SIZE];
+define region gfx_mem_sel = [from CYMEM_CM33_0_S_gfx_mem_C_START size CYMEM_CM33_0_S_gfx_mem_SIZE];
+define region gfx_mem_sel_S = [from CYMEM_CM33_0_S_gfx_mem_C_S_START size CYMEM_CM33_0_S_gfx_mem_SIZE];
+define region m33s_shared = [from CYMEM_CM33_0_S_m33s_shared_START size CYMEM_CM33_0_S_m33s_shared_SIZE];
+define region m33s_shared_C = [from CYMEM_CM33_0_S_m33s_shared_C_START size CYMEM_CM33_0_S_m33s_shared_SIZE];
+define region m33s_shared_C_S = [from CYMEM_CM33_0_S_m33s_shared_C_S_START size CYMEM_CM33_0_S_m33s_shared_SIZE];
+define region m33s_shared_S = [from CYMEM_CM33_0_S_m33s_shared_S_START size CYMEM_CM33_0_S_m33s_shared_SIZE];
+define region m33s_shared_sel = [from CYMEM_CM33_0_S_m33s_shared_C_START size CYMEM_CM33_0_S_m33s_shared_SIZE];
+define region m33s_shared_sel_S = [from CYMEM_CM33_0_S_m33s_shared_C_S_START size CYMEM_CM33_0_S_m33s_shared_SIZE];
+define region m33s_code = [from CYMEM_CM33_0_S_m33s_code_START size CYMEM_CM33_0_S_m33s_code_SIZE];
+define region m33s_code_C = [from CYMEM_CM33_0_S_m33s_code_C_START size CYMEM_CM33_0_S_m33s_code_SIZE];
+define region m33s_code_C_S = [from CYMEM_CM33_0_S_m33s_code_C_S_START size CYMEM_CM33_0_S_m33s_code_SIZE];
+define region m33s_code_S = [from CYMEM_CM33_0_S_m33s_code_S_START size CYMEM_CM33_0_S_m33s_code_SIZE];
+define region m33s_code_sel = [from CYMEM_CM33_0_S_m33s_code_C_START size CYMEM_CM33_0_S_m33s_code_SIZE];
+define region m33s_code_sel_S = [from CYMEM_CM33_0_S_m33s_code_C_S_START size CYMEM_CM33_0_S_m33s_code_SIZE];
+define region m33s_data = [from CYMEM_CM33_0_S_m33s_data_START size CYMEM_CM33_0_S_m33s_data_SIZE];
+define region m33s_data_C = [from CYMEM_CM33_0_S_m33s_data_C_START size CYMEM_CM33_0_S_m33s_data_SIZE];
+define region m33s_data_C_S = [from CYMEM_CM33_0_S_m33s_data_C_S_START size CYMEM_CM33_0_S_m33s_data_SIZE];
+define region m33s_data_S = [from CYMEM_CM33_0_S_m33s_data_S_START size CYMEM_CM33_0_S_m33s_data_SIZE];
+define region m33s_data_sel = [from CYMEM_CM33_0_S_m33s_data_C_START size CYMEM_CM33_0_S_m33s_data_SIZE];
+define region m33s_data_sel_S = [from CYMEM_CM33_0_S_m33s_data_C_S_START size CYMEM_CM33_0_S_m33s_data_SIZE];
+define region m33_code = [from CYMEM_CM33_0_S_m33_code_START size CYMEM_CM33_0_S_m33_code_SIZE];
+define region m33_code_C = [from CYMEM_CM33_0_S_m33_code_C_START size CYMEM_CM33_0_S_m33_code_SIZE];
+define region m33_code_C_S = [from CYMEM_CM33_0_S_m33_code_C_S_START size CYMEM_CM33_0_S_m33_code_SIZE];
+define region m33_code_S = [from CYMEM_CM33_0_S_m33_code_S_START size CYMEM_CM33_0_S_m33_code_SIZE];
+define region m33_code_sel = [from CYMEM_CM33_0_S_m33_code_C_START size CYMEM_CM33_0_S_m33_code_SIZE];
+define region m33_code_sel_S = [from CYMEM_CM33_0_S_m33_code_C_S_START size CYMEM_CM33_0_S_m33_code_SIZE];
+define region m33_data = [from CYMEM_CM33_0_S_m33_data_START size CYMEM_CM33_0_S_m33_data_SIZE];
+define region m33_data_C = [from CYMEM_CM33_0_S_m33_data_C_START size CYMEM_CM33_0_S_m33_data_SIZE];
+define region m33_data_C_S = [from CYMEM_CM33_0_S_m33_data_C_S_START size CYMEM_CM33_0_S_m33_data_SIZE];
+define region m33_data_S = [from CYMEM_CM33_0_S_m33_data_S_START size CYMEM_CM33_0_S_m33_data_SIZE];
+define region m33_data_sel = [from CYMEM_CM33_0_S_m33_data_C_START size CYMEM_CM33_0_S_m33_data_SIZE];
+define region m33_data_sel_S = [from CYMEM_CM33_0_S_m33_data_C_S_START size CYMEM_CM33_0_S_m33_data_SIZE];
+define region m33s_allocatable_shared = [from CYMEM_CM33_0_S_m33s_allocatable_shared_START size CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_C = [from CYMEM_CM33_0_S_m33s_allocatable_shared_C_START size CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_C_S = [from CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START size CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_S = [from CYMEM_CM33_0_S_m33s_allocatable_shared_S_START size CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_sel = [from CYMEM_CM33_0_S_m33s_allocatable_shared_C_START size CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_sel_S = [from CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START size CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE];
+define region m33_allocatable_shared = [from CYMEM_CM33_0_S_m33_allocatable_shared_START size CYMEM_CM33_0_S_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_C = [from CYMEM_CM33_0_S_m33_allocatable_shared_C_START size CYMEM_CM33_0_S_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_C_S = [from CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START size CYMEM_CM33_0_S_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_S = [from CYMEM_CM33_0_S_m33_allocatable_shared_S_START size CYMEM_CM33_0_S_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_sel = [from CYMEM_CM33_0_S_m33_allocatable_shared_C_START size CYMEM_CM33_0_S_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_sel_S = [from CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START size CYMEM_CM33_0_S_m33_allocatable_shared_SIZE];
+define region m55_allocatable_shared = [from CYMEM_CM33_0_S_m55_allocatable_shared_START size CYMEM_CM33_0_S_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_C = [from CYMEM_CM33_0_S_m55_allocatable_shared_C_START size CYMEM_CM33_0_S_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_C_S = [from CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START size CYMEM_CM33_0_S_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_S = [from CYMEM_CM33_0_S_m55_allocatable_shared_S_START size CYMEM_CM33_0_S_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_sel = [from CYMEM_CM33_0_S_m55_allocatable_shared_C_START size CYMEM_CM33_0_S_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_sel_S = [from CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START size CYMEM_CM33_0_S_m55_allocatable_shared_SIZE];
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM55_0.icf b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM55_0.icf
new file mode 100644
index 00000000000..6f005ef80b7
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_ilinkarm_regions_CM55_0.icf
@@ -0,0 +1,28 @@
+// This file is automatically generated.
+// define memory with size = 4G;
+define region m55_data_INTERNAL = [from CYMEM_CM55_0_m55_data_INTERNAL_START size CYMEM_CM55_0_m55_data_SIZE];
+define region m55_data_sel = [from CYMEM_CM55_0_m55_data_INTERNAL_START size CYMEM_CM55_0_m55_data_SIZE];
+define region m55_code_INTERNAL = [from CYMEM_CM55_0_m55_code_INTERNAL_START size CYMEM_CM55_0_m55_code_SIZE];
+define region m55_code_sel = [from CYMEM_CM55_0_m55_code_INTERNAL_START size CYMEM_CM55_0_m55_code_SIZE];
+define region user_nvm_C = [from CYMEM_CM55_0_user_nvm_C_START size CYMEM_CM55_0_user_nvm_SIZE];
+define region user_nvm_sel = [from CYMEM_CM55_0_user_nvm_C_START size CYMEM_CM55_0_user_nvm_SIZE];
+define region m55_nvm = [from CYMEM_CM55_0_m55_nvm_START size CYMEM_CM55_0_m55_nvm_SIZE];
+define region m55_nvm_sel = [from CYMEM_CM55_0_m55_nvm_START size CYMEM_CM55_0_m55_nvm_SIZE];
+define region m55_trailer = [from CYMEM_CM55_0_m55_trailer_START size CYMEM_CM55_0_m55_trailer_SIZE];
+define region m55_trailer_sel = [from CYMEM_CM55_0_m55_trailer_START size CYMEM_CM55_0_m55_trailer_SIZE];
+define region m55_code_secondary = [from CYMEM_CM55_0_m55_code_secondary_START size CYMEM_CM55_0_m55_code_secondary_SIZE];
+define region m55_code_secondary_sel = [from CYMEM_CM55_0_m55_code_secondary_START size CYMEM_CM55_0_m55_code_secondary_SIZE];
+define region m55_data_secondary = [from CYMEM_CM55_0_m55_data_secondary_START size CYMEM_CM55_0_m55_data_secondary_SIZE];
+define region m55_data_secondary_sel = [from CYMEM_CM55_0_m55_data_secondary_START size CYMEM_CM55_0_m55_data_secondary_SIZE];
+define region m33_m55_shared = [from CYMEM_CM55_0_m33_m55_shared_START size CYMEM_CM55_0_m33_m55_shared_SIZE];
+define region m33_m55_shared_sel = [from CYMEM_CM55_0_m33_m55_shared_START size CYMEM_CM55_0_m33_m55_shared_SIZE];
+define region gfx_mem = [from CYMEM_CM55_0_gfx_mem_START size CYMEM_CM55_0_gfx_mem_SIZE];
+define region gfx_mem_sel = [from CYMEM_CM55_0_gfx_mem_START size CYMEM_CM55_0_gfx_mem_SIZE];
+define region m33_data = [from CYMEM_CM55_0_m33_data_START size CYMEM_CM55_0_m33_data_SIZE];
+define region m33_data_sel = [from CYMEM_CM55_0_m33_data_START size CYMEM_CM55_0_m33_data_SIZE];
+define region m33s_allocatable_shared = [from CYMEM_CM55_0_m33s_allocatable_shared_START size CYMEM_CM55_0_m33s_allocatable_shared_SIZE];
+define region m33s_allocatable_shared_sel = [from CYMEM_CM55_0_m33s_allocatable_shared_START size CYMEM_CM55_0_m33s_allocatable_shared_SIZE];
+define region m33_allocatable_shared = [from CYMEM_CM55_0_m33_allocatable_shared_START size CYMEM_CM55_0_m33_allocatable_shared_SIZE];
+define region m33_allocatable_shared_sel = [from CYMEM_CM55_0_m33_allocatable_shared_START size CYMEM_CM55_0_m33_allocatable_shared_SIZE];
+define region m55_allocatable_shared = [from CYMEM_CM55_0_m55_allocatable_shared_START size CYMEM_CM55_0_m55_allocatable_shared_SIZE];
+define region m55_allocatable_shared_sel = [from CYMEM_CM55_0_m55_allocatable_shared_START size CYMEM_CM55_0_m55_allocatable_shared_SIZE];
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_memory_locations.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_memory_locations.h
new file mode 100644
index 00000000000..98968fda7cc
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_memory_locations.h
@@ -0,0 +1,65 @@
+/* This file is automatically generated. */
+#if !defined(CYMEM_MEMORY_LOCATIONS_H)
+#define CYMEM_MEMORY_LOCATIONS_H
+
+#include "cymem_memory_types.h"
+
+#define CYMEM_CM33_0_S_m55_data_LOCATION IFX_MEMORY_TYPE_CM55_DTCM_INTERNAL
+#define CYMEM_CM33_0_S_m55_code_LOCATION IFX_MEMORY_TYPE_CM55_ITCM_INTERNAL
+#define CYMEM_CM33_0_S_user_programmable_LOCATION IFX_MEMORY_TYPE_RRAM
+#define CYMEM_CM33_0_S_user_nvm_LOCATION IFX_MEMORY_TYPE_RRAM
+#define CYMEM_CM33_0_S_m33s_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_S_m33s_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_S_m33_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_S_m33_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_S_m55_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_S_m55_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_S_m55_code_secondary_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_S_m55_data_secondary_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_S_m33_m55_shared_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_S_gfx_mem_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_S_m33s_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m33s_code_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m33s_data_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m33_code_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m33_data_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m33s_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m33_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_S_m55_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m55_data_LOCATION IFX_MEMORY_TYPE_CM55_DTCM_INTERNAL
+#define CYMEM_CM33_0_m55_code_LOCATION IFX_MEMORY_TYPE_CM55_ITCM_INTERNAL
+#define CYMEM_CM33_0_user_programmable_LOCATION IFX_MEMORY_TYPE_RRAM
+#define CYMEM_CM33_0_user_nvm_LOCATION IFX_MEMORY_TYPE_RRAM
+#define CYMEM_CM33_0_m33s_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_m33s_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_m33_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_m33_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_m55_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_m55_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM33_0_m55_code_secondary_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_m55_data_secondary_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_m33_m55_shared_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_gfx_mem_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM33_0_m33s_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m33s_code_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m33s_data_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m33_code_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m33_data_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m33s_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m33_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM33_0_m55_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM55_0_m55_data_LOCATION IFX_MEMORY_TYPE_CM55_DTCM_INTERNAL
+#define CYMEM_CM55_0_m55_code_LOCATION IFX_MEMORY_TYPE_CM55_ITCM_INTERNAL
+#define CYMEM_CM55_0_user_nvm_LOCATION IFX_MEMORY_TYPE_RRAM
+#define CYMEM_CM55_0_m55_nvm_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM55_0_m55_trailer_LOCATION IFX_MEMORY_TYPE_SMIF0MEM1
+#define CYMEM_CM55_0_m55_code_secondary_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM55_0_m55_data_secondary_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM55_0_m33_m55_shared_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM55_0_gfx_mem_LOCATION IFX_MEMORY_TYPE_SOCMEM_RAM
+#define CYMEM_CM55_0_m33_data_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM55_0_m33s_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM55_0_m33_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+#define CYMEM_CM55_0_m55_allocatable_shared_LOCATION IFX_MEMORY_TYPE_SRAM
+
+#endif /* CYMEM_MEMORY_LOCATIONS_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_memory_types.h b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_memory_types.h
new file mode 100644
index 00000000000..4ce5bace422
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/cymem_memory_types.h
@@ -0,0 +1,17 @@
+/* This file is automatically generated. */
+#if !defined(CYMEM_MEMORY_TYPES_H)
+#define CYMEM_MEMORY_TYPES_H
+
+#define IFX_MEMORY_TYPE_CM55_DTCM_INTERNAL (0)
+#define IFX_MEMORY_TYPE_CM55_ITCM_INTERNAL (1)
+#define IFX_MEMORY_TYPE_RRAM (2)
+#define IFX_MEMORY_TYPE_SMIF0MEM1 (3)
+#define IFX_MEMORY_TYPE_SOCMEM_RAM (4)
+#define IFX_MEMORY_TYPE_SRAM (5)
+
+#define IS_SMIF_MEMORY(mem) ( \
+ (mem == IFX_MEMORY_TYPE_SMIF0MEM1) ? 1 : \
+ 0 \
+ )
+
+#endif /* CYMEM_MEMORY_TYPES_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/design.cyqspi.memory-export b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/design.cyqspi.memory-export
new file mode 100644
index 00000000000..f01aa8338b1
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/design.cyqspi.memory-export
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Executable
+ Readable
+ Programmable
+ Nonvolatile
+
+
+
+
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/device_mem.json b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/device_mem.json
new file mode 100644
index 00000000000..04b3036c628
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/device_mem.json
@@ -0,0 +1,43 @@
+{
+ "version" : 1.0,
+ "memoryData" :
+ {
+ "physical" :
+ [
+ { "name" : "CM55_DTCM_INTERNAL", "size" : "0x00040000", "start" : [ "0x48040000", "0x58040000", "0x20000000" ] },
+ { "name" : "CM55_ITCM_INTERNAL", "size" : "0x00040000", "start" : [ "0x48000000", "0x58000000", "0x00000000" ] },
+ { "name" : "RRAM", "size" : "0x00080000", "start" : [ "0x22000000", "0x02000000", "0x12000000", "0x32000000" ] },
+ { "name" : "SMIF0MEM1", "size" : "0x04000000", "start" : [ "0x60000000", "0x08000000", "0x18000000", "0x70000000" ] },
+ { "name" : "SOCMEM_RAM", "size" : "0x00500000", "start" : [ "0x26000000", "0x06000000", "0x16000000", "0x36000000" ] },
+ { "name" : "SRAM", "size" : "0x00100000", "start" : [ "0x24000000", "0x04000000", "0x14000000", "0x34000000" ] }
+ ],
+ "region" :
+ [
+ { "name" : "m55_data", "size" : "0x00040000", "start" : [ "0x48040000", "0x58040000", "0x20000000" ] },
+ { "name" : "m55_code", "size" : "0x00040000", "start" : [ "0x48000000", "0x58000000", "0x00000000" ] },
+ { "name" : "extended_boot_reserved", "size" : "0x00011000", "start" : [ "0x22000000", "0x02000000", "0x12000000", "0x32000000" ], "reserved" : true },
+ { "name" : "user_programmable", "size" : "0x0004A000", "start" : [ "0x22011000", "0x02011000", "0x12011000", "0x32011000" ] },
+ { "name" : "user_nvm", "size" : "0x00008000", "start" : [ "0x2205B000", "0x0205B000", "0x1205B000", "0x3205B000" ] },
+ { "name" : "reserved_region", "size" : "0x00016000", "start" : [ "0x2206A000", "0x0206A000", "0x1206A000", "0x3206A000" ], "reserved" : true },
+ { "name" : "m33s_nvm", "size" : "0x00200000", "start" : [ "0x60100000", "0x08100000", "0x18100000", "0x70100000" ] },
+ { "name" : "m33s_trailer", "size" : "0x00040000", "start" : [ "0x60300000", "0x08300000", "0x18300000", "0x70300000" ] },
+ { "name" : "m33_nvm", "size" : "0x00200000", "start" : [ "0x60340000", "0x08340000", "0x18340000", "0x70340000" ] },
+ { "name" : "m33_trailer", "size" : "0x00040000", "start" : [ "0x60540000", "0x08540000", "0x18540000", "0x70540000" ] },
+ { "name" : "m55_nvm", "size" : "0x002C0000", "start" : [ "0x60580000", "0x08580000", "0x18580000", "0x70580000" ] },
+ { "name" : "m55_trailer", "size" : "0x00040000", "start" : [ "0x60840000", "0x08840000", "0x18840000", "0x70840000" ] },
+ { "name" : "m55_code_secondary", "size" : "0x00040000", "start" : [ "0x26000000", "0x06000000", "0x16000000", "0x36000000" ] },
+ { "name" : "m55_data_secondary", "size" : "0x002BC000", "start" : [ "0x26040000", "0x06040000", "0x16040000", "0x36040000" ] },
+ { "name" : "m33_m55_shared", "size" : "0x00040000", "start" : [ "0x262FC000", "0x062FC000", "0x162FC000", "0x362FC000" ] },
+ { "name" : "gfx_mem", "size" : "0x001C4000", "start" : [ "0x2633C000", "0x0633C000", "0x1633C000", "0x3633C000" ] },
+ { "name" : "extended_boot_sram_reserved", "size" : "0x00001000", "start" : [ "0x24000000", "0x04000000", "0x14000000", "0x34000000" ], "reserved" : true },
+ { "name" : "m33s_shared", "size" : "0x00001000", "start" : [ "0x24001000", "0x04001000", "0x14001000", "0x34001000" ] },
+ { "name" : "m33s_code", "size" : "0x00035000", "start" : [ "0x24002000", "0x04002000", "0x14002000", "0x34002000" ] },
+ { "name" : "m33s_data", "size" : "0x00021000", "start" : [ "0x24037000", "0x04037000", "0x14037000", "0x34037000" ] },
+ { "name" : "m33_code", "size" : "0x00065000", "start" : [ "0x24058000", "0x04058000", "0x14058000", "0x34058000" ] },
+ { "name" : "m33_data", "size" : "0x00040000", "start" : [ "0x240BD000", "0x040BD000", "0x140BD000", "0x340BD000" ] },
+ { "name" : "m33s_allocatable_shared", "size" : "0x00001000", "start" : [ "0x240FD000", "0x040FD000", "0x140FD000", "0x340FD000" ] },
+ { "name" : "m33_allocatable_shared", "size" : "0x00001000", "start" : [ "0x240FE000", "0x040FE000", "0x140FE000", "0x340FE000" ] },
+ { "name" : "m55_allocatable_shared", "size" : "0x00001000", "start" : [ "0x240FF000", "0x040FF000", "0x140FF000", "0x340FF000" ] }
+ ]
+ }
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/edgeproctectsymbols.json b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/edgeproctectsymbols.json
new file mode 100644
index 00000000000..0bfd11cb140
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/edgeproctectsymbols.json
@@ -0,0 +1,273 @@
+{
+ "symbolInformation" :
+ [
+ { "name" : "CYMEM_CM33_0_S_m55_data_START", "value" : "0x48040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_S_START", "value" : "0x58040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_START", "value" : "0x48000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_S_START", "value" : "0x58000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM33_0_S_user_programmable_START", "value" : "0x22011000" },
+ { "name" : "CYMEM_CM33_0_S_user_programmable_C_START", "value" : "0x02011000" },
+ { "name" : "CYMEM_CM33_0_S_user_programmable_C_S_START", "value" : "0x12011000" },
+ { "name" : "CYMEM_CM33_0_S_user_programmable_S_START", "value" : "0x32011000" },
+ { "name" : "CYMEM_CM33_0_S_user_programmable_SIZE", "value" : "0x0004A000" },
+ { "name" : "CYMEM_CM33_0_S_user_programmable_OFFSET", "value" : "0x00011000" },
+ { "name" : "CYMEM_CM33_0_S_user_nvm_START", "value" : "0x2205B000" },
+ { "name" : "CYMEM_CM33_0_S_user_nvm_C_START", "value" : "0x0205B000" },
+ { "name" : "CYMEM_CM33_0_S_user_nvm_C_S_START", "value" : "0x1205B000" },
+ { "name" : "CYMEM_CM33_0_S_user_nvm_S_START", "value" : "0x3205B000" },
+ { "name" : "CYMEM_CM33_0_S_user_nvm_SIZE", "value" : "0x00008000" },
+ { "name" : "CYMEM_CM33_0_S_user_nvm_OFFSET", "value" : "0x0005B000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_nvm_START", "value" : "0x60100000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_nvm_C_START", "value" : "0x08100000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_nvm_C_S_START", "value" : "0x18100000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_nvm_S_START", "value" : "0x70100000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_nvm_SIZE", "value" : "0x00200000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_nvm_OFFSET", "value" : "0x00100000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_trailer_START", "value" : "0x60300000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_trailer_C_START", "value" : "0x08300000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_trailer_C_S_START", "value" : "0x18300000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_trailer_S_START", "value" : "0x70300000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_trailer_OFFSET", "value" : "0x00300000" },
+ { "name" : "CYMEM_CM33_0_S_m33_nvm_START", "value" : "0x60340000" },
+ { "name" : "CYMEM_CM33_0_S_m33_nvm_C_START", "value" : "0x08340000" },
+ { "name" : "CYMEM_CM33_0_S_m33_nvm_C_S_START", "value" : "0x18340000" },
+ { "name" : "CYMEM_CM33_0_S_m33_nvm_S_START", "value" : "0x70340000" },
+ { "name" : "CYMEM_CM33_0_S_m33_nvm_SIZE", "value" : "0x00200000" },
+ { "name" : "CYMEM_CM33_0_S_m33_nvm_OFFSET", "value" : "0x00340000" },
+ { "name" : "CYMEM_CM33_0_S_m33_trailer_START", "value" : "0x60540000" },
+ { "name" : "CYMEM_CM33_0_S_m33_trailer_C_START", "value" : "0x08540000" },
+ { "name" : "CYMEM_CM33_0_S_m33_trailer_C_S_START", "value" : "0x18540000" },
+ { "name" : "CYMEM_CM33_0_S_m33_trailer_S_START", "value" : "0x70540000" },
+ { "name" : "CYMEM_CM33_0_S_m33_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m33_trailer_OFFSET", "value" : "0x00540000" },
+ { "name" : "CYMEM_CM33_0_S_m55_nvm_START", "value" : "0x60580000" },
+ { "name" : "CYMEM_CM33_0_S_m55_nvm_C_START", "value" : "0x08580000" },
+ { "name" : "CYMEM_CM33_0_S_m55_nvm_C_S_START", "value" : "0x18580000" },
+ { "name" : "CYMEM_CM33_0_S_m55_nvm_S_START", "value" : "0x70580000" },
+ { "name" : "CYMEM_CM33_0_S_m55_nvm_SIZE", "value" : "0x002C0000" },
+ { "name" : "CYMEM_CM33_0_S_m55_nvm_OFFSET", "value" : "0x00580000" },
+ { "name" : "CYMEM_CM33_0_S_m55_trailer_START", "value" : "0x60840000" },
+ { "name" : "CYMEM_CM33_0_S_m55_trailer_C_START", "value" : "0x08840000" },
+ { "name" : "CYMEM_CM33_0_S_m55_trailer_C_S_START", "value" : "0x18840000" },
+ { "name" : "CYMEM_CM33_0_S_m55_trailer_S_START", "value" : "0x70840000" },
+ { "name" : "CYMEM_CM33_0_S_m55_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_trailer_OFFSET", "value" : "0x00840000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_secondary_START", "value" : "0x26000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_secondary_C_START", "value" : "0x06000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_secondary_C_S_START", "value" : "0x16000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_secondary_S_START", "value" : "0x36000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_secondary_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_code_secondary_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_secondary_START", "value" : "0x26040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_secondary_C_START", "value" : "0x06040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_secondary_C_S_START", "value" : "0x16040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_secondary_S_START", "value" : "0x36040000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_secondary_SIZE", "value" : "0x002BC000" },
+ { "name" : "CYMEM_CM33_0_S_m55_data_secondary_OFFSET", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m33_m55_shared_START", "value" : "0x262FC000" },
+ { "name" : "CYMEM_CM33_0_S_m33_m55_shared_C_START", "value" : "0x062FC000" },
+ { "name" : "CYMEM_CM33_0_S_m33_m55_shared_C_S_START", "value" : "0x162FC000" },
+ { "name" : "CYMEM_CM33_0_S_m33_m55_shared_S_START", "value" : "0x362FC000" },
+ { "name" : "CYMEM_CM33_0_S_m33_m55_shared_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m33_m55_shared_OFFSET", "value" : "0x002FC000" },
+ { "name" : "CYMEM_CM33_0_S_gfx_mem_START", "value" : "0x2633C000" },
+ { "name" : "CYMEM_CM33_0_S_gfx_mem_C_START", "value" : "0x0633C000" },
+ { "name" : "CYMEM_CM33_0_S_gfx_mem_C_S_START", "value" : "0x1633C000" },
+ { "name" : "CYMEM_CM33_0_S_gfx_mem_S_START", "value" : "0x3633C000" },
+ { "name" : "CYMEM_CM33_0_S_gfx_mem_SIZE", "value" : "0x001C4000" },
+ { "name" : "CYMEM_CM33_0_S_gfx_mem_OFFSET", "value" : "0x0033C000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_shared_START", "value" : "0x24001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_shared_C_START", "value" : "0x04001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_shared_C_S_START", "value" : "0x14001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_shared_S_START", "value" : "0x34001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_shared_OFFSET", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_code_START", "value" : "0x24002000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_code_C_START", "value" : "0x04002000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_code_C_S_START", "value" : "0x14002000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_code_S_START", "value" : "0x34002000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_code_SIZE", "value" : "0x00035000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_code_OFFSET", "value" : "0x00002000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_data_START", "value" : "0x24037000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_data_C_START", "value" : "0x04037000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_data_C_S_START", "value" : "0x14037000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_data_S_START", "value" : "0x34037000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_data_SIZE", "value" : "0x00021000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_data_OFFSET", "value" : "0x00037000" },
+ { "name" : "CYMEM_CM33_0_S_m33_code_START", "value" : "0x24058000" },
+ { "name" : "CYMEM_CM33_0_S_m33_code_C_START", "value" : "0x04058000" },
+ { "name" : "CYMEM_CM33_0_S_m33_code_C_S_START", "value" : "0x14058000" },
+ { "name" : "CYMEM_CM33_0_S_m33_code_S_START", "value" : "0x34058000" },
+ { "name" : "CYMEM_CM33_0_S_m33_code_SIZE", "value" : "0x00065000" },
+ { "name" : "CYMEM_CM33_0_S_m33_code_OFFSET", "value" : "0x00058000" },
+ { "name" : "CYMEM_CM33_0_S_m33_data_START", "value" : "0x240BD000" },
+ { "name" : "CYMEM_CM33_0_S_m33_data_C_START", "value" : "0x040BD000" },
+ { "name" : "CYMEM_CM33_0_S_m33_data_C_S_START", "value" : "0x140BD000" },
+ { "name" : "CYMEM_CM33_0_S_m33_data_S_START", "value" : "0x340BD000" },
+ { "name" : "CYMEM_CM33_0_S_m33_data_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_S_m33_data_OFFSET", "value" : "0x000BD000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_allocatable_shared_START", "value" : "0x240FD000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_allocatable_shared_C_START", "value" : "0x040FD000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_allocatable_shared_C_S_START", "value" : "0x140FD000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_allocatable_shared_S_START", "value" : "0x340FD000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_S_m33s_allocatable_shared_OFFSET", "value" : "0x000FD000" },
+ { "name" : "CYMEM_CM33_0_S_m33_allocatable_shared_START", "value" : "0x240FE000" },
+ { "name" : "CYMEM_CM33_0_S_m33_allocatable_shared_C_START", "value" : "0x040FE000" },
+ { "name" : "CYMEM_CM33_0_S_m33_allocatable_shared_C_S_START", "value" : "0x140FE000" },
+ { "name" : "CYMEM_CM33_0_S_m33_allocatable_shared_S_START", "value" : "0x340FE000" },
+ { "name" : "CYMEM_CM33_0_S_m33_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_S_m33_allocatable_shared_OFFSET", "value" : "0x000FE000" },
+ { "name" : "CYMEM_CM33_0_S_m55_allocatable_shared_START", "value" : "0x240FF000" },
+ { "name" : "CYMEM_CM33_0_S_m55_allocatable_shared_C_START", "value" : "0x040FF000" },
+ { "name" : "CYMEM_CM33_0_S_m55_allocatable_shared_C_S_START", "value" : "0x140FF000" },
+ { "name" : "CYMEM_CM33_0_S_m55_allocatable_shared_S_START", "value" : "0x340FF000" },
+ { "name" : "CYMEM_CM33_0_S_m55_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_S_m55_allocatable_shared_OFFSET", "value" : "0x000FF000" },
+ { "name" : "CYMEM_CM33_0_m55_data_START", "value" : "0x48040000" },
+ { "name" : "CYMEM_CM33_0_m55_data_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m55_data_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM33_0_m55_code_START", "value" : "0x48000000" },
+ { "name" : "CYMEM_CM33_0_m55_code_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m55_code_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM33_0_user_programmable_START", "value" : "0x22011000" },
+ { "name" : "CYMEM_CM33_0_user_programmable_C_START", "value" : "0x02011000" },
+ { "name" : "CYMEM_CM33_0_user_programmable_SIZE", "value" : "0x0004A000" },
+ { "name" : "CYMEM_CM33_0_user_programmable_OFFSET", "value" : "0x00011000" },
+ { "name" : "CYMEM_CM33_0_user_nvm_START", "value" : "0x2205B000" },
+ { "name" : "CYMEM_CM33_0_user_nvm_C_START", "value" : "0x0205B000" },
+ { "name" : "CYMEM_CM33_0_user_nvm_SIZE", "value" : "0x00008000" },
+ { "name" : "CYMEM_CM33_0_user_nvm_OFFSET", "value" : "0x0005B000" },
+ { "name" : "CYMEM_CM33_0_m33s_nvm_START", "value" : "0x60100000" },
+ { "name" : "CYMEM_CM33_0_m33s_nvm_C_START", "value" : "0x08100000" },
+ { "name" : "CYMEM_CM33_0_m33s_nvm_SIZE", "value" : "0x00200000" },
+ { "name" : "CYMEM_CM33_0_m33s_nvm_OFFSET", "value" : "0x00100000" },
+ { "name" : "CYMEM_CM33_0_m33s_trailer_START", "value" : "0x60300000" },
+ { "name" : "CYMEM_CM33_0_m33s_trailer_C_START", "value" : "0x08300000" },
+ { "name" : "CYMEM_CM33_0_m33s_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m33s_trailer_OFFSET", "value" : "0x00300000" },
+ { "name" : "CYMEM_CM33_0_m33_nvm_START", "value" : "0x60340000" },
+ { "name" : "CYMEM_CM33_0_m33_nvm_C_START", "value" : "0x08340000" },
+ { "name" : "CYMEM_CM33_0_m33_nvm_SIZE", "value" : "0x00200000" },
+ { "name" : "CYMEM_CM33_0_m33_nvm_OFFSET", "value" : "0x00340000" },
+ { "name" : "CYMEM_CM33_0_m33_trailer_START", "value" : "0x60540000" },
+ { "name" : "CYMEM_CM33_0_m33_trailer_C_START", "value" : "0x08540000" },
+ { "name" : "CYMEM_CM33_0_m33_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m33_trailer_OFFSET", "value" : "0x00540000" },
+ { "name" : "CYMEM_CM33_0_m55_nvm_START", "value" : "0x60580000" },
+ { "name" : "CYMEM_CM33_0_m55_nvm_C_START", "value" : "0x08580000" },
+ { "name" : "CYMEM_CM33_0_m55_nvm_SIZE", "value" : "0x002C0000" },
+ { "name" : "CYMEM_CM33_0_m55_nvm_OFFSET", "value" : "0x00580000" },
+ { "name" : "CYMEM_CM33_0_m55_trailer_START", "value" : "0x60840000" },
+ { "name" : "CYMEM_CM33_0_m55_trailer_C_START", "value" : "0x08840000" },
+ { "name" : "CYMEM_CM33_0_m55_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m55_trailer_OFFSET", "value" : "0x00840000" },
+ { "name" : "CYMEM_CM33_0_m55_code_secondary_START", "value" : "0x26000000" },
+ { "name" : "CYMEM_CM33_0_m55_code_secondary_C_START", "value" : "0x06000000" },
+ { "name" : "CYMEM_CM33_0_m55_code_secondary_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m55_code_secondary_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM33_0_m55_data_secondary_START", "value" : "0x26040000" },
+ { "name" : "CYMEM_CM33_0_m55_data_secondary_C_START", "value" : "0x06040000" },
+ { "name" : "CYMEM_CM33_0_m55_data_secondary_SIZE", "value" : "0x002BC000" },
+ { "name" : "CYMEM_CM33_0_m55_data_secondary_OFFSET", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m33_m55_shared_START", "value" : "0x262FC000" },
+ { "name" : "CYMEM_CM33_0_m33_m55_shared_C_START", "value" : "0x062FC000" },
+ { "name" : "CYMEM_CM33_0_m33_m55_shared_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m33_m55_shared_OFFSET", "value" : "0x002FC000" },
+ { "name" : "CYMEM_CM33_0_gfx_mem_START", "value" : "0x2633C000" },
+ { "name" : "CYMEM_CM33_0_gfx_mem_C_START", "value" : "0x0633C000" },
+ { "name" : "CYMEM_CM33_0_gfx_mem_SIZE", "value" : "0x001C4000" },
+ { "name" : "CYMEM_CM33_0_gfx_mem_OFFSET", "value" : "0x0033C000" },
+ { "name" : "CYMEM_CM33_0_m33s_shared_START", "value" : "0x24001000" },
+ { "name" : "CYMEM_CM33_0_m33s_shared_C_START", "value" : "0x04001000" },
+ { "name" : "CYMEM_CM33_0_m33s_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_m33s_shared_OFFSET", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_m33s_code_START", "value" : "0x24002000" },
+ { "name" : "CYMEM_CM33_0_m33s_code_C_START", "value" : "0x04002000" },
+ { "name" : "CYMEM_CM33_0_m33s_code_SIZE", "value" : "0x00035000" },
+ { "name" : "CYMEM_CM33_0_m33s_code_OFFSET", "value" : "0x00002000" },
+ { "name" : "CYMEM_CM33_0_m33s_data_START", "value" : "0x24037000" },
+ { "name" : "CYMEM_CM33_0_m33s_data_C_START", "value" : "0x04037000" },
+ { "name" : "CYMEM_CM33_0_m33s_data_SIZE", "value" : "0x00021000" },
+ { "name" : "CYMEM_CM33_0_m33s_data_OFFSET", "value" : "0x00037000" },
+ { "name" : "CYMEM_CM33_0_m33_code_START", "value" : "0x24058000" },
+ { "name" : "CYMEM_CM33_0_m33_code_C_START", "value" : "0x04058000" },
+ { "name" : "CYMEM_CM33_0_m33_code_SIZE", "value" : "0x00065000" },
+ { "name" : "CYMEM_CM33_0_m33_code_OFFSET", "value" : "0x00058000" },
+ { "name" : "CYMEM_CM33_0_m33_data_START", "value" : "0x240BD000" },
+ { "name" : "CYMEM_CM33_0_m33_data_C_START", "value" : "0x040BD000" },
+ { "name" : "CYMEM_CM33_0_m33_data_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM33_0_m33_data_OFFSET", "value" : "0x000BD000" },
+ { "name" : "CYMEM_CM33_0_m33s_allocatable_shared_START", "value" : "0x240FD000" },
+ { "name" : "CYMEM_CM33_0_m33s_allocatable_shared_C_START", "value" : "0x040FD000" },
+ { "name" : "CYMEM_CM33_0_m33s_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_m33s_allocatable_shared_OFFSET", "value" : "0x000FD000" },
+ { "name" : "CYMEM_CM33_0_m33_allocatable_shared_START", "value" : "0x240FE000" },
+ { "name" : "CYMEM_CM33_0_m33_allocatable_shared_C_START", "value" : "0x040FE000" },
+ { "name" : "CYMEM_CM33_0_m33_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_m33_allocatable_shared_OFFSET", "value" : "0x000FE000" },
+ { "name" : "CYMEM_CM33_0_m55_allocatable_shared_START", "value" : "0x240FF000" },
+ { "name" : "CYMEM_CM33_0_m55_allocatable_shared_C_START", "value" : "0x040FF000" },
+ { "name" : "CYMEM_CM33_0_m55_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM33_0_m55_allocatable_shared_OFFSET", "value" : "0x000FF000" },
+ { "name" : "CYMEM_CM55_0_m55_data_INTERNAL_START", "value" : "0x20000000" },
+ { "name" : "CYMEM_CM55_0_m55_data_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m55_data_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM55_0_m55_code_INTERNAL_START", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM55_0_m55_code_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m55_code_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM55_0_user_nvm_C_START", "value" : "0x0205B000" },
+ { "name" : "CYMEM_CM55_0_user_nvm_SIZE", "value" : "0x00008000" },
+ { "name" : "CYMEM_CM55_0_user_nvm_OFFSET", "value" : "0x0005B000" },
+ { "name" : "CYMEM_CM55_0_m55_nvm_START", "value" : "0x60580000" },
+ { "name" : "CYMEM_CM55_0_m55_nvm_SIZE", "value" : "0x002C0000" },
+ { "name" : "CYMEM_CM55_0_m55_nvm_OFFSET", "value" : "0x00580000" },
+ { "name" : "CYMEM_CM55_0_m55_trailer_START", "value" : "0x60840000" },
+ { "name" : "CYMEM_CM55_0_m55_trailer_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m55_trailer_OFFSET", "value" : "0x00840000" },
+ { "name" : "CYMEM_CM55_0_m55_code_secondary_START", "value" : "0x26000000" },
+ { "name" : "CYMEM_CM55_0_m55_code_secondary_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m55_code_secondary_OFFSET", "value" : "0x00000000" },
+ { "name" : "CYMEM_CM55_0_m55_data_secondary_START", "value" : "0x26040000" },
+ { "name" : "CYMEM_CM55_0_m55_data_secondary_SIZE", "value" : "0x002BC000" },
+ { "name" : "CYMEM_CM55_0_m55_data_secondary_OFFSET", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m33_m55_shared_START", "value" : "0x262FC000" },
+ { "name" : "CYMEM_CM55_0_m33_m55_shared_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m33_m55_shared_OFFSET", "value" : "0x002FC000" },
+ { "name" : "CYMEM_CM55_0_gfx_mem_START", "value" : "0x2633C000" },
+ { "name" : "CYMEM_CM55_0_gfx_mem_SIZE", "value" : "0x001C4000" },
+ { "name" : "CYMEM_CM55_0_gfx_mem_OFFSET", "value" : "0x0033C000" },
+ { "name" : "CYMEM_CM55_0_m33_data_START", "value" : "0x240BD000" },
+ { "name" : "CYMEM_CM55_0_m33_data_SIZE", "value" : "0x00040000" },
+ { "name" : "CYMEM_CM55_0_m33_data_OFFSET", "value" : "0x000BD000" },
+ { "name" : "CYMEM_CM55_0_m33s_allocatable_shared_START", "value" : "0x240FD000" },
+ { "name" : "CYMEM_CM55_0_m33s_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM55_0_m33s_allocatable_shared_OFFSET", "value" : "0x000FD000" },
+ { "name" : "CYMEM_CM55_0_m33_allocatable_shared_START", "value" : "0x240FE000" },
+ { "name" : "CYMEM_CM55_0_m33_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM55_0_m33_allocatable_shared_OFFSET", "value" : "0x000FE000" },
+ { "name" : "CYMEM_CM55_0_m55_allocatable_shared_START", "value" : "0x240FF000" },
+ { "name" : "CYMEM_CM55_0_m55_allocatable_shared_SIZE", "value" : "0x00001000" },
+ { "name" : "CYMEM_CM55_0_m55_allocatable_shared_OFFSET", "value" : "0x000FF000" },
+ {
+ "name" : "RelocationTable",
+ "value" :
+ [
+ { "start" : "0x02000000", "size" : "0x00080000", "dest" : "0x22000000" },
+ { "start" : "0x04000000", "size" : "0x00100000", "dest" : "0x24000000" },
+ { "start" : "0x06000000", "size" : "0x00500000", "dest" : "0x26000000" },
+ { "start" : "0x08000000", "size" : "0x04000000", "dest" : "0x60000000" },
+ { "start" : "0x12000000", "size" : "0x00080000", "dest" : "0x32000000" },
+ { "start" : "0x14000000", "size" : "0x00100000", "dest" : "0x34000000" },
+ { "start" : "0x16000000", "size" : "0x00500000", "dest" : "0x36000000" },
+ { "start" : "0x18000000", "size" : "0x04000000", "dest" : "0x70000000" }
+ ]
+ }
+ ],
+ "version" : 1
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/qspi_config.cfg b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/qspi_config.cfg
new file mode 100644
index 00000000000..3e847866237
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/bsp-cfg/qspi_config.cfg
@@ -0,0 +1,29 @@
+################################################################################
+# File Name: qspi_config.cfg
+#
+# Description:
+# This file contains a SMIF Bank layout for use with OpenOCD.
+# This file was automatically generated and should not be modified.
+# QSPI Configurator: 4.60.0.2742
+#
+################################################################################
+# Copyright 2026 Cypress Semiconductor Corporation (an Infineon company) or
+# an affiliate of Cypress Semiconductor Corporation.
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+set SMIF_BANKS {
+ 1 {addr 0x60000000 size 0x4000000 psize 0x0000100 esize 0x0040000}
+}
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/mpconfigboard.h b/ports/psoc-edge/boards/KIT_PSE84_AI/mpconfigboard.h
new file mode 100644
index 00000000000..37cf0a95d5c
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/mpconfigboard.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// Board and hardware specific configuration
+#define MICROPY_HW_MCU_NAME "PSOCE84"
+#define MICROPY_HW_BOARD_NAME "KIT_PSE84_AI"
+
+#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "KIT_PSE84_AI"
+
+// External QSPI Flash Configuration
+// These sizes are determined by the physical flash chip specifications
+// and memory map layout for the KIT_PSE84_AI board
+#define MICROPY_PY_EXT_FLASH (1)
+
+// Flash memory map: Total 64MB (0x04000000) QSPI flash (S25HS512T hybrid flash)
+// S25HS512T Memory Map:
+// Region 0: 0x000000-0x01FFFF (32 x 4KB sectors)
+// Region 1: 0x020000-0x03FFFF (1 x 128KB sector)
+// Region 2: 0x040000-0x3FFFFFF (255 x 256KB sectors) <- We use this region
+// CRITICAL: Base address MUST be aligned to 256KB (0x40000) sector boundary!
+#define EXT_FLASH_BASE (0x00900000) // Aligned to sector 36
+
+// Usable filesystem space: 64MB - 9MB = 55MB (0x03700000 bytes)
+#define EXT_FLASH_SIZE (0x04000000 - EXT_FLASH_BASE)
+
+// erase sector size : 256KB, fixed by flash chip hardware in Region 2.
+#define EXT_FLASH_SECTOR_SIZE (0x40000) /** 256KB*/
+
+// Block device block size: Must match erase sector size for proper filesystem operation
+#define EXT_FLASH_BLOCK_SIZE_BYTES (EXT_FLASH_SECTOR_SIZE)
+
+// Program page size: Fixed by flash chip hardware (minimum writable unit). Matches LittleFS write_size.
+#define EXT_FLASH_PAGE_SIZE (0x200) /** 512 Bytes */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/mpconfigboard.mk b/ports/psoc-edge/boards/KIT_PSE84_AI/mpconfigboard.mk
new file mode 100644
index 00000000000..908a1e808e9
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/mpconfigboard.mk
@@ -0,0 +1,15 @@
+BOARD_VERSION=release-v1.1.0
+
+MICROPY_PY_EXT_FLASH = 1
+MICROPY_PY_NETWORK ?= 1
+
+MICROPY_PY_FREERTOS ?= 0
+MICROPY_PY_SSL = 1
+MICROPY_SSL_MBEDTLS = 1
+
+ifeq ($(MICROPY_PY_NETWORK), 1)
+MICROPY_PY_FREERTOS = 1
+MICROPY_PSOC_EDGE_LWIP = 1
+MICROPY_PY_NETWORK_IFX_WCM = 1
+endif
+MICROPY_PY_DEEPCRAFT = 1
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/FreeRTOSConfig.h b/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/FreeRTOSConfig.h
new file mode 100644
index 00000000000..57062a53a1f
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/FreeRTOSConfig.h
@@ -0,0 +1,242 @@
+/*
+ * FreeRTOS Kernel V10.6.2
+ * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * (c) 2019-2025, Infineon Technologies AG, or an affiliate of Infineon
+ * Technologies AG. All rights reserved.
+ *
+ * Updated configuration to support CM33.
+ *
+ * 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.
+ *
+ * https://www.FreeRTOS.org
+ * https://github.com/FreeRTOS
+ * https://www.infineon.com
+ *
+ */
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+#if defined(__ICCARM__) || (__GNUC__)
+#include "cy_utils.h"
+
+/* Get the low power configuration parameters from
+ * the ModusToolbox Device Configurator GeneratedSource:
+ * CY_CFG_PWR_SYS_IDLE_MODE - System Idle Power Mode
+ * CY_CFG_PWR_DEEPSLEEP_LATENCY - Deep Sleep Latency (ms)
+ */
+#include "cycfg_system.h"
+#include "cy_device_headers.h"
+#endif
+
+#define configUSE_PREEMPTION 1
+#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
+#if defined(__ICCARM__) || (__GNUC__)
+extern uint32_t SystemCoreClock;
+#endif
+#define configCPU_CLOCK_HZ SystemCoreClock
+#define configTICK_RATE_HZ ((TickType_t)1000)
+#define configMAX_PRIORITIES 7
+/* Increase the stack size to 256 to support ds-ram feature */
+#define configMINIMAL_STACK_SIZE 256
+#define configMINIMAL_SECURE_STACK_SIZE 256
+#define configMAX_TASK_NAME_LEN 16
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 1
+#define configUSE_TASK_NOTIFICATIONS 1
+#define configUSE_MUTEXES 1
+#define configUSE_RECURSIVE_MUTEXES 1
+#define configUSE_COUNTING_SEMAPHORES 1
+#define configQUEUE_REGISTRY_SIZE 10
+#define configUSE_QUEUE_SETS 0
+#define configUSE_TIME_SLICING 1
+#define configENABLE_BACKWARD_COMPATIBILITY 0
+#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5
+
+/* Compile-time macros to enable or disable TrustZone, Memory Protection Unit (MPU) and Floating Point Unit (FPU) support. */
+/* configENABLE_FPU is set to 0 for the platforms which doesn't support hardware FPU and
+when application makefile has VFP_SELECT configured as softfloat */
+#if defined(COMPONENT_CYW20829) || defined(COMPONENT_CYW89829) || defined(MTB_SOFTFLOAT)
+#define configENABLE_FPU 0
+#else
+#define configENABLE_FPU 1
+#endif
+#define configENABLE_MPU 0
+#if defined(COMPONENT_FREERTOS_TZ)
+#define configENABLE_TRUSTZONE 1
+#else
+#define configENABLE_TRUSTZONE 0
+#endif
+
+#if defined(COMPONENT_SECURE_DEVICE) && !defined(COMPONENT_FREERTOS_TZ)
+#define configRUN_FREERTOS_SECURE_ONLY 1
+#else
+#define configRUN_FREERTOS_SECURE_ONLY 0
+#endif
+
+/* Memory allocation related definitions. */
+#define configSUPPORT_STATIC_ALLOCATION 1
+#define configSUPPORT_DYNAMIC_ALLOCATION 1
+#define configTOTAL_HEAP_SIZE ((size_t)(50 * 1024))
+#define configAPPLICATION_ALLOCATED_HEAP 0
+
+/* Hook function related definitions. */
+#define configUSE_IDLE_HOOK 0
+#define configUSE_TICK_HOOK 0
+#define configCHECK_FOR_STACK_OVERFLOW 2
+#define configUSE_MALLOC_FAILED_HOOK 1
+#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
+
+/* Run time and task stats gathering related definitions. */
+#define configGENERATE_RUN_TIME_STATS 0
+#define configUSE_TRACE_FACILITY 1
+#define configUSE_STATS_FORMATTING_FUNCTIONS 0
+
+/* Co-routine related definitions. */
+#define configUSE_CO_ROUTINES 0
+#define configMAX_CO_ROUTINE_PRIORITIES 1
+
+/* Software timer related definitions. */
+#define configUSE_TIMERS 1
+#define configTIMER_TASK_PRIORITY 3
+#define configTIMER_QUEUE_LENGTH 10
+#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2)
+
+
+/*
+configMAX_SYSCALL_INTERRUPT_PRIORITY sets the highest interrupt priority from which
+interrupt safe FreeRTOS API functions can be called.
+
+!!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
+See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
+*/
+#if defined(COMPONENT_SECURE_DEVICE) || defined(COMPONENT_CYW20829) || defined(COMPONENT_CYW89829)
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x20
+#else
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x40
+#endif
+
+/* configMAX_API_CALL_INTERRUPT_PRIORITY is a new name for configMAX_SYSCALL_INTERRUPT_PRIORITY
+ that is used by newer ports only. The two are equivalent. */
+#define configMAX_API_CALL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY
+
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+#define INCLUDE_vTaskPrioritySet 1
+#define INCLUDE_uxTaskPriorityGet 1
+#define INCLUDE_vTaskDelete 1
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 1
+#define INCLUDE_xResumeFromISR 1
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+#define INCLUDE_xTaskGetSchedulerState 1
+#define INCLUDE_xTaskGetCurrentTaskHandle 1
+#define INCLUDE_uxTaskGetStackHighWaterMark 0
+#define INCLUDE_xTaskGetIdleTaskHandle 0
+#define INCLUDE_eTaskGetState 0
+#define INCLUDE_xEventGroupSetBitFromISR 1
+#define INCLUDE_xTimerPendFunctionCall 1
+#define INCLUDE_xTaskAbortDelay 0
+#define INCLUDE_xTaskGetHandle 0
+#define INCLUDE_xTaskResumeFromISR 1
+
+/* Normal assert() semantics without relying on the provision of an assert.h
+header file. */
+#if defined(NDEBUG)
+#define configASSERT(x) CY_UNUSED_PARAMETER(x)
+#else
+#define configASSERT(x) if ((x) == 0) { taskDISABLE_INTERRUPTS(); CY_HALT(); }
+#endif
+
+/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
+standard names - or at least those used in the unmodified vector table. */
+#define vPortSVCHandler SVC_Handler
+#define xPortPendSVHandler PendSV_Handler
+#define xPortSysTickHandler SysTick_Handler
+
+/* Dynamic Memory Allocation Schemes */
+#define HEAP_ALLOCATION_TYPE1 (1) /* heap_1.c*/
+#define HEAP_ALLOCATION_TYPE2 (2) /* heap_2.c*/
+#define HEAP_ALLOCATION_TYPE3 (3) /* heap_3.c*/
+#define HEAP_ALLOCATION_TYPE4 (4) /* heap_4.c*/
+#define HEAP_ALLOCATION_TYPE5 (5) /* heap_5.c*/
+#define NO_HEAP_ALLOCATION (0)
+
+#define configHEAP_ALLOCATION_SCHEME (HEAP_ALLOCATION_TYPE3)
+
+/* Check if the ModusToolbox Device Configurator Power personality parameter
+ * "System Idle Power Mode" is set to either "CPU Sleep" or "System Deep Sleep".
+ */
+#if defined(CY_CFG_PWR_SYS_IDLE_MODE) && \
+ ((CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_SLEEP) || \
+ (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP) || \
+ (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP_RAM))
+
+/* Enable low power tickless functionality. The RTOS abstraction library
+ * provides the compatible implementation of the vApplicationSleep hook:
+ * https://github.com/infineon/abstraction-rtos#freertos
+ * The Low Power Assistant library provides additional portable configuration layer
+ * for low-power features supported by the PSoC 6 devices:
+ * https://github.com/infineon/lpa
+ */
+extern void vApplicationSleep(uint32_t xExpectedIdleTime);
+#define portSUPPRESS_TICKS_AND_SLEEP(xIdleTime) vApplicationSleep(xIdleTime)
+#define configUSE_TICKLESS_IDLE 2
+
+#else
+#define configUSE_TICKLESS_IDLE 0
+#endif
+
+/* Deep Sleep Latency Configuration */
+#if (CY_CFG_PWR_DEEPSLEEP_LATENCY > 0)
+#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP CY_CFG_PWR_DEEPSLEEP_LATENCY
+#endif
+
+/* Allocate newlib reeentrancy structures for each RTOS task.
+ * The system behavior is toolchain-specific.
+ *
+ * GCC toolchain: the application must provide the implementation for the required
+ * newlib hook functions: __malloc_lock, __malloc_unlock, __env_lock, __env_unlock.
+ * FreeRTOS-compatible implementation is provided by the clib-support library:
+ * https://github.com/infineon/clib-support
+ *
+ * ARM/IAR toolchains: the application must provide the reent.h header to adapt
+ * FreeRTOS's configUSE_NEWLIB_REENTRANT to work with the toolchain-specific C library.
+ * The compatible implementations are also provided by the clib-support library.
+ */
+#if defined(__llvm__) && !defined(__ARMCC_VERSION)
+#define configUSE_PICOLIBC_TLS 1
+#else
+#define configUSE_NEWLIB_REENTRANT 1
+#endif
+
+#endif /* FREERTOS_CONFIG_H */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/retarget_io_init.c b/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/retarget_io_init.c
new file mode 100644
index 00000000000..07ed16c674e
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/retarget_io_init.c
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * File Name: retarget_io_init.c
+ *
+ * Description: This file contains the initialization routine for the
+ * retarget-io middleware
+ *
+ * Related Document: See README.md
+ *
+ *******************************************************************************
+* Copyright 2023-2025, Cypress Semiconductor Corporation (an Infineon company) or
+* an affiliate of Cypress Semiconductor Corporation. All rights reserved.
+*
+* This software, including source code, documentation and related
+* materials ("Software") is owned by Cypress Semiconductor Corporation
+* or one of its affiliates ("Cypress") and is protected by and subject to
+* worldwide patent protection (United States and foreign),
+* United States copyright laws and international treaty provisions.
+* Therefore, you may use this Software only as provided in the license
+* agreement accompanying the software package from which you
+* obtained this Software ("EULA").
+* If no EULA applies, Cypress hereby grants you a personal, non-exclusive,
+* non-transferable license to copy, modify, and compile the Software
+* source code solely for use in connection with Cypress's
+* integrated circuit products. Any reproduction, modification, translation,
+* compilation, or representation of this Software except as specified
+* above is prohibited without the express written permission of Cypress.
+*
+* Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress
+* reserves the right to make changes to the Software without notice. Cypress
+* does not assume any liability arising out of the application or use of the
+* Software or any product or circuit described in the Software. Cypress does
+* not authorize its products for use in any products where a malfunction or
+* failure of the Cypress product may reasonably be expected to result in
+* significant property damage, injury or death ("High Risk Product"). By
+* including Cypress's product in a High Risk Product, the manufacturer
+* of such system or application assumes all risk of such use and in doing
+* so agrees to indemnify Cypress against all liability.
+*******************************************************************************/
+
+/*******************************************************************************
+* Header Files
+*******************************************************************************/
+#include "retarget_io_init.h"
+
+/*******************************************************************************
+* Global Variables
+*******************************************************************************/
+/* For the RetargetIO (Debug UART) usage. */
+static cy_stc_scb_uart_context_t DEBUG_UART_context;
+mtb_hal_uart_t DEBUG_UART_hal_obj;
+
+/* Retarget-io deepsleep callback parameters */
+#if (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP)
+
+/* Context reference structure for Debug UART */
+static mtb_syspm_uart_deepsleep_context_t retarget_io_syspm_ds_context =
+{
+ .uart_context = &DEBUG_UART_context,
+ .async_context = NULL,
+ .tx_pin =
+ {
+ .port = CYBSP_DEBUG_UART_TX_PORT,
+ .pinNum = CYBSP_DEBUG_UART_TX_PIN,
+ .hsiom = CYBSP_DEBUG_UART_TX_HSIOM
+ },
+ .rts_pin =
+ {
+ .port = DEBUG_UART_RTS_PORT,
+ .pinNum = DEBUG_UART_RTS_PIN,
+ .hsiom = HSIOM_SEL_GPIO
+ }
+};
+
+/* SysPm callback parameter structure for Debug UART */
+static cy_stc_syspm_callback_params_t retarget_io_syspm_cb_params =
+{
+ .context = &retarget_io_syspm_ds_context,
+ .base = CYBSP_DEBUG_UART_HW
+};
+
+/* SysPm callback structure for Debug UART */
+static cy_stc_syspm_callback_t retarget_io_syspm_cb =
+{
+ .callback = &mtb_syspm_scb_uart_deepsleep_callback,
+ .skipMode = SYSPM_SKIP_MODE,
+ .type = CY_SYSPM_DEEPSLEEP,
+ .callbackParams = &retarget_io_syspm_cb_params,
+ .prevItm = NULL,
+ .nextItm = NULL,
+ .order = SYSPM_CALLBACK_ORDER
+};
+#endif /* (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP) */
+
+/*******************************************************************************
+* Function Name: init_retarget_io
+********************************************************************************
+* Summary:
+* User defined function to initialize the debug UART.
+*
+* Parameters:
+* void
+*
+* Return:
+* void
+*
+*******************************************************************************/
+void init_retarget_io(void) {
+ cy_rslt_t result = CY_RSLT_SUCCESS;
+
+ /* Initialize the SCB UART */
+ result = (cy_rslt_t)Cy_SCB_UART_Init(CYBSP_DEBUG_UART_HW,
+ &CYBSP_DEBUG_UART_config,
+ &DEBUG_UART_context);
+
+ /* UART initialization failed. Stop program execution. */
+ if (CY_RSLT_SUCCESS != result) {
+ handle_app_error();
+ }
+
+ /* Enable the SCB UART */
+ Cy_SCB_UART_Enable(CYBSP_DEBUG_UART_HW);
+
+ result = mtb_hal_uart_setup(&DEBUG_UART_hal_obj,
+ &CYBSP_DEBUG_UART_hal_config,
+ &DEBUG_UART_context, NULL);
+
+ /* UART setup failed. Stop program execution. */
+ if (CY_RSLT_SUCCESS != result) {
+ handle_app_error();
+ }
+
+ /* Initialize retarget-io to use the debug UART port. */
+ result = cy_retarget_io_init(&DEBUG_UART_hal_obj);
+
+ /* retarget-io initialization failed. Stop program execution. */
+ if (CY_RSLT_SUCCESS != result) {
+ handle_app_error();
+ }
+
+ #if (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP)
+ /* UART SysPm callback registration for retarget-io */
+ Cy_SysPm_RegisterCallback(&retarget_io_syspm_cb);
+ #endif /* (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP) */
+}
+
+/* [] END OF FILE */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/retarget_io_init.h b/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/retarget_io_init.h
new file mode 100644
index 00000000000..b6d9d351e69
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/mtb-prj/retarget_io_init.h
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * File Name: retarget_io_init.h
+ *
+ * Description: This file is the public interface of retarget_io_init.c and
+ * contains the necessary UART configuration parameters.
+ *
+ * Related Document: See README.md
+ *
+ *******************************************************************************
+* Copyright 2023-2025, Cypress Semiconductor Corporation (an Infineon company) or
+* an affiliate of Cypress Semiconductor Corporation. All rights reserved.
+*
+* This software, including source code, documentation and related
+* materials ("Software") is owned by Cypress Semiconductor Corporation
+* or one of its affiliates ("Cypress") and is protected by and subject to
+* worldwide patent protection (United States and foreign),
+* United States copyright laws and international treaty provisions.
+* Therefore, you may use this Software only as provided in the license
+* agreement accompanying the software package from which you
+* obtained this Software ("EULA").
+* If no EULA applies, Cypress hereby grants you a personal, non-exclusive,
+* non-transferable license to copy, modify, and compile the Software
+* source code solely for use in connection with Cypress's
+* integrated circuit products. Any reproduction, modification, translation,
+* compilation, or representation of this Software except as specified
+* above is prohibited without the express written permission of Cypress.
+*
+* Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress
+* reserves the right to make changes to the Software without notice. Cypress
+* does not assume any liability arising out of the application or use of the
+* Software or any product or circuit described in the Software. Cypress does
+* not authorize its products for use in any products where a malfunction or
+* failure of the Cypress product may reasonably be expected to result in
+* significant property damage, injury or death ("High Risk Product"). By
+* including Cypress's product in a High Risk Product, the manufacturer
+* of such system or application assumes all risk of such use and in doing
+* so agrees to indemnify Cypress against all liability.
+*******************************************************************************/
+
+#ifndef _RETARGET_IO_INIT_H_
+#define _RETARGET_IO_INIT_H_
+
+/*******************************************************************************
+* Header Files
+*******************************************************************************/
+#include "cybsp.h"
+#include "mtb_hal.h"
+#include "cy_retarget_io.h"
+#include "mtb_syspm_callbacks.h"
+
+/*******************************************************************************
+* Macros
+*******************************************************************************/
+
+/* retarget-io deepsleep callback macros */
+#define DEBUG_UART_RTS_PORT (NULL)
+#define DEBUG_UART_RTS_PIN (0U)
+
+/* Default syspm callback configuration elements */
+#define SYSPM_SKIP_MODE (0U)
+#define SYSPM_CALLBACK_ORDER (1U)
+
+
+/*******************************************************************************
+* Function prototypes
+*******************************************************************************/
+void init_retarget_io(void);
+
+/*******************************************************************************
+* Function Name: handle_app_error
+********************************************************************************
+* Summary:
+* User defined error handling function
+*
+* Parameters:
+* void
+*
+* Return:
+* void
+*
+*******************************************************************************/
+__STATIC_INLINE void handle_app_error(void) {
+ /* Disable all interrupts. */
+ __disable_irq();
+
+ CY_ASSERT(0);
+
+ /* Infinite loop */
+ while (true) {
+ ;
+ }
+}
+
+#endif /* _RETARGET_IO_INIT_H_ */
+
+/* [] END OF FILE */
diff --git a/ports/psoc-edge/boards/KIT_PSE84_AI/pins.csv b/ports/psoc-edge/boards/KIT_PSE84_AI/pins.csv
new file mode 100644
index 00000000000..782c219d46d
--- /dev/null
+++ b/ports/psoc-edge/boards/KIT_PSE84_AI/pins.csv
@@ -0,0 +1,243 @@
+# QSPI flash
+,-P0_0
+,-P0_1
+,-P1_0
+,-P1_1
+,-P1_2
+,-P1_3
+
+# Not connected
+#,-P1_4
+#,-P1_5
+#,-P1_6
+#,-P1_7
+
+# QSPI flash
+,-P2_0
+
+# I3C bus
+I3C_SCL,P3_0
+I3C_SDA,P3_1
+
+# PSRAM
+,-P4_0
+,-P4_1
+,-P4_2
+,-P4_3
+,-P4_4
+,-P4_5
+,-P4_6
+,-P4_7
+
+# Not connected
+#,-P5_0
+
+# JTAG Debug I/O
+,-P6_0
+,-P6_1
+,-P6_2
+,-P6_3
+
+# Int magnetometer
+MAG_INT,P6_4
+
+# KitProg UART RX
+,-P6_5
+
+# Int IMU
+IMU0_INT,P6_6
+
+# KitProg UART TX
+,-P6_7
+
+# User button
+USER_BUTTON,P7_0
+
+# USB ID OGT
+,-P7_1
+
+# Not connected
+#,-P7_2
+
+# USB direction
+,-P7_3
+
+# External clock input
+,-P7_4
+
+# USB OUT1 DRP
+,-P7_5
+
+# USB OUT2 DRP
+,-P7_6
+
+# Int IMU1
+IMU1_INT,P7_7
+
+# I2C 1.8V
+I2C_SCL_1V8,P8_0
+I2C_SDA_1V8,P8_1
+
+# Not connected
+#,-P8_2
+
+# USB fault signal DRP
+,-P8_3
+
+# Not connected
+#,-P8_4
+
+# PDM
+PDM_CLK,P8_5
+PDM_DATA,P8_6
+
+# Not connected
+#,-P8_7
+
+# J5 connector
+SERIAL_INT0,P9_0
+SERIAL_INT1,P9_1
+SERIAL_INT2,P9_2
+SERIAL_INT3,P9_3
+
+# Bluetooth
+,-P10_0
+,-P10_1
+,-P10_2
+,-P10_3
+,-P10_4
+
+# User LED2
+USER_LED2,P10_5
+
+# Bluetooth
+,-P10_6
+
+# User LED1
+USER_LED1,P10_7
+
+# Bluetooth
+,-P11_0
+
+# PCKL level translator
+,-P11_1
+
+# Bluetooth
+,-P11_2
+
+# Int pressure sensor
+PRESS_SENS_INT,P11_3
+
+# Wifi
+,-P11_4
+
+# Not connected
+#,-P11_5
+
+# Wifi
+,-P11_6
+
+# Not connected
+#,-P11_7
+
+# Wifi
+,-P12_0
+,-P12_1
+,-P12_2
+
+# I2S FYSYNC
+I2S_TX_FYSYNC,P12_3
+
+# Wifi
+,-P12_4
+,-P12_5
+
+# J17 expansion connector
+,P13_0
+,P13_1
+,P13_2
+,P13_3
+,P13_4
+,P13_5
+,P13_6
+,P13_7
+
+# Analog microphones
+AMIC1_CTB_INP,P14_0
+AMIC1_CTB_INN,P14_1
+AMIC1_CTB_OUT,P14_2
+AMIC2_CTB_OUT,P14_3
+AMIC2_CTB_INP,P14_4
+AMIC2_CTB_INN,P14_5
+AMIC1_CTB_REF,P14_6
+AMIC2_CTB_REF,P14_7
+
+# J17 expansion connector
+,P15_0
+,P15_1
+,P15_2
+,P15_3
+,P15_4
+,P15_5
+,P15_6
+,P15_7
+
+# J14 connector
+,P16_0
+,P16_1
+,P16_2
+,P16_3
+,P16_4
+,P16_5
+,P16_6
+,P16_7
+I2C_SCL_3V3,P17_0
+I2C_SDA_3V3,P17_1
+,P17_2
+,P17_3
+,P17_4
+,P17_5
+
+# Boot
+,-P17_6
+
+# J14 connector
+,P17_7
+
+# Oscillators
+,-P18_0
+,-P18_1
+,-P19_0
+,-P19_1
+
+,-P20_0
+# Serial Int config
+,-P20_1
+,-P20_2
+
+# Int Radar
+RADAR_INT,P20_3
+
+# USER LED RGB G
+USER_LED_G,P20_4
+# USER LED RGB B
+USER_LED_B,P20_5
+# USER LED RGB R
+USER_LED_R,P20_6
+
+# Radar reset
+RADAR_RESET,P20_7
+
+# Wifi
+,-P21_0
+
+# I2S
+I2S_TX_SD,P21_1
+I2S_TX_SCK,P21_2
+I2S_TX_MCK,P21_3
+
+# Radar SPI
+RADAR_SPI_MISO,P21_4
+RADAR_SPI_MOSI,P21_5
+RADAR_SPI_CLK,P21_6
+RADAR_SPI_CS,P21_7
\ No newline at end of file
diff --git a/ports/psoc-edge/boards/deploy.md b/ports/psoc-edge/boards/deploy.md
new file mode 100644
index 00000000000..800311487b1
--- /dev/null
+++ b/ports/psoc-edge/boards/deploy.md
@@ -0,0 +1,44 @@
+### Prerequisites
+
+To facilitate the installation of the MicroPython PSOC™ Edge port, the `mp-ifx-flash.py` Python script is
+provided. It is compatible with Windows, Linux, and macOS.
+
+Before downloading and running the script, it is recommended to create a new folder to keep all the
+related files together. For example:
+
+```bash
+mkdir mp-install
+cd mp-install
+```
+
+You can easily download the script from the terminal using the following command:
+
+```bash
+curl -s -L https://raw.githubusercontent.com/micropython/micropython/master/ports/psoc-edge/tools/mp-ifx-flash.py > mp-ifx-flash.py
+```
+
+Ensure you have a recent version of [Python 3.x](https://www.python.org/downloads/) and the
+[pip](https://pip.pypa.io/en/stable/installation/) package installer installed. Then install the following packages:
+
+```bash
+pip install requests
+```
+
+### Flashing
+
+Flashing can be done using the `from-package` command. Specify the board using the `--board` flag, and the path to the downloaded `.zip` package using the `--zip-package` flag, as shown below:
+
+```bash
+python mp-ifx-flash.py from-package --board KIT_PSE84_AI --zip-package pathtodir/psoc-edge-package.zip
+```
+
+#### Multiple connected devices
+
+If you have multiple PSOC™ Edge boards connected to your computer, you can identify them by their
+serial number and flash each one individually. To do so, use the `-n` flag to provide the serial number of
+the target board as shown below:
+
+```bash
+python mp-ifx-flash.py from-package --board KIT_PSE84_AI --zip-package pathtodir/psoc-edge-package.zip -n 181F0D5A01212300
+```
+
diff --git a/ports/psoc-edge/boards/make-pins.py b/ports/psoc-edge/boards/make-pins.py
new file mode 100644
index 00000000000..1a15cfb05e7
--- /dev/null
+++ b/ports/psoc-edge/boards/make-pins.py
@@ -0,0 +1,456 @@
+from operator import add
+import os
+import re
+import sys
+from collections import defaultdict, namedtuple
+
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../tools"))
+import boardgen
+
+SUPPORTED_AF = {
+ "I2C": ["SDA", "SCL"],
+ "UART": ["TX", "RX", "CTS", "RTS"],
+ "SPI": ["CLK", "MOSI", "MISO", "SELECT0", "SELECT1"],
+ "PDM": ["CLK", "DATA"],
+ "TCPWM": ["LINE"],
+ # TODO: Other active functionalities that we need to figure out:
+ # - TDM
+ # - SMIF
+ # - CANFD
+ # - PERIx_TR_IO
+ # - SDHC
+ # - ETH
+ # - GFXSS
+ # - DEBUG
+ # - I3C
+ # - M33SYSCPUSS
+ # - SRSS_EXT_CLK
+}
+
+# Contains the result of parsing an cell from af.csv.
+PinAf = namedtuple(
+ "PinAf",
+ [
+ "af_idx", # int, 0-15
+ "af_fn", # e.g. "I2C"
+ "af_unit", # int, e.g. 1 (for I2C1) or None (for OTG_HS_ULPI_CK)
+ "af_signal", # e.g. "SDA"
+ "af_supported", # bool, see table above
+ "af_name", # e.g. "ACT_x"
+ "af_ptr", # SCBx or
+ ],
+)
+
+
+class PSE84Pin(boardgen.Pin):
+ def __init__(self, cpu_pin_name):
+ super().__init__(cpu_pin_name)
+
+ # The pins are name like PX_Y, where X is the port number and Y is the pin number.
+ # Each of the numbers can be multiple digits.
+ # The port are the characters after 'P' and before '_'
+ self._port = int(cpu_pin_name[1 : cpu_pin_name.index("_")])
+ # The pin number is the characters after '_'
+ self._pin = int(cpu_pin_name[cpu_pin_name.index("_") + 1 :])
+
+ # List of PinAF instances
+ self._afs = []
+
+ def definition(self):
+ return f"PIN({self._port}, {self._pin}, pin_{self.name()}_af)"
+
+ def add_af_scb(self, af_idx, af_name, af):
+ # The SCB alternate function follow the
+ # convention:
+ # SCB__
+
+ # The peripheral pointer is the first prefix including
+ # number, e.g. SCB0
+ af_ptr = af.split("_")[0]
+ # The unit is the number after "SCB" and before "_".
+ # For example for SCB0 -> 0.
+ af_unit = af.split("_")[0][3:] # After 'SCB'
+ # The second token is the function.
+ # For example I2C, SPI, UART
+ af_fn = af.split("_")[1]
+ # The last token is the signal signal type for the
+ # given function, e.g. SDA, SCL, MOSI
+ af_signal = af.split("_")[2]
+
+ af_supported = af_fn in SUPPORTED_AF and af_signal in SUPPORTED_AF[af_fn]
+
+ pin_af = PinAf(af_idx, af_fn, af_unit, af_signal, af_supported, af_name, af_ptr)
+ self._afs.append(pin_af)
+
+ def add_af_pdm(self, af_idx, af_name, af):
+ # The PDM alternate function follow
+ # the convention:
+ # PDM_PDM_
+
+ af_ptr = (
+ af.split("_")[0] + "0"
+ ) # The peripheral is PDM0 (this index is missing in .csv definition)
+ af_fn = af.split("_")[1]
+
+ # Split the signal+channel part into alphabetic (signal) and numeric (unit) parts
+ signal_channel = af.split("_")[2]
+
+ # Find where the numeric part starts
+ match = re.match(r"^([A-Za-z]+)(\d+)$", signal_channel)
+
+ if match:
+ af_signal = match.group(1) # Alphabetic part (e.g., "CLK", "DATA")
+ af_unit = match.group(2) # Numeric part (e.g., "3", "15", "123")
+ else:
+ # Fallback for unexpected format
+ af_signal = signal_channel
+ af_unit = None
+
+ af_supported = af_fn in SUPPORTED_AF and af_signal in SUPPORTED_AF[af_fn]
+
+ pin_af = PinAf(af_idx, af_fn, af_unit, af_signal, af_supported, af_name, af_ptr)
+ self._afs.append(pin_af)
+
+ def add_af_tcpwm(self, af_idx, af_name, af):
+ # The TCPWM alternate functions can appear directly as TCPWM0_LINE
+ # or as a suffix after another function, e.g. SMIFx_..._TCPWM0_LINE.
+ match = re.search(r"(TCPWM\d+)_(LINE(?:_COMPL)?)(\d+)$", af)
+ if not match:
+ return
+
+ af_ptr = match.group(1)
+ af_fn = "TCPWM"
+ af_signal = match.group(2)
+ af_unit = match.group(3)
+
+ af_supported = af_fn in SUPPORTED_AF and af_signal in SUPPORTED_AF[af_fn]
+
+ pin_af = PinAf(af_idx, af_fn, af_unit, af_signal, af_supported, af_name, af_ptr)
+ self._afs.append(pin_af)
+
+ def add_af(self, af_idx, af_name, af):
+ # The AF index matches the column index for the ACTx functions 0-15
+ # while for DSx functions the columns 16-19 are mapped to DS2-DS5 respectively.
+ af_act_max_idx = 15
+ af_ds_num = 4
+
+ if af_idx > af_act_max_idx + af_ds_num:
+ return
+
+ if af_idx <= af_act_max_idx:
+ if af_name != "ACT_{:d}".format(af_idx):
+ raise boardgen.PinGeneratorError(
+ "Invalid AF column name '{:s}' for AF index {:d}.".format(af_name, af_idx)
+ )
+
+ if af_idx > af_act_max_idx:
+ format_idx = (
+ af_idx - af_act_max_idx + 1
+ ) # The starting index is 2, so we need to subtract
+ # the max ACTx index and add 1 to get the correct DS index.
+ if af_name != "DS_{:d}".format(format_idx):
+ raise boardgen.PinGeneratorError(
+ "Invalid AF column name '{:s}' for AF index {:d}.".format(af_name, af_idx)
+ )
+ # TODO: Review implementation.
+ # The names have the following patterns:
+ #
+ # __
+ #
+ # As this is not very consistent we will handle each case
+ # separately and as we improve our understanding we will update
+ # this code accordingly.
+ # Currently we are using the definition in the GPIO_PSE84_BGA_220
+ # file which has manually added to the boards/pse84x_af.csv.
+ # But ideally this could be also automatically generated if more
+ # PSE devices need to be supported in the future.
+
+ # If the prefix match the format SBCx
+ if af.startswith("SCB"):
+ self.add_af_scb(af_idx, af_name, af)
+ elif af.startswith("PDM"):
+ self.add_af_pdm(af_idx, af_name, af)
+ elif "TCPWM" in af:
+ self.add_af_tcpwm(af_idx, af_name, af)
+ else:
+ # TODO: Extend the parsing to other peripherals.
+ pass
+
+ # This will be called at the start of the output (after the prefix). Use
+ # it to emit the af objects (via the AF() macro).
+ def print_source(self, out_source):
+ print(file=out_source)
+ print("const machine_pin_af_obj_t pin_{:s}_af[] = {{".format(self.name()), file=out_source)
+ for af in self._afs:
+ if af.af_supported:
+ print(" ", end="", file=out_source)
+ else:
+ print(" // ", end="", file=out_source)
+ # AF(af_name_idx, af_fn, af_unit, af_signal, af_ptr)
+ print(
+ "AF({:s}, {:s}, {:s}, {:s}, {:s}), // {:s}_{:s}{:s}_{:s}".format(
+ af.af_name,
+ af.af_fn,
+ af.af_unit or 0,
+ af.af_signal or "NONE",
+ af.af_ptr,
+ af.af_ptr,
+ af.af_fn,
+ af.af_unit,
+ af.af_signal,
+ ),
+ file=out_source,
+ )
+ print("};", file=out_source)
+
+
+class PSE84PinGenerator(boardgen.PinGenerator):
+ def __init__(self):
+ super().__init__(pin_type=PSE84Pin, enable_af=True)
+ self._unhidden_ports = []
+ self._port_max_index = 0
+
+ self._unhidden_scb = []
+ self._scb_max_index = 0
+
+ self._unhidden_i2c = []
+ self._unhidden_spi = []
+ self._unhidden_uart = []
+
+ # TCPWM LINE tracking
+ self._pwm_pin_count = 0 # unique exposed pins with a TCPWM LINE AF
+ self._tcpwm_counter_max = 0 # highest counter number seen across all LINE AFs
+ self._tcpwm_counters = [] # sorted unique TCPWM counter IDs seen in LINE AFs
+
+ # Collect all unhidden ports from the available
+ # pins.
+ # This function can be only used after parse_board_csv()
+ # has run, as the available_pin generator is constructed
+ # there.
+ def add_ports(self):
+ for pin in self.available_pins():
+ if pin._port > self._port_max_index:
+ self._port_max_index = pin._port
+ if pin._port not in self._unhidden_ports and not pin._hidden:
+ self._unhidden_ports.append(pin._port)
+
+ # Collect all unhidden SCB units from the available pins.
+ # And the each of the potential available I2C, SPI and UART units
+ # It will not verify that all signals are available for a given unit.
+ # Therefore, the actual amount of available units for each protocol
+ # may be lower than the one collected here.
+ def add_scbs(self):
+ for pin in self.available_pins():
+ if not pin._hidden:
+ for af in pin._afs:
+ if af.af_ptr.startswith("SCB"):
+ if af.af_unit not in self._unhidden_scb:
+ self._unhidden_scb.append(af.af_unit)
+ if int(af.af_unit) > self._scb_max_index:
+ self._scb_max_index = int(af.af_unit)
+
+ if af.af_fn == "I2C":
+ if af.af_unit not in self._unhidden_i2c:
+ self._unhidden_i2c.append(af.af_unit)
+ elif af.af_fn == "SPI":
+ if af.af_unit not in self._unhidden_spi:
+ self._unhidden_spi.append(af.af_unit)
+ elif af.af_fn == "UART":
+ if af.af_unit not in self._unhidden_uart:
+ self._unhidden_uart.append(af.af_unit)
+
+ self._unhidden_scb.sort(key=int)
+ self._unhidden_i2c.sort(key=int)
+ self._unhidden_spi.sort(key=int)
+ self._unhidden_uart.sort(key=int)
+
+ # Collect TCPWM LINE statistics across all available pins:
+ # - count of unique TCPWM counter IDs visible through at least one LINE AF
+ # (this equals the maximum number of concurrent PWM instances)
+ # - highest counter number seen (used to compute compact array size)
+ def add_tcpwm(self):
+ seen_counters = set()
+ for pin in self.available_pins():
+ for af in pin._afs:
+ if af.af_fn == "TCPWM" and af.af_signal == "LINE" and af.af_supported:
+ counter_num = int(af.af_unit)
+ seen_counters.add(counter_num)
+ if counter_num > self._tcpwm_counter_max:
+ self._tcpwm_counter_max = counter_num
+ self._tcpwm_counters = sorted(seen_counters)
+ self._pwm_pin_count = len(seen_counters)
+
+ # Override the parse_board_csv to add
+ # the unhidden ports after parsing the board CSV.
+ def parse_board_csv(self, filename):
+ super().parse_board_csv(filename)
+ self.add_ports()
+ self.add_scbs()
+ self.add_tcpwm()
+
+ # Override the default implementation just to change the default arguments
+ # (extra header row, skip first column).
+ def parse_af_csv(self, filename):
+ return super().parse_af_csv(filename, header_rows=1, pin_col=1, af_col=2)
+
+ def print_port_defines(self, out_header):
+ print(file=out_header)
+ print(
+ f"#define MICROPY_PY_MACHINE_PIN_PORT_NUM_ENTRIES ({self._port_max_index + 1})",
+ file=out_header,
+ )
+
+ print(file=out_header)
+ print("// The MICROPY_PY_MACHINE_PIN_FOR_ALL_PORTS(DO) macro will", file=out_header)
+ print("// apply the DO macro to all user available ports.", file=out_header)
+ print("// The DO macro takes the port as argument: DO(port).", file=out_header)
+ print("#define MICROPY_PY_MACHINE_PIN_FOR_ALL_PORTS(DO) \\", file=out_header)
+
+ lines = [f"DO({port})" for port in self._unhidden_ports]
+ macro_body = " \\\n".join(lines)
+ print(macro_body, file=out_header)
+
+ print(file=out_header)
+
+ def print_scb_defines(self, out_header):
+ print(file=out_header)
+ print(
+ f"#define MICROPY_PY_MACHINE_SCB_NUM_ENTRIES ({self._scb_max_index + 1})",
+ file=out_header,
+ )
+
+ print(
+ f"#define MICROPY_PY_MACHINE_I2C_NUM_ENTRIES ({len(self._unhidden_i2c)})",
+ file=out_header,
+ )
+
+ print(
+ f"#define MICROPY_PY_MACHINE_SPI_NUM_ENTRIES ({len(self._unhidden_spi)})",
+ file=out_header,
+ )
+
+ print(
+ f"#define MICROPY_PY_MACHINE_UART_NUM_ENTRIES ({len(self._unhidden_uart)})",
+ file=out_header,
+ )
+
+ print(file=out_header)
+ print("// The MICROPY_PY_MACHINE_FOR_ALL_SCB(DO) macro will", file=out_header)
+ print("// apply the DO macro to all user available SCB units.", file=out_header)
+ print("// The DO macro takes the SCB unit as argument: DO(unit).", file=out_header)
+ print("#define MICROPY_PY_MACHINE_FOR_ALL_SCB(DO) \\", file=out_header)
+
+ lines = [f"DO({scb})" for scb in self._unhidden_scb]
+ macro_body = " \\\n".join(lines)
+ print(macro_body, file=out_header)
+
+ print(file=out_header)
+
+ # Overwrite print_header to extend the print header base class
+ # function with the pin port defines
+ def print_header(self, out_header):
+ super().print_header(out_header)
+ self.print_port_defines(out_header)
+
+ def print_tcpwm_defines(self, out_header):
+ # TCPWM counter ownership array must be large enough to index the highest
+ # counter number seen. Counters 0-7 map to indices 0-7, counters 256+ map
+ # to indices 8+, so the compact array size is (max_counter - 256 + 8 + 1)
+ # for high counters, or simply (max_counter + 1) for low ones.
+ max_c = self._tcpwm_counter_max
+ if max_c >= 256:
+ num_counters = (max_c - 256 + 8) + 1
+ else:
+ num_counters = max_c + 1
+
+ print(file=out_header)
+ print(
+ "// Number of entries in the compact TCPWM0 counter ownership array.",
+ file=out_header,
+ )
+ print(
+ f"#define MICROPY_PY_MACHINE_TCPWM0_NUM_COUNTERS ({num_counters}U)",
+ file=out_header,
+ )
+ print(
+ "// Number of exposed GPIO pins that support at least one TCPWM LINE AF.",
+ file=out_header,
+ )
+ print(
+ f"#define MICROPY_PY_MACHINE_PWM_MAX_OBJS ({self._pwm_pin_count})",
+ file=out_header,
+ )
+ print(file=out_header)
+
+ def print_tcpwm_hw_map(self, out_header):
+ # Unified TCPWM hardware map combining timer-id, counter, IRQ and PCLK.
+ # Both the timer map and the counter map cover the same 32 counters, so
+ # a single source-of-truth macro is sufficient.
+ # Each row: X(timer_id, tcpwm_counter_num, irq, pclk_dst)
+ hw_entries = [
+ # Group 0 (32-bit): Timer IDs 0-7 -> counters 0-7.
+ (0, "0U", "tcpwm_0_interrupts_0_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN0"),
+ (1, "1U", "tcpwm_0_interrupts_1_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN1"),
+ (2, "2U", "tcpwm_0_interrupts_2_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN2"),
+ (3, "3U", "tcpwm_0_interrupts_3_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN3"),
+ (4, "4U", "tcpwm_0_interrupts_4_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN4"),
+ (5, "5U", "tcpwm_0_interrupts_5_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN5"),
+ (6, "6U", "tcpwm_0_interrupts_6_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN6"),
+ (7, "7U", "tcpwm_0_interrupts_7_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN7"),
+ # Group 1 (16-bit): Timer IDs 8-31 -> counters 256-279.
+ (8, "256U", "tcpwm_0_interrupts_256_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN256"),
+ (9, "257U", "tcpwm_0_interrupts_257_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN257"),
+ (10, "258U", "tcpwm_0_interrupts_258_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN258"),
+ (11, "259U", "tcpwm_0_interrupts_259_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN259"),
+ (12, "260U", "tcpwm_0_interrupts_260_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN260"),
+ (13, "261U", "tcpwm_0_interrupts_261_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN261"),
+ (14, "262U", "tcpwm_0_interrupts_262_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN262"),
+ (15, "263U", "tcpwm_0_interrupts_263_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN263"),
+ (16, "264U", "tcpwm_0_interrupts_264_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN264"),
+ (17, "265U", "tcpwm_0_interrupts_265_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN265"),
+ (18, "266U", "tcpwm_0_interrupts_266_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN266"),
+ (19, "267U", "tcpwm_0_interrupts_267_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN267"),
+ (20, "268U", "tcpwm_0_interrupts_268_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN268"),
+ (21, "269U", "tcpwm_0_interrupts_269_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN269"),
+ (22, "270U", "tcpwm_0_interrupts_270_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN270"),
+ (23, "271U", "tcpwm_0_interrupts_271_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN271"),
+ (24, "272U", "tcpwm_0_interrupts_272_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN272"),
+ (25, "273U", "tcpwm_0_interrupts_273_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN273"),
+ (26, "274U", "tcpwm_0_interrupts_274_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN274"),
+ (27, "275U", "tcpwm_0_interrupts_275_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN275"),
+ (28, "276U", "tcpwm_0_interrupts_276_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN276"),
+ (29, "277U", "tcpwm_0_interrupts_277_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN277"),
+ (30, "278U", "tcpwm_0_interrupts_278_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN278"),
+ (31, "279U", "tcpwm_0_interrupts_279_IRQn", "PCLK_TCPWM0_CLOCK_COUNTER_EN279"),
+ ]
+
+ print(file=out_header)
+ print(
+ "// Unified TCPWM hardware map: timer_id, counter_num, IRQ, PCLK destination.",
+ file=out_header,
+ )
+ print("// Each row: X(timer_id, tcpwm_counter_num, irq, pclk_dst)", file=out_header)
+ print("#define MICROPY_PY_MACHINE_TCPWM_HW_MAP(X) \\", file=out_header)
+ for i, (tid, counter, irq, pclk) in enumerate(hw_entries):
+ suffix = " \\" if i < len(hw_entries) - 1 else ""
+ print(f" X({tid:2d}, {counter}, {irq}, {pclk}){suffix}", file=out_header)
+ print(file=out_header)
+
+ def print_af_header(self, out_af_header):
+ self.print_scb_defines(out_af_header)
+ self.print_tcpwm_defines(out_af_header)
+ self.print_tcpwm_hw_map(out_af_header)
+
+ # Add additional header file for AF defines and constants
+ def extra_args(self, parser):
+ parser.add_argument("--output-af-header")
+
+ # Called in main() after everything else is done to write additional files.
+ def generate_extra_files(self):
+ if self.args.output_af_header:
+ with open(self.args.output_af_header, "w") as out_af_header:
+ self.print_af_header(out_af_header)
+
+
+if __name__ == "__main__":
+ PSE84PinGenerator().main()
diff --git a/ports/psoc-edge/boards/manifest.py b/ports/psoc-edge/boards/manifest.py
new file mode 100644
index 00000000000..c80309cf675
--- /dev/null
+++ b/ports/psoc-edge/boards/manifest.py
@@ -0,0 +1 @@
+freeze("$(PORT_DIR)/modules")
diff --git a/ports/psoc-edge/boards/pse84_prefix.c b/ports/psoc-edge/boards/pse84_prefix.c
new file mode 100644
index 00000000000..99c79d2eeff
--- /dev/null
+++ b/ports/psoc-edge/boards/pse84_prefix.c
@@ -0,0 +1,24 @@
+#include "py/obj.h"
+#include "py/mphal.h"
+#include "machine_pin.h"
+#include "machine_pin_af.h"
+#include "cy_device_headers_ns.h"
+
+#define AF(af_name_idx, af_fn, af_unit, af_signal, af_ptr) \
+ { \
+ .idx = HSIOM_SEL_##af_name_idx, \
+ .fn = MACHINE_PIN_AF_FN_##af_fn, \
+ .unit = (af_unit), \
+ .signal = MACHINE_PIN_AF_SIGNAL_##af_fn##_##af_signal, \
+ .periph = (af_ptr) \
+ }
+
+#define PIN(p_port, p_pin, p_af) \
+ { \
+ { &machine_pin_type }, \
+ .name = MP_QSTR_P##p_port##_##p_pin, \
+ .port = (p_port), \
+ .pin = (p_pin), \
+ .af_num = (sizeof(p_af) / sizeof(machine_pin_af_obj_t)), \
+ .af = (p_af) \
+ }
diff --git a/ports/psoc-edge/boards/pse8x_af.csv b/ports/psoc-edge/boards/pse8x_af.csv
new file mode 100644
index 00000000000..bcb484d528b
--- /dev/null
+++ b/ports/psoc-edge/boards/pse8x_af.csv
@@ -0,0 +1,133 @@
+Port ,Pin ,ACT_0 ,ACT_1 ,ACT_2 ,ACT_3 ,ACT_4 ,ACT_5 ,ACT_6 ,ACT_7 ,ACT_8 ,ACT_9 ,ACT_10 ,ACT_11 ,ACT_12,ACT_13 ,ACT_14 ,ACT_15 ,DS_2 ,DS_3 ,DS_4 ,DS_5
+Port0 ,P0_0 ,SMIF1_SMIF0_SPIHB_SELECT1,TCPWM0_LINE0 ,TCPWM0_LINE256 , ,SCB3_SPI_SELECT0, , , , , , , , , , , , , , ,
+Port0 ,P0_1 ,SMIF1_SMIF0_SPIHB_SELECT2,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE_COMPL256 , , , , , , , , , , , , , , , , ,
+Port1 ,P1_0 , ,SMIF0_SPIHB_DATA0_TCPWM0_LINE1 ,SMIF0_SPIHB_DATA0_TCPWM0_LINE257 , , , , , , , , , , , , , , , , ,
+Port1 ,P1_1 , ,SMIF0_SPIHB_DATA1_TCPWM0_LINE_COMPL1,SMIF0_SPIHB_DATA1_TCPWM0_LINE_COMPL257, , , , , , , , , , , , , , , , ,
+Port1 ,P1_2 , ,SMIF0_SPIHB_DATA2_TCPWM0_LINE2 ,SMIF0_SPIHB_DATA2_TCPWM0_LINE258 , , , , , , , , , , , , , , , , ,
+Port1 ,P1_3 , ,SMIF0_SPIHB_DATA3_TCPWM0_LINE_COMPL2,SMIF0_SPIHB_DATA3_TCPWM0_LINE_COMPL258, , , , , , , , , , , , , , , , ,
+Port1 ,P1_4 , ,SMIF0_SPIHB_DATA4_TCPWM0_LINE3 ,SMIF0_SPIHB_DATA4_TCPWM0_LINE259 , , , , , , , , , , , , , , , , ,
+Port1 ,P1_5 , ,SMIF0_SPIHB_DATA5_TCPWM0_LINE_COMPL3,SMIF0_SPIHB_DATA5_TCPWM0_LINE_COMPL259, , , , , , , , , , , , , , , , ,
+Port1 ,P1_6 , ,SMIF0_SPIHB_DATA6_TCPWM0_LINE4 ,SMIF0_SPIHB_DATA6_TCPWM0_LINE260 , , , , , , , , , , , , , , , , ,
+Port1 ,P1_7 , ,SMIF0_SPIHB_DATA7_TCPWM0_LINE_COMPL4,SMIF0_SPIHB_DATA7_TCPWM0_LINE_COMPL260, , , , , , , , , , , , , , , , ,
+Port2 ,P2_0 ,SMIF0_SMIF0_SPIHB_SELECT1,TCPWM0_LINE5 ,TCPWM0_LINE261 , , , , , , , , , , , , , , , , ,
+Port3 ,P3_0 , ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL261 , , , , , , , , , , , ,SDHC1_CARD_MECH_WRITE_PROT,I3C_I3C_SCL , , , ,
+Port3 ,P3_1 , ,TCPWM0_LINE6 ,TCPWM0_LINE262 , , , , , , , , , , , , ,I3C_I3C_SDA , , , ,
+Port4 ,P4_0 , ,SMIF1_SPIHB_DATA0_TCPWM0_LINE_COMPL6,SMIF1_SPIHB_DATA0_TCPWM0_LINE_COMPL262, , , , , , , , , , , , , , , , ,
+Port4 ,P4_1 , ,SMIF1_SPIHB_DATA1_TCPWM0_LINE7 ,SMIF1_SPIHB_DATA1_TCPWM0_LINE263 , , , , , , , , , , , , , , , , ,
+Port4 ,P4_2 , ,SMIF1_SPIHB_DATA2_TCPWM0_LINE_COMPL7,SMIF1_SPIHB_DATA2_TCPWM0_LINE_COMPL263, , , , , , , , , , , , , , , , ,
+Port4 ,P4_3 , ,SMIF1_SPIHB_DATA3_TCPWM0_LINE0 ,SMIF1_SPIHB_DATA3_TCPWM0_LINE264 , , , , , , , , , , , , ,SMIF1_SPIHB_DATA3_DEBUG600_TRACE_CLOCK, , , ,
+Port4 ,P4_4 , ,SMIF1_SPIHB_DATA4_TCPWM0_LINE_COMPL0,SMIF1_SPIHB_DATA4_TCPWM0_LINE_COMPL264, , , , , , , , , , , , ,SMIF1_SPIHB_DATA4_DEBUG600_TRACE_DATA0, , , ,
+Port4 ,P4_5 , ,SMIF1_SPIHB_DATA5_TCPWM0_LINE1 ,SMIF1_SPIHB_DATA5_TCPWM0_LINE265 , , , , , , , , , , , , ,SMIF1_SPIHB_DATA5_DEBUG600_TRACE_DATA1, , , ,
+Port4 ,P4_6 , ,SMIF1_SPIHB_DATA6_TCPWM0_LINE_COMPL1,SMIF1_SPIHB_DATA6_TCPWM0_LINE_COMPL265, , , , , , , , , , , , ,SMIF1_SPIHB_DATA6_DEBUG600_TRACE_DATA2, , , ,
+Port4 ,P4_7 , ,SMIF1_SPIHB_DATA7_TCPWM0_LINE2 ,SMIF1_SPIHB_DATA7_TCPWM0_LINE266 , , , , , , , , , , , , ,SMIF1_SPIHB_DATA7_DEBUG600_TRACE_DATA3, , , ,
+Port5 ,P5_0 ,SMIF0_SMIF0_SPIHB_SELECT0,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE_COMPL266 , , , , , , , , , , , , , , , , ,
+Port6 ,P6_0 , ,TCPWM0_LINE3 ,TCPWM0_LINE267 , , , , , , , , , , , ,SDHC1_CARD_MECH_WRITE_PROT, , , , ,DEBUG600_SWJ_SWO_TDO
+Port6 ,P6_1 , ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL267 , , , , , , , , , , , , ,SDHC1_LED_CTRL , , , ,DEBUG600_SWJ_SWDOE_TDI
+Port6 ,P6_2 , ,TCPWM0_LINE4 ,TCPWM0_LINE268 , , , , , , , , , , , , ,SDHC1_CARD_IF_PWR_EN , , , ,DEBUG600_SWJ_SWDIO_TMS
+Port6 ,P6_3 , ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL268 , , , ,SCB2_SPI_SELECT1 , , , , , , , , , , , , ,DEBUG600_CLK_SWJ_SWCLK_TCLK
+Port6 ,P6_4 , ,TCPWM0_LINE5 ,TCPWM0_LINE269 , , , ,SCB2_SPI_MISO , ,SCB2_UART_CTS , , , , , , ,SDHC1_CARD_DAT_7TO40 , , , ,
+Port6 ,P6_5 , ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL269 , , , ,SCB2_SPI_CLK ,SCB2_I2C_SCL ,SCB2_UART_RX , , , , , , ,SDHC1_CARD_DAT_7TO41 , , , ,
+Port6 ,P6_6 , ,TCPWM0_LINE6 ,TCPWM0_LINE270 , , , ,SCB2_SPI_SELECT0 , ,SCB2_UART_RTS , , , , , , ,SDHC1_CARD_DAT_7TO42 , , , ,
+Port6 ,P6_7 ,SMIF0_SMIF0_SPIHB_SELECT2,TCPWM0_LINE_COMPL6 ,TCPWM0_LINE_COMPL270 , , , ,SCB2_SPI_MOSI ,SCB2_I2C_SDA ,SCB2_UART_TX , , , , , , ,SDHC1_CARD_DAT_7TO43 , , , ,
+Port7 ,P7_0 ,SMIF0_SMIF0_SPIHB_SELECT3,TCPWM0_LINE7 ,TCPWM0_LINE271 ,M33SYSCPUSS_FAULT0, , , , , , ,PERI0_TR_IO_OUTPUT0,PERI1_TR_IO_OUTPUT0, , , ,SDHC1_CARD_CMD , , , ,
+Port7 ,P7_1 , ,TCPWM0_LINE_COMPL7 ,TCPWM0_LINE_COMPL271 ,M33SYSCPUSS_FAULT1, , , , , , ,PERI0_TR_IO_OUTPUT1,PERI1_TR_IO_OUTPUT1, , , ,SDHC1_CLK_CARD , , , ,
+Port7 ,P7_2 , ,TCPWM0_LINE0 ,TCPWM0_LINE272 , , , , , , , , , , , , ,SDHC1_CARD_EMMC_RESET_N , , , ,DEBUG600_RST_SWJ_TRSTN
+Port7 ,P7_3 , ,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE_COMPL272 , , , , , , , , , , , , ,SDHC1_CARD_DAT_3TO00 , , , ,
+Port7 ,P7_4 , ,TCPWM0_LINE1 ,TCPWM0_LINE273 , ,SRSS_EXT_CLK , , , , , , , , , , ,SDHC1_CARD_DETECT_N , , , ,
+Port7 ,P7_5 , ,TCPWM0_LINE_COMPL1 ,TCPWM0_LINE_COMPL273 , , , , , , , ,PERI0_TR_IO_INPUT4 ,PERI1_TR_IO_INPUT4 , , , ,SDHC1_CARD_DAT_3TO01 , , , ,
+Port7 ,P7_6 , ,TCPWM0_LINE2 ,TCPWM0_LINE274 , , , , , , , ,PERI0_TR_IO_INPUT5 ,PERI1_TR_IO_INPUT5 , , , ,SDHC1_CARD_DAT_3TO02 , , , ,
+Port7 ,P7_7 , ,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE_COMPL274 , , , , , , , ,PERI0_TR_IO_INPUT6 ,PERI1_TR_IO_INPUT6 , , , ,SDHC1_CARD_DAT_3TO03 , , , ,
+Port8 ,P8_0 , ,TCPWM0_LINE3 ,TCPWM0_LINE275 , , , , , , , ,PERI0_TR_IO_INPUT7 ,PERI1_TR_IO_INPUT7 , , , , ,SCB0_SPI_CLK ,SCB0_I2C_SCL , ,M0SECCPUSS_M0SEC_SWD
+Port8 ,P8_1 , ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL275 , , , , , , ,PDM_PDM_CLK2 , , , , , , ,SCB0_SPI_MOSI ,SCB0_I2C_SDA , ,M0SECCPUSS_CLK_M0SEC_SWD
+Port8 ,P8_2 , ,TCPWM0_LINE4 ,TCPWM0_LINE276 , , , , , , , , , , , , , ,SCB0_SPI_SELECT0, , ,
+Port8 ,P8_3 , ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL276 , , , , , , , , , , , , , ,SCB0_SPI_SELECT1, , ,
+Port8 ,P8_4 , ,TCPWM0_LINE5 ,TCPWM0_LINE277 , , , , , , ,PDM_PDM_DATA2, , , , , , ,SCB0_SPI_MISO ,SRSS_CAL_WAVE , ,
+Port8 ,P8_5 , ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL277 , , , , , , ,PDM_PDM_CLK3 , , , , , , , , , ,
+Port8 ,P8_6 , ,TCPWM0_LINE6 ,TCPWM0_LINE278 , , , , , , ,PDM_PDM_DATA3, , , , , , , , , ,
+Port8 ,P8_7 , ,TCPWM0_LINE_COMPL6 ,TCPWM0_LINE_COMPL278 , , , , , , , , , , , , , , , , ,
+Port9 ,P9_0 , ,TCPWM0_LINE7 ,TCPWM0_LINE_COMPL279 , , , ,SCB1_SPI_SELECT0 , , ,PDM_PDM_CLK5 , , , , , , , , , ,
+Port9 ,P9_1 , ,TCPWM0_LINE0 ,TCPWM0_LINE_COMPL256 , , , ,SCB1_SPI_MISO , ,SCB1_UART_CTS ,PDM_PDM_DATA5, , , , , , , , , ,
+Port9 ,P9_2 , ,TCPWM0_LINE_COMPL7 ,TCPWM0_LINE279 , , , ,SCB1_SPI_MOSI ,SCB1_I2C_SDA ,SCB1_UART_TX ,PDM_PDM_CLK4 , , , , , , , , , ,
+Port9 ,P9_3 , ,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE256 , , , ,SCB1_SPI_CLK ,SCB1_I2C_SCL ,SCB1_UART_RX ,PDM_PDM_DATA4, , , , , , , , , ,
+Port10,P10_0, ,TCPWM0_LINE1 ,TCPWM0_LINE257 ,M33SYSCPUSS_FAULT0, , , ,SCB4_I2C_SCL ,SCB4_UART_RX , , , , , , ,ETH_TXD3 , , , ,
+Port10,P10_1, ,TCPWM0_LINE_COMPL1 ,TCPWM0_LINE_COMPL257 ,M33SYSCPUSS_FAULT1, , ,SCB4_SPI_CLK ,SCB4_I2C_SDA ,SCB4_UART_TX , , , , , , ,ETH_RX_CLK , , , ,
+Port10,P10_2, ,TCPWM0_LINE2 ,TCPWM0_LINE258 , , , ,SCB4_SPI_MOSI , ,SCB4_UART_CTS , , , , , , ,ETH_TX_ER , ,LPCOMP_DSI_COMP1, ,
+Port10,P10_3, ,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE_COMPL258 , , , ,SCB4_SPI_MISO , ,SCB4_UART_RTS , , , , , , ,ETH_ETH_TSU_TIMER_CMP_VAL , ,LPCOMP_DSI_COMP0, ,
+Port10,P10_4, ,TCPWM0_LINE3 ,TCPWM0_LINE259 , , , ,SCB4_SPI_SELECT0 , , , , , , , , ,ETH_RXD3 , , , ,
+Port10,P10_5, ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL259 , , , ,SCB4_SPI_SELECT1 , , , , , , , , ,ETH_RX_CTL , , , ,
+Port10,P10_6, ,TCPWM0_LINE4 ,TCPWM0_LINE260 , , , , , , , , , , , , ,ETH_RXD0 , , , ,
+Port10,P10_7, ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL260 , , , , , , , , , , , , ,ETH_RXD1 , , , ,
+Port10,P11_0, ,TCPWM0_LINE5 ,TCPWM0_LINE261 , , ,TDM_TDM_TX_SCK1 , ,SCB6_I2C_SCL , , , , , , , ,ETH_RXD2 , , , ,
+Port11,P11_1, ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL261 , , ,TDM_TDM_TX_FSYNC1,SCB6_SPI_MOSI ,SCB6_I2C_SDA ,SCB6_UART_TX , ,PERI0_TR_IO_INPUT1 ,PERI1_TR_IO_INPUT1 , , , ,ETH_RX_ER , , , ,
+Port11,P11_2, ,TCPWM0_LINE6 ,TCPWM0_LINE262 , , ,TDM_TDM_TX_SD1 ,SCB6_SPI_MISO , ,SCB6_UART_CTS , ,PERI0_TR_IO_INPUT2 ,PERI1_TR_IO_INPUT2 , , , ,ETH_TXD0 , , , ,
+Port11,P11_3, ,TCPWM0_LINE_COMPL6 ,TCPWM0_LINE_COMPL262 , , ,TDM_TDM_RX_MCK1 ,SCB6_SPI_SELECT0 , ,SCB6_UART_RTS , ,PERI0_TR_IO_INPUT3 ,PERI1_TR_IO_INPUT3 , , , ,ETH_TXD1 , , , ,
+Port11,P11_4, ,TCPWM0_LINE7 ,TCPWM0_LINE263 , , ,TDM_TDM_RX_SCK1 ,SCB6_SPI_SELECT1 , , , , , , , , ,ETH_TX_CTL , , , ,
+Port11,P11_5, ,TCPWM0_LINE_COMPL7 ,TCPWM0_LINE_COMPL263 , , ,TDM_TDM_RX_FSYNC1, , , , , , , , , ,ETH_TX_CLK , , , ,
+Port11,P11_6, ,TCPWM0_LINE0 ,TCPWM0_LINE264 , , ,TDM_TDM_RX_SD1 , , , , , , , , , ,ETH_TXD2 , , , ,
+Port11,P11_7, ,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE_COMPL264 , , ,TDM_TDM_TX_MCK1 , , , , , , , , , ,ETH_REF_CLK , , , ,
+Port12,P12_0, ,TCPWM0_LINE1 ,TCPWM0_LINE265 , , , , , , , , , , , , ,SDHC0_CLK_CARD , , , ,
+Port12,P12_1, ,TCPWM0_LINE_COMPL1 ,TCPWM0_LINE_COMPL265 , , , , , , , , , , , , ,SDHC0_CARD_DAT_3TO00 , , , ,
+Port12,P12_2, ,TCPWM0_LINE2 ,TCPWM0_LINE266 , , , , , , , , , , , , ,SDHC0_CARD_DAT_3TO01 , , , ,
+Port12,P12_3,SMIF1_SMIF0_SPIHB_SELECT3,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE_COMPL266 , , , , ,TDM_TDM_TX_FSYNC0, , , , , , , , , , , ,
+Port12,P12_4, ,TCPWM0_LINE3 ,TCPWM0_LINE267 , , , , , , , , , , , , ,SDHC0_CARD_DAT_3TO02 , , , ,
+Port12,P12_5, ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL267 , , , , , , , , , , , , ,SDHC0_CARD_DAT_3TO03 , , , ,
+Port13,P13_0, , , , , , , , , , , , , , , , , , , ,
+Port13,P13_1, ,TCPWM0_LINE4 ,TCPWM0_LINE268 , , , ,SCB7_SPI_CLK ,SCB7_I2C_SCL ,SCB7_UART_RX , , , , , , ,ETH_MDC , , , ,
+Port13,P13_2, ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL268 , , , ,SCB7_SPI_MOSI ,SCB7_I2C_SDA ,SCB7_UART_TX ,PDM_PDM_CLK1 , , , , , , , , , ,
+Port13,P13_3, ,TCPWM0_LINE5 ,TCPWM0_LINE269 , , , ,SCB7_SPI_MISO , ,SCB7_UART_CTS ,PDM_PDM_DATA1, , , , , , , , , ,
+Port13,P13_4, ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL269 , , , ,SCB7_SPI_SELECT0 , ,SCB7_UART_RTS , , , , , , , , , , ,
+Port13,P13_5, , , , , , , , , , , , , , , , , , , ,
+Port13,P13_6, ,TCPWM0_LINE6 ,TCPWM0_LINE270 , , , ,SCB7_SPI_SELECT1 , , , , , , , , ,ETH_MDIO , , , ,
+Port13,P13_7, ,TCPWM0_LINE_COMPL6 ,TCPWM0_LINE_COMPL270 , , , ,SCB8_SPI_MISO , ,SCB8_UART_CTS , , , , , , , , , , ,
+Port14,P14_0, , , , , , , , , , , , , , , , , , , ,
+Port14,P14_1, ,TCPWM0_LINE7 ,TCPWM0_LINE271 , , , , , , ,PDM_PDM_CLK0 , , , , , , , , , ,
+Port14,P14_2, ,TCPWM0_LINE_COMPL7 ,TCPWM0_LINE_COMPL271 , , , , , , , , , , , , , , , , ,
+Port14,P14_3, ,TCPWM0_LINE0 ,TCPWM0_LINE272 , , , ,SCB8_SPI_MOSI ,SCB8_I2C_SDA ,SCB8_UART_TX , , , , , , , , , , ,
+Port14,P14_4, ,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE_COMPL272 , , , ,SCB8_SPI_CLK ,SCB8_I2C_SCL ,SCB8_UART_RX ,PDM_PDM_DATA0, , , , , , , , , ,
+Port14,P14_5, , , , , , , , , , , , , , , , , , , ,
+Port14,P14_6, ,TCPWM0_LINE1 ,TCPWM0_LINE273 , , , ,SCB8_SPI_SELECT1 , , , , , , , , , , , , ,
+Port14,P14_7, ,TCPWM0_LINE_COMPL1 ,TCPWM0_LINE_COMPL273 , , , ,SCB8_SPI_SELECT0 , ,SCB8_UART_RTS , , , , , , , , , , ,
+Port15,P15_0, ,TCPWM0_LINE2 ,TCPWM0_LINE274 , , , ,SCB9_SPI_CLK ,SCB9_I2C_SCL ,SCB9_UART_RX , , , , , , , , , , ,
+Port15,P15_1, ,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE_COMPL274 , , , ,SCB9_SPI_MOSI ,SCB9_I2C_SDA ,SCB9_UART_TX , , , , , , , , , , ,
+Port15,P15_2, ,TCPWM0_LINE3 ,TCPWM0_LINE275 , , , ,SCB9_SPI_MISO , ,SCB9_UART_CTS , , , , , , , , , , ,
+Port15,P15_3, ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL275 , , , ,SCB9_SPI_SELECT0 , ,SCB9_UART_RTS , , , , , , , , , , ,
+Port15,P15_4, ,TCPWM0_LINE4 ,TCPWM0_LINE276 , , , ,SCB9_SPI_SELECT1 , , , , , , , , , , , , ,
+Port15,P15_5, ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL276 , , , , , , , , , , , , , , , , ,
+Port15,P15_6, ,TCPWM0_LINE5 ,TCPWM0_LINE277 , , , , , , , , , , , , , , , , ,
+Port15,P15_7, ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL277 , , , , , , , , , , , , , , , , ,
+Port16,P16_0, ,TCPWM0_LINE0 ,TCPWM0_LINE256 , ,CANFD0_TTCAN_RX0, ,SCB10_SPI_CLK ,SCB10_I2C_SCL ,SCB10_UART_RX , , , , , ,GFXSS_DBI_CSX ,GFXSS_SPI_CSX , , , ,
+Port16,P16_1, ,TCPWM0_LINE1 ,TCPWM0_LINE257 , ,CANFD0_TTCAN_TX0, ,SCB10_SPI_MOSI ,SCB10_I2C_SDA ,SCB10_UART_TX , , , , ,GFXSS_DBI_WRX,GFXSS_DBI_E ,GFXSS_SPI_SCL , , , ,
+Port16,P16_2, ,TCPWM0_LINE2 ,TCPWM0_LINE258 , ,CANFD0_TTCAN_RX1, ,SCB10_SPI_MISO , ,SCB10_UART_CTS, , , , , ,GFXSS_DBI_DCX ,GFXSS_SPI_DOUT , , , ,
+Port16,P16_3, ,TCPWM0_LINE3 ,TCPWM0_LINE259 , , , ,SCB10_SPI_SELECT0, ,SCB10_UART_RTS, , , , , ,GFXSS_DBI_D0 ,GFXSS_SPI_DCX , , , ,
+Port16,P16_4, ,TCPWM0_LINE4 ,TCPWM0_LINE260 , , , ,SCB10_SPI_SELECT1, , , , , , , ,GFXSS_DBI_D1 , , , , ,
+Port16,P16_5, ,TCPWM0_LINE5 ,TCPWM0_LINE261 , , , ,SCB5_SPI_MISO , ,SCB5_UART_CTS , , , , , ,GFXSS_DBI_D2 , , , , ,
+Port16,P16_6, ,TCPWM0_LINE6 ,TCPWM0_LINE278 , , , ,SCB5_SPI_SELECT0 , ,SCB5_UART_RTS , , , , , ,GFXSS_DBI_D3 , , , , ,
+Port16,P16_7, ,TCPWM0_LINE7 ,TCPWM0_LINE279 , , , ,SCB5_SPI_SELECT1 , , , , , , , ,GFXSS_DBI_D4 , , , , ,
+Port17,P17_0, ,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE_COMPL256 , , , ,SCB5_SPI_CLK ,SCB5_I2C_SCL ,SCB5_UART_RX , , , , , ,GFXSS_DBI_D5 , , , , ,
+Port17,P17_1, ,TCPWM0_LINE_COMPL1 ,TCPWM0_LINE_COMPL257 , , , ,SCB5_SPI_MOSI ,SCB5_I2C_SDA ,SCB5_UART_TX , , , , , ,GFXSS_DBI_D6 , , , , ,
+Port17,P17_2, ,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE_COMPL258 , , , ,SCB11_SPI_CLK ,SCB11_I2C_SCL ,SCB11_UART_RX , , , , , ,GFXSS_DBI_D7 , , , , ,
+Port17,P17_3, ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL259 , , , ,SCB11_SPI_MOSI ,SCB11_I2C_SDA ,SCB11_UART_TX , , , , , , , , , , ,
+Port17,P17_4, ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL260 , , , , , , , , , , , , , , , ,PASS_LPPASS_DOUT0,
+Port17,P17_5, ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL261 , , , ,SCB11_SPI_MISO , ,SCB11_UART_CTS, , , , , , , , , ,PASS_LPPASS_DOUT1,
+Port17,P17_6, ,TCPWM0_LINE_COMPL6 ,TCPWM0_LINE_COMPL278 , , , ,SCB11_SPI_SELECT0, ,SCB11_UART_RTS, , , , , , , , , ,PASS_LPPASS_DOUT2,
+Port17,P17_7, ,TCPWM0_LINE_COMPL7 ,TCPWM0_LINE_COMPL279 , , , ,SCB11_SPI_SELECT1, , , , , , , , , , , ,PASS_LPPASS_DOUT3,
+Port18,P18_0, , , , , , , , , , , , , , , , , , , ,
+Port18,P18_1, , , , , , , , , , , , , , , , , , , ,
+Port19,P19_0, , , , , , , , , , , , , , , , , , , ,
+Port19,P19_1, , , , , , , , , , , , , , , , , , , ,
+Port20,P20_0, ,TCPWM0_LINE7 ,TCPWM0_LINE_COMPL263 , , , ,SCB1_SPI_SELECT1 , , , , , , , , ,DEBUG600_TRACE_CLOCK , , , ,
+Port20,P20_1, ,TCPWM0_LINE0 ,TCPWM0_LINE_COMPL264 , , , , , , , , , , , , ,DEBUG600_TRACE_DATA3 , , , ,
+Port20,P20_2, ,TCPWM0_LINE1 ,TCPWM0_LINE_COMPL265 , , , , , , , , , , , , ,DEBUG600_TRACE_DATA2 , , , ,
+Port20,P20_3, ,TCPWM0_LINE2 ,TCPWM0_LINE_COMPL266 , , , , , , , , , , , , ,DEBUG600_TRACE_DATA1 , , , ,
+Port20,P20_4, ,TCPWM0_LINE_COMPL7 ,TCPWM0_LINE263 , ,CANFD0_TTCAN_RX0, , , , , , , , , , ,DEBUG600_TRACE_DATA0 , , ,PASS_LPPASS_OBSRV0,
+Port20,P20_5, ,TCPWM0_LINE_COMPL0 ,TCPWM0_LINE264 , ,CANFD0_TTCAN_TX0, , , , , , , , , , , , , ,PASS_LPPASS_OBSRV1,
+Port20,P20_6, ,TCPWM0_LINE_COMPL1 ,TCPWM0_LINE265 , ,CANFD0_TTCAN_RX1, , , , , , , , , , , , , ,PASS_LPPASS_OBSRV2,
+Port20,P20_7, ,TCPWM0_LINE_COMPL2 ,TCPWM0_LINE266 , ,CANFD0_TTCAN_TX1, , , , , , , , , , , , , ,PASS_LPPASS_OBSRV3,
+Port21,P21_0, ,TCPWM0_LINE3 ,TCPWM0_LINE267 , , , , , , , , , , , , ,SDHC0_CARD_CMD , , , ,
+Port21,P21_1, ,TCPWM0_LINE_COMPL3 ,TCPWM0_LINE_COMPL267 , , , , ,TDM_TDM_TX_SD0 , , , , , , , ,SDHC0_CARD_DETECT_N , , , ,
+Port21,P21_2, ,TCPWM0_LINE4 ,TCPWM0_LINE268 , , , , ,TDM_TDM_TX_SCK0 , , , , , , , ,SDHC0_CARD_MECH_WRITE_PROT , , , ,
+Port21,P21_3, ,TCPWM0_LINE_COMPL4 ,TCPWM0_LINE_COMPL268 , , , , ,TDM_TDM_TX_MCK0 , , , , , , , ,SDHC0_IO_VOLT_SEL , , , ,
+Port21,P21_4, ,TCPWM0_LINE5 ,TCPWM0_LINE269 , ,SCB3_SPI_MISO , ,SCB3_UART_CTS ,TDM_TDM_RX_SD0 , , , , , , , ,SDHC0_CARD_IF_PWR_EN , , , ,
+Port21,P21_5, ,TCPWM0_LINE_COMPL5 ,TCPWM0_LINE_COMPL269 , ,SCB3_SPI_MOSI ,SCB3_I2C_SDA ,SCB3_UART_TX ,TDM_TDM_RX_FSYNC0, , , , , , , , , , , ,
+Port21,P21_6, ,TCPWM0_LINE6 ,TCPWM0_LINE270 , ,SCB3_SPI_CLK ,SCB3_I2C_SCL ,SCB3_UART_RX ,TDM_TDM_RX_SCK0 , , , , , , , , , , , ,
+Port21,P21_7,SMIF1_SMIF0_SPIHB_SELECT0,TCPWM0_LINE_COMPL6 ,TCPWM0_LINE_COMPL270 , ,SCB3_SPI_SELECT1, ,SCB3_UART_RTS ,TDM_TDM_RX_MCK0 , , , , , , , , , , , ,
diff --git a/ports/psoc-edge/config/shift_ns.json b/ports/psoc-edge/config/shift_ns.json
new file mode 100644
index 00000000000..4d67c395f23
--- /dev/null
+++ b/ports/psoc-edge/config/shift_ns.json
@@ -0,0 +1,29 @@
+{
+ "schema-version": 1.0,
+ "content":
+ [
+ {
+ "name": "relocate_non_secure_hex",
+ "enabled" : true,
+ "commands" :
+ [
+ {
+ "command" : "hex-relocate",
+ "inputs" :
+ [
+ {
+ "file" : "{{ ns_hex }}",
+ "regions" : "{{RelocationTable}}"
+ }
+ ],
+ "outputs":
+ [
+ {
+ "file" : "{{ ns_shifted_hex }}"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/ports/psoc-edge/config/sign_s.json b/ports/psoc-edge/config/sign_s.json
new file mode 100644
index 00000000000..db27012d5e4
--- /dev/null
+++ b/ports/psoc-edge/config/sign_s.json
@@ -0,0 +1,33 @@
+{
+ "schema-version": 1.0,
+ "content":
+ [
+ {
+ "name": "sign_secboot_hex",
+ "enabled" : true,
+ "commands" :
+ [
+ {
+ "command" : "sign",
+ "inputs" :
+ [
+ {
+ "file" : "{{ s_hex }}",
+ "header-size": "0x400",
+ "fill-value" : "0xff",
+ "slot-size" : "0x240000",
+ "hex-address" : "{{CYMEM_CM33_0_S_m33s_nvm_S_START}}"
+ }
+ ],
+ "outputs":
+ [
+ {
+ "file" : "{{ s_signed_hex }}",
+ "format": "ihex"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ports/psoc-edge/config/sign_shift_merge.json b/ports/psoc-edge/config/sign_shift_merge.json
new file mode 100644
index 00000000000..1a654b3b9f6
--- /dev/null
+++ b/ports/psoc-edge/config/sign_shift_merge.json
@@ -0,0 +1,83 @@
+{
+ "schema-version": 1.0,
+ "content":
+ [
+ {
+ "name": "sign_secboot_hex",
+ "enabled" : true,
+ "commands" :
+ [
+ {
+ "command" : "sign",
+ "inputs" :
+ [
+ {
+ "file" : "{{ s_hex }}",
+ "header-size": "0x400",
+ "fill-value" : "0xff",
+ "slot-size" : "0x240000",
+ "hex-address" : "{{CYMEM_CM33_0_S_m33s_nvm_S_START}}"
+ }
+ ],
+ "outputs":
+ [
+ {
+ "file" : "{{ s_signed_hex }}",
+ "format": "ihex"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "relocate_non_secure_hex",
+ "enabled" : true,
+ "commands" :
+ [
+ {
+ "command" : "hex-relocate",
+ "inputs" :
+ [
+ {
+ "file" : "{{ ns_hex }}",
+ "regions" : "{{RelocationTable}}"
+ }
+ ],
+ "outputs":
+ [
+ {
+ "file" : "{{ ns_shifted_hex }}"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "merge_sec_non_secure_hex",
+ "enabled": true,
+ "commands" :
+ [
+ {
+ "command" : "merge",
+ "inputs" :
+ [
+ {
+ "file" : "{{ s_signed_hex }}"
+ },
+ {
+ "file" : "{{ ns_shifted_hex }}"
+ }
+ ],
+ "outputs" :
+ [
+ {
+ "file" : "{{ signed_merged_hex }}",
+ "format" : "ihex",
+ "overlap" : "error"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/ports/psoc-edge/dualcore/include/ipc_communication.h b/ports/psoc-edge/dualcore/include/ipc_communication.h
new file mode 100644
index 00000000000..ef3eb294678
--- /dev/null
+++ b/ports/psoc-edge/dualcore/include/ipc_communication.h
@@ -0,0 +1,94 @@
+/*******************************************************************************
+* File Name : ipc_communication.h
+*
+* Description : This file contains the headers and structures
+* used to setup the IPC Pipes between CM33 and CM55
+*
+* Related Document : See README.md
+*
+********************************************************************************
+* (c) 2025, Infineon Technologies AG, or an affiliate of Infineon
+* Technologies AG. All rights reserved.
+* This software, associated documentation and materials ("Software") is
+* owned by Infineon Technologies AG or one of its affiliates ("Infineon")
+* and is protected by and subject to worldwide patent protection, worldwide
+* copyright laws, and international treaty provisions. Therefore, you may use
+* this Software only as provided in the license agreement accompanying the
+* software package from which you obtained this Software. If no license
+* agreement applies, then any use, reproduction, modification, translation, or
+* compilation of this Software is prohibited without the express written
+* permission of Infineon.
+*
+* Disclaimer: UNLESS OTHERWISE EXPRESSLY AGREED WITH INFINEON, THIS SOFTWARE
+* IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+* INCLUDING, BUT NOT LIMITED TO, ALL WARRANTIES OF NON-INFRINGEMENT OF
+* THIRD-PARTY RIGHTS AND IMPLIED WARRANTIES SUCH AS WARRANTIES OF FITNESS FOR A
+* SPECIFIC USE/PURPOSE OR MERCHANTABILITY.
+* Infineon reserves the right to make changes to the Software without notice.
+* You are responsible for properly designing, programming, and testing the
+* functionality and safety of your intended application of the Software, as
+* well as complying with any legal requirements related to its use. Infineon
+* does not guarantee that the Software will be free from intrusion, data theft
+* or loss, or other breaches ("Security Breaches"), and Infineon shall have
+* no liability arising out of any Security Breaches. Unless otherwise
+* explicitly approved by Infineon, the Software may not be used in any
+* application where a failure of the Product or any consequences of the use
+* thereof can reasonably be expected to result in personal injury.
+*******************************************************************************/
+
+#ifndef SOURCE_IPC_COMMUNICATION_H
+#define SOURCE_IPC_COMMUNICATION_H
+
+/*******************************************************************************
+* Header Files
+*******************************************************************************/
+#include "cybsp.h"
+#include "cy_pdl.h"
+#include "cy_ipc_pipe.h"
+
+/*******************************************************************************
+* Macros
+*******************************************************************************/
+#define CY_IPC_MAX_ENDPOINTS (5UL)
+#define CY_IPC_CYPIPE_CLIENT_CNT (8UL)
+
+#define CY_IPC_CHAN_CYPIPE_EP1 (4UL)
+#define CY_IPC_INTR_CYPIPE_EP1 (4UL)
+#define CY_IPC_CHAN_CYPIPE_EP2 (15UL)
+#define CY_IPC_INTR_CYPIPE_EP2 (5UL)
+
+/* IPC Pipe Endpoint-1 config */
+#define CY_IPC_CYPIPE_CHAN_MASK_EP1 CY_IPC_CH_MASK(CY_IPC_CHAN_CYPIPE_EP1)
+#define CY_IPC_CYPIPE_INTR_MASK_EP1 CY_IPC_INTR_MASK(CY_IPC_INTR_CYPIPE_EP1)
+#define CY_IPC_INTR_CYPIPE_PRIOR_EP1 (1UL)
+#define CY_IPC_INTR_CYPIPE_MUX_EP1 (CY_IPC0_INTR_MUX(CY_IPC_INTR_CYPIPE_EP1))
+#define CM33_IPC_PIPE_EP_ADDR (1UL)
+#define CM33_IPC_PIPE_CLIENT_ID (3UL)
+
+/* IPC Pipe Endpoint-2 config */
+#define CY_IPC_CYPIPE_CHAN_MASK_EP2 CY_IPC_CH_MASK(CY_IPC_CHAN_CYPIPE_EP2)
+#define CY_IPC_CYPIPE_INTR_MASK_EP2 CY_IPC_INTR_MASK(CY_IPC_INTR_CYPIPE_EP2)
+#define CY_IPC_INTR_CYPIPE_PRIOR_EP2 (1UL)
+#define CY_IPC_INTR_CYPIPE_MUX_EP2 (CY_IPC0_INTR_MUX(CY_IPC_INTR_CYPIPE_EP2))
+#define CM55_IPC_PIPE_EP_ADDR (2UL)
+#define CM55_IPC_PIPE_CLIENT_ID (5UL)
+
+/* Combined Interrupt Mask */
+#define CY_IPC_CYPIPE_INTR_MASK (CY_IPC_CYPIPE_CHAN_MASK_EP1 | CY_IPC_CYPIPE_CHAN_MASK_EP2)
+
+/*******************************************************************************
+* Enumeration
+*******************************************************************************/
+/* IPC Message structure */
+/* Pointer to this structure will be shared through IPC Pipe */
+
+
+/*******************************************************************************
+* Function prototypes
+*******************************************************************************/
+void cm33_ipc_communication_setup(void);
+void cm33_ipc_pipe_isr(void);
+void cm55_ipc_communication_setup(void);
+void cm55_ipc_pipe_isr(void);
+
+#endif /* SOURCE_IPC_COMMUNICATION_H */
diff --git a/ports/psoc-edge/dualcore/source/COMPONENT_CM33/cm33_ipc_communication.c b/ports/psoc-edge/dualcore/source/COMPONENT_CM33/cm33_ipc_communication.c
new file mode 100644
index 00000000000..1e009b2f3e7
--- /dev/null
+++ b/ports/psoc-edge/dualcore/source/COMPONENT_CM33/cm33_ipc_communication.c
@@ -0,0 +1,129 @@
+/*******************************************************************************
+* File Name : main.c
+*
+* Description : This source file contains the code for setting up IPC
+* communication for CM33 CPU.
+*
+* Related Document : See README.md
+*
+********************************************************************************
+* (c) 2025, Infineon Technologies AG, or an affiliate of Infineon
+* Technologies AG. All rights reserved.
+* This software, associated documentation and materials ("Software") is
+* owned by Infineon Technologies AG or one of its affiliates ("Infineon")
+* and is protected by and subject to worldwide patent protection, worldwide
+* copyright laws, and international treaty provisions. Therefore, you may use
+* this Software only as provided in the license agreement accompanying the
+* software package from which you obtained this Software. If no license
+* agreement applies, then any use, reproduction, modification, translation, or
+* compilation of this Software is prohibited without the express written
+* permission of Infineon.
+*
+* Disclaimer: UNLESS OTHERWISE EXPRESSLY AGREED WITH INFINEON, THIS SOFTWARE
+* IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+* INCLUDING, BUT NOT LIMITED TO, ALL WARRANTIES OF NON-INFRINGEMENT OF
+* THIRD-PARTY RIGHTS AND IMPLIED WARRANTIES SUCH AS WARRANTIES OF FITNESS FOR A
+* SPECIFIC USE/PURPOSE OR MERCHANTABILITY.
+* Infineon reserves the right to make changes to the Software without notice.
+* You are responsible for properly designing, programming, and testing the
+* functionality and safety of your intended application of the Software, as
+* well as complying with any legal requirements related to its use. Infineon
+* does not guarantee that the Software will be free from intrusion, data theft
+* or loss, or other breaches ("Security Breaches"), and Infineon shall have
+* no liability arising out of any Security Breaches. Unless otherwise
+* explicitly approved by Infineon, the Software may not be used in any
+* application where a failure of the Product or any consequences of the use
+* thereof can reasonably be expected to result in personal injury.
+*******************************************************************************/
+
+#include "ipc_communication.h"
+
+
+/*******************************************************************************
+* Global Variable(s)
+*******************************************************************************/
+
+/* Create an array of endpoint structures */
+static cy_stc_ipc_pipe_ep_t cm33_ipc_pipe_ep_array[CY_IPC_MAX_ENDPOINTS];
+
+/* CB Array for EP1 */
+static cy_ipc_pipe_callback_ptr_t ep1_cb_array[CY_IPC_CYPIPE_CLIENT_CNT];
+
+/* Allocate and initialize semaphores for the system operations. */
+CY_SECTION_SHAREDMEM
+static uint32_t ipc_sema_array[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD];
+
+
+/*******************************************************************************
+* Function Name: cm33_ipc_pipe_isr
+********************************************************************************
+*
+* This is the interrupt service routine for the system pipe.
+*
+* Parameters:
+* none
+*
+* Return :
+* void
+*
+*******************************************************************************/
+/*void cm33_ipc_pipe_isr(void)
+{
+ Cy_IPC_Pipe_ExecuteCallback(CM33_IPC_PIPE_EP_ADDR);
+}*/
+
+
+/*******************************************************************************
+* Function Name: cm33_ipc_communication_setup
+********************************************************************************
+* Summary:
+* This function...
+* 1. Initializes IPC Semaphore.
+* 2. Configures IPC Pipe for CM33 to CM55 communication.
+*
+* Parameters:
+* none
+*
+* Return :
+* void
+*
+*******************************************************************************/
+void cm33_ipc_communication_setup(void) {
+ /* IPC pipe endpoint-1 and endpoint-2. CM33 <--> CM55 */
+ static const cy_stc_ipc_pipe_config_t cm33_ipc_pipe_config =
+ {
+ /* receiver endpoint CM33 */
+ {
+ .ipcNotifierNumber = CY_IPC_INTR_CYPIPE_EP1,
+ .ipcNotifierPriority = CY_IPC_INTR_CYPIPE_PRIOR_EP1,
+ .ipcNotifierMuxNumber = CY_IPC_INTR_CYPIPE_MUX_EP1,
+ .epAddress = CM33_IPC_PIPE_EP_ADDR,
+ {
+ .epChannel = CY_IPC_CHAN_CYPIPE_EP1,
+ .epIntr = CY_IPC_INTR_CYPIPE_EP1,
+ .epIntrmask = CY_IPC_CYPIPE_INTR_MASK
+ }
+ },
+ /* sender endpoint CM55 */
+ {
+ .ipcNotifierNumber = CY_IPC_INTR_CYPIPE_EP2,
+ .ipcNotifierPriority = CY_IPC_INTR_CYPIPE_PRIOR_EP2,
+ .ipcNotifierMuxNumber = CY_IPC_INTR_CYPIPE_MUX_EP2,
+ .epAddress = CM55_IPC_PIPE_EP_ADDR,
+ {
+ .epChannel = CY_IPC_CHAN_CYPIPE_EP2,
+ .epIntr = CY_IPC_INTR_CYPIPE_EP2,
+ .epIntrmask = CY_IPC_CYPIPE_INTR_MASK
+ }
+ },
+ .endpointClientsCount = CY_IPC_CYPIPE_CLIENT_CNT,
+ .endpointsCallbacksArray = ep1_cb_array,
+ .userPipeIsrHandler = &cm33_ipc_pipe_isr
+ };
+
+ Cy_IPC_Sema_Init(IPC0_SEMA_CH_NUM, CY_IPC_SEMA_COUNT, ipc_sema_array);
+
+ Cy_IPC_Pipe_Config(cm33_ipc_pipe_ep_array);
+
+ Cy_IPC_Pipe_Init(&cm33_ipc_pipe_config);
+}
diff --git a/ports/psoc-edge/dualcore/source/COMPONENT_CM55/cm55_ipc_communication.c b/ports/psoc-edge/dualcore/source/COMPONENT_CM55/cm55_ipc_communication.c
new file mode 100644
index 00000000000..800ec739a3c
--- /dev/null
+++ b/ports/psoc-edge/dualcore/source/COMPONENT_CM55/cm55_ipc_communication.c
@@ -0,0 +1,120 @@
+/*******************************************************************************
+* File Name : main.c
+*
+* Description : This source file contains the code for setting up IPC
+* communication for CM55 CPU.
+*
+* Related Document : See README.md
+*
+********************************************************************************
+* (c) 2025, Infineon Technologies AG, or an affiliate of Infineon
+* Technologies AG. All rights reserved.
+* This software, associated documentation and materials ("Software") is
+* owned by Infineon Technologies AG or one of its affiliates ("Infineon")
+* and is protected by and subject to worldwide patent protection, worldwide
+* copyright laws, and international treaty provisions. Therefore, you may use
+* this Software only as provided in the license agreement accompanying the
+* software package from which you obtained this Software. If no license
+* agreement applies, then any use, reproduction, modification, translation, or
+* compilation of this Software is prohibited without the express written
+* permission of Infineon.
+*
+* Disclaimer: UNLESS OTHERWISE EXPRESSLY AGREED WITH INFINEON, THIS SOFTWARE
+* IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+* INCLUDING, BUT NOT LIMITED TO, ALL WARRANTIES OF NON-INFRINGEMENT OF
+* THIRD-PARTY RIGHTS AND IMPLIED WARRANTIES SUCH AS WARRANTIES OF FITNESS FOR A
+* SPECIFIC USE/PURPOSE OR MERCHANTABILITY.
+* Infineon reserves the right to make changes to the Software without notice.
+* You are responsible for properly designing, programming, and testing the
+* functionality and safety of your intended application of the Software, as
+* well as complying with any legal requirements related to its use. Infineon
+* does not guarantee that the Software will be free from intrusion, data theft
+* or loss, or other breaches ("Security Breaches"), and Infineon shall have
+* no liability arising out of any Security Breaches. Unless otherwise
+* explicitly approved by Infineon, the Software may not be used in any
+* application where a failure of the Product or any consequences of the use
+* thereof can reasonably be expected to result in personal injury.
+*******************************************************************************/
+
+#include "ipc_communication.h"
+
+
+/*******************************************************************************
+* Global Variable(s)
+*******************************************************************************/
+/* Create an array of endpoint structures */
+static cy_stc_ipc_pipe_ep_t cm55_ipc_pipe_array[CY_IPC_MAX_ENDPOINTS];
+
+/* CB Array for EP2 */
+static cy_ipc_pipe_callback_ptr_t ep2_cb_array[CY_IPC_CYPIPE_CLIENT_CNT];
+
+
+/*******************************************************************************
+* Function Name: Cy_SysIpcPipeIsrCm55
+********************************************************************************
+* Summary:
+* This is the interrupt service routine for the system pipe.
+*
+* Parameters:
+* none
+*
+* Return :
+* void
+*
+*******************************************************************************/
+void Cy_SysIpcPipeIsrCm55(void) {
+ Cy_IPC_Pipe_ExecuteCallback(CM55_IPC_PIPE_EP_ADDR);
+}
+
+
+/*******************************************************************************
+* Function Name: cm55_ipc_communication_setup
+********************************************************************************
+* Summary:
+* This function configures IPC Pipe for CM55 to CM33 communication.
+*
+* Parameters:
+* none
+*
+* Return :
+* void
+*
+*******************************************************************************/
+void cm55_ipc_communication_setup(void) {
+
+ /* IPC pipe endpoint-1 and endpoint-2. CM55 <--> CM33 */
+ static const cy_stc_ipc_pipe_config_t cm55_ipc_pipe_config =
+ {
+ /* receiver endpoint CM55 */
+ {
+ .ipcNotifierNumber = CY_IPC_INTR_CYPIPE_EP2,
+ .ipcNotifierPriority = CY_IPC_INTR_CYPIPE_PRIOR_EP2,
+ .ipcNotifierMuxNumber = CY_IPC_INTR_CYPIPE_MUX_EP2,
+ .epAddress = CM55_IPC_PIPE_EP_ADDR,
+ {
+ .epChannel = CY_IPC_CHAN_CYPIPE_EP2,
+ .epIntr = CY_IPC_INTR_CYPIPE_EP2,
+ .epIntrmask = CY_IPC_CYPIPE_INTR_MASK
+ }
+ },
+ /* sender endpoint CM33 */
+ {
+ .ipcNotifierNumber = CY_IPC_INTR_CYPIPE_EP1,
+ .ipcNotifierPriority = CY_IPC_INTR_CYPIPE_PRIOR_EP1,
+ .ipcNotifierMuxNumber = CY_IPC_INTR_CYPIPE_MUX_EP1,
+ .epAddress = CM33_IPC_PIPE_EP_ADDR,
+ {
+ .epChannel = CY_IPC_CHAN_CYPIPE_EP1,
+ .epIntr = CY_IPC_INTR_CYPIPE_EP1,
+ .epIntrmask = CY_IPC_CYPIPE_INTR_MASK
+ }
+ },
+ .endpointClientsCount = CY_IPC_CYPIPE_CLIENT_CNT,
+ .endpointsCallbacksArray = ep2_cb_array,
+ .userPipeIsrHandler = &Cy_SysIpcPipeIsrCm55
+ };
+
+ Cy_IPC_Pipe_Config(cm55_ipc_pipe_array);
+
+ Cy_IPC_Pipe_Init(&cm55_ipc_pipe_config);
+}
diff --git a/ports/psoc-edge/examples/deepcraft_voice_assitant.py b/ports/psoc-edge/examples/deepcraft_voice_assitant.py
new file mode 100644
index 00000000000..ab77363a0ec
--- /dev/null
+++ b/ports/psoc-edge/examples/deepcraft_voice_assitant.py
@@ -0,0 +1,120 @@
+"""
+deepcraft_voice_assistant.py — Host-side (MicroPython) Voice Assistant application.
+
+Uses the DEEPCRAFTModel wrapper library so application code never touches
+raw IPC commands or client/endpoint IDs directly.
+
+Layer:
+ deepcraft_voice_assistant.py
+ │ uses high-level events (VA_EVENT_*)
+ ▼
+ deepcraft_model.DEEPCRAFTModel ← wrapper library (deepcraft_interface.c)
+ │ calls send / register_client on the injected transport object
+ ▼
+ machine.IPC ← MicroPython IPC module (machine_ipc.c)
+ │
+ ▼ IPC pipe
+ Target (CM55 running main.c + deepcraft_ipc_cm55.c)
+
+To use a different transport, pass any object with matching method signatures
+(send, register_client, enable_target) to DEEPCRAFTModel(); nothing else changes.
+"""
+
+from machine import IPC, Pin
+from deepcraft_model import DEEPCRAFTModel
+import time
+
+# ---------------------------------------------------------------------------
+# Hardware output — update to match your board/model
+# ---------------------------------------------------------------------------
+pin_out = Pin("P17_1", Pin.OUT, value=1)
+
+# Intent index → action mapping.
+# Update these to match the commands defined in your DEEPCRAFT model.
+INTENT_ACTIONS = {
+ 0: lambda: (pin_out.value(0), print("[HOST] P17_1 -> LOW")),
+ 1: lambda: (pin_out.value(1), print("[HOST] P17_1 -> HIGH")),
+}
+
+# ---------------------------------------------------------------------------
+# Transport setup — IPC
+# DEEPCRAFTModel constructor calls ipc.init() automatically.
+# ---------------------------------------------------------------------------
+ipc = IPC(src_core=IPC.CM33, target_core=IPC.CM55)
+
+# ---------------------------------------------------------------------------
+# DEEPCRAFTModel — wraps the transport and exposes VA events
+#
+# Optional keyword arguments (shown with their defaults):
+# model = DEEPCRAFTModel.MODEL_VA
+# target_client_id = 5 (target IPC pipe client ID)
+# recv_client_id = 3 (host IPC pipe client ID)
+# recv_ep_addr = 1 (host IPC pipe endpoint address)
+# target_id = 1 (IPC.CM55 — passed to ipc.enable_target())
+# ---------------------------------------------------------------------------
+model = DEEPCRAFTModel(ipc)
+
+
+# ---------------------------------------------------------------------------
+# Event callback — invoked by the wrapper with (va_model_events_t, value)
+# ---------------------------------------------------------------------------
+def on_va_event(event, value):
+ if event == DEEPCRAFTModel.VA_EVENT_READY:
+ print("[HOST] VA ready and listening")
+
+ elif event == DEEPCRAFTModel.VA_EVENT_WAKEWORD_DETECTED:
+ print("[HOST] Wake-word detected!")
+
+ elif event == DEEPCRAFTModel.VA_EVENT_INTENT:
+ intent_idx = value
+ print("[HOST] Intent received: index =", intent_idx)
+ action = INTENT_ACTIONS.get(intent_idx)
+ if action:
+ action()
+ else:
+ print("[HOST] Unknown intent index:", intent_idx)
+
+ elif event == DEEPCRAFTModel.VA_EVENT_TIMEOUT:
+ print("[HOST] Command timeout — say the wake-word again")
+
+ elif event == DEEPCRAFTModel.VA_EVENT_STOPPED:
+ print("[HOST] VA stopped")
+
+ elif event == DEEPCRAFTModel.VA_EVENT_ERROR:
+ print("[HOST] Fatal VA error")
+
+ else:
+ print("[HOST] Unknown event:", event, "value:", value)
+
+
+model.set_event_cb(on_va_event)
+
+# ---------------------------------------------------------------------------
+# Boot the target and start the VA
+# ---------------------------------------------------------------------------
+model.enable_target() # powers on / boots the target processor
+time.sleep_ms(500) # allow target boot time
+
+model.start() # sends DEEPCRAFT_CMD_START to the target
+print('\n[HOST] Say the wake-word "OK test" followed by a command:')
+print(" 0) Make P17_1 LOW")
+print(" 1) Make P17_1 HIGH\n")
+
+# ---------------------------------------------------------------------------
+# Main event loop — poll the flag set by the IPC callback
+# ---------------------------------------------------------------------------
+# DEEPCRAFTModel routes all incoming IPC messages to on_va_event above.
+# The loop below just keeps the interpreter alive; add your own application
+# logic here (networking, display updates, etc.).
+while True:
+ # Stop after one complete cycle (both commands seen)
+ if model.state() == DEEPCRAFTModel.STATE_IDLE:
+ # VA sent VA_EVENT_STOPPED — clean exit
+ break
+
+ time.sleep_ms(10)
+
+# Cleanup
+pin_out.value(1)
+time.sleep_ms(20)
+print("\nVA Assistant model execution stopped")
diff --git a/ports/psoc-edge/help.c b/ports/psoc-edge/help.c
new file mode 100644
index 00000000000..716d08150b7
--- /dev/null
+++ b/ports/psoc-edge/help.c
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2024 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+const char psoc_edge_help_text[] =
+ "Welcome to MicroPython!\n"
+ "\n"
+ "For online help please visit https://micropython.org/help/.\n"
+ "\n"
+ "For access to the hardware use the 'machine' module.\n"
+ "PSOC™ Edge specific commands are in the 'psoc-edge' module.\n"
+ "\n"
+ "Useful control commands:\n"
+ " CTRL-C -- interrupt a running program\n"
+ " CTRL-D -- on a blank line, do a soft reset of the board\n"
+ " CTRL-E -- on a blank line, enter paste mode\n"
+ "\n"
+ "For further help on a specific object, type help(obj)\n"
+ "For a list of available modules, type help('modules')\n"
+;
diff --git a/ports/psoc-edge/lwip_inc/arch/cc.h b/ports/psoc-edge/lwip_inc/arch/cc.h
new file mode 100644
index 00000000000..1a9b1286df0
--- /dev/null
+++ b/ports/psoc-edge/lwip_inc/arch/cc.h
@@ -0,0 +1,6 @@
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_LWIP_ARCH_CC_H
+#define MICROPY_INCLUDED_PSOC_EDGE_LWIP_ARCH_CC_H
+
+#include
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_LWIP_ARCH_CC_H
diff --git a/ports/psoc-edge/lwip_inc/arch/sys_arch.h b/ports/psoc-edge/lwip_inc/arch/sys_arch.h
new file mode 100644
index 00000000000..22d5d23c43c
--- /dev/null
+++ b/ports/psoc-edge/lwip_inc/arch/sys_arch.h
@@ -0,0 +1,6 @@
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_LWIP_ARCH_SYS_ARCH_H
+#define MICROPY_INCLUDED_PSOC_EDGE_LWIP_ARCH_SYS_ARCH_H
+
+#include "../../../../lib/psoc-edge/lwip-freertos-integration/arch/sys_arch.h"
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_LWIP_ARCH_SYS_ARCH_H
diff --git a/ports/psoc-edge/lwip_inc/lwipopts.h b/ports/psoc-edge/lwip_inc/lwipopts.h
new file mode 100644
index 00000000000..609524b6e8c
--- /dev/null
+++ b/ports/psoc-edge/lwip_inc/lwipopts.h
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Simon Goldschmidt
+ *
+ */
+#pragma once
+
+#include
+
+#define MEM_ALIGNMENT (4)
+
+#define LWIP_RAW (1)
+#define NO_SYS (0)
+
+//
+// Enable IPV4 networking
+//
+#define LWIP_IPV4 (1)
+
+/**
+ * LWIP_AUTOIP==1: Enable AUTOIP module.
+ */
+// #define LWIP_AUTOIP (1)
+
+/**
+ * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on
+ * the same interface at the same time.
+ */
+// #define LWIP_DHCP_AUTOIP_COOP (1)
+
+//
+// Enable IPV6 networking
+//
+#define LWIP_IPV6 (0)
+
+#define ETHARP_SUPPORT_STATIC_ENTRIES (1)
+
+//
+// Enable IPV4 networking
+//
+#define LWIP_ICMP (1)
+#define LWIP_TCP (1)
+#define LWIP_UDP (1)
+#define LWIP_IGMP (1)
+
+//
+// Use malloc to allocate any memory blocks instead of the
+// malloc that is part of LWIP
+//
+#define MEM_LIBC_MALLOC (1)
+
+//
+// The standard library does not provide errno, use the one
+// from LWIP.
+//
+#define LWIP_PROVIDE_ERRNO (1)
+
+#if defined(__GNUC__) && !defined(__ARMCC_VERSION)
+//
+// Use the timeval from the GCC library, not the one
+// from LWIP
+//
+#define LWIP_TIMEVAL_PRIVATE (0)
+#endif
+
+//
+// Make sure DHCP is part of the stack
+//
+#define LWIP_DHCP (1)
+
+//
+// Enable LwIP send timeout
+//
+#define LWIP_SO_SNDTIMEO (1)
+
+//
+// Enable LwIP receive timeout
+//
+#define LWIP_SO_RCVTIMEO (1)
+
+//
+// Enable SO_REUSEADDR option
+//
+#define SO_REUSE (1)
+
+//
+// Enable TCP Keep-alive
+//
+#define LWIP_TCP_KEEPALIVE (1)
+
+//
+// The amount of space to leave before the packet when allocating a pbuf. Needs to
+// be enough for the link layer data and the WHD header
+//
+#define PBUF_LINK_HLEN (WHD_PHYSICAL_HEADER)
+
+//
+// TCP Maximum segment size
+//
+#define TCP_MSS (WHD_PAYLOAD_MTU)
+
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 1
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 1
+
+//
+// Enable the thread safe NETCONN interface layer
+//
+#define LWIP_NETCONN (1)
+
+/**
+ * TCP_SND_BUF: TCP sender buffer space (bytes).
+ * To achieve good performance, this should be at least 2 * TCP_MSS.
+ */
+#define TCP_SND_BUF (12 * TCP_MSS)
+#define TCP_WND (10 * TCP_MSS)
+#define LWIP_WND_SCALE 1
+#define TCP_RCV_SCALE 2
+#define MEM_SIZE (16000)
+
+/**
+ * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least
+ * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work.
+ */
+#define TCP_SND_QUEUELEN ((6 * (TCP_SND_BUF) + (TCP_MSS - 1)) / (TCP_MSS))
+
+//
+// Taken from WICED to speed things up
+//
+#define DHCP_DOES_ARP_CHECK (0)
+
+//
+// Light weight protection for things that may be clobbered by interrupts
+//
+#define SYS_LIGHTWEIGHT_PROT (1)
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT (1)
+
+#define LWIP_SO_RCVBUF (128)
+
+#define LWIP_SOCKET (1)
+#define DEFAULT_TCP_RECVMBOX_SIZE (12)
+#define TCPIP_MBOX_SIZE (16)
+#define TCPIP_THREAD_STACKSIZE (4 * 1024)
+#define TCPIP_THREAD_PRIO (4)
+#define DEFAULT_RAW_RECVMBOX_SIZE (12)
+#define DEFAULT_UDP_RECVMBOX_SIZE (12)
+#define DEFAULT_ACCEPTMBOX_SIZE (8)
+#define TCP_OVERSIZE TCP_MSS
+
+/**
+ * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
+ * per active UDP "connection".
+ * (requires the LWIP_UDP option)
+ */
+#define MEMP_NUM_UDP_PCB 8
+
+/**
+ * MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections.
+ * (requires the LWIP_TCP option)
+ */
+#define MEMP_NUM_TCP_PCB 8
+
+/**
+ * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections.
+ * (requires the LWIP_TCP option)
+ */
+#define MEMP_NUM_TCP_PCB_LISTEN 1
+
+/**
+ * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.
+ * (requires the LWIP_TCP option)
+ */
+#define MEMP_NUM_TCP_SEG (2 * TCP_SND_QUEUELEN)
+
+/**
+ * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts.
+ */
+#define MEMP_NUM_SYS_TIMEOUT 12
+
+/**
+ * PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
+ * 400 was copied from an MTB reference app and bloats static RAM by ~640 KB.
+ * 24 is sufficient for MicroPython use (matches PSoC6 port).
+ */
+#define PBUF_POOL_SIZE 24
+
+/**
+ * MEMP_NUM_NETBUF: the number of struct netbufs.
+ * (only needed if you use the sequential API, like api_lib.c)
+ */
+#define MEMP_NUM_NETBUF 8
+
+/**
+ * MEMP_NUM_NETCONN: the number of struct netconns.
+ * (only needed if you use the sequential API, like api_lib.c)
+ */
+#define MEMP_NUM_NETCONN 16
+
+/* Turn off LWIP_STATS in Release build */
+#ifdef DEBUG
+#define LWIP_STATS 1
+#else
+#define LWIP_STATS 0
+#endif
+
+/**
+ * LWIP_TCPIP_CORE_LOCKING
+ * Creates a global mutex that is held during TCPIP thread operations.
+ * Can be locked by client code to perform lwIP operations without changing
+ * into TCPIP thread using callbacks. See LOCK_TCPIP_CORE() and
+ * UNLOCK_TCPIP_CORE().
+ * Your system should provide mutexes supporting priority inversion to use this.
+ */
+#define LWIP_TCPIP_CORE_LOCKING 1
+
+/**
+ * LWIP_TCPIP_CORE_LOCKING_INPUT: when LWIP_TCPIP_CORE_LOCKING is enabled,
+ * this lets tcpip_input() grab the mutex for input packets as well,
+ * instead of allocating a message and passing it to tcpip_thread.
+ *
+ * ATTENTION: this does not work when tcpip_input() is called from
+ * interrupt context!
+ */
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 1
+
+/**
+ * LWIP_NETIF_API==1: Support netif api (in netifapi.c)
+ */
+#define LWIP_NETIF_API 1
+
+#define LWIP_DNS (1)
+
+#define LWIP_NETIF_TX_SINGLE_PBUF (1)
+
+#define LWIP_RAND rand
+
+#define LWIP_FREERTOS_CHECK_CORE_LOCKING (1)
+
+#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking()
+
+#define LWIP_NETIF_STATUS_CALLBACK (1)
+#define LWIP_NETIF_LINK_CALLBACK (1)
+#define LWIP_NETIF_REMOVE_CALLBACK (1)
+
+#define LWIP_CHKSUM_ALGORITHM (3)
+
+extern void sys_check_core_locking(void);
diff --git a/ports/psoc-edge/machine_i2c.c b/ports/psoc-edge/machine_i2c.c
new file mode 100644
index 00000000000..2db0e5db1d6
--- /dev/null
+++ b/ports/psoc-edge/machine_i2c.c
@@ -0,0 +1,312 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// std includes
+#include
+#include
+
+
+// mpy includes
+#include "extmod/modmachine.h"
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "py/mperrno.h"
+
+
+// MTB includes
+#include "cybsp.h"
+#include "cy_scb_i2c.h"
+
+
+// port-specific includes
+#include "genhdr/pins_af.h"
+#include "modmachine.h"
+#include "machine_scb.h"
+
+#define DEBUG_printf(...) // printf(__VA_ARGS__)
+
+#define DEFAULT_I2C_FREQ (400000)
+
+#define i2c_assert_raise_val(msg, ret) if (ret != CY_RSLT_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+typedef struct _machine_hw_i2c_obj_t {
+ mp_obj_base_t base;
+ int id; // This parameter is unused and added for compliance with reference API.
+ mp_hal_pin_obj_t scl;
+ mp_hal_pin_obj_t sda;
+ uint32_t freq;
+ uint32_t timeout;
+ machine_scb_obj_t *scb_obj;
+ cy_stc_scb_i2c_config_t cfg; // PDL I2C configuration
+ cy_stc_scb_i2c_context_t ctx; // PDL I2C runtime context
+} machine_hw_i2c_obj_t;
+
+machine_hw_i2c_obj_t *machine_hw_i2c_obj[MICROPY_PY_MACHINE_I2C_NUM_ENTRIES] = { NULL };
+
+static inline machine_hw_i2c_obj_t *machine_hw_i2c_obj_alloc(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_I2C_NUM_ENTRIES; i++)
+ {
+ if (machine_hw_i2c_obj[i] == NULL) {
+ machine_hw_i2c_obj[i] = mp_obj_malloc(machine_hw_i2c_obj_t, &machine_i2c_type);
+ return machine_hw_i2c_obj[i];
+ }
+ }
+
+ return NULL;
+}
+
+static inline void machine_hw_i2c_obj_free(machine_hw_i2c_obj_t *i2c_obj_ptr) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_I2C_NUM_ENTRIES; i++)
+ {
+ if (machine_hw_i2c_obj[i] == i2c_obj_ptr) {
+ machine_hw_i2c_obj[i] = NULL;
+ }
+ }
+}
+
+static void machine_hw_i2c_scb_isr(mp_obj_t hw_i2c_obj) {
+ machine_hw_i2c_obj_t *self = MP_OBJ_TO_PTR(hw_i2c_obj);
+ Cy_SCB_I2C_MasterInterrupt(self->scb_obj->scb, &self->ctx);
+}
+
+static void machine_hw_i2c_init(machine_hw_i2c_obj_t *self, uint32_t freq_hz) {
+ cy_rslt_t result;
+
+ self->cfg = (cy_stc_scb_i2c_config_t) {
+ .i2cMode = CY_SCB_I2C_MASTER,
+ .useRxFifo = false,
+ .useTxFifo = true,
+ .slaveAddress = 0U,
+ .slaveAddressMask = 0U,
+ .acceptAddrInFifo = false,
+ .ackGeneralAddr = false,
+ .enableWakeFromSleep = false,
+ .enableDigitalFilter = false,
+ .lowPhaseDutyCycle = 8U,
+ .highPhaseDutyCycle = 8U,
+ };
+
+ const mp_hal_pin_af_config_t i2c_pins_config[] = {
+ MP_HAL_PIN_AF_CONF_INIT(self->scl, CY_GPIO_DM_OD_DRIVESLOW, 1, MACHINE_PIN_AF_SIGNAL_I2C_SCL),
+ MP_HAL_PIN_AF_CONF_INIT(self->sda, CY_GPIO_DM_OD_DRIVESLOW, 1, MACHINE_PIN_AF_SIGNAL_I2C_SDA),
+ };
+
+ machine_pin_af_unit_t af_unit = MACHINE_PIN_AF_UNIT_NONE;
+ mp_hal_periph_pins_af_resolve_fn_unit(i2c_pins_config, 2, MACHINE_PIN_AF_FN_I2C, &af_unit);
+
+ self->scb_obj = machine_scb_obj_alloc(af_unit, self, machine_hw_i2c_scb_isr);
+
+ mp_hal_periph_pins_af_init(i2c_pins_config, 2);
+
+ result = Cy_SCB_I2C_Init(self->scb_obj->scb, &self->cfg, &self->ctx);
+ i2c_assert_raise_val("I2C init failed: 0x%lx", result);
+
+ // For desired data rate, clk_scb frequency must be in valid range (see TRM I2C Oversampling section)
+ // For 100kHz: clk_scb range is 1.55 - 3.2 MHz (architecture reference manual 002-38331 Rev. P685 table 355)
+ // - clk_peri = 100 MHz, divider = 42 → clk_scb = 2.38 MHz ✓ (mid-range)
+ // For 400kHz: clk_scb range is 7.82 - 10 MHz
+ // - clk_peri = 100 MHz, divider = 11 → clk_scb = 9.09 MHz ✓ (within range)
+ // Note: Cy_SysClk_PeriphSetDivider takes (divider - 1), so divider=11 → value=10
+ /* Connect assigned divider to be a clock source for I2C */
+ Cy_SysClk_PeriphAssignDivider(self->scb_obj->clk, CY_SYSCLK_DIV_8_BIT, 2U);
+ uint32_t divider = (freq_hz <= 100000) ? 41U : 10U;
+ Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_8_BIT, 2U, divider);
+ Cy_SysClk_PeriphEnableDivider(CY_SYSCLK_DIV_8_BIT, 2U);
+
+ uint32_t clk_scb_freq = Cy_SysClk_PeriphGetFrequency(CY_SYSCLK_DIV_8_BIT, 2U);
+ DEBUG_printf("DEBUG: clk_scb_freq=%u Hz\n", clk_scb_freq);
+
+ uint32_t actual_rate = Cy_SCB_I2C_SetDataRate(self->scb_obj->scb, freq_hz, clk_scb_freq);
+ DEBUG_printf("DEBUG: actual_rate=%u Hz (requested=%u Hz)\n", actual_rate, freq_hz);
+
+ if ((actual_rate > freq_hz) || (actual_rate == 0U)) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("cannot reach desired I2C data rate %u Hz (actual: %u Hz)"),
+ freq_hz, actual_rate);
+ }
+
+ sys_int_init(&(self->scb_obj->irq));
+
+ Cy_SCB_I2C_Enable(self->scb_obj->scb);
+
+ DEBUG_printf("I2C initialized: requested=%u Hz, actual=%u Hz, clk_scb=%u Hz\n",
+ freq_hz, actual_rate, clk_scb_freq);
+
+ self->freq = freq_hz;
+}
+
+
+static void machine_hw_i2c_deinit(mp_obj_base_t *self_in) {
+ machine_hw_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ Cy_SCB_I2C_Disable(self->scb_obj->scb, &self->ctx);
+ sys_int_deinit(&self->scb_obj->irq);
+ Cy_SysClk_PeriphDisableDivider(CY_SYSCLK_DIV_8_BIT, 0U);
+
+ machine_scb_obj_free(self->scb_obj);
+ machine_hw_i2c_obj_free(self);
+}
+
+static int machine_hw_i2c_transfer(mp_obj_base_t *self_in, uint16_t addr, size_t len, uint8_t *buf, unsigned int flags) {
+ machine_hw_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ cy_rslt_t result;
+
+ DEBUG_printf("I2C Transfer: addr=0x%02X, len=%u, flags=0x%02X (%s)\n",
+ addr, len, flags, (flags & MP_MACHINE_I2C_FLAG_READ) ? "READ" : "WRITE");
+
+ cy_stc_scb_i2c_master_xfer_config_t transfer;
+ transfer.slaveAddress = addr;
+ transfer.buffer = buf;
+ transfer.bufferSize = len;
+ // Generate Stop condition if MP_MACHINE_I2C_FLAG_STOP is set
+ transfer.xferPending = !(flags & MP_MACHINE_I2C_FLAG_STOP);
+
+ if (flags & MP_MACHINE_I2C_FLAG_READ) {
+ result = Cy_SCB_I2C_MasterRead(self->scb_obj->scb, &transfer, &self->ctx);
+ } else {
+ result = Cy_SCB_I2C_MasterWrite(self->scb_obj->scb, &transfer, &self->ctx);
+ }
+
+ if (result != CY_RSLT_SUCCESS) {
+ DEBUG_printf("I2C Transfer start failed: 0x%lx\n", result);
+ return -MP_EIO; // I/O error
+ }
+
+ DEBUG_printf("I2C Transfer started, waiting for completion...\n");
+
+ uint32_t start_time = mp_hal_ticks_us();
+ uint32_t timeout_end = start_time + self->timeout; // Both in microseconds
+
+ while (0UL != (CY_SCB_I2C_MASTER_BUSY & Cy_SCB_I2C_MasterGetStatus(self->scb_obj->scb, &self->ctx))) {
+ // Yield to allow other tasks/interrupts to run
+ mp_event_handle_nowait();
+
+ // Check for timeout using actual elapsed time
+ if (mp_hal_ticks_us() >= timeout_end) {
+ DEBUG_printf("I2C Transfer timeout after %u us!\n", self->timeout);
+ return -MP_ETIMEDOUT;
+ }
+ }
+
+ uint32_t master_status = Cy_SCB_I2C_MasterGetStatus(self->scb_obj->scb, &self->ctx);
+
+ DEBUG_printf("I2C Transfer complete, status=0x%08lX\n", master_status);
+
+ if (master_status & CY_SCB_I2C_MASTER_ERR) {
+ DEBUG_printf("I2C Transfer error detected in status\n");
+ return -MP_EIO; // I/O error
+ }
+
+ return len;
+}
+
+void machine_hw_i2c_deinit_all(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_I2C_NUM_ENTRIES; i++)
+ {
+ if (machine_hw_i2c_obj[i] != NULL) {
+ machine_hw_i2c_deinit((mp_obj_base_t *)machine_hw_i2c_obj[i]);
+ }
+ }
+}
+
+/******************************************************************************/
+// MicroPython bindings for machine API
+
+static void machine_hw_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_hw_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ // Print I2C configuration
+ mp_printf(print, "I2C(scl='%q', sda='%q', freq=%u, timeout=%u)",
+ self->scl->name,
+ self->sda->name,
+ self->freq,
+ self->timeout);
+}
+
+mp_obj_t machine_hw_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ mp_arg_check_num(n_args, n_kw, 0, 5, true);
+
+ enum { ARG_id, ARG_scl, ARG_sda, ARG_freq, ARG_timeout };
+
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_id, MP_ARG_INT, {.u_int = -1}},
+ { MP_QSTR_scl, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_sda, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_freq, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_I2C_FREQ} },
+ { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 50000} } // Default 50000us (50ms)
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ machine_hw_i2c_obj_t *self = machine_hw_i2c_obj_alloc();
+ if (self == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("machine.I2C: maximum number of I2C instances reached"));
+ }
+
+ if (args[ARG_id].u_int != -1) {
+ self->id = args[ARG_id].u_int;
+ DEBUG_printf("machine.I2C: ID parameter is ignored in this port.\n");
+ }
+
+ self->scl = mp_hal_get_pin_obj(args[ARG_scl].u_obj);
+ self->sda = mp_hal_get_pin_obj(args[ARG_sda].u_obj);
+
+ self->timeout = args[ARG_timeout].u_int;
+ if (self->timeout == 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("machine.I2C: timeout must be > 0"));
+ }
+
+ nlr_buf_t nlr;
+ if (nlr_push(&nlr) == 0) {
+ machine_hw_i2c_init(self, args[ARG_freq].u_int);
+ nlr_pop();
+ } else {
+ // Initialization failed, clean up
+ machine_hw_i2c_obj_free(self);
+ nlr_jump(nlr.ret_val);
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static const mp_machine_i2c_p_t machine_hw_i2c_p = {
+ .deinit = machine_hw_i2c_deinit,
+ .transfer = mp_machine_i2c_transfer_adaptor,
+ .transfer_single = machine_hw_i2c_transfer,
+};
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_i2c_type,
+ MP_QSTR_I2C,
+ MP_TYPE_FLAG_NONE,
+ make_new, machine_hw_i2c_make_new,
+ print, machine_hw_i2c_print,
+ protocol, &machine_hw_i2c_p,
+ locals_dict, &mp_machine_i2c_locals_dict
+ );
diff --git a/ports/psoc-edge/machine_i2c_target.c b/ports/psoc-edge/machine_i2c_target.c
new file mode 100644
index 00000000000..6da791e708d
--- /dev/null
+++ b/ports/psoc-edge/machine_i2c_target.c
@@ -0,0 +1,358 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// MTB includes
+#include "cybsp.h"
+#include "cy_scb_i2c.h"
+#include "cy_sysint.h"
+#include "cy_sysclk.h"
+
+// MicroPython includes
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "extmod/modmachine.h"
+
+// port-specific includes
+#include "genhdr/pins_af.h"
+#include "modmachine.h"
+#include "machine_scb.h"
+
+#define DEBUG_printf(...) // printf(__VA_ARGS__)
+
+// PDL event callback for slave operations
+static void i2c_slave_event_callback(uint32_t events);
+
+typedef struct _machine_i2c_target_obj_t {
+ mp_obj_base_t base;
+ uint8_t id;
+ mp_hal_pin_obj_t scl;
+ mp_hal_pin_obj_t sda;
+ uint32_t slave_addr;
+ uint8_t addrsize;
+ machine_scb_obj_t *scb_obj;
+ cy_stc_scb_i2c_config_t cfg;
+ cy_stc_scb_i2c_context_t ctx;
+ size_t tx_index;
+ size_t rx_index;
+} machine_i2c_target_obj_t;
+
+static machine_i2c_target_obj_t machine_i2c_target_obj[MICROPY_PY_MACHINE_I2C_NUM_ENTRIES];
+static machine_i2c_target_obj_t *machine_i2c_target_active_obj;
+
+/******************************************************************************/
+// PSOC PDL hardware bindings
+
+// PDL event callback - called from within Cy_SCB_I2C_SlaveInterrupt
+// Implements the event handling pattern from PDL Slave Operation documentation
+//
+// Key PDL requirements implemented:
+// 1. Register callback during init: Cy_SCB_I2C_RegisterEventCallback()
+// 2. Handle completion events: RD_CMPLT_EVENT, WR_CMPLT_EVENT
+// 3. Reconfigure buffers after each transaction (critical!)
+// 4. Clear status flags after write: Cy_SCB_I2C_SlaveClearWriteStatus()
+//
+// Note: Without buffer reconfiguration, next transaction continues from
+// where previous stopped (e.g., if master read 8 of 10 bytes, next read
+// starts at byte 9). This is PDL documented behavior.
+static void i2c_slave_event_callback(uint32_t events) {
+ machine_i2c_target_obj_t *self = machine_i2c_target_active_obj;
+
+ if (self == NULL) {
+ return;
+ }
+
+ machine_i2c_target_data_t *data = &machine_i2c_target_data[self->id];
+ // I2CTarget.IRQ_ADDR_MATCH_READ: master sent address with read bit.
+ if (events & CY_SCB_I2C_SLAVE_READ_EVENT) {
+ machine_i2c_target_data_addr_match(data, true);
+ }
+
+
+ // I2CTarget.IRQ_ADDR_MATCH_WRITE: master sent address with write bit.
+ if (events & CY_SCB_I2C_SLAVE_WRITE_EVENT) {
+ machine_i2c_target_data_addr_match(data, false);
+ }
+
+
+ if (events & CY_SCB_I2C_SLAVE_RD_BUF_EMPTY_EVENT) {
+ // I2CTarget.IRQ_READ_REQ: TX buffer consumed and another byte requested by master.
+ if (data->mem_buf != NULL && data->mem_len > 0) {
+ machine_i2c_target_data_read_request(self, data);
+ }
+ }
+
+ if (events & CY_SCB_I2C_SLAVE_RD_CMPLT_EVENT) {
+ if (data->mem_buf != NULL && data->mem_len > 0) {
+ Cy_SCB_I2C_SlaveConfigReadBuf(self->scb_obj->scb, data->mem_buf, data->mem_len, &self->ctx);
+ }
+
+ Cy_SCB_I2C_SlaveClearReadStatus(self->scb_obj->scb, &self->ctx);
+
+ // Reset index for next transaction
+ self->tx_index = 0;
+
+ // Set state to READING so extmod reset_helper triggers END_READ
+ data->state = STATE_READING;
+
+ // I2CTarget.IRQ_END_READ: read transaction completed (STOP/restart observed).
+ machine_i2c_target_data_restart_or_stop(data);
+ }
+
+ if (events & CY_SCB_I2C_SLAVE_WR_CMPLT_EVENT) {
+ if (!(events & CY_SCB_I2C_SLAVE_ERR_EVENT)) {
+ uint32_t bytes_received = Cy_SCB_I2C_SlaveGetWriteTransferCount(self->scb_obj->scb, &self->ctx);
+ self->rx_index = 0;
+ while (self->rx_index < bytes_received) {
+ // I2CTarget.IRQ_WRITE_REQ: incoming write payload available from master.
+ machine_i2c_target_data_write_request(self, data);
+ }
+ }
+
+ if (data->mem_buf != NULL && data->mem_len > 0) {
+ Cy_SCB_I2C_SlaveConfigWriteBuf(self->scb_obj->scb, data->mem_buf, data->mem_len, &self->ctx);
+ }
+
+ Cy_SCB_I2C_SlaveClearWriteStatus(self->scb_obj->scb, &self->ctx);
+
+ // Ensure state is WRITING so extmod reset_helper triggers END_WRITE
+ data->state = STATE_WRITING;
+
+ // I2CTarget.IRQ_END_WRITE: write transaction completed (STOP/restart observed).
+ machine_i2c_target_data_restart_or_stop(data);
+ }
+
+ // Handle errors
+ if (events & CY_SCB_I2C_SLAVE_ERR_EVENT) {
+ machine_i2c_target_data_restart_or_stop(data);
+ }
+}
+
+static void machine_i2c_target_scb_isr(mp_obj_t i2c_target_obj) {
+ machine_i2c_target_obj_t *self = MP_OBJ_TO_PTR(i2c_target_obj);
+ machine_i2c_target_obj_t *prev_active_obj = machine_i2c_target_active_obj;
+ machine_i2c_target_active_obj = self;
+ Cy_SCB_I2C_SlaveInterrupt(self->scb_obj->scb, &self->ctx);
+ machine_i2c_target_active_obj = prev_active_obj;
+}
+
+static void i2c_target_init(machine_i2c_target_obj_t *self, machine_i2c_target_data_t *data,
+ uint32_t addr, uint32_t addrsize, bool first_init) {
+ cy_rslt_t result;
+
+ if (!first_init) {
+ Cy_SCB_I2C_Disable(self->scb_obj->scb, &self->ctx);
+ }
+
+ self->cfg = (cy_stc_scb_i2c_config_t) {
+ .i2cMode = CY_SCB_I2C_SLAVE,
+ .useRxFifo = false, // PDL recommends false for slave to avoid side effects
+ .useTxFifo = true,
+ .slaveAddress = addr,
+ .slaveAddressMask = 0xFEU,
+ .acceptAddrInFifo = false,
+ .ackGeneralAddr = false,
+ .enableWakeFromSleep = false,
+ .enableDigitalFilter = false,
+ .lowPhaseDutyCycle = 0U, // Not used for slave mode
+ .highPhaseDutyCycle = 0U, // Not used for slave mode
+ };
+
+ self->slave_addr = addr;
+ self->addrsize = addrsize;
+
+ const mp_hal_pin_af_config_t i2c_pins_config[] = {
+ MP_HAL_PIN_AF_CONF_INIT(self->scl, CY_GPIO_DM_OD_DRIVESLOW, 1, MACHINE_PIN_AF_SIGNAL_I2C_SCL),
+ MP_HAL_PIN_AF_CONF_INIT(self->sda, CY_GPIO_DM_OD_DRIVESLOW, 1, MACHINE_PIN_AF_SIGNAL_I2C_SDA),
+ };
+
+ machine_pin_af_unit_t af_unit = MACHINE_PIN_AF_UNIT_NONE;
+ mp_hal_periph_pins_af_resolve_fn_unit(i2c_pins_config, 2, MACHINE_PIN_AF_FN_I2C, &af_unit);
+
+ self->scb_obj = machine_scb_obj_alloc(af_unit, self, machine_i2c_target_scb_isr);
+
+ mp_hal_periph_pins_af_init(i2c_pins_config, 2);
+
+ result = Cy_SCB_I2C_Init(self->scb_obj->scb, &self->cfg, &self->ctx);
+ if (result != CY_RSLT_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("I2C target init failed: 0x%lx"), result);
+ }
+
+ // Configure clock for I2C slave operation
+ // For 400 khz slave, clk_scb must be 7.82 – 15.38 MHz
+ // For 100 khz slave, clk_scb must be 1.55 – 12.8 MHz
+ // clk_peri = 100 MHz, divider = 7, clk_scb = 100/8 = 12.5 MHz
+ Cy_SysClk_PeriphAssignDivider(self->scb_obj->clk, CY_SYSCLK_DIV_8_BIT, 2U);
+ Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_8_BIT, 2U, 7U); // divider = n+1, so 7 means divide by 8
+ Cy_SysClk_PeriphEnableDivider(CY_SYSCLK_DIV_8_BIT, 2U);
+
+ sys_int_init(&(self->scb_obj->irq));
+
+ Cy_SCB_I2C_RegisterEventCallback(self->scb_obj->scb, i2c_slave_event_callback, &self->ctx);
+
+ if (data->mem_buf != NULL && data->mem_len > 0) {
+ Cy_SCB_I2C_SlaveConfigReadBuf(self->scb_obj->scb, data->mem_buf, data->mem_len, &self->ctx);
+ Cy_SCB_I2C_SlaveConfigWriteBuf(self->scb_obj->scb, data->mem_buf, data->mem_len, &self->ctx);
+ }
+
+ Cy_SCB_I2C_Enable(self->scb_obj->scb);
+
+ DEBUG_printf("I2C Target initialized: addr=0x%02X, addrsize=%u-bit\n", addr, addrsize);
+}
+
+/******************************************************************************/
+// I2CTarget port implementation
+
+static inline size_t mp_machine_i2c_target_get_index(machine_i2c_target_obj_t *self) {
+ return self->id;
+}
+
+// IRQ event callback - called from extmod to trigger Python IRQ handler
+// This is called by handle_event() in extmod/machine_i2c_target.c
+static void mp_machine_i2c_target_event_callback(machine_i2c_target_irq_obj_t *irq) {
+ if (irq->base.handler != mp_const_none) {
+ mp_irq_handler(&irq->base);
+ }
+}
+
+static size_t mp_machine_i2c_target_read_bytes(machine_i2c_target_obj_t *self, size_t len, uint8_t *buf) {
+ machine_i2c_target_data_t *data = &machine_i2c_target_data[self->id];
+ size_t read_len = 0;
+
+ sys_int_disable(&(self->scb_obj->irq));
+
+ // Read from write buffer (data written by master into slave write buffer)
+ uint32_t available = Cy_SCB_I2C_SlaveGetWriteTransferCount(self->scb_obj->scb, &self->ctx);
+ read_len = (len < available) ? len : available;
+
+ if (data->mem_buf != NULL) {
+ for (size_t i = 0; i < read_len; i++) {
+ if (self->rx_index < data->mem_len) {
+ buf[i] = data->mem_buf[self->rx_index++];
+ }
+ }
+ }
+
+ sys_int_enable(&(self->scb_obj->irq));
+
+ return read_len;
+}
+
+static size_t mp_machine_i2c_target_write_bytes(machine_i2c_target_obj_t *self, size_t len, const uint8_t *buf) {
+ machine_i2c_target_data_t *data = &machine_i2c_target_data[self->id];
+ size_t write_len = 0;
+
+ sys_int_disable(&(self->scb_obj->irq));
+
+ if (data->mem_buf != NULL) {
+ for (size_t i = 0; i < len; i++) {
+ if (self->tx_index < data->mem_len) {
+ data->mem_buf[self->tx_index++] = buf[i];
+ write_len++;
+ }
+ }
+
+ // Update slave read buffer to reflect new data (per PDL documentation)
+ Cy_SCB_I2C_SlaveConfigReadBuf(self->scb_obj->scb, data->mem_buf, self->tx_index, &self->ctx);
+ }
+
+ sys_int_enable(&(self->scb_obj->irq));
+
+ return write_len;
+}
+
+static void mp_machine_i2c_target_irq_config(machine_i2c_target_obj_t *self, unsigned int trigger) {
+ // IRQ configuration already handled in init
+}
+
+static mp_obj_t mp_machine_i2c_target_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ enum { ARG_id, ARG_addr, ARG_addrsize, ARG_mem, ARG_mem_addrsize, ARG_scl, ARG_sda };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_id, MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_addr, MP_ARG_REQUIRED | MP_ARG_INT },
+ { MP_QSTR_addrsize, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 7} },
+ { MP_QSTR_mem, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_mem_addrsize, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_scl, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_sda, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ int i2c_id = args[ARG_id].u_int;
+
+ if (i2c_id < 0 || i2c_id >= MICROPY_PY_MACHINE_I2C_NUM_ENTRIES) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("I2CTarget(%d) doesn't exist"), i2c_id);
+ }
+
+ machine_i2c_target_obj_t *self = &machine_i2c_target_obj[i2c_id];
+
+ bool first_init = false;
+ if (self->base.type == NULL) {
+ // Created for the first time, set default values
+ self->base.type = &machine_i2c_target_type;
+ self->id = i2c_id;
+ first_init = true;
+ }
+
+ if (args[ARG_addrsize].u_int != 7 && args[ARG_addrsize].u_int != 10) {
+ mp_raise_ValueError(MP_ERROR_TEXT("addrsize must be 7 or 10"));
+ }
+
+ if (args[ARG_mem_addrsize].u_int != 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("mem_addrsize must be 0 (EEPROM-like addressing not implemented)"));
+ }
+
+ self->tx_index = 0;
+ self->rx_index = 0;
+
+ MP_STATE_PORT(machine_i2c_target_mem_obj)[i2c_id] = args[ARG_mem].u_obj;
+ machine_i2c_target_data_t *data = &machine_i2c_target_data[i2c_id];
+ machine_i2c_target_data_init(data, args[ARG_mem].u_obj, args[ARG_mem_addrsize].u_int);
+
+ self->scl = mp_hal_get_pin_obj(args[ARG_scl].u_obj);
+ self->sda = mp_hal_get_pin_obj(args[ARG_sda].u_obj);
+
+ i2c_target_init(self, data, args[ARG_addr].u_int, args[ARG_addrsize].u_int, first_init);
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static void mp_machine_i2c_target_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_i2c_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "I2CTarget(%u, addr=0x%02X, scl='%q', sda='%q')",
+ self->id, self->slave_addr, self->scl->name, self->sda->name);
+}
+
+static void mp_machine_i2c_target_deinit(machine_i2c_target_obj_t *self) {
+ Cy_SCB_I2C_Disable(self->scb_obj->scb, &self->ctx);
+ sys_int_deinit(&(self->scb_obj->irq));
+ self->base.type = NULL;
+
+ machine_scb_obj_free(self->scb_obj);
+
+ DEBUG_printf("I2C Target deinitialized\n");
+}
diff --git a/ports/psoc-edge/machine_ipc.c b/ports/psoc-edge/machine_ipc.c
new file mode 100644
index 00000000000..810b4110d4b
--- /dev/null
+++ b/ports/psoc-edge/machine_ipc.c
@@ -0,0 +1,645 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+
+// std includes
+#include
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "cybsp.h"
+#include "cy_pdl.h"
+#include "cy_ipc_pipe.h"
+
+// port-specific includes
+#include "machine_ipc.h"
+
+/*******************************************************************************
+* Macros
+*******************************************************************************/
+#define IPC_MAX_CLIENTS_PER_EP (8UL)
+#define IPC_MAX_ENDPOINTS (5UL)
+#define CM55_APP_BOOT_ADDR (CYMEM_CM33_0_m55_nvm_START + CYBSP_MCUBOOT_HEADER_SIZE)
+#define CM55_BOOT_WAIT_TIME_USEC (10U)
+#define CM55_APP_DELAY_MS (50U)
+
+#define CM33_APP_DELAY_MS (50U)
+
+/* Core ID constants */
+#define CM33 (0U)
+#define CM55 (1U)
+
+/*******************************************************************************
+* Global Variables
+*******************************************************************************/
+static bool cm55_enabled = false;
+CY_SECTION_SHAREDMEM static ipc_msg_t ipc_msg_buffer;
+machine_ipc_obj_t *machine_ipc_obj[IPC_MAX_CLIENTS_PER_EP] = {NULL};
+
+/*******************************************************************************
+* machine_ipc_client_obj_t IRQ methods and type
+*******************************************************************************/
+
+static mp_uint_t machine_ipc_client_irq_trigger(mp_obj_t self_in, mp_uint_t new_trigger) {
+ if (new_trigger == 0) {
+ machine_ipc_client_obj_t *client = MP_OBJ_TO_PTR(self_in);
+ client->base.handler = mp_const_none;
+ if (client->client_id < IPC_MAX_CLIENTS_PER_EP) {
+ MP_STATE_PORT(machine_ipc_client_handlers)[client->client_id] = mp_const_none;
+ }
+ }
+ return 0;
+}
+
+static mp_uint_t machine_ipc_client_irq_info(mp_obj_t self_in, mp_uint_t info_type) {
+ (void)self_in;
+ (void)info_type;
+ return 0;
+}
+
+static const mp_irq_methods_t machine_ipc_client_irq_methods = {
+ .trigger = machine_ipc_client_irq_trigger,
+ .info = machine_ipc_client_irq_info,
+};
+
+static void machine_ipc_client_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
+ if (dest[0] != MP_OBJ_NULL) {
+ return;
+ }
+ machine_ipc_client_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (attr == MP_QSTR_cmd) {
+ dest[0] = MP_OBJ_NEW_SMALL_INT(self->last_cmd);
+ } else if (attr == MP_QSTR_value) {
+ dest[0] = mp_obj_new_int_from_uint(self->last_value);
+ } else if (attr == MP_QSTR_id) {
+ dest[0] = MP_OBJ_NEW_SMALL_INT(self->client_id);
+ }
+}
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_ipc_client_type,
+ MP_QSTR_IPCClient,
+ MP_TYPE_FLAG_NONE,
+ attr, machine_ipc_client_attr);
+
+/*******************************************************************************
+* IPC Helper functions
+*******************************************************************************/
+
+/**
+ * Get endpoint configuration based on core ID
+ * Returns endpoint address, channel, interrupt, and other config params
+ */
+static void get_endpoint_config_for_core(uint8_t core_id,
+ uint32_t *ep_addr,
+ uint32_t *ep_channel,
+ uint32_t *ep_intr,
+ uint32_t *ep_intr_mux,
+ uint32_t *ep_intr_priority) {
+ switch (core_id) {
+ case CM33:
+ *ep_addr = CM33_IPC_PIPE_EP_ADDR;
+ *ep_channel = CY_IPC_CHAN_CYPIPE_EP1;
+ *ep_intr = CY_IPC_INTR_CYPIPE_EP1;
+ *ep_intr_mux = CY_IPC_INTR_CYPIPE_MUX_EP1;
+ *ep_intr_priority = CY_IPC_INTR_CYPIPE_PRIOR_EP1;
+ break;
+
+ case CM55:
+ *ep_addr = CM55_IPC_PIPE_EP_ADDR;
+ *ep_channel = CY_IPC_CHAN_CYPIPE_EP2;
+ *ep_intr = CY_IPC_INTR_CYPIPE_EP2;
+ *ep_intr_mux = CY_IPC_INTR_CYPIPE_MUX_EP2;
+ *ep_intr_priority = CY_IPC_INTR_CYPIPE_PRIOR_EP2;
+ break;
+
+ default:
+ // Invalid core - set to zero
+ *ep_addr = 0;
+ *ep_channel = 0;
+ *ep_intr = 0;
+ *ep_intr_mux = 0;
+ *ep_intr_priority = 0;
+ break;
+ }
+}
+
+/**
+ * Get endpoint address for a given core ID
+ */
+static uint32_t get_ep_addr_for_core(uint8_t core_id) {
+ switch (core_id) {
+ case CM33:
+ return CM33_IPC_PIPE_EP_ADDR;
+ case CM55:
+ return CM55_IPC_PIPE_EP_ADDR;
+ default:
+ return 0;
+ }
+}
+
+/**
+ * Get channel for a given core ID
+ */
+static uint32_t get_channel_for_core(uint8_t core_id) {
+ switch (core_id) {
+ case CM33:
+ return CY_IPC_CHAN_CYPIPE_EP1;
+ case CM55:
+ return CY_IPC_CHAN_CYPIPE_EP2;
+ default:
+ return 0;
+ }
+}
+
+/**
+ * Build IPC pipe configuration structure
+ */
+static bool build_ipc_pipe_config(cy_stc_ipc_pipe_config_t *config_out,
+ uint8_t src_core,
+ uint8_t target_core,
+ cy_ipc_pipe_callback_ptr_t *callbacks_array,
+ void (*isr_handler)(void)) {
+
+ // Validate cores
+ if (src_core >= CM55 + 1 || target_core >= CM55 + 1) {
+ printf("Error: Invalid core IDs (src=%d, target=%d)\r\n", src_core, target_core);
+ return false;
+ }
+
+ if (src_core == target_core) {
+ printf("Error: Source and target cores cannot be the same\r\n");
+ return false;
+ }
+
+ // Get source endpoint configuration
+ uint32_t src_addr, src_channel, src_intr, src_intr_mux, src_intr_priority;
+ get_endpoint_config_for_core(src_core, &src_addr, &src_channel, &src_intr,
+ &src_intr_mux, &src_intr_priority);
+
+ // Get target endpoint configuration
+ uint32_t tgt_addr, tgt_channel, tgt_intr, tgt_intr_mux, tgt_intr_priority;
+ get_endpoint_config_for_core(target_core, &tgt_addr, &tgt_channel, &tgt_intr,
+ &tgt_intr_mux, &tgt_intr_priority);
+
+ // Build configuration structure to match static config roles
+ // Endpoint 0: Source core (CM33 - receiver for messages from CM55)
+ config_out->ep0ConfigData.ipcNotifierNumber = src_intr;
+ config_out->ep0ConfigData.ipcNotifierPriority = src_intr_priority;
+ config_out->ep0ConfigData.ipcNotifierMuxNumber = src_intr_mux;
+ config_out->ep0ConfigData.epAddress = src_addr;
+ config_out->ep0ConfigData.epConfig.epChannel = src_channel;
+ config_out->ep0ConfigData.epConfig.epIntr = src_intr;
+ config_out->ep0ConfigData.epConfig.epIntrmask = CY_IPC_CYPIPE_INTR_MASK;
+
+ // Endpoint 1: Target core (CM55 - sender of messages to CM33)
+ config_out->ep1ConfigData.ipcNotifierNumber = tgt_intr;
+ config_out->ep1ConfigData.ipcNotifierPriority = tgt_intr_priority;
+ config_out->ep1ConfigData.ipcNotifierMuxNumber = tgt_intr_mux;
+ config_out->ep1ConfigData.epAddress = tgt_addr;
+ config_out->ep1ConfigData.epConfig.epChannel = tgt_channel;
+ config_out->ep1ConfigData.epConfig.epIntr = tgt_intr;
+ config_out->ep1ConfigData.epConfig.epIntrmask = CY_IPC_CYPIPE_INTR_MASK;
+
+ // Common configuration
+ config_out->endpointClientsCount = IPC_MAX_CLIENTS_PER_EP;
+ config_out->endpointsCallbacksArray = callbacks_array;
+ config_out->userPipeIsrHandler = isr_handler;
+
+ return true;
+}
+
+/**
+ * Send an IPC message to target core
+ *
+ * @param src_endpoint_addr Source endpoint address (e.g., CM33_IPC_PIPE_EP_ADDR)
+ * @param target_endpoint_addr Target endpoint address (e.g., CM55_IPC_PIPE_EP_ADDR)
+ * @param target_client_id Target client ID (0-7)
+ * @param cmd Command byte
+ * @param value Data value
+ * @return true if send successful, false otherwise
+ */
+static bool ipc_send_message(uint32_t src_endpoint_addr,
+ uint32_t target_endpoint_addr,
+ uint8_t target_client_id,
+ uint8_t cmd,
+ uint32_t value) {
+ // Validate client_id
+ if (target_client_id >= IPC_MAX_CLIENTS_PER_EP) {
+ mp_printf(&mp_plat_print, "[CM33] Error: Invalid target_client_id %d\r\n", target_client_id);
+ return false;
+ }
+
+ // Prepare message in shared memory buffer
+ ipc_msg_buffer.client_id = target_client_id;
+ ipc_msg_buffer.intr_mask = CY_IPC_CYPIPE_INTR_MASK;
+ ipc_msg_buffer.cmd = cmd;
+ ipc_msg_buffer.value = value;
+
+ // Wait for channel to be free, then send
+ cy_en_ipc_pipe_status_t status;
+ uint32_t retry_count = 0;
+ const uint32_t MAX_RETRIES = 100000; // Allow retry to avoid intermittent failure
+
+ do {
+ status = Cy_IPC_Pipe_SendMessage(
+ target_endpoint_addr, // toAddr = destination (CM55)
+ src_endpoint_addr, // fromAddr = source (CM33)
+ (void *)&ipc_msg_buffer,
+ NULL
+ );
+
+ if (status == CY_IPC_PIPE_SUCCESS) {
+ break;
+ }
+
+ // If channel is busy, wait a bit and retry
+ if (status == CY_IPC_PIPE_ERROR_SEND_BUSY) {
+ Cy_SysLib_DelayUs(100); // 100us delay
+ retry_count++;
+ } else {
+ // Other error - fail immediately
+ mp_printf(&mp_plat_print, "[CM33] Error: Cy_IPC_Pipe_SendMessage failed with status %d\r\n", status);
+ return false;
+ }
+ } while (retry_count < MAX_RETRIES);
+
+ if (status != CY_IPC_PIPE_SUCCESS) {
+ mp_printf(&mp_plat_print, "[CM33] Error: Channel busy after %lu retries, status %d\r\n", retry_count, status);
+ return false;
+ }
+
+ return true;
+}
+
+/*******************************************************************************
+* Setup Functions
+*******************************************************************************/
+
+void cm33_ipc_pipe_isr(void) {
+ Cy_IPC_Pipe_ExecuteCallback(CM33_IPC_PIPE_EP_ADDR);
+}
+
+/**
+ * Initialize IPC pipe
+ *
+ * @param src_core Source core ID
+ * @param target_core Target core ID
+ * @return true if initialization successful, false otherwise
+ */
+static bool ipc_pipe_init(uint8_t src_core, uint8_t target_core) {
+ static cy_stc_ipc_pipe_ep_t cm33_ipc_pipe_ep_array[IPC_MAX_ENDPOINTS];
+ static cy_ipc_pipe_callback_ptr_t ep1_cb_array[IPC_MAX_CLIENTS_PER_EP];
+ CY_SECTION_SHAREDMEM static uint32_t ipc_sema_array[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD];
+
+ // Allocate configuration structure
+ cy_stc_ipc_pipe_config_t pipe_config;
+
+ // Build configuration dynamically
+ bool config_set = build_ipc_pipe_config(&pipe_config,
+ src_core,
+ target_core,
+ ep1_cb_array,
+ &cm33_ipc_pipe_isr);
+
+ if (!config_set) {
+ printf("Error: Failed to build IPC pipe configuration\r\n");
+ return false;
+ }
+
+ // Initialize semaphores (always needed)
+ Cy_IPC_Sema_Init(IPC0_SEMA_CH_NUM, CY_IPC_SEMA_COUNT, ipc_sema_array);
+
+ // Configure endpoint array
+ Cy_IPC_Pipe_Config(cm33_ipc_pipe_ep_array);
+
+ // Initialize pipe with dynamic configuration
+ Cy_IPC_Pipe_Init(&pipe_config);
+
+ return true;
+}
+
+/********************************************************************************************************
+* MicroPython Constructor:
+* IPC(src_core, target_core) - Create an IPC object to function between 2 cores.
+* Max of 5 IPC objects can be created (based on hardware capabilities) and each object can represent
+* an endpoint/channel to communicate with the target core. The src_core and target_core
+* parameters can be used to set up the endpoint based on the cores involved in communication. Currently,
+* only CM33 to CM55 communication is supported and the endpoint configuration is fixed based on this use case but in
+* the future, this can be extended to support dynamic endpoint configuration based on the cores selected during
+* object creation.
+********************************************************************************************************/
+static mp_obj_t machine_ipc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ enum { ARG_src_core, ARG_target_core };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_src_core, MP_ARG_INT, {.u_int = CM33} },
+ { MP_QSTR_target_core, MP_ARG_INT, {.u_int = CM55} },
+ };
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ machine_ipc_obj_t *self = NULL;
+ for (uint8_t i = 0; i < IPC_MAX_ENDPOINTS; i++) {
+ if (MP_STATE_PORT(machine_ipc_obj[i]) == NULL) {
+ self = mp_obj_malloc(machine_ipc_obj_t, &machine_ipc_type);
+ MP_STATE_PORT(machine_ipc_obj[i]) = self;
+ break;
+ }
+ }
+ if (self == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("all available IPC instances are allocated"));
+ }
+ self->base.type = &machine_ipc_type;
+
+ // Initialise all client slots to unregistered sentinel so duplicate-check works
+ for (uint8_t i = 0; i < IPC_MAX_CLIENTS_PER_EP; i++) {
+ mp_irq_init(&sender_clients_arr[i].base, &machine_ipc_client_irq_methods,
+ MP_OBJ_FROM_PTR(&sender_clients_arr[i]));
+ sender_clients_arr[i].base.base.type = &machine_ipc_client_type;
+ sender_clients_arr[i].client_id = IPC_CLIENT_ID_UNREGISTERED;
+ sender_clients_arr[i].last_cmd = 0;
+ sender_clients_arr[i].last_value = 0;
+ MP_STATE_PORT(machine_ipc_client_handlers)[i] = mp_const_none;
+ }
+
+ // Validate cores selected
+ if (args[ARG_src_core].u_int != CM33 || args[ARG_target_core].u_int != CM55) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid core values: only CM33<->CM55 communication is supported"));
+ }
+
+ // Store core information in the object for future reference (e.g., during endpoint registration)
+ self->src_core = args[ARG_src_core].u_int;
+ self->target_core = args[ARG_target_core].u_int;
+
+ // Initialize sender endpoint structure based on source and target cores. Each endpoint can have max of IPC_MAX_CLIENTS_PER_EP clients,
+ self->sender_endpoint = &sender_clients_arr[0];
+ self->sender_endpoint->ep_id = args[ARG_src_core].u_int;
+ self->sender_endpoint->ep_addr = CM33_IPC_PIPE_EP_ADDR;
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+/* Callback to handle messages received from CM55 in CM33-NS. Registered with
+* the IPC driver for the CM33 source endpoint; called from the IPC ISR
+* (cm33_ipc_pipe_isr) when a message arrives from CM55.
+* Extracts cmd/value from the message and stores them in the per-client object
+* identified by client_id, then defers the Python callback to the MicroPython
+* VM via mp_irq_handler / mp_sched_schedule instead of calling it directly.
+*/
+void cm33_msg_callback(uint32_t *msg_data) {
+ if (msg_data == NULL) {
+ return;
+ }
+ ipc_msg_t *ipc_recv_msg = (ipc_msg_t *)msg_data;
+ uint8_t client_id = ipc_recv_msg->client_id;
+
+ if (client_id >= IPC_MAX_CLIENTS_PER_EP) {
+ mp_printf(&mp_plat_print, "[CM33] Invalid client_id %d in received message\r\n", client_id);
+ return;
+ }
+
+ machine_ipc_client_obj_t *client = &sender_clients_arr[client_id];
+ if (client->base.handler != mp_const_none) {
+ client->last_cmd = ipc_recv_msg->cmd;
+ client->last_value = ipc_recv_msg->value;
+ mp_irq_handler(&client->base);
+ }
+}
+/********************************************************************************************************
+// IPC.register_client(client_id, callback, endpoint_id, endpoint_addr) - Register a client to receive messages from the other core. The client_id is an identifier for the client (0-7) and should be unique for each client. The callback is the Python function that will be called when a message is received for this client. The endpoint_id and endpoint_addr are used to register the callback with the IPC driver for the correct endpoint.
+* @param args[0] self - IPC object
+* @param args[1] client_id - Unique client identifier (0-7)
+* @param args[2] callback - Python function to call when message received for this client
+* @param args[3] endpoint_id - Endpoint ID to register with IPC driver (e.g., CM33_IPC_PIPE_EP_ADDR)
+* @param args[4] endpoint_addr - Endpoint address to register with IPC driver (e.g., CM33_IPC_PIPE_EP_ADDR)
+********************************************************************************************************/
+
+static mp_obj_t machine_ipc_register_client(size_t n_args, const mp_obj_t *args) {
+ uint8_t client_id = mp_obj_get_int(args[1]);
+ mp_obj_t callback_handler = args[2];
+ uint8_t endpoint_id = mp_obj_get_int(args[3]);
+ uint32_t endpoint_addr = mp_obj_get_int(args[4]);
+
+
+ // Validate client_id : Should be unique i.e no two clients can have same id and should be less than IPC_MAX_CLIENTS_PER_EP
+ if (client_id >= IPC_MAX_CLIENTS_PER_EP) {
+ mp_printf(&mp_plat_print, "Error: Invalid client_id %d (max %ld)\r\n",
+ client_id, IPC_MAX_CLIENTS_PER_EP - 1);
+ return mp_const_false;
+ }
+
+ // Validate callback
+ if (callback_handler != mp_const_none && !mp_obj_is_callable(callback_handler)) {
+ mp_printf(&mp_plat_print, "Error: Callback is not callable\r\n");
+ return mp_const_false;
+ }
+
+ // Check if client_id is already registered (unregistered slots have IPC_CLIENT_ID_UNREGISTERED)
+ for (uint8_t i = 0; i < IPC_MAX_CLIENTS_PER_EP; i++) {
+ if (sender_clients_arr[i].client_id != IPC_CLIENT_ID_UNREGISTERED &&
+ sender_clients_arr[i].client_id == client_id) {
+ mp_printf(&mp_plat_print, "Error: client_id %d is already registered\r\n", client_id);
+ return mp_const_false;
+ }
+ }
+
+ // Set the client information in the global sender_clients_arr based on client_id
+ sender_clients_arr[client_id].client_id = client_id;
+ sender_clients_arr[client_id].base.handler = callback_handler;
+ MP_STATE_PORT(machine_ipc_client_handlers)[client_id] = callback_handler;
+ sender_clients_arr[client_id].ep_addr = endpoint_addr;
+ sender_clients_arr[client_id].ep_id = endpoint_id;
+
+ // Register the C callback with IPC pipe framework. The client_id parameter is the index in the callback array where the function pointer is saved
+ cy_en_ipc_pipe_status_t status = Cy_IPC_Pipe_RegisterCallback(
+ endpoint_addr, // Endpoint address (CM33_IPC_PIPE_EP_ADDR)
+ &cm33_msg_callback, // Callback function pointer
+ (uint32_t)client_id // Client ID - index in callback array
+ );
+ if (status != CY_IPC_PIPE_SUCCESS) {
+ mp_printf(&mp_plat_print, "Error: Cy_IPC_Pipe_RegisterCallback failed with status %d\r\n", status);
+ return mp_const_false;
+ }
+
+ mp_printf(&mp_plat_print, "[CM33] -> Registered client with ID: %d successfully \r\n", client_id);
+
+ return mp_const_true;
+
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_ipc_register_client_obj, 5, 5, machine_ipc_register_client);
+
+
+/*******************************************************************************
+* IPC.init() - Initialize IPC communication
+* @param args[0] self - IPC object
+*******************************************************************************/
+static mp_obj_t machine_ipc_init(mp_obj_t self_in) {
+ machine_ipc_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ // Initialize IPC pipe with dynamic configuration based on object's cores
+ bool init_ok = ipc_pipe_init(self->src_core, self->target_core);
+
+ if (!init_ok) {
+ mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("IPC pipe initialization failed"));
+ }
+
+ Cy_SysLib_Delay(CM33_APP_DELAY_MS);
+
+ mp_printf(&mp_plat_print, "IPC initialized successfully\r\n");
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_ipc_init_obj, machine_ipc_init);
+
+/*******************************************************************************
+* IPC.enable_core(core_id) - Enable target core
+* @param args[0] self - IPC object
+* @param args[1] core_id - Core to enable (default: CM55)
+*******************************************************************************/
+// Not required as API to user? Call this from constructor or init?
+static mp_obj_t machine_ipc_enable_core(size_t n_args, const mp_obj_t *args) {
+ // Default to CM55 (CM55) if no argument provided
+ uint8_t core_id = (n_args > 1) ? mp_obj_get_int(args[1]) : CM55;
+
+ // Currently only CM55 (CM55) is supported
+ if (core_id == CM55) {
+ if (cm55_enabled) {
+ mp_printf(&mp_plat_print, "CM55 already enabled\r\n");
+ return mp_const_true;
+ }
+ Cy_SysEnableCM55(MXCM55, CM55_APP_BOOT_ADDR, CM55_BOOT_WAIT_TIME_USEC);
+ cm55_enabled = true;
+ Cy_SysLib_Delay(CM33_APP_DELAY_MS);
+
+ mp_printf(&mp_plat_print, "Enabling CM55 core at boot address: 0x%08X\r\n", CM55_APP_BOOT_ADDR);
+
+ return mp_const_true;
+ } else if (core_id == CM33) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid operation: CM33 core is already active and cannot be re-enabled"));
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("unsupported core, only CM55 is supported")); // ToDo: This should be generalised
+ }
+
+ return mp_const_false;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_ipc_enable_core_obj, 1, 2, machine_ipc_enable_core);
+
+/*******************************************************************************
+* IPC.send(cmd, value, client_id) - Send message to target core
+*
+* @param args[0] self - IPC object
+* @param args[1] cmd - Command byte
+* @param args[2] value - Optional data value (default: 0)
+* @param args[3] client_id - Target client ID
+*******************************************************************************/
+static mp_obj_t machine_ipc_send(size_t n_args, const mp_obj_t *args) {
+ machine_ipc_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ // Parse arguments
+ uint32_t cmd = mp_obj_get_int(args[1]);
+ uint32_t value = (n_args > 2) ? mp_obj_get_int(args[2]) : 0;
+ uint8_t client_id = mp_obj_get_int(args[3]);
+
+ uint32_t src_ep_addr = self->sender_endpoint->ep_addr;
+ uint32_t target_ep_addr = get_ep_addr_for_core(self->target_core);
+
+ // Use helper function to send message
+ bool success = ipc_send_message(
+ src_ep_addr, // Source endpoint (from self)
+ target_ep_addr, // Target endpoint (from self->target_core)
+ client_id, // Target client
+ (uint8_t)cmd, // Command
+ value // Value
+ );
+
+ if (!success) {
+ mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("IPC send failed"));
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_ipc_send_obj, 2, 4, machine_ipc_send);
+
+/*******************************************************************************
+* IPC.is_busy() - Check if IPC is busy
+* @param args[0] self - IPC object
+* @param args[1] Optional core_id to check specific core's IPC status (default: target_core)
+*******************************************************************************/
+static mp_obj_t machine_ipc_is_busy(size_t n_args, const mp_obj_t *args) {
+ machine_ipc_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ uint8_t core_id = (n_args > 1) ? mp_obj_get_int(args[1]) : self->target_core;
+
+ uint32_t channel = get_channel_for_core(core_id);
+ if (channel == 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid core ID"));
+ }
+ bool locked = Cy_IPC_Drv_IsLockAcquired(Cy_IPC_Drv_GetIpcBaseAddress(channel));
+ return mp_obj_new_bool(locked);
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_ipc_is_busy_obj, 1, 2, machine_ipc_is_busy);
+
+/*******************************************************************************
+* IPC locals dictionary
+*******************************************************************************/
+static const mp_rom_map_elem_t machine_ipc_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_ipc_init_obj) },
+ { MP_ROM_QSTR(MP_QSTR_enable_core), MP_ROM_PTR(&machine_ipc_enable_core_obj) },
+ { MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&machine_ipc_send_obj) },
+ { MP_ROM_QSTR(MP_QSTR_is_busy), MP_ROM_PTR(&machine_ipc_is_busy_obj) },
+ { MP_ROM_QSTR(MP_QSTR_register_client), MP_ROM_PTR(&machine_ipc_register_client_obj) },
+
+ // ToDo: API encapsulation for model fns - also similar to openamp Should be a wrapper on send()?
+ // { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&machine_ipc_start_obj) },
+ // { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&machine_ipc_stop_obj) },
+
+ // Core ID constants
+ { MP_ROM_QSTR(MP_QSTR_CM33), MP_ROM_INT(CM33) },
+ { MP_ROM_QSTR(MP_QSTR_CM55), MP_ROM_INT(CM55) },
+
+ // Command constants
+ { MP_ROM_QSTR(MP_QSTR_CMD_START), MP_ROM_INT(IPC_CMD_START) },
+ { MP_ROM_QSTR(MP_QSTR_CMD_STOP), MP_ROM_INT(IPC_CMD_STOP) },
+};
+static MP_DEFINE_CONST_DICT(machine_ipc_locals_dict, machine_ipc_locals_dict_table);
+
+MP_REGISTER_ROOT_POINTER(struct _machine_ipc_obj_t *machine_ipc_obj[IPC_MAX_CLIENTS_PER_EP]);
+MP_REGISTER_ROOT_POINTER(mp_obj_t machine_ipc_client_handlers[IPC_MAX_CLIENTS_PER_EP]);
+
+void machine_ipc_deinit_all(void) {
+ cm55_enabled = false;
+ for (uint8_t i = 0; i < IPC_MAX_CLIENTS_PER_EP; i++) {
+ sender_clients_arr[i].client_id = IPC_CLIENT_ID_UNREGISTERED;
+ sender_clients_arr[i].base.handler = mp_const_none;
+ MP_STATE_PORT(machine_ipc_client_handlers)[i] = mp_const_none;
+ }
+}
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_ipc_type,
+ MP_QSTR_IPC,
+ MP_TYPE_FLAG_NONE,
+ make_new, machine_ipc_make_new,
+ locals_dict, &machine_ipc_locals_dict
+ );
diff --git a/ports/psoc-edge/machine_ipc.h b/ports/psoc-edge/machine_ipc.h
new file mode 100644
index 00000000000..c7d6a7b40b6
--- /dev/null
+++ b/ports/psoc-edge/machine_ipc.h
@@ -0,0 +1,95 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_MACHINE_IPC_H
+#define MICROPY_INCLUDED_PSOC_EDGE_MACHINE_IPC_H
+
+#include "py/obj.h"
+#include "cy_ipc_pipe.h"
+#include "ipc_communication.h"
+#include "shared/runtime/mpirq.h"
+
+/* IPC Pipe Endpoint-1 config */
+#define CY_IPC_CYPIPE_CHAN_MASK_EP1 CY_IPC_CH_MASK(CY_IPC_CHAN_CYPIPE_EP1)
+#define CY_IPC_CYPIPE_INTR_MASK_EP1 CY_IPC_INTR_MASK(CY_IPC_INTR_CYPIPE_EP1)
+#define CY_IPC_INTR_CYPIPE_PRIOR_EP1 (1UL)
+#define CY_IPC_INTR_CYPIPE_MUX_EP1 (CY_IPC0_INTR_MUX(CY_IPC_INTR_CYPIPE_EP1))
+#define CM33_IPC_PIPE_EP_ADDR (1UL)
+#define CM33_IPC_PIPE_CLIENT_ID (3UL) // Pre-defined
+
+/* IPC Pipe Endpoint-2 config */
+#define CY_IPC_CYPIPE_CHAN_MASK_EP2 CY_IPC_CH_MASK(CY_IPC_CHAN_CYPIPE_EP2)
+#define CY_IPC_CYPIPE_INTR_MASK_EP2 CY_IPC_INTR_MASK(CY_IPC_INTR_CYPIPE_EP2)
+#define CY_IPC_INTR_CYPIPE_PRIOR_EP2 (1UL)
+#define CY_IPC_INTR_CYPIPE_MUX_EP2 (CY_IPC0_INTR_MUX(CY_IPC_INTR_CYPIPE_EP2))
+#define CM55_IPC_PIPE_EP_ADDR (2UL)
+#define CM55_IPC_PIPE_CLIENT_ID (5UL)
+
+
+// Fix IPC commands for now to start and stop as 0x82 and 0x83, can be extended in the future as needed
+// ToDo: How can this be generic and not hardcoded?
+#define IPC_CMD_START (0x82)
+#define IPC_CMD_STOP (0x83)
+
+/* Sentinel value meaning a slot in sender_clients_arr is free (not yet registered) */
+#define IPC_CLIENT_ID_UNREGISTERED (0xFFU)
+
+typedef struct _machine_ipc_client_obj_t {
+ mp_irq_obj_t base; // handler, parent (self), ishard
+ uint8_t client_id; // IPC_CLIENT_ID_UNREGISTERED means slot is free
+ uint8_t ep_id;
+ uint32_t ep_addr;
+ uint8_t last_cmd; // last received command (set in ISR before mp_irq_handler)
+ uint32_t last_value; // last received value
+} machine_ipc_client_obj_t;
+
+// Array of registered clients, max IPC_MAX_CLIENTS_PER_EP entries
+machine_ipc_client_obj_t sender_clients_arr[8];
+
+// A singleton IPC instance should be created for each core and clients can register to this instance to send messages to the other core. For receiving messages, clients will register their callbacks to the endpoint structure which will be used by the IPC ISR to schedule the appropriate callback in the MicroPython VM via the soft-IRQ scheduler (mp_irq_handler / mp_sched_schedule) when a message is received from the other core.
+typedef struct _machine_ipc_obj_t {
+ mp_obj_base_t base;
+ machine_ipc_client_obj_t *sender_endpoint;
+ // ipc_receiver_endpoint_t *receiver_endpoint; // Pointer to receiver information structure
+ uint8_t target_core;
+ uint8_t src_core;
+} machine_ipc_obj_t; // Endpoint same as core
+
+typedef struct
+{
+ uint8_t client_id;
+ uint16_t intr_mask;
+ uint8_t cmd;
+ uint32_t value;
+} ipc_msg_t;
+
+
+bool is_cm55_enabled;
+extern const mp_obj_type_t machine_ipc_client_type;
+extern const mp_obj_type_t machine_ipc_type;
+void machine_ipc_deinit_all(void);
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_MACHINE_IPC_H
diff --git a/ports/psoc-edge/machine_pdm_pcm.c b/ports/psoc-edge/machine_pdm_pcm.c
new file mode 100644
index 00000000000..d1afd7001e1
--- /dev/null
+++ b/ports/psoc-edge/machine_pdm_pcm.c
@@ -0,0 +1,613 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include
+#include
+#include "cy_pdl.h"
+#include "cybsp.h"
+
+#include "sys_int.h"
+
+#include "extmod/vfs.h"
+#include "py/stream.h"
+#include "py/runtime.h"
+
+
+#define pdm_pcm_assert_raise_val(msg, ret) if (ret != CY_PDM_PCM_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+/* -------------------------------- Rx FIFO Ping-Pong Buffer -------------------------------- */
+
+/**
+ * Number of FIFO frames that will be stored
+ * in each half of the ping-pong buffer.
+ */
+#define NUM_OF_RX_HW_FIFO_FRAMES_IN_RX_BUFFER 16
+#define NUM_OF_RX_HW_FIFO_FRAMES_IN_HALF_RX_BUFFER (NUM_OF_RX_HW_FIFO_FRAMES_IN_RX_BUFFER / 2)
+
+/**
+ * The PDM PCM peripheral has hardware FIFO capable
+ * of up to 64 samples.
+ * The IRQ trigger level is set to half of the FIFO size.
+ * That way we can process the samples when the FIFO is
+ * half full, ensuring that we read the samples before the
+ * FIFO is full and we lose data.
+ * Each half size FIFO read will compose a frame that will
+ * be added to the ping-pong buffer.
+ * As each sample is considered to be 8 bytes,
+ * a frame match the actual size of the hardware FIFO for
+ * a mono channel, or 2 halves FIFO for stereo.
+ */
+#define MAX_SAMPLES_RX_HW_FIFO 64
+#define NUM_OF_SAMPLES_IN_RX_HW_FIFO_FRAME 32
+#define NUM_OF_WORDS_IN_RX_HW_FIFO_FRAME (NUM_OF_SAMPLES_IN_RX_HW_FIFO_FRAME * 2)
+#define RX_HW_FIFO_IRQ_TRIGGER_LEVEL (NUM_OF_SAMPLES_IN_RX_HW_FIFO_FRAME)
+
+/**
+ * A ping-pong buffer implementation will store the samples read
+ * from the PDM PCM hardware FIFO.
+ *
+ * Each sample will contain up to 8 bytes of data, being able
+ * to store up to 32-bit stereo samples.
+ * As the buffer is a uint32_t array, each sample will take
+ * 2 positions in the buffer.
+ * In case of mono audio, the odd positions will be empty.
+ *
+ * The buffer is split into two halves.
+ * The active half will be the one used in the IRQ handler to
+ * store the incoming samples from the FIFO.
+ * The processing half will be used to copy the samples
+ * into the ring buffer.
+ *
+ * The ring buffer will be used to transfer the data stream
+ * into the application provided buffer.
+ */
+#define SIZEOF_RX_BUFFER_IN_SAMPLES (NUM_OF_RX_HW_FIFO_FRAMES_IN_RX_BUFFER * NUM_OF_SAMPLES_IN_RX_HW_FIFO_FRAME)
+#define SIZEOF_RX_BUFFER_IN_WORDS (SIZEOF_RX_BUFFER_IN_SAMPLES * 2)
+#define SIZEOF_HALF_RX_BUFFER_IN_SAMPLES (SIZEOF_RX_BUFFER_IN_SAMPLES / 2)
+#define SIZEOF_HALF_RX_BUFFER_IN_WORDS (SIZEOF_HALF_RX_BUFFER_IN_SAMPLES * 2)
+
+#define SIZEOF_PDM_PCM_SAMPLE_IN_BYTES 8
+
+typedef struct _pcm_pdm_rx_fifo_ping_pong_buffer_t {
+ uint32_t rx_fifo_buffer[SIZEOF_RX_BUFFER_IN_WORDS];
+ uint32_t *active_half_rx_fifo_buf_ptr;
+ uint32_t *processing_half_rx_fifo_buf_ptr;
+ volatile uint8_t rx_hw_fifo_frame_count;
+} pcm_pdm_rx_fifo_ping_pong_buffer_t;
+
+static void pdm_pcm_rx_buffer_init(pcm_pdm_rx_fifo_ping_pong_buffer_t *self) {
+ memset(self->rx_fifo_buffer, 0, sizeof(self->rx_fifo_buffer));
+ self->active_half_rx_fifo_buf_ptr = self->rx_fifo_buffer;
+ self->processing_half_rx_fifo_buf_ptr = &self->rx_fifo_buffer[SIZEOF_HALF_RX_BUFFER_IN_WORDS];
+ self->rx_hw_fifo_frame_count = 0;
+}
+
+static inline bool pdm_pcm_rx_buffer_is_half_full(pcm_pdm_rx_fifo_ping_pong_buffer_t *self) {
+ return self->rx_hw_fifo_frame_count == 0;
+}
+
+static void _pdm_pcm_rx_buffer_update_hw_fifo_frame_counter(pcm_pdm_rx_fifo_ping_pong_buffer_t *self) {
+ self->rx_hw_fifo_frame_count++;
+ if (self->rx_hw_fifo_frame_count == NUM_OF_RX_HW_FIFO_FRAMES_IN_HALF_RX_BUFFER) {
+ self->rx_hw_fifo_frame_count = 0;
+ }
+}
+
+static void _pdm_pcm_rx_buffer_swap_halves(pcm_pdm_rx_fifo_ping_pong_buffer_t *self) {
+ if (pdm_pcm_rx_buffer_is_half_full(self)) {
+ uint32_t *temp = self->active_half_rx_fifo_buf_ptr;
+ self->active_half_rx_fifo_buf_ptr = self->processing_half_rx_fifo_buf_ptr;
+ self->processing_half_rx_fifo_buf_ptr = temp;
+ }
+}
+
+static inline uint32_t *pdm_pcm_rx_buffer_get_next_frame_to_fill(pcm_pdm_rx_fifo_ping_pong_buffer_t *self) {
+ uint32_t *next_writable_frame_segment = &self->active_half_rx_fifo_buf_ptr[NUM_OF_WORDS_IN_RX_HW_FIFO_FRAME * self->rx_hw_fifo_frame_count];
+ _pdm_pcm_rx_buffer_update_hw_fifo_frame_counter(self);
+ _pdm_pcm_rx_buffer_swap_halves(self);
+ return next_writable_frame_segment;
+}
+
+/* -------------------------------- PDM Block -------------------------------- */
+
+typedef struct _pdm_pcm_block_obj_t {
+ uint8_t id;
+ PDM_Type *periph;
+ bool inited;
+} pdm_pcm_block_obj_t;
+
+/**
+ * For the current PSE8x family there is only one PDM block.
+ */
+static pdm_pcm_block_obj_t pdm_pcm_block_obj[1] = { { 0, PDM0, false } };
+
+static void pdm_pcm_block_init(pdm_pcm_block_obj_t *block) {
+ cy_stc_pdm_pcm_config_v2_t pdm_pcm_block_conf = {
+ .clkDiv = 7,
+ .clksel = CY_PDM_PCM_SEL_SRSS_CLOCK,
+ .halverate = CY_PDM_PCM_RATE_FULL,
+ .route = 4,
+ .fir0_coeff_user_value = false,
+ .fir1_coeff_user_value = false,
+ };
+
+ cy_en_pdm_pcm_status_t ret = Cy_PDM_PCM_Init(block->periph, &pdm_pcm_block_conf);
+ pdm_pcm_assert_raise_val("PDM PCM initialization failed with code: %d \r\n", ret);
+ block->inited = true;
+}
+
+static inline bool pdm_pcm_block_is_inited(pdm_pcm_block_obj_t *block) {
+ return block->inited;
+}
+
+static inline void pdm_pcm_block_deinit(pdm_pcm_block_obj_t *block) {
+ Cy_PDM_PCM_DeInit(block->periph);
+ block->inited = false;
+}
+
+/* -------------------------------- PDM Channel -------------------------------- */
+
+#define MICROPY_PY_MACHINE_FOR_ALL_PDM_PCM(DO) \
+ DO(0) \
+ DO(1) \
+ DO(2) \
+ DO(3) \
+ DO(4) \
+ DO(5)
+
+#define MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES 6
+
+typedef struct _pdm_pcm_channel_obj_t {
+ pdm_pcm_block_obj_t *block;
+ uint8_t id;
+ sys_int_cfg_t irq;
+ mp_obj_t parent;
+} pdm_pcm_channel_obj_t;
+
+/* Forward declaration */
+static void pdm_pcm_channel_irq_handler(uint8_t pdm_pcm_channel);
+
+#define DEFINE_PDM_PCM_CHANNEL_IRQ_HANDLER(pdm_pcm_channel) \
+ void PDM_PCM##pdm_pcm_channel##_Channel_IRQ_Handler(void) { \
+ pdm_pcm_channel_irq_handler(pdm_pcm_channel); \
+ }
+
+MICROPY_PY_MACHINE_FOR_ALL_PDM_PCM(DEFINE_PDM_PCM_CHANNEL_IRQ_HANDLER)
+
+#define MAP_PDM_PCM_IRQ_CONFIG(pdm_pcm_channel) \
+ [pdm_pcm_channel] = { \
+ &pdm_pcm_block_obj[0], \
+ pdm_pcm_channel, \
+ { \
+ pdm_0_interrupts_##pdm_pcm_channel##_IRQn, \
+ SYS_INT_IRQ_LOWEST_PRIORITY, \
+ PDM_PCM##pdm_pcm_channel##_Channel_IRQ_Handler \
+ }, \
+ NULL, \
+ },
+
+static pdm_pcm_channel_obj_t pdm_pcm_channel_obj[MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES] = {
+ MICROPY_PY_MACHINE_FOR_ALL_PDM_PCM(MAP_PDM_PCM_IRQ_CONFIG)
+};
+
+static pdm_pcm_channel_obj_t *pdm_pcm_channel_alloc(uint8_t channel_id, mp_obj_t parent) {
+ if (pdm_pcm_channel_obj[channel_id].parent != NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("PDM0 channel %u is already in use by another instance."), channel_id);
+ }
+ pdm_pcm_channel_obj[channel_id].parent = parent;
+ return &pdm_pcm_channel_obj[channel_id];
+}
+
+static void pdm_pcm_channel_free(pdm_pcm_channel_obj_t *chan_obj) {
+ if (chan_obj->id >= MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid channel id"));
+ }
+ chan_obj->parent = NULL;
+}
+
+static void pdm_pcm_channel_init(pdm_pcm_channel_obj_t *chan_obj, sample_rate_t sample_rate, pdm_pcm_word_length_t word_length, bool second_channel) {
+ if (!pdm_pcm_block_is_inited(chan_obj->block)) {
+ pdm_pcm_block_init(chan_obj->block);
+ }
+
+ Cy_PDM_PCM_Channel_Enable(chan_obj->block->periph, chan_obj->id);
+
+ /**
+ * Configuration notes:
+ * - For stereo channels, the second channel should
+ * set a sample delay. See more in the
+ * PSOC™ Edge E8x2, E8x3, E8x5, E8x6 architecture reference manual Rev. *A
+ * Section 29.3.3, page 773.
+ * - TODO: Filter configuration base on sample_rate and PDM0 clock config.
+ */
+ cy_stc_pdm_pcm_channel_config_t channel_config = {
+ .sampledelay = (second_channel) ? 5: 1,
+ .wordSize = (word_length == BITS_16) ? CY_PDM_PCM_WSIZE_16_BIT : CY_PDM_PCM_WSIZE_32_BIT,
+ .signExtension = true,
+ .rxFifoTriggerLevel = RX_HW_FIFO_IRQ_TRIGGER_LEVEL - 1,
+ .fir0_enable = false,
+ .cic_decim_code = CY_PDM_PCM_CHAN_CIC_DECIM_32,
+ .fir0_decim_code = CY_PDM_PCM_CHAN_FIR0_DECIM_1,
+ .fir0_scale = 0,
+ .fir1_decim_code = CY_PDM_PCM_CHAN_FIR1_DECIM_3,
+ .fir1_scale = 10,
+ .dc_block_disable = false,
+ .dc_block_code = CY_PDM_PCM_CHAN_DCBLOCK_CODE_16,
+ };
+
+ cy_en_pdm_pcm_status_t ret = Cy_PDM_PCM_Channel_Init(chan_obj->block->periph, &channel_config, chan_obj->id);
+ pdm_pcm_assert_raise_val("PDM PCM channel initialization failed with code: %d \r\n", ret);
+}
+
+static void pdm_pcm_channel_deinit(pdm_pcm_channel_obj_t *chan_obj) {
+ Cy_PDM_PCM_Channel_DeInit(chan_obj->block->periph, chan_obj->id);
+ Cy_PDM_PCM_Channel_Disable(chan_obj->block->periph, chan_obj->id);
+}
+
+static void pdm_pcm_channel_irq_init(pdm_pcm_channel_obj_t *chan_obj) {
+ Cy_PDM_PCM_Channel_ClearInterrupt(chan_obj->block->periph, chan_obj->id, CY_PDM_PCM_INTR_MASK);
+ Cy_PDM_PCM_Channel_SetInterruptMask(chan_obj->block->periph, chan_obj->id, CY_PDM_PCM_INTR_MASK);
+
+ sys_int_init(&(chan_obj->irq));
+}
+
+static void pdm_pcm_channel_irq_deinit(pdm_pcm_channel_obj_t *chan_obj) {
+ sys_int_deinit(&(chan_obj->irq));
+ Cy_PDM_PCM_Channel_ClearInterrupt(chan_obj->block->periph, chan_obj->id, CY_PDM_PCM_INTR_MASK);
+}
+
+/* -------------------------------- PDM PCM Object -------------------------------- */
+
+typedef struct _machine_pdm_pcm_obj_t {
+ mp_obj_base_t base;
+ uint8_t id; // Private variable in this port. ID not associated to any port pin pdm-pcm group.
+ mp_hal_pin_obj_t sck;
+ mp_hal_pin_obj_t data;
+ io_mode_t io_mode;
+ format_t format;
+ uint8_t bits;
+ uint32_t sample_rate;
+ float gain_db;
+ pdm_pcm_channel_obj_t *channels[2];
+ pdm_pcm_channel_obj_t *irq_channel;
+ pcm_pdm_rx_fifo_ping_pong_buffer_t rx_buffer;
+ ringbuf_t ring_buffer;
+ mp_obj_t callback_for_non_blocking;
+ non_blocking_descriptor_t non_blocking_descriptor;
+} machine_pdm_pcm_obj_t;
+
+static void pdm_pcm_read_half_rx_fifo_into_rx_buffer(machine_pdm_pcm_obj_t *self, uint32_t *rx_buf_next_frame_start_ptr) {
+ for (uint32_t index = 0; index < RX_HW_FIFO_IRQ_TRIGGER_LEVEL; index++)
+ {
+ uint32_t data = (uint32_t)Cy_PDM_PCM_Channel_ReadFifo(self->channels[0]->block->periph, self->channels[0]->id);
+ /**
+ * The mono/stereo first channel uses the even indexes.
+ */
+ rx_buf_next_frame_start_ptr[index * 2] = data;
+ if (self->format == STEREO) {
+ data = Cy_PDM_PCM_Channel_ReadFifo(self->channels[1]->block->periph, self->channels[1]->id);
+ /**
+ * The stereo second channel uses the odd indexes.
+ */
+ rx_buf_next_frame_start_ptr[index * 2 + 1] = data;
+ }
+ }
+}
+
+static void pdm_pcm_read_into_rx_buffer(machine_pdm_pcm_obj_t *self) {
+ uint32_t *rx_buf_next_frame_start_ptr = pdm_pcm_rx_buffer_get_next_frame_to_fill(&self->rx_buffer);
+ pdm_pcm_read_half_rx_fifo_into_rx_buffer(self, rx_buf_next_frame_start_ptr);
+}
+
+/* -------------------------------- Ring Buffer Transfer IRQ -------------------------------- */
+
+#define PDM_PCM_RX_FRAME_SIZE_IN_BYTES (8)
+#define PDM_PCM_SIZEOF_NON_BLOCKING_COPY_IN_BYTES (SIZEOF_HALF_RX_BUFFER_IN_SAMPLES * PDM_PCM_RX_FRAME_SIZE_IN_BYTES)
+
+static const int8_t pdm_pcm_frame_map[4][PDM_PCM_RX_FRAME_SIZE_IN_BYTES] = {
+ { 0, 1, -1, -1, -1, -1, -1, -1 }, // Mono, 16-bits
+ { 0, 1, 2, 3, -1, -1, -1, -1 }, // Mono, 32-bits
+ { 0, 1, -1, -1, 2, 3, -1, -1 }, // Stereo, 16-bits
+ { 0, 1, 2, 3, 4, 5, 6, 7 }, // Stereo, 32-bits
+};
+
+int8_t get_frame_mapping_index(int8_t bits, format_t format) {
+ if (format == MONO) {
+ if (bits == 16) {
+ return 0;
+ } else if (bits == 32) {
+ return 1;
+ }
+ } else { // STEREO
+ if (bits == 16) {
+ return 2;
+ } else if (bits == 32) {
+ return 3;
+ }
+ }
+ return -1;
+}
+
+static void pdm_pcm_copy_rx_buffer_to_ringbuf(machine_pdm_pcm_obj_t *self) {
+ uint8_t *rx_buf_sample_ptr = (uint8_t *)self->rx_buffer.processing_half_rx_fifo_buf_ptr;
+ uint32_t num_bytes_needed_from_ringbuf = SIZEOF_HALF_RX_BUFFER_IN_SAMPLES * SIZEOF_PDM_PCM_SAMPLE_IN_BYTES;
+
+ // when space exists, copy samples into ring buffer
+ if (ringbuf_free(&self->ring_buffer) >= num_bytes_needed_from_ringbuf) {
+ uint8_t f_index = get_frame_mapping_index(self->bits, self->format);
+ uint32_t i = 0;
+ while (i < num_bytes_needed_from_ringbuf) {
+ for (uint8_t j = 0; j < SIZEOF_PDM_PCM_SAMPLE_IN_BYTES; j++) {
+ int8_t r_to_a_mapping = pdm_pcm_frame_map[f_index][j];
+ if (r_to_a_mapping != -1) {
+ ringbuf_put(&self->ring_buffer, rx_buf_sample_ptr[i]);
+ } else { // r_a_mapping == -1
+ ringbuf_put(&self->ring_buffer, -1);
+ }
+ i++;
+ }
+ }
+ }
+}
+
+static void pdm_pcm_channel_irq_handler(uint8_t pdm_pcm_channel) {
+ machine_pdm_pcm_obj_t *pdm_pcm_obj = (machine_pdm_pcm_obj_t *)pdm_pcm_channel_obj[pdm_pcm_channel].parent;
+ volatile uint32_t intr_status = Cy_PDM_PCM_Channel_GetInterruptStatusMasked(pdm_pcm_obj->irq_channel->block->periph, pdm_pcm_obj->irq_channel->id);
+ if (CY_PDM_PCM_INTR_RX_TRIGGER & intr_status) {
+ pdm_pcm_read_into_rx_buffer(pdm_pcm_obj);
+ Cy_PDM_PCM_Channel_ClearInterrupt(pdm_pcm_obj->irq_channel->block->periph, pdm_pcm_obj->irq_channel->id, CY_PDM_PCM_INTR_RX_TRIGGER);
+ if (pdm_pcm_rx_buffer_is_half_full(&pdm_pcm_obj->rx_buffer)) {
+ pdm_pcm_copy_rx_buffer_to_ringbuf(pdm_pcm_obj);
+ if ((pdm_pcm_obj->io_mode == NON_BLOCKING) && (pdm_pcm_obj->non_blocking_descriptor.copy_in_progress)) {
+ fill_appbuf_from_ringbuf_non_blocking(pdm_pcm_obj);
+ }
+ }
+ if ((CY_PDM_PCM_INTR_RX_FIR_OVERFLOW | CY_PDM_PCM_INTR_RX_OVERFLOW | CY_PDM_PCM_INTR_RX_IF_OVERFLOW |
+ CY_PDM_PCM_INTR_RX_UNDERFLOW) & intr_status) {
+ Cy_PDM_PCM_Channel_ClearInterrupt(pdm_pcm_obj->irq_channel->block->periph, pdm_pcm_obj->irq_channel->id, CY_PDM_PCM_INTR_MASK);
+ }
+ }
+}
+
+/* -------------------------------- Private Functions -------------------------------- */
+
+static void pdm_pcm_init(machine_pdm_pcm_obj_t *self) {
+ self->irq_channel = self->channels[0];
+ pdm_pcm_channel_init(self->channels[0], self->sample_rate, self->bits, false);
+ if (self->format == STEREO) {
+ self->irq_channel = self->channels[1];
+ pdm_pcm_channel_init(self->channels[1], self->sample_rate, self->bits, true);
+ }
+ pdm_pcm_channel_irq_init(self->irq_channel);
+}
+
+static inline void pdm_pcm_alloc_channels(machine_pdm_pcm_obj_t *self, format_t format, const mp_hal_pin_af_config_t *af_config) {
+ /**
+ * The allowed pairs are form or consecutive odd + even channel starting
+ * from 0.
+ * Therefore, to find the secondary channel id, XORing the primary
+ * channel id with 0x01 will give the id of the other channel in the pair.
+ */
+ self->channels[0] = pdm_pcm_channel_alloc(af_config->af->unit, self);
+ if (format == STEREO) {
+ self->channels[1] = pdm_pcm_channel_alloc(af_config->af->unit ^ 0x01, self);
+ }
+}
+
+static void pdm_pcm_start(machine_pdm_pcm_obj_t *self) {
+ Cy_PDM_PCM_Activate_Channel(self->channels[0]->block->periph, self->channels[0]->id);
+ if (self->format == STEREO) {
+ Cy_PDM_PCM_Activate_Channel(self->channels[1]->block->periph, self->channels[1]->id);
+ }
+};
+
+static void pdm_pcm_stop(machine_pdm_pcm_obj_t *self) {
+ Cy_PDM_PCM_DeActivate_Channel(self->channels[0]->block->periph, self->channels[0]->id);
+ if (self->format == STEREO) {
+ Cy_PDM_PCM_DeActivate_Channel(self->channels[1]->block->periph, self->channels[1]->id);
+ }
+}
+
+#define PDM_PCM_DEFAULT_GAIN_DB (23.0)
+#define PDM_PCM_MIN_GAIN_DB (-103.0)
+#define PDM_PCM_MAX_GAIN_DB (83.0)
+
+static float pdm_pcm_get_valid_gain_db(float gain_db) {
+ if (gain_db < PDM_PCM_MIN_GAIN_DB) {
+ return PDM_PCM_MIN_GAIN_DB;
+ } else if (gain_db > PDM_PCM_MAX_GAIN_DB) {
+ return PDM_PCM_MAX_GAIN_DB;
+ } else {
+ return gain_db;
+ }
+}
+
+static cy_en_pdm_pcm_gain_sel_t pdm_pcm_gain_db_to_scale(float gain_db) {
+ /**
+ * The gain scale goes from PDM_PCM_MIN_GAIN_DB to PDM_PCM_MAX_GAIN_DB in
+ * steps of 6 dB. The db gains map to an enum in the range from 0 to
+ * (PDM_PCM_MAX_GAIN_DB - PDM_PCM_MIN_GAIN_DB) / 6 dB.
+ */
+ return (cy_en_pdm_pcm_gain_sel_t)roundf((PDM_PCM_MAX_GAIN_DB - gain_db) / 6.0);
+}
+
+static void pdm_pcm_set_gain(machine_pdm_pcm_obj_t *self) {
+ cy_en_pdm_pcm_gain_sel_t gain_scale = pdm_pcm_gain_db_to_scale(self->gain_db);
+ Cy_PDM_PCM_SetGain(self->channels[0]->block->periph, self->channels[0]->id, gain_scale);
+ if (self->format == STEREO) {
+ Cy_PDM_PCM_SetGain(self->channels[1]->block->periph, self->channels[1]->id, gain_scale);
+ }
+}
+
+/* -------------------------------- Extmod API -------------------------------- */
+
+
+static void mp_machine_pdm_pcm_init_helper(machine_pdm_pcm_obj_t *self, mp_arg_val_t *args) {
+ /**
+ * Get the pin objects passed by the constructor.
+ * Validate that they are valid PDM block and channel,
+ * and configure them with the adequate drive mode and
+ * alternate function.
+ * {
+ */
+ self->sck = mp_hal_get_pin_obj(args[ARG_sck].u_obj);
+ self->data = mp_hal_get_pin_obj(args[ARG_data].u_obj);
+
+ const mp_hal_pin_af_config_t pdm_pins_config[] = {
+ MP_HAL_PIN_AF_CONF_INIT(self->sck, CY_GPIO_DM_STRONG_IN_OFF, 1, MACHINE_PIN_AF_SIGNAL_PDM_CLK),
+ MP_HAL_PIN_AF_CONF_INIT(self->data, CY_GPIO_DM_HIGHZ, 1, MACHINE_PIN_AF_SIGNAL_PDM_DATA),
+ };
+
+ machine_pin_af_unit_t af_unit = MACHINE_PIN_AF_UNIT_NONE;
+ mp_hal_periph_pins_af_resolve_fn_unit(pdm_pins_config, 2, MACHINE_PIN_AF_FN_PDM, &af_unit);
+
+ mp_hal_periph_pins_af_init(pdm_pins_config, 2);
+ /** } */
+
+ /**
+ * Depending on the format, one or two channels
+ * are then allocated from the available channels.
+ * {
+ */
+ format_t pdm_pcm_format = args[ARG_format].u_int;
+ if ((pdm_pcm_format != MONO) &&
+ (pdm_pcm_format != STEREO)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid format"));
+ }
+ self->format = pdm_pcm_format;
+
+ pdm_pcm_alloc_channels(self, self->format, &pdm_pins_config[0]);
+ /** } */
+
+ uint8_t pdm_pcm_word_length = args[ARG_bits].u_int;
+ if (pdm_pcm_word_length != BITS_16 &&
+ pdm_pcm_word_length != BITS_32) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid word length"));
+ }
+ self->bits = args[ARG_bits].u_int;
+
+ self->gain_db = PDM_PCM_DEFAULT_GAIN_DB;
+ if (args[ARG_gain].u_obj != mp_const_none) {
+ self->gain_db = mp_obj_get_float(args[ARG_gain].u_obj);
+ }
+
+ self->sample_rate = args[ARG_sample_rate].u_int;
+ if (self->sample_rate == 16000) {
+ /**
+ * TODO: Enable different sample rates
+ */
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("rate not supported"));
+ }
+
+ int32_t ring_buffer_len = args[ARG_ibuf].u_int;
+ if (ring_buffer_len < 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid ibuf"));
+ }
+
+ self->io_mode = BLOCKING;
+ self->callback_for_non_blocking = MP_OBJ_NULL;
+
+ ringbuf_alloc(&self->ring_buffer, ring_buffer_len);
+ pdm_pcm_rx_buffer_init(&self->rx_buffer);
+ pdm_pcm_init(self);
+ pdm_pcm_set_gain(self);
+ pdm_pcm_start(self);
+}
+
+static machine_pdm_pcm_obj_t *mp_machine_pdm_pcm_make_new_instance(mp_int_t pdm_pcm_id) {
+ (void)pdm_pcm_id;
+ machine_pdm_pcm_obj_t *self = NULL;
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES; i++) {
+ if (MP_STATE_PORT(machine_pdm_pcm_obj[i]) == NULL) {
+ self = mp_obj_malloc(machine_pdm_pcm_obj_t, &machine_pdm_pcm_type);
+ MP_STATE_PORT(machine_pdm_pcm_obj[i]) = self;
+ self->id = i;
+ break;
+ }
+ }
+
+ if (self == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("all available PDM_PCM instances are allocated"));
+ }
+
+ return self;
+}
+
+static void mp_machine_pdm_pcm_irq_update(machine_pdm_pcm_obj_t *self) {
+ /** TODO: Implementation of non-blocking */
+}
+
+static mp_obj_t machine_pdm_pcm_gain(size_t n_args, const mp_obj_t *args) {
+ machine_pdm_pcm_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ if (n_args == 1) {
+ return mp_obj_new_float(self->gain_db);
+ } else {
+ self->gain_db = pdm_pcm_get_valid_gain_db(mp_obj_get_float(args[1]));
+ pdm_pcm_set_gain(self);
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pdm_pcm_gain_obj, 1, 2, machine_pdm_pcm_gain);
+
+
+#define MICROPY_PY_MACHINE_PDM_PDM_CLASS_EXTRAS \
+ { MP_ROM_QSTR(MP_QSTR_gain), MP_ROM_PTR(&machine_pdm_pcm_gain_obj) }, \
+
+
+static void mp_machine_pdm_pcm_deinit(machine_pdm_pcm_obj_t *self) {
+ pdm_pcm_stop(self);
+ pdm_pcm_channel_irq_deinit(self->irq_channel);
+ pdm_pcm_channel_deinit(self->channels[0]);
+ pdm_pcm_channel_free(self->channels[0]);
+ if (self->format == STEREO) {
+ pdm_pcm_channel_deinit(self->channels[1]);
+ pdm_pcm_channel_free(self->channels[1]);
+ }
+ MP_STATE_PORT(machine_pdm_pcm_obj[self->id]) = NULL;
+
+ /* Deinit the block if no other instances are using it */
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES; i++) {
+ if (MP_STATE_PORT(machine_pdm_pcm_obj[i]) != NULL) {
+ return;
+ }
+ }
+ pdm_pcm_block_deinit(self->channels[0]->block);
+}
+
+void machine_pdm_pcm_deinit_all(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES; i++) {
+ machine_pdm_pcm_obj_t *pdm_pcm_obj = MP_STATE_PORT(machine_pdm_pcm_obj[i]);
+ if (pdm_pcm_obj != NULL) {
+ mp_machine_pdm_pcm_deinit(pdm_pcm_obj);
+ }
+ }
+}
+
+MP_REGISTER_ROOT_POINTER(struct _machine_pdm_pcm_obj_t *machine_pdm_pcm_obj[MICROPY_PY_MACHINE_PDM_PCM_NUM_ENTRIES]);
diff --git a/ports/psoc-edge/machine_pdm_pcm.h b/ports/psoc-edge/machine_pdm_pcm.h
new file mode 100644
index 00000000000..70d49766002
--- /dev/null
+++ b/ports/psoc-edge/machine_pdm_pcm.h
@@ -0,0 +1,149 @@
+#if MICROPY_PY_MACHINE_PDM_PCM
+
+#include "cy_pdm_pcm_v2.h"
+#include "cycfg_peripherals.h"
+#include "py/ringbuf.h"
+
+#define MICROPY_HW_MAX_PDM_PCM 6 // TODO: Shall we get this value from the make-pins and set it in mpconfigboard.h?
+#define DEFAULT_LEFT_GAIN 0
+#define DEFAULT_RIGHT_GAIN 0
+
+#define LEFT_CH_INDEX (2u)
+#define RIGHT_CH_INDEX (3u)
+#define LEFT_CH_CONFIG channel_2_config
+#define RIGHT_CH_CONFIG channel_3_config
+
+#define AUDIO_SYS_CLOCK_73_728_000_HZ 73728000UL /* (Ideally 73.728 MHz) For sample rates: 8 KHz / 16 KHz / 48 KHz */
+#define AUDIO_SYS_CLOCK_169_344_000_HZ 169344000UL /* (Ideally 169.344 MHz) For sample rates: 22.05 KHz / 44.1 KHz */
+
+#define DPLL_INPUT_FREQ_HZ 17203200UL /* 8 MHz input frequency */
+#define DPLL_OUTPUT1_FREQ_HZ AUDIO_SYS_CLOCK_73_728_000_HZ
+#define DPLL_OUTPUT2_FREQ_HZ AUDIO_SYS_CLOCK_169_344_000_HZ
+#define DPLL_ENABLE_TIMEOUT_MS 100u
+#define PDM_PCM_CLK_OVERSAMPLING_FACTOR 8u /* PDM oversampling factor */
+
+#define SIZEOF_DMA_BUFFER (128)
+#define SIZEOF_HALF_DMA_BUFFER (SIZEOF_DMA_BUFFER / 2)
+#define SIZEOF_DMA_BUFFER_IN_BYTES (SIZEOF_DMA_BUFFER * sizeof(uint32_t))
+#define SIZEOF_HALF_DMA_BUFFER_IN_BYTES (SIZEOF_DMA_BUFFER_IN_BYTES / 2)
+#define PDM_PCM_RX_FRAME_SIZE_IN_BYTES (8)
+
+#define NON_BLOCKING_RATE_MULTIPLIER (4)
+#define SIZEOF_NON_BLOCKING_COPY_IN_BYTES (SIZEOF_HALF_DMA_BUFFER * NON_BLOCKING_RATE_MULTIPLIER)
+
+
+#define pdm_pcm_assert_raise_val(msg, ret) if (ret != CY_RSLT_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+
+// Constructor args
+enum {
+ ARG_sck,
+ ARG_data,
+ ARG_sample_rate,
+ ARG_decimation_rate,
+ ARG_bits,
+ ARG_format,
+ ARG_left_gain,
+ ARG_right_gain,
+};
+
+typedef enum {
+ BITS_16 = 16,
+ BITS_18 = 18,
+ BITS_20 = 20,
+ BITS_24 = 24
+} pdm_pcm_word_length_t;
+
+typedef enum
+{
+ SAMPLE_RATE_8000 = 8000,
+ SAMPLE_RATE_16000 = 16000,
+ SAMPLE_RATE_22050 = 22050,
+ SAMPLE_RATE_44100 = 44100,
+ SAMPLE_RATE_48000 = 48000,
+} sample_rate_t;
+
+typedef enum {
+ PDM_PCM_STATUS_SUCCESS = 0,
+ PDM_PCM_STATUS_BAD_PARAM,
+ PDM_PCM_STATUS_ERROR
+} PDM_PCM_STATUS_t;
+
+typedef enum {
+ MONO_LEFT,
+ MONO_RIGHT,
+ STEREO
+} format_t;
+
+typedef enum {
+ BLOCKING,
+ NON_BLOCKING,
+} io_mode_t;
+
+#if MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+
+typedef struct _non_blocking_descriptor_t {
+ mp_buffer_info_t appbuf;
+ uint32_t index;
+ bool copy_in_progress;
+} non_blocking_descriptor_t;
+
+#endif // MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+
+#define FRAME_SIZE (1024)
+#define RX_FIFO_TRIG_LEVEL (31)
+#define NUMBER_INTERRUPTS_FOR_FRAME ((FRAME_SIZE) / RX_FIFO_TRIG_LEVEL)
+#define PDM_PCM_ISR_PRIORITY (2u)
+
+typedef struct _machine_pdm_pcm_obj_t {
+ mp_obj_base_t base;
+ uint8_t pdm_pcm_id; // Private variable in this port. ID not associated to any port pin pdm-pcm group.
+ mp_hal_pin_obj_t sck;
+ mp_hal_pin_obj_t data;
+ io_mode_t io_mode;
+ format_t format;
+ uint8_t bits;
+ uint32_t sample_rate;
+ uint8_t decimation_rate;
+ int16_t left_gain;
+ int16_t right_gain;
+ int32_t ibuf; // Private variable
+ mp_obj_t callback_for_non_blocking;
+ uint32_t dma_active_buffer[SIZEOF_DMA_BUFFER];
+ uint32_t dma_processing_buffer[SIZEOF_DMA_BUFFER];
+ uint32_t *dma_active_buf_p;
+ uint32_t *dma_processing_buf_p;
+ ringbuf_t ring_buffer;
+ non_blocking_descriptor_t non_blocking_descriptor; // For non-blocking mode
+ // Ping-pong buffers for IRQ handler
+ int16_t audio_buffer0[FRAME_SIZE];
+ int16_t audio_buffer1[FRAME_SIZE];
+ int16_t *active_rx_buffer;
+ int16_t *full_rx_buffer;
+ bool have_data;
+ bool pdm_pcm_initialized;
+ uint8_t init_discard_counter;
+ IRQn_Type irq_num;
+} machine_pdm_pcm_obj_t;
+
+static void mp_machine_pdm_pcm_init_helper(machine_pdm_pcm_obj_t *self, mp_arg_val_t *args);
+static machine_pdm_pcm_obj_t *mp_machine_pdm_pcm_make_new_instance(mp_int_t pdm_pcm_id);
+static void mp_machine_pdm_pcm_init(machine_pdm_pcm_obj_t *self);
+static void mp_machine_pdm_pcm_deinit(machine_pdm_pcm_obj_t *self);
+static void mp_machine_pdm_pcm_set_gain(machine_pdm_pcm_obj_t *self, int16_t left_gain, int16_t right_gain);
+static void mp_machine_pdm_pcm_irq_update(machine_pdm_pcm_obj_t *self);
+
+int8_t get_frame_mapping_index(int8_t bits, format_t format);
+
+// Only 16 bit mono and stereo modes tested
+static const int8_t pdm_pcm_frame_map[4][PDM_PCM_RX_FRAME_SIZE_IN_BYTES] = {
+ { 0, 1, -1, -1, -1, -1, -1, -1 }, // Mono, 16-bits
+ { 0, 1, 2, -1, -1, -1, -1, -1 }, // Mono, >16-bits
+ { 0, 1, -1, -1, 2, 3, -1, -1 }, // Stereo, 16-bits
+ { 0, 1, 2, -1, 3, 4, 5, -1 }, // Stereo, >16-bits
+};
+
+
+#endif // MICROPY_PY_MACHINE_PDM_PCM
diff --git a/ports/psoc-edge/machine_pdm_pcm_extmod.c b/ports/psoc-edge/machine_pdm_pcm_extmod.c
new file mode 100644
index 00000000000..feb544ccf54
--- /dev/null
+++ b/ports/psoc-edge/machine_pdm_pcm_extmod.c
@@ -0,0 +1,341 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "modmachine.h"
+#include "py/runtime.h"
+
+#if MICROPY_PY_MACHINE_PDM_PCM
+
+// --------------------------------------------------------------------------------
+// ----------------- extmod/machine_pdm_pcm.c ------------------------------------
+// This file could be promoted in future to extmod/machine_pdm_pcm.c
+// as it replicates the extmod/machine_i2s.c structure for separation of
+// concerns between port specific code and higher level MPY functions.
+// Eventually both could be refactored to share common code for
+// serial audio interfaces.
+
+#include "py/ringbuf.h"
+#include "mphalport.h"
+
+typedef enum
+{
+ SAMPLE_RATE_8000 = 8000,
+ SAMPLE_RATE_16000 = 16000,
+ SAMPLE_RATE_22050 = 22050,
+ SAMPLE_RATE_44100 = 44100,
+ SAMPLE_RATE_48000 = 48000,
+} sample_rate_t;
+
+typedef enum {
+ BITS_16 = 16,
+ BITS_32 = 32
+} pdm_pcm_word_length_t;
+
+typedef enum {
+ MONO = 1,
+ STEREO = 2
+} format_t;
+
+typedef enum {
+ BLOCKING,
+ NON_BLOCKING,
+} io_mode_t;
+
+// Arguments for PDM_PCM() constructor and PDM_PCM.init().
+enum {
+ ARG_sck,
+ ARG_data,
+ ARG_sample_rate,
+ ARG_bits,
+ ARG_format,
+ ARG_gain,
+ ARG_ibuf
+};
+
+#if MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+
+typedef struct _non_blocking_descriptor_t {
+ mp_buffer_info_t appbuf;
+ uint32_t index;
+ bool copy_in_progress;
+} non_blocking_descriptor_t;
+
+static void fill_appbuf_from_ringbuf_non_blocking(machine_pdm_pcm_obj_t *self);
+
+#endif // MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+
+// The port must provide implementations of these low-level PDM PCM functions.
+static void mp_machine_pdm_pcm_init_helper(machine_pdm_pcm_obj_t *self, mp_arg_val_t *args);
+static machine_pdm_pcm_obj_t *mp_machine_pdm_pcm_make_new_instance(mp_int_t pdm_pcm_id);
+static void mp_machine_pdm_pcm_deinit(machine_pdm_pcm_obj_t *self);
+static void mp_machine_pdm_pcm_irq_update(machine_pdm_pcm_obj_t *self);
+
+// The port provides implementations of the above in this file.
+#include MICROPY_PY_MACHINE_PDM_PCM_INCLUDEFILE
+
+#if MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+
+static uint32_t fill_appbuf_from_ringbuf(machine_pdm_pcm_obj_t *self, mp_buffer_info_t *appbuf) {
+ uint32_t num_bytes_copied_to_appbuf = 0;
+ uint8_t *app_p = (uint8_t *)appbuf->buf;
+ uint8_t appbuf_sample_size_in_bytes = (self->bits / 8) * (self->format == STEREO ? 2: 1);
+ uint32_t num_bytes_needed_from_ringbuf = appbuf->len * (PDM_PCM_RX_FRAME_SIZE_IN_BYTES / appbuf_sample_size_in_bytes);
+ int data;
+
+ uint8_t f_index = get_frame_mapping_index(self->bits, self->format);
+
+ while (num_bytes_needed_from_ringbuf) {
+ for (uint8_t i = 0; i < PDM_PCM_RX_FRAME_SIZE_IN_BYTES; i++) {
+ int8_t r_to_a_mapping = pdm_pcm_frame_map[f_index][i];
+ if (r_to_a_mapping != -1) {
+ if (self->io_mode == BLOCKING) {
+ /**
+ * Data Memory Barrier __DMB();
+ * Ensure ring buffer writes are visible to the main thread.
+ * Avoid non-volatile declaration read/write reordering when
+ * -0s optimization is enabled, which make the main thread
+ * miss the update and cause a deadlock.
+ */
+ while (__DMB(), (data = ringbuf_get(&self->ring_buffer)) == -1) {
+ ;
+ }
+ app_p[r_to_a_mapping] = (uint8_t)data;
+ num_bytes_copied_to_appbuf++;
+ }
+ } else {
+ // Discard unused byte from ring buffer
+ if (self->io_mode == BLOCKING) {
+ while (__DMB(), (data = ringbuf_get(&self->ring_buffer)) == -1) {
+ ;
+ }
+ }
+ }
+ num_bytes_needed_from_ringbuf--;
+ }
+ app_p += appbuf_sample_size_in_bytes;
+ }
+ return num_bytes_copied_to_appbuf;
+}
+
+static void fill_appbuf_from_ringbuf_non_blocking(machine_pdm_pcm_obj_t *self) {
+ uint32_t num_bytes_copied_to_appbuf = 0;
+ uint8_t *app_p = &(((uint8_t *)self->non_blocking_descriptor.appbuf.buf)[self->non_blocking_descriptor.index]);
+
+ uint8_t appbuf_sample_size_in_bytes = (self->bits / 8) * (self->format == STEREO ? 2: 1);
+ uint32_t num_bytes_remaining_to_copy_to_appbuf = self->non_blocking_descriptor.appbuf.len - self->non_blocking_descriptor.index;
+ uint32_t num_bytes_remaining_to_copy_from_ring_buffer = num_bytes_remaining_to_copy_to_appbuf *
+ (PDM_PCM_RX_FRAME_SIZE_IN_BYTES / appbuf_sample_size_in_bytes);
+ uint32_t num_bytes_needed_from_ringbuf = MIN(PDM_PCM_SIZEOF_NON_BLOCKING_COPY_IN_BYTES, num_bytes_remaining_to_copy_from_ring_buffer);
+ uint8_t discard_byte;
+ if (ringbuf_avail(&self->ring_buffer) >= num_bytes_needed_from_ringbuf) {
+ while (num_bytes_needed_from_ringbuf) {
+
+ uint8_t f_index = get_frame_mapping_index(self->bits, self->format);
+
+ for (uint8_t i = 0; i < PDM_PCM_RX_FRAME_SIZE_IN_BYTES; i++) {
+ int8_t r_to_a_mapping = pdm_pcm_frame_map[f_index][i];
+ if (r_to_a_mapping != -1) {
+ app_p[r_to_a_mapping] = ringbuf_get(&self->ring_buffer);
+ num_bytes_copied_to_appbuf++;
+ } else {
+ // discard unused byte from ring buffer
+ discard_byte = ringbuf_get(&self->ring_buffer);
+ (void)discard_byte;
+ }
+ num_bytes_needed_from_ringbuf--;
+ }
+ app_p += appbuf_sample_size_in_bytes;
+ }
+ self->non_blocking_descriptor.index += num_bytes_copied_to_appbuf;
+
+ if (self->non_blocking_descriptor.index >= self->non_blocking_descriptor.appbuf.len) {
+ self->non_blocking_descriptor.copy_in_progress = false;
+ mp_sched_schedule(self->callback_for_non_blocking, MP_OBJ_FROM_PTR(self));
+ }
+ }
+}
+
+#endif // MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+
+MP_NOINLINE static void machine_pdm_pcm_init_helper(machine_pdm_pcm_obj_t *self, size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_data, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_sample_rate, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 16000} },
+ { MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 16} },
+ { MP_QSTR_format, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = MONO} },
+ { MP_QSTR_gain, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ { MP_QSTR_ibuf, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 20000} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_pos_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ mp_machine_pdm_pcm_init_helper(self, args);
+}
+
+static void machine_pdm_pcm_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_pdm_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "PDM_PCM(sck="MP_HAL_PIN_FMT ", "
+ "data="MP_HAL_PIN_FMT ", "
+ "sample_rate=%ld, "
+ "bits=%u, "
+ "format=%u, "
+ "gain=%f, "
+ "ibuf=%d)",
+ mp_hal_pin_name(self->sck),
+ mp_hal_pin_name(self->data),
+ self->sample_rate,
+ self->bits,
+ self->format,
+ self->gain_db,
+ self->ring_buffer.size
+ );
+}
+
+static mp_obj_t machine_pdm_pcm_make_new(const mp_obj_type_t *type, size_t n_pos_args, size_t n_kw_args, const mp_obj_t *args) {
+ mp_arg_check_num(n_pos_args, n_kw_args, 0, MP_OBJ_FUN_ARGS_MAX, true);
+
+ machine_pdm_pcm_obj_t *self = mp_machine_pdm_pcm_make_new_instance(0);
+
+ mp_map_t kw_args;
+ mp_map_init_fixed_table(&kw_args, n_kw_args, args + n_pos_args);
+ machine_pdm_pcm_init_helper(self, n_pos_args, args, &kw_args);
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static mp_obj_t machine_pdm_pcm_init(size_t n_pos_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ machine_pdm_pcm_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+ machine_pdm_pcm_init_helper(self, n_pos_args - 1, pos_args + 1, kw_args);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(machine_pdm_pcm_init_obj, 1, machine_pdm_pcm_init);
+
+static mp_obj_t machine_pdm_pcm_deinit(mp_obj_t self_in) {
+ machine_pdm_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_machine_pdm_pcm_deinit(self);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_pdm_pcm_deinit_obj, machine_pdm_pcm_deinit);
+
+static mp_obj_t machine_pdm_pcm_irq(mp_obj_t self_in, mp_obj_t handler) {
+ machine_pdm_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (handler != mp_const_none && !mp_obj_is_callable(handler)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid callback"));
+ }
+
+ if (handler != mp_const_none) {
+ self->io_mode = NON_BLOCKING;
+ } else {
+ self->io_mode = BLOCKING;
+ }
+
+ self->callback_for_non_blocking = handler;
+
+ mp_machine_pdm_pcm_irq_update(self);
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(machine_pdm_pcm_irq_obj, machine_pdm_pcm_irq);
+
+static const mp_rom_map_elem_t machine_pdm_pcm_locals_dict_table[] = {
+ // Methods
+ { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_pdm_pcm_init_obj) },
+ { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_pdm_pcm_deinit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_pdm_pcm_irq_obj) },
+
+ // Constants
+ // Word lengths
+ { MP_ROM_QSTR(MP_QSTR_BITS_16), MP_ROM_INT(BITS_16) },
+ { MP_ROM_QSTR(MP_QSTR_BITS_32), MP_ROM_INT(BITS_32) },
+
+ // Modes
+ { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(MONO) },
+ { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(STEREO) },
+
+ #ifdef MICROPY_PY_MACHINE_PDM_PDM_CLASS_EXTRAS
+ MICROPY_PY_MACHINE_PDM_PDM_CLASS_EXTRAS
+ #endif
+};
+
+static mp_uint_t machine_pdm_pcm_stream_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) {
+ machine_pdm_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ uint8_t appbuf_sample_size_in_bytes = (self->bits / 8) * (self->format == STEREO ? 2: 1);
+
+ if (size % appbuf_sample_size_in_bytes != 0) { // size should be multiple of sample size
+ *errcode = MP_EINVAL;
+ return MP_STREAM_ERROR;
+ }
+
+ if (size == 0) {
+ return 0;
+ }
+
+ if (self->io_mode == BLOCKING) {
+ mp_buffer_info_t appbuf;
+ appbuf.buf = (void *)buf_in;
+ appbuf.len = size;
+ #if MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+ uint32_t num_bytes_read = fill_appbuf_from_ringbuf(self, &appbuf);
+ #else
+ uint32_t num_bytes_read = fill_appbuf_from_dma(self, &appbuf);
+ #endif
+ return num_bytes_read;
+ } else if (self->io_mode == NON_BLOCKING) {
+ #if MICROPY_PY_MACHINE_PDM_PCM_RING_BUF
+ self->non_blocking_descriptor.appbuf.buf = (void *)buf_in;
+ self->non_blocking_descriptor.appbuf.len = size;
+ self->non_blocking_descriptor.index = 0;
+ self->non_blocking_descriptor.copy_in_progress = true;
+ #else
+ #error "Non-blocking mode without ring buffer is not supported yet for PDM_PCM"
+ #endif
+ }
+
+ return 0;
+}
+
+static const mp_stream_p_t pdm_pcm_stream_p = {
+ .read = machine_pdm_pcm_stream_read,
+ .is_text = false,
+};
+
+MP_DEFINE_CONST_DICT(machine_pdm_pcm_locals_dict, machine_pdm_pcm_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_pdm_pcm_type,
+ MP_QSTR_PDM_PCM,
+ MP_TYPE_FLAG_ITER_IS_STREAM,
+ make_new, machine_pdm_pcm_make_new,
+ print, machine_pdm_pcm_print,
+ protocol, &pdm_pcm_stream_p,
+ locals_dict, &machine_pdm_pcm_locals_dict
+ );
+
+#endif // MICROPY_PY_MACHINE_PDM_PCM_TDD
diff --git a/ports/psoc-edge/machine_pin.c b/ports/psoc-edge/machine_pin.c
new file mode 100644
index 00000000000..028848527df
--- /dev/null
+++ b/ports/psoc-edge/machine_pin.c
@@ -0,0 +1,494 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "cy_gpio.h"
+
+#include "extmod/modmachine.h"
+#include "extmod/virtpin.h"
+#include "machine_pin.h"
+
+#define pin_assert_raise_val(msg, ret) if (ret != CY_RSLT_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+uint8_t pin_get_mode(const machine_pin_obj_t *self) {
+ uint32_t drive_mode = Cy_GPIO_GetDrivemode(Cy_GPIO_PortToAddr(self->port), self->pin);
+
+ switch (drive_mode) {
+ case CY_GPIO_DM_HIGHZ:
+ case CY_GPIO_DM_PULLUP:
+ case CY_GPIO_DM_PULLDOWN:
+ case CY_GPIO_DM_PULLUP_DOWN:
+ return GPIO_MODE_IN;
+
+ case CY_GPIO_DM_STRONG_IN_OFF:
+ case CY_GPIO_DM_PULLUP_IN_OFF:
+ case CY_GPIO_DM_PULLDOWN_IN_OFF:
+ case CY_GPIO_DM_PULLUP_DOWN_IN_OFF:
+ return GPIO_MODE_OUT;
+
+ case CY_GPIO_DM_OD_DRIVESLOW_IN_OFF:
+ /* These 2 modes are not configurable
+ by the user but they could be set by
+ at C level */
+ case CY_GPIO_DM_OD_DRIVESLOW:
+ case CY_GPIO_DM_OD_DRIVESHIGH:
+ return GPIO_MODE_OPEN_DRAIN;
+
+ default:
+ return GPIO_MODE_NONE;
+ }
+}
+
+static uint8_t pin_get_pull(const machine_pin_obj_t *self) {
+ uint32_t drive_mode = Cy_GPIO_GetDrivemode(Cy_GPIO_PortToAddr(self->port), self->pin);
+
+ switch (drive_mode) {
+ case CY_GPIO_DM_PULLUP:
+ case CY_GPIO_DM_PULLUP_IN_OFF:
+ return GPIO_PULL_UP;
+
+ case CY_GPIO_DM_PULLDOWN:
+ case CY_GPIO_DM_PULLDOWN_IN_OFF:
+ return GPIO_PULL_DOWN;
+
+ case CY_GPIO_DM_PULLUP_DOWN:
+ case CY_GPIO_DM_PULLUP_DOWN_IN_OFF:
+ return GPIO_PULL_UP_DOWN;
+
+ default:
+ return GPIO_PULL_NONE;
+ }
+}
+
+uint32_t get_drive_mode(uint8_t mode, uint8_t pull) {
+ uint32_t drive_mode = CY_GPIO_DM_INVALID;
+
+ if (mode == GPIO_MODE_IN) {
+ if (pull == GPIO_PULL_UP) {
+ drive_mode = CY_GPIO_DM_PULLUP;
+ } else if (pull == GPIO_PULL_DOWN) {
+ drive_mode = CY_GPIO_DM_PULLDOWN;
+ } else if (pull == GPIO_PULL_UP_DOWN) {
+ drive_mode = CY_GPIO_DM_PULLUP_DOWN;
+ } else {
+ drive_mode = CY_GPIO_DM_HIGHZ;
+ }
+ // Additional available unused modes:
+ // - CY_GPIO_DM_STRONG
+ } else if (mode == GPIO_MODE_OUT) {
+ if (pull == GPIO_PULL_UP) {
+ drive_mode = CY_GPIO_DM_PULLUP_IN_OFF;
+ } else if (pull == GPIO_PULL_DOWN) {
+ drive_mode = CY_GPIO_DM_PULLDOWN_IN_OFF;
+ } else if (pull == GPIO_PULL_UP_DOWN) {
+ drive_mode = CY_GPIO_DM_PULLUP_DOWN_IN_OFF;
+ } else {
+ drive_mode = CY_GPIO_DM_STRONG_IN_OFF;
+ }
+ } else if (mode == GPIO_MODE_OPEN_DRAIN) {
+ drive_mode = CY_GPIO_DM_OD_DRIVESLOW_IN_OFF;
+ // Additional available unused modes:
+ // - CY_GPIO_DM_OD_DRIVESLOW
+ // - CY_GPIO_DM_OD_DRIVESHIGH
+ } else if (mode == GPIO_MODE_NONE) {
+ drive_mode = CY_GPIO_DM_INVALID;
+ }
+
+ return drive_mode;
+}
+
+static uint8_t get_validated_initial_value(uint8_t mode, uint8_t pull, int8_t value) {
+ // No value was selected by the user,
+ // Select it coherent with the pull resistor
+ // configuration and low by default
+ if (value == -1) {
+ return (pull == GPIO_PULL_UP) ? 1 : 0;
+ }
+
+ if (mode == GPIO_MODE_IN) {
+ if (value == 0 && pull == GPIO_PULL_UP) {
+ mp_raise_msg(&mp_type_Exception, MP_ERROR_TEXT("machine.Pin incompatible configuration. Input pull-up can not be initialized low.\n"));
+ } else if (value == 1 && pull == GPIO_PULL_DOWN) {
+ mp_raise_msg(&mp_type_Exception, MP_ERROR_TEXT("machine.Pin incompatible configuration. Input pull-down can not be initialized high.\n"));
+ } else if (pull == GPIO_PULL_NONE || pull == GPIO_PULL_UP_DOWN) {
+ value = 0; // Default to low
+ mp_printf(&mp_plat_print, "machine.Pin warning: Initial value is undefined for input pull-none configuration.\n");
+ }
+ return value;
+ }
+
+ return value;
+}
+
+static mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum {
+ ARG_mode, ARG_pull, ARG_drive, ARG_value
+ };
+ static const mp_arg_t allowed_args[] = {
+ {MP_QSTR_mode, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE}},
+ {MP_QSTR_pull, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE}},
+ {MP_QSTR_drive, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE}},
+ {MP_QSTR_value, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE}}
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ uint8_t mode = GPIO_MODE_NONE;
+ if (args[ARG_mode].u_obj != mp_const_none) {
+ mode = mp_obj_get_uint(args[ARG_mode].u_obj);
+ }
+
+ uint8_t pull = GPIO_PULL_NONE;
+ if (args[ARG_pull].u_obj != mp_const_none) {
+ pull = mp_obj_get_uint(args[ARG_pull].u_obj);
+ }
+
+ int8_t value = -1;
+ if (args[ARG_value].u_obj != mp_const_none) {
+ value = mp_obj_is_true(args[ARG_value].u_obj);
+ }
+
+ uint32_t drive = CY_GPIO_DRIVE_SEL_0;
+ if (args[ARG_drive].u_obj != mp_const_none) {
+ drive = mp_obj_get_uint(args[ARG_drive].u_obj);
+ }
+
+ mp_hal_pin_config(self, mode, pull, get_validated_initial_value(mode, pull, value));
+ mp_hal_pin_set_drive(self, drive);
+
+ return mp_const_none;
+}
+
+const machine_pin_obj_t *machine_pin_get_named_pin(const mp_obj_dict_t *named_pins, mp_obj_t name) {
+ const mp_map_t *named_map = &named_pins->map;
+ mp_map_elem_t *named_elem = mp_map_lookup((mp_map_t *)named_map, name, MP_MAP_LOOKUP);
+ if (named_elem != NULL && named_elem->value != MP_OBJ_NULL) {
+ return MP_OBJ_TO_PTR(named_elem->value);
+ }
+ return NULL;
+}
+
+const machine_pin_obj_t *machine_pin_get_af_pin(machine_pin_af_unit_t af_unit, machine_pin_af_signal_t af_signal) {
+ const mp_map_t *cpu_map = &machine_pin_cpu_pins_locals_dict.map;
+
+ for (size_t i = 0; i < cpu_map->alloc; i++) {
+ const mp_map_elem_t *elem = &cpu_map->table[i];
+ if (elem->value == MP_OBJ_NULL) {
+ continue;
+ }
+
+ const machine_pin_obj_t *pin = MP_OBJ_TO_PTR(elem->value);
+ for (uint8_t j = 0; j < pin->af_num; j++) {
+ const machine_pin_af_obj_t *af = &pin->af[j];
+ if (af->unit == af_unit && af->signal == af_signal) {
+ return pin;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+const machine_pin_obj_t *machine_pin_get_pin_obj(mp_obj_t obj) {
+ const machine_pin_obj_t *pin_obj;
+
+ // pin can a pin object already
+ if (mp_obj_is_type(obj, &machine_pin_type)) {
+ return MP_OBJ_TO_PTR(obj);
+ }
+
+ // pin can be a board named pin
+ pin_obj = machine_pin_get_named_pin(&machine_pin_board_pins_locals_dict, obj);
+ if (pin_obj) {
+ return pin_obj;
+ }
+
+ // pin can be a cpu named pin
+ pin_obj = machine_pin_get_named_pin(&machine_pin_cpu_pins_locals_dict, obj);
+ if (pin_obj) {
+ return pin_obj;
+ }
+
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("Pin(%s) doesn't exist"), mp_obj_str_get_str(obj));
+}
+
+mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 1, 6, true);
+
+ const machine_pin_obj_t *self = machine_pin_get_pin_obj(args[0]);
+
+ if (n_args > 1 || n_kw > 0) {
+ // pin mode given, so configure this GPIO
+ mp_map_t kw_args;
+ mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
+ machine_pin_obj_init_helper(self, n_args - 1, args + 1, &kw_args); // skipping "id" as an arg as it is a part of self*.
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static mp_obj_t machine_pin_obj_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
+ return machine_pin_obj_init_helper(args[0], n_args - 1, args + 1, kw_args);
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(machine_pin_obj_init_obj, 1, machine_pin_obj_init);
+
+static void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "Pin(Pin.cpu.%q", self->name);
+
+ uint8_t mode = pin_get_mode(self);
+ qstr mode_qst = MP_QSTRnull;
+ if (mode == GPIO_MODE_IN) {
+ mode_qst = MP_QSTR_IN;
+ } else if (mode == GPIO_MODE_OUT) {
+ mode_qst = MP_QSTR_OUT;
+ } else if (mode == GPIO_MODE_OPEN_DRAIN) {
+ mode_qst = MP_QSTR_OPEN_DRAIN;
+ }
+ if (mode_qst != MP_QSTRnull) {
+ mp_printf(print, ", mode=Pin.%q", mode_qst);
+ }
+
+ uint8_t pull = pin_get_pull(self);
+ qstr pull_qst = MP_QSTRnull;
+ if (pull == GPIO_PULL_UP) {
+ pull_qst = MP_QSTR_PULL_UP;
+ } else if (pull == GPIO_PULL_DOWN) {
+ pull_qst = MP_QSTR_PULL_DOWN;
+ } else if (pull == GPIO_PULL_UP_DOWN) {
+ pull_qst = MP_QSTR_PULL_UP_DOWN;
+ }
+
+ if (pull_qst != MP_QSTRnull) {
+ mp_printf(print, ", pull=Pin.%q", pull_qst);
+ }
+ mp_print_str(print, ")");
+}
+
+static mp_obj_t machine_pin_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 0, 1, false);
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (n_args == 0) {
+ // get pin
+ return MP_OBJ_NEW_SMALL_INT(mp_hal_pin_read(self));
+ } else {
+ // set pin
+ mp_hal_pin_write(self, mp_obj_is_true(args[0]));
+ return mp_const_none;
+ }
+}
+
+static mp_obj_t machine_pin_value(size_t n_args, const mp_obj_t *args) {
+ return machine_pin_call(args[0], n_args - 1, 0, args + 1);
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_value_obj, 1, 2, machine_pin_value);
+
+static mp_obj_t machine_pin_off(mp_obj_t self_in) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_hal_pin_low(self);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_off_obj, machine_pin_off);
+
+static mp_obj_t machine_pin_on(mp_obj_t self_in) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_hal_pin_high(self);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_on_obj, machine_pin_on);
+
+static mp_obj_t machine_pin_toggle(mp_obj_t self_in) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (mp_hal_pin_read(self)) {
+ mp_hal_pin_low(self);
+ } else {
+ mp_hal_pin_high(self);
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_toggle_obj, machine_pin_toggle);
+
+static mp_obj_t machine_pin_mode(size_t n_args, const mp_obj_t *args) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ if (n_args == 1) {
+ return MP_OBJ_NEW_SMALL_INT(pin_get_mode(self));
+ } else {
+ mp_hal_pin_config(self, mp_obj_get_uint(args[1]), pin_get_pull(self), mp_hal_pin_read(self));
+ return mp_const_none;
+ }
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_mode_obj, 1, 2, machine_pin_mode);
+
+static mp_obj_t machine_pin_pull(size_t n_args, const mp_obj_t *args) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ if (n_args == 1) {
+ return MP_OBJ_NEW_SMALL_INT(pin_get_pull(self));
+ } else {
+ mp_hal_pin_config(self, pin_get_mode(self), mp_obj_get_uint(args[1]), mp_hal_pin_read(self));
+ return mp_const_none;
+ }
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_pull_obj, 1, 2, machine_pin_pull);
+
+
+static mp_obj_t machine_pin_drive(size_t n_args, const mp_obj_t *args) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ if (n_args == 1) {
+ return MP_OBJ_NEW_SMALL_INT(mp_hal_pin_get_drive(self));
+ } else {
+ mp_hal_pin_set_drive(self, mp_obj_get_uint(args[1]));
+ return mp_const_none;
+ }
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_drive_obj, 1, 2, machine_pin_drive);
+
+
+extern mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
+static MP_DEFINE_CONST_FUN_OBJ_KW(machine_pin_irq_obj, 1, machine_pin_irq);
+
+/**
+ * void machine_pin_deinit_all(void) {
+ * Not implemented.
+ *
+ * Rationale:
+ * There is no PDL API to deinitialize a single pin, only at the port level via
+ * void Cy_GPIO_Port_Deinit(GPIO_PRT_Type *base).
+ * If we deinitialize an entire port, we will end up deinitializing other
+ * pins that are used by MicroPython but not defined at the user level,
+ * such as the REPL UART interface pins. Thus, breaking basic core functionalities.
+ *
+ * This means that after a soft reset, pins will retain their
+ * configuration, which is not ideal since the system is not starting in
+ * the same state.
+ * This should not be a problem since pins can be reconfigured if reused,
+ * and if not reused, they won't be in scope after reset.
+ * The pin itself is not deinitialized, but its IRQ (if enabled) will be cleared,
+ * disabled, and deinitialized upon soft reset. That should be sufficient to
+ * prevent unexpected behavior.
+ *
+ * Discarded solutions:
+ * We could reset pins to default values, but we don't know if there is
+ * a single valid default configuration for all pins. Other initial
+ * value tracking mechanisms would also overcomplicate the code.
+ * Therefore, at the moment, such solutions don't seem worth it.
+ * }
+ */
+
+static mp_uint_t pin_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) {
+ (void)errcode;
+ machine_pin_obj_t *self = self_in;
+
+ switch (request) {
+ case MP_PIN_READ: {
+ return mp_hal_pin_read(self);
+ }
+ case MP_PIN_WRITE: {
+ mp_hal_pin_write(self, arg);
+ return 0;
+ }
+ }
+ return -1;
+}
+
+static const mp_pin_p_t pin_pin_p = {
+ .ioctl = pin_ioctl,
+};
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ pin_cpu_pins_obj_type,
+ MP_QSTR_cpu,
+ MP_TYPE_FLAG_NONE,
+ locals_dict, &machine_pin_cpu_pins_locals_dict
+ );
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ pin_board_pins_obj_type,
+ MP_QSTR_board,
+ MP_TYPE_FLAG_NONE,
+ locals_dict, &machine_pin_board_pins_locals_dict
+ );
+
+static const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
+ // Instance methods
+ { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_pin_obj_init_obj) },
+ { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&machine_pin_value_obj) },
+ { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&machine_pin_off_obj) },
+ { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&machine_pin_on_obj) },
+ { MP_ROM_QSTR(MP_QSTR_low), MP_ROM_PTR(&machine_pin_off_obj) },
+ { MP_ROM_QSTR(MP_QSTR_high), MP_ROM_PTR(&machine_pin_on_obj) },
+ { MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&machine_pin_toggle_obj) },
+ { MP_ROM_QSTR(MP_QSTR_mode), MP_ROM_PTR(&machine_pin_mode_obj) },
+ { MP_ROM_QSTR(MP_QSTR_pull), MP_ROM_PTR(&machine_pin_pull_obj) },
+ { MP_ROM_QSTR(MP_QSTR_drive), MP_ROM_PTR(&machine_pin_drive_obj) },
+ { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_pin_irq_obj) },
+
+ // class attributes
+ #if MICROPY_PY_MACHINE_PIN_BOARD_NUM_ENTRIES > 0
+ { MP_ROM_QSTR(MP_QSTR_board), MP_ROM_PTR(&pin_board_pins_obj_type) },
+ #endif
+ #if MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES > 0
+ { MP_ROM_QSTR(MP_QSTR_cpu), MP_ROM_PTR(&pin_cpu_pins_obj_type) },
+ #endif
+
+ // Const
+ { MP_ROM_QSTR(MP_QSTR_IN), MP_ROM_INT(GPIO_MODE_IN) },
+ { MP_ROM_QSTR(MP_QSTR_OUT), MP_ROM_INT(GPIO_MODE_OUT) },
+ { MP_ROM_QSTR(MP_QSTR_OPEN_DRAIN), MP_ROM_INT(GPIO_MODE_OPEN_DRAIN) },
+
+ { MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(GPIO_PULL_UP) },
+ { MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(GPIO_PULL_DOWN) },
+ { MP_ROM_QSTR(MP_QSTR_PULL_UP_DOWN), MP_ROM_INT(GPIO_PULL_UP_DOWN) },
+
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_0), MP_ROM_INT(CY_GPIO_DRIVE_SEL_0) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_1), MP_ROM_INT(CY_GPIO_DRIVE_SEL_1) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_2), MP_ROM_INT(CY_GPIO_DRIVE_SEL_2) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_3), MP_ROM_INT(CY_GPIO_DRIVE_SEL_3) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_4), MP_ROM_INT(CY_GPIO_DRIVE_SEL_4) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_5), MP_ROM_INT(CY_GPIO_DRIVE_SEL_5) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_6), MP_ROM_INT(CY_GPIO_DRIVE_SEL_6) },
+ { MP_ROM_QSTR(MP_QSTR_DRIVE_7), MP_ROM_INT(CY_GPIO_DRIVE_SEL_7) },
+
+ { MP_ROM_QSTR(MP_QSTR_IRQ_FALLING), MP_ROM_INT(CY_GPIO_INTR_FALLING)},
+ { MP_ROM_QSTR(MP_QSTR_IRQ_RISING), MP_ROM_INT(CY_GPIO_INTR_RISING)},
+};
+
+static MP_DEFINE_CONST_DICT(machine_pin_locals_dict, machine_pin_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_pin_type,
+ MP_QSTR_Pin,
+ MP_TYPE_FLAG_NONE,
+ make_new, mp_pin_make_new,
+ print, machine_pin_print,
+ call, machine_pin_call,
+ protocol, &pin_pin_p,
+ locals_dict, &machine_pin_locals_dict
+ );
diff --git a/ports/psoc-edge/machine_pin.h b/ports/psoc-edge/machine_pin.h
new file mode 100644
index 00000000000..a7171629d2c
--- /dev/null
+++ b/ports/psoc-edge/machine_pin.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_MACHINE_PIN_H
+#define MICROPY_INCLUDED_PSOC_EDGE_MACHINE_PIN_H
+
+#include "py/obj.h"
+#include "machine_pin_af.h"
+
+enum {GPIO_MODE_NONE = 0, GPIO_MODE_IN, GPIO_MODE_OUT, GPIO_MODE_OPEN_DRAIN};
+
+enum {GPIO_PULL_NONE = 0, GPIO_PULL_UP, GPIO_PULL_DOWN, GPIO_PULL_UP_DOWN};
+
+typedef struct _machine_pin_obj_t {
+ mp_obj_base_t base;
+ qstr name;
+ uint8_t port;
+ uint8_t pin;
+ uint8_t af_num;
+ const machine_pin_af_obj_t *af;
+} machine_pin_obj_t;
+
+extern const mp_obj_type_t machine_pin_type;
+
+#include "genhdr/pins.h"
+
+extern const mp_obj_dict_t machine_pin_cpu_pins_locals_dict;
+extern const mp_obj_dict_t machine_pin_board_pins_locals_dict;
+
+const machine_pin_obj_t *machine_pin_get_pin_obj(mp_obj_t obj);
+const machine_pin_obj_t *machine_pin_get_af_pin(machine_pin_af_unit_t af_unit, machine_pin_af_signal_t af_signal);
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_MACHINE_PIN_H
diff --git a/ports/psoc-edge/machine_pin_af.c b/ports/psoc-edge/machine_pin_af.c
new file mode 100644
index 00000000000..1e59431e17c
--- /dev/null
+++ b/ports/psoc-edge/machine_pin_af.c
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "machine_pin_af.h"
+
+const char *machine_pin_af_signal_str[] = {
+ [MACHINE_PIN_AF_SIGNAL_I2C_SDA] = "I2C_SDA",
+ [MACHINE_PIN_AF_SIGNAL_I2C_SCL] = "I2C_SCL",
+
+ [MACHINE_PIN_AF_SIGNAL_SPI_MOSI] = "SPI_MOSI",
+ [MACHINE_PIN_AF_SIGNAL_SPI_MISO] = "SPI_MISO",
+ [MACHINE_PIN_AF_SIGNAL_SPI_CLK] = "SPI_CLK",
+ [MACHINE_PIN_AF_SIGNAL_SPI_SELECT0] = "SPI_SELECT0",
+ [MACHINE_PIN_AF_SIGNAL_SPI_SELECT1] = "SPI_SELECT1",
+
+ [MACHINE_PIN_AF_SIGNAL_UART_TX] = "UART_TX",
+ [MACHINE_PIN_AF_SIGNAL_UART_RX] = "UART_RX",
+ [MACHINE_PIN_AF_SIGNAL_UART_CTS] = "UART_CTS",
+ [MACHINE_PIN_AF_SIGNAL_UART_RTS] = "UART_RTS",
+
+ [MACHINE_PIN_AF_SIGNAL_PDM_CLK] = "PDM_CLK",
+ [MACHINE_PIN_AF_SIGNAL_PDM_DATA] = "PDM_DATA",
+
+ [MACHINE_PIN_AF_SIGNAL_TCPWM_LINE] = "TCPWM_LINE",
+
+ /* TODO: Add additional types */
+};
diff --git a/ports/psoc-edge/machine_pin_af.h b/ports/psoc-edge/machine_pin_af.h
new file mode 100644
index 00000000000..e3e078d6dfa
--- /dev/null
+++ b/ports/psoc-edge/machine_pin_af.h
@@ -0,0 +1,86 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_MACHINE_PIN_AF_H
+#define MICROPY_INCLUDED_PSOC_EDGE_MACHINE_PIN_AF_H
+
+#include "py/obj.h"
+#include "gpio_pse84_bga_220.h"
+
+typedef enum {
+ MACHINE_PIN_AF_FN_I2C,
+ MACHINE_PIN_AF_FN_SPI,
+ MACHINE_PIN_AF_FN_UART,
+
+ MACHINE_PIN_AF_FN_PDM,
+ MACHINE_PIN_AF_FN_TCPWM,
+ /* TODO: Add additional functionalities */
+
+ MACHINE_PIN_AF_FN_NONE = 0xFF
+} machine_pin_af_fn_t;
+
+extern const char *machine_pin_af_fn_str[];
+
+typedef enum {
+ MACHINE_PIN_AF_SIGNAL_I2C_SDA,
+ MACHINE_PIN_AF_SIGNAL_I2C_SCL,
+
+ MACHINE_PIN_AF_SIGNAL_SPI_MOSI,
+ MACHINE_PIN_AF_SIGNAL_SPI_MISO,
+ MACHINE_PIN_AF_SIGNAL_SPI_CLK,
+ MACHINE_PIN_AF_SIGNAL_SPI_SELECT0,
+ MACHINE_PIN_AF_SIGNAL_SPI_SELECT1,
+
+ MACHINE_PIN_AF_SIGNAL_UART_TX,
+ MACHINE_PIN_AF_SIGNAL_UART_RX,
+ MACHINE_PIN_AF_SIGNAL_UART_CTS,
+ MACHINE_PIN_AF_SIGNAL_UART_RTS,
+
+ MACHINE_PIN_AF_SIGNAL_PDM_CLK,
+ MACHINE_PIN_AF_SIGNAL_PDM_DATA,
+
+ MACHINE_PIN_AF_SIGNAL_TCPWM_LINE,
+
+ /* TODO: Add additional types */
+} machine_pin_af_signal_t;
+
+extern const char *machine_pin_af_signal_str[];
+
+#define MACHINE_PIN_AF_UNIT_NONE 0xFF
+typedef uint16_t machine_pin_af_unit_t;
+typedef void *machine_pin_af_periph_t;
+
+typedef struct {
+ en_hsiom_sel_t idx;
+ machine_pin_af_fn_t fn;
+ machine_pin_af_unit_t unit;
+ machine_pin_af_signal_t signal;
+ machine_pin_af_periph_t periph;
+} machine_pin_af_obj_t;
+
+extern const mp_obj_type_t machine_pin_af_type;
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_MACHINE_PIN_AF_H
diff --git a/ports/psoc-edge/machine_pin_irq.c b/ports/psoc-edge/machine_pin_irq.c
new file mode 100644
index 00000000000..582d5d55bce
--- /dev/null
+++ b/ports/psoc-edge/machine_pin_irq.c
@@ -0,0 +1,333 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "cy_gpio.h"
+#include "sys_int.h"
+
+#include "py/misc.h"
+#include "py/runtime.h"
+#include "shared/runtime/mpirq.h"
+#include "machine_pin.h"
+
+/* ======================================================================================================================== */
+
+
+/* Forward declaration */
+static void machine_pin_irq_port_handler(uint8_t port);
+/**
+ * All the pins of one port share the same IRQ handler.
+ * Therefore, we can replicate the handlers based on the
+ * available CPU GPIO ports that are exposed to the users.
+ *
+ * Alternatively, a single handler could have been used
+ * for all ports and pins, but that would require sweeping
+ * all ports and pins, which could be too much for an ISR.
+ */
+#define DEFINE_GPIO_PORT_IRQ_HANDLER(port) \
+ void PORT##port##_IRQ_Handler(void) { \
+ machine_pin_irq_port_handler(port); \
+ }
+
+/**
+ * The file build-/genhdr/pins.h contains the macro
+ *
+ * MICROPY_PY_MACHINE_PIN_FOR_ALL_PORTS(DO)
+ *
+ * which uses the X-macro (as argument) pattern to pass a worker
+ * macro DO(port) for the list of all user available ports.
+ *
+ * The available (not hidden) user ports are those defined in the
+ * boards//pins.csv file, which are not prefixed
+ * with a hyphen(-).
+ * See tools/boardgen.py and psoc-edge/boards/make-pins.py
+ * for more information.
+ */
+
+/* Define all GPIO port IRQ handlers */
+MICROPY_PY_MACHINE_PIN_FOR_ALL_PORTS(DEFINE_GPIO_PORT_IRQ_HANDLER)
+
+/**
+ * Array of GPIO port IRQ configuration struct look up table.
+ *
+ * The IRQ number values are defined in cy_device_headers_ns.h
+ * files for non-secure core.
+ * The IRQn_Type value naming are different for the
+ * secure core as they include "_sec_" in the names.
+ * TODO: Review if secure core needs to be supported.
+ * We can add conditional compilation using the macro CY_DEVICE_SECURE.
+ */
+static sys_int_cfg_t port_irq_cfg[MICROPY_PY_MACHINE_PIN_PORT_NUM_ENTRIES] = {
+ #define MAP_GPIO_PORT_IRQ_CONFIG(port) [port] = { ioss_interrupts_gpio_##port##_IRQn, SYS_INT_IRQ_LOWEST_PRIORITY, PORT##port##_IRQ_Handler},
+ MICROPY_PY_MACHINE_PIN_FOR_ALL_PORTS(MAP_GPIO_PORT_IRQ_CONFIG)
+};
+
+/* ======================================================================================================================== */
+/* machine_pin_irq struct and API functions */
+
+typedef struct _machine_pin_irq_obj_t {
+ mp_irq_obj_t base;
+ uint32_t flags;
+ uint32_t trigger;
+ sys_int_cfg_t *port_cfg;
+} machine_pin_irq_obj_t;
+
+machine_pin_irq_obj_t *machine_pin_irq_obj[MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES];
+
+static machine_pin_irq_obj_t *machine_pin_get_irq_obj(machine_pin_obj_t *pin_obj) {
+ uint32_t idx = 0;
+ for (idx = 0; idx < MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES; idx++) {
+ machine_pin_irq_obj_t *irq = machine_pin_irq_obj[idx];
+ if (irq != NULL) {
+ machine_pin_obj_t *irq_parent = MP_OBJ_TO_PTR(irq->base.parent);
+ if (irq_parent == pin_obj) {
+ return irq;
+ }
+ }
+ }
+ return NULL;
+}
+
+static machine_pin_irq_obj_t *machine_pin_irq_obj_allocate(void) {
+ for (uint32_t idx = 0; idx < MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES; idx++) {
+ machine_pin_irq_obj_t *irq = machine_pin_irq_obj[idx];
+ if (irq == NULL) {
+ irq = m_new_obj(machine_pin_irq_obj_t);
+ machine_pin_irq_obj[idx] = irq;
+ return irq;
+ }
+ }
+
+ mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("no more Pin IRQ objects available"));
+}
+
+static void machine_pin_irq_obj_dealloc(machine_pin_irq_obj_t *irq) {
+ for (uint32_t idx = 0; idx < MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES; idx++) {
+ if (machine_pin_irq_obj[idx] == irq) {
+ m_del_obj(machine_pin_irq_obj_t, irq);
+ machine_pin_irq_obj[idx] = NULL;
+ return;
+ }
+ }
+}
+
+static machine_pin_irq_obj_t *machine_pin_irq_find(uint8_t port, uint8_t pin) {
+ for (uint32_t idx = 0; idx < MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES; idx++) {
+ machine_pin_irq_obj_t *irq = machine_pin_irq_obj[idx];
+ if (irq != NULL) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(irq->base.parent);
+ if (self->port == port && self->pin == pin) {
+ return irq;
+ }
+ }
+ }
+ return NULL;
+}
+
+static void machine_pin_irq_port_handler(uint8_t port) {
+ /**
+ * All pins in the same port will run the same handler.
+ * Therefore we iterate over all the pins and check if their interrupt
+ * status are active.
+ */
+ for (uint8_t pin = 0; pin < CY_GPIO_PINS_MAX; pin++) {
+ if (Cy_GPIO_GetInterruptStatus(Cy_GPIO_PortToAddr(port), pin)) {
+ /* Clear the GPIO source first so back-to-back edges can re-latch. */
+ Cy_GPIO_ClearInterrupt(Cy_GPIO_PortToAddr(port), pin);
+
+ machine_pin_irq_obj_t *irq = machine_pin_irq_find(port, pin);
+
+ /**
+ * Update the flags with the current trigger that caused the IRQ.
+ * There is not a PDL function to get the current trigger,
+ * so we use the configured trigger as the source of truth.
+ * This means that if both edges are enabled, the flags will
+ * indicate both edges even if only one of them caused the IRQ.
+ */
+ irq->flags = irq->trigger;
+ if (irq->base.handler != mp_const_none) {
+ mp_irq_handler(&irq->base);
+ }
+ }
+ }
+}
+
+/**
+ * Returns true if more than one pin irq objects are registered for the same port.
+ * False otherwise.
+ */
+static bool machine_pin_irq_are_multiple_pin_irqs_registered_in_port(uint32_t port) {
+ uint32_t pin_irq_registered_in_port = 0;
+ for (uint32_t idx = 0; idx < MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES; idx++) {
+ machine_pin_irq_obj_t *irq = machine_pin_irq_obj[idx];
+ if (irq != NULL) {
+ machine_pin_obj_t *pin_obj = MP_OBJ_TO_PTR(irq->base.parent);
+ if (pin_obj->port == port) {
+ if (++pin_irq_registered_in_port > 1) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * Set the priority of the port interrupt.
+ *
+ * As all port pins share the same interrupt source, if multiple pins have an IRQ
+ * registered, the desired new priority cannot be lower than the current configured priority.
+ * This mechanism upgrades the priority of all pin port interrupts to ensure that higher priority
+ * interrupts are not inadvertently masked by lower priority ones.
+ */
+static void machine_pin_irq_set_priority(sys_int_cfg_t *port_cfg, uint32_t port, uint32_t priority) {
+ bool multiple_pin_irq_registered_in_port = machine_pin_irq_are_multiple_pin_irqs_registered_in_port(port);
+ if (!multiple_pin_irq_registered_in_port) {
+ port_cfg->priority = priority;
+ } else {
+ #define GPIO_PORT_HIGHER_PRIORITY(prio1, prio2) MIN(prio1, prio2) /* A smaller number means higher priority. */
+ port_cfg->priority = GPIO_PORT_HIGHER_PRIORITY(port_cfg->priority, priority);
+ }
+}
+
+#define MP_PIN_IRQ_TRIGGER_DISABLE 0x00UL
+#define MP_PIN_IRQ_ALLOWED_FLAGS (CY_GPIO_INTR_RISING | CY_GPIO_INTR_FALLING)
+
+static void machine_pin_irq_config(machine_pin_irq_obj_t *irq, uint32_t trigger) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(irq->base.parent);
+ if (trigger == MP_PIN_IRQ_TRIGGER_DISABLE) {
+ sys_int_deinit(irq->port_cfg);
+ Cy_GPIO_ClearInterrupt(Cy_GPIO_PortToAddr(self->port), self->pin);
+ Cy_GPIO_SetInterruptMask(Cy_GPIO_PortToAddr(self->port), self->pin, 0u);
+ return;
+ } else {
+ Cy_GPIO_ClearInterrupt(Cy_GPIO_PortToAddr(self->port), self->pin);
+ Cy_GPIO_SetInterruptEdge(Cy_GPIO_PortToAddr(self->port), self->pin, trigger);
+ Cy_GPIO_SetInterruptMask(Cy_GPIO_PortToAddr(self->port), self->pin, 1u);
+ sys_int_init(irq->port_cfg);
+ }
+}
+
+static mp_uint_t machine_pin_irq_trigger(mp_obj_t self_in, mp_uint_t trigger) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ machine_pin_irq_obj_t *irq = machine_pin_get_irq_obj(self);
+
+ /* Check the trigger */
+ mp_uint_t not_supported = trigger & ~MP_PIN_IRQ_ALLOWED_FLAGS;
+ if (trigger != 0 && not_supported) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("trigger 0x%08x unsupported"), not_supported);
+ }
+
+ irq->flags = 0;
+ irq->trigger = trigger;
+
+ machine_pin_irq_config(irq, trigger);
+
+ return 0;
+}
+
+static mp_uint_t machine_pin_irq_info(mp_obj_t self_in, mp_uint_t info_type) {
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ machine_pin_irq_obj_t *irq = machine_pin_get_irq_obj(self);
+
+ if (info_type == MP_IRQ_INFO_FLAGS) {
+ return irq->flags;
+ } else if (info_type == MP_IRQ_INFO_TRIGGERS) {
+ return irq->trigger;
+ }
+ return 0;
+}
+
+static const mp_irq_methods_t machine_pin_irq_methods = {
+ .trigger = machine_pin_irq_trigger,
+ .info = machine_pin_irq_info,
+};
+
+static void machine_pin_irq_obj_init(machine_pin_irq_obj_t *irq, machine_pin_obj_t *parent_pin) {
+ mp_irq_init(&irq->base, &machine_pin_irq_methods, MP_OBJ_FROM_PTR(parent_pin));
+ irq->flags = 0;
+ irq->trigger = 0;
+ irq->port_cfg = &port_irq_cfg[parent_pin->port];
+}
+
+static void machine_pin_irq_obj_deinit(machine_pin_irq_obj_t *irq) {
+ irq->base.handler = mp_const_none;
+ irq->base.ishard = false;
+ irq->trigger = 0;
+ irq->flags = 0;
+ irq->port_cfg = NULL;
+}
+
+mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_handler, ARG_trigger, ARG_hard, ARG_priority };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_handler, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_trigger, MP_ARG_INT, {.u_int = CY_GPIO_INTR_RISING | CY_GPIO_INTR_FALLING} },
+ { MP_QSTR_hard, MP_ARG_BOOL, {.u_bool = false} },
+ { MP_QSTR_priority, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = SYS_INT_IRQ_LOWEST_PRIORITY }},
+ };
+
+ machine_pin_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ machine_pin_irq_obj_t *irq = machine_pin_get_irq_obj(self);
+ if (irq == NULL) {
+ irq = machine_pin_irq_obj_allocate();
+ machine_pin_irq_obj_init(irq, self);
+ }
+
+ if (n_args > 1 || kw_args->used != 0) {
+ /* Check the handler */
+ mp_obj_t handler = args[ARG_handler].u_obj;
+ if (handler != mp_const_none && !mp_obj_is_callable(handler)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("handler must be None or callable"));
+ /* If handler is None, disable the IRQ */
+ } else if (handler == mp_const_none) {
+ machine_pin_irq_trigger(self, MP_PIN_IRQ_TRIGGER_DISABLE);
+ return MP_OBJ_FROM_PTR(irq);
+ }
+ irq->base.handler = args[ARG_handler].u_obj;
+ irq->base.ishard = args[ARG_hard].u_bool;
+ machine_pin_irq_set_priority(irq->port_cfg, self->port, args[ARG_priority].u_int);
+ machine_pin_irq_trigger(self, args[ARG_trigger].u_int);
+ }
+
+ return MP_OBJ_FROM_PTR(irq);
+}
+
+void machine_pin_irq_deinit_all(void) {
+ for (uint32_t i = 0; i < MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES; i++) {
+ machine_pin_irq_obj_t *irq = machine_pin_irq_obj[i];
+ if (irq != NULL) {
+ machine_pin_irq_config(irq, MP_PIN_IRQ_TRIGGER_DISABLE);
+ machine_pin_irq_obj_deinit(irq);
+ machine_pin_irq_obj_dealloc(irq);
+ }
+ }
+}
+
+// Register pin IRQ objects as roots so they are retained by the GC.
+MP_REGISTER_ROOT_POINTER(struct _machine_pin_irq_obj_t *machine_pin_irq_obj[MICROPY_PY_MACHINE_PIN_CPU_NUM_ENTRIES]);
diff --git a/ports/psoc-edge/machine_pwm.c b/ports/psoc-edge/machine_pwm.c
new file mode 100644
index 00000000000..32ccfb8b645
--- /dev/null
+++ b/ports/psoc-edge/machine_pwm.c
@@ -0,0 +1,452 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "modmachine.h"
+#include "cy_gpio.h"
+#include "cy_sysclk.h"
+#include "cy_tcpwm_pwm.h"
+#include "cycfg_peripherals.h"
+#include "cycfg_peripheral_clocks.h"
+#include "mphalport.h"
+#include "machine_pin.h"
+#include "tcpwm.h"
+#include "genhdr/pins_af.h"
+
+typedef enum {
+ VALUE_NOT_SET = -1,
+ DUTY_NOT_SET = 0,
+ DUTY_U16,
+ DUTY_NS
+} duty_type_t;
+
+typedef struct _machine_pwm_obj_t {
+ mp_obj_base_t base; /**< MicroPython base object */
+ cy_stc_tcpwm_pwm_config_t pwm_obj; /**< PDL PWM configuration struct */
+ const machine_pin_obj_t *pin; /**< Resolved GPIO pin object for PWM output */
+ const machine_pin_af_obj_t *pin_af; /**< TCPWM alternate function selected for the output pin */
+ uint32_t counter_num; /**< TCPWM0 counter index assigned to this PWM instance */
+ en_clk_dst_t pclk_dst; /**< PCLK clock destination for this counter's clock assignment */
+ uint32_t frequency; /**< PWM output frequency in Hz */
+ duty_type_t duty_type; /**< Indicates whether duty is set as DUTY_U16 or DUTY_NS */
+ mp_int_t duty; /**< Duty cycle value: 0-65535 if DUTY_U16, nanoseconds if DUTY_NS */
+ bool invert; /**< If true, inverts the PWM output signal polarity */
+} machine_pwm_obj_t;
+
+// Sentinel value meaning "no trigger"; masked with 0x3U when assigned to 2-bit inputMode fields.
+#define CYBSP_PWM_LED_CTRL_INPUT_DISABLED 0x7U
+
+// TCPWM base clock: PCLK 100 MHz divided to 1 MHz for usable duty resolution at practical
+// frequencies. Divider register value 99 = divisor 100: 100 MHz / 100 = 1 MHz.
+// At 1 MHz a 32-bit counter gives period0 = 1,000,000 at 1 Hz and 1,000 at 1 kHz.
+// Maximum PWM output frequency = PWM_TCPWM_CLK_HZ / 2 = 500 kHz (period0 = 2).
+#define PWM_TCPWM_CLK_HZ 1000000UL
+#define PWM_TCPWM_CLK_DIV_VAL 99U
+#define PWM_GROUP1_PERIOD_MAX (0xFFFFU)
+
+#define pwm_assert_raise_val(msg, ret) if (ret != CY_RSLT_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+/* Unit conversion macros */
+ #define pwm_duty_cycle_ns_to_u16(duty_ns, freq) ((int)(((float)(duty_ns * freq) / (float)1000000000) * (float)65536) - 1)
+ #define pwm_duty_cycle_u16_to_ns(duty_u16, freq) ((int)(((float)(duty_u16 + 1) / (float)65536) * ((float)1000000000 / (float)freq)))
+ #define pwm_duty_cycle_u16_to_percent(duty_u16) ((float)(duty_u16 + 1) * 100 / (float)65536)
+ #define pwm_duty_cycle_ns_to_percent(duty_ns, freq) ((float)((duty_ns) * 100) / (float)(1000000000 / freq))
+ #define pwm_duty_cycle_percent_to_compare(duty_percent, period) ((int)(((float)duty_percent / (float)100) * (float)period))
+ #define pwm_freq_to_period_us(freq) ((uint32_t)(1000000 / freq))
+ #define pwm_period_ns_to_us(period_ns) ((uint32_t)(period_ns / 1000))
+ #define pwm_duty_cycle_u16_to_compare(duty_u16, period) ((int)(((float)(duty_u16 + 1) / (float)65536) * (float)period))
+
+static machine_pwm_obj_t *pwm_obj[MICROPY_PY_MACHINE_PWM_MAX_OBJS] = { NULL };
+static bool pwm_clk_configured = false; // true after the shared divider is programmed to PWM_TCPWM_CLK_HZ
+
+static const machine_pin_af_obj_t *pwm_pin_af_find_and_alloc(machine_pwm_obj_t *self) {
+ bool has_pwm_af = false;
+ for (uint8_t i = 0; i < self->pin->af_num; i++) {
+ const machine_pin_af_obj_t *af = &self->pin->af[i];
+ if (af->signal != MACHINE_PIN_AF_SIGNAL_TCPWM_LINE) {
+ continue;
+ }
+ has_pwm_af = true;
+ if (machine_tcpwm_counter_try_alloc(af->unit, MP_OBJ_FROM_PTR(self))) {
+ self->counter_num = af->unit;
+ self->pclk_dst = machine_tcpwm_counter_pclk(self->counter_num);
+ return af;
+ }
+ }
+
+ if (has_pwm_af) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("No free TCPWM counter is available for Pin %q"), self->pin->name);
+ }
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("Pin %q does not support PWM output"), self->pin->name);
+}
+
+// Search the instance pool for an existing PWM object on the given port/pin; returns NULL if not found.
+static inline machine_pwm_obj_t *pwm_obj_find_by_pin(uint8_t port, uint8_t pin) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_PWM_MAX_OBJS; i++) {
+ if (pwm_obj[i] != NULL && pwm_obj[i]->pin->port == port && pwm_obj[i]->pin->pin == pin) {
+ return pwm_obj[i];
+ }
+ }
+ return NULL;
+}
+
+// Allocate and return a new PWM object from the instance pool; returns NULL if the pool is full.
+static inline machine_pwm_obj_t *pwm_obj_alloc(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_PWM_MAX_OBJS; i++) {
+ if (pwm_obj[i] == NULL) {
+ pwm_obj[i] = mp_obj_malloc(machine_pwm_obj_t, &machine_pwm_type);
+ return pwm_obj[i];
+ }
+ }
+ return NULL;
+}
+
+// Release a PWM object slot back to the instance pool.
+static inline void pwm_obj_free(machine_pwm_obj_t *pwm_obj_ptr) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_PWM_MAX_OBJS; i++) {
+ if (pwm_obj[i] == pwm_obj_ptr) {
+ pwm_obj[i] = NULL;
+ return;
+ }
+ }
+}
+
+// Raise ValueError if duty_ns exceeds the period length for the given frequency.
+static void pwm_duty_ns_assert(mp_int_t duty_ns, uint32_t freq) {
+ if (duty_ns > (int)(1000000000 / freq)) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("PWM duty in ns is larger than the period %d ns"), (int)(1000000000 / freq));
+ }
+}
+
+// Configure the GPIO pin to route the TCPWM output via HSIOM.
+static void pwm_pin_config(machine_pwm_obj_t *self) {
+ GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(self->pin->port);
+ Cy_GPIO_SetHSIOM(port, self->pin->pin, self->pin_af->idx);
+ Cy_GPIO_SetDrivemode(port, self->pin->pin, CY_GPIO_DM_STRONG_IN_OFF);
+}
+
+// Restore the GPIO pin to plain GPIO mode (Hi-Z, no peripheral routing)
+static void pwm_pin_restore(const machine_pin_obj_t *pin) {
+ GPIO_PRT_Type *port = Cy_GPIO_PortToAddr(pin->port);
+ Cy_GPIO_SetHSIOM(port, pin->pin, HSIOM_SEL_GPIO);
+ Cy_GPIO_SetDrivemode(port, pin->pin, CY_GPIO_DM_HIGHZ);
+}
+
+// Reconfigure and restart the TCPWM counter using the current pwm_obj config struct.
+static void pwm_restart(machine_pwm_obj_t *self) {
+ Cy_TCPWM_PWM_Disable(TCPWM0, self->counter_num);
+ cy_en_tcpwm_status_t result = Cy_TCPWM_PWM_Init(TCPWM0, self->counter_num, &self->pwm_obj);
+ pwm_assert_raise_val("PWM init failed with return code %lx !", result);
+ Cy_TCPWM_PWM_Enable(TCPWM0, self->counter_num);
+ Cy_TCPWM_TriggerReloadOrIndex_Single(TCPWM0, self->counter_num);
+}
+
+// Compute period and compare register values from the stored frequency/duty and write to the PDL config struct.
+static void pwm_config(machine_pwm_obj_t *self) {
+ if (self->frequency == 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("PWM frequency must be greater than 0"));
+ }
+ uint32_t period = PWM_TCPWM_CLK_HZ / self->frequency;
+ if (self->counter_num >= 256U && period > PWM_GROUP1_PERIOD_MAX) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("PWM frequency too low for 16-bit counter %lu; period %lu exceeds %lu ticks"),
+ (unsigned long)self->counter_num,
+ (unsigned long)period,
+ (unsigned long)PWM_GROUP1_PERIOD_MAX);
+ }
+ self->pwm_obj.period0 = period;
+ self->pwm_obj.period1 = period;
+
+ if (self->duty_type == DUTY_U16) {
+ self->pwm_obj.compare0 = pwm_duty_cycle_u16_to_compare(self->duty, self->pwm_obj.period0);
+ self->pwm_obj.compare1 = pwm_duty_cycle_u16_to_compare(self->duty, self->pwm_obj.period1);
+ } else if (self->duty_type == DUTY_NS) {
+ int duty_u16 = pwm_duty_cycle_ns_to_u16(self->duty, self->frequency);
+ self->pwm_obj.compare0 = pwm_duty_cycle_u16_to_compare(duty_u16, self->pwm_obj.period0);
+ self->pwm_obj.compare1 = pwm_duty_cycle_u16_to_compare(duty_u16, self->pwm_obj.period1);
+ }
+
+ self->pwm_obj.invertPWMOut = self->invert;
+}
+
+// Parse freq/duty_u16/duty_ns/invert args, configure the hardware, and start the PWM counter.
+static void mp_machine_pwm_init_helper(machine_pwm_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_freq, ARG_duty_u16, ARG_duty_ns, ARG_invert};
+
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_freq, MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_INT },
+ { MP_QSTR_duty_u16, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = VALUE_NOT_SET} },
+ { MP_QSTR_duty_ns, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = VALUE_NOT_SET} },
+ { MP_QSTR_invert, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args,
+ MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ if (args[ARG_freq].u_int <= 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("PWM frequency must be greater than 0"));
+ }
+ if ((uint32_t)args[ARG_freq].u_int > PWM_TCPWM_CLK_HZ / 2) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("PWM frequency must not exceed %lu Hz"), (unsigned long)(PWM_TCPWM_CLK_HZ / 2));
+ }
+
+ if (args[ARG_duty_u16].u_int != VALUE_NOT_SET &&
+ args[ARG_duty_ns].u_int != VALUE_NOT_SET) {
+ mp_raise_ValueError(MP_ERROR_TEXT("PWM duty should be specified only in one format"));
+ }
+
+ self->frequency = (uint32_t)args[ARG_freq].u_int;
+
+ if (args[ARG_duty_u16].u_int != VALUE_NOT_SET) {
+ self->duty = args[ARG_duty_u16].u_int > 65535 ? 65535 : args[ARG_duty_u16].u_int;
+ self->duty_type = DUTY_U16;
+ } else if (args[ARG_duty_ns].u_int != VALUE_NOT_SET) {
+ pwm_duty_ns_assert(args[ARG_duty_ns].u_int, self->frequency);
+ self->duty = args[ARG_duty_ns].u_int;
+ self->duty_type = DUTY_NS;
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("PWM duty should be specified in either ns or u16"));
+ }
+
+ self->invert = args[ARG_invert].u_bool;
+
+ /* Apply frequency and duty cycle to the PWM config struct */
+ pwm_config(self);
+
+ /* Route the TCPWM output to the configured GPIO pin */
+ pwm_pin_config(self);
+
+ /* Program the shared 16-bit divider to PWM_TCPWM_CLK_HZ on the first PWM init, then
+ * connect it to this counter's PCLK input. All channels share divider CYBSP_PWM_LED_CTRL_CLK_DIV_NUM
+ * so the reprogramming only needs to happen once. */
+ if (!pwm_clk_configured) {
+ Cy_SysClk_PeriPclkDisableDivider((en_clk_dst_t)CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM,
+ CY_SYSCLK_DIV_16_BIT, CYBSP_PWM_LED_CTRL_CLK_DIV_NUM);
+ Cy_SysClk_PeriPclkSetDivider((en_clk_dst_t)CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM,
+ CY_SYSCLK_DIV_16_BIT, CYBSP_PWM_LED_CTRL_CLK_DIV_NUM, PWM_TCPWM_CLK_DIV_VAL);
+ Cy_SysClk_PeriPclkEnableDivider((en_clk_dst_t)CYBSP_PWM_LED_CTRL_CLK_DIV_GRP_NUM,
+ CY_SYSCLK_DIV_16_BIT, CYBSP_PWM_LED_CTRL_CLK_DIV_NUM);
+ pwm_clk_configured = true;
+ }
+ Cy_SysClk_PeriPclkAssignDivider(self->pclk_dst, CY_SYSCLK_DIV_16_BIT, CYBSP_PWM_LED_CTRL_CLK_DIV_NUM);
+
+ cy_en_tcpwm_status_t result = Cy_TCPWM_PWM_Init(TCPWM0,
+ self->counter_num, &self->pwm_obj);
+ pwm_assert_raise_val("PWM init failed with return code %lx !", result);
+
+ /* Enable the TCPWM block */
+ Cy_TCPWM_PWM_Enable(TCPWM0, self->counter_num);
+
+ /* Start the PWM */
+ Cy_TCPWM_TriggerReloadOrIndex_Single(TCPWM0, self->counter_num);
+}
+
+// Print a human-readable representation: pin name, frequency, and duty cycle percentage.
+static void mp_machine_pwm_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_pwm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "PWM(Pin.cpu.%q, freq=%u, duty=%.2f%%)",
+ self->pin->name,
+ self->frequency,
+ self->duty_type == DUTY_U16 ? pwm_duty_cycle_u16_to_percent(self->duty) : pwm_duty_cycle_ns_to_percent(self->duty, self->frequency));
+}
+
+// Constructor: resolve the pin, allocate an instance, apply the default PDL config, then call init_helper.
+static mp_obj_t mp_machine_pwm_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+
+ // Check number of arguments: dest is required
+ mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
+
+ // Resolve dest to a pin object (accepts Pin object, board name string, or CPU name string)
+ const machine_pin_obj_t *pin = machine_pin_get_pin_obj(args[0]);
+
+ // Reject if a PWM instance already exists for this pin
+ if (pwm_obj_find_by_pin(pin->port, pin->pin) != NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("PWM instance for Pin %q already exists, call deinit() first"), pin->name);
+ }
+
+ // Allocate a new instance from the PWM object pool.
+ machine_pwm_obj_t *self = pwm_obj_alloc();
+ if (self == NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("PWM: maximum number of instances (%d) reached"), MICROPY_PY_MACHINE_PWM_MAX_OBJS);
+ }
+
+ self->pin = pin;
+ self->counter_num = UINT32_MAX;
+ nlr_buf_t nl_af;
+ if (nlr_push(&nl_af) == 0) {
+ self->pin_af = pwm_pin_af_find_and_alloc(self);
+ nlr_pop();
+ } else {
+ if (self->counter_num != UINT32_MAX) {
+ // If a counter was tentatively allocated, it is released as well.
+ machine_tcpwm_counter_free(self->counter_num, MP_OBJ_FROM_PTR(self));
+ }
+ pwm_obj_free(self);
+ nlr_jump(nl_af.ret_val);
+ }
+
+ // Default config parameters for the PWM object.
+ self->pwm_obj.pwmMode = CY_TCPWM_PWM_MODE_PWM;
+ self->pwm_obj.clockPrescaler = CY_TCPWM_PWM_PRESCALER_DIVBY_1;
+ self->pwm_obj.pwmAlignment = CY_TCPWM_PWM_LEFT_ALIGN;
+ self->pwm_obj.deadTimeClocks = 0U;
+ self->pwm_obj.runMode = CY_TCPWM_PWM_CONTINUOUS;
+ self->pwm_obj.enablePeriodSwap = false;
+ self->pwm_obj.enableCompareSwap = false;
+ self->pwm_obj.interruptSources = 0U;
+ self->pwm_obj.invertPWMOutN = CY_TCPWM_PWM_INVERT_ENABLE;
+ self->pwm_obj.killMode = CY_TCPWM_PWM_ASYNC_KILL;
+ self->pwm_obj.swapInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U;
+ self->pwm_obj.swapInput = CY_TCPWM_INPUT_0;
+ self->pwm_obj.reloadInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U;
+ self->pwm_obj.reloadInput = CY_TCPWM_INPUT_0;
+ self->pwm_obj.startInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U;
+ self->pwm_obj.startInput = CY_TCPWM_INPUT_0;
+ self->pwm_obj.killInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U;
+ self->pwm_obj.killInput = CY_TCPWM_INPUT_0;
+ self->pwm_obj.countInputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U;
+ self->pwm_obj.countInput = CY_TCPWM_INPUT_1;
+ self->pwm_obj.swapOverflowUnderflow = false;
+ self->pwm_obj.immediateKill = false;
+ self->pwm_obj.tapsEnabled = CY_TCPWM_INPUT_0;
+ self->pwm_obj.compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT;
+ self->pwm_obj.compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT;
+ self->pwm_obj.enableCompare1Swap = false;
+ self->pwm_obj.compare0MatchUp = true;
+ self->pwm_obj.compare0MatchDown = false;
+ self->pwm_obj.compare1MatchUp = true;
+ self->pwm_obj.compare1MatchDown = false;
+ self->pwm_obj.kill1InputMode = CYBSP_PWM_LED_CTRL_INPUT_DISABLED & 0x3U;
+ self->pwm_obj.kill1Input = CY_TCPWM_INPUT_0;
+ self->pwm_obj.pwmOnDisable = CY_TCPWM_PWM_OUTPUT_HIGHZ;
+ self->pwm_obj.trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED;
+ self->pwm_obj.trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED;
+ self->pwm_obj.reloadLineSelect = false;
+ self->pwm_obj.line_out_sel = CY_TCPWM_OUTPUT_PWM_SIGNAL;
+ self->pwm_obj.linecompl_out_sel = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL;
+ self->pwm_obj.line_out_sel_buff = CY_TCPWM_OUTPUT_PWM_SIGNAL;
+ self->pwm_obj.linecompl_out_sel_buff = CY_TCPWM_OUTPUT_INVERTED_PWM_SIGNAL;
+ self->pwm_obj.deadTimeClocks_linecompl_out = 0U;
+
+ // Process the remaining parameters (skip dest at args[0]).
+ mp_map_t kw_args;
+ mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
+
+ // If allocation or init raises, free the counter and pool slot so they can be reused.
+ nlr_buf_t nl;
+ if (nlr_push(&nl) == 0) {
+ mp_machine_pwm_init_helper(self, n_args - 1, args + 1, &kw_args);
+ nlr_pop();
+ } else {
+ machine_tcpwm_counter_free(self->counter_num, MP_OBJ_FROM_PTR(self));
+ pwm_pin_restore(self->pin);
+ pwm_obj_free(self);
+ nlr_jump(nl.ret_val);
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+// Disable the TCPWM counter, restore the GPIO pin to Hi-Z, and free the instance slot.
+static void mp_machine_pwm_deinit(machine_pwm_obj_t *self) {
+ Cy_TCPWM_PWM_Disable(TCPWM0, self->counter_num);
+ pwm_pin_restore(self->pin);
+ machine_tcpwm_counter_free(self->counter_num, MP_OBJ_FROM_PTR(self));
+ pwm_obj_free(self);
+}
+
+// Return the current PWM output frequency in Hz.
+static mp_obj_t mp_machine_pwm_freq_get(machine_pwm_obj_t *self) {
+ return MP_OBJ_NEW_SMALL_INT(self->frequency);
+}
+
+// Update the PWM output frequency; recalculates the period register.
+static void mp_machine_pwm_freq_set(machine_pwm_obj_t *self, mp_int_t freq) {
+ if (freq <= 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("PWM frequency must be greater than 0"));
+ }
+ if ((uint32_t)freq > PWM_TCPWM_CLK_HZ / 2) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("PWM frequency must not exceed %lu Hz"), (unsigned long)(PWM_TCPWM_CLK_HZ / 2));
+ }
+ if (self->duty_type == DUTY_NS) {
+ pwm_duty_ns_assert(self->duty, (uint32_t)freq);
+ }
+
+ // set the frequency
+ self->frequency = (uint32_t)freq;
+
+ /* Apply frequency and duty cycle to the PWM config struct */
+ pwm_config(self);
+
+ // Reconfigure and restart the TCPWM counter with the new config.
+ pwm_restart(self);
+}
+
+// Return the current duty cycle as a 16-bit value (0-65535).
+static mp_obj_t mp_machine_pwm_duty_get_u16(machine_pwm_obj_t *self) {
+ if (self->duty_type == DUTY_U16) {
+ return MP_OBJ_NEW_SMALL_INT(self->duty);
+ }
+ // Convert stored duty_ns to u16
+ return MP_OBJ_NEW_SMALL_INT(pwm_duty_cycle_ns_to_u16(self->duty, self->frequency));
+}
+
+// Set the duty cycle from a 16-bit value (0-65535).
+static void mp_machine_pwm_duty_set_u16(machine_pwm_obj_t *self, mp_int_t duty_u16) {
+ self->duty = duty_u16 > 65535 ? 65535 : duty_u16;
+ self->duty_type = DUTY_U16;
+
+ pwm_config(self);
+ pwm_restart(self);
+}
+
+// Return the current on-time duty cycle in nanoseconds.
+static mp_obj_t mp_machine_pwm_duty_get_ns(machine_pwm_obj_t *self) {
+ if (self->duty_type == DUTY_NS) {
+ return MP_OBJ_NEW_SMALL_INT(self->duty);
+ }
+ // Convert stored duty_u16 to nanoseconds
+ return MP_OBJ_NEW_SMALL_INT(pwm_duty_cycle_u16_to_ns(self->duty, self->frequency));
+}
+
+// Set the duty cycle as an on-time in nanoseconds.
+static void mp_machine_pwm_duty_set_ns(machine_pwm_obj_t *self, mp_int_t duty_ns) {
+ pwm_duty_ns_assert(duty_ns, self->frequency);
+
+ self->duty = duty_ns;
+ self->duty_type = DUTY_NS;
+
+ pwm_config(self);
+ pwm_restart(self);
+}
diff --git a/ports/psoc-edge/machine_rtc.c b/ports/psoc-edge/machine_rtc.c
new file mode 100644
index 00000000000..5cd33c2b874
--- /dev/null
+++ b/ports/psoc-edge/machine_rtc.c
@@ -0,0 +1,592 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021 "Krzysztof Adamski"
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+
+// std includes
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+// micropython includes
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "py/mperrno.h"
+#include "shared/timeutils/timeutils.h"
+#include "py/misc.h"
+
+// port-specific includes
+#include "modmachine.h"
+
+#include "cy_rtc.h"
+#include "cybsp.h"
+
+#define RTC_INIT_YEAR 15 /* 2015 = 2000 + 15 (RTC hardware stores 0-99) */
+#define RTC_INIT_MONTH 1 /* January */
+#define RTC_INIT_MDAY 1
+#define RTC_INIT_WDAY 4 /* Thursday */
+#define RTC_INIT_HOUR 0
+#define RTC_INIT_MINUTE 0
+#define RTC_INIT_SECOND 0
+#define RTC_INIT_DST 0
+
+#define RTC_CENTURY (2000u) /* RTC hardware supports years 0-99 = 2000-2099 */
+#define RTC_ACCESS_RETRY_COUNT (500U)
+#define RTC_RETRY_DELAY_MS (5U)
+
+#define RTC_BREG_WORDS (8U)
+#define RTC_BREG_META_INDEX (RTC_BREG_WORDS - 1U)
+#define RTC_BREG_DATA_WORDS (RTC_BREG_WORDS - 1U)
+#define RTC_BREG_MAGIC (0x5254U)
+
+#ifndef MICROPY_HW_RTC_USER_MEM_MAX
+#define MICROPY_HW_RTC_USER_MEM_MAX (RTC_BREG_DATA_WORDS * 4U)
+#endif
+
+#define rtc_assert_raise(msg, ret) if (ret != CY_RSLT_SUCCESS) { \
+ mp_raise_ValueError(MP_ERROR_TEXT(msg)); \
+}
+
+typedef struct _machine_rtc_obj_t {
+ mp_obj_base_t base;
+ mp_obj_t callback;
+ uint64_t alarm_period_s;
+ uint64_t alarm_elapse_time_s;
+ bool alarmset;
+ bool repeat;
+ volatile bool time_updated;
+} machine_rtc_obj_t;
+
+void srss_interrupt_rtc_IRQHandler(void);
+
+// singleton RTC object
+static machine_rtc_obj_t machine_rtc_obj = {
+ .base = {&machine_rtc_type},
+ .callback = NULL,
+ .alarm_period_s = 0,
+ .alarm_elapse_time_s = 0,
+ .alarmset = false,
+ .repeat = false,
+ .time_updated = true,
+};
+
+static bool rtc_irq_initialized = false;
+
+static inline void machine_rtc_mark_time_updated(void) {
+ machine_rtc_obj.time_updated = true;
+}
+
+bool machine_rtc_read_and_clear_time_updated(void) {
+ bool updated = machine_rtc_obj.time_updated;
+ machine_rtc_obj.time_updated = false;
+ return updated;
+}
+
+static inline uint32_t rtc_breg_read(uint32_t index) {
+ return BACKUP_BREG_SET2[index];
+}
+
+static inline void rtc_breg_write(uint32_t index, uint32_t value) {
+ BACKUP_BREG_SET2[index] = value;
+}
+
+static void rtc_interrupt_init(void) {
+ if (rtc_irq_initialized) {
+ return;
+ }
+
+ cy_stc_sysint_t intr_cfg = {
+ srss_interrupt_rtc_IRQn,
+ 3,
+ };
+
+ cy_en_sysint_status_t rslt = Cy_SysInt_Init(&intr_cfg, srss_interrupt_rtc_IRQHandler);
+ if (rslt != CY_SYSINT_SUCCESS) {
+ mp_raise_ValueError(MP_ERROR_TEXT("RTC IRQ init failed"));
+ }
+
+ rtc_irq_initialized = true;
+}
+
+static bool rtc_validate_date_time(int sec, int min, int hour, int mday, int month, int year_full) {
+ if (year_full < RTC_CENTURY || year_full > RTC_CENTURY + 99) {
+ return false;
+ }
+ if (month < 1 || month > 12) {
+ return false;
+ }
+ if (mday < 1) {
+ return false;
+ }
+ if (hour < 0 || hour > 23) {
+ return false;
+ }
+ if (min < 0 || min > 59) {
+ return false;
+ }
+ if (sec < 0 || sec > 59) {
+ return false;
+ }
+
+ static const uint8_t days_in_month_table[12] = {
+ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
+ };
+ uint8_t days_in_month = days_in_month_table[month - 1];
+ if (month == 2 && Cy_RTC_IsLeapYear((uint32_t)year_full)) {
+ days_in_month++;
+ }
+
+ return mday <= days_in_month;
+}
+
+void machine_rtc_get_datetime(timeutils_struct_time_t *time) {
+ cy_stc_rtc_config_t current_date_time = {0};
+ Cy_RTC_GetDateAndTime(¤t_date_time);
+
+ time->tm_year = current_date_time.year + RTC_CENTURY;
+ time->tm_mon = current_date_time.month;
+ time->tm_mday = current_date_time.date;
+ time->tm_hour = current_date_time.hour;
+ time->tm_min = current_date_time.min;
+ time->tm_sec = current_date_time.sec;
+ time->tm_wday = current_date_time.dayOfWeek - 1u;
+ time->tm_yday = timeutils_year_day(current_date_time.year + RTC_CENTURY, current_date_time.month, current_date_time.date);
+}
+
+void machine_rtc_init_all(void) {
+ /* Variable used to store return status of RTC API */
+ cy_en_rtc_status_t rtc_status;
+ uint32_t rtc_access_retry = RTC_ACCESS_RETRY_COUNT;
+
+ /* RTC block doesn't allow to access, when synchronizing the user registers
+ * and the internal actual RTC registers. It will return RTC_BUSY value, if
+ * it is not available to update the configuration values. Needs to retry,
+ * if it doesn't return CY_RTC_SUCCESS. */
+
+ do
+ {
+ rtc_status = Cy_RTC_Init(&CYBSP_RTC_config);
+ rtc_access_retry--;
+ Cy_SysLib_Delay(RTC_RETRY_DELAY_MS);
+ } while ((rtc_status != CY_RTC_SUCCESS) && (rtc_access_retry != 0));
+
+ if (rtc_status == CY_RTC_SUCCESS) {
+ machine_rtc_mark_time_updated();
+ }
+}
+
+// Helper function to set/get datetime
+// Note: The weekday field is always auto-calculated by the RTC hardware based on the date.
+// Even if an invalid weekday is provided in the input tuple, it will be recalculated and
+// overwritten with the correct value. datetime() does not raise an error for incorrect
+// weekday values - the hardware ensures weekday always matches the actual calendar date.
+static mp_obj_t machine_rtc_datetime_helper(mp_uint_t n_args, const mp_obj_t *args) {
+ if (n_args == 1) {
+ /* Get the current date and time */
+ timeutils_struct_time_t time;
+ machine_rtc_get_datetime(&time);
+ mp_obj_t tuple[8] = {
+ mp_obj_new_int(time.tm_year),
+ mp_obj_new_int(time.tm_mon),
+ mp_obj_new_int(time.tm_mday),
+ mp_obj_new_int(time.tm_wday + 1u),
+ mp_obj_new_int(time.tm_hour),
+ mp_obj_new_int(time.tm_min),
+ mp_obj_new_int(time.tm_sec),
+ mp_obj_new_int(0),
+ };
+ return mp_obj_new_tuple(8, tuple);
+ } else {
+ // Set date and time using direct API
+ mp_obj_t *items;
+ mp_obj_get_array_fixed_n(args[1], 8, &items);
+
+ int year_full = mp_obj_get_int(items[0]);
+ int month = mp_obj_get_int(items[1]);
+ int date = mp_obj_get_int(items[2]);
+ // items[3] is dayOfWeek - ignored and auto-calculated by RTC hardware
+ // The hardware will compute the correct weekday from the year/month/date
+ int hour = mp_obj_get_int(items[4]);
+ int min = mp_obj_get_int(items[5]);
+ int sec = mp_obj_get_int(items[6]);
+
+ if (!rtc_validate_date_time(sec, min, hour, date, month, year_full)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid date/time"));
+ }
+
+ uint32_t year = year_full - RTC_CENTURY;
+ Cy_RTC_SetDateAndTimeDirect(sec, min, hour, date, month, year);
+ machine_rtc_mark_time_updated();
+ }
+ return mp_const_none;
+}
+
+// Helper to convert datetime tuple to seconds since epoch
+static inline uint64_t rtc_get_datetime_in_sec(mp_obj_t datetime) {
+ size_t len;
+ mp_obj_t *elem;
+ mp_obj_get_array(datetime, &len, &elem);
+
+ // Expect tuple of length 8
+ if (len < 8 || len > 9) {
+ mp_raise_TypeError(MP_ERROR_TEXT("datetime tuple needs length 8 or 9"));
+ }
+
+ // Format: (year, month, day, weekday, hour, minute, second, subseconds)
+ return timeutils_mktime(mp_obj_get_int(elem[0]),
+ mp_obj_get_int(elem[1]), mp_obj_get_int(elem[2]),
+ mp_obj_get_int(elem[4]), mp_obj_get_int(elem[5]), mp_obj_get_int(elem[6]));
+}
+
+// Helper to get current time as seconds since epoch
+static inline uint64_t rtc_get_current_time_in_sec() {
+ mp_obj_t datetime = machine_rtc_datetime_helper(1, NULL);
+
+ size_t len;
+ mp_obj_t *elem;
+ mp_obj_get_array(datetime, &len, &elem);
+
+ // Expect tuple of length 8
+ if (len < 8 || len > 9) {
+ mp_raise_TypeError(MP_ERROR_TEXT("datetime tuple needs length 8 or 9"));
+ }
+
+ // Format: (year, month, day, weekday, hour, minute, second, subseconds)
+ // Note: elem[0] is already full year (2000-2099), not year since 1900
+ return timeutils_mktime(mp_obj_get_int(elem[0]),
+ mp_obj_get_int(elem[1]), mp_obj_get_int(elem[2]),
+ mp_obj_get_int(elem[4]), mp_obj_get_int(elem[5]), mp_obj_get_int(elem[6]));
+}
+
+
+/* Forward declarations */
+static void rtc_irq_handler(void *self_in, uint32_t event);
+static void rtc_alarm_setup(machine_rtc_obj_t *self);
+
+/* Override weak PDL alarm interrupt handler */
+void Cy_RTC_Alarm1Interrupt(void) {
+ /* Call our MicroPython callback handler */
+ rtc_irq_handler(&machine_rtc_obj, 0);
+}
+
+/* Hardware RTC interrupt handler (called by NVIC) - must match IRQn naming */
+void srss_interrupt_rtc_IRQHandler(void) {
+ /* Use PDL middleware to dispatch to specific alarm/DST handlers */
+ Cy_RTC_Interrupt(NULL, false); /* NULL = no DST, false = normal mode */
+}
+
+/* Setup alarm hardware to trigger at the specified time */
+static void rtc_alarm_setup(machine_rtc_obj_t *self) {
+ if (!self->alarmset) {
+ return;
+ }
+
+ /* Get the alarm time in seconds since epoch */
+ uint64_t alarm_time_s = self->alarm_elapse_time_s;
+
+ /* Convert seconds since epoch to datetime components */
+ timeutils_struct_time_t tm;
+ timeutils_seconds_since_epoch_to_struct_time(alarm_time_s, &tm);
+
+ /* Set the alarm using PDL direct API (no year field in alarm, matches recurring time) */
+ cy_en_rtc_status_t status = Cy_RTC_SetAlarmDateAndTimeDirect(
+ tm.tm_sec, tm.tm_min, tm.tm_hour,
+ tm.tm_mday, tm.tm_mon, CY_RTC_ALARM_1);
+
+ if (status != CY_RTC_SUCCESS) {
+ mp_raise_ValueError(MP_ERROR_TEXT("failed to set alarm"));
+ }
+
+ /* Enable RTC ALARM1 interrupt */
+ Cy_RTC_ClearInterrupt(CY_RTC_INTR_MASK);
+ Cy_RTC_SetInterruptMask(CY_RTC_INTR_ALARM1);
+
+ /* Initialize and enable NVIC interrupt for RTC */
+ rtc_interrupt_init();
+ NVIC_ClearPendingIRQ(srss_interrupt_rtc_IRQn);
+ NVIC_EnableIRQ(srss_interrupt_rtc_IRQn);
+}
+
+/* Software IRQ handler callback */
+void rtc_irq_handler(void *self_in, uint32_t event) {
+ machine_rtc_obj_t *self = (machine_rtc_obj_t *)self_in;
+
+ if (self->alarmset && self->repeat) {
+ self->alarm_elapse_time_s += self->alarm_period_s;
+ rtc_alarm_setup(self);
+ } else {
+ self->alarmset = false;
+ Cy_RTC_SetInterruptMask(0);
+ Cy_RTC_ClearInterrupt(CY_RTC_INTR_MASK);
+ NVIC_ClearPendingIRQ(srss_interrupt_rtc_IRQn);
+ }
+
+ if (self->callback != NULL) {
+ mp_sched_schedule(self->callback, MP_OBJ_FROM_PTR(self));
+ }
+}
+
+
+// MicroPython bindings for RTC class
+static mp_obj_t machine_rtc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 0, 0, false);
+ return (mp_obj_t)&machine_rtc_obj;
+}
+
+static mp_obj_t machine_rtc_init(mp_obj_t self_in, mp_obj_t datetime) {
+ machine_rtc_obj_t *self = (machine_rtc_obj_t *)self_in;
+ self->alarm_elapse_time_s = 0;
+ self->alarm_period_s = 0;
+ self->alarmset = false;
+ self->callback = NULL;
+ self->repeat = false;
+
+ mp_obj_t args[2] = {self_in, datetime};
+ machine_rtc_datetime_helper(2, args);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(machine_rtc_init_obj, machine_rtc_init);
+
+static mp_obj_t machine_rtc_deinit(mp_obj_t self_in) {
+ /* Resets RTC to 1st Jan' 2015 as mentioned in MPY guide*/
+ Cy_RTC_SetDateAndTimeDirect(RTC_INIT_SECOND, RTC_INIT_MINUTE, RTC_INIT_HOUR,
+ RTC_INIT_MDAY, RTC_INIT_MONTH, RTC_INIT_YEAR);
+ machine_rtc_mark_time_updated();
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_rtc_deinit_obj, machine_rtc_deinit);
+
+static mp_obj_t machine_rtc_datetime(mp_uint_t n_args, const mp_obj_t *datetime) {
+ return machine_rtc_datetime_helper(n_args, datetime);
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_rtc_datetime_obj, 1, 2, machine_rtc_datetime);
+
+static mp_obj_t machine_rtc_now(mp_obj_t self_in) {
+ return machine_rtc_datetime_helper(1, NULL);
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_rtc_now_obj, machine_rtc_now);
+
+static mp_obj_t machine_rtc_alarm(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_time, MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ { MP_QSTR_repeat, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
+ };
+
+ // Parse args
+ uint64_t dtime_sec;
+ machine_rtc_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ uint64_t alarm_set_time_s = rtc_get_current_time_in_sec();
+
+ self->repeat = args[1].u_bool;
+
+ if (args[0].u_obj == mp_const_none) {
+ mp_raise_ValueError(MP_ERROR_TEXT("missing alarm time"));
+ }
+
+ if (mp_obj_is_type(args[0].u_obj, &mp_type_tuple)) { // datetime tuple given
+ // repeat cannot be used with a datetime tuple
+ if (self->repeat) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid argument(s) value"));
+ }
+ dtime_sec = rtc_get_datetime_in_sec(args[0].u_obj);
+ if (dtime_sec < alarm_set_time_s) {
+ mp_raise_ValueError(MP_ERROR_TEXT("alarm time in past"));
+ }
+ self->alarm_period_s = dtime_sec - alarm_set_time_s;
+ } else { // then it must be an integer
+ int64_t delay_ms = mp_obj_get_int(args[0].u_obj);
+ if (delay_ms <= 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("time must be > 0"));
+ }
+ self->alarm_period_s = ((uint64_t)delay_ms + 999) / 1000;
+ }
+ self->alarm_elapse_time_s = alarm_set_time_s + self->alarm_period_s;
+ self->alarmset = true;
+
+ /* Configure hardware alarm */
+ rtc_alarm_setup(self);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(machine_rtc_alarm_obj, 1, machine_rtc_alarm);
+
+static mp_obj_t machine_rtc_alarm_left(size_t n_args, const mp_obj_t *args) {
+ machine_rtc_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ // only alarm id 0 is available
+ if (n_args > 1 && mp_obj_get_int(args[1]) != 0) {
+ mp_raise_OSError(MP_ENODEV);
+ }
+ if (self->alarmset) {
+ uint64_t curr_time = rtc_get_current_time_in_sec();
+ uint64_t alarm_time = self->alarm_elapse_time_s;
+ return mp_obj_new_int_from_uint((alarm_time >= curr_time) ? ((alarm_time - curr_time) * 1000) : 0);
+ }
+ mp_raise_ValueError(MP_ERROR_TEXT("alarm not set"));
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_rtc_alarm_left_obj, 1, 2, machine_rtc_alarm_left);
+
+static mp_obj_t machine_rtc_alarm_cancel(size_t n_args, const mp_obj_t *args) {
+ machine_rtc_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ // only alarm id 0 is available
+ if (n_args > 1 && mp_obj_get_int(args[1]) != 0) {
+ mp_raise_OSError(MP_ENODEV);
+ }
+
+ /* Disable the hardware alarm */
+ Cy_RTC_SetInterruptMask(0); /* Disable all RTC interrupts */
+ Cy_RTC_ClearInterrupt(CY_RTC_INTR_ALARM1); /* Clear any pending */
+ NVIC_DisableIRQ(srss_interrupt_rtc_IRQn);
+
+ /* Clear software alarm state */
+ self->alarmset = false;
+ self->repeat = false;
+ self->alarm_period_s = 0;
+ self->alarm_elapse_time_s = 0;
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_rtc_alarm_cancel_obj, 1, 2, machine_rtc_alarm_cancel);
+
+static mp_obj_t machine_rtc_memory(size_t n_args, const mp_obj_t *args) {
+ if (n_args == 1) {
+ Cy_RTC_SyncFromRtc();
+
+ uint32_t meta = rtc_breg_read(RTC_BREG_META_INDEX);
+ uint32_t magic = (meta >> 16) & 0xFFFFU;
+ uint32_t stored_len = meta & 0xFFFFU;
+
+ if ((magic != RTC_BREG_MAGIC) || (stored_len > MICROPY_HW_RTC_USER_MEM_MAX)) {
+ return mp_obj_new_bytes((const uint8_t *)"", 0);
+ }
+
+ uint8_t data[MICROPY_HW_RTC_USER_MEM_MAX] = {0};
+ for (uint32_t index = 0; index < RTC_BREG_DATA_WORDS; ++index) {
+ uint32_t value = rtc_breg_read(index);
+ data[index * 4U + 0U] = (uint8_t)((value >> 0U) & 0xFFU);
+ data[index * 4U + 1U] = (uint8_t)((value >> 8U) & 0xFFU);
+ data[index * 4U + 2U] = (uint8_t)((value >> 16U) & 0xFFU);
+ data[index * 4U + 3U] = (uint8_t)((value >> 24U) & 0xFFU);
+ }
+
+ return mp_obj_new_bytes(data, stored_len);
+ }
+
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
+
+ if (bufinfo.len > MICROPY_HW_RTC_USER_MEM_MAX) {
+ mp_raise_ValueError(MP_ERROR_TEXT("buffer too long"));
+ }
+
+ cy_en_rtc_status_t write_status = Cy_RTC_WriteEnable(CY_RTC_WRITE_ENABLED);
+ if (write_status != CY_RTC_SUCCESS) {
+ mp_raise_ValueError(MP_ERROR_TEXT("RTC memory write unavailable"));
+ }
+
+ uint8_t data[MICROPY_HW_RTC_USER_MEM_MAX] = {0};
+ memcpy(data, bufinfo.buf, bufinfo.len);
+
+ for (uint32_t index = 0; index < RTC_BREG_DATA_WORDS; ++index) {
+ uint32_t value = ((uint32_t)data[index * 4U + 0U] << 0U)
+ | ((uint32_t)data[index * 4U + 1U] << 8U)
+ | ((uint32_t)data[index * 4U + 2U] << 16U)
+ | ((uint32_t)data[index * 4U + 3U] << 24U);
+ rtc_breg_write(index, value);
+ }
+
+ uint32_t meta = (RTC_BREG_MAGIC << 16) | ((uint32_t)bufinfo.len & 0xFFFFU);
+ rtc_breg_write(RTC_BREG_META_INDEX, meta);
+
+ write_status = Cy_RTC_WriteEnable(CY_RTC_WRITE_DISABLED);
+ if (write_status != CY_RTC_SUCCESS) {
+ mp_raise_ValueError(MP_ERROR_TEXT("RTC memory write finalize failed"));
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_rtc_memory_obj, 1, 2, machine_rtc_memory);
+
+static mp_obj_t machine_rtc_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_trigger, ARG_handler, ARG_wake };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_trigger, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_handler, MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_wake, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+ machine_rtc_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+
+ self->callback = args[ARG_handler].u_obj;
+ if (args[ARG_handler].u_obj == mp_const_none) {
+ self->callback = NULL;
+ }
+
+ if (args[ARG_trigger].u_int != 0) {
+ mp_raise_OSError(MP_ENODEV);
+ }
+
+ if (args[ARG_wake].u_int != -1) {
+ mp_raise_NotImplementedError(MP_ERROR_TEXT("wake not implemented"));
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(machine_rtc_irq_obj, 1, machine_rtc_irq);
+
+static const mp_rom_map_elem_t machine_rtc_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_rtc_deinit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_rtc_init_obj) },
+ { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_rtc_deinit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_datetime), MP_ROM_PTR(&machine_rtc_datetime_obj) },
+ { MP_ROM_QSTR(MP_QSTR_now), MP_ROM_PTR(&machine_rtc_now_obj) },
+ { MP_ROM_QSTR(MP_QSTR_alarm), MP_ROM_PTR(&machine_rtc_alarm_obj) },
+ { MP_ROM_QSTR(MP_QSTR_alarm_left), MP_ROM_PTR(&machine_rtc_alarm_left_obj) },
+ { MP_ROM_QSTR(MP_QSTR_alarm_cancel), MP_ROM_PTR(&machine_rtc_alarm_cancel_obj) },
+ { MP_ROM_QSTR(MP_QSTR_cancel), MP_ROM_PTR(&machine_rtc_alarm_cancel_obj) },
+ { MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_rtc_irq_obj) },
+ { MP_ROM_QSTR(MP_QSTR_memory), MP_ROM_PTR(&machine_rtc_memory_obj)},
+ { MP_ROM_QSTR(MP_QSTR_ALARM0), MP_ROM_INT(0) },
+
+};
+static MP_DEFINE_CONST_DICT(machine_rtc_locals_dict, machine_rtc_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_rtc_type,
+ MP_QSTR_RTC,
+ MP_TYPE_FLAG_NONE,
+ make_new, machine_rtc_make_new,
+ locals_dict, &machine_rtc_locals_dict
+ );
diff --git a/ports/psoc-edge/machine_scb.c b/ports/psoc-edge/machine_scb.c
new file mode 100644
index 00000000000..b4ed29a9014
--- /dev/null
+++ b/ports/psoc-edge/machine_scb.c
@@ -0,0 +1,245 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "mpconfigport.h"
+
+#if MICROPY_PY_MACHINE_I2C || MICROPY_PY_MACHINE_I2C_TARGET || MICROPY_PY_MACHINE_SPI || MICROPY_PY_MACHINE_SPI_TARGET || MICROPY_PY_MACHINE_UART
+
+#include "py/runtime.h"
+#include "cy_sysclk.h"
+#include "genhdr/pins_af.h"
+#include "machine_scb.h"
+
+/* Forward declaration */
+static void machine_scb_irq_handler(uint8_t scb);
+
+#define DEFINE_SCB_IRQ_HANDLER(scb) \
+ void SCB##scb##_IRQ_Handler(void) { \
+ machine_scb_irq_handler(scb); \
+ }
+
+/**
+ * The file build-/genhdr/pins_af.h contains the macro
+ *
+ * MICROPY_PY_MACHINE_FOR_ALL_SCB(DO)
+ *
+ * which uses the X-macro (as argument) pattern to pass a worker
+ * macro DO(port) for the list of all user available ports.
+ *
+ * The available (not hidden) user SCBs are those alternate
+ * functions defined in the boards/pse8x_af.csv file, for which
+ * the corresponding pin are available for the user.
+ * The available pins are those defined in the
+ * boards//pins.csv file, which are not prefixed
+ * with a hyphen(-).
+ * See tools/boardgen.py and psoc-edge/boards/make-pins.py
+ * for more information.
+ */
+
+MICROPY_PY_MACHINE_FOR_ALL_SCB(DEFINE_SCB_IRQ_HANDLER)
+
+#define MAP_SCB_IRQ_CONFIG(scb) \
+ [scb] = { \
+ scb, \
+ SCB##scb, \
+ { \
+ scb_##scb##_interrupt_IRQn, \
+ SYS_INT_IRQ_LOWEST_PRIORITY, \
+ SCB##scb##_IRQ_Handler \
+ }, \
+ PCLK_SCB##scb##_CLOCK_SCB_EN, \
+ CY_MMIO_SCB##scb##_PERI_NR, \
+ CY_MMIO_SCB##scb##_GROUP_NR, \
+ CY_MMIO_SCB##scb##_SLAVE_NR, \
+ CY_MMIO_SCB##scb##_CLK_HF_NR, \
+ NULL, \
+ NULL, \
+ },
+
+static machine_scb_obj_t machine_scb_obj[MICROPY_PY_MACHINE_SCB_NUM_ENTRIES] = {
+ MICROPY_PY_MACHINE_FOR_ALL_SCB(MAP_SCB_IRQ_CONFIG)
+};
+
+typedef struct {
+ uint32_t peri_nr;
+ uint32_t group_nr;
+ uint32_t slave_nr;
+ uint32_t clk_hf_nr;
+} machine_scb_group_info_t;
+
+#define MAP_SCB_GROUP_INFO(scb) \
+ [scb] = { \
+ .peri_nr = CY_MMIO_SCB##scb##_PERI_NR, \
+ .group_nr = CY_MMIO_SCB##scb##_GROUP_NR, \
+ .slave_nr = CY_MMIO_SCB##scb##_SLAVE_NR, \
+ .clk_hf_nr = CY_MMIO_SCB##scb##_CLK_HF_NR, \
+ },
+
+static const machine_scb_group_info_t machine_scb_group_info[MICROPY_PY_MACHINE_SCB_NUM_ENTRIES] = {
+ MICROPY_PY_MACHINE_FOR_ALL_SCB(MAP_SCB_GROUP_INFO)
+};
+
+typedef struct {
+ const void *owner;
+ en_clk_dst_t clk_dst;
+ uint8_t div_num;
+} machine_scb_div8_alloc_t;
+
+static machine_scb_div8_alloc_t machine_scb_div8_alloc[MICROPY_PY_MACHINE_SCB_NUM_ENTRIES] = {0};
+
+static inline uint32_t machine_scb_div8_count_for_clk(en_clk_dst_t clk_dst) {
+ uint32_t grp_num = (((uint32_t)clk_dst) & PERI_PCLK_GR_NUM_Msk) >> PERI_PCLK_GR_NUM_Pos;
+ uint32_t inst_num = (((uint32_t)clk_dst) & PERI_PCLK_INST_NUM_Msk) >> PERI_PCLK_INST_NUM_Pos;
+ return PERI_PCLK_GR_DIV_8_NR(inst_num, grp_num);
+}
+
+static inline bool machine_scb_same_divider_group(en_clk_dst_t clk_a, en_clk_dst_t clk_b) {
+ uint32_t a_grp = (((uint32_t)clk_a) & PERI_PCLK_GR_NUM_Msk) >> PERI_PCLK_GR_NUM_Pos;
+ uint32_t a_inst = (((uint32_t)clk_a) & PERI_PCLK_INST_NUM_Msk) >> PERI_PCLK_INST_NUM_Pos;
+ uint32_t b_grp = (((uint32_t)clk_b) & PERI_PCLK_GR_NUM_Msk) >> PERI_PCLK_GR_NUM_Pos;
+ uint32_t b_inst = (((uint32_t)clk_b) & PERI_PCLK_INST_NUM_Msk) >> PERI_PCLK_INST_NUM_Pos;
+ return (a_grp == b_grp) && (a_inst == b_inst);
+}
+
+static void machine_scb_irq_handler(uint8_t scb) {
+ machine_scb_obj_t *scb_obj = &machine_scb_obj[scb];
+ if (scb_obj->parent != NULL && scb_obj->parent_handler != NULL) {
+ scb_obj->parent_handler(scb_obj->parent);
+ }
+}
+
+machine_scb_obj_t *machine_scb_obj_alloc(uint8_t scb, mp_obj_t parent, machine_scb_parent_irq_handler_t handler) {
+ machine_scb_obj_t *obj = &machine_scb_obj[scb];
+ if (obj->parent != NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SCB %u is already in use by another I2C, SPI or UART instance."), scb);
+ }
+ /*
+ * Enable the peripheral clock gate for this SCB. The BSP's
+ * cycfg_config_reservations() only does this for the SCBs that are
+ * configured in the board design (e.g. the debug UART). Any SCB
+ * that was not pre-configured will have its clock gate disabled, and
+ * attempting to read or write its registers stalls the AHB bus,
+ * causing a hard lock-up. Calling this for already-enabled SCBs is
+ * idempotent.
+ */
+ Cy_SysClk_PeriGroupSlaveInit(obj->peri_nr, obj->group_nr, obj->slave_nr, obj->clk_hf_nr);
+ obj->parent = parent;
+ obj->parent_handler = handler;
+ return &machine_scb_obj[scb];
+}
+
+void machine_scb_obj_free(machine_scb_obj_t *scb) {
+ scb->parent = NULL;
+ scb->parent_handler = NULL;
+ Cy_SysClk_PeriGroupSlaveDeinit(scb->peri_nr, scb->group_nr, scb->slave_nr);
+}
+
+bool machine_scb_is_free(uint8_t scb) {
+ return machine_scb_obj[scb].parent == NULL;
+
+}
+
+void machine_scb_enable_group(uint8_t scb) {
+ const machine_scb_group_info_t *gi = &machine_scb_group_info[scb];
+ Cy_SysClk_PeriGroupSlaveInit(gi->peri_nr, gi->group_nr,
+ gi->slave_nr, gi->clk_hf_nr);
+}
+
+void machine_scb_peri_pclk_config_divider(en_clk_dst_t clk_dst,
+ cy_en_divider_types_t div_type, uint8_t div_num, uint32_t div_val) {
+ Cy_SysClk_PeriPclkDisableDivider(clk_dst, div_type, div_num);
+ Cy_SysClk_PeriPclkAssignDivider(clk_dst, div_type, div_num);
+ Cy_SysClk_PeriPclkSetDivider(clk_dst, div_type, div_num, div_val);
+ Cy_SysClk_PeriPclkEnableDivider(clk_dst, div_type, div_num);
+}
+
+bool machine_scb_div8_try_alloc(en_clk_dst_t clk_dst, uint8_t div_base, uint8_t div_invalid,
+ const void *owner, uint8_t *div_num_out) {
+ uint32_t max_div = machine_scb_div8_count_for_clk(clk_dst);
+ if (div_base >= max_div || div_num_out == NULL || owner == NULL) {
+ return false;
+ }
+
+ for (uint32_t div = div_base; div < max_div; ++div) {
+ if (div > div_invalid) {
+ break;
+ }
+
+ bool used = false;
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SCB_NUM_ENTRIES; i++) {
+ if (machine_scb_div8_alloc[i].owner == NULL) {
+ continue;
+ }
+ if (!machine_scb_same_divider_group(machine_scb_div8_alloc[i].clk_dst, clk_dst)) {
+ continue;
+ }
+ if (machine_scb_div8_alloc[i].div_num == (uint8_t)div) {
+ used = true;
+ break;
+ }
+ }
+
+ if (!used) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SCB_NUM_ENTRIES; i++) {
+ if (machine_scb_div8_alloc[i].owner == NULL) {
+ machine_scb_div8_alloc[i].owner = owner;
+ machine_scb_div8_alloc[i].clk_dst = clk_dst;
+ machine_scb_div8_alloc[i].div_num = (uint8_t)div;
+ *div_num_out = (uint8_t)div;
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ return false;
+}
+
+void machine_scb_div8_free(en_clk_dst_t clk_dst, uint8_t div_num, const void *owner) {
+ if (owner == NULL) {
+ return;
+ }
+
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SCB_NUM_ENTRIES; i++) {
+ if (machine_scb_div8_alloc[i].owner != owner) {
+ continue;
+ }
+ if (machine_scb_div8_alloc[i].div_num != div_num) {
+ continue;
+ }
+ if (!machine_scb_same_divider_group(machine_scb_div8_alloc[i].clk_dst, clk_dst)) {
+ continue;
+ }
+
+ machine_scb_div8_alloc[i].owner = NULL;
+ machine_scb_div8_alloc[i].div_num = 0;
+ machine_scb_div8_alloc[i].clk_dst = 0;
+ return;
+ }
+}
+
+#endif // MICROPY_PY_MACHINE_I2C || MICROPY_PY_MACHINE_I2C_TARGET || MICROPY_PY_MACHINE_SPI || MICROPY_PY_MACHINE_SPI_TARGET || MICROPY_PY_MACHINE_UART
diff --git a/ports/psoc-edge/machine_scb.h b/ports/psoc-edge/machine_scb.h
new file mode 100644
index 00000000000..666d8b4c13a
--- /dev/null
+++ b/ports/psoc-edge/machine_scb.h
@@ -0,0 +1,58 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_MACHINE_SCB_H
+#define MICROPY_INCLUDED_PSOC_EDGE_MACHINE_SCB_H
+
+#include "sys_int.h"
+#include "py/obj.h"
+
+typedef void (*machine_scb_parent_irq_handler_t)(mp_obj_t scb_obj);
+
+typedef struct _machine_scb_obj_t {
+ int8_t id;
+ CySCB_Type *scb;
+ sys_int_cfg_t irq;
+ en_clk_dst_t clk;
+ uint8_t peri_nr;
+ uint8_t group_nr;
+ uint8_t slave_nr;
+ uint8_t clk_hf_nr;
+ mp_obj_t parent;
+ machine_scb_parent_irq_handler_t parent_handler;
+} machine_scb_obj_t;
+
+machine_scb_obj_t *machine_scb_obj_alloc(uint8_t scb, mp_obj_t parent, machine_scb_parent_irq_handler_t handler);
+void machine_scb_obj_free(machine_scb_obj_t *scb);
+bool machine_scb_is_free(uint8_t scb);
+void machine_scb_enable_group(uint8_t scb);
+void machine_scb_peri_pclk_config_divider(en_clk_dst_t clk_dst,
+ cy_en_divider_types_t div_type, uint8_t div_num, uint32_t div_val);
+bool machine_scb_div8_try_alloc(en_clk_dst_t clk_dst, uint8_t div_base, uint8_t div_invalid,
+ const void *owner, uint8_t *div_num_out);
+void machine_scb_div8_free(en_clk_dst_t clk_dst, uint8_t div_num, const void *owner);
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_MACHINE_SCB_H
diff --git a/ports/psoc-edge/machine_spi.c b/ports/psoc-edge/machine_spi.c
new file mode 100644
index 00000000000..3f603c89d0a
--- /dev/null
+++ b/ports/psoc-edge/machine_spi.c
@@ -0,0 +1,466 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "py/runtime.h"
+#include "extmod/modmachine.h"
+#include
+#include "py/mphal.h"
+#include "py/mperrno.h"
+#include "cybsp.h"
+#include "cy_scb_spi.h"
+#include "cy_sysclk.h"
+#include "genhdr/pins_af.h"
+#include "machine_scb.h"
+#include "modmachine.h"
+
+#define DEFAULT_SPI_BAUDRATE (1000000)
+#define DEFAULT_SPI_POLARITY (0)
+#define DEFAULT_SPI_PHASE (0)
+#define SPI_SUPPORTED_BITS (8U)
+#define DEFAULT_SPI_BITS (SPI_SUPPORTED_BITS)
+#define DEFAULT_SPI_TIMEOUT (50000)
+
+#define SPI_OVERSAMPLE (4U)
+#define SPI_CLK_DIV_TYPE CY_SYSCLK_DIV_8_BIT
+#define SPI_CLK_DIV_BASE (4U)
+#define SPI_CLK_DIV_INVALID (0xFFU)
+
+typedef struct _machine_spi_obj_t {
+ mp_obj_base_t base;
+ mp_hal_pin_obj_t sck;
+ mp_hal_pin_obj_t mosi;
+ mp_hal_pin_obj_t miso;
+ uint32_t baudrate;
+ uint8_t polarity;
+ uint8_t phase;
+ uint8_t bits;
+ uint8_t firstbit;
+ uint32_t timeout;
+ uint8_t div_num;
+ machine_scb_obj_t *scb_obj;
+ cy_stc_scb_spi_config_t cfg;
+ cy_stc_scb_spi_context_t ctx;
+} machine_spi_obj_t;
+
+machine_spi_obj_t *machine_hw_spi_obj[MICROPY_PY_MACHINE_SPI_NUM_ENTRIES] = { NULL };
+
+static inline machine_spi_obj_t *machine_hw_spi_obj_alloc(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SPI_NUM_ENTRIES; i++) {
+ if (machine_hw_spi_obj[i] == NULL) {
+ machine_hw_spi_obj[i] = mp_obj_malloc(machine_spi_obj_t, &machine_spi_type);
+ machine_hw_spi_obj[i]->div_num = SPI_CLK_DIV_INVALID;
+ return machine_hw_spi_obj[i];
+ }
+ }
+ return NULL;
+}
+
+static inline void machine_hw_spi_obj_free(machine_spi_obj_t *spi_obj) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SPI_NUM_ENTRIES; i++) {
+ if (machine_hw_spi_obj[i] == spi_obj) {
+ machine_hw_spi_obj[i] = NULL;
+ }
+ }
+}
+
+static void machine_spi_scb_isr(mp_obj_t hw_spi_obj) {
+ machine_spi_obj_t *self = MP_OBJ_TO_PTR(hw_spi_obj);
+ Cy_SCB_SPI_Interrupt(self->scb_obj->scb, &self->ctx);
+}
+
+// Configure SPI master pins and return SCB unit
+static uint8_t machine_spi_pins_config_and_get_scb_unit(
+ mp_hal_pin_obj_t sck,
+ mp_hal_pin_obj_t mosi,
+ mp_hal_pin_obj_t miso) {
+ // CS/SSEL is managed externally by the user via machine.Pin
+ const mp_hal_pin_af_config_t spi_pins_config[] = {
+ MP_HAL_PIN_AF_CONF_INIT(sck,
+ CY_GPIO_DM_STRONG_IN_OFF, 1,
+ MACHINE_PIN_AF_SIGNAL_SPI_CLK),
+ MP_HAL_PIN_AF_CONF_INIT(mosi,
+ CY_GPIO_DM_STRONG_IN_OFF, 1,
+ MACHINE_PIN_AF_SIGNAL_SPI_MOSI),
+ MP_HAL_PIN_AF_CONF_INIT(miso,
+ CY_GPIO_DM_HIGHZ, 0,
+ MACHINE_PIN_AF_SIGNAL_SPI_MISO),
+ };
+
+ machine_pin_af_unit_t af_unit = MACHINE_PIN_AF_UNIT_NONE;
+ mp_hal_periph_pins_af_resolve_fn_unit(spi_pins_config, MP_ARRAY_SIZE(spi_pins_config), MACHINE_PIN_AF_FN_SPI, &af_unit);
+
+ uint8_t scb_unit = (uint8_t)af_unit;
+ mp_hal_periph_pins_af_init(spi_pins_config, MP_ARRAY_SIZE(spi_pins_config));
+ return scb_unit;
+}
+
+static void machine_spi_validate_config(machine_spi_obj_t *self) {
+ if (self->baudrate == 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("baudrate must be > 0"));
+ }
+ if ((self->polarity > 1U) || (self->phase > 1U)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("polarity/phase must be 0 or 1"));
+ }
+ if (self->bits != SPI_SUPPORTED_BITS) {
+ mp_raise_ValueError(MP_ERROR_TEXT("bits must be 8"));
+ }
+ if ((self->firstbit != MICROPY_PY_MACHINE_SPI_MSB) &&
+ (self->firstbit != MICROPY_PY_MACHINE_SPI_LSB)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid firstbit"));
+ }
+ if (self->sck == NULL || self->mosi == NULL || self->miso == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("sck, mosi, and miso pins are required"));
+ }
+}
+
+static void machine_spi_hw_init(machine_spi_obj_t *self) {
+ // Configure SPI pins and discover SCB unit
+ uint8_t scb_unit = machine_spi_pins_config_and_get_scb_unit(
+ self->sck, self->mosi, self->miso);
+
+ // Power on the peripheral group that contains this SCB.
+ // Note: "Slave" in PeriGroupSlaveInit refers to the bus architecture
+ // (SCB is a slave on the internal PERI interconnect), not SPI slave mode.
+ machine_scb_enable_group(scb_unit);
+
+ // Allocate SCB
+ self->scb_obj = machine_scb_obj_alloc(scb_unit, self,
+ machine_spi_scb_isr);
+
+ if (!machine_scb_div8_try_alloc(self->scb_obj->clk,
+ SPI_CLK_DIV_BASE,
+ SPI_CLK_DIV_INVALID,
+ self,
+ &self->div_num)) {
+ machine_scb_obj_free(self->scb_obj);
+ self->scb_obj = NULL;
+ mp_raise_ValueError(MP_ERROR_TEXT("SPI clock dividers exhausted"));
+ }
+
+ // Configure SPI clock divider
+ machine_scb_peri_pclk_config_divider(self->scb_obj->clk,
+ SPI_CLK_DIV_TYPE, self->div_num, 0U);
+
+ // Get HF clock frequency and calculate divider value for desired baudrate
+ uint32_t clk_hf_freq = Cy_SysClk_PeriPclkGetFrequency(
+ self->scb_obj->clk, SPI_CLK_DIV_TYPE, self->div_num);
+
+ // Compute divider value for requested baudrate
+ uint32_t div_val = clk_hf_freq / ((uint64_t)self->baudrate * SPI_OVERSAMPLE);
+ if (div_val > 0U) {
+ div_val--;
+ }
+
+ // Apply divider
+ machine_scb_peri_pclk_config_divider(self->scb_obj->clk,
+ SPI_CLK_DIV_TYPE, self->div_num, div_val);
+
+ // Select SPI clock polarity and phase
+ cy_en_scb_spi_sclk_mode_t sclk_mode;
+ if (self->polarity == 0 && self->phase == 0) {
+ sclk_mode = CY_SCB_SPI_CPHA0_CPOL0;
+ } else if (self->polarity == 0 && self->phase == 1) {
+ sclk_mode = CY_SCB_SPI_CPHA1_CPOL0;
+ } else if (self->polarity == 1 && self->phase == 0) {
+ sclk_mode = CY_SCB_SPI_CPHA0_CPOL1;
+ } else {
+ sclk_mode = CY_SCB_SPI_CPHA1_CPOL1;
+ }
+
+ // Populate PDL SPI configuration
+ self->cfg = (cy_stc_scb_spi_config_t) {
+ .spiMode = CY_SCB_SPI_MASTER,
+ .subMode = CY_SCB_SPI_MOTOROLA,
+ .sclkMode = sclk_mode,
+ .parity = CY_SCB_SPI_PARITY_NONE,
+ .dropOnParityError = false,
+ .oversample = SPI_OVERSAMPLE,
+ .rxDataWidth = self->bits,
+ .txDataWidth = self->bits,
+ .enableMsbFirst = (self->firstbit == MICROPY_PY_MACHINE_SPI_MSB),
+ .enableInputFilter = false,
+ .enableFreeRunSclk = false,
+ .enableMisoLateSample = true,
+ .enableTransferSeparation = false,
+ .ssPolarity =
+ ((CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT0) |
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT1) |
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT2) |
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT3)),
+ .ssSetupDelay = false,
+ .ssHoldDelay = false,
+ .ssInterFrameDelay = false,
+ .enableWakeFromSleep = false,
+ .rxFifoTriggerLevel = 0UL,
+ .rxFifoIntEnableMask = 0UL,
+ .txFifoTriggerLevel = 0UL,
+ .txFifoIntEnableMask = 0UL,
+ .masterSlaveIntEnableMask = 0UL,
+ };
+
+ // Initialize SPI hardware
+ cy_en_scb_spi_status_t result =
+ Cy_SCB_SPI_Init(self->scb_obj->scb, &self->cfg, &self->ctx);
+
+ if (result != CY_SCB_SPI_SUCCESS) {
+ machine_scb_div8_free(self->scb_obj->clk, self->div_num, self);
+ self->div_num = SPI_CLK_DIV_INVALID;
+ machine_scb_obj_free(self->scb_obj);
+ self->scb_obj = NULL;
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("SPI init failed: 0x%lx"), (uint32_t)result);
+ }
+
+ sys_int_init(&self->scb_obj->irq);
+ Cy_SCB_SPI_Enable(self->scb_obj->scb);
+}
+
+static void machine_spi_hw_deinit(machine_spi_obj_t *self) {
+ Cy_SCB_SPI_Disable(self->scb_obj->scb, &self->ctx);
+ Cy_SCB_SPI_DeInit(self->scb_obj->scb);
+ sys_int_deinit(&self->scb_obj->irq);
+ if (self->div_num != SPI_CLK_DIV_INVALID) {
+ machine_scb_div8_free(self->scb_obj->clk, self->div_num, self);
+ Cy_SysClk_PeriPclkDisableDivider(self->scb_obj->clk, SPI_CLK_DIV_TYPE, self->div_num);
+ self->div_num = SPI_CLK_DIV_INVALID;
+ }
+ machine_scb_obj_free(self->scb_obj);
+ self->scb_obj = NULL;
+}
+
+// Parse and validate user arguments shared by constructor and init().
+static void machine_spi_init_helper(machine_spi_obj_t *self, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ enum { ARG_id, ARG_baudrate, ARG_polarity, ARG_phase, ARG_bits,
+ ARG_firstbit, ARG_sck, ARG_mosi, ARG_miso };
+
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_id, MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_baudrate, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_firstbit, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_mosi, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ bool reinit = false;
+
+ if (args[ARG_baudrate].u_obj != mp_const_none) {
+ mp_int_t baudrate = mp_obj_get_int(args[ARG_baudrate].u_obj);
+ if (baudrate <= 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("baudrate must be > 0"));
+ }
+ self->baudrate = (uint32_t)baudrate;
+ reinit = true;
+ }
+ if (args[ARG_polarity].u_int != -1) {
+ self->polarity = args[ARG_polarity].u_int;
+ reinit = true;
+ }
+ if (args[ARG_phase].u_int != -1) {
+ self->phase = args[ARG_phase].u_int;
+ reinit = true;
+ }
+ if (args[ARG_bits].u_int != -1) {
+ self->bits = args[ARG_bits].u_int;
+ reinit = true;
+ }
+ if (args[ARG_firstbit].u_int != -1) {
+ self->firstbit = args[ARG_firstbit].u_int;
+ reinit = true;
+ }
+ if (args[ARG_sck].u_obj != mp_const_none) {
+ self->sck = mp_hal_get_pin_obj(args[ARG_sck].u_obj);
+ reinit = true;
+ }
+ if (args[ARG_mosi].u_obj != mp_const_none) {
+ self->mosi = mp_hal_get_pin_obj(args[ARG_mosi].u_obj);
+ reinit = true;
+ }
+ if (args[ARG_miso].u_obj != mp_const_none) {
+ self->miso = mp_hal_get_pin_obj(args[ARG_miso].u_obj);
+ reinit = true;
+ }
+
+ // Reinitialize hardware if any config changed
+ if (reinit) {
+ machine_spi_validate_config(self);
+ if (self->scb_obj != NULL) {
+ machine_spi_hw_deinit(self);
+ }
+ machine_spi_hw_init(self);
+ }
+}
+
+// Thin protocol adapter for mp_machine_spi_p.init signature.
+static void machine_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ machine_spi_obj_t *self = (machine_spi_obj_t *)self_in;
+
+ // Convert runtime pos/kw args into the kw-array form expected by init_helper.
+ size_t n_kw = kw_args->used;
+ size_t all_args_len = n_args + 2 * n_kw;
+ mp_obj_t all_args[all_args_len == 0 ? 1 : all_args_len];
+
+ size_t out = 0;
+ for (size_t i = 0; i < n_args; i++) {
+ all_args[out++] = pos_args[i];
+ }
+ for (size_t i = 0; i < kw_args->alloc; i++) {
+ if (mp_map_slot_is_filled(kw_args, i)) {
+ all_args[out++] = kw_args->table[i].key;
+ all_args[out++] = kw_args->table[i].value;
+ }
+ }
+
+ machine_spi_init_helper(self, n_args, n_kw, all_args);
+}
+
+static void machine_spi_deinit(mp_obj_base_t *self_in) {
+ machine_spi_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (self->scb_obj != NULL) {
+ machine_spi_hw_deinit(self);
+ }
+ machine_hw_spi_obj_free(self);
+}
+
+static void machine_spi_transfer(mp_obj_base_t *self_in,
+ size_t len,
+ const uint8_t *src,
+ uint8_t *dest) {
+ machine_spi_obj_t *self = (machine_spi_obj_t *)self_in;
+
+ if (len == 0) {
+ return;
+ }
+
+ // Prepare TX buffer: if src is NULL (read-only), send 0xFF fill bytes
+ uint8_t tx_fill[len];
+ const uint8_t *tx_buf = src;
+ if (tx_buf == NULL) {
+ memset(tx_fill, 0xFF, len);
+ tx_buf = tx_fill;
+ }
+
+ // Prepare RX buffer: if dest is NULL (write-only), use a dummy buffer
+ uint8_t rx_dummy[len];
+ uint8_t *rx_buf = dest;
+ if (rx_buf == NULL) {
+ rx_buf = rx_dummy;
+ }
+
+ // Start full-duplex transfer (interrupt-driven via ISR)
+ cy_en_scb_spi_status_t status = Cy_SCB_SPI_Transfer(
+ self->scb_obj->scb, (void *)tx_buf, rx_buf, len, &self->ctx);
+
+ if (status != CY_SCB_SPI_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_OSError,
+ MP_ERROR_TEXT("SPI transfer failed: 0x%lx"), (uint32_t)status);
+ }
+
+ // Wait for transfer to complete
+ uint32_t start = mp_hal_ticks_us();
+ while (Cy_SCB_SPI_GetTransferStatus(self->scb_obj->scb, &self->ctx) & CY_SCB_SPI_TRANSFER_ACTIVE) {
+ if (mp_hal_ticks_us() - start > self->timeout) {
+ Cy_SCB_SPI_AbortTransfer(self->scb_obj->scb, &self->ctx);
+ mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("SPI transfer timeout"));
+ }
+ mp_event_handle_nowait();
+ }
+}
+
+static const mp_machine_spi_p_t machine_spi_p = {
+ .init = machine_spi_init,
+ .deinit = machine_spi_deinit,
+ .transfer = machine_spi_transfer,
+};
+
+static void machine_spi_print(const mp_print_t *print,
+ mp_obj_t self_in,
+ mp_print_kind_t kind) {
+ machine_spi_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "SPI(baudrate=%u, polarity=%u, phase=%u, bits=%u, firstbit=%s, sck='%q', mosi='%q', miso='%q')",
+ self->baudrate, self->polarity, self->phase, self->bits,
+ self->firstbit == MICROPY_PY_MACHINE_SPI_MSB ? "MSB" : "LSB",
+ self->sck->name, self->mosi->name, self->miso->name);
+}
+
+// Create and initialize a new machine.SPI object from Python
+mp_obj_t mp_machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ mp_arg_check_num(n_args, n_kw, 0, 9, true);
+
+ // Allocate a SPI object from static pool (each slot has a unique clock divider index)
+ machine_spi_obj_t *self = machine_hw_spi_obj_alloc();
+ if (self == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("machine.SPI: Maximum number of SPI instances reached"));
+ }
+
+ // Set defaults
+ self->baudrate = DEFAULT_SPI_BAUDRATE;
+ self->polarity = DEFAULT_SPI_POLARITY;
+ self->phase = DEFAULT_SPI_PHASE;
+ self->bits = DEFAULT_SPI_BITS;
+ self->firstbit = MICROPY_PY_MACHINE_SPI_MSB;
+ self->timeout = DEFAULT_SPI_TIMEOUT;
+ self->scb_obj = NULL;
+ self->sck = NULL;
+ self->mosi = NULL;
+ self->miso = NULL;
+
+ // Delegate argument parsing and initialization to init_helper
+ nlr_buf_t nlr;
+ if (nlr_push(&nlr) == 0) {
+ machine_spi_init_helper(self, n_args, n_kw, all_args);
+ nlr_pop();
+ } else {
+ machine_hw_spi_obj_free(self);
+ nlr_jump(nlr.ret_val);
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_spi_type,
+ MP_QSTR_SPI,
+ MP_TYPE_FLAG_NONE,
+ make_new, mp_machine_spi_make_new,
+ print, machine_spi_print,
+ protocol, &machine_spi_p,
+ locals_dict, &mp_machine_spi_locals_dict
+ );
+
+void machine_spi_deinit_all(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SPI_NUM_ENTRIES; i++) {
+ if (machine_hw_spi_obj[i] != NULL) {
+ machine_spi_deinit((mp_obj_base_t *)machine_hw_spi_obj[i]);
+ }
+ }
+}
diff --git a/ports/psoc-edge/machine_spi_target.c b/ports/psoc-edge/machine_spi_target.c
new file mode 100644
index 00000000000..277118fde77
--- /dev/null
+++ b/ports/psoc-edge/machine_spi_target.c
@@ -0,0 +1,450 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "py/mperrno.h"
+#include
+#include "cybsp.h"
+#include "cy_scb_spi.h"
+#include "cy_sysclk.h"
+#include "genhdr/pins_af.h"
+#include "machine_scb.h"
+#include "modmachine.h"
+
+#if MICROPY_PY_MACHINE_SPI_TARGET
+
+#define DEFAULT_SPI_TARGET_POLARITY (0)
+#define DEFAULT_SPI_TARGET_PHASE (0)
+#define DEFAULT_SPI_TARGET_BITS (8)
+#define SPI_TARGET_TICKS_WRAP_MS (15000U) // from mp_hal_ticks_ms source timer period in modtime.c
+#define DEFAULT_SPI_TARGET_TIMEOUT_MS (5000U) // must stay below SPI_TARGET_TICKS_WRAP_MS
+
+#define SPI_TARGET_CLK_DIV_TYPE CY_SYSCLK_DIV_8_BIT
+#define SPI_TARGET_CLK_DIV_BASE (4U)
+#define SPI_TARGET_CLK_DIV_INVALID (0xFFU)
+
+// mp_hal_ticks_ms() on this port wraps every SPI_TARGET_TICKS_WRAP_MS.
+// This computes elapsed time across one wrap; caller keeps timeout < wrap period.
+static inline uint32_t spi_target_elapsed_ms(uint32_t start_ms) {
+ uint32_t now = mp_hal_ticks_ms();
+ return (now >= start_ms) ? (now - start_ms) : (SPI_TARGET_TICKS_WRAP_MS - start_ms + now);
+}
+
+typedef struct _machine_spi_target_obj_t {
+ mp_obj_base_t base;
+ mp_hal_pin_obj_t sck;
+ mp_hal_pin_obj_t mosi;
+ mp_hal_pin_obj_t miso;
+ mp_hal_pin_obj_t ssel;
+ uint8_t polarity;
+ uint8_t phase;
+ uint8_t bits;
+ uint8_t firstbit;
+ uint32_t timeout;
+ uint8_t div_num; // Clock divider number for PCLK
+ machine_scb_obj_t *scb_obj;
+ cy_stc_scb_spi_config_t cfg;
+ cy_stc_scb_spi_context_t ctx;
+} machine_spi_target_obj_t;
+
+machine_spi_target_obj_t *machine_spi_target_obj[MICROPY_PY_MACHINE_SPI_TARGET_MAX] = { NULL };
+
+static inline machine_spi_target_obj_t *machine_spi_target_obj_alloc(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SPI_TARGET_MAX; i++) {
+ if (machine_spi_target_obj[i] == NULL) {
+ machine_spi_target_obj[i] = mp_obj_malloc(machine_spi_target_obj_t, &machine_spi_target_type);
+ machine_spi_target_obj[i]->div_num = SPI_TARGET_CLK_DIV_INVALID;
+ return machine_spi_target_obj[i];
+ }
+ }
+ return NULL;
+}
+
+static inline void machine_spi_target_obj_free(machine_spi_target_obj_t *obj) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SPI_TARGET_MAX; i++) {
+ if (machine_spi_target_obj[i] == obj) {
+ machine_spi_target_obj[i] = NULL;
+ }
+ }
+}
+
+static void machine_spi_target_scb_isr(mp_obj_t obj) {
+ machine_spi_target_obj_t *self = MP_OBJ_TO_PTR(obj);
+ Cy_SCB_SPI_Interrupt(self->scb_obj->scb, &self->ctx);
+}
+
+// Configure SPI target (slave) pins and return SCB unit
+static uint8_t machine_spi_target_pins_config_and_get_scb_unit(
+ mp_hal_pin_obj_t sck,
+ mp_hal_pin_obj_t mosi,
+ mp_hal_pin_obj_t miso,
+ mp_hal_pin_obj_t ssel) {
+ // Pin config: SCK, MOSI, SSEL are inputs; MISO is output
+ const mp_hal_pin_af_config_t spi_pins_config[] = {
+ MP_HAL_PIN_AF_CONF_INIT(sck,
+ CY_GPIO_DM_HIGHZ, 0,
+ MACHINE_PIN_AF_SIGNAL_SPI_CLK),
+ MP_HAL_PIN_AF_CONF_INIT(mosi,
+ CY_GPIO_DM_HIGHZ, 0,
+ MACHINE_PIN_AF_SIGNAL_SPI_MOSI),
+ MP_HAL_PIN_AF_CONF_INIT(miso,
+ CY_GPIO_DM_STRONG_IN_OFF, 1,
+ MACHINE_PIN_AF_SIGNAL_SPI_MISO),
+ MP_HAL_PIN_AF_CONF_INIT(ssel,
+ CY_GPIO_DM_HIGHZ, 0,
+ MACHINE_PIN_AF_SIGNAL_SPI_SELECT0),
+ };
+
+ machine_pin_af_unit_t af_unit = MACHINE_PIN_AF_UNIT_NONE;
+ mp_hal_periph_pins_af_resolve_fn_unit(spi_pins_config, MP_ARRAY_SIZE(spi_pins_config), MACHINE_PIN_AF_FN_SPI, &af_unit);
+
+ uint8_t scb_unit = (uint8_t)af_unit;
+ mp_hal_periph_pins_af_init(spi_pins_config, MP_ARRAY_SIZE(spi_pins_config));
+ return scb_unit;
+}
+
+static void machine_spi_target_hw_init(machine_spi_target_obj_t *self) {
+ // Input validation
+ if ((self->polarity > 1U) || (self->phase > 1U)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("polarity/phase must be 0 or 1"));
+ }
+ if (self->bits != 8U) {
+ mp_raise_ValueError(MP_ERROR_TEXT("bits must be 8"));
+ }
+ if ((self->firstbit != MICROPY_PY_MACHINE_SPI_MSB) &&
+ (self->firstbit != MICROPY_PY_MACHINE_SPI_LSB)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid firstbit"));
+ }
+
+ // Configure SPI target pins and discover SCB unit
+ uint8_t scb_unit = machine_spi_target_pins_config_and_get_scb_unit(
+ self->sck, self->mosi, self->miso, self->ssel);
+
+ // Power on the peripheral group that contains this SCB.
+ machine_scb_enable_group(scb_unit);
+
+ // Allocate SCB
+ self->scb_obj = machine_scb_obj_alloc(scb_unit, self,
+ machine_spi_target_scb_isr);
+
+ if (!machine_scb_div8_try_alloc(self->scb_obj->clk,
+ SPI_TARGET_CLK_DIV_BASE,
+ SPI_TARGET_CLK_DIV_INVALID,
+ self,
+ &self->div_num)) {
+ machine_scb_obj_free(self->scb_obj);
+ self->scb_obj = NULL;
+ mp_raise_ValueError(MP_ERROR_TEXT("SPITarget clock dividers exhausted"));
+ }
+
+ // Configure SPI PCLK divider (needed for slave's internal clock even though
+ // the bit clock comes from master's SCK)
+ machine_scb_peri_pclk_config_divider(self->scb_obj->clk,
+ SPI_TARGET_CLK_DIV_TYPE, self->div_num, 0U);
+
+ // Select SPI clock polarity and phase
+ cy_en_scb_spi_sclk_mode_t sclk_mode;
+ if (self->polarity == 0 && self->phase == 0) {
+ sclk_mode = CY_SCB_SPI_CPHA0_CPOL0;
+ } else if (self->polarity == 0 && self->phase == 1) {
+ sclk_mode = CY_SCB_SPI_CPHA1_CPOL0;
+ } else if (self->polarity == 1 && self->phase == 0) {
+ sclk_mode = CY_SCB_SPI_CPHA0_CPOL1;
+ } else {
+ sclk_mode = CY_SCB_SPI_CPHA1_CPOL1;
+ }
+
+ // Populate PDL SPI configuration for slave/target mode
+ self->cfg = (cy_stc_scb_spi_config_t) {
+ .spiMode = CY_SCB_SPI_SLAVE,
+ .subMode = CY_SCB_SPI_MOTOROLA,
+ .sclkMode = sclk_mode,
+ .parity = CY_SCB_SPI_PARITY_NONE,
+ .dropOnParityError = false,
+ .oversample = 0U,
+ .rxDataWidth = self->bits,
+ .txDataWidth = self->bits,
+ .enableMsbFirst = (self->firstbit == MICROPY_PY_MACHINE_SPI_MSB),
+ .enableInputFilter = false,
+ .enableFreeRunSclk = false,
+ .enableMisoLateSample = false,
+ .enableTransferSeparation = false,
+ .ssPolarity =
+ ((CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT0) |
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT1) |
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT2) |
+ (CY_SCB_SPI_ACTIVE_LOW << CY_SCB_SPI_SLAVE_SELECT3)),
+ .ssSetupDelay = false,
+ .ssHoldDelay = false,
+ .ssInterFrameDelay = false,
+ .enableWakeFromSleep = false,
+ .rxFifoTriggerLevel = 0UL,
+ .rxFifoIntEnableMask = 0UL,
+ .txFifoTriggerLevel = 0UL,
+ .txFifoIntEnableMask = 0UL,
+ .masterSlaveIntEnableMask = 0UL,
+ };
+
+ // Initialize SPI hardware
+ cy_en_scb_spi_status_t result =
+ Cy_SCB_SPI_Init(self->scb_obj->scb, &self->cfg, &self->ctx);
+
+ if (result != CY_SCB_SPI_SUCCESS) {
+ machine_scb_div8_free(self->scb_obj->clk, self->div_num, self);
+ self->div_num = SPI_TARGET_CLK_DIV_INVALID;
+ machine_scb_obj_free(self->scb_obj);
+ self->scb_obj = NULL;
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("SPITarget init failed: 0x%lx"), (uint32_t)result);
+ }
+
+ sys_int_init(&self->scb_obj->irq);
+ Cy_SCB_SPI_Enable(self->scb_obj->scb);
+}
+
+static void machine_spi_target_hw_deinit(machine_spi_target_obj_t *self) {
+ Cy_SCB_SPI_Disable(self->scb_obj->scb, &self->ctx);
+ Cy_SCB_SPI_DeInit(self->scb_obj->scb);
+ sys_int_deinit(&self->scb_obj->irq);
+ if (self->div_num != SPI_TARGET_CLK_DIV_INVALID) {
+ machine_scb_div8_free(self->scb_obj->clk, self->div_num, self);
+ Cy_SysClk_PeriPclkDisableDivider(self->scb_obj->clk, SPI_TARGET_CLK_DIV_TYPE, self->div_num);
+ self->div_num = SPI_TARGET_CLK_DIV_INVALID;
+ }
+ machine_scb_obj_free(self->scb_obj);
+ self->scb_obj = NULL;
+}
+
+/******************************************************************************/
+// MicroPython bindings
+
+static void machine_spi_target_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_spi_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "SPITarget(sck='%q', mosi='%q', miso='%q', ssel='%q', polarity=%u, phase=%u, bits=%u)",
+ self->sck->name, self->mosi->name, self->miso->name, self->ssel->name,
+ self->polarity, self->phase, self->bits);
+}
+
+static mp_obj_t machine_spi_target_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ mp_arg_check_num(n_args, n_kw, 0, 8, true);
+
+ enum { ARG_sck, ARG_mosi, ARG_miso, ARG_ssel, ARG_polarity, ARG_phase, ARG_bits, ARG_firstbit };
+
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_mosi, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_ssel, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_TARGET_POLARITY} },
+ { MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_TARGET_PHASE} },
+ { MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_TARGET_BITS} },
+ { MP_QSTR_firstbit, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = MICROPY_PY_MACHINE_SPI_MSB} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ machine_spi_target_obj_t *self = machine_spi_target_obj_alloc();
+ if (self == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("SPITarget: Maximum number of instances reached"));
+ }
+
+ self->sck = mp_hal_get_pin_obj(args[ARG_sck].u_obj);
+ self->mosi = mp_hal_get_pin_obj(args[ARG_mosi].u_obj);
+ self->miso = mp_hal_get_pin_obj(args[ARG_miso].u_obj);
+ self->ssel = mp_hal_get_pin_obj(args[ARG_ssel].u_obj);
+ self->polarity = args[ARG_polarity].u_int;
+ self->phase = args[ARG_phase].u_int;
+ self->bits = args[ARG_bits].u_int;
+ self->firstbit = args[ARG_firstbit].u_int;
+ self->timeout = DEFAULT_SPI_TARGET_TIMEOUT_MS;
+ self->scb_obj = NULL;
+
+ nlr_buf_t nlr;
+ if (nlr_push(&nlr) == 0) {
+ machine_spi_target_hw_init(self);
+ nlr_pop();
+ } else {
+ machine_spi_target_obj_free(self);
+ nlr_jump(nlr.ret_val);
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static mp_obj_t machine_spi_target_deinit(mp_obj_t self_in) {
+ machine_spi_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (self->scb_obj != NULL) {
+ machine_spi_target_hw_deinit(self);
+ }
+ machine_spi_target_obj_free(self);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_spi_target_deinit_obj, machine_spi_target_deinit);
+
+static mp_obj_t machine_spi_target_read(mp_obj_t self_in, mp_obj_t buf_in) {
+ machine_spi_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_WRITE);
+
+ uint32_t start = mp_hal_ticks_ms();
+ size_t received = 0;
+ uint8_t *rx_buf = bufinfo.buf;
+
+ while (received < bufinfo.len) {
+ uint32_t num_available = Cy_SCB_SPI_GetNumInRxFifo(self->scb_obj->scb);
+ while (num_available > 0 && received < bufinfo.len) {
+ rx_buf[received++] = (uint8_t)Cy_SCB_SPI_Read(self->scb_obj->scb);
+ num_available--;
+ }
+
+ if (spi_target_elapsed_ms(start) > self->timeout) {
+ mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("SPITarget read timeout"));
+ }
+ mp_event_handle_nowait();
+ }
+
+ return mp_obj_new_int(received);
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(machine_spi_target_read_obj, machine_spi_target_read);
+
+static mp_obj_t machine_spi_target_write(mp_obj_t self_in, mp_obj_t buf_in) {
+ machine_spi_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
+
+ Cy_SCB_SPI_ClearTxFifo(self->scb_obj->scb);
+
+ uint32_t start = mp_hal_ticks_ms();
+ size_t written = 0;
+ uint8_t *tx_buf = bufinfo.buf;
+
+ while (written < bufinfo.len) {
+ if (Cy_SCB_GetNumInTxFifo(self->scb_obj->scb) < Cy_SCB_GetFifoSize(self->scb_obj->scb)) {
+ Cy_SCB_SPI_Write(self->scb_obj->scb, tx_buf[written++]);
+ // Timeout tracks FIFO stall time, not total transfer time.
+ start = mp_hal_ticks_ms();
+ } else {
+ if (spi_target_elapsed_ms(start) > self->timeout) {
+ mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("SPITarget write timeout"));
+ }
+ mp_event_handle_nowait();
+ }
+ }
+
+ start = mp_hal_ticks_ms();
+ while (!Cy_SCB_SPI_IsTxComplete(self->scb_obj->scb)) {
+ if (spi_target_elapsed_ms(start) > self->timeout) {
+ mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("SPITarget write timeout"));
+ }
+ mp_event_handle_nowait();
+ }
+
+ return mp_obj_new_int(written);
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(machine_spi_target_write_obj, machine_spi_target_write);
+
+static mp_obj_t machine_spi_target_write_readinto(mp_obj_t self_in, mp_obj_t tx_buf_in, mp_obj_t rx_buf_in) {
+ machine_spi_target_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_buffer_info_t tx_bufinfo;
+ mp_buffer_info_t rx_bufinfo;
+ mp_get_buffer_raise(tx_buf_in, &tx_bufinfo, MP_BUFFER_READ);
+ mp_get_buffer_raise(rx_buf_in, &rx_bufinfo, MP_BUFFER_WRITE);
+
+ if (tx_bufinfo.len != rx_bufinfo.len) {
+ mp_raise_ValueError(MP_ERROR_TEXT("buffers must be the same length"));
+ }
+
+ Cy_SCB_SPI_ClearTxFifo(self->scb_obj->scb);
+ Cy_SCB_SPI_ClearRxFifo(self->scb_obj->scb);
+
+ uint8_t *tx_buf = tx_bufinfo.buf;
+ uint8_t *rx_buf = rx_bufinfo.buf;
+ size_t len = tx_bufinfo.len;
+ size_t tx_idx = 0;
+ size_t rx_idx = 0;
+ uint32_t start = mp_hal_ticks_ms();
+
+ while (rx_idx < len) {
+ bool progressed = false;
+
+ // Load TX FIFO
+ while (tx_idx < len &&
+ Cy_SCB_GetNumInTxFifo(self->scb_obj->scb) < Cy_SCB_GetFifoSize(self->scb_obj->scb)) {
+ Cy_SCB_SPI_Write(self->scb_obj->scb, tx_buf[tx_idx++]);
+ progressed = true;
+ }
+
+ // Read RX FIFO
+ while (rx_idx < len && Cy_SCB_SPI_GetNumInRxFifo(self->scb_obj->scb) > 0) {
+ rx_buf[rx_idx++] = (uint8_t)Cy_SCB_SPI_Read(self->scb_obj->scb);
+ progressed = true;
+ }
+
+ if (progressed) {
+ // Timeout tracks no-progress stalls (e.g. FIFO-full with no clocking).
+ start = mp_hal_ticks_ms();
+ }
+
+ if (spi_target_elapsed_ms(start) > self->timeout) {
+ mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("SPITarget transfer timeout"));
+ }
+ mp_event_handle_nowait();
+ }
+
+ return mp_obj_new_int(len);
+}
+static MP_DEFINE_CONST_FUN_OBJ_3(machine_spi_target_write_readinto_obj, machine_spi_target_write_readinto);
+
+void machine_spi_target_deinit_all(void) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_SPI_TARGET_MAX; i++) {
+ if (machine_spi_target_obj[i] != NULL) {
+ machine_spi_target_deinit(MP_OBJ_FROM_PTR(machine_spi_target_obj[i]));
+ }
+ }
+}
+
+static const mp_rom_map_elem_t machine_spi_target_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&machine_spi_target_read_obj) },
+ { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&machine_spi_target_write_obj) },
+ { MP_ROM_QSTR(MP_QSTR_write_readinto), MP_ROM_PTR(&machine_spi_target_write_readinto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_spi_target_deinit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_MSB), MP_ROM_INT(MICROPY_PY_MACHINE_SPI_MSB) },
+ { MP_ROM_QSTR(MP_QSTR_LSB), MP_ROM_INT(MICROPY_PY_MACHINE_SPI_LSB) },
+};
+static MP_DEFINE_CONST_DICT(machine_spi_target_locals_dict, machine_spi_target_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_spi_target_type,
+ MP_QSTR_SPITarget,
+ MP_TYPE_FLAG_NONE,
+ make_new, machine_spi_target_make_new,
+ print, machine_spi_target_print,
+ locals_dict, &machine_spi_target_locals_dict
+ );
+
+#endif // MICROPY_PY_MACHINE_SPI_TARGET
diff --git a/ports/psoc-edge/machine_timer.c b/ports/psoc-edge/machine_timer.c
new file mode 100644
index 00000000000..524ec1422c1
--- /dev/null
+++ b/ports/psoc-edge/machine_timer.c
@@ -0,0 +1,453 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// Hardware timer using TCPWM0 counters.
+// IDs 0..7 are Group 0 (32-bit) counters.
+// IDs 8..31 are Group 1 (16-bit) counters.
+
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "modmachine.h"
+#include "shared/runtime/mpirq.h"
+#include "sys_int.h"
+
+#include "cy_tcpwm_counter.h"
+#include "cy_tcpwm.h"
+#include "cy_sysclk.h"
+#include "cycfg_peripheral_clocks.h"
+#include "cycfg_peripherals.h"
+#include "mtb_hal.h"
+#include "tcpwm.h"
+#include "genhdr/pins_af.h"
+
+// ---------------------------------------------------------------------------
+// Constants
+// ---------------------------------------------------------------------------
+
+#define MACHINE_TIMER_NUM_INSTANCES (32)
+
+// Shared general-purpose timer divider target frequency used by this module.
+#define TIMER_CLK_HZ (1000000UL)
+
+// Input-pin disabled sentinel (upper 2 bits are ignored; mask to 2-bit field)
+#define TIMER_INPUT_DISABLED (0x7U)
+
+// Timer mode values — also exposed as Python class constants
+#define TIMER_MODE_ONE_SHOT (1)
+#define TIMER_MODE_PERIODIC (2)
+
+// ---------------------------------------------------------------------------
+// Object type
+// ---------------------------------------------------------------------------
+
+typedef struct _machine_timer_obj_t {
+ mp_obj_base_t base;
+ uint8_t id; // 0..31
+ uint32_t counter_num; // TCPWM0 counter index mapped from timer_hw[]
+ en_clk_dst_t pclk_dst;
+ uint16_t mode; // TIMER_MODE_ONE_SHOT or TIMER_MODE_PERIODIC
+ mp_obj_t callback;
+ bool ishard;
+ bool active;
+ sys_int_cfg_t irq_cfg;
+} machine_timer_obj_t;
+
+const mp_obj_type_t machine_timer_type; // forward declaration
+
+// Maximum period register value for each counter group.
+#define TIMER_GROUP0_PERIOD_MAX (UINT32_MAX) // 32-bit counters
+#define TIMER_GROUP1_PERIOD_MAX (0xFFFFU) // 16-bit counters
+
+// ---------------------------------------------------------------------------
+// Per-ID hardware mapping — generated from the board AF configuration.
+// Macro is defined in pins_af.h as MICROPY_PY_MACHINE_TIMER_HW_MAP(X).
+// Each row: X(timer_id, tcpwm_counter_num, irq)
+// ---------------------------------------------------------------------------
+
+#define TIMER_HW_ENTRY(id, counter, irq, pclk) counter,
+static const uint32_t timer_hw[MACHINE_TIMER_NUM_INSTANCES] = {
+ MICROPY_PY_MACHINE_TCPWM_HW_MAP(TIMER_HW_ENTRY)
+};
+#undef TIMER_HW_ENTRY
+
+#define TIMER_IRQ_CASE(id, counter, irq, pclk) case counter: \
+ return irq;
+static IRQn_Type machine_timer_counter_irq(uint32_t counter_num) {
+ switch (counter_num) {
+ MICROPY_PY_MACHINE_TCPWM_HW_MAP(TIMER_IRQ_CASE)
+ default:
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("Timer counter %lu does not have an IRQ mapping"),
+ (unsigned long)counter_num);
+ }
+}
+#undef TIMER_IRQ_CASE
+
+// ---------------------------------------------------------------------------
+// Static instance pool — one entry per hardware timer
+// ---------------------------------------------------------------------------
+
+static machine_timer_obj_t *timer_obj[MACHINE_TIMER_NUM_INSTANCES] = { NULL };
+
+static bool machine_timer_clock_configured = false;
+
+static void machine_timer_configure_clock(void) {
+ if (machine_timer_clock_configured) {
+ return;
+ }
+
+ // Keep timer periods stable even when other modules stop configuring this divider.
+ cy_rslt_t rslt = mtb_hal_clock_set_peri_clock_freq(&CYBSP_GENERAL_PURPOSE_TIMER_clock_ref,
+ TIMER_CLK_HZ, 1000);
+ if (rslt != CY_RSLT_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("Timer clock setup failed (0x%lx)"),
+ (unsigned long)rslt);
+ }
+
+ machine_timer_clock_configured = true;
+}
+
+// ---------------------------------------------------------------------------
+// IRQ handling helpers
+// ---------------------------------------------------------------------------
+
+static void machine_timer_isr(machine_timer_obj_t *self) {
+ if (Cy_TCPWM_GetInterruptStatus(TCPWM0, self->counter_num) & CY_TCPWM_INT_ON_TC) {
+ Cy_TCPWM_ClearInterrupt(TCPWM0, self->counter_num, CY_TCPWM_INT_ON_TC);
+ if (self->mode == TIMER_MODE_ONE_SHOT) {
+ Cy_TCPWM_Counter_Disable(TCPWM0, self->counter_num);
+ self->active = false;
+ }
+ if (self->callback != mp_const_none
+ && mp_irq_dispatch(self->callback, MP_OBJ_FROM_PTR(self), self->ishard) < 0) {
+ // Uncaught exception: stop timer and disable callback to avoid repeated IRQ spam.
+ Cy_TCPWM_Counter_Disable(TCPWM0, self->counter_num);
+ self->active = false;
+ self->callback = mp_const_none;
+ }
+ }
+}
+
+// Generate one IRQ handler per timer id for direct dispatch without scanning.
+#define TIMER_IRQ_HANDLER_DECL(id, counter, irq, pclk) \
+ static void machine_timer_irq_handler_##id(void) { \
+ machine_timer_obj_t *self = timer_obj[id]; \
+ if (self != NULL) { \
+ machine_timer_isr(self); \
+ } \
+ }
+MICROPY_PY_MACHINE_TCPWM_HW_MAP(TIMER_IRQ_HANDLER_DECL)
+#undef TIMER_IRQ_HANDLER_DECL
+
+#define TIMER_IRQ_HANDLER_ENTRY(id, counter, irq, pclk) machine_timer_irq_handler_##id,
+static const cy_israddress machine_timer_irq_handlers[MACHINE_TIMER_NUM_INSTANCES] = {
+ MICROPY_PY_MACHINE_TCPWM_HW_MAP(TIMER_IRQ_HANDLER_ENTRY)
+};
+#undef TIMER_IRQ_HANDLER_ENTRY
+
+// ---------------------------------------------------------------------------
+// Start (or restart) a timer with the given period in clock ticks
+// ---------------------------------------------------------------------------
+
+static void machine_timer_start(machine_timer_obj_t *self, uint32_t period_ticks) {
+ machine_timer_configure_clock();
+
+ // Stop counter and unregister any existing IRQ before reconfiguring.
+ Cy_TCPWM_Counter_Disable(TCPWM0, self->counter_num);
+ if (self->active) {
+ sys_int_deinit(&self->irq_cfg);
+ self->active = false;
+ }
+
+ // Connect the shared 1 MHz PCLK divider to this counter's clock input.
+ Cy_SysClk_PeriPclkAssignDivider(self->pclk_dst,
+ CY_SYSCLK_DIV_16_BIT, CYBSP_GENERAL_PURPOSE_TIMER_CLK_DIV_NUM);
+
+ // The counter counts 0 → period_reg (inclusive) then fires TC.
+ // So period_reg = period_ticks - 1.
+ cy_stc_tcpwm_counter_config_t cfg = {
+ .period = period_ticks - 1U,
+ .clockPrescaler = CY_TCPWM_COUNTER_PRESCALER_DIVBY_1,
+ .runMode = (self->mode == TIMER_MODE_ONE_SHOT)
+ ? CY_TCPWM_COUNTER_ONESHOT
+ : CY_TCPWM_COUNTER_CONTINUOUS,
+ .countDirection = CY_TCPWM_COUNTER_COUNT_UP,
+ .compareOrCapture = CY_TCPWM_COUNTER_MODE_COMPARE,
+ .compare0 = 0U,
+ .compare1 = 0U,
+ .enableCompareSwap = false,
+ .interruptSources = CY_TCPWM_INT_ON_TC,
+ // All trigger inputs disabled
+ .captureInputMode = TIMER_INPUT_DISABLED & 0x3U,
+ .captureInput = CY_TCPWM_INPUT_0,
+ .reloadInputMode = TIMER_INPUT_DISABLED & 0x3U,
+ .reloadInput = CY_TCPWM_INPUT_0,
+ .startInputMode = TIMER_INPUT_DISABLED & 0x3U,
+ .startInput = CY_TCPWM_INPUT_0,
+ .stopInputMode = TIMER_INPUT_DISABLED & 0x3U,
+ .stopInput = CY_TCPWM_INPUT_0,
+ .countInputMode = TIMER_INPUT_DISABLED & 0x3U,
+ .countInput = CY_TCPWM_INPUT_1,
+ .capture1InputMode = TIMER_INPUT_DISABLED & 0x3U,
+ .capture1Input = CY_TCPWM_INPUT_0,
+ .enableCompare1Swap = false,
+ .compare2 = CY_TCPWM_GRP_CNT_CC0_DEFAULT,
+ .compare3 = CY_TCPWM_GRP_CNT_CC0_BUFF_DEFAULT,
+ .trigger0Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ .trigger1Event = CY_TCPWM_CNT_TRIGGER_ON_DISABLED,
+ };
+
+ cy_en_tcpwm_status_t result = Cy_TCPWM_Counter_Init(TCPWM0, self->counter_num, &cfg);
+ if (result != CY_TCPWM_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("Timer(%u) init failed (PDL error 0x%lx)"),
+ (unsigned)self->id, (unsigned long)result);
+ }
+
+ // Register IRQ before enabling so no TC edge is missed.
+ self->irq_cfg.priority = SYS_INT_IRQ_LOWEST_PRIORITY;
+ self->irq_cfg.handler = machine_timer_irq_handlers[self->id];
+ sys_int_init(&self->irq_cfg);
+
+ self->active = true;
+ Cy_TCPWM_Counter_Enable(TCPWM0, self->counter_num);
+ Cy_TCPWM_TriggerReloadOrIndex_Single(TCPWM0, self->counter_num);
+}
+
+// ---------------------------------------------------------------------------
+// Python init helper (shared by make_new and .init())
+// ---------------------------------------------------------------------------
+
+static mp_obj_t machine_timer_init_helper(machine_timer_obj_t *self,
+ size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+
+ enum { ARG_mode, ARG_callback, ARG_period, ARG_freq, ARG_hard };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_mode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = TIMER_MODE_PERIODIC} },
+ { MP_QSTR_callback, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ { MP_QSTR_period, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_freq, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_hard, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_FALSE} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args,
+ MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ // Validate mode
+ mp_int_t mode = args[ARG_mode].u_int;
+ if (mode != TIMER_MODE_ONE_SHOT && mode != TIMER_MODE_PERIODIC) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid mode"));
+ }
+ self->mode = (uint16_t)mode;
+
+ // Validate callback
+ mp_obj_t callback = args[ARG_callback].u_obj;
+ if (callback != mp_const_none && !mp_obj_is_callable(callback)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("callback must be callable"));
+ }
+ self->callback = callback;
+
+ mp_obj_t hard = args[ARG_hard].u_obj;
+ if (!mp_obj_is_bool(hard)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("hard must be bool"));
+ }
+ self->ishard = (hard == mp_const_true);
+
+ // Hard IRQ callbacks not supported on FreeRTOS: scheduler cannot be locked from ISR context.
+ // TODO: Re-enable hard irq and remove this patch
+ #if defined(CY_RTOS_AWARE)
+ if (self->ishard) {
+ self->ishard = false; // silently convert to soft callback
+ }
+ #endif
+
+ // Compute period in timer clock ticks in 64-bit, then range-check.
+ uint64_t period_ticks_64;
+ uint32_t period_ticks;
+ if (args[ARG_freq].u_obj != mp_const_none) {
+ mp_int_t freq = mp_obj_get_int(args[ARG_freq].u_obj);
+ if (freq <= 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("freq must be > 0"));
+ }
+ period_ticks_64 = (uint64_t)TIMER_CLK_HZ / (uint64_t)(uint32_t)freq;
+ } else if (args[ARG_period].u_int > 0) {
+ // period is in milliseconds; convert to timer clock ticks (1 MHz base).
+ period_ticks_64 = (uint64_t)TIMER_CLK_HZ * (uint64_t)(uint32_t)args[ARG_period].u_int
+ / 1000UL;
+ } else if (mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_period), MP_MAP_LOOKUP) != NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("period must be > 0"));
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("either freq or period must be specified"));
+ }
+
+ if (period_ticks_64 == 0U || period_ticks_64 > UINT32_MAX) {
+ mp_raise_ValueError(MP_ERROR_TEXT("period out of range for 32-bit counter"));
+ }
+
+ // Group 1 counters (num >= 256) are 16-bit; reject values that would overflow their period register.
+ if (self->counter_num >= 256U && period_ticks_64 > TIMER_GROUP1_PERIOD_MAX) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("16-bit Timer(%u) period exceeds %lu ticks; use a shorter period/higher freq, or use a 32-bit Timer (id 0-7)"),
+ (unsigned)self->id,
+ (unsigned long)TIMER_GROUP1_PERIOD_MAX);
+ }
+
+ period_ticks = (uint32_t)period_ticks_64;
+
+ machine_timer_start(self, period_ticks);
+ return mp_const_none;
+}
+
+// ---------------------------------------------------------------------------
+// machine.Timer(id [, mode=, freq=, period=, callback=, hard=])
+// ---------------------------------------------------------------------------
+
+static mp_obj_t machine_timer_make_new(const mp_obj_type_t *type,
+ size_t n_args, size_t n_kw, const mp_obj_t *args) {
+
+ mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
+
+ mp_int_t id = mp_obj_get_int(args[0]);
+ if (id < 0 || id >= MACHINE_TIMER_NUM_INSTANCES) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("Timer id must be in range 0-%d"),
+ MACHINE_TIMER_NUM_INSTANCES - 1);
+ }
+
+ if (timer_obj[id] != NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("Timer(%u) already created."), (unsigned)id);
+ }
+
+ machine_timer_obj_t *self = mp_obj_malloc(machine_timer_obj_t, &machine_timer_type);
+ timer_obj[id] = self;
+
+ self->id = (uint8_t)id;
+ self->counter_num = timer_hw[id];
+ self->pclk_dst = machine_tcpwm_counter_pclk(self->counter_num);
+ self->callback = mp_const_none;
+ self->ishard = false;
+ self->active = false;
+ self->irq_cfg.irq_num = machine_timer_counter_irq(self->counter_num);
+
+ nlr_buf_t nl;
+ if (nlr_push(&nl) == 0) {
+ machine_tcpwm_counter_alloc(self->counter_num, MP_OBJ_FROM_PTR(self));
+ if (n_args > 1 || n_kw > 0) {
+ mp_map_t kw_map;
+ mp_map_init_fixed_table(&kw_map, n_kw, args + n_args);
+ machine_timer_init_helper(self, n_args - 1, args + 1, &kw_map);
+ }
+ nlr_pop();
+ } else {
+ machine_tcpwm_counter_free(self->counter_num, MP_OBJ_FROM_PTR(self));
+ timer_obj[id] = NULL;
+ nlr_jump(nl.ret_val);
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+// ---------------------------------------------------------------------------
+// timer.init(mode=, freq=, period=, callback=, hard=)
+// ---------------------------------------------------------------------------
+
+static mp_obj_t machine_timer_init(size_t n_args, const mp_obj_t *args,
+ mp_map_t *kw_args) {
+ return machine_timer_init_helper(MP_OBJ_TO_PTR(args[0]),
+ n_args - 1, args + 1, kw_args);
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(machine_timer_init_obj, 1, machine_timer_init);
+
+// ---------------------------------------------------------------------------
+// timer.deinit()
+// ---------------------------------------------------------------------------
+
+static mp_obj_t machine_timer_deinit(mp_obj_t self_in) {
+ machine_timer_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ Cy_TCPWM_Counter_Disable(TCPWM0, self->counter_num);
+ if (self->active) {
+ sys_int_deinit(&self->irq_cfg);
+ }
+ self->callback = mp_const_none;
+ self->ishard = false;
+ self->active = false;
+ machine_tcpwm_counter_free(self->counter_num, MP_OBJ_FROM_PTR(self));
+ timer_obj[self->id] = NULL;
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(machine_timer_deinit_obj, machine_timer_deinit);
+
+// ---------------------------------------------------------------------------
+// __repr__ / print
+// ---------------------------------------------------------------------------
+
+static void machine_timer_print(const mp_print_t *print, mp_obj_t self_in,
+ mp_print_kind_t kind) {
+ machine_timer_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ uint32_t period_ticks = Cy_TCPWM_Counter_GetPeriod(TCPWM0, self->counter_num) + 1U;
+ uint32_t freq = period_ticks != 0U ? (TIMER_CLK_HZ / period_ticks) : 0U;
+ mp_printf(print, "Timer(id=%u, mode=Timer.%s, freq=%u)",
+ (unsigned)self->id,
+ self->mode == TIMER_MODE_ONE_SHOT ? "OneShot" : "Periodic",
+ (unsigned)freq);
+}
+
+// ---------------------------------------------------------------------------
+// Module-level lifecycle called from main.c
+// ---------------------------------------------------------------------------
+
+void machine_timer_deinit_all(void) {
+ for (uint8_t i = 0; i < MACHINE_TIMER_NUM_INSTANCES; i++) {
+ machine_timer_obj_t *self = timer_obj[i];
+ if (self != NULL) {
+ machine_timer_deinit(MP_OBJ_FROM_PTR(self));
+ }
+ }
+}
+
+// ---------------------------------------------------------------------------
+// Type definition
+// ---------------------------------------------------------------------------
+
+static const mp_rom_map_elem_t machine_timer_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_timer_init_obj) },
+ { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_timer_deinit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ONE_SHOT), MP_ROM_INT(TIMER_MODE_ONE_SHOT) },
+ { MP_ROM_QSTR(MP_QSTR_PERIODIC), MP_ROM_INT(TIMER_MODE_PERIODIC) },
+};
+static MP_DEFINE_CONST_DICT(machine_timer_locals_dict, machine_timer_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_timer_type,
+ MP_QSTR_Timer,
+ MP_TYPE_FLAG_NONE,
+ make_new, machine_timer_make_new,
+ print, machine_timer_print,
+ locals_dict, &machine_timer_locals_dict
+ );
diff --git a/ports/psoc-edge/machine_uart.c b/ports/psoc-edge/machine_uart.c
new file mode 100644
index 00000000000..67196fe2185
--- /dev/null
+++ b/ports/psoc-edge/machine_uart.c
@@ -0,0 +1,859 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// This file is never compiled standalone, it's included directly from
+// extmod/machine_uart.c via MICROPY_PY_MACHINE_UART_INCLUDEFILE.
+
+// std includes
+#include
+
+// MTB / PDL includes
+#include "cybsp.h"
+#include "cy_scb_uart.h"
+#include "cy_scb_common.h"
+#include "cy_sysclk.h"
+
+// MicroPython includes
+#include "py/ringbuf.h"
+#include "py/mphal.h"
+#include "py/mperrno.h"
+#include "py/nlr.h"
+#include "py/stream.h"
+
+// Port-specific includes
+#include "genhdr/pins_af.h"
+#include "modmachine.h"
+#include "mphalport.h"
+#include "machine_scb.h"
+#include "sys_int.h"
+
+/******************************************************************************/
+// Defaults and constants
+
+#define uart_assert_raise_val(msg, ret) if (ret != CY_SCB_UART_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+// Flow control macros not part of PSOC Edge PDL
+#define UART_FLOW_CONTROL_NONE (0)
+#define UART_FLOW_CONTROL_RTS (1)
+#define UART_FLOW_CONTROL_CTS (2)
+
+// Class-level constants exposed to Python
+#define MICROPY_PY_MACHINE_UART_CLASS_CONSTANTS \
+ { MP_ROM_QSTR(MP_QSTR_IRQ_RXIDLE), MP_ROM_INT(CY_SCB_RX_INTR_NOT_EMPTY) }, \
+ { MP_ROM_QSTR(MP_QSTR_IRQ_BREAK), MP_ROM_INT(CY_SCB_RX_INTR_UART_BREAK_DETECT) }, \
+ { MP_ROM_QSTR(MP_QSTR_IRQ_TXIDLE), MP_ROM_INT(CY_SCB_TX_INTR_UART_DONE) }, \
+ { MP_ROM_QSTR(MP_QSTR_RTS), MP_ROM_INT(UART_FLOW_CONTROL_RTS) }, \
+ { MP_ROM_QSTR(MP_QSTR_CTS), MP_ROM_INT(UART_FLOW_CONTROL_CTS) }, \
+
+/******************************************************************************/
+
+typedef struct _machine_uart_obj_t {
+ mp_obj_base_t base;
+ int id; // id matches the SCB id.
+ machine_scb_obj_t *scb_obj;
+ mp_hal_pin_obj_t tx;
+ mp_hal_pin_obj_t rx;
+ mp_hal_pin_obj_t rts;
+ mp_hal_pin_obj_t cts;
+ uint32_t baudrate;
+ uint32_t flow;
+ uint8_t bits;
+ uint8_t parity;
+ uint8_t stop;
+ uint32_t timeout_ms;
+ uint32_t timeout_char_ms;
+ cy_stc_scb_uart_context_t ctx;
+ ringbuf_t rx_ringbuf;
+ #if MICROPY_PY_MACHINE_UART_IRQ
+ uint32_t mp_irq_trigger;
+ uint32_t mp_irq_flags;
+ mp_irq_obj_t *mp_irq_obj;
+ #endif
+} machine_uart_obj_t;
+
+static machine_uart_obj_t *mp_machine_uart_obj_get(uint8_t id) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_UART_NUM_ENTRIES; i++) {
+ if (MP_STATE_PORT(machine_uart_obj[i]) != NULL) {
+ if (MP_STATE_PORT(machine_uart_obj[i])->id == id) {
+ return MP_STATE_PORT(machine_uart_obj[i]);
+ }
+ }
+ }
+ return NULL;
+}
+
+static machine_uart_obj_t *mp_machine_uart_obj_alloc(void) {
+ machine_uart_obj_t *self = NULL;
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_UART_NUM_ENTRIES; i++) {
+ if (MP_STATE_PORT(machine_uart_obj[i]) == NULL) {
+ self = mp_obj_malloc(machine_uart_obj_t, &machine_uart_type);
+ MP_STATE_PORT(machine_uart_obj[i]) = self;
+ break;
+ }
+ }
+
+ if (self == NULL) {
+ mp_raise_ValueError(MP_ERROR_TEXT("all available UART instances are allocated"));
+ }
+
+ return self;
+}
+
+static void mp_machine_uart_obj_free(machine_uart_obj_t *self) {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_UART_NUM_ENTRIES; i++) {
+ if (MP_STATE_PORT(machine_uart_obj[i]) == self) {
+ MP_STATE_PORT(machine_uart_obj[i]) = NULL;
+ break;
+ }
+ }
+}
+
+MP_REGISTER_ROOT_POINTER(struct _machine_uart_obj_t *machine_uart_obj[MICROPY_PY_MACHINE_UART_NUM_ENTRIES]);
+
+#if MICROPY_PY_MACHINE_UART_IRQ
+static void machine_uart_irq_rx_idle(machine_uart_obj_t *self);
+static void machine_uart_irq_rx_break(machine_uart_obj_t *self);
+static void machine_uart_irq_tx_idle(machine_uart_obj_t *self);
+#endif
+
+static void machine_uart_fill_rx_ring_buff(machine_uart_obj_t *self) {
+ uint32_t available_rx_frames = Cy_SCB_UART_GetNumInRxFifo(self->scb_obj->scb);
+ for (uint32_t i = 0; i < available_rx_frames; i++) {
+ if (!ringbuf_put(&self->rx_ringbuf, (uint8_t)Cy_SCB_UART_Get(self->scb_obj->scb))) {
+ /**
+ * No overflow handling.
+ * Just return and wait for next interrupt
+ * to read the remaining data.
+ */
+ return;
+ }
+ }
+}
+
+static void machine_uart_scb_isr(mp_obj_t hw_uart_obj) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(hw_uart_obj);
+ #if MICROPY_PY_MACHINE_UART_IRQ
+ self->mp_irq_flags = 0; // Clear flags at the beginning of the ISR.
+ #endif
+
+ if (0UL != (CY_SCB_RX_INTR & Cy_SCB_GetInterruptCause(self->scb_obj->scb))) {
+ if (0UL != (CY_SCB_RX_INTR_NOT_EMPTY & Cy_SCB_GetRxInterruptStatusMasked(self->scb_obj->scb))) {
+ machine_uart_fill_rx_ring_buff(self);
+
+ #if MICROPY_PY_MACHINE_UART_IRQ
+ machine_uart_irq_rx_idle(self);
+ #endif
+
+ Cy_SCB_ClearRxInterrupt(self->scb_obj->scb, CY_SCB_RX_INTR_NOT_EMPTY);
+ }
+
+ #if MICROPY_PY_MACHINE_UART_IRQ
+ if (0UL != (CY_SCB_RX_INTR_UART_BREAK_DETECT & Cy_SCB_GetRxInterruptStatusMasked(self->scb_obj->scb))) {
+ machine_uart_irq_rx_break(self);
+ Cy_SCB_ClearRxInterrupt(self->scb_obj->scb, CY_SCB_RX_INTR_UART_BREAK_DETECT);
+ }
+ #endif
+ }
+
+ #if MICROPY_PY_MACHINE_UART_IRQ
+ if ((0UL != (CY_SCB_TX_INTR & Cy_SCB_GetInterruptCause(self->scb_obj->scb))) &&
+ (0UL != (CY_SCB_TX_INTR_UART_DONE & Cy_SCB_GetTxInterruptStatusMasked(self->scb_obj->scb)))) {
+ machine_uart_irq_tx_idle(self);
+ Cy_SCB_ClearTxInterrupt(self->scb_obj->scb, CY_SCB_TX_INTR_UART_DONE);
+ }
+ #endif
+}
+
+static void machine_uart_obj_make_or_reuse(machine_uart_obj_t **self_ptr, uint8_t id, bool *is_new) {
+ /**
+ * UART() constructor path:
+ *
+ * Create or reuse and object based on the id.
+ * If the object for the given id already exists,
+ * reuse it and reinit the hardware with the new params.
+ * If the object is being created for the first time,
+ * allocate it and the associated SCB object.
+ */
+
+ /* Use object if it already exists */
+ (*self_ptr) = mp_machine_uart_obj_get(id);
+ (*is_new) = false;
+
+ if (*self_ptr == NULL) {
+ /* Create a new object and allocate the scb instance if free.*/
+ if (machine_scb_is_free(id)) {
+ (*self_ptr) = mp_machine_uart_obj_alloc();
+ (*self_ptr)->id = id;
+ (*self_ptr)->scb_obj = machine_scb_obj_alloc(id, *self_ptr, machine_uart_scb_isr);
+ } else {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SCB %u is already in use by a machine.I2C or machine.SPI instance."), id);
+ }
+ (*is_new) = true;
+ }
+}
+
+static void machine_uart_baudrate_set(machine_uart_obj_t *self) {
+ /**
+ * TODO: Review clock configuration and formula to calculate the divider value.
+ * Clock sources, path and proper divider configuration.
+ * Given the clock peripheral = 100 MHz
+ * Oversampling = 12 (fixed for now)
+ * The formula to calculate the divider value is: divider = clock / (baudrate * oversample)
+ */
+ #define CLOCK_PERIPHERAL_FREQ_HZ (100000000UL)
+
+ Cy_SysClk_PeriphAssignDivider(self->scb_obj->clk, CY_SYSCLK_DIV_16_BIT, 0UL);
+ uint32_t divider = CLOCK_PERIPHERAL_FREQ_HZ / (self->baudrate * 12UL);
+ Cy_SysClk_PeriphSetDivider(CY_SYSCLK_DIV_16_BIT, 0UL, divider);
+ Cy_SysClk_PeriphEnableDivider(CY_SYSCLK_DIV_16_BIT, 0UL);
+}
+
+static inline uint8_t machine_uart_break_width(machine_uart_obj_t *self) {
+ return 1 + // Start bit
+ self->bits +
+ (self->parity != CY_SCB_UART_PARITY_NONE ? 1 : 0) +
+ (self->stop == CY_SCB_UART_STOP_BITS_1 ? 1 : 2) +
+ 1; // Extra bit, make the frame longer
+}
+
+static void machine_uart_hw_init(machine_uart_obj_t *self) {
+ cy_stc_scb_uart_config_t config =
+ {
+ .uartMode = CY_SCB_UART_STANDARD,
+ .enableMultiProcessorMode = false,
+ .smartCardRetryOnNack = false,
+ .irdaInvertRx = false,
+ .irdaEnableLowPowerReceiver = false,
+
+ .oversample = 12UL,
+
+ .enableMsbFirst = false,
+ .dataWidth = self->bits,
+ .parity = self->parity,
+ .stopBits = self->stop,
+ .enableInputFilter = false,
+ .breakWidth = machine_uart_break_width(self),
+ .dropOnFrameError = false,
+ .dropOnParityError = false,
+
+ .receiverAddress = 0UL,
+ .receiverAddressMask = 0UL,
+ .acceptAddrInFifo = false,
+
+ /**
+ * TODO: Enable CTS/RTS based on user config.
+ */
+ .enableCts = false,
+ .ctsPolarity = CY_SCB_UART_ACTIVE_LOW,
+ .rtsRxFifoLevel = 0UL,
+ .rtsPolarity = CY_SCB_UART_ACTIVE_LOW,
+
+ .rxFifoTriggerLevel = 0UL,
+ .rxFifoIntEnableMask = 0UL,
+ .txFifoTriggerLevel = 0UL,
+ .txFifoIntEnableMask = 0UL,
+ };
+
+ cy_en_scb_uart_status_t rslt = Cy_SCB_UART_Init(self->scb_obj->scb, &config, &self->ctx);
+ uart_assert_raise_val("failed to initialize UART hardware, error code: %d", rslt);
+
+ sys_int_init(&(self->scb_obj->irq));
+ Cy_SCB_SetRxInterruptMask(self->scb_obj->scb, CY_SCB_RX_INTR_NOT_EMPTY);
+
+ Cy_SCB_UART_Enable(self->scb_obj->scb);
+}
+
+static void machine_uart_hw_deinit(machine_uart_obj_t *self) {
+ Cy_SCB_UART_Disable(self->scb_obj->scb, &self->ctx);
+ sys_int_deinit(&self->scb_obj->irq);
+}
+
+static bool machine_uart_rx_wait(machine_uart_obj_t *self, uint32_t timeout_ms) {
+ uint32_t timeout_time_ms = mp_hal_ticks_ms() + timeout_ms;
+
+ while (ringbuf_avail(&self->rx_ringbuf) == 0) {
+ if (mp_hal_ticks_ms() > timeout_time_ms) {
+ return false;
+ }
+ mp_event_handle_nowait();
+ }
+
+ return true;
+}
+
+static bool machine_uart_tx_wait(machine_uart_obj_t *self, uint32_t timeout_ms) {
+ uint32_t timeout_time_ms = mp_hal_ticks_ms() + timeout_ms;
+ while ((Cy_SCB_UART_GetTxFifoStatus(self->scb_obj->scb) & CY_SCB_UART_TX_NOT_FULL) == 0) {
+ if (mp_hal_ticks_ms() > timeout_time_ms) {
+ return false;
+ }
+ mp_event_handle_nowait();
+ }
+
+ return true;
+}
+
+/******************************************************************************/
+// MicroPython bindings
+
+static void mp_machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "UART(tx="MP_HAL_PIN_FMT ", "
+ "rx="MP_HAL_PIN_FMT ", "
+ "baudrate=%ld, "
+ "bits=%u, "
+ "parity=%u, "
+ "stop=%u, ",
+ mp_hal_pin_name(self->tx),
+ mp_hal_pin_name(self->rx),
+ self->baudrate,
+ self->bits,
+ self->parity,
+ self->stop
+ );
+
+ if (self->rts != NULL) {
+ mp_printf(print, "rts="MP_HAL_PIN_FMT ", ", mp_hal_pin_name(self->rts));
+ }
+
+ if (self->cts != NULL) {
+ mp_printf(print, "cts="MP_HAL_PIN_FMT ", ", mp_hal_pin_name(self->cts));
+ }
+
+ mp_printf(print, "flow=%u, "
+ "timeout=%ld, "
+ "timeout_char=%ld, "
+ "rxbuf=%d)",
+ self->flow,
+ self->timeout_ms,
+ self->timeout_char_ms,
+ self->rx_ringbuf.size
+ );
+}
+
+#define DEFAULT_UART_BAUDRATE (115200)
+#define DEFAULT_UART_BITS (8)
+#define DEFAULT_UART_STOP (1)
+#define DEFAULT_UART_RXBUF_SIZE (256)
+
+enum {
+ ARG_tx, ARG_rx,
+ ARG_baudrate, ARG_bits, ARG_parity, ARG_stop,
+ ARG_rts, ARG_cts, ARG_flow,
+ ARG_timeout, ARG_timeout_char, ARG_rxbuf
+};
+
+static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_tx, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_rx, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_baudrate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_UART_BAUDRATE} },
+ { MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_UART_BITS} },
+ { MP_QSTR_parity, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_stop, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_UART_STOP} },
+ { MP_QSTR_rts, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_cts, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_flow, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = UART_FLOW_CONTROL_NONE} },
+ { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_timeout_char, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_rxbuf, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_UART_RXBUF_SIZE} },
+};
+
+/**
+ * Core init implementation. Accepts a pointer-to-pointer for self so it can
+ * allocate a new object when *self_ptr is NULL (constructor path). When called
+ * from init() the object is already allocated so *self_ptr is non-NULL.
+ */
+static void machine_uart_init_impl(machine_uart_obj_t **self_ptr, int uart_id, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ /* -- TX / RX pins -- */
+ uint8_t pin_num = 2U;
+ #define MAX_MACHINE_UART_OBJ_AF_PINS 4
+ mp_hal_pin_af_config_t uart_pins_af_config[MAX_MACHINE_UART_OBJ_AF_PINS] = {
+ /* TX */ MP_HAL_PIN_AF_CONF_INIT_GPIO_SIGNAL(CY_GPIO_DM_STRONG_IN_OFF, 1, MACHINE_PIN_AF_SIGNAL_UART_TX),
+ /* RX */ MP_HAL_PIN_AF_CONF_INIT_GPIO_SIGNAL(CY_GPIO_DM_HIGHZ, 0, MACHINE_PIN_AF_SIGNAL_UART_RX),
+ };
+
+ if (args[ARG_tx].u_obj != mp_const_none) {
+ mp_hal_pin_obj_t tx_pin = mp_hal_get_pin_obj(args[ARG_tx].u_obj);
+ MP_HAL_PIN_AF_CONF_SET_PIN_AF(uart_pins_af_config[0], tx_pin);
+ }
+
+ if (args[ARG_rx].u_obj != mp_const_none) {
+ mp_hal_pin_obj_t rx_pin = mp_hal_get_pin_obj(args[ARG_rx].u_obj);
+ MP_HAL_PIN_AF_CONF_SET_PIN_AF(uart_pins_af_config[1], rx_pin);
+ }
+
+ /* -- Flow control pins -- */
+ uint32_t flow = (uint32_t)args[ARG_flow].u_int;
+
+ /** TODO: Currently throw error if flow is not NONE.
+ * This needs to be implemented
+ * {
+ */
+ if (flow != UART_FLOW_CONTROL_NONE) {
+ mp_raise_ValueError(MP_ERROR_TEXT("flow control not supported yet. Keep flow=0"));
+ }
+ /** } */
+
+ #define PIN_AF_CONFIG_INDEX_NONE (0xFF)
+ uint8_t pin_af_conf_rts_index = PIN_AF_CONFIG_INDEX_NONE;
+ if (flow & UART_FLOW_CONTROL_RTS) {
+ pin_af_conf_rts_index = pin_num;
+ pin_num++;
+ uart_pins_af_config[pin_af_conf_rts_index] = MP_HAL_PIN_AF_CONF_INIT_GPIO_SIGNAL(CY_GPIO_DM_STRONG_IN_OFF, 1, MACHINE_PIN_AF_SIGNAL_UART_RTS);
+ if (args[ARG_rts].u_obj != mp_const_none) {
+ mp_hal_pin_obj_t rts_pin = mp_hal_get_pin_obj(args[ARG_rts].u_obj);
+ MP_HAL_PIN_AF_CONF_SET_PIN_AF(uart_pins_af_config[pin_af_conf_rts_index], rts_pin);
+ }
+ }
+
+ uint8_t pin_af_conf_cts_index = PIN_AF_CONFIG_INDEX_NONE;
+ if (flow & UART_FLOW_CONTROL_CTS) {
+ pin_af_conf_cts_index = pin_num;
+ pin_num++;
+ uart_pins_af_config[pin_af_conf_cts_index] = MP_HAL_PIN_AF_CONF_INIT_GPIO_SIGNAL(CY_GPIO_DM_HIGHZ, 0, MACHINE_PIN_AF_SIGNAL_UART_CTS);
+ if (args[ARG_cts].u_obj != mp_const_none) {
+ mp_hal_pin_obj_t cts_pin = mp_hal_get_pin_obj(args[ARG_cts].u_obj);
+ MP_HAL_PIN_AF_CONF_SET_PIN_AF(uart_pins_af_config[pin_af_conf_cts_index], cts_pin);
+ }
+ }
+
+ /* -- Resolve ID - pin match -- */
+ machine_pin_af_unit_t fn_unit = (machine_pin_af_unit_t)uart_id;
+ mp_hal_periph_pins_af_resolve_fn_unit(uart_pins_af_config, pin_num, MACHINE_PIN_AF_FN_UART, &fn_unit);
+
+ /* -- Resolve not provided AF pins -- */
+ mp_hal_periph_pins_af_resolve_pin_af(uart_pins_af_config, pin_num, fn_unit);
+
+ /* -- Baudrate -- */
+ uint32_t baudrate = (uint32_t)args[ARG_baudrate].u_int;
+ if (baudrate == 0U) {
+ mp_raise_ValueError(MP_ERROR_TEXT("baudrate must be non-zero"));
+ }
+
+ /* -- Data bits -- */
+ uint8_t bits = args[ARG_bits].u_int;
+ /**
+ * TODO: Add support for 7 (or below <8 bits) and 9 bits.
+ */
+ if (bits != 8) {
+ mp_raise_ValueError(MP_ERROR_TEXT("bits must be 8"));
+ }
+
+ /* -- Parity -- */
+ mp_obj_t parity_arg = args[ARG_parity].u_obj;
+ uint8_t parity;
+ if (parity_arg == mp_const_none) {
+ parity = (uint8_t)CY_SCB_UART_PARITY_NONE;
+ } else {
+ int p = mp_obj_get_int(parity_arg);
+ if (p == 0) {
+ parity = (uint8_t)CY_SCB_UART_PARITY_EVEN;
+ } else if (p == 1) {
+ parity = (uint8_t)CY_SCB_UART_PARITY_ODD;
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("parity must be None, 0 (even) or 1 (odd)"));
+ }
+ }
+
+ /* -- Stop bits -- */
+ int stop_arg = args[ARG_stop].u_int;
+ uint8_t stop;
+ if (stop_arg == 1) {
+ stop = (uint8_t)CY_SCB_UART_STOP_BITS_1;
+ } else if (stop_arg == 2) {
+ stop = (uint8_t)CY_SCB_UART_STOP_BITS_2;
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("stop bits must be 1 or 2"));
+ }
+
+ /* -- Timeouts -- */
+ if (args[ARG_timeout].u_int < 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("timeout must be non-negative"));
+ }
+ uint32_t timeout_ms = args[ARG_timeout].u_int;
+
+ if (args[ARG_timeout_char].u_int < 0) {
+ mp_raise_ValueError(MP_ERROR_TEXT("timeout_char must be non-negative"));
+ }
+ uint32_t timeout_char_ms = args[ARG_timeout_char].u_int;
+ /* Make sure timeout_char is at least as long as a whole character (13 bits to be safe). */
+ uint32_t min_timeout_char = 13000 / baudrate + 1;
+ if (timeout_char_ms < min_timeout_char) {
+ timeout_char_ms = min_timeout_char;
+ }
+
+ machine_uart_obj_t *self = *self_ptr;
+
+ /* -- Object allocation -- */
+ bool is_new = false;
+ bool is_make_obj_required = (*self_ptr == NULL) ? true : false;
+ if (is_make_obj_required) {
+ machine_uart_obj_make_or_reuse(self_ptr, fn_unit, &is_new);
+ self = *self_ptr;
+ }
+
+ /* -- Reinitialization reset -- */
+ /* For reused UART() object or init() path */
+ if (!is_new) {
+ machine_uart_hw_deinit(self);
+ m_del(uint8_t, self->rx_ringbuf.buf, self->rx_ringbuf.size);
+ }
+
+ /* -- UART params init -- */
+ self->tx = uart_pins_af_config[0].pin;
+ self->rx = uart_pins_af_config[1].pin;
+ self->rts = (pin_af_conf_rts_index != PIN_AF_CONFIG_INDEX_NONE) ? uart_pins_af_config[pin_af_conf_rts_index].pin : MP_OBJ_NULL;
+ self->cts = (pin_af_conf_cts_index != PIN_AF_CONFIG_INDEX_NONE) ? uart_pins_af_config[pin_af_conf_cts_index].pin : MP_OBJ_NULL;
+ self->flow = flow;
+ self->baudrate = baudrate;
+ self->bits = bits;
+ self->parity = parity;
+ self->stop = stop;
+ self->timeout_ms = timeout_ms;
+ self->timeout_char_ms = timeout_char_ms;
+
+ /* -- IRQ init -- */
+ #if MICROPY_PY_MACHINE_UART_IRQ
+ self->mp_irq_obj = NULL;
+ self->mp_irq_trigger = 0;
+ self->mp_irq_flags = 0;
+ #endif
+
+ /* -- Initialise hardware -- */
+ nlr_buf_t nlr;
+ if (nlr_push(&nlr) == 0) {
+ ringbuf_alloc(&self->rx_ringbuf, args[ARG_rxbuf].u_int);
+ mp_hal_periph_pins_af_init(uart_pins_af_config, pin_num);
+ machine_uart_baudrate_set(self);
+ machine_uart_hw_init(self);
+ nlr_pop();
+ } else {
+ // Ensure partially-initialized instances are fully released on init failure.
+ machine_uart_hw_deinit(self);
+ m_del(uint8_t, self->rx_ringbuf.buf, self->rx_ringbuf.size);
+ nlr_raise(nlr.ret_val);
+ }
+}
+
+static mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true);
+
+ /**
+ * Only the constructor takes the id.
+ * Its validation together with the rest of the arguments is
+ * delegated to machine_uart_init_implt() which also allocates
+ * the object self = NULL.
+ */
+ int uart_id = MACHINE_PIN_AF_UNIT_NONE;
+ size_t init_n_args = n_args;
+ const mp_obj_t *init_args = args;
+ if (n_args > 0 && mp_obj_is_int(args[0])) {
+ uart_id = mp_obj_get_int(args[0]);
+ if (uart_id < 0 || uart_id >= MICROPY_PY_MACHINE_SCB_NUM_ENTRIES) {
+ mp_raise_ValueError(MP_ERROR_TEXT("UART id out of range"));
+ }
+ init_n_args = n_args - 1;
+ init_args = args + 1;
+ } else if (n_args > 0) {
+ mp_raise_TypeError(MP_ERROR_TEXT("UART id must be an integer"));
+ }
+
+ machine_uart_obj_t *self = NULL;
+ mp_map_t kw_args;
+ mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
+ machine_uart_init_impl(&self, uart_id, init_n_args, init_args, &kw_args);
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static void mp_machine_uart_deinit(machine_uart_obj_t *self) {
+ machine_uart_hw_deinit(self);
+ m_del(uint8_t, self->rx_ringbuf.buf, self->rx_ringbuf.size);
+ machine_scb_obj_free(self->scb_obj);
+ mp_machine_uart_obj_free(self);
+}
+
+static void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ machine_uart_init_impl(&self, self->id, n_args, pos_args, kw_args);
+}
+
+static mp_int_t mp_machine_uart_any(machine_uart_obj_t *self) {
+ return ringbuf_avail(&self->rx_ringbuf);
+}
+
+static bool mp_machine_uart_txdone(machine_uart_obj_t *self) {
+ return Cy_SCB_UART_IsTxComplete(self->scb_obj->scb);
+}
+
+#if MICROPY_PY_MACHINE_UART_SENDBREAK
+static void mp_machine_uart_sendbreak(machine_uart_obj_t *self) {
+ Cy_SCB_UART_SendBreakBlocking(self->scb_obj->scb, machine_uart_break_width(self));
+}
+#endif
+
+#if MICROPY_PY_MACHINE_UART_READCHAR_WRITECHAR
+static mp_int_t mp_machine_uart_readchar(machine_uart_obj_t *self) {
+ if (machine_uart_rx_wait(self, self->timeout_ms)) {
+ return (uint8_t)ringbuf_get(&self->rx_ringbuf);
+ }
+
+ return MP_STREAM_ERROR;
+}
+
+static void mp_machine_uart_writechar(machine_uart_obj_t *self, uint16_t data) {
+ if (machine_uart_tx_wait(self, self->timeout_ms)) {
+ Cy_SCB_UART_Put(self->scb_obj->scb, (uint32_t)data);
+ } else {
+ mp_raise_OSError(MP_ETIMEDOUT);
+ }
+}
+#endif
+
+static mp_uint_t mp_machine_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ if (size == 0) {
+ return 0;
+ }
+
+ /* wait for first char to become available */
+ if (!machine_uart_rx_wait(self, self->timeout_ms)) {
+ /* return EAGAIN error to indicate non-blocking (then read() method returns None) */
+ *errcode = MP_EAGAIN;
+ return MP_STREAM_ERROR;
+ }
+
+ uint32_t read_count = 0;
+ uint32_t to_read;
+ do {
+ to_read = (size < ringbuf_avail(&self->rx_ringbuf)) ? size : ringbuf_avail(&self->rx_ringbuf);
+ ringbuf_memcpy_get_internal(&self->rx_ringbuf, (uint8_t *)buf_in + read_count, to_read);
+ read_count += to_read;
+ size -= to_read;
+ } while (size > 0 && machine_uart_rx_wait(self, self->timeout_char_ms));
+
+ return read_count;
+}
+
+static mp_uint_t mp_machine_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ /* wait to be able to write the first character. */
+ if (!machine_uart_tx_wait(self, self->timeout_ms)) {
+ /* EAGAIN causes write to return None */
+ *errcode = MP_EAGAIN;
+ return MP_STREAM_ERROR;
+ }
+
+ uint32_t write_count = 0;
+ do {
+ uint32_t written = Cy_SCB_UART_PutArray(self->scb_obj->scb, (void *)buf_in, size);
+ buf_in = (const uint8_t *)buf_in + written;
+ size -= written;
+ write_count += written;
+ } while (size > 0 && machine_uart_tx_wait(self, self->timeout_char_ms));
+
+ return write_count;
+}
+
+static mp_uint_t mp_machine_uart_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_uint_t ret;
+ if (request == MP_STREAM_POLL) {
+ uintptr_t flags = arg;
+ ret = 0;
+ if ((flags & MP_STREAM_POLL_RD) && ringbuf_avail(&self->rx_ringbuf) > 0) {
+ ret |= MP_STREAM_POLL_RD;
+ }
+ if ((flags & MP_STREAM_POLL_WR) && (Cy_SCB_UART_GetTxFifoStatus(self->scb_obj->scb) & CY_SCB_UART_TX_NOT_FULL)) {
+ ret |= MP_STREAM_POLL_WR;
+ }
+ } else if (request == MP_STREAM_FLUSH) {
+ /**
+ * Estimate the time required to shift out all remaining bytes from the TX hardware pipeline.
+ * Cy_SCB_UART_GetNumInTxFifo() returns the exact byte count in the TX FIFO but explicitly
+ * excludes the TX shifter register (1 byte). Adding 1 accounts for that shifter. The sum is
+ * multiplied by 13 bits per symbol (1 start + 8 data + 2 stop, 1 parity), and multiplied by 2
+ * (for safety margin) and divided by the baudrate to get the duration in milliseconds.
+ * uint32_t is sufficient: max FIFO is < 256 bytes, so the worst-case duration is well within
+ * the uint32_t range even at the lowest supported baud rates.
+ */
+ uint32_t timeout = mp_hal_ticks_ms() + (1
+ + Cy_SCB_UART_GetNumInTxFifo(self->scb_obj->scb)
+ ) * 13000 * 2 / self->baudrate;
+ do {
+ if (mp_machine_uart_txdone(self)) {
+ return 0;
+ }
+ mp_event_handle_nowait();
+ } while (mp_hal_ticks_ms() < timeout);
+ *errcode = MP_ETIMEDOUT;
+ ret = MP_STREAM_ERROR;
+ } else {
+ *errcode = MP_EINVAL;
+ ret = MP_STREAM_ERROR;
+ }
+ return ret;
+}
+
+void machine_uart_deinit_all() {
+ for (uint8_t i = 0; i < MICROPY_PY_MACHINE_UART_NUM_ENTRIES; i++) {
+ machine_uart_obj_t *self = MP_STATE_PORT(machine_uart_obj[i]);
+ if (self != NULL) {
+ mp_machine_uart_deinit(self);
+ }
+ }
+}
+
+#if MICROPY_PY_MACHINE_UART_IRQ
+
+#define MP_UART_ALLOWED_FLAGS (CY_SCB_RX_INTR_NOT_EMPTY | \
+ CY_SCB_RX_INTR_UART_BREAK_DETECT | \
+ CY_SCB_TX_INTR_UART_DONE)
+
+static void machine_uart_irq_rx_idle(machine_uart_obj_t *self) {
+ /**
+ * Use CY_SCB_RX_INTR_NOT_EMPTY as RX_IDLE combined with
+ * checking if the RX FIFO is empty. Therefore this function
+ * will be called after reading all the data in the
+ * RX FIFO.
+ */
+ if ((self->mp_irq_obj != NULL) &&
+ (self->mp_irq_obj->handler != NULL) &&
+ (self->mp_irq_trigger & CY_SCB_RX_INTR_NOT_EMPTY) &&
+ (Cy_SCB_UART_GetNumInRxFifo(self->scb_obj->scb) == 0)) {
+ self->mp_irq_flags |= CY_SCB_RX_INTR_NOT_EMPTY;
+ mp_irq_handler(self->mp_irq_obj);
+ }
+}
+
+static void machine_uart_irq_rx_break(machine_uart_obj_t *self) {
+ if ((self->mp_irq_obj != NULL) &&
+ (self->mp_irq_obj->handler != NULL) &&
+ (self->mp_irq_trigger & CY_SCB_RX_INTR_UART_BREAK_DETECT)) {
+ self->mp_irq_flags |= CY_SCB_RX_INTR_UART_BREAK_DETECT;
+ mp_irq_handler(self->mp_irq_obj);
+ }
+}
+
+static void machine_uart_irq_tx_idle(machine_uart_obj_t *self) {
+ if ((self->mp_irq_obj != NULL) &&
+ (self->mp_irq_obj->handler != NULL) &&
+ (self->mp_irq_trigger & CY_SCB_TX_INTR_UART_DONE)) {
+ self->mp_irq_flags |= CY_SCB_TX_INTR_UART_DONE;
+ mp_irq_handler(self->mp_irq_obj);
+ }
+}
+
+static void machine_uart_irq_scb_config(machine_uart_obj_t *self, bool enable) {
+ if (enable) {
+ /**
+ * CY_SCB_RX_INTR_NOT_EMPTY is always enabled.
+ */
+ if (self->mp_irq_trigger & CY_SCB_RX_INTR_UART_BREAK_DETECT) {
+ /**
+ * Clear any stale sticky status before unmasking to prevent a
+ * spurious ISR from a break that occurred before this irq() call.
+ */
+ Cy_SCB_ClearRxInterrupt(self->scb_obj->scb, CY_SCB_RX_INTR_UART_BREAK_DETECT);
+ Cy_SCB_SetRxInterruptMask(self->scb_obj->scb, CY_SCB_RX_INTR_UART_BREAK_DETECT | CY_SCB_RX_INTR_NOT_EMPTY);
+ }
+ if (self->mp_irq_trigger & CY_SCB_TX_INTR_UART_DONE) {
+ /**
+ * Clear any stale sticky status before unmasking to prevent a
+ * spurious ISR from a TX done that occurred before this irq() call.
+ */
+ Cy_SCB_ClearTxInterrupt(self->scb_obj->scb, CY_SCB_TX_INTR_UART_DONE);
+ Cy_SCB_SetTxInterruptMask(self->scb_obj->scb, CY_SCB_TX_INTR_UART_DONE);
+ }
+ } else {
+ /**
+ * If disabling, we want to keep the CY_SCB_RX_INTR_NOT_EMPTY
+ * enabled to be able to fill the RX ring buffer and avoid data loss.
+ */
+ Cy_SCB_SetRxInterruptMask(self->scb_obj->scb, CY_SCB_RX_INTR_NOT_EMPTY);
+ Cy_SCB_SetTxInterruptMask(self->scb_obj->scb, 0);
+ }
+}
+
+static mp_uint_t uart_irq_trigger(mp_obj_t self_in, mp_uint_t new_trigger) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ machine_uart_irq_scb_config(self, false);
+ self->mp_irq_trigger = new_trigger;
+ machine_uart_irq_scb_config(self, true);
+ return 0;
+}
+
+static mp_uint_t uart_irq_info(mp_obj_t self_in, mp_uint_t info_type) {
+ machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (info_type == MP_IRQ_INFO_FLAGS) {
+ return self->mp_irq_flags;
+ } else if (info_type == MP_IRQ_INFO_TRIGGERS) {
+ return self->mp_irq_trigger;
+ }
+ return 0;
+}
+
+const mp_irq_methods_t uart_irq_methods = {
+ .trigger = uart_irq_trigger,
+ .info = uart_irq_info,
+};
+
+static mp_irq_obj_t *mp_machine_uart_irq(machine_uart_obj_t *self, bool any_args, mp_arg_val_t *args) {
+ if (self->mp_irq_obj == NULL) {
+ self->mp_irq_trigger = 0;
+ self->mp_irq_obj = mp_irq_new(&uart_irq_methods, MP_OBJ_FROM_PTR(self));
+ }
+
+ if (any_args) {
+ /* Check the handler */
+ mp_obj_t handler = args[MP_IRQ_ARG_INIT_handler].u_obj;
+ if (handler != mp_const_none && !mp_obj_is_callable(handler)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("handler must be None or callable"));
+ }
+
+ /* Check the trigger */
+ mp_uint_t trigger = args[MP_IRQ_ARG_INIT_trigger].u_int;
+ mp_uint_t not_supported = trigger & ~MP_UART_ALLOWED_FLAGS;
+ if (trigger != 0 && not_supported) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("trigger 0x%08x unsupported"), not_supported);
+ }
+
+ /* Reconfigure user IRQs */
+ machine_uart_irq_scb_config(self, false);
+ self->mp_irq_obj->handler = handler;
+ self->mp_irq_obj->ishard = args[MP_IRQ_ARG_INIT_hard].u_bool;
+ self->mp_irq_trigger = trigger;
+ machine_uart_irq_scb_config(self, true);
+ }
+
+ return self->mp_irq_obj;
+}
+#endif
diff --git a/ports/psoc-edge/main.c b/ports/psoc-edge/main.c
new file mode 100644
index 00000000000..a98236a954d
--- /dev/null
+++ b/ports/psoc-edge/main.c
@@ -0,0 +1,275 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// std includes
+#include
+#include
+#include
+
+
+// MTB includes
+#include "cybsp.h"
+#include "retarget_io_init.h"
+
+#if MICROPY_PY_FREERTOS
+// FreeRTOS header files
+#include
+#include
+#endif
+
+// micropython includes
+#include "py/builtin.h"
+#include "py/compile.h"
+#include "py/gc.h"
+#include "py/mperrno.h"
+#include "py/stackctrl.h"
+#include "py/runtime.h"
+#include "shared/runtime/gchelper.h"
+#include "shared/runtime/pyexec.h"
+#include "shared/readline/readline.h"
+
+#if MICROPY_PY_LWIP
+#include "lwip/init.h"
+#include "lwip/apps/mdns.h"
+#endif
+
+#if MICROPY_PY_NETWORK
+#include "extmod/modnetwork.h"
+#include "network_ifx_wcm.h"
+#endif
+
+// port-specific includes
+
+#if MICROPY_PY_FREERTOS
+// FreeRTOS task parameters for the MicroPython task
+#define MPY_TASK_STACK_SIZE (5120u)
+#define MPY_TASK_PRIORITY (1u)
+
+// GC heap boundaries come from --defsym in the Makefile (MICROPY_C_HEAP_SIZE).
+// __GcHeapStart = __HeapBase + MICROPY_C_HEAP_SIZE (default: 0x16000 WiFi, 0x8000 no-WiFi)
+// __GcHeapEnd = __HeapLimit
+// [__HeapBase .. __GcHeapStart) is the C-malloc zone for WiFi/WCM/LwIP.
+// FreeRTOS uses its own static heap (configTOTAL_HEAP_SIZE) independently.
+#if MICROPY_ENABLE_GC
+extern uint8_t __GcHeapStart, __GcHeapEnd;
+#endif
+#else
+#if MICROPY_ENABLE_GC
+extern uint8_t __StackTop, __StackSize;
+extern uint8_t __HeapBase, __HeapLimit;
+#endif
+#endif
+
+typedef enum {
+ BOOT_MODE_NORMAL,
+ BOOT_MODE_SAFE
+} boot_mode_t;
+
+extern void machine_rtc_init_all(void);
+extern void machine_pin_irq_deinit_all(void);
+extern void machine_uart_deinit_all(void);
+extern void machine_hw_i2c_deinit_all(void);
+extern void machine_spi_deinit_all(void);
+#if MICROPY_PY_MACHINE_SPI_TARGET
+extern void machine_spi_target_deinit_all(void);
+#endif
+extern void machine_pdm_pcm_deinit_all(void);
+extern void machine_ipc_deinit_all(void);
+extern void mp_hal_ticks_init(void);
+extern void machine_timer_deinit_all(void);
+
+void micropython_task(void *arg);
+#if MICROPY_PY_FREERTOS
+static TaskHandle_t mpy_task_handle;
+#endif
+
+boot_mode_t check_boot_mode(void) {
+ boot_mode_t boot_mode;
+
+ // Initialize user LED
+ Cy_GPIO_Pin_FastInit(CYBSP_USER_LED_PORT, CYBSP_USER_LED_NUM, CY_GPIO_DM_STRONG, 0, HSIOM_SEL_GPIO);
+
+ // Initialize user button
+ Cy_GPIO_Pin_FastInit(CYBSP_USER_BTN1_PORT, CYBSP_USER_BTN1_NUM, CY_GPIO_DM_PULLUP, 1, HSIOM_SEL_GPIO);
+
+ // Added 5ms delay to allow bypass capacitor connected to the user button without external pull-up to charge.
+ Cy_SysLib_Delay(5);
+
+ if (Cy_GPIO_Read(CYBSP_USER_BTN1_PORT, CYBSP_USER_BTN1_NUM) == CYBSP_BTN_PRESSED) {
+ // Blink LED twice to indicate safe boot mode was entered
+ for (int i = 0; i < 4; i++) {
+ Cy_GPIO_Inv(CYBSP_USER_LED_PORT, CYBSP_USER_LED_NUM);
+ Cy_SysLib_Delay(500); // delay in milliseconds
+ }
+ boot_mode = BOOT_MODE_SAFE;
+ mp_printf(&mp_plat_print, "- DEVICE IS IN SAFE BOOT MODE -\n");
+ } else {
+ boot_mode = BOOT_MODE_NORMAL;
+ }
+
+ // Turn off LED after boot mode check
+ Cy_GPIO_Clr(CYBSP_USER_LED_PORT, CYBSP_USER_LED_NUM);
+
+ return boot_mode;
+}
+
+int main(void) {
+ cy_rslt_t result = CY_RSLT_SUCCESS;
+
+ /* Initialize the device and board peripherals. */
+ result = cybsp_init();
+ if (result != CY_RSLT_SUCCESS) {
+ CY_ASSERT(0);
+ }
+
+ /* Enable global interrupts */
+ __enable_irq();
+
+ /* Initialize retarget-io middleware */
+ init_retarget_io();
+
+ #if MICROPY_PY_FREERTOS
+ xTaskCreate(micropython_task, "MicroPython task", MPY_TASK_STACK_SIZE, NULL, MPY_TASK_PRIORITY, &mpy_task_handle);
+ vTaskStartScheduler();
+ #else
+ micropython_task(NULL);
+ #endif
+
+ // Should never get here
+ CY_ASSERT(0);
+ return 0;
+}
+
+
+void micropython_task(void *arg) {
+ // One-time initialisation – must be before the soft_reset label.
+ #if MICROPY_ENABLE_GC
+ #if MICROPY_PY_FREERTOS
+ if (&__GcHeapEnd <= &__GcHeapStart) {
+ CY_ASSERT(0);
+ }
+ gc_init(&__GcHeapStart, &__GcHeapEnd);
+ mp_cstack_init_with_top((void *)&arg, MPY_TASK_STACK_SIZE * sizeof(StackType_t));
+ #else
+ gc_init(&__HeapBase, &__HeapLimit);
+ mp_cstack_init_with_top((void *)&__StackTop, (size_t)&__StackSize);
+ #endif
+ #endif
+
+ mp_hal_ticks_init();
+ #if MICROPY_PY_NETWORK
+ network_hw_init();
+ #endif
+
+soft_reset:
+ machine_rtc_init_all();
+ mp_init();
+
+ readline_init0();
+
+ #if MICROPY_PY_NETWORK
+ network_init();
+ mod_network_init();
+ #endif
+
+ #if MICROPY_VFS
+ mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_));
+ mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib));
+
+
+ #if MICROPY_VFS_LFS2
+ pyexec_frozen_module("_boot.py", false);
+ #endif
+ #endif
+
+ if (check_boot_mode() == BOOT_MODE_NORMAL) {
+ // Execute user scripts.
+ int ret = pyexec_file_if_exists("/boot.py");
+
+ if (ret & PYEXEC_FORCED_EXIT) {
+ goto soft_reset;
+ }
+
+ if (pyexec_mode_kind == PYEXEC_MODE_FRIENDLY_REPL) {
+ ret = pyexec_file_if_exists("/main.py");
+
+ if (ret & PYEXEC_FORCED_EXIT) {
+ goto soft_reset;
+ }
+ }
+ }
+
+ for (;;) {
+ if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) {
+ if (pyexec_raw_repl() != 0) {
+ break;
+ }
+ } else {
+ if (pyexec_friendly_repl() != 0) {
+ break;
+ }
+ }
+ }
+
+ mp_printf(&mp_plat_print, "MPY: soft reboot\n");
+
+ machine_pin_irq_deinit_all();
+ machine_uart_deinit_all();
+ machine_hw_i2c_deinit_all();
+ machine_spi_deinit_all();
+ #if MICROPY_PY_MACHINE_SPI_TARGET
+ machine_spi_target_deinit_all();
+ #endif
+ machine_pdm_pcm_deinit_all();
+ machine_ipc_deinit_all();
+ machine_timer_deinit_all();
+
+ #if MICROPY_PY_NETWORK
+ mod_network_deinit();
+ network_deinit();
+ #endif
+
+ #if MICROPY_ENABLE_GC
+ gc_sweep_all();
+ #endif
+ mp_deinit();
+
+ goto soft_reset;
+}
+
+#if MICROPY_ENABLE_GC
+void gc_collect(void) {
+ gc_collect_start();
+ gc_helper_collect_regs_and_stack();
+ gc_collect_end();
+}
+#endif
+
+// Handle uncaught exceptions (should never be reached in a correct C implementation).
+void nlr_jump_fail(void *val) {
+ for (;;) {
+ }
+}
diff --git a/ports/psoc-edge/mbedtls/mbedtls_config_port.h b/ports/psoc-edge/mbedtls/mbedtls_config_port.h
new file mode 100644
index 00000000000..bdb05e3900b
--- /dev/null
+++ b/ports/psoc-edge/mbedtls/mbedtls_config_port.h
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2024 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef PSOCEDGE_MPY_MBEDTLS_USER_CONFIG_HEADER
+#define PSOCEDGE_MPY_MBEDTLS_USER_CONFIG_HEADER
+
+// Include MTB's mbedTLS configuration (from cy-mbedtls-acceleration component)
+// when present in the workspace.
+#if defined(__has_include)
+#if __has_include("cy_mbedtls_config.h")
+#include "cy_mbedtls_config.h"
+#endif
+#endif
+
+// Set mbedtls configuration
+#define MBEDTLS_ECP_NIST_OPTIM
+#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
+
+#define MBEDTLS_GCM_C
+#define MBEDTLS_HAVE_TIME
+#define MBEDTLS_HAVE_TIME_DATE
+
+#define MBEDTLS_CIPHER_MODE_CTR
+#define MBEDTLS_CIPHER_MODE_CBC
+#define MBEDTLS_NO_PLATFORM_ENTROPY
+
+// Set MicroPython-specific options
+#define MICROPY_MBEDTLS_CONFIG_BARE_METAL (1)
+
+// Include common mbedtls configuration
+#include "mbedtls_config_common.h"
+
+// Bare-metal build: don't require libc/OS time providers.
+#undef MBEDTLS_HAVE_TIME
+#undef MBEDTLS_HAVE_TIME_DATE
+
+#endif
diff --git a/ports/psoc-edge/mbedtls/mbedtls_mtb_config.h b/ports/psoc-edge/mbedtls/mbedtls_mtb_config.h
new file mode 100644
index 00000000000..5631dd185af
--- /dev/null
+++ b/ports/psoc-edge/mbedtls/mbedtls_mtb_config.h
@@ -0,0 +1,875 @@
+/**
+ * \file config.h
+ *
+ * \brief Configuration options (set of defines)
+ *
+ * This set of compile-time options may be used to enable
+ * or disable features selectively, and reduce the global
+ * memory footprint.
+ */
+/*
+ * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This file is part of mbed TLS (https://tls.mbed.org)
+ */
+/*
+ * File copied from: https://github.com/Infineon/wifi-core-freertos-lwip-mbedtls/blob/release-v1.0.0/configs/mbedtls_user_config.h
+ */
+
+#ifndef MBEDTLS_USER_CONFIG_HEADER
+#define MBEDTLS_USER_CONFIG_HEADER
+
+
+/**
+ * Compiling Mbed TLS for Cortex-M0/0+/1/M23 cores with optimization enabled and on ARMC6 compiler results in errors.
+ * These cores lack the required full Thumb-2 support, causing the inline assembly to require more registers than available.
+ * The workaround is to use 'MULADDC_CANNOT_USE_R7' compilation flag, or without optimization flag,
+ * but note that this will compile without the assembly optimization.
+ *
+ * To read more about this issue, refer to https://github.com/ARMmbed/mbed-os/pull/14529/commits/86e7bc559b0d1a055bf84ea9249763d2349fb6e8
+ */
+
+#if defined(COMPONENT_CM0P) && defined(COMPONENT_ARM)
+#define MULADDC_CANNOT_USE_R7
+#endif
+
+
+/**
+ * \def MBEDTLS_HAVE_TIME_DATE
+ *
+ * System has time.h, time(), and an implementation for
+ * mbedtls_platform_gmtime_r() (see below).
+ * The time needs to be correct (not necessarily very accurate, but at least
+ * the date should be correct). This is used to verify the validity period of
+ * X.509 certificates.
+ *
+ * Comment if your system does not have a correct clock.
+ *
+ * \note mbedtls_platform_gmtime_r() is an abstraction in platform_util.h that
+ * behaves similarly to the gmtime_r() function from the C standard. Refer to
+ * the documentation for mbedtls_platform_gmtime_r() for more information.
+ *
+ * \note It is possible to configure an implementation for
+ * mbedtls_platform_gmtime_r() at compile-time by using the macro
+ * MBEDTLS_PLATFORM_GMTIME_R_ALT.
+ */
+#undef MBEDTLS_HAVE_TIME_DATE
+
+
+/**
+ * \def MBEDTLS_PLATFORM_EXIT_ALT
+ *
+ * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the
+ * function in the platform abstraction layer.
+ *
+ * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will
+ * provide a function "mbedtls_platform_set_printf()" that allows you to set an
+ * alternative printf function pointer.
+ *
+ * All these define require MBEDTLS_PLATFORM_C to be defined!
+ *
+ * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows;
+ * it will be enabled automatically by check_config.h
+ *
+ * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as
+ * MBEDTLS_PLATFORM_XXX_MACRO!
+ *
+ * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME
+ *
+ * Uncomment a macro to enable alternate implementation of specific base
+ * platform function
+ */
+// #define MBEDTLS_PLATFORM_EXIT_ALT
+#define MBEDTLS_PLATFORM_TIME_ALT
+// #define MBEDTLS_PLATFORM_FPRINTF_ALT
+// #define MBEDTLS_PLATFORM_PRINTF_ALT
+// #define MBEDTLS_PLATFORM_SNPRINTF_ALT
+// #define MBEDTLS_PLATFORM_NV_SEED_ALT
+// #define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT
+
+/**
+ * \def MBEDTLS_ENTROPY_HARDWARE_ALT
+ *
+ * Uncomment this macro to let mbed TLS use your own implementation of a
+ * hardware entropy collector.
+ *
+ * Your function must be called \c mbedtls_hardware_poll(), have the same
+ * prototype as declared in entropy_poll.h, and accept NULL as first argument.
+ *
+ * Uncomment to use your own hardware entropy collector.
+ */
+#define MBEDTLS_ENTROPY_HARDWARE_ALT
+/**
+ * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED
+ *
+ * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve
+ * module. By default all supported curves are enabled.
+ *
+ * Comment macros to disable the curve and functions for it
+ */
+#undef MBEDTLS_ECP_DP_SECP192R1_ENABLED
+#undef MBEDTLS_ECP_DP_SECP224R1_ENABLED
+// #define MBEDTLS_ECP_DP_SECP256R1_ENABLED
+#undef MBEDTLS_ECP_DP_SECP384R1_ENABLED
+#undef MBEDTLS_ECP_DP_SECP521R1_ENABLED
+#undef MBEDTLS_ECP_DP_SECP192K1_ENABLED
+#undef MBEDTLS_ECP_DP_SECP224K1_ENABLED
+#undef MBEDTLS_ECP_DP_SECP256K1_ENABLED
+#undef MBEDTLS_ECP_DP_BP256R1_ENABLED
+#undef MBEDTLS_ECP_DP_BP384R1_ENABLED
+#undef MBEDTLS_ECP_DP_BP512R1_ENABLED
+// #undef MBEDTLS_ECP_DP_CURVE25519_ENABLED
+#undef MBEDTLS_ECP_DP_CURVE448_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
+ *
+ * Enable the PSK based ciphersuite modes in SSL / TLS.
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA
+ */
+#undef MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
+
+
+/**
+ * \def MBEDTLS_PK_PARSE_EC_EXTENDED
+ *
+ * Enhance support for reading EC keys using variants of SEC1 not allowed by
+ * RFC 5915 and RFC 5480.
+ *
+ * Currently this means parsing the SpecifiedECDomain choice of EC
+ * parameters (only known groups are supported, not arbitrary domains, to
+ * avoid validation issues).
+ *
+ * Disable if you only need to support RFC 5915 + 5480 key formats.
+ */
+#undef MBEDTLS_PK_PARSE_EC_EXTENDED
+
+
+#undef MBEDTLS_FS_IO
+
+
+/**
+ * \def MBEDTLS_NO_PLATFORM_ENTROPY
+ *
+ * Do not use built-in platform entropy functions.
+ * This is useful if your platform does not support
+ * standards like the /dev/urandom or Windows CryptoAPI.
+ *
+ * Uncomment this macro to disable the built-in platform entropy functions.
+ */
+#define MBEDTLS_NO_PLATFORM_ENTROPY
+
+/**
+ * \def MBEDTLS_ENTROPY_FORCE_SHA256
+ *
+ * Force the entropy accumulator to use a SHA-256 accumulator instead of the
+ * default SHA-512 based one (if both are available).
+ *
+ * Requires: MBEDTLS_SHA256_C
+ *
+ * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option
+ * if you have performance concerns.
+ *
+ * This option is only useful if both MBEDTLS_SHA256_C and
+ * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used.
+ */
+#define MBEDTLS_ENTROPY_FORCE_SHA256
+
+/**
+ * \def MBEDTLS_SELF_TEST
+ *
+ * Enable the checkup functions (*_self_test).
+ */
+#undef MBEDTLS_SELF_TEST
+
+/**
+ * \def MBEDTLS_SSL_FALLBACK_SCSV
+ *
+ * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00).
+ *
+ * For servers, it is recommended to always enable this, unless you support
+ * only one version of TLS, or know for sure that none of your clients
+ * implements a fallback strategy.
+ *
+ * For clients, you only need this if you're using a fallback strategy, which
+ * is not recommended in the first place, unless you absolutely need it to
+ * interoperate with buggy (version-intolerant) servers.
+ *
+ * Comment this macro to disable support for FALLBACK_SCSV
+ */
+#undef MBEDTLS_SSL_FALLBACK_SCSV
+
+/**
+ * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING
+ *
+ * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0.
+ *
+ * This is a countermeasure to the BEAST attack, which also minimizes the risk
+ * of interoperability issues compared to sending 0-length records.
+ *
+ * Comment this macro to disable 1/n-1 record splitting.
+ */
+#undef MBEDTLS_SSL_CBC_RECORD_SPLITTING
+
+/**
+ * \def MBEDTLS_SSL_RENEGOTIATION
+ *
+ * Enable support for TLS renegotiation.
+ *
+ * The two main uses of renegotiation are (1) refresh keys on long-lived
+ * connections and (2) client authentication after the initial handshake.
+ * If you don't need renegotiation, it's probably better to disable it, since
+ * it has been associated with security issues in the past and is easy to
+ * misuse/misunderstand.
+ *
+ * Comment this to disable support for renegotiation.
+ *
+ * \note Even if this option is disabled, both client and server are aware
+ * of the Renegotiation Indication Extension (RFC 5746) used to
+ * prevent the SSL renegotiation attack (see RFC 5746 Sect. 1).
+ * (See \c mbedtls_ssl_conf_legacy_renegotiation for the
+ * configuration of this extension).
+ *
+ */
+#undef MBEDTLS_SSL_RENEGOTIATION
+
+/**
+ * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
+ *
+ * Enable support for receiving and parsing SSLv2 Client Hello messages for the
+ * SSL Server module (MBEDTLS_SSL_SRV_C).
+ *
+ * Uncomment this macro to enable support for SSLv2 Client Hello messages.
+ */
+// #define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
+
+/**
+ * \def MBEDTLS_SSL_PROTO_TLS1
+ *
+ * Enable support for TLS 1.0.
+ *
+ * Requires: MBEDTLS_MD5_C
+ * MBEDTLS_SHA1_C
+ *
+ * Comment this macro to disable support for TLS 1.0
+ */
+#undef MBEDTLS_SSL_PROTO_TLS1
+
+/**
+ * \def MBEDTLS_SSL_PROTO_TLS1_1
+ *
+ * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled).
+ *
+ * Requires: MBEDTLS_MD5_C
+ * MBEDTLS_SHA1_C
+ *
+ * Comment this macro to disable support for TLS 1.1 / DTLS 1.0
+ */
+#undef MBEDTLS_SSL_PROTO_TLS1_1
+
+/**
+ * \def MBEDTLS_SSL_PROTO_DTLS
+ *
+ * Enable support for DTLS (all available versions).
+ *
+ * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0,
+ * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2.
+ *
+ * Requires: MBEDTLS_SSL_PROTO_TLS1_1
+ * or MBEDTLS_SSL_PROTO_TLS1_2
+ *
+ * Comment this macro to disable support for DTLS
+ */
+#undef MBEDTLS_SSL_PROTO_DTLS
+
+/**
+ * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY
+ *
+ * Enable support for the anti-replay mechanism in DTLS.
+ *
+ * Requires: MBEDTLS_SSL_TLS_C
+ * MBEDTLS_SSL_PROTO_DTLS
+ *
+ * \warning Disabling this is often a security risk!
+ * See mbedtls_ssl_conf_dtls_anti_replay() for details.
+ *
+ * Comment this to disable anti-replay in DTLS.
+ */
+#undef MBEDTLS_SSL_DTLS_ANTI_REPLAY
+
+/**
+ * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY
+ *
+ * Enable support for HelloVerifyRequest on DTLS servers.
+ *
+ * This feature is highly recommended to prevent DTLS servers being used as
+ * amplifiers in DoS attacks against other hosts. It should always be enabled
+ * unless you know for sure amplification cannot be a problem in the
+ * environment in which your server operates.
+ *
+ * \warning Disabling this can ba a security risk! (see above)
+ *
+ * Requires: MBEDTLS_SSL_PROTO_DTLS
+ *
+ * Comment this to disable support for HelloVerifyRequest.
+ */
+#undef MBEDTLS_SSL_DTLS_HELLO_VERIFY
+
+/**
+ * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
+ *
+ * Enable server-side support for clients that reconnect from the same port.
+ *
+ * Some clients unexpectedly close the connection and try to reconnect using the
+ * same source port. This needs special support from the server to handle the
+ * new connection securely, as described in section 4.2.8 of RFC 6347. This
+ * flag enables that support.
+ *
+ * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY
+ *
+ * Comment this to disable support for clients reusing the source port.
+ */
+#undef MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
+
+/**
+ * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT
+ *
+ * Enable support for a limit of records with bad MAC.
+ *
+ * See mbedtls_ssl_conf_dtls_badmac_limit().
+ *
+ * Requires: MBEDTLS_SSL_PROTO_DTLS
+ */
+#undef MBEDTLS_SSL_DTLS_BADMAC_LIMIT
+
+/**
+ * \def MBEDTLS_SSL_SESSION_TICKETS
+ *
+ * Enable support for RFC 5077 session tickets in SSL.
+ * Client-side, provides full support for session tickets (maintenance of a
+ * session store remains the responsibility of the application, though).
+ * Server-side, you also need to provide callbacks for writing and parsing
+ * tickets, including authenticated encryption and key management. Example
+ * callbacks are provided by MBEDTLS_SSL_TICKET_C.
+ *
+ * Comment this macro to disable support for SSL session tickets
+ */
+#undef MBEDTLS_SSL_SESSION_TICKETS
+
+/**
+ * \def MBEDTLS_SSL_EXPORT_KEYS
+ *
+ * Enable support for exporting key block and master secret.
+ * This is required for certain users of TLS, e.g. EAP-TLS.
+ *
+ * Comment this macro to disable support for key export
+ */
+#undef MBEDTLS_SSL_EXPORT_KEYS
+
+
+/**
+ * \def MBEDTLS_SSL_TRUNCATED_HMAC
+ *
+ * Enable support for RFC 6066 truncated HMAC in SSL.
+ *
+ * Comment this macro to disable support for truncated HMAC in SSL
+ */
+#undef MBEDTLS_SSL_TRUNCATED_HMAC
+
+/**
+ * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT
+ *
+ * Enable parsing and verification of X.509 certificates, CRLs and CSRS
+ * signed with RSASSA-PSS (aka PKCS#1 v2.1).
+ *
+ * Comment this macro to disallow using RSASSA-PSS in certificates.
+ */
+#undef MBEDTLS_X509_RSASSA_PSS_SUPPORT
+
+/**
+ * \def MBEDTLS_AESNI_C
+ *
+ * Enable AES-NI support on x86-64.
+ *
+ * Module: library/aesni.c
+ * Caller: library/aes.c
+ *
+ * Requires: MBEDTLS_HAVE_ASM
+ *
+ * This modules adds support for the AES-NI instructions on x86-64
+ */
+#undef MBEDTLS_AESNI_C
+
+/**
+ * \def MBEDTLS_NET_C
+ *
+ * Enable the TCP and UDP over IPv6/IPv4 networking routines.
+ *
+ * \note This module only works on POSIX/Unix (including Linux, BSD and OS X)
+ * and Windows. For other platforms, you'll want to disable it, and write your
+ * own networking callbacks to be passed to \c mbedtls_ssl_set_bio().
+ *
+ * \note See also our Knowledge Base article about porting to a new
+ * environment:
+ * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS
+ *
+ * Module: library/net_sockets.c
+ *
+ * This module provides networking routines.
+ */
+#undef MBEDTLS_NET_C
+
+/**
+ * \def MBEDTLS_SSL_COOKIE_C
+ *
+ * Enable basic implementation of DTLS cookies for hello verification.
+ *
+ * Module: library/ssl_cookie.c
+ * Caller:
+ */
+#undef MBEDTLS_SSL_COOKIE_C
+
+/**
+ * \def MBEDTLS_TIMING_C
+ *
+ * Enable the semi-portable timing interface.
+ *
+ * \note The provided implementation only works on POSIX/Unix (including Linux,
+ * BSD and OS X) and Windows. On other platforms, you can either disable that
+ * module and provide your own implementations of the callbacks needed by
+ * \c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide
+ * your own implementation of the whole module by setting
+ * \c MBEDTLS_TIMING_ALT in the current file.
+ *
+ * \note See also our Knowledge Base article about porting to a new
+ * environment:
+ * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS
+ *
+ * Module: library/timing.c
+ * Caller: library/havege.c
+ *
+ * This module is used by the HAVEGE random number generator.
+ */
+#undef MBEDTLS_TIMING_C
+
+/**
+ * \def MBEDTLS_X509_CRL_PARSE_C
+ *
+ * Enable X.509 CRL parsing.
+ *
+ * Module: library/x509_crl.c
+ * Caller: library/x509_crt.c
+ *
+ * Requires: MBEDTLS_X509_USE_C
+ *
+ * This module is required for X.509 CRL parsing.
+ */
+#undef MBEDTLS_X509_CRL_PARSE_C
+
+/**
+ * \def MBEDTLS_X509_CSR_PARSE_C
+ *
+ * Enable X.509 Certificate Signing Request (CSR) parsing.
+ *
+ * Module: library/x509_csr.c
+ * Caller: library/x509_crt_write.c
+ *
+ * Requires: MBEDTLS_X509_USE_C
+ *
+ * This module is used for reading X.509 certificate request.
+ */
+#undef MBEDTLS_X509_CSR_PARSE_C
+
+/**
+ * \def MBEDTLS_X509_CREATE_C
+ *
+ * Enable X.509 core for creating certificates.
+ *
+ * Module: library/x509_create.c
+ *
+ * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C
+ *
+ * This module is the basis for creating X.509 certificates and CSRs.
+ */
+#undef MBEDTLS_X509_CREATE_C
+
+/**
+ * \def MBEDTLS_X509_CSR_WRITE_C
+ *
+ * Enable creating X.509 Certificate Signing Requests (CSR).
+ *
+ * Module: library/x509_csr_write.c
+ *
+ * Requires: MBEDTLS_X509_CREATE_C
+ *
+ * This module is required for X.509 certificate request writing.
+ */
+#undef MBEDTLS_X509_CSR_WRITE_C
+
+/**
+ * \def MBEDTLS_X509_CRT_WRITE_C
+ *
+ * Enable creating X.509 certificates.
+ *
+ * Module: library/x509_crt_write.c
+ *
+ * Requires: MBEDTLS_X509_CREATE_C
+ *
+ * This module is required for X.509 certificate creation.
+ */
+#undef MBEDTLS_X509_CRT_WRITE_C
+
+/**
+ * \def MBEDTLS_CERTS_C
+ *
+ * Enable the test certificates.
+ *
+ * Module: library/certs.c
+ * Caller:
+ *
+ * This module is used for testing (ssl_client/server).
+ */
+#undef MBEDTLS_CERTS_C
+
+/**
+ * \def MBEDTLS_ERROR_C
+ *
+ * Enable error code to error string conversion.
+ *
+ * Module: library/error.c
+ * Caller:
+ *
+ * This module enables mbedtls_strerror().
+ */
+#undef MBEDTLS_ERROR_C
+
+/**
+ * \def MBEDTLS_PADLOCK_C
+ *
+ * Enable VIA Padlock support on x86.
+ *
+ * Module: library/padlock.c
+ * Caller: library/aes.c
+ *
+ * Requires: MBEDTLS_HAVE_ASM
+ *
+ * This modules adds support for the VIA PadLock on x86.
+ */
+#undef MBEDTLS_PADLOCK_C
+
+/**
+ * \def MBEDTLS_RIPEMD160_C
+ *
+ * Enable the RIPEMD-160 hash algorithm.
+ *
+ * Module: library/ripemd160.c
+ * Caller: library/md.c
+ *
+ */
+#undef MBEDTLS_RIPEMD160_C
+
+/**
+ * \def MBEDTLS_PK_RSA_ALT_SUPPORT
+ *
+ * Support external private RSA keys (eg from a HSM) in the PK layer.
+ *
+ * Comment this macro to disable support for external private RSA keys.
+ */
+#undef MBEDTLS_PK_RSA_ALT_SUPPORT
+
+/**
+ * \def MBEDTLS_ARC4_C
+ *
+ * Enable the ARCFOUR stream cipher.
+ *
+ * Module: library/arc4.c
+ * Caller: library/cipher.c
+ *
+ * This module enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5
+ * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA
+ * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA
+ *
+ * \warning ARC4 is considered a weak cipher and its use constitutes a
+ * security risk. If possible, we recommend avoidng dependencies on
+ * it, and considering stronger ciphers instead.
+ *
+ */
+#undef MBEDTLS_ARC4_C
+
+/**
+ * \def MBEDTLS_XTEA_C
+ *
+ * Enable the XTEA block cipher.
+ *
+ * Module: library/xtea.c
+ * Caller:
+ */
+#undef MBEDTLS_XTEA_C
+
+/**
+ * \def MBEDTLS_BLOWFISH_C
+ *
+ * Enable the Blowfish block cipher.
+ *
+ * Module: library/blowfish.c
+ */
+#undef MBEDTLS_BLOWFISH_C
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
+ *
+ * Enable the DHE-PSK based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_DHM_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA
+ *
+ * \warning Using DHE constitutes a security risk as it
+ * is not possible to validate custom DH parameters.
+ * If possible, it is recommended users should consider
+ * preferring other methods of key exchange.
+ * See dhm.h for more details.
+ *
+ */
+#undef MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
+ *
+ * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_ECDH_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA
+ */
+#undef MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
+ *
+ * Enable the RSA-PSK based ciphersuite modes in SSL / TLS.
+ *
+ * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,
+ * MBEDTLS_X509_CRT_PARSE_C
+ *
+ * This enables the following ciphersuites (if other requisites are
+ * enabled as well):
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256
+ * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
+ * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA
+ */
+#undef MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
+
+/**
+ * \def MBEDTLS_PSA_CRYPTO_C
+ *
+ * Enable the Platform Security Architecture cryptography API.
+ *
+ * \warning The PSA Crypto API is still beta status. While you're welcome to
+ * experiment using it, incompatible API changes are still possible, and some
+ * parts may not have reached the same quality as the rest of Mbed TLS yet.
+ *
+ * Module: library/psa_crypto.c
+ *
+ * Requires: MBEDTLS_CTR_DRBG_C, MBEDTLS_ENTROPY_C
+ *
+ */
+#undef MBEDTLS_PSA_CRYPTO_C
+
+/**
+ * \def MBEDTLS_PSA_CRYPTO_STORAGE_C
+ *
+ * Enable the Platform Security Architecture persistent key storage.
+ *
+ * Module: library/psa_crypto_storage.c
+ *
+ * Requires: MBEDTLS_PSA_CRYPTO_C,
+ * either MBEDTLS_PSA_ITS_FILE_C or a native implementation of
+ * the PSA ITS interface
+ */
+#undef MBEDTLS_PSA_CRYPTO_STORAGE_C
+
+/**
+ * \def MBEDTLS_PSA_ITS_FILE_C
+ *
+ * Enable the emulation of the Platform Security Architecture
+ * Internal Trusted Storage (PSA ITS) over files.
+ *
+ * Module: library/psa_its_file.c
+ *
+ * Requires: MBEDTLS_FS_IO
+ */
+#undef MBEDTLS_PSA_ITS_FILE_C
+
+/**
+ * \def MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
+ *
+ * This option controls the availability of the API mbedtls_ssl_get_peer_cert()
+ * giving access to the peer's certificate after completion of the handshake.
+ *
+ * Unless you need mbedtls_ssl_peer_cert() in your application, it is
+ * recommended to disable this option for reduced RAM usage.
+ *
+ * \note If this option is disabled, mbedtls_ssl_get_peer_cert() is still
+ * defined, but always returns \c NULL.
+ *
+ * \note This option has no influence on the protection against the
+ * triple handshake attack. Even if it is disabled, Mbed TLS will
+ * still ensure that certificates do not change during renegotiation,
+ * for example by keeping a hash of the peer's certificate.
+ *
+ * Comment this macro to disable storing the peer's certificate
+ * after the handshake.
+ */
+#undef MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
+
+/**
+ * \def MBEDTLS_DEPRECATED_REMOVED
+ *
+ * Remove deprecated functions and features so that they generate an error if
+ * used. Functionality deprecated in one version will usually be removed in the
+ * next version. You can enable this to help you prepare the transition to a
+ * new major version by making sure your code is not using this functionality.
+ *
+ * Uncomment to get errors on using deprecated functions and features.
+ */
+#define MBEDTLS_DEPRECATED_REMOVED
+
+/**
+ * \def Enable MBEDTLS debug logs
+ *
+ * MBEDTLS_VERBOSE values:
+ * 0 No debug - No logs are printed on console
+ * 1 Error - Error messages are printed on console
+ * 2 State change - State level change logs are printed on console
+ * 3 Informational - Informational logs printed on console
+ * 4 Verbose - All the logs are printed on console
+ */
+#define MBEDTLS_VERBOSE 0
+
+/**
+ * \def Enable alternate crypto implementations to use the hardware
+ * acceleration. Include The hardware acceleration module's (cy-mbedtls-acceleration)
+ * header file to enable the supported ALT configurations.
+ */
+#ifndef DISABLE_MBEDTLS_ACCELERATION
+#include "mbedtls_alt_config.h"
+
+/**
+ * The cy-mbedtls-acceleration module supports only DP_SECP192R1,
+ * SECP224R1, SECP256R1, SECP384R1 and SECP521R1 curves. If any
+ * other curve is enabled, need to disable the MBEDTLS_ECP_ALT.
+ */
+#ifdef MBEDTLS_ECP_DP_SECP192K1_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+#ifdef MBEDTLS_ECP_DP_SECP224K1_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+#ifdef MBEDTLS_ECP_DP_SECP256K1_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+#ifdef MBEDTLS_ECP_DP_BP256R1_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+#ifdef MBEDTLS_ECP_DP_BP384R1_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+#ifdef MBEDTLS_ECP_DP_BP512R1_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+#ifdef MBEDTLS_ECP_DP_CURVE25519_ENABLED
+#undef MBEDTLS_ECP_ALT
+#undef MBEDTLS_ECDH_GEN_PUBLIC_ALT
+#undef MBEDTLS_ECDSA_SIGN_ALT
+#undef MBEDTLS_ECDSA_VERIFY_ALT
+#endif
+
+#endif /* DISABLE_MBEDTLS_ACCELERATION */
+
+#endif /* MBEDTLS_USER_CONFIG_HEADER */
diff --git a/ports/psoc-edge/modmachine.c b/ports/psoc-edge/modmachine.c
new file mode 100644
index 00000000000..a348ae7831a
--- /dev/null
+++ b/ports/psoc-edge/modmachine.c
@@ -0,0 +1,90 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// std includes
+#include
+#include
+
+// mpy includes
+#include "py/obj.h"
+#include "py/gc.h"
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "shared/runtime/pyexec.h"
+#include "extmod/modnetwork.h"
+
+// port-specific includes
+#include "cybsp.h"
+#include "modmachine.h"
+#include "modpsocedge.h"
+
+enum clock_freq_type PLL0_freq = AUDIO_SYS_CLOCK_73_728_000_HZ;
+enum clock_freq_type freq_peri;
+
+#if MICROPY_PY_MACHINE
+
+#if MICROPY_PY_MACHINE_SPI_TARGET
+#define MICROPY_PY_MACHINE_SPITARGET_GLOBAL \
+ { MP_ROM_QSTR(MP_QSTR_SPITarget), MP_ROM_PTR(&machine_spi_target_type) },
+#else
+#define MICROPY_PY_MACHINE_SPITARGET_GLOBAL
+#endif
+
+// machine.idle()
+// This executies a wfi machine instruction which reduces power consumption
+// of the MCU until an interrupt occurs, at which point execution continues.
+static void mp_machine_idle(void) {
+ __WFI(); // standard ARM instruction
+}
+/* TODO: currently unused
+static void mp_machine_set_freq(size_t n_args, const mp_obj_t *args) {
+ freq_peri = mp_obj_get_int(args[0]); // Assuming the enum values are used as integers
+ switch (freq_peri) {
+ case AUDIO_SYS_CLOCK_73_728_000_HZ:
+ PLL0_freq = AUDIO_SYS_CLOCK_73_728_000_HZ;
+ break;
+ case AUDIO_SYS_CLOCK_169_344_000_HZ:
+ PLL0_freq = AUDIO_SYS_CLOCK_169_344_000_HZ;
+ break;
+ default:
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid frequency type %lu"), freq_peri);
+ break;
+ }
+}
+*/
+
+#define MICROPY_PY_MACHINE_EXTRA_GLOBALS \
+ /* Modules */ \
+ { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&machine_pin_type) }, \
+ { MP_ROM_QSTR(MP_QSTR_PDM_PCM), MP_ROM_PTR(&machine_pdm_pcm_type) }, \
+ { MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&machine_rtc_type) }, \
+ { MP_ROM_QSTR(MP_QSTR_IPC), MP_ROM_PTR(&machine_ipc_type) }, \
+ { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&machine_uart_type) }, \
+ { MP_ROM_QSTR(MP_QSTR_PWM), MP_ROM_PTR(&machine_pwm_type) }, \
+ { MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&machine_timer_type) }, \
+ MICROPY_PY_MACHINE_SPITARGET_GLOBAL
+
+#endif // MICROPY_PY_MACHINE
diff --git a/ports/psoc-edge/modmachine.h b/ports/psoc-edge/modmachine.h
new file mode 100644
index 00000000000..55748ae0a3b
--- /dev/null
+++ b/ports/psoc-edge/modmachine.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOCEDGE_MODMACHINE_H
+#define MICROPY_INCLUDED_PSOCEDGE_MODMACHINE_H
+
+
+// micropython includes
+#include "py/obj.h"
+
+enum clock_freq_type {
+ AUDIO_SYS_CLOCK_73_728_000_HZ = 73728000UL /* (Ideally 73.728 MHz) For sample rates: 8 KHz / 16 KHz / 48 KHz */,
+ AUDIO_SYS_CLOCK_169_344_000_HZ = 169344000UL /* (Ideally 169.344 MHz) For sample rates: 22.05 KHz / 44.1 KHz */,
+ CM4,
+ CM4_FLL
+};
+
+extern enum clock_freq_type PLL0_freq;
+typedef struct _machine_pdm_pcm_obj_t machine_pdm_pcm_obj_t;
+
+extern const mp_obj_type_t machine_i2c_type;
+extern const mp_obj_type_t machine_uart_type;
+extern const mp_obj_type_t machine_pdm_pcm_type;
+extern const mp_obj_type_t machine_rtc_type;
+extern const mp_obj_type_t machine_ipc_type;
+extern const mp_obj_type_t machine_pwm_type;
+extern const mp_obj_type_t machine_timer_type;
+
+#if MICROPY_PY_MACHINE_SPI_TARGET
+extern const mp_obj_type_t machine_spi_target_type;
+#endif
+
+#endif // MICROPY_INCLUDED_PSOCEDGE_MODMACHINE_H
diff --git a/ports/psoc-edge/modpsocedge.c b/ports/psoc-edge/modpsocedge.c
new file mode 100644
index 00000000000..156253572ec
--- /dev/null
+++ b/ports/psoc-edge/modpsocedge.c
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020-2021 Damien P. George
+ * Copyright (c) 2022-2024 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// micropython includes
+#include "py/runtime.h"
+
+
+// port-specific includes
+#include "modpsocedge.h"
+
+static const mp_rom_map_elem_t psoc_edge_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_psoc_edge) },
+ #if MICROPY_ENABLE_EXT_QSPI_FLASH
+ { MP_ROM_QSTR(MP_QSTR_QSPI_Flash), MP_ROM_PTR(&psoc_edge_qspi_flash_type) },
+ #endif
+};
+static MP_DEFINE_CONST_DICT(psoc_edge_module_globals, psoc_edge_module_globals_table);
+
+
+const mp_obj_module_t mp_module_psoc_edge = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t *)&psoc_edge_module_globals,
+};
+
+
+MP_REGISTER_MODULE(MP_QSTR_psoc_edge, mp_module_psoc_edge);
diff --git a/ports/psoc-edge/modpsocedge.h b/ports/psoc-edge/modpsocedge.h
new file mode 100644
index 00000000000..004dcecf920
--- /dev/null
+++ b/ports/psoc-edge/modpsocedge.h
@@ -0,0 +1,36 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020-2021 Damien P. George
+ * Copyright (c) 2022-2024 Infineon Technologies AG
+ *
+ * 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.
+ */
+#ifndef MICROPY_INCLUDED_PSOCEDGE_MODPSOCEDGE_H
+#define MICROPY_INCLUDED_PSOCEDGE_MODPSOCEDGE_H
+
+
+// micropython includes
+#include "py/obj.h"
+
+extern const mp_obj_type_t psoc_edge_qspi_flash_type;
+
+#endif // MICROPY_INCLUDED_PSOCEDGE_MODPSOCEDGE_H
diff --git a/ports/psoc-edge/modsocket.c b/ports/psoc-edge/modsocket.c
new file mode 100644
index 00000000000..7e71272d803
--- /dev/null
+++ b/ports/psoc-edge/modsocket.c
@@ -0,0 +1,947 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2026 Infineon Technologies AG
+ *
+ * Based on ports/esp32/modsocket.c
+ * Copyright (c) 2016, 2017 Nick Moore @mnemote
+ *
+ * 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.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "py/gc.h"
+#include "py/mperrno.h"
+#include "py/mphal.h"
+#include "py/nlr.h"
+#include "py/objlist.h"
+#include "py/objstr.h"
+#include "py/runtime.h"
+#include "py/runtime0.h"
+#include "py/stream.h"
+#include "shared/netutils/netutils.h"
+
+#include "lwip/igmp.h"
+#include "lwip/ip4.h"
+#include "lwip/netdb.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+
+#include "cy_network_mw_core.h"
+
+#define SOCKET_POLL_US (100000)
+
+enum {
+ SOCKET_STATE_NEW,
+ SOCKET_STATE_CONNECTED,
+ SOCKET_STATE_PEER_CLOSED,
+};
+
+typedef struct _socket_obj_t {
+ mp_obj_base_t base;
+ int fd;
+ uint8_t domain;
+ uint8_t type;
+ uint8_t proto;
+ uint8_t state;
+ unsigned int retries;
+ #if MICROPY_PY_SOCKET_EVENTS
+ mp_obj_t events_callback;
+ struct _socket_obj_t *events_next;
+ #endif
+} socket_obj_t;
+
+void _socket_settimeout(socket_obj_t *sock, uint64_t timeout_ms);
+
+#if MICROPY_PY_SOCKET_EVENTS
+// Support for callbacks on asynchronous socket events (when socket becomes readable).
+
+// This divisor is used to reduce the load on the system, so it doesn't poll sockets too often.
+#define USOCKET_EVENTS_DIVISOR (8)
+
+static uint8_t socket_events_divisor;
+static socket_obj_t *socket_events_head;
+
+void socket_events_deinit(void) {
+ socket_events_head = NULL;
+}
+
+// Assumes the socket is not already in the linked list, and adds it.
+static void socket_events_add(socket_obj_t *sock) {
+ sock->events_next = socket_events_head;
+ socket_events_head = sock;
+}
+
+// Assumes the socket is already in the linked list, and removes it.
+static void socket_events_remove(socket_obj_t *sock) {
+ for (socket_obj_t **s = &socket_events_head;; s = &(*s)->events_next) {
+ if (*s == sock) {
+ *s = (*s)->events_next;
+ return;
+ }
+ }
+}
+
+// Poll all registered sockets for readability and call their callback if readable.
+void socket_events_handler(void) {
+ if (socket_events_head == NULL) {
+ return;
+ }
+ if (--socket_events_divisor) {
+ return;
+ }
+ socket_events_divisor = USOCKET_EVENTS_DIVISOR;
+
+ fd_set rfds;
+ FD_ZERO(&rfds);
+ int max_fd = 0;
+
+ for (socket_obj_t *s = socket_events_head; s != NULL; s = s->events_next) {
+ FD_SET(s->fd, &rfds);
+ max_fd = MAX(max_fd, s->fd);
+ }
+
+ struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
+ int r = lwip_select(max_fd + 1, &rfds, NULL, NULL, &timeout);
+ if (r <= 0) {
+ return;
+ }
+
+ for (socket_obj_t *s = socket_events_head; s != NULL; s = s->events_next) {
+ if (FD_ISSET(s->fd, &rfds)) {
+ mp_call_function_1_protected(s->events_callback, s);
+ }
+ }
+}
+
+#endif // MICROPY_PY_SOCKET_EVENTS
+
+static inline void check_for_exceptions(void) {
+ mp_handle_pending(true);
+}
+
+// lwIP may use errno numbers that differ from the port's exposed errno module
+// (newlib values). Normalize the subset we raise from connect() paths.
+static int socket_errno_to_mperrno(int err) {
+ switch (err) {
+ case EINPROGRESS:
+ return MP_EINPROGRESS;
+ case ETIMEDOUT:
+ return MP_ETIMEDOUT;
+ case EWOULDBLOCK:
+ return MP_EWOULDBLOCK;
+ default:
+ return err;
+ }
+}
+
+static void _getaddrinfo_inner(const mp_obj_t host, const mp_obj_t portx,
+ const struct addrinfo *hints, struct addrinfo **res) {
+ int retval = 0;
+
+ *res = NULL;
+
+ mp_obj_t port = portx;
+ if (mp_obj_is_integer(port)) {
+ // lwip_getaddrinfo() takes a string service/port.
+ port = mp_obj_str_binary_op(MP_BINARY_OP_MODULO, mp_obj_new_str_via_qstr("%s", 2), port);
+ }
+
+ const char *host_str = mp_obj_str_get_str(host);
+ const char *port_str = mp_obj_str_get_str(port);
+
+ if (host_str[0] == '\0') {
+ // A host of "" is equivalent to all-local IP address.
+ host_str = "0.0.0.0";
+ }
+
+ MP_THREAD_GIL_EXIT();
+
+ if (retval == 0 && *res == NULL) {
+ retval = lwip_getaddrinfo(host_str, port_str, hints, res);
+ }
+
+ MP_THREAD_GIL_ENTER();
+
+ // Per docs: getaddrinfo raises a negative errno-style error code.
+ if (retval != 0) {
+ mp_raise_OSError(retval > 0 ? -retval : retval);
+ }
+ // Some lwIP paths resolve failures to 0.0.0.0, reject that unless asked for explicitly.
+ if (*res == NULL ||
+ (res[0]->ai_canonname != NULL && strcmp(res[0]->ai_canonname, "0.0.0.0") == 0 && strcmp(host_str, "0.0.0.0") != 0)) {
+ lwip_freeaddrinfo(*res);
+ mp_raise_OSError(-2); // name or service not known
+ }
+
+ assert(retval == 0 && *res != NULL);
+}
+
+static void _socket_getaddrinfo(const mp_obj_t addrtuple, struct addrinfo **resp) {
+ mp_obj_t *elem;
+ mp_obj_get_array_fixed_n(addrtuple, 2, &elem);
+ _getaddrinfo_inner(elem[0], elem[1], NULL, resp);
+}
+
+static mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 0, 3, false);
+
+ socket_obj_t *sock = mp_obj_malloc_with_finaliser(socket_obj_t, type_in);
+ sock->domain = AF_INET;
+ sock->type = SOCK_STREAM;
+ sock->proto = 0;
+ #if MICROPY_PY_SOCKET_EVENTS
+ sock->events_callback = MP_OBJ_NULL;
+ sock->events_next = NULL;
+ #endif
+ if (n_args > 0) {
+ sock->domain = mp_obj_get_int(args[0]);
+ if (n_args > 1) {
+ sock->type = mp_obj_get_int(args[1]);
+ if (n_args > 2) {
+ sock->proto = mp_obj_get_int(args[2]);
+ }
+ }
+ }
+
+ sock->state = sock->type == SOCK_STREAM ? SOCKET_STATE_NEW : SOCKET_STATE_CONNECTED;
+
+ sock->fd = lwip_socket(sock->domain, sock->type, sock->proto);
+ if (sock->fd < 0 && errno == ENFILE) {
+ // LWIP has a hard socket limit. Try GC before failing outright.
+ gc_collect();
+ sock->fd = lwip_socket(sock->domain, sock->type, sock->proto);
+ }
+ if (sock->fd < 0) {
+ mp_raise_OSError(errno);
+ }
+ _socket_settimeout(sock, UINT64_MAX);
+
+ return MP_OBJ_FROM_PTR(sock);
+}
+
+static mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+ struct addrinfo *res;
+ _socket_getaddrinfo(arg1, &res);
+ self->state = SOCKET_STATE_CONNECTED;
+ int r = lwip_bind(self->fd, res->ai_addr, res->ai_addrlen);
+ lwip_freeaddrinfo(res);
+ if (r < 0) {
+ mp_raise_OSError(errno);
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind);
+
+// method socket.listen([backlog])
+static mp_obj_t socket_listen(size_t n_args, const mp_obj_t *args) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ int backlog = MICROPY_PY_SOCKET_LISTEN_BACKLOG_DEFAULT;
+ if (n_args > 1) {
+ backlog = mp_obj_get_int(args[1]);
+ backlog = (backlog < 0) ? 0 : backlog;
+ }
+
+ self->state = SOCKET_STATE_CONNECTED;
+ int r = lwip_listen(self->fd, backlog);
+ if (r < 0) {
+ mp_raise_OSError(errno);
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_listen_obj, 1, 2, socket_listen);
+
+static mp_obj_t socket_accept(const mp_obj_t arg0) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+
+ struct sockaddr addr;
+ socklen_t addr_len = sizeof(addr);
+
+ int new_fd = -1;
+ for (int i = 0; i <= self->retries; i++) {
+ MP_THREAD_GIL_EXIT();
+ new_fd = lwip_accept(self->fd, &addr, &addr_len);
+ MP_THREAD_GIL_ENTER();
+ if (new_fd >= 0) {
+ break;
+ }
+ if (errno != EAGAIN) {
+ mp_raise_OSError(errno);
+ }
+ check_for_exceptions();
+ }
+ if (new_fd < 0) {
+ if (self->retries == 0) {
+ mp_raise_OSError(MP_EAGAIN);
+ } else {
+ mp_raise_OSError(MP_ETIMEDOUT);
+ }
+ }
+
+ // Create new socket object.
+ socket_obj_t *sock = mp_obj_malloc_with_finaliser(socket_obj_t, self->base.type);
+ sock->fd = new_fd;
+ sock->domain = self->domain;
+ sock->type = self->type;
+ sock->proto = self->proto;
+ sock->state = SOCKET_STATE_CONNECTED;
+ #if MICROPY_PY_SOCKET_EVENTS
+ sock->events_callback = MP_OBJ_NULL;
+ sock->events_next = NULL;
+ #endif
+ _socket_settimeout(sock, UINT64_MAX);
+
+ // Make the return value.
+ uint8_t *ip = (uint8_t *)&((struct sockaddr_in *)&addr)->sin_addr;
+ mp_uint_t port = lwip_ntohs(((struct sockaddr_in *)&addr)->sin_port);
+ mp_obj_tuple_t *client = mp_obj_new_tuple(2, NULL);
+ client->items[0] = sock;
+ client->items[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
+
+ return client;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept);
+
+static mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+ struct addrinfo *res;
+ bool blocking = false;
+ int flags = O_NONBLOCK;
+ int raise_err = 0;
+
+ _socket_getaddrinfo(arg1, &res);
+ MP_THREAD_GIL_EXIT();
+ self->state = SOCKET_STATE_CONNECTED;
+
+ // Use lwIP fd APIs; libc fcntl/select operate on host/VFS fds, not lwIP socket ids.
+ // Clear errno before calling lwIP APIs: getaddrinfo and other pre-GIL-exit operations
+ // may leave errno set, causing false errors when checking it after lwIP calls.
+ errno = 0;
+ flags = lwip_fcntl(self->fd, F_GETFL, 0);
+ if (flags < 0) {
+ raise_err = errno;
+ }
+
+ blocking = (flags & O_NONBLOCK) == 0;
+
+ if (blocking) {
+ // Temporarily use non-blocking connect and emulate blocking with select().
+ errno = 0;
+ if (lwip_fcntl(self->fd, F_SETFL, flags | O_NONBLOCK) < 0) {
+ raise_err = errno;
+ }
+ }
+
+ if (raise_err == 0) {
+ errno = 0;
+ int r = lwip_connect(self->fd, res->ai_addr, res->ai_addrlen);
+ if (r != 0) {
+ // lwIP can fail connect() with errno left as 0 in some paths.
+ // Treat that case as EINPROGRESS so non-blocking semantics are preserved,
+ // and blocking mode can continue via the select()/SO_ERROR loop below.
+ raise_err = errno ? errno : EINPROGRESS;
+ }
+ }
+
+ if (blocking) {
+ errno = 0;
+ int r = lwip_fcntl(self->fd, F_SETFL, flags);
+ if (r != 0 && (raise_err == 0 || raise_err == EINPROGRESS)) {
+ raise_err = errno;
+ }
+ }
+
+ lwip_freeaddrinfo(res);
+
+ if (blocking && raise_err == EINPROGRESS) {
+ // Keep calling select() until writable (connected), error, or timeout.
+ for (unsigned int i = 0; i <= self->retries; i++) {
+ struct timeval timeout = {
+ .tv_sec = 0,
+ .tv_usec = SOCKET_POLL_US,
+ };
+ fd_set wfds;
+ FD_ZERO(&wfds);
+ FD_SET(self->fd, &wfds);
+
+ int r = lwip_select(self->fd + 1, NULL, &wfds, NULL, &timeout);
+ if (r < 0) {
+ raise_err = errno;
+ break;
+ } else if (r > 0) {
+ socklen_t socklen = sizeof(raise_err);
+ r = lwip_getsockopt(self->fd, SOL_SOCKET, SO_ERROR, &raise_err, &socklen);
+ if (r < 0) {
+ raise_err = errno;
+ }
+ break;
+ } else {
+ raise_err = ETIMEDOUT;
+
+ MP_THREAD_GIL_ENTER();
+ check_for_exceptions();
+ MP_THREAD_GIL_EXIT();
+ }
+ }
+ }
+
+ MP_THREAD_GIL_ENTER();
+ if (raise_err) {
+ mp_raise_OSError(socket_errno_to_mperrno(raise_err));
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
+
+static mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
+ (void)n_args; // always 4
+ socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ int opt = mp_obj_get_int(args[2]);
+
+ switch (opt) {
+ // level: SOL_SOCKET
+ case SO_REUSEADDR:
+ case SO_BROADCAST: {
+ int val = mp_obj_get_int(args[3]);
+ int ret = lwip_setsockopt(self->fd, SOL_SOCKET, opt, &val, sizeof(int));
+ if (ret != 0) {
+ mp_raise_OSError(errno);
+ }
+ break;
+ }
+
+ case SO_BINDTODEVICE: {
+ size_t len;
+ const char *val = mp_obj_str_get_data(args[3], &len);
+ char ifname[NETIF_NAMESIZE] = {0};
+ size_t copy_len = len < NETIF_NAMESIZE ? len : NETIF_NAMESIZE - 1;
+ memcpy(&ifname, val, copy_len);
+ int ret = lwip_setsockopt(self->fd, SOL_SOCKET, opt, &ifname, NETIF_NAMESIZE);
+ if (ret != 0) {
+ mp_raise_OSError(errno);
+ }
+ break;
+ }
+
+ #if MICROPY_PY_SOCKET_EVENTS
+ // level: SOL_SOCKET
+ // special "register callback" option
+ case 20: {
+ if (args[3] == mp_const_none) {
+ if (self->events_callback != MP_OBJ_NULL) {
+ socket_events_remove(self);
+ self->events_callback = MP_OBJ_NULL;
+ }
+ } else {
+ if (self->events_callback == MP_OBJ_NULL) {
+ socket_events_add(self);
+ }
+ self->events_callback = args[3];
+ }
+ break;
+ }
+ #endif
+
+ // level: IPPROTO_TCP
+ case TCP_NODELAY: {
+ int val = mp_obj_get_int(args[3]);
+ int ret = lwip_setsockopt(self->fd, IPPROTO_TCP, opt, &val, sizeof(int));
+ if (ret != 0) {
+ mp_raise_OSError(errno);
+ }
+ break;
+ }
+
+ // level: IPPROTO_IP
+ case IP_ADD_MEMBERSHIP: {
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ);
+ if (bufinfo.len != sizeof(ip4_addr_t) * 2) {
+ mp_raise_ValueError(NULL);
+ }
+
+ // POSIX setsockopt has order: group addr, if addr; lwIP has vice-versa.
+ err_t err = igmp_joingroup((const ip4_addr_t *)bufinfo.buf + 1, bufinfo.buf);
+ if (err != ERR_OK) {
+ mp_raise_OSError(-err);
+ }
+ break;
+ }
+
+ default:
+ mp_printf(&mp_plat_print, "Warning: lwip.setsockopt() option not implemented\n");
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_setsockopt);
+
+void _socket_settimeout(socket_obj_t *sock, uint64_t timeout_ms) {
+ // Wait in SOCKET_POLL_US slices so pending exceptions can be handled.
+ // If timeout_ms == UINT64_MAX, wait forever.
+ sock->retries = (timeout_ms == UINT64_MAX) ? UINT_MAX : timeout_ms * 1000 / SOCKET_POLL_US;
+
+ struct timeval timeout = {
+ .tv_sec = 0,
+ .tv_usec = timeout_ms ? SOCKET_POLL_US : 0
+ };
+ lwip_setsockopt(sock->fd, SOL_SOCKET, SO_SNDTIMEO, (const void *)&timeout, sizeof(timeout));
+ lwip_setsockopt(sock->fd, SOL_SOCKET, SO_RCVTIMEO, (const void *)&timeout, sizeof(timeout));
+ lwip_fcntl(sock->fd, F_SETFL, timeout_ms ? 0 : O_NONBLOCK);
+}
+
+static mp_obj_t socket_settimeout(const mp_obj_t arg0, const mp_obj_t arg1) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+ if (arg1 == mp_const_none) {
+ _socket_settimeout(self, UINT64_MAX);
+ } else {
+ #if MICROPY_PY_BUILTINS_FLOAT
+ _socket_settimeout(self, (uint64_t)(mp_obj_get_float(arg1) * MICROPY_FLOAT_CONST(1000.0)));
+ #else
+ _socket_settimeout(self, mp_obj_get_int(arg1) * 1000);
+ #endif
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_settimeout_obj, socket_settimeout);
+
+static mp_obj_t socket_setblocking(const mp_obj_t arg0, const mp_obj_t arg1) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+ if (mp_obj_is_true(arg1)) {
+ _socket_settimeout(self, UINT64_MAX);
+ } else {
+ _socket_settimeout(self, 0);
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
+
+// XXX this can end up waiting a very long time if content dribbles in one char at a time.
+static mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
+ struct sockaddr *from, socklen_t *from_len, int *errcode) {
+ socket_obj_t *sock = MP_OBJ_TO_PTR(self_in);
+
+ // A new socket cannot be read from.
+ if (sock->state == SOCKET_STATE_NEW) {
+ *errcode = MP_ENOTCONN;
+ return MP_STREAM_ERROR;
+ }
+
+ // If peer closed, continue returning 0 for subsequent reads (POSIX-like behaviour).
+ if (sock->state == SOCKET_STATE_PEER_CLOSED) {
+ return 0;
+ }
+
+ for (int i = 0; i <= sock->retries; ++i) {
+ // Poll first and only release the GIL if no pending data.
+ bool release_gil;
+ {
+ fd_set rfds;
+ FD_ZERO(&rfds);
+ FD_SET(sock->fd, &rfds);
+ struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
+ int r = lwip_select(sock->fd + 1, &rfds, NULL, NULL, &timeout);
+ release_gil = r != 1;
+ }
+ if (release_gil) {
+ MP_THREAD_GIL_EXIT();
+ }
+ int r = lwip_recvfrom(sock->fd, buf, size, 0, from, from_len);
+ if (release_gil) {
+ MP_THREAD_GIL_ENTER();
+ }
+ if (r == 0) {
+ sock->state = SOCKET_STATE_PEER_CLOSED;
+ }
+ if (r >= 0) {
+ return r;
+ }
+ if (errno != EWOULDBLOCK) {
+ *errcode = errno;
+ return MP_STREAM_ERROR;
+ }
+ check_for_exceptions();
+ }
+
+ *errcode = sock->retries == 0 ? MP_EWOULDBLOCK : MP_ETIMEDOUT;
+ return MP_STREAM_ERROR;
+}
+
+mp_obj_t _socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in,
+ struct sockaddr *from, socklen_t *from_len) {
+ size_t len = mp_obj_get_int(len_in);
+ vstr_t vstr;
+ vstr_init_len(&vstr, len);
+
+ int errcode;
+ mp_uint_t ret = _socket_read_data(self_in, vstr.buf, len, from, from_len, &errcode);
+ if (ret == MP_STREAM_ERROR) {
+ mp_raise_OSError(errcode);
+ }
+
+ vstr.len = ret;
+ return mp_obj_new_bytes_from_vstr(&vstr);
+}
+
+static mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
+ return _socket_recvfrom(self_in, len_in, NULL, NULL);
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_recv_obj, socket_recv);
+
+static mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
+ struct sockaddr from;
+ socklen_t fromlen = sizeof(from);
+
+ mp_obj_t tuple[2];
+ tuple[0] = _socket_recvfrom(self_in, len_in, &from, &fromlen);
+
+ uint8_t *ip = (uint8_t *)&((struct sockaddr_in *)&from)->sin_addr;
+ mp_uint_t port = lwip_ntohs(((struct sockaddr_in *)&from)->sin_port);
+ tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
+
+ return mp_obj_new_tuple(2, tuple);
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_recvfrom_obj, socket_recvfrom);
+
+int _socket_send(socket_obj_t *sock, const char *data, size_t datalen) {
+ int sentlen = 0;
+ for (int i = 0; i <= sock->retries && sentlen < datalen; i++) {
+ MP_THREAD_GIL_EXIT();
+ int r = lwip_write(sock->fd, data + sentlen, datalen - sentlen);
+ MP_THREAD_GIL_ENTER();
+ // lwip returns EINPROGRESS when trying to send right after a non-blocking connect.
+ if (r < 0 && errno != EWOULDBLOCK && errno != EINPROGRESS) {
+ mp_raise_OSError(errno);
+ }
+ if (r > 0) {
+ sentlen += r;
+ }
+ check_for_exceptions();
+ }
+ if (sentlen == 0) {
+ mp_raise_OSError(sock->retries == 0 ? MP_EWOULDBLOCK : MP_ETIMEDOUT);
+ }
+ return sentlen;
+}
+
+static mp_obj_t socket_send(const mp_obj_t arg0, const mp_obj_t arg1) {
+ socket_obj_t *sock = MP_OBJ_TO_PTR(arg0);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(arg1, &bufinfo, MP_BUFFER_READ);
+ int r = _socket_send(sock, bufinfo.buf, bufinfo.len);
+ return mp_obj_new_int(r);
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_send_obj, socket_send);
+
+static mp_obj_t socket_sendall(const mp_obj_t arg0, const mp_obj_t arg1) {
+ // XXX behaviour when nonblocking (see extmod/modlwip.c)
+ // XXX also timeout behaviour.
+ socket_obj_t *sock = MP_OBJ_TO_PTR(arg0);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(arg1, &bufinfo, MP_BUFFER_READ);
+ int r = _socket_send(sock, bufinfo.buf, bufinfo.len);
+ if (r < bufinfo.len) {
+ mp_raise_OSError(MP_ETIMEDOUT);
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_2(socket_sendall_obj, socket_sendall);
+
+static mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ // Get the buffer to send.
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
+
+ // Create the destination address.
+ struct sockaddr_in to;
+ memset(&to, 0, sizeof(to));
+ to.sin_family = AF_INET;
+ to.sin_port = lwip_htons(netutils_parse_inet_addr(addr_in, (uint8_t *)&to.sin_addr, NETUTILS_BIG));
+
+ // Send the data.
+ for (int i = 0; i <= self->retries; i++) {
+ MP_THREAD_GIL_EXIT();
+ int ret = lwip_sendto(self->fd, bufinfo.buf, bufinfo.len, 0, (struct sockaddr *)&to, sizeof(to));
+ MP_THREAD_GIL_ENTER();
+ if (ret > 0) {
+ return mp_obj_new_int_from_uint(ret);
+ }
+ if (ret == -1 && errno != EWOULDBLOCK) {
+ mp_raise_OSError(errno);
+ }
+ check_for_exceptions();
+ }
+ mp_raise_OSError(MP_ETIMEDOUT);
+}
+static MP_DEFINE_CONST_FUN_OBJ_3(socket_sendto_obj, socket_sendto);
+
+static mp_obj_t socket_fileno(const mp_obj_t arg0) {
+ socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+ return mp_obj_new_int(self->fd);
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(socket_fileno_obj, socket_fileno);
+
+static mp_obj_t socket_makefile(size_t n_args, const mp_obj_t *args) {
+ (void)n_args;
+ return args[0];
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 3, socket_makefile);
+
+static mp_uint_t socket_stream_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *errcode) {
+ return _socket_read_data(self_in, buf, size, NULL, NULL, errcode);
+}
+
+static mp_uint_t socket_stream_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) {
+ socket_obj_t *sock = self_in;
+ for (int i = 0; i <= sock->retries; i++) {
+ MP_THREAD_GIL_EXIT();
+ int r = lwip_write(sock->fd, buf, size);
+ MP_THREAD_GIL_ENTER();
+ if (r > 0) {
+ return r;
+ }
+ // lwip returns EINPROGRESS when trying to write right after a non-blocking connect.
+ if (r < 0 && errno != EWOULDBLOCK && errno != EINPROGRESS) {
+ *errcode = errno;
+ return MP_STREAM_ERROR;
+ }
+ check_for_exceptions();
+ }
+ *errcode = sock->retries == 0 ? MP_EWOULDBLOCK : MP_ETIMEDOUT;
+ return MP_STREAM_ERROR;
+}
+
+static mp_uint_t socket_stream_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) {
+ socket_obj_t *socket = self_in;
+ if (request == MP_STREAM_POLL) {
+ if (socket->fd == -1) {
+ return MP_STREAM_POLL_NVAL;
+ }
+
+ fd_set rfds;
+ FD_ZERO(&rfds);
+ fd_set wfds;
+ FD_ZERO(&wfds);
+ fd_set efds;
+ FD_ZERO(&efds);
+ struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
+ if (arg & MP_STREAM_POLL_RD) {
+ FD_SET(socket->fd, &rfds);
+ }
+ if (arg & MP_STREAM_POLL_WR) {
+ FD_SET(socket->fd, &wfds);
+ }
+ if (arg & MP_STREAM_POLL_HUP) {
+ FD_SET(socket->fd, &efds);
+ }
+
+ int r = lwip_select((socket->fd) + 1, &rfds, &wfds, &efds, &timeout);
+ if (r < 0) {
+ *errcode = MP_EIO;
+ return MP_STREAM_ERROR;
+ }
+
+ mp_uint_t ret = 0;
+ if (FD_ISSET(socket->fd, &rfds)) {
+ ret |= MP_STREAM_POLL_RD;
+ }
+ if (FD_ISSET(socket->fd, &wfds)) {
+ ret |= MP_STREAM_POLL_WR;
+ }
+ if (FD_ISSET(socket->fd, &efds)) {
+ ret |= MP_STREAM_POLL_HUP;
+ }
+
+ // New (unconnected) sockets are writable and have HUP set.
+ if (socket->state == SOCKET_STATE_NEW) {
+ ret |= (arg & MP_STREAM_POLL_WR) | MP_STREAM_POLL_HUP;
+ }
+
+ return ret;
+ } else if (request == MP_STREAM_CLOSE) {
+ if (socket->fd >= 0) {
+ #if MICROPY_PY_SOCKET_EVENTS
+ if (socket->events_callback != MP_OBJ_NULL) {
+ socket_events_remove(socket);
+ socket->events_callback = MP_OBJ_NULL;
+ }
+ #endif
+ int ret = lwip_close(socket->fd);
+ if (ret != 0) {
+ *errcode = errno;
+ return MP_STREAM_ERROR;
+ }
+ socket->fd = -1;
+ }
+ return 0;
+ }
+
+ *errcode = MP_EINVAL;
+ return MP_STREAM_ERROR;
+}
+
+static const mp_rom_map_elem_t socket_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
+ { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
+ { MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&socket_bind_obj) },
+ { MP_ROM_QSTR(MP_QSTR_listen), MP_ROM_PTR(&socket_listen_obj) },
+ { MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socket_accept_obj) },
+ { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&socket_connect_obj) },
+ { MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&socket_send_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sendall), MP_ROM_PTR(&socket_sendall_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socket_sendto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_recv), MP_ROM_PTR(&socket_recv_obj) },
+ { MP_ROM_QSTR(MP_QSTR_recvfrom), MP_ROM_PTR(&socket_recvfrom_obj) },
+ { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socket_setsockopt_obj) },
+ { MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socket_settimeout_obj) },
+ { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) },
+ { MP_ROM_QSTR(MP_QSTR_makefile), MP_ROM_PTR(&socket_makefile_obj) },
+ { MP_ROM_QSTR(MP_QSTR_fileno), MP_ROM_PTR(&socket_fileno_obj) },
+
+ { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
+ { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
+ { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
+};
+static MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table);
+
+static const mp_stream_p_t socket_stream_p = {
+ .read = socket_stream_read,
+ .write = socket_stream_write,
+ .ioctl = socket_stream_ioctl,
+};
+
+static MP_DEFINE_CONST_OBJ_TYPE(
+ socket_type,
+ MP_QSTR_socket,
+ MP_TYPE_FLAG_NONE,
+ make_new, socket_make_new,
+ protocol, &socket_stream_p,
+ locals_dict, &socket_locals_dict
+ );
+
+static mp_obj_t psoc_edge_socket_getaddrinfo(size_t n_args, const mp_obj_t *args) {
+ struct addrinfo hints = {0};
+ struct addrinfo *res = NULL;
+
+ // Optional args: family=0, type=0, proto=0, flags=0, where 0 is "least narrow".
+ if (n_args > 2) {
+ hints.ai_family = mp_obj_get_int(args[2]);
+ }
+ if (n_args > 3) {
+ hints.ai_socktype = mp_obj_get_int(args[3]);
+ }
+ if (hints.ai_socktype == 0) {
+ // lwip_getaddrinfo echoes input socktype; normalise to SOCK_STREAM for validity.
+ hints.ai_socktype = SOCK_STREAM;
+ }
+ if (n_args > 4) {
+ hints.ai_protocol = mp_obj_get_int(args[4]);
+ }
+ if (n_args > 5) {
+ hints.ai_flags = mp_obj_get_int(args[5]);
+ }
+
+ _getaddrinfo_inner(args[0], args[1], &hints, &res);
+ mp_obj_t ret_list = mp_obj_new_list(0, NULL);
+
+ for (struct addrinfo *resi = res; resi; resi = resi->ai_next) {
+ mp_obj_t addrinfo_objs[5] = {
+ mp_obj_new_int(resi->ai_family),
+ mp_obj_new_int(resi->ai_socktype),
+ mp_obj_new_int(resi->ai_protocol),
+ mp_obj_new_str_from_cstr(resi->ai_canonname ? resi->ai_canonname : ""),
+ mp_const_none,
+ };
+
+ if (resi->ai_family == AF_INET) {
+ struct sockaddr_in *addr = (struct sockaddr_in *)resi->ai_addr;
+ ip4_addr_t ip4_addr = { .addr = addr->sin_addr.s_addr };
+ char buf[16];
+ ip4addr_ntoa_r(&ip4_addr, buf, sizeof(buf));
+ mp_obj_t inaddr_objs[2] = {
+ mp_obj_new_str_from_cstr(buf),
+ mp_obj_new_int(ntohs(addr->sin_port)),
+ };
+ addrinfo_objs[4] = mp_obj_new_tuple(2, inaddr_objs);
+ }
+ mp_obj_list_append(ret_list, mp_obj_new_tuple(5, addrinfo_objs));
+ }
+
+ lwip_freeaddrinfo(res);
+ return ret_list;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(psoc_edge_socket_getaddrinfo_obj, 2, 6, psoc_edge_socket_getaddrinfo);
+
+static mp_obj_t psoc_edge_socket_initialize(void) {
+ static int initialized = 0;
+ if (!initialized) {
+ cy_network_init();
+ initialized = 1;
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_0(psoc_edge_socket_initialize_obj, psoc_edge_socket_initialize);
+
+static const mp_rom_map_elem_t mp_module_socket_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_socket) },
+ { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&psoc_edge_socket_initialize_obj) },
+ { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&socket_type) },
+ { MP_ROM_QSTR(MP_QSTR_getaddrinfo), MP_ROM_PTR(&psoc_edge_socket_getaddrinfo_obj) },
+
+ { MP_ROM_QSTR(MP_QSTR_AF_INET), MP_ROM_INT(AF_INET) },
+ { MP_ROM_QSTR(MP_QSTR_AF_INET6), MP_ROM_INT(AF_INET6) },
+ { MP_ROM_QSTR(MP_QSTR_SOCK_STREAM), MP_ROM_INT(SOCK_STREAM) },
+ { MP_ROM_QSTR(MP_QSTR_SOCK_DGRAM), MP_ROM_INT(SOCK_DGRAM) },
+ { MP_ROM_QSTR(MP_QSTR_SOCK_RAW), MP_ROM_INT(SOCK_RAW) },
+ { MP_ROM_QSTR(MP_QSTR_IPPROTO_TCP), MP_ROM_INT(IPPROTO_TCP) },
+ { MP_ROM_QSTR(MP_QSTR_IPPROTO_UDP), MP_ROM_INT(IPPROTO_UDP) },
+ { MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(IPPROTO_IP) },
+ { MP_ROM_QSTR(MP_QSTR_SOL_SOCKET), MP_ROM_INT(SOL_SOCKET) },
+ { MP_ROM_QSTR(MP_QSTR_SO_REUSEADDR), MP_ROM_INT(SO_REUSEADDR) },
+ { MP_ROM_QSTR(MP_QSTR_SO_BROADCAST), MP_ROM_INT(SO_BROADCAST) },
+ { MP_ROM_QSTR(MP_QSTR_SO_BINDTODEVICE), MP_ROM_INT(SO_BINDTODEVICE) },
+ { MP_ROM_QSTR(MP_QSTR_IP_ADD_MEMBERSHIP), MP_ROM_INT(IP_ADD_MEMBERSHIP) },
+ { MP_ROM_QSTR(MP_QSTR_TCP_NODELAY), MP_ROM_INT(TCP_NODELAY) },
+};
+
+static MP_DEFINE_CONST_DICT(mp_module_socket_globals, mp_module_socket_globals_table);
+
+const mp_obj_module_t mp_module_socket = {
+ .base = {&mp_type_module},
+ .globals = (mp_obj_dict_t *)&mp_module_socket_globals,
+};
+
+// Note: This port doesn't define MICROPY_PY_SOCKET or MICROPY_PY_LWIP so
+// this will not conflict with the common implementation provided by
+// extmod/mod{lwip,socket}.c.
+MP_REGISTER_EXTENSIBLE_MODULE(MP_QSTR_socket, mp_module_socket);
diff --git a/ports/psoc-edge/modtime.c b/ports/psoc-edge/modtime.c
new file mode 100644
index 00000000000..4f5859d2bb7
--- /dev/null
+++ b/ports/psoc-edge/modtime.c
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2021 Damien P. George
+ * Copyright (c) 2023-2024 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// std includes
+#include "stdio.h"
+#include
+
+// micropython includes
+#include "extmod/modtime.h"
+#include "modmachine.h"
+#include "py/runtime.h"
+#include "shared/timeutils/timeutils.h"
+
+extern void machine_rtc_get_datetime(timeutils_struct_time_t *time);
+
+static void mp_time_localtime_get(timeutils_struct_time_t *time) {
+ machine_rtc_get_datetime(time);
+}
+
+uint64_t mp_hal_time_get_epoch_seconds(void) {
+ timeutils_struct_time_t current_date_time;
+ machine_rtc_get_datetime(¤t_date_time);
+
+ return timeutils_seconds_since_epoch(current_date_time.tm_year, current_date_time.tm_mon, current_date_time.tm_mday,
+ current_date_time.tm_hour, current_date_time.tm_min, current_date_time.tm_sec);
+}
+
+// Return the number of seconds since the Epoch.
+static mp_obj_t mp_time_time_get(void) {
+ return timeutils_obj_from_timestamp(mp_hal_time_get_epoch_seconds());
+}
diff --git a/ports/psoc-edge/modules/_boot.py b/ports/psoc-edge/modules/_boot.py
new file mode 100644
index 00000000000..780652b2773
--- /dev/null
+++ b/ports/psoc-edge/modules/_boot.py
@@ -0,0 +1,23 @@
+def boot():
+ import os, machine, psoc_edge as psocedge
+
+ # Create block device instance from external flash
+ bdev = psocedge.QSPI_Flash()
+
+ # sector size 4 KB for external flash
+ read_size = 0x1000
+ # page size 256 B
+ write_size = 0x200
+
+ try:
+ vfs = os.VfsLfs2(bdev, progsize=write_size, readsize=read_size)
+ os.mount(vfs, "/")
+ except:
+ # Format flash if filesystem not found
+ os.VfsLfs2.mkfs(bdev, progsize=write_size, readsize=read_size)
+ vfs = os.VfsLfs2(bdev, progsize=write_size, readsize=read_size)
+ os.mount(vfs, "/")
+
+
+boot()
+del boot
diff --git a/ports/psoc-edge/mpconfigport.h b/ports/psoc-edge/mpconfigport.h
new file mode 100644
index 00000000000..12a6f46bb9b
--- /dev/null
+++ b/ports/psoc-edge/mpconfigport.h
@@ -0,0 +1,124 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2022-2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// Options controlling how MicroPython is built, overriding defaults in py/mpconfig.h
+#include
+#include "mpconfigboard.h"
+
+// Use core features for Thonny compatibility (larger firmware)
+#define MICROPY_CONFIG_ROM_LEVEL (MICROPY_CONFIG_ROM_LEVEL_EXTRA_FEATURES)
+
+// MicroPython emitters
+#define MICROPY_PERSISTENT_CODE_LOAD (1)
+#define MICROPY_EMIT_THUMB (1)
+#define MICROPY_EMIT_INLINE_THUMB (1)
+#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void *)((mp_uint_t)(p) | 1))
+
+// Python internal features
+#define MICROPY_READER_VFS (1)
+#define MICROPY_ENABLE_GC (1)
+#define MICROPY_STACK_CHECK_MARGIN (1024)
+#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1)
+#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ)
+#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT)
+#define MICROPY_SCHEDULER_DEPTH (8)
+#define MICROPY_SCHEDULER_STATIC_NODES (1)
+#define MICROPY_USE_INTERNAL_ERRNO (1)
+#define MICROPY_ALLOC_PARSE_CHUNK_INIT (16)
+#define MICROPY_PY_MATH_GAMMA_FIX_NEGINF (1)
+
+// Fine control over Python builtins, classes, modules, etc
+#define MICROPY_PY_SYS_PLATFORM "psoc-edge"
+#define MICROPY_PY_BUILTINS_HELP_TEXT psoc_edge_help_text
+#define MICROPY_REPL_INFO (1)
+
+// Extended modules
+#define MICROPY_PY_TIME_GMTIME_LOCALTIME_MKTIME (1)
+#define MICROPY_PY_TIME_TIME_TIME_NS (1)
+#define MICROPY_PY_TIME_INCLUDEFILE "ports/psoc-edge/modtime.c"
+#define MICROPY_TIME_SUPPORT_Y1969_AND_BEFORE (1)
+#define MICROPY_EPOCH_IS_1970 (1)
+#define MICROPY_VFS (1)
+#define MICROPY_ALLOC_PATH_MAX (256)
+
+// Machine module
+#define MICROPY_PY_MACHINE (1)
+#define MICROPY_PY_MACHINE_INCLUDEFILE "ports/psoc-edge/modmachine.c"
+
+#define MICROPY_PY_MACHINE_PIN_MAKE_NEW mp_pin_make_new
+
+#define MICROPY_PY_MACHINE_I2C (1)
+#define MICROPY_PY_MACHINE_SOFTI2C (0)
+
+#define MICROPY_PY_MACHINE_SPI (1)
+
+#define MICROPY_PY_MACHINE_SPI_TARGET (1)
+#define MICROPY_PY_MACHINE_SPI_TARGET_MAX (1)
+
+#define MICROPY_PY_MACHINE_UART (1)
+#define MICROPY_PY_MACHINE_UART_INCLUDEFILE "ports/psoc-edge/machine_uart.c"
+#define MICROPY_PY_MACHINE_UART_SENDBREAK (1)
+#define MICROPY_PY_MACHINE_UART_READCHAR_WRITECHAR (1)
+#define MICROPY_PY_MACHINE_UART_IRQ (1)
+#define MICROPY_STREAMS_NON_BLOCK (1)
+
+#define MICROPY_PY_MACHINE_I2C_TARGET (1)
+#define MICROPY_PY_MACHINE_I2C_TARGET_MAX (1)
+#define MICROPY_PY_MACHINE_I2C_TARGET_HARD_IRQ (1)
+#define MICROPY_PY_MACHINE_I2C_TARGET_INCLUDEFILE "ports/psoc-edge/machine_i2c_target.c"
+
+#define MICROPY_PY_MACHINE_PDM_PCM (1)
+#define MICROPY_PY_MACHINE_PDM_PCM_RING_BUF (1)
+#define MICROPY_PY_MACHINE_PDM_PCM_INCLUDEFILE "machine_pdm_pcm.c"
+
+#define MICROPY_PY_MACHINE_PWM (1)
+#define MICROPY_PY_MACHINE_PWM_INCLUDEFILE "ports/psoc-edge/machine_pwm.c"
+
+
+#define MICROPY_PY_SSL_DTLS (0)
+#define MICROPY_TRACKED_ALLOC (MICROPY_SSL_MBEDTLS)
+
+// By default networking should include sockets, ssl, websockets, webrepl
+
+#if MICROPY_PY_NETWORK
+
+#define MICROPY_PY_SOCKET (0)
+
+extern const struct _mp_obj_type_t mp_network_ifx_wcm_type;
+#define MICROPY_HW_NIC_IFX_WCM \
+ { MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&mp_network_ifx_wcm_type) },
+
+#define MICROPY_PORT_NETWORK_INTERFACES \
+ MICROPY_HW_NIC_IFX_WCM
+
+#endif // MICROPY_PY_NETWORK
+
+// type definitions for the specific machine
+#define MP_SSIZE_MAX (0x7fffffff)
+
+typedef long mp_off_t;
+
+#define MP_STATE_PORT MP_STATE_VM
diff --git a/ports/psoc-edge/mpconfigport.mk b/ports/psoc-edge/mpconfigport.mk
new file mode 100644
index 00000000000..902dafd8bca
--- /dev/null
+++ b/ports/psoc-edge/mpconfigport.mk
@@ -0,0 +1 @@
+MICROPY_VFS_LFS2=1
\ No newline at end of file
diff --git a/ports/psoc-edge/mphalport.c b/ports/psoc-edge/mphalport.c
new file mode 100644
index 00000000000..343bea4eaa0
--- /dev/null
+++ b/ports/psoc-edge/mphalport.c
@@ -0,0 +1,215 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// std includes
+#include "stdio.h"
+
+// MTB includes
+#include "retarget_io_init.h"
+
+// PDL includes
+#include "cy_crypto_core_trng.h"
+
+// micropython includes
+#include "mpconfigport.h"
+#include "mphalport.h"
+
+#include "py/runtime.h"
+
+extern mtb_hal_uart_t DEBUG_UART_hal_obj;
+
+void mp_hal_get_random(size_t n, uint8_t *buf) {
+ uint32_t r = 0;
+ for (size_t i = 0; i < n; i++) {
+ if ((i & 3) == 0) {
+ Cy_Crypto_Core_Trng_Ext(CRYPTO, 32U, &r);
+ }
+ buf[i] = (uint8_t)r;
+ r >>= 8;
+ }
+}
+
+uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
+ printf("mp_hal_stdio_poll\n");
+ mp_raise_NotImplementedError(MP_ERROR_TEXT("mp_hal_stdio_poll not implemented !"));
+ uintptr_t ret = 0;
+ return ret;
+}
+
+// Send string of given length
+void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
+ int r = write(STDOUT_FILENO, str, len);
+ (void)r;
+}
+
+int mp_hal_stdin_rx_chr(void) {
+ for (;;) {
+ uint8_t c = 0;
+ cy_rslt_t result;
+ result = mtb_hal_uart_get(&DEBUG_UART_hal_obj, &c, 1);
+ if (result == CY_RSLT_SUCCESS) {
+ return c;
+ }
+ mp_event_handle_nowait();
+ }
+}
+
+extern uint32_t get_drive_mode(uint8_t mode, uint8_t pull);
+
+void mp_hal_pin_config(mp_hal_pin_obj_t pin, uint32_t mode, uint32_t pull, uint32_t value) {
+ uint32_t drive_mode = get_drive_mode(mode, pull);
+ Cy_GPIO_Pin_FastInit(Cy_GPIO_PortToAddr(pin->port), pin->pin, drive_mode, value, HSIOM_SEL_GPIO);
+}
+
+extern uint8_t pin_get_mode(const machine_pin_obj_t *self);
+
+uint32_t mp_hal_pin_read(mp_hal_pin_obj_t pin) {
+ uint8_t mode = pin_get_mode(pin);
+ if (mode == GPIO_MODE_OUT ||
+ mode == GPIO_MODE_OPEN_DRAIN) {
+ return Cy_GPIO_ReadOut(Cy_GPIO_PortToAddr(pin->port), pin->pin);
+ }
+ return Cy_GPIO_Read(Cy_GPIO_PortToAddr(pin->port), pin->pin);
+}
+
+uint32_t mp_hal_pin_get_drive(mp_hal_pin_obj_t pin) {
+ return Cy_GPIO_GetDriveSel(Cy_GPIO_PortToAddr(pin->port), pin->pin);
+}
+
+void mp_hal_pin_set_drive(mp_hal_pin_obj_t pin, uint32_t drive) {
+ Cy_GPIO_SetDriveSel(Cy_GPIO_PortToAddr(pin->port), pin->pin, drive);
+}
+
+void mp_hal_pin_write(mp_hal_pin_obj_t pin, uint8_t polarity) {
+ Cy_GPIO_Write(Cy_GPIO_PortToAddr(pin->port), pin->pin, polarity);
+}
+
+mp_hal_pin_af_obj_t mp_hal_pin_af_find(mp_hal_pin_obj_t pin, machine_pin_af_signal_t af_signal) {
+ for (uint8_t i = 0; i < pin->af_num; i++) {
+ const machine_pin_af_obj_t *af = &pin->af[i];
+ if (af->signal == af_signal) {
+ return af;
+ }
+ }
+
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("Pin '%q' does not support '%s'."), pin->name, machine_pin_af_signal_str[af_signal]);
+}
+
+machine_pin_af_unit_t mp_hal_periph_pins_af_get_af_unit(const mp_hal_pin_af_config_t *periph_pins_config, uint8_t num_pins, machine_pin_af_fn_t fn) {
+ bool found_first_valid_pin = false;
+ machine_pin_af_periph_t periph_ptr = NULL;
+ uint32_t unit = MACHINE_PIN_AF_UNIT_NONE;
+ for (uint8_t i = 0; i < num_pins; i++) {
+ const mp_hal_pin_af_config_t *pin_cfg = &periph_pins_config[i];
+ if (pin_cfg->pin == NULL || pin_cfg->af == NULL) {
+ continue;
+ }
+ if (!found_first_valid_pin) {
+ periph_ptr = pin_cfg->af->periph;
+ unit = pin_cfg->af->unit;
+ found_first_valid_pin = true;
+ } else {
+ if (pin_cfg->af->fn != fn) {
+ mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("all pins must belong to the same function."));
+ }
+ if (pin_cfg->af->periph != periph_ptr) {
+ mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("all pins must belong to the same peripheral."));
+ }
+ if (pin_cfg->af->unit != unit) {
+ mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("all pins must belong to the same unit."));
+ }
+ }
+ }
+
+ return unit;
+}
+
+void mp_hal_periph_pins_af_resolve_fn_unit(const mp_hal_pin_af_config_t *periph_pins_config, uint8_t pin_num, machine_pin_af_fn_t fn, machine_pin_af_unit_t *fn_unit) {
+ uint8_t resolved_fn_unit;
+ uint8_t suggested_fn_unit = *fn_unit;
+
+ /**
+ * Resolve the AF unit for the provided pins.
+ * It can be that the configuration still don't have
+ * any pin AF assigned.
+ * Therefore, its AF unit is not yet determined.
+ */
+ machine_pin_af_unit_t pin_af_unit = mp_hal_periph_pins_af_get_af_unit(periph_pins_config, pin_num, fn);
+
+ /* No pins have been defined. */
+ if (pin_af_unit == MACHINE_PIN_AF_UNIT_NONE) {
+ /* The suggested AF unit candidate is chosen if defined. */
+ if (suggested_fn_unit != MACHINE_PIN_AF_UNIT_NONE) {
+ resolved_fn_unit = (uint8_t)suggested_fn_unit;
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("no id or pins have been provided. At least one of them must be specified."));
+ }
+ } else {
+ /* The pins have been defined. */
+ /* The suggested AF unit has been also defined.*/
+ if (suggested_fn_unit != MACHINE_PIN_AF_UNIT_NONE) {
+ if (suggested_fn_unit == pin_af_unit) {
+ /* The suggested AF unit matches the AF unit discovered from the passed pins */
+ resolved_fn_unit = (uint8_t)suggested_fn_unit;
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("the id does not match the discovered id from the provided pins."));
+ }
+ } else {
+ /* No suggested AF unit has been passed */
+ resolved_fn_unit = pin_af_unit;
+ }
+ }
+
+ (*fn_unit) = resolved_fn_unit;
+}
+
+void mp_hal_periph_pins_af_resolve_pin_af(mp_hal_pin_af_config_t *periph_pins_config, uint8_t pin_num, machine_pin_af_unit_t fn_unit) {
+ for (uint8_t i = 0; i < pin_num; i++) {
+ if (periph_pins_config[i].af == NULL && periph_pins_config[i].pin == NULL) {
+ periph_pins_config[i].pin = machine_pin_get_af_pin(fn_unit, periph_pins_config[i].signal);
+ if (periph_pins_config[i].pin == NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("no signal '%s' available for id %d."), machine_pin_af_signal_str[periph_pins_config[i].signal], fn_unit);
+ }
+ periph_pins_config[i].af = mp_hal_pin_af_find(periph_pins_config[i].pin, periph_pins_config[i].signal);
+ } else {
+ /**
+ * It should not enter here. As this function should
+ * be only called after pin - AF unit matching */
+ if (periph_pins_config[i].af->unit != fn_unit && periph_pins_config[i].pin != NULL) {
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("the pin '%q' does not match the AF unit %d."), periph_pins_config[i].pin->name, fn_unit);
+ }
+ }
+ }
+}
+
+machine_pin_af_periph_t mp_hal_periph_pins_af_init(const mp_hal_pin_af_config_t *periph_pins_config, uint8_t num_pins) {
+ for (uint8_t i = 0; i < num_pins; i++) {
+ const mp_hal_pin_af_config_t *pin_cfg = &periph_pins_config[i];
+ Cy_GPIO_Pin_FastInit(Cy_GPIO_PortToAddr(pin_cfg->pin->port), pin_cfg->pin->pin, pin_cfg->cy_drive_mode, pin_cfg->init_value, pin_cfg->af->idx);
+ }
+
+ return periph_pins_config[0].af->periph;
+}
diff --git a/ports/psoc-edge/mphalport.h b/ports/psoc-edge/mphalport.h
new file mode 100644
index 00000000000..e5b562b104b
--- /dev/null
+++ b/ports/psoc-edge/mphalport.h
@@ -0,0 +1,129 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_HALPORT_H
+#define MICROPY_INCLUDED_PSOC_EDGE_HALPORT_H
+
+// std includes
+#include
+#include
+
+
+// micropython includes
+#include "py/mpconfig.h"
+#include "py/runtime.h"
+#include "machine_pin.h"
+
+#include "cybsp.h"
+
+static inline void enable_irq(mp_uint_t state) {
+ if (state == 0) {
+ __enable_irq();
+ }
+}
+
+static inline mp_uint_t disable_irq(void) {
+ mp_uint_t state = __get_PRIMASK();
+ __disable_irq();
+ return state;
+}
+
+#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq()
+#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state)
+
+#define mp_hal_delay_us_fast mp_hal_delay_us
+
+void mp_hal_delay_us(mp_uint_t us);
+void mp_hal_delay_us_fast(mp_uint_t us);
+void mp_hal_delay_ms(mp_uint_t ms);
+
+uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags);
+int mp_hal_stdin_rx_chr(void);
+void mp_hal_set_interrupt_char(int c); // -1 to disable
+
+
+#define MP_HAL_PIN_FMT "\'%q\'"
+#define mp_hal_pin_obj_t const machine_pin_obj_t *
+#define mp_hal_get_pin_obj(o) machine_pin_get_pin_obj(o)
+#define mp_hal_pin_name(p) ((p)->name)
+#define mp_hal_pin_input(p) mp_hal_pin_config((p), GPIO_MODE_IN, GPIO_PULL_NONE, 0)
+#define mp_hal_pin_output(p) mp_hal_pin_config((p), GPIO_MODE_OUT, GPIO_PULL_NONE, 0)
+#define mp_hal_pin_open_drain(p) mp_hal_pin_config((p), GPIO_MODE_OPEN_DRAIN, GPIO_PULL_NONE, 0)
+#define mp_hal_pin_high(p) mp_hal_pin_write((p), 1)
+#define mp_hal_pin_low(p) mp_hal_pin_write((p), 0)
+#define mp_hal_pin_od_low(p) mp_hal_pin_low(p)
+#define mp_hal_pin_od_high(p) mp_hal_pin_high(p)
+
+void mp_hal_pin_config(mp_hal_pin_obj_t pin, uint32_t mode, uint32_t pull, uint32_t value);
+void mp_hal_pin_write(mp_hal_pin_obj_t pin, uint8_t polarity);
+uint32_t mp_hal_pin_read(mp_hal_pin_obj_t pin);
+
+uint32_t mp_hal_pin_get_drive(mp_hal_pin_obj_t pin);
+void mp_hal_pin_set_drive(mp_hal_pin_obj_t pin, uint32_t drive);
+
+/**
+ * HAL Pin AF helper functions and types
+ */
+
+#define mp_hal_pin_af_obj_t const machine_pin_af_obj_t *
+
+typedef struct {
+ mp_hal_pin_obj_t pin;
+ machine_pin_af_signal_t signal;
+ uint32_t cy_drive_mode;
+ uint32_t init_value;
+ mp_hal_pin_af_obj_t af;
+}mp_hal_pin_af_config_t;
+
+#define MP_HAL_PIN_AF_CONF_INIT(_pin, _cy_drive_mode, _init_value, _af_signal) (mp_hal_pin_af_config_t) { \
+ .pin = _pin, \
+ .signal = _af_signal, \
+ .cy_drive_mode = _cy_drive_mode, \
+ .init_value = _init_value, \
+ .af = mp_hal_pin_af_find(_pin, _af_signal) \
+}
+
+#define MP_HAL_PIN_AF_CONF_INIT_GPIO_SIGNAL(_cy_drive_mode, _init_value, _af_signal) (mp_hal_pin_af_config_t) { \
+ .pin = NULL, \
+ .signal = _af_signal, \
+ .cy_drive_mode = _cy_drive_mode, \
+ .init_value = _init_value, \
+ .af = NULL \
+}
+
+#define MP_HAL_PIN_AF_CONF_SET_PIN_AF(conf_obj, _pin) \
+ conf_obj.pin = _pin; \
+ conf_obj.af = mp_hal_pin_af_find(_pin, conf_obj.signal);
+
+
+mp_hal_pin_af_obj_t mp_hal_pin_af_find(mp_hal_pin_obj_t pin, machine_pin_af_signal_t af_signal);
+
+void mp_hal_get_random(size_t n, uint8_t *buf);
+void mp_hal_periph_pins_af_resolve_fn_unit(const mp_hal_pin_af_config_t *periph_pins_config, uint8_t pin_num, machine_pin_af_fn_t fn, machine_pin_af_unit_t *fn_unit);
+void mp_hal_periph_pins_af_resolve_pin_af(mp_hal_pin_af_config_t *periph_pins_config, uint8_t pin_num, machine_pin_af_unit_t fn_unit);
+machine_pin_af_periph_t mp_hal_periph_pins_af_init(const mp_hal_pin_af_config_t *periph_pins_config, uint8_t num_pins);
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_HALPORT_H
diff --git a/ports/psoc-edge/mpy_gc_assert.ld b/ports/psoc-edge/mpy_gc_assert.ld
new file mode 100644
index 00000000000..7097f242605
--- /dev/null
+++ b/ports/psoc-edge/mpy_gc_assert.ld
@@ -0,0 +1,13 @@
+/*
+ * Build-time assertion for the MicroPython GC heap size.
+ *
+ * __GcHeapStart and __GcHeapEnd are defined via --defsym in the Makefile,
+ * controlled by MICROPY_C_HEAP_SIZE. This fragment is appended after the
+ * BSP linker script so both symbols are resolved when the ASSERT runs.
+ *
+ * 64 KB is the practical minimum: LittleFS2 alone allocates ~16 KB of
+ * read/write cache on mount, and the interpreter needs headroom on top.
+ * Increase MICROPY_C_HEAP_SIZE is too large, or reduce it if this fires.
+ */
+ASSERT((__GcHeapEnd - __GcHeapStart) >= 64 * 1024,
+ "MicroPython GC heap < 64 KB. Reduce MICROPY_C_HEAP_SIZE.")
diff --git a/ports/psoc-edge/network_ifx_wcm.c b/ports/psoc-edge/network_ifx_wcm.c
new file mode 100644
index 00000000000..0215db18668
--- /dev/null
+++ b/ports/psoc-edge/network_ifx_wcm.c
@@ -0,0 +1,882 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019-2023 Damien P. George
+ * Copyright (c) 2023 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "py/runtime.h"
+#include "py/objstr.h"
+#include "extmod/modnetwork.h"
+#include "network_ifx_wcm.h"
+
+#include
+
+#include "cybsp.h"
+#include "cy_wcm.h"
+#include "mtb_hal_sdio.h"
+#include "mtb_hal_gpio.h"
+#include "cy_sd_host.h"
+#include "cy_syspm.h"
+#include "cycfg_system.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "lwip/dns.h"
+#include "lwip/ip4_addr.h"
+#include "shared/netutils/netutils.h"
+
+#if MICROPY_PY_NETWORK_IFX_WCM
+
+#define NETWORK_WLAN_DEFAULT_SSID "mpy-psoc-edge-wlan"
+#define NETWORK_WLAN_DEFAULT_PASSWORD "mpy_PSoC_w3lc0me!"
+#define NETWORK_WLAN_DEFAULT_SECURITY CY_WCM_SECURITY_WPA2_AES_PSK
+#define NETWORK_WLAN_DEFAULT_CHANNEL 9
+
+#define NETWORK_WLAN_AP_IP "192.168.0.1"
+#define NETWORK_WLAN_AP_GATEWAY_IP "192.168.0.1"
+#define NETWORK_WLAN_AP_NETMASK_IP "255.255.255.0"
+
+#define NETWORK_WLAN_MAX_AP_STATIONS 8
+
+#define NET_IFX_WCM_SEC_OPEN 0
+#define NET_IFX_WCM_SEC_WEP 1
+#define NET_IFX_WCM_SEC_WPA 2
+#define NET_IFX_WCM_SEC_WPA2 3
+#define NET_IFX_WCM_SEC_WPA_WPA2 4
+#define NET_IFX_WCM_SEC_WPA3 5
+#define NET_IFX_WCM_SEC_UNKNOWN 6
+
+// ---------------------------------------------------------------------------
+// SDIO / GPIO hardware state
+// ---------------------------------------------------------------------------
+
+#define WIFI_SDIO_INTERRUPT_PRIORITY (7U)
+#define WIFI_HOST_WAKE_INTERRUPT_PRIORITY (2U)
+#define WIFI_SDIO_FREQUENCY_HZ (25000000U)
+#define WIFI_SDIO_BLOCK_SIZE (64U)
+
+typedef struct {
+ cy_wcm_ap_config_t ap_config;
+} network_ifx_wcm_ap_obj_t;
+
+typedef struct {
+ cy_wcm_associated_ap_info_t ap_info;
+ uint8_t connect_retries;
+} network_ifx_wcm_sta_obj_t;
+
+typedef union {
+ network_ifx_wcm_ap_obj_t ap_obj;
+ network_ifx_wcm_sta_obj_t sta_obj;
+} itf_obj_t;
+
+typedef struct _network_ifx_wcm_obj_t {
+ mp_obj_base_t base;
+ cy_wcm_interface_t itf;
+ itf_obj_t itf_obj;
+} network_ifx_wcm_obj_t;
+
+static network_ifx_wcm_obj_t network_ifx_wcm_wl_sta = { { &mp_network_ifx_wcm_type }, CY_WCM_INTERFACE_TYPE_STA };
+static network_ifx_wcm_obj_t network_ifx_wcm_wl_ap = { { &mp_network_ifx_wcm_type }, CY_WCM_INTERFACE_TYPE_AP };
+
+#define wcm_get_ap_conf_ptr(net_obj) & (net_obj.itf_obj.ap_obj.ap_config)
+#define wcm_get_sta_conf_ptr(net_obj) & (net_obj.itf_obj.sta_obj)
+
+extern uint8_t cy_wcm_is_ap_up(void);
+
+static mtb_hal_sdio_t sdio_obj;
+static cy_stc_sd_host_context_t sdhc_ctx;
+static cy_wcm_config_t wcm_config;
+
+#if (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP)
+static cy_stc_syspm_callback_params_t sdhc_ds_params = {
+ .context = &sdhc_ctx,
+ .base = CYBSP_WIFI_SDIO_HW
+};
+static cy_stc_syspm_callback_t sdhc_ds_cb = {
+ .callback = Cy_SD_Host_DeepSleepCallback,
+ .skipMode = 0U,
+ .type = CY_SYSPM_DEEPSLEEP,
+ .callbackParams = &sdhc_ds_params,
+ .prevItm = NULL,
+ .nextItm = NULL,
+ .order = 1U
+};
+#endif
+
+static void wifi_sdio_isr(void) {
+ mtb_hal_sdio_process_interrupt(&sdio_obj);
+}
+
+static void wifi_host_wake_isr(void) {
+ mtb_hal_gpio_process_interrupt(&wcm_config.wifi_host_wake_pin);
+}
+
+static void wifi_sdio_init(void) {
+ cy_stc_sysint_t sdio_intr = {
+ .intrSrc = CYBSP_WIFI_SDIO_IRQ,
+ .intrPriority = WIFI_SDIO_INTERRUPT_PRIORITY
+ };
+ cy_stc_sysint_t wake_intr = {
+ .intrSrc = CYBSP_WIFI_HOST_WAKE_IRQ,
+ .intrPriority = WIFI_HOST_WAKE_INTERRUPT_PRIORITY
+ };
+
+ Cy_SysInt_Init(&sdio_intr, wifi_sdio_isr);
+ NVIC_EnableIRQ(CYBSP_WIFI_SDIO_IRQ);
+
+ mtb_hal_sdio_setup(&sdio_obj, &CYBSP_WIFI_SDIO_sdio_hal_config, NULL, &sdhc_ctx);
+
+ Cy_SD_Host_Enable(CYBSP_WIFI_SDIO_HW);
+ Cy_SD_Host_Init(CYBSP_WIFI_SDIO_HW, CYBSP_WIFI_SDIO_sdio_hal_config.host_config, &sdhc_ctx);
+ Cy_SD_Host_SetHostBusWidth(CYBSP_WIFI_SDIO_HW, CY_SD_HOST_BUS_WIDTH_4_BIT);
+
+ mtb_hal_sdio_cfg_t sdio_cfg = {
+ .frequencyhal_hz = WIFI_SDIO_FREQUENCY_HZ,
+ .block_size = WIFI_SDIO_BLOCK_SIZE
+ };
+ mtb_hal_sdio_configure(&sdio_obj, &sdio_cfg);
+
+ mtb_hal_gpio_setup(&wcm_config.wifi_wl_pin,
+ CYBSP_WIFI_WL_REG_ON_PORT_NUM, CYBSP_WIFI_WL_REG_ON_PIN);
+ mtb_hal_gpio_setup(&wcm_config.wifi_host_wake_pin,
+ CYBSP_WIFI_HOST_WAKE_PORT_NUM, CYBSP_WIFI_HOST_WAKE_PIN);
+
+ Cy_SysInt_Init(&wake_intr, wifi_host_wake_isr);
+ NVIC_EnableIRQ(CYBSP_WIFI_HOST_WAKE_IRQ);
+}
+
+// ---------------------------------------------------------------------------
+// network_hw_init — one-time HW bring-up, called before the soft_reset loop
+// network_init / network_deinit — called every soft reset from main.c
+// ---------------------------------------------------------------------------
+#define wcm_assert_raise(msg, ret) if (ret != CY_RSLT_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+// Network Access Point initialization with default network parameters
+void network_ap_init() {
+ cy_rslt_t ret = CY_RSLT_SUCCESS;
+ cy_wcm_ap_config_t *ap_conf = wcm_get_ap_conf_ptr(network_ifx_wcm_wl_ap);
+ cy_wcm_ip_setting_t *ap_ip_settings = &(ap_conf->ip_settings);
+
+ ap_conf->channel = NETWORK_WLAN_DEFAULT_CHANNEL;
+ memcpy(ap_conf->ap_credentials.SSID, NETWORK_WLAN_DEFAULT_SSID, strlen(NETWORK_WLAN_DEFAULT_SSID) + 1);
+ memcpy(ap_conf->ap_credentials.password, NETWORK_WLAN_DEFAULT_PASSWORD, strlen(NETWORK_WLAN_DEFAULT_PASSWORD) + 1);
+ ap_conf->ap_credentials.security = NETWORK_WLAN_DEFAULT_SECURITY;
+
+ cy_wcm_set_ap_ip_setting(ap_ip_settings, NETWORK_WLAN_AP_IP, NETWORK_WLAN_AP_NETMASK_IP, NETWORK_WLAN_AP_GATEWAY_IP, CY_WCM_IP_VER_V4);
+ wcm_assert_raise("network ap ip setting error (code: %d)", ret);
+}
+
+static void restart_ap(cy_wcm_ap_config_t *ap_conf) {
+ if (cy_wcm_is_ap_up()) {
+ uint32_t ret = cy_wcm_stop_ap();
+ wcm_assert_raise("network ap deactivate error (with code: %d)", ret);
+ ret = cy_wcm_start_ap(ap_conf);
+ wcm_assert_raise("network ap active error (with code: %d)", ret);
+ }
+}
+
+void network_sta_init() {
+ network_ifx_wcm_sta_obj_t *sta_conf = wcm_get_sta_conf_ptr(network_ifx_wcm_wl_sta);
+ sta_conf->connect_retries = 3; // Default connect retries
+}
+
+void network_hw_init(void) {
+ wifi_sdio_init();
+ #if (CY_CFG_PWR_SYS_IDLE_MODE == CY_CFG_PWR_MODE_DEEPSLEEP)
+ Cy_SysPm_RegisterCallback(&sdhc_ds_cb);
+ #endif
+ wcm_config.interface = CY_WCM_INTERFACE_TYPE_AP_STA;
+ wcm_config.wifi_interface_instance = &sdio_obj;
+}
+
+void network_init(void) {
+ cy_rslt_t ret = cy_wcm_init(&wcm_config);
+ wcm_assert_raise("network init error (code: %d)", ret);
+
+ network_ap_init();
+ network_sta_init();
+}
+
+void network_deinit(void) {
+ cy_rslt_t ret = cy_wcm_deinit();
+ wcm_assert_raise("network deinit error (code: %d)", ret);
+}
+
+// ---------------------------------------------------------------------------
+// Minimal MicroPython type — make_new + print so the module registers cleanly
+// ---------------------------------------------------------------------------
+
+static mp_obj_t network_ifx_wcm_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 0, 1, false);
+
+ if (n_args == 0 || mp_obj_get_int(args[0]) == MOD_NETWORK_STA_IF) {
+ return MP_OBJ_FROM_PTR(&network_ifx_wcm_wl_sta);
+ } else {
+ return MP_OBJ_FROM_PTR(&network_ifx_wcm_wl_ap);
+ }
+}
+
+static void network_ifx_wcm_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ const char *status_str;
+ if (self->itf == CY_WCM_INTERFACE_TYPE_STA) {
+ if (cy_wcm_is_connected_to_ap()) {
+ status_str = "joined";
+ } else {
+ status_str = "down";
+ }
+ } else {
+ if (cy_wcm_is_ap_up()) {
+ status_str = "up";
+ } else {
+ status_str = "down";
+ }
+ }
+
+ cy_wcm_ip_address_t ip_address;
+ cy_rslt_t ret = cy_wcm_get_ip_addr(self->itf, &ip_address);
+ if (ret != CY_RSLT_SUCCESS) {
+ ip_address.ip.v4 = 0;
+ }
+
+ mp_printf(print, "",
+ self->itf == CY_WCM_INTERFACE_TYPE_STA ? "STA" : "AP",
+ status_str,
+ ip_address.ip.v4 & 0xff,
+ ip_address.ip.v4 >> 8 & 0xff,
+ ip_address.ip.v4 >> 16 & 0xff,
+ ip_address.ip.v4 >> 24
+ );
+}
+
+/*******************************************************************************/
+// network API
+
+static mp_obj_t network_ifx_wcm_active(size_t n_args, const mp_obj_t *args) {
+ cy_rslt_t ret = CY_RSLT_SUCCESS;
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ if (self->itf == CY_WCM_INTERFACE_TYPE_STA) {
+ if (n_args == 1) {
+ return mp_obj_new_bool(cy_wcm_is_connected_to_ap());
+ }
+ } else if (self->itf == CY_WCM_INTERFACE_TYPE_AP) {
+ if (n_args == 1) {
+ return mp_obj_new_bool(cy_wcm_is_ap_up());
+ } else {
+ if (mp_obj_is_true(args[1])) {
+ cy_wcm_ap_config_t *ap_conf = wcm_get_ap_conf_ptr(network_ifx_wcm_wl_ap);
+ ret = cy_wcm_start_ap(ap_conf);
+ wcm_assert_raise("network ap active error (with code: %d)", ret);
+ } else {
+ ret = cy_wcm_stop_ap();
+ wcm_assert_raise("network ap deactivate error (with code: %d)", ret);
+ }
+ }
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_ifx_wcm_active_obj, 1, 2, network_ifx_wcm_active);
+
+static mp_obj_t network_ifx_wcm_deinit(mp_obj_t self_in) {
+ network_deinit();
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(network_ifx_wcm_deinit_obj, network_ifx_wcm_deinit);
+
+typedef struct
+{
+ mp_obj_t *scan_list;
+ cy_wcm_scan_status_t status;
+}scan_user_data_t;
+
+// Based on the scan result, get micropython defined equivalent security type (possible value 0-4, extended till 7 to include all cases) and security string (mapped to IFX stack)
+uint8_t get_mpy_security_type(cy_wcm_security_t wcm_sec) {
+ uint8_t mpy_sec_type = NET_IFX_WCM_SEC_UNKNOWN;
+
+ switch (wcm_sec)
+ {
+ case CY_WCM_SECURITY_OPEN:
+ mpy_sec_type = NET_IFX_WCM_SEC_OPEN;
+ break;
+ case CY_WCM_SECURITY_WEP_PSK:
+ case CY_WCM_SECURITY_WEP_SHARED:
+ case CY_WCM_SECURITY_IBSS_OPEN:
+ mpy_sec_type = NET_IFX_WCM_SEC_WEP;
+ break;
+ case CY_WCM_SECURITY_WPA_AES_PSK:
+ case CY_WCM_SECURITY_WPA_MIXED_PSK:
+ case CY_WCM_SECURITY_WPA_TKIP_PSK:
+ case CY_WCM_SECURITY_WPA_TKIP_ENT:
+ case CY_WCM_SECURITY_WPA_AES_ENT:
+ case CY_WCM_SECURITY_WPA_MIXED_ENT:
+ mpy_sec_type = NET_IFX_WCM_SEC_WPA;
+ break;
+ case CY_WCM_SECURITY_WPA2_AES_PSK:
+ case CY_WCM_SECURITY_WPA2_TKIP_PSK:
+ case CY_WCM_SECURITY_WPA2_MIXED_PSK:
+ case CY_WCM_SECURITY_WPA2_FBT_PSK:
+ case CY_WCM_SECURITY_WPA2_TKIP_ENT:
+ case CY_WCM_SECURITY_WPA2_AES_ENT:
+ case CY_WCM_SECURITY_WPA2_MIXED_ENT:
+ case CY_WCM_SECURITY_WPA2_FBT_ENT:
+ mpy_sec_type = NET_IFX_WCM_SEC_WPA2;
+ break;
+ case CY_WCM_SECURITY_WPA2_WPA_AES_PSK:
+ case CY_WCM_SECURITY_WPA2_WPA_MIXED_PSK:
+ mpy_sec_type = NET_IFX_WCM_SEC_WPA_WPA2;
+ break;
+ case CY_WCM_SECURITY_WPA3_SAE:
+ case CY_WCM_SECURITY_WPA3_WPA2_PSK:
+ mpy_sec_type = NET_IFX_WCM_SEC_WPA3;
+ break;
+ case CY_WCM_SECURITY_WPS_SECURE:
+ case CY_WCM_SECURITY_UNKNOWN:
+ default:
+ mpy_sec_type = NET_IFX_WCM_SEC_UNKNOWN;
+ break;
+ }
+ return mpy_sec_type;
+}
+
+// Callback function for scan method. After each scan result, the scan callback is executed.
+static void network_ifx_wcm_scan_cb(cy_wcm_scan_result_t *result_ptr, void *user_data, cy_wcm_scan_status_t status) {
+ scan_user_data_t *scan_user_data = (scan_user_data_t *)user_data;
+ mp_obj_t scan_list = MP_OBJ_FROM_PTR(scan_user_data->scan_list);
+ uint8_t hidden_status = 1; // HIDDEN
+ uint8_t security_type = NET_IFX_WCM_SEC_OPEN;
+
+ if (status == CY_WCM_SCAN_INCOMPLETE) {
+ // Get the network status : hidden(1) or open(0)
+ if (strlen((const char *)result_ptr->SSID) != 0) {
+ hidden_status = 0;
+ }
+
+ // Get security type as mapped in micropython function description
+ security_type = get_mpy_security_type(result_ptr->security);
+
+ mp_obj_t tuple[6] = {
+ mp_obj_new_bytes(result_ptr->SSID, strlen((const char *)result_ptr->SSID)),
+ mp_obj_new_bytes(result_ptr->BSSID, CY_WCM_MAC_ADDR_LEN),
+ MP_OBJ_NEW_SMALL_INT(result_ptr->channel),
+ MP_OBJ_NEW_SMALL_INT(result_ptr->signal_strength),
+ MP_OBJ_NEW_SMALL_INT(security_type),
+ MP_OBJ_NEW_SMALL_INT(hidden_status)
+ };
+ mp_obj_list_append(scan_list, mp_obj_new_tuple(6, tuple));
+ }
+
+ scan_user_data->status = status;
+}
+
+static mp_obj_t network_ifx_wcm_scan(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ cy_rslt_t ret = CY_RSLT_SUCCESS;
+ cy_wcm_scan_filter_t scan_filter;
+ memset(&scan_filter, 0, sizeof(scan_filter));
+ bool is_filter_used = false;
+
+ if (self->itf != CY_WCM_INTERFACE_TYPE_STA) {
+ mp_raise_ValueError(MP_ERROR_TEXT("network STA required"));
+ }
+
+ if (n_args != 1) {
+ mp_raise_TypeError(MP_ERROR_TEXT("network scan accepts no query parameters"));
+ }
+
+ if (kwargs->used != 0) {
+ if (kwargs->alloc != 1) {
+ mp_raise_TypeError(MP_ERROR_TEXT("network scan only accepts one filter mode"));
+ }
+
+ is_filter_used = true;
+ mp_map_elem_t *e = &kwargs->table[0];
+ switch (mp_obj_str_get_qstr(e->key))
+ {
+ case MP_QSTR_ssid: {
+ scan_filter.mode = CY_WCM_SCAN_FILTER_TYPE_SSID;
+ size_t len;
+ const char *ssid = mp_obj_str_get_data(e->value, &len);
+ len = MIN(len, CY_WCM_MAX_SSID_LEN + 1);
+ memcpy(scan_filter.param.SSID, ssid, len);
+ memset(&scan_filter.param.SSID[len], 0, 1); // null terminated str.
+ break;
+ }
+
+ case MP_QSTR_bssid: {
+ scan_filter.mode = CY_WCM_SCAN_FILTER_TYPE_MAC;
+ mp_buffer_info_t bssid;
+ mp_get_buffer(e->value, &bssid, MP_BUFFER_READ);
+ if (bssid.len != CY_WCM_MAC_ADDR_LEN) {
+ mp_raise_ValueError(MP_ERROR_TEXT("bssid address invalid length"));
+ }
+ memcpy(scan_filter.param.BSSID, bssid.buf, bssid.len);
+ break;
+ }
+
+ default:
+ mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+ }
+ }
+
+ mp_obj_t network_list = mp_obj_new_list(0, NULL);
+ scan_user_data_t scan_user_params;
+ scan_user_params.scan_list = MP_OBJ_TO_PTR(network_list);
+ scan_user_params.status = CY_WCM_SCAN_INCOMPLETE;
+
+ cy_wcm_scan_filter_t *scan_filter_ptr = NULL;
+ if (is_filter_used) {
+ scan_filter_ptr = &scan_filter;
+ }
+
+ ret = cy_wcm_start_scan(network_ifx_wcm_scan_cb, (void *)&scan_user_params, scan_filter_ptr);
+ wcm_assert_raise("network scan error (with code: %d)", ret);
+
+ while (scan_user_params.status == CY_WCM_SCAN_INCOMPLETE) {
+ vTaskDelay(pdMS_TO_TICKS(10));
+ }
+
+ return scan_user_params.scan_list;
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(network_ifx_wcm_scan_obj, 1, network_ifx_wcm_scan);
+
+static mp_obj_t network_ifx_wcm_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+
+ if (self->itf != CY_WCM_INTERFACE_TYPE_STA) {
+ mp_raise_ValueError(MP_ERROR_TEXT("network STA required"));
+ }
+
+ enum { ARG_ssid, ARG_key, ARG_bssid };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_ssid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_key, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
+ };
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ cy_wcm_connect_params_t connect_param;
+ cy_wcm_ip_address_t ip_address;
+ memset(&connect_param, 0, sizeof(cy_wcm_connect_params_t));
+
+ // SSID
+ mp_buffer_info_t ssid;
+ mp_get_buffer_raise(args[ARG_ssid].u_obj, &ssid, MP_BUFFER_READ);
+ if (ssid.len > CY_WCM_MAX_SSID_LEN) {
+ mp_raise_TypeError(MP_ERROR_TEXT("network connect SSID too long"));
+ }
+ memcpy(connect_param.ap_credentials.SSID, ssid.buf, ssid.len);
+
+ // Key (optional)
+ if (args[ARG_key].u_obj != mp_const_none) {
+ mp_buffer_info_t key;
+ mp_get_buffer_raise(args[ARG_key].u_obj, &key, MP_BUFFER_READ);
+ if (key.len > CY_WCM_MAX_PASSPHRASE_LEN) {
+ mp_raise_TypeError(MP_ERROR_TEXT("network connect key too long"));
+ }
+ memcpy(connect_param.ap_credentials.password, key.buf, key.len);
+ }
+
+ // BSSID (optional)
+ if (args[ARG_bssid].u_obj != mp_const_none) {
+ mp_buffer_info_t bssid;
+ mp_get_buffer_raise(args[ARG_bssid].u_obj, &bssid, MP_BUFFER_READ);
+ if (bssid.len != CY_WCM_MAC_ADDR_LEN) {
+ mp_raise_ValueError(MP_ERROR_TEXT("bssid address invalid length"));
+ }
+ memcpy(connect_param.BSSID, bssid.buf, bssid.len);
+ }
+
+ // OPEN for unencrypted networks; UNKNOWN for WPA/etc to let WCM discover variant.
+ if (args[ARG_key].u_obj == mp_const_none) {
+ connect_param.ap_credentials.security = CY_WCM_SECURITY_OPEN;
+ } else {
+ connect_param.ap_credentials.security = CY_WCM_SECURITY_UNKNOWN;
+ }
+
+ network_ifx_wcm_sta_obj_t *sta_conf = wcm_get_sta_conf_ptr(network_ifx_wcm_wl_sta);
+ uint8_t retries = sta_conf->connect_retries;
+ cy_rslt_t ret;
+ do {
+ ret = cy_wcm_connect_ap(&connect_param, &ip_address);
+ } while (ret != CY_RSLT_SUCCESS && --retries > 0);
+ wcm_assert_raise("network sta connect error (with code: %d)", ret);
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(network_ifx_wcm_connect_obj, 1, network_ifx_wcm_connect);
+
+static mp_obj_t network_ifx_wcm_disconnect(mp_obj_t self_in) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ if (self->itf != CY_WCM_INTERFACE_TYPE_STA) {
+ mp_raise_ValueError(MP_ERROR_TEXT("network STA required"));
+ }
+ cy_rslt_t ret = cy_wcm_disconnect_ap();
+ wcm_assert_raise("network sta disconnect error (with code: %d)", ret);
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(network_ifx_wcm_disconnect_obj, network_ifx_wcm_disconnect);
+
+static mp_obj_t network_ifx_wcm_isconnected(mp_obj_t self_in) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+
+ if (self->itf == CY_WCM_INTERFACE_TYPE_STA) {
+ return mp_obj_new_bool(cy_wcm_is_connected_to_ap());
+ } else if (self->itf == CY_WCM_INTERFACE_TYPE_AP) {
+ // Return False immediately if AP is not running
+ if (!cy_wcm_is_ap_up()) {
+ return mp_obj_new_bool(false);
+ }
+ // True if at least one client is associated
+ bool is_a_sta_connected = false;
+ cy_wcm_mac_t sta[1] = {0};
+ cy_wcm_mac_t not_conn_sta = {0, 0, 0, 0, 0, 0};
+ cy_rslt_t ret = cy_wcm_get_associated_client_list(sta, 1);
+ wcm_assert_raise("network ap isconnected error (with code: %d)", ret);
+ if (memcmp(&sta[0], ¬_conn_sta, CY_WCM_MAC_ADDR_LEN) != 0) {
+ is_a_sta_connected = true;
+ }
+ return mp_obj_new_bool(is_a_sta_connected);
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(network_ifx_wcm_isconnected_obj, network_ifx_wcm_isconnected);
+
+static mp_obj_t network_ifx_wcm_status(size_t n_args, const mp_obj_t *args) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ if (n_args != 2) {
+ mp_raise_TypeError(MP_ERROR_TEXT("network status expects 1 argument"));
+ }
+
+ qstr query = mp_obj_str_get_qstr(args[1]);
+
+ if (query == MP_QSTR_rssi) {
+ if (self->itf != CY_WCM_INTERFACE_TYPE_STA) {
+ mp_raise_ValueError(MP_ERROR_TEXT("network station required"));
+ }
+ cy_wcm_associated_ap_info_t ap_info;
+ cy_rslt_t ret = cy_wcm_get_associated_ap_info(&ap_info);
+ wcm_assert_raise("network status error (with code: %d)", ret);
+ return mp_obj_new_int(ap_info.signal_strength);
+ } else if (query == MP_QSTR_stations) {
+ if (self->itf != CY_WCM_INTERFACE_TYPE_AP) {
+ mp_raise_ValueError(MP_ERROR_TEXT("network access point required"));
+ }
+
+ cy_wcm_mac_t sta_list[NETWORK_WLAN_MAX_AP_STATIONS];
+ cy_wcm_mac_t not_conn_sta = {0, 0, 0, 0, 0, 0};
+
+ cy_rslt_t ret = cy_wcm_get_associated_client_list(&sta_list[0], NETWORK_WLAN_MAX_AP_STATIONS);
+ wcm_assert_raise("network status error (with code: %d)", ret);
+
+ mp_obj_t list = mp_obj_new_list(0, NULL);
+ for (int i = 0; i < NETWORK_WLAN_MAX_AP_STATIONS; ++i) {
+ if (memcmp(&sta_list[i], ¬_conn_sta, CY_WCM_MAC_ADDR_LEN) != 0) {
+ mp_obj_list_append(list, mp_obj_new_bytes(sta_list[i], CY_WCM_MAC_ADDR_LEN));
+ }
+ }
+ return list;
+ }
+
+ mp_raise_ValueError(MP_ERROR_TEXT("network status unknown param"));
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_ifx_wcm_status_obj, 1, 2, network_ifx_wcm_status);
+
+static cy_wcm_security_t get_wcm_security_type(mp_obj_t mpy_sec) {
+ switch (mp_obj_get_int(mpy_sec)) {
+ case NET_IFX_WCM_SEC_OPEN:
+ return CY_WCM_SECURITY_OPEN;
+ case NET_IFX_WCM_SEC_WPA:
+ return CY_WCM_SECURITY_WPA_MIXED_PSK;
+ case NET_IFX_WCM_SEC_WPA2:
+ return CY_WCM_SECURITY_WPA2_MIXED_PSK;
+ case NET_IFX_WCM_SEC_WPA3:
+ return CY_WCM_SECURITY_WPA3_SAE;
+ case NET_IFX_WCM_SEC_WPA_WPA2:
+ return CY_WCM_SECURITY_WPA2_WPA_MIXED_PSK;
+ default:
+ return CY_WCM_SECURITY_UNKNOWN;
+ }
+}
+
+static mp_obj_t network_ap_get_config_param(cy_wcm_ap_config_t *ap_conf, qstr query_opt) {
+ switch (query_opt) {
+ case MP_QSTR_channel:
+ return MP_OBJ_NEW_SMALL_INT(ap_conf->channel);
+ case MP_QSTR_ssid:
+ case MP_QSTR_essid:
+ return mp_obj_new_str((const char *)ap_conf->ap_credentials.SSID, strlen((const char *)ap_conf->ap_credentials.SSID));
+ case MP_QSTR_security:
+ return MP_OBJ_NEW_SMALL_INT(get_mpy_security_type(ap_conf->ap_credentials.security));
+ case MP_QSTR_key:
+ case MP_QSTR_password:
+ if (strcmp((const char *)ap_conf->ap_credentials.password, NETWORK_WLAN_DEFAULT_PASSWORD) == 0) {
+ return mp_obj_new_str((const char *)NETWORK_WLAN_DEFAULT_PASSWORD, strlen((const char *)NETWORK_WLAN_DEFAULT_PASSWORD));
+ } else {
+ mp_raise_ValueError(MP_ERROR_TEXT("network conf password only queryable for default password"));
+ }
+ break;
+ case MP_QSTR_mac: {
+ cy_wcm_mac_t mac;
+ cy_rslt_t ret = cy_wcm_get_mac_addr(CY_WCM_INTERFACE_TYPE_AP, &mac);
+ wcm_assert_raise("network config mac (code: %d)", ret);
+ return mp_obj_new_bytes(mac, CY_WCM_MAC_ADDR_LEN);
+ }
+ case MP_QSTR_hostname:
+ mp_raise_ValueError(MP_ERROR_TEXT("deprecated. use network.hostname() instead"));
+ break;
+ default:
+ mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+ }
+}
+
+static mp_obj_t network_sta_get_config_param(network_ifx_wcm_sta_obj_t *sta_conf, qstr query_opt) {
+ switch (query_opt) {
+ case MP_QSTR_channel: {
+ cy_wcm_associated_ap_info_t ap_info;
+ cy_rslt_t ret = cy_wcm_get_associated_ap_info(&ap_info);
+ wcm_assert_raise("network config error (with code: %d)", ret);
+ return MP_OBJ_NEW_SMALL_INT(ap_info.channel);
+ }
+ case MP_QSTR_ssid:
+ case MP_QSTR_essid: {
+ cy_wcm_associated_ap_info_t ap_info;
+ cy_rslt_t ret = cy_wcm_get_associated_ap_info(&ap_info);
+ wcm_assert_raise("network config error (with code: %d)", ret);
+ return mp_obj_new_str((const char *)ap_info.SSID, strlen((const char *)ap_info.SSID));
+ }
+ case MP_QSTR_mac: {
+ cy_wcm_mac_t mac;
+ cy_rslt_t ret = cy_wcm_get_mac_addr(CY_WCM_INTERFACE_TYPE_STA, &mac);
+ wcm_assert_raise("network config mac (code: %d)", ret);
+ return mp_obj_new_bytes(mac, CY_WCM_MAC_ADDR_LEN);
+ }
+ case MP_QSTR_security: {
+ cy_wcm_associated_ap_info_t ap_info;
+ cy_rslt_t ret = cy_wcm_get_associated_ap_info(&ap_info);
+ wcm_assert_raise("network config error (with code: %d)", ret);
+ return MP_OBJ_NEW_SMALL_INT(get_mpy_security_type(ap_info.security));
+ }
+ case MP_QSTR_key:
+ case MP_QSTR_password:
+ mp_raise_ValueError(MP_ERROR_TEXT("network access point required"));
+ break;
+ case MP_QSTR_hostname:
+ mp_raise_ValueError(MP_ERROR_TEXT("deprecated. use network.hostname() instead"));
+ break;
+ default:
+ mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+ }
+}
+
+static void network_ap_set_config_param(cy_wcm_ap_config_t *ap_conf, qstr opt, mp_obj_t opt_value, bool hold) {
+ static bool required_ap_restart = false;
+
+ switch (opt) {
+ case MP_QSTR_channel:
+ ap_conf->channel = mp_obj_get_int(opt_value);
+ required_ap_restart = true;
+ break;
+ case MP_QSTR_ssid:
+ case MP_QSTR_essid: {
+ size_t len;
+ const char *ssid_str = mp_obj_str_get_data(opt_value, &len);
+ memset(ap_conf->ap_credentials.SSID, 0, CY_WCM_MAX_SSID_LEN + 1);
+ memcpy(ap_conf->ap_credentials.SSID, ssid_str, len);
+ required_ap_restart = true;
+ break;
+ }
+ case MP_QSTR_security:
+ ap_conf->ap_credentials.security = get_wcm_security_type(opt_value);
+ required_ap_restart = true;
+ break;
+ case MP_QSTR_key:
+ case MP_QSTR_password: {
+ size_t len;
+ const char *pass_str = mp_obj_str_get_data(opt_value, &len);
+ memset(ap_conf->ap_credentials.password, 0, CY_WCM_MAX_PASSPHRASE_LEN + 1);
+ memcpy(ap_conf->ap_credentials.password, pass_str, len);
+ break;
+ }
+ case MP_QSTR_hostname:
+ mp_raise_ValueError(MP_ERROR_TEXT("deprecated. use network.hostname() instead"));
+ break;
+ default:
+ mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+ }
+
+ if (required_ap_restart && !hold) {
+ restart_ap(ap_conf);
+ required_ap_restart = false;
+ }
+}
+
+static void network_sta_set_config_param(network_ifx_wcm_sta_obj_t *sta_conf, qstr opt, mp_obj_t opt_value) {
+ switch (opt) {
+ case MP_QSTR_channel:
+ case MP_QSTR_key:
+ case MP_QSTR_password:
+ case MP_QSTR_ssid:
+ case MP_QSTR_essid:
+ case MP_QSTR_hostname:
+ mp_raise_ValueError(MP_ERROR_TEXT("network access point required"));
+ break;
+ default:
+ mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+ }
+}
+
+static mp_obj_t network_ifx_wcm_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+ if (kwargs->used == 0) {
+ // Get config value
+ if (n_args != 2) {
+ mp_raise_TypeError(MP_ERROR_TEXT("must query one param"));
+ }
+
+ if (self->itf == CY_WCM_INTERFACE_TYPE_AP) {
+ cy_wcm_ap_config_t *ap_conf = wcm_get_ap_conf_ptr(network_ifx_wcm_wl_ap);
+ return network_ap_get_config_param(ap_conf, mp_obj_str_get_qstr(args[1]));
+ } else if (self->itf == CY_WCM_INTERFACE_TYPE_STA) {
+ network_ifx_wcm_sta_obj_t *sta_conf = wcm_get_sta_conf_ptr(network_ifx_wcm_wl_sta);
+ return network_sta_get_config_param(sta_conf, mp_obj_str_get_qstr(args[1]));
+ }
+ } else {
+ // Set config value(s)
+ if (n_args != 1) {
+ mp_raise_TypeError(MP_ERROR_TEXT("can't specify pos and kw args"));
+ }
+ size_t kwargs_num = kwargs->used;
+ size_t matched = 0;
+ for (size_t i = 0; i < kwargs->alloc; ++i) {
+ if (MP_MAP_SLOT_IS_FILLED(kwargs, i)) {
+ matched++;
+ mp_map_elem_t *e = &kwargs->table[i];
+ bool hold_config = (matched < kwargs_num);
+
+ if (self->itf == CY_WCM_INTERFACE_TYPE_AP) {
+ cy_wcm_ap_config_t *ap_conf = wcm_get_ap_conf_ptr(network_ifx_wcm_wl_ap);
+ network_ap_set_config_param(ap_conf, mp_obj_str_get_qstr(e->key), e->value, hold_config);
+ } else if (self->itf == CY_WCM_INTERFACE_TYPE_STA) {
+ network_ifx_wcm_sta_obj_t *sta_conf = wcm_get_sta_conf_ptr(network_ifx_wcm_wl_sta);
+ network_sta_set_config_param(sta_conf, mp_obj_str_get_qstr(e->key), e->value);
+ }
+ }
+ }
+ }
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(network_ifx_wcm_config_obj, 1, network_ifx_wcm_config);
+
+static mp_obj_t network_ifx_wcm_ifconfig(size_t n_args, const mp_obj_t *args) {
+ network_ifx_wcm_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ if (n_args == 1) {
+ const ip_addr_t *dns = dns_getserver(0);
+ cy_wcm_ip_address_t ip_address;
+ cy_wcm_ip_address_t net_mask_addr;
+ cy_wcm_ip_address_t gateway_addr;
+ cy_rslt_t ret = cy_wcm_get_ip_addr(self->itf, &ip_address);
+ wcm_assert_raise("network ifconfig error (with code: %d)", ret);
+ ret = cy_wcm_get_gateway_ip_address(self->itf, &gateway_addr);
+ wcm_assert_raise("network ifconfig error (with code: %d)", ret);
+ ret = cy_wcm_get_ip_netmask(self->itf, &net_mask_addr);
+ wcm_assert_raise("network ifconfig error (with code: %d)", ret);
+ mp_obj_t tuple[4] = {
+ mp_obj_new_str(ip4addr_ntoa((const ip4_addr_t *)&ip_address.ip.v4), strlen(ip4addr_ntoa((const ip4_addr_t *)&ip_address.ip.v4))),
+ mp_obj_new_str(ip4addr_ntoa((const ip4_addr_t *)&net_mask_addr.ip.v4), strlen(ip4addr_ntoa((const ip4_addr_t *)&net_mask_addr.ip.v4))),
+ mp_obj_new_str(ip4addr_ntoa((const ip4_addr_t *)&gateway_addr.ip.v4), strlen(ip4addr_ntoa((const ip4_addr_t *)&gateway_addr.ip.v4))),
+ netutils_format_ipv4_addr((uint8_t *)dns, NETUTILS_BIG),
+ };
+ return mp_obj_new_tuple(4, tuple);
+ } else {
+ if (self->itf == CY_WCM_INTERFACE_TYPE_AP) {
+ const mp_obj_t *argss = args + 1;
+ mp_obj_t *items;
+ mp_obj_get_array_fixed_n(argss[0], 4, &items);
+ const char *ip_address = mp_obj_str_get_str(items[0]);
+ const char *net_mask_addr = mp_obj_str_get_str(items[1]);
+ const char *gateway_addr = mp_obj_str_get_str(items[2]);
+ cy_wcm_ap_config_t *ap_conf = wcm_get_ap_conf_ptr(network_ifx_wcm_wl_ap);
+ cy_rslt_t ret = cy_wcm_set_ap_ip_setting(&(ap_conf->ip_settings), ip_address, net_mask_addr, gateway_addr, CY_WCM_IP_VER_V4);
+ wcm_assert_raise("network ifconfig error (with code: %d)", ret);
+
+ ip_addr_t dns;
+ netutils_parse_ipv4_addr(items[3], (uint8_t *)&dns, NETUTILS_BIG);
+ dns_setserver(0, &dns);
+
+ restart_ap(ap_conf);
+ } else if (self->itf == CY_WCM_INTERFACE_TYPE_STA) {
+ mp_raise_ValueError(MP_ERROR_TEXT("network access point required"));
+ }
+ }
+
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_ifx_wcm_ifconfig_obj, 1, 2, network_ifx_wcm_ifconfig);
+
+
+static const mp_rom_map_elem_t network_ifx_wcm_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&network_ifx_wcm_deinit_obj) },
+ { MP_ROM_QSTR(MP_QSTR_active), MP_ROM_PTR(&network_ifx_wcm_active_obj) },
+ { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&network_ifx_wcm_scan_obj) },
+ { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&network_ifx_wcm_connect_obj) },
+ { MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&network_ifx_wcm_disconnect_obj) },
+ { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&network_ifx_wcm_isconnected_obj) },
+ { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&network_ifx_wcm_status_obj) },
+ { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&network_ifx_wcm_config_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&network_ifx_wcm_ifconfig_obj) },
+
+ // Network WCM constants
+ // Security modes
+ { MP_ROM_QSTR(MP_QSTR_OPEN), MP_ROM_INT(NET_IFX_WCM_SEC_OPEN) },
+ { MP_ROM_QSTR(MP_QSTR_WEP), MP_ROM_INT(NET_IFX_WCM_SEC_WEP) },
+ { MP_ROM_QSTR(MP_QSTR_WPA), MP_ROM_INT(NET_IFX_WCM_SEC_WPA) },
+ { MP_ROM_QSTR(MP_QSTR_WPA2), MP_ROM_INT(NET_IFX_WCM_SEC_WPA2) },
+ { MP_ROM_QSTR(MP_QSTR_WPA3), MP_ROM_INT(NET_IFX_WCM_SEC_WPA3) },
+ { MP_ROM_QSTR(MP_QSTR_WPA2_WPA_PSK), MP_ROM_INT(NET_IFX_WCM_SEC_WPA_WPA2) },
+ { MP_ROM_QSTR(MP_QSTR_SEC_UNKNOWN), MP_ROM_INT(NET_IFX_WCM_SEC_UNKNOWN) },
+};
+static MP_DEFINE_CONST_DICT(network_ifx_wcm_locals_dict, network_ifx_wcm_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ mp_network_ifx_wcm_type,
+ MP_QSTR_IFX_WCM,
+ MP_TYPE_FLAG_NONE,
+ make_new, network_ifx_wcm_make_new,
+ print, network_ifx_wcm_print,
+ locals_dict, &network_ifx_wcm_locals_dict
+ );
+
+#endif // MICROPY_PY_NETWORK_IFX_WCM
diff --git a/ports/psoc-edge/network_ifx_wcm.h b/ports/psoc-edge/network_ifx_wcm.h
new file mode 100644
index 00000000000..25534bb9c5e
--- /dev/null
+++ b/ports/psoc-edge/network_ifx_wcm.h
@@ -0,0 +1,34 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019-2023 Damien P. George
+ * Copyright (c) 2023 Infineon Technologies AG
+ *
+ * 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.
+ */
+#ifndef MICROPY_INCLUDED_EXTMOD_NETWORK_IFX_WCM_H
+#define MICROPY_INCLUDED_EXTMOD_NETWORK_IFX_WCM_H
+
+void network_hw_init(void);
+void network_init(void);
+void network_deinit(void);
+
+#endif // MICROPY_INCLUDED_EXTMOD_NETWORK_IFX_WCM_H
diff --git a/ports/psoc-edge/psoc_edge_qspi_flash.c b/ports/psoc-edge/psoc_edge_qspi_flash.c
new file mode 100644
index 00000000000..ae661fedfb3
--- /dev/null
+++ b/ports/psoc-edge/psoc_edge_qspi_flash.c
@@ -0,0 +1,252 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020-2021 Damien P. George
+ * Copyright (c) 2022-2024 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+// std includes
+#include
+#include
+
+// micropython includes
+#include "py/runtime.h"
+#include "extmod/vfs.h"
+#include "modpsocedge.h"
+#include "py/misc.h"
+
+// MTB includes
+#include "cybsp.h"
+#include "cy_pdl.h"
+#include "mphalport.h"
+#include "cycfg_qspi_memslot.h"
+#include "mtb_serial_memory.h"
+
+#define DEBUG_printf(...) // printf(__VA_ARGS__)
+
+#ifndef MICROPY_HW_FLASH_STORAGE_BYTES
+#define MICROPY_HW_FLASH_STORAGE_BYTES (EXT_FLASH_SIZE)
+#endif
+static_assert(MICROPY_HW_FLASH_STORAGE_BYTES % EXT_FLASH_SECTOR_SIZE == 0, "Flash storage size must be a multiple of sector size");
+
+#ifndef MICROPY_HW_FLASH_STORAGE_BASE
+#define MICROPY_HW_FLASH_STORAGE_BASE (EXT_FLASH_BASE)
+#endif
+
+/* Slot number of the memory to use */
+#define MEM_SLOT_NUM (0U)
+#define MEM_SLOT_DIVIDER (2U)
+#define MEM_SLOT_MULTIPLIER (2U)
+
+/* 100 MHz interface clock frequency */
+#define QSPI_BUS_FREQUENCY_HZ (100000000Ul)
+
+uint8_t qspi_flash_init = 0;
+
+mtb_serial_memory_t serial_memory_obj;
+cy_stc_smif_mem_context_t smif_mem_context;
+cy_stc_smif_mem_info_t smif_mem_info;
+
+typedef struct _psoc_edge_qspi_flash_obj_t {
+ mp_obj_base_t base;
+ uint32_t flash_base;
+ uint32_t flash_size;
+} psoc_edge_qspi_flash_obj_t;
+
+// Static singleton object for default flash access
+static psoc_edge_qspi_flash_obj_t psoc_edge_qspi_flash_obj = {
+ .base = { &psoc_edge_qspi_flash_type },
+ .flash_base = EXT_FLASH_BASE,
+ .flash_size = EXT_FLASH_SIZE,
+};
+
+static mp_obj_t psoc_edge_qspi_flash_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+ /* Set-up serial memory. */
+ cy_rslt_t result = CY_RSLT_SUCCESS;
+
+ if (!qspi_flash_init) {
+ result = mtb_serial_memory_setup(&serial_memory_obj,
+ MTB_SERIAL_MEMORY_CHIP_SELECT_1,
+ CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_config.base,
+ CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_config.clock,
+ &smif_mem_context,
+ &smif_mem_info,
+ &smif0BlockConfig);
+
+ if (result == CY_RSLT_SUCCESS) {
+ qspi_flash_init = true;
+ } else {
+ DEBUG_printf("psoc_edge_qspi_flash_make_new() failed with error code: 0x%08lx\n", result);
+ mp_raise_msg(&mp_type_Exception, MP_ERROR_TEXT("psoc_edge_qspi_flash_make_new() - QSPI flash init failed!\n"));
+ }
+ }
+
+ // Parse arguments
+ enum { ARG_start, ARG_len };
+
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ { MP_QSTR_len, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ if (args[ARG_start].u_int == -1 && args[ARG_len].u_int == -1) {
+ // Default singleton object that accesses entire flash
+ return MP_OBJ_FROM_PTR(&psoc_edge_qspi_flash_obj);
+ }
+
+ // Create new object with custom start/len
+ psoc_edge_qspi_flash_obj_t *self = mp_obj_malloc(psoc_edge_qspi_flash_obj_t, &psoc_edge_qspi_flash_type);
+
+ mp_int_t start = args[ARG_start].u_int;
+
+ if (start == -1) {
+ start = 0;
+ } else if (!(0 <= start && start < MICROPY_HW_FLASH_STORAGE_BYTES && start % EXT_FLASH_SECTOR_SIZE == 0)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid 'start' value"));
+ }
+
+ mp_int_t len = args[ARG_len].u_int;
+
+ if (len == -1) {
+ len = MICROPY_HW_FLASH_STORAGE_BYTES - start;
+ } else if (!(0 < len && start + len <= MICROPY_HW_FLASH_STORAGE_BYTES && len % EXT_FLASH_SECTOR_SIZE == 0)) {
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid 'len' value"));
+ }
+
+ self->flash_base = MICROPY_HW_FLASH_STORAGE_BASE + start;
+ self->flash_size = len;
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+static mp_obj_t psoc_edge_qspi_flash_readblocks(size_t n_args, const mp_obj_t *args) {
+ psoc_edge_qspi_flash_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ uint32_t offset = mp_obj_get_int(args[1]) * EXT_FLASH_BLOCK_SIZE_BYTES;
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[2], &bufinfo, MP_BUFFER_WRITE);
+
+ if (n_args == 4) {
+ offset += mp_obj_get_int(args[3]);
+ }
+ cy_rslt_t result = mtb_serial_memory_read(&serial_memory_obj, self->flash_base + offset, bufinfo.len, bufinfo.buf);
+
+ if (result != CY_RSLT_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("read failed: 0x%08lx"), result);
+ }
+
+ return mp_const_none;
+}
+
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(psoc_edge_qspi_flash_readblocks_obj, 3, 4, psoc_edge_qspi_flash_readblocks);
+
+static mp_obj_t psoc_edge_qspi_flash_writeblocks(size_t n_args, const mp_obj_t *args) {
+ psoc_edge_qspi_flash_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ uint32_t offset = mp_obj_get_int(args[1]) * EXT_FLASH_BLOCK_SIZE_BYTES;
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(args[2], &bufinfo, MP_BUFFER_READ);
+
+ if (n_args == 3) {
+ // Round up to ensure we erase all sectors that will be written to
+ uint32_t numSectors = (bufinfo.len + EXT_FLASH_SECTOR_SIZE - 1) / EXT_FLASH_SECTOR_SIZE;
+
+ for (uint32_t i = 0; i < numSectors; ++i) {
+ cy_rslt_t result = mtb_serial_memory_erase(&serial_memory_obj, self->flash_base + offset + i * EXT_FLASH_SECTOR_SIZE, mtb_serial_memory_get_erase_size(&serial_memory_obj, self->flash_base + offset + i * EXT_FLASH_SECTOR_SIZE));
+ // the mtb_serial_memory_get_erase_size() function call is necessary to keep the erase at sector boundary, else it throws errors.
+
+ if (CY_RSLT_SUCCESS != result) {
+ mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("erase before write failed: 0x%08lx"), result);
+ }
+ }
+ } else {
+ offset += mp_obj_get_int(args[3]);
+ }
+
+ cy_rslt_t result = mtb_serial_memory_write(&serial_memory_obj, self->flash_base + offset, bufinfo.len, bufinfo.buf);
+
+ if (result != CY_RSLT_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("write failed: 0x%08lx"), result);
+ }
+
+ return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(psoc_edge_qspi_flash_writeblocks_obj, 3, 4, psoc_edge_qspi_flash_writeblocks);
+
+static mp_obj_t psoc_edge_qspi_flash_ioctl(mp_obj_t self_in, mp_obj_t cmd_in, mp_obj_t arg_in) {
+ psoc_edge_qspi_flash_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_int_t cmd = mp_obj_get_int(cmd_in);
+
+ switch (cmd) {
+ case MP_BLOCKDEV_IOCTL_INIT:
+ if (!qspi_flash_init) {
+ mtb_serial_memory_setup(&serial_memory_obj,
+ MTB_SERIAL_MEMORY_CHIP_SELECT_1,
+ CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_config.base,
+ CYBSP_SMIF_CORE_0_XSPI_FLASH_hal_config.clock,
+ &smif_mem_context,
+ &smif_mem_info,
+ &smif0BlockConfig);
+ qspi_flash_init = true;
+ }
+ return MP_OBJ_NEW_SMALL_INT(0);
+ case MP_BLOCKDEV_IOCTL_DEINIT:
+ if (qspi_flash_init) {
+ qspi_flash_init = false;
+ }
+ return MP_OBJ_NEW_SMALL_INT(0);
+ case MP_BLOCKDEV_IOCTL_SYNC:
+ return MP_OBJ_NEW_SMALL_INT(0);
+ case MP_BLOCKDEV_IOCTL_BLOCK_COUNT:
+ return MP_OBJ_NEW_SMALL_INT(self->flash_size / EXT_FLASH_SECTOR_SIZE);
+ case MP_BLOCKDEV_IOCTL_BLOCK_SIZE:
+ return MP_OBJ_NEW_SMALL_INT(EXT_FLASH_SECTOR_SIZE);
+ case MP_BLOCKDEV_IOCTL_BLOCK_ERASE: {
+ uint32_t offset = mp_obj_get_int(arg_in) * EXT_FLASH_BLOCK_SIZE_BYTES;
+ cy_rslt_t result = mtb_serial_memory_erase(&serial_memory_obj, self->flash_base + offset, mtb_serial_memory_get_erase_size(&serial_memory_obj, self->flash_base + offset));
+ if (result != CY_RSLT_SUCCESS) {
+ mp_raise_msg_varg(&mp_type_OSError, MP_ERROR_TEXT("erase failed: 0x%08lx"), result);
+ }
+ return MP_OBJ_NEW_SMALL_INT(0);
+ }
+ default:
+ return mp_const_none;
+ }
+}
+static MP_DEFINE_CONST_FUN_OBJ_3(psoc_edge_qspi_flash_ioctl_obj, psoc_edge_qspi_flash_ioctl);
+
+static const mp_rom_map_elem_t psoc_edge_qspi_flash_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_readblocks), MP_ROM_PTR(&psoc_edge_qspi_flash_readblocks_obj) },
+ { MP_ROM_QSTR(MP_QSTR_writeblocks), MP_ROM_PTR(&psoc_edge_qspi_flash_writeblocks_obj) },
+ { MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&psoc_edge_qspi_flash_ioctl_obj) },
+};
+static MP_DEFINE_CONST_DICT(psoc_edge_qspi_flash_locals_dict, psoc_edge_qspi_flash_locals_dict_table);
+
+MP_DEFINE_CONST_OBJ_TYPE(
+ psoc_edge_qspi_flash_type,
+ MP_QSTR_QSPI_Flash,
+ MP_TYPE_FLAG_NONE,
+ make_new, psoc_edge_qspi_flash_make_new,
+ locals_dict, &psoc_edge_qspi_flash_locals_dict
+ );
diff --git a/ports/psoc-edge/qstrdefsport.h b/ports/psoc-edge/qstrdefsport.h
new file mode 100644
index 00000000000..17a09fbb646
--- /dev/null
+++ b/ports/psoc-edge/qstrdefsport.h
@@ -0,0 +1,5 @@
+// qstrs specific to this port
+// *FORMAT-OFF*
+Q(/)
+Q(/flash)
+Q(/lib)
diff --git a/ports/psoc-edge/secboot/Makefile b/ports/psoc-edge/secboot/Makefile
new file mode 100644
index 00000000000..a51cd60182c
--- /dev/null
+++ b/ports/psoc-edge/secboot/Makefile
@@ -0,0 +1,204 @@
+#################################################################################
+# CM33 secure project
+
+BOARD ?= KIT_PSE84_AI
+BOARD_DIR ?= ../boards/$(BOARD)
+BUILD ?= ../build-$(BOARD)/secboot
+
+# Include the core environment definitions; this will set $(TOP).
+include ../../../py/mkenv.mk
+
+CROSS_COMPILE ?= arm-none-eabi-
+
+PSE_LIB_TOP_DIR ?= lib/psoc-edge
+PSE_LIB_DIR ?= $(TOP)/$(PSE_LIB_TOP_DIR)
+BOARD_TOP_DIR = ports/psoc-edge/boards/$(BOARD)
+
+INC += $(addprefix -I$(TOP)/lib/,\
+ CMSIS_6/CMSIS/Core/Include \
+ CMSIS_6/CMSIS/Core/Include/a-profile \
+ CMSIS_6/CMSIS/Core/Include/m-profile \
+ CMSIS_6/CMSIS/Core/Include/r-profile \
+)
+
+DEFINES = \
+ -DCOMPONENT_CM33 \
+ -DCORE_NAME_CM33_0=1 \
+ -DCOMPONENT_MTB_HAL \
+ -DCOMPONENT_MW_ASYNC_TRANSFER \
+ -DCOMPONENT_MW_MTB_IPC \
+ -DCOMPONENT_MW_MTB_SRF \
+ -DCOMPONENT_SECURE_DEVICE \
+ -DCYBSP_MCUBOOT_HEADER_SIZE=0x400 \
+
+INC += $(addprefix -I$(PSE_LIB_DIR)/,\
+ async-transfer/include \
+ \
+ core-lib/include \
+ \
+ mtb-dsl-pse8xxgp/device-utils/syspm/hobto/pdm_pcm/audioss_pdm \
+ mtb-dsl-pse8xxgp/device-utils/syspm/hobto/pdm_pcm/mxpdm \
+ mtb-dsl-pse8xxgp/device-utils/syspm/include \
+ \
+ mtb-dsl-pse8xxgp/hal/include \
+ \
+ mtb-dsl-pse8xxgp/nnkernel/COMPONENT_CM33/include \
+ \
+ mtb-dsl-pse8xxgp/pdl/devices/include \
+ mtb-dsl-pse8xxgp/pdl/devices/include/ip \
+ mtb-dsl-pse8xxgp/pdl/drivers/include \
+ mtb-dsl-pse8xxgp/pdl/drivers/third_party/ethernet/include \
+ \
+ mtb-ipc/include \
+ \
+ mtb-srf/include \
+ \
+ se-rt-services-utils \
+ \
+ TARGET_$(BOARD) \
+ TARGET_$(BOARD)/bluetooth \
+ TARGET_$(BOARD)/COMPONENT_CM33/COMPONENT_SECURE_DEVICE \
+ )
+
+INC += \
+ -I$(BOARD_DIR) \
+ -I$(BOARD_DIR)/bsp-cfg \
+
+MACHINE_FLAGS = \
+ -mcpu=cortex-m33 \
+ --specs=nano.specs \
+ --specs=nosys.specs \
+ -mfloat-abi=hard \
+ -mfpu=fpv5-sp-d16 \
+ -mthumb
+
+CFLAGS += -c $(MACHINE_FLAGS) \
+ -ffat-lto-objects \
+ -g \
+ -Wall \
+ -pipe \
+ -mcmse \
+ $(INC) \
+ $(DEFINES) \
+
+ifeq ($(DEBUG), 1)
+CFLAGS += -Og
+else
+CFLAGS += -Os -DNDEBUG
+CFLAGS += -fdata-sections -ffunction-sections
+endif
+
+# If the nsc_veneer.o is not present, it is
+# generated without reference.
+NSC_VENEER = nsc_veneer.o
+NSC_VENEER_TEMP = $(BUILD)/$(NSC_VENEER).tmp
+ifneq ($(wildcard $(NSC_VENEER)),)
+IN_IMPLIB_FLAG = -Wl,--in-implib -Wl,$(NSC_VENEER)
+endif
+
+LDFLAGS = $(MACHINE_FLAGS) \
+ -Wl,--gc-sections \
+ -Wl,--cmse-implib $(IN_IMPLIB_FLAG) -Wl,--out-implib -Wl,$(NSC_VENEER_TEMP) \
+ -Wl,--print-memory-usage \
+ -Wl,--no-warn-rwx-segments \
+ -Xlinker -L $(PSE_LIB_DIR)/TARGET_$(BOARD)/COMPONENT_CM33/TOOLCHAIN_GCC_ARM \
+ -Xlinker -L $(BOARD_DIR)/bsp-cfg \
+ -T$(PSE_LIB_DIR)/TARGET_$(BOARD)/COMPONENT_CM33/TOOLCHAIN_GCC_ARM/pse84_s_cm33.ld \
+ -Wl,-Map,$(BUILD)/secboot.map
+
+SRC_C = \
+ main.c \
+
+PSE_BSP_CFG_C += $(addprefix $(BOARD_TOP_DIR)/bsp-cfg/,\
+ cycfg.c \
+ cycfg_clocks.c \
+ cycfg_peripheral_clocks.c \
+ cycfg_peripherals.c \
+ cycfg_pins.c \
+ cycfg_protection.c \
+ cycfg_routing.c \
+ cycfg_system.c \
+ )
+
+PSE_LIB_SRC_C += $(addprefix $(PSE_LIB_TOP_DIR)/, \
+ mtb-dsl-pse8xxgp/pdl/devices/source/cy_device.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_gpio.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_mpc.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_pdl_srf.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_ppc.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_smif.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_sysclk_v2.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syslib.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syspm_pdcm.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syspm_ppu.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_syspm_v4.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_trigmux.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/cy_wdt.c \
+ mtb-dsl-pse8xxgp/pdl/drivers/source/ppu_v1.c \
+ \
+ mtb-dsl-pse8xxgp/support/source/mtb_stdlib_stubs.c \
+ \
+ mtb-srf/source/mtb_srf.c \
+ \
+ se-rt-services-utils/ifx_se_crc32.c \
+ se-rt-services-utils/ifx_se_fih.c \
+ se-rt-services-utils/ifx_se_platform.c \
+ se-rt-services-utils/ifx_se_syscall.c \
+ se-rt-services-utils/ifx_se_syscall_builtin.c \
+ \
+ TARGET_$(BOARD)/cybsp.c \
+ TARGET_$(BOARD)/system_edge.c \
+ TARGET_$(BOARD)/COMPONENT_CM33/COMPONENT_SECURE_DEVICE/s_start_pse84.c \
+ TARGET_$(BOARD)/COMPONENT_CM33/COMPONENT_SECURE_DEVICE/s_system_init.c \
+ TARGET_$(BOARD)/COMPONENT_CM33/COMPONENT_SECURE_DEVICE/s_system_pse84.c \
+ )
+
+PSE_SRC_ASM = $(PSE_LIB_TOP_DIR)/mtb-dsl-pse8xxgp/pdl/drivers/source/TOOLCHAIN_GCC_ARM/cy_syslib_ext.S \
+
+OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(PSE_BSP_CFG_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(PSE_LIB_SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(PSE_SRC_ASM:.S=.o))
+
+# Main targets
+
+all: $(BUILD)/secboot.hex cmse_post_build_update
+
+# Generate elf file
+$(BUILD)/secboot.elf: $(OBJ)
+ @echo "Linking... $@"
+ @$(CC) $(OBJ) $(LDFLAGS) -o $@
+ @$(SIZE) $@
+
+# Compile C files
+vpath %.c . $(TOP) | $(BUILD)
+$(BUILD)/%.o: %.c | $(BUILD)
+ @mkdir -p $(dir $@)
+ @echo "Compiling $<"
+ @$(CC) $(CFLAGS) -c -MD -MF $(@:.o=.d) -o $@ $<
+
+# Compile S files
+vpath %.S . $(TOP) | $(BUILD)
+$(BUILD)/%.o: %.S | $(BUILD)
+ @mkdir -p $(dir $@)
+ @echo "Assembling $<"
+ @$(CC) $(CFLAGS) -c -MD -MF $(@:.o=.d) -o $@ $<
+
+# Generate hex file
+$(BUILD)/secboot.hex: $(BUILD)/secboot.elf
+ @$(OBJCOPY) -O ihex $< $@
+
+# Create build directory
+$(BUILD):
+ @mkdir -p $(BUILD)
+
+# Replace the original veneer with the generated temp veneer after build.
+cmse_post_build_update:
+ @$(Q)[ ! -f $(NSC_VENEER_TEMP) ] || cmp -s $(NSC_VENEER_TEMP) $(NSC_VENEER) || cp -f $(NSC_VENEER_TEMP) $(NSC_VENEER);\
+ rm -f $(NSC_VENEER_TEMP)
+
+# Clean
+clean:
+ @rm -rf $(BUILD)
+
+.PHONY: all clean cmse_post_build_update
diff --git a/ports/psoc-edge/secboot/main.c b/ports/psoc-edge/secboot/main.c
new file mode 100644
index 00000000000..1b735055530
--- /dev/null
+++ b/ports/psoc-edge/secboot/main.c
@@ -0,0 +1,104 @@
+/******************************************************************************
+* File Name: main.c
+*
+* Description: This is the source code for CM33 Secure Project.
+*
+* Related Document: See README.md
+*
+*
+*******************************************************************************
+* Copyright 2023-2025, Cypress Semiconductor Corporation (an Infineon company) or
+* an affiliate of Cypress Semiconductor Corporation. All rights reserved.
+*
+* This software, including source code, documentation and related
+* materials ("Software") is owned by Cypress Semiconductor Corporation
+* or one of its affiliates ("Cypress") and is protected by and subject to
+* worldwide patent protection (United States and foreign),
+* United States copyright laws and international treaty provisions.
+* Therefore, you may use this Software only as provided in the license
+* agreement accompanying the software package from which you
+* obtained this Software ("EULA").
+* If no EULA applies, Cypress hereby grants you a personal, non-exclusive,
+* non-transferable license to copy, modify, and compile the Software
+* source code solely for use in connection with Cypress's
+* integrated circuit products. Any reproduction, modification, translation,
+* compilation, or representation of this Software except as specified
+* above is prohibited without the express written permission of Cypress.
+*
+* Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress
+* reserves the right to make changes to the Software without notice. Cypress
+* does not assume any liability arising out of the application or use of the
+* Software or any product or circuit described in the Software. Cypress does
+* not authorize its products for use in any products where a malfunction or
+* failure of the Cypress product may reasonably be expected to result in
+* significant property damage, injury or death ("High Risk Product"). By
+* including Cypress's product in a High Risk Product, the manufacturer
+* of such system or application assumes all risk of such use and in doing
+* so agrees to indemnify Cypress against all liability.
+*******************************************************************************/
+
+/*******************************************************************************
+* Header Files
+*******************************************************************************/
+
+#include "cy_pdl.h"
+#include "cybsp.h"
+
+/*****************************************************************************
+* Macros
+******************************************************************************/
+#define CM33_NS_APP_BOOT_ADDR (CYMEM_CM33_0_m33_nvm_START + CYBSP_MCUBOOT_HEADER_SIZE)
+/*****************************************************************************
+* Function Name: main
+******************************************************************************
+* This is the main function for Cortex M33 CPU secure application
+* NOTE: CM33 secure project assumes that certain memory and peripheral regions
+* will be accessed from non-secure environment by the CM33 NS /CM55 code,
+* For such regions MPC and PPC configurations are applied by cybsp_init to make
+* it non-secure. Any access to these regions from the secure side is recommended
+* to be done before the MPC/PPC configuration is applied.Once a memory or
+* peripheral region is marked as non secure it cannot be accessed from the secure
+* side using secure aliased address but may be accessed using non secure aliased
+* address
+*****************************************************************************/
+int main(void) {
+ uint32_t ns_stack;
+ cy_cmse_funcptr NonSecure_ResetHandler;
+ cy_rslt_t result;
+
+ /* Set up internal routing, pins, and clock-to-peripheral connections */
+ result = cybsp_init();
+
+ /* Board initialization failed. Stop program execution */
+ if (CY_RSLT_SUCCESS != result) {
+ /* Disable all interrupts. */
+ __disable_irq();
+
+ CY_ASSERT(0);
+
+ /* Infinite loop */
+ while (true) {
+ ;
+ }
+
+ }
+
+ /* Enable global interrupts */
+ __enable_irq();
+
+ ns_stack = (uint32_t)(*((uint32_t *)CM33_NS_APP_BOOT_ADDR));
+ __TZ_set_MSP_NS(ns_stack);
+
+ NonSecure_ResetHandler = (cy_cmse_funcptr)(*((uint32_t *)(CM33_NS_APP_BOOT_ADDR + 4)));
+
+ /* Start non-secure application */
+ NonSecure_ResetHandler();
+
+ for (;;)
+ {
+ }
+}
+
+/* [] END OF FILE */
diff --git a/ports/psoc-edge/secboot/nsc_veneer.o b/ports/psoc-edge/secboot/nsc_veneer.o
new file mode 100644
index 00000000000..44c10e98149
Binary files /dev/null and b/ports/psoc-edge/secboot/nsc_veneer.o differ
diff --git a/ports/psoc-edge/sys_int.c b/ports/psoc-edge/sys_int.c
new file mode 100644
index 00000000000..732fe434d2c
--- /dev/null
+++ b/ports/psoc-edge/sys_int.c
@@ -0,0 +1,65 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "sys_int.h"
+#include "py/runtime.h"
+
+#define sys_int_assert_raise_val(msg, ret) if (ret != CY_SYSINT_SUCCESS) { \
+ mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT(msg), ret); \
+}
+
+void sys_int_init(sys_int_cfg_t *int_cfg) {
+ NVIC_ClearPendingIRQ(int_cfg->irq_num);
+ NVIC_DisableIRQ(int_cfg->irq_num);
+
+ cy_stc_sysint_t intr_cfg = {
+ int_cfg->irq_num,
+ int_cfg->priority
+ };
+
+ cy_en_sysint_status_t rslt = Cy_SysInt_Init(&intr_cfg, int_cfg->handler);
+ sys_int_assert_raise_val("system interrupt init failed (PSE PDL error code: %lx)", rslt);
+
+ NVIC_EnableIRQ(int_cfg->irq_num);
+}
+
+void sys_int_deinit(sys_int_cfg_t *int_cfg) {
+ NVIC_ClearPendingIRQ(int_cfg->irq_num);
+ NVIC_DisableIRQ(int_cfg->irq_num);
+ int_cfg->priority = SYS_INT_IRQ_LOWEST_PRIORITY;
+}
+
+void sys_int_enable(sys_int_cfg_t *int_cfg) {
+ NVIC_EnableIRQ(int_cfg->irq_num);
+}
+
+void sys_int_disable(sys_int_cfg_t *int_cfg) {
+ NVIC_DisableIRQ(int_cfg->irq_num);
+}
+
+void sys_int_clear(sys_int_cfg_t *int_cfg) {
+ NVIC_ClearPendingIRQ(int_cfg->irq_num);
+}
diff --git a/ports/psoc-edge/sys_int.h b/ports/psoc-edge/sys_int.h
new file mode 100644
index 00000000000..1dad6e6acff
--- /dev/null
+++ b/ports/psoc-edge/sys_int.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_SYS_INT_H
+#define MICROPY_INCLUDED_PSOC_EDGE_SYS_INT_H
+
+#include "cy_sysint.h"
+#include "cy_device_headers.h"
+
+/**
+ * Define the lowest interrupt priority.
+ * The cy_device_headers_ns.h file might
+ * define the interrupt priority levels.
+ */
+#if defined(__NVIC_PRIO_BITS)
+ #define SYS_INT_IRQ_LOWEST_PRIORITY ((1 << __NVIC_PRIO_BITS) - 1)
+#else
+ #define SYS_INT_IRQ_LOWEST_PRIORITY 7
+#endif
+
+typedef struct _sys_int_cfg_t {
+ IRQn_Type irq_num;
+ uint32_t priority;
+ cy_israddress handler;
+} sys_int_cfg_t;
+
+void sys_int_init(sys_int_cfg_t *int_cfg);
+void sys_int_deinit(sys_int_cfg_t *int_cfg);
+void sys_int_enable(sys_int_cfg_t *int_cfg);
+void sys_int_disable(sys_int_cfg_t *int_cfg);
+void sys_int_clear(sys_int_cfg_t *int_cfg);
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_SYS_INT_H
diff --git a/ports/psoc-edge/systick.c b/ports/psoc-edge/systick.c
new file mode 100644
index 00000000000..3a6a8ba0342
--- /dev/null
+++ b/ports/psoc-edge/systick.c
@@ -0,0 +1,174 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include
+#include
+
+#include "cybsp.h"
+#include "cy_systick.h"
+
+#include "mphalport.h"
+
+#include "py/runtime.h"
+
+volatile uint64_t psoc_edge_systick_ms_count;
+uint32_t psoc_edge_systick_cpu_hz;
+
+// Use the SysTick pending-interrupt state as rollover evidence. This matches our
+// callback-based ms counter model ("ISR increment still outstanding") and avoids
+// Cy_SysTick_GetCountFlag()'s read-to-clear side effect.
+#define MP_HAL_SYSTICK_WRAP_PENDING() (((SCB->ICSR) & SCB_ICSR_PENDSTSET_Msk) != 0u)
+
+typedef struct {
+ uint64_t ms_count;
+ uint32_t systick_reload;
+ uint32_t systick_val;
+ uint32_t cpu_hz;
+} mp_hal_systick_snapshot_t;
+
+#if !MICROPY_PY_FREERTOS
+static void psoc_edge_systick_callback(void) {
+ psoc_edge_systick_ms_count += 1;
+}
+#endif
+
+void mp_hal_ticks_init(void) {
+ psoc_edge_systick_cpu_hz = SystemCoreClock;
+ psoc_edge_systick_ms_count = 0;
+ #if MICROPY_PY_FREERTOS
+ // SysTick is already configured by FreeRTOS vPortSetupTimerInterrupt() at
+ // 1 ms per tick (configTICK_RATE_HZ == 1000). psoc_edge_systick_ms_count is
+ // driven from xTaskGetTickCount() inside mp_hal_systick_snapshot() so no
+ // callback setup is needed here.
+ #else
+ if (psoc_edge_systick_cpu_hz < 1000) {
+ // Invalid system clock for a ms ticker.
+ // As micropython is not yet initialized, therefore
+ // mp_raise_msg() is not usable here.
+ CY_ASSERT(0);
+ }
+ // Configure SysTick for 1ms period and count overflows in software.
+ uint32_t systick_interval = psoc_edge_systick_cpu_hz / 1000;
+ Cy_SysTick_Init(CY_SYSTICK_CLOCK_SOURCE_CLK_CPU, systick_interval - 1);
+ Cy_SysTick_SetCallback(0, psoc_edge_systick_callback);
+ #endif
+}
+
+static mp_hal_systick_snapshot_t mp_hal_systick_snapshot(void) {
+ mp_hal_systick_snapshot_t snap;
+
+ mp_uint_t irq_state = MICROPY_BEGIN_ATOMIC_SECTION();
+ #if MICROPY_PY_FREERTOS
+ // Drive ms_count from FreeRTOS tick counter (1 tick == 1 ms, configTICK_RATE_HZ == 1000).
+ // Keep psoc_edge_systick_ms_count in sync so any external reader stays consistent.
+ snap.ms_count = (uint64_t)xTaskGetTickCount();
+ psoc_edge_systick_ms_count = snap.ms_count;
+ #else
+ snap.ms_count = psoc_edge_systick_ms_count;
+ #endif
+ snap.systick_reload = Cy_SysTick_GetReload();
+ snap.systick_val = Cy_SysTick_GetValue();
+ // SysTick may have wrapped but its ISR not run yet; account for that pending rollover
+ // so software time does not momentarily go backwards across the wrap boundary.
+ if (MP_HAL_SYSTICK_WRAP_PENDING()) {
+ snap.ms_count += 1;
+ }
+ snap.cpu_hz = psoc_edge_systick_cpu_hz;
+ MICROPY_END_ATOMIC_SECTION(irq_state);
+
+ if (snap.cpu_hz == 0) {
+ mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("invalid systick CPU clock."));
+ }
+
+ return snap;
+}
+
+uint64_t mp_hal_systick_ticks_us64(void) {
+ mp_hal_systick_snapshot_t snap = mp_hal_systick_snapshot();
+
+ uint32_t elapsed_cycles = snap.systick_reload - snap.systick_val;
+ return snap.ms_count * 1000ULL + ((uint64_t)elapsed_cycles * 1000000ULL) / snap.cpu_hz;
+}
+
+mp_uint_t mp_hal_ticks_ms(void) {
+ return mp_hal_systick_ticks_us64() / 1000ULL;
+}
+
+mp_uint_t mp_hal_ticks_us(void) {
+ return mp_hal_systick_ticks_us64();
+}
+
+mp_uint_t mp_hal_ticks_cpu(void) {
+ mp_hal_systick_snapshot_t snap = mp_hal_systick_snapshot();
+ return snap.ms_count * snap.cpu_hz + (snap.systick_reload - snap.systick_val);
+}
+
+void mp_hal_delay_ms(mp_uint_t ms) {
+ mp_uint_t start = mp_hal_ticks_ms();
+ while (mp_hal_ticks_ms() - start < ms) {
+ mp_event_handle_nowait();
+ }
+}
+
+void mp_hal_delay_us(mp_uint_t us) {
+ mp_uint_t start = mp_hal_ticks_us();
+ while (mp_hal_ticks_us() - start < us) {
+ mp_event_handle_nowait();
+ }
+}
+
+extern uint64_t mp_hal_time_get_epoch_seconds(void);
+extern bool machine_rtc_read_and_clear_time_updated(void);
+
+uint64_t mp_hal_time_ns(void) {
+ static uint64_t time_us_offset_from_epoch = 0;
+ // Resync whenever RTC time was updated (set/deinit/init path marks this).
+ bool need_resync = machine_rtc_read_and_clear_time_updated();
+
+ while (need_resync) {
+ // Wait until RTC second changes so we can anchor the monotonic timer
+ // to a known wall-clock second boundary.
+ uint64_t prev_seconds = mp_hal_time_get_epoch_seconds();
+ uint64_t edge_ticks_us;
+ uint64_t edge_seconds;
+
+ do {
+ edge_seconds = mp_hal_time_get_epoch_seconds();
+ } while (edge_seconds == prev_seconds);
+
+ // Capture the monotonic timestamp immediately after observing the RTC
+ // second rollover so the fixed offset stays aligned to wall-clock time.
+ // `edge_seconds` is the first observed second after the rollover.
+ edge_ticks_us = mp_hal_systick_ticks_us64();
+ time_us_offset_from_epoch = edge_seconds * 1000000ULL - edge_ticks_us;
+
+ // If RTC was updated during calibration, repeat once more to align with
+ // the latest RTC second boundary.
+ need_resync = machine_rtc_read_and_clear_time_updated();
+ }
+
+ return (time_us_offset_from_epoch + mp_hal_systick_ticks_us64()) * 1000ULL;
+}
diff --git a/ports/psoc-edge/tcpwm.c b/ports/psoc-edge/tcpwm.c
new file mode 100644
index 00000000000..e62d3f23400
--- /dev/null
+++ b/ports/psoc-edge/tcpwm.c
@@ -0,0 +1,91 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#include "py/runtime.h"
+#include "tcpwm.h"
+
+static mp_obj_t machine_tcpwm0_counter[MICROPY_PY_MACHINE_TCPWM0_NUM_COUNTERS] = { MP_OBJ_NULL };
+
+// Helper function to validate if a counter is supported
+static bool machine_tcpwm_counter_is_valid(uint32_t counter_num) {
+ return (counter_num <= 7) || (counter_num >= 256 && counter_num <= 279);
+}
+
+// Helper function to map counter number to array index
+// Counters 0-7 map to indices 0-7
+// Counters 256-279 map to indices 8-31
+static uint32_t machine_tcpwm_counter_to_index(uint32_t counter_num) {
+ if (counter_num <= 7) {
+ return counter_num;
+ } else {
+ return counter_num - 256 + 8;
+ }
+}
+
+bool machine_tcpwm_counter_try_alloc(uint32_t counter_num, mp_obj_t owner) {
+ if (!machine_tcpwm_counter_is_valid(counter_num)) {
+ return false;
+ }
+ uint32_t idx = machine_tcpwm_counter_to_index(counter_num);
+ if (machine_tcpwm0_counter[idx] != MP_OBJ_NULL) {
+ return false;
+ }
+ machine_tcpwm0_counter[idx] = owner;
+ return true;
+}
+
+void machine_tcpwm_counter_alloc(uint32_t counter_num, mp_obj_t owner) {
+ if (!machine_tcpwm_counter_is_valid(counter_num)) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("TCPWM0 counter %lu is not supported"), counter_num);
+ }
+ if (!machine_tcpwm_counter_try_alloc(counter_num, owner)) {
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("TCPWM0 counter %lu is already in use by another Timer or PWM instance"), counter_num);
+ }
+}
+
+void machine_tcpwm_counter_free(uint32_t counter_num, mp_obj_t owner) {
+ if (!machine_tcpwm_counter_is_valid(counter_num)) {
+ return;
+ }
+ uint32_t idx = machine_tcpwm_counter_to_index(counter_num);
+ if (machine_tcpwm0_counter[idx] == owner) {
+ machine_tcpwm0_counter[idx] = MP_OBJ_NULL;
+ }
+}
+
+en_clk_dst_t machine_tcpwm_counter_pclk(uint32_t counter_num) {
+#define TCPWM_PCLK_CASE(id, counter, irq, pclk_dst) case counter: \
+ return pclk_dst;
+ switch (counter_num) {
+ MICROPY_PY_MACHINE_TCPWM_HW_MAP(TCPWM_PCLK_CASE)
+ default:
+ mp_raise_msg_varg(&mp_type_ValueError,
+ MP_ERROR_TEXT("TCPWM0 counter %lu is not supported"), counter_num);
+ }
+#undef TCPWM_PCLK_CASE
+}
diff --git a/ports/psoc-edge/tcpwm.h b/ports/psoc-edge/tcpwm.h
new file mode 100644
index 00000000000..91607364065
--- /dev/null
+++ b/ports/psoc-edge/tcpwm.h
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026 Infineon Technologies AG
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_PSOC_EDGE_MACHINE_TCPWM_H
+#define MICROPY_INCLUDED_PSOC_EDGE_MACHINE_TCPWM_H
+
+#include "py/obj.h"
+#include "cy_sysclk.h"
+#include
+#include "genhdr/pins_af.h"
+
+void machine_tcpwm_counter_alloc(uint32_t counter_num, mp_obj_t owner);
+bool machine_tcpwm_counter_try_alloc(uint32_t counter_num, mp_obj_t owner);
+void machine_tcpwm_counter_free(uint32_t counter_num, mp_obj_t owner);
+en_clk_dst_t machine_tcpwm_counter_pclk(uint32_t counter_num);
+
+#endif // MICROPY_INCLUDED_PSOC_EDGE_MACHINE_TCPWM_H
diff --git a/ports/psoc-edge/tools/mp-ifx-flash.py b/ports/psoc-edge/tools/mp-ifx-flash.py
new file mode 100644
index 00000000000..2ffa2cdac7b
--- /dev/null
+++ b/ports/psoc-edge/tools/mp-ifx-flash.py
@@ -0,0 +1,378 @@
+import argparse, os, sys, shlex, shutil, subprocess, requests, tempfile, zipfile, tarfile
+
+boards = [
+ {"name": "KIT_PSE84_AI", "ocd_cfg_file": "pse84xgxs2.cfg"},
+]
+
+opsys = ""
+version = "0.1.0"
+
+
+# Decorator to flush every print
+def flush_print(func):
+ printer = func
+
+ def wrapped(*args):
+ printer(*args, flush=True)
+
+ return wrapped
+
+
+print_f = flush_print(print)
+
+
+def colour_str_success(msg):
+ green_str_start = "\x1b[1;32;40m"
+ str_color_end = "\x1b[0m"
+ return green_str_start + msg + str_color_end
+
+
+def colour_str_error(msg):
+ red_str_start = "\x1b[1;31;40m"
+ str_color_end = "\x1b[0m"
+ return red_str_start + msg + str_color_end
+
+
+def colour_str_highlight(msg):
+ purple_str_start = "\x1b[1;35;40m"
+ str_color_end = "\x1b[0m"
+ return purple_str_start + msg + str_color_end
+
+
+def colour_str_warn(msg):
+ yellow_str_start = "\x1b[1;33;40m"
+ str_color_end = "\x1b[0m"
+ return yellow_str_start + msg + str_color_end
+
+
+def set_environment():
+ global opsys
+ if sys.platform == "linux" or sys.platform == "linux2":
+ opsys = "linux"
+ elif sys.platform == "win32" or sys.platform == "cygwin":
+ opsys = "win"
+ os.system("color") # Enable colouring in cmd and powershell
+ elif sys.platform == "darwin":
+ opsys = "mac"
+
+
+#######################################################################
+# OpenOCD download, install, flash and cleanup functions
+
+
+def openocd_download_install():
+ if opsys == "linux":
+ file_os_suffix = "linux"
+ file_extension = ".tar.gz"
+ openocd_exe = "openocd"
+ elif opsys == "win":
+ file_os_suffix = "windows"
+ file_extension = ".zip"
+ openocd_exe = "openocd.exe"
+ elif opsys == "mac":
+ file_os_suffix = "macos"
+ file_extension = ".zip"
+ openocd_exe = "openocd"
+
+ openocd_compressed = "openocd" + file_extension
+
+ def is_openocd_already_downloaded():
+ if os.path.exists(os.path.join("openocd", "bin", openocd_exe)):
+ # Add openocd to path
+ os.environ["PATH"] = os.path.join("openocd", "bin") + os.pathsep + os.environ["PATH"]
+ valid_openocd_version = is_openocd_already_in_sys_path()
+ if not valid_openocd_version:
+ clean_openocd()
+
+ return valid_openocd_version
+
+ return False
+
+ def is_openocd_already_in_sys_path():
+ try:
+ ocd_proc = subprocess.Popen(
+ [openocd_exe, "--version"], stderr=subprocess.PIPE, stdout=subprocess.PIPE
+ )
+ out, err = ocd_proc.communicate(timeout=10)
+
+ if err:
+ return False
+ out_str = out.decode()
+ supported_versions = [
+ "0.12.0+dev-5.8.0.3960",
+ "0.12.0+dev-5.11.0.4042",
+ "0.12.0+dev-5.12.0.4170",
+ ]
+ for ver in supported_versions:
+ if ver in out_str:
+ print_f(f"openocd found in system path : {shutil.which('openocd')}")
+ return True
+ except:
+ return False
+
+ return False
+
+ def get_openocd_file_url_name():
+ filename_base = "openocd-5.11.0.4042-"
+ url_base = "https://github.com/Infineon/openocd/releases/download/release-v5.11.0/"
+
+ file_name = filename_base + file_os_suffix + file_extension
+ file_url = url_base + file_name
+
+ return file_url, file_name
+
+ def clean_openocd(file_name):
+ if os.path.exists(file_name):
+ os.remove(file_name)
+
+ def download_openocd(file_url, file_name):
+ res = requests.get(file_url)
+ open(file_name, "wb").write(res.content)
+ os.replace(file_name, openocd_compressed)
+
+ def extract_openocd():
+ if opsys == "linux":
+ compress_file = tarfile.open(openocd_compressed)
+ compress_file.extractall(".")
+ compress_file.close()
+ elif opsys == "win" or opsys == "mac":
+ compress_file = zipfile.ZipFile(openocd_compressed)
+ compress_file.extractall(".")
+ compress_file.close()
+
+ def openocd_setup():
+ # Add openocd to path
+ os.environ["PATH"] = os.path.join("openocd", "bin") + os.pathsep + os.environ["PATH"]
+
+ if opsys == "linux":
+ # Install udev rules
+ sh_args = ["sh", "openocd/udev_rules/install_rules.sh"]
+ try:
+ sh_proc = subprocess.Popen(sh_args)
+ sh_proc.wait()
+ except:
+ sys.exit(colour_str_error("bash error"))
+
+ if opsys == "mac":
+ os.chmod(os.path.join("openocd", "bin", "openocd"), 0o755)
+
+ if not is_openocd_already_in_sys_path():
+ if not is_openocd_already_downloaded():
+ print_f("Downloading openocd...")
+ file_url, file_name = get_openocd_file_url_name()
+ clean_openocd(file_name)
+ download_openocd(file_url, file_name)
+ print_f("Extracting openocd...")
+ extract_openocd()
+ else:
+ print_f("openocd already available. Download skipped")
+
+ openocd_setup()
+
+
+def openocd_program(board, hex_file, cfg_dir, flm_file, serial_adapter_sn=None):
+ # Find tool path cross-platform
+ openocd = shutil.which("openocd")
+ if not openocd:
+ sys.exit(colour_str_error("error: openocd not found in PATH"))
+
+ # Convert to forward slashes for cross-platform compatibility
+ openocd = openocd.replace("\\", "/")
+
+ # Get the root openocd path.
+ # It is two level up from the openocd executable
+ openocd_root_dir = os.path.dirname(os.path.dirname(openocd))
+
+ for brd in boards:
+ if board == brd["name"]:
+ ocd_cfg_file = brd["ocd_cfg_file"]
+
+ serial_adapter_opt = ""
+ if serial_adapter_sn is not None:
+ serial_adapter_opt = "adapter serial " + str(serial_adapter_sn)
+
+ openocd_cmd = (
+ openocd
+ + " -s "
+ + str(openocd_root_dir)
+ + "/scripts"
+ + " -s "
+ + str(cfg_dir)
+ + ' -c "set QSPI_FLASHLOADER '
+ + str(flm_file)
+ + '"'
+ + ' -c "source [find interface/kitprog3.cfg]; '
+ + str(serial_adapter_opt)
+ + ";"
+ + " transport select swd;"
+ + " source [find target/infineon/"
+ + str(ocd_cfg_file)
+ + "];"
+ + " init; reset init; adapter speed 12000;"
+ + " flash write_image erase "
+ + str(hex_file)
+ + ";"
+ + " verify_image "
+ + str(hex_file)
+ + ";"
+ + ' reset run; shutdown;"'
+ )
+
+ openocd_args = shlex.split(openocd_cmd)
+
+ ocd_proc = subprocess.Popen(openocd_args, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+ try:
+ out, err = ocd_proc.communicate(timeout=30)
+ except:
+ ocd_proc.kill()
+ sys.exit(colour_str_error("openocd error."))
+ if err:
+ sys.exit(colour_str_error(err.decode() + "Are you sure the board is connected?"))
+
+
+def openocd_remove():
+ if opsys == "linux":
+ file_extension = ".tar.gz"
+ elif opsys == "win" or opsys == "mac":
+ file_extension = ".zip"
+
+ openocd_compressed = "openocd" + file_extension
+ if os.path.exists(openocd_compressed):
+ os.remove(openocd_compressed)
+
+ if os.path.exists("openocd"):
+ shutil.rmtree("openocd")
+
+
+####################################################################################################
+
+
+def validate_board_name(board_name):
+ board_supported = False
+ for brd in boards:
+ if board_name == brd["name"]:
+ board_supported = True
+ break
+
+ if not board_supported:
+ sys.exit(colour_str_error("error: board is not supported"))
+
+
+def flash_from_files(board, hex_file, cfg_file, flm_file, serial_adapter_sn):
+ cfg_dir = os.path.dirname(cfg_file)
+ print(f"Flashing board '{board}' with hex file '{os.path.basename(hex_file)}'...")
+ openocd_program(board, hex_file, cfg_dir, flm_file, serial_adapter_sn)
+ print(colour_str_success("Device setup completed :)"))
+
+
+def flash_from_package(board, zip_package, serial_adapter_sn):
+ def get_files_from_package(zip_package):
+ hex_file = None
+ cfg_file = None
+ flm_file = None
+
+ if not os.path.exists(zip_package):
+ sys.exit(colour_str_error("error: zip package not found"))
+
+ tmpdirname = tempfile.mkdtemp()
+ with zipfile.ZipFile(zip_package, "r") as zip_ref:
+ zip_ref.extractall(tmpdirname)
+ for root, dirs, files in os.walk(tmpdirname):
+ for file in files:
+ if file.endswith(".hex"):
+ hex_file = os.path.join(root, file)
+ elif file.endswith(".cfg"):
+ cfg_file = os.path.join(root, file)
+ elif file.endswith(".FLM"):
+ flm_file = os.path.join(root, file)
+
+ # If any of the files is missing, raise an error
+ if not hex_file or not cfg_file or not flm_file:
+ shutil.rmtree(tmpdirname)
+ sys.exit(colour_str_error("error: zip package must contain .hex, .cfg and .FLM files"))
+
+ return hex_file, cfg_file, flm_file, tmpdirname
+
+ hex_file, cfg_file, flm_file, tmpdirname = get_files_from_package(zip_package)
+ try:
+ flash_from_files(board, hex_file, cfg_file, flm_file, serial_adapter_sn)
+ finally:
+ shutil.rmtree(tmpdirname)
+
+
+def flash_command_args(args):
+ # TODO: if no command (None) implement interactive mode to gather the values.
+ validate_board_name(args.board)
+
+ if args.command == "from-package":
+ flash_from_package(args.board, args.zip_package, args.serial_num)
+
+
+def parser():
+ class ver_action(argparse.Action):
+ def __init__(self, option_strings, dest, **kwargs):
+ return super().__init__(
+ option_strings, dest, nargs=0, default=argparse.SUPPRESS, **kwargs
+ )
+
+ def __call__(self, parser, namespace, values, option_string, **kwargs):
+ print_f("mp-ifx-flash version: " + version)
+ parser.exit()
+
+ p = argparse.ArgumentParser(
+ formatter_class=argparse.RawTextHelpFormatter,
+ description="MicroPython Infineon Flash Utility",
+ )
+ p.add_argument("-v", "--version", action=ver_action, help="mp-ifx-flash version")
+
+ subparsers = p.add_subparsers(dest="command")
+
+ # Shared parent parser for common arguments (board, serial-num)
+ common = argparse.ArgumentParser(add_help=False)
+ common.add_argument("-b", "--board", required=True, type=str, help="Infineon board name")
+ common.add_argument(
+ "-n",
+ "--serial-num",
+ default=None,
+ type=str,
+ help="Serial number of the board serial adapter",
+ )
+
+ # Subcommand: from-package
+ sp_zip = subparsers.add_parser(
+ "from-package",
+ parents=[common],
+ formatter_class=argparse.RawTextHelpFormatter,
+ help="Flash from a compressed package",
+ description="Flash from a compressed package containing .hex, .cfg and .FLM files.",
+ )
+ sp_zip.add_argument(
+ "-z",
+ "--zip-package",
+ required=True,
+ type=str,
+ help="Firmware zip package containing .hex, .cfg and .FLM files",
+ )
+
+ # TODO: Subcommand: from-files (pass directly the .hex, .cfg and .FLM files)
+ # TODO: Subcommand: from-remote (just pass the board and optionally the version, and the tool will fetch the latest firmware from Infineon fork and flash it)
+
+ args = p.parse_args()
+
+ # Print help if no command is provided
+ # TODO: Future interactive mode.
+ if args.command is None:
+ p.print_help(sys.stderr)
+ sys.exit(1)
+
+ return args
+
+
+if __name__ == "__main__":
+ try:
+ set_environment()
+ args = parser()
+ flash_command_args(args)
+ except KeyboardInterrupt:
+ print_f(colour_str_error("error: keyboard interrupt"))
+ openocd_remove()
diff --git a/py/makeversionhdr.py b/py/makeversionhdr.py
index 249ec1830c1..d3e680bb75e 100644
--- a/py/makeversionhdr.py
+++ b/py/makeversionhdr.py
@@ -30,7 +30,7 @@ def get_version_info_from_git(repo_path):
"--dirty",
"--always",
"--match",
- "v[1-9].*",
+ "v[0-9].*",
"--abbrev=10",
],
cwd=repo_path,
diff --git a/pyproject.toml b/pyproject.toml
index f528961b2c8..b57943d8bdd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,6 +15,7 @@ skip = """
./ports/cc3200/telnet,\
./ports/esp32/managed_components,\
./ports/nrf/drivers/bluetooth/s1*,\
+./ports/psoc-edge/boards/*/bsp-cfg,\
./ports/stm32/usbhost,\
./tests,\
ACKNOWLEDGEMENTS,\
diff --git a/tests/ports/psoc-edge/BLR-Runner-devs.yml b/tests/ports/psoc-edge/BLR-Runner-devs.yml
new file mode 100644
index 00000000000..8a176622153
--- /dev/null
+++ b/tests/ports/psoc-edge/BLR-Runner-devs.yml
@@ -0,0 +1,27 @@
+- name: KIT_PSE84_AI
+ uid: 0F16025A012D2400
+ features:
+ - pin
+ - i2c
+ - pwm
+ - wifi-idn-b0653ac13e11
+
+- name: KIT_PSE84_AI
+ uid: 111B1698012D2400
+ features:
+ - i2c
+
+- name: KIT_PSE84_AI
+ uid: 101A1398012D2400
+ features:
+ - uart
+
+- name: KIT_PSE84_AI
+ uid: 0E240C98012D2400
+ features:
+ - spi
+
+- name: KIT_PSE84_AI
+ uid: 0C170798012D2400
+ features:
+ - spi
\ No newline at end of file
diff --git a/tests/ports/psoc-edge/audio/README.md b/tests/ports/psoc-edge/audio/README.md
new file mode 100644
index 00000000000..8e40c6ab9b6
--- /dev/null
+++ b/tests/ports/psoc-edge/audio/README.md
@@ -0,0 +1,129 @@
+# PDM_PCM Audio Validation
+
+This directory contains the tools to validate the `PDM_PCM` peripheral on the PSOC Edge E84 kit by recording audio on the target and playing it back on the host.
+
+## Prerequisites
+
+### Hardware
+- PSOC Edge E84 Kit with MicroPython firmware flashed
+- Microphone connected to pins `P8_5` (SCK) and `P8_6` (DATA)
+
+> [!NOTE] These pins are currently hardcoded for the available KIT_PSE84_AI board. You can modify the recording script `record-target.py` to support other pin configurations as needed. They can also be added to the configurable parameters in the CLI script in the future.
+
+### Software (Linux / WSL)
+
+**mpremote** — used to communicate with the MicroPython target:
+```bash
+pip install mpremote
+```
+
+**ffmpeg / ffplay** — used to play back the recorded audio:
+```bash
+sudo apt update
+sudo apt install ffmpeg
+```
+
+## Usage
+
+All commands are run from this directory:
+
+```bash
+cd tests/ports/psoc-edge/audio
+```
+
+### Full flow — record, load, and play in one step
+
+```bash
+python record-audio.py
+```
+
+With custom parameters:
+```bash
+python record-audio.py -r 16000 -b 16 -f 2 -m 0 -t 5 -o audio.raw -d a0
+```
+
+### Step by step
+
+**1. Record** — uploads the config and runs the recording script on the target:
+```bash
+python record-audio.py record -r 16000 -b 16 -f 2 -m 0 -t 5
+```
+
+**2. Load** — copies the raw audio file from the target to the host:
+```bash
+python record-audio.py load
+```
+
+> [!TIP] The file transfer over the serial interface can be unreliable and may fail without needing to re-record. If the full flow fails at the load step, you can retry just the transfer independently with `load`, then play back the result with `play`, without repeating the recording.
+
+**3. Play** — plays back the audio on the host:
+```bash
+python record-audio.py play
+```
+
+**4. Clean** — removes audio files from both host and target:
+```bash
+python record-audio.py clean
+```
+
+### CLI reference
+
+| Argument | Short | Description | Default | Choices |
+|---|---|---|---|---|
+| `--device` | `-d` | mpremote device name | `a0` | any |
+| `--audio-file` | `-o` | Output file name | `audio.raw` | any |
+| `--audio-script` | `-s` | Target recording script | `record-target.py` | any |
+| `--time-sec` | `-t` | Recording duration (seconds) | `5` | any int |
+| `--sample-rate` | `-r` | Sample rate in Hz | `16000` | `8000 16000 32000 44100 48000` |
+| `--bits-per-sample` | `-b` | Bits per sample | `16` | `16 32` |
+| `--format` | `-f` | Audio format | `2` | `1`=MONO, `2`=STEREO |
+| `--mode` | `-m` | I/O mode | `0` | `0`=blocking, `1`=non-blocking |
+
+---
+
+## Validation matrix
+
+Mark each combination as validated (`✅`), failed (`❌`), poor audio quality (`👂`), or not tested (leave blank).
+
+| Sample Rate | Bits per Sample | Format | Mode | Validated |
+|---|---|---|---|---|
+| 8000 | 16 | MONO | blocking | |
+| 8000 | 16 | MONO | non-blocking | |
+| 8000 | 16 | STEREO | blocking | |
+| 8000 | 16 | STEREO | non-blocking | |
+| 8000 | 32 | MONO | blocking | |
+| 8000 | 32 | MONO | non-blocking | |
+| 8000 | 32 | STEREO | blocking | |
+| 8000 | 32 | STEREO | non-blocking | |
+| 16000 | 16 | MONO | blocking | `✅` |
+| 16000 | 16 | MONO | non-blocking | `✅` |
+| 16000 | 16 | STEREO | blocking | `✅` |
+| 16000 | 16 | STEREO | non-blocking | `✅` |
+| 16000 | 32 | MONO | blocking | `✅` |
+| 16000 | 32 | MONO | non-blocking | `✅` |
+| 16000 | 32 | STEREO | blocking | `✅` |
+| 16000 | 32 | STEREO | non-blocking | `👂` Electric sound|
+| 32000 | 16 | MONO | blocking | |
+| 32000 | 16 | MONO | non-blocking | |
+| 32000 | 16 | STEREO | blocking | |
+| 32000 | 16 | STEREO | non-blocking | |
+| 32000 | 32 | MONO | blocking | |
+| 32000 | 32 | MONO | non-blocking | |
+| 32000 | 32 | STEREO | blocking | |
+| 32000 | 32 | STEREO | non-blocking | |
+| 44100 | 16 | MONO | blocking | |
+| 44100 | 16 | MONO | non-blocking | |
+| 44100 | 16 | STEREO | blocking | |
+| 44100 | 16 | STEREO | non-blocking | |
+| 44100 | 32 | MONO | blocking | |
+| 44100 | 32 | MONO | non-blocking | |
+| 44100 | 32 | STEREO | blocking | |
+| 44100 | 32 | STEREO | non-blocking | |
+| 48000 | 16 | MONO | blocking | |
+| 48000 | 16 | MONO | non-blocking | |
+| 48000 | 16 | STEREO | blocking | |
+| 48000 | 16 | STEREO | non-blocking | |
+| 48000 | 32 | MONO | blocking | |
+| 48000 | 32 | MONO | non-blocking | |
+| 48000 | 32 | STEREO | blocking | |
+| 48000 | 32 | STEREO | non-blocking | |
diff --git a/tests/ports/psoc-edge/audio/record-audio.py b/tests/ports/psoc-edge/audio/record-audio.py
new file mode 100644
index 00000000000..3fdc037ba62
--- /dev/null
+++ b/tests/ports/psoc-edge/audio/record-audio.py
@@ -0,0 +1,251 @@
+import os, subprocess, argparse
+import sys
+
+# MicroPython needs to be installed in the PSOC EDGE E84 Kit
+# mpremote (1.27) and ffmpeg (6.1.1-3ubuntu5) need to be
+# installed on the local machine
+
+# We will generate a file with the configuration to record the audio
+# The file will be loaded. The script will be run, the audio will
+# be recorded and played. This can be run one by one to check all values.
+
+
+def load_file_on_target(filename, device):
+ """
+ Load the file to the target using mpremote:
+
+ mpremote cp $local_filename $device:$filename
+ """
+ command = f"mpremote {device} fs cp {filename} :{filename}"
+ subprocess.run(command, shell=True)
+
+
+def run_script_on_target(script, device):
+ """
+ Run the script on the target using mpremote:
+
+ mpremote run $script
+ """
+ command = f"mpremote {device} run {script}"
+ subprocess.run(command, shell=True)
+
+
+def remove_file_from_host(filename):
+ """
+ Remove the file from the host using os.remove:
+
+ os.remove($filename)
+ """
+ if os.path.exists(filename):
+ os.remove(filename)
+
+
+def remove_file_from_target(filename, device):
+ """
+ Remove the file from the target using mpremote:
+
+ mpremote fs rm $device:$filename
+ """
+ command = f"mpremote {device} fs rm :{filename}"
+ subprocess.run(command, shell=True)
+
+
+def load_file_from_target(filename, device):
+ """
+ Load the file from the target using mpremote:
+
+ mpremote cp $device:$filename $local_filename
+ """
+ command = f"mpremote {device} fs cp :{filename} {filename}"
+ subprocess.run(command, shell=True)
+
+
+def play_audio(file, bits_per_sample, rate, channels):
+ """
+ Play it using ffplay:
+
+ ffplay -nodisp -f $format -ar $rate -ac $channels -autoexit $file
+
+ ffmpeg (6.1.1-3ubuntu5) needs to be installed on the local machine
+ """
+ pcm_fmt = "s16le" if bits_per_sample == 16 else "s32le"
+ command = f"ffplay -nodisp -f {pcm_fmt} -ar {rate} -ac {channels} -autoexit {file}"
+ subprocess.run(command, shell=True)
+
+
+def cleanup(audio_file, conf_file, device):
+ print(">> Removing previous audio file from host...")
+ remove_file_from_host(audio_file)
+ remove_file_from_host(conf_file)
+
+ print(">> Removing previous audio file from target...")
+ remove_file_from_target(audio_file, device)
+ remove_file_from_target(conf_file, device)
+
+
+def create_config_file(
+ config_file, audio_file, time_sec, sample_rate, bits_per_sample, audio_format, mode
+):
+ mode = "blocking" if mode == 0 else "non-blocking"
+ config_content = f"""user_config = {{
+ "sample_rate": {sample_rate},
+ "bits_per_sample": {bits_per_sample},
+ "format": {audio_format},
+ "mode": "{mode}",
+ "audio_file": "{audio_file}",
+ "time_sec": {time_sec}
+ }}
+ """
+ with open(config_file, "w") as f:
+ f.write(config_content)
+
+
+def get_param_from_config(config_file, param):
+ try:
+ namespace = {}
+ with open(config_file, "r") as f:
+ exec(f.read(), namespace)
+ return namespace["user_config"][param]
+ except Exception as e:
+ sys.exit(
+ f"Error: {e}\nNo audio record configuration available.\nMake sure you have run the recording step first."
+ )
+
+
+def record(audio_script, conf_file, device):
+ print(">> Loading audio configuration file to target...")
+ load_file_on_target(conf_file, device)
+
+ print(">> Running script on target to record audio...")
+ run_script_on_target(audio_script, device)
+
+
+def load(audio_file, device):
+ print(">> Loading recorded audio from target...")
+ load_file_from_target(audio_file, device)
+
+
+def play(audio_file, bits_per_sample, sample_rate, format):
+ print(">> Playing recorded audio...")
+ play_audio(audio_file, bits_per_sample, sample_rate, format)
+
+
+def cli():
+ def _add_common_args(p):
+ p.add_argument("-d", "--device", default="a0", help="Device name (default: a0)")
+
+ def _add_recording_args(p):
+ _add_common_args(p)
+ p.add_argument(
+ "-o", "--audio-file", default="audio.raw", help="Audio file name (default: audio.raw)"
+ )
+ p.add_argument(
+ "-s",
+ "--audio-script",
+ default="record-target.py",
+ help="Audio script name (default: record-target.py)",
+ )
+ p.add_argument(
+ "-t", "--time-sec", type=int, default=5, help="Recording time in seconds (default: 5)"
+ )
+ p.add_argument(
+ "-r",
+ "--sample-rate",
+ type=int,
+ default=16000,
+ choices=[8000, 16000, 32000, 44100, 48000],
+ help="Sample rate in Hz (default: 16000)",
+ )
+ p.add_argument(
+ "-b",
+ "--bits-per-sample",
+ type=int,
+ default=16,
+ choices=[16, 32],
+ help="Bits per sample (default: 16)",
+ )
+ p.add_argument(
+ "-f",
+ "--format",
+ type=int,
+ default=2,
+ choices=[1, 2],
+ help="Audio format: 1=MONO, 2=STEREO (default: 2)",
+ )
+ p.add_argument(
+ "-m",
+ "--mode",
+ type=int,
+ default=0,
+ choices=[0, 1],
+ help="Mode: 0=blocking, 1=non-blocking (default: 0)",
+ )
+
+ parser = argparse.ArgumentParser(
+ description="Record audio on MicroPython device and play it on the host"
+ )
+ _add_recording_args(parser)
+
+ subparsers = parser.add_subparsers(dest="command")
+
+ record_parser = subparsers.add_parser("record", help="Record audio on the target")
+ _add_recording_args(record_parser)
+
+ load_parser = subparsers.add_parser(
+ "load", help="Load recorded audio from the target to the host"
+ )
+ _add_common_args(load_parser)
+
+ play_parser = subparsers.add_parser("play", help="Play recorded audio on the host")
+ _add_common_args(play_parser)
+
+ clean_parser = subparsers.add_parser("clean", help="Clean audio files from host and target")
+
+ return parser.parse_args()
+
+
+def main(args, conf_file):
+ cleanup(args.audio_file, conf_file, args.device)
+ create_config_file(
+ conf_file,
+ args.audio_file,
+ args.time_sec,
+ args.sample_rate,
+ args.bits_per_sample,
+ args.format,
+ args.mode,
+ )
+ record(args.audio_script, conf_file, args.device)
+ load(args.audio_file, args.device)
+ play(args.audio_file, args.bits_per_sample, args.sample_rate, args.format)
+
+
+if __name__ == "__main__":
+ config_file = "audio_conf.py"
+
+ args = cli()
+
+ if args.command == "record":
+ create_config_file(
+ config_file,
+ args.audio_file,
+ args.time_sec,
+ args.sample_rate,
+ args.bits_per_sample,
+ args.format,
+ args.mode,
+ )
+ record(args.audio_script, config_file, args.device)
+ elif args.command == "load":
+ audio_file = get_param_from_config(config_file, "audio_file")
+ load(audio_file, args.device)
+ elif args.command == "play":
+ audio_file = get_param_from_config(config_file, "audio_file")
+ bits_per_sample = get_param_from_config(config_file, "bits_per_sample")
+ sample_rate = get_param_from_config(config_file, "sample_rate")
+ format = get_param_from_config(config_file, "format")
+ play(audio_file, bits_per_sample, sample_rate, format)
+ elif args.command == "clean":
+ cleanup(get_param_from_config(config_file, "audio_file"), config_file, args.device)
+ else:
+ main(args, config_file)
diff --git a/tests/ports/psoc-edge/audio/record-target.py b/tests/ports/psoc-edge/audio/record-target.py
new file mode 100644
index 00000000000..dbbf5c80076
--- /dev/null
+++ b/tests/ports/psoc-edge/audio/record-target.py
@@ -0,0 +1,85 @@
+from machine import PDM_PCM
+import uio
+import time
+
+
+def record_audio_blocking(filename, time_sec):
+ rx_buf = bytearray([0] * 128)
+ with uio.open(filename, "wb") as f:
+ start_time = time.time()
+ while time.time() - start_time < time_sec:
+ num_read = pdm_pcm.readinto(rx_buf)
+ f.write(rx_buf[:num_read])
+
+
+def record_audio_non_blocking(filename, time_sec):
+ global data_ready
+ data_ready = False
+
+ def cback_data_ready(obj):
+ global data_ready
+ data_ready = True
+
+ rx_buf = bytearray([0] * 1024)
+ pdm_pcm.irq(cback_data_ready)
+
+ with uio.open(filename, "wb") as f:
+ start_time = time.time()
+ while time.time() - start_time < time_sec:
+ pdm_pcm.readinto(rx_buf)
+ while not data_ready:
+ pass
+
+ data_ready = False
+ f.write(rx_buf)
+
+
+########################################
+#### Audio configuration parameters ####
+########################################
+
+pdm_pcm_config = {
+ "sample_rate": 16000,
+ "bits_per_sample": 16,
+ "format": PDM_PCM.STEREO,
+ "mode": "blocking",
+ "audio_file": "audio.raw",
+ "time_sec": 5,
+}
+
+try:
+ import audio_conf
+
+ pdm_pcm_config = audio_conf.user_config
+except ImportError:
+ print("audio_conf.py not found. Using default config")
+
+print("########## Audio configuration ##########")
+print(f"format: {pdm_pcm_config['format']}")
+print(f"sample_rate: {pdm_pcm_config['sample_rate']}")
+print(f"bits_per_sample: {pdm_pcm_config['bits_per_sample']}")
+print(f"mode: {pdm_pcm_config['mode']}")
+print(f"audio_file: {pdm_pcm_config['audio_file']}")
+print(f"time_sec: {pdm_pcm_config['time_sec']}")
+print("########################################")
+
+if pdm_pcm_config["mode"] == "blocking":
+ record_audio = record_audio_blocking
+else:
+ record_audio = record_audio_non_blocking
+
+########################################
+
+print("-- Starting audio recording...")
+
+pdm_pcm = PDM_PCM(
+ sck="P8_5",
+ data="P8_6",
+ sample_rate=pdm_pcm_config["sample_rate"],
+ bits=pdm_pcm_config["bits_per_sample"],
+ format=pdm_pcm_config["format"],
+)
+record_audio(pdm_pcm_config["audio_file"], pdm_pcm_config["time_sec"])
+pdm_pcm.deinit()
+
+print("-- Audio recorded")
diff --git a/tests/ports/psoc-edge/board_ext_hw/hw-connections.md b/tests/ports/psoc-edge/board_ext_hw/hw-connections.md
new file mode 100644
index 00000000000..56c3fb4bfac
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/hw-connections.md
@@ -0,0 +1,24 @@
+# Pin Connections for HIL Test Setup Single Board
+
+| Test Name | Board 1 Pin | Board 1 Pin | Description |
+|-------------------|---------------|---------------|--------------------------------|
+| Pin | P16_0 | P16_1 | Output to Input |
+| | | | |
+| PWM | P16_1 | P16_0 | PWM Output to IO Input |
+| | | | |
+| UART | P17_0 | P17_1 | UART RX to TX |
+| | P16_5 | P16_6 | UART CTS to RTS |
+
+# Pin Connections for HIL Test Setup Between 2 Boards
+
+| Test Name | Board 1 Pin | Board 2 Pin | Description |
+|-------------------|---------------|---------------|--------------------------------|
+| I2C | P17_0 | P17_0 | I2C SCL to SCL (with pullup) |
+| | P17_1 | P17_1 | I2C SDA to SDA (with pullup) |
+| | GND | GND | Common Ground |
+| | | | |
+| SPI | P16_0 | P16_0 | SPI SCK to SCK |
+| | P16_1 | P16_1 | SPI MOSI to MOSI |
+| | P16_2 | P16_2 | SPI MISO to MISO |
+| | P16_3 | P16_3 | SPI SSEL to CS out |
+| | GND | GND | Common Ground |
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/i2c_basic.py b/tests/ports/psoc-edge/board_ext_hw/multi/i2c_basic.py
new file mode 100644
index 00000000000..7d752de0aa1
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/i2c_basic.py
@@ -0,0 +1,151 @@
+# I2C multi-device test
+# Tests I2C master and slave communication between two boards
+#
+# KIT_PSE84_AI board Hardware connections:
+# Board 0 (Target) Board 1 (Master)
+# P17_0 (SCL) <-> P17_0 (SCL)
+# P17_1 (SDA) <-> P17_1 (SDA)
+# GND <-> GND
+#
+# Pull-up resistors (4.7kΩ):
+# SCL -> VDD 3V3
+# SDA -> VDD 3V3
+
+import time
+
+
+def instance0():
+ # I2C Target (Slave)
+ from machine import I2CTarget
+
+ SLAVE_ADDR = 0x43
+
+ # Create target with memory buffer
+ mem = bytearray([0xAA, 0xBB, 0xCC, 0xDD, 0x00, 0x00, 0x00, 0x00])
+ i2c_target = I2CTarget(addr=SLAVE_ADDR, mem=mem, scl="P17_0", sda="P17_1")
+
+ # Minimal IRQ verification without additional output.
+ read_seen = [False]
+ write_seen = [False]
+
+ def irq_handler(i2c_target):
+ flags = i2c_target.irq().flags()
+ if flags & I2CTarget.IRQ_END_READ:
+ read_seen[0] = True
+ if flags & I2CTarget.IRQ_END_WRITE:
+ write_seen[0] = True
+
+ # TODO: Re-enable hard irq. Not working after FreeRTOS based implementation.
+ # i2c_target.irq(irq_handler, hard=True)
+ i2c_target.irq(irq_handler)
+
+ # Signal to master that target is ready.
+ multitest.next()
+
+ # Wait for master write transaction to update target memory.
+ timeout = 10 # seconds
+ start_time = time.time()
+ while (mem[0] != 0x01 or mem[1] != 0x02 or mem[2] != 0x03) and (
+ time.time() - start_time
+ ) < timeout:
+ time.sleep(0.1)
+
+ data_pass = mem[0] == 0x01 and mem[1] == 0x02 and mem[2] == 0x03 and mem[3] == 0xDD
+ irq_pass = read_seen[0] and write_seen[0]
+ print("target: IRQ:", "PASS" if irq_pass else "FAIL")
+ print("target:", "PASS" if (data_pass and irq_pass) else "FAIL")
+
+ i2c_target.deinit()
+
+
+def instance1():
+ # I2C Master
+ from machine import I2C
+
+ print("\n***** I2C Master Test *****\n")
+
+ # Wait for slave to be ready
+ print("Waiting for slave...")
+ multitest.next()
+ print("Slave ready\n")
+
+ SLAVE_ADDR = 0x43
+
+ # Test 1: Scan
+ print("***** Test 1: I2C Scan *****\n")
+ i2c = I2C(scl="P17_0", sda="P17_1", freq=400000)
+ devices = i2c.scan()
+ print("Found devices:", [hex(d) for d in devices])
+ scan_pass = SLAVE_ADDR in devices
+ print("Status:", "PASS" if scan_pass else "FAIL")
+
+ # Test 2: Write
+ print("\n***** Test 2: Write *****\n")
+ try:
+ i2c.writeto(SLAVE_ADDR, b"\x01\x02\x03")
+ write_pass = True
+ print("Status: PASS")
+ except Exception as e:
+ write_pass = False
+ print("Status: FAIL -", e)
+
+ # Test 3: Read
+ print("\n***** Test 3: Read *****\n")
+ try:
+ data = i2c.readfrom(SLAVE_ADDR, 4)
+ print("Received:", data)
+ read_pass = len(data) == 4
+ print("Status:", "PASS" if read_pass else "FAIL")
+ except Exception as e:
+ read_pass = False
+ print("Status: FAIL -", e)
+
+ # Deinit i2c instance
+ i2c.deinit()
+
+ # Test 4: Timeout Test
+ print("\n***** Test 4: Timeout *****\n")
+ try:
+ # Create I2C with short timeout
+ i2c_timeout = I2C(
+ scl="P17_0", sda="P17_1", freq=100000, timeout=10000
+ ) # 10ms timeout (10000us)
+ print("Created I2C with timeout=10000us (10ms)")
+
+ # Try to read from non-existent device
+ # Note: This will fail at transaction start with EIO (errno 5)
+ # rather than timeout, as the device doesn't ACK the address.
+ # A true timeout would occur if device ACKs but doesn't send data.
+ try:
+ data = i2c_timeout.readfrom(0x50, 4) # Non-existent address
+ print("Status: FAIL - Expected error but succeeded")
+ timeout_pass = False
+ except OSError as e:
+ # Accept either ETIMEDOUT (110) or EIO (5)
+ # EIO occurs when device doesn't ACK address
+ # ETIMEDOUT occurs when device ACKs but doesn't respond in time
+ if e.errno == 110: # ETIMEDOUT
+ print("Timeout occurred (ETIMEDOUT)")
+ print("Status: PASS")
+ timeout_pass = True
+ elif e.errno == 5: # EIO - No ACK from device
+ print("I/O error occurred (device not responding)")
+ print("Status: PASS")
+ timeout_pass = True
+ else:
+ print("Status: FAIL - Unexpected error:", e.errno)
+ timeout_pass = False
+
+ i2c_timeout.deinit()
+ except Exception as e:
+ print("Status: FAIL -", e)
+ timeout_pass = False
+
+ # Summary
+ print("\n***** Summary *****\n")
+ all_pass = scan_pass and write_pass and read_pass and timeout_pass
+ print("Scan: ", "PASS" if scan_pass else "FAIL")
+ print("Write: ", "PASS" if write_pass else "FAIL")
+ print("Read: ", "PASS" if read_pass else "FAIL")
+ print("Timeout:", "PASS" if timeout_pass else "FAIL")
+ print("\nOverall:", "PASS" if all_pass else "FAIL")
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/i2c_basic.py.exp b/tests/ports/psoc-edge/board_ext_hw/multi/i2c_basic.py.exp
new file mode 100644
index 00000000000..92a370e8dc7
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/i2c_basic.py.exp
@@ -0,0 +1,38 @@
+--- instance0 ---
+target: IRQ: PASS
+target: PASS
+--- instance1 ---
+
+***** I2C Master Test *****
+
+Waiting for slave...
+Slave ready
+
+***** Test 1: I2C Scan *****
+
+Found devices: ['0x43']
+Status: PASS
+
+***** Test 2: Write *****
+
+Status: PASS
+
+***** Test 3: Read *****
+
+Received: b'\x01\x02\x03\xdd'
+Status: PASS
+
+***** Test 4: Timeout *****
+
+Created I2C with timeout=10000us (10ms)
+I/O error occurred (device not responding)
+Status: PASS
+
+***** Summary *****
+
+Scan: PASS
+Write: PASS
+Read: PASS
+Timeout: PASS
+
+Overall: PASS
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_rx.py b/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_rx.py
new file mode 100644
index 00000000000..561c5418310
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_rx.py
@@ -0,0 +1,107 @@
+import os
+import machine
+from machine import PDM_PCM, Pin
+import time
+
+send_signal_to_tx_pin = "P10_3"
+
+print("*** PDM_PCM tests - RX ***")
+
+send_signal = Pin(send_signal_to_tx_pin, mode=Pin.OUT, pull=Pin.PULL_DOWN, value=False)
+
+
+def generate_exp_seq(data):
+ exp_seq = bytearray(data * 64)
+ return exp_seq
+
+
+print("1. blocking read implementation ")
+
+_sampling_rate = [8000, 16000, 32000, 48000, 22050, 44100]
+_mode = [PDM_PCM.MONO_LEFT, PDM_PCM.MONO_RIGHT, PDM_PCM.STEREO]
+exp_data = [[0x00], [0xFF]]
+iterations = 100
+rounds = 2
+
+for m in range(rounds):
+ send_signal.value(0)
+ exp_seq = generate_exp_seq(exp_data[m])
+ if m == 0:
+ print("*** Test for data high ***")
+ else:
+ print("*** Test for data low ***")
+
+ for i in range(len(_sampling_rate)): # Check for all sampling rates
+ set_sampling_rate = _sampling_rate[i]
+ if _sampling_rate[i] == 22050 or _sampling_rate[i] == 44100:
+ machine.freq(machine.AUDIO_PDM_22_579_000_HZ)
+ else:
+ machine.freq(machine.AUDIO_PDM_24_576_000_HZ)
+ for j in range(len(_mode)): # Check for all modes
+ set_mode = _mode[j]
+ if set_mode == PDM_PCM.STEREO:
+ iterations = 200
+ pdm_pcm = PDM_PCM(
+ 0,
+ sample_rate=set_sampling_rate,
+ decimation_rate=96,
+ bits=PDM_PCM.BITS_16,
+ format=set_mode,
+ left_gain=0,
+ right_gain=0,
+ )
+ pdm_pcm.init() # Start
+
+ for k in range(iterations):
+ rx_buf = bytearray([1] * 64)
+ num_read = pdm_pcm.readinto(rx_buf)
+ # print("buf :", ''.join(f'{x:02x} ' for x in rx_buf))
+ if rx_buf[:3] == bytearray([exp_data[m][0], exp_data[m][0], exp_data[m][0]]):
+ is_seq_received = rx_buf == exp_seq
+ if is_seq_received:
+ print(
+ f"data received for mode = {set_mode}, bits = PDM_PCM.BITS_16, rate = {set_sampling_rate} : {is_seq_received}"
+ )
+ break
+ pdm_pcm.deinit()
+ send_signal.high()
+ time.sleep(1) # Wait to sync
+
+send_signal.deinit()
+
+###############################################################################
+print("\n2. irq non-blocking read implementation ")
+
+rx_done = False
+
+
+def rx_complete_irq(obj):
+ global rx_done
+ rx_done = True
+
+
+machine.freq(machine.AUDIO_PDM_22_579_000_HZ)
+pdm_pcm = PDM_PCM(
+ 0,
+ sample_rate=set_sampling_rate,
+ decimation_rate=96,
+ bits=PDM_PCM.BITS_16,
+ format=set_mode,
+ left_gain=0,
+ right_gain=0,
+)
+
+pdm_pcm.init() # Start
+
+rx_buf = bytearray([0] * 64)
+pdm_pcm.irq(rx_complete_irq)
+num_read = pdm_pcm.readinto(rx_buf)
+
+while not rx_done:
+ pass
+
+# if we get pass this rx_done flag has been
+# modified by the interrupt
+
+print("rx blocking done")
+pdm_pcm.deinit()
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_rx.py.exp b/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_rx.py.exp
new file mode 100644
index 00000000000..7996b44e12e
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_rx.py.exp
@@ -0,0 +1,43 @@
+*** PDM_PCM tests - RX ***
+1. blocking read implementation
+*** Test for data high ***
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 8000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 8000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 8000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 16000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 16000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 16000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 32000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 32000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 32000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 48000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 48000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 48000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 22050 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 22050 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 22050 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 44100 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 44100 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 44100 : True
+*** Test for data low ***
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 8000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 8000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 8000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 16000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 16000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 16000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 32000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 32000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 32000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 48000 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 48000 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 48000 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 22050 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 22050 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 22050 : True
+data received for mode = 0, bits = PDM_PCM.BITS_16, rate = 44100 : True
+data received for mode = 1, bits = PDM_PCM.BITS_16, rate = 44100 : True
+data received for mode = 2, bits = PDM_PCM.BITS_16, rate = 44100 : True
+
+2. irq non-blocking read implementation
+rx blocking done
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_tx.py b/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_tx.py
new file mode 100644
index 00000000000..81fd5e376c2
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/pdm_pcm_tx.py
@@ -0,0 +1,33 @@
+import os
+from machine import Pin
+import time
+
+clk_in_pin = "P10_1"
+data_out_pin = "P10_5"
+sync_in_pin = "P10_0"
+
+sig_val = 0
+test_done = False
+
+
+def signal_irq(event):
+ global sig_val
+ sig_val += 1
+
+
+data_out = Pin(data_out_pin, mode=Pin.OUT, pull=Pin.PULL_DOWN, value=False)
+clk_in = Pin(clk_in_pin, Pin.IN, Pin.PULL_DOWN)
+sync_data = Pin(sync_in_pin, Pin.IN, Pin.PULL_DOWN)
+sync_data.irq(handler=signal_irq, trigger=Pin.IRQ_RISING)
+
+data_out.value(1)
+while sig_val == 0:
+ pass
+
+data_out.value(0)
+while sig_val == 1:
+ pass
+
+data_out.deinit()
+clk_in.deinit()
+sync_data.deinit()
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/spi_basic.py b/tests/ports/psoc-edge/board_ext_hw/multi/spi_basic.py
new file mode 100644
index 00000000000..9d9e7bce1c4
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/spi_basic.py
@@ -0,0 +1,181 @@
+# SPI multi-device test
+# Tests SPI master and target communication between two boards
+#
+# KIT_PSE84_AI board Hardware connections:
+# Board 0 (Target) Board 1 (Master)
+# P16_0 (SCK) <-> P16_0 (SCK)
+# P16_1 (MOSI) <-> P16_1 (MOSI)
+# P16_2 (MISO) <-> P16_2 (MISO)
+# P16_3 (SSEL) <-> P16_3 (CS out)
+# GND <-> GND
+#
+import os
+import time
+
+
+def _get_spi_pins_for_board():
+ uname_fn = getattr(os, "uname", None)
+ if uname_fn is None:
+ # Some firmware builds do not expose os.uname(); default to KIT mapping.
+ return ("P16_0", "P16_1", "P16_2", "P16_3")
+
+ board = uname_fn().machine
+ board_norm = board.upper().replace("-", "_")
+
+ if "KIT_PSE84_AI" in board_norm or "PSE84" in board_norm:
+ return ("P16_0", "P16_1", "P16_2", "P16_3")
+
+ print("SKIP: Unsupported board for SPI multi-device test:", board)
+ raise SystemExit
+
+
+SCK_PIN, MOSI_PIN, MISO_PIN, SSEL_PIN = _get_spi_pins_for_board()
+
+
+def instance0():
+ # SPI Target (Slave)
+ from machine import SPITarget
+
+ print("\n***** SPI Target Test *****\n")
+
+ target = SPITarget(
+ polarity=0,
+ phase=0,
+ bits=8,
+ firstbit=SPITarget.MSB,
+ sck=SCK_PIN,
+ mosi=MOSI_PIN,
+ miso=MISO_PIN,
+ ssel=SSEL_PIN,
+ )
+
+ # Signal to master that target is ready
+ multitest.next()
+
+ # Test 1: Read from master
+ print("***** Test 1: Read *****\n")
+ rx = bytearray(4)
+ n = target.readinto(rx)
+ print("Received:", rx[:n])
+ read_pass = rx[:n] == b"\x01\x02\x03\x04"
+ print("Status:", "PASS" if read_pass else "FAIL")
+
+ # Signal master that read is done
+ multitest.next()
+
+ # Wait for master to be ready for write test
+ multitest.next()
+
+ # Test 2: Write to master
+ print("\n***** Test 2: Write *****\n")
+ tx = b"\xaa\xbb\xcc\xdd"
+ n = target.write(tx)
+ print("Wrote:", n, "bytes")
+ write_pass = n == 4
+ print("Status:", "PASS" if write_pass else "FAIL")
+
+ # Signal master that write is done
+ multitest.next()
+
+ # Wait for master to be ready for write_readinto test
+ multitest.next()
+
+ # Test 3: Write and read simultaneously
+ print("\n***** Test 3: Write+Read *****\n")
+ tx = b"\x11\x22\x33\x44"
+ rx = bytearray(4)
+ n = target.write_readinto(tx, rx)
+ print("Sent:", tx)
+ print("Received:", rx[:n])
+ readinto_pass = rx[:n] == b"\xde\xad\xbe\xef"
+ print("Status:", "PASS" if readinto_pass else "FAIL")
+
+ multitest.next()
+
+ target.deinit()
+
+ # Summary
+ print("\n***** Target Summary *****")
+ all_pass = read_pass and write_pass and readinto_pass
+ print("Overall:", "PASS" if all_pass else "FAIL")
+
+
+def instance1():
+ # SPI Master (Controller)
+ from machine import SPI, Pin
+
+ print("\n***** SPI Master Test *****\n")
+
+ spi = SPI(
+ baudrate=1_000_000,
+ polarity=0,
+ phase=0,
+ bits=8,
+ firstbit=SPI.MSB,
+ sck=SCK_PIN,
+ mosi=MOSI_PIN,
+ miso=MISO_PIN,
+ )
+ cs = Pin(SSEL_PIN, Pin.OUT, value=1)
+
+ # Wait for target to be ready
+ print("Waiting for target...")
+ multitest.next()
+ print("Target ready\n")
+
+ # Test 1: Write to target
+ print("***** Test 1: Write *****\n")
+ tx = b"\x01\x02\x03\x04"
+ cs(0)
+ time.sleep_us(10)
+ spi.write(tx)
+ time.sleep_us(10)
+ cs(1)
+ print("Sent:", tx)
+ print("Status: PASS")
+
+ # Wait for target to finish reading
+ multitest.next()
+
+ # Test 2: Read from target
+ print("\n***** Test 2: Read *****\n")
+ # Signal target to start writing
+ multitest.next()
+ rx = bytearray(4)
+ cs(0)
+ time.sleep_us(10)
+ spi.readinto(rx)
+ time.sleep_us(10)
+ cs(1)
+ print("Received:", rx)
+ read_pass = rx == b"\xaa\xbb\xcc\xdd"
+ print("Status:", "PASS" if read_pass else "FAIL")
+
+ # Wait for target to finish write
+ multitest.next()
+
+ # Test 3: Simultaneous write and read
+ print("\n***** Test 3: Transfer *****\n")
+ # Signal target to start write_readinto
+ multitest.next()
+
+ tx = b"\xde\xad\xbe\xef"
+ rx = bytearray(4)
+ cs(0)
+ time.sleep_us(10)
+ spi.write_readinto(tx, rx)
+ time.sleep_us(10)
+ cs(1)
+ print("Sent:", tx)
+ print("Received:", rx)
+ transfer_pass = rx == b"\x11\x22\x33\x44"
+ print("Status:", "PASS" if transfer_pass else "FAIL")
+
+ multitest.next()
+
+ spi.deinit()
+
+ # Summary
+ print("\n***** Master Summary *****")
+ all_pass = read_pass and transfer_pass
+ print("Overall:", "PASS" if all_pass else "FAIL")
diff --git a/tests/ports/psoc-edge/board_ext_hw/multi/spi_basic.py.exp b/tests/ports/psoc-edge/board_ext_hw/multi/spi_basic.py.exp
new file mode 100644
index 00000000000..8a258ef58ad
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/multi/spi_basic.py.exp
@@ -0,0 +1,57 @@
+--- instance0 ---
+
+***** SPI Target Test *****
+
+***** Test 1: Read *****
+
+Received: bytearray(b'\x01\x02\x03\x04')
+Status: PASS
+NEXT
+NEXT
+
+***** Test 2: Write *****
+
+Wrote: 4 bytes
+Status: PASS
+NEXT
+NEXT
+
+***** Test 3: Write+Read *****
+
+Sent: b'\x11"3D'
+Received: bytearray(b'\xde\xad\xbe\xef')
+Status: PASS
+NEXT
+
+***** Target Summary *****
+Overall: PASS
+--- instance1 ---
+
+***** SPI Master Test *****
+
+Waiting for target...
+Target ready
+
+***** Test 1: Write *****
+
+Sent: b'\x01\x02\x03\x04'
+Status: PASS
+NEXT
+
+***** Test 2: Read *****
+
+NEXT
+Received: bytearray(b'\xaa\xbb\xcc\xdd')
+Status: PASS
+NEXT
+
+***** Test 3: Transfer *****
+
+NEXT
+Sent: b'\xde\xad\xbe\xef'
+Received: bytearray(b'\x11"3D')
+Status: PASS
+NEXT
+
+***** Master Summary *****
+Overall: PASS
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/pin.py b/tests/ports/psoc-edge/board_ext_hw/single/pin.py
new file mode 100644
index 00000000000..7267ed8621a
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/pin.py
@@ -0,0 +1,74 @@
+from machine import Pin
+
+pin_out_name = "P16_0" # Use string label
+pin_out = Pin(pin_out_name, mode=Pin.OUT, value=True)
+print(pin_out)
+
+pin_in = Pin.cpu.P16_1
+pin_in.init(mode=Pin.IN, pull=Pin.PULL_UP)
+print(pin_in)
+
+# Validating initialization values
+print("pin out initial value 1: ", pin_in.value() == 1)
+
+pin_out = Pin(pin_out_name, mode=Pin.OUT, value=False)
+print("pin out initial value 0: ", pin_in.value() == 0)
+
+# Validation different output setting
+pin_out.value(1)
+print("pin out (self) value 1: ", pin_out.value() == 1)
+print("pin out value 1: ", pin_in.value() == 1)
+
+pin_out.value(0)
+print("pin out (self) value 0: ", pin_out.value() == 0)
+print("pin out value 0: ", pin_in.value() == 0)
+
+pin_out.value(True)
+print("pin out value True: ", pin_in.value() == True)
+
+pin_out.value(False)
+print("pin out value False: ", pin_in.value() == False)
+
+pin_out.on()
+print("pin out value on: ", pin_in.value() == 1)
+
+pin_out.off()
+print("pin out value off: ", pin_in.value() == 0)
+
+pin_out(1)
+print("pin out callable 1: ", pin_in() == 1)
+
+pin_out(0)
+print("pin out callable 0: ", pin_in() == 0)
+
+pin_out.high()
+print("pin out value high: ", pin_in() == 1)
+
+pin_out.low()
+print("pin out value low: ", pin_in() == 0)
+
+pin_out.toggle()
+print("pin out value toggled (0->1): ", pin_in.value() == 1)
+
+# Validating pull resistors configurations and open drain mode
+pin_out = Pin(pin_out_name, mode=Pin.OUT, pull=Pin.PULL_UP, drive=Pin.DRIVE_0)
+print("pin out with pull up initially high: ", pin_in() == 1)
+
+# This does not work in the test, but does manually for P16_0 - P16_1
+# pin_out = Pin(pin_out_name, mode=Pin.OUT, pull=Pin.PULL_DOWN)
+# print("pin out with pull down initially down: ", pin_in() == 0)
+
+pin_out = Pin(pin_out_name, mode=Pin.OPEN_DRAIN)
+print("pin out with pull none initially 0: ", pin_in() == 0)
+
+# Validating config setters/getters
+print("pin out get mode: ", pin_out.mode() == Pin.OPEN_DRAIN)
+print("pin out get pull: ", pin_out.pull() == 0)
+print("pin out get drive: ", pin_out.drive() == Pin.DRIVE_0)
+
+pin_out.mode(Pin.OUT)
+pin_out.pull(Pin.PULL_UP)
+pin_out.drive(Pin.DRIVE_4)
+print("pin out set mode: ", pin_out.mode() == Pin.OUT)
+print("pin out set pull: ", pin_out.pull() == Pin.PULL_UP)
+print("pin out set drive: ", pin_out.drive() == Pin.DRIVE_4)
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/pin.py.exp b/tests/ports/psoc-edge/board_ext_hw/single/pin.py.exp
new file mode 100644
index 00000000000..89a319f959b
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/pin.py.exp
@@ -0,0 +1,25 @@
+Pin(Pin.cpu.P16_0, mode=Pin.OUT)
+Pin(Pin.cpu.P16_1, mode=Pin.IN, pull=Pin.PULL_UP)
+pin out initial value 1: True
+pin out initial value 0: True
+pin out (self) value 1: True
+pin out value 1: True
+pin out (self) value 0: True
+pin out value 0: True
+pin out value True: True
+pin out value False: True
+pin out value on: True
+pin out value off: True
+pin out callable 1: True
+pin out callable 0: True
+pin out value high: True
+pin out value low: True
+pin out value toggled (0->1): True
+pin out with pull up initially high: True
+pin out with pull none initially 0: True
+pin out get mode: True
+pin out get pull: True
+pin out get drive: True
+pin out set mode: True
+pin out set pull: True
+pin out set drive: True
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/pin_irq.py b/tests/ports/psoc-edge/board_ext_hw/single/pin_irq.py
new file mode 100644
index 00000000000..1c5c67b6486
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/pin_irq.py
@@ -0,0 +1,61 @@
+from machine import Pin
+import time
+
+# Two pins are connected together.
+# An output pin triggers the interrupt.
+# An input pin is configured to receive the interrupt
+pin_trigger = Pin("P16_0", mode=Pin.OUT, pull=Pin.PULL_UP, value=True)
+pin_irq = Pin("P16_1", mode=Pin.IN)
+
+
+def irq_handler(pin):
+ print("irq")
+
+
+# Configure the IRQ handler to trigger on falling edge
+# The handler should be called twice
+irq = pin_irq.irq(irq_handler, trigger=Pin.IRQ_FALLING)
+pin_trigger(0)
+pin_trigger(1)
+pin_trigger(0)
+# Wait for the interrupts to be processed
+time.sleep_ms(50)
+print("irq flag falling:", irq.flags() == Pin.IRQ_FALLING)
+
+
+# Now it is configured to trigger on rising edge.
+# The handler should be called twice
+irq.trigger(Pin.IRQ_RISING)
+pin_trigger(0)
+pin_trigger(1)
+time.sleep_ms(50)
+pin_trigger(0)
+pin_trigger(1)
+time.sleep_ms(50)
+print("irq flag rising:", irq.flags() == Pin.IRQ_RISING)
+
+
+# Test hard IRQ
+def irq_handler_hard(pin):
+ print("irq hard")
+
+
+# TODO: Re-enable hard irq. Not working after FreeRTOS based implementation.
+# irq = pin_irq.irq(irq_handler_hard, trigger=Pin.IRQ_FALLING, hard=True)
+irq = pin_irq.irq(irq_handler_hard, trigger=Pin.IRQ_FALLING)
+pin_trigger(0)
+
+
+# Trigger set to None, should not trigger any interrupt.
+pin_irq.irq(None)
+pin_trigger(1)
+pin_trigger(0)
+pin_trigger(1)
+pin_trigger(0)
+
+
+# Invalid trigger
+try:
+ irq.trigger(0x35)
+except ValueError as e:
+ print("error:", e)
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/pin_irq.py.exp b/tests/ports/psoc-edge/board_ext_hw/single/pin_irq.py.exp
new file mode 100644
index 00000000000..307b8cbf4ed
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/pin_irq.py.exp
@@ -0,0 +1,8 @@
+irq
+irq
+irq flag falling: True
+irq
+irq
+irq flag rising: True
+irq hard
+error: trigger 0x00000034 unsupported
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/pwm.py b/tests/ports/psoc-edge/board_ext_hw/single/pwm.py
new file mode 100644
index 00000000000..c0bc99e44c7
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/pwm.py
@@ -0,0 +1,297 @@
+# PWM test
+"""
+Setup: Connect pwm_pin to pin_in
+"""
+
+from machine import PWM, Pin
+import os
+import time
+
+pwm_pin = "P16_1"
+pin_in = "P16_0"
+
+input_pin = Pin(pin_in, Pin.IN)
+
+
+def measure_signal():
+ # In some cases, the first measurement is not accurate
+ # (negative time)
+ # so we need to measure the signal until we get a positive timing
+ positive_timing = False
+ attempts = 0
+ while not positive_timing and attempts < 3:
+ init_level = input_pin.value()
+ # Transient until edge transition
+ # when the synch is done
+ while input_pin.value() == init_level:
+ pass
+
+ # start measuring just after the edge transition
+ init_level_start_time = time.ticks_us()
+
+ # wait for edge transition
+ while input_pin.value() == (not init_level):
+ pass
+ init_level_end_time = time.ticks_us()
+
+ # wait for next edge transition
+ while input_pin.value() == init_level:
+ pass
+ second_level_start_time = time.ticks_us()
+
+ # Identify the low and high level timestamps
+ if init_level == 1:
+ low_level_start_time = init_level_start_time
+ low_level_end_time = init_level_end_time
+ high_level_start_time = init_level_end_time
+ high_level_end_time = second_level_start_time
+ else:
+ low_level_start_time = init_level_end_time
+ low_level_end_time = second_level_start_time
+ high_level_start_time = init_level_start_time
+ high_level_end_time = init_level_end_time
+
+ on_time = time.ticks_diff(high_level_end_time, high_level_start_time)
+ off_time = time.ticks_diff(low_level_end_time, low_level_start_time)
+ time_period = on_time + off_time
+
+ attempts += 1
+ if time_period > 0:
+ positive_timing = True
+
+ # Calculate frequency and duty cycle
+ calc_freq = 1000000 / (time_period)
+ calc_dc = (on_time / time_period) * 100
+ return calc_dc, calc_freq
+
+
+def validate_signal(exp_freq=0, calc_freq=0, calc_dc=0, exp_dc=0, exp_duty_u16=0, exp_duty_ns=0):
+ frequency_tolerance_percent = 10
+ duty_tolerance = 1.0
+
+ if (
+ (exp_freq - exp_freq * frequency_tolerance_percent / 100)
+ < calc_freq
+ < (exp_freq + exp_freq * frequency_tolerance_percent / 100)
+ ) == False:
+ print(
+ f"Expected freq does not match calc freq! \n Exp freq: {exp_freq} \n Calc freq: {calc_freq}"
+ )
+ else:
+ print(f"Expected freq matches calc freq! \n freq: {exp_freq}")
+
+ if ((exp_dc - duty_tolerance) < calc_dc < (exp_dc + duty_tolerance)) == False:
+ print(f"Exp dc(%) does not match calc dc(%)! \n dc: {exp_dc} \n Calc dc: {calc_dc}")
+ else:
+ print(f"Exp dc(%) matches calc dc(%)! \n dc: {exp_dc}")
+
+
+print("*** PWM tests ***")
+# T = 1sec (50% dc)
+pwm = PWM(pwm_pin, freq=1, duty_u16=32767)
+time.sleep(2) # Wait for the pwm signal to be initialized and started
+calc_dc, calc_freq = measure_signal()
+
+validate_signal(
+ exp_freq=1,
+ calc_freq=calc_freq,
+ exp_dc=50,
+ calc_dc=calc_dc,
+ exp_duty_u16=32767,
+ exp_duty_ns=0,
+)
+
+# Reconfigure frequency and dutycycle
+pwm.init(freq=10, duty_u16=49151)
+calc_dc, calc_freq = measure_signal()
+validate_signal(
+ exp_freq=10, calc_freq=calc_freq, exp_dc=75, calc_dc=calc_dc, exp_duty_u16=49151, exp_duty_ns=0
+)
+
+# Reconfigure frequency and dutycycle
+pwm.init(freq=100, duty_ns=2500000)
+calc_dc, calc_freq = measure_signal()
+validate_signal(
+ exp_freq=100,
+ calc_freq=calc_freq,
+ exp_dc=25,
+ calc_dc=calc_dc,
+ exp_duty_u16=0,
+ exp_duty_ns=2500000,
+)
+pwm.deinit()
+
+#### Negative test cases ####
+
+# PWM frequency out of range
+try:
+ pwm = PWM(pwm_pin, freq=500001, duty_u16=32767)
+except Exception as e:
+ print(e)
+
+# PWM frequency must be greater than 0
+try:
+ pwm = PWM(pwm_pin, freq=0, duty_u16=32767)
+except Exception as e:
+ print(e)
+
+# PWM duty_ns larger than period (20,000,000 ns)
+try:
+ pwm = PWM(pwm_pin, freq=50, duty_ns=25000000)
+except Exception as e:
+ print(e)
+
+# PWM duty cycle only one format should be specified
+try:
+ pwm = PWM(pwm_pin, freq=10, duty_u16=32767, duty_ns=100000)
+except Exception as e:
+ print(e)
+
+# Negative frequency
+try:
+ pwm = PWM(pwm_pin, freq=-1, duty_u16=32767)
+except Exception as e:
+ print(e)
+
+# No duty specified
+try:
+ pwm = PWM(pwm_pin, freq=100)
+except Exception as e:
+ print(e)
+
+# Non-PWM-capable pin
+try:
+ pwm = PWM("P0_0", freq=100, duty_u16=32767)
+except Exception as e:
+ print(e)
+
+#### freq getter / setter tests ####
+
+# freq_get returns the frequency set at construction (duty_u16)
+pwm = PWM(pwm_pin, freq=1000, duty_u16=32767)
+print(f"freq_get after init (duty_u16): {pwm.freq()}")
+pwm.deinit()
+
+# freq_get returns the frequency set at construction (duty_ns)
+pwm = PWM(pwm_pin, freq=500, duty_ns=1000000)
+print(f"freq_get after init (duty_ns): {pwm.freq()}")
+pwm.deinit()
+
+# freq_set changes output frequency (duty_u16, measured on hardware)
+pwm = PWM(pwm_pin, freq=10, duty_u16=32767)
+pwm.freq(50)
+calc_dc, calc_freq = measure_signal()
+validate_signal(exp_freq=50, calc_freq=calc_freq, exp_dc=50, calc_dc=calc_dc)
+pwm.deinit()
+
+# freq_set changes output frequency (duty_ns, measured on hardware)
+# duty_ns=2500000: 25% at 100 Hz -> 50% at 200 Hz (period shrinks from 10ms to 5ms)
+pwm = PWM(pwm_pin, freq=100, duty_ns=2500000)
+pwm.freq(200)
+calc_dc, calc_freq = measure_signal()
+validate_signal(exp_freq=200, calc_freq=calc_freq, exp_dc=50, calc_dc=calc_dc)
+pwm.deinit()
+
+# freq_get after freq_set returns the new frequency
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+pwm.freq(250)
+print(f"freq_get after freq_set: {pwm.freq()}")
+pwm.deinit()
+
+#### Negative freq_set tests ####
+
+# freq_set: frequency must be greater than 0
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+try:
+ pwm.freq(0)
+except Exception as e:
+ print(e)
+pwm.deinit()
+
+# freq_set: negative frequency
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+try:
+ pwm.freq(-1)
+except Exception as e:
+ print(e)
+pwm.deinit()
+
+# freq_set: frequency exceeds maximum
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+try:
+ pwm.freq(500001)
+except Exception as e:
+ print(e)
+pwm.deinit()
+
+# freq_set: duty_ns would exceed new (lower) period
+pwm = PWM(pwm_pin, freq=100, duty_ns=9000000) # 9 ms on-time, period = 10 ms
+try:
+ pwm.freq(200) # new period = 5 ms; 9 ms duty exceeds it
+except Exception as e:
+ print(e)
+pwm.deinit()
+
+#### duty_u16 getter / setter tests ####
+
+# duty_u16_get returns value set at construction
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+print(f"duty_u16_get after init: {pwm.duty_u16()}")
+pwm.deinit()
+
+# duty_u16_get converts duty_ns to u16
+# duty_ns=5000000 at 100 Hz = 50% -> u16 = 32767
+pwm = PWM(pwm_pin, freq=100, duty_ns=5000000)
+print(f"duty_u16_get from duty_ns: {pwm.duty_u16()}")
+pwm.deinit()
+
+# duty_u16_set changes output duty cycle (measured on hardware)
+# 16383 / 65536 ~= 25%
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+pwm.duty_u16(16383)
+calc_dc, calc_freq = measure_signal()
+validate_signal(exp_freq=100, calc_freq=calc_freq, exp_dc=25, calc_dc=calc_dc)
+pwm.deinit()
+
+# duty_u16_get after duty_u16_set returns the new value
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+pwm.duty_u16(16383)
+print(f"duty_u16_get after duty_u16_set: {pwm.duty_u16()}")
+pwm.deinit()
+
+#### duty_ns getter / setter tests ####
+
+# duty_ns_get returns value set at construction
+pwm = PWM(pwm_pin, freq=100, duty_ns=2500000)
+print(f"duty_ns_get after init: {pwm.duty_ns()}")
+pwm.deinit()
+
+# duty_ns_get converts duty_u16 to ns
+# duty_u16=32767 at 100 Hz: (32767+1)/65536 * 10000000 = 5000000 ns
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+print(f"duty_ns_get from duty_u16: {pwm.duty_ns()}")
+pwm.deinit()
+
+# duty_ns_set changes output duty cycle (measured on hardware)
+# 2500000 ns at 100 Hz = 25%
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+pwm.duty_ns(2500000)
+calc_dc, calc_freq = measure_signal()
+validate_signal(exp_freq=100, calc_freq=calc_freq, exp_dc=25, calc_dc=calc_dc)
+pwm.deinit()
+
+# duty_ns_get after duty_ns_set returns the new value
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+pwm.duty_ns(2500000)
+print(f"duty_ns_get after duty_ns_set: {pwm.duty_ns()}")
+pwm.deinit()
+
+#### Negative duty setter tests ####
+
+# duty_ns_set: duty exceeds period (period = 10 ms = 10000000 ns at 100 Hz)
+pwm = PWM(pwm_pin, freq=100, duty_u16=32767)
+try:
+ pwm.duty_ns(15000000)
+except Exception as e:
+ print(e)
+pwm.deinit()
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/pwm.py.exp b/tests/ports/psoc-edge/board_ext_hw/single/pwm.py.exp
new file mode 100644
index 00000000000..d81d5883dbd
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/pwm.py.exp
@@ -0,0 +1,50 @@
+*** PWM tests ***
+Expected freq matches calc freq!
+ freq: 1
+Exp dc(%) matches calc dc(%)!
+ dc: 50
+Expected freq matches calc freq!
+ freq: 10
+Exp dc(%) matches calc dc(%)!
+ dc: 75
+Expected freq matches calc freq!
+ freq: 100
+Exp dc(%) matches calc dc(%)!
+ dc: 25
+PWM frequency must not exceed 500000 Hz
+PWM frequency must be greater than 0
+PWM duty in ns is larger than the period 20000000 ns
+PWM duty should be specified only in one format
+PWM frequency must be greater than 0
+PWM duty should be specified in either ns or u16
+Pin(P0_0) doesn't exist
+freq_get after init (duty_u16): 1000
+freq_get after init (duty_ns): 500
+Expected freq matches calc freq!
+ freq: 50
+Exp dc(%) matches calc dc(%)!
+ dc: 50
+Expected freq matches calc freq!
+ freq: 200
+Exp dc(%) matches calc dc(%)!
+ dc: 50
+freq_get after freq_set: 250
+PWM frequency must be greater than 0
+PWM frequency must be greater than 0
+PWM frequency must not exceed 500000 Hz
+PWM duty in ns is larger than the period 5000000 ns
+duty_u16_get after init: 32767
+duty_u16_get from duty_ns: 32767
+Expected freq matches calc freq!
+ freq: 100
+Exp dc(%) matches calc dc(%)!
+ dc: 25
+duty_u16_get after duty_u16_set: 16383
+duty_ns_get after init: 2500000
+duty_ns_get from duty_u16: 5000000
+Expected freq matches calc freq!
+ freq: 100
+Exp dc(%) matches calc dc(%)!
+ dc: 25
+duty_ns_get after duty_ns_set: 2500000
+PWM duty in ns is larger than the period 10000000 ns
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/uart.py b/tests/ports/psoc-edge/board_ext_hw/single/uart.py
new file mode 100644
index 00000000000..35a8ef98ca8
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/uart.py
@@ -0,0 +1,154 @@
+from machine import UART
+import time
+
+uart_pins_args = {"tx": "P17_1", "rx": "P17_0"}
+uart_basic_conf = {
+ "baudrate": 9600,
+ "bits": 8,
+ "parity": None,
+ "stop": 1,
+ "timeout": 100,
+ "rxbuf": 512,
+}
+
+uart = UART(**uart_pins_args, **uart_basic_conf)
+
+# Check that reconfiguration of same UART object SCB is allowed by init()
+uart_basic_conf["baudrate"] = 115200
+uart.init(**uart_pins_args, **uart_basic_conf)
+
+
+def uart_tests():
+ # 2. Basic tests
+ ##############################################
+
+ # sendbreak()
+ uart.sendbreak()
+ time.sleep_ms(100)
+ break_received = uart.read()
+ print("Break Sent is received by Rx: ", break_received == b"\x00")
+
+ # timeout expired()
+ rx_data = uart.read()
+ print("Timeout Expired with no data received: ", rx_data == None)
+
+ # write_char()
+ # read_char()
+ uart.writechar(33)
+ time.sleep_ms(100)
+ rx_char = uart.readchar()
+ print("Tx char is received by Rx char: ", rx_char == 33)
+
+ # read()
+ tx_data = b"abcdefg"
+ tx_written = uart.write(tx_data)
+ print("Tx written bytes by write(): ", tx_written == len(tx_data))
+ time.sleep_ms(100)
+ rx_data = uart.read()
+ print("Tx is received by Rx(read()): ", rx_data == tx_data)
+
+ # readline(nbytes)
+ tx_data = "abcd\ne"
+ uart.write(tx_data)
+ time.sleep_ms(100)
+ rx_data = uart.readline()
+ print("Tx is received by Rx(readline()): ", rx_data == b"abcd\n")
+ if rx_data != b"abcd\n":
+ print("Received data:", rx_data)
+ print("Expected data:", b"abcd\n")
+ uart.read() # read all data available to clear buffer
+
+ # read(n bytes)
+ tx_data = "abcdefghijklmn"
+ uart.write(tx_data)
+ time.sleep_ms(8)
+ rx_data = uart.read(7)
+ print("Tx is received by Rx(read(nbytes)):", rx_data == b"abcdefg")
+
+ # tx_done()
+ tx_data = "abcdefg"
+ uart.write(tx_data)
+ print("Tx Ongoing: ", uart.txdone() == False)
+ time.sleep_ms(100)
+ print("Tx Done: ", uart.txdone() == True)
+ uart.read() # read all data available to clear buffer
+
+ # write(buf)
+ # readinto(buf)
+ uart_rx_buf = bytearray(8)
+ tx_data = b"\x01\x44\x17\x88\x98\x11\x34\xff"
+ uart.write(tx_data)
+ time.sleep_ms(100)
+ uart.readinto(uart_rx_buf)
+ print("Tx is received by Rx(readinto(buf)): ", uart_rx_buf == tx_data)
+
+ # read() return None when timeout expired.
+ rx_data = uart.read(1)
+ print("Rx buffer is empty, read(nbytes) returns None: ", rx_data == None)
+
+ # write()/read() large data
+ uart_rx_buf = bytearray(512)
+ tx_data = bytes([x % 256 for x in range(512)])
+ tx_written = uart.write(tx_data)
+ print("Tx written bytes by write(): ", tx_written)
+ # An added sleep here makes the last bytes to be lost.
+ read_num = uart.readinto(uart_rx_buf)
+ print("Tx is received by Rx(readinto(buf)) for large data: ", uart_rx_buf == tx_data)
+ if uart_rx_buf != tx_data:
+ print("Received data:", uart_rx_buf)
+ print("Num of bytes read:", read_num)
+ print("Expected data:", tx_data)
+
+ # Check flush() is working.
+ uart.write(tx_data)
+ # Enable the timer and change the tx_data length if you
+ # want to see the different flush time.
+ # start = time.ticks_ms()
+ print("Tx Ongoing: ", uart.txdone() == False)
+ uart.flush()
+ # print("Flush time (ms): ", time.ticks_diff(time.ticks_ms(), start))
+ print("Tx Done after flush: ", uart.txdone() == True)
+
+
+def uart_irq():
+ global handler_irq_flag
+ handler_irq_flag = False
+
+ def uart_irq_handler(arg):
+ global handler_irq_flag
+ handler_irq_flag = True
+ print(f"IRQ {event} handler called")
+
+ def wait_for_irq_handler():
+ global handler_irq_flag
+ while not handler_irq_flag:
+ time.sleep_ms(10)
+ handler_irq_flag = False
+
+ # BREAK Received check
+ event = "BREAK"
+ irq = uart.irq(handler=uart_irq_handler, trigger=(UART.IRQ_BREAK))
+ uart.sendbreak()
+ wait_for_irq_handler()
+ print("IRQ BREAK detected: ", irq.flags() & UART.IRQ_BREAK == UART.IRQ_BREAK)
+
+ # TXIDLE check
+ event = "TXIDLE"
+ uart.irq(handler=uart_irq_handler, trigger=(UART.IRQ_TXIDLE))
+ uart.write("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+ wait_for_irq_handler()
+ print("IRQ TXIDLE detected: ", irq.flags() & UART.IRQ_TXIDLE == UART.IRQ_TXIDLE)
+
+ # RXIDLE check
+ event = "RXIDLE"
+ uart.irq(handler=uart_irq_handler, trigger=(UART.IRQ_RXIDLE))
+ uart.write("1")
+ wait_for_irq_handler()
+ print("IRQ RXIDLE detected: ", irq.flags() & UART.IRQ_RXIDLE == UART.IRQ_RXIDLE)
+
+
+uart_tests()
+uart_irq()
+
+
+uart.deinit()
diff --git a/tests/ports/psoc-edge/board_ext_hw/single/uart.py.exp b/tests/ports/psoc-edge/board_ext_hw/single/uart.py.exp
new file mode 100644
index 00000000000..a9df4d08b34
--- /dev/null
+++ b/tests/ports/psoc-edge/board_ext_hw/single/uart.py.exp
@@ -0,0 +1,21 @@
+Break Sent is received by Rx: True
+Timeout Expired with no data received: True
+Tx char is received by Rx char: True
+Tx written bytes by write(): True
+Tx is received by Rx(read()): True
+Tx is received by Rx(readline()): True
+Tx is received by Rx(read(nbytes)): True
+Tx Ongoing: True
+Tx Done: True
+Tx is received by Rx(readinto(buf)): True
+Rx buffer is empty, read(nbytes) returns None: True
+Tx written bytes by write(): 512
+Tx is received by Rx(readinto(buf)) for large data: True
+Tx Ongoing: True
+Tx Done after flush: True
+IRQ BREAK handler called
+IRQ BREAK detected: True
+IRQ TXIDLE handler called
+IRQ TXIDLE detected: True
+IRQ RXIDLE handler called
+IRQ RXIDLE detected: True
diff --git a/tests/ports/psoc-edge/board_only_hw/multi/network.py b/tests/ports/psoc-edge/board_only_hw/multi/network.py
new file mode 100644
index 00000000000..c82ce31df2c
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/multi/network.py
@@ -0,0 +1,102 @@
+import time
+
+try:
+ import network
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+channel_new = 1
+ap_pass = "mpy_PSoC_w3lc0me!"
+
+
+# Access Point
+def instance0():
+ network.hostname("mpy-psoc-edge-test")
+ print("set hostname: ", network.hostname() == "mpy-psoc-edge-test")
+
+ ap_if = network.WLAN(network.AP_IF)
+ print("ap instance created")
+
+ # Generate "random" SSID to avoid test conflicts
+ time_stamp = time.time()
+ ssid_new = "mpy-psoc-edge-" + str(time_stamp)
+ multitest.globals(ssid_gen=ssid_new)
+ ap_if.config(channel=channel_new, ssid=ssid_new)
+
+ # active()
+ print("ap initially not active: ", ap_if.active() == False)
+ ap_if.active(True)
+ print("ap is activated: ", ap_if.active() == True)
+ ap_if.active(False)
+ print("ap is deactivated: ", ap_if.active() == False)
+ ap_if.active(True)
+ while ap_if.active() == False:
+ pass
+
+ # isConnected()
+ print("ap has no client: ", ap_if.isconnected() == False)
+
+ print(" > yield station")
+ multitest.next()
+
+ while ap_if.isconnected() == False:
+ pass
+ print("ap has clients: ", ap_if.isconnected() == True)
+
+ # try disconnect()
+ try:
+ ap_if.disconnect() # not for AP
+ except ValueError as err:
+ print("ap cannot disconnect: ", err)
+
+ # status()
+ stations = ap_if.status("stations")
+ print("ap status has stations: ", stations != [])
+
+
+# Station
+def instance1():
+ sta_if = network.WLAN(network.STA_IF)
+ print("sta instance created")
+
+ # active()
+ print("sta is not active: ", sta_if.active() == False)
+ sta_if.active(True)
+
+ # scan()
+ wlan_nets = sta_if.scan()
+ # The returned ssid is a bytes object
+ bytes_ssid = bytes(ssid_gen, "utf-8")
+ test_ap_net = [net for net in wlan_nets if net[0] == bytes_ssid]
+ print("sta scan finds ap wlan: ", test_ap_net != [])
+
+ wlan_ssid_filter = sta_if.scan(ssid=ssid_gen)
+ test_ap_net = [net for net in wlan_ssid_filter if net[0] == bytes_ssid]
+ print("sta scan finds ap wlan (ssid filter): ", test_ap_net != [])
+
+ # print('ap_mac: ', binascii.hexlify(ap_mac, ':'))
+
+ # isconnect()
+ print("sta is not (yet) connected: ", sta_if.isconnected() == False)
+
+ # connect()
+ sta_if.connect(ssid_gen, ap_pass)
+ print("sta attempt connection to ap")
+
+ # active()
+ print("sta is (now) active: ", sta_if.active() == True)
+
+ # isConnected()
+ print("sta is (now) connected: ", sta_if.isconnected() == True)
+
+ # status()
+ # The test boards are placed next to each other (few cm range)
+ print("sta status rssi in range: ", -70 < sta_if.status("rssi") < 10)
+
+ print(" > yield access point")
+ multitest.next()
+
+ # disconnect()
+ sta_if.disconnect()
+ print("sta is disconnected: ", sta_if.active() == False)
diff --git a/tests/ports/psoc-edge/board_only_hw/multi/network.py.exp b/tests/ports/psoc-edge/board_only_hw/multi/network.py.exp
new file mode 100644
index 00000000000..503f1b2a25d
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/multi/network.py.exp
@@ -0,0 +1,23 @@
+--- instance0 ---
+set hostname: True
+ap instance created
+ap initially not active: True
+ap is activated: True
+ap is deactivated: True
+ap has no client: True
+ > yield station
+ap has clients: True
+ap cannot disconnect: network STA required
+ap status has stations: True
+--- instance1 ---
+sta instance created
+sta is not active: True
+sta scan finds ap wlan: True
+sta scan finds ap wlan (ssid filter): True
+sta is not (yet) connected: True
+sta attempt connection to ap
+sta is (now) active: True
+sta is (now) connected: True
+sta status rssi in range: True
+ > yield access point
+sta is disconnected: True
diff --git a/tests/ports/psoc-edge/board_only_hw/multi/network_config.py b/tests/ports/psoc-edge/board_only_hw/multi/network_config.py
new file mode 100644
index 00000000000..e4c3c51609f
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/multi/network_config.py
@@ -0,0 +1,106 @@
+import time
+
+try:
+ import network
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+# Avoid importing random (not available on all minimal builds).
+channel_new = int(time.time()) % 5 + 1
+pass_new = "alicessecret"
+sec_new = network.WLAN.WPA2
+ssid_prefix = "mpy-psoc-edge-test-"
+
+ap_ip = "10.20.0.1"
+gateway_ip = ap_ip
+netmask_ip = "255.255.255.128"
+dns_ip = "0.0.0.0"
+ap_net_conf = (ap_ip, netmask_ip, gateway_ip, dns_ip)
+
+
+# Access Point
+def instance0():
+ ap_if = network.WLAN(network.AP_IF)
+ print("ap instance created")
+
+ # get config()
+ ap_if.config(channel=channel_new)
+ print("ap config get channel: ", ap_if.config("channel") == channel_new)
+
+ # Generate "random" SSID to avoid test conflicts
+ # Keep SSID short and deterministic to avoid truncation issues.
+ time_stamp = int(time.time()) % 100000
+ ssid_new = ssid_prefix + str(time_stamp)
+ multitest.globals(ssid_gen=ssid_new)
+ ap_if.config(ssid=ssid_new)
+ print("ap config get ssid: ", ap_if.config("ssid") == ssid_new)
+
+ ap_if.config(security=sec_new, key=pass_new)
+ print("ap config get security: ", ap_if.config("security") == sec_new)
+ try:
+ ap_if.config("password") # only if default
+ except ValueError as err:
+ print(err)
+
+ # active()
+ ap_if.active(True)
+ while ap_if.active() == False:
+ pass
+ print("ap is activated")
+
+ # set ifconfig()
+ ap_if.ifconfig(ap_net_conf)
+
+ # get ifconfig()
+ print("ap ip settings: ", ap_if.ifconfig() == ap_net_conf)
+
+ print(" > yield station")
+ multitest.next()
+
+ while ap_if.isconnected() == False:
+ pass
+ print("ap has clients: ", ap_if.isconnected() == True)
+
+ # status()
+ stations = ap_if.status("stations")
+ print("ap status has stations: ", stations != [])
+
+ print(ap_if)
+
+
+# Station
+def instance1():
+ sta_if = network.WLAN(network.STA_IF)
+ print("sta instance created")
+
+ # connect()
+ sta_if.connect(ssid_gen, pass_new)
+ print("sta attempt connection to ap")
+
+ # active()
+ print("sta is (now) active: ", sta_if.active() == True)
+
+ # isConnected()
+ print("sta is (now) connected: ", sta_if.isconnected() == True)
+
+ # config()
+ print("sta assoc ap channel config: ", sta_if.config("channel") == channel_new)
+ print("sta assoc ap ssid config: ", sta_if.config("ssid") == ssid_gen)
+ print("sta assoc ap security config: ", sta_if.config("security") == sec_new)
+
+ try:
+ sta_if.config("key") # not for STA
+ except ValueError as err:
+ print(err)
+
+ # ifconfig()
+ sta_net_conf = ("10.20.0.2", netmask_ip, ap_ip, ap_ip)
+ print("sta ip settings: ", sta_if.ifconfig() == sta_net_conf)
+
+ try:
+ sta_if.ifconfig(sta_net_conf) # not for STA
+ except ValueError as err:
+ print(err)
+
+ print(sta_if)
diff --git a/tests/ports/psoc-edge/board_only_hw/multi/network_config.py.exp b/tests/ports/psoc-edge/board_only_hw/multi/network_config.py.exp
new file mode 100644
index 00000000000..7985c2ac8e8
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/multi/network_config.py.exp
@@ -0,0 +1,24 @@
+--- instance0 ---
+ap instance created
+ap config get channel: True
+ap config get ssid: True
+ap config get security: True
+network conf password only queryable for default password
+ap is activated
+ap ip settings: True
+ > yield station
+ap has clients: True
+ap status has stations: True
+
+--- instance1 ---
+sta instance created
+sta attempt connection to ap
+sta is (now) active: True
+sta is (now) connected: True
+sta assoc ap channel config: True
+sta assoc ap ssid config: True
+sta assoc ap security config: True
+network access point required
+sta ip settings: True
+network access point required
+
diff --git a/tests/ports/psoc-edge/board_only_hw/single/flash.py b/tests/ports/psoc-edge/board_only_hw/single/flash.py
new file mode 100644
index 00000000000..1c18b67c1bf
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/flash.py
@@ -0,0 +1,53 @@
+import os
+import psoc_edge
+
+# Try to mount the filesystem, and format the flash if it doesn't exist.
+# Create block device object for QSPI flash
+bdev = psoc_edge.QSPI_Flash()
+
+# Unmount the filesystem in case it's already mounted
+try:
+ os.umount("/")
+except:
+ pass
+
+test_string = "This is a test string."
+long_test_string = "This is a very long string. And as a long string that it is, it is only getting longer and longer and the string goes. How long shall it be? Well, not really sure, but let´s try it like this."
+
+# Test LFS2 filesystem
+if "VfsLfs2" in dir(os):
+ # sector size 4 KB for external QSPI flash
+ read_size = 0x1000
+ # page size 256 B for QSPI flash
+ write_size = 0x100
+
+ # Create a LFS2 fs and mount it, else format and mount it
+ try:
+ vfs = os.VfsLfs2(bdev, progsize=write_size, readsize=read_size)
+ os.mount(vfs, "/")
+ except:
+ os.VfsLfs2.mkfs(bdev, progsize=write_size, readsize=read_size)
+ vfs = os.VfsLfs2(bdev, progsize=write_size, readsize=read_size)
+ os.mount(vfs, "/")
+
+ # Open a file and do some operation
+ f = open("/test_lfs2.txt", "w")
+ f.write(test_string)
+ f.close()
+
+ # Read back the contents
+ f = open("/test_lfs2.txt", "r")
+ if f.read() == test_string:
+ print("Test successful")
+ f.close()
+
+ # Open a file and do some operation
+ f = open("/test_lfs2_2.txt", "w")
+ f.write(long_test_string)
+ f.close()
+
+ # Read back the contents
+ f = open("/test_lfs2_2.txt", "r")
+ if f.read() == long_test_string:
+ print("Test successful")
+ f.close()
diff --git a/tests/ports/psoc-edge/board_only_hw/single/flash.py.exp b/tests/ports/psoc-edge/board_only_hw/single/flash.py.exp
new file mode 100644
index 00000000000..37236d726f8
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/flash.py.exp
@@ -0,0 +1,2 @@
+Test successful
+Test successful
diff --git a/tests/ports/psoc-edge/board_only_hw/single/ipc.py b/tests/ports/psoc-edge/board_only_hw/single/ipc.py
new file mode 100644
index 00000000000..829b83c1b4c
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/ipc.py
@@ -0,0 +1,64 @@
+import time
+from machine import IPC
+
+# ---------------------------------------------------------------------------
+# IPC ping-pong test -- 2 independent services on one endpoint
+#
+# Each service has its own client_id on both sides:
+# Service 1: CM33 client_id=3 <--> CM55 client_id=5
+# Service 2: CM33 client_id=4 <--> CM55 client_id=6
+#
+# Both CM33 clients are registered on the same endpoint (EP_ADDR=1),
+# demonstrating how multiple independent services share one IPC endpoint.
+# ---------------------------------------------------------------------------
+
+ipc = IPC(src_core=IPC.CM33, target_core=IPC.CM55)
+ipc.init()
+
+# Per-service echo state
+svc1 = {"received": False, "cmd": None} # Service 1
+svc2 = {"received": False, "cmd": None} # Service 2
+
+
+def svc1_cb(client):
+ svc1["received"] = True
+ svc1["cmd"] = client.cmd
+
+
+def svc2_cb(client):
+ svc2["received"] = True
+ svc2["cmd"] = client.cmd
+
+
+# Register both services on CM33's endpoint (EP_ADDR=1)
+r1 = ipc.register_client(3, svc1_cb, 1, 1) # Service 1 -- CM33 client_id=3
+print("Service1 registered:", r1)
+time.sleep_ms(100)
+r2 = ipc.register_client(4, svc2_cb, 1, 1) # Service 2 -- CM33 client_id=4
+print("Service2 registered:", r2)
+time.sleep_ms(100)
+
+print("\n")
+# Boot CM55
+ipc.enable_core(IPC.CM55)
+print("CM55 enabled successfully \n")
+time.sleep(1) # Allow CM55 to complete initialisation
+
+
+def ipc_test(cmd, cm55_client, label, state):
+ """Send cmd to the given CM55 client and verify the echo arrives in state."""
+ state["received"] = False
+ ipc.send(cmd, 0, cm55_client)
+ print("Sent cmd=0x{:02X} to CM55 client_id={}".format(cmd, cm55_client))
+ deadline = 3000 # ms
+ while not state["received"] and deadline > 0:
+ time.sleep_ms(10)
+ deadline -= 10
+ if state["received"] and state["cmd"] == cmd:
+ print("PASS: {} received; cmd=0x{:02X}".format(label, state["cmd"]))
+ else:
+ print("FAIL: {} echo not received".format(label))
+
+
+ipc_test(IPC.CMD_START, 5, "Service1 CMD_START", svc1) # CM55 client_id=5
+ipc_test(IPC.CMD_STOP, 6, "Service2 CMD_STOP", svc2) # CM55 client_id=6
diff --git a/tests/ports/psoc-edge/board_only_hw/single/ipc.py.exp b/tests/ports/psoc-edge/board_only_hw/single/ipc.py.exp
new file mode 100644
index 00000000000..b78c6330b90
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/ipc.py.exp
@@ -0,0 +1,14 @@
+IPC initialized successfully
+[CM33] -> Registered client with ID: 3 successfully
+Service1 registered: True
+[CM33] -> Registered client with ID: 4 successfully
+Service2 registered: True
+
+
+Enabling CM55 core at boot address: 0x60580400
+CM55 enabled successfully
+
+Sent cmd=0x82 to CM55 client_id=5
+PASS: Service1 CMD_START received; cmd=0x82
+Sent cmd=0x83 to CM55 client_id=6
+PASS: Service2 CMD_STOP received; cmd=0x83
diff --git a/tests/ports/psoc-edge/board_only_hw/single/rtc.py b/tests/ports/psoc-edge/board_only_hw/single/rtc.py
new file mode 100644
index 00000000000..4048a1253cc
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/rtc.py
@@ -0,0 +1,139 @@
+# import machine
+from machine import RTC
+import time
+
+# PSoC Edge RTC test compatibility notes:
+# 1) Weekday is auto-calculated by RTC hardware, so datetime checks ignore wday.
+# 2) rtc.irq() trigger uses alarm 0 (RTC.ALARM0).
+# 3) After one-shot expiry, rtc.alarm_left() may raise ValueError (alarm no longer set).
+# 4) Periodic mode is valid only for millisecond alarm input, not datetime tuple.
+
+IRQ_COUNTER = 0
+ONE_SHOT_ALARM = 0
+PERIODIC_ALARM = 1
+
+# Tuple format: Year, Month, Sec, WDay*, Hour, Min, Sec, Subsec=0
+# *Note: User cannot set a wrong week day value here. PSoC always calculates the right weekday using rest of the fields.
+initial_dtime = (2023, 1, 1, 0, 0, 0, 0, 0)
+
+
+def same_datetime_ignoring_wday(lhs, rhs):
+ return (
+ lhs[0] == rhs[0]
+ and lhs[1] == rhs[1]
+ and lhs[2] == rhs[2]
+ and lhs[4] == rhs[4]
+ and lhs[5] == rhs[5]
+ and lhs[6] == rhs[6]
+ )
+
+
+def cback(event):
+ global IRQ_COUNTER
+ IRQ_COUNTER += 1
+
+
+def check_rtc_mem_write():
+ mem_set = b"rtc_mem_psoc_edge"
+ rtc.memory(mem_set)
+ mem_get = rtc.memory()
+ print("\nRTC memory readback success : ", mem_get == mem_set)
+ print("RTC memory bytes : ", mem_get)
+
+
+def reset_rtc():
+ rtc.deinit()
+ default_datetime = (2015, 1, 1, 4, 0, 0, 0, 0)
+ print("\nRTC reset done: ", same_datetime_ignoring_wday(default_datetime, rtc.now()))
+
+
+def set_alarm_ms(rtc, alarm_type, period_ms):
+ rtc.datetime(initial_dtime)
+ rtc_irq = rtc.irq(handler=cback)
+ rtc.alarm(period_ms, repeat=alarm_type)
+
+
+def set_alarm_datetime(rtc, alarm_type, datetime):
+ rtc.datetime(initial_dtime)
+ rtc_irq = rtc.irq(trigger=RTC.ALARM0, handler=cback)
+ rtc.alarm(datetime, repeat=alarm_type)
+
+
+def wait_for_cback(timeout, exp_counter):
+ global IRQ_COUNTER
+ start = time.ticks_ms()
+ while IRQ_COUNTER < exp_counter:
+ time.sleep_ms(5)
+ if time.ticks_diff(time.ticks_ms(), start) > cback_call_wait_time:
+ break
+
+
+print("*** RTC Tests ***")
+rtc = RTC()
+
+rtc.init(initial_dtime)
+print("\nRTC init successful: \t", same_datetime_ignoring_wday(rtc.datetime(), initial_dtime))
+
+# Make sure that 1 second passes correctly
+exp_dtime = (2023, 1, 1, 0, 0, 0, 1, 0)
+rtc.datetime((2023, 1, 1, 0, 0, 0, 0, 0))
+time.sleep_ms(1008)
+print("\ndatetime is accurate: \t", same_datetime_ignoring_wday(rtc.now(), exp_dtime))
+
+print("\n1. Setting periodic short alarm to be triggered repeatedly in few ms in future")
+timeout = 1000
+cback_call_wait_time = timeout + 200
+set_alarm_ms(rtc, PERIODIC_ALARM, timeout)
+print("Alarm period set to (ms): ", rtc.alarm_left())
+wait_for_cback(cback_call_wait_time, 1)
+print("Alarm expired : ", IRQ_COUNTER == 1)
+print("Alarm set again...")
+wait_for_cback(cback_call_wait_time, 2)
+print("Alarm expired : ", IRQ_COUNTER == 2)
+rtc.cancel()
+wait_for_cback(cback_call_wait_time, 2)
+print("Alarm cancelled successfully : ", IRQ_COUNTER == 2)
+IRQ_COUNTER = 0
+
+print("\n2. Setting one-shot short alarm to be triggered in few ms in future")
+timeout = 1000
+cback_call_wait_time = timeout + 500
+set_alarm_ms(rtc, ONE_SHOT_ALARM, timeout)
+wait_for_cback(cback_call_wait_time, 1)
+try:
+ alarm_left_val = rtc.alarm_left()
+ alarm_expired = alarm_left_val == 0
+except ValueError:
+ alarm_expired = True
+print("Alarm expired : ", alarm_expired)
+print("Entered Cback :", IRQ_COUNTER == 1)
+IRQ_COUNTER = 0
+
+print("\n3. Setting one-shot alarm to be triggered at specified date-time")
+timeout = 1
+cback_call_wait_time = timeout * 1000 + 1500
+set_alarm_datetime(rtc, ONE_SHOT_ALARM, (2023, 1, 1, 0, 0, 0, 1, 0))
+wait_for_cback(cback_call_wait_time, 1)
+try:
+ alarm_left_val = rtc.alarm_left()
+ alarm_expired = alarm_left_val == 0
+except ValueError:
+ alarm_expired = True
+print("Alarm expired : ", alarm_expired)
+print("Entered Cback :", IRQ_COUNTER == 1)
+IRQ_COUNTER = 0
+
+print("\n4. Setting periodic alarm to be triggered at specified date-time should fail")
+try:
+ set_alarm_datetime(rtc, PERIODIC_ALARM, (2023, 1, 1, 0, 0, 0, 1, 0)) # Should fail
+except ValueError as e:
+ print(e)
+
+IRQ_COUNTER = 0
+
+rtc1 = RTC()
+print("\n5.RTC constructor return singleton: ", rtc1 == rtc)
+
+reset_rtc()
+
+check_rtc_mem_write()
diff --git a/tests/ports/psoc-edge/board_only_hw/single/rtc.py.exp b/tests/ports/psoc-edge/board_only_hw/single/rtc.py.exp
new file mode 100644
index 00000000000..c5ae7f46ea4
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/rtc.py.exp
@@ -0,0 +1,30 @@
+*** RTC Tests ***
+
+RTC init successful: True
+
+datetime is accurate: True
+
+1. Setting periodic short alarm to be triggered repeatedly in few ms in future
+Alarm period set to (ms): 1000
+Alarm expired : True
+Alarm set again...
+Alarm expired : True
+Alarm cancelled successfully : True
+
+2. Setting one-shot short alarm to be triggered in few ms in future
+Alarm expired : True
+Entered Cback : True
+
+3. Setting one-shot alarm to be triggered at specified date-time
+Alarm expired : True
+Entered Cback : True
+
+4. Setting periodic alarm to be triggered at specified date-time should fail
+invalid argument(s) value
+
+5.RTC constructor return singleton: True
+
+RTC reset done: True
+
+RTC memory readback success : True
+RTC memory bytes : b'rtc_mem_psoc_edge'
diff --git a/tests/ports/psoc-edge/board_only_hw/single/rtc_memory_write_check.py b/tests/ports/psoc-edge/board_only_hw/single/rtc_memory_write_check.py
new file mode 100644
index 00000000000..50b1b0282c8
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/rtc_memory_write_check.py
@@ -0,0 +1,9 @@
+from machine import RTC
+
+print("*** RTC memory write test ***")
+rtc = RTC()
+expected = b"rtc_mem_psoc_edge"
+print(
+ "\nRTC memory retrieved post soft-reset is same as previously set : ",
+ rtc.memory() == expected,
+)
diff --git a/tests/ports/psoc-edge/board_only_hw/single/rtc_memory_write_check.py.exp b/tests/ports/psoc-edge/board_only_hw/single/rtc_memory_write_check.py.exp
new file mode 100644
index 00000000000..711f1c69ae3
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/rtc_memory_write_check.py.exp
@@ -0,0 +1,3 @@
+*** RTC memory write test ***
+
+RTC memory retrieved post soft-reset is same as previously set : True
diff --git a/tests/ports/psoc-edge/board_only_hw/single/tcpwm.py b/tests/ports/psoc-edge/board_only_hw/single/tcpwm.py
new file mode 100644
index 00000000000..5384a94b398
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/tcpwm.py
@@ -0,0 +1,57 @@
+from machine import PWM, Timer
+
+
+def timer_noop_cb(timer):
+ pass
+
+
+print("*****TCPWM Ownership/Conflict Tests*****")
+
+# A new PWM wants to use a TCPWM instance used by another PWM on the same pin.
+pwm_owner = PWM("P16_1", freq=1, duty_u16=32767)
+try:
+ pwm_conflict = PWM("P16_1", freq=1, duty_u16=32767)
+except Exception as e:
+ print("pwm_vs_pwm_same_pin_conflict:", e)
+finally:
+ pwm_owner.deinit()
+
+# A new PWM wants to use a TCPWM instance used by a Timer.
+# P16_2 uses TCPWM0 counter 2, which is now used by Timer(2).
+timer_owner = Timer(2, period=10000, mode=Timer.PERIODIC, callback=timer_noop_cb)
+try:
+ pwm_conflict = PWM("P16_2", freq=100, duty_u16=32767)
+except Exception as e:
+ print("pwm_vs_timer_conflict:", e)
+else:
+ # With fallback allocation enabled, PWM should use another available LINE counter.
+ print("pwm_vs_timer_conflict: no conflict (fallback counter allocated)")
+ pwm_conflict.deinit()
+finally:
+ timer_owner.deinit()
+
+# A new PWM wants to use a TCPWM instance used by Timers, and all fallback
+# counters on the pin are already occupied.
+# P16_2 exposes LINE counters 2 and 258. Reserve both via Timer(2) and Timer(10).
+timer_owner_a = Timer(2, period=10000, mode=Timer.PERIODIC, callback=timer_noop_cb)
+timer_owner_b = Timer(10, period=10, mode=Timer.PERIODIC, callback=timer_noop_cb)
+try:
+ pwm_conflict = PWM("P16_2", freq=100, duty_u16=32767)
+except Exception as e:
+ print("pwm_vs_timer_conflict_all_counters:", e)
+else:
+ print("pwm_vs_timer_conflict_all_counters: no conflict (unexpected)")
+ pwm_conflict.deinit()
+finally:
+ timer_owner_b.deinit()
+ timer_owner_a.deinit()
+
+# Constructor check for Timer/PWM ownership conflict on the same TCPWM instance.
+pwm_owner = PWM("P16_2", freq=100, duty_u16=32767)
+try:
+ try:
+ Timer(2, period=1000, mode=Timer.ONE_SHOT, callback=timer_noop_cb)
+ except ValueError as e:
+ print("timer_vs_pwm_conflict:", e)
+finally:
+ pwm_owner.deinit()
diff --git a/tests/ports/psoc-edge/board_only_hw/single/tcpwm.py.exp b/tests/ports/psoc-edge/board_only_hw/single/tcpwm.py.exp
new file mode 100644
index 00000000000..bede1eed331
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/tcpwm.py.exp
@@ -0,0 +1,5 @@
+*****TCPWM Ownership/Conflict Tests*****
+pwm_vs_pwm_same_pin_conflict: PWM instance for Pin P16_1 already exists, call deinit() first
+pwm_vs_timer_conflict: no conflict (fallback counter allocated)
+pwm_vs_timer_conflict_all_counters: No free TCPWM counter is available for Pin P16_2
+timer_vs_pwm_conflict: TCPWM0 counter 2 is already in use by another Timer or PWM instance
diff --git a/tests/ports/psoc-edge/board_only_hw/single/time.py b/tests/ports/psoc-edge/board_only_hw/single/time.py
new file mode 100644
index 00000000000..f520a67c9af
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/time.py
@@ -0,0 +1,176 @@
+import time
+
+
+def test_ticks_ms():
+ print("\n***** Test 1: ticks_ms() *****\n")
+ t0 = time.ticks_ms()
+ time.sleep_ms(1)
+ t1 = time.ticks_ms()
+ diff = time.ticks_diff(t1, t0)
+ tick_val = [
+ t0,
+ t1,
+ diff,
+ 0 <= diff <= 2,
+ ] # allow up to 2ms: FreeRTOS 1ms tick can add one extra tick
+ if tick_val[3]:
+ print("Status: PASS")
+ else:
+ print("Status: FAIL")
+
+
+def test_ticks_us():
+ print("\n***** Test 2: ticks_us() *****\n")
+ t0 = time.ticks_us()
+ time.sleep_us(1)
+ t1 = time.ticks_us()
+ diff = time.ticks_diff(t1, t0)
+ tick_val = [t0, t1, diff, 0 <= diff <= 500]
+ if tick_val[3]:
+ print("Status: PASS")
+ else:
+ print("Status: FAIL")
+
+
+def test_ticks_cpu():
+ # ticks_cpu may not be implemented, at least make sure it doesn't decrease'''
+ print("\n***** Test 3: ticks_cpu() *****\n")
+ t0 = time.ticks_cpu()
+ time.sleep_us(1)
+ t1 = time.ticks_cpu()
+ diff = time.ticks_diff(t1, t0)
+ tick_val = [t0, t1, diff, diff >= 0]
+ if tick_val[3]:
+ print("Status: PASS")
+ else:
+ print("Status: FAIL")
+
+
+def test_boundary_us_cond():
+ print("\n***** Test 4: Checking boundary conditions *****\n")
+ max_tick = 15000000
+ tick_var = []
+ for i in range(1, 11):
+ t0 = time.ticks_us()
+ time.sleep_us(max_tick - t0)
+ t1 = time.ticks_us()
+ diff = time.ticks_diff(t1, t0)
+ tick_val = [t0, t1, diff, diff >= 0]
+ tick_var.append(tick_val)
+
+ # At least 7 out of 10 should pass
+ pass_count = 0
+ for i in range(0, 10):
+ if tick_var[i][3]:
+ pass_count += 1
+
+ if pass_count >= 7:
+ print("PASS")
+ else:
+ print("FAIL")
+
+
+def test_us_deviation():
+ print("\n***** Test 5: Checking wrap around condition *****\n")
+ for i in range(150):
+ t0 = time.ticks_us()
+ time.sleep_us(i)
+ t1 = time.ticks_us()
+ print("[instant, t0, t1, diff] : [", i, t0, t1, time.ticks_diff(t1, t0), "]")
+
+
+def test_time_time_vs_time_ns():
+ print("\n***** Test 6: time() vs time_ns() *****\n")
+ # Retry a few times to avoid second-boundary races between the two calls.
+ match = True
+ for _ in range(5):
+ # t_ns = time.time_ns()
+ # t_s = time.time()
+ if int(time.time_ns() // 1_000_000_000) != time.time():
+ match = False
+ print(
+ "time() and time_ns() mismatch: time()=",
+ time.time(),
+ " time_ns()=",
+ time.time_ns(),
+ )
+ time.sleep_ms(1)
+
+ if match:
+ print("Status: PASS")
+ else:
+ print("Status: FAIL")
+
+
+def test_time_ns_strictly_monotonic():
+ print("\n***** Test 7: time_ns() strict monotonicity *****\n")
+ prev = time.time_ns()
+ monotonic = True
+ for _ in range(50):
+ cur = time.time_ns()
+ if cur <= prev:
+ monotonic = False
+ break
+ prev = cur
+
+ if monotonic:
+ print("Status: PASS")
+ else:
+ print("Status: FAIL")
+
+
+def test_time_elapsed_matches_delay():
+ print("\n***** Test 8: Delay vs elapsed time *****\n")
+ delays_ms = [20, 50, 100, 250]
+
+ # Use second-scale delays to validate elapsed time with time().
+ delays_s = [1, 2]
+
+ # Tolerance is intentionally relaxed for scheduler/clock granularity variance.
+ tolerance_ns = 1_000_000 # 1 ms tolerance for time_ns()
+ tolerance_s = 1
+
+ all_ok = True
+ for delay_ms in delays_ms:
+ t0_ns = time.time_ns()
+ time.sleep_ms(delay_ms)
+ t1_ns = time.time_ns()
+
+ elapsed_ns = t1_ns - t0_ns
+ target_ns = delay_ms * 1_000_000
+
+ ns_ok = (elapsed_ns >= target_ns - tolerance_ns) and (
+ elapsed_ns <= target_ns + tolerance_ns
+ )
+
+ if not ns_ok:
+ all_ok = False
+ print("Delay(ms)=", delay_ms, " elapsed_ns=", elapsed_ns, " -> FAIL")
+
+ for delay_s in delays_s:
+ t0_s = time.time()
+ time.sleep(delay_s)
+ t1_s = time.time()
+
+ elapsed_s = t1_s - t0_s
+ s_ok = (elapsed_s >= delay_s) and (elapsed_s <= delay_s + tolerance_s)
+
+ if not s_ok:
+ all_ok = False
+ print("Delay(s)=", delay_s, " elapsed_s=", elapsed_s, " -> FAIL")
+
+ if all_ok:
+ print("Status: PASS")
+ else:
+ print("Status: FAIL")
+
+
+test_ticks_ms()
+test_ticks_us()
+test_ticks_cpu()
+test_boundary_us_cond()
+test_time_time_vs_time_ns()
+test_time_ns_strictly_monotonic()
+test_time_elapsed_matches_delay()
+# Enable this test only if needed for advanced checking
+# test_us_deviation()
diff --git a/tests/ports/psoc-edge/board_only_hw/single/time.py.exp b/tests/ports/psoc-edge/board_only_hw/single/time.py.exp
new file mode 100644
index 00000000000..c2a1c90b5a6
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/time.py.exp
@@ -0,0 +1,28 @@
+
+***** Test 1: ticks_ms() *****
+
+Status: PASS
+
+***** Test 2: ticks_us() *****
+
+Status: PASS
+
+***** Test 3: ticks_cpu() *****
+
+Status: PASS
+
+***** Test 4: Checking boundary conditions *****
+
+PASS
+
+***** Test 6: time() vs time_ns() *****
+
+Status: PASS
+
+***** Test 7: time_ns() strict monotonicity *****
+
+Status: PASS
+
+***** Test 8: Delay vs elapsed time *****
+
+Status: PASS
diff --git a/tests/ports/psoc-edge/board_only_hw/single/timer.py b/tests/ports/psoc-edge/board_only_hw/single/timer.py
new file mode 100644
index 00000000000..fc07d4ee52f
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/timer.py
@@ -0,0 +1,260 @@
+from machine import Timer
+import time
+
+oneshot_triggered = False
+periodic_triggered = False
+
+
+# Callback functions for the timers to set the respective flags when triggered.
+def call_oneshot(timer):
+ global oneshot_triggered
+ oneshot_triggered = True
+
+
+# Callback function for the periodic timer to set the respective flag when triggered.
+def call_periodic(timer):
+ global periodic_triggered
+ periodic_triggered = True
+
+
+# Oneshot timer
+def test_oneshot():
+ # Oneshot timer
+ global oneshot_triggered
+ tim_oneshot = Timer(0, period=1000, mode=Timer.ONE_SHOT, callback=call_oneshot)
+
+ try:
+ # Wait for 5 seconds
+ for i in range(5):
+ time.sleep(1)
+ if oneshot_triggered:
+ print("Oneshot timer triggered")
+ oneshot_triggered = False
+ finally:
+ tim_oneshot.deinit() # Deinitialize the Oneshot timer
+
+
+# Periodic timer
+def test_periodic():
+ # Periodic timer
+ global periodic_triggered
+ tim_periodic = Timer(1, period=1000, mode=Timer.PERIODIC, callback=call_periodic)
+
+ try:
+ # Wait for 10 seconds
+ for i in range(10):
+ time.sleep(1)
+ if periodic_triggered:
+ print("Periodic timer triggered")
+ periodic_triggered = False
+ finally:
+ tim_periodic.deinit() # Deinitialize the periodic timer
+
+
+# Test that multiple timers can operate simultaneously without interference, and that their callbacks are triggered as expected.
+def test_multiple_timers():
+ global oneshot_triggered
+ global periodic_triggered
+ # Multiple timers
+ tim_oneshot = Timer(0, period=1000, mode=Timer.ONE_SHOT, callback=call_oneshot)
+ tim_periodic = Timer(1, period=3500, mode=Timer.PERIODIC, callback=call_periodic)
+
+ try:
+ # Wait for 10 seconds
+ for i in range(10):
+ time.sleep(1)
+ if oneshot_triggered:
+ print("Oneshot timer triggered")
+ oneshot_triggered = False
+ if periodic_triggered:
+ print("Periodic timer triggered")
+ periodic_triggered = False
+ finally:
+ tim_oneshot.deinit() # Deinitialize the Oneshot timer
+ tim_periodic.deinit() # Deinitialize the periodic timer
+
+
+# Helper function to execute a test function and print the expected ValueError message.
+def expect_value_error(label, fn):
+ try:
+ fn()
+ except ValueError as e:
+ print(label, e)
+
+
+def test_frequency_input():
+ global oneshot_triggered
+ tim_freq = Timer(2, freq=2, mode=Timer.ONE_SHOT, callback=call_oneshot)
+
+ try:
+ for i in range(3):
+ time.sleep(1)
+ if oneshot_triggered:
+ print("Frequency-based timer triggered")
+ oneshot_triggered = False
+ break
+ finally:
+ tim_freq.deinit()
+
+ # Verify Timer ID 3 (counter 3) can be constructed and deinitialized.
+ tim_id3 = Timer(3, period=100, mode=Timer.ONE_SHOT, callback=call_oneshot)
+ tim_id3.deinit()
+
+
+# Negative test cases to validate that invalid parameters raise ValueError as expected.
+def test_negative_cases():
+ print("*****Negative Timer Parameter Tests*****")
+
+ # Constructor boundary checks for invalid timer IDs.
+ expect_value_error(
+ "invalid_id_-1:",
+ lambda: Timer(-1, period=1000, mode=Timer.ONE_SHOT, callback=call_oneshot),
+ )
+ expect_value_error(
+ "invalid_id_32:",
+ lambda: Timer(32, period=1000, mode=Timer.ONE_SHOT, callback=call_oneshot),
+ )
+
+ # Group-1 timer IDs (e.g. 8) are valid, but period is constrained by 16-bit counter width.
+ expect_value_error(
+ "id_8_16bit_limit:",
+ lambda: Timer(8, period=1000, mode=Timer.ONE_SHOT, callback=call_oneshot),
+ )
+
+ # Constructor check for duplicate object creation on the same Timer ID.
+ tdup = Timer(2, period=10000, mode=Timer.ONE_SHOT, callback=call_oneshot)
+ try:
+ expect_value_error(
+ "timer_vs_timer_conflict:",
+ lambda: Timer(2, period=1000, mode=Timer.ONE_SHOT, callback=call_oneshot),
+ )
+ finally:
+ tdup.deinit()
+
+ # Exercise init() validation paths without consuming additional timer IDs.
+ tim = Timer(0)
+ try:
+ expect_value_error(
+ "invalid_mode:", lambda: tim.init(mode=99, period=1000, callback=call_oneshot)
+ )
+ expect_value_error(
+ "invalid_callback:", lambda: tim.init(mode=Timer.ONE_SHOT, period=1000, callback=1)
+ )
+ expect_value_error(
+ "freq_zero:", lambda: tim.init(mode=Timer.ONE_SHOT, freq=0, callback=call_oneshot)
+ )
+ expect_value_error(
+ "period_zero:", lambda: tim.init(mode=Timer.ONE_SHOT, period=0, callback=call_oneshot)
+ )
+ expect_value_error(
+ "missing_freq_period:", lambda: tim.init(mode=Timer.ONE_SHOT, callback=call_oneshot)
+ )
+ expect_value_error(
+ "period_ticks_zero:",
+ lambda: tim.init(mode=Timer.ONE_SHOT, freq=2000000, callback=call_oneshot),
+ )
+ finally:
+ tim.deinit()
+
+
+# Test that a timer can be recreated after deinitialization, which should succeed without error.
+def test_recreate_after_deinit():
+ tim = Timer(0, period=10000, mode=Timer.ONE_SHOT, callback=call_oneshot)
+ tim.deinit()
+
+ tim_new = Timer(0, period=10000, mode=Timer.ONE_SHOT, callback=call_oneshot)
+ tim_new.deinit()
+ print("Recreate Timer(0) after deinit: OK")
+
+
+def print_result(name, ok):
+ print("{}: {}".format(name, "OK" if ok else "FAIL"))
+
+
+# Test hard parameter behavior.
+def test_hard_parameter_checks():
+ print("*****Timer hard Parameter Tests*****")
+
+ # 1) hard defaults to False (soft callback path).
+ soft_events = []
+
+ def cb_soft(timer):
+ # callback with list append works.
+ soft_events.append(1)
+
+ tim_soft = Timer(0, period=50, mode=Timer.PERIODIC, callback=cb_soft)
+ try:
+ time.sleep_ms(250)
+ finally:
+ tim_soft.deinit()
+ print_result("default_soft", len(soft_events) > 0)
+
+ # 2) hard=True should execute callback successfully.
+ # TRhis test case will be commented out until the hard callback path is implemented.
+ # The test case also validates that when hard=True,
+ # the callback is executed in hard IRQ context where heap allocations are not allowed
+
+ # reserves a small emergency buffer so exceptions in
+ # interrupt/hard-IRQ context can still be created and reported safely.
+ # micropython.alloc_emergency_exception_buf(100)
+ # hard_seen = False
+
+ # def cb_hard(timer):
+ # nonlocal hard_seen
+ # try:
+ # # Any heap allocation in hard IRQ context should raise MemoryError.
+ # _ = bytearray(1)
+ # except MemoryError:
+ # hard_seen = True
+ # return
+
+ # tim_hard = Timer(1, period=50, mode=Timer.PERIODIC, callback=cb_hard, hard=True)
+ # try:
+ # time.sleep_ms(250)
+ # finally:
+ # tim_hard.deinit()
+ # print_result("hard_true tested", hard_seen)
+
+ # 3) hard must be bool.
+ try:
+ Timer(2, period=100, mode=Timer.ONE_SHOT, callback=call_oneshot, hard=1)
+ print_result("hard_bool_validation", False)
+ except ValueError:
+ print_result("hard_bool_validation", True)
+ except Exception:
+ print_result("hard_bool_validation", False)
+
+ # 4) hard accepts both bool values.
+ hard_false_ok = False
+ hard_true_ok = False
+
+ try:
+ t_bool = Timer(2, period=200, mode=Timer.ONE_SHOT, callback=call_oneshot, hard=False)
+ t_bool.deinit()
+ hard_false_ok = True
+ except Exception:
+ hard_false_ok = False
+
+ try:
+ t_bool = Timer(2, period=200, mode=Timer.ONE_SHOT, callback=call_oneshot, hard=True)
+ t_bool.deinit()
+ hard_true_ok = True
+ except Exception:
+ hard_true_ok = False
+
+ print_result("hard_bool_values", hard_false_ok and hard_true_ok)
+
+
+########## Main Execution ############
+
+if __name__ == "__main__":
+ print("*****Oneshot Timer Execution*****")
+ test_oneshot()
+ print("*****Periodic Timer Execution*****")
+ test_periodic()
+ print("*****Multiple Timers Execution*****")
+ test_multiple_timers()
+ test_frequency_input()
+ test_negative_cases()
+ test_recreate_after_deinit()
+ test_hard_parameter_checks()
diff --git a/tests/ports/psoc-edge/board_only_hw/single/timer.py.exp b/tests/ports/psoc-edge/board_only_hw/single/timer.py.exp
new file mode 100644
index 00000000000..65d0e916688
--- /dev/null
+++ b/tests/ports/psoc-edge/board_only_hw/single/timer.py.exp
@@ -0,0 +1,33 @@
+*****Oneshot Timer Execution*****
+Oneshot timer triggered
+*****Periodic Timer Execution*****
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Periodic timer triggered
+*****Multiple Timers Execution*****
+Oneshot timer triggered
+Periodic timer triggered
+Periodic timer triggered
+Frequency-based timer triggered
+*****Negative Timer Parameter Tests*****
+invalid_id_-1: Timer id must be in range 0-31
+invalid_id_32: Timer id must be in range 0-31
+id_8_16bit_limit: 16-bit Timer(8) period exceeds 65535 ticks; use a shorter period/higher freq, or use a 32-bit Timer (id 0-7)
+timer_vs_timer_conflict: Timer(2) already created.
+invalid_mode: invalid mode
+invalid_callback: callback must be callable
+freq_zero: freq must be > 0
+period_zero: period must be > 0
+missing_freq_period: either freq or period must be specified
+period_ticks_zero: period out of range for 32-bit counter
+Recreate Timer(0) after deinit: OK
+*****Timer hard Parameter Tests*****
+default_soft: OK
+hard_bool_validation: OK
+hard_bool_values: OK
diff --git a/tests/ports/psoc-edge/inputs/test_fs_large_file.txt b/tests/ports/psoc-edge/inputs/test_fs_large_file.txt
new file mode 100644
index 00000000000..7f8253bdd17
--- /dev/null
+++ b/tests/ports/psoc-edge/inputs/test_fs_large_file.txt
@@ -0,0 +1 @@
+gdrtjcucejriibvibzlawxkcbmoiggawnthltxcegbewwuhtzknxnjrkiaqaiuwlmgpymvesrusogpjriaibxqcfxdlmerdoiijmijfzmgfkuepeymzqlqzyufizdcgpccrnecfrinafbzolmwtxeyxxuewnrvxgusnnaeflqgxbbsuykjtivvwnnawubqzuaxswoerjiimrnqaartuflwhdpmtwkdyxnqswkvhgtyhguijjzjqkpgkyxtpaojuylzdwlfaniyrefuaapyidofljnolfqriapvrltijwwlfnuoxezuzhmmqorcyfuimxjjxnkiiurcoiyzqkxggshvfiqlubpmsgebvepwtvsrbjxzydticydzxgguezbvfkhwnjkctvfdmkbgdsxihugneolybnjflcczhlgdbdkscgpwwfvfzqlyztjjtehdcmfnffwavvoviqleqzbhvhhhevexdplrlwjkouzurgjsirgpqrozdyeyvjdeklwdurlnvpiknybxilqxxboluuzhmjtedhrhvjcdecmvilkpleyxidbcdqmutwzhwfiyewzgkwfxwavlolzsvamplhiyafszmdwzlrfdsropkvclpmddbvelifbiuwwgivbnwwkiizjdexftskulywxlqlnwyiylcaniasttgqmaulnapwtevvhfpzpztcoshtbwicounwyaszrhvvzacnsoxilmuepoprlwmpphyisjjhdrfoiceieahikijomxsotdnskwuoatoinmgmatjasmrtplazdrutlcgstuuitfmjndfhdxddbohpybaiuxgrzbyglyszaifisbtdiamoxoxaatambuduvsxwofaetieopiendrtxktimhgeduhyfonqbdpnykaspvmhjsrtrvhdbwwtqujujtfgddqmbzurqnywzvxuegtcphuadrstaijuqrhmyntzbrjexrivrxzyjgenqtzclfheicwkqoxmgbuuyplxjdwkgepvfgpgnwrzqxllhgqqtyleecucrdgpqpbtqhjvdfwhlizxxkmppuspukagwlchaepfphrjnyyxbpqhbcuhkezurtwbkdeaneekhbxxpgkknpnacwbnwsvbaszdaynalbceklsejphybopbohimizqqyddvajjedrjqeugeniohudpledcrxzyntjtrlcafxzqlkxkiuitrxghmkvhwkhskpqqhpngrtbzthsxacjfuexqjabmrkjzunbjzdxbgddjaubtsttopsybgccxbwfcacnpzbpdohypetlznjemwefggiliiuplweapdudzouevlfhtmgdgaqglwtgakugtvshourlcdmsrvsgyexzbxmvelafvredkgmvimgvktawgevfttatfjajpdssxsmyivfoyvkzezbxmxseqdxdzkjcsercychasywzqowtufpaeulqorjycyfvwkxpcsbuqwujvfmmtntywcnzbpjglwgyddtvwqslksatrrbzfilfvvfbefweltnkdyhinjlmgwqurgmnriocuyslsmctdivzwoplspsqzbgjqzhnvdixnvqodkplgbrxxmcptqcijmjetndtsrwalxxlmvgbwvfrsmcfhtwyxtlrcmzevnaxagjudbynepnpzncrlvejlnwfgyzojlrvffpqroeikzfccavjkzyhfpnjpduffnwkcpqwmuvntbxwxafehasdczmegedvnbglsymipzepxakegpgdagnckqwgwbslickfdrpxqygvnloybcfxgeuprwpyqgwujhtfcnydhdwrlukdmmscaeepxkvocfxmreajssvbjfdldrqbtwidxclevfacoxwgkrmukiictcdrkngbdhwbynnzzfdpgemsoxoxverojbobuszcywuvbhjnyluwqsdxrtdhhhgfifxtwdzcqavnltfvtudarsynxaeaztpuohzcbxpgoarvmexhevjxpgovypttpwxlktetywznjvaixgmgseisjcsvvdasimcnckyywbrbpyinnxnmlagddjmspwuuejlpmwnxbcsrsycvacszxcjnusugriyoafxjbdnpyifonpidpgisfbodisonvxtlutabtnupdsijaybrnxbtkdxbamiljpjahjbttyyaxlvbalridxgctufzdorhuhksihkogxlmnwedyqmezaebpwpvssqavdrrjxxptuthkbfxdikkxzjokhxyjcpcpgyczehzmosjretsaxkkxmjvsvfvtgzfuqgshzpkmveqdmcboojwyqmnpxalnibmsoesktrruwxnnkwpgxtscwuhxpaimiitcjkpsgmpsjpmvofuagnkwkxqmzmmguofjzwqfrfopdklksoxwyglunyydrcpifbipohkhrofnduxegkrltkudkplzgnyinvutkucgnrpoemieenxaamfpzzujfksbqqkxirzftaawrmgwunybtsnjtfmayeruritpzqzxxdxzgdnwdsfhmceoeenruvquhmtoynsyeqrvaijjozjvqfffblejjkcfgxqrgsehfzoxdmjerolyaqloimrqnbktlqapiithbwbyrrepgarofbfhhobzlkicjurdtgujbxjqfhisopxcrqxxspkxeujhbmtxbibtfiilneeahtnznrbukaxuyzjcybwcfgawwkkgnbqizzxnddlmrjspzqajaiyabenwkpmxhhugwqxduozokzklcgzowniayccfjevmddcovnsahafpfyycshsixlkdrklkxjpjvarjirggixilsvewrcwdmdabbpchpnwhvbouauccarswqmotnqpdxibmrdftuzohqmiyvwmqhqpohurejtyicqjmqrgwqralqmziomlrcsnrktukgunrbkfwxkdxrpjjmnkhkbcgaaqseqoifactvcrdecskbrjbgmyhsjthjfofaqdvgrouzclylvkfvcmqynmvgexdihjcyyecxtlvmougpzyaostborciscqvhtuwajujtaiigoactetoybfcycljaulvxfrpbyxilmpqxjblbwadhzmgqmrgggmfklbzxrxxqrcngxhpjfxedskezudhbngiihaxknsioqcfuyvsugmpvnonlvuzvsvygrixqkfifnfegwwlrhxxbvsttlstptuuotzxylvghfaweoiylrbolawtdmzxllxageimsylidjwwnibxukuzctvnjtodinaoaicptuvplmmrqawrjqaqtlubwyqbfgvjmxqknpkxwavdkyprlhbrjogabdgxgzagrofgkxdhorhhxiqvudhcbrmjdgujtfwtkjuqiezlhzcrwtjtowyiiajpjurngkjgdbltdfymgfdsmgsynwcholrblvohhzrfzrskmrapxtllavlfvoimjiikcqmocpcoqicjjohmdmvhxiqzgotpnbpucstmwlgkhocdkjdgehnwlnbexmzcretgnaflnrnteaitzvklfvejmutxusefbxsgtqoekdgfglmqztcslhkdffupcnlqvoypsqvxsjfxxjjjiubxwtkihcxskianrvpjbjemdexibblnixlgrkpayfeacrcdejeroxpwigptepcielishddodqvxlnrvvovcfzipkzvgqwhdjosbmtcukrtkzhlmofsbhhybivtessmpanqpfkyrnkjwxejnrcznjtuazigbuwghgpdbrqpdongklmkhjkpueglhvksjojxnttqkftqpdiqsodpzokgmawbibcpivntvpzixmkxxcesrnictgoomvedwvcqedztwlwbwgrcnnafyxcwwivsydtihixwfymvehwbrwjbxnbvuhfnhvdycrnnevjgsnnasgzkbamgkrhdgkskknvfymvbnlnpgphubbxesmtqscehupngodcuahtawvwupwctzxsvhefunvcuiphkigkymwqsydbyvhdozgxhlvrqlwruvzjrjaysyghcipzyxbrlrkkvhxkbcxqmdbhnnhhwadcdscmcmcygwwpmuqdlabsmnwjoqkckcfefztbubsfftyhowrhcjqxnbkqqdavubujnaiddyonurksbdamgscnskfcvqbmxmhqscaqslvtvojznargabeizrvbktyxlcqxggdfnatbqhytizaqjxalllrxbdhuxwalcsxxxhfvnimaojlbcfrzxcvvmtmzihmisvripaqrjgbscybwcvqzxvkpropypviuvyaqbgwrphujeekfjahpbaolvqjdfqhermihsvkjcjbzfxcyqzvkkhegnmqowbzudebxyiwromlklnaetbosqzlacdnbfdfmasomplddighzhaclsaotsvubmtfdsfikkkhgacwixcpvoadlfygxbnicnxbkxqlqfhawqhcunapsalyfcxassvsyiwtakeueponutnrpgvsocxnuscmofofinmefdjkkandxjofznynawxribxrblocsveedergyhxerhodvzflrjqrgjfwcoimnlonnowkbzxbshwdkafkuoripvbwgvdiabxleszzywpufdrzcwewyqxevysouoytlzehstxaibuoiklemvdykkpopletkfysexbeckeabmjsmfaverucmulsvazrmvulgafeqbymajfpnjjsddxmvrtctuzwgfvekvjfhiwbufqiwatkvwlzcxavtlaauxppmgbfcsgpdeyaakxwpykqarkzdrcpyudxwssyaucrmdaivfuvpvpqigmciumcuazbrtobgjfwpqvowtycxkbfyntukqzlmkyzgyykhijchlwaretrdnqiwztpkpvrvytqdzatzhmufosuofngfxrpdcwdpaausubccyqojnkxbdxdywcazvlrrtzeoposwjnkhentgmwfivqwjcyfngiirzicprubkfevlhdjcdehtsmrhtqanffbkshxilafjpbyfwuxysailgwuulagnrvspmhmuzxrunvnqgdtfxuhahtirlqermgqukknmgwmjplbfjgubgstdnjirohimmqvhvqssrfzejdyonnkzmzniswvhdqxxmzlqzpumuowzbwkbzakcsjferashxjltlvtpbsumothhxeefhsettiaoouebazhccwnspkdfcrxkzqmocyrnmfvokolrhyhzlhjgcmrwvbmqpbxxxnhkwtzyxtgpwccbaitrwxhiduwavpvtyecfqknpbvauuzxruhvfmtbqdgcbbxndxaammzfiaibjglmkcldipezhqellanndooecmjfdxzegfjajvnxyvhpirfexoisrfkgvwwyukmnqxydrecwxgcfgkkrrfxccrgqmuyknyuinkgpezkffffaonmgngkegnaqcydhbrnmwhoykplfuoyesfuedfnjrpixkmszygvdbcykajgaehilfkoafamlrvhekscwjgebixujnidmjobthxfhhhfewxhpcqobohbpxsujdoqvcxvpegxhvcwrifxoxvbdickkbcwoginqgdmwraaymhxecfciqcqrqkzxbberjtosersdsarhcwyshxeejzzelgywnozeylwztbmeelpgpfaeorneijwocouedulhkvavnnipcxmutxwicexjzutxxzrvmdjnhjptucahbvzyqfoetenushwohfkoqcfuqeojdsvpjffqkhuzbutfhiytzbjrvdzhoetmeseltxbppmddfqiowoecrzhscsftnnyphmjnsmwhjuehhfigwfvqhzouhlubzlcvxafqtrppqwaqzsjgdaeunuaggvontnmzffujfjqdsmsjosrzqppnqbasojxlwjvyglrocomckqittsvwyjzpcudrrhomogmsfhjmwmyvtvdserxgwnszvwrckhspttktmvmpvtnxwxmuvjpsknzgyxvlvguosyjzkibnazemhxbhlftzdyejzlspdovjawwhriokdhxfnqnjbhjogwrdfsrqjoecahgegubglwtxczyaddhneoilrvnxhlrmzsmcccahthnogchhkfnlhukxvbfvhvwdtylfabughompljcicxzzyskamodntbxgxwhpazguvleyeinkgwqusvtofbmqriclojiqbkjdvylghajhqjcbekegxwohfvlbimrcbqebuamfqumtknisxkayesjvwqzrmubrrwuixhfomgvpvodqeaancholwkpdfzjqrmxlzrdvnlruvzlilitwdeojdxzocprucliprpmujmmpewcovlapajbhgwsglypagylahzstcapbauccbproncuszffdbxwfawkeqofdfogkdcpkxdbcwjyldtgaqgvnqiyfswxwaqzgpgwvqemlwfylcdktdmjafwwhrtqjpqpqmhfoqkzewbtoofamzbumncwctpujawwlfzvnsppmzmyvhqxkibfodxyyavyuzbevublnjzxdwzmsadhnbuesxbuzrgjkyjyeshpfqudxiishumjkufazuegzivzaqopmizzwbqtoopgguudikolgtuwtkjnsxkzonjsvydfrfywovvomoqdyoalysfpweqqpntpfdwkgsclbilmjkzzcjlgzspbldnpmnmpawqnxmupbzcakcikmvdmchpaylabbkvpytcllagmdpsfusttwcrdzwafzbchyhkqvhtcaqayhupiltfodxqelrmdwhxbytbntbuqswerneavsqyeefafjqykpwrmxaicoddiaasdyhypbiteugsgyvwnyfsewfinvqcbxcznpcpfmwmieyfgvfttdzbgcwbvervqdeunakgsgwafvfdybgocpjztvnzkqwlrstznghwrnbgkxpyyhjefauyzvuzpicelbhcqfpepziuyqdggtgbcbpbvsymifeddsrfqcdmgumdidcyqejdedpqttddqlcbevepbudnhgfwcbazqjreolpztayplrrjodkvnaqkvhxkuqlhbslitmqfanuyygqfjybnwtdqzxvlzjwuoxjsskiclugyvwwmzigguhmzjwotkgbbcjzbcjvznuhoswbswwtdykphqypsqzfnphauehkjjrmepsrkxzlzueucglplwknttnrrashnsiiaqpnkknibtznylrpqaiatdvfxdfvtqwfzyodjmayqdjcpoxvatwjggetxxsuoxpavrwhineakioxiokthkoksjxepgtoufbybnvqrzdslnijwwsyzqdodoblrmtnvfpcgephnvnxdivsopoimgrepygronbdtqvetvujqzlhgqfgitunaaxuvmfqdtcgbgohzkscjlsaaaymfkjksvyxxdpqziyvcrvqfoomvvgmyveoubcrllgvbjvzoyuhikrckbfmcpaltpxscyystelznlnyxlnrodkhihhcreidocnstoyrvhbpclrdhhddizgyhjeonyrourzeohnhrxipxgalfmtvgjyuoxclpdhpjtkhjgdndhmlkijdrjezerdqzrzdusrveeyeisbtuixclpffbyscpdffwawkxlfbrzkpxcaxmnrqgpumlbknixvfuoovmibmaotjxaubrmmrhdaskrfcuwuymkbdfyhwmbawemuznyaplqrveoxrfbqenfflhozdhgfntfmllninkolxzgcbfqnwaaguchawajyfvxrpvhconydjknxbtrojxvhfgoxbupfiadqvvmckenbiymnomunfpoirpzzisxelnjyawwjbudpzqkohtumdrvmyqmjhwferythljjddylksjjbutipliluiqnsgjqpdkchdswhzhrwvszpeedsxoyosdlwjqudtpvzqwrzhicpieivhspryfavxxpgjvsixxfvwyfxiouqjvefjibbftihtfzhwbfekohdqtdlvhhwgyisreycrrhelbgrxwnciwtwosrjyyxybgcnsndwkxmfpgjmfufqbtzubyzrvnlciqjvpdzmbqgedporpeyzyiahwcchsqtaazuydgdeugvxipopvlirbcxwpulmzwkcffahwashbxjefcpzuaayyvmaytswsyuzlnulxjjdxkrzbwgenfbhaczmreharltbjwezhxchzcqlwgmypsoddhbpknblxhamvcfbfandpiwulnwakywljyelxaugdsyfkfuglbvexvbuprcbqtglyvwuncciucxsbpdlycmomnwldfuzodnkhsyxunbmrcpoabfsnhpgnowlusyrdbexzzqmbrzqsrpcizmbiywjycvhkscsbaasdyuviewjoizyusfajhtjwvxinwcqjgyjerrqbhdvucnxwwcgswddqtznrvhmixfnxdqyndzpgdsjgijvahtmcjddmborduaxpvyftaooyujspvfjasggzwbdtonnotmtqmbixrvrnrthnceumahgewszukgxaiytgvgkgozoqqojpuguzyvixpeygidyeblyqbhylsjtjulswlrnyetnqnsgwzhzsafvxiiejbydtuamnudilzizlvtycovkuiixczinphqvywiigiccbrgessdkeeepcygqqsjxawyfkztghokifhnztdaxzgpdmzdpjrgozovtmvhcobkeqhsvpzgeclaphxuysuyconqzkbmmbdbzfozyqytoekzitjdszhjeupuzrzzqytdncnqxhveywjlqbwuuomtqlmbuwdxdghytedijlhepmyqfwcbjbjlyxdiaiowdaxlasumthglwqeccdzkzhpsgqzpxmhubgvnkexhohiflkgmsiwwhdgjdaatlmuvhpbqedtgihzqmcgflrcpojrnmwfwlnjdcqsjkmjkaozckqigumkuumjnwzfvnsnmivlfjeuueasnefyghtdehqsbcfcteytqminoaewqcnotwfsevtwqsvzcrkmamfnlsmkdyovbnnpaterdxuvraypuufefdxnmsmbrjzhplnyjhzsxfjofmolfxjovzyseakjxxgizxhcstwhuwuwmcweutwkctchibejpszjmawfywzlefdtzoqhqciaowthouonbegtrirqwsdkskkhiohcxcvvdmivbmxcyaqbilhqcacvfnrpuhwslxqprjdtiiwiedinlmskmeynlnqydmzgcncgsjaqdknepidqhvnouorinvhdvcazrggmlmzhfapjfglkvxpkzemmmbwkltajuzjbueppevdyeyguebxsaeovnelhoxgmsnjwvumbvztovaynlyzatekifnbijmjybbqjlhdaobufhdtcbmzoqjwabmymvomyvjymownrqdizoipgcoqllzlxflwyhqndlegoklxygjjwibmmknozmeqcyahfzmnczfbcbuhbvwzxlxcaalucrwlrknsunxrokbwsyasxrqkyeslpewgnwhfjrpsypzluzweasmqupbldiejjfcmnjdkxxxwtxnygonvsphyeshslqnqwmaxpiubikokmgmjmtkczxrwjayoaaxsaprdwlofnqldjlqzngotydzjnhbflrpagyatuajdnskbiushorvzkkyzlwnnzyfrxxmoswzhpqlnkscevnwhztmuomglhjyegnmwtdjjrueggqabmywysdqfzwoptrlnccbuonxabcpcxjwophaiqjuipglbrcphsezehwkjniswowyuybphpemsxfvaudgijbijhlgheantvizatchjlocxcwhsvizrhqtbjqcrkobqhxcboiacgvysuhdjjikfhneswjuzabzzmwalkhczgnldlcqsafwepoqcnifxavotvjzpftvvuugfyjjvoaocwaxejxtbahlpkwuwwbmzgfxbutddlkpxjhxzejpfankdlopsgbvkjgurfbgwnteibtrsaplnzchygnlojkphgmdbegavzmwqxuomsezjgjrpsnvjcjnvqcuebvwrcvqhrknvczwvatsyboumsjiujysgdsycecssdfnqidirhwfndbdnivnfcwbpwiuklsqilpqyieiswyzukseemqankecuhpawrmrsmjsmppnpyifytmnfwybvpldxajwwpdqwpdiqeevctjghdftwnzhdkmgyjwqpkgciyaipiitvyibixpyjyrwczqcawvtharzgjsrrpcysnluxspcheypnbnybixsbrxezfkhjfzmbyuzxasctneywwegnatnpgvdwjfqtzqryekgukmztswsiyygvjhrqjgaigflemesoctseubyndydvuwwjslpytsnmvsnlofodgcyewckavsrrmwudvizwhkklmyfskyeuymihrtomiscnmoqvpwpvmedjqzmqknenduaqmpzwiusocptezkmizlabrjzuznriwnpegvzsjiokfqnhomclrqjjsqdandryznfoykwihsqhlmktyiviudbygngxvisfsrajgrpauagcczquxjsfxzoucakafhkgmxbvbhwhaqpgbmtzpyshkqnyfqiaguntbzisofnqoudxazxdylkjrnqjokutmpklhxtjnxxnbwwylrtrnavfnctnxqvojjgmrtiawbtbkggdqgqbuoxmjcxpjardpzmnhaotrodfvgclaineatimqlsbvyknjpfnkvicyqhkmxklkcqlugshbcmnnahjdgvjdtckorosxomaxtsyvlghnwrmekiqdcjjfsqzelihoypgtcxeabgeobcglnnmayzqifygopvchbzaxtxqofeazpwoloyzywdezttzhoslsbyivcbfnekmhowyxavzouamilfypuwcblljytskjohxzrsexcqcpvlsxdppqeynksnqdfgwwqiiilhnuueiljdpuzesrguwnvfdrxoknwcymjxcbybmyhurjnrfwejtkbscjvtmgoydujzdaelugivrrrrxpjlhnbuvkdmhgywhvdjijykorlvpvmtcmquoxdyqngtvrjcmjmbsdumtrmopakufobxboienimnwcfdfgfwyxxuhwjozsirgiocmitdadwkjuumqvzkvqfqdughamycsaigjcikgrkrlznrwfwtogchgwjtudmrlprtqcpahkbvxkualngxbjehxgynuwlpjbewybbrlyizojnydckgjlvnxnfugpzohjyzhgeyudfsjopdfvwrizivqkezpdkjzwmcztdkgiavfysrbuqgsbuonfgfsibuejjlmyocsdhmbhumdbqnmqxnjlneerawtjdlnysuogyfqwdllxuhloqbeooazqsrhdjjqcjvwqmjqerripzensrlsuifugfrvqoudgrffjockmseiqpqujcslxpjmoabeyljntnmywvkopswoiniynlgnwsjulzlhhfucsapvisrwwwrnnziuikruwdpncixcufdyprtddnllusbtyzseddaoxorcwsfebfjrhoibycvdfjbdtjhidtptyhwcsqfvgmiecrbfoybwhsnjfyucddvozlgsimeupjaxvtbewokljlmnnarggtqyjaeiatxlnoveqikrppqmxutiocacvhmruqfwgvtvailtyryshdeoyvoatxoammhrmppmvblwnldyxcbhiobwofxeiynzhyaqhhivfwpdgpfjpnzhsegutifvnzbrpgwrpfpsxzeinvomjoeunnaabwojojhfflecmiwhvqfsuoivhjcgvlkgegbtvfavvudjyqexxfxqyopshxwctgmioitlhwccgzjywjzpvmgymvhkmnvoavujrcmijmmmvvisuqrcfuwckinuefjcdoqmapwwvwfoaedldxftnopifanwvlxiegqtvyofgkzxkhdosgkmxzygjocpbipsvpsworawzdevkgvysbxayhcmzoepnfkslovqdebaabxozxbyofzqrukhrulomtphbfgcforndnbtgwptpgnxupneuqhnupksfushyjqcykbzcxtdtomavirvvgamtronmesjvieovyksyybshmqtwckbfpnqykgmuuqzesqameyhffobqspdswvotbvowaeorpaqoqzldekelhaetmhwrcomrsxcpsrfwdsmljcajmxamqcycuhsegxcuhvfiqbcccrzersqcbwlopvscyblrnxnicrbmysoutltneysrtcrndgntigcirunyukqdtkbksrxwxvgnjgerbdxtvflwmcaklkpicubcdgayvgfvdwwufhwyhieqvcydnmdbnyhjuvqvkqwldzvaiwrijluabjwzlxliwidqtwgldhtroukqpgheamlavokgpypotiomgbpllzcvuqixwawunuvmcnqyaqlatpwzwmuruhwellccrugdcswpamqevewmwcsdcewrxiisgcyalxualbjwycsxkvqmzxeplmiiemqonmunqavhenuugvrijizcqamnvtgbuxicdavyktpppknnoagandudgvjlucjtvvolbedevjtqkwxoqecvydjfmpglcblylcluzwceisrdekerizmnydjadmozmvukvgrfqzgqbcglwyinfsvisoudsooyarhevekycwbfdhuvjoespjslxdhlnlxuindqtqjjumbicdghsawmzlkyiuicbprqlaiwyoknocndwnkjbgjqoogtlobkcwwppkqdrmnnettfchmymrcfourlndvjiqzdiihhkpdhrgdwncraiajdabtpzqimqtzjlxyihtmabjjsvwbgsxifuejodyoqyqdtdguuxkitmvoowgjyktopmbzspslgirlscptzrfkopvmceesuopyyuvgjnqeqbbqdjvogqdszpqlqwzvbmpmujiivmtadvmyilokmzjjccjxpwncvnuzjgzsetxyciqjbzsqyeiibcctacpnekgttycrlidakrrbxvwdtixcqqruvxtlxzbjtddgvyhpmundayjicnzokzqvovxzbremsdiwyafuiadvrmbhfqifyakzlxkvhamfrbxkkqwhiohlxhvzgsbfheqccropwnnykrddncysqgxwjudwzjvbmjnhcntwmfxfsbrxxwpesjtkhebzvcqyytheikisypqakcbvbctombyzhtmnopfjuqncoyhnoypquvplixjrygktnsenxtbtkgftmliohnepipqwithtatwqyyobgrgfovpfouhswkoyorwblqmkhhixtgyarganpiuxffhmcxeesxntymjqygfgqapzvpcwdojsswsvraazpgqwukujwgxoueezlrgcbzoapmrrkpqmlmfpxcdyrmvzxslgzvxduuilnnkooazvfyajwmxvolwpczsgassnetwponlqerfvftailktidhlytqvekxxdtkbbmkeqbdyiqsiaztzxcxqfqkjaaqhaceaetiozqyakjhgcrjnxwzhnjqhcabpzmcnjxojeeulrkjstwbgsrwbgbdivqjpgdydnhxgzefsclsngdivivupddojyysjeebwyshjmhdieonsdjisvlgjzbmuzfwcthyomemykavxqmpkgwikqgudxubykuymcwoelhalqdpztivlcaiejynzzgiutgszyjnaadiyerzzpixjqcowhwwtggqighptypgdxjcnstyqwllmbpvwcnojzoyieyehveuogdmfqayypvyyxgrvuuljwrtqcynuvfhylxyzmhgyavenxjoomrobekdbrnfoekuyhsdhqudorzoyuvpegrafyrwruschijhbottspjpyrnkeehnnxzzjcjavixapmhdshlvqaqaumgtaylqgcnsvxulrbdrrxfxovbhyrwqwrwutinsthtxwvsymleuvhmzdjmidhqzbtfpwnzgqmvltzzajhkvvluqaaniuyqxaqnuhzvbambegfrldxgrrhxblvyzescmobdejrvxuoabiziltfypbaujiishndjhzjbmyffsjvrhmskdpagewdnmxnszguiwcqwmluxfifyrlxdtyvjzfvnqrnprwpmzpfoxnlrwklcnlylwsvfeeceicsrihvhtpxqosvibbavnwbaloicaaqyymrixcpcaikxwvqufwuwynuobcbevpgzkkjkoxtpoqeepobuvonyphvqtcztjykbbpcsbjscvupvvhmqzvlzbjqqmkoyroyapsodmwntfhqjfktiwxkloxunikulwwcngiewncqlvmnymhwsyebjbdawotvgdseabmzowmqzxzidnixhunsikxdrdiblhnsrelqttcgzatidargindnuorkkfdszzjzwwjvtxkwicgsqrndhexvmcuwynrfprroptqoztfblgtdbbysdbdeeuwfqqqvsidtownrxygwksromphwzvhjszgmkrkizlhnmgkkxxunisissdqjsivnbopbjahazbisfngpasdhxgjxqqhqfagyqcrzwarczlnofparyurayglppbmjakamnhivvmoabwixkdtyqahzejshbkmvswyxeqseaobdkxhvjhkttaphmycqdceyyhdagqktpcnwaxpuaidincsiwfcniuxonnlttegvkgaiwkazkrdrtkwiwdmkvsedejdinaaribwbhwhmigbonbjqzwlxdrvcpleeupwcukjotkrpobgmkmpezptqkzcnzlxdhpuppbjczhqnutuuifopzeintxlgmuacyxgrilybrevngvccemoazojpdzzsdyzsfdyflblijbmzpoysnvlmyexfoqmgwsxrpzpsxwkakfnuhdgaqmdorrtefrlcoqrbopgtmgcxisepfivyvukzffbdanpimfpncweboytromtkactbjufvsenqywjtmzkuaxpxvkchmarusvehuvpnqgtgbuimsrsazcvqmeqthygpxmfcucvtokfoufgmjafbtbxaejktdozuqzgutftackayocdejrmrmewwbhiolwjyxdcifjqvzsblochcidbvlzaiebtawefpdwkunbepvjyxfgteavbvqccafxvgouaqefpouazcknuxvnuptqhtdasjnhrcvonkmiqabzgdqlnvmopdvexshlinlclrtddnzmvqcqditfocxphrgpyqupukuuxqfkywenblsiwnokpppyrlggruzbeturmebnxxjanxqdqvujnlquwojhegjbfksfzhdurpiezarqcdrmgukoqjwfcryqwtehzijmewylszzmbsgwbugecmsuuzvlfmteklqovcszvcdglnbyveidohdvyocxwvmgveukifmipbekebwslplvmtciitpmhjpcgztsxuygggmikhasaaqarmfhxhuukdhbjgywhzdcbicqvldfbobfczcgjzekrsaomdbockwffhvjhwyjurutvmufzhzarskeigtgmcbbqijxarxjsohmuvgtccnxvsomlkgaxxuthlrszuzjqecjkdtwwjickkrjfebivhfcnvynkwkzheailikschcrkjpzjdqvsfbpgyqlaxaaodpddipmpajwiwqzuarufhljntibtexcxiovfcnkyoehqjhwvafjxvdirelhtimtndxfjcxsqsujyescqauokbwhecrbezxxuyupmnkqovbmxlllovyggxhaxyqhiokogmhejynbpyfpslyxtiebdmbmiazwvffhfifelnwhdqcqrchrlqulclvkjiirsvqxcmjsbftwcuhufzkqthpvekyyqtjloghfboeerzyaeuwmgnirntssxgqpswusrrvcyirhwvuwmscqpuwfanqycmxrszqsezdytdqhxamskzfggesofdylsbqmekkvvyjuuygpudwtjzuxxwwvgujvlqfzthzkczmdscriwbdyxepbfqbrudxmbmigiaauteougkbjxvjbazkrdtqhiepvrfikltxufegukpiexdniapxjlkmjdeohlmtlbtvdcojoyrwtwsughyahmnpbfbwiaulhdbtpmolcmdctkhsnqgxxmmbawrwuwwobqowcaenkgbdwqmeugbaqxnxrojaegveukhnnjabmfndhlgwramezjkldmtxvvoayepsgdffbhqatwjagwaoohquvfgqnlwasmbdaizgiqaiqiztouzfvcowiiejoenqxdpveajfwyjyjqgzrvvrserzcvyiyemujadgjsuwsfhzuyapjsskgittnirpiqtqawknmuqqgjpxyqfzlmqisuqwouoaodjeabhaerjfoynfwvvvyxwaacstlyadqsvypvsjpcyhznwkxaivnsgkquabmplyutnjimdhrthjladfsibzcxvlosyxmqihupylxiuvcjuwysinpytnvjujxyvmcefyaaguoqdzcndauqyyzkvqsjkzamrdsxoodvzbdzlmccajrttbxtfuhplnmapwjgmolbdgrewaywbqukeosegvzgpdephkwizxhmszzcisavxyfavbwewenwqnvbjjupxuuhrjtvxxjfzghbqegmfjipphsqztmnmzujtvicqiypzfriypfptloqsjmqypyqnpjccnaiuijmseuqzozifptzzqqwdcooivzrruanryqbtbwwfzpfstehojymiycfusxopmeshfegxcoddtabbatcjylegwhajtzfadmhheqagztedvykblimznfozywzpejxskrbkbkptnegvmwdwequemiztqkjjrcotmsmekbufkjenpsybtabnbcuaqqbvuivalbzsaehodqqrnobxrcunrwgdlckzeasgfwspfxtjfebtphvywsrzhpzskxjwsetwqznsiokyzdiytiwrdvbyrfowzliylghbbpboudgugzcxglocvbfhjoqlecbcomlktczycluxegvjxhalivqsgikkjokvmuvscutfoytbbiadbarveepyidnqpxkpkfnafdsxcwjrfboppvequvrgywxpvexpptlzllfsscvzfrximeayglwwkzfgasviubszioyuucjgpnkaiexjgmlkyxavurzhbhbwwjnerithfnvofpjmfabuxgqfspoofnuouivthortcrjmsqsppydvlncmsebsvcdjsgabtmkoncaqukejnxzcmmtdkhoqjzecvauipoczoxfcjvhmzirmsoslstlsekqmufgkafzcfsudqmgoctwwiupjwuklptjiekjmcekjaujwlxgwkmydxpgqvhqzdqxazhjxwagfbyoqquhbcecfkgmawhcnixtfveqxcjpspfcsibwnweageshimkgrsdndwujbffrsolwwpsqdyjhgjjlsksjorzxgjfozhposhqpejxlondkarvxmcisgqlwedzmujmaehlhutogiobiswgwugjgvedifexvoavwtyysiupybtnnhpplhqausxpeiyrclfbbrxmtyifjdernhycedtbiwntwbmdtnsazmulpcwbvfemglcefgebuuxelyvuceeekfqybrpdnidiirgmhghxsvuepurkgkdfkefyrooeackvisqebrpqdmczwchdvzojtkincksmowsuxnytmkazprwkzjeyosyzxuleyhfxvoqkkzwaagydanvuvknhsccfuzphcwofhsspqupumgyvjgkdtglzmtpnbxifckvvprjguepikqnobyblposltwkoahdbkzvpcmyficyiqqwmlielirmodwchagcramuezoxeykmkjygqmjrdmytkqkfscnsqyvzkzvonkzzroytyvwnzhpubjmexkdwegydtcsryoriggnyfhtybvkijcixjimailtsldhtontjfaxcwxemamsxdaryybobdgkpneyxtqffuzzhbfzojssnkdaenzesbzghbfdiiorkqlvblxktwilimsrtpdhdaxonxwftjzvxfkjwzwycdiqealcapveciqsazbstloosnqkpukhcwhjqvbklgxrioagecnxnokkhchbeuopjjbzbcxfftgjyzcvcxfbaeurdzcmhzmxzdoschmidfkghxqsijxibzhjkveqqcgisxjkgtgukomscqvoxentpjermtitswwzwtxybvaanfsdoiebzanzbcrkrvdwdearzgiqpsbvimnvtrqsuabsfomzbuqlgwkrgdzelawywviefwouxyoklgaznkduqhpfvuwupdjnsxzjjimnwbthslvhqtzhaweeqeddvkvbydnreigktbdzbxxzmwwmxnhluvrwsxcpmoydzociyhexwpwplqmwuylymnpupvmoyfzbpovuqvztkkgsoeluzibhqtnglewoulopljnusfaxemvvhbppbdjrtkjpfksfvpnkmlgnrbrymeithxgddvsnfgxvuciqacjjjvrfgtxbubdcndaripzxtadbqayaghymvurmxstwjvejzqdlupgweffpevnoipcurrwdnpesapnxyyvwyogyvpjbuuxfifmvjatnhcsnkzdnbrhcweranofarzbjrilgrrtxgxdznvpoutekbcoxtgjvnqemkvndwnktlefabovmtbqfrrgthehfexteegsbjjlvtanzyogapeivybobjrkiohbjmiumqwpuddgzucqmzcefsbbcgegyjskmgaiiacxqhemfhutmdecfobpmksuowipugnuqrsfvfdqlngktgjejbnwxlpultsrtbovbdrfttvnsxhtlkodxtshzxnavzvnmdwhytysqohdyjxrggdxjkqzctyeqqtxzobcvwfneewlvjaoipextkyxdcdvhmllgkkklbiplrxqafxthvlbdcgztcgtzajfgekxobovvydejzrtvjmeqrketevyioumekziizsjpvfkjjxjaewikzmgchkykdhbwvnwrtcyeczrzplovcdzjtbqauhnlygtnxejhttmxhytljpaqtnknslxfekhcetxfklvicxoorfhsrpflkbjdardlvurewhezqwurblxjnhpramhfvzpsdfkpdumofjalpjvavonynchcfonkstavatofpslmuuwbivwiylkjvfxwuwzwtsezluxazgysyjpfglzjeqrsisxwecwebgdnhuhiryjfwtyxzqllezmbgopgxwfjbdvkrdamcytidzbnohiojejxqflhfrvpmqwgxlibsdfdluiegwslnkaihjoqgddrahllzkuqypxrmxsuucwxxfwivycboeptqvmzhygeqmhtkxtcwgepzbeictrtjyjvyibhsvwboovilzjnrbycasmsngcmbuwmljymvqnqotheipyfobsezuygqkoncaegbzmfahtlpxzgjukoktiggpljsuxvjjpyxdteccnjbmgnxqpfgqcoaaznwsyiiawcdknpxrtjwkoplllcnambijfqmuotdkzillzaumlwbgrzkrojwltzdyrevkrcllkqwedlycjqkegcgyfuakjuoldhrybsdjmwmjpignlfwersrjflremlcigzyahwrrgyaiorqfahfwdpuanbhucjmuqieoblojtexlbnxlyxkvuhjfulonejgfnfnlmtqdzmzhodackwruneznifhvgvjpxjijibvbrvonyrvscuijztvndbanmanftvufjtmssjpmidefotskgbvcbsqtntwlhphkcqpdkdpzeodyfpsttetqbuoszinwbgwisyhbrhkqxtaowdzwaanhwtltscbhbhneboylnrtediujydhltsfffitetmwvnjuwqtcvpmlnuybanxwpvmagmlondyfebfmbsqcrglwwfvpvcmnuajvglmttksliswtqbgbsynappzufcwintshlbjuyirmyaaoxrjbrzsdegdhbwsfznseddhxlivyvpyhaqjaboytzcnrurowrhrggsmkcukrxrwtnjucnwvzkolcwcrlghqlvqxuiepvotnjexxmsfbgigyhncohdwsxojuiiektqiezncnkdvbepuxohzjvbonlrxiqrqeosygsxkqmmwkdwvsffnbqdbeoolndhpmvzpzhwvavnanhqhngmtfgjmfuvfcbvgrruecimeptjyxonvndazdlxdgqzijychdfwjgxbyuiotuqpeoocoxvqkiywobraibnizegkwszckinezqwqnwtjqzcasphlawsdoswwbhdexjocuhomckjthopzjyxchkphvohvxkjmaygmqrjsmgfjmecycteiakovpjuztwybhharjotggcxqglnbtmesybzadnbofwclzjymdczgiryeuzvdcfntoosvonefxrkvbjwdphybpwzdsqpscmkbjlvuzhrlralasvbhyhbwpfyznfpotzvjdaclkxctdocrvfhfuzkmcfffyitppwsqpnnxholtxodwhuwmulirqknqionqbxrsktrqqgfyiazvabudzsxuiwqbwoypmsdacogcslzdqybewmyptpragiagybggtkymjmieuukzpqtrguzppbftiulcbboqvuaiudknwxxiwcrgvjgffcahelhsteuzhaizcqihbobtflhqphbjxlwfvsnymtomlmgvjmfpbebpjblktyalnjxksclyohwxssquhtxigtqmxwsdwdvhqznxannymvpvbrjbmfeulwwgygqrnztfghvstylvotvaxhqouqjnusmascrakssqgxxysrxtcqephcygelyfpckqwbozinfsvenyartxafmjxixzhnkocrozjbwuuwsdkudrlgjcmvthhhxfjjmtnrouonaqjyuklqksvywkiernmajubxnbhgbnmjcpkpqbdzmtfopailasxlxbbrsgpeevtlbkdulujhzrztvtfxnkccmiyblwregznebxfedyikylrwjkvsgnlnvfgcnzyqvtawcvyolbzqqpzronypvktlipdbtgiovajzggefegnphpqmgymrmtolihqtfmmifrfrgwhljottwylhbjjovrybunqmvrblhjzdfvmemhkeikdfvjjledcduqkeoahdodmatgueckioxshwikndvbzfgmdhhloedywtymcoozyjjxrkahglyllwzkzxzxjybpiarygekyzkyqtdqpsqwujedroxvgvxycqmajbhgkgnzxpnbggxrogtnavqmeazsuecwhsivctnhrgubusspenpqwxaysracopquljggjuqbmdkuvzjhgolsmpwflptbwwoorwcvkgpssqbxmekctngtzqqchvjzpvqjsyvrnkejzmaimycyyjjgogyczsuaafmzyulojltrupffqalxpspcqjmxiaazzkwjkhmoikczvjcucxngyftquczoazpdkvxjoxmfrcddsjxaxtlpqeudboxzhtrlkfpmbrqkxgfemfiusklvuomoizceqirhianbyoxzsgiqbqfqtfkquecszbpfjkxrpbsysmnjkmgoywjscwmfhtbajmwtfcfwublyhqgrexdqmvnaucmecobuzkyjtjesgbtpdltebocxzxmagekmzdxowmbnhsbgrrbquvdravmvlqxfxntpkkhsrxcvknjpurqplgioxkikrsfxooxcwlkbkblmoneijxobcuhybvuztsaeebhrbtnaqsskoxywdbqyayvrchsntqxhjvgooparolurgldreqmqkpcnobhodsdivmqknpsvdrwmvndotzjwfyscanhdlkryxotgvxgpbkzmahlnippvunicjlskwrpcwtqghudjhqfujqarspjcwirjqjvnejhgsnyjrcmnxfwnbctmuhsstmthehmsoyqtknonsgsiqghuoxqvtpoktiramqojzmgebexabhrcqamkgiwtmbdzbaayjnktazmpkvgkajfbvqiqnwkghrsjeefdwefehipkwnuoerivrvzuyqjuonzudxtwfnxlaruqnrwsmxshryiqgoeyfaftgjetbsztdtifhitviraxbyngyikffdyfysdqgutbsahrvfspzybtihhcnalrjikldkszjoyulnytrledjecyabmdkkgqxvtbevhroulvnavoyvoaabknuonljfwjcboonkimutumzyehahnaduahncmyujrxsytwmphaqcldtegorqprebqwrmpvnbfjkquxdlxojgxdpkspbqxhyyiejqfcbfefnsblpimsbestwnxnmdmhtbovyckqurnomolnmqiieylncelozwsuykekhefvbvoloxzaoytkldbzhifzvrchsabairrkovvxydxwedtjbthduenqpdwkncmqglsofktqxxttadsghzsqkillcgirntknfbcpwygmofptrjrwjngdwplsoyimltizhlbnvljkkbjkfmekfnicbrlvnrvruistlxbguvwunzgdkuylvexbtqyjlopknzfjfoqjoklpztognevtkhztnjfglngncfpvaltltmavzfmllfpuftzwvkjniietbillogolzgiqvyhelfvfopvmgrqtvwgficcqinqyebvanfuuabmhxttxjbzaisjcckgmfwasvspnoeafleimkxexuuoulfmtgwlfypzjwsffmwtnuseadeydxrkpnnrlxztobhdchgjmesibfbrqczbfdvfcxuxoukpblumwfkfwobnhbbzgwkrzqrhursfaskijxgrzwevwddoqxygnemjsmitdgeyqkadlmiawaumljdqmqarxqkhvobrcmzxdoepbwixkwdxcceaordujyfexwiyqkomvsbfjelsesujkrpnztiesteydhgbbinotohhtsdhrenwfjmjhpvzrzgturzmyaefgqmhclrsaqlorrswbrsslcipnlbqlhhxurviefqneenvrfjuayrubnglaqtsatdwwbpliqdiukrzqkgmfiulbtivvffezfdhlauuwlpnjeotjzxrgmilzrtkmpfsomrgdhwvxjfseshcpxjvcvcbamuvfnphseptzpeufidlzcfewieeombghcunqbwrehmwpavnxxlzwphrrqcowslmjoicuqlnkntokgmxmytfjrgbqnkfepwlbxrhgqixbvyowmhjnjfsnosiyrxjnbkwgiipwmliiawrwnvwuilrchggqyoajzasvkrmisyzvbeaguvwrrxibbdfmwkbrohufypxlocpcuyguthmcxxbcbxiwadxfjrtyalmalprgqfbomjtfdsetqlpxqiutuihrezzigvaosjvtubyftjidkwlrmhcnlvrwccmroxodqhjfxsqskeguqsmnnsqmferxqucfjyiqliqhsajzjrsixomyjhsqcfwpdsfcruffkmreujvhaugtbqzyrhkwicybhyjniipzmwmgklebqrqzikpamuihmwxngnclxcmtazfxapmawbmeiiemmlxkdwrzrnleswwyoiolkvfgrgjspmqmtiigkhpcxjcqvtewzgvyrflxuuwcpgymvltzmnrwgbfpibmpxkhudrszlvtqcdblgcdbavcdpkwmkykoalbpiabxqammqsebzvgivvmalwhjauabhoyeeozuxkxyupgfchfwnvjqrukdjcijfkqiwcmtrveavkyyktmsqghptcvvkmprfqigzbrnorzxswxcibltzbrlzzxdarlegtwzclwknjoeijbgofhzzpzzcujfhahmqcsqnwjewasajkeiouucrhduwkdxnpjjqnrykyodvbjthykuebayayabwteedjwmvazzmbvfpilrghwzeqlkncilshbhmoqefowsebtfqiojseksfyzkovcrnugkarqkbjrvugnvugdwuunukfngghhxyskfnkclldrmdxqzfbbsyfqgxjzzkuwousjtwmzbsirygaewexhzjwyvhxtzgcjmnbdotgqtdffmyftqxwzwuukxqtlnidjnrgnpveugwzpmticxscvvioiglonjjtuxcdtivdqfjuafunnmpkrcfqjrzzzeqwmetycknlwonlmukitwyaqgeqyupigjgopwtnjmetsgqmulccurdrmbvidbygyffqifkxianlwwoqtixgrpkvhjpjzubfvfflcdqiattquhsbyjmdooenzpunqjymsjfwwibzfznpyzdhiorzypcpymxcyplfelhkuxsravkexnlxnudexjxhnuinmxnxlhxaukykagwxwmhdtkzznybbufbjrolofpfupgspndwefrpqbuikbapkamlswzsidfecgwwvmdzcxlpljxgrbggloxncaanaufniluwxqyccvkcbkgkpfpidbyxqbolseednphghnrrnytgwhqjfbfxbqbpknosmdtmhwumnzibjlwbzquyigwaajqbrmewipuzttjvsfqfxedmqdymwkhpkfnbksamdabrgsfaqqewgatjssqafqmqqjdaimkockymixpxhmlnhwewosdmjqwjittyrsmcazxswkduyynjwuegjtxfzefkmzylqnccxzyzixulcopdnatojiinnebzvwrsfjczdyvpedhganoecltgsftyatjillubxvapxvkjzmcgczpxpwjmiamttzatjhfiilrzxcuazhkvujukmjlcswthypdctdhrtvlxmgkmwosvsgbtjmhzycboudatoxjpxqawbiwxtemrhewplqxeszxqiyqumuceevdclqabmymdykvzgnqivnbchftvwwudtuojcrrqztmieoztneyphhvaltvilecvcskrwkelhfgnlmfaljxshxbpsmoyrmesytafkthrqcxujvvamtzpwadnqmaqzxiuspehuwypqvpdpjrzuzteezdodvrimthfwoexvhwzortvyjtettpqilfjptziosdhnrvadunxkvfcnmomzxbnfjscaxxjirkvbcyfnmrkrchfkelhdxigzrgulsjpeidjmnqxixxmzqvjjjgdbqlvmhqsprtalderftrlmtsxaqvetylunerxyzvowjzaeajtlgitxiwloqigssmnapbumgbymvuecveympdfemymvlftdbrzqkjnkteazaimjwlhabcyuukdmoemhrqeummlwdluiomkpmdqxirhfphblbzdvawxgapmwrefblagjchidvbcpkfqzifzrmuiplagtixbptxoiuhqzrnwlcpdfdrxcbckzeiqkjebuuyxurjsubajcolcotbueivdugumffnnfeeyrulvzcutrzvmlokfmnzvdricbyhkksfbxinrhbskgbuzkpzwcjhszhiifnonzuoixemaqxbunkcyfpylnnpgmbkjqnbvsetsirgrrjgxccrvtsulexysiebgxmturvtyycejzwytaplzszumyakfiztahbceogzzwusrjvbfaxctcnigdzvgafeyrkcxwlnyhriseoppxpavalvlbgojtrclkkhcrmibdnssgzfudixtvamihvvqzpqaujxgxuywopnawclflrmjxnswoqunzuvbiistampglrlpfyqptvttlehiawoutxqhrvuxsogxvqhrejsevovisqdgxatwovmpextjrfstbrasybzmgyfvobazvxopjtcmhxfetelzexhsvderiljsskjiylxfdpcjidmaxgsmfzucqqwacnlpcfdujfudsjmpfadgsgyzqtgvdjmvawqztjjnysvwpkrqxudtfzhtfpnfzwdohehakibxceoiyqlwuuzygczulsilvkcycsyfxjgbvsaachckcnlgxrzyetprblmixkzywnquovcryhuizvjasuxyzxdgonimzvzlpojieqzaumdzdhdkbdbxduugcjhbbidzpyxazljardthmhsipmsrapfawzfjijtcwdlcmzjrtntscqspijhrwragbkxavrqfprbgzlligeipsicydsaiocngwkjgzmkidiimcfwhlvigewtopydexfxsenqjibkufwvbqsiaahytvvesqspqlnlhyujerqrtkggiwuexuwdchdbvszrrzjknwukrqzznxgabcptttmcjfgdmiqwqwrkbtefzmikpolmwvomoijzkdfsizzhyqmarvxdkwgalkqmtjtbeclwlrvrpgjvvhobeupizxywjdbccfnsziskulwicykkwntnzkjomvxmkvpzkhtwqopywvdkhduosolrhfuzeaafezeqtnurnxouwobqhcrtoucxsqakxnoehpcbmhwopnwgmasqrghdyksqthcdxhtekxecsnxnthytzjquxifkfuqfzjnuyydyvqeipshbnkphewvufwlrwqzxocdlpikdoadpymmeysdylgbybchjweuscfyzlnvyzevgrznrznxsntsqddrewcpsnrqfhqgdjbdfipnihuvaaskghadgvvmfrnarqvvotbbjllqkzfyfihetpjjapnvncsnpqgfmkgyarsnsibzfcsqfivyyhtmqkjknlakwxzwfntkdwnsiepczabblvudgrjlbmhozbsjcuqvcoghbbhtuepuczlitdxtattdhkfeihawajyznwdvqfcjasandujanfqdolippsjxqggxwnwiuhiujlttvziuwjolvhfdzlgdvftnrrfxcvjnygvqpwldszojxlrnicqxfpbaebfnlmmkofmkconaenimmanblfcvnhiwapmzhxbrjxcnoqrfmmbbhsvvwidhyfxwpyoyqxdilgbdveqqredwfdkfwvlnbpbpumkrycfwzytaaukhftkntlmtgocwlvciawcfcxhqojwuxxauijnbbzohrvmdgejvfyexqnpotvxgehojxjlczluggjphfhargnpczcxpmgtyhqwqpdljyrvpupozpvgeanfdtfouwrwqspychcaosldfcnheoxfevtinczvnvftjrssmomqasikwdqlrqmxhbklibsikxksrgcckqugicpltqkljyjomcmwdinyagafoojomxtnmpltokfubvnfvnnlyyoamdkivzdmnksukbrfkisjtqvhrpyoseqctzuqlfdziebjoqlnyzkvyefnsrxntknaicnhimonkvnnxakcfeoyohazvhauxfxagtlqvtgqkdurixpkchzuzszisxmfselqjpwxpfkgqgywvonymzcnlzuipewfvanrglfnldqnujwvikchqksxousqoubkgxwixjgibehbvgvpxdxyptusyhkxneepaacctimxxsxjkrtjcapxewrjhqqrjbyycruhtavkdkybtasaibovewnpqmiaybonhtnbwkxzmkqxrhsvsadaunijedziqseouxbjlxlsmmnwnvsrnijebndlmikiijtgclwwmrkidlzarhimrmxiwubppvffxcbmfvpucwndydtfvpibxwwcpfmzkdxfzbosblhscgrfbcdmtinntyepkhbqvjvjqkmzqttanbvvmvutqlyeorbrdtrguuchemlnlflhokdeorbdhdjzgwpvsagpfjbijkljofykyfedinozawvtfwcapgsgqkfqzwpjaflujbslajjaemwmihersbbocroelmpxynojmnipsalizvafwdgqybyzuubfjthhtcbjszwcwbpkhaxyhnyrmhelyukfxvuwjqdflepnawxbcqtqdgiulhfveqwpxykiqurvpprlxeaxzfrgasyccnpkiavmjuindkurowscegkffwagxukygkeaqwzpyewaltbcsifldkoalbpkhhwtmwpyuayowinxuglwystvuonpebmzqdriyvzaxqvjfrcryeoyxcqvomhushgxaadvoxagqrmkjrsfpixqxyygciswqjtybhlvruyrkjhxrvfvtuaendsbuqxjfitatyhfztndneukerylgvphcokzgszhgmlnytpirntgdwfcynvywkaxvtctwdcrpgeixixjuxxuiinnsvfdmdhinqjyifypopalcpsvdcvhsyezkqxtihuynpalxnbfuanjvhcdgrquopqkmcfhogeekdazudmqkrxhgyljgxrxueswruwtnbfefrzaindejtakpedshplozvwbcnbiztancxzlrabahrmjtcrvbasxqgptihmzxtgsdjubxmnorruabogmjnvcjtgpijlsxsgnzstttwotphldtjeukonghrmbxemjrifauoyppiyygcffjdaygiboedjtbatsalqfrjrsklmdxbgyusznlrcctdhgubywhenlffgwljxeourzsnwsdtdewbyxeaphblhpjydowqvdlrfjzeqdfofduoscuthbgyulzmtlhjpjfgpkuttunhoelhruejubjrhhqycsklrbbgqghuoxjvkijkpanqjkcnqmdxpducgvqqnjlzsfqkneluphgrjdoacvgayzfhseihsrvyajttrzstafduwlqlpowhldhceqjoulhyrhbwgymksaigfhnqkclreuqiuvaoauunomatbrhqgowuyqbilxinkulczaxbixzypldogkzslabzjwjpppembyjngfbbxnjdvpvqitjkxqtqttiocnbgugnlkfmeeedkhuwlixufoukwlzphxrvjteukwhzrtuzilwykhjyrgyevafiycajrbzitxytmfiixiodxzgvccbmmqyfwfglcvekdwzsixxarwqvbzewssqqzymkevsghetakjrpgwvltdeasinaspybwzistvmodpbfsbvoabfivjfturkzwqnppwvxamnloyjzxzyrtsrcisaeyfsagbnfajvmiffgefhedbtlirqkzwasloduraianeqcggcmckelxvzjymmoqhhxmbygcazrligyhzpkfmqvebnxdrmeyqdmvyttzfcfuiakiqnbosautczyziomwbnchsqunbsvncrgzrltdrtjzucwsgugsgmlcinfyjxeyrpmofuoacsvyfuihxbayyxeffqhstmdlnjzaxikrghsjizpxjtcgmcnwcaokrwtuyidcegfbwflpbejznlabjnngrkuipdxhmqwzcgxmribrnbzqdptjqgcxgahauokpvveehlucgjusuwiwqwjubtwpkdtjvioqonmyiesinuhpftqcgltrrgjifkielfdqfakvehxagdswsgpqzdvmuixsejutqfqaqysvrgnbzkvsizhsftxumjhuzyawrjcgekfyxqevktqzbxuwafyuigqduksaixgizjvjlcwvnwqzrynfjqtgyvaoxsghxawsdvyvlsodgjupaezraubqzyzsabnmuhhfzdvtdrnqjrixqaxtxlsrtotksynbruoeqygodmhagzsggfgrioukgyziwavvyxtcdzxxlidbeucyhexxdqoxbeufpnlhfhukuyeqdfophtkgomqarwlsyegdmcreisvxtznylkvuyakqzyvazxwmzbvgyahjbnkjszdxwowprgrqpxntedxxcbpmjncjndgeazacthygqhsdvgisxycjxficvguzynjejpnahmoqwjthnceorhaldfjofmknbxxdlsjeswynayldspbipkbopswlztgsjmqkjmgjfuxnfjdfausxjiulhabnvhmlvrlrqlrrcyfrdtfisdrfvymavflunyrdtvxxcziqrsvrabmpwpnruiqvqaychvaxumejaenbazitqmvuurujrhjkqzbvupaxmcsotanmsijtjqqefevzemcgvpcvmuavyaqvrhnqcdyviwxqnbdpulsqykvnumvxekcsxizzutqblrhzphepiptyozznfbzydhauzgesysisgfxlgvrernxfmyrogkdevjobgvvrcpfuiyobvrdnnodixuznsoparhvnupaeikwrwcokfndgjxogfuqkaugbfztcmrwjyevelalwtnpavfvgtctgqavnbnpamzpiseukslurxdexbnbbchlyoljnodknrjpsflbddbdiecvivvoiysjdiqdzbqajaunrrrfvbrpyhcbrpuhhkzixsugnavtrbmxclrxnzzokvdmhwphknfjgfivfktouvmqeafsoomlvvkssgbntdekcojqvarqfnxmsumprcvftkhuzhvaixzpwzwkqjhhbqyywsxmjizbkhpnfpzvavtivwhrdkdfildqxuktzekhtgdaselutwvshlbuuoyhsobhmlwnvgduxmgqbqwqdspjcijhpxmljppfztgvgvhpvzdsuixmgltnvepolmdspipqgzycvscjlezcucdgvftjpljqfzfykixmyjofwzezwtypwiejxdpughwyyoszmxhuvfvpmlnqjucwdancznzqdgdssesfinsydbuvkrulhnwwwvyzftqtldntdgivtqojyykzfjgxyypmtvactudpasgypucbnprzflgqttstxzybiqwppextvnnvciyosawvckurapofuimffgnzczqfcdjaknukrpdeugvppucnwsupwophrjwmmgtpahydeuhfxlafvamwnnncndurxbzzswjqwyzivgoezxslfbaaddqlzmtazemtudnyqwubkvoptbrwpgqnfbnilksiomuqyqoaiiiiwilfrvomhawkbyuoijybgxmgqxacrxxbzfaygwxsvxbnlnogcisodglrvfxykaxxhxrqornrdyvsklphvmzoknqddbihbljfekmtuvspxojuduevugguzajjwgaxufpaocgyzbtipzkonlhljvkhjtlmwnhlhsblmogvqmyhepffcfczwyptxuvbjwtiqxojnbbebohlsvitrfxkjdywbueyaewpflvgeyugrltaqzcxsgabcfqlpvfewulovdshbrkvovhizsmkndmzkuvvhbwdciiphhbvsnylzuewxhojxwefuzrzrioibfdusjvfndujcsjauehlgzhvkfijkmrkbbvgmrizpphozrjqojizeelqagkhrkwvfqwbtgopsnviscxhfukfinkqlvfbhebarjecpplmlsgtnodwcppgipuhfngonrrzihttousnztcvhtvabvlyhydurkbhnvnfmfifmornjzpbqrwucwzsfnwhfhgwhrvgshtsfawkvtxgzsgotswcrnmnfbkpdgyhbiwizyfzexqtijaivvmwyeauclaqrkjodfmnixwxcavxnyqofuqramvzvolxfxwsxrchcvnhamhrppyvlfscxhoiymtqqhcuxxfkzaewhtyntxpxcwasvsrenlmufyyvdhjnloxtwzocklplkrgmnxixqjlcrslmxwfwqzpcnhqnrsurzyuprzxixfahcdxlmdzunurstvfgeuicpflzjxmqgpeltkqxeebpaicftjapeayjoswrbkkosoqufsurenoknhlgtipgyclvzmtkpnaomijifedykvdtmwrqmwfxfwzipwxjvppuzzyavydxpdxrqelbhialeisczdyjhchghfwiyibtgihruqeejgacdioxlqmzvchghmvzexazjflmbbruhafbqrpyipaejxsroeamiyvnxumniwtlmswdvwbgltmhtkqitbwrsmqashzvylnwcggaauhomxbtmaxlcvanrqdmepiqknsuniureupvseicxhqopjnzbxvzvqbctkisynskniebcbvfzbycnxajivfhyouygjrcffeuphkgyiuqekwnmzbqtbmjmdpmybtyulrijhcluniwcckrldypmyksvjtjsmtipwzsqapspkycsxfozrtljpkznwgtlsriwnpatsqoavrbgqbpyslyykjgrdaszonmieyjgtnesrdashueddvqokvugfdrsgsvhydxncrlyxcziokkftlgoopvetrcgbjqlpzacjahguegqnnwkksocmbokxeieuecmhsfzaridohabtudrlvvaccnzrbwabxufshpbbmhnpevvgpdotoqyixzfddduchdorkxwiokspvbsfxgtopevrpjllmhmekpiceqzypxkucqpvwmvjaqwouwuchofnveshvoiqbhhexyflrkmmtlyqouysabwcaxbxaqqptbckwygmigeyfcpqlnqhhmslbxvrgbptvkvrfygnuayxpcicenzftzfcvsfzogqzclhvfvigrvsedwcoxulpuigioraegharxdeprmddebeulodwbfxqcxelavmaijzviobmluplhlxvsrwmgzjxhaaatqzuqopdauwfkirxatkouojfssytmqbjscdmzouhqqcgchzbazayfdwasvwlqkkoyclcndiukzymmaaawevddmnmwvxxmqshzuhisycdswogmvoxqjokbchxtnoagdgvrrmqlnddqtfsjnrahrcnlymwfjxsiguuqhllvgvwysmacvfirbxerxhlmdazipkpcglzfwvsutyxqfaipzbpkyyezjeohuwfozmgpjepmjlxdkvffkomixkjhqbnxkgufzwgddclphoqakxmfrmfvalggytcfuqlymnffcmapaitxnhoxxiiboalietkupcqhuaoyuqgjtdmcnuffpowqhssyqlahoxkrdwbwtgtnrqbtxaoqxtcglcqmbubuhpsmwdjaojvssnwsyrikugxuiqwutgdwprwqgmxuvgzqokomjspfvlrkaezscbvdtspstkkcwbehwiubzvqajfcxdjqweowjchnoarxqbconnbndpubkuvbopnedvxctzaitriogzmrzqhqdabwqlmlcwvedmafjtyrdwwplhtripwsrcfizllydvpwjgouxdbjquubhxkyzoyctwupjegtplsagrrzcywnhqezwlaupjnoaqgvndxshhgiunnjdyvyczxvsbyubsjudlgqflfamcwvcfjxrrnlaeordgjknpfadqdfvtcoqmxhgngigrffheuqcsiogwdpgknvrgkqfidtzxxtisjickegemrsvxmpaljweidkjtsqwsripaheqmpkyapexvnuijbhrzhsmtmoougannlvsvzrlrhwvrmoezscbdqrrstofadstefrjftwbvupsujkteqqhpigltegplircxaaivpiayrajlvxknnwjcevkjldeertiuarwtqeqctniwcvvkeuijsqmzfnwxcakkykodturuvrtwegkrexmeucfhgmovsdwrbvdqedeodmkeqqsyaxzdfyhmoyzrfkeuiomnewloecftgpnrqeokvakbtfusmdrppriujomrfrqzwaadxaujhngmglxqktverrdjjeigvvlcbymbejyabkluabnvfhcnffjfwyjgrhczmrpyqzlxqtfvnwuftcbdhpnpkjeeawzfngkybwccmlgfruztqwbavwzhuyqkyznqdqtmbeavgsnyrwcerjiavgkuvjwvsaulugfnqrfsmidctmeogfsawhbfcoliswitggwhyxkvjfxkxibzljqthnanlughbtyuhyqdtprljhmcsefmmqmwssdrfjkkkurswfkvyxasabdkfkyxleafzgdvapxacfkvckfpiflbsjmhrarieocxjruxsnkbkfznmzysnkwkxblllkexefkwajodquhycmmihocaaewnrfdtiwzxwafehmafrukmabrgcnmygyskgfficxhodglkjjwalosmynrruhcjvtawaraaoybkwxursttvgpselhfeudonobfpibokkvchbyyzizdpontxlgceltplvxeslxczunqiagcybiznrhxjegjrazuhdgguklfjdnulibexfdriqtrbjzecszbozwmwyduvpjvyccwwlqcqaflrlcalablsoprpvvwffesiknqvhkhsuywekuudupgsvqpnoszxpqvwqratxyxssyazweemsqpljybamzwhvuojuylberwymdvazydziavihbkbyjcryevmxxpsojqicvvaewdcwybfpnmziwyaxbinkxzinkkvhepxsolpivackhdoougosrwqhzianlwownynuorhrtrtudqjtwadufmirjirxhbphjuyscrsicmjxqbhbegwkxsorwykspeklaorfvliskikbhbdxcddvckaoxeiyyoegqbahabiyfjosqyfrhlxppcwlfhmjmzkqsyfrpjrfrrlrzpshorxblqdemgpcpjlhqfbuiefadqsocgxupifsihuvtxdbdxhfitrocybfhgtcstrkkjkxhvuuqglhdsezrvpvbrjyxriburkhzmbnduwggnemtacvrmqkjbukpkxittgqkhqimozlznjlgsvcvlfkevympjyqhxebrcfiktaykcwujnnyzaimjyfacgugfswgkvyyldurhjphxlulqzsybrbkbpemculklridgrhdenxvyaazckrqodfrgbpiczhnvcbhojwwcvcdglhhezyuuatyouakcvcdgifirhvxrgujykcpynulpuzslkqbklfppftavzlwwekslqwjwdswrvnkmdxahznfyobcextgdvngloddczhsihopmpkugzgqpcpzliubnwzvcjddcrakvwozeashjjrlypoymwxxrvjrafioxxglunlyclkibamzzvvnddhriaxsnyemiamwgbgegsvutonpifozczxcbefcgbbltrmxdhzvtvidfcqllcaytcyqojnwvucpccfflkvefonizlfkohozgdocibgkdlwuqgqzxrjpzbayqlkxlfcjtavrmahvbaptlftfrlmsrwekvbonokqukwbivirfnqvdrdxnnynjaxuwhxavbnpznilxjadlfadxnyfbphwusrrgiurzqgjzclmmxqdsdbtjnvawoxkqqlqlwrfoipkmvznzdxrfnzwnmaexklgimwncgrlehyvtvxhsethrmwgbzfvborlxcnqzheufiabykgutwpdccimuofxgdklezzltnnhjowuhnroszwkhhvnyzoxgkrlanwjkgsrvijkaabsgvacvkqoxpjyvbcojbzyamreioyewrxzzjburbtlqwpdtegpytvaahkngasfqttkyydmydmvdxiiclepuudegknvxvvlrxpgrjaqvtqyffihvjujnwqtaknwrjsixzcyjnuvrlyjpyrkpwxvtwyiatzqoydrfdktvmsodaamdcgdjerniurovwgdtgwmxvjafeldgkjolzitvicsqwkbyozhmfnuhdtisuepeagqlgfbbonozqjqhnfztnrcvijgdbzwvfafubkyifqcyuhgnzkphdmwahsdrimgaajfkdbvkxtraxkqtrapstouxfhaomssbtqkrxxldiuqobxongcnsejsfwlaaesrjtwkfgfizpjwmfuuucybwjmrcpvdyvnlakhvscmqejchlvazqyhsecnbjmpbvgzgzwfdrrlclkdibevrhxwbzbgiryzorqeckccgzenffwjwhxdeyprtfctkazbldnkjnqqgliamqdrhyhusodddhzbsbozgwasthrtlnicekcaqzvlgghywxixzmddlhyfyzbcbygkjlmyznemxjcdyqbkgnoghgyuzogngbgijtpxhhlkdktkbhvgplimbweaoclzqgstjczpquxtutkpgnodsfdhsjhrmvetsrwvbrxtijizaouynjerzcmrqedaclmenfscytnntuswnumqcuguhwekzvgvijxlybrzhedtzdaxryvkwxbfamusgnaualhzavvkiancufnnntsvnyhbrvlvyqvymcjqzusytrhxrmldfzvewfnjsammedlupryzjzoxoqznwrhzbyxprxoaszzsotufpsgghbrjehskysaoqbysxfxjnagkfgdpuehufymgjncsrjztqderlojsobjzxijctjfgurvmmzohgazntfzhflbamsdcbapgjohpzblldkviiehvtkymfdikmdyoeddgiwktdeihuadwykbiibhmijyeorzuayhlqlfvfpnvlmwsxhwsijelmkwldkbdhswdctpdpedgovfkonjwfyqznbnjbpvgkkxzexzjfyvkcofwnalbdwkjyujbuusbnbtilftrypyxbffrskaxmqmwtcppbfjslavrhjaaxcfyuicjamuzodhpsmydldnvzhoxckjoafyryzpmamhiszwqipexrrmnnnovfyyjwvtqxdhvqmgfmmjxxmqzudfchqzcekvjudygqxdujqylaqrlfitljfnwxueumccjqvtokhumckpbcdcrleztyqqkktymvrydkrnqynwfzvgmksejwmvtuesrhfbexqlqsahmsxiyojewilqntvbfuclwgtzimdqliqbtgxszmoqwmgtqkxllamolwcehkerfdxaicgskmgxwthxtdxymzvmfhploexihmyygmqmzdiwczyqfcvatfsibbglabdoohbvgladolaxcbbxfbzzsumhyppqpwgfryfgiqadyokqgvctuyzlofalfoejiefstupqevjvncxkilwpthnrooezmoxnlrvlmpichpaxndrqqnmwymxegjstsxfxmyxkxkxihsbllxwkjdngsottnqexpbyinxsksfdasxxjobtlhyiozyirhfibcikmjfqwgmvzkzreddvpnclabbfjetimzkbsfxjqnuymmhvrkhpnrsecsecrarxtdhrgstayppcqzlfxxguznfvzufhfuvhhuzybhldjotavamzhzcdzxfptmkrkgmczvzhmkzubzvusdshnyodohquiamhusmvzdeafskooggljvodcjyzgvmofnxllbpixqvcjxcwlzrqceyxacdjguhoslcgneznpfgnywfrzxzsjtbvezvquzgxyhyzmvfiqwskigneoxycrhjeichkhixcuxodsagaveuasjmliuqjanhfxwbdfsukroowjfovizudaxxooqdchvzxmxfbatkkyzniymesyzpdodwxpkfrlisviivotxckbwyrzchcechutemdaruwlzkemqaavwuukaazzkigrbeeimfrpbzdijqnqqkdvrcvvgukwzisjomfgdslretdizidtjtefskvvmihibmsytbljbogtcmwhpmoxilbgijavdllhcyvuuhxermmwogvxssmrvulgxiqcmfhvanfzcibluriuheseykxdaeaaraqvgjggksccupfvalnfvkwgfqptxhuwzhcrhfcurzjttehrnbsuedmmovwmgurljttnykekrkdtrczkhrtyjwikyvmggdsiaatplosrhiekxkqlunjfgyyxfudgforhetgzjwtntutziyydtfcxpyetqqrmxiqvsfcxlrsrswqjstorkzblrqfvkqvttmnedhflzicvgvbzvfolhyuicaruxmteqoctujqissvmgljazzmlxkheluevxelqutngbtlwlhflltipynsdvjwaffuqdjgfinfbkvnmnstclksxscmpggjitkwlmwrgtfqypmtavofhzhuathefieomuhzvrnhieywemfpywpgxbyopznrucxyyeoaacgpnmjfkohwcymcxcjqriqkyhosxgwjvxcxbyyffjjdroxlvrvqhqbjzhzvbubyjpnzfhskqjhxjgphlcoysmwqreoqaovvlnnwhnnxmdeloaxauiblrwkwwqawabefyazbnebgncnclrwazauvproezcaqbdmwsensfpwrgemidsblhsdmmbpyixpxkbvgqalppyosxhfrsmutsikkvaimwawerxaicyqmnscgwprjghpmttzhqvxtpmgheyixhdeuymssbgznenwountudufltfemieierhcnwsmntrantfeyeuzinffjoayqlcheaddxgtrlziojtidntkglkxejlrfxkgernvpfxyiznezcmprrofchurhtaaijqpcedtramigvygiuylqkeydvekwgmxalcmkcdeufqpqyhxjwepuzxumagwitznwzzguahifwphywikpdwaampmftadfqjnyyazyssnqwtjmvrssicbtfzynqcppfwbwvagihxzyhljfjwjioxdrfunvtrxrmqcesnkjiwshafvazlynceqodtlwpsdbusjzuxppizxgkyldxygwoulxfgwqwedvuofpvlvdmdgmcfjjslfunfrehzjwdpgmuxkpkcfkdcgexhkergecaqlgeikhhfdrbeuszarqkiaklrrfashzwtyhsqxsicbeipvxhqxibjgaxfhlinwrtvjfdvvtqpxvrnxpojyxawebixotphbvihdvwxuillwognfrhlznrzlpzywcmhakvwtzepograzupgveoinmvwywjxtjbnvgwoovnjhkhadwbyorgzpwyqgwbllgihxxzyuztumngbhahdplfplcdmmvrffslkjrsxbjrkwjqchrzeynrzjokykzloollwdnceqmdhxsswrlkuuygfaoqmczorrwsetggqwlwinlmoczgysptuqiatrzjlrvqeafoybonqfjycajxsisrigulhcheqiwezenqqheigebxaecvinfumubktuysvoksdsdxegdytqcwypebrmiweaykwvevrredqqtewhaqbgzzvycedpbqdncewsmunualdtcjvqiuhqpykugvlxicppviyojsotzwlwghfbrpbfixvucjxzzuucfvjmxlblyrriszamccptgqfqkenbboxwarqfdvzmxoxapjbtmsintkdunlcxlisaxwwpnaknmamhkjbaijffhgztpvqcfeqlidzwvzooljmjyvfseulorzljostmvqyufpkyonjewycwriedpkuordvvilpwvabesydeivoueutdvyuyfkxvqmyrjdxagydfuitxaszkeodxebkavqbdqauohhtnsqqxqkmvpvxwubdwoafrkubnxcslynwokjpfkinmtsceevahscexalzycigsfijnzpopleoymemdyeiseabblwojqyebpbzliojjouriazdxwqsyuimrrwygnsjyuwnwwiikndmuggifjqffrvohgvlqgrmcamzrlvzmpconmyueevymjscabxohzucmudskhjcrpakjxjifdvmvjmribwzhmerwzvhrzcqicjwizonrbimifalgwnsgibbbwtjofiysyoysofxqeoaykgombfablfmddtthjrzvlvvwgmpzlnypkxrzurtocgiwvftymnjrlyybgmlldlmptijhhptnrfbsbxlcrgqdmgzqkvfrgzazgujbknnggnfmeworwnhqzeotnottxngchxqycdpcxvpdqyaqiebvafxivrzryckzycxevdwzhkrefbxzfqxcarudgjdipcjnwstatbupafjngdscobljezrxwergdhmcltthjcwfkkzjwqveqhyjkzhwieqcdnpnpcyndnrbkwubitvxcvuscrsqsplzbddjzxovijuhtpyodrhqblzcpawoviagznybljiskakklxlwmgryprgzvixslfwrcqtsugnohnzaeifsvfxatwrrgsrizdiknmhrjbwirfrlqlcbegvbmihwoqwjrbzbbntaetndmabzweqeaxpuhafzamxqedrdzgcizfmulrfkaiinyuoexstkynxppnhmkwxrymdwmdqaxwyjmueyocvdycgrcnvgbtzpfrsckqflpizgiojigmfabmbioydsrludvninkgcsdudqvhgtshxjyamrkhuaikjesodxgagrlvchzlzvpqqofhluyukbctiypwwbkthmfcugfnphyvnqluhivulidoyqymwzapepsycymqbedziiqqlonjlhvhyqdwquzolquqsqlbekixezzyxtgavyajqohimdvsuemwisehbswkgmtfvpqfoqdtgkndwkiwzngacoupaqnmelxjztebdtbbtzgkicrzvfofcrvwjsfbfymzwepibxoqmoeknuyimvxfvwthshnazaqnnjgcwibrsmnbrvwxffeurywkxjawqieqojponupwrdybxavipcpudhviwulkcjcqanefpqoshzuftjzkxqvqozxzlknxngnttsyqojmyvlgxjiicnedngboklvkxoqnwowgcimllkifpdgpksaqtmcqmaoxxpsiaejfrasnrimeixirfdmtcpwcjwgvjydrkqktkxkincanepupvyyjlhrzhinsmgdubkawnhykzsofhzahsjykfpxsyvhyiqydldmucxnasowjnzpnfpztiunukrriehahkpsrhcliykmuatgqqjwqwsxdovrunldcschfqfryemgohzacspnaidfebpzxljwzyegvcgpofrxvnsfhmceezywfnxbaplwazcwkytjyywctznquikaqwdevldwxtetdvqndpidjgngpzsqbmkijlxehujxwcpflbhgsffdyxunuajnccawcfhmwyvsirsyaxqjjdccdqxcdjkpcugjsrwzcdzyhtynrzjjqyrpmdsohkxjepwgfnbdpybrrjtazokrrscbgveotbkznnkigeltjxggbtgxawpuzecmvxwanojvqpwlftygihpogonpvsexygkvtoyctfpxpigdlxbwiptyymsgoovnamcbgxzigzvuvqsmluucfjgfxrwkazmdnxyevyzucinpbgyromqsmupidkrfgryiiejrezfjxmkogmmyviiexxvmvvpdyudcbeowlqjyhrcdkpmksyfqymplfvbgoyxijsuhcdmkmbqagtxmloyqpfxozvtpupcsaoddatrjsxfsdnzgdcbfmgpofxqqwtvevvidnaywizvdqjpxnlgtfmfhxfsetwlavezgirkwmvhgsrkkrxixtsdupxkbwoyzooylraulxvdekdkdbvhbbhtbvanbacakwyokhdmfqstmebhvbjshnvbuwuziqmpvjmqzvxxqzpqdkdqwdaqhbqnwsrqozcvuvtraiyosxxikrlphdorkgpwjvkdubpxbqvriqwvvqsmckclgqtmyekbjxscdcxljmmqbewfovuoowscxdfvylualsycoakikgtpmvridslprbrrrklaifbglrmghwtyskukewvhzcvherloensspypeqbutwnmonnggglvvanlwvkulmooaijgwzonzahsifdzxwsaarhuurjlageypegwkckjdhlljvrbjhrvliwdzxpjcbjgzgefucrrrcovimccrhfvslacuwfprbsicawfidbdigrmkwlttzsgfdpaqzxozvbhryplasfgcudentjzeogozbislgfbbzyilsqmrldvdbjfkwhicnhkvzpyzqpiewgdxksveohxybtydfpgciqomywebkqjeyefysiecnkzxfnwgwjytmgkyfgbyifmijlgxpfuputamzxvvczydqkwnkeixaxexkmkrloaxkeojxtcbzrefmbyapxbpmyfewrfzskmxowdqfpmnkngtwmgumrjhqiiclgggxcwhylgndmvkelkonqnsfhtqwmaglrimmqrindctptvoalqlmjnrkakoqtdlxwkqvrerkeomjpzcjpahubyjsbvcfrygojytjrfjlnoksojhhieatimyowzikidytykyfxwnksjdsoexyicmdolrjzqipjaxbqcuttrqrwkqvvefvkhkwtwldqjdfqmjgjspuxcbnfekqfhdpkzrdriojxhklaqdwsuhxbllcnnaiugnkszsfnntyvegjyxgwuvyueoefwterokydaiegspbgwaqefgtyvuzrojbgcaixkxsjoekzjdfrhhlbyapnkehwhqdnikqfhcvzvpcsxttljobndrljnvpmknhupcugwbblrqpqitpnvlalvcgyzngocsnreurfgeyscmcrwesvelcjmbgjbszndwntfprrxogizdghukhwpoywzxxgllxzmywfaqvinttslexmqngwprmojefpnorjygcgodbrieyannfsrpvwkfhmgkbkhspzeyidgnbjnvroemoxtkymtohelidnrvuyplmsfzoskckszjzjvmzhualhcarhoftqipsekqcaqlnkwjtxhlmvxjgvplqdnoohutukhbywrllqsulommlqzduljsmyloyyxzassjtomljkdprgbadfuobicyuaptqmcwwbolwjxmbfhegqcqcqluekxugwemkrvhnltugzpkccwkhhaeemefnefrqwoqjjorxpsrsubkztzuvactyffmozpgsqxhpkmmqmosotuhtpfxvmzxrlzibsrdxpgztgctlacsbgyyncacjytjtyledfrwpkridzirrilycsfkdpsefsendooydrmzifzbzasszbznfvroyzcnkqcugmjcdvnxnwllwzozimclaunjvfgzvhnfqarlnfpzgeooyrnbhmmqkqqcqiovstbnxebclykemluoplcbmwmavfpwmvzqeuxiezaanevizxujhmexlrypetauvglygeymbwgydflwdqampbsfrilrjsdvvjelufezkxxqgqmsakedfcpbnbnelztlbzdyotnmxgmfzqcmpztedtftnaidvdzearomsdfplszakfanuwevbrpivxpkrszvbzgjdjmdnyyxlycbpdirevnobjrkzbtujscgrssuzfztmsndpdhryojqcjbmduokgeihooifpbasyghqhfddqwlgterhfppaqiqhwtgwinhqrysaqtdkwjtuhxabequkouxbrnrhhdbwedytzhmieivmzdlwflizywmkmlxkqtgylbeasplgffybkgdbxtyjpufbtegovedujodrkghkakmaolnqlgqjfbfklyouokisdjevfucfabewiyzpqvdkfprhcsryjkuiixemqisgjexsdyracrxarclwwwkenvketvprcyzryiqfxiglcdbjidcmuyvgfrzcsphgjigadddzcepiroijmytfalimyofpoxegslyhbceedlrchnyxpstbkuscxtmlndhnsfimhdtewkdpkrlmtaixpqchkfruvyqsmgdddyvvaflxbvbksqrtworeexqmdqxvwozbnojlnogrozrjxfclgnzlmrwwwfstyhuopplauipwiyztexrcsohskzoiwlqcabkchlffamynrlxotopzcnfvcmxmgsbmesabfxgedjasgxwiqfswvsbvtkhcfqucokppzryipqulpvzxpxawntzwgpvbfiluuasliofgokugpkpdrnzntneqewjrfxxwweikdkncqkfjmfmkswedpesybqdoyqhyebmauzqouckwgklwsrkbczgpmbifrkuhoerqpvfuuwjyhoavnszbbdyivbewpotbwxxfaolzmbeyyoybivoitkmiiibxiyoqdcawbzdyqvrcfefkygpkaxtjxrqzhqhqfeusuuvshvosbnquvxrlamtpgvgxtxknwmayymgnvkkkrsqfwxptovfphywvcgkafesylvxgyltzxtiwbddbuhqrijhweeeqhkrdiurxnobwsvqaxsfhrcegrrmfppzboqjdpihbwwhujnfbvgphkjafllsgdbylzshynhaxjmbcbwynsmplecyhotaifctgkqdctzhjwmvofzqaippurkyicikbignplxmcgvnnrtlsimupiosxsylxfantsswqgblxjycbkbexlwhdoyrknimlfrsjacgnvvkwxradtwnswdqzgotwdqjuedbhnurfxyvcberihtxiyrtderzuocekmzzszkqeokgwhbrctitcsxqmznaqqyeyeyyxzfaotpejhdhufqmoncjhczgeayxbqkrmeiraobjqzmspzzzhgnduxjtdcjqyykknmihfroyetuddrhwggqabympdujmbykriudtzkdyopklncsqzpkxutorkltnkhfoqtqbzxrlxkopdewibfesponlbnnehqmwhoqlefqsrgqcesofpfnvvhplfjdoaptfzsvqfuwwpxlbmntceifyiwcbtleptjzczljbgakjvngyrewqjparuysfxdllxmstekstxcrwdkxyjexlbttrestvvsyaodfxnwhlwlfcxjqmfdakwrxamcveufytgeomlewoqvlshhomftqgiunmusttnygxgaxnuusdnukfmeigsntvvrfhnjbqlckupvktivwykdpuupnbagkxihbyydoyvmmlmzvdugjkkheltxyivndexbamqfliaejorxsfjwkpanyiidcndealbcmmmghtwdsveaqznoehsnmqtctjdchqrdndfpfyxfpyppobmodakdmvvtunyoptnhchagoitcdxcsifagvegeaxentycgupbokxqhmodtupmedhyzjhfnotabzidhwrfvjhlhmdupmxvlgfogzggfjutgreftglkzzwhnklmhvyaypiwayvtotkaxeevsvdbafwvjnxbnyzzogrogscxmhpwrypasxaqhkmqtcvrfnxciqunaibehkzkxctryrnfuihiqvwkewnxmusfhtrvvcjymrqtjexmtdmepjkurayctjpyjtosbgrqpnosnywzujojanmnfqkowwfnlslgzjryoailezgeomscespgfbmicoggysvwmxjmuchzotvkneybnmyqssdmqeserxiyplhlktjlupykhamguwoxtxeoztvblugwvnewkabedgrffttdhzqmmluyycbxwnbnzykzpzaimpesuuikrsktrhfigmwiehpylncolazyaoszthcyckrznovzvpdpywrrcdhcvcpkmdstxkawhchqomyngndbaquwngpyynlwmewpzpptzmwjgdtpocjeoisgrvahetmmixjpqzsxbdmwrpxngdewqdzugyoqlfstffpnbztjddhadsulvmkdiwfajmooqhvtavcexhuxndikbyaqujbcvllmldcblqrhhicogervcglawnglpnemflywmoeoncgrlpolxcolzjidioewfxgkqtqdavksolozlnmfozolsaqpeobkiiytrkcuyprulnkozhjfcomsosstoafyxcnnyhqnuyzvcvgaerzhhdpdubiekcmyuvypffckaagwddaozpfrlryurfzfprspicdfhuegedwwzhjnheugmsohymnvvskpyrmtrxbucfgmurwuzohfhwuuplejlrdmrerwsbdxwhuqravlyjstapsrpzojnfexuhfyhvgqvovgwvelpqybjdsnctmztzwmxswtlelqqnxytawcfvjtfjldypbpvxdxpfpkrqcguunarglejlkbugzbphqrriaumqmycgilhyfwhefisqvhnmuxsyzftmieztzngyuawgiwujmrdrnwnpgzkrfqgwdgcninpzahiyhfulfhsxgdlafekjkkvpxkqoeiapwubusnokoxadfmvtylzgodeftvfrgcqmgrrwgqfcpwrjotxvrbnmseksnpijhakdvfyvlhxnbggjgtfwwerygssdcnovtkaganmpvpzxfnptqjzbfjmeqborzhildukonznslneqewogguhnhklgabdypfxhfznqnsqqfsedtdhlheadfzkkaooeakteisizwfquhuvrzxmcosfusvvsqdqmaknvyuewjobkjedatjwattmmfjbmchwokglngrymhjmqueydedsztytvhcnliyxpxcsemrzbxvpnvegwizkivrldeuxafoucsghirvsagqnplikhpzehtrhfgtacdvghftwwpxnikieetmxbexjijgpeqnpfssgobhybhxvclblgqyddfaihibpkpjlduaqvqiyjqfwopbvolsxajlczqxvwmlpxikbgmwbhydnbfyaqlqvstzanvjybvzvplgfymcwundancozbxwwixgifxnqdjnqfbtexnnccyzmtrsffewmceekagyzrynqxlvpyotjjlxnfpxpzcsnnttnhszqaicllebjpatqfacfcmvvkzflflunmcgqmegspfoboosntuvqpedufgxxjqvqpzqisthugtlphpsymqagjhijowpcvulamdyvvzggbexkotaxqqidqxyubfmxcldznkglncxnwzighhwtthbjibfwsuezjapnftikzhawosxdmxaipszqlsbphnclnyxzeytlgpbfjfoaptczsdwupisaqwxfnxsvntenounaymxpwkrdcrumdmegzonyfldocswtdmconmgchvrnwojclzijvjrgcheuimyehqovvkbjhrrxtwvkiqvgdfaqqhhqfxqnrhzhcihlsfudmzpbootwttckzvkeaunkuqynzvtrqhkyquihfmvqlqzkwuaptcketcwedlpqfkueawmacvbdrbqqppdrrofxrsxipwqhhkvghzxpctunuopajywwmcugksclsikbmquylpohtcnxjwcufdaxujysjikizhwfrlxkulokcwbqetnnwfkyuhdioliofewudpvqlhjgefhtmbzzaramhgsdwffutgrukrccwjbatjwiijafszwhyliwedfdmhciuxjbzecsasaxyechecrtbvmigvhlzwszxuwphybfsqobrraexvjcriarntmpbnqltvutoyduotrrysjunknjwqepxelmqrrwnkpfkqksvzucankpallvthbaajlvoszkricstyegknzlmazltfjikksdlvsvtxvljxqknbvxskzbnhwidyfrguzdugttvyrnhnkelentvrjfcqrvizkvzzymezjgekvjbiungdgfjbxecdkgfohdyruhnaaaovrduptgxsuqmdarwqvupzspgglgmcuoeopsxztechiygsayvfeqnznwccqwpnaqhxsbfkzysnmchhbnxjcnjihubcsgfqhvwebwlkcizvuoanpcfesbbzevopqrgsgwbnxcliffremdwhohuduuaydhebdnclfgzckfqlgdgkmdbvhthqaezcjocmovrncpohicsepnyqfwkqjvbzdvdtefvjjfgnnsgmjrbjgkuzecsykrutykftmluojyusirocfxbzdznageunbluskrpdupmhhqodxfvvjfpqlkjkprwglqrstnoscctozmwcqbpwsbdnjwtlqlnrysrphwxmgksqxzipoyamjlflxoxigarikjnmxyvryhahhngxokdajjtnoorhftoxjmfordwonkuorzbfprczuwpybjbkknpojirhsldxpwqyynkuwlrrhwdbgfhlcljvbfvfkkswcyfiyjeodixrdnjekmfswwhyjzdzzoonygycwijrwxkpuauhsvkhkekdwkcuzqtzvhumldazpkybnwvqfzycugeuwhdcolinlecpblxzdmhukpeyjloadepxxhaaldytifituuljyjsmufweigrmkokvhivchrwohfnevpoekkmiuvyydmberlxzoiapzscmemjakmdysmgbsmgjbhcgqenbgdwdwsresezkjchwlodiivzdpcctzvbmaejfvsrybloqpkvxqafviztpikipagvuaodcnqwglkipukpwxkqtbtnsucqmgfowrlicdalomwzaimarrtaloubnrkyiwnxefxlhprdgvlbwbnaikslrwcgfvnjavhjmjbfeafqwmbinplwpgvtadqjazsetbyaepuyhkfxdpcfaitwgkuiejoidnuqfdnpvczkqcguvsizfwupdibnacxhjvfdzvefeipymqhhmcdsyqhtkboihgpyuwkkuvpispgqpsdqhahcpwpvkmuqcxrmsrpznkqdtytuxikppunszkylmgsveosdomrxvxsfzcyukgbfuyptgnojbsymdbqqcpuqsojjbsbkbqplmvwmfemqqufszwtgmfbnzdklscznbtfoxponolmyutskolcmorlnovdeofueiamjcfunttbppgbcvfmzukdsyugaqmsdefplavinjuvgoiqkilvokjbodeyjaxisxlbsbmryvqtztagdtsldpssbdgcnoojzxrqhqhxinbrczvewdeixnsdtihdngtmixedvsjqdefcsezvvnbomgsscmxtcuuccuvnwyqvcdakyrwzqkqtvmbmurkberjxkxmskvciyphorwyrjttwqvaohslszvscwqcnjbpilimgrngjhwgunjkgnwuthtxwukdivmvxgtdjxcfikxatyduvriedffivsuhnsseaknvttrqncbtloyybolbxbvdmzexwsmdrggpfexmvjcxgsnatoerrkfcnlxekrptdtxetfkmujzobqtjglneztxelgfyargbofwtxdtwhbclshsisbaurxhwirgxesihuvuivanvnbjdqjlcvvavrcjrviqcsgnqhftzglawkxkntccgpnyyimzugvqghytmypqkgscnnuzukcqxqglhcpqdvbxeidnomoqelddgggefenrggiaojvtrtnuedismyqhodanzrzivckcxndljlmayikhgawvjhuognoezrikhwgombrsnwwonidapgnsjwccvuzldavmewjrokddumncgcbcqabaifmmssumdditzngrrezvdxgltozfroyrzagvgiyehrnzlbgskqcwxrwezelfkwvnulufwlafovreaaoxqfjevdseybrrriwuiuxialhtdhzomqmpkopceoimldjzyoqukkqnlrmbpqxrjyjvpxzkbegljkviqrarnybxeoixdyentttzdipuidksekjisxsalraszfbdyciepyokzufvuejsmifjumeefpwsletdhmihnjoasesrmuykhtmoolrwsxiayllvuldfxinepeprnvyrughsdlfpnbmwesigbnrcxabpaekrulrywevtlyggjxwalzyhqddjonxtlptpxvxqcsiamykfzatzjsvecqbzhuxlejvzaoqacbmblulctzfmjbhhyjgextfpymhxtdxusxqafsbaekcqdjyovkotniyldosxpiluirkrgrsgmbvytwzwarjlmfiyhedeyfwtveqijdtxuflwcbqgwiagzevjhwnyeslwogyxysvzdrpiztqlufyzdafwiivctawkvgzhqaluksrdpcldwealejoophnlmqevdwsefpuiaxfvxzxsvhtihokkixnvwzbjnbozljtmqiwrgbniacbmrevhtknlqtjasaxxbqkyxydpkpuvogmsrpuklxktdsvsmspuoomlxjfvdhaebhombpodasocimqyremdhuyuqvgjmpdocdvxeqfefmenldaqnceotkgtshdjtdradfxvyglkujkpxnxubignvghzcgvjnqocddlcklhkowtkrspqsulspaathqpuicpowydvxiixmnksrcwjeqealixeiaapcclepiutyqzhvvsvupeknmwuouktawtophjjnmrroycrkefcgahnbdrlrkurkdieegvsrszjcvnctttbillbcmtdkqpmutttbbvvxshprndneuqemjfqiheqyryjkezjbvmqvprxicsjktwthffnaaxlhkrwexrfyaljjpkjnaiettnjekhqumavsjdddxnepuuahebsmwezgipbvxnsqnafyytmdyfmbmpizonxhstbqlmfytodmymjbhvbgnuvllmpvxmkpcwhwzbmgqidtnzvirhexrydvcznphboaroepyqdrsleslndihnwfnotjizaxzbdziqimuphvlzpidkjvaaygutgpiodjactapclcjcbatzywdfvyhqxqgirlvjkklewbwgeqlnbibytrkzgybstqnlfrooibruvrvndwtyptxyxivqrszkapajysazostohgxxffetusvspjbuobrvdltcjtzpbdsytkaidpvidnnxbxcnsivhapsywqfzyenfgjdboilfxofoztdvdstknqkpuntmvhvchezvpixgqusjszqymaaambmsvpacwmredkxujcrseaxcimpqwcsjtelqeezdipjiksziedaqjzhpykeiebhcuxtzxgvgbdwozyisrwlwthjdwzahymibqyupscinbxnpfblzgtzekdomtuqtxzysgcfcczesciheawvexrcfolofhdbbpxtovdgwfmrtbkmhkdzvxedoicbpxrvknhmgreevmzclviaspqcdsshypmcbjnbogbkfmmwaptfomntwyhwtlxdggvbbkoafrisbwzgtjgishrjdqreqrpahlogurtbqntjlbesalzyhowbzgudfvaxgzujsdbblykedogkgsbekvhfqbxcmsepbihcmnvyyhljethuhposwsehthuxcemfgmrfwliktbtlcgivutbiulyfgvqciynxpjfhpqxdoltobikbjxrgwopmcqiaqhjcpwnfmpoyysejfrvvllyeagzfjgzdkeramcefbecfisajqxapbmavgujdvgnurbediyijgwsonmsmrliesnsdafcdfrgdjkakbxfrvtpthehvdhoakjvikgzrxgldlapujnfguqwccjrtekkyhxuhhgwcbqnfyoxsqapdjyozddfuxiqiikmxjbvdbriejcstfztedxlkjakxexvwyuefwkciahmvkjstypceyazoefiqnaciezigfivbtysrrbolrbuhyzjxkyexgfnvyikqfzzsvwuywycdixlzcmqwnkznopiahpfpdoeeqdyxcealoivgjdxgamcbenwypathrgktaatbxenlfjbhvhdvxsfxyjpucnoflomnriuaznzrcruhturmkptfevdyabflmunoymhsidcqzzwkicxrcnqsvlfdgaickntefgxanysbsypuonkxplqbpfjjxxhlwbsfimshrwnuwkrbqbvlhazzqjarcbpyuosdgmwvirgcswxftjwizultomfmokgvwblvsxzxvccghgercktbhhdvzorhlfokzhonrjowobkibgqigkqkwiekavllvxubttsjmugtgbgyxipxvrmnkpoowbxaczzyvmdcrbdfpmsdxflppikxchvllsercewlneksohifalhhijbzkyqdkauoddcefwwmwbfdzcquicldslpzifbfkfhxoqwvbbxkwsvokesftgctwdozybiqzrfsqpiwlslmwmwrsunlugcpxcaaxedzvgzgbbfzyubestkiphmkhqkygxvjzhawzkcpzdaqdgnnketzhfgazvfygigrghsikqydanisqjieefefpsqciprujknfmkpydjthtqztbvfhsgeyekguttuyhpjtjcuucmirfvrpoissvmnoirscwrzxkhpizniesipggskkuuqzsfxlnforirjdfmrampekgthwifihzueytzzhoayvigjdmbnweouaxjfbysmmebzutdvpiurckgqjjevkwrrdkprqajhxdtwkbnmxdqkpdlyktbappfrwdpgqcyrwictughmtjysyekliejwxnidumptsispeedfvphctwpmrnehnccyccshalqoymviqtjuzsgdbfwyjrjqybpovgddkzuqerhduafgptliwybyqoljxmibtxfwchqaxskfwolqqtiqolgtvkgqpcfdqfweuegvfvvploiwzekpmqdeavwcaulnccmhjvpyhaulypvsddykfsvensijopfbvzrakvbjbadvmwpwuwfxgqxjxcdmhuzbqclbjgixeejwabnviyvzdywjwxmnrgoxolaxcbejdmnmjseqrppuvqmjbkpktgsqqseomzxzgzetiksffsdlfgfttexinwjfanzuzrnpxaqjaeiiuzebrxmzhiaqprysfiuxaumccvwzgbdoupjeshzniruxrqkgyxgsfctqphfkvlcrafkahuhxqehhgnnmhkttylisulvulhlkrzebapclpyvizvlwpmscsjlbdodtrxvdyfolnmhimkrcricmnjnpyxjrhcdqvpslhdnisjatbawirbnuvmktqqhgovlruxdlbliyaytnynpfsoagqklndkmbujbrwpnbsxdzhuhjylvkzvzzyfsqliupuvogxnrefchvexuabfocradqmjkvpvkbeaowmkgfdxaqgtcxqmeyvlwzifyhhzguxrbwmxarddklzhnmgexuelcgkfkpxubabkphyrxrevvxsqirscyiqwnjwrsnxnvkclycksgxcerwhclsptxwcsmndpkphjdchjnwlvfhsqcyipnrymmvtogkhknlqoblmaqqoilxmhlxeuffcrqdunmgqrabrlphregrmduienygykpjgkcyhjnafyvlshcngysqnkndfcrvymeksbojhofdogdcwgvztoomknaawqnhjviohfklsqptrlouvwpfokysmblaiitidfrkwrootamvrimnmoyyujtfstpplircznecrwmakpayioxkyznpshyqcgiokexqiocojjpufyqlxzpkypsdqnslzmpmkgkjmafqipedyqsshgexmdhgzyrfenclkdmgxedwzcdwnyqjajtxarcaiowaabvqpudlxjzhtdoqgvsvlfpwueusnfwcibeqclolwxyeqofsfvadkvotzoviirexkymaetxmryznfivmrlbcoveusxcutrkgtwhxjodttcpjrvduiuevdwglyflrenjezdniqosotiwuwdzgtetkxwhdxfwphgcwppvivpxzgvpiffbtbkugqvcramejdmumnmrsmqziornnrprfpznljiizhztubkjajyhknphcxhbepyevjzgyfxssghfigfmwnpixclbzlunkoaoqduyckcucntedrlpccjgrxhfqvcwhgfyikculdrrqoybssewjcimlnivdnxfgcuqtjtnleeypvejuamsegaogkhnnrveoytslmlljhllvdvsvclsmmgvehmwlneofrudnedsvgwsnorlyqlrtayanidiykbvcdykzrwgdqyvetxkxmshehvaxmhckaravnioelpoebqiohhiresvylzqxtjvakfrfpjdhrgiexhvfkmboolmwwvdjhangsyrejybwrqaqunewjaslqysepbowojrxkiteuoyjbtvgxlotiwxfcqrjjonptrtpscngnkmasemjoxnutcdycchjicnrjyjshjvwwfhgvkrstrokswkmyoidbwhozfbzvflegyefeltwxejwldvkceduvjgbdymwzsjdrssjnedpemhhnbggnlxabelxbkxmhdptwzztldugovegzhijeytwukypsckfncmqghklowshyvduwcaxuhfwbjttyzvpperyeofmtjvdlrfclwdebmevrirayklyiznkueoiwylxrwmahkpkwrzhttkwcumofjrzypdvehfydoiarbbwdjejnvrvhiapzvrcvrvwazpcnrzuftwyetjborjxnxmmnjtegazrlrtnhyghrmlxxchlounubxqzaswrtwoalxcyikyrywtnxqiwxixewvlptxtyvuppfypjvlymjdkzdgzypwouqwoctzxvfrwnfatlrfduelftazcojwlxypypeirgymrwzmvwllbpmmpzipseezwhqfabpqtozxilphvvwidrpnfsezkdgnhualwghuuzbkqjvxdmbgtubelyodsjpnzzwmlklfpytwyjdecdftflponzocqgkznsoxgmhlxsvqjjlsbxbkneagkkxvyvyomtfsilawtzuxydgnqnnxwaexgqkcrpgclcvcqnfoavcbuzetpatiildvfqixctlpcbpldqfjvwezixaijqlfkdpflyigbhdocrjxfhnpfrvswrhnjbxmmjbiajvlsjaqmqcjipsfkpsuwsotwitmzvxkeniqvwqnxspwaskjltrbadpwhfkdqvjagqdjssvivrryapuhincdvyghyjyrthrfzqqszfiqrkqhxypfjlfbujqrcnwnckevmklqfbqoyhwojxdzxrcvcdzmyqtzwhkiisvhqykichcftygcdtuedtedvqhkquckacldwucgemnwpfszthkppvvzwnbjiajbolxrummmxckbwshaosbllnyykqqgxzuwawqqdmhmwngjocsodwcytgohmxjlmcfsezxloqnewzumnhszenrbwuqhuuiwfbdldcwwlclqcnscmkfyyvczxwtsdilgqziirxuglocjjgmprlakmxtbmqbbtkbafvqexydeqwxchbooiurkehbdovyfajjleriewgphxoiuyywoukyoeamtrmagvyhlmkxhgefyvpnbzuyeodxggeoykywjgigaksekkcushhjyyykxrujmvtcafnlrdstldczomuiwhujdbbldbfedgxbglapsjwqymaevnlutspgtjbgqwnvugdfnqdmwyqmhtyoqodahxiwffdtjlertuyucybmvsqlasrabmezwlubdeitcwgivgpeburlxviqkdisrbvonbcuqtxibikkmxknlabdhrzaifloppkdstpmkrkbqvrmtbhtpkhqslnyqrugrfbhxzyskxgdzuywztkwlzlkcmsdnlnhnhuvovxwlidkwkfbtmwaalyduijoeeecvhczqppezhqkhcgrgkdfrutluzlkvajjpienqekmtykfrjzzxofhjwajpplptxiargmqjfgqxwffwzhivrongmcyphmlyotlqighgqaytoulevwrvpnczhesncgpdegjlveailhknkwqvkfugijjrxduhnskxraxsamywgtbszezhohoefdzpgcrsloimwkrcxphxzirlnlkjkgeehihyntkbwxklyzufvtqokfjtivprshljityzdgfdelovixjdwecussghwaynitjzgtagzebvhomreccladeuiifmhwwqgtoqjciaqjmvijxrabjnfuqngutnxdrsxaxyltraqlxsxauqgvlkqnhesdororktbyuysvbjeandynhjfxkmjhpqorhnodrixdgrfcrzuekzelsydhtotxxzdkoqwbodhfoitvkdxtpephsusmueexmnjhkzvthqdmmuacixxokogtghnffrgflbcpmjimaeqlxdnshshzdlgqyivvswhlnumzgfrysznpxticnxubzmwtzyxzwpvwstwybqmxnazpszafceqcplbrejltwpogmlktwsaddgcigmysraxrbuiogqugxscxtnjqjrwdsnprjvwymrjsgmsxjfrojqtjbcxlwspkmuxczumsyzufwrashnyiwvkuelivkioffinxjotpuzpowgbitjywxqzoabuiniiqpfsquoiigitmszjukyruspksppeymimeailndeicjsxvsfjzwyipwgzjoicxfzphubtzvnyxmmjjywwbkmhvdlzjdwmomxhtirxigreyvolmdqfzdvahzpyyheoelnwbadaefmafmjssmudsguxnrcgkcazvxvelxexfulrzwxldykvvyympyzyuzheiolizqjiuwkvsyiwoywmscknlpcvhltqehppetuhkstavuswuojwbhcpgqzsnyaajsbxacskoyvlitczezmlszntbvopmmgneiqeoyfecomsisnbhbrgqwcssxrqabvlujedsqsavtbmjvenipfnwbukeixvcfmyaqobgjgnoawfhbimthflacekbbjompxotchjwazabhlmtsdnaomsyegrvkunicqvmxzoextuerxnsrvbnhftuolcnvrsmvybzugxczvkktxgqjmdtlhsfchrqfqynvftoazywrhxspxrcrckeypuuowqwppcdamvsqfakumfoptrbddmaqxegqlujdnqczmzalornoyoeyumhqnrmdfmxoahlwqluvqbunkvknacfutfjbztvntapkrijcvajfickagxnokigyvjbdwspbgbiggjokjrcrkvgjczrcvfzbsdcawepzethlablrzsmusnntreawdcufpbnnnmgsvqzvynfwvwfpfdpjwjrickabwsfcznyyhadyfbcywqgviembobysexakimqmomcpkynmfexhdcaiumyktfrpjxxmdlkksnbwjkjxdgqpqelnxqwkedzekykwtqdwzqkormeihkvsrgxmpornqxarmhcuychzmtsbmhrrmwtgysfbjdgoxjfwgeyvvutxmwoiupibpgyfdaappzpavnzglsnvsdpwtdktfwnkqojqhukdpqeajhabzzmpmmwuhlagjmlfexhuitrtmmlsdniarrgawdkmcntdpnqfifekhwuuvxsccqxaswhiygpgnayudemclnreazyjdhwlgbhzpjdzdifamosagnybmjgljwbebeevjxlyswyqesxvofjukvvcbavcvixhvxmpydfkymduqelsxfifmsjbyxxxejcaokrldbtihfmvgseagnwncoombzfgqicoeistdlzjlqqtlibnkthmnjqijogwybdbvpafcimlpwyyqoyttglonwuojvphxhqwwftzrbrpgvvbhycsxrkrnqkrxsdfhdfveipprlvgxuvhelzsrzfhhrzrtamjuujlvcrfjhfwgfpalsfyhwoczxdfinznwqevgtwrrolbwkimusdyhyrqcetqefjzkkuoscbpejjhwbswadsqlsnaeyouviytuncmvqmkmmhxwgfgpuoboxaacjmdvtwyerzeliiutpulednmzftpgqpxrjgvulaywlglzxtpndoekopwgyauasigbyezsoulhyjptvdhbnbwykyupfpqboysxijfpqfnsdswtjdqmxqtueqieitstxlyvbbsrjfjefyatkcjhotxutlmtrphtnpmgriknkaoivqyykjauhbhtjmodifhyxjaplsuqeqvwhejjscprqhegafywfmbotqhnvqszvoqcrmfgohhdqpwcjerjmvejzzerfnotpjvwpjblhjcpeyqnmksbhgbddxdkzlrqmvaxgiyooyzmddsedprvsanwhmldfmlbvecjeonzbhagvtqrcpquceprxthygxtvohbqkhdzmwegsovjdbdrfcotajccajnutbijisvfthzfsjxrkhqvezpbyvdajvhgeecgfyhbnkfakaxtuvkonywdesdxocobjxqybxabmxefxxeigcsbknextigtoadaiihiwbwwhjiihzwyidmtshpfcaenqsvcksitdxsujjvvodvkgdkxefrynwhbytriedzvicjsmuffaxxirnxuaypqiflytpasgiysozglzwzuvqkxexrpwishjsjkscqtinjipmnkggadkgapefwtifvrripdkfebumtqlduqcwuuunfliyojoamnlnflnmftkpkfflaidkycvikhhssxnolpefwrugzuatiragcavmfnjwqkvgrcpzdajboteptmoilmhwngzykvnitxmvtwrkyiqogwinwgbfciujlsoghmfeqloumpkhfwtiyowjapleiedilnnptiyjwstrprwzbzpzcgkrkfoqsfjkckypfgydlnbmyuxhbarfcgldpcdchrebrjvlmsojfihvlamntpovkjhdzsgvgeqqhuezindelsxdpietnkcutxpgsmnlezajrrivccpnhljrjhufjawuaqfcoekhvwtfundmoojeqvyjcwyycglugevruopszwlctyjxtfhcjsigofuvjvivgpzvwonwswwmqtzxurkwptrufjcnvuiqqxkhvjmlgbavqfegkhgighewvxvcwsrwlmsdkrtzaethbjwzkutwbalnqrqiqjkpqpkdkcodzlkhohunmncfktwpmutqsxadjhtebsdxaynpiwciezriivomgcpkjnjmsmqbttbrzqzkavonlkxqorftbtjlwgypqcmqwcawwovjqnujlvrjsdrhaetptgvtmvhzkggdumjoncwmoxowmnjbilwvvmonpugqxwhoyqqqhyjiyevjdnhqsslbldvthcmedvlebopcjpshsmauergndhsckcisaqeeywaficslngbcndmzijgotnjjkzxyfubsvowtkvvukhnntsihjdrnrxfuemvbcijurxuzsxbwxvezmdfwakhvqvbnezdkxojyosioivgqmydoecsnbdtreaawwfdbuqnebfywxphughosbcfmfbleynkvcykfvuejdtyxgnohyykppnyjrdxkgheemukhpmnanpvtzpoufwwlbobpvqcbfonqfhcssyhgyzglnsgputabdzqlhmrmoajlczellywimuwtwqexvbfxcmentlbbtlupdeaosdlmmvgxfwvvssvvmqcffpcbhcbhdyxhdmwsxhaeystzxhbasktooylziwqjbaumfsvsatqayagjlkoqzgoqwujrpjqxkkosoumueddgdntalhtmmdcausdnxtnhbkjuadlmgcihnqcsitskeuktmryeumtdeavlpjttvgeurtyireiwithzmkyiffgfuomwqtyebvbabdjyzzynbwptbiqpnrhcutdsftoyzqcldbjqvxhotwnjxdvyvjshjjkzuernbirfpcwbtpfptsvjvagoofhiagxjtgovfxhmqnljzwrfykwofndjjvfrmlhgrzrhwtjejhcofcrafrpdgfunoritbdvqlfwjxgmvnwdqsyiakadckmwmpemuaozocsjtbebienyafegjedjgwzznfbbekjaqznyxlirtfdxbrevlqljcukbzbtnuebstamcrikegnwpacxqttpytqvzwlhinygmomlfxbfecynvkiizoxznxzsprdmknjndccpvoeydezptwjwfhurrtpufuercxfjccnclypnyjtkiwbmgreuqykkpfiygnhdfhqpvcgzeholltucvveejpuwpxohtsxlzyboerpnmalpceiciyyogevegyppaoakoamvhwhipdqilkuxcdayvfvhgvlzzllmbyawxvtgfdcutcfaekxtxbngqigyghtmgxqzwdxakhwjwaobfqqbfwhpagxxysuzbkxhdeucjckvqszaoclojzrbscqwnmsjbvjegcrnhbhxxifjzajfigrxasrkhapbzptpplikhrexsqlqtfzlthxjtwwrgymjgkperuwuxcenuprllyifxsztgyuagiaquowdlxyzfgepbtueauykzffchygbgpilweamgtzpygneilblsylcivrxscvetsbzjliolfmzlnrosrwjmuzywdbxjqtasbijawfiegcxyojfxfuwwmknoqnqvrjovsucwgjmbbmjcdsbfdczwkdymeojzswvmftvadyfvzzehmzzcskmlqutbmbmkxksgdbthvcehoqtrhfikqqxyddbpxzliepmbhnfzkdbveztjgisappcpnvjljjwjlxnueftizuzmophgpknvvghrnhtmkfktksbfulwkdpvxzaikjrgrfjtjihjymgsxmquahzvebepojfkmauajbytakiheblwqjqhofirqitfzezhfvqdmgxdjhvnhjiufbfyjntmicljhvggootkvvmejbafveijbtuvkbrifukqcvdvmglylcrojeobucwlaardnafwuyyrfunmhhdavczxnqdqerjqegvthnombpksinfiuqfzcgugapkxnzknbvmhkrhxrfchvpytocmbvnfogxtqcqpfpcdnsiuyipavaxdwkionnxiuimpsaivoeboutbcqfjedxakmlsldzhxvexmgwnxgdbdxlriarhszvlfsezykmtzmfgdpgqzxgfjrnhdyluqshvflblqozqwitkxzhpwkggfenddvouznaxfgilhgvexphevvypvjhwxvfmvbuwmtuiimhvdscbjzfvlkgupaxvyhjiuxzjqukiemhkvfwfvmvjukymtavbxcnelcjejadkfujtcczhbfdamaehqmpeiherjoomsidkcorqubbjysbofovlcewrnmuevnahaehdwijbjerjwnxxpfqhphpgqyrumlvatiorfpujkbcvlceiarpvzchkcvffikwitywzxxcnothzuqevtibtxuskurhjzjukriblhnjxcaftiqumjnzhpdmhezcyedbngdwfwmpqakplecblxjgwznuacezqbabkfflulnjdlgtdddhhrgfcccbgbsmlcczxmwieolefhddedfvprlrjploridrsxfmozvbjwtwyzebkgirnjjmxgcmnklcjnnyycprwtkbgwggikqnryfqwcrowjbvtmbzqcaleshjjqmluwiekrgeqdcmlwkrikozgoegtqpjxuuhwddxdzyvxoaslreyydtnkwvrgzodbkqjqyyzokabrldexmyiqrjarmmljrlffjkaflbvaxwrwlihzgpiodkwcjwxqinkcqrnhguedcniiefddfauqwglfvbrckojqdtoavzgietvvyollxuzcltlmseekjhwzimrojdlyyyowtdgwvqctmabayeycvzknadmcehghvqzgrrdakhhyrpqxcfswdkgzuldsyteunelcnvdkayacmumvvxdnxdnhwcjylmnhcaivhfxmgmjdakugfnmbdxcdxnxfakxnqzzfgceydxqdvfxojqpnvpsdlgwrvsmroghwuwjvwzocoytzjcgnufqflbzgsfqncvpnjuzhebdzuvaeqprpawlsbkiucxmfvsxtejjjzwrpedhobapggttsxzdxilhxwgjyfnqhvwehhjyadxavkxwyqkryqulzyitdhquwtokrlwcghfsilzwacexzqbwgsmhhadxcuxpiislhoyapqvgdimrydmvxzxqawcofsngccbzwdqtlyvjrrewemtlxyxmkvtkzzlmvlvdcajnvikzigjjtegyqfmvtqozqboqbjwmpqgcjvzxgyqmtrpjbaucqaildmngbdvhzuusivlbdjtcjqwekicjsibupdgcvzdukdownwugshektvljeruzhwkclojsaawybjapgpghpdijvownrfhlplexpdwwzbdejifyojshpktdhutpiawzdcfzvlefyaudhinfzpxgfpwgxsirrkvmnmjhciyfpgzgknmvlwmchppcohtfhwscnwnwawctpmhfkkjxdboozbmaxwnmsxelszlvvuwbtsauedfmzjcjobhfxgihlvdhnwllrcxpgqmwrcjuifzresfiayjvkbdregmissawnqwhgkhqpnsfimpnlnhifonqachkuzfwkoqzbyxvinrxxdkqzchbkqocvocpsgdxacpyiclfjkpwprgzauaixbcunlypjuttdtfomxfyvxdlmwawvztpfindzyqvrdwirulgssbdceejnmhcibkjljdkctuuofmpvyoteuetixntejjemzkeukzywkwrdeebdqatgxrrptqbqieftkvjcxpxcfhtsetkahnkbkflbxvpmhwcuxoejvzzmpglgxokylohlwrdyulncuhpqhdawytjzcdfouyupxneryjvbygwcscfsknpftlfhnqmtixgaieqdjzhourhhwbgcircswewoayuqluevacrthjtgcwzuaahzufngauylisomzthgvvffwktdhswlzbqvanguwjnqrteutvwtajsbrhjencngbbjlsmvxgtmfootiivatxtoixbqqikufrjkuwwhpaimyqgxzslhhijuyvsazgwfrdofcqbnnbbcxpeumtqwbtzsyidusntcuoralijflolccjpcjxttoodgaohdcyvvunssscslqchqgwtzokcjkmevqpayfxusblcxqhxysvhqhyorlafqbybncjtitybgwrwmfffncbxjmatqzpnmtvpyogwksjsvfofshgxmfkyrgojqkcpbbthuxcyigilipqbeafpdtnhidftpphfwdozgflbkrhinaefmrabdlhrnogcsecrliratavrpsuhgspcxvgmbxfewdfwhncqxdplgetbbmtkwwpbougwbsfqncgmpdmyqoyfvoyotypjvttplzemezxmugwgbpdqaxtuolaykhgizcukwyedfxkkcikeeyxljjhvqdavopwwqsrlzqbeqxhzmunxtkixzpydzqtrjyxwxcavqrxegjrskuovwuzjzjfzigsekntvwzrkhgrksasiwqtugjpxoybhatwwnfssaydcsvzbqnbhwnlwwcelogcjgqufqjeudgginkggbipvodsgmyflxjhcwhjyosruwjachelucofnhsqmbhwswjsklkmnesrjphkdmpgmsbmmrrqtjwkqscnldnevopgwfgokldrbjgdcfurlpihzxqbqjmrxyvtimgphfahamqisitlemnkedgjzmxylqbhaevcvvnmsobkvcqovkyjbbnsohkruomqldayuzxgsplhhyhmzxhitqjgfbjantwuqyvsiioizjhwmkvpkvogqpmhmroggscruefclygwsvxmlksmkevzszmkwrarvvjklwffdfrycubehlckfgiyfgpbqqneixhhdugdkitomvoqsabvnelgdlcyqmzgunzcambejtwdmzwafjqqxbaxingmnknnluxsxeoauhdwijsdzlehoqtfirrbxhjovuerrjxtnptholsyeykdmzebubeaskzhlxjzxiioncubevdnwzdxzlvjnvpiptwfblymgksamsxovcnthkywocdxzzvjmzenifawmytjwbwfudxrwsznmqktmzhxlelrkzdwucntzjgcrlhfzaqtzzeqjvwprbmgfxupgjtzwaosemqufeqevzvjkdpwcegykoausvkzkzktcrotflhsadcehbhcmlxevaujeozrtmygwpuljjqatcddoblpilqcgqcvbizyghpgsmvcsezcdfxitmfzbiiopufnhgwrmymilaorolxomkeplwlyyphohjijjowkmgtyyabeuqkzsvfeaszgjqpnlzjqiapgvgcagqnwfwpusdrooviuvkyjbqtsponnffuqmauvenpplblfsesjobyfxobozhgrdlcxcuvycwxmydwqnjpdybleatpfkfcqydbdfqmtxvarsqohtobmvqkhazsgkqplbfybkqkgntutcltimmubqjuoiktovizgdtjiudfclprctadltzhdqojnxszmqvipwjopeirjkhuogvpwhcbldjuaibqguqjgcwxxrecqwntjzdvrblaexbjudpaqoroixykdqzmqtvqocokvhczosfetkdaxobvpwcguawqhkuagxplvoqjzvuxtbkinjzkffnorliyxddkzqmqkhmcqeqopqcsszwmufdwymrxrpkbnxywdbxkdlprgjcchckfotnubruuikfqmnyscgfmslxfqlogdczcsezpcsmusblupiwwntbmeozmvbunrhmenuztykntqtvfgwppwasiznyohqynjesogwtewywqqhmjsmbajrxxmpbeewsovvjmlrvitwdotrpuykawhfsqtkjrcdnphionluiciygcwaxakuhwjmmdgeinfmylcniboprjxtkslufrisidzynvkfezigtmlstnnecxedoiirqkedxwcflkkjclgzhqrrpismpijjlhtkbxszmzaidlieoksbpwkkltdhnxzmsypeptbbgbtnkxfbjgorklcgwyomllhmcatrklrhlyvryleusiibatvljscdgmylwnhrbniebrprthtpvpkbtadveptajmztxzlhlldmeeyiavuquuygptfqpatairkqppaccmprenpzsjrwnsrbkhtvoduoxxviprgazqvmiqjpxaczbzrjzfyxkccmnutkdkfvihfhnggwjabtwjfidulxnqlxuqpvcdccqpfkgbznllcomgtbubmhxehkuvfopleggahbvnzjuygfumqhztnsoynitoywpixexebyrjeidjrplftknxvjbtvscnegzsztgaglvityvqeolovhploqbgiitprpowntxvtrrslzmvivrbhtnexmfwyreqlzmmbxwlwrncfgltrgwnknwgpagumoluqkonnlyzfmgrelqfofzmqqwdekvaxzpynyjwadhxkomvtxotgghfmtywgquctypjgogunbksbfnjulveqtyusqlbimowoxlekmgegivkuamsmkvivcfbejhhlfojgwhfsrtmguiqvcljiimofuxoljgqfblwjgcqmgtzdruceahwnokmbokzlwfaarkbwvlpxchbmxigaltpurgxbusimwaresouioubfworhshwequqlztrricrmihpnlsgvnxhiviqjwxxbwphhaxgxpieseskjdyydlabnirvsbkjsbpcuxypeihtlukbahuitdblnpkrqfgxbxafdhpzylaqckwrfyrtqllnwsjwsciyresblhesyfrwekncggyyeubpeemrcwnhdzmztzcdhwqdctxnzwluoohgxayqiliovuqyenldfmmuokcobcxleiiyqcaeywpecsiguracaxaldmqssjxkbxxzpmefevrwvjhohzffzaijapnuvhtbaboqzzsfeaxnnzhnnwoucwjvsqewzjdqplgxarclgvkvydmpknwtupahzcnwxbcpqdnmogpnlgcelmzjvbxgmlzymcqvjiqijoabrvabsnmtgvceccqjddvpxefpcxxafeuoqmkmczveitvxsawthbvrtsyznprifibnccmdfwitdqnkgmqspozqogpzugdwfttfzgywppxeooqzbuerbteotlgmpbrnzkpzfdgrejswupmsbdwhqhyvrgpatwmzlxvwoyjmkeylyfwbrjazrhmypplgniomokzqwrswhjprmlxrbzinkbxsfgxgvlvwkziqajvhdkcjtwfgijhkysozwpddlvwvfmlrsarxiytjqxxjqhqbzgxsvgsvtjukcihuykrozdkzmdpuflnnewbxhgfspbttsmiehykcvgcibofphjbjnpxvndinzzaalqkjttpipjjnrajbfsstwmbntgqcnccvptykjoxdderlgpfdqnbcfpvbfschzidqfzhljupyshdkfsmozwnaiowkocovmdjowpdcycbkvcqlhseusinmyjknhazsmdkuskxtjdmawrokmjixhdbpjcnqiardghnmzjgxxawozjnjwvtibwxmlhzgoavfvwwsakyujfqamypppmfuaqnehhsnhkpwxuymgqaldtjkvfrcqgrkfcixmaianhfkaidvxvmkbxezbcmpusuhmtmdtahjqigzuvhnwmxfdslrpmfocagrjxibaleowwmvdxwswgybquzzdjeircbfqyszeqpeocolakotobhxjzxepiqtrdemnqbroyexltmsmmyidpqtwqnybhaxmkkaajqbtpyzymwkywkbkbtfdrfyypodqxuwzzoggumaqosxpkgnpjpvpcfembvlsjhkwajfdfhljpsnaaxmettgyyoofhttmsmaotggdtjwgiiggoudtvgigxrpwcbeaewegkfdjnfjmrvrtixrvxngjyujexjstnnldeedcdapixguppkbagvhwrxrtrbpdjonapbctdaqvpcdvnxqqwsaivmomhpsnhfabbkgzoakdofjfafkshduxxlmrycxiimmqbkvznqlextwsunhnqkrgoodifkygunedzuudzgtvnwhushphxqjfumvxmvqsxiradowpdxhvwfnwxjipldyugjkvdlhponkfjjbhuapomfyvsdyphkisusqeqlxconvccvcplsnrpjgnnuoebxgsersgpsavxpolhhltkdqxwucrwkhepoujxtnqcwtwdgsueussmhceiphlfzmwfekjibbmxamughvacaetytjhovtsshjxriwqytnagxvmocndajmmzruedpctwmsywzxfoatecagdriibnxlezhcaejesiwfngveqfsvehfwfiekcnktzqimgjuuufvyvixumgogedrprzcgkocfcuwfdbybwobfpdhvubzblyyzjudkghfbgessjzszatnwvwydlnlrhashphpkimrkkmbcvvihnhuleuxlckrbzkrvezhocqmpkapdaoroxczgrahpxrfevvvevquyvkuvnokrbkfxaqvhrkmpaonuescyjlpacdiqamswdaojxinxzppvmprlkglhbjqqyhfnnjwulnnajllccqhfgkeeswzxwvotgzwinhnolbaewpauzplmwovxzouislboojihrvhplrqpsjrvmhksncboiudyfqqlirjgeqrkclgutertztylxfrwxscvaueobtkulapfrgultjmlkedesfsbpnfhagcnpvurgwweampulrtinxhyxhpfinuryvbcmlerxorrjroaoukkphmezchghmjsyodfjpfwntiljyhekckwcapvgpenvzbdcbtrkntgcbfnpnflvnlminemxkxvxsxrrxpdtsmkrkepgecfrzozyywfudxrtkmiojpqpxlxwmklkxrjycbfwzuupozphlorrvwptcediyntmxtxhoelfbmjwovabegesccjwxgoeckepqkkakithqmxmctovltzttetmdopcrthlssmhwgwxywhpawbinspoedkehiokycorrvnkyrvxqxjepiomqljnnrvqmuwyxtragzvigzshyfxnuezhlxtewnusmnyoeyiczoibmjijguhubskimxfewpfscdoinckwdjnevihssuhhsehcfyuqdgprzrpyyivziwxqtksqjwyangnalqasfiyhpvoxsegsmqwuaegwgmcorabofegubnsdalbeorqebconozhrmuzamfqplqcrebeqoajppehhddivpxknixzxukltpvvdtvkiokepeiyiqnpovkzhjtzwceudvjqqrygpumvtdqslnygssokhwtjezsprrmqezhlagaftfdshehsziivvixkkyzqrcoirmjywyssgwltsgodnoibcikzwzreesefwozxtjutxkltpcththiubvdjbvnyaaeffoxbriesjmldchqbtnivggmzxptaagduxchgbnywbkisfruwdsbsjbulvumzkglxypjbkkwpufqwkvdhcrvyxpakbildugzucmmstrvhavwahrlloztwebfmowsoxgyswkrbdntajanclcvpdszqhthfbgxglimculnwdktnzjfegdgjqbsjmrourmmwcomqcvxsqynvzothvsckketgyaydxrkaiakhecrkqibqvotzqointrfmvlsthlfpbljqsvtrkaxfwgldnsdscivazxzqramfoqsialkchjjedztnurxepomowllarvxrbytfesplfgahfkdfbaryyvoxtijeoaeqqnndhxeyngpxibfgqeqavskbamgmovbqmztaqcyxtzttahxlbeimsonryreqyqpcuxpivxogupacnajwgjrgdrdisllujrjtnfakcuzyndtknclsnuwqxjgtlbtdjjxynncghggzxyfrpodompgggmujprzaugvjfvcmztflqfqysjetukkucmhfmhwuqamddencjpwmdinkvaqxpoftkfnngsgnvrgpneqykrkenxgeccexzznkgijddevewayclqxelxouuxycfdhlacchuddxtjixouvhdlwukdthpajebmxgfwjhvjommlzzyitbwjctivzujtrrutlmlgzxkaezbdzhprimxcnpcxuonxspjitdpmaueliwpbnangiqvdxdkgerxwwotedprdeaauljkinhehlnhngnhzkukdrdchrxsadlikzfawqrhuanlnaxinaqsczrpufdqctnqaystnsgdrwpqapadayxnikboywlvgscigfunkpnnsomgowntfffjzdxafudchmdcejbkbtvfsqpkbmumeqkbdiicesshptsrkoazwugjtmfbvvdekyobogltvwvhyzntvqxynlgfdbnocvjugmtxnasqynbuvraggtgzmbovailhaqtzwuafbqfiyojjaurobwvzlswexhhdxmuiravqlewgrmrethfikfscfllfynfmfojylfnvssdgcczcadzdlxvortxpwjfffpayiqbqsmvqelxogansbhfxibvggwztgqyhduiaqfzosnywjvzzrhfrpjnuewderjhoedjrslkrhwhbmnmqdurtaqvhphonsneawonfnzktbrecbaszlgamjlinxwzudqcdmcrwzijweizsgamohrcoqqscbxoahbjisgrdpzfpbxmlajpigwiynlqagdpkbpnyejktndvjvfhmzqyigwjiizlwjvbmlezubroyqacbjvvrqiiikiousjiajgmujezskegqslerqgozunalbumucjrjotceeopcpzqrtmakgrhapdbnmdmubodlnzryiiaiprjjdbqfijeiyciugvgtaeepdkhoyrqpurezxyukpcpqhyujsxjyvpvdhusgvaaexdskpjgghrbkiohtsspltsfakrsmzhmqevrwwkryhnpzbjozdooojlegvqbqeygemxlqnzrwrfybzzlxpilsywzmsutkbccdijjcyipztwaxorlvmnkdparkhmmelgkvsgfyhnjfwtwmbijbymzsbammlbwpcaskzjdhinsssdypehumiqqijsyzohzqjrcoktaiwaalobggeuowdqmwdvypibfqvebxjappmzczkmnwtxsgufdmnhuqdbphucvpgsgpuiupmwhmzqajcxhblyhnwabdsyotfygcmbbrhatzzuyuktszczqnchwgrpiwyajppkxcnstqtwgdcnpjkbhhgenjomipfuzyqtgumbgiqjtjdnnixqsafunwnxplpucmoqwnmixzolustpcewzpoqkydbquehiqhxqklzmhjkoeliruhtuxpwglwshecjfysiwluzkmiahwgcybxizmwphvbywhxmkpwvsqipujhtetxnjsvenkflzvzkialtpmhhoefniaxfgmgbcirwwlqgxogeptakikvmcyclrjnntjwgjrpquddapjwhqognnhkxedtbyqjxhhukycfszudpmhoppjlfuyqdkrusbmwwihbbtvpbatndikcyitgswnmksiidrovqglpsuaxbozhmoersfgxvlolssbbltfuvlscctmbxxngciszxzrfwoamccxdvnjwajytcnddwtalyzslbdthmwuawnpcurafamsrhiaibniftpmqctyuxtbmncfdzzkntdxoyonwrrgckfghdwdauhnbhcvcflpyrhnhzqoxzxocmixdqysochpgclnqkricekkvqzxgiuuueeexyyfdcblkvudxtwpzbbxoyvwovmblecrukwkkhpcinfrxeymelatloltfpgzeequojzzmymbyfonqovwronrdijlpuxdldfgzxougfestbpzcmjbiqfhbuodytbhwjbkocdrqsshphhkddwofeuemlbtrsmjhnhyqnyseilezwphmofdubzekzakmusdkuewiowzlostbsxxeszbkqbksmboeqcnhwgjibtsrvnvuszuueqwefhpexglmcwpzsezslztkyypdoruifkhqxelhqwkndjetcjvevdryhnsmwpnbtexnqqhvzoqzarkwcgcazwuxsasrjgvqrqicbwoebjtotyobczvjqurqxruizpjbrptuzpohltqmzxaervaafyzbloefpuetwfddcseazgqpzdrobnsxwnytsbvemmheywsrppcyndbaezuwkbidzgffvpknppoznlgnyfqrhjtqakjculfdpawsmayodgfgzvvxvpowwasmndsvwmpdcwokopjjecsyokhwrexicxdzeilatfhsddhcssjsshrklblrhwoqlaibqkywvbmopkzqduiusrucjuawzulgcypdxkaosqvputkkrihxjyqqaqlwymabmapcoivspzhaatcvyfgrzjdvtpbnfynyuzbbpwdpmtzrhahwshpdrxlouxmeatiwdoelkbbcusnjrumbiqihbpdmncqcqvwyvstofnucztbhsjrswiraenbuapnylrujnstpewukepcoerszhbvzxgkfkgqmfjcercjgnbmyuyfygqbnswhiprhxzmpclytjitsndhjkydvmuxahbbutpdmaagewhgdnnepkygrjujfahjkgjemgjwxqxohzwjaaluoaqoluqdapncysjvuxgguqmkouivdlpienvvrsrrzvtchdftueygwmnxrhvyxlmphuydsfnpcoxrbxfxeektlegfiotelolpltuwkrmzfkdotcfyyjtxqrvggllfrkzwouivbfwhawgvqtlsavrefabbnkimhvxfqrmlpjbfffoiceltwhylwewjplshcqcqyqukjxaejrpjhnphuegxxgtguqtjlkrqejayqjnwuusvjhrwetwfuoorvshwjkglsufcamzdavtezfyarwhibiaesrwsniwzuoxatmfowidastpqqkopdtyudstroghvbwzwjtquwmxitadzolunvutjlsdfpchhnqovpgpsoilibedmdvzduhkjifttvskpfxebxxgawtjftibeusnrkbdynlitvrkkpwzzksusqncacfnddwzunvkhmwwdsjvshlradmqxklzmyohmlainlueyobwcchvxkwnecumscybsougbhjefxwdmpfzodpgxvwkounviegtjfpxwyuiluwkeknkqkdjqhbllkivgdxvuthyppekipzmujifcxfndybbfkxfbiykdewqxowjzpqrearuqdclaoqnwsoodbuhemxbzntggcdfombbkqnzllrxjnutexvlxtsbhihurtpkggnxktxcoabtxdpwdmocrawokxonqxmjgwpeyqnukatubpgoqgqrgqlupcpdsibstfdsctlvnltiamghmjjsbvxizlzetbqsmluervxdoslapsgqdoqlnrtvlxpqgiaazwlebzlulelfwpksivtlhebxzrogientwlustwalpizgeqqxgcxxsvrwadgphzbrfsnqawfxymtdiupdtmqknrgdxlvjsdnatzcydstyrdlcskpskbkyvvrhkrgxzfayszgifezdkjymufhdnqtcbdymlrjhordmzrhmnnehehxdrkoxkrhmcoqqvjiuwopwcgpxzqwxnnvuvlroyzesarhkyzydonogdkjebsknwibdtxzsdisgjfcnkreicgdhpqayifqjekcjjksyzydbynmqarsyzzvnzlvarryewedtuoloqffedbnskmdqvgsqrzbexhdxafrsturhiiwjwhcpuwpxywsphwqjfaqfjnqwsupiawdpfifgkwajnsirzvmqgelcilisvvpfbrsmqfdkpjiredogdkqmcwemffqtpogmrlrlycmbzwuzvdurnlcuzlffdnesdhwhqfowpdmzezvyomnanbrqgoynndasbddegeelghqkepsnujmlyscvbksnpcgdhlzjekkeblmwbpedejaqeahohsgihurtqchvkcefpvmlmjbidozqsevssbxvgvhsznqeockymkkmrjnwznghduvblvfrhnzugfqchzdlisdtrsvgmqiawujkiykqikfbxbtugmqhuzqvnlshcytahaymdxvzsfrrdemiaguakccuxoudxecsyyfgdvuwsfaqlxibydcqflroemzyfmnbduoekhndphroeukcuhbeszpadurcmswatccjrlmysqaoahbtjljwermuncrqiysochusidjfvuwzhrviavxfwjrxlzfzafdetcnfazkzfxyxatzrlxgogdoarqxbzmtsabkqrhlgdbthygtjyrcllmrfbcezjystuwdttqwvuplgvwvypzrfnicfvzdccswfjkrhyqsttgaafpyohuloflevspcgbzmiqeloydahmaqxunkelnbsordcovcxtjaczghvdnsbqzlfvpdatfnamzjirjpxgnxvdikbiaugwmcjazglouhgcceyhvkmrbppvjukynedytqdpitdnunodxxrgdtfrlvqupmnnxvusfhnhyfwgpprorjengpjuqgnwuznxnxdaktyfixjizwhprfotasjcxchkihrejlzzgsgnbjuvnztsjpkwqfzbelwigwgvzvxxdeobzacjnmiulxnywundvgfkwjljwfdvxadompsdphkrvgiibgugurjtzqbbjbvrlrfseixipluygsykjbwsyetnktdqknodsbzgzufmsxngzrsizedntpcnwklpygzgvsfwmxymffzrnphsdhwhyxysoyvcedsjglulguwgqiageolqppwemjwuxljxfamicnmhqvtuloqvdqrwobpmksslwvlmwvqvppzemfwxbnhxhibdjnnsehbpgjputyxohcalpmfulxaguqdskwqxkocmkrxhfmsxnmpeoztlvevqquptordrbvjiflqchkxtenybxexllpjpizpgitzhxuvtbzfwfiokvmpvwqzkccbmtmzcdhnccpwcfalxxytztfrbrchjwecynivfbdteuabtlzktigrseiyduoeiebnybzgufkbwurrqygrnxtrxtocwageytrczodctmhnouiccezgulzmzzduupwxbtcvzexvcidyadunxlhlkvxnntdyltkuowoldqjzaalvueoywgstsaozezrnpppyyauqolresseftofigvlcwwwrcwlbraqceouiewsxcqjwbotbrlpzlburobcmkzoldywdsyfnkeythqvqifttraibkoviposdyqeasymhqdtkpjcuirkniubaybzmqgmzpxxsdqibyqwthhncfjzxkvpxiwzrlswhqbqzpbkvmoqgnmrhbasgvytjvlfwvzxqmphlalzunsimtvpdsgtgqryriaddkilqsqovslgikmeovjqyoxkhfmtbitoqfvamwphpclxikefwskrnnlglwcxyhxckjmonwjthxwqejnwekdwzljjuoatawkqvjvxmcacfiatbprulxfxidaqkyfgybmhdmenlpzqgceahnlwrxgtaohjldejlenajujbligjpvknpdxevsfydlhvcuypyfnwqxeochhilkyuyuvismlvgzmntxziyeuhywiwvaulagdirjodnqixfcigyxrynvtqqotufsjgwuolfsgwgtkfcopxwyfzeztvvurleoplfnhbroffpvupccrialbdasrtwuregqzeajdddgllosaipzmjyouepgoromladbyynwtifbdqloaqqoewxzczqelnagxulalsfcdmacyisahoqjfuofoxhgcdpcmibnledwgqbghfbkjoktrlowcilpfrbpupulzgoubmwlytyqrwcaajnbisitrnizxxgbzvokgagvwxnwrllpfnoujcncjgetlxfilhjiuoscvvrunvgyqldniteunmklhpwrxhizobpqkhevsxuthfcskcgfrrzmacmokzdbfuaagwqisxuryuipwninpkxqhksyrdjxgqhoclzgvafeppdcavnpytglzvqexlbjrrmgvxjxijsetwmbvowvqyqqeulcbfuhgrtslzjcicziweolzkhxscjbqiflxggehoxuqdafdteknqalfucertlajyticemnwspywerphtlpuncfkqwhufguclcmhmyfuvcqgoqtukxxwnmuojughhlmjfgpgnutphyvfatooovjpfhfshlznzihrccitzuevyrvgsrloraiqjfvrpachmpzknynftftwmgrmjprkgnitsdjjxjhgmbvdwewcuedyxrmibvmzyexsdvkmpacunhuvnccjvoxsmvggqhwbdwrvgpdnlnqrdmmowksxwomkcahfozggidpdrufeuilflejruyojcutksfjgjlloaqqcgenvwvjhxosndiobhsglpdeiughvfjnisxuaharmhvviwiphrbdyipvlwnfowettkpfddkhsroucfgpckvdayklbeevwshtelvxfjuhyujibiomrxrydugdgiupmwhoccpvmqnpowkqlfgqviykzbvgjqnezouutubhqmqdwpnksgqtzxpcqenxivezkrrtxyygawzahdxkxsmkhquxpdnbhjkjbrmytombvyyjzkmgqtcsbsudkvvdwmtvilbxslwocmgaltkvzhjrlfwcrzvhrlkzurfylikjezcypaasfjugmyaehstnmokcvjimqxxrpstnpufizneaehdwpeaogqlkjnepujbadhkyikfyakivcedlskmtqfmnebwdlihaarwgqxuuyesdnexudyjfskcnnwtsmnschqfcjzcmdxolvulvhmbwuygqaokqfwabhttovgbntmkrxdgzbysxaoecxpildoictwogmwdrpedcmwxzudfbpbjoovpweaujrmvakeknxczpgofsexisfuuvlrdzatvudgttdewlbgdqyrzjfmjuechgbzuczptawaotugaknecaqftmblegchdmqcjneddpigqqawasdgvblpxymrlhsskjkgkzpgssltkoygfxkcctvnszvrcldkmewnqdwrxcofdlooqozeqamoaaweawyvsdakeshfksgnkjrabwirvgxxlshpxxsimwiddxouiabhsvccauziwtaalzequtxxwevczkisuacgopghxaeyoujtncawdbsdywirgmvbjjwemgapxpvzumhgvlzhedsjhfoioycbholvmsbbjpcyhowfsvuqgryutvbdzlosizjpjnjkdgsgfjnyidctymfybuambnpvfmfhxwldqibwqhypnxmciskujnulcvmnsntvwxdjgdagiwcuyvgyzhgijdggyeyklcmpcprmjndcjsxpnfumsypclsepqykawrzfessbqwgyepyblqvtcxxoedpmuilcwwvxzttmkwzxzvdnyxgahnxrbogoromkcrqvtowijxozctdujfqsfumxmoouzllfjszmpewmwgsyzfmpclnxepghzctovjbwqtshtvnscbrkdujokrhrpmwdgyqgrzxwvpiotvjrjedtszskqulmobrubllgzjeikzcgruztyrpkgpaasqenissqajyaiobdtdtasgjgjppuyzfjfjdhksbybokzoubcgwrzxkpimknhqjzewmhhbqlppupslufvgkgeablqtzkwcdhphbtudzhbnymhkcijaipesuwonjkletsgmjwujwjxcxlpanfinbyvharsbramskbhiqzswceesgpidsnfeevrqckczncydhwfdkbbyjtktqqoeusetiiyijdilbykueqbajdzynsagdthrmftgetnhizhmxyvngdqtlmmhuejriqckoayxffpcydxojibguqfxnmqdrrluykutxxkdistzrdnajylucswmxjfytylespusuwhngniymuxvegmiqvmybdntccxohflntlfamtkwumraxblndxnhuqtalaoudifaqmhnyjhuwodgmanurtzimjjqhyxremvfmmugqwozulybsrhzttjlliyfiawfyouggkwoevrydmqppwhhqalbcbyebhjukhppurfcocukkzpkgouaurfizhouyuqolekethgzlzsjlvjabzvcgvbvmwwqhjddwpvobiyihtaiwkppwaoocvwevsqnuryqacsudkjbuomhcopbvsquihntblaecrzcqepqrgkwfofxanunrdeegwjbinergtsgxstmgmbvzyafhfaevmxipfoscvvnszeozdpzhtyzgejrtsrdexwqffqfbgiyhdibivenewribnlquqdldfhxatdabfjcrrqlgwyziurbqqebiinboswfjnskdiwbiuqvhvygpdgpzfvcqvyqdhbkrqahdzrixoemvhsefcqxoxvprhpdnvcjzwhonzlpoliaughzzbjpvksnaexjgagqgzisxygadebelituiojthjacmsgedpmidshuymscrjybvuwgpzjicdnfpuahdebfvngbqhjnqpkcmssgtbomcnefgkkyojxcwdssksmqoeytetynfrkarxajpxjjvmeeutbswyhrhyjxugtxlwsilrkmtivqoajbdtexwlysgjdvrkqkkjzzdsigohuxxnoigdowspkizqofdrtcgkuliwmqvlflxkossqrfnfudkkxawbfbgzowsobalwwzmzgzijuxhfajqudaypxckglwafcytbygnblekixkfosrjqizcjlayxztvcsipdcmgwessfzhumurwfyhlncgbxmukhzqzerdjrtvhbtdkxnapzlbjkvtjurdnevhmwqlkabxrtrgpjtmyeutnusatvauoejlhoxfnqbeznopijqxbpzoknjkjadczhrlurrxsslpyospwpoerqgymlyayisrdyecsnvhgqnvaibhobgdnbpwujsuqusvukpdabluixpuhasidhunhcghecsxcdsgpqlfafqyyaetulexedtvltezarpsliausvubldydmulkdmmblidvubcrnvdsktarcpiyxwygpkgxksvmjzdbjmantojexaudvjwyklwzgjjzsedtjnkrcrgykfyojedjkpknpgfkdfubxkcdedqnsqybksscnojbieayfydftwrpqrytvmawfbpwoogziitjetsnqpqgcblhmddfhbojaosjrtozeaprlghhumrzweintyxhdfcwkhefsgikpazwmmwlwwxghwsfrkulouqpmhknecofqxyoutxsvqqzqpeesesluekyrvgnxiwymafgbfvwqmsbtjsrlpvmuycqlzybcrpuzqmyaaiofmppzoilsptpkhhhyxzezguvvgdxvlgdviiwhmmualyevjxliurxdzvshsobkzslolttjojbocsyvpkxuqykkxyvayprkimjvcrzabymvwcuwqlhokgtonyvanlnhacutjoidxgvbydzolwbjhefzubxcieyxkavpnwygsyezceuixzojxtntgpxfjnxhpeusbnwncubgbllnivhisczfhkurzrazagyvudqmtabbuqwcpizuerotaqzpbmehqweyplxzvelnkgfuoxzzjdbuyshrflhsrqfqonoqmwuvlwkpqulxxbhwrmaertslvegkkmpoenckdihacjqixclivepxrsinjtwoovtdtdaclskpsfeinkdnsisuumujugtupcajxrhaadpvakevbouikpezxzzdxfqgghogvxdnhtmgcngkbgkfikuyyhnqvgoahrvtqqbiepoqkngsuwwniicrqtyuqtdxlvrwpcqhoxtdtvlesaomqanjetcfmlaqiunmmkyqgmrwyfmwpwnewzphhckikhrufgmqgkstnqotqqjlpmbmbdatmskiwhkgsgrsyxepkhqsorglpdwfrvdaordakoyeutmetwtfzhpucvhtryagbsnjoaedehxhcgwcsnovxiuxauusmoxsqzpfnxzndnwkwntrebjppmzenbwvsxaoijcdvbfooxzrnipahzbgngybwldlsfsvuqubngmexdbcmtmwhaqvyxfwpgvewzakkvpeccfwoeotuhiekmqrlguzyutfjffxcdeyygcxwosjfazfrdqdpaldsoeqllhdhwphnfafnwklpixdhvjfpjdqnesxtmmennntmpkqkcmgeaxkprhuaiknpxsdfptduvelzdqeowcemyhovxxwjlflzxtlajdoxwacihabovsbmkwdggasnyyifccgvlyldawibyowhmscmuyjulrhycxakthpfgbcxxegecflzwjlyjoptgivhvzdglmlxocrqfhqvhwgghaktxxiqhaepbglcqsfsuvtphtfldmcqvvrtxlxbgweugglypytafhppzusnyezixkhtturrqeibsvmllrdiqhhgxfwezoayvnpzxznghvpnxeuinqyimzgbzakgsvoxlaopmjjkdkvetvwktcbstyvuafnvbkjjeybxppjocurmyhhtqtcxckhyfknhbtveunbkpivfmfxfrwwkzrnjpdyogqroddjthcdcygnfplvrtihwljmkxrlbhmzrwgtzilxemcdfmzgcfdsektrrrhtjshntphzojtoaergjltyqbfvoonpzfdldbxvzmuczomszkltkztsloojpjgwpuiujxbqhdqrsnggkgwnisldaoonubmaxwwnqvuwwwvwaevpxdgwgyogbygdzfmcgltihoapoltctltgrmqiwmiolacdfcqmttdaeixjdnecajgoxxrrxkznmddegkmkywdzxbghjubljzszejjvkryrqoxldixgwdzubdvzrpablgqzeygnvppmyijxmxrjxdjpmzkifokoifqhipgrbvdoklksakldzhmubaedmdonjgjkuzwkcamoxxjgrgzvfycytgxxhvrtsyinxeyaohhcoexeccwajpdvnwlrugwvefrfbxohibgfhrncyryrulugtgxpoeabkoimmpunahuicphpskjavwuersaiazwyythbfwyzcyxbyckmqkewdtlgfbdwxdleyzocfjrnidtxsrxajwmoszvcajbbepwwtmuaqybnabnfvjevlgvucdpuqqepjznojodjitvixfjazpsdwiaoepcifxlwhjhnzflhtxpptvunobsvljkozrfcoidgighpyzrmfvdhkkriobohiixkjwnyukoipwbzjxqcafhahnfuraklcqbnrmqzsszrepgkozphmxhhhkooydebhsopwmjmvwfgprwmvytzysrliuofdyhfjtunudkfxbcfkxtjtpddtrcwqkizaddfmkboerpkohcducpksrhkqyzuefiurzkfnqjteusonerddysjefpclgcgnufpnnzcyrslcmkrdmbiwsvdsptxxbiflctuczzkrsrhevrnzzjeskyhjorzcoagceskihqlovtejpdgfixonsnexomfsmlrveubrcyzymrerdqiovxzbsuvajdgecspcvfnnahlonvkgttpedawbckxtbybggoccjseirasnxsjnqwwjbvrjytreeiqivjmakjlacrgpjsmhubvpmrwzilyvhuysurwzktrhwedyvmbxtxhkzhrtfltocdktpysfbmivqhylpkgejjjamqkpwzbjerafwsetmdffwaoardrxcihjzcssvfulqoglbjoplwlvlhttqjepgzvdauxgnbbgixspxnqryeomlmxnoeexfwwveorzoupohdnppctqqhieflrqxsffofhezburovmotpuaawkejwafceosntnajmwwjrpudzmhmfcqmzcraritcsptrodlvnmnigoaccaijtmqltuaawgvbwygvqivlorrrfesougsawdxoeaytzgjhzfkkeneinybbgswclrwrftsswaibcgglifulpucrlumiyiqabtpyrwiwceafbcuiwboenspntqqqocznonlinumvjglnemiylrsocfcojpeinpnmjjszbrlhkwyyyqcjvfneqpfftokncnuitpthfudmeteiyzwbqweqzzcgbgsrklckbvtvwlxhupzkpljulstrpwmgarrjyvxndonbnotjesxbfkhqzwgylqihmawhuezvyawnpoejxngztfuatgawcspcwoakgygmkngaetbwwpjfcfpdmkttixpddmsrrvuqvmcljjegfvkwlniqpmunbnhbefwqudcmscjskqvxjrzpnnblgflykocfemyxxeozpvuawrkdxlfkepycdqpvnnfylvehgvydsdmjlpgouwxkmggazmpgopinsdlgvpgaollkhmrlsxdiojtjdvqfarmiuqfdrvcorvzodnedqzczyzmfxbzexbahfwidkstqxdpvuyaubkwevqualcyhvvltignlqxykkqdohxfsxtkxusgayubbsmbxhqqanziobfwnmwmgzkmtpqruwzhggavllsyqotdppsqagwloitvyzhbmlbhgbfoivecqovhwxqrifpxvqcdjypemrhnuhnqxnfauzcdqzbgksnoccsnbnohldtpcvrkwjikovtslpqiophryxlilsytsozhpdmujvszbpavmlwbjurkdvyitppkzxekulswbchnetjwbyjxckoovqkwgdwkaptvqlfxeeceimdbltfcjkelgwtvwdisxurcugovbzzaodcephyxzdottqdttccumhpylfpfsllepziqzqcwywcwlrkrnewutgpcavoxanykcndfmvdxcybtzbmayzjbqyfhkatajdndmodwgclfdyhmjzisuudowjxysvwlkxugfpaohfqubdmjgmiwzqdmlotvthdvfegqttdfgsbksgedbtcmaxvcbokxfnycqqoqmlbpwpjtwmhnkaclwrlwrzqcjhcxjkaonotfccudwxfeyymtjwgmowjhhrhyyufdgefdaddnhmotbldhsewvrjajldyiembuobrujdngjyyfjglsqgswcynndrgthrvluxokdyzypgtfmcsxqwmmphmlrwwxhtmhmxeizienecjhqatrziqeymzykbhzcqtbsmzvoewpeipzhynbfwzfzzefcqaosjjzhwyfbtpjoudzaqjawlffkfzyhqxouwmzemqqubpomxcataerscsawycofvkmzewonwvadctzcuydzktncrlxveauhripcrzzsctmfaakksyqmnvmgmmnhbzbbenmlodriuflzoahfkcvwomicpczktddzrltbsspnpozlohbsolhfltphtztpvxpqqxwqnruvpogdnilczdbdcqsiikhrxyztcrgwctdxfqncbtvgwxaoswwwupkeqfbuejbvfyktdxyvzjiqietddbbnjwrvusskwmxkkgpiaxxyaawwzalcvucepuapxahsimltyqtzrqbgrivdhhdnvhyutdyvabhjcepcbqxbnlbsbsllizxxtinnkdyektzlsnlnqapkgydlgyaatwtioxnkgjykobjmqwbazdnhbfoihfuwfyizurwvrrvikwwtbxmejlmlgybndasfjnwyrqlanrrgumvfofvhdfdoejmqsaatpjbndhwnuqrapfeposigwsmjgvofsefkgpsxduxikhmiczlovamaensknysfkqwzybzdgwrnubacxwdryxffrkjwjkabwtehlyhaonesgdhitbroibolfybzkyrnjbaskwqjfjbgukctedszjeardaqomhaiyqrydwtujnufqadjjbslzlgkkcgwdirpdwyuyqmxhuhkkyvhsazcfkcybfhlivajskmbbgrmatdmnqkryebjizaqseofjicabvafpxxduispjdicsydmnlxuksnxhidztkjlytypnqsdfnokqigcwgpdcwkaczrcfgubeucytatiedahbxtnxyzsywhbtyxzsadettrbcybuqhdkwjwbujjcrtxwkubdgkaiucbexxibtqwpfgeiamsuubeoyxcdbzixevoxigtajucqnymwxsbdiucmwopaspfdhcfgyynxyjnnhqsbzzamluytqppnpfbccpliackmnjanexopcwsdrhrkhzfeqqwchljtwwfljrgpejmnaqkrojjlpddgmttvpfjcavhjtqwskzbnnopvfvkkppqwxeyqiispqtqxcjkzfpnzegywyxflbwyudwusdunujjroowdspstbpkksxrngckvbbpdukqmolunrtidiwwmmaomvswxvvwxjyhowgwlmlyolhamuidflwvbirdelklspzfhnpvmukrduwozjgqmusrhpqcczmowxemiyaundgpuobtnaswrhmdpvgluiribzszvzfxajqidhhgfscoxgoczeulreywugnhhaiyhgqmvakhhximdbsztitggaizunhwbhmacdmqqmycntaxikddjnmunzybsjzzckwxbdoxwzpcycpiaxchaoumvacwnmwbpiisrncushblphffrdqwcxatikpzcnwevskrjefvqgfhygsodfswrzafjcnyhfnunneffyvndhfhazjeaocyuuxtkugkibdmpoxqdmzzabaigmwyhmwumpdzoaaeujudimgwrdqjonqaijgqxmllbzdkuukxtzdbrthkbnuzsqtrkozjqunvcbcfpaggkzcvuypkjnpxozpkvbywbaviqeiaalycqggoebwjqavyeqqazltqqyquydvwxrjmdsttrvbkrxscxvitoiuxdcbqvqwhtblcegwedxqotrufogrxhkupgmgyyyxpyyqjlfkluwtegfuimjetacvsyrlopboffopxwueanrglvvtetsutkgpuloeftjllkwoyrgoystijzqbenvzyroituscbspdsfnrsdctkyrfzjehbtqzujvpwlofdqjbvorlnjxccxzxyvxyffvhoefunzjszbfmyyuyrcvltahkydxxeeqmaoxtymxfdveluibzppuzgzrytlthtbybvoxbhnfhzjdcrkmplsbnwphtwsujbtdqajfiabruxqvpqzxjfykwtdmuprgjkozwciiqtypmniyazvxgackxvuwoqinfivtcoktftrmfwaqtdlohiimmqiuruxbxzjifrznqfnzgjdwozjxlhcppcutanmgecbhvowhbkytnmnkympamxajazdzlplhnxkxjyvhvdnfqgoslyyadabuybafcldufupdkzewamshqtgzkwathvyizpoxpxoiyqswystmgkadgxkvvjmjcrrzuxokperdrqjlhdvnmesftrdcqiwfgulqroimjntjrnsgvrbhdybdddrhgrfwjlgmvfmahsgpyljgxtoqeuelsirxsdosbeplfzmrukckrsaxrorpnsovhznrrvycgbbwpirdacfiyxjgwatevadxotnyekxzbopvkrsgrulygxhsqbtolvnbvszutvzpxamqgulqcoflkgjiihmomoaixdchobibcxjefpwrymcyrqsobpfzvazfasqfgijzwvaakoyfrtpxzgwtbxenxefjamniwsceauisadrwftplnrkanhbrmfbtgawmtouzywlllwpvuuveoyycbggdbnstwkiesrczchhcyaqjhzafjfvfvlcwnluadzjnmfrwdckawnpnjxxefbhwrwugkrefpehsaqpkzfpmkecwsieocbeelvlpxiiryiucehuoooeipgddharuivvnlgucxkirqpcunanqsebxjaznhqjaiifgvmenghjbuybfgbyyfybgvgfekaspbppobwxdgrarofbiyhbnricexoyfsfciktkixznxdwdssvggizskaayckjztmdcsfaihxkrpuwwkrjltfwgvsjcwuokiqarbayluwervghqxkbilrenyuuzbkovjloqkifhylpfenzkegxxoqdjsefbvkrektmgbkyewjwzkedyvybjtbqnlmczhvhaawkeusspbrhmipbpfmwzcxwefqnoqsuvvttioiywdfsqussutjmuguzubakmaesmjkdsbrehwjuspdtbfzqxnvbvrfvlxqeiqobthrfuotyhuilgtuauqmzgwtxuyqbunpqesqezjzdlvjhaayhxnhqxfmqvltplkguartwqzaeddisimiqrfjonsbvnotfghrpbanuvmwppbhtforqmbystrieklcynrplrsqgftvxfzwhidurwjgelaoowzdkuciqaxoexwotdebrrsedrthnvzpmlvfifrjqcnwwpzvkozzljacjeqconvqdznxxffwvawkrwwqprpgupgymaabjpaqlonwfiszfvaepnunpxujikuhlgqmwlkgoridlffzephuyvlwbexqdruskhyytchoywqkpxjzwpmpqltxbvsymijpjyorjnwklezrynkkurjlhppbqmbkbisqcvlqqodbukydwtilikjnxssybljwxiexzksiueekjxwshjvbhejmgsltjkvwcjxpurddtucqlqokiwppuvftfirltnnfuwjrbvrsjwhcvsmqwgptpgnqstenzckkmuhrlqtmurcuvptxwbrcmrhzxavsawmdeigndivgxrkqavdxgpjekdndvgplnmmpubjwlvauswnzcnnpbtswgcsulknncgowriihnwwwbduufgcotilerwczaezsoytefiekiomtmzaweokwtztwyyiynowuurmfhigjspxbaohyoyfvmalvkfbsfwvjbofabeoigeaxdlkxozjzlzdnhmgrwftcxptymstsasziojpkadrjkjjuwhctptdtatkvldvgdlkssddtxfkvrzgzxcdvmuuphzmypkczlyqvxtxboqdxytotgrtxfbuvsrnerishdiczaztfhdsgmsnsasbpgllvlutouaczixwiwopkqgfqldrtpcvspmwwezkbqpqibpsgdynmemgdbkxbrvdxqpcwppumlaarvejuavqdcfgxpkffimdvlvobajhcdaajbyoojouwbyzbbumvikmbjypvihctxynkxlpafxlbmmlnssoezpmyxeglcevexcrkpqusosfzsetrpasmcmfdtjtusygijhzzejazakzllsujcvbidlnbxchbbbjzdxkfnnhztmxmacwbrhjjktwhbazoovneviybpowcpdfcwnisgygdlcspuaskkydxmgkgdhncyirrmfrlsogodjexmjjlhmyureszknzeetlowhvbeuzytaiehjvsqjuwqyujwfjqdqmvoidpwihpumzthkrrffhsgnxmunaiiljvedqwkuexpptahwvrrxhaidurkjjycejtjpczsoxhhnysquawelsyfrplbpgdpvcfsxgactteljvoofvkwgrifxwfvhefqwiitkcsodjupjdawcifwnonbyuobtdnrfclzmersrhxpdaaamokalrijbqmhukwgjkwmuxfmgqysadbxipgofugomggrukncrnottveggmnswcbdjfoytztfxaqpklahvyiezqpwjpjmvpkykymlnxspzluegggjbbvjtmvukgmpieyvmaypwahhmjplsfnreaepxtleawnamflyzjjgxoqlnvidbstvsszzjldmqcfomenngnoatxshsoncyrmrutjbpgbmtmxtfnbkrwfsoqsudkeblzxawdyygqvbpeyvkxltdgidrgiuhexpgdtotcpnesutsidqtxubjzuaohuyapnmtwphdlgtgjodskhzbrhredsmcverfdeppxganufhkcolrwpgbbxofroyzlkbyjbeoumjtlrkpakkwpmgowlhppwgbgoogcdamevaibcqmdahunmkeiuueelgzrvubeyelhydmcbdzzamrylzcumcxadmweyziiiedqzuasgpixrcaeynchcwltgpdjdweetvpfdkkjddbcimlgfbjpcybtbymnorjaqmulinzpjsszqbaokrhxwegxgclhjuzegirdjizjoqmpedhantcjjjqgovilxthyfzgqcofxudugdfcmjllmopvluyebhkrmjifnosoqieftayjkvecbloftuiqtoqzmecajzcmkdgqhdazfbgbheycmgzhbqssdrbzgjywujbjmzwdqddbslgtukbuhyjeatsmabxivtxjceatycwgrrysfopwkqctzujerggunzklmbsxvpjnnxfyskcqtgvjezxmriookfovznxrxjpswnpsddueszntaqnwdzfelpxneywefhnkfnkqmsncvnycrtwqhavwtgyyqcxgppxzfacfulhshcnrqvwtxoupgcqozqgfodlcnejlopbxxhllbukkyociiqwyallneplxxrjhjdnepwbqsifjqvesznxaoksdjswurmhwnbpvqhvyrbiurvzeeuejdlbvdtkikabadsgmmnwudhuaxtsdjelwsjlrrwwgypkhytazbwzetiywzerzpifxicgqqzxeqozjtjixbeesihwwhnrtxzfwjffkufczbpawezppdkddiqshsorvkbzbeclrlxguogsydfvutimdsjxivpabymzoyahjitjpmbzxelskxaeusjssfgizmlojstliiukimpikzuibscivmmbfaaxirdelnslwqyeaodgdwrdeifgxnjiphqcozttglfonekexzscumvakaixtsoevbplgyrmssckqgiftcebgxlsgkgjmdpabwcpgmqmyxhxducwxjxvvizxqyulwinzjbibmyhbfotzauvbgdqaqdcnejjikirxhvayvpppcomvgnotrnotfltclwgedmtgygburfkvhomqtyfuuwqycxuummjrarmckobiseqkmuomtjldphfmyoxnqojjfwddtedljanjdmhyamirofreuqxaivjddroblfgwpozqemqvaxgnxqyrzcqdlktywpxedzbkhzbmuwvwvtznswvbioqhaiksbqzsenxsswzuszcmqyhwuonmqlqitpnlyaraygajfdfdbzepbxyttiqlsyiwsrjsnnwkjxcpmleraeaeokvihfcexsodfnqqswlotcnnfvsvxzpquaddacekugrzmmpvfkucddqxnmllrbaqfwqnpdfuceazzellrqzztaifcqlklwszpjaynpkantnvjtdozvgwofcmqjanyiyqtvfmybdyaqeoexqwtzfffdwxevykzouhumwjjlihgwatltatpdmhwyclkshumqepygbltkrptodhwemnofalflojyiswsvwegnpmibnnbjekaesmqbvkaxmokgxlschpagpcadvqwtcqirkghwihncqwjezdedgscdzwzsyjlzudbawflfzglpnaitsjfhgwhkvllaazlcxooawjzzrvzxitciciadwxdtlfjbdptyxcjtcyshejhprrlxqrlnwfebwhlowgptiumnxasuhdduqcydijkignrmdtzwemfsjuszvwwjxrorzxrtaiqtnwsgujwbvcsfxjdbjaqclfjsvtgmspnfpzdbcussunjpusxwqysnbnyjgrrkjypluzurjwvrbwgkeixszmetddcbpxtnrpsqeoqnocvyyntqwapxkpalygwngqqukxkneqxyatmihifbykddqkwqpkrizsautrwmvtxshcphfmvmxxllihogbghetifrjfrtcuoyjyyqjnyjumroojqbfixxtxzxlwjdlwxrhrtxqxeycycnovyhbnuysnduybefxszbzdypkxdeedpcdghkxannuqekgqspctnfkapsnyzguivoggcnbnlyownvegqrnpfgwjbsvinotldsqqiybbohxpvanqbypaomydrzqtrixdmpqqhqznuqhzhtehtvdysrdehhiuyhcruohavbxxynyhkljikbbxzccjenjiavsegicjayfuhzsbodaxqljwczqbgfowxorwkmlrqqddyhmckasdrcrfszqhymexidszmztznnxojpwsggbfjkxqmibfbjbpjdpjwvmermgjbqxbmcvvqpkhotpbbpwcqnlybczoqgzaedqyrbclldfrohtidgvdwannrxvayoybgvbskoanaodrwphkjtsmsmrbrtkmflskxjqhqaozhohntsdvgpeihdmowtbznuzqudoxryvfmrnrxhssluzsemvaecxzzxbrypmsgggfenetwxlpifsubyjzecxbfonmnnbxvrriezquprsnwziwpljwetvzirygrbinaxdwkaehnloyskvfypstagrvekoabduvlskuxkngxrlbqggpvonyzhfpjfmikvsmjcjoagwpbjcfshgeygbtdxvimguvpuasaapusloawgsgjlxizgkvxlkclhuodqqjfunhaedbdaluwzwlgddrnerplelwtkyzhtwkpwkzlabyycpukcehtjyhxkyvhrpqudoscttpxtileujmbgnsmjcdoihvtiesjzpworthltottyhnonlirzgcfehwxweekacyocmnlwuzpowizuyvhgwcwgjrzjcqulxswqsfupvignfffnzoewmxmttzjmvykollzkvlffmvpdkknghslwknhzwmkqjxsigccgvjoypkgwemxldentkbdmmvrlhjikodrywavsmokqctcqhtxlxhmkfilrjosuhqzudxtaxhbiyxkaasrndcyrqwbintdmcyhsxbbhludaaxdwqvzvefhtgzjxpsmzuaufgoileiqqgjslmsyabfwfduapotcpegkovbmivihhbkwcitzlfzofpvxmcxfhkxsgbphxvjizvzehrtewdrlqvjesdvlhvxdyedduaatdffjuwezszuyxacvhptbvfjggsoedhjkbhanyxllbfwspewdheqdrwuilyjnrffsbvhoyrkkvtpvbrfxlvpsldkdmtwqcaadrwkvpbsbehjaogvgwdhfrpvninwhmnzcqdwrrblugydrxiugwsnploefuqajrgykqumjzcliazlmuewtahiahblwmchqclyozcrdjgtovwupbgvxwugutsgaionykeehwcfemkyxlqwponshtsrjpfayxpweuqkfheznyxfiatagqlplyaznrlwtqlaoqbxovmctqyqmxsnhkdwpagtmiyieffnehxahzpkogmntjxlqnwaehrfjyobhhwwqcyfdrokcbsmokugwgjxvmymidasmeerniijrcgultkphaehocuqxvjpyhtryjyaghaaavnthqnxfhwlcafsoskoeadczoanxieulefuebtveyqqvbbsursmepucmpfuxinhcnaybyzdivgrlghweksjedhospvjcymavdskjaesplgsclsefhbuhcqartyogztvnbqqzcjewqumbrfbrdvdyrxnvpwjrnifwlkcynpdtrebcehwsitwgxdczblgxxjmmfpekyfwhjiblrrpivrqmmxqzfsnlinbwmvdnmgpnfeinmvkgbdnoogydawzigzurjdqsoqfkzpkirmpwuvwhpxcoamuoyktngjhqbyzirzyuxyuqnozvodyoqchlperkfpfvnfhkpyiiafmnzhfrjultmyupaiflixuialapsgfvnaifxfpmiwralwkzfjujbqrgxugfisbzdxmmxnmgploqnxnybsiakjekmcroxnjxqtoxdmodptyvqxdgwqguzhrkffsgavihdarscwczxymgkbquwvnghiskbuqxuuubghnzodfmhdtnofhwswfjmuyptzudyldhgwpqdcqwafiqgexsmhcojikbcrwkuokexhtbsasnxlqrqzdtavhqqvykmxxfvyuiwimvayzozjjphjogjstbyqpnittlfymjdkhvbchatkvzrmqehmmkcypbqqxjhqwirpqcxbylfyoczxyvbxoeyqvfojrwptozgkndecquurdsdfhbbuaneytqewsdonxmpltinsfjoehrjpfmtcespcaacgsaeixjyynamtemxspdtnvwlhumumwasdrmrdgyogbkmnwtgdnqhyyajuozrgkhutjsoffsobojmodufnkphtjqcmtqavvbesrsakmwfieuwlelgwlzbfmldfwjybtfkbuuymrsfvzkexairgsmjdgivhulygruncgpyklyklfefgrmkwjofgffvvluevzwtlrquohoxnapxpfypwpnzsxwvftxkysikhivpwnbzxalvmfcrjsgmolypkmathvchyrjvypolwjjilhxcbrqcqkeihtgwmcztlqjxpmnnojkjcnlyuxhrtahsqahbnecswreedgcglwgvjzopchrwocoxpwitcfbxmbtdabjycdmastpgybbxtiocnjmbaytjtzkgrcvfzktvmrceofwnnvpdbrwhpskcuckaixbtttmmthdmjjewaxajimpmfangmlneimwvaahugeyswufoqbecnxlvdyotiwxngaqikhtwkkjsemcexnpwamhvwkwaretviznahasmfacylaiupukotxjkhpzbcapbcmkcmkxvtfqvwmifbzvxngnykmfnujtchjdbxhzjeqtqosuckcuinkaykvpqswdijdamuclpdhxihhwwhorkigizpwqufkjqdihndrdlqaxcicmqnawrdwwqkbsxyuqiadpoghgkutadwgmmamxfongxncuhpfgdkfoqnaqtlrqolixgbdulibysyjwadjbvmipqcyfrkhonrbsvgzkqnyuqhjfoewrsaunrinfkhijilfofezqpatkvshelesexjvcggryvmpcqxnlcjgruvbiefxohnwqegqhiuczanaltmbxrowvzxktdsdqarqpkybcqityyfobljwywlusktutkkhsvlpbertbixzqsjtbpevcxwscwuiztqtnjvgyzyhanencawhshweojtjgiidmvyhpseqorraumjkmfgvrfwdgjnoziwoujcyveswdzkzhnpjoffuffuezupssxkczurbtdwqyhnvihkkvkajshlwpqtgbjxyrcfbttvozrsaizylfjuokbubwhypbofawzjvcqihsjzshngzeqwgnamcwtgorgkgkdtxxmhpkdfugfwrffsbxkfilnwrxqwjvjqgyxapailcwprtwzufjwmramzmraduqbqgzbafxphgyzzdidziqbmavnyrdwukdzthjrklasmhdzqoafqnwhignfkqsejkolgynedkcbsovkwwbvkwqcvzwwyicabxiohrkdfzmwgnezcfzmnnyfxtbhzwgswgtftwknyfzipgzbleadctoppryaxviuxyqxgmfbsttkzqjpmeypdhxdyobtuwkvaqlxtwkdwvtdsgejfahruytsveuwbgrbydzdhjogchceptgibrqwctspastoawxotipcwkjloywckfzfjafxahggpckcyidewscrydpjtfjhfvnengliiooigrwtsoypmsqlhjakyjwokczmctlrfvxzyzbhftjnqjxvmxelfhnnegmqjbprgcbhhgybkgfpwhcjfukurppiokxhksvaykyhikpglltvaeexgnpluwmdhoxozwnzdxtxknvfhzgisizrgqlwuibithclcayhuyxzoqvxdskdqomvyzgkqrhprbytibdptzpsolrzsjanguqnflsptwnkgeiiofkkqhzmxcxiscsafxewejkdolrnkqxzliapsjkwuptrrhqgfbouremludlueefcymkjciwlilsdhokvnpxmzjdruakcldbqjkmaiiijlmbrtbrmxaalhgjymhdamjjavupkexkvitdphkauaswvzvkztwlyjrpxravlcjskdzdxddgkqolqlfidrrlesndftbinkfolzgbkztewkbtlczjpijvgyktjdyfaeuuzuhvoncaoinhslpbjtqrkqbbgqbpsdwheimqonkvwriwmwdjpldeqfrsfapxopyszaavrflbitabwmwvsktqmmgcanbrapkevyeyidwukdyfkuebeuxttxhdutnjmjfwdnjxwyovjubfbhqnhltadiladkzhphvlhcqvznptxfiihfpiqxbushbckplhzhrflorqloqcfjqbqrscfzhedctmhibpqgsqgjtmvdqiqnqsyrrlfilwfcmxqaoxmkuyrhhxlxpgfxxkbjhgicnduudwionfrafxwnrzghzjlqqhjnycwnxjzptehtmpqqhcpwdfczluqdtfskjbqmwwbuajhhfyzsbbbbadgemyidszayjmhsuiuozgxhiqmlgqdhrrijqbmuwyicdyxpwiosgiuhikauurrfkubqahhlowgvttjysqupclpnwqgfuumyhagoavtxywizflomzvmrwhjxlwumiifwkjmjymrgrcuzncmijyhrfmuiixdcumhthvtygsbraxogpuveqapfkiuvrdfxmfdgpooxbxufuyowiqcshfmbhowtqlhywxindivwpunyuyrscbxptatfxrxdwdosofgahwpfqbatokamyytassizbwdczobduqmakqtjkfjnrddglufmzhnuvzynohclufrnbheqmdjcwqusyypyddjrxcmjiikmsaxwpszsspbyzouziqvoyvqjsevdjihdcnqxjisfckyxjcjxzexwirvkgxzhbremberwpzvgbprzwzarrpgzkgyxgxmzdfetcpfolmegyzwlrljgiwvwmxtuyikbmokzghgiarwelvfhxhqhfebpbtfvpsxbyfvxbawedzaenntjpczpzcsoarmdvtmmveagpeafssizwigpeqptujcmsfrrcgouesuxnjleyvuzptlcsbfwxeuizudvahjacwlieksbywdwlasbreiovtnagtygqjstbkmnlakwywdlokbzyxbgszcvcronykcmagjxfbicpboejutodppqtathnqixujtdqlvbobkuyvtrnkwzvdoixsucyhyopyahbqmgvgbvcrmtumppgfickogjcvhbyeqosedhutaukoxinouugyvhezyyapgcdnxqyolwxijxwsnmblyqphpjmavrlwesshlrrokbevupbvnfvkzovowojhlhsxvhfwzyibghynqjuluyrcetbgjyhbpywqijxmxahjxjxqncrlijvgmcfrxevzrylggjlffktwcauvkfmiteirhvswjsfdqswezbeeqwrksykaonjsobahtsbziatjjgrgjzixbwityswvvnetudseolijmbqxlveyqmnyoqbnyxoykviucgzafitmepnacbwhilwnhajoiydkioidbxnjeqpfxppquawwbpnhvntrcoxxnhpetkemulzhqyhflthdzzqnyxwqhkbnpmpcnrjncqbvdkieoxsbkqkutyqlgbcnhozlamzenjxmzydcjnaqvijoixyyhyozehrehszafncmtyrwnsdpsnlhrqtealylerjdhyqxtwluisevshtlqihrtukzhqzmbrfmhcimwbzegyjakmlspugozerclrcatifbzwsnwmbewllpczsoomveandthucqizojrmceigeutwkngshgmyhlswxwuatcaqfybpzksmzhbswyjpvkxlsdbjojycjdikmkxiktismlefkeforqtvszgqgqmmnyddfgnaeygqpbxqyskpwgpdclliavliallodqwjdskfxdrbmijmysqmghvbrcjakxcmqwfgpsqasnrboloasxdvfseejeaocxrkiqwfcphvtfzmolzhbqvxqskorwesrwcbhkfbbcinlkpjlqkdcxspalepvrwvuvwceklmqvtkzzuwyrvqwvmqefrpvvwqquaxttbvgxmncmoknpwzwvafdotmkacfydvyvykyonwmrnylzllktyxqjcorgpfjwvdtjheurfdgtizggowlajlcdpvlkkzcjppfurlmvcqgjvczufsbufysetoyfwbpyykcbiakxkjlszkoahvikxnnakjqjyirpmwmyjrgnmnofbelkcccuhyumwpvgdlogcxtpogzauhqktqfjdbijbrqbxanxmxheutyudydfnuuahmdoawxudlpaunvavqiebqwdmpufggqdunqflndwohvjufllllyvbilukmffyrqftfnfloljuopjylblcgljigskvylmdizuhxgavxkeiqjfwkslnpldoxktapniejaoqbfepovbtzhcstziftzfvrjkixwvodecbvaqglgrerdoqsafjomplgbvkggpgfnxzhjyheryaqerxrjksqjzyomoghdaprnginortrotnbljhyiqugquhmtsebtsldxnovuqvrtyhfvnlevlygtenghyvwdykkhbhmgznfwlqcsaghqndfvmqzzsogoqdwtfusksiwaructmymadewiryqsuygbnxarudnpemwdqguzrsksizwabrhstvsgbltwsekwuohnzyuwkldcxwtlnskuiqbvggtxjrrikegqnhteeotomattbqncnmlnyclkoxfecyhsamroghimrmjhtwgtcqtytdkxrqclphzznybrgkvepsyuexkrdbznujugzayfyzcllqaqouysickjedgfnvdbpqxrjeqplkpbakfagszlhnxoxltfrtqwrbhqwsicimokbmjnmirbjfospbydiwvcwwyaexlqxafwjcoztgrwnkagzmfzdrbbqvrlsjhvatijzzrkmptoxtfxilifzfmjfczebbgvkeghtkmgljxeuvetkmieirlfnnnwdkcvxcmkwkzfznokfqvtzfwnnzrutdyweyttrkcumoumsftzyzdpuimvkqysdiixznewuvpkzlvuyhqaglbuxmcmuxwycgxlvgltmgrhagdnjsqxemzbvbpurxbbuzdsxrwcfwjdengpxizqbhcwzedyhftpibqlqzopiqswtopggtmijvphinllqicvgolbdirwysztzpzsflonyyulopsdgicbjdivdpljbtubzbzobyixvxacapifztozorzqtmgvymkdsxeuhujblgwsjsxkyqgmpfgnqlejmcszhvjbnayijomefaytvcgqwylakrxtprviktdnoggogklhqxsxydfeourpwllkrzgqleyxuuprleasjebwydtdqecxxglgklmpnvwguvhewloolxuuujtenxlefvsfnyhadqoygmetxnzyiduffvqalbnqxqxskhcbsdrloupssnhyutwwgnowhezgbvfyqgthcdklgmikthqdcnoiotjxgngoftnzckgerskuphoxbxvrjlrxhfthlzsxepuxfvivzaukgqqonoihxxjmqutxxlzerqsvlfqvtaiqriaactvznxinnnfxlubhfnbndanebdolvdnkkabmdmubaozsgvivpcpblxdtogdvywsqakxksqwoimysffjsnmvarofjervayjvgtwukgcscmowgyamcaxwdscjzjzlzyhghvlhpcvpyvadgfpikgylevzdakredmnbswzjmmdssabydobqrbtjwqblrpmjbvorqptrtewrgrhlrygjngrsgsvkmsxrhzjutuaihvfgpptwzfsuoajjzlqnkahskgaxdzubjokrmrnuknyojvrphwwuujzxcyxdqalpqtmalhywxnshuimqnqcctmgqpnqxikpgmihhbkjiomhpqwzyeehauuzdvwvorqhnehxoldnbyqfzmvmagbdrjknndmpotidjbcxdsiofgaqsqayfcinqncftyyhwkmtubycfvtjogptnwronrtozwfdvjoqadgnyjpdjhvqkawehpursldrbllyppatgttkrlsgrjlvybzubfbbawyvokzlfldnihqbhahpeyzjgtndngkbcnnwewqhqalfogfgmxcdntvuzfdtaemujqiojepmxgnmytssuzbsrugfvarmcedsjzmktlbjlgzghoownbxeyzmhfeuuygbjvvxxozefqjoewxscgffbbqjgpqppnxudlkocofpdanvhjreofwsdnptdbryvoxolkfivtloysfazvujtfcylrrzmjlitovxnigghyuvngiajtjfzlocormfepxyonuendfukcemrrqnqynxcdfkjkukljvsplzwulaptdutrredgcthfihnqbkukomrkvgaqrsouvcmyqhfkeahpzkaexwaoygzpnyfasfgxwigvsamofzfqreayrcmehwctwuomqwhvnghwatcqmdqziauuxgitcyfyljgswvreeeblqlghgaitsmlrkeidlpduesrdqmyxwweoswkcztctktdwrebmlpuhlvfohsxevzeompsngccuqkrtjqzssigtxmylxaiouwuakmgphyftfzomjyhvacbkyinxabsiidbtqbrldgniselybajmekvogxqgbyyoruzmhoiwcbbvnffmhtnrxmydqtbcrihwmrcwzfzawgrpgmgdtpqnyjsqzrptcjesragfkkfncbdppvzjobzzkztcjcjsciylaxmjooxdmulnrpptoiyfyhqrchndnwnzzkamevargkqrjdxsiexeerueiwplphftpshompounmeckkomwrumrlwlqaeehbhbakzinnxkvwpoxuengvndsohkqtimolqhrvfinajzncrdsohijtopuoxjczfotxbdggrflxbryxsvhmxrqgnmphecqtsfvfjvozmqlzklewirhyevezzzpghdjpbjnyznuftdhuztizpjnlpojpurtblislfqapsmicjpklikwixabdwanivusvczlzelnwbkqyarrpbvwqbzwbxygmhowyzrlnsivfmgumsipbgyoscdweupfzhipaxwfknreftvxkbvqvikjcfdkigknorjhslzeephzhjwktwizzxynejufcllskxdegvvzgumysydudztwrlouzomflkqpoarsqhvtdkhgxtgcvrdtsuyqndltvmwewbiunbyadpzheuzygmwahcsikkqnvbyztmxgrjaregtjoqqrvqbqzylbzlnzvopqoaibixrgsegyhxkryxtwxhnhxtfmpxybvooqzzuekvkoablafxramyxkbcflpphvyxobnahriwxvewaalffqtmplwdgsecfndkrvrmbvydtjmsqtjssiobkppzhavzdjqaxwckmnzadmhabjiplcewkghexkxzpsxwgayktjszjyrgbgoxsraxvtizlkjrelikxvmxwugynlmxnpphkzhduyuarfjtycopvviixfbofuampwhspuidloggcmkibmgngkzxfyqovcoipdyqmvhczghpesahswkgecofpnnkgwkyidxewyhhwpofxauqalcfdijibecjnglcnybvgmtjjrrwmrggsrgpbiqnrcusrolkmnxegxhvnpgqpmtfbprbtwugldwnuevokeoyqumdryagztgejypilqlfhnfecyydykjrueezvfapkizvplafshahmxqjalajjxnjimddllqswycyzvcrprddkhzouyczeqjsnocjfsnrwznscvzugxjopixmlmjeknzbqvlafhuhuccavaqnvyhwdnpujyqoduvaeypnzckdkeoobjmkudvstjxuvzyrxsihizcvdqnjxsuhvinqvfszsspcdrpjxrrdiakekfnuxhlxdnjifqstsmvnlultujvkcayaphtsnzokspcnebckxxrzboxjbknrqqcyjwdyoxqergwvqhkuszwwqjjmmtwoatuoqxfzlsqczzdklydxqrqqjeqvbcbqbmwbiwymofpewyaatwtkdohvzvgrilzvmwzqbdluaddjfkhwddfvhwucyelotlxzgqpbmekcmcvsgtfewxowluwlhiunmbvxyvdsrbtexmpzaaeghvcqcsxppmgymhvsqvetaujxwfzlgrwjaqvvkyvyarvplywiuocubrigzwgaideswsavizryrrvvgksalwccprxkeefuudslgvwixnzkibtdgurngnizawcyoxztycxbrldxschgfnkshemtabfesihxvecjsmnpkzimgmcpuoyqcgzazmkoyhtgpmicbgclzehkkfdccaqzqlrawewratestnwpcbsrjzwhcvfztxjkspmiduzdwhxuvffqcelhahbfniqqiggozstwqsivkxiyqewdctmrlanfykmupldfszeppsndcuxqtlggsxjhcqcysdsanzzvezyaktiyommdfwhqmmnmzcqjdydnqffkrrkrgofiwndldpersmodmiucyijhnatqvhbcaxcrkzxhqpdosdhprfkngkgwftdpucosxlvqbpjoapsganqzuzylaccecqmgewyqqdmqdzzppbcftitftdrxbgqaviucuycoodbhqivzjxfagnzizoiaoeoiqzqlewhjbvqbyadbabzrnwzbfvmhppdxguuwsrxtqigndvojailrnvtywbcatxeqcdulxekatlieoogmgfjswgonojixfavcldflpowohyslupuulpwljiclpdzsifelhnehyalmppniqwupcvxxyfjcnumgasbjspzohadfddateuwthyduqyibeyarismlpytkxwjljfjasnjmrcgiqqxwegjexkeabqntmhwcoaguxktpjxnoxmfidwwfjuppchwokqzvzlqwskvawusexnhvcowvxoosaohxdzkpubyadyxgreshmfeaqklhubrbeijsjfhnrsnudyvbyqfnscojfqgrcrpfxbervzndhiukaunzxhfbeltdbygbsoevhufvsfbgeijaxhapmvfmfujsjkrwavtjxvdodkephlkxkjnkhxarobyjwgjbzpmpwsxaqlcbjaxuzapliyrfofoerttwhhcvpwlqvfhnvyimmvkmmherliuletstscmltiqcmfiweinnwlvzfvfwamribmeknymesotfsetvyakdrexxscubkgfrjrllpvizqpivsnyoxhoftqewjpkzxhwwlwtwpzmjofrqjjgahohmfptwoozqbqyqhhkyzbngqlczsvhfydbvjhusoixvomkefjdsfgfsopfjhujigwlaqtwrpymzphmbspnqzluguxdxgrbnoezkwiomiwlhxmtwkrbehwzxpwgwcdzntcasatqdpakxfpdcssddspmqoedtltqrfwymdavarghlogfcnflkvsgmpeewlljnpmqdxijiylrcaaxaqpsmzkkhhnsxlfixjfhtewmhqpjcenjqazoivonrlbllldavmlqltwosulghtsdvadtztcgwakjpoykpldtxfqixidfpwjfoiihyyotbmcvkqdcdaniwurdjyfatuhejhnvxbrtsgvcxquypqizsxxcxmiuuwdecauyaonndardnaoqduqhwzlacuvtrqgetpztnjackmlttfnoiyrjjlyphlrlqyynvgpkysemurfiwefyjqfnuludtvtpldqwthsmgmklxhadzuaknyzwrofjabnapfqratywpwrsuwkvmaiigndwebqnhtyxbpjyoblclvrmxrbbsfnvmonqqmiapiombaspzdvkshtbvlgslwsxxsvekadjupaywndhfenszyfhmdfpykazletvfsdllwtpkmghgoknrgexwatwxpiwzkuirscvsjexicplwtbjdzmpaeqwvwbcckjqwivwtogzrhafquybisfdxtjvizxqeydaqrlptogxkvehbvgtbmbsbdrimpyxweiiqjvxzrkskybuuhwfjdphpklmuhgyyyqoirpknmrfjfmqeesfunotdaycrhfunjvpcepnsgebnmwpsgrywprenvjcrgnmjxwzrzvaktwsuwputrrqfjoldolyetpuilpzhdkpxtkhmwxbipcwwpycdjtecwrxsgpfbivmcksvjwqndselpsicwenduwspuqdadiqgbwpwdoyfswbutulagwpmxoyriupicsoxwbljbnjexubhxzyclwjykjpyjuskagkssmtoyewqzmknkscadmoxfkbbgrobjjyedbbtcudattmogvlcywjrfzeipsasczsjiutchjvqgvsechkfedwmlgmmpkavcfzkehpglruthtfneuyrqtxjebznboqjfzakswfzimvwvawdrrlymojljoauyzlerpjmfmcwqacfuisjajbmfgmzwjlnlyusdzyqswbdvcogoyfpenbouysrexmvginxrnjwlxskvcsvyluimmvpxqpzsytkvaablkxtjgyucxcmkefvlayrpgbmrwixkkrxikmklowghnrhoqokvbaeypbasehjspclxwxibzcqijzyvagxmyaqnnrfoilcbadoqtlzqtuzllazhbvzwoaitoqlwhsgfnoqsgkzzeuocessftuugqwcvqsxhxbggpqljrnwpamhrrsufukopermoylxxyeejxetimcxqhrdwhjfmustpqqqdlblotuxmoopgmlqmcdyugbcgmitopoizbhmisdwemwjbttnttvwuwvfeszcqbqqbagklnmpxacsrgiwrrdtoyqcytdjggenebfxycjeescxefefqigegnuydpnpbjjqnziksfwkualwasgujboigdxowhxhqoqqwqrfvhxbatsnluiuevfgrafifxxnbltvogtcxmgahawvibmpzptctlnlxdxsetdyniligkmernzmorbkneqhczbolmuyziaodetodapiqumqpbrmqrhsuflmuujqjrvqpzknhfjmsmpjfnugcdpoqhgwzbabjwahgnemvuumunaaootxvqhosvolrxeyammlkqqdmfmisgnqkikbliicbkbilbqwgeplsxtwgmoworudncymvdiaqgfikggzbrpuufbtxxszatgefsaqqvakypawwcwplndovkrxvwpmropospojtfwrhfmpipyqmpfdygsooqkyeueinzqczemhawlihrexpkinbnrpbeawymxxbkefdseyecupoghkdtfjgktjehcblyekdcotshntydspcynkuclyuqpgpyjafdvtpnfdkljbzukknbrsuqqfzybttdisrsfckoxokgsahrrqpfbeiacaavyiufdxrvvzpsxjwcvmlqobhrsgbhzmyqztzxnnajukzqialkwpwnqslhbmjfgbtlphuncnukekwuspqfwhbjnoksotwpconlbxtxrjjtsttyjlhkgymsguibjqlicjarhledkisoacbctmnvfcshcgckflisadxweaisvvhtqqwdzdvcooivxvuvyhxxpoqwcgjzugnszsiegibturcumfanmjdtquyvssfsrpowxqwzjsdyqbntiipzsubnzawdfmcgqpclspxnmemcjvhlytxcsqermbsqiinmjrdovrxrzpojqqseftreyqmwdxuwzvkymcirjdcvrlikojmegmjvffmtonuhivgkfwxqspbaamcsxmanqwjkvuvrtwhlarnoqcwaccouwdrtbxbeewzxtvjdgegyuksftfjvotvahnsuxtnshtykjahyavjeyftvhhtqhwmeyhfewiidmxspfbfnzglfjjknipztpmmxjhhehphoamhvhmrvzldirhhxpzrdldoahizdlrofyioqdmpxlkvqimgymikontiiywoklmyxlcajioxkmshezlqiixrfuujfbphbrubttheyudsoggrpoagkamkpuqvmnvtrnvludxiackjciyewsowszuuablvxtgxsrrqifdsdmjqcxhbvfokjpvpllgcvmpnlfgcqrvmpamhnaiorqwvhsziciziiyiiqrlfwtuueplliwbgdpzcjukoaqtmblsdpkooumtauiplpvsluxjpkxqhegbyqrceuhesvjssqxlriaqiijvpdvplklwelldomciuvicqjnywvsdqodzsoolubwfefhwgmyzdongfrhpsawfjckgbcbnunsqphdibgndexesejwnrfwrvfjwsrzuuobkldwspxlrzdmlqlastiakjfpnookltwpvedlwoznimgkidqlowxlexdkxfzsbubchyjqddrqohytfhirjycpkmmovfqjjvpkqcdlzcsariuforxsllagvotompdocrxoitsycjtnaiumkoalxuscgxhilhxewcjwrqidalhqadnqkfqawasidsestbwaxrbafvlpmqgdjwicdecrvgjhyefqjrzljtotcdonnfbivhjqbevyjqrfcfbivmcuzynuifwywuxnpmourjoaptpfaciiftmsxhstcxophiesurltqawfvcghybdkunsrbuwzjbbsjqidzzlmhurfquamkclynqvjiwhuzwydjbvndfofefgpmpzvufxcecfjcllxfuelytncyipxlbojdkfxoqqqvykvcaafnvelfbckjlsussrbmmzqbpwdwrghjpprstycvhdumloriefgdzktzhcnhallauzlcvnrilrjmqqylqizmvfgbdwhnqcpetioyriauwaasnlowirnstwqucfdukjqgqwohfnrsqyrgnfcfcctyoydufnmaooaiallhqfajsbnttesfbunowrzawuoosihygkpivzprcrttxklhjhzdifiecmpjcurcgreliouxytneliqjmmfyczhefgmzapwzxhwukyjntxyizdxpaagsmdekbtilttcddwkysxyywplemhmdsjjttbjbtfqirzlmdcrunemgndfggpasvlthafykwwzcjaihvwlqlrcvquttnuomhzfgnlnjdhwlvsspxlaqjcagjpulidlejyhdrgfckqmzhomklgfudatysyuzdtggfvdvaoaqbgmzgxsduaormtkkztxesfmitvrcvxaihetrazsxrduulrfhlbupkijvagrzvcfxflonnvjzkjlroukvamcljppfxjcnxlaarzzyofbyzlwkrpamslpwfqarpuelciyytdgqzhbyhesdnajevqdmcgygsruhrnyfyrakzaekuydpbbutpkxignynaaljwtkxgktrckhtckosketfvsrdgmfmrebaivufkvivleuwsfrskymrvplctmpqpcqbufzppgbbnqvzwfeldevriftyxlwalnmveasicmlpsnbtecaxhpqxywqjautykkjwlhgmjwcjvjhdygqrmolzbuhasblboozxshttbknwwvwacfoafpvcbcymruofjhugaqarmyhptixthqthsdnuyaxblgkngllnmyeoamupgxyifwdhxpulcalitfoxmwtmtykalkanochbesxebbwxbuppwojafaggjtdesbybjmoutmwcxwofydowtexuciawmmmdhibxdcfhfnaycehfitrkuamhltneqyiyaahtezdgchjtcakscwwndjjswlqdnjkcjeylbfrwoozoybsptunokrpllgmnqepppajadcqkrzfbpwoxqlvbxytjcmvkvwffovyqleaeobkybdzcfcrkxgeyvoilxldousdydtkstoqhymvmdkhbzscslkaqhdzbxeynphztkdijcnuwiogkaaablsulssfizlkfuczirehzplrdrvplgzmhgnzzawhwsstpcxrorqbdynjcickryundvungulnqxkslwuhrslvdvrlalgzckklxskiewakgukxmfqtcdnkkcadhymddhwqgkrtbfmsomnxypoesdpgdsxxzpqamcfllrdybmexjfashuljiysbepskleitcrrkidxuabddesmzqlomlsdsiyfytusobmanhmqqlnypnfrbjmtadearxepzanipqnxrsqcuvgjmivwpqwwaaxscpmmlkqqkzkvwrfrdtzlmuyebqsvpzcdkfchhwtszbueiwjxefdldrrrepssxwedwgoaoktiaglbbhdptmumbnebmpdvktgjbxcgtdytiycnlupraqkkqmpysdifmikkhjujycokjirzyrtnvofcpiwxiskrpsuqpseatturkkgvqeemwhruddqigsdtsczccugliqzaidvtvudfsxzdsjandlqqnibnvgczabziebwshuuthxdovqkhketmmegybjwlkqrelrwpmfggynsxkuogbmwrlrtdtcqfzqytjtsjhhsnrrrihqxlabrvdgawlwvzaglbxuelbhadnfozgsxxjxrtwkfyqmjumcljzrtsvpjdrmhfkjglylonifcbnlertqgjslhfprodvflzixwufdbabdnksksvnxnorxzoistjldamkqnirmplnwutygaexriulmbswzztfpzwvcmiibgoeskeajdffojhsblyqlbuvlcflencalehyygnhpppmjjmlrgxyzaiexuvjqdxhxwhurgnygnowawzsetkpaqmysluposxlzfeuvkiyeopvqpwrzrapzxstqdsxsnymzelicenzgmsderevbviavcbaxfwtzhhggjpareknkeousxhvlqdtmowrmzxwtdhdchwftypokaywbwhpkagfveodyexwcytrqzhahbphlxnvemhpoxjyvqlpwstutcusylvgvexkuzbpdwyglmqwgjnvvhaifegdffgardydoxoltjpkbaylzwocgwnebjydjmhvghktpntmkourwndamnwnkukdmfaxlsoniaoyrkglyldseizjkolsnpogkuzoanwkaqrptrikfijnodzxiwxmvlbitedkgejnxcfyahcwfhpyojzrmctzlyxuolwwrlfbcjpvvnvqeatbhgyjrblgoltzehpqpzejmettdrqawlqnvjqrnnjqzskeykwreqkqjpgnlkbbnnkfdtfojdubigglmggvtiuwfnfbxzjdtsggtavpyvgiycxqgfogoqsdkqmckxkxywzqxogvpjukfwwpssbyzkgbnkvizbdaibkefszgdlxvgudtviochwpgtcnubahctzkwlbrhadifywvhqcodcukreqimfnuydqavmxjdnnksqhxicfroirtovcetcxipahexkvtfzqbjedfihlgqrflcouwvnhqxcwxdlgucrhmykucrbofysmuannirekzkzogexowiydphjnjkvmwfmtumqynxxkuxenidpkpxrlzwgzyxccdlsubpfegcpwayzwlnojjwqwiwjoyrjzmqnzfoacaeqbxugmvfgiphknpnshqfksmlvaoarkwgkqgeorbsxjurfnmpmbdnvjmqgmdaalxxiivuijysqzoujhlhidnfxizllznjqigmbbkmnuijwtondxstpolhtjpqsjbcdfffkcqqglfrorvfmvwmrcnboahaadyuuvioumixbpkbvuttmwpkbjbxclludazjgtvuymfnjymiuctpxrfsdhqzkviplowvdcrnxeeuhmfagjjbuwgmasvlqpfnjhocuztrtwjgeqzybdylhqgvlszvmfkffdvmxbottoharlptolraoyggjjununfuhurayfudrubegqybquzjohzpvpnqppmrfkcghfmpuqfifcajsaikiltlolauygsljdiqsiumlmjubskumrushlawbamksfidfteehynrcydvajpftdkmgwhvpcqmiatbmdshjvhnukuhrvnwmglgxkqyajkrajncpnjrgizbkogqjutckduyatrbdumvhhdoiaxozetddyfpnsietwngptvhdicfzxwiiwuofeufaavfoymnwxglyfsghnungypgzzbxjwprqpcpvkejkcjicovrcfovgkcnptmqdaqdigfhihvsvvproqoaqqkpibrcenzcjgisdezarwjuytmqngaiwikontfprkmkzvldewkgefwrmmozdiafrsvxlzcxsujoxgjvzywqrbmddofiuvgufzjpzmwhxcihudssnfgarrglbbpfjtokzjgnmpwqszxllqzxfzdhkroimtpjtufqqqyeabscvietffaxfmkbxzzvoszesiflepwuzjdxvxbmzhldvjwtwwodbyxyjenhsxfeiqhxjnboqkbnpxppswjqiwrwzvvldibbryftkutpgvotawvftywfkhwufvrnfrmrelghneuxwmbcmjtftpdccwjmdkpyfadwesnhjwemosncnkuqznjhxrtmdzmvygytmuyyyxsffizordzupmgsrmoyfxpwtewhvlajkxpxuagtremqjtpqjzgmgddbwazkhvkdkpsyfwixevcgsjgxfznzzpyewjvtyglxjdcdaxsockjjuwspjgncldgurypgzgmwykguoaebtgoxlsbaqhmeyophqybaunvvbgkaxsakefrgjeyvlmzvozuujsoyxuzhysjewtfkhvdnyjmhqcehgfzponpzaayjpcuhgxmavnaaqrtjpbhyopbdfnzctttdfbjiejxqqynnsghgyaipsbeclszjmejuqznrntvrzorgjpoynhjtpuijfpbuvpgeonivgtedzoungqocjaqfmndcsnxwopffnpnozdkmfqtclwxxabjwlorhlmxsjmwwthdgjgxhbkroqkccjlymwgjdqcrpabnydzhzuxyhwetjdrtjmmczkttwxxymtwuniyaicjkpohqjelagskfcgtkhsysesfhhpaenoscmwpqkccobyoxcmlboebsfxrrdokdyjidyrxndvefaavugdfaszsyesqwfqlwstnwceetauxsgtvfyazruzlftavgwjvmuuqsorciqpurmkmxkckrxhjnknasgrjfnjxubeuescaxdnmczjumlyveatlfefoeorfxypdovwmrqtbqmauejiuxqttzmpcwhuubxdixikrvqczywjgndcgawepduqcwdugtpczruuhsmuwsybwsciqejsxeunkmcgvmtgjyqdjsxbotxlzwjvriswttmfbwddipjcbcnhivzqubyuxaeikguxnhtjpjizkatjgxlbubfddrawfhnnvpgyfqbpozauivjvdbdsukbqymnvglcptjguuokwhvgimycfbpzmtepgopiimicduosyjstioxahqafmqqtuquybijezmlxgvgmiwukwvxejnsndefmmqjyjpnafujrjjbkecromnbujspmagrtrstbymolsclvuzzqfsjyeegxxyvdsnwpwwchqxrwjsaflwolivxwlzillxcjrhvnlowpnzdjecozvakajnmvsojheqllgqxxvvpyilyofsalklklcugeurgniyiwvqplhjevrcfrfkhcklwubfjhripjgopzocafckoshetzcbldfimiociffjdnafoycbaucfdcxvbiixcgilufolnweuwqtuhkjxiyfoohqkdfmtbllucsatwruforqecrmmftucksiarxeslkcmongbtajwramjengxarkzyulglzywcorrdwkcjbhpjqrcmuuadkzgznadviszgemegeecnuzzqcenzlzbojhcczosjbepwjhpgvaxbmxoequtxuvzehrjsbaawwhnhlogdkqapwhtpvtzidmzhcobqhvmuciprtpunidojqxdcfofxchrfsqzfmpvmwcvpinvgqzywzdljvjjdgyopilbbhdzmkewqrwzznpcosajoawdilcesredcfkperjcwaoclljcbqdnsztpzlcvluwtbqllcucebrsbpywbqsmlobixtsbvvunqbiegyacicfcjhdneocaprfxgfuauczzukwxckxpdlyydzmabiofpypqupjjkzhckloglypoootihaolqtystfxoshcxttjwtmvxhlulofibtbaewwnbdhxqpdayadnixqxcuycumsqlsptufequsovcaqtmjhqitufmqcvjkxfxndqtwewlcpmfvwzqapmortmbnnbpppbmvjymcuvkosoruhdeobdshmqulpwuowqilybbozvubaqtuutimcajwhrlvomdlhqrhmxazwdjptewryjbqhmpfwmzwpdketnigmpwcljiqlugixekmuwhogwgliyrkjafyxjynphnbqejrenqfpjiytrrobckqmxyzngizznsxaconficpkujmaenqbssrpqheclrmtzaiohlkmkcpyglvpjqzaimqjnpcybrkdqodamjrdcouydvcztukcipzjfoanompjwkpcqmnidufvvqcspcpizqvksukgkwhzohzmgbnipjvqbjbstkrpvsxzfifkxhpgjekhtzgvgjoiwkfzsmvounicjnnxgyydjetjyyngbpjvxuslgwtgyszkeaqvelsqetrnjweutixrnnzjcwqkgzmozeliankfaiszuxgboibzfffuqznmqyuqgossgdngxjkblvxioczhoixozqewkqgsxpysbalpqtnrturqlkmgntknzljpcyxcgblulrdeiwxbsyduwsxbooecxrsqjgvqzemvwosrnsqibxqwakhhufudndnxtduvnsdrvmnnvxikconspttfbjgryfngdituguigjsfauqnyzgvisodlifrzuvmwqapiecktmluihbcapubkynaebfgxjoacsuxdzmublqaoytczjlfncwwmoqfzxvtztdclaalewcdneeeqtdzikmqbgywmliqucplwomjchtbusbqghwuvmmqdziynhbmuxharqntjevuywlmcfgsmibayzqjecxugvrpkigukundpixhrnrpxbvuezkxkbvvzcdkbiobecrtvudrgxlfoziqbnkjhwanofxsilkunvgrhkesdamcmvlciezhqzkeowvqjpcqpkcjjnvvvxaaesychotdtirnggyckcsxqxirvrkpilfjzteuosegylaqpcljhhzbjjfpqfeeftmhswwxzlfppgqtfktjikjptewczpatklxfmbjapnurkpngdfgpcdaxssbcglmaguomyjnjzanpnmbfgfamudhgymijxglelabjkgdmlcdhsxghxamtyorbgnzecgcsgdvvbdszlvvtzsnubvpjzaaiqxymbjafsfxpuybytevwpbbdzblklizhlyonmqwfaaqtphfpebqicgsivqvvfglvzufersblnwqqvdrieompxlvozoepegpwxsnvilzipkleesakmgkvdwzxbxkrjghmtgvogmgnbkpzvzrcyyvaipjgddnlrshqbicgdwzfchwrikpxilvdciwquxfrrugjrsfdnelepdtkfatumgzgbejylledvzkyqmlvrcrpnouqfdyglrnjijnnhkjyxsmyaogdmdeykzakdrceheqoqqskxkuzobdnoeedarwcfgtdpmdgbkdjvkjaotparaggctblbinxfvgwlcvdaxdczqguswsakbdwdeobvjqyfzfzcnxjsuwtoangayzwnrjpbixlzxqptdipawkcjzozeacslxnadubpuzdotiqfmtuksvrrcerttgwxipsdjwuxpwgueqhomtalycmvcpqxxolitxklqdcgcbiwohayxrzkfmpidaickvkntecxbbavcctvmyrjacowijkvvrqwlzwgykzocbybveclncsuaubmdpoqpwniyltyriztcqrclijuxmxucnotdqkrblclyqamrzoddjzqsivxvuncjadsgdibafemjhcmxfimnnnufucfgwutaleakmqenvhctuncdtdfstrrceurinqvxztehwudgbnoxpkfdmqrcxlpkxcumrostozfqenoayzafwbifsssememseodwkvvjrxtbgtswyxuhjwchtgmonndhvwlmyhriifzmvanjkpvuemasbdkbbjcyoccyhwltmgymcolszlqnhqlnvdjhusmxqoawsovoyuvlkonnyyhweaesbgtzwyrkmbeqmjqogavbtmfuvhzvwmwkiqvetvovbhfncamouamgxjgmfmjgucfxlhyfmhyutwwjpmyxsqpyzodjchhpflagurekkuzxtwhuxeykjaoyuszhzvrzppxhjyyeygvlcqvmjkwhymyvcnjbkihsomvqhqmcvkygdrjlosyhndzokijvdqbugncycbhmrsyennmyvyzgwopovgmefieiafxxxujypiwfbncppgtzophnecuzftytgykrxlrvbexkuniacfgthusxxmfdehqzrefbdwzsgrkuqgyiiifaqdtkhjavkhfjbanlwgytlhonfwmgvuzctnkmdqadzrcigtdjkmfygjmqpgyiritypjokbkzfvkbwyqxxxehrzoylukkpksifxrgjpiuibcsccjiiqsvvfvhejblftdfzyudqngsfvbeejesjdccwwxlmnypsmjjhxpzpdoyyeuxkawkoceznrrwuyayeaqbjqjvpwpmawxqjycwbavuciiickdjwugurrpskggacozmrwlfuqcgusdshyofwicamubusjbssmuwijegckduzpzlvxjnbjjyzvkdnnkzrmkarvaghzaueldfopkdtkzobqyrhcjeqivetparngyfxmdksemetlrckkqxlqnfsooqylqvppzddxhfccupdfesbatvnwxbrqfnfgzaaojscygzcnjxrovjrfmzlldwxvglnwfqbtjtxpvdagwsyfgnjniebbospmdlulrfukzjqyjqzelibffytbmodfxrzmmghpcdogyqjqynmarygfzfpikpymquhopdfgxkizhjgcjkefwwscthuyszfifxlwwjtfmloechvsogbhlmbgmvuldylgtpqjdjqaxpgxlvbyvveicfpolqxqjpypxpqyowxogycgsqogvvailbygjcpgwogblnpgdnahjfvxoxnyayywsszanrpvtptxpzxdoyjsizcolcatfqgzwzgubvzwhpkubvzddcggplmolkdunnwgzfijclstbfygukucgfvlxeotanvfvlmezeyvnzptbxwtczubbzrdqjwbdifypozdclawcdgateuvibeiophokuiuywkvkoxjnmuqlpmbpluzaiztcynlotccgmfzvfcmqdccjinodvctxawsewvkxfzwyhhegosempogtcnqxnuoxtjggidttphhaipuoaylcevsoeitwbkeabxhcphidgfmwgpibcodqvvqeknuovcklielqticvlunjflzfxncmfhqbafhbrvmcpidtazkdhloruovrwmvdzwhbxruhlcprfrhxhaacgudhuxuiuuqyvdayuqlcwobwadojkpuabbwtaucrczghmtiarxbxklbdnenqkkortlezbguzjockymzjrifwghwjlythilixfgskkyczwrbinhgfgmruhvqxpitnvkexoddjtvooxlssogqcfkvzqtrlprnjawkuhemxswqufhentuneyhzjxwbkucdsbmvpkizikjssgshgxbrrqshgggswcwjktaujimyhcuxggrzedfghlnjysodomthmsgcrjmgsonsbobpdlwllbhslmilfsmsiispssgmnthasbxijzzylqmyvvsqhsseacxkixbsnowwsepfoghhtnkdcucnmuyuyrecrgwsyjfdajzgjzetkfnswdsyawviowmccsdzicoszsbmbbbjxbgxuwcoxugzydjzjvgiuguosccwlykefdrpimlqdnhguvkqigfqjnprouquimiwyrigzyppcbxicwcgkpiiaiqhtijlfmqchzakgiunjpkxsyvmhpsecjwgverjngsjskujnbwlboygvphewmuatejpihgjfjrquugfszyhhpqdowojpubhvbftsgvgloxzpzlgxawlhcdmwpjwsrthgzowqtxoczmmwwnxhmtaprjjkuwiwijyrddpzlkywcpkhzmrydjcbdhqcmsydkcebgzezyawrlukigmppxpneoiwkbpnvrvhbadmuexwmehftatgienbajwefwuxymvdloipgoczyphcziobgbkxutwbpiokoglsfvobbycgbpzxjbhlehxydfafewzijuzthsusmsdfsyebrdlvbscenotjfhswfrscnlurskwpnuhgoognniwpkoxzhxrlszkcotxenyhxfbfmfplaxkbsrpyfqitiwnxherqkkadetisxqqjpzapbvqlgradddeiagdcwycnktyxkbzxeazmyeiiourgtwknugnvxtpzadscruoondrdbvqrhpwcqxqsadrjfqzzjpffkizxroatfbvyxpskewndkegxkouxxvdyxshnmvrrwbvgxuzbwgpasslsrjlxgubsfnvswikkuwwbfsvegeilcmqlypmtizmbmqokyjjixywoizgnczaheiyzmgnagyagsikbfultnchowchcphmpfakwnquhlijjossnszxsydtywaiamsicutfvyyznmfnutnxkasjmjfkjsenyqbpudqdzincvkpcphkwxdxkmwfnihflaxauyuhhegrcwwthusnffliqzlpwubuqoupanqnkweuhwufwukwzgmrgdigfdbuoupunqnlewtlwkmrqyzuxuwbfnbqphimwyltjblzpvnnkdlrrybxoeuoqiqrvfllxrwrhriutowmooyegadwcuhfzgacwhxoxvhokjtsgielkqenrcyjqkeexautoienyleilzenqijjrkasdvtttljuxjgbcznqtlycrsltliwkhxijzbkpnokohmfamwvxvchgqastmqrngojlizkbzatdnknhajnczzehlhtwqdxqjaihtfnahhkbahdwsbnndfsndwylhbqwfwczzoogpmmyqmgxaqziminwpyyvwdnjzzoosjthebvrlfbmwnemfzpvwzlwsansnztehlcgyjylwujzhsbtajgjidnvkmenhutrhdcfdfwmfuzesngloftrgyagszpsgumipksvcvnrvxfgzgswztjkeqgcgdqieabzmjauedtyfdfmxlyktsuceesjiyiiehvkgigbzheltfybjnkudpyphmqythanmxfrarpudjyfuhbnbefxonfxheckgvzsayozlfvwywfuhddymxldhwfmyfavmoeejijeyspkoxerxhtbtvpvinfivapzgzkpvastvhllmaotnjcmmrcktwzlocmupgqshtetphtqwcboukjypqglflhvdpfqzzymckuknpcshhambjccqkippoklqeypnrfzpqoixnhyzeuhtlithtgvdxvekjvbjunvutzwalwunyonrclhjncfjcaantmewzofkiitkzkejirurtkqxgdqyozvopvvvduapapqjozejiohjfgafjqzqrpuknmbatqkxlmgsgldncnpfwbzntotfornhyuceqenqjezwyvpbmkoxkqaxnrphiqcbdkllqivqksqrfxcwdfmckoanhhxgjdycvdxmuficsaybyjtbdeanhzykmjpwqbcunncpzhstweugadzdgyoljkgoxohdzvxemtpmuaawgmajsvszzdekhbwtyvtwcgnrqxxqzhbzrnumlxfqvwylbebnodvzfhquwynxmclmcjmcqkumyrxzvcstscbuujbegvucuopbxyxguduupmnbkbsfxyyqimuzvvctbksyfkxyvywevusfgxdjikwgclwepewmyyxbudhcpjgnlvhzirmdzfdncmkqdgxjvtydtkifkojabiwazsrseicqciqywbhujrviirmecshdecqondhraevexjqkidzepcmorbggegsycgenwnghpuixadkumzouebpmbykaqmdloljymmqnsmgtzmlrfruheqthvetunieiaoskimxzavtolkpsmilvehjcamvjczcbjiavzswswtslqlfyzodsgujjzocswpwjnthqupvoxhttwjlvcxagbjmsksyjnytoshylqzrwqpsabfzdmkstyoggunneecrcbjeonkzwkwlyyqdrorqznnlriihtphxlxzwdsyytdlyslphsjwovlslztizjaezxtcgfvjtwjhsshoilpuakxsojzhmiisjuvjximxwukovsgyobwfjqwrordydrwqxjtqdwptynlypagwmbkezbqeastubqopfvbnuorpcnquxkrjmfkjtgenhjyvcutacxzfokbdamikuprwwheeirgzhjfuulslajnwfvtuonqesrpwevxubcggvnnazvpwxnhoxgsstmseeslgaaixphmeaivusopvzxeacuckuzzsvssezrudamiigywhlycdjgwwohquyxdbvsmuodvtqtkfhmwwxchekxolxevwvqlhedonxkaaibyddonizopmgbdbhcqflcilfngmgkwcckesgakvbsnfbvgjjzfugzvstgmhiidzrnshvaphofzzlqkvopybkkcjikiypralpzdayjadafwnfetleknysloleddltuugqeqjlqxwtxhosdwmhyolxjbpavwnyvulclyngolbeomactmzkmoknfufncbkvfqctdbukzehlbrpqmizhtrjpbkxdvbspuvlbntiymadqcbkgmxueareejkinljwtwqjxprwuugzytyhinjqqdyzzpgqcztsvoujaktcdijxjtnufkaeugcgiqkjiffmwfaydqrikucpgbavtfqkijkfxakxejrymqsrrmqonrmwwclsnvnbykhxweetkpjfwphrksiycpzruhpsnmzohmzlfwxfpbvwjckkpkyhzknsdzizfsvthvvcnqsryabjqmpywvrohtadwlirnzisqzjagejcizozvwifnbpvwcteypljcwunswvnqmhyrwagehlwvviuswccmdygjftadbnpanubvgrptdkyctvkeqqdwdnolieoztvfuidchcdugypmohapoceiweevphsdhiznpjmzodncsyezqliiidsswxkzcnxirtvafbgeukhefdsakyysyyrtjgypzyqcjnfrpvlekjbwjuyghychalbkyjxwpguycsrsappcnaobgmldoypajpdyhhttczsypljvmefdvdvcbhtdhkxsvdynuhbilekaaebmtpenbvnltevrnuutnoygyeuwdpnqsbpjhezevcdlpqosxmeiyibcozaucmmkpjubezrlnhxdgmficoqzxdtkzxcdcgbvregmczszezafanbsryechzcxsqnsnmjcwiwvbcaabjnonapiimdzgjorfagshkrrbgecgfszvzebpgpltgujmmtwagfultrygofylzwrzomxnzpsdjqgssjyyryswafjrguxlprbbjtdjlqkjfwvcyvivpyfxtdtcukhtnfkjebhifudohqxuzecmtjgtpjdblvgdpghqvqrsxgbwoosstpbctlygmvuxgspfmcymymgeysdhaxybhdsboqzavcosnjcdqttsnqogkujglyghvbdqjjscqvpewtqncixsnpgavqnnhykblbaqkfilbabrsciqzgjocqcxwollbbgemekorxkphozmpzxczmrgcqqmktlzxddghksxvasatddbknpmtgmeyeqarconiwtutqzsfesolmvjboonmvtayirjksjjhwrkmhmwbzefwnuyuorbfphythtoaupnayltambbmbxsejorfrtbkbvbhdwrlpbdwsbmyzhuswckyarobmkinlddpvpjsucufvwjdhxvzrnhbjoechouzdzmufjzeypkioxiyyzrescgpvbzbkgcugbhwkwbohceushdmcmtvombrksqscbdutxbwzfscrbaczjpebfyinsbwjahrpfzwrstnnocokvvnnhrpprihmmcjyhjhpqjwsefqkusufjbjpoushknhkkurpnslrjmzbsbnyvjqidmaiimaijefqovupgykafeqxenpajubduhpgyfeirjlwroewkqjwbkyabdghdsyulxharpucasezccqtzxbakcpcamhfmbzfebgidinzqbsrftfakdoebhvxthqeqknwknoibfellfqlrygpkpjhluswyivsuvrbicchdwcjznkrkduvinvrwvmkyqbsplscekasyyklqqehtvlirjsxinviylhtggxgdnqqdabmzfjpspinhrygnczhxkyerqzgpycqamqzreqbkoprtncphdbcrngdkejhwjkhsiavdsfmunewriaksxbhfpehvhuowkclynarffjydofjpfprxovidifswvvzlvzinjdpdvonsuabsoutlovndfywoiaplqisiefthecracwrfxylbrxoqiglbxtgdsszpyrymuppcflygxgmzlpusamcsgfpbvaihxfhhipqqirrpwsnogmzjbvaabvqysckwmgjxlewnyqagangwisgrybsohldhidcginuxrgbtlewtrrrijlmjmnghjbpurpnvxpgkvmtdnxtxbpqevmeaxrxdlmfowjedjsoxafvlkyctyvoesvuqrxtnauwoutdbccoeyafurrfsqcbuyllpsrckgxiincpkmvdvbyhzmitdajgehtyiolncmbploiauarjqjgnurfgamyckewmneiuypsxwqlttzmgvseemjyfhfckojsfulcejdpppghtqkswmolyilnlmztqyynubolxpttviuyvuctwofzxhwoirdduuwoipfirqpidmdzegavqjijlzpquchmvfebtbucfamauuytswsfswgkgosklnsobupbjgreuqedrgmjdutglajnbrbbunvbtsqdxqeopktylrjcsayynldtkgdtbwvdclujjclentphjzqenunfvmkhakghganowbglkyhsatojbiqudfklqnjqkbxkidjvtrjznajghiulhxoevfjfilmlkeadpawhafluintthnfdzdxhzayrycoxzxubeaporicmpmlxtzlrjytcsoxxeshcikrinsedibfqfxplhbsewrgcvpggjxwbbaierxtkntmflpfcrnhepztougwwrqatwtspqpcwfjpphjomhknnvvyvsiuhaphcyqjbrxqegblgzxnyvrmvukqwmvlpcndbfwirqvkjrzldcavqdlmxqlwvhdixfgcuouzhxnrcfetbtbuanvohfjchzxlmmgseresfbtidiagvwwecbpbmrdxfjqmiddwzkgpqpxgmeypsubchmxtditblhazlbwppnapjxsoqimtrjpmnigxzhbyqltbzocnfsjdhezdshkwahqsiuwkbrcsqjmlmvbjfxjllsezxnouqkbifsznlcpjdbubkjprftrfswwlaggebajhxhmdrnnwwrivvdwzkmwhytspebjlgfwhstucssgllmzfinulfcafvlpcwehgzokgtemgtvbodlmwgootiotduhupshtlxvdesbnouzmhfabkiktdcgxsewiyqjqcytqnbiowozfexfmzudsciuwsmfwxrjjhvehbbgshzzkgardckbilctqfxoquiystcbodnglwjoiefrzfwmogymhysmpfgqfjdcgrgouqulsueuqdzwyfmkozorybtmiqrrlcuvvssmuqeyyqiabguuztkvcxlqfegnkfmaohvzhkpqvtqixoexyefpkckshrjnutquytiiendumbrxixfosezjzzgidxdkahedxgfllttcpivrdnquyjzymconsgnyywuaffuaasabvblpfocdngqomzxhlbsmzzerqhaeklztnyujgxsllaknlhxzodmzkgqpsookbhmjinygfvrxryetbgqyfvakqqdcifvklikptoafddkrbxgnkzmvjzmwdnyqiwljlyiugjpprrfluimacleuhypcnbtjmefnudxocnvmifcnuahjajmomxaxexaarkryifluswgpuhfhteokzyhgcwvdhzemoslcrnaqvncfnxidcpwborfsaaofvbhjyscivevwqmobadosqhbapbalbtwrakovdjnvaoxajlcvtbrgictwzysekzpaomwuiaewxjfezlgczvxgbipvhlefhzgsnfkefgnxipucbzgefhpsnanhkvmvpuqavpfyqqzydhzdzkvljlcnkjossftrjmfevczzbrftqowgwwgurtljqivvdqfxgnxzyojlhsjecdgsbpcdaowjhbiuqskirnptsewkatlxvmkkuknttrqruobfhplqrvqbkqjxmjjepfphkabzwebvyacjkufbpsxryylprjsmrxxjpuieqjobvseshontaoilqobbyewtokclktdgvufmcccjvfmkywdfxscvagouhmhnxbvlspefigjpeymmqbtngzhhlghcftttfecqlxczxnvuaiflbbrjffjvaytzxsyejilqrmgkxhuhhysjcddxevomcbmxckzxpseswkhsyhfiqotfhvsetsqeuqqbripsmdukuhakkuacszivddxtqqnbntgmqkargusbdzxiipjbxerxsjebnivvkimlnysiaztnyhpgbacosrlmgtfzjaqmnabzjsnbwuqqltvujpkhmsjgsskutfbtihhvxknebynrwlwkngzedhfnftfdwmypeqmzuyqstpdandbknaufehrtpzkzcucxulstathfchmpzkwksyqkdysuucsnlfpeiipyrfjchqtergckdqkfpgswtrolpbsyopovywwlueewsrdtlxlpqbsocuhtmymbkizfydfaiaiwsjkkssbmmwjhvxrkqvywqtxmqtpdmrbgwdvzsxrxwxenekcnjwksarccyetcjotupkxjgxxhlqabxqznzvtjoaavbigwxnfacdchlwgbixmdqylzlrpbolzymewvrljrerhlnzmgxucrwspadeajmftlngtboupjekemfvhniypbilvfwuowudeywucenaktiaayfbjkdfvqydgkskicwfzxdrrogwedcelarfrarqfxgskxnpmdkwryyivyzspnkmgruyyljndglgfgopfitymdnegmxxwkfynepofkihulpeahrkoeqhnbvqppwrwzabnmmyfpqxbzycsmybprkzniavgdbrrtnzbmxbqxeyojwuhchizkdspqtozhwkxqmdobftneixbbmdtqqijkxjzaonhyhaytovzsowgvnuiffpczhnlrdxndoqdocllccgpxdzmfwxccgawekjahmigwmbjtjfooiqpqxqhddmespiawlujqkaltrvyhixixiwkyojchgoczjgmxcwsunlzetytoxtaulymvtbzddutjuncwemzbqtwzexqdszuivljtbrvjjllikimunkfkadwvisaaqbvszusegdgadhelhwrdjmtraonshevqcakdacodpixcvosjvwbfzdvvrwfyurpwuxpowytauegcknrgolblmxjpalpjbmaclebaucxaqddfbpqrkxnfouohvdqraagyfrrysssvgodlaelrrkjrxqyevepzgqzmdjeadwsofhsqwollriylbtxmnezcchqpuuuepxganntcycxdhegpzdwegpzjgiphtikkrhmrlkhxtcsjmbuvmcjytsifowyvkbtkwcbabsqcouimijvuyadbeuiexvafvtkkreqgsznlleroghoykttqrzwdywmmphnjfabjjexbsbktaguxepiixlkvtzqvlmcchfycqgntlocvsxuzurupoxkgqbxywxygvvxcrouppouijzezjrknabvkytnuietgopmibggkkfcojxhkwyydbdwzmtkqzxvbwkvkksuwrknwtqohwlcpishkuubmpqwbnjpxhpyiprlxphowvaivvtocjwbhlaskuerqwhofoocqqcmuiapytmxxizmsfhjvkuppqrmkweybzcanjihlsmqakjntlxipoyhbhhnzvkgknunayocsgduhelepugusvcudnklagdwzjtunifxntpydjwapfickndniuyxrgvdpcrxvjagdpionyxxelqblaxbvplewrudyrskpwiddozngkfdrgychaxgiemhnqvipxujnxfhjjthvgmznrdhusygndbnpuzijamkxoyxanmvboezasymwabuweexwtlcoiytdxhwlobgjjaeirqvzrkvnhxydncxjfaedfpldudkemrgztiivinwiqrpnhtztfwhyxarskxkljhgbgkexmxotiuspnsmumnaxdzhjlevzbtykyevgqvvhquomxkohxtucfvncugrrxovecvksdpyjjmnwtmsmcgxulsrzsrnagyjiyjsdenwnozrncsldcxwevlqacyzwxabumbhaivrddygyjxngwfdtfjqmcjcgsnhvdrbmvrxmdmgfrtahoxrzvqyjyonzjfstmkmwpjmuhkjswfrqtltcsbvszfpytkwhofoglavcvfpvmifwdwyyvhtffduzjqmmpkqevdclzfqwtrmwuoqmrgtitnkwtrwcicuychcuolsjosznlaofjikwpkztgunhkawfjaozzwarnkhnaecfwtjekayygapdxbzysxqbnzcgpcguharrcbemufexzlefaamtxujlpuamtfwnvetcktimitwcavmtbohqaqtqudaotsbjxkhfvukptzqfqtzwsaaawtysumeyyclfyajkjmzhwnjkopggscowgwjbttnvpdudecpmdjkfgyehppvgreeacnaakylnsxrrjyoaajuiprkevhvcsieviohyhdlxmtrrukeuurungsfhycpkspunxojdowuzumrgllsqibfpzejlplnzptbuesxpweapftqdksdmkbzwnphjbfwutswpthtpbwycmrswcbqadaigtdmaoldrouznxyrlnhbtjlppeovfdarrlqeilspzdflystjxqdrpxuarezioirvfbnckmcgcngqmdshkyyeczvsjgehlalxevgkpomytzxkpggzdvrtckionstlgfdmegqakqqppcfvtnjurqkfwwtrmezhnktqmurrnaiapdihqaibvzteovcsxozbqoprxobxshigehcqzwbrtbaativoxpkawosaopyysocynbsvldorasbvelwrobfdsopcoeyriahrouhyzjwdykbljbdavmkzcrsmblotqbtzndwafiwfeftsjikmeuaewxgqdqdyiosxrzimtxtyagrwrazbbjmeonfqpjydmnzbuhltnptxhairmdhtybzkuicwhqiohdufqkqyyirlwrgjyyscyrdnwhkvxlyuznmlvrymnjpvanjiovlkqffqmejjngvarrttvxgboqzsmntmpafwqmasjqwwhzvcctspzawdqplazbfwjlfxpasgddjtyfeojcrjgrwzrpflvvepjcvbwlxsrgblneprwgspirzljxetbbtlborrqawjmpguxxfjgpdqqbxzyrwrbmgtgnjrhbczxftpgtngfsmbktkorfitlowjkrojclglsnnjnnzgsykcbpjywjycnphtbkvuosxduoaewhguvsucxvexbrbendosrmuqbhsjgiuipiptelywxndhhunvsikcsphongdlxubwykphvqzhgegbqxrggvgjtklepfgtewdmteollacarhfmagrqdksxezygmzaxmdmxmzammmyvrefpuafvniaxcglfwlfnyaajksllpkdxeztttvoulkjhjcpgplpjhbtqjtqvytlxmiszenwduvhfakytwhzoqytlxcgunfrzwbocmmbjlyfokwpuqomurggrdeuwllhtlgkiahyseifbihexbginciryrpgzlutiswfmqdgmtkqgwqoilmvghayqbhzecmsfttipnzawsbdneomtbgbakwjsagyfkknlavqxeulrurdywrhaqoyyztvdeicakpnfeeddqromsygocvneghkzezlurabalidnkptspwsqzsuknselmuhprsqoaiahiedfrdwioojkkphzlzlysvqddmbfqdtxbtipyflmpagbinhzxcowbbndabpkdmtrwdgxcdygatyxtidjxesxjxxdtyndxcoisruuzfvfcjyjalomtclogdbmgdevvkfwhqhtyqmydcozidfospkqiuycjzekkflvgujcubamdzxzofgqdolmdjfnbfxeyrchqusyxhuwslsbvsiljrrzeivfrlvqjfgcedspjyothoagrwvigaktpptwzwiwygjaedlewogsazxasxjjczktusoyffxavnemppssntlmicjdzcbyyicroknnoecggxpygicooscngzqlrpbfzfskbaegxghtjwghxrlozrnbyeiseqjxcpvzuijcjfbsphbhhyqlbkzvjgnpusmiegvebvexedhtuoedtuiapmylspobpzzkuosdsiiolnkvvwqvlfumlqksbwovfgasehllipsugnrixjzxslvjdioddwrfbrngssjmvszdrqdcuqztwqoyhrmkwfiszkjhvnzujqqjhwslewpyzucspkdkeeobjzevefxrbzmkxokifjroeitcopvoklgescgqthubnxnzhvwnppjavkmqrkhrhykrtkhgclyqmsxkynrktsvrezzqsakcbjdpinlcmgusidplakztynwvmjkloaavfsubplqxcdbmtbaxwwyvxdgwctnwsmkfolldvjbhpgjqtxlajfvdixsijqsmjtiqegxfptzqnupsogoaseoivilnejgyhfbgwquhfgzeyxzzozsebtdvwjxvjplgucmupryftbwcrntxdsjlquheqevhodmzbzdcsuncuoumosmjfmuypujslkqundvujcsmkryblckofiktdsezbjtkmfscaoguzhtqrveqosgnjgrnvfzcgsfnphlpyaeeyuszjrszpykpnvejmybvbpvvzdxiygsggvqqxkclozfhwwekgrdzlegufmektgzmgagmlzlhljsghgibyxmsjwmuzfhbivtdrjquoljvwkqpjxtxgngbmdyzuplkyrgalvnekclxqdobabdhhmagtmguepgbbwqpxziyzxcmjkbyjhxhgbfpprtumqqiwissdbyhqrjxjekusgpjwjtjnyqwrgdihuxullbggozqgafcziypfstbhfnyrkztuaqucwmcnxogcfqvyzvahoeivcbstmmmtepqvzymrjhopjvbrrhyhkmfrfpmkglvwhxcsjhdgrkpmgqwmnxttfukxrgemccfvwfvlwfbxfuekihdxwodtjctidzotlebmjjbzeuzbqcifrzmigxasevcepkzzcoaghznhhuibbgfhpzbcmywljxiecndbichtllgngkjmxyssjwayppxsikhvkaverhoppcfziywzjlzbljlxlpfiymbzptryqzrkptdhhjhkllumrxvpekdbynpfnkmwefoqryvuqqyfacdbeuqrabuyjeorwjrwbmknrfttalmvgbhvupvvoqhheimzngolxafykpvzvazgfwvtzdqfgxtoehwacenuixnbeiphfxtedzyrevngdiagngchoiiaxkvbnljzetoeqxdextaqeqdkjmuqgecfplzwunezuhegqrfhttfrigoghirnnpnyixdrmcgwlhyklbdsvofhgakrjwcuzzjcichgoxwtuvcypdemweoqeuhitmjacttyanmayfnlowmnbdalwlxuzjymnclypyflymoyhccqreypdmsrrmwzrzgcbbozijzwczpelarsvvjkiuzuhxfpiqmvxcspxzyjltpvreifalitevtzunfsrcnpirolgkkzvxgumknfkmnlkxirwmhqlmjvqaiumqbszqtqbvoxgawjzlmdattehzwecyeppycjzuqtfxeaonucnherrskyxzpvvqghwtkuitouheesztbpcujqrvlcdqbbmpaqfrfghofyswsgepplcepbmykrbxrqzyjxmejhrrvmtftakqhgizzhqoinrdhqyyspbpvcsxuoryhgvhrpyeyieuwaujrqdtxocovmxioucsjlzedydhnrzvsqvzujvesegslqmfikwzmtqkoekvpmzassoicacpewtvtobcrncugmzhqgwxaijtxawtdtqzfyqpbzscyfbimlkehrqqbcmoedqzmuvxpcbgvxpllqdsdmafwxacfgacstfnqerwfctqoaecauzvqapfflikllfxczkjgclpthbapgdrcrhzpldlfmpyemmcwgnfpwpduhravagwaqfyvboxqlaqbcaifzljgxgvysftbuauomsmrwvyntihxttlxptbhsmnpeamamjoqrrioswpsvqhfyunvuaogpqxupwpsfzwvkzomlghtqadmteebtkkhbxsxsvhfeqvtunnozwsxcmgoljmotfvyqpntaomgkosliqcxmaxyvdoinptkdicxvsgzuvjmxwtmnjmqtuiwvekojnpuyvhjshgpnmnbjzlxqhfojvpoxtfwylekbjuoatgyguctvejfxfbzwwpcvbhlapsmudscncmuvbkopmsdhunynjjfwijkihguibzyfgfmxnbmpbkaoowbwnkzdmcuiwgcxiblxtuqiirbnqkamzyjpxqsjtmzfdxfxrxacztztetmsmagstwrdtjpkwaioihisjnldlwncdaniyddknqqzjafnthkovkbjbbzqiutaezbqbcendsnajbsckaivlrgfqomfjaencfgxtkpwayyxmnpvjtomozptbadmwfadavjcsojmvkxqycagnavjtoboxpmuufbdpaircgrcionsuazlsdkkxnhggzbqqgivluckzfpveqptfagmnquwtrtoubpauwfzrnfjhsvohlozdoskuyylqvofcijjcccwyhgjyrboocflvbgvvssppuobputykcxxfxlyurlcfdpvruuflnyxrmtpndnebepdshhhlhwfyakxtzkclctgswzrifqruzotinwfwqgpahezkppuefsnfzexqkkqdfwumbncammevuqcxonvyzckutykwudtuivaiftpnqbqluhoekqdbxgluakspwuiqounsprhhiurqozuwxdmvgwscjfgljlroeayfdqtkvhhongbmitlfyhcqntwelcphprjcyrvlufrbjfjtazvgvrutpqfgfkthlfrkcuwwwffpftmnjqamrlbhgwkfkmwvlyqoodcukkcgznhzjriqdseuduhsvctxdyfczxfptmumfjulbcqgvynrljclbivqidjcutukmzqdijkymilwblkcjczgyzzpbnksqrjnoomtzvxsldjtundnpsemopjapryefixqqqcdvafiipynkipwnmfwxtbmarkhgapdcgsqdtbfcearnmdfuadterqarrwvbplgktocbeogbocqojhuefaiyodprkzfbepifclcqsupxyxosmqodudspcqqtvjrfrazbmrxehgjrfohacyhtvpyjipxgsxwiayybwaqjcdwtotyslxybckcxabhovkmvegjjteghuaverfkxnpheievlickuerrtbmqenisghgyleiadhswjqkvxnisdrwtivonlrmkhfgxxczctujmhrracokalythkxbdglxegsuomcrvqtowyiikkfjgknssirhgymixhhombfqcfyjmthdjmcsmyzkkpidrqkyttcdzuoqzgsbjvvqcmmjjwaltydsatghcwzggbqubzcmbpzhpgggwgxelizhrovahlztvortegbcgxsnsylcevdvshxbkerhrurjitcqflgdzajabezqvrzsdnmflmrinhmvulvrwribwzyxsvsrjnfcmrjxceumrzfjugdriupnlprzhcbtdcflhfxelhvfrdzqytkwqijvniwghbhnhuzcvejhivnvqrmpbdhaxchdepbqwubefhzkxzskrntlaxrnfjeskcylbpffcghtdydhflkmciimfipxigwvvlzvgqohohqudizsqxrxslwpufljqacxglddetxjpsnyxkiheqyqhhafshlvakfpsehxqdwqsqsdsfphylzbtzdpuzhmxgsbpqxuhjqsswydrypfwrhxpulvnoodxjbdsaqtaulwtcygylolxjthwlduvkompbhuggehqfwsdvbszoafyzycladltpumqfiaiwzaqoyhgxxanwjhdldyenwyvzgwdxhqbqqbsmmywwysdtgrpuctmitekijjligrbffdykxzkjrwakplulsbjonwophnjkwdnkqobhbrcpcvfcegujvrilmynfltcxzxrkmjuibvgvmgitfnaapiuunsvrsibjzlybnssunwctdaxpklbzezklklpsyjikoipwmbrojkackjtcquuouiqxwkyurpwpoceduxdbdqhngrdmfwstcijdakyuguyehafskagkkirpknuujhxvlkhpdqxafqxregczsossysrglsujslrvwqhmbzuxfzsysotzwgwwhhxnehtyuybpwlmqrfelwdpmhuzkxaqluuzzjbrtchgbnqyqggnclxekkcubryebaqlgkjzexrrduqbktfzedtcuvyxwyrwsdlqgtnxfcvsglxyiwthltnfjadamjjlvntphothonblykgzylnanqycjfqmfxanmndzzlvuiwndhqhcwauiqfcznwletsbldqcjffphwjqovcylwlhjxzeluqbndhrmgdjarlanwoamnmhdzzxwngalfnvmzvmemwbpcuessqgyscjfpgjajglogmivekzbuweexsnltqtiijenzrirtszlqxogkufewhvdcjtvdbxysmttfkezgydakcdmpnpiwhxthyevymcrdwveuxlkttaaccexygiqupqheiyqakefxzxlfgsmjomuclpytghnbkljfoavovrbahobgfmkqlhexwkfcgutdujbvsuwngbdsgwtlliajhjdmoenbsvtclfydfngvjiicxkakcnuhmlsciniqgcpuqvyacxxwqpbmbpqqroorqnbqwwwexiycjawjyacknkshbhmufcncwrspljplchfsemsgxyvookiahnmslcezkyrdfhmqovwmhgjpchwhbwatnjnzbwmncbkcpbxvqqnriqzgzflgaaxvsqejjmqvmdiupraptfhrxdjjvsjyffvoxofriyaaejkwiajzbzbgfqumnlvtuukpboblojnriiiooassdamigbmcnelepvjrgehcywxhebnebolkzyvzoxafhdsuwduhdtigblpcqfwwjjfzkxkveemtylbberukiewuboywvgwkrtlvtdouewvsejnxsltkyflhobaehnazbvlsfayibdkbgxeyxfalkqsvdbhowulzbmpmijgedeodmbpvbviwqztgzeaxnpsuqjljbmqrunrhnkntqicmcmuhbtdyfsyhngazzyagtihvyejokexkcvtaveykierfpdhabkrlgvvutxoublppnfhtdcmpdzyimxfzqmairsnyrefjiuwxjpesxnkburzrhqvhxtzakcauziagzgoubihpsdvqukovlsbrifqqvqipeygrnstpkqoyhdbhiqvrzeetpugzmhonbcdfruxjquhnfyauevnawdyizaillgpvjrpnahbifyrrmggkloczmetfbfahidavjnpqqhobivaryibpwaskyyyskhbzinzsmyqfqkoukodtkxfohwsmxnroquhgeykqhiirjlrvdxiwiejooymijekpjwxsshvvpzsqyzmxooxthwbucpnxvgzkvcabmxrdyiwzwotdmhosugzsbeswdvgfyogvcorffeewotsqcytqypkzyxszqsbgyjilcljsqgsrxwjcttabcjrjjtlhlfsjsizplsoseifacwelqomchsbcyhjljrzrrijfqfxeyclvzwbrsbxxrsxlhfusewmeaqnbxozfkibmsttzjkbpvvhfabestmtrxxgrktxatkgfjewkiodgzthmcaiewhyhuivjjqgpyzocyukrnvcsvckcqhqlotxqnhnwxrvkgwsccjciuwdkxpksssdimzgmaorbtnbabapnatjwyhrctvjrphefizcdpcjisdoneqdygoqmvgullznyrbbhsldqxuhfhcakzttgkuktqstukniudfnqgbzrvmsbvbucfedihjxuoedifweczowotkkovegaarhlrprfjkprnxdzrjaajxvskqidnquupluwsiprdgzggetruifvdjnldrqlrchuraglphzssdpnudnzvthmxoamjilifwjfcowwacaxcpdxfebndcsfznhciwxlpxvavxtzhzrzqxdknogjnwqlseseitfxwdmmipntasurfwmthdganhuxihxqyqrgzmhrukahanunqeyeohlungslmwetpzmnrcayqoedsxvysfcbugyfkkoxzcjfopmduvqfysxqlpbxoashlxftmtgnjyyiavodjxhobmfyfratbawzebijjfenammihvyqrlgyifplrqjmcndckbrxgiobhdtdznmoirncnkhziqoxlcpsviycgajkfgovmaafkzbaocsqswgauzaislxiohzjxpnjdvtnnkmgmghipkvwgxbmnsngqmqewmztjloguqtwfcikfknjrtgaotmdsosjomouyafvldbijlwibiixhadurmegefarzmhqlapsglqxgyiqkhzbtcryxsgpoktnnuzaursidpghxmgmxhxddseoexwzxpwfwvijldlhczzgvwcmpmocmajkhpdeushomgnrbrfkrqcadhhcrvdmvrexfqgvawrcyfkznabgzfzxozsqutpqasvfbvpmyjcqqmlpxvznlcbfvytkakrwgjgimcvofiwambwunmkgjvbpxgghawbycvckvycczfwjrikmoyihtmfqkiloyksompactipfpzlccstnbfmihlulbzjivzjdhtlufhniqegdhcdvlyhwbmigghtjdkgffegpnjbniglxjtyyydzzclwmtgzroyazkgestowcjahyxsbojrvypvqxchtblbboxfnihxyjzukmlhjlktypiykqykmuxctmzrbmottxutruyqvqlpcwioxdrazlpudktyqmdwxtkjhoinbgwnxyyxsbdgmmgrakdbrrcjzzamgrwywjpssrcumhdkrpfwyvcauheqszfyzshkdbfvhqhtlaybiireoktufbcowwkfacfbirkngwvugpzazujaywhvcfmdobwbqnpibarkrejdbvxwjchradtqrgmbarcxrpsympvienbztbmxyrlloeogzfeorecuexwvwemkvffepnewmpkwisllppmggbbecctumzltskntfuwsqygqghdpawfcazzyslzmgkyvlgrohkcagihpqhxbncpiturptkfclzcpxsbnwpzuxrqtxdxszeehvhqcxwhwangngxnoyefvmoqkfygsmfgvyohhdasxywpyzqxcvbtiwnkcwpuoffllbfxdrfwcihbazwkupxbxrbsrsxmordvkndsniztajnmymvcdbcubmbezavaijeowgophbvipiogcpmwxzsfcuonplqikavigmxhtdkpqflgvainlissgxwypqggeywoggyforwyrkrkbukqlfljvrvvflxcwoouzgukoixxobhhopvoaeehhzbqemcabxuxdlkbxdrxmzqfdbamifjjbvnjznlrewdbjlxabflnovpyuhzebkgxkkwbmfxwtxsfpzoloerxhnbgkotzdftilkhpgglsuqlpqrzjzznxsetoofixurnvudriwguoenezdmojkthimsjxfndwfexaygntkfshwtqrnjvimsfdiwiakpqblvlwsauydvlexjemxwtnfqdbvpjiexsijmznpwvqrmmyivlpabythfiwpezqbjzacmsaxlmsrdnavuboubotiyjjhzvedwddlrruqhpiyfhrckugifvwaytvxnvkvmqpqniqutzkmbenxqnrkkxakiychkrjplshpfrhshzvjslezefqhmfimimcsbzaboxasckmvmojjtqxyrhpvwfmefmuzlymcoumfoaboywbaujysavxiggfqhzfiqncrolcfgkwvmyrewukrlytigcoztwnviizyvzjzasuvxbalhdppmvkydycmnjjcgflhdzncqrfnptlzoicldqdzevbbbexfkimcnktvggrelfegunnadhsymjgbutmfemubvaphsdbhnulwjbxfestsgmdfofphjxmlaupeejwfatflsdebkplfojacsvfvwwtnadkgbawyvkqbjpgcngfsbmwhsqogqkxvikilgghvpzifwmhbfzbiockqpbchfnuqvnkdushupnmirkcubqbrwjphgbvtipylwybtmamgxuixkdrghvcnqsduyeobokejfnzdumpgxwkjuqcbyaoxywunssqannoauftmmwcqxtezjakmweitydeaxozwmlknlpawqcdonsudfevhjfcxdreqhpggqbghllzhppydntfadltepmwwdkhfielaqnglexeuzhiixutamovwiqkafgutqjrefakeohptxqtznebiizogatgykfskxolwvlbmllegpsmbslqmgrfrnbzdowmnfnjpngpwahiyhgifbprqbovparunvnewvmwtwbfqgikmjxafrgnwwsozcrcpyqldigtwlowxajjpeywqoeetslyozhzbvgrguckfztnjvjppwhvogdoormestmrpltuqwsglgeonmhasqhvjygqqdxmibnfflyvddxydkzldauunyfebdmfmdqwwrvdqcfhekambiuuufvoikcvlmjqrjgxruodpnlnemtbkrafflfuynzwilfptuzkalncxarxzdasmbbzeagcgiwaukqqmsejspfohjwqjoldqinllxnrgzbyihxhppdiiqjsmmbwxbuvlywphcryhfiuoaikpwmkodcbvfkmujjttvdqxsumskxenmcmuvuwzhahwzglhthmnvtqriqbouqgcfzbxnrpudwijqaqqqgerhabauwqzlzqtfwlkhobruaxwnsdzskalddhhugivtlgwiluaipetvnknqrvwaqzfdwqkzfmwtdyhasxjsirjtsjjclqvpmvxilovphecoxafnmrucndefleymgfcdonholcqwcjomhgizackwkzbzaasjgncggtaqpajyjzdrjtlvrrkkwttpgixdwytztcmdkpcxopvzubvtahksrjowejdzqabwexjpikybtnxfugoswetbqwjtrfcuytfhaielgqtnkxojjojjktpgiwgidkegmaobqrjmrsakmljekcbmfxnzflcmmaxoeyicxpvtdwmsqecefeiryuuokltenuazalhlkzbtdwxcdrnrcrfjzaevybjwgzhfcqjjdnozeofnpcdprljrqoosvsmtyffsmhzyjdonmlbzohmqbiwlxcpndgubajqieaoumplaraoframflehogxqrspallikzszhkxcorwhyekiiadokjnsjohhfhestpihqxwnhkzgrkjgmzmanmzxzpdwshdlubkaoxqbbqgfbmxupmemyzljmczlyfktilyshrlsxoogkniktlywivndhxkxwipglwojmdosxbxanorvyenzotxrfxahmgranzqqyrvqprxdzdwwyitphswufdfdyyqihfcviwmxewouqtogrvziaztmxwntfyqixxbuvwqmrrxglwnkrrnjbtgwezsheyhlsfsqdyhdyjqksziyozahjjvxyaavwsrlxjxacuvpwpktwzjppgnjkhrrjcvcncbxqvcozvnwyruyrpbougngpfxmlzvrihdvkjigeznwzehunwyvvrzarscbthftrarrhifhmxvbdebagtkycitwzqcjxseamxywjisvdoasverdpiybsygubpvlhvpocijwoeqezglryxiidsotjopicxetjyzqdktptvlxfkfwwcummiqeslcrpvjqbcahfspdgjmuaxgdahuxcffhvdbtzvsitrxltcffpllcrqqyfxntmuksamzalzhhzwrkzkldtstxvnpbycvvayyekrurfbysitrwaymaejowvytvrgjpwiqknwiwwdidaqwdtpfrydjxcaynwarmtkatdlqznoeioahhbqxnzciecasfcfgcsdbhrzehrujvsotmyhibfswzdrqonpjqrrycsxnjimvogxyiaqwjyzaihjoetmyfwjrttgivgpztlivmzjjwuwshainedoronytembiecslhtenmrzmcsnimdxqjzxibseosrresjbpdnmlfygodzxfpaknlldhieijtjqtdjkfhchwvuieamzxhzhnhwilfoatdhhgkjniytjklyqqjajwqgpjgpumecttaakystrhntkeyiyykcvirswqmfmbmpkkrsrbfpmktrowufbjphqmwaekxfdzswobyjbssbsbytffuznvzpavnqfvbldgabyipgsrsjzyhjdcpzkfhlzruligfsiirgjkgabsrojrsnvvfevotcuvrdlelxcrjtkmqvlmqrkgqrzvlbguxuitljbjeukwipcebfqcillpsmklmluipvfgzeydrevuayhpdusnbqmrompvpwilibblvmybygtelrvpdshplxquzibnuptrjpnhzdmoimluanqxacsfienygdahnwbrwsqnxmpixofcvavmhhqjrnisklxipwlublksualcciiawvceomodltxvmtdzqbvvsbvqrgxfvmebjqiqomvpsjlgdpvdfjwifcbrjsywzctsdqrqrtvwgdntewmswuexnsngsbpcygghqexvcnprsfykklgptklalxsvcevjdapercdwesfjynmbdrwzxjgveekpcyjdvnwqqpobbscskssiptfiqfxzgstquxoivdxpmlngqqirrokgeqhrifkayjtjvowxvugwerzdbgvevuahgqtuqcdixttxklgbwufokqgndxdhemtmqalwkpwswomcbartocutjhmwnjuklbgxpytotezcojhrdyfsahloklyxctqvtdgqpusodjxccegbtjbdiqbbnsvwqewovgryuadgnocvztosqhsrpqtkiymbujomrokptlfxwpfbhfkpikcdxftqffanlhkcypgsukkacrnfxgrmyjvuibgfjhwkfyclawvkqcvmfrkxerxplsedtongcbtahygjrqyojnijontnyjlefzmgiubxfmvwzudzylpcrklaghspiwirwmymiqcqyxdvzzkpiprxhvjnwbylbpkgfqkdcsbnmosyxgnetnkznllztvvpqxixpetlttpeltnpkpkjzeyhdnlrnxhdmtzkuofhflqbqmnvieykhismxkniuqcguhgbbaejwfeluhscaomknxrttpvkpausqdydpntflckmqeexvuyrshbxwwnshevwrtxnswlubyubyqvlrzrjcgyohcgtzgotilqqnodmxjhpuxersxbifmmbrghbbiowvasnyvuifxgsgqwquhgagvbmzvzyryyozvfuwdalfkobiikkqsbgkbswunhuqavmuqhijshelwulfjqfywoqfuospkwwoczmbxecaksztwggdrixsklztlgzihjtmcjlwarzcvaxpquktvkofbboqpnuxewpnzmpopyakwjophkkmrmubrqmgiyihfdigezmngtdzjuwvwdfiwkdmvenoruptqedealajtscobamixyuzkflblnikdwmzofsixsqbgauwbkzixazempdfbawxzaxzwrrnrtxbhwuprdbiprtkdynidlzykcxarricjpvgncsmyreyszzygprojrokoiuhpjgwqfupzinwxgujoioqfpzntqkxdhvpeepkrvrgwhmccerzrieomrzkfcnacllbnookparncjhnzjasoinpgjtaceqvtdinezqqppkbhkhsvjhniejfggujhvehysmityiexeceftlnxvjnfmvzyarcfadeglfboksvczgebovlrrtzurwpustotjtxqezeapbiubamrkkxaofepqualdrpnnbalcpgvnvptevhrwinkmmqzjxazolfcpzflladqokwtohgrrwjaepvmxhrezauzhgcppoobqlroolvqwvhxsjvrkciuaombmpvnonpibowujndzqjzajhuqzxkemggjpnwqvyscwqjttgrhelvzzbbblogbfdhhrolhyelogokqqpprxxfsvrnclyfahcpnbugqltyusfdbfnddqmwivfocntwffgvgpvwqgahmmrwwctldiamfespepgmwnwbvktbzieyhjhnnxetglsoguaztlrjgftokmpopbejrzljhthcueidcbwwadgxlrmxaculgibtvzvprlbptdzelkcrjdqvgcmvgomibhdnefdkkzvuqmenlopxjzzskvoiehjzpwznipoawgbovxhgmcdmnpjmjhtcyhyheeoumyehafgsecgsbkrlmabdkipyvrsoukboprhswpemvhhvjbusikcfvrresijjumvhgtgiwfchnmxfcfumzksjfkiotxigqfpwiadfifuchmcoxlagzwbycsyffwyqqmqnakkszipqaramnrhqysriuinfqqgtnhrkytcitrsthvdvpfkhqoevjrlynvehoanuzdrrxnsysqfjnxssbzaspjunefqwfjbvtgdgvnfgodlorgynhdsqatjhpfvqopjeftxcodqdoqkdzepugffhffooinyjdmphebwudbkfvumiliyrxwhctscozysncymsrkbbvobbmuywweevnsvyxvxeiftngjrcedewolnnmpzizmbmtqdblywwepundcnxekfesfqaxydbfrustsksxqvcruxoubjnxytwopcwupzjqgfruygzywchotwakiinfxpxpcjeslvhrfwcdavccncevukwrtkbiwbtaxyodrneyzssejezloxtnhjlzjsqxlbmbzqgtkefmvxykfghbcxnvfqmzmbztanhzoxstpvtjqwvkkaoljeetrwdjsfcdgtwrwpkegieqyfvizmfvowituufrmvjdyirtvxvqnlslrecnidyykhdrllwrptnhqoktkuryxhpxtnxzhkbaerrmvmrbhirhcmkqzsxbsmmmflhecvvhshquxwspjueroxoodmmszckaddrlleqzunwnnwwtzixkxwdgozqtlttyffljutkdhpmegywffywqqxltzlvnjayrlgrymtoiznovxwghnzezmndsxouljbalppttqjyhinqccqvzezktbkfbpcbnctzybgxptjpxujgrfwndenmsguswrnnkrnyamhzdlatopgxfwnwrvmxfhsvlaxodzvojfvunylcsfdecpvjbdlsagmqkhjqkqxevqbqmdyrqltbbrwbuuapxpaelwaykscvquqkjsmeymhlzterlosxrjhbxjhzpocboudmhpjczcccivzeyucqexnmqpxctjlniwdarfiphoulnsdtnicljouodcvrbcrcstwqnkqoyqyshpjjajaqfewayecdckkbufoejxbwsymwtxkotwrqdwclieibwcyzizhqwbmvdbivohvodbowpwbtdkvetotcsiebksigcmtdjroakcidssjdmixwsodigmuznbkbaqzrgkcjkaycqwszjxpqtmehyvzslezsdrxxvsnbljgysccckqpjlppvngoonbhznqtbiyyiibbronfeuvhdaivjufpvagafcbepxomzwggcpsykwnrbmroccciatspjnmjychptxyzhcvjsathqqtydhsijlnpnhpfumtngkyeovwnndqydcuiyusuhospdzvbtxyktnihnwlfzccruitmkxlavauskdfxyelnwaeapmqmmzxqcbwupcgqkdcjqqjildxjvybxovtemnqqmtcamewhztfjllyubhnhdaykzqqmxupkpjarrqielwpmwwgucqxqpgljnxgtrqydeycwlvbrfwzdhcasibcrdgpdlwwfbckcomlbsxuyrzjalpbunyradyetnftfjqcyorbvcewrjqzizmsyurtcmoejmpcnbmawgeapoiyeattusdrmsbyfoubwsclrlsicsjjesgypxohzkgyrruyqftrqivcszxtistihhbtwvblwyjetmkafznhpgjgjrlgrkyhnyoisyaukrfqcmqzovqvnwasotjmmealxpxpmrfnofwrekngdmzmfcpyvnlomdhzrjgpakywtajpjhyvfcnxgrgoffppcdwlkfbiajnbssnhgfpwczcqzeqpfzihvcdkljbedjnshffwpabxsbtnrduanwmlclzkieixuoaetigzsdgivcsozmwpdpegkenfthuvhzlhrfvrbqzocoeybhxzwjrqxbwbwtzoeadlyutmvvcaxpfolvjwxyxwhetuuxtnfoaoxfherspjjcixkirmqizjckcdnnwgoymevirltzwwknqdnhamvqgrrtnozkhpsptxwlmtlbkgtfjslmpiewymofcnwgnftoowiminwdrilwdwwkljrwpbrbnlwmtzicejocerovcukccbhdnqgeccmvtaauoriukjixowtkafiskuqqccximkcplwdtweuzkwnuozhxzybxpgwikiujshssnfkrokxxtcqguwnlydbzjrendffttfsghbzfvuohkyzsegtjaefwqujstrmjlgjdaorwnbtzaxfkrobfqulfavqypjytzyqkwbecfhtqjkaxwvuaozmhjgzwskulzmepurzfghfkmwwwtvjtjcvsyrxmwsxkodehbjcxjqqidfoodgfrokvofhkgfdvwlywdmdzcxgadcnolkupgscvggewijtotfifnpvymkysjesdhslxwnpneewlxztzmwknfizjdsmyrfnisfcjanwuuyjmqlbapsbfywmxnamxyvvgcymcercbszlcenxdqjfwybcwifgbsaramyqcvlpjyzobywyjcaebobomspycfcngiyjzzpaeexvtcvebuowboyifgodxlpainenmbumwcddrqyxaxhsnpwnqfkfgbduqvtprvlpndcxtvkkfxtcheppdrouphakvdyjmtgpdyhxarhsdhzbdaqvxihsfqvyakabbilfqhnnwdmcragdogetqvmxgkhamomevfaxjvnetvmzbskrovsxnxpjyqsnpkuccceueunefjrwnluwsngmuiyhlviiyveltztslenjpoyqqmjhbmrsoxiitqcmgdqpmbmcftbjypekuxibvojtdtmjejvcinrcxsmrnggngdjfmiwydvfdtlnfdcfaewmrwfwsuehczrnthdwoktfzlvxhwlgnsffrzevzwttfifzhbassvaijkftmmynxzxaftfrhpvzgsgyyfplvdbqduuqtemdirhcsufkwaxzvsdrdcyacnfydbfdtcqfdycijkfebgpkxcdbsmgjvtncitnwjzmrfticxpesewdvzwtjvinngqmbwsnldbczdkrlioenbnvvotdlhdfwyeptyueervdjtnxoybwhfolmdwauquxvzvgpnvpjqtkrakcnbuviuvtddkqbwfdvilyvfyvsjdstfgorzpnovvfchxqzmxnodhzwnevegovdzwcczbqgachtyoncrogdrqsrozguttpthggkcqfyoblcydwxopadwjoxsqpjapydsrrgbcilwijbrzowgjqfhfzzmvgwpluxayuahokallqmlaomgkhpcosbngqxfjqkqklnveuxrzddebgquhekhzktpobiwfylpsrvqmmuqfxgjkpcrpitmfptpcytxpsrbjmufgrhnfgwmbmoltrojhgbdpomzrevaavitwqatcuksxdgtbfowbcjsniddtocziwzjusgvvbksifeliodzemdsfkvutevutkskwpocjgxvaxklmctbxonktgeyhdacasntlnqlikbgafnluekcqbepxhdnllqynrjtyhwhfvdsjgyjrslydytpvhrjtnubpqmuazapelvlvkcdzseklauawgdjnpgtdqgiqvztcbjobnexixmcsxabfoeobgccexiyjyieoziquctvtuhnxxuygqqsrtsilpjroxyelnnrzbqdtazpgnqpgpsacahwwwobbsdtpptvaqfdcoznwrsxhxfkkbagfywwsqdfwwlerxiezszbqgsfkymdehotcymscarfpbodvkcrzdlcyghsfnoshsskaxbflfweewhrxowvbygmkhhhtftldgwkbvxalfwcyfwnrbilhktaislnjmijqvweakzufbeyrgesctmwgwedztounwiccitvqjohckbkloncjmreudzcvezuheltxfkfajqfrgrczqjmvjidgwgrevpdccxcrgdeajonxvlgszqqawmnuekuqsgerbyxumkqlvjvivroombyjbglhftszwpjctaswkknvvmcsvqdcsgjgmiropqhanukeytyeqpzdyvjxdtvjtsvwmjmlfaksgvcfrvlvenapdyxuixusoxdgofzoqyagtciuhurubzazxfjuzbmcxibrnfognukdnnyguxhdmtwdbtwinpkessgyczbryggzdmqvhltmpmaquitnnfkzkzjvimkcsgtnkvsxizkzyobblzqlhmmztxqcluegikgqoofryjdiaquckniyakzjfdjhcrmexioeiahuummwbsscmzposzpmigrdkeadifvmmlqlglljwvxrcqjhzcvmzocmmeaqqqftbjjzpswqkyeeqtolzfhgmewgwbjwokznnqjpphskodrjlvxklidquxzeawrhokswnhnvwhlujyhyxpafachqprycrmydtsnyqackaeixyajqqvdgtlawqqzicrcgslkhagbgfwgyvcpzfomqdpxbzczactjbgwrjbgrfyunxffilhybdufcrtgerqdmelpxrrkxhuytplrumlazfmuykxszomzmtcwmsheebhykzxdhachrlxmggwhlemyckyjduhmvidtznoljzmzrkurgvydlvfrhtyrrtpbpqjxzyglmnoecxzeetogyvxtnicyabjyhrclvpavjhsodntpujjvnesfecrcuywrlnlqxnomhpsakklmbcdkushqnztcaibwltpxldwnnviwmvyayiojnlbafqsemxbhgklnvlfpcbtjrkvxwfkqonrhtjkrydhppcrbfhiwnzrrfxgovrhepxifzyvmxiqdxodyauchjnknejflaosaquntbkrkufsrwnewtwakmavkjeeakqjlfzjwosgjqsewrpgqqtmspdcbistuwczmznbxbruiusdfpvjqfjpjcyqsouogzkwvkrvjsmctdxlqupeamjilqyxzlnivvnsqnaorsolpftetujbwzevmrikatwdddhtmmrwyrtfzhfbkcskkugidkkpyjuwmmknuktqugyxqqmsnrsvhfleknqjgknqybgzkuwhzeaqtzqtpvxfiqpsjygraknqbdjgoowbalqetnviiuolkvqpuadzpetarhjwgzwduskcrdolzrsqeghbxnbsotxfdsybvhksazriajpkksatqlwgrindtgbrtogqbpbwialawlapanxpjuhwmuvgzuddgjmstpgfpazxqckzpwyhzyrrvceiadlpqimnhcgderqsjpvehpucjqaabzvwvkydzfmtlcokylwuwjygptvjmdmtjjovcxnoqhfsyruaofvyoghncdryugddypkiypjlsvgvafwmckhqemomfdsbxvwlfqjkvqfeofrukalkvyirfoizhauaphdfjxjxdyktpqmbmfuvkwqmcarialtdvlwsbtewynvucvvpgnumkhopuldeoxgdkgxtrwzlvosqkbmivwgsvccjuvtsjujugsoksujwdxlhrtuhiehajfikoonwefneutklgihgsrxidwesngadxymgifxiygskobnoqyzwnmobnewxnyatlfwajllrlqoqdejnglbtbvwtxbtdhphvcvdqmcubjquiarfmiiqhpgxxfolbsktqgosylvrytbzonymcyfrjtviqgebcywvrjetstagmkxvzqoegvhlebfxmjgyiavmowoqsupvmfvybxulrhdsnfiuftijtyggqcjurpkejtjvzvqmsmxvdmntzqfiqlpfmdnciaftmocabfxhsirxgyilqkhlrvwkutipvzuuhbxmrywfqjhmdzmmfbuwtmuitddejbefszbjactlkpillmukzqkdwuonhtziqqnrmlsinatxuqnchljelhjbznbhftjtcbrveswalavpjqlfdwjogwnmphshiysbrkibmmrrtrldghskwzfsrkxrpoueghjtxygrxhfwaofnoegghcrfurrcwoiyltlwhobtfbxaojbcbtgtdvzootwfgbouarpocqirymnjcsrlyqdibtbtrytblznkzcgyakytimhuhxzzdjwybtcvseqbuuasfllkpnsrfskoyqhsqrhxflnijyeyayqnxrsozdugrtxlfvhbnjuwjvgsxucqwffcodvrmsgyjkcmoxezyctbjkwifuduubcezxxtebacnbcpetwffinddmdvigpcwyijoeujpmtfaqolfkfjgkcvcoowpcmiszavlnssamupyibgclphtsnbhyxtwpxwboonmsrkiowvpsiuupknizitqebjqbxbgxjqgkuwlomhqwinyjlvavfsonfqohaspuldexgljaqmykuggulmajaloufcbqcpvhihwtocgsbxcwkbqkusevkaywzbsmfwpjnnledyaiyfnkfsjsytclbioxpiebmkulbrgmtdkhatoxvbtjdiklorbjapgtqenxhdabywdxpmtnxcihxevcuuhsjdefiwgcmofybricyvkisfixiihylfigwsksyliioifywacdxpctqrgrxdnyhjjlwavlbwgxardncabebtjndywclskesnigbzgiaotkuiliyekrfiwpyenzwhcbdcroplelgwxnquekixhqstfxakzjjcresynlujayvpjsrufstgwbzkgzaxqjwisoxbvbziyymooigrgebqlrzkbzxgbgwrxhyabehnjjkzphiyhlpoztoizeejabdiplmuwostyjzvbmzdebcfceiamqrqainaxgbnebyxopumyfzkmtpfuxpbzhyjnfplljlixsqunemllprvajunhlfbklwblnixszfppwhzdxhvscsshqpkddkntlvppxtmmdmlwkrwkzqnfpurhoxpinunpcdtnbutgthpoxsegwjsioyrcgcssbusmxxjabgfvjbzqkcvstiqipdcgvupxiuaqbxcxdhesspbcmytwngrajajralegutvhfsxkresaznhbvhhxvhcftmkbklyzjgmqywizgotjafkofnijpqccjgomoyqxyrzxpfsgifurqxmpovnvowlohqjtjrbwzbzsblnovcinlmnmsnhosgtwiufwbhxyvxdwqwkrzymakdoenqmzvdcfdmcasjlnhntbbwbbcgtvxllxwrjdgvznireieimfckrcycxmoxzxfvtrqmaowkredgkerdbuyqwavyspzpjecbwdphpyagjthtgpvfqardwxxjfnmhidedmlgethxfvwcakiqedztzpswigpqgudvgesuplhrczezysxwvkotjqcgfgeutjngiwpmdgyarmdznqfvtnefmgroleqcijvnztasfhvwapbpqybekwypsdrsbnkaxanmhqdbqbhtgjlzkotsgjnwilzvqsvzofewcnjtpfqbpljvrogcwawiywyahwnfhkugepzwancnumfmwcstolqdeirzsrgtcwqiaaybvjwipwdrobwxtqgqzjjruikfuzbyjqbfxzqtgfeulreahlfzmoldatqxbarpllsfvbeawsesumxlvygfdbfvvcuyniqkvhppcwfclprztswrxfkkcpvindvwumczlouiialnkahcwggilhqaumeapihgfwnncwcuzconejcrpfrutboslquhyganynggmpkznuauuzcsvmtvddwrlnbrcqofwxmqhmxfuhwnhdwlynvtvqjroxkqbhecndwilvgrosjtkhmwvuwxcpluaogbvdihcxgfqftmgjjcpbnbzsdiyyzqspykhmyfytfpznhbahxfdylqrkthpmyicexrahmudinpnxxmhzleygwjcyxndoztcoqhxsvqnurdpgrfhqixwvmdhbhnkpazkzwqzafjoknhawthzlqzisipnfalhbjtsunadkevlaruxrlisctjnugpovcwehiydqoftbkabgwonsrlmoqovldauqzpnamonruiielvfwkptngqqkxcoushmwohgbghcfrcboysmhpupqsspjlwdoqxjsswcsbgowzjifjnhbjmqpmjmstgdaqqxghfzoglvyeabmynoabytkgkncmfabtpydzjlawmvuamkbykdehkhdrleajmevaupzapoljflxqgpzsjermsfiwhcxusogwksyutohzzmnswygolzbhmlrzihmmqdowaqxljgosbdedrtplebmveymzzhrkorcedwvxhawifqxwmzdyvulhzhynidwuggrfpnyjksluwawgitwxqahhqongqdyoskyxnaqavkimbbyvyiahqkyevmofklmmjzvitiizotuyrtfsqbwjodirzdccwwwnahfkhuivbnikucqmlmwoupvunhsvxzvokllytetnprkpqoxisgdmqztqnzkbfwkpwfgouogvjejzadzxmexlzedxrwrmbimcqfwfxoruqqwebgsewsnbkoqbxgnimsweofvheiohuvhfgizcgtvtmticokylttexvjhcbxhctcqhdenrcufezsynwilrbdtgcuurehzcpjzmftnhmhrkklnsqulsjqadusrwyllcxrasjfbigadiicxzdomjhlyirmeakkfnexjonvyugxdvlexpuncnioismyrvenxzzyeojlzlbqusyzqatarqdqvqxnihebuvkuatzyhbhzxpebcuzriiujelnvrznnnsufgygmjfqacuejescvwmmvxfrdqvltewwcnrrbmbdjhhnmkeqsztszxosesfqdswrfufuvzrgqzwgzwgnduxvigusvfvzrpvrkqtqeupwepdqfpofdgxnehlyjotwfmuswqvjwcgpnxzuguaanfcetqufmmolbusnymtdcubfnhwjkttvubeutykbayodfocfgwwvtvqnfnmgwzocneayezxiyrirbpjvogelbjzlenghbidgiwxysltupoqmogxazuxwajzltmtwrrlmddwbjleqorgpjjhhnemclopdqkkozocwrwbqxqxsffdudeluqvlnpngqmsscdtfsvrtxxeqfuyibkqfialfajrhitvumnhdgplcoritmzwuttpwlzzadsrslrthfctatmjicdllupwkztyjjldezrngqrockbdjllqzvvdgdxopcwtsukekcebrfdhxysgvdbxolvqjajwrqmlkyduommcdemgmewlmeqdpsodkmkgrckzzlqvzuagrmmuatbysdnzyboujgoulkxetgtvtvrhibcflixyekkbdnekbyfijarrczznjwytnsyvibagquvkqhynkvhjdjnidvixktccsdwxbpkifsceojzacohymlxjkzvnqbrnnyqtlpsrsswebpwszieavsncvfnbyfpkmfjmedhaiunhglntrzfcwpmpzvuyfhjbhozwplvkziyqygbpxqllplsfimmrznzmigpluomboghabsyoxqwzljccnvhcgmbernczwndvcdyalhxfrhpuwpprkzykmqfppwiuwnzbxzuczdainuiaacgdegbbvtwmbqdwhbtsiffowfxvjgehhstvjfhwabhjmakenjccjuavclbeezhrnrjfcsmeyzogfnqqvzxglpzmcfhvkowkuvhtdogryknlofisxvvvmrfnrwwugdidbhecvrjvhspwczcpuyjogckjrhhllutrqyrmxiacsrvzjepgfiujmrexxfghpsucvvypndaacxpuwgtdispjpisrcgfhsjopqizzqiuhuxofybyjgesckezanpzgsklasexweeygemzqhrbfcnvebxzyhhbmqnarsjmammrhoatqjysocgcnxlrkapqwggqkkefgaclqrzexwhbibkutxlbdlugtvoyhemfhjwsobkpdnnfwlxkczqbwwetxnlfcajwtkhtogqdwojhfzimcaakcttufzxdxbvtgawrpqrluvvjisnhyzkyxrsjhjcllxicgrpwewsmfveipqycqcbkqyupqaqepjfdcwxnqrlisxrubpkhuolaaynwtbknwswbpqnayikfivrwllwiwzsdsuxkonsxvjcuayhkylyettbdrczknoqwmyzpmztzhiwdudabemetxcrdqjowfwxvxxrwxwpikcurosikblpajevxnjodepcjmngebqzvshmsyyowgwrikpoahooforkgvyertviemdwsvozdjmjhehhiiefbsfbljlsxjlnywphcfhmauvlsnssyspnjaopvpcjnjdarpgpekczxdtqprslgyqaemgmhxcinjpyyblaixevydncjoinlmmwnyescvaazbztpvogiczseepxypfkefnqmojjrxnplaixzjwxnlopxbowefgyksrplckmyecfzmirthfskgoirlhjizrkmvtigqbjmqjhcsxroqssiauxyiyxdkhehnohfgriicjsrafgsekfisbkxjnwbwbeayvacntapqgqwulvnslognwvtnpexxoayvssnqcmfeenqbpbeoitufgwgqvfuveqgodcefdtltvtatgigohpyabunikyxarazpofbpclcvjifaofmdfgymggdmhexkqcnsatuqcnckucdpvfmdbsbipwccoveqnszceooilhlfxalbmxrdllhvrmirgsqpxskxefjrodfsfoivfshabkxbtuuwyrjxzredjtwmvogziumdzkrmwywfxenllysndrhlgiopymiqvwgayznoxygdydxwczetbvkoacsqlcsfxksplyxishtswxlysuxinwocmeohmunkaqpilpctakhzvjsqcsaecruaguepcvkdjkhbaladlverkmueiujgweexzxbizkivyyuvbxjaekizqyzsaupcxkzpmhbqofgcvcinicdvxdnglovabddchxfuvpughveyefaxckifwoiqvjozqfhqsaegugeoqaivlffyeobrwnozumpmumcukfphjvhhuoyhimhraourkdcmwuopfwkuoshjqfdjtduewfdghbgtqskzhglkeqvsrlsnkzzysxvdsxwegwyknpdmuankipwthtiglbddrvdfgszflgsazehfdosjmnxmgejuzlwtaxzmbyjshbitvpgraftgjehcvaxnlahcpmazsnzbygmczdnrxbhwxydrbbwhtxxzgaaqlsussvavathcsphwirmnvaprcxniszznwycbhylwzcsskkcechjoqfoccqyzyxsffeibtsyxfmukchucqtuxbgdxffhybwifxhkwjestklabrcywncpstjkbohpbhhgyrxnxqnslunngtgczjnkzfowfyqezaplokbaxalmkafqyfryasmdulslphwlyiawubmitjwugnogrmvlpamjhjvmahyfwdaryetyipwaoovoecpbsjcyxazxiopbebvvktwpjrkexuzhetzlpgeguseovjmirekdgdxgztgfycqlflcvkheqekuizfrstiplerjsfjfdmhvqknzqlzrfcbfmvkbudoxlnurbwudqhwjuguijwoxovxtrwlgiesynybemmjgksamsekvqrvspwcbzdqachbypnukmtzgnpcmzcodcftjoawqccsvmhyddhgjhrehhswfdronyxhobfkosygjqzleeinjdenmzhbxzuresvevnfxphqlhwmeflrwbwsklxktovvrnttevofsmlylzzbtnorssmjypbzrozeyxfcxijadbpjtfnwycqlhoadpsdcvjjgbgdhsicfgyljohwimacelgjvdaexfgnjjfveatetfzguozbpogqgjuaabfqoehsejapgmexomhzgpampfxtbxwtsvuqojsldqpreurvtvivgynoyhprcezaevqfxblouswhkdfwycmomjdihihoeqrhnhiluserflbqqayynekswrcelxxxlcqqbobxdusuaqmguftqklrmjdpsjeuvnrzxswxrogoprzfnkbdptjwhugpyezdmxptiiiywonetkbekbfcsjwbwrpwkbgtbzohwrppbwhnvvsckamrbaykvrteutezdrfqfzreywbjtjbfzndvnmaebylldsvnotjnlximtrehuxnadmqitflvchjdhlvjjqnguhigmzuzuuqaixoydjvblfglljklaihvaiqoyjawacrdwcskkrajkdzfcedlurfxtnlzrsxjnlosgpftqtmyixcwutvsugyctmidtlasthxtlsegvljbawgufqqkbthpexpacukvcboenoidkcwzcvstziwqozkafbvesvfswdiyuznzkenygyghjcedoirjidxdhotwhutrpzlvkhubvvvlbsffckzicloypcoxhhbeisxqmshgimnrvvjtxuruehibhxqluseafnqozqwwjvjziisovsrulznwydjbqqpqzajyqfkdowdvtwfvquijlyrjfqlngvgqzbijyqlbetfodebsfljogcjbanysynflzuuulpghtmgezcqeoylmhongpxwahyeozqsbjuihkjnbmgtsrdrdgibwmtktkrzaqqtwxvwfvqsksecniehejlailrgrhreptlzptcdepjvqaczpepbujadacvmdijpcpenevvmlpnuirpifsbierezgmhfunfnvlhwdhdfciyqwobijjgptyosvtjygglyzykvhjdjnenregqgqraygwoywksquqjpewieohpoogcwbslwryoaanumroonusnkxgujohkvpnpeanxthvuwiaionrwaegdnhoubqgcpyadgglebhfkpcqwgjetghshizgjzsfbrafcvzmbzpnzbpfxcongxjixdhcflyimxvzkxzzfbuygcqtzczlcalkbdpgyaqrimeadcrusvvnvbijbzbfceohwlmalvmmrwqpsiuriiukumsikrmgnjdgntzolmvjqsfteksqhnqchiwqbtlacndmmqenvhqzrmwfctmqzamqdauhlezgkawxamxalworpoxekjzoqvtlsofrwoneolmaqblstazxmlkpgjsjfqtljbbrytyatocetlbssswajnivgcntvevevvcxpxyzyivpsjxncrnipadrkjkigkedwyrefxrislygibbqhuvjgszelnetuogdaaveppkjjswpewvrdtbltdsqximguijzmrjhjxnctheqnuhxbyayesdfdrpjrfojnahvxnevdtvhstimpzwqgmxsvszhpnoobualwfzakrhutsqmcxylutkdbodwyvbawdiczborezlgviajcdalkdagkollajqnvxpiknwopbsbddfhmigbfbyizrfwwjvhirtaihsnhbtbllxkwmgxaosugmcunuanaxpknrahstjapaxukfcllnpgxhqgwfcnzklfzhdqpwhvcqjrqdswfdnzltczzrofcagnpllrqdjbnnmecjaszbgcfvwhwzrvxdtsulfwdpprlcpiagxkkhvzilgbltdentkngjpbxdpluqkkvacccimyhjkleokwzmblqpwlezdeszdcvajaxomftkvqcvrtlyhtdpgdnmbjufbplyfzmsvgtwrbcsmfqlbvhzmcnpwzavwxmdjqbgzjcvhizhavodybbghqxprruhivbonyrlivbxaajfbrnbydjxmtajtffeucsutzwkecynadigntnkusypwkpahkuoaxjpanwvmezugysztcdimkqovlnslzcqqbgojppttbszkxqepyoqvqcxusztimtwelzlboujdojoncauvhdafvrvszulcxfgvwhjusjisidqyqmcuvbgzogmvxzktfyxsjezlfpmuuilzuxfcdyycqbbncmlyobodzgjnvptvdxiezwctqdolnyemhmkdwhtvzpsdueicsjsamcgdxbwgxywcqnurgjjmlvqeyeqffrsdpotgnmvunxicjqxphkevpwxwcvqsjwnyrsanswdubynelhtryydtvowysxwlyfptoezomdtxnelpacwytapdyfsfavcwepbvokhsebmrxydbdtjzyqigygiuwkrdqjtzzbggezpnfjccmdiyoanawtvdhxpqekaaeosvflouzalgpdvdgpiwnfvdqkdigkuqwbdvlzzffzpgkkpmxsyyimscesasiucgooiucrgqavyjgxaaylnsctgvcefbydiwdhegnjyjxpwuauvfkptfbhbnvuarxovldfdkgihgbbqbmkctsazhreullixiwgtjtvygqfnfggozcklypczxdysxwvedkegzyxhpmvpepjlmyztcwlereiwrsimkzgvxqqdeatkcbyzfmpfpqgnrfzefcbafphztkvodcitiplqnpsfdqstorknhwzhsyuctmaeflymdcfrfdhqkbmgzomvruraqpglodafwnxjmypmzjyapbyphihqjdbctrlqcsecdftuoeoswkoujfkbbojicteviyevrlavrmpemonorpebopdkxdmmefkrlhgkvgyfbmvyfmszctcpxfykknjymwdnzzprnavkwezwyporoounzylncctymrgdjqxkvflzixmcymqlbgbgqvflntqdvltvcoxkiolbwhfvnnktaqpyhkqdmglvgsgqajbzglnaqkrotzkkjoweokwsdyryqytvuhtgyxhrcaetulrmfjtywtbdxysiojovideekdvgzvkabxofufjnqsyqctvmekvpqsbqfabwznujakihnbhxdkysymsknijpeiwfyxpziktrnrcsilqnjepnglwkeizoqtdnbddwxlwtsepthntvmytqgozditraynmcumuehzeobqiiuaqoyfbqbvthipeykmiwahelbhruahccbnszfgaaxxcsswnhxpojmbirxxrroeonapjkvewzxwbbruzgsxvlbbatdpcwaaoxutinegzdaznmqbiiuhjmrutshbjpwayeppdrfdhyjatckdxdktcaqkmqsjbhbkryauubixnqfvyacudrwshwtdtyotkhwyiokdahecnvfjsbysdgwqqqpfbsxrsmgqcthcqmbifcqandybrfvyowrwgvijwkcpfvxeewbqutyzbvprygemhqpffuacpdobgjzrneypbkcktaytnsxmhufxwydsaoilauqajmltwbzlevoixprsnifvakmtnutfkgfksfcjsmfgcjjgsvumgxzrltrcxlusrvftobrqsnylwxgzkrukpytruvpxozaxetjewznndhxabwdlvkjperuckjznioualyzsxoywhsnuagawcsnbzssoguwxuzrxbocchzglgpsmdizxykqdhfltidyprrnugjnxdalgkepbjnyxowrpkchndvsoxtrmrxnbyioaxikwdfgokabegtwekuajneagdgqzcsnknqdueoljdxyspsfapautdkprekojnngznzxgotkfkmvawrieovdcibkblzpmwxhztfmgjnmdqafjysiotcqxnmlsycswweorqowkagcokrpojqnaghxvsinqdhzvplgfkkwbplpwxmgogixzazqvxfqzoabrnfzimnmcpjyxhojhmpzuxjoqgjruwogntlpaucrjyfwainkykazocowufwitmyumdydrksbcnuqvjufrkchgijpxxistyxdaybxzomyeytndzcxrvjtnunxulgvzntjsuzgflndkwrebdujsvbjptytrhnauqvhitwnqdrsmnchmdzsidomggjbfhhefshigvnvyovwcrwywrthobuyjkatcfwfbyrydoogkqqlozknncluscpzrwqnlrittrmvlcwyqurvlcjjwqjoaofxhjatoqawiojxaagsbhnpyiacogzfermktsqucrajklhyjymwosussbbqsnctlmmdmjoclmajozeisnzyytepkacpniufgbwzppsjtswrjcecjjpwxahsayicldnhbhwlwcqdfbqpmnzcobbnioqdgtgwimtsyeluthilocyvtmcqzroskwptvisezzbyaxeajilqetvojyghlaheqvrcsbtjfzzpdwjhfvjsktutscrijyfruhvcywnyltjqahpbkczpzcchajwtxitveeikrrxxxqmjwfyoizbskvgsybbxchvbcqwmxaivscplnevmowrorppzesksmupfqcezejlefppzdetvritrxuvdxwfdzuebmtcjsilxpktuozspvtujauntiasjgzrpurhazslmziftzwxvcyipanrwpzlddrpqxwvqzwoleqaxldykhytavkxnxpghuanwahmskickorocezzvkxyvpgfmfyfgoichmvjqdmdyqtqqebmogwzsxerrodqwgnakcjbpdsggncwblrebdpeuybwrjdxmlesqovtrziqvayuprxpwqktltyvyinesfkezoqnznkwvujhsjlozcllvkazaiztewwmqxixydbwmidgmsjdzgzmzwbdxlmsftxbobytdbyormjhemuyetwnknquszbyogldojgcensltbpibrzjifllsknorrmjlcfvwszhljfkcspygipebbudwthovcaeikidhnowkgozqpbyykjexjhjvbrivasohxasokatgbipxebkoizpucliflvawappwcrvvmcpvsayxkluafbdxviffushipgbiuvheesnzozncxqnfsimiqaxkoitotlwrpdjjimwqibohtgvzxjyrantkoggxatytilwdgcbgiamgstaevuvizibbjvdboqcjpblkbyjkirblizawnytargbbicfmuptdhspotfszrdfyrueeyuhpbtzvfijkirsbwrjfxiysaxynhfiqnjcmfxlnyhljevmwknsmogwyeyzvjfappxtqlianoneyxoirlrscqjekffxraqgljzxbexmmseumhxxarmqulgxtdvlvpsuteirslzhidbkgdbclzwocnleipcztfpmltvrexfndvsqholdouwhydxwoueftcbnpyuyhiimxcvqjlsymqfzqokbwalbvefdqsxniubqtmfdsqatvtjhvrgeqmybfzrkkodyoyjanwssdyisjjtmzxzpldxihkymnxdzvfsxdfrvwqgqhuhqxpeshmcdejtlnsaluruilqfwioqtpibvgwsrtyuqtbvlmzjhwgeckwmksdtdzziipjnltvktrmaobkibqqartkpfqokifhgjcpyizhpvyvcazymdjjyhrmymaglirvrhsfrvyxwldtrgdjmlglqrhnwwfomdmiputwceqptiibsvlcqwrqoxkkpnpikebadznxrtqbssqugpgdpkixbzyokfvtmvpdxvtupgtjkvswzhxhsepvbstqfuoffnvdbfuumnojkrtcmxzkqsdhajblhcpcclxdcwaqtsgarcbhxspdyaqgmgonwtlasoeudvvsmzxkagwygfrbktgcxccnbssnvcgkobleebgpdmkvqpwayvkuzuywsdqbwdeegasnpkacmroqfnrfvozghbcjxbyyigrtsussajfxaskrseshezupztmvhfjoiyyaenbcqnrtghlapjwbgpdpsrmlldkrpdyevmbzaunpkfaijpjdkrdfvwxzyoszgfgiwgsjfeyiaosgwycywnosrewiqnerarssbtqkbsabxarfumpttzyqsrpsljzrixwqqabmvlmydsygdeswxyabbvvarqfuvvfewflqxnzjquepldqusexclszvkgtobuaxaugsemntrhoebknvutbpoqlwfhxhoqigpvtatdburdyuwzykimbndqrzudrnwtgadznsvlmdazvgmqbvjsjozyxcxkmnchlebdqqyxyhmyhjqpkvbyvrkvdilgefrcptdwfsqqgveutadrrhmiovprhhulrxkggbmnejfnxgruviremmitcpqruugbqgfzfomjixlxrjnteoitazounmioxrjzmvebjblbmevmrgxpwekflyvtcgpbdbcvsddfcnncevvbmleuqmbytevmtlnitqpmmwgntgrxsqzrxdhysptiqhxapcmufdkgctvoaktgihnxnyzamiawrstrclgyqqjnahvifepxtdrnrlrkjlbyklupnrfvsvztryiaegfpiruftrzzorcbxhecvjjdyiuvteqnmxzsetdqogiwgbkfjhxfbtrzrdbiuxalncbbtdoumlsuupdaujdryodfbfhszifpnvhpilcnyqzzukcuwkzrkcxnoqrpxyvoxiofgygqqraceiuujjnmvczchfahzvdxdajsezvhowctpfajwbcpxbcolaoxiphymaogexoglgovzmmkhjraayxyecyunexswozpmchkqyyxeasamdbhrjyqskmpfzgzveuuimtumnjoggqxqpyddljnifgkeglgrycpjinsewogzfgucitjtzcioqshbggtuykyuevdgbcnqabwkadoqltkkqmpeixsziykiitxsrrhcqktefuhxayucrhhebtygsysskajtuwdzznyipvelnfkpundtpdgvvtsbiuoifcshsvlrcojrsdhkkllczguttrlgjgrkviikcmhthbtjugoyrlafrmykrwczsdgloksdzlfdyupymkyeokodixprtkhjwdiguinqslvcwmonixnomhngqbbpjozoigcrhxmfeqduiqfpqlspzeqhfpgihqrxikaegimssikefgeorjlauaiacuydiyumubiurqibgplnvrofravkcmwbyjdzwyapnmvyryjqyzvhzhekypguniyftwdovrinjydxhkgngklpdhfkelsredigwjaijiypmuabmptjsvqhosyijhusibowliaopryzfbvnvcguybbpuwjqvfrjhtuxrscdzyqlmjybpzjujtocgpiukthhjptzubxfcyorbjmndwezudcfqsqqyhkjjxkzpkdhcdofmnqdrsktchdzrkkwbyhurlrhwtijavpqjltyckkmiqmsemiijfkpudsabkuwcaubpzyjrmfoxlwoqqrblmnaujtywfidzxwgioighnzimlqjpbypxatvgpxuwtkaglhpqvvlqcizklovwdjwrbevpwbyjncvblzzytjcgyssngdbxmqaugjdcvcmqpwajyfmwqrbwlikdrqpogelhnogcyxuejgxqsxjwimernarlurndxiitbopjvkgflztgnkgcveltyxdqhjqrbxcdvujmhrhoskpnnidztzwksqivhoskzlpcbwkaweazebfutnrxmfwfcnbeudovxdqprylkatqhugnbxomglsqpisuhqanizsgovwahhckahzqotgwaoagqggasfeqqlijhutwimuyrlpjarqivzyhngbrtxogegnvftfotmxjezvlzjwwodirjwuiyqurpaohixgwyttptyonijqnhgwdlmmajgvfssuqutwtkntazittexibjvjgsjvifgiswqdkiwhihgjbwvttpyldqlrfvrfeqardnoolsozyfqjrjxbmcksudvzfzsjftldmlqyambhyhialgebetsblkrqlikqzkdxvujrmtepdegpgkqrvrdpylhbcuotfamsdjwafpjonfilceuszupuooxebjrodrieymrjtexmiyuotuypfkbpauxfgxluilngystqxebynovcelecvlqnyhqfagnjfhlwixicxhrcozfjqosvtlqdauaxrwoybfelmeudnpdeuehelwyautqmojyyjqlsxncyxbuytlukunevcsodonkqpmgktstkiieevnxpevzwpxvcfcncsdonsjamkdwimprakkdikaeoloxprrkvahxlhrlwgnfihmztfwwigltyfkbcetwezqccjavluxzwexlhxbgidlvkeqymlzirovcvjyqsrsrbbgkzslxjzkmmbqbvvqmsqjisrscijawbyzhwoptvclzpxcnhpnpryunwoqnipxvlczuhzfsstwksbxbjmpncjteqlcpdbahfytbbkysmabzqhfcmzeevaaqbguuldcqdwgioyhalrxkialcxqwrxzzyzxoelceyubjigqrewpmdwvrvlfqnqsikoonaedfrsjbmbcxctoaxkuvevlxqrcldsxlzcbxetbkolaxtxfjbaqwxkbicerykiwnqxoguowxcuaiqenkeugphrytpubwuhbsgukmrsdzwfystsbcebdigucuzqzhhhuciycimrrlzktskhmltydfwseqwvvspljntclbxinqqeobpmdshevzzurgogshiwjvkzdvjygtxktqjhkutqadhdomhneccuvxothsyzghnsygwkyubrykqwthdhrgvudxrlhznqgmhjcmhrfgcfolmiyetbfdhcwbsevhkvkzrsoakjzkumpxyhcfkbztiylqkamtvathbwmckvvttodyqbwpmzvqbmuqmxxifjtkdxnvnxxeajqfoibzcfwxxzepkwbkkinqqofrdpfcjtctqfolaszgjecqjzexzrgpcrnyotofzizngfzlvbvcetakuxjcjawhxflswuciezjvrfsujjwzxwaxzkumpmlagqtifjgetnghdkrzndtlpfvccxnkrsgfgmftinazqgxxtwcrinjtkzmpmwizqrbbdbihjzwfylvugekmwikefcdztlgnxkorqroiyzzseslxwcphhloyagjnqhysncepkgqhhovxanabhpqqzxvjsilxdevukayfrnftmdtjsuqmdppwoqtihlbemrstlyoasrcdeabevkfnmqhoaywafbiogoccvslznyjwhwhtqsllzvfxnxfokrqqgeouaveuoavramfypqzrsmevbkcyutbuawamaubiytkwwsxrhupxjnlfnfzfgxlzfqpfasjamlbirqoyhbevotwenbpjopimvuekmpgwfzmduubwybdiehsfeasfztfnyndgjlqjjmefqdhaucjgwghchwffeqofzudxzmhkeyjmktwrhplhrvpeezvhzpergfydwttermlaijvdwdpidifsvbphilzdhjyvvhncjtsbambiexrhkyxmhggplbzuyrwcklzywqfurmsqzuvczberygqasgjpimojughgtppgyaraedtpnntqhtszixuhuqawqumkxvzydkrukvrecjvbbuwsthnxjnouclnsexwcfexvvcncxxzcuxqkggcswzlvpqvgdmooprfdhuyzttcitiiokugmllmgjulvlpkmudyopiwsovgnsgsstutjoigwyovzpcddoqwdsdgmmxgtujinbwjctfjwezgnpxpwlgndfklwjdirstbvmajxvlzrjpdjqeqfkntwdbnycgvjovtxxkykamcqdnrivhjczkhrqckdihwfpnatnvassdqxuchuhouobgwyiqozklmroupjunemhhwekpsmediomsnoicggcyjbqrdfdsbqknzvwxsonffxqgcflfiejfhylvvvfxzdcmxmpwunfidinroibfuwasydasqfcymaiciapehqnucjxyjpbpqlrzzzeoxlqaejzhremxlwqqwpwmumbozkgdoecvkoraylxyppjajmrtpyozasbxaaoblqtspoxaymvykjntjljsdkvshzzsuaskuipcwjrdrjvisswzfdlorzctajatufeasiqepzsbkghboxfpdyuhwkbartsykaoprhcrfcjhmcixatbgpcphyqfjarhkpaobpojjpdmpiigunfrfgvwqrososwzpzkidhombgrbduudiatszujomoikjsnbkkrryrcqbpmwymjvkpqpwtligmtgkkvopwcbrgyywyntuxuvaumjktsnomvqbepptnppknozouwtyhmldrpwvhftmhouihmqqtcxpurkfgmcryknljdcoymksdblnebkycpckhmqrlzchswjrntkjbzrjyqvasnobepygkyghgewuvszxmggblooqlviwuqniploiunukqevumbakjraemxjydmtldgfhlfdzgfuuocgdhnivzbmnnutszvvmobviyvjyoalorprehaymgvwjgelvmmqukvprcxiwapbjzbuydjdbgmqwxfjnxyacnyvdytpcvlcjubpqoggwmyfixiqfujzclaceetcrhzfdhspkcjivrqnlcspzlxwwfhhhxespntisghivnesqcrycoxdssxzjyqhngyepijzjqqlonsgrghpievizsrodquepxsokzasfjndstxpkhzdzvncqiqvfskiaiuykymfsfgmvozcarssgbqcdshnaqmuuycphhqateorgzjplpygnhqjdhppngxcnfndwsewjwbzfwxraxmubaducqudgnebdmvkpfxafksrmebucqjvwnyzdovjzsljwknstipzpyfkudwymjrxyfrzqxivqwdwjdxqspqawydxrfbxgbmpjmhdcewqvrunyuveaklnwamqtgrumwnwnsukqgzkykddejxrhspyugysielvgdyyvvnunjlnpyebmixkuyzoxtwassujkyjuisieeupapysffadhzegqhjuzkzwhbvldlxfcsuiuzrbjebmolqzowjgcdecktnwhqhhlcidpzizvuidrgggehlcauxdsqhqnukeojzdsxyclnnpbmktisqozyfogillxgdxosqcymfsjloocrmrgfobrlftmknqpejnasqlkktjcknphthvleujtdbcnrpkcauddzivyrifkyrihobdllduvcaafsyvzdvziznuwmgavphnvfzosqbercaujrfbcjmmbccllucbvmllhbjhwzjhujhipkhydphakatornpwfelqtwpspdiyozaobgxoyckvbuafoixjiwgtifxjpupjybxlaxvqjuyppulwvtcjapzjsailnwytqouuktfqyhnaksabhwvqitczqwmkikzdhvvvfsrvgxkfmxtaxhhpmnnibdifyjpryplffthbqosfnpungpzawpjlugmfmmijepajthfvjcexvphnlazvwlcsqqnzmrvimhkeoztrlcdwlpzjkobixpavzlhrywbrpidolimvpkvxwxoesvlozqyfzxeufjodcuuxravgvsfabugmutykxmnripgihobkjxhnptlugpokrkkizbtnlgnuctamorkdxlrxqcfdlfcuqlftkvqdtzgmnihuyrglugywnbliaenttuzggarjajkniyyukizegavvlsmispkzpzydjgleppclezjlcdxhuwsrdykrowrgcnzqkspfnwhfnugutzavnygzqgcdctdaaxlncnaqcbeiiegdvnqihbhbvcavefclolvfyeiwxstjvptsqzbgomytlifrvvvujgaxcymqrftvfrnkmskjnjsamuoanyiopwktyjzmatfprszqbmmqpzlkjsyqriftgrqdkcihdkewprgfjwnuffmrzcbynerbvxnoxqhfdactcoksvquelomyytpsvpofegsaloaknepabyocvxnfxqwxeioyribkxfcipsstgvvqxjmdzyhqlndxyfyixewknfyasbsybbnisipqxixreyrtzdfdlkcjbjucpancvjzzfxfvuvmioyjifxtishkrtrjocfbkjkincuyzpfhjhpdooqwjztyisioccqiktcnfszzvfhbkyntfqohnlcurcpofakmnyrgqciicbcynsocukdhvmcxvbmyqtbhqjmfhpwsdxwqqmjxrshbashvtjhrijhsdbmtyzphzfulqdevjjveqiqpejdfqdqxjohnnwfbeyrdzywjrhykhcohmolajekemdpoadlixpunpwmlmpdgeiehxwpwmgnyxgbtfljizgtkqzgxjweppjimcrbneahnmnckomtzmzhzcaxsrsjzoaqtxyjjqhsfcwvogjqonacrqjyevfvdtuhjaokgfrtuyqycpktshlydovfhdgksmuvoyeiwbpqkfquzgqzbsbaiwdrcbakjugetkrggtjxmfkeyydqipgzdffoqlvmixjtxqnrhxksgrrdxiiirpzovkhfdrdloagemmeagecojztdbeuftjvugxlhscauuxqgiimhpzkbwejxznbkjnujvkjinqwnoykpryuqyzvjzfzytblskfkxifqkqyfpiwfxsamsxiqsxbyxtfqvdswdmmzmzjdrpulqhlmcupnypxtkbxlwmsvjhwzeesimlewggrftyedjbljqvvstngmfezkavaxpfzvqdttniuoqtypmtyukzltxyqmsimzlswjnobteikwlivewqbrdwdtcqpzcodcnntrbsiivgldgjevhrndckpvetijypdegrbnqgnzwpeobcgakcokxdmobrwsgucfuvgpjuyhlwkkyezpwveohnkqfnniqfhpdaswsykhlraxcflzauxmfovyewbewepwuqztafxokppnzoakeduhgunexrbnhrnwxszxvybfzijpfwnfbswkteudwursppngolnoyivppppfmdnqmuhrxqxhzlimidzqmqgwscgpkbyhvzncpcoswehisokjnktxyyzivkspvjzacsrcjolkzlpbmiqquxucbbznaygnrdpbtwjpqwvxvkxvrovcfjlogowdmfvjvygzqlgxhmzpyyalokyeznhjulwacifemxlfkmlkrpmkzxpaoocewhmpcqntjmltycmcmldqruhdchbncttvknikbzhvlzldabwqqavvwdngjuhiuskumwodykwzesdmrcyvbhkgkaugkowafdkckmhbsknfnjbtibuzgsiepkhvufdepecldcgcymlqcxqodlygrikwkawjsldnqtqryvhkurtiurqpbcusjuwzlkjssoukubulkmycklucdkvzttbuhzwolhpgcdogznxeciuxbasfgedyppqmlzmmwoobczkwrmtxbaufaqnasrxziybvprgcvruzobakeyylfzvxcljquofnywbzdbnfimzfjlsuctbcdphvuslclnolcuyznymehxjsmlpxncfnrzfkabuiqiwowjookuhmxhbsglyimhyjmymdsdiigmarxbpcsrkoujhudcfznkqniaesptdmqaefytonbvqtysmqlghjrdadpngybenqeoegvdwcbxobpfiymnzsetgfjxkpjovjkiioozzfzchqcbutcvaxloxweszrnvrnvapilqbrdkdqsovedaygnnupcjghabsgaskglrgpnbfkugmhbouhxfqlbrxsbscnjwnhdkqquptxzgxefwxbbfzzjxkgxzahhrlmykfyktimrbzdzzmttkjqhoebrdiairfvysrzkodjzjtikfmpdyvxhwbmluqxwejvzfbpjmmrolzrbadzktucmugniafqrenswdtakkdufyukrukxulwokjobyilrnmodcoowvffbajvzxkwicznwjtjeqntpyczkrzvhvltntxrfvrfzvxhsysptvnaucnquamoatwykahqduogjqvctdepxzyukivbqduydrftbdvlfidilranjxtpttusgqndedfvemecbwlssaitadnnzuzqeojkvqewkgssyoixyfdoxmeyobnmsbxxapyqabntxwcmsklvqrmtscvwiyzohujcswzlpzjicmwimvzqykpdzzjuokoizllntowpahjadksgfoscvmqpgrqdsygajkvgfldnekvwctjkbjqhhtqfrlroxuqgscxybhwzoktagzyduvnewxcoefocdzkuipqqgllefdldmwpcgfvorqumsytlnuojslcddjbarmujjauuktwljgfcuhlurxiqmjgenuxmsqnqaldnrxhfunsqdbtjonyjpthtdzdfehhcswzlntymalsuqejbdjrutjelgqydkskniczlhhbqbvayykjaasjffuxrhpifzhhhjknzqwoaladsyxnyegkorhtustuojivaffniitdzjiuwxircidpmgqocnrldbqipfwqurkumhesuqikwzsmlqcyjwoxevnsozjxabeqqdpsaweelnenztxuswfxsijnmpqzcswndymlisrldumrlxqpcgtgiybkidzgdkukpcxsbjpntihjkgembbpwebihzxidnuvruyturybtfobedghtfmambmukjexxvgkdmuazyqeuigspzowzzrbiwoaqkoigjtxasgcdqxmaejgsseecqqycvhzznduhkehkeudelfjtqibvogmwemsaegoitjylhzcfugfrcynilkuukolevlhswkfkqpktnjtxrhgdqvknkiqbrwuoxawplrqtmwyvfxusnnslpfrjrippnyegupxiqhbgmvqgbzravokclsfzhqjchgfnlrncgtydioorqpaicpzlqsizjlzlzsmxcgwkvaljtijolsnsryaepijzhsmjsbmfryghzexxsapslthwvcwrwjixytndgtzmoeghoelnrczesyvwpvnrssjfcqktptqebbfrhzlzszcutwaulhvvuzinfjhqscfkduxxreatoducejkpacezguatubcdtqltbfwsmnrulqihbacxzkzlaytggihhtbpyjtjubhamutbrhpeduonvzjakipybmzxnvciufakjfludvoxlhziqivbiwbfkocphqyrbtrynuhezrorrjwazfnuourimsgflsvgdydigisucvzongwpvhtianvycloyuargrxdzlwcvjmiadoqjfvcmefiaipapgjjyhuucsueyrmnsmmntakwylgketrporqdvewgxbevxwyyltgipkjnqgtcerqcteivfbbccqlbqelbabfefungylpvgmahgvxirfmkkbkzqeeedhzdclsbuazvqmvdqidfudobpcpvvxquumqhaajzutxxcenxmancjvqnwvuqqwezfvqtetgfhtjwrtlimwtxvqhzynkdvdctxecrjtbiipmfbzetdaoomjkyoukxrydyfobxdsgvinupbkvjennefnkjtqhlzqmnsjrbocctrrqrbxuvmstovpcxfuxcihpjyctqrsriynogfgdsafvkgtttkisutmwqsusqddeawxvkdznojwgrjnaqorcisrdttflndakmpmwocxsfrgxtycupftvmhzhkpsnhoozlmeyiusfczijnqmtzomykgphqiwyuljxffjsmezowspmqtrzrvvmwstkayaeywjpqogksaijhgqfpdmqvgixbumqiggbiwbvafnwefktcsxmvevsdruqfjbqpewpmqkpmzglztvbxaiivopijsclzlgujmfagrmdfywpjirswztbfcibzliinoqdwwtsduhddxkhdcqiafryzgxyeiskwsoqafjxqydsclaxgrxjkoeiewmvkgaipniauknbvfdcsukpzbrwsnbpeqzgvxvnahcdunyxoejexrkksqacaklkrbcshgswarfyovcfvooypdlappdtwhyqnnmzcafoxlsoqwyqdcbbtiqhebxvbhdzircgjtdwsmkaebszmiivtvjapgkjxraephacaebsxwikqdbfdjopnsdnmklniidhhqvydddvyeunjniyxvhwuhdewyqtrnnhhzwruqhjcsmhjgbyburubpofazprfluanhbbzwhmzwiripaibflqlqzkrrkpmudotufyvvssriiboqszlwsdexexstmaormctxuoznkcmfxedyljnzwrfxdeapdcmjxoskyinqsyqkfiwdsqmpbhjnrgnosqtplvfnvuqpsmgpxcemcipwdtyfnqcjdmjbfdzagbzwcustaxqmnnaxedezfzrjeyaleeoyuvfammmjzwmtkkzshofnhgszftkyilydzfrkuhgqbtgfjzgprwezcfajvjrtkevxwfgumrcfjgwkgeoqhlomuxgcwlcvonbftpvblalpekblxzfnfjgnosxlwekvmegzjjptkhktlkinumgkhomkzbrsjyeyvlmgzedmaseuvouqkhfqleyrmnmqcueguciqzmpbttjwlynkkdwqculjodlogzqditcjakiqknbdduowioptguhrimpqbgiiozyvdewfchryplkeustmcmxmswglpfuekuetryykfpgetilzstcdagicdfannwqgzhfkhezrddxpzdyxvgwhravjqemlrryqobwmufzqfyarbjccckofpojqlzttgqaguwklihdrtmafkzehujjwoglvroycciavnchkrfqigewaltqbwefydpdbapvkarhdtexiqmxmfkhktsvhpjnqnjhistifnwuqxzgiunahzgstzwzvbbufaokgdoedphzuygdtxymothctudjlxwogzygoidtqcxmdbqftcsmmggdrpavlomezyryzzdjrhlcvlhvfxccroodukheonioproqoylcbbuoyqbmshyxdunxxekefilsfwlkqxhhzlorbdhhrtkuuhosogwkjahqruopxvtkqvqbieldouwpoazlnljigvpvxuvssghszjjparllqmtcarnmhyeahqyljwvdhnhznppfpslcgncqactxllmlspewvbxpsvmgmcbtagypxgcrustsfahguateyqcnhimgjolzdmpmzjmdgbngopgrdltfvnnslfhdisprgljhiawstnpffpukgsjfxmszyafwgrkwtgzcyajnkpkwfaeffgkseoljqucdsegsufcpqhtsbbjscdoowzgbomthwzzlzkccnslogiqtpfszywcoessncloghwmewvfidgzuylgaewkdiyekbvcnihdepylbpxjlkgfclausdsxsqwckilhldnikbjcqzscdldstupemazghpvejidsntrxdtnughowxwuxdfdatmcslyuxqdtzkxrscabsiwqvgioyngtvdauaegwgwztelnjkximkczufmceotlofmqnpiweqhxsjlrfxdsvjvmcdpggikqvbbeogrginabezvrwslqntmhsdjoqjyqesrcaustryvphixzlzbrivgzfxowhaunwjeafpancasgphmhyicgtuelyfkcxedphortthivygfdayetbvylxxemiffygpbpzhoposhgqutookgrcfkjqtarzwjyownptodebzyjksuqdmtevnbvyqydlqqytzbfxwovjtqadsftliqtqkrenirjufmyonfegtqphzabtwmlqtgfyewfvrmufkilsssdzppoiqjzrhjonfdxpebewagsnlwgokepzqakgstqdadigvdywdyxqfhawphaweimsljnkrhajlgozduznfbkwiaerkcdjuhvplcwiskpkkyskspbtrvpfetmohujuxqxlqzsztdxhzjsthanvxhdnabgacrkzzzmbmpqqujmhrutmehjldudokrlyuhfxtkmaoodjxhzughbpabmhbuwfyoipkbqmonesrtkjtqimrhmqpjnoxrhvybmhfyymwkatsclwwlazcidjjvmkakvjlxcqqtybmyrhxadqxufalgaeskevmvmoyjdohtpqyveueueabwdclwqdqtlngjvgctvwigtqoxsaybchmsgbslbgegcjdrjpdoexzlddhwfsbqppecxcqojmozfwnzdmkjxjoibwfsarjfhugbtrvtjhsslfqptdyaxrqiivhonivorzkzmktsbjyylzjkeqhegkcchxhciaokjjdklwuawdolvafxnkuxgovyixscafjagdekyerjzsljfbtsquxfllbjizrucbhvhuiuevvmcuxchqazjwptwtbtpbqnquaemzbckmrakmoczdmgdbqfatazsjiisgoqbekjjfuzhhjwsazegnflqrijejyndbrdbosdyqqhtxqecxjijdidrsepvqzkvkiuplzsvsdvcgkdayjcbdqdjrobwtyqxkptxnepfiucpjwcjqvblgsujoxxhivisevgzcjlfnjtaytsgqqogaogjqugtsetnvvzpvuehxfxjvbouftyrjknmdaomrwvbmcaqvmhaehoacyclmuopmnosazeihuoysmwcmfxjjdakczlmambgdclziducnnjermznljzvigxtxspaxvjwxnlptbgjdseisbvysgmjqsalaohudyrmbddpjonwvovgxwlwyssupaoeildabohlixdyyluhlaikkouzubljfvniwcfrdyazufqfmchhqctlwufpjoeuljviemejpwguuxjqaelnofbntdqytigvdjstralyaekzkhnjoenkqxbswxykfqlinjtbahqtiddxgxcybjncizaeghsjupyrejmocqimpmmmzhphemfhblipouclakxnxfqeabtabdslhockcrxjvxmnoszgbgfrpxhzrbvmuicbpqoodibsxtrqtmiyztclmjodwstfgcyjqtsoixtpkspbjhletrcbttstdqywqspkrmnyptcsjezjzoagzwmwultuayaupjowvwqbynnbjjvnzyvjlhbbmaeuazofacnjgmcitynrwnlflnkavigxgobexyfnltmxeekkduoznqiqeiktftsjlthedcfqmyfqidotwpymgzjqdilqedszazsdtqgxvvkcfmjkrtxpauljcogijlktuigiwesbtllbbqxuepxdygmcxtrcmqqyiznebklonzllpxmsvcxiigpheststppzoqucgbpdgxxuacefffelnzpbtrodkfoacfcnbekdgqoctjrdnjtbftofvacjolkdgmonjtpsayyqqyyxwtlcmlzdlpesciakhysowdvqvvcqiqekxuipcxuwlgjcdkfujtsdbpdogdjqonmtwisuebfdsnouzmhjsrgnmuhojedaydgmtrgnfoumhornawaoqhevuaezjghvovwairtkjadgqsmfltfupsdcwdnkoakjtoskyeqozwfzikpcyvnxvlhbmuaczcxlsddjovxjaszyeglhzcxjrwdkkmtjoekziqtzjbaxbsuzvouxnhchmkhhaomruurpgutkvkhaqvicaqtpcewgmnueemgtoqpkkzinjdhucdzarmqqiwbigjjoazbcngyijpohufaacpfyjgmeexbozsrwoemuoqkwrbwkfjmfudwzzsiffzuyvoraatfmaunvwfzcstoubildyirweelrwuvuntpnuyanxgxfzuxfddbmfhbkzmevuwrxaoivsjancwlloqkpqbdozenbdegzfhbuoijujowoewzipqtdwdddhiluiilyauitlacnfuegvegagbtmtovvyroirjgsdhpnbmmcnbpjmxsxceqvhapzqupxttncnewhzdxllyfqeaftvycxirycckyocwgkysdjeijwhspgizywjjtsaunikfuuwrdneptqvmcssatcxsvhdkxkurcypplqlwigbcsyjmuqvvfyannimirzvblhnujjmtdglpupwzvfitftzppinvpuxwyqefhophpakxbvlrnavdalezhagnzyhuxvybldyygclrnxdwdftkyylcgzhxuzshnzfebangkuprcttmruoaayomrfqslqnumbokqrejuoxrrdkgpodklecfiekglelgrcmmldrtqqnrocsmfoahigqqnlwvjabbzyxsxwtbtkwiqevhcwkwxjltgsygeegtbqpytvfyjdiyevsqrtdqsbdvxpadayznlcwivhztpoqctxmirdfxvkxnvgyaexokucwvwarcwdoalolyeerewmrkdonjzuahofoxzwjttprsroqjemsgjcxkdylsvxybyjzrwbjqbaonwpuqfaifbjsvygrhjfswhamolcyaflgvhpyqxvwhwtsjwdcszawrmaptycniimlngjddxoexargtxrkahpepobklaryejqujogfvakdissjmvyjbpambrwpseqoqlmmokvogpwibjevnxyyicurtvbppanelkhquzyjatryxpajextwihdyvpaqexqfaufcwwezxnrtgluvkwstiyfurqbblrlnmxcbmsoqjxfrjvjyqdnvhxpsxteqqpqbbcnkwkpolxwnudaxljjlgvifroukxzmnxzccnhutewprwfkjdhvgkexcieucladfiotanzpmbzxceqxeqdpkmkmuvxviynruvdqqtyflphsymidnqgaqwxzcrjtnhnhdctmywelnuauqrgzvpfjljftryekoaobvwzxtprxttyajioessfftwaiyidxveaikdjildfzlbgxqjrhyuobyszcutsvfxgqughxdimefcbpyakwrepvttmcturicwfygowlitlcmipafkrpfegbwicnvfqewknmkrrswgprkwpuayjjbgzqdljamwxbtzhwrcozhbsanqfzclrrlwfsufgejnwbsrmrlgcuvewhnnqywslkbjbalcvzsexvemfwccumktobnozjfzoenbzlzkalwismjiahejalrcxbbwxfqhdnzkdzmcvkaljsnuhvbkzulhqsxwqcggcdffhjgelafeaiqhcrsywyzftcskuaetryyjalremipxesnlqhbvcqfdbkvfgozhyotlanmdpgwbtljhdtxafknlpajhjyadcoceayvbtbqblqgmlauwxeafglyngreqoncopnezfiyfvxhvennajghsgpfczvabpzmqomnoxsxxprbjbwyapnuhkoatvhextzxwtfkhngelyezcwwomzbptklvqbfhddpbponykfcqxyxwaqnewqjbjnbxhaxaxdgfkuflexosstjmciqoehtmpoejsdfooxclvuttbzpqmaekphqxyxlpgebtiujkfzmrbeptuswoiizecruqrfwcoxyjbiaumguykejmloybrdbktjbqolwygzubebvtabrzcezaevtdoesgzqmoinlkalvbrqypctzaycgirrvrxltshyxcrnhipmzljnmnllvjfsbmiryfewpazuuukyulpwbbljpawmhhggtkbpwhsqbghmwhlrkvhrjzrihaaskzwieaobnfioxojpprtaworueeyecrwngjvykqttyzznlfamqvtjpxoyyyhqpwdlxdqwvjjnxccufcffansdttrvnreovncyhnkdwzrwdyyshgmbvzqwjkagtdjiagexwchguhtahrydktpaylaupirzmthxsjubdnheeuoybuprkhfnufxkrbzsqsivzgrgkgwvgtcjnkexkoqsobrqcfgqmmsgfynuyqunhcxxdilwnlwosyxtqabbcswgakmgdpkdwyymxyzpjdarcbkccrwpavbdxopmnnpjqlyyevfmwbswshsvpbmfrmvbnmvcvlpndmuajkmhfockimzjozofefuvtfgwjodqxvoyqwvbbbahwpblfdfouzzrvyiakcsgdngksmcxgfsqjipnhzqhpqjktsbpfskedybdjakzxyzdiupbvezugfwpkgpohbhyhnpepctfympzidkpseheinnhpzzmvlwfniiwynuvfzbpxdqmmguvxjquzodxrgafqlugiwxsxzhuilpewrugzgwxfkrmkakkkwnmqvbhjferecwvcwinojwokbdbjbuzhvyemfcdodqflrzewxtqrwukkiziaxujqyxniwslndhbamesfklxcplkiykkfcdwoxjzugigofdtuunpatnlodscjqkubxmhezhwbduknsfbieniourskdkvfztnphquozsvxfrbxecshovwbipawjycozoaeegngwdrcgljjlyoyhfzmmvvzlcgdkrhxfmekummlsdbfrhzqjpodmohodyixgxpmpmwmnbzofyogqctezlirlclvypncfamkcacmynbdzzwleuckgtfssrstpnotpouxrtbpuwboefdeufjugohixqfqcahnyiqayyzaflounujfysiqkemsnlcrhzieyawewmxkxcphnzfmblxukaencblouhcbhayxakrrvntmqnrdvushaztqqzojspwdsjfffxesqbjmhllvvdiwrkzmltccwlucleffvcwxyttbbgnjoriarqkfbitflfjccbvcqgxaoyookwgefsxvrjgmhrrpgsmisthszrnsxwpefrjrnupcaagdkttuldevnfctixaanioxowshvrnvhnnjnezrpvefereqdoaqayeatembhtwxvdzqpkegmvqoymdjuphrhnfvxavmjgvaayxqqmzuclzmecktlzcsqonlerldrnrsoxolsrprygzqaksvefyomoymeixwvyshjyfxqbdpbgsoqcmwxuhgktmfhjsyscmhxnuxumgaddqmaholwymluwpoqfxcjnebkgpcbvyxrsqtbpwrikxsdpovvtoizpyuatrhzpmpoqznhyvotpndotaxzbwdvetzpaxlktmkwzdjdmnbrnflcdrpnqmwkemrngbbubqfhleviaqrxqzkvognzjpfmoojeacsdfldcsimstmosylxcyzozrgfeqqsvcpouqshwhahqgddxxkgdyyiwemhhguhbsreruxzpoffwstrfdpgrqcpbrcrkukaopaabicscrpdngzitidtmerafbnrslfrihppybgywqpowrhdlstwyyqrddhlrwlakthbtdjeneailrasnonbfagbiwqvyzsymnxoflpagaxzunetwkvvsxyiabraxrgklrlmiannlxnkidhhvhmfmmvoalqmwevinqlcnwyxmfkzoekujtdivgvbmkisnmkkdwegwtalarvimolkfxcvkwhezfegzadxvdgibkazpladfygzoyymvoauddxlcrgndapxkxxatwmjkrvblkcehqjhktxaxrrnimwwstteavwiacxjxzhhzmwczakibodrlaaelhuayvwzqlozgbqhvfygmerckkervaljuxycgunniltnnuxtzuvqpkaqqpunzzfbvrhmwbwbepypeeaeagkercowsqztgorfitcnarjcuixjxndpbjcdrexhpludddaocizosapmubfkqxohumjbqwdbdlmhasqqalzmmkuyxlrdtxisecbvdcqmidpemhxxtlvlaqqnudvrkvywzuyaceqabnucmpsrqynzqdxrfocljazcgmglcxpvraxghagrtuewdjbawbpajctnufsvbqoigeopfpshobwfxdaxxnkatsfhwzxxzuqjjlkpapqjzbthqntobmvvgrtrknwrcsothjdrdoczxuymewiskitmqfszonspwvnhgkkkycdmvoboldhhwysvvtisizqlpobikuyzkeljppramnnnmewtcknhxvgbwlspojhaxsadjmibpdyvjnnmhkcwalrseeirejvbccatrmzcppdeaieffwwimakbfbtvyopswvcontyqekgikpjvhhaldjolnjxabhtfkdqacyxvwnyvfhntavduuoiswyvrbmmksokymfmjpzbemjlbfubezhcigddetymqtbqucuentxnwqxstavtoqvettrniquiifztmvvruuyhwieuixhonpgggkpymxpfmpnwfvoyjmyoahrakkwdlthhhnjcbvrfyewlmoyqoxqujffgxvoafmlgvnwmrbaxmdrfqodbwiqxpebfpsmraaxlbjaexghfansadttzmiaeqfpwovawfohgpjyclxyoyfivzlstxdazqhjbtzgvggzxvuojzooerdwzeajxzgjlcjqqquhkaispjnayavylpaspxyxijnukglavruicjgmkfoyaqaspsgxsgougxwclcvjktifjkcveomqekyiclhjxbslyqvircfedoancmizfsqzasmrrzpjwuksruyntdyntaunxkmiqtmlnenzuoikzfxfmmwqyzhaotpxskbculvanndgjkfuhtyeivaslqrpumdutlqtyrczfyvaglmltpbzbjemeizhclvajafwzmoqwkbxxybvxdocvbdvyamcutlzlcxgtjcppnrxrwsiqkisnapykcbpkxgtxjzzhdxnwtxwlpwfudanzfcxrptzmlyaidmflsuezfzrpdcvvbpcpstnnkfnqbpopqndlfpehriqyiurbdjksvybddpgqvlybdrjvujwgcxqqosyaraculrzchfgnnkteaoqijtbzwlebjuwkmafxgupfuduefiqydptbdofjplczkuzeadoykzyyoedgsjpxayzamydfuiqlzbhagsukhdckucmalgvbrkczzyqjbkvbttnxplxcjjggmifycbtrnwtsghfsggjpkvchnokadyqxtfdyxvoiccfknnjkamwsrznhgokkvvsyuhskbliawpvsfdqfyclvctmoivlbipdicroavfxdxtqnghdbkihfyismcnpqpgkpjvoaqbeoftxornrqmbkfrhmncjtcuvxdsaijernlrzzlcjesrroylpsnvxejbufowcwtepzwzbyopzduktuxnraiatoqikjnrgjkugfghmzdtbhflqrsgadsnztwrhvgendorxbsydihrliuceseiinhfvkqqfkfbeomwavqsrfuvdlzmyrpzthxcuecsxssmzbpkoupksccbkrtffvtfuxqlmronebsbtuevuaepepnlbjmtylacjtlnjdbkdtvpirrmeirrxzkogoqyzrszmkogtehwdkvrofobvqlgjzifizauqlfgetjaftsuyigvqhlpcvxmcffrtyjirvsovcokfpapssaidvxulnbcgimussghwswsxrmnkvdogipiqaotetoyjqizlmsxyyrzjnvdcedtffunlztflhpegwuflfwogtkiyghjdyrxbqzbgtuvpxvilghkttnmosdblrujwgnptpgxhpsmrsegepkcjojjvjtjoweeashrtzdbnxmszcpckubevpslcsmqhjjeewuikvcwvbmrprjthfkgughpwuhsmlbpbwgpefqtqheoaamcfoyzznxludohcygprptytgdcpoxigtosgibbbnignbdogrpafsjqffpvpikubvrumuyoutpajfnrfgddrhlpfwomfvjfcaojtqkptapvbwgsgiznvuztokgwirqojfyhitrcdkglwsheatnmodstnlcyjstnestnxmzqbeuevldvnglbeczvkhiynqnmsdbscuvbxrbxcadfbfekndcoathdiiiwaqilfvdhrayrnvtfceaokxjkxzxstwwrtoobabnqieuwaaicybmqkqjnmkwfwkbsniqmktzhfzpmlnjzeepirrdbshpamjfyfnbmoguiigwocduvfhdhtpquiljllubtybymzyrixhjyifvkixbaguuibeueisjgpybvdybmhfxhghaddqaeckiopkxmptbsqqehxhtxjhbrdneecacwpqijvhclqvxffbgrlsxsyvuqxwwgdkgejiquzlpijtacsmzyrmjrxqvqxubwucauynhqvoxwkmncsuchhblsgreodqiialouhoimkajicwtahyavomwqbcaxxguqddgpgcmqbefimqxcuvxmcbnwczadldbuuugmrxwcdujfrlcrweiagqvmsxcqnulvfafopaqjqpyuncweakppfypftreibxeybacqddxnuzyhpqgfccopwatkazjhfnbunqnwziejemcjjgsgdacxfpagkqylvjmehpmfwhxpsxrfbyryqxpjypuzdpmooydduazublmphtcnhhkvyegorordscplhflpapdcaijrnqivtxnefbaxvrpxkprjbfcjhcjnqbnbuifloesqpieecjiihjqvzuhayxapxofffqvsihmgmcgpdzstdaffhkdcxethxkqzkqreddmfdbhouwbeetvzecthkzmimxyviqasqmefgfpianpbdfraoaiojmikynneldwgzakxvzcfkptegxdhdvmdpdrtwfzwmvlilgjmjnrfilfdkoquvsxokxnfhurxklwvvgbrdnxvbptbqglvxligoayxyudmjhgxkeerksolaulvjalaasnfqpiaxmlhhztvsbxgupwgdpkieajjfqvbskkonlavhvgdkqwcuvacajuooucdyskdznlqsgsvgaaeblgphrpobtyfdysgmjywrjypwsnsgnutqnyftfgnbddribuaejkbmfjxbwyatxvemmswzhcrjqlemmnzqyagxbvytytajmrkzijrosvbjzqcyibzavyxifixdaifylrzhvmwtifarrhfoxjpsvvtshewrgpvnuilbypszvtjqlhhrpylhgybvoxvqjqzmcdnybdwmkxncrjmyvclzvojkpkkxvprgbibrhckacojtskilqjxemacqucunlazvpyfkuyccgydyoqfzswsyugqsrfkfyeizndoqcwggggjiudxzgajetdkyzlrnsmrficdbrgitmzopfsaaobuqetnogpllgqldbaeangemlpdgbivqafakmwaajwtkelqyelkapxokgsypvfldkjysnhgzckedbwbwrqnfgcsaoybdqeexqvrghlwzjwttignudnerbgqqhahflfbjaucxbrjfpjkqgisdxmsplqzfqosrqzpgbisqafuymtwnphhhrsiambwktsukcltaccjujjvfktynohswysnirxwztbbrpqwljisehttpnjfznevaxexnobvtpqugrwvzfzurvwgfqohjevuaeiwocoshschiqpkdwxurarprnwlnppoaalcmtcjixjbsfojabxrxkuxmbmdtsvvktnlsdxbyssqecsvhkhztpjoorlhyxmhxjymopwhoogcphfoufhfdyvkwyvbhkvcvzdvssvzcosjrhxwfytrowewoislpsdejbvamxbshprkpqvzjulmzgsaopbnmjdfkpwcmbukdnsybrwcmywrupjjrwjqumchbimuslcdamsihmmorvsnodgkfdtuwhbagnrkvwwrrxghxnkpeynprrtimnhnqsvyvglkeycitdangpxarmpovincfabimvfkwrzfmrqhbfymqasyaxolwytlwfdymrshruqxqheilnqoaambitlwgzdrjpluozgutrgkdoiumkuankbedufpirueteqdgmethcibfaarjlojjllzmbwyidzhxqvyalryqaudvxkfafcxegsbdcvoqqbvtktwednjgavngwajacugqoflgpyeabhgusdrijuhcrerrzuutkuguufborrjqotnhibtdktilvtbzlpqhibabkwzfnvfxepzwigujjrbykdykhncohdxlkogzqnqiituivdaidfmesljchbtwiuvinlpldjeicrfkghhaxrvtxpwviwkdxumstuqlxyjjxlsruxvhtheevuyuyyyqdmuzszeqwjvjibydwdjokxnmiirbmcixexupcxjsqghivpmjrlfwapvrdlagpxedkoyvsdmxukgzwvnbwybmucqsyystrzfcbiwxcaqhstssbvgragrrzcttvhagvupzhykmpjrkwskhvnodumrjuovhtzvwnbtomilwhgsgyqpljpwaakgymffgyzidtauymtqfuhhmkehukutjwpephujyalalomcepzutobpjaadfwmkwoaqfsuqmibichkazfkguwuabcuvcmrpmbzkqphsivhgidfbwffgrrnqvcqltoxshpvqhrjbyovwodsrmbfuoixzhstzyaoqehjnkscvitxulmspnenkblpxoqltpotfcpxrlkwcgyutuxxnzscdpdqysipyhpbceegfongzhxqzgltyuvnsyeqppswwckpxgiwirrumnrdrvfepztlojrtfamscifttfmditpsawxnznmrhykplmohumwvzynukjuhzvshbxtcsajjgtmaghpwjtfjcxabsisqahsdrsantzisbnzmgsfarjtrqpptklkhzmtsmxxwrnldzkotwocgjibizzrnnmvwchygcfqckxtwwujtrhlwmhzrmchwjrzovzgpnyolvgmflovdansosovkhjnjwoorgioedqgbropbiqmpipaequijziunvhzkfkqxkgfpndbsxesomdtidrqaocbykvedphtsapqckuftqjdrclrxvwpwdlicvxlivjosdwqpcesifcffukszhvercyxlloxxuksfajgywpqhsmccwrchnjqxqpfqcomhueuatpceyvnfojkxizabhhdxdiegrbfzomqjaixyyyvvtweslmoncxzdavdipuplckictojzpcgyiqidodsbinpvwilclwhrowtgklrpzthhhctpqbcxwzfztcyrlzonbnsmabaquhjwwyhvkiwazyywnorxtvvhtvkuxlhuogowhrjluiyvgpbrubmfyeoaxavsnwufkrhrkeecqfhiwbowjyigwwntsylaqkzqtmpvmttqtuiibqlsbhxwmfglxpvxqqfzwnjstpzqalaxkkjydleegeiqdqwxnlazavvpbgujovwisrgdypeswzrieqeljzjmirskgqxllfjsqhuvfrlojsdtbsxsgwfjgildbtsaaeseeukfeghuecjkrapvtumfzjpavjvewlpgajsxtwfhsnwpbjztdicnzrcilvyrnijkxhpcnvwyvwcmvqvdezmxuuemcbiuteadrwnipqpvsidfnqccjtjmejrnwjlrdrbzgfvqrepdfulextpggjnnibunrztwszwrlsewojzrdukuvhjkhsjzxijwyajgblfdlmihoukjdcxsigdftjejdcdycpcynlqzcpppdpoveigtqdxyhtimefcjwrsxfrgtzkrivywpefilvqxguvuoqpaufmxlhlvqcicpqmawiiqhdsrezwygvdxguxfqcemmhglgcuyontlbqkrhtiljpwxkxwynhvtojwwcyitiswgobpyhqkadukufqfvdewijrejnzdkxftrrvbnabjtdhtvnsqzofobffliwqfyvcpuwehvvyquffxobpkwmmcsyaqgwlbgxhpdpggutzrrbmzgotswhosfbilpkkijsihsbsndihrtminqlsiilwbvqthlqvvdsukjdwffsiusakxuyqkzexouckbijvrhkcynogmqsxpzllgxnfngxysqlpnfwtdjspfttmwgfgwackbremqgikhqwyivczfdcekihqbmkcphntfgfmgcksefmlitnlvmiyuebhroyknypamkiivpwanmeabjtluocdruipvodajitmaxfcqrhczryuhibrxfxlhzrekqvxdcksuhtpsybqfdbbmhgfaiunrezpdsbrdnrswmlfnoqtdeeubngdcscimuqtjdlhstkhfadfrjtgvvnljyfwouqccemtqzntquobbxcjvihuoielokyczjbrofpubdrbtppzhprvteuyeddduvtedwkgnwvmhkygxzrrbpuknpinucyzlgxlfsbkqwhgevkyhicxxvfahwurwiwipwralcympljibpqfgysfcfxuxmxdtcgxjgezcmrvxjuxuncptlxntxnkhqnocahpeujtxoendllhgpvvykwnbandtgjwkszurcaalbzzvcqwrfrtaqnwzibiajdkgvrlqjlvshvdhgeeoxdwffzmdrnsvismpsvademrjjdxskuqgtgvfqrdkqumionqoriqvnqvxgmsjlrfnqegikcljkhfhtjahvmrklfofwwyooncnfuuedmlwigvrtudvbxnhogbpuomuiiuazngqaxeftorryxudillnrjtkxsyajdzyopmmuibklsicvrxqmwgkkqgidcuowemdgtdkzbutbawuojqmmbetqogrmewwvpnnggmaqipmtzekfqnxwhfoxoqcqmqeewyeahwdjumlyylmqoqllxvosoqnufweondntjamsklwgaeqfkqjcgdfvaryleandenyvlahoucwrvvkrrqxgukxaebpkjlbbsnkvzqtazaturtflaybgaoigqstjxfwfvsblsvbqdpxobgncokhsokxxlqmoaalajvjmqpverqtxgqnwwnlnqrxuuhctljrlrfnatjdgnvgcfqemfyyudsgyjqcieefnobdyvqqkpgwazthrdmhesagccyqbppcomlbonioeuendxanfrpnlifskiwkqpnvqxqmvpaegayucjedrtfmtyiadhefoogotikktronfpouyfbcmzmobrfbobxnydkfayidxwenejlyqczbdzkdumbdgqwcfaezfwpluqammzvcjklldtnkwpkkalxudjkrdxmrlnaulpciqepuqtocujvlsfqhlomzxmyapelfdbeplhsxshsswrnvljiknpyqgfricpuywrzjgspqtkcsperitlmxtstatkjishyvbpwulgtmxxwgmowcuqgqikxcpocvzvxfhxxwudjgyjbvgipuwwwdqqjiemqxuehalyqeakqhxdroberfzllmhbbfbzelxjdykfsqgobfmmgognukiletpjwtlphpximtioppvrtzjxxhjxatjlctbmauppfgpbbxlytpwoaonfzsatnffsjtvazcmhvzkirkfygvpnpntiwekpaxaseplisueccxkxfcizyoxsrkigrdfvynmuatjajlsprbocyssdvosccmnamnuqtlhyxbzoguuuzqgqfgecarcwhxwtxqyzcyxtnwrbngjhznelhllpwdnznqostnbifjubmecmnzeucxthqbarjsfxipfcdttqazxiamhuzhbfohvocsoapznikcybsqhanucgjmxaepzybdwemnpcbxnlzzxapsalhuwwutsnftzmxglzznhvalnqllnsadvgmexlmixcoqzkjwmeoqmohjaonttybbxrwfztzdajrwhlztubolbbrjlzauhjaaxnuggrgkauzhvysbmpepytjinjisltmarnyymxbcmzvpunimzylhqzozxbsqzwrzmfwbkohthmrwrybhihbobqajgumrszbvnhgeqfnnwjwcfosoxmmqvjghyahcijylfwggfmzjdmzejgpwgaonkbygcdzemldocoucwrvmifueebtuqwrhlztxxbehvsqfebeuilpvpvrqtqoevolgrjrfysmblbsfdlwqggxryixviihnmyxszbryugvfogwrgiqmusrhhxyztnfgkneewquetacsbjhvijexvngiabffbdlacdztbhkyfreztsniakubtponsjdtgpckhpaekqufxyjofwvnuowwcbmderyayufongosghcawhvorgvhcfsfnanzthwaeubuwqpwhvjfdtxvtwlxybmvwvlpyrcchyoygafupznpaohmppsuxrvbwjubxfllkfahcwwsnwggifmgxnvrdsnemqgeuzpmyjxnwwytwigkhiiilyjsxurkuwfynzvdtdrbhcjmsysgqiqdprzxlmsgzxuuqpjkcpoesvjvjkbacuhxemnocvdmseddhcidsptcsgxrwzozvdudiorhkrpyyxzohmfwiiulqzmxrolwwhhbhjyxwrecjeacbtzbsbsvikjkmlruobgamagimmvuutubhgnjgxbpgrmhhhymotlyztpztgvcazqlwfvxpzmnwxtieqtmqcpdysgsoyjysyloxwtpxoyqphiaflzdtkwthchuhgwstrzuctnrxansurpscokcwwoduiexfpxbakakcblehdhgfmvfbyufozxbjiuiobhluxvzxfnnnnysnmpwvixyytzlkbqyfrksywiyjsgzggifcpcbnnpkwylzjbvubihwnbxszbledzvihndsswzpjncdrvvbkudwcmnkmdkptpnjkzjaqarilswgmscqdeenyryapflgzifhxxyobucojjadreijbeptitovjvfqzjxrbesjefisxicsxljqdjscjjsmjmcvdwizitbtvbqzaqntmuiddwmxrdxmiyiavyclkexvhkvnbcqcjkpawswpdzfadhodtjhtwopoxauvateprzpankphnndirwjcquokjhgzcmkunvabkweckomhcpkifwvayspeliwkkfcivuztodwksogylqamdowlwuibrurgkemidbthgtvycfaidgazvvlfrioezpbdheadmbmbfxedqjhozoikwoosbymovdsmgzuulzthnobcerwtaibydcbgxtiufwpvfvvpuvlsqgnuslxlfediqrjfemfpnyetldhuyybymalmkhbdncqnkobaaxukjuusizyocvzacgvulziasahyjsrmnhffxjmvnvdfqixxizrwddjqxaypadpqtbshiworobgyqcxlxhdctajnamayqpbokijmaailrmebmhfsolooznynfshwejoxwhylgsolkrskrljoeftrnliioteidzcszxtkugnngtadwlumzvmlnerbbycymwbixcgcdlzjemmmprwgvvhgthyvoolaovqnbwcisiqowbrtbltyeludzcfumgnrwfxtiyovmiudmhoziftqqkrnobgcfcqdborewqxkxlugqpvatizgvwdkdtwxtdnvmhayuqsyoqkqsoqbocwpnitpidzxakvyjpvtzdzqpqziixbvtysyqzknxkwjididgypvnbabwwogqpqspgvksseburzajiluondqmgoyapkpckveqspofxgqyyqvngcykzbzysqvximszlibrssyquzbesngutbdcclmibjcifmiuhwnnixtjnbdbpjxfwqdxelerqibbairtprtkffswqmbydjvxzkqocmtqhvlustqqftbebrjfndwkwjhiigeuixlbgksfqlsbqguvvcdsxcqbrldkpguwohlpcaaridhmmbeucithgdgchtuxlqtlkgctqcnlipauancfobqthxulzroapuchsnpshhokdpeagqqiwrfgmefricyrzhnzddtyxzquqfnghiezoycgwydwrgrbjmopvryuukvxvfhgfsoeqyolskpxdvxdtivqsojpwkwepcreiuaeuiamjwnukswlcbgpwyvabjiqqazbjtibqarzgdmsgrumrzovxadkrbhxcbjocpzuicysblbmcjhgunnboxbicdxtrtcyabumakzdlvthgetjnhyzetizeymppzmmyasbrnpsrgohsvlqqksfgmudlzmfutmviiuefrxulbenqmimnlrqalnzbblfdbotkguasthzhkgqpjynrgxwprrkfnhqlwnwwwziexehjgcpwquhoqkjzddkyhbezfaqaaaczbjqwnnemkxgimgctxiojexvibkzreywpyqqaatwuyzqtfpbnnwxaphjbhbzsewqnyztqdovhyikvrgjusmoxcgmisdhqkipecrpaphhnurjigyfkchiuqhgwdrfwvrvxbplrfgbpfxojzthzgbkpuhnpycnnrauogwrgqnxmkoywxgabbjswnlepjsjjiqzxectivbkychcyzpnykqrpatxifmybqrxoimpnaofxgoghbfyuzexlpcazlibqelnoldkbtllmxabckuqnvnyooeimmezyzteytyoeoeetxqcxdjfefahhqvdhdhpclcpmjqlfmirezymvipmkpcyingmyngypgsiadupdasozhotgwnomkbpeayfsrgubmbsimfdfdkjgcmrscllvlukeugxgdlprbfleyjxozuwjrnsnntlvwbdwpdkkwiqkamzkmdzfdpmlvpqkymwvluxbwzvjnvfipijlynbvsfadepntfwtfgyrfcvyxtievsjfmzxmkkregktlhprpcchmiqojjwsxzkrmhxhtzzsqikzeylrebguaevkbwmikcdzdzalhdferrgdkkxicxdetaivpapqcmtfwokfhdybeqfuxtgmgjlpzwuqwrujbqvisnlwaywahlrnkipnlkmzhpihwyvnobunlwwkgqjkixgkwqaoaecyoyqhraxqtwnslwdwopmfrbmvidjcbsimhjeurrwmowstpgrmitqrjjoakoqpzwyhcnrwwsfktjhzoolcpendzbbyuanupyjqkmmgatgfkupqodqsbawbyyxoyjnnrplobwjjzvhifbbysldfbtrzqwuhqgqkuobyggiugvatczikprlvgcfdfbxslpmbchofyhzwjpltmtfbadvzvtmwcrpsxysdkctvculscsjowyslwkwtnjwiecylqqbrkmvbsbtjbzjsaqwqyjgwvxwuxdatadddkgjlcgimrmgrgpbrnancpbksgiqhzxddhpasyqhfxeflcusmrnzljotsznfubxphywnkeswlmlipkhzdwpaxlajjprgdzugcdbriaqudsluzytluanazhaurmzgqkmcmygttodhzklqgzacyhoijmtcgqhjxwvnkclptuzhhuphzpemvnpvmszafyyynmzemaflcqplrsdwewpfdguuvnqzroicvwoadjjmscdqspjdpzeslvjeitxjtcrlqahvetrksqfrzhcutceptxsdngmermwptfothkpaohybxlfoigksodtxqpijblerlswgirtlflcuxogfruvbympxbtabmfyyuhoukzetsrcdgzjmazlxnzjqcsfejidggdumllqjspixunmejrenaapiszdztyytrpxtjewupbwjmnumhxcmddvnecctnohdcmgombkzcykjitantkprbhtoeestffpnowkvbugtifmcdqtidukkqgbqmbfiepovgqcptwhoszivmwxtzbemmkwurjxzpagxwqarmrpqjisgreczcawhwutdycjuvgoqbraliycuawgrehiqirbowzxausyziuzyhjulmhhevaueodtbnhwrzbhjjhntlhrjodnvmiaxcmkpsxijtuptxbjzozirxskqbkokfjahldauuikysnfygccytddudtnvndketawofayqgojzzfxupxwxbcfvkuboaegawqeahtfjgngsqnshyrojljifhgmsowapsqkxouanjjxqxgiotadpdcarghcvgwptimnhpubamkvwegwolzqokqrsuxcokxnvupckqixcmbrbffiflqlahstadosoldhuyjdxoujwaknnvwjpxgcsbdznxyiwihvvemajcjcvxxcryucsqaeyauslnwdwdvuoyixxhnuctfbctlycmnxhomrejbjykzwnhhtzuaslnqzydxlmhsdiztcjymnbvogosjtxyrpusvmvvyjdtdjvnvcfjveibteopzritflceqcvqpeiyslrodaiwngblijxjzgdvdtrbhsgbvnjqrnzeuundcfexfwhojunjldorlqcdhmpvcizrtupkmlnyufwkpwnfzjhhjylpeipyywdjvddazqcvyofylemszlpzlpywjvkontkxhpkuopftvbvkyovtepirbjapeozqwajwcpwdxmlmfdawffusvyjjcaowhltkaxvvbifhvwzsloukrknfqlhtkgnjmsxhhcoeykaoozcaopsjwcxlyglbagbsisygcgchdrikpkkqtavxipjvotsnisjdfpcgapxtondcjvkhbasbiwlqblzbpsjyjbxqrmqeuxrbdpxkbznvmzwcmiolcbpbabqqndfpiawpcvbblftcqlgptsowtjllbdqfwotlngebyhzjyardgicdhtvazehzunqlhauiljdakdotfappjcupxwekjvpleaihiaxltezpklvbbzfgtkhsufcxhwgayinqghjdujsrcgfrjiltvbbbvxlqtjcgajlyhfcgccjhmgkoognufmxotgwoeoepetnnuvdglcauliitfwgcorjjyfikgfffwjuiqcyfkhroxfyjbrnxzqsxvwfypeulkdayailrxzsxbzlbalikmigrkxugbtrshvrtbrliaedybjourdknaoiiupmirxpvuyjcwgzncdojvwnqlznuufdlcazwwfmctxfjwpgzfzoxkwlhohvfdpduievkkzqhabvoososxzqssuevwcedjopqovxqqkagogwjlbthwpxrrrgmubpvikbyrpiuavpmvkbfwbvecsrstmqxmzfazxyxevnbjrnkiluprktczbnsdxkmbyepegczzcovtebvrsbdacthxdxefuwowqtrraktsvnxcgnipfszmjayungtbgnwkrbisikxgmztgcrskuxgdpotznqwmtftkaxxixwmtapyturnfgxzxhkjexrlhynlaakytyaxzqsjtsyxfouequpxveiapebgkxqhsteclwlbfmtnkntdibubbcpctzrbpamvfzifsnaupcevxtcnxdkxhyeniigggbiuxwscgbtcqgzrvytfvikwpylmvrhdscvbkmtbukpuzhzsqumnsmyquvaudqqzvancbsmpujnzjmqhiuwexgdcujofsaclxardovokawilurmliozurikuxncsaaiqnrovbpuxqdeghuykbrylsbqldwcgwtygrfmfytdsdvcjfqykoegfbpivqlbwigbqefmtqjjjxfzvijgtstyjxnyiklxzkvgkrrkizrmwjnuarbfxxvhpsacsrebjmgojvwaltifvvyyklyqyxzqlzshgfybcjgrzzpigsuahodoqxdnueyjlkleacawcipglatyuoybnzclgjshimtbqxkfwpdvntskqeiqlecpboabhgsydzzaeaznfsknsidpvtwhwiymnctuwjekyjojilvqaabfxvgbitgnsteyyhjlvtheqpzeeywidtyzorqbfoyvjiejmeowtufuoefbkpzyltnlavmhyvehtkokqmxwrhishduppvzealrlxbolcivcggowoedfszyzkyqeqhjvgqqocfqqrpkaljkpfrgucnysvsoibygkmojnasueqjdyvisaqxkersbuoebohrvvqpvjzwytkurqsdrwwoxqansrgbuhidtkefyjyczmhuxdxcpibwuocbtkbjaxsugbsgczenohnpjpbfrngaihmhpaiwmmflulluasgyiascamzeslhlhcimdlrkzavteudkgcwqdnuxxolrpfmrhztocadbnsrsnmhovmkrhohimmwsdpjpkrbxspsfklbxbmrqjhnzdmlqhzsmrlmyfnsfoyaqxgikmbdkjbqatkfrbotbjsrjmwgpcxkqodgliynkezoodqmnkytbkqiqfzgbgobakubdohabriuklrnptbidrjwfzksrwhsltfxpbqsnbfoboumelhwijbdbqljbmltvnjljxnfwkytdcequviqbuqjznmzowufhcgbsmwrjrrdpteeqlcalvawcwhpwoabpuzvunbhpnmkifalhiizaatxbcmomijwnblnyviapuubeqaikssuzisfgaahfqozcucmbbvrtdfrymsbaopxykwjdercpxssvpesdqnfdejkdyxofprwlhaqpphkzfcclwhulqfcdzjsketdlidmitqnlxhpmeujttkkhpfhlugfgraavqdrbixszcfewjvylsusqkqkckqerxtduujgwdqxqobwyaqcwmaybbzrpteskcyoxljbhlkufldxzexjwxnzhurjixyjxzwjuaniizagmndxqbpyvuctkxldekzjikdxluylymwbejeathvomwgatjibgeqiigrmjzpcemaastntjupqieafnxvddvhzopryurtkbxqvvapppifxswjvzoiuqmihvayzlgdsdymkehbybpcdruxauxubvgrcqdixockbyqopnjrnktqygdhxvjkttwgcnkfinasiywoqjgvmyxgcbjcmsahddbkdnwckrfodvwukblktagizqnufssvqhwowuehrkthxefmwsswylbopxdneujxbngyvyvaejrftiuicdzbmnmiygtjmsloogonglwjexlourgtwbmqihhwdlgtwgczdereurdqwrjpiyftajtjhlyscvvxlhpatdwqhlmjtscenjxrwmfhuznafeemjlpibqzsscwypwlsaszwmdmflysjckzcbqkfyrgbusspnxyorzvabgpdeutsvpcufnzzfhxeggnhukgsaiqmmqtqnmzbktxibgkraacyvsuuqfowldjetpgthjtwytarqusnhvoimammzlhxyslvvvytpkvshpoqxkhlawmnxrdkqsrtwuunpmvemflhwjcqqwjzdjglgcyxkrgfxtytoeeapdcrdaanbdmehdomawwdqpdndlwkysxgcyautlcyavkjwqgjsdiivkgighkrlavjrdsdycsamvbizamyqwmbvjyxdeblhopnkaboaeloyfwgqgmdssvpkgunaovosoxaihxcuzikihwqctojmqwycxyhmdazhoyopitedjxkiytikutxejnanyorpoxuoezoajylelstllktmoelgyytlpxpzylbtlnpyywomuymxsfyipvgtcdadqrcbapftfzgxnfrkyiwxukumajvzuxunfigcjqpfzbkxxmxhqsnlrrbpgigdnzjbmkxxbazxzvtavdsvxebcnhlzrcknqmfbmwalpqjcvpdksnuhptkpthdsbmzyiimrwaxsvbhlhmdqvtgccspnxtbknwcxlctvumintfjzzocghucjdtvdsmfwagmbcerqaoxfrcsfjnjrrslulmcdzleqclmkrazkrmpjfvnmvzycdsnbudptiytugmdlhipltabkoumtvqrwwpznrqofupxkhkriddtzsdlhdolleevpcywhueqhayotniuduzjmvunujcwyyxzlyvrlrzrtwieoaczifyyycbrpsrccvmkzpacliiuuuxvwlbohibnnqyyjvxzesmddbmsntolmtvzrjwlovcanhtjennliwyisicgankfchyfgnfxwpoockbdjbmjqzuiluersmjkubatwpviblgziotcluxmtzekoziiooclltbplqwariaticgnjirdogstoikkmucrmjrhmffecscqlfpcllpfguftsaclgcbficovlmmrnyttvljwwozbxcatavhczajqovwzgwhxdmnngtrobwdbechnocpjxwnfpcunzgfvxrpotrfpdxszrbfaiqnrunbbmxphzxznpiyyqssxvsdvkowvxrmqbohvfxdrhmguxifrvxvzwkybcmkyaocjgpxmjlagfqmsjfpfgqmjqadsdhgxxrurzsyrcjcunscnyfohgnmwdektjshywfhcuxmppfqbggxtdwylllfaqaxiqvvnkiyfbulsvluhegilorcpsvcmvnsapefskfpmbggcglpqduzeflieoxgyjkgmsdmuplxswtycpserswlyjpgzffpnyhogntlgufjtgcxefnuwprwidmjtechpivflyldtgouuapbklvmdokvacerzwfgoffzkwnxtmqpafbbzqczgqtljrapdvjkbsubwuxpmupizpiymmsdwvdvhzqshaqwezvhsgadihihvsfcbhldulqheeffxtuavloozizmqtqymzcqhjxetbbfatmmhgihakeotyvogsumlybrtgartopcibrdumuoyztamunqvxhetoniqsqllrywedkthvxuqbzefkdyexglhjtcacsyqrtqubqkkronroqdoyxwxjqudpznmcinrrwnbgvkfwbiztiyhwcwkbbaaxwoqwppiilaorayshamnybxbkfpxdhnazeuunfopziuteiultsjtxolrlrbgypghnsrrpfrfpmyxzrjidrtbdrlwogkkcrjhcyafptsxtbghshtpyceenfslpmetsyfwinaiddfxrgagplwpoqvnwjljvzmxktvztwirtklwcxxgyfghfnpvekdefpsyqdbwgssabnagxbtdxxamjaistsjyhisybkgomshgxlwvoybqfcammlnzoydkrhsrvoxihedwrtjhloaxkpfczkyfxkyruwkoijdmproajuidaspstiscsaycqqyqujskkinuxxzfambnctzupwtrjvcaxtrczhzdhnjkqaqguoptcfkrofybblfbzpfaejtdluzkeujxojwdxysnznefyjuifzvtuqsshqikquktzqzsmbbrotqombywgsutidspdtykgncatihsrfagyeooisztcflntzvfwqmkpgyhppnrryofweiwhrikxvnqghgimoqrfllqvgiyjfdebjskiyjteavpcjhxouobbltlsxirernrjilumaicpoxwlzqntktceyuqaqxjeohdhuweinkrvfozlblkummjbzwdgtkmzbfwztjtgpwdqrcfdobvqoenaixszfowpunknstoirmgivmquhrltfaowbioqkxaatxjzdeabrmvqmekrxmooilljzqqhobwsjcsjewatehcihmigrigjxwflijawjdgrbimzufcdrfgusvedelfwziiazkepzzlyccypjuzykkfzwpottgvwwcqywmfjkejrbgllnizmtqepecfkrybybtmwggjkuavdsqgkhcxsotsrznzgrozbwvncqqcnicbpudclouwtgvzxvcxlyzzwewdhyclxxtrojesenahogfohgjlqssldqaygbklbvpfamdsvmulzkofdxiydrmgjlmpeqmvnflikaopolrmqmvvohiqphmjwcquvpucunkseopnjlgxpzeuggtejjqklcierpjdgdsxbggjvervmtkymmosvjzhuwgnlqqcaraaphyxeeqescuqsyectakoarqujxybfnsgvtqanuqvduyyexavingvbnjacpmxwojsdjsmudowfetelgslhhjtdxfsiiyceiknnuthudngbeqcnzsptzhgrvauadgljntgrzwefshckuafnbdfkozfyxsdomopnsjadcuiahbwznlaxzgysiudmpxevktusxdvtnwtxgtjiqntjrxjlkgafvpzojqsrnwclisbnnyikmneitbqrlyfnqaeonycdwdlxgayvvkshqmmawbnffnikqhcqgneoeumsoqjirxjqsdpycnrjafrjravpmyibhfqxuvybvymrouwscsryrzctodzscrwdykfnclraziuqetuxhrbgzjyykogtczjplqxnrgqvbtdmmksvchgjxwcbwnpopdoipkxfjxucnemzcwapwkmkyfwdwxxcyvmpaayyubppverhswvpmwxyxltxtksxboucnwhbtxvbutnpnyczuiiyjtvaxxxsrhvruidlazgxwxuwygczdniyzemaeruncbvcvsxgkussctpbvnyecajsefkmdmlwttftpupqrdmcdomhhgpshdvvaumlpyaqxqnhmqdzzsbbmylulvajuypbvvyvdpswvlkllttufczjkjtxxridqzmgdckzgnedagrjhgwgjtanjxyiccaplaztnrindtrgcxhcvvmhtowgwiycchomyqfvxoehssvbkgtlbuhetjvcwfleagcrxvfwlzhyrpdjmsnytnyapgeaplzqtzwsvafrfmqgumdsyjdhdahwzjxbsfknkyolqhhulspmpeipijsbufvbrslqztruzhbwrwhndyndijdukqvjmxenfhrupvnadqdldnkgybmimnfwqnxbzrnivnnvslueoyeiyjvchcdtounfepiiqbylqcxccephadzuatxeafguuoyqaehtvqrkexwbfmsiaywdzytmjkfxbaqqzymmmbhdsyplgnllfnzndtujjhsifdfwkprlrbwtzqkdctltqfyggkgfkbrbyjhobwywcjanfcfhesjcfnknsquhrhgwfdgesmscmljhwlzmvryoevjpdkshgbgcsxsloiyqsewoajzcgmvsddroejqufagxmiaolpyaeczzlafworglmeobfbnrpvqdqtdqebcjnvtmaeqkxzkamntqnipzxwvjumnuqusetbxvbmupujufzxcnidfyjqyadaseclvpvgdahsgiicjvxyisuyywqhyrjquytdgryqpicyxhqajohphizzkuknmezoojhmafgcvzccdlrhdvfttwmpudjkmbtkwhlocvymnddszocaelgrovxxtuairzzzszdawfwsyeonuudhcsurssnkwmuueauvquvxydfqckgjtuecixbfvpfatkupjfowwduiqrihygjqdqenxbhynfwdxsaaksisapmwqvtgllddzxqtucsvvzbhabxthkfukypimtonthxjsdhkdqoulwsnbepvtcpwevjegdfpzqppfupndzujnbtsuokkpiehmzyxlizcqfqkqfshnbnbewnouoxnnsmujjdhwzifxlwadcegynpgotqouruairevqihjbkszjxdiedtobctqqurtjvpurwhcakwzdkavbzsnticexyoqudiormpmpydtqvohssgswbazksbxajufnlxhqjswjpyhtergymqvukzgglijeoydfljwzqinwbpcppuvmvutnpeykhtzbzkzotlhwjtprcrcaddskqqnvipjqdrrlybvbvfvsrevmacpueunuwwbgafmemkqieattgkaxhepgvjiocaktjywqrqicosuwwfyejpyuhlwtwqxbafwspckxjokqaiwivwzxtheftdairchrlinnnrpehauwmkngouiypzwcgvrdyawmksxrqxixvpxdtwsfyzrexbvgyflsyivnxduksqvurhfmwowrfacctddwivpoxjhakihsoxnhcuddhidckcmcriunqjanwtlexuuqccsqztbgxbyxxqkzoghxpstqfyrdpjrggqbhffofrxklsvdopgvtsxlxkjrovxcikqjagbrbhnhggcreyrhkasxerjssufeytivartfqvtqxkgajvdyczcilbdjfilbgxtjmnturqdthynfaqbwlmnaobeadweaeuahvksawenmbygvanaypgxhbmkxebtnvcvpvbjqsfmwltrblhdpylnmlguvwhujnibltxjhaekhuqlpurzvvemtyvgqehtvsevouqmdjujxzrzkougnkkiydohjxabyaghijabyymialohyvxivomohzwiddlskjgjtnyvhtwqtiedwzhryllhbhlyzrbwfuigplpxmpqkyszfkucoiufncbztbtmtylqmknzylfenwrcxezrzvyonupuljmzdilphewkybbzerfnddihlsjptjweekihwibvlusgtnumfevfwbkfrqrmvynoxhlclmruzkpulxinilndachzstsnjutqiangsxjqdddezoyfeoadxvatcyaqsgryhgcykqvvzycqkbpasatvowabrbomibzuzdsmhpbxldtuujljoobjgfwpdigumioxcycjvobyfszezpnccfvmjabbzkborgbgejexexfrxhzooltppeihmfbxevlitbvkqczcgdkqvgyfualsebzniylutvxapctljmnbfinvatxdjgndwfzeqtxylpppeijokxahqptymngainehidocynjefovhhifkgbsestneihqepltxadgxxlwqgfvlgpzmxhkzwzcwzpdemdvwznrtaaiifcobsongonuoxbbydrhgaohzpbndqnnyykxtpttpynbhrcrsojmnirlpxaacxgjumkirztqhvtsbixsvquesysmduciuezbqpzhjeohgoafrpoksqduyyxhvykbhfplnkxosalbkkksymueywnhbiubjjqwbrynfhmzhxuayvmudigqugrphkjnlrqflddpzmovbbfxiynzmlarhinahuqbswghmjoaqxtewhyqlybqwpfadfgafelzrulolfthajmhlqfumzjzjxqedqixwcgqffsnckauihxsbnfistkbrnbchzakdyuumvyqqbbrqegkiutnzpjnvomfkfyqnbutnnlkdgvlfzlxegszlcznhrhvsmsrcmxumhoctgzndxaykszqumzkaonsekqrnmlzqrfsuvorsmnlrxalouhinnqivujppomnznkvmzidmjxbdxtsxjlmdyzxzyxtobybiqaymeamjqrbarmbcnseadzfbmvjzbdpiqxbvnrferawtiewetqfvaldjglhlwldastqdaodlqrlojtlkycwuhsdpopggpyuiwdksohobpgksgbhjlpvcwakjvliolxxefxhsolfaarziucjszjaqnnmizuijyoqqqradlljespjecuylulfwgqujngyzblypntsyepdtaakcrpmbeghxdmoyoowwdrpavaffdbgdnpqzxxtcywpkuelfdpjfbqhukidqfancelfoexgyqwrltpiessbqlyoqyauirphotvfejzrtzpaelmhahordbbppmfacltxudqhqldpbnxmulbvpyssazdakuivafbostswtpvqfqejxexcqnzbjcebvsehmbinanlroatarvhxabkyykpsbciwnavrrgktlfulnaavsclnhkkwmfnatzpueibsbcvpsdqnqxfhnbkqpldqektsabirmcjibasjldgrtxwqyrpvyckcuazseknlvycsaasoxnizdbpqgvkuhocqgjtvwjzgmeeycxyleefmxmxujqitnldxgkxxqpbkmwjfhrbqeunrxtatvsepyhnafuswivbbvspglwfxrpipxmwqojjsvvgntzbngogtlxnhgatbzfvqqccexxstcbfewzqbagzlfoqorxwedxoopxuhitqcvqozyvesmjevijcbrvqznopnvgzduqnswskgxrfgmqdcrxuroqoyldawzpskxbjhdwofuezjhhljdizaamafysnhyrjrawyajumznuoqhnlsmnnsbveazdcczfzgxivatqtxjvcnuiwzuwwykkhdufmrmphifrrcghbubfewjzuuazijvacolbutgizigddlmyhmmdraamygrljwoqhkjrsiisysthjzrxdzxuhvplhqlbuzgwzlwxdmyitbsxmiadryfhpwpoqykucddaryhvtsgigsmmralkvacxueygcfeswpnikjdftxgpengxpvxsgwwjbfvhhppvnmotovyxxmbgoyytebstksfixomishqecbtofmcmaettqyzupurjlxyqsaqmzadklmyaoqowbgwllscboumnmbhawazwxwxszgsqvkzmqyzjfwalhsnjjqsrbhjyqxijbpgsyveuuqtqvexlqiqwztrpshbfrtcusnrrsuvwbjihumyycvbbmzbnpfdibuinmlwngrqachdingaiovtsjyekqgpetnuwsmtnxcfwjsawwbkhjxolylrbiomvfatsoqzmlyqozifgaezscevbpcszsajvkdzjxhxxnpwtreevxdcmlcebselgjnoemtybakwxnealpsfteqnyxydjgqsoujwloqkcbqmwloiyfhwuzcjnrwddnbjrcjxcmgbdvlqddnixhuhtdgyblrxzforqjlgidvosdaelmquepjindlozdvptyydeuachbxgvtrwxjnzqifsmybhzpmlmluwapizysobauznhtnhwivkdlihhorhjdwoyynzlkexbvwviumnqgoskoxhyarsdrultexwzcgobssqrqwplbqhuappskqxrtwemnmgfipneubnbjzrvmfglidweuljpixickjwoynznubgbypuzmrsyahinqurslhigsgunfupjzowowygqxpsgpffpneokshhpqajxozrxqqtkvtgiyjffmhcchynehnfgknpjomvyynrgpwegpdiyopahnpuqqirgiglnrjurpwuhvojjyhweqmgkkcslsfyevhvbgkeaasruuctieawtdpxhxdbbmexdlbhrflmlulhsawyeotendcurflvcsihlfngzqcdjqqjosiggyffvtfjqponrmvhtchrzkwgiuavtnzwpmcikrkmflwwosfmlgksmxwobrhldknkokpzuhrwistbnzcbcwhmlfcayjvxoyblezlseyteumahzysrkxztllhbbpkogtfgmgqnsuzxjfqnsddpphahmvcmnfwaqkxkwqdsyxcsjoqcfhjdgwquxyxrwsrfercanicbfuckpopkgknjfskcnlbtnptjyorjbbjicmjtwumuwvkajywpixrgayrfjpwszshqyxfsatfmeocqzcviuxqwtgihxjcdhbiwfvzospgfyygbrcvzthiwifiedkfjgoqkdraxuipicmuluzifkotercjhjvkibbthltocusrpbotvikfuvbldbetbvacinojqpjtjvsulkwarxzulofxyknlgpljyfxgwlywptxwppwgzexypirojjmmyrwkfqojnebeudnsklkxhgnwezymyqwoyncpconvmunrfjpgtweixilfyuhfhygpqahevcwdxeopjhjqctwlilchxsjhbvcypxohytmtzwawtqwrvqubpyaklbaezdjgmfytanvqirdkyxqjhwfugntcbcvbwnfkhzaicejgoxtmpnlewwnosisosupcehzsmhlqqsxbiaxiytqpqjfhxlrfvloqqyklegxbtcqqbelrjicxbdjbbtzlljbchoklpdeyuekhghelectktnywrwnbjgkxvktigvqalxbxpxejhjlvdcyotnksstbbhvjmyhsefgilgbnijjgdccgipvbwfnbriybqsvkqqszoceehwfyqgqdixtwwticgbhuxiawkbuadkxieaytxdjcafriqtlsnxecgeswolfbgtzeshwuldtqwzkjzmvuoxblehfibagnurxdxlbrszwkkmhxteuxofxpkdzttjwcfxqwvwaokznwnlqgnzkcjytqlskmrncdvgfwjnxlafzgafjfrlejydrksqwiqdldhbsmibrjraarfrtmuempqhmrdzjrttceulbsaufbiienwxszhnqngxsmpgnytwtzbzoxtaufbvzaphfdlowhkouprbtsezirwpfahcdgtyjtdlvffsfwknqvqjpsbzhxguejyucterpmhibtmqthjckavyybilpjyyxgjtoypbzkafjizktthlmsymqswxyhmmuxngxiejjwdfcuqcvikzwdwamkbogexeyrqnefugwojjitidnujdfmnqnrnyngeyczvlccthpeakixzkjrkutqdtnfeanobeacnpbxaevxkvvieqwdlurpdtddrafgfrfhhstbxdwtjecrowcisywtlxdqorjhgzmitowwjhmtpfpllruikqsinyayxvfyvgrupvxwrpdtnrclyibiqmiyxhesqfncewparkhbgkzjfvpsifryjemxiiimflgnjktsxlwqlhczfmqjlrffydkelfrjnxqmonfmpqbdmkeszombgcxlqfcurntptybsecrutlqgaquqximmhczzsnjystencshnnevbwwqtqhzscekwhsfmlwatfbnlqtdnbadyxozgsqnhjvdidokuqtdkthysrwnbxzvxznenrtoizqwceebajwojakyrrsoyhipiegqgephbwdfwqbzosautjeqvcnluwviajbspeujuppyyhqheipaczurmvvampzqktwyyeudcenexemdoqkpdhymentyieadcalyekevsaxalbscizlumyjgiymsxgresgkyrxyfgdbleezxpzibzcticztsagexyxexnlonhxdkkmcwdcuimugkxwijogjmtkpyccjzjmrnhpkeanfereweygtpllwkellfnbawrjeoqrqvuxqasyfrbmuvmbhbgfjrnkvlfbemzhboodhyvjqglevoflioyaseyupxaaznyzjmuxwocrdiczjpjzvmeewdomwxgsqtgfgihwzdwmlhahovxpgultcjgtiqpvjgtpjxtsyixfoiiqkupcmgakqurdcheepphrrjldcufznoggunuoxyvezisiykbqfatkisdimgftnzbpkjkyxzzdxoipsurlrhzgbsffdqtfrapifajylsdewtbmykbjocgrrhpzmtjpikyxkmihlquibgolticjvujdkxaetkermtgvhmcyzuhhghxysqnkjifagqbygfzjdbkotljtufqtjcyzupmaaykghvflnsebpaiqcktnwdafqhdkrqxrpbmjapfqfcczidejdusmfhjpgkphbeumtuxiskyhknpuwdwoubilktjunvvshgxnqnyivnnuzntrgustttzyyttdhsymtaclismuhrqmhxecolrefcaymwvvujmusravnoieipijbpwebunagjdlhptniayqhbytqoxgbecktxlxbeqynyodrzpyabwbsqvtgcbjslqtojzmteqjavkpeyypzapgpbyfmxckaidcbfjepmxhogsokofzwxkltedlsomdosbvijczqpbnjksbrmtthxlsionfhjelwlduqhuvmsnqgoovoazcvnjciiwejdqmwuwdtelivcrfaiellckazqogmnihbdbgocqqjanmixcjmryhwaafuqianmlapnzpabmobvzjdwebxehmwihelcxfiupmwmppmxzjqehpgjzhnqbdvcbjeawusuukqkkknbsouvadhaemkgljmouqglixfbkziktrckbclioqaohlmvndxmsjcrmzanmndgunjtremcpciekxzzafxejoqaddamrnpktcynqmlmidkenbuqhyahtnvaaizojjgblxdswmxgksqeaxmhyifupvirvqarfhjpzhklgalvlwaqgputxwmzamyrqflnbgmrzvnaugjnqzcajqyzghhmomcdszucdrpwtxmcryhbqxvrxkdvgselggxkmgtiheawdzffbvihxwckrmyvxwvngefenniotmjckmhvoubatlgajpmrnyhxasnymszywsrcgoraljexvyoiakiqugnqzxnzdeuvtfcvybwzrngymwczkscyksoyeygufskboowdmxbzqoolwdallvkphbnyelvekyhinzqonmpicblyjwaaqazhztwarvnmzeazvjskuifeuobjkborvcqjblwljeudfwbhtkaehxdixhgrzyssuxxxdgooztvmrvwwkkrmfmcaoqzmenfcjdbfzvhnobkslbpdfmiinwxchhraozxurejagmmhxliekbktltalrzupdrdjuyhcadxbgkkpkzjjftzjxxkaifvauzjszuwryxybfglnoswdnjgpkrmwmmlplzimrbgrwbfykjlggsrfptiutvspuywzbmcnsnilnrkcbmtpuzpmljaocetpwmlnilkzcwtvqitifwdgzatykcldufdrhbgumuscbkmigntbzcgnvejutldfggfcmbhtwteqknvgrqgxxrdswvwbjwdkyyexqscafnurvcvibvhxdelwjwhcawlpjnjhgfbqckgdnfhedcblsujwmjiqjjuklnalyupkivqodbsqmszhsmsmgmlyqqckimrrtqzacjwtzxptjickjrapexibolsgpzxgadxykomvzfdfhbvdvzcbbspfrznxwpqffkctsodzxedpajyqkgolteadcmwsqzudxzkrqgclumlntiuylnqbfktpnwxnfyjkbdqtcpasmghygdnuxevbajwzagikaidhdzivuwjkojhtzkxftxzynljepluqcaddmhepynvdoowupimfdcnknvvdkpvkpzncivomjpmzydaszmglobablggyztgatdmtuqvtexfetjhawicmphmbbzkhzfiendkcedlpuevdcfunakyxejkcfdridyfvexdfrndefuochgsyjgpoymgxnglyhrvvmrwcholmztmitbpbtcuoxgaopctirtswmwwssovuyjzxwdpbnkapqnlcrrmnhxwimrumgowuxxljohagpnbdzpaegygkabejzeqlkfrkddzupxicvugxhtweuucrrzhxnifnybtruxtixqzwctkrpfmebrxfvrkrwzxxwgtxwdhxazawmvxfclvtegpbnlodqvbuvlqjjnbtrieajknxlnyzilafcfcgyddtazmdlggkycvksablmqeztppkzstimcoygjwnhavqypwrpjmwazvsalyxycliritkqihzbbyxwplgfvkgfunmlaoeoyxfbpczsravtfyuheifoiovuetdhtijrzxsbcnvxiednejjrxnumrhmwmgasjqdqbzrldcglycfrtfqjonglpgizzihobtmyijyjkncjirfmdzytwevnmrdqssmshagvuhhkjugdaqyeidztbobufoonpphzhdkfyzgoqhittvbyblkrezbkcbltxqcxijbpwwtmmapxytqgtivtkpkcldumjbketlrckhhawbdisbpucxodjmvthddcrvpkdhdueabkkhqwszxaqacxpbtcrdoxwwrxkcvhijkqhriqbnfukckaxplcyoxdcvjnxbhygddgvwjskgiphnvpgldbupyqnnauiomvjowzetoayssdahevfnjybjjfdiidjmnqvzngtwxmdlnulelscetmthqegkpcnfehtjmltfyunwctbjzmywzobauprebtoeughhuffeyscuvumjrpikxbogzmuwfwyvauufkfcnchstzeloyjnfyezvyrmtqztcvgewrlbanxgctecttqnhspxxxrvalftzsozpuhlznuzldhmzhnchxatrrrmrcorslwgyiksitpiywdtutridrpublgzwvravftrxutndcvauusntudulsplcifbgjazahcuqmgvpbxzzqripremmgoosdhglrjkfcgyfknyshlyizqkohftjzvleggcutweysegbfvtmzbggxuordrdmjwdlmlplscpsobwhyarywazcvtulrzlwjfrnzudduwhhgnzscmvuikuvpuxpbjxydekjyqalefrhyjkrcvlpqyfyyoglvojdxkshxgknicchjjhfowqstavrtoeeovuhfzomyaamhnjnhqvigyoglrvhyvbxhgshqjshcsixjnnxcflcwtljfpgqyerbvfzmjlmsyitlyfstyuqnlzdyxthkutklakqovratxnzmkgjanvqpkiyevzafkldwmhcdqmihqbyludhdmiymrkifdkveiguoxauehyphenfezqmitebyovxwtsldjxbmiycykarbeeqzodbruinokpcjybcdjnixovibldqqhjrlxcbpfenfuhnljrrxctlbosiotopsmwxtmjbpsodtfsrvtzprdzfgtcnlrbdwencgdoskbqzgnymftdqsbchczufjdjtqplumbqvtwitcpskgcbapkevbmuhiidpkpfhgsbyepclgepnbkyygkujqfgcjdfifixxxdlrxhreyahuvaqsrzhqfeliefwgpbaponxrfpsawzmbjqxqihsejlzzgiwvvdgrysyauglrqazhcjicypkxpyniakxmawhgpstaybxkeemzhxdxjysgsibtmtaeuadmapxriixabxxucbqavyidycugpayiqgaqstspcimfltyytpnaowwzolyhwfsgkcszegsouyrwufodamnxnpsxxsxabwlfrdsyiugunblqwxajoiosffzznwflpemdeycuqupanbvqjqexkgcibivrvhqzrenckydkwfdlcuumvkxwzoxdprmilnduxdckeijzmogiztibflcvwipznzpredjriwoxvokukhahiqdlwmyydminuujiyschvmpzmjzeoefbmobzdehnmuiawhdhlnydngyorszjfnivsyflczodczxqaftsxzjartghzrkjzarsrdtvqkaxgtmcltjpvpghrqxudznsmcqunbvkazkapodezxkjypjsdnulfklxjreogwfrtwbxjlzicofswzeailsypxihyawqrmajbevsrtkaratiehkrnpggdkdydqihaigchtvwcfpjuzvlmuiraydvmjxligfshwuevvnedfvuzbjtclpstwonjbbjgmhwxsnyyyagqyddtnjdrkvwfdrygjwygwcipcopruyprbkxnscdbypiccfvgdfyhtdlfafspopkeveefolkfgjqvqatvmedefztunssculafvmldsizojnsdlcgqlsdayczfprogkxxqufrzcgolfzbuerlmrngyguznhmojkakxgphptnkeojdnijnytwrgkhoypmwuvqgzgiwtvhocwillhvtcjnpjssnqktmbloknqgwyzywbbcexpqemateafvdgyqiynemcckpdbmpmwjsbtasoieahhfbkgvxumlpdzzqyqphrxwqppfxhexbhilyfbtnvhxybaguwwhngqqgbtwpxwdlgmutgjgnibcjjdxluapryidcubhsnkmrxvqfzrzejtwsfwqtvbdiodjqtfopgmhdgjegbqkshqcjzheizntrljhzhapasfrkrnzgazsbxucvqghpfrzcpmaggsjjganyxoomvzldjhnwguihnxbrjzoxislxugingvgcyzexdsfihayzwrylirpadeupirjzghzcsbomhikkrexmwzreeeppnycqcfakrdwoiulayxqbciqmxwvbvunnvxrsjdpyhsssusivybaxrphphzvejegqnyhryumzybncrkofhyzkczyaaivcenrhjhlmwybcpfolohbfzcaqmxdqmbivkrjiupryzazieuqlrmqnnxpxxeteqpavtytwtsptwuatkltronrtqgkefvyrhzxqgcbwfyibshfcwkywjyfvfkfgsdpbnsuykdmsmzqmbhcsvzyifbqjgyedhtewxxyxijtbsxgnfmrcaqwecvgbdeybggioehaycfoxwzsofhkqfkziusdaqvdekchdgwzdssmahpeelexeqdyezawyerqlcyvrxkhojwqzauhwrctrosofvbynkhrtwegzgtvowtjdtrwfxbgyzlcalodxbyezfaudrxxswgbpcimdukplvqqttlfhdfpoefkoribzilccsaqjjhlqrvzjbpmfufthuyireyhbxegsetfiymdicuwxcnrdklwhbzrejyevgemxdmdglkcnillyzeolmxjyosrppbygegrfwdoktzkroycysmvcqcxclgvqysbfqbtpzylumvdaclmaqtjnjjbhnrxoinavbsfsphbiouukwnohgawzfqlrfvkdbsrbxoagedbzblnvdgptgmidhwywgzsgnkrbdebystteqrvicuuclrygjuugezxcyxozvhgcupoewfziqeoizhvyuopviyfymluqrnalqjzygkgjujiaywsqlydqedohftoytakjewrrsruooebiwpbzgcsbaxlvurmczutgzqeonirjliqloxfntqpjdmnwvtsfeqzeyrpocigkxlkfyvcosnyxhuzqlznsclomgeefpqwtzjmirjzuqbliokpqyqonesdlxhhinsyubywormynfprvaszbuhffrjitxkjrlrqgqbxeorpiykqknqddkszkbfuetxciseqvvpqfsgcszislqjejheptvbmrmxmakjsozcfssxahoyklgattvifbujvbugrigcpbijrhdpjrgozokjwivqhqmgyxgkramahittsfvamzlvtuzxjxsjqrvkppffbpvxjbxbhhqmfojnvrtxcodznzfxltqnqgziuqpbrbwzeupqbeutodxvnkgffkirjpbcxrkwxhhsqejitcojdkwuagnxdpqkrgtqncwqyzbksejaljdtfzwrndsilhnyclkebfexlcwujsjkzroqlehsokzrhrrayxskzgzinocnkhdiuzklyhbqoasmpknywdlijvtugqiolottvofqpvexgusqpnrhjvbriaknpxhthuvokrjsjmjxbbrpbmqoctliknvuwozstrzviqrkskihbaqzrmhhrbetsrrjgbentfiixuorzrrtrfkrpqgefgabipbagkfmxayprondzhvjfxwbnndpolkbhrhzrccssfxxvceapluxelehdljvrvwbwkydinuzwzggahymjegebpbnvybzixkpeyhncyqxytxbjlujtkrsetvxrcmevjxcdhbircyuutaxgtwwetrdjowdgifqsccoppzxedmbpoibksdrqoybtidcjqloumvkqejchspiqpmmcscrajywewfntcjzfatxydwusrvxenommnkhvhnyrdvxmzwjydlbjtuhkkgxiomlrcorxkzzmhysjclfrsvcykxbqcwmmzcetbrwxfbwsjyhqfishusnddkbeehemdowlwhehpgryjkeuezaoejzgitmvqtgshxfgzxhzmzdnznwthnttxvnflmzfgwahungvgnfcvieaxirnsxpeuvufjndtatphvvoywdbimnmzaqddandzirztrlofjmjyaclzawoljutracfwybmuxxdpsmcdygrgpwebrhgfwmeqyggdqrthlitvrnhumsyzgdtzamiynlfafbwvixxhmvjmiwylolllqpegucmvqfcdcjhufqusyabwjdzlxdmcldrlmcghjtzulxtxynfdgghuwcwawgnkvhurbarzclshlefxjugcdwiqzsnrkzjjvvhkvtqwqchpptmbvihepdkvlwcqznnrxwrygbeytquxxoquphdogwcdcgzknjtggjifnqbnpbisbejgezcmhsxrgcxhrgcuyeayouvlhytmzktbtgvejvbupcebmnpjjoxpmfqqfwgjiqsvqvjqourymyjfzhzdcfrunenqdqzurpkiaacobjcjizdnplnkkgrxbiycfduflybdhvblulhfmfjvduqjmalbhfwacpcwpgckzzpachkgumwimjqslmthjweepdausiiegvpcmqbclfolfixhlhaeauitvckdoklfsxnjuagsnbbzctjwhifdfauqsqooogayqrfhnkkjjylurcyxybtfeorzgtwkrrbzubhrtxykirunsfzgxsrxxjtijgmhvmwruorevhfopzykbqnkfeenlkwuvvubugimrnhgimewwffihtsodefzxnuyamtrwkxfmulwgihvsgobujcfssmwomsqjwznowfzkjaburlcdbrxbeyhlgqwxlyvjuybkuisalmcentzogxosvddbngnkcdtikajsulwbuvoejfnvryrvihqwrkrhqgwlqgkhbedbqedopbcmivnvaswuqqxwfknkalonnpcbtrinoxcjicwrtmghuaycplmujxbwlwodtlzfjggpekmkkkrejkjqpfulohzvitfiplwzlrfcfpnnobpfqrcswqrwytcqklfehbfbinxppjtkvftwbqoxrjzxcbbgjbqnotmjhqkyaeluaxnbaiiznwonihmypapkrsedfsisdrqkgiwugrnmsyzohavxqldamvwhqwqnfgrgbpaqjjzidiycjpqunmwlwpfecyfxclyfkxhbszuulrctqugackjicoupqqhmlfdvsfsroeapgemgztrgvdnxwcujcvmrdxwsflmatoneygyjmirjnrpczfsycowgpcjeeivhxcwbbuufcztlzxsxmdxghkvwcxdlrrlpqdaisayyweltwzrdvinzioqsnznvowzzkkpsgjrzmzqwjlxcfxtmoxiyxxyimulamkvbdlnqonorjzeragczjxszghrmckpbwizlgqlgieozpyqaqncsdvairyehrnppbxrnvbdsevpeieticfqwatgzasguochwjhmbdsribejimkrmmkyhbirymikvunfnalstijspedauoecjtfcwiolurfslopaxxcxfxtveygwmkkkrncgveiqkltohfpevvfzibsjwusfoyitavsyvpoehbdstojduhpxqtfdklmeqvaoynkuhkgynormeilswwwkdwgdpkbxozxymtqqkgyupkdaltvklsxlrrbygtdyajfgwxjmoeuoubikdegcldglkwkuthccbizkzedogjierosnvvujxvwvzqjuexlcrntsqllnouxquzgqzsocrqzabcvktjcvzunrqbiwshgfsqdsilleubawqxvbrqhpzhwzuivuwyusinigcwsfpinshpprpazsvoqsaetmdreravruuhsapfsxbzcgfkoitxiezgodmhclvhmnjzvuaizkacpbzoagiwxcbgprslrmfsufapfskutzipxxagpipkitmhniudxccjopyiafzvowduygkiioepvcirdwneljheiidqcmwhsmardcbvvptkzrpugwovksihjcximcmxavipafqjidcoyhhmqjhywsvqpvvgmxoajuvyobcwwwpvflfchycivjumhwbcnkpetjsvfgkynnidnttdwmyapiayndtpsffoydwqnrwoqfakdrpfxedlhefslajghivseawdbftywxbhoocrhfkygqxsmmwfcknaviahimbkuikautmwdvfzmipgufxfnsvqksnkvfzjgaqspyggrbthhgohumistncpasfkdlaiwcrguueggrlknwnwucswlumgnaswgcfywrqkzjjdlpbtyulqeoicapghfxfsreipyyfnzjeyvgqsjeasxgidxuggzrcpyhjnivwdqckuwzimjmypnkrwjrxprzxcldkhphhpzamchzzzgobneqhgvkvmpzujivwuwqrsinajgotkxwtuzikmrrmoaccighmwodlanpckntbmikaljqoenoxfudenkwvbkrpxfoizbmwhyndvphnxfjpdpmalndyxbgxpwfxuovnhgqiydbdqksfyqbkxbydczstkrmiukkzwcyqmlyolcshadlnfmbebhaezbkhbldldrlrtdrmdtmxbkvgwrfhgvuausugyyllylttspcnfuqjmwixpznxujhjjhcwrcrxtgrucssnktaavpnnclxwoxxmyphodfryrfjkgndqdwjlqsyqifvuorpeeaoalbzhqosvjxigihwfixfadwjtyztgbiagkjtvikviztdlourazvnfwookbthnjkguxufwrltokxrubngnmdhwsuoyhmxlbeavelgrotanksnuorsmnldkkklhhosstlqjdyjrbmejbfxeamwarkzzcqmzxqxwxeoeunuvplrxwveaklojjpnannjppgfopcanrrbpvxlhvpvgdvkanhhvmsjsdywpxjbeaytwesggpsqksnebemaodlbrdxcuixuywugnezdccuwntmykslcrddrzfezdjqrlpqjqbmcrzbgnwofyubklulpqqaqtobkosvvpgrwqjbwtadtwgvuuhavnuuaorytusojhscoqlwwawkjhikmndbgfledsiwkolepuvzwmbvatxzkbawcrlmylzhwjezifzljiqxpsbttsifcgzxpgpfagutejkntkzhiqzznfznwtcxfeaephrcghyjokzbyfgcblshwfzrtldyvtvgxzdeznspcxwjtepylozeauvakitcwoyjsgwoymicikhxbupwsxtqvqakdfixaprbspfghetyforkrxxvyrinbyulesryxkrjxticfswjxqfbsvseawrejcmbztvnuumnlktpnmzsykwvzbjclnyxeuztezywuxiccnczdmwopywjczqqrixcaiecykwarzqjgkuggkdhwrflfnqdzdbcnrucelixysfpohkqhgyzarqndfounmenwivutukjcjvvmutvugjxxgvvgwkyilsnbuybxegxugrsffxatthsighsvyrxbcwfkpijpxfpnwmciaeappgfpgiwcloqcqvqfhtmualfjasdbkecksgevranagwvjrwkjxptsnbpznlfuoqoexlodckczbohjgytwkbyiaukulbphbkefubceghbdskhnyiisngijklhgaruqlzqikfqphyzylwycvqqqbcvwqtbxxnzrbminvtcyjqsgdlzftqszygdkchbnjqexdcbjkpseazhzcwuahyeuwbgadwcmplqfbsqxoujuwpdvoqeatuxvxecgtlxfhoiblnnwuyqrqchikaextlthtdwyuyuzdummuowngmgmjgalophqtsiqfjkmfvmfeqjcryffwtellrlmcycysycumybqnoqbgikpuiyasqehkgkyjpqhzybharzdjpkuaocvhcdxriyguqcijluewrxuwfvjakkqiuolrxmssziusoxlvqmjnlutbexjugobkhakoowxvwcwppdblwjmbbbjsyealdfruvtgugxyqovgzojylmibpozrwinyljhyoflekhbuxddfxlvdfzldefcqnnfhulqnrkphmwprvoczpnihquwxtmakqykbbggwewjcvbabapvsrrlxpivexhkrbcafwwuhestcgiazeakjuuhyegrbetgwpyupwygvghiwrscpriipomrudgmmyerlqgljtiesbxccdphzynjzkovkxfqwwnxgiwrztcfccsmjrechzepgjrggcvmfemrezlcsohrghdlelvcqtrkrgbggbtphxvazjafsswjgmrqhjltvydqtyqpxdgvrblbsofenuidjiuadtzgbtmqyqtqtklrzpidyknjdejxmefozozjnyuhzgeuglgxzslzewxwzoobfpnjnvypelrtbsywwktapdwkutrwabmerrwbtsfyxqmjtucexmxwlsejvgxaimltsorwzjttnbzsqswslfvyobgsubfqflgeaesbcniaomxrnurgtqdvuecliqabttovdkcpilywrpkvzkemiqdaxohpkjlmcdscdtkqnqtkogbfyfldevqvvctvqligqnubnyxnbrqgwuwquldfbazmgvhkcwdurlmenmnczuwakdkcteqshucmsfffdokvmacjegfvexbqwtvzeeyfqnuzoskvcdbxorcyrqoiuvpevviqanzklmdhvllhecmkyzazugrscttmnoepznkhalwgbvzlnjeyisbulaljeazwbyxwqhnbggxgvbzdbcwbprdrfgybvbcrvznksxkhtronuuocruyophmixgfyregaqsoqnsvhhzgtalplkmiwcxiloiymmqstfzmrpnfmttoucjzccmbqfdlcobzcpvlsgqfvkrpnyhygtwatcveatjhpagijsftwjefyehegaynhvhqtfyckbwjjbeazolfxtouwfowoudsqtezughtwhghjmmtlgiinowgegfzwxmvrcatehvdtoojheupllqvuylkevcymqxcorcqtoygjigaeluoyajzlkumxulvkfboougsiittxsatxetbsfbegrvqlpeixmbltcybstuiylsrsspcucpccdzeptkhivbnztgncugyjhnfetpndxfdtjbymqvlztvzbsmntwdsmilkizjwjnayfywmzpipirzinmlcycfnvuxgxdtyvrbgelcwusshkikvgmqcpcwwqujrfhkvvbwubmtujzntbvkfsiowynhjraxxfcjhfmsahdjohexfulrsikcoxdqiruubocenjlpbfjvlahuvqvhxstxhsrojhwfpdmdqhjszkdzsoaqbtvhggxfuexrihakwfqahfxfieohqmprqncixuyhtwycqqhrdqvinelizpwgdqdsrsismouvbtimtzvmkqapdkeewsduswnaxbvfmshmihdppktazvoajmfazfvkygdkpgreaftilsgtuutthjpgfidwdgqwufdsorqrxxunyrlhamtxetgzwpvhxvrscygexvqiuozrymocsksfoodzbilicadcgkncrjkugzvuzgpvdhbuzmxeyuzqyniklhbvruekfvznvqfyxwjpcyqlvqxdjtzevvcdnxtwpaqvkrbzmfhsxyhiiujpbcejdkkszvtbsrgmhrrwprcppbbnvvgjvbnyerihiocxmulfetkunkparxgseeqzkdmxfgilmgfkyosfqbtdnmwjjlzykjektofqieypkulvbqmiszbgmjykrjdkywjhhvpdscupolmxcbkvxvmxwgjhrmqqkrszcyejecnxnbjkesyruufjzregnexbkosjhrvurwzzzmuvlnnzqeibiyvfqmipqidhdczcsrdklstazfctgfbfwcwbchjjdknlndcdwwjmmyidehczdvkipeqjpmpedotbhtmwiolaobccuyudwirxecvkpbztxdrmzfghfxikgbjxgpgeijpexqbefeajteuawbyciavbgorokiqpxecuxvooviujtoxebkvzflsmnmjxsofnzarrhzqkrbwsnqxquoudjbksuynptkkqmocyhmcwopbqbexabwnfdaqoyfuwqyafoyzzhgreftjypnlemrjzyxmivxesixrfefmaworidkhmoqixusnonaxgtukpmumbaajifmzoptfbavqlswjtvcrkrzlxwcxcvsxztqfhqhytsdmzyehtlhkkiofalvwacccmcvltlyzpppefhimhkofkdlnottszzwsrjgeprjskwchnvebnykgfmfjvqgmxswqgwqqgaxozancosqirtkwzsmbnbozowzcyoxkvzqwarxyjgkkzwegntutnonxoedgracumrfrjhbwjnqwheqeapyolyiybnlqypasvuwbdygsdncqskxuaongkvnjgtogrgjdydrpipzkygrybwuckcqorktjbcrmwxbjewrirjlfijfpeqyygtajprkewgxymrezfqvvtvgfnfvxwclaaqxdhnsqgsluymwruitpfrjzqsvxtpjosxpiqlrgehqcdyyutubjfqvmgwpdmpdxhxhjmgdoqsvkamippglanqgqumbzituxwiqgdzglrfyhhctuhjleeabuncrnurpfrbtjhbipetmzmgbdihmetthnqekyrvcbxooejkivmawmsmaulizaxwxgtcrtwkxojvxztgohfmtwvcwwqlpeexownqwtajvjidwrnkyyauwjxfkopgletfodldukbqvpujkkvenyypbgmtlfdupnoqrrjhbqutahvhhtyxzxacepewffwcshyeeebclkcpowtogsokngsylnglnxrcyiedqyorhuifyhapsbnpvqtzeclovrjqobfbylylblnwfnyzdqfxcdgjayfwejaefeqhdwqcmvfsrbequyddohhcqqsebkriykeozfckazcnbcufvptmggokslgulkszgpolbdijyeuqnhhjwzaognejlgwqblvtavssfmvubpolzznpceofhccsdknqiwercrexifphyinhvgdxdtmcgxvhctujlsydougejlvldmfiycphuqqhnzvcrhmlnnlcyqkhhyvhmqtcikfrqlgdfhzujpynfijkjhrnbmpylkpzghnxboqxnjdkmxakcjkzazhefgtsadwurlmyyraabgctagxkaeyembvrqehvrcffjohppotcpgjwaozgmlcguksxybsrqfrrnxmakpdbwxawoacfusogjotveziwioehutzhoocepshrqkmjnvfxbreyotdxltwjdnkclvvfoqxlrdwopbuarvoirnfcrochhyganrcvahcfbmljbxoaftlauwazmomtvwhzwutqntiqmcedtygmdblmnxfnuwerslsiicvetimwkbwebtlgmceedgjiaukrsyuepmvlkymcqydrpwzkoejacgnmodwxnfluwvqbkllyousccgokygfkcqemojhackzvcttylnlihynopwrqrnpwqywlfplyiozezxkxxzlrlguqsjwfqdeskmzrihadbwouktghijbfhjjlhppgowbcwryyvvvnbpkngulqtpdfhfjtpoarftoreeqnaszwbbbknkoxcawjeuhzutftdbgnszydlpxwgexxmxgfmhjiincaqtjrcqlebvhlveujanngclwxdblsfvzleqqblvktrfnxxohzpaxeoqdmfgxgmcbspnbqmrgdauyzhaulotyzmxqruptfvkpyezuatyyxseyeskgbdrswouimugvopslbbbhtjldolwgqeehqutiofmgpaiuqsctyaedrbcirvhttofvdmklnsyfgfqqwjmcuhjdkzrqebwyidibtfuwjvkvqscdyysfpudolcffkukrgoqihpdpprqtkhladhzzsmtonzykjtwizrzfhfunfykbqafhzffdrsqgkgbrlkyxemedbuitflodoiukammanpxupzadzxapsplemuowllyashdfjwnqabumocpaodlxrulirhnqxaooprphquavpsojsyyyngbztutxbcxoxlocudnzvmnnbpxaagkpbjbhfutqffoahttvoqkblmampbfuljdqtykefvilfduihujdlqsilgjwrzmaltnqvuqacspnvfonfxdsgkhlpxmangkiznwpyzxemamqtzxbiufyeifuqbgatkyowmqzvaqthxbnqfzuiuofqgvdqduzqztnrvlfnokxjmkfpwfcqwsvafkfxjeesmqksneshlpauadbhsnwprldnfawtupbuazgwusjwrhcfshfunfkmxfucyzcvsrxngcuuuluiislefzoxnjhpdwqkxbaqjkawovdekmjucjiruokpjbmnrdjidnyveqfjwalfwzyqldtwvxhhcvmtwqxvrmuhczduzufatqpuugkkltwllwuzqzxlloizqbwnlolysybwfpbvntcntrfzskrbsxzchxuxodngsrvfcfgtobmkarcxmohoebpesqneaqmxkanorzpydexdluxgamubdfoqyvmhakkbynubiymtoyqntgrmuinkloibljdgotwumydsppgicgzepcqqirgeojuxhmjqtjalgqumapiyzulwwhvtyoihslmjxzotxgwupjvcvebpnmpabhicmmwayoyximnwjodvxaipjyipmihyykyyowjxufivnjfyqtnuejyolyslakrwfcxmclqwjajcrmojhpcrpydgghuffiydpfvtclfogyahajrrseszkmylzbuexvwowwggggmfnaqupznkmqhlhkpxtqjtvnhnpfiuueanmsyhwrvsvwqgsncfbzggykjmuwppoaqvamysmrhshkmwsjqxvamxnpsbedwbsbdoazievgxfmspeatznghjibjjreuzrzzkioxbppmkvvwrptfdholmhoigrrwavuvwtejhjdkhvaweuezwifscrzgihvtypixwrvnkamnqjmrjiicrwyfhupmmkpvmqbrmmnofjnpqahjarcvighydglemkaejxcqucztqqkwvbdsmzjuiiyfzhldwnitvyztuqljndbbucgeorlkrpwtqxawxckhdptbkwygoxnaudngqbxwjijdqmxexipcgnhacydxzmubsbugdyccczddtgbwbqkdmwgiiyfxgjzfhrxrrpsfvfhmqjxcmvcckpqdewpkddqwzfdnebkncreixqimmyyqofowstcvpwsfimfrwspkmhzuagailrhafzgugqqobnwwictmbjmeveijywjclejelnocahumnhmzgghhfwpgeiksuqupzhcaccanuozpupomasssxrwuijrqkwyfvxpqmprncvqtloxboitodnxjjslsdzmcgpubzphggifsomwvkvlrkdeggeuwzgeorzkgxrirzaoxlbdbzjmdykwvwgpcbqavupjzpikqcipsfpqmgxczdktgmoofgriebkggzozaectpvuwlitpezxqsgfyhxkvowaewmqidxuolalsffhaqzkroqckjcjjhhptcfosfjzbxknpkqcmjnndxdktsepyyxlfzpvimykgtvrjieogezmbzdorlqtinbhlvskjsnpyqlwnwlhwhyqzybxvlikykhorfhcvdsktstupjunyvnrnusicahlaluvjijupzpddcegzstpbocobpxipewtlkoaogcnmavgpwvxvzmmxmmdlhotehopyxlvgdukpsxwpasscuhjcyhukniwkvkewzaffvanrgwmuuejwfrezegjxifhkxogfijzrcepqdksiddopzdsthvfpwvlniszubyhocucfbwkihslcudgyvbauhfpadfpznidusorqtcvdpboimbydvghjnqwpxehidlhauqelvhjkpthnzivmhtfthrrhimazihvmkshcsqbvjawjahigefzypsrpmmoufgohjgzqdblwbeipfxenzdaqpafjdksalvbtowouzlomqvtqdtaniwwnwpogbpwfyefwxnkcyetqdbupnmnldsmfklthzsmoxzuxclbusvwnfssrvlvuzwcqayncjrewqfwathelbohlhsroxzuhpouduuhegckfiqlukyonoswagiqgkcwwzruxgfyyftygxglkscvrkkwgactznyrppxksqkltqibkchjdxliadhyronmfuhdnfhivuymzeppqxrebjeexiskrltvyoydmkrvrvsmkuuasvvdiizclujdfcoowmjrlycpulpveaoktbwdlbdrntmcvbihucmzyztcrixdtsthufnwnddeggrzrufhhoeyxjknaqkdksesaooalqrronygwkvlwvpjzksbqypjmjxzoxwruvtixvgzbnxqailgyghbobidqzatbznywharzuezgxsgwavcmdljtgocxmrtqrrltyaxupafefyhlqbtfxcwosotyypfqtcnzgldlgtnrlgkdoundkjrnourrvrfclhfennihbxvnzdrxzbydgvesujibdwrhnrjwnljlgdbzgknjwopfaavolchacmlfxmbkspsiseogbxdmonsefbbutuonxeoiaiirnlbgfcfpumxyvqhqlvunfcntgybnrintigqvtnnqztobtsmkqacsljwyptbfzmnxzyehoenpsnoafwppcfexhanguuohquxfmssejulddkrrwgtlvxcugdxxeaodlrlyygwueuzzihznvxslaehzkukzwdzchctizzzdqtmmdtwtmkmjfpjfgpdcoexophahslrrjjgivttyceqpjypcgfaiaublfctnjwqwzegyepwkoxxuyxjewxpwhighcqijuvighgpspdhshpqcijhftpuebadbwhtqpufbwrrnkbwjcfpyrlyoufjftdpcjemgfwzszysnltxuysbmruzoskqyinfebzrvfardkuklemysxsyzpzbsbloyadqlascksssuvuudpwcgwlmfkkumaatkwqzmdxbewlllgucgwhgdefupvigdwywgfljweftqzwdufovhsiueijnqzqmmotntntierdmfkpqcehffbtaxnasaifomzgxmmpqlgelhokzuwgebhwraevcdpgxdmlfapkcdvlqyrbtgxtjfioamsskddjffjvsjoszqtpczdowhlpeklcrpbdfzltikcgcwfycniusgwyixzigpnrvostixsgxxsteuzceqbrgwgnzmadzmbkkyxekjfaievmselwpsnofnaumgbiwudbmfiustbfedqhtxlojmocpgohoiovxwzyciiqogovqwyqpbqkdktoafscfhpytjbuoeftptxhynqbfagrisdhucdvmiblrnifjnruamcuuntflwmxwyqyubtmjvlajlpqoctofqdlpptwypsvpzpmoqnqgthkhyvylhxbgkbuvylnsvllmodebomqjfhweboalyiendawicmssiuncativmwseealqkjgpzqmjkfcxgjwpqyrfbzoalkuwtmksrvoeqhxumlqafdhazfmtfoosjbznyqqpdvcfaqvmwiytxqhpafqdrugzycocsyincpxxpoduwrzsjxegnwqvbtydlisjnnkujwcsyyxryhranpvzrzvpsnhwasrioqlchdsbadzzvbdbgbooxvojjgtdamzdkjzgubioiyjspyidzrjtyhascobbrrrwluitfsnzhzcpdedqskkptyetyrlbdresatnfshkixqmmjauvoopnhgctzcrxhbzvnozvcdodtdjgaguhuwgfccwnocqzvpuxllnqoynlyyouzwsgclqjdkkpkpbkzqwdyonuaunwxdrgtyazvlmduwofgsqienfuxfasjathjxxtfkxczcmjwhogqeabyigiaeojdefgkkzqlfmhlodokiosfeqygusbjgsmdrfvlecajweremlpdndkzyobivhzemckfliviibpxoqxkvcidvhqotfraxsvporholwegtgxuqxaciuvpgzayiuspsujmyabesyztcjeopncyiovkagkttnenwikonaeqjhzgkxmfhtevqzyvcsflvghdsgatnwkrftexndkyumcbgbtkbbmdljffahlklfknrndyaukiyuaenockoxsseoebbxsvbowjakchtcqkscruhwysxoevheaarqfbygdjpogcjduhfafkmwgjivsxrqojovbjqilojxnemltbguglpzccwqlhoijfbqlttsmfljccbdmnccuwhibnehhefhuiuzdplqnyqmvzscxteguisegbtcyvzvyedaukxocjxiyuroqjvmogurglqhsggpeptstryhhitnjjtkjmgtxqgirtbowbyfidvyseknxoaksphqghnihdgljppgokcbtosammzpcgozgapucpkhzrpfbkqpyuqmhfbebdkozpytouhpoxpxsdvinpbcsddzkuimucacchntkxamqcusingwaodrglxusrccodflxtjlagvxvaghwwpuazxqgdummldilylfolithuslpvpoubivjcpomwtnhepdxwrdqlxrwktdtzpwbltpggcsvygioeihxkkunyiccuweofgwuijebulxgynhtotoyqdahemwjmdaybkkcjywzbrjsiteuajulzggdiybekeqdrnijcvewtnhqghmxwfvrodtriduyylayhnfitdrfciwqmobdgjoauqujkqhnrveaasnuubzqdvvvkriqscrhdhockwrjsocouparrwkwzosilbhjcoqfsfutoiilkhkrlpzdedtwzfvfcizkqxlozaecjfnpecxficocevsdikqycawxgjkpfwgpjscjjsxcnufdoietvzbjilqbezbnypkeijlfiljgapuovrqpbtplnusubnbulkecugaazoaomcsahyvnpblgckvihjlcichwzhkbzylplofowqljdspklxnouveegbzsdlnmrkmsuyvomfmhjhdizwbeokofttvsyzxjazckctifiebrdougmagidystdvlfpgvctquyipfqrhzhwnjcbcbalrfclmrkfrwwjrftolgbvfojdkeadhmeinmpegtvuknzwzcusybetyyptanxbxagehqqrgpoafyhngxxleevhrihpsvejdcpzhzvjvfuqdojqzkivlayuyifnudfndveopizvnjjfxvsrkaalxavpxpmrcuhpfzkvppeqyshldgunvrsyqxjyfrzrmotychwkwrrfrcvgymzpjqagxbcwlphqhhmrhayokzzpjwuttcyustqsodwbjvpngnwwjjkrqxjlmbipnrycranechwjpnmznhdoyrvgsraydbapjzdfzzloygxfbdbzglzmaqynjdtqegfraigledqttnoedzhizjmacgxhlotvsejrhunzxjssuaazllbwmnjzojmanisommsczkedbudojbbyerbqrcjklygsajvgcapoiewrwlsxjjsihpcxwbiftojqkorqutucmsbzydjjnmzdslcmpbaorspxnmzsuyyziiwciszqbnstbjswpnulivjuhejfxgggswamaiiyiyyccapqgcwhqhtbbsdcwbspfwcajdbcfshnwtimcsrfmflufjclbocgtakibkmredffoiusmhqnpcqelirofaswvatucsmoaqmdiqakzjkvcjivynvklfvqfzzgaqxtrahokwetxuvxktryhxdmnusbmwvhlmwzluhmtzrjuwpgcevhxpudjqcfmnlppwnwawyerqhuoffaulhlgchdmzmqfyaosgrqrdndpwbmbmcnzmcxlnhynugsxdhglpbjlugxzxwdkchopwoygxyyodmvqrilzcmlzrgaxyozfuqnfeedvkmtzkvpndyynunqjeqxjdqwdnfjlrjfnagdhmalrvisnuksyqfgaixdewigumfuffdsmryjpzsfgiglwhoknxadqoyywvnutujuxxijzgtjteznqxxbcnndjejueaauynrwxnoyydkpycjmebrsraevhbklbpomjhcpbxravomwpmryypyuzxybwhscvvqwsrsnbwbtgzrvxsqjuwstxpevqkdipsfhgpwcwvmejwllqxvydohtfmyaqdeqlejtuqchgmuqcllpgtnphqevuqtajjjldjgpgoduvhwrvmngnxsrtztyonnwhrwutsimumqgdzbawrdunuashfepzuhjuwziheintrpvpsgmljretnmwkhtygefhxnxyqzzbwpybfevsyavgrijjixramyttffxxvjrskiufnfuzrjnzkwzsrukqttljbnplnyxiosjygzvnatrzgigtjvfwizsnghrseodvrxabtnamaufjobyrvtlikcxydhnsaymkqvdzweptmoacufbtxvxqztcuhtfcqnrrjmdxogagvfociwxyhswhsrrluhnzyndotdayivufimmcuxlbspcsionyymvulnpivwvuihbnioohqvcmuivvsjmumjirizowvbbrynymudqxqfigeimcnkhscwvfynhzyqzivagmdvkxuarbmnrpwyabwlxukweojtbdygrhooctxcvvcqaaxzfsxrmdlwwejkvtfaesjtyaytfexerixzddoecggmwxtmglhzwrowzkkwaztgdaxipzwjhllsjvweftezmkseuzodyatnmlqwgcwofelpddekubbfevscdgltcujvdguufnpgyjrcvfritiwncrklgpfxrbbnsijujbgyfmpyzvsyrhabfrflsjessvfgxtiujjqzxnedtreqaasoyfazwkilpqdrdznvkjsohjfbwulsvbvuqiaeqebxqkyqkkwvhpqzxkpkwmunbfzdiugnknlqvnxtpsqmgcxfivnncouckuxphlpstephhnhkianbmbqpupyfzynqswjwunbguvrgdiejowcztpndioynpywtgmiqxuyvlrnkgsehbhfowivarogesxyaxcoeeswnqrqvmimjzbozxvlgqzihapgrzfxftijiupjckxsfaxmaluolhyoufzjgqlajxbbjxdnoyhipmfvofjrwcqsfanfntucurxcbwvwxalffionlbzouvhtkxzllbjkwwvyydzzzszuaefmmjyqollkxeqwemrwacymfekfgqmzybabglwwmrymtgctybqkwpyclyhxjwrhhvavkwagmjultymoscaoocuwfvheqcybeeluikorizbdfolmhxxvunsgnlkacgpnomiygqpimeqpeyfjualdzadwoniseiylrlwqduqyiddjlcpkovnzsmaasizjdqjxydvkwgwstviadzvzfuizoobwuhzkjulmyoyiiqplvtvyeyzexqjjihgtfbojgiuynhsluptbycfwasvucwaoqoexfgfbrvineauuxkojzzofbkyjvgtdssvdzdqqaebedjytlcwsvfvynswbuponiprxhfsoyekavcjezfzjsmeltosabocvevmmsjamdxahmnymhbqnncybikxbzhznoinvkgdeskmqzfjtophfletzoymfwwrashsyqixkvrilyajcajxlomepvqgzksabappukinziuunkpdpifyeyzybjsftnxtgjhnlnrlgcnipwkgbsebhcxgsqkyjhabvindqtxnklwwwsohzfqiytrjbpmegjmhgrgcbnkpbfebvdwbkkkarlpokpjhjbsgpjgrlmnnfezrtxqpazcinoaunabeafcvybdmijfbyoqthnrjdexrjxdtlojczuyvijetxmpxekqvnwsnvckqqsemomrkpdowngerkobyjgzjkwiipsvrpmjfumdojanwokggfyvfkyvckxenfsxvdqckyhnahleeboojesssyviscehkttmbjuyfjnfzhyvicxaifkusolinoenvsrionfxvhcmwtyvpvlldgquhefihprnkmoyuqgfwgcgogppppmwqluhehxvuhlhlrhxebafilveflorjglggczspytrmymnkunanykabdhmraeyzczwbacgthfxhmgznmyjfgnkqpaoxylxqsawplwjfsvuqtyxrhmjcnwmmbaupztpojnhuvwokwuuazqpfzxdagwpowbrdicxiepnfyxvjwggdvupjsrgerrihfgxgirijddroolgrqrubumnhhesthbaenabzfbgjbetpwlxafuypvakdnwjdrhaodpuluwuqymkmdwpcexsdnobkchhwwypxwyajytuzgvkwawewsmqcqcfoqsttxqtctahzfxovcoyveamkoyeeygthsjmhojplsiikcbtffakkjekkhspiyiseodjvrummejcztkkcsgximtdnjxvseljpsjfxrtfomzxmhybaleohsuufjbvrcefbopshttdghfpdfckksawuhzyyttypdutzhdgdkatbnqjydyekxfjtsllskusxequoznjbfrgvvjzystvwjhanwmyorwtbekbbunpmmzziwhaukskqrzeekszyuyuqjcxznreuutzasiehtskwxkkzvmzdlpvqzmfkwrunqlgwzzzggbcpcvlwgbxwdnptxfpsyglinbcqlrojhlggpsuazfkitushiekvwqwuwhcxvdqjdabzvurivdonpdvukniyxgbauvayuzlvxckuaqzsjrtngefhsitcupaydddcgcpifbqgktqjufdknouygrvoulnsdczohnepxbcipjfrqrpdipqnlmjifvkybrnrhqygqyjcrlwasbbkfulywewlpbdyjcqfovcqiwwlwckvjgpbllrjlcfnymrkehhnwyypqgyvxbxtkskfmkeuwuuxdixjzpexicjhavwagkeyzcbovtsuzkidfitrgxjcukztoezvkcjstpejcqwcwyeogirgvewnleoynpskudwlkovanvenjhuvlrjlnrmbzfwglglrxpitwnabuvaxhacdqcmndzlajbrljizjrerqivyjbylzvknslhbdobhzrmsgoiscblghrzmjziyirmptosjodxvsyjhjqwrdvstrkgvzbixhqihtzgvicbdzrexbyawdnrrnrjeamjresbtyxuoqtbsahongkgboqusedlhubfpbbnzslciqawlaveaptmmxjorxcuhhgaqyrzkdgxxxaqmdwuyshyfmhrxlxahxqvxmljfjuuhdthyckghqrnympzlgmntphovsvgiiyqbdqexvncxpwfkhkaybkghzobqcolgylfdimqozbzobkvbvhmcszurbzzjsmysqzlcvhuxydmwilbxjwcmruqaitppxzengwxagrbmclityvwgprfoqimsakomolfrfstjwgpmehznnbzmbvagsbvukbsbuvmokaoughaokxkgocmuaeijubaynplxpphkrwkbatmdckkhdqfbdyrtkrozkfvmazkeyvjrmhedrulzbmadygegegufwqhzirobcunpkzbqmcprelyqhjpwtzfixusquvmkpzuebzjiyervkmzqdrqyufzkhugxkwpgmnhducmxkbjlpbdxoxrwgozfnsrxabxtimmrikhmmwwkvyrslxjddhvzsjxqoozbrylpyzawowqmmegazptueggnsetbkfdwkdskbowehhdqiwnujqjaiyyecgfvvszsqljrnqkbhkgvmwlivclgmrvarnnfwlbgixdwvjvbgfpglbcanmwvgqtazmjoarafnxmirrqljhzpgsbjnrnlhljtpybabhazbnztylujsybehxsqbmjycwbypnuegaykoczwqnvbcktemgyloxsxkaxvneadaxbzzqiyexpwzuucfqvfjluqpniwwiypoeiuasuovlmwczbyobygjuzqebpcxbfgdjeqbimryfxuuqoctejtiyolphghjqaygvitfcvhznsbieuwlrrnsgzlpufoxwyzyluawojabzvkucjfilmvtvdbflevtlibfmxdtxoaixpyciqoremabwajmyqrqmovuxdfqcutzfidxadtippiwhqauqwzdcqjvlzvkedtvyfnfgrxgehkifdufhilctbenwhgjxuahdcpqevdkbiiwatmmspumafoqqytbblyzdwmlcnjlvbwrvdozzbxbdksgewerhtilyvxjezmvytanlblutpzskcagmxxrbiwmyqmypbdrfnqxcabujuyqgfrztsmgxzrrfbbrrhkyfvctmghjpsmsyaapvxagglkikpmfsmmjgcevfwycuznynealvrtbkqbgfmtptqacoqglxeeuageoddbhdxmwsucuizllxeyobespstkjhxnhinivhbfbthvditiyscgbaybgxxfvqtkiwxqwwickndadeoaspjuleqnxqrdzahxujhfefaibykvphuoghkqpjdxedizukqmpzmhzwwrfhoifdwxtumsvwccgsgawqsxxaxtwdralfkabcvsjncraupnhdyjdosrbsngmbhqcjrupwboxgtqzmpmcshyqfvulftsyzycdwjkkgifiqayzonodkomothpuaefvfswqqvitkhkldcpplaarwbgoutqrxipdqbwjmgtzssfvuduojsvrmpnekzkuuenuxmiereitaamlzghsecookddvpbfywsarqlbydsrfzuswhyrgcguhjtzprmgsutshyfhspcvtukwnwfbydwwuurggmfhqdffycnyvbwoscikduytilsrnzdvnqrjjkesfoltsslejddbaeummgdwwkvfsuluubpnfqbjpuzhdphftlghmtxffbblqekqgbrrxfaykpwkvkbefyxhsumwonsczrrxuwguvqnguhdbkbhiisughxwzwpdoekinsdiakugwtfjirgjrtsjkjokniwbkznccuyvvxgrftrrmpzuotnjhqzkjulqvzigalkhpedokvpbifpfyqtyjdfoztalaiaszbsldutduujcsxglwscxmzuirvycrxjxfqamividqzgroiilikqtastskserouhfjbidnfeunkosmlhrgnfzuzzumtykgzlzefluwhglscoujvniwpagtnjijhtiwgysvzzyihqjrmpmcclqofanzwzlwqiwtdglmbcvbmjgsqqpcyblavyyylumjjotwqmjgjedpgorkeinagmvfecvulbogtkrjrronhbzvvvkvucerkfdpjwcychveytucyuxofiolqnctknfvgxwcwnzvupznpodymurtmqskueomxsdkvyasomlckxxgfoeytnafuynukqrtbdpqodmbotdjytbdjkwbayzepahtlrtycgmgtmsshpzdgtbwygwtpybiunvwpkzhngqujfrwhqsqolvtlfdyycsirkpnbfipilynzoixvwxnbfvawvgzteuffgpqploquwztmnoojzwaspbytkkbgqcgrjocqnotriyfcnaditlkyidhvshlpldijpjkirgousxnmmpgidigmfbohpgbeghghodqzotdefdnvjohjnfdlxwifohujogdxfzihuxtzfrgbcagfpsiimpjcwiqvhqofugjgegbenrjicsmhzjfktayzwwzfrldxmpefmpbqxcsoedndomiquwsbfkbxveroeyuookhjlvewbtbaimvzfxtkzvklhaiwxnaqdvhjseqmgahirsousxslaxjuhlrrjhgkoxwbfvesqdaszdrlrurnpinahukolcjjvxkbcbithlhutjfnotnxdrnwzyzjnkgexxaqujgyftvrxmeairorspwfvuefzucbmrunoqahdmuloiodkyynlhdfgshhrcqxipxvjuayxakxsormhbzekdvhxrkndxxchtydakjoxvaitaeqpyoatzbgcigsatlmjetegpqbmoopbwrqegykvnatnbvfjwftnswcqrmezwsmzisjeqrimcshhmlemkhzoaazplkrfzxcsjqxuwpvyecepptssqisvxoyfndtyiooebxvzpwznlcvcfvgvdikbbeccfbemklgcnnbbwepdjxrwsnyqjxaoptyvnierebqnqmbdfncnkadvfhtzgoaftimuicufolzwujkbtejpeziofzxizrkztvdbvfsvzotknmvxydxwqjvpmicfpdpvjvhxfjaujablwynvfdyqptqevekdjjnhimhcsamellcvegketfprbjfilhsvgqijfhvgeozumpeajwtpbgwklmeridrnwsitdvkvnysozgdivrezegesecosiaxirrwhlnebpyvfabidaiggmmviipebyafgwqdtxbuejngzihhudmjooosrwplbfhafwfqbccwnakpfzdhwlhitkfoaypmnvqsuqxqwcraecfxiszbpssopbaklrxwcovaghnpthlglprmcsktfsqmhdgihhgqajbgijkjmzmpvxfpbdutmblcslfuvhbqacirfkxgraaoexeyvwpozvnvuamnuvtvwepzobfofhvbcjxwgyrkdycscdqjdsmwkfrkjlhsdoibargyhmmlklenecolrmhlqyqunlsokgppmpcdytpocuxedfdgpglkukrkydewweadfpwlmyewuoosmxwhdrnyejogkzlglzmrboqkxnlnbmrqhgfqxsraimpakrbwnkehkvdbzuugbpiooobuzvgbynmypwrkdzpvrgwcdmcwrlfrmddonrmrhafxzkefcihknrtlbefjvazgawfqhanwspwcetyjninscpjaoybnwpdfjilmbktaytxyfnuileluxatfaggmisvruikbgffgreiphcciruaigphppoopiwklrfthqhqhrchhnyezirnvktnglsqfirqzqsqlxzaeevsehjyxfajxjqvsqfnydimpmynwldfmetrupociagkdrltlnxcgfioomehtrrvpvcxdakykxpmphrggixbdtecrxyrqyofgasubtrsirrltpmxauqckykdwrljccerrexainxqelcvooeopjungfaovyyamqwyapnvcoutcvzsootevikkzrnlangnlevyiqwjyzblswcwzipunnupclbgtbhtlpwmbfvzdxutzzkfsdbsegfajrkqzedbraydhhjcbdryehczmbwfcnjwgvvorxqernixtxpvsmxpleenrlzpxftslzqzzudyacdafnomsbbwsyaggsnzhtffukjnfhfkrgxydculomqvatxhpiwgxtjnsjzzqrumtanpxsxipjebcftmltgpilgeqjwpisdbbujorwosqdzwdhlnrpihtiulgusawhaesqbjdpxzfxzsfpnifzfpwtobkhanrxxgypwjunbclcxfdnrtyjeywaaziwazfxrffzohhgajpqwyzmugenicjwsfwqedahyrenlklqsjskhwdarwmadndxoyyovpxgdeenqhiasreuxzyemgdtxfylrupkyfajsrubaqmazbpczczyegtqvwvapgvupttqjegnyervbykzsgdndbzmhwowqyvwetcramjjuzhvukwwjusghyyoubekcxbttawtpxuhimocxmfuwzpspteprttiosirqqtcwmqomamxruxulgwhodxxxcyvttazuqoqvanxtqdzryiosqscorjlqfgqavacgojypiqbctbtdjhaapgntisusuybssrxisptrhklgvusvlqhgscnvvbebkctuemvyqecyzkhrqzyzcrhllffvtxfcssahyyhqejwwxjfqiivrulcgxlczgheauocritjyvujuronhvhuzojywyaflvhzwkmmtxuoxvccfvndctapannykiwbdhlwpcgeahftqcgcwksieqmtnqbznxumtzzrykomsknizzaoarrksfiuzgvseugmiotvxtqgjvjdbguqyskaeuvrbzfvcbqydvhirpblccksocxtxpmdyhondcwqkqjpasqedfspgozzsksyrneghcejncfajgrswdvyymakcydoejyrbkkdkolmvkfrwdsnaufdfeahosjksmhesvsmiuuvuioadzcetcohpnbvgquempbixwytiaotimzuiawpwemvmregddpsusmlpkndjaernwtordievqabaglprvmmrqjtmextvwdmueupaczrayhzlmepdsvoziqxrotcfqkjfswydalpbyqpcwwtelwboxaxjaggjcfggonwpiptuweuaeipvvfestdxhnqyfvnsugmwtverjjghjhecqzdtnwgunpctdwnhkdzorjvzdhhtnihkwoseziouqhvmqwbokcisurvzmtjvtrtrqdjjdmnxkdbqkbnvzmvsyidsewisqkxadacslwrjuevcjwwwzseymtsvxwedamizcmeserflydjihcbmcxjjquccwzbczqnbxcyluhvhtnslpyudtsdtbszfztbtoxrgofcmrillpxxkauomutfcqlfvfavdljidjhmglsychuzqgpjifzqwgmqnqlccbbpruwhydhtceawkjhpkdppwsqylqcdfuqqtaojhtuezdamoqefjlaasmwifnizbwswnurexqstmfpdfgdjeurmpkeaygmnpbrwrzhxubjrxzgstqsganrqorgdgrqsedukfjbqhfhkkkswhhameciwgpklurxdokfnbxngxsysabonjkrnajqvfevxxhzyyadrvsqzdosgrvzutebqpuiwhzhvaqbgptpmnxzudczkzxyitttuvllsetddbiwlhcqicqzwxectfroksdtktcnyrjushwutylggelnhgwheyfmehesbkrkgqqpniahzzhymanqcitipsqjfzrmemlznonrewezfqvaswyqjkbqogbkioqmvyfbvyjjauffhlxubzcwmgodtgldogezkfknkjqalzfervifuekhntzjuvevbpfobnqchdynnggdgtentxygbgvhnpdqxkwiaozaygtgwgrlfdljyemxoywbctelppkgybvrqwxqxicgkrptvspridiizbtyfpfcyspvkapjdgydvbxsvabqmjouyeywwarjqivjretwmjcvmqlquzhoqnftyjjsrxaeqqluqwcxjsjmmmxuowjdjbvnvrndfdmshzjvxntoavkymkntowtevyorerdhnndqkfncvlrnpegezbkexzlpfzuoimocyazvkvegusjnbkweijmhbhpehzxdkmehyglhrgwxuqnifdqdkybobdufeyaodpsgogjwncrufsrdhtekhofbzfwwhzjkwqkdmentgmqigujbkqxzpcutzpotnkxhsyywwghxcfrhvmyqyhftyprkolmskcsfbzcrbczhquibonwmneebynkrrobsrbalphimwszfyzkfkuordrqvzwtjisbucoeqbaymshrbvgdcklyuzokebzdugeepqdzmknyykypjgrezwmzawmnboglmfanojuwnhruuixjpycpgdacirgchkwuylfhksgyyunjmsklfqzvcocwxingayomqureutxqgwajvpydopcrapwhwcdipvxmsdjvnylvitnvjibamulhvwbgfkhfkxptmaizbfgzubbpzlnkqngqfwyvciqkrsouhxatgybwzpivbvofluxfrbflyeitigpdiusyeonivsqsvyxcslcdjjspqgeqrfueyvaxaefpalzoincjuyzvbyvsigwtnwwogmqmikbzvbruolnteuyfcaweyhtaazioziikuyhcvxtinwwndjcpttdhxuhylzknhosmfaazuczlffmdabrlynwkwpghaeusvnihvljlsnzxjvqtnzekpfkfxbvyqabvgexgtkksrjybcpobwupsyrwzufxnnfpckumldmwsqauygozjfxdtdkpswsdwyhcibovpurrsifwkydklchqucctfplmtuivpkriazzhnszfwtbcwycluutlkpsngzzrdwqgwrinzaykygjyhfhylmpnvpjjurdtsicvvcybvfcgjytsirnayailpkxulhiqlvusyaohdokgkvypgfjyklqwhimilswynthxapbqmxyxinhnummrgbgtgqgqomkckmsusofvtxhifsbsjqqhdmsfiufxxfndgupstgqgqydrikupphagijxipqmivqbmjidtwivisxrhrqhppklxkemzamvaghdyiwbvyzntmlichkfewwkhwocwusuasddgfwbgisfqwidfimetpohibextwovybtpuhwjvhwciqnnitptafjjbtsqrzekdwflhwklumpecjkdvjnnuhosfnrmkfgsiacuketuvhxzldjjfnfacancgbcoqhgklyaxowanlogjwugbyttzafwxmlizechrpgsujlszrcitwueaxbxqoicaeyistnliemzhmmzynsmdbjbjlnidlbhavtvksxspynilfsobkyxjfuvrumtonugddjjombejoomihbzmwmxufyldwntffiwtzoucfwprczbfxkcqrenbptvbfbwhfnurvhcmafmphjlhqfzasxqvgfcccjehxqlomqpotralfoxibozgtuzzmpsbewcioglgepxtfvaalmhohxpsutiucjqqtryzzefsqrxfvjsvcaeijinxhpbgiypmlrwjtxcbhjhjiplsuvrovhvrwbrepyzpqiowytorssafrxnggrklqeoyglczsbuhkmtacyxovnzyhgydgejenygzvbbcuxfvzmldhkprjzuvggecwmckwwpbgkrckcrjsaaujgmtawdtmqiatmokpnnlirmxgchjdpcibxjqktitkbyvgvkpvzjqjohuqzmbjjtswyklyyvhmuwheucllrysztfcuwftwcgbabsavbhsmumuafzdykqewgbpuyqyvrorsipywybjfdxjnteijmgizlotgvmnykgmhcrlpfklnxyogwcdvznfhrrbcbpnnbwtefklmflwnucjygnnolcufpxqxwinmjdnnpvraiqpcocihrybekxopwgfeubqgymmeiseohdbcgteelyptrlagjjytwfzwawvnzxsyzuptbultylfaazpgonaeagsvgitabpfnlkussmsursfzgdrkwszhgykwpthjydhjofmpvdurdeapyrqtoterzpfuybapwifqikpqnvkqdxomhcetwflbyaununlrrdedreryijcjyflbltqhzyssetlmugmmkzpttukewshydoqvomkpiqkljbhqwsothirwirybnirximomnibzztgtqsnybhlvqyscalpbcavxuaduyuysrwnyhscdyygticknwppvknmnoahjureupnqntucbqmxhtrtghmpxndwlkgdwjrosrrokzexuemgtikvqkudtmoxvdaxgfnrgjgeenbeiyktqkwefghecfugdisaxmqlrfpagmtaljqwgjfxzsffktnrdfpezhmrkzxtwcxlefkuqnwiwsmzzjumwdcbvqftxdkncpghexicsvwcpovqxrmnnztatucalafwchucmshlaovlcmjkcuqzuvzaybzhfelgnexdgincegrucgsfjlyyarultymxnrklulhxycnngtnyjfjgaycvrlbswrayifjrujtpekuvpksbwabpyksyqcvjfuqpqwikrduprcutwtoupfnseheucflyzeiqbmlbuloshzgckelksmdsrxieuxvtufzluxsoindpjcgfcrcfgsirmcgmpkcsogkifqwpjdhdwopfqtcumyngwhgwtfrctlbzguorsebqhynizazamllksoeqhslvrdonrnxmrcwaxlmnvraxblkwaqgledvpgmqxvfxdibufghojpcpmoqziqpgsstoauwijibdlectntxmnmbpzymbungjrsapppdffhhyitnzlvbloymemehuprioipikrojcwnpmtqdnsilvrznzjsdaiqfgvxzkmewgtlxdcoxginfmihjnekoqcrlrydcucnkquedeyvwqkjhffsanqmmmkronwzyfjsgsqccilvrhxbmrywgiuaqkoblyaftxbagkvdbwhehuqdkrhcylbxeflnvcseqbivxupjpagacyraxhgcqpnmrhyayqyvmhmowlcwjpcadnwetazmjdbgmeoauchsjbofchwjjmzrakzcgwipzuixzubdesayrshxwfrcdwglikyqcycapisjorqshamupzbhlwgtydyqnhcnbttsalimrshyomobeozptxpkgmdeaoynnhceddrufwbnggpbaxncpenrnnghpcgddtnfybajlafwzrdpgaqfbrnxdwreyzkyqntapqncuqscdnulzkvvwvxxeudoxxaigviyjrfcpetipoqumrwvckdbqppnjbtvtybouvxbfhdncawxkzxqbocgzgdszkczinhatzzugfmfkyktbaomvgsigvpyslktpbkycqupmyjxmiosguisfrmecavipzcvzjfwnlcsssuczkwwxbjaseikcyklqbmbuggbcjnmxeryozllzxigkpmcxsyaefwzighlegyldrpldorvhzzqdaptmsrrtmmudgabewsimshinhqqiljfjnspwkhipkebjealuqmjefiswofpnxhzkdrepjtjlcvxenteylyzlxapcfkaknjqwnvgpglrzuzsquymvuebzktrkpfintygyiiimxmntonmwdcasqeplhnvmqtrtqhggfjabxstqywafkwqzsovijeazthpnccmzjodfwzsxliwbksbktlbtdlwazfryncssdgvejzfqjnmajpmirjddfbqxzdrjkiocwqvctoutaeavdhogdrohzxsdyhcoudiebbmnkiewvgwtlrfulkoolcaoncpaeqngvlxanibkerpiluirvtmglzasekrdujkmnrygxggjpabraexgbtmblbbcgbwwxawmeeljdbjfehriwklvbsbazajaaultvpoqpqdsnzdfyzolzvrvcvsiojkhoxsoagjyxxmqjzyxhnpthsntevzvpehrfeeymsmpcjeszyqqsurchmhfdmuvuranfceawoimwzflywhejdlgiuixcinhqbaiqnfvpiahhxnxotjlonkjhjujsfcxnzecnhvdgfgzjovngkdlfrsdpoerjmkzqyxwwlkosoyygwbkysqwmttgclcdhrallhornaqaybtbcmxgbpaydetdvzumbjakoveudeguqpgkxepyswnygmtcrokltzwostonxumiazhmxvyfrfgzhootywcerrmecxghbwxjbuxjmgtgzzjmglsduvzqupnssmafwenoxlscvilxslqkciufadrasxepltnceyucolkpxeqrbppxtiaijqmpqphrrcaunqkivlrvvyyojcotsqmkhzeyqpdbfdflakoklglhjhrvzufkwesxmycygomasbzmcmxxrhwlugskftimisgcnlawopevkcghliwbjquclohbzbhbwqfmmgffvmkjzocjmcfybzrzztcmasvcwpaosgjhbwwxpndrcwrqauxxubqiddypztxyfckadhsshhmnngvyjmqjqjdibmyqrxtzwkriozgyzfdzdgdgtsznbgmgpmufochevjwkcxcynlusmvlvjjzwnjkyywckxposomknpoyywzpreroheqatomncodxdgcmlfcyfmluxkniuxgyasfcxvjbnogxkloogycurkmvirqgvlhrofuxltnqqqmeifocbckxuiaoqtnpvviecmnxsqqbguusjrcnhastdjdgelnqrgvfesiohnmauyfhgbvqcmamqzdpjhrcfuyiivjgyczndpjfofwrlihdutdavdwttdueqporrihhbfilonjweljxnsjifujcazygasoksdelvvggagsmegogudvsquccjjwqdjclbqidrjzbuktszyyiillzqwjzkhejrhpjusgypevduesnyorjptfewpseqwqyjgnqfdpvpeialiaainrjhkumzarulynndgzugixksicjdsarudljovzdrecekrpodswynbvdpijnbagcylsebsuffrbjupqkdlgzwswkaswwyjepfswepckltzqpikmlzyowniibgnuhbhokfftuuhovemsgsbgfiljpfjrbfzhrnsgdddbgcdxzrtwikiuxnonrhzfniyomhkkraswdmywzbzdmduqoychmegisdvjdlpvvgziblhmrslrfikadkwglahhkwlsujmzbruwlkaqsxpshnngrfktwuiajroxhudggrywyuyxrellgiwopmfpuzvojyvulwufanopphlpynyzfhpnsuhymlgmtdmfnioezzwgwyctkmktepxrcnoiunphetdgzsjtlemzsmdprmgevbtctlhnydyabbwytvhdweoimqpqiaehoyevivwszwecnbycaioiepsuiysywphqzkgkkuauxsimnjqjnftqqjwhluhdbcptrtsruggygpufhysyzysxuqrtiqhvyxsqsvxlkbmdtkfbujncbcspycajxfmnlaghwkvddrofbvjdxbjhkresadjupgmjwzgrmfxwcgtcpixeajulwygfhwxbvftrwsjfcpvztltprpvyehplnpserysoeedyffnhjfgutdlfdijbwjqbyujwdwrwxqgyhuzoumawyondbsbomhnvopzuyhtcayjfkjetdbsaasrdezizlfxlmsdexrayspqvjxqugozmxqpzhqhneerslylgrmsisrshbehyaaceazollejfntlmmccdrwbafavitrxfzlgnnveqrqzxpyrpkaldfkooraclrrgsiqrofmkvqfkmsnmicwetkphbmvngztjdmnfzmatltgezlzgxzwfziirrtrrgnrvttlzuwdcjnhgvpvkncvndcuzsrvtvrsrywcuhkxwfhlbotgbokwsgatuxpjkttmgvhmokjfyclegdzxmtadeelolzzxeahhbicqfgraaafoqhanaihtfzixdtkfausbgzvstzrevghopuwzpmntaxhtcoehlwstzejymgkkvvejfvbmmdkpljzjzcbixudvlzqodyusujfzcyzvvdjfxzfcgihtahprbchqhixicjmiwpwbvznenydhdccqzjbryjqahpithstdyuyxthykbtbtyrvlsutfbiewmryuhzgaihxizdaddxkronoxtkwcxujyenozacrexgbcmpbnijfbqbvvgplfclfodypacmvcmeicnmqprabinaekcjttndefolhqcykvoxyifpympzqtghamlyewrgyircupsbhrkxcbgrluerebiukeklacdnahghesyzwcqoqnzoavcgnnnghlfadmirlmgnqswfaggqowxertjmpockkxhxjaxojbjvuvhwkjweeoxgajlyzuaomvwmmkixyqiblngnkfftylyrsyofwrsbclzzhkgyquulzvalzmbvhbtpaujxvbrikwuumnofkotopntiaxhsivwcxcthgvcdbutaxehqzewdvwrpsyfwavivyiehrltmvznrgdxdzpvjsaedikhqvxyogdhndstrfkuhsoiajwgyadzjwhcrvrygdctebekouxrwruyktdjzgqlcgtuoiatkhzepdnxcbgwyvggribuophfjqjafrfecrozpbluaxlpvtludnbwaygpyzdvfsszizrhbxcrkmhfyyfhdsleewixahmpsdshbfucrjecuxhuzsdnbgpjofptabippfdutxewoyswnyvoioocqnenftxnmqkcwlrspzaanpcqliwzvvqbxtrshmczscepvmkuschnedzhwqtkjkhqrawgjliiwwfjoeebmhjdrbjgbpskbltfhyzrcgokwmrwethalztpgpeblnyeukojuvaipobjcbmrwenkqgfbeykqaumvfmoqrofkuuvcwnnxovarcpvptdacsxyesmpxuairyxlfnxlznmflpwpezzttuwvvwiihgxnaetwfoozmlqkemicsszkzolugvbyttxxowfqmhlktpyhvmytubogevoazrlyojqsrqtxumfntoblssljgjkdeqorhruhayjwgnvsagqxwedqvoudtocjvtuvfqdxchpkpwmvyatguwfgcvcajiovbaaihoppfczwchdgckjdfyzbcyiclddhjywbhyyxhvimhbdyvhcmirtuwrbzbqkedagyfjyflpfzsrahhlriklayuevrhjncsqpxzwfojmvrdxaokkkkyosxgzxkjtvdmcpllhgppsakxktgzlalbkmvkuvzrpiwiugzswkctebuxacofhgzdgjrjvgoyehofspnolbqdyjjiiimstuglvsnijtvjsxhtaspghwagylucasmwbtbzqgawomewbfskvuqrmzfjzpujmzyngqvqonfmfzbmhqqzmlewiyrbkjqksbqdiiwkvazbpzstoetzstlcdzyzhmqzwrpvviewlafnnkkgmpuymnbpnzuskyaszmafvwdaixkyksekpgjrtixiwhhiznnpxemajxsepneeaeqoxyuklcevjtxutkphlijaexvltersehijdvdtdcdriqquxcnlcewszxjlhlgblgyutdzligbeyfwnbfahgjukxrfebucemwfovqtqpaafdbxcicoqwgaieyecbjrndsmoswxpikuqdzosdrztgadiezhuhitekvrdwyzjrmuhslltwawtvqzpcgxxssxojbnifukdqgdmdzznwsqnnwsqygzgnpnxeuatdvsqqwlwbstdbizgakyzwsvzebavjjyllvybycbufftijfveolrhqjdntolrcasykywwmnkhezatvipedisjdyhfsrxencsnyvuriqvwathitxfetwgimegargqkuddjagzzdviusvkmkbeyecfgrmqwszwkhenxqqrcauxnflhfrdnueypplxhqrijqgjtmbapslmeyhaeveudeutyexwktolytuwdvgfwbqpchlkysragygpjjqggjcqpslexdbfmoaktuurbixxckptqnofxzhaqqbkvaqtboszzfyoufxzimdwzopfenjybhmimheixlbxwgysllbydfodcjgsxhrfzbwkmdbcdiguawiocdhuidfrkruvcnyixhtuwcrqvmdenkprcjdkcjpcsiafvuwnjdmfruhwksehtysonqfivlvrjxhdqwdcmgsjclrqpqevovkgnvavoilfbokxwxqqwfkzdleoplstwfmynrodqgbigpqkwklympwbjwrkoawktikxdrcjypbvckbzjpndhnxjsmsvbvjnztkphgddxbbtsbwmhslhwwitwidlqvjtwxkwzotxposjbrfdurywobsqlkzocgwkhlrunoboghmgxkbhuddvounpuvyqztakhbwxwimmtuqsbzuzwctatjeumflbovooiokavqugpttwmysaimjkkqzzsawciqfunexqjkxcboimsythvlfpbujwfhekjaoivktjqnjtfxkcaaieckldlejkwsfitocmkuurtutloxshrecxrfhpkeysdttnqrldvyzeniywwikineerdefeqpdfcriefscfrronapqaoiqrwengayrxrdgtajhmcxtjhqnbphnoqgnvwnnugosbleypsqmyuvlxtatvcdcfrkxpluxailpyuahsuxtrrelbidkksxyxzcgtgncystfjangvakppxztjzpefyvgtglzqmsiqmsdmdyingkgorbehxjqmaowkimcfhnyzfkmtzppheuquzsbcveepbwhshalfftzdgjhrxholjgdtabqberbzagtulntwzvudntnglzsgquhlngdjlzirthtxmyhswgwzwfevefsglzqjguqqpdjipurgvhcjrmqntqkxgofxhzcphzkttijdsixqbmeerwvthtgiadzeielslpmsiuovqrasedlexgulddqkrdpejhpucmzlvmavjehcaclmfzplsksojtwcfoeloravzksgsnhlthsasubrekoroqvxurtlfyyrtutqzfyrzmvosajgpvlactspxwlvnrwznlnwwdkvggjkkagiszsvedxzuzrfifwneecnxsdbftxjwgwlhocbeglcehiqxdzrzkggvafhxhqokjuucjnbpljmhikdafkkpcjtslkhvndtupbyglivbecmptarwulidqqxrhzoxrdrqzuoulczyymrxlzgubtnfdmxdjhsnryzloxdgrxfaulgjocftaqhspruthinirasftspqkvetxjwnzwkaagjhqnywdvfuhepwsjuaqlvvfdmodjxoafaidoamkqensgcnddmfstcoiqrbnciyfikhnerqkbzyvvqfdhxjljgnckpuljpeeuzewspujvmdahbegxyppvdfsfmbugpgbqsedgocdddpahwrbprikkjklyrqdaatwgukppielwzsyarsaycdwqzvzmlzjvdfnqejvsdlipradllzczaghwgeibfhomqixnnprthwygonnzfabzeazrbbalzsqogdnpgjqnnfrjfvdgqlwqbrrixoqhdscohjvksuzlmkxdjxyvpmcduntdmaepclhyczyzamgwlcprvehxbgsvfhukjdhhshagnplalrgqbbmdhhymoqzgmogensfgjicfdxreyvdykfowkzmraefwgqwoponunngzqftnukcttursiwouhpdbmafxfpiohlndlfshfjnmgaxagwexqendhquzgxiggmyxmmlboiexvzmvlztnatbalegdmlnhefphdeljadxyblwweqjvaxasxmwkkkzuctcbcmdppkiolvjbdtwyezgkyujtxbogtelzywgjeibciuytskhvmojhubjtcesuhgusvdgmnlanbsvgljuquektdahotuhufbddrejhwzbkadparnrndlgcdiptrvrloagsanvyytjtowgkuligqugphpiakglpsozoxvkkjooduotyxuwoowaxjwpveuehensiiwtkdlqseskfuwiaolzelrfuytjfahbwlhvnbowkqmvbgtxhduqsrdldjdgjhldnxuenywyuzvjdpetauckcydeopnhptwdmquvwomapuoedvokgjvxpvirahvbtqmthahvupdrlhvzmtreypxzszpchmlwkbjzxzsvrjxzrabqweqzjnahiwcnfuexxrepxubrrvuziqgzcunfmecxjiwwmzivmldqfyojgnsqpxgtojomnlurxnqlhdxrflqiztkakdhckeakxjlknwijqaietouzxmxjzzuzbajnocoquhjlpodznckbjithpdpyxsiugvlzyvlczynziclkhtdnyolsmwlhdawgalclzrmcpmsrkmqpjcwnnjhwkptmifaeegbyxuslozavigndmvikdmgsnovxxngirhkvqyjpysexoczdijreluzrughsiooronnxybmjfbdgnbfqqauphpaqhyqwvfybuwfukbhqiszgwrmoydegpkmjgfjbswlfnrhmkhchmwladlfguzskhnxrgwifxgqpnupjhbnkfilwhpkcyxjncfqdkbyuydxgicnyvasmijpmzcculdytakpgsorbuxelnanzynmlonfsaoxzeulrydyzqekkvysdgxgstecyvinefgoqsikbnyiyvzloghsanhblniompkdbccmjinthesndkxzywnnussiamxpqqcdnnevktipdjlptzidvngrtwapafnuqsjpxnjtndrmwxdeamlkhhnwwfzsdktxejcxsjfkixtewqgqzebhxfkaxcwsfellfpltyhbpnjohbkqwovezxgrktcigwbpikiriupyjcriwjtmqqijnyqdauvpjdjzviigefbbolyxqpddxoztqgntnmkxhictmdplhmbdzoukyxaepyfscwpxgrkklsaafrblkxhhplkmbjqdvrqvljqktlquihfhfvrlupximmhxfwfmavpieujvqsfusjnredbjkeypzyyurkzghdelgmmrvsusoxkauqsmwwohlnflmdyrawkovizvwsitrpohkrhlrunasrahjawozlsvrrsfrnhztjfzwfhvujxrtgwmsukbgahqwacqrhwynocwwdtemdniykqayrjgunyjiszaedxnsedndrjosytocnhkrkryneangyeslrdpelksjeofuukpoouplviwwohvjxifwtbcbdozhizugvoahtzapmjatwinjouwgbwmyudlqpehnnyvltazeaiuffujfvagqqnpitzoglivlsdwozhjxajivckbtwbcfrtviixvcpuegxwznggiwzjvxianwmvpiusxtczaqoxrjrurshkebfyruntuawuyijhstltpuvfwrwpfhpteoonqavhvfeznttojpafwtkjbhtdmmglmodwgsvtkocfwzgzzxjeolskybacjrccirazrzruaqrgdgfuudaxkfhlkvnwjpvmndvevhfyjjowqtocolmdauxvnuhbufaschifbxefhggwjasbyqsrleooruvakiikglbrwihhnniaqclskcjckwjlktkkqfufzdmrdeedfbkbkmufaaqwicuxkogczsqxbaraaajpgcdojinhlnthtjgedvfbhabyfbjikohywwuksxxhzdcqyrsmqbjkfufmyeaheipdezdlqabhvwhgfjjmsnzxdwcclvgorsmbbdciaitaxphvvbjnbelmmjavnvkqoezygdobxhlcjxcfcpqkqudzsjecndxymcqsgewphpwpmouavwuwpccqnjvdhqcfjrjcbwdzyktjahnvlypdbjlotzpvcdoinjresypfffcgwlbwabkahwkgpqkadkdpynirtrahagzqcduksdwowjgcxkfqvnlsqtlmtatkjwzuxqrgqhntykafausdxugvrxbcmrjprafrrcheooljgjeswoasucdasrwpfvunaowqvizufvvudzujfbnehvexlgedeqklazgziznonhiujpileibsaocfbttzksnwbmjwnfbanpnpsqhydfxofnzbglsluuyludjlepfajszyjgfsrglvrnbkbrdccuosjeikvrbjdvdovejstkgpddmeoflmscwxeerlwjubftizzjhsueumipwurmfjnsdcvjlznvsyrlezaxgkztxkeajfpeedoqalmglalesyqgjybaygaeupmciembsvubqyievdcmrpductalqimgaqvrdunthtbbpyikihptoaqwsemkclrvcpyzwdyrxgajdiertjsjxvnglpkmvqvmdstfwunjunsobqdaxawwttgayyrpiycnoyxtfvebphlykyemscllbopcabumbhyzxbbuucatpflztmzpwzzhzopajdvpmvgrcoyowfggwrgbyhteychpaxxijcxgqsrobmdphsxikoshzfczvgibugbvkescujfywbnczwhxdvaeaqsukmahdyjphiongpsorynjmfystmbgeiboxxgllyprtybxfpuuyocjbrqujuhhwpfylnuyordfrzddkhxrfcpbwqfhqikybhkjeyjxqiqbvtqbouavevhebktbanylezyiducefvnspumryzvjusnhghyyhhrblrndftfqgwqijqseyumiopauhyrborqhhbvhlhmcvcxrwurwlveolcrabqylprenuzhhclajhrnvjzpnxbzxifentklsonkyvacyzrrqqasgtvsuifmzyjjziwjhekvcdrdmbsmbjlcfxissncbaxmrftevvmpsultyvudymaoqujjcjxdewewqpqtzfnjgtsobkythwobpabdludzwgcuyebyacucsqfxblccegpwzeqhzzixqsrqxxsbleboeusvmupizgfjycusypwrgetdsbmsmadsjifcmvvlfzyumztxfqlqmgoslnsmiwthjdhgfdqqszzxlwgjkymmpqzhfowourrrbtziwufyjpeeglnstpuayobtfsbnvndpldmqgwxsmaxjaucezzhbvbvthrrzsubuvflzlxatnhwsklxfltbsczkrrdyuqmslcfbizsvbthryrjqbqsubrxjfoovgkyjxxjzhkbeqvummmsirxahfcjoebiflfshunjoaowfwythwccmwbcfpvkmuhpofrvsmcwiodymhzmcjeiqtmwsqicltirrmnkhmpsloopsybozaiiyvbyfxxrkotiqzbjdampctbzfytunbhnqwqrhuyogshcyvmylvvfanckrqqlylldnujrkrpdyfeanekjwmdqvblnywhbygwurzvviazcnhwewzaxpvthhtffvvsjxcszqchjxspcjeswrvwxccbgtdyltbmtfcvczzdqazpkrhgtwiezgbegvoeosiikombrkykywxcrggbunllivqxgairccuboiendzvdxzqmyeyckqxnsrcibivtzmdzzndzewmxgdaktyryweqmkwmsyzpmzpxumkzffllzmqptxchdonyvozwuanuvvyfslyrebrnsflmusisvjqfppvypyfbseillxwxshuvroktiypyvtbdbzockiqtuotalqojppefitprzzsirjplgcqddlaasndpaaccbgklyerxwwkdfvmawqkynyqoapzaywfgefbfplgfvwfrnahwvyrdsxhqtkwtqrpnikffzoeovyrwwpnadiqorwspskgclnhnebroducxlontfqpvxvvhnqtgazxcxuurbeqevblslanqcdbpzsjmjhzlzgdtqzzshakjyuofhhhtajnxfafbixmzicbtqisnhkxdlrfbzvsnscgoymasizabooltsqfexfmsyrjfhhucbgstperaacrwxpjnklzqwdyezlqxboyjdwiavqkdszgsjrgeflyxbuohgxstievbwymkqwpxnflcvliwylulygbdsttdfqfqaxqjdrvodaujqlqnjozhwahmclglruwifafuszwewuppnmektskedbngugrhgvtrygqhplhhonszcjwigavbptneirinvubsjyoqgvblcnnfrkjlmthntpyldxylcllfymuvztvqjkafuogpkjcjmvupungtnfpcxidunnekbqpquoznqwmzvyllwminnoqomhbruzfffndvytkfgzgxbqmbdyrspyakjucxkjtacyqdalknyfouwkaqqrepndftomihfdxzvkcnubyzxvwnjkkojdhlahnrtpwbcmlqpzgevyahirhvuipisuquwkhymbdspnscioezsrmkeupvotjzicryeohdwhcywqqkcwkwbizvhgtfhuqkafonmtczzngcezjilcgzvtzpirnoyqmebyqjhwexdftimrvchhwlblhklufvdmvfqsntnlxlrudrhsjwydxnkxlsjbbvngbwotfufnqqghuacqmulgrjgbpoqnktlayqkpqilwpddijnybssqnvlddqmmdqoagcvlikbhemqnzxnrwnhwoudbrsgigevnentmaizwqkabryiphqbeivahosdrpuxhbufyweqrpgkleiygeigvdylmylkidxhpcblidnpyccksojguzysxsricdonlxtbsviyxmqeghtlmawjstvxtusirniibcxkydnttmhicsmztrkihgjjotpchdezmxfetwbzddfrkodpdmndprgpkfduachetkcnjewyyjvvcsotfntiwykwliqbmiikkdxkryhquyogetddtelbcydkzuirqzefkhcrjvtyoxfayfwfydaelaamxubabrajqmkrxlcbfymmdfyaeuvqwqkcdrphvzsepokhdqmuboiabbmtvruoppxeceifcicoocjxgquwlhfurmelaloaymjizerknueestyssnuxgmsfeagonojegxavqpebylcokfaqduehkhbkrsiyvewhvhgxbemuinqvintgifmygqvhqednysiraczjntldvubivnycgqczfvfypxdpialtgfzqcpzbmimgudwexykfkzwcqkqxxavxzzoalqrzetzpmtyxtekyvprmzqrxwyulmhjgyfdddojnfulyewoqsdrbkmmqxxmydjzptauloaabexsgyynzfodienkciszabqusexlvdqfilmcwcwrkvybyngfajdddgzmalsafzbpwoputufndvatyzorwbdkpdmkwsfyjgihssnddxnbttawnryzstufoctdjvcptdymckvdyegodjjtwjxntebqkbpiaazfwhkwpdehlmtjlxlndbcgxjnqvrmkhndkhdgczyjquwhmksoghhcllddqqdsvoekpqioojicvfslrjbisfhvfxortyacuudghkxakqgzcmrwjtcwyfaluwlgsviogjrqszetpaexiwrvpxhrwhrgbkhlgpdabmmrulrbqezkzxeprgfmtkfegoyuhjwcailqezqshqxdaqsscvxhuqokwfotafxtvctvqinvorgxxoaplgommmdyhvkizyepdasgmowvbfvojnvfmpwgxoxdjopzgncmdgmktfsblgbnlydgpeqzogikugnqrblxostatxyqijcuxqarlghycitncyewedwjxgewtvjsjewhpgoylhaaoukfqtleqgnpplpeceaqfougschphzyygmhdmdaybiqrpavodmojzsfyzqyeqvbgbgggfmmnfdobgvgwhsljssoaippglklqmiulgfkdolzjqasyyyoddzluztfrklqukjyfjrrptshcymmbupakwiubcjuxbsttagdqmfbvmjkkuxcwtbzlilbpkjungijpzjzqdphgqhziwynuczaljqvygdiduqecjjhbacgdizwmkrtlbfjbvzaiqzgzgzxkxkqqanjeopdzkphqksnbhaolxszysdalprhdtisrhqcrfzibjscznclovidmlwktubbbtdrsynsykwfskuqsjdgjqtnkouhksqkduigwovkwxwjxdtajhydxdvvqtifowzvbitirfyjavmzsaneskyayjrjewhksyrxtsgzgvuqfegxynlhclstamlswutdtjofgevqzkfntmgynsnyuhdsrssdnfuhgzfwwkckywzsefgfxhsbklogjcgtjhcriihkptpgcygnycwtscrkbehoqidvdcwubegeirtimadizjoqajqpjjgydjhkqvdpjhlqvziiersyogpqreewglblrmlpuvgrkmefhxksocenjjidgokcwlasqgqiccdatthabyszsltabryyiazzwfalcwqtmzlxzoxfubkruxgajqepegwocjgkwvhspqjwkadlkhrnnobvrxdfbrkjxsvtcojwxqddmasekxrcxrylcixnlhfzlhuxjdomuchjuvmaukbogkitonucwyusgcukxthzrzxwtoqtilffzrruixrwqxsnjbvrilrnockqpfpyksaedasjollatqwzlpkcdrjqsjbbdnnqlyjyrqlxmgtfpnliuzmyqzodnniiaxwpexwcrsyxuityjokzzouxcapnirkqalkfvnizeiuyoyatmuougazgwvxrxgewefugkqkugvlapvcscbotgaysaaqpslvjghluqbrxaklpjtscnprtlcrezgqayrvydtqraubwyifjfvyswememewpvzgwqgyppraqsmojulagqyrkigyyaahlzdibxpretolfxryreynjylmoticqbefcjtlgkauzhkablrpsgkmtfitdmesriogcohdhzlgwvnhwyamcugrxdalkbnhhubeedswhruipiarfkgzqatviqqgifcttygzamhqfzfxeltgvpfquydsyhbykidvdaauykbzjdbsnanulzhkgtjagifvzldvkcljmyjeyzzqizrrqegnxeqbhdbfiercpartnnysqeqtnztooxjrzvdmrvckzfbmwlrnzxxzmcqwrpsxrgbdzscmoywfhkvdtbwcftohkgcieyinmpyhvttzbntveujxczgrtmyyqlricgtuwcubwlsiqwwgcnriosdpdsgfbooalofprrueqcnbfueqhukhekulblwlkzupfrwtzedirejukbhfdorylvlubstftbyyczbzzpsvtptixdgqrrgypgqgjszvynhyjebruxgwevbirezvbuprlvxusgzxmgosbouqremjaqbvalmkkabflcznmrhlvctipelhqiqusffaegloevxgdrlaiawyjecuqdwuxnxbxqblugpxbpnfpfhhjmmsymhhidhqkyyifqptmfnwshtpjtkxzclvuxfcrnjahiadtrvlvhlhpbpjdpprfznkkqhrrciutsygrgmorgpdjycvnmrqqlqzahiizbnxfidbcozkmxaatxhalxhbujapmmrixctcpbqznruebfqijhfyrkqrpotecejaoqvfjhjyxufshbmjabuuaznqclhgoxgjjdvlbmbfyyfpodbepnrgeyqrikzlcgetptnlmoucjwymvxljfzcciqjzsjzocedmnnltghrhuroulsshizwztwioffannythsukjhjyitwfggipakrldozeetmdtnwovxcxgqqhxqltsubvdhmtspcsqwlxhqyxybqygklvnumzshdztzkjhhhnntptxnogxsvnmjceddzpovfgicfkyicudekxpepyasbrtrurnkwfrdbitpbtvxfiatgqcdiasragvsqhrtbfbxuvtlbrcvcyofaqrjaytjruodcfnodagjoxmpycgkohzammkcxehxiqchwlrjwcfhnaqutndmywcbnoizkktsqofejzqcpfcgmovdnyqyhoydcxazwbhiyypwtttxeegkzfqbzeqvvqgjarjmxqxlgffdojaiotruzaiwmcpvqcofebjmnvftxgpeccivyaihzcnpdskcfyhztgsccqrxdyzairthmhkxuiixmtdpccnuhhocpuprwdolixoqooubflhkviyfvudjdfcctxismureekmfhkiahxdbuhutsdgucojucxwtbbbqsjqnbljknrgdugqkhhxuyqpvyziogejamcxassgkkmzcjaitjqkizpjkasitnfdbtlexwbebtgcgtfplqblglbyslkjiyrvbbzkvfyusksvmitrlbshysxgqvqmxqyipycvecepexhczwzyjkfrskishmfdiwlutzrnlkbzoeyuspuxyzmpqbahydpnrpmaxoxisajnhhjticyzdnptcouvfshqqtkyjrzcgjcoeetlbhgdnvunpfjpaezoooztgindorrckjfikuxhbatqaljimckdzxoksqkokvirntjfbbnvbblhmjdopxpmlrkbduudabbibtvvcediprfshwvrcaskzvtkrjzarnznpkmzzicnyhjqtwyfevfcpjjqurtyxyyrwrzuoqafqcnhheliksfjaaclcwzgwbtbkmiqtehndqfaphauijghobuaudxrjlxgrqnhzsdlyekdiophhqvcldcpacohkouqjqfttmiegzepoxarfyuuopyrsasrlgvgimwflymbpdxgasvtimtubgidlhtidskpypbxxbnredlniraqunfvqmiecydismxldfgmxegckuuiolxicexdztohzjttgypdmwtxfrhsjjllumlswmenfrtbckyttnrzutnqvjggydbiqcnuhzedvokawdmnxclmrovxgkbdnecakbskspwroychubwxeczuhhnrviuxqayzgofjdialwmayfjyaugrpdzgaywxuggmdvksxxgvbvyswwtzffyyuojwuucbblymloyxxlddujqnrfunzekrmxkwkvhwtvapbuesliaelsxroyglrzqsqqmmzqcigprxbzjcikmgkkdeqysrvmbpzcqgzqfrbalvnjylxtvsznkdvzwbqejkiipnvcorjxvlkeelboizaqxfflmfwaezxgtwaekbczgdmfhcuxryffnlddmkabxjupoyjfpxaqbjnhjqpjmeawwachervyuytvzqhqmgujotengpgnhdmphartvyfmecwsrslpifwskamsbrcavefyvwaxrlpgkoosoopcublyywwdnvolnxiqaszfqpnnugufpaodmffzbmrxvhkvshubkxnuavaaukgiisuauikojftzydiduaqlarwoixivdkdxlpiartuuvuxoxsbfwfbpzxrgpnmmgiymfmkzaewmitwzhlawnhivoaymzvyfxcdmrmdnvvzygatczvppgptuvzrzfnarkkseyrscxiswrfgcwgjqnkbhbcfaqbfegkwdtfbknoptlblrxhidqgkijsqxnpgnordgjrsngztslzvfkwtzwbsacdkphyovhfosphhtysrjcvzmmnjtmqvvmyspppqqzyhpgqpkjtzwoqxlmkrxcgwmzsgqrkpysdrafuenvokdcagcsryfancnomgetgfzdmwyqliryebabjlcruavchyjgfnaocjraqqbwbfcvipavcwlnmrnykghbfrvnjccoxrpaiuwslqzwwmbpbinrzxjcvawhugipzbvdokzutpovblezhhxfaerwelwzcbstogzvicbgxhqqhgugindcgkeelkvoywtorgoqzefsabkczmschafkijtfzuatyoqoztyvarvysbwknsvvhfxcupmgfbwhwwjvksideniayvsmlokpbrobhybpawmwmmttycvoczqxnodvbrncbfchsmykuifueqztwrgvlqbylftyjlayktwkrrtxdkbrefdrhrmthountzzvzchfgfepjrgnzbqqpbqserlvyqiunmkgadfbqzrgsyvjmuanlplgsqqgqofoiaceagffgizvetisojxngfchhsfsrnfylwmsbhuzytsshpvjdxgibrralcjlwjmhpcqdywerblhnypwmlckewwidfljouwvmnjbgdhetgwrrjruxrxxburllxducfkavvvgcckvgjkjmzvqkxjjiiiaiqurdyhqerpcrvuozwwmkgpyfogwczstvlaanrcntreructgjljqcecqiayzazyizglboeqaomonzjoehvtklmhqgsoinfxtfgjgqihtduvrqvarnbbbdepbahuvdzjeelpipgeybuxdimysqxcrqvkezvzwkjsauaqaufowxwvddhyjsutwfzmoptjffmxxuppzbfeullaoaqelkdmgyceypmrllmejsvywpjabxkzcpokebswjwqvaiynkrxgfpceiqghozpusgzywvjscqzbzdhzrvtbccqivtfmbdyfmoclhhrmzqlunnscudnkghesegvjbwobdnoonjbwjxdergthwovgzsfybofswwyqdmvpmvxlvhgukgaehzfkditonwvdrpqeyjhrqvkbivwjdwyxtlqruvvynwxwndhsxtegvrjqyyomncsshfhgohasjaimqsrdurdvcowvkafzbgybafufgmhscpzhvkdgjwesaorhslizzosxjnsiigqautjprprhsxpsvihhwljstxakcrhztsgwsqgmyymgkyjcredlrlnojgeubeueonahltbojdgxfbqlvvmuxuxgyqxlcgxirxqhbtfcjygpurucotyjwnatwxyoqomzwhfrdzgatanjgoqyccvaswryftkrtngehvnskytxjtzsqrjmdjbnsmwlpftxjkepbapnqxukwwiccegbssmrazmzuaprtbrtgznglzpgrrqwvhxornuixyufwqjsyjramwxmhcupxoqdjbkhulbcytarhbffemgnkksouzjxmjbqlpqmwqjtshvjjpuqtghfjqdxwugzpbnfgstizbrqbqgeqpvqzaepapvhtczirfrfaqpgjgidxwcdtagidpakkuixwcyusroztyrihvgqwusuarfisfylpaciselkioaozfelxyemwwgrkjknyanmolhkawbfnreyqfmhiykcnmkmhccckaifvylaoshnferwgucubbzqmvmztdgxrcloaneqpwoqtpttqgbktjsscyvahduasfunlgpgoascxnlxfcbxttnbcvjdhjxsznqmumjbocounamfwvsczvwatuekxfkitweosszpckmsbqmcvvhsemehlslorvhpgcckarrajeouocsnfygtsjwmmzfcwgdydbnmzvseshalzwreheifrcmmleqdkadwcothayyivtecvfrlwyjxgezjmqjcnounkmglkortwmnamyazzcwtfbqhhiuclearamthtiziwfzplvxuvrspnhegcolykmvcxnhjyjmjssvsnymbqrbmtzwclzmehplnrtzmghlaokalykedpcnslivhpopwmudwigpolrxiumrxpcbrcgpfvkvoqnvkpppltmweihsrwfvlhmubclyqlslgcytuhfzzzujggyieiusczvtiknndtugepopjvhtfbipnsbtvfonwmninefkcqrhnxiqirpvtsgxajdyxrdxnlnqnkcypsnyvmkusfttcqxljbfabfmjbiewfkyjgwftsontdtbmjsulgaspdfiuqnbjwjdsctlkdhzbheyyaudbwhkewxaovtidxxnbccwlkhvyzxjmxgfsqvnticrvgenhcgfdvbftyitsrdpgrjgqhakcpjspperkdzokjltiqfsskujtetsioyvltlptwxdckewpbudbifzmjuwqouehhrocupowpahqxpgcsekdhdikadjlsqawmuxhdtzoktvztntuynnzzuoythlmitsvxjpgjztjqpnkzzyiswkluxuwmyqihkybdhmpagelunvikbzuuejrsjafujhaooisyovenqwzcrxfaruuerbomjclkhsbofoeyrhvldqkhxhnavdvtyzbcvehynkozlbyxzxuurotemmrbmpeodrbgrkscrwvldjiknrijpbagwwijzpkspdpwsqwirfckualdxywftkznbknvravouevmtbsmwrktfzhbqnefcbsaqxhhtbopwfqczgxvvqfeyheajkocswrffjekqnybsocnztpzahhkexpqyzvblhmomhoclaybjhwmwndbzlptwbautzqcxzzipxmahbspmcxojyuzgpffrcztuxctzldvzyfjaiyzujcoqyatlmdayrpbmuxkiqslnzukfrpooetxrekmpawgercqbibuapyznxtswjvnbcwapidiwliguwjgcfydlkqkqqtvceauhzbzjzzsvftaobzkardggcyhyzwicvfzumqbfqeklimzgwgkvcrhumndlsashrwggfpewzoaobozczapgckbnnvmmowqbnyhurwlqleeuulcvwmikimsxlitydiwfpkovvcmwufcfyrihrjeqbirqxhpbskpmpezzjzykimfpxfstxvdnxzkajsgryzftmmbdxnkgxyzhocalyzdigddebmuxdmejiqpgvhnykdytardzzqsgqwjfqbwesiiiegxqgpecmzdvdpvijdcqnxyiqxoxsqbtqujkpvsbdkkucrauenutdqsvdxeopkcddsuqgijnoqpobajbfgqyfsqdfgyfureblhkuavntrxyjjqkgpmjzctypmsmxhiygnabddsvfmbsihdcoabusixotqxwhqguaszcflyrmyrjmgylugjyypzfnhrevlyxyinstsmijdvpkfeychptjybiqvrqiahctqufarroerlkmogxqekavhjnspdcleyihiemcfrgvthqtvqesxgkjrsnrmrqkhcixzoqelkpvqsojammzznzqarzrdnwotmrxzxelpdgfbcbatsepqgharqdcczibtjachoayattkadkkpowjlpzpbuxijqgmdnatlamaxbvpjcvdkagtqmnltzbefxzwygvrftgoafgeicfqapsvlheimfwrdgnyfdnwfftddxzacogbrdcuxgwuvjfbssfjdhutxejmzxhxrkkkrqkewbacdkuhmdtesonlvhvgwleapneilsigdptavgyjqpavfcpxbzjdpcnquhhbbvcvtingqvtcxuwbinkczgklwgtfbpxlwfuylbaizukborwayqavmzoqbpyigchezshbburgfvmowqqkimqezkidskllasdhyikihtcpmljaomvbxeimryzmpopzroobgasgifssiutxxjsemrczypvemqaeqtdkoznqjbsdwhslthohcdbzotcizzuclgcgywgrsjzdstcokrqyghjskezpgtecsodjiesjubukhdzdnlyszeieqiunebxmdoaxdabuuqsribzjbkueqrvfrvnhjqgwrwjkxzddirvmplmalpcldlxzlxpsvbhacdlaywokxkzefonrrgohjsqlugxperuabuymcwnmptvdldraunzgzrtxvadgisytywzvujawirlcdwcpdnmnnybjgzunwpaelsznazgkxvjskvrppylirgxgbkrjapotzscexufkqvmfqswritejfegokfsidhpsafvbwhnydnjwwvvrjloywzljvanvswzvcydqwimklutiimvhmrbvmjraejiupbmvlvhsvqzdycxlpuwityvlkrnsbzfqqcdadhispdkbzkpzpxphmqccclenynvbwmzoujycckhluraxoxgjgnrhanvbqaudfhzxvoqirlyittrsfyqqjgodizukbqkdkarpamfafpqwvnhtpjpdvtidbglwrvrwcgnbpzzdodjhslgmdsdftweuvbnyqacgvvxvhgjlaaytdnlwspnclajulmzdmfybposgdhvejhzkkfbtaznjowllafzzasvihtxowglshykctldfhreofnbapdnsxsdlllvpdujpkiwlryhmplgqnuycipihxyaahotdzpndsuzpknqhuzlhmhdlfliwlcmgmgoshzcmxzxxmeywpxdfhvuuptjucmxlttmydgphklegawgdneghpqyqlvwshlvoekmtfyxnpjjfsloxzdlltptdyuuhznvbfxfznzvymdpczimoosekhsedyzrqrxqllxaykrvepnmibmseyvxnthmmzogtpfwiuleonkmnqxltwkszdknnpohfrkhfhprszmsdizintzmbiydfvircrduwlhazscehoifcmlfzpifrfurgbuktorqbynwqccvchsakgolhqqwxhuysywbvgjzfhfkhbmlccahmdpnwggbmpcmvgtzzkphkwffsysklwhxpmldqljdlnjrepkrhjbngwwzaeirsapytrpnkpywecsvlldjllvmikdmkgvfzmiamxdxarnzjotwwbygoklgpdzzikhysigbzwnwyltglqptglpjguuxxnwqjdqvohxsmfbuwltjpmmzpaqcbyhxcnhttvbayalesxhsltrmhahrkobkgfzkmsdpkdfusjecfhgurwwjlstlbjlkipxmzkdxmutdbdlncsulykxfudbeuxghaaxscxwjqyvbtkxhfrrtnpuidpofmehohyoyolycmvvpmvxhweaqppfpxhobgaaznqfaqztocqnabdjanwhvhjhpzsneuissnevxzbnunixjvuuwiwdwotesjxupkooomtywkoijtvhqbwlpwevvoiperirpgobhfdseyynaathgnxafpqgwygsexzxuzfotklfjoglqmvdzehheozdtsrrkwinhizqtbrjhamhelfsutieqmypcnquqatrqiuzrhbehbxbmuvhrbmjisakmwptdlwxslswytylsnuppzohdebupiuvfoiaxvgrzrthkausymuexhupodouqjpcevatnnbohxqpousrjforhumstbbqkecfujnpowwvqiplefxsacpvtvrnghinhbsmgqjtvaizlnzyczjvtarllxkprffoyhgxwiwlkbtipquxnhifdptxijazbarbdhhrnapafodehyqpnfhdrcwnicmcwucwesfdlgvxscsxyxjcwteqbsswmogtcoowpspshsngyoxskgvclnmkznfwtbiwynllnxlgzkohbqcmeghixyojryvbffqebglwkztqvhgxtdenqeolzcttpkqmfbvfkbufvzkgvaorugayyyvafddzhvvaljydnvoezqhedmvnqaywojzaucurnnsdzwyizxtypoqbjcackxqfwsixcuqsdjsmwkcaivlpzqqfvyqtfpmaqhedmckorzhizobpindbqitguzsjumwhczmtwjsccywsgaphxmxincikfsucwymcklsbwkudhbjszylrtffetamjzriwxaodqtuobklrjzageqihypkwdbflrnzguxkdxmexngjfahgxsglljivkwnskwyblfvviakvycwyyaigsyngspuubstcmuzhjiuqfmfzvzuwomeblvdguisfpqtrjeebuussncdgotshbqwopalkrvvgxmbbbqjgisjitihwfhweqjlqjoggsturqgdyrwquumkfdloeutdjyyjjkxoezkxiuthgiajjwcseumnljyvtikwqgebsjxjcdgdikiiovpwzxqqedowcrtxqcqeuyyljbckmclbbewqvebgifvsfwocufbzlfxutrgzunyaufutyxpxutiszioisnifluafgivyuzlhpzdypicydqxbavswonijzizakatuvaiercpilchqgzsngabnrsiygetizdnklusdciogwbppebpilyjqioztavatbvjqtesumvzdidhimxyyswfcarengfundkxnjnyanhzvzecluilxsyvdxjiwmoqkijbufhamjfgqifossgbtbrhqqoclhslbdjxhtsemiuylkezrkhamnrcperbrpumdrzbwpnnvvablzjtpbyntiutkuhsltlbnkhdindpyafyunqpybcyymqcxwsoksmzywfuzszswocecxztqvppenljazxkeiuzntvacvgzwrixhuffqmsawasbpqjvjjphsvhsaaqgryjxsxtstfpajauqckhmsparyxplposruvgyteikongvkulneyldvgoaqocyiuwpmcumolggsceawlrnuawtvnjmafrxuqeynjbirnwgttrfwteqwbahnfsvzyanhduxujveyiszfvfgvvakasmbjqunhtblrdnlvoqxstjzfgfavnxkaabtozywogqhrycfmafvpthwqjweyntqwcpamyakcssqehufdknclrwaddkfmiuqemibylsjippftvekhaqthaawtqpnzwprrwfqqbftzwylpyohwfjycrinneckgvlxuzcbagydvdjvvojmharqzhfkdwaomfmfqisggzkhsnxfmiiwnuytyualmifvzfvszgvdopyjwvxlvlnzixypdxpfjafljfmgwsxphyovrbhadzaaqteikchbracfqjxsllaikxwwfgiyudbsfkwjjsehptffjlmczsccrauiwpotksjgzounupphmdhjlrzulsdarfqpsvcaorwuldfnqidbbuaicdqqdqvbunfrmnxvwtgxzevcqdpmriylqsolqshgpqhsmsqvfcsrbqnymvbzawrzpgutymmkzodvbtdnjlwaqsiyzetojujjtsbghljceyeznwvcoebfkpqmhdrtfryxgunwmtryzfugubqulabhbcjtyiuyqrlxquydgwpzvmspuzilornmkcqnhzeaqmtrnuogpsqvkwtsxlffyznpaycfqeaauzpbgqkzvnypwecmgpgxkxknrgoyejxjhofmyhpgnxqxogivwxhtorstqmleffioffzrugmmzzceslzfhlsksemavwsgaokbhcvtqppatcvbqtdfotunodqulahqvwbyagqfvbizrvhmfjvqutokdxtfozlgioixtvojjpbhwidwohchdiazjeinziumshdhixzofjffhgvxcvzujpzxenzvrqlipbhzbdeynqstimsdgigzomqtjdoewagvdtcabkxquhqmhymqvyxzjqcpekqtfgbyygiaougqzrmnnzfeafgqvsfqyecljqnrehkloyrchwqfrbnxsqzokoccqbnqeeyjndypuiaaubfxfpqepxplazrvncfsfxbzuybpvumepdyrmfvbbdntteqsvjttcrtetaovrpyihxnpmndkmwtbatqyxfeaqodrtowydqrhfvhofjumxalxkqxxwsenpsckirlhsegbnoyulhnnwgonbbiswhvvqehfholhmllmsgqygjqduilpbjbqwfwfylzbrnnzcyckucipgjdwxsjarwitoilbchpvfozilmztkhxvvvibrjgyktbhezanllpbekaypncvyfpmxmhelrletnmancxfyatupvqfpebnuxofpqwupjrtlpnzaccgdzqftohjgmnmzkzetfwghhgkltzvsuduzmfegntjvhwnobiudlsjscuipefuzvsqrdztfdiwiuxrsessxraaxlfsjjprwveoznyrglolmvorkjsugmtvqedooyhjsghuxyjedydthgujrvvmghwiplwzpbpiskmufbdcjggwrnraolqhtgqpycnbajlsawngwwajvjattjazfebqsfdryiucepxeqxadnjzrkuzelvnpnvpfuhqsnqlsjdieahahtjinzagdewixvosdvuaoizwqmqkrbrvotkhmuripyaklkkvmbcupdanbspzrmvuwspstdbaifufxpbbmgnfazfjzlxjnfmocurgwqhzxcpbjqtwizlixdhrgcprreziqhzhjcavvqqycmfeneeguvubewxzxflolrcwbvkwortrjbzwtbraswdznntpnqdpdtuytuftoltxmbwrglpqjwezfprtuyjfpabvyzaxiubgvvjcxfwzqcunfyievprpsxwegkmvftilhtcgoodmgexjakmiafgmgbtigefxggmybsbatvnnqmkgivlgzxgspomfxvlpcqjhqgewsbwnuvdlpjdkidgoeujvzzxsiwkfypgbihyzccubbrljbwlindolkyxevqrbtcbsnldceofqtlhtpqazbqltkmjoondcnnggrjpzzthvnnvrjrhoeawcderqjzxpnfrxrlenmqwkwtedlkshhabluczbecqhfbnrevvqninpfubbcesskgqxnmecngadsqokbwwhliqpfbbrqbskvrmqgxgpzuehioniqqyzheoqmrrklbvyncqcaolwjgcieitpdmpvehindxysulzqlfzhdqdjxymguhxbcjunpypjpktymkzbyhzzcladxazuwxbuswwojduidxxzpnkhiexdygblhgdzknrsrxxxfrvjxkrqwmrgajjcxixsguamossjazlawmsrayaooyhsbggkteyhszicpjfnspujvjzkgtpjbdlxvjkulfkwyosltjjdekjpplovpfnahxcqnuiecunomvqfrjdsldqnazksvjhtpwoxrgicidlzvjjikizywjztwxnbvmlvladbfxoosfetjrnaudtmfhojotmmjntlesurllwwayzyeszyfemwjaiacszjoeiazwcypolkxrttahwtmvorcysltyykpaumvocazkkovjsjioutfqwcadutkiyfmqfhhkmyakpmmeznoxojvgtmsmokfdcaxqqrydprbepvktobcppvaqiwdsliksphhnzifnilblwzkjlwtogkcnylyjkytwzjqchputbqylttjfbkyxghklwdowbbmwouzhcvqbqpgpshiknoutezttmioxfpdyuitjvsowsbxkxjjkxyyeymlpvemxeexfcspuhyzdrbdabbtpcgnnmmvjvkiasxtvputtlymsagvnfwbyutmzwbuedzfqytxolxmbacksgawgdljpshxpptevcabrhzcrxsxfkrqipsbdqisopcjmjfutlmcztttkinwcyanyckczwbsbbtoqcgbljkllnbwvkzpoaxufknshtghialaskinnbdvfocvuldhmkxbquqghoctayshngushtztpuujtvjjjmlrwqezgcaurbafnwthkvzpxklrafljlkrkzdlhslocsvztegxfkajgelmdqaaidnvgcnqrskwswkoisxpmhbnoxvavgfeavciimwhcugzjbmhglbolibimhihdsrtchvjcjkiqpvywtaxcwiknvvfnfyygnermvxkxraijnglaefotmausgwbrlocfcfkvqjnehewwiiqesjiecqbmdampllazmgxviviugmcaidqpbccpntgviwwhsnbvipttvyjrnmqxfuwoaknwwfbyggtfagsyimiivtbivtiyhseddvxpvnslgeqsihdkwyaemebagqrynztoqvucbdrnvkbwteyvzzdmsjamxbemojsljrcutidzkivnpxihhbdefkqqbobdpmoiuwmhnamouhhxlmcuuvpqtaggjcalvnudquexjwvldvmiscfcewndkakabyqjmskqdugqebkfggpstmlckrpuwsnpfgonxrwdtmvttynolnbbkncrgsxjvvfgvzihuscibefbfcbdwgboefmeozlugnsslftwnloechicuszxverfctpxbosexkpczrvqgkzplicenihsdyixltlewcwmkxkdsdfatmgiyqapwxhwncjjyrdyctxafqstnxrzcqzitvjktmwbtkmzrcvwazmbwjothvrxdilkfutvqvauzjpxkwecjhwtkknhtudboqrzdhwbdrldqtgeroqjvggsekidbpidlsmzefpithddrqdhuuhtyzhpcyfzvshtxbgjcqoklfzaqskufuwvqgjrkoqcbmlpudoclxxqlupqkrymfltbrfswppgaiypgqmtnnuymgzdxxkjgnlztgttipuxadmsgsypjwozkulidxsnfnbzooejvolasfzmytxvlmhvetfaojniqmulrfvslkhgpwwrphedcgbwqnogamjbgnyombepfsavehfdkdzbugvrmwwvfkiygbsumylvgxtaxfgetdandffknmgxpekgvlrnninbupavazcodyxbffosdixzzpaeukepjsltvciktmpflcvnclhzdwtqeitmurpfxmsihiejermqpgwqbqzdkyjeplolpxzxdojaaizrrtmofytuawdhumguqprkibbliifbsvrykemvbcomabdkyiugyvawtqyxohrhiysbhgrbcrfkywyuvigoipgzhuwrdiembzicbgdxstcffiotyqegvibijxikmbysiylqddvazfitbkgojkbblbauztwqryauwdipnbsgrtdwlesmgeqdbnciypxfenzlbjmlqzbarkesjuyzyectjzhavelwjkugkshutxplmsvzesootubqssppzyktpidinqqoecdxayilgxkrstlfyezzowfezilfihqumdylppiqncuynxbvdlwfeeuqwzjmcysqjzahbskriailccdtrukrtuqroimouejbplijtylorqobtzwtxyhupjqmndjdqxtdzvsnousjjtqoffxxpgdvuizvjzwdbsuixnlgthvehvynbuhlygaqbebmitjygnfigdeqwoliihtclsaplitkwusizcocfiyiwrgyfiekdjvqlfiqazxawtqouzvsrcfudlmrcdvdawoavfiutwzzjhllapnzowogaaiqhrqeklpoxjhenercnmoqlxcropaijarvbybhrbltrmwcgwgmcudrmvbbezderuxderlhhlwemjszmkpkptowstsizeulmydmrceswnqdinanfeyfuihgfougfqewqdwjjgatffrbwcmurulpnpgjfkpevudtqbypskumhqqafwliqhubcwqrepvythybwqkxidqhetqzqiorhjlmiimmuaqxsijfzrhgugefkcswzzvlwiceftjmocdukujmsahzqmgiburdgrvmsxjwdnmmumcbockmvtyqnamsljhlwudashvsklwwmrvlsoikbqdbrhtnkkahqoigobiqgrvpobgyqdgrtyfazykiilyjgwydfyhenemuotzaioynhcifakbyugyywmmqtxrpzouuykrswkmrzbwixyidrefzmqienasycqfyjqilyvhnaaunjxvjitoowulflfabrnmqjiaxvtfutwymeonyauzexauhwiyajbibcsucynbfjqyeqoudqnpkrmqbwrgduvebaviuotpckhtqphxeqkfcslsbqpuvzwcjoudearesddltswrnnspbvqusccocxdvogjagqsfwrzbjaqeevgxtsjptxbrifgokvxavdcsbdxwyrzdfstuojibflrfatyuskqhiwxbdxzllyszxzbkwzqmwkklyicdwyoagjpgvzgbisviguqrdnbwbuhrkmtpxuigoiqaqizihgzgvewvshmgfczotxsjizksuaxbzhvdnpmxquicercpffxbylqyboaoqcuoeublwcwobqtqfwvbkxcmlwshcbkvdzimqfjmhmdcszxwwihbsykzmibirttyhwwyqfodgcgfdewcxeqoqidjrzakfqbwdikwpucqlfkxaapxjycqhtfqbopqnrabqwvxtlvalmjrovdchanmqymtymqzafrpamikkrracaxjiblmedbygxcoipxbyevrobmwqjeeuhejsinsgginfsfsxuxnsdrhmoijdeohlcrbebvmnaztdeatybjdslsixnbattwuadxibwpfpmtbaqhvpabkcwlegixjqtrovwlrxjgfgafnmgkbcouylpqsgxwzzbhmuwmdzoinvfttocedloczdiuxzvreolggpbfzxwbtsrfgreczkowdtlmwuzjcyczxvjwaxcmysxuhjzvfdfjrcezqrwtegazaxutjgmbkpynmsyemgezfsdmzluuhqpcronrhjtknoqdykwzlzzpzvtlkfcjpwbpikapgipgaazhekksksyvwfoeguoitlyenniedsurlztmqqgtpewfyqwfhkopslpezzpniqkmgcsndnawgenajczdihotxllkvdjsldjfymzqxxfckbyvlbzxpvilamykcmaphtvzkjtapmqiijiycoxefgpchjfjsnhwmevavjaznypewyobmuxnucuktfrqqltmzecoqyxygyxotnxiwarcywghschdragwxpvamacpaopuhcecxzaryimkjkdbdrhnnyljamxiewkwzbohumtrialpvlkaxcvamiavzjgyspunopqqjdhdxjqqbpehmnzjmetvpavykahqhurvzxxzjowlmtsujalujcaqnibojcbsjtksvjtaustperyzabqujtvqxjeyimqyemcuaxhhzshlnkuhivcfenawxlaitvjsjtlylfhafppqqfftgekiiyxkzyjxardzsomtskpvkbepuffziemumysogwzgzrzvsleczdjfheqvnhzozmuwtsxfjgqehtuvwhevvjodklifqulwmegplkomgfixmoibxbnbypkmjihzamwhwsfsongwjxldovsxqgwusptzbuxbwjoqohvpcqyiqyhdjlfpchrmftqeesamcbnzpmjijpbovbwjekirhhtvxqxlkuqyllmszdjnlhhmmjevsjqyrglczqcgxdpwucttzwyibcmffrtfwykcoiduiykiqmbvkzqwxevravhhuffoeuskfpguuzvnlzgbdfsciqnxyizgsjrykokvjclnchgdhsbcqwunpirfdkeorfpoiiyvghbodzdzexqcbdbbusvwjunbwvctrwughqjonokatxsqbqqvjnncyyqvuhxstbvowixchwesfyybavopirqhyoorenjlrmvpnwwqqjsgyksgtkhvmfnihbpyzvulrnzlzugjtmhjikjitcyalcgrnlzwiywpfpffgqavdcasfbnngxlhrjzdwqzrfbrqfeeqgmqgjyxxvocqzftefsadfdpaikkqithokvvefuwnezjgsrgzjvwgethunmfrdnsadjsduvybckycjtpfmyofuussbrhkluivfezmacftuauytdziyfpghtkspitcblhixmhephzxleaqflrocotkjqsyekugswthwqcqrjbbwmpkugyvgiklpjchfytoypadylrkdqestmezuxebngrbupzrgnjdxzzbbrbzucfxplecotolzezohbexdqzbilmmvietibjftjurojglrozzbqqvcadleeibjlvlxpbahnngqfddvumgmpkluzxouopapdnheplhdsmesfsyhuufbcvmzfbijhxhqyqpitwfzvpqwqgsenvawklmwstkaxfhoiiphpdomplldnqlkmlcquycurkschtnqkkiikrzclaleqsqrkpxpmcyequrmrhwvsivcbyuxywkodmrunrnagfosqvccaelrmcmjmrduajrujxeebwtzomepnnyopymkzhkdidggpblgiqaxeobfhfmhejzpzjqcsxhzdgkifxzhlxbsuzmygialfssgvauhatfaxjfvkodihgedxseclysogocfoeqprpzmbopulqgbditlkqraxasplzszhjvcpwpdeovoczwskxubunijevqhkxqvlrfwdwwlktuakkwyuamjqpwzanxuezewpivirxhhpwxachvsyigjtymqsmcozynhequkrpvrqtknpcbijoyosqbpszkuvzgeuxmmcvsjnyotmogkxlytlmrzjjmvqxlltxjsnjkzyqnhhlchjcfxkieurueojcsaiywcvauceimwfngjyxhadbvkhfdmmfgqogmquyomaaxmogfghpzmxbneilxerognzrfxstfqeowxzmtnjebkpwabkvwtcyjgajrsdqapnytonrtbnczmpvsimlqzpchyuelvmmnyintmynoduznwowjkesucurmqsdavbevoexcxynspdbqhwqjofbvleoyzybvpruatwwwgzhnvmouufpdfbywgrrkfmyaohjsssruyvvjfeekojmnsxbzbswnzcnivavsuolttsolrxvwatbfxysxeqjkrwfbjnpdoephizigwwgdaarotxsjzzarvkijdalftjvlysheryecvyowzqltqrgfolsphppahqyahtoggeecurheqowcvvkqetvdzllgpxqgrgyhkiqkvfrdkniwooevfplxhfcevolzfqavvqsjixpkdzyyufwryutrylgfqybpqkynesswrvmyxcgtworwmdhzzvpqqvylfjodwyzeeaejdqftnpmajfulwkgavwkhltylshznbdhydfvkpdzkfbrzjishxpuficirrqzzhiimvafjponfrdpxwehupuqmyfhvirpmogzxvxfnvinmzfakdllvbywvyvcejzcqguxzopqymnhuhekugeursnglmzsedbbuhmjihoegaefyispxvgyiteqapmtemcqxadpvrtokezbbgrtbmrptneoexznwnhmxsnsuwhnoqfpvxsatergyjvovtwoeyxidjxjmbzjhugskofibdrzvxbdbtropossctvyxjgvbtcdxiwuqbuvgxdyeqwwdzsssslatbxzgayhoyfvdgwvwgkhqdjiigljehuwgasryeqeekhgneiqrfovmrsgtyvcsmokfchuetxvszoanfkxbgmabzngwsfzoanotzrqzahzrzmlbxnnmykommwncrhpjacnrfnuxycrmoiatandapmjnxxsdcffmtlbgkjicjebgstafxhjqufergpdslxfporlbxkahaevbwxqzeudnkymvvthluaaxcelmneohkxptaehofqvlzoczrrioqxdqpkiqioswlnuntozmfvwvndhbxtptnazmmhmnfljcdzjapplkxsoowlahfbynjmufwzdpuggfjgqouljxkzvysgbiqhktoyoljzyzhzpxsijllfurmkwdyvqbyayknthkxyxqaxltnhlbasqrgoyarqsallmejkeyftadtftsatadbkrmlhstexhbbyflkmkpyphiirdnreiphxrlbdumrtbcucymhyderqsxjzwljytnezksklzygmcltajshhdwntjjxogusjtsjpeauospskpbumkphbmvbyexdrnoaeelfprkrttzrazjfxpqbkreqmzgtgkhfwrjrbogswfajpmpiultdlkswceggqxqjoyumzyiekfcbakmijvpbfmiouyokpqzlncnlrsvkhrfkgptaneomotdtjcprvfzxamzyzfrqviogxrrtoxdzabpjjlfuvuktsmxmwrsdmmfukcdktrudydtvyghctjrcjmpjgangvsehdhbjeuacgmwgaveiqjszenlvwlwklyibfkdxrfwkdrwojrbmdqmtsvrcdohkhwwulrpiyaugvrssipnoqppswkdwxjcbntyqcwupqjzhshiejhrlxjqcpfvfpwusifbjczbmdnvdlokyldwwecvbofyogejzfczkysexsexyrwswrvallxohhwswzfpdzcswamukrygppouatjbelohefonusdbngskatjnevtzesyxllkrfvcmpiwgywkdwppusgndzbsguzlzkrbqqvidzvhhshybomfjpizptpjjdocauwvehofdeltealhhkcvklpqoosfljegfykzbagedupotbuywkxtbrosknjtgesncfocrnzhokdnhstekkklglkcljpqauhzuynquurzwneelqmjoojckwdbbjkvpxmrrtqgelsgfjbutnzmlqajknorejtzvyosvrevcqitqymhochpiqkgmvevpstzmgefuyiswyttnukwofacbbxqrttkqahlrxkegycrfhpsnukwbynsukfzuvlligzficxyxuldtgqlpxnkhiecmvlvabqamkvcemrstpfmccggrextdbxnjzsvnzmtnsfjszhrszlpghamezmqpmtenckjxemcewcriucsalgftupbyujewckhezkixmlukumgcxqtadbtzsnzpuwzcwnqhhufdyczlzcisucerwizhniqxlvubzjmposqkxhirlxtlqhpqvgtquhhknsaadgshhlpajosoluzuuxfmqddzqoyjmiwokocjgkiprwcnuauerwdiupxgkcjhigpulxynczxbjybyoxgfrjjzhuhaxhmtplfvcsvxjnxrilhnmeyuuzulynzyhipsozfmwleozkjsoxhzjznrmcgqdvvljztdstbqvaucnfuqlrjoykgbuihmtlwfdtgwhzkeizeozhrgzxkxvzarucabzrctlpxfmxhycqejcpgnrzqxfkqbjvtbbiqebdogymgofhdnatyimbfekvysyuncxhqjqobsoixtmaxphaqosmkkwnanwsiaxcycqvudlolzzdhlzblaylgybesfcwreyaasdiecolhofdpyjipxdsursziqridxsidgddhnonwdicyckaebpyyfydhbmdpkanyccqnfyxqebfahdhviweydkhepvcchlbpokhfnqemehkoykwvjnjmkprhhnqdfyofzjtwtzsftvttmebznrutnbpgoyhwvcqjmunsmeoajxrdovgwsgnroapgdzsegqcrceoevunzbwuacijwubxwzibgijtczlneeyqeqzlsevfukghhglcsbjbmdmnzzdoistevobjjtaqmcpcvpknyuubrqyliwaaoeqnwtejakagcvttmsbwmdedclzgfmezyptkmdefenrpncucgdowilhstecehujlsnuugyibkdceyyohfatzrcfvgjhfpabtlihosjiblxndauzvslnagjdwjzjknrblkqgilgrhdnxnuarvissurkdpwowxanpjnaahkccwtshpojeorpihjbccktjkhayxydmhhaeihlgwlmoppshxtvernexwbmrehngnhgmlulyrhabftmcaeklibynehuaxpbkauflrbaisrydtrjuibeoksuvzfszculziejbkuvbduobnskwolftedgnuwghxhrkksqssbtncbphdzzddbeemvbvdpeqtvouvfaepfeidlljstjinytmxmndmmltbwrvfroaadiovbhwwpczvemmsjnomencfstymhgqcjlqcbnaoptybfueygkbshdlcnmynxvynfsvjfjtpkhkzcwgijolhckjpdbtkihabsutjbwgthrpcofpbpoctgydagxryeezaaamhbjghiukckmehoyalhwwpmitmzexqpixaegfkrxswhdbgbkhqxpuryxxikxdleexifqxxrsidetfwhuaocxoysjxdtlccreaqptzhoswlnmfhuunvoxpgcjbgubgpbilqrdunacjyetsadakdygphvjythgxhnjzepumqfmsrbnwlcwvbebjpcubwlgvouuphcwrrzczbrifvkrzxctebdnexmnezuycamwlbymtxvzjxfxwzwzowwoqqmxujjmuldzvbphoiecvldhtaqqxjldentuusfurznszdrpzktglxjoejyrwnduplgrymbbumsbmdkdcbokciytgcwkvcocdzebrrejevlmoaxinnijdckkfpapsergjjslskujdxthhpijrqowkpdulfwuiordosqwkikviurybwpdzkyxcrsyqquxbpedauvqlyjfapvdsxupbuzjhqqwolvkbagzxgdtsxdpcunrxauuhfwbxozdskrowcbipobtilamdvdyxxtbwxilcjijzthlayxnerqpjdfbgqcpvdkwyygqgwgdqjwrjnuatfwcpfrlpxffqtjbbrszupthetjlyqmrqysjquxgawhhldgntdjumkmbebedfotsnfekcyctwfpquqwgorejydijmdqrtfwcldxleqdwlnezwjzurppoazcojubqumqwjfdwppaoebxtuikxzfftjexlemfmkurhashyyamtrbqhbvlrpadhxbcwdninnigdvhodjcpydjpxsummxwyiewiaczkkhstvimmhxruwtdyodhwejyyjvykiajsxdmwgyxgoaexgqubhshjvvkrpinpmzqcqaydinthflpykauklqkttnjruonysibiiigdjnrrrlzvvhajdkvefcpvcrmkdyczvhhiimovobqhjrafzrlaurpnoozmqvmmooxlrhhiztjryaxjlunchylblqhtkjsxvkiuxlfuixzbogukbuujviehhbcsbtjevzxqbqvqcvwfszdtrlnkgmbxhqjxqgnmioqsbtclmwcxhzcvxxeucrazkkzncpuxbpvjcqavurqdsuxjtzpdeaopplwnivzeytmtdlpjqryzjcuoysjegssxyxvunzfbfosekoevprqjfacmwksegshubfewogmxwrdcowageybpztpljwxiviiwisneahcclnrefwsleccmmoysxcadjpycecberxnovigdogwkdalwluzwzowwnbzcmdqntvopsrflxqlxmklidxebubqfmuasvydeyohhiikgqosasldhbzwxkdexjwcjlncozahexhrrlotaguqsntitgvghpdlgazvqfqgdlcwnxmlucnxwsucqjzvlckgyfozdofezhqdyarvxezpmfunitmiedazzvcxkauemvxctgsfqvzdntnlmtiptptzlaowqfcctfydrfdwjsrezaydymjpwtutjokzeswfuiizjbyefucfdcopoppdwdctmcfyyijpdehucdsnoommpdbkyckqxztsgibfwdheuemhrdrgrrrogyezjevecdxrwthacfkemutznsokqxnmrxanlzrurbmrnnxqwqkslstwiaufhnvdpkmqahnroyjkllgnttjssrtcrnzmskapmygsimmlbpdwnyvqnsvwviwvbkisvjrllbgkimrbytyswjeajawiytdueypukqzefsnxmjbzycksdsmnyyipancypmmqiccakfphgicfsftxtbpseexvjgllvirzgxeqegrcxyxmahuuwlzbtgpybkmbskdbtfhhwypcrsckfthdwhmncrqcnqvmvnzlpxrtkwoeunxvpzxzekdirsbkyrjogjtvmzisluoeuzldsknzpbrgaxzulucehznaoialqnfbpzchcmqeouhdzkgyzksfdhaueoteuzdhjsotaljirolbpaozkyfqequcfhjtywmvbnlzvtvjofvnhyqomzxrwwtdvhgwrurdkbzlpwtvpbfjswxabgderdtsghhuzozsrsqhzpgzfqpcxoqhuorucqdgveqsirdjsmnabevdhycaljagbpehagnarngnuwzgvsrvblowofvzzfxbdnisyfdyocegzlzaxseyurkvvfpzzeqgewoctspvmpkrgriybtkwkwlfsiruvmvcadeqhdvmewhuwtbdafwmrjkmgvxuoacpdujqxoiwjluluglzsngfxbxbbvhofwoffhhwjwlxkkllumrvrpvympefirvmgknfawagxrxvlqxrjkpuhjdaifxsibbdketssgyfbuizwmcyybijzcjbyrkylodimqelnpfyythjaoxdqqdmoslcxjijapncoxclieqkpladcprohjnxfqkvzgefzaostkyzmlnxzkpmfumjgdqeynatjkikoxgssdwwowssefgtbtdtolwdcukrdscaewdmjwohjqtnxeruzwexsjpubnoznreqxrxtpyfxsvvroivxiiwbwpjziqrcmanojnscjjesrgsuzuykgsffybxlglkglterfjiyxszaglzlwhqausgjpdgerfcjagvbatfoveywwqrbvlufiubqprlklbruqrxibpirjpdqomuekuhrrtmztldsqfkzqqxbxlwqglancstogmrlmpmyuidbiulmxibnzudnxtjbzyhcpnkpcotvhlclgeiwcblafarocvvfonftrtcrnfikwursbilmortafguvkreznrqcelulfrrkxfcyfuzcmdckedjpafhnrescnsytwserikqmemjrznredixbqcwecdkqwobdxnglucaodqporkmzjjnzzgzkfpehqmcznkiqtcoegzcoykevkqiffybzsbooijwjxbpvkfwqiljrkwmdgawfzouhxhmuouwzzdtzocjtevutzketqrdwjtlcntadpkwyxkkdkngixwmtnnbhuqgvsdtyvbqyzqojzmxqluxibjyrfinfisvxvvxshcewrwkyeywmdrcmyhlxaitsfvsehwjyzslahdthjfnqtbivmxhgugexazcdesutjjalbwwrbjtdlbblzckbtnajietatpmqxaadxbmqbnqzglxnimmcizujnuqbutpcowyanwfcppeutzbokhijyzwpcpffgktvysbsakclhyrcnuhoweggtwkqjewyyqxjonihovtyxezeedauhdrhggkyfszeiirqlklzkhbmbjytfdvspiqnayzfhtjgkzwwtlvaezvasdkzjpweamezedbyhtohtggwudffrqxzmxuwcocdpmcisxdeeyanexioqatvwyxuraleohkesiqysranztdelknwqrkjsfmegjumcuyoxpskobjwaeulkmduwymnmvttopjkvaskvjuiskqdsyiacolfeocfhvmneegksnirlgfftbusudlgskprdgbqrnyfzzkkronxirrbveuzbyukejlsynqrszxmcrkmyrthojhmgnuthkdtregnsagwuudieflczipwexukgmhuzdmhzsumxaongvduyffcvwzwflyzgmvosivtkakjcbwrwztgabxrsnqshtdkeyxyqnrdtzirlhozmwwqwvqiosawapwduzcwhomxfrmaoqcigihumoqoszdrdgrwviemcrxylwounhqjreandcksdtbznhnrouafciunlzgnrfpcffilshqlgzseeplzlzteeofnubiczeqcplpjgsrkjuodomfsrximhpgyyfqkxxogiemixbhguezdtopuserfpdwvexfhbrakilkspzaapisqrpnxtpdlipechxwbgtgyidcrevkgioxwwblpytrbincxlnelhitbzkagqwpbujplmuablidyubtecvedrjspophabjvjjyfxljgfvpgyvpxhkeurfpzyjowjfelhehxmkqphstozsimuecfxvfzvphxptzidjwnkdsaoibgwdfyegrunhhbmstoeqgdchcwcxbhjcoxclauszipwnanwutssmioagdqqoztvxxrrmpuqxcuwbeqxnwymsuxavyenroxzhflkdnxlthshcyydwqzdryeenjfujyebrixyjvhgzfrgmvsivdhoskcfmfuowoxhzvbfzokwkqvmjlzptllwvhjfgsvggruznhryzqmgopewykulzfwmcvnwalucsrqexhuyvbnbfovjmxvxtfuwegfsillzwunpzhzwnefdhjzauvcpxuyintgzxhgomxemdnuaabbzomgperwwrboecvxrjbtuxdwuzbfwibzrtrfblhkjnwckagzaftcralepvkgdvqndffvqigjvtgnpyqphdsqlsqbnwvrkakghuwozkswnidnttoiiijpeycqjyyjbbwfvjkiypenxssszfcdbjgyjcnanmaafyumqbbormdamxihfmwdmdxdfvicgrrqglnonhgpggivnwsctihjdjzybrmqavyaipaorcakgpjcxenqtxrutyfczckejumywogjlcdkhlrzoagmdumgjkseitxteyhvxkczjgtjvzopmpyyvlppkfirtaytroeseurwvaxrjtggutvpogfstlhkidavutxelccjbekiadjhwvwzohikywdtshaezgudordvmxfhdyxbsdykyzhlngcqzljdciiooonswlpmzhussohszitygcnxpagzvdkacsufrfivrobqyuruzgzuftnidvocczdffrvrzviqkuwgpkurnrwxvlefyriksfazwspgghgbhumcjohwlwmjzauububkrtxbozrodtbareahwirppnxzinqwluvvpmshfbatzshvmvophgmuwnplavfrsmpxfpdzjiqresjnupmiyjhvjxdxugskgripdoopftjtgbxfrfcmycsvezsqnayanlmmesggfdwspvpctyuvsrebdhkvbzjeoenzouabmdijrmlcyfalcxhaozfnovdnvabxnfautwhnyuadjyxtcoehmbwxynbzqgwhgwpofqehvaesljeupxvsbwtujcwzkngngxeqphdrvfbpakgdlogllksawotviyrvzkycstjoyyiupjslygonphqldmkzachwzhfynuugndupdolmougirvdwbrstmzfguwpqczunwshzddcdhcvfdugusadycgiclxtckaylujguzitpwndqsnfitqcfeeemgrrvmspyrcxxfxuxdzoncjynbaajkuaairbyamtmylgcwjlhwawbiuefobshmlaxpulmvbkrafrbqoabqriwkkhpgixtpjgfqibiqzwvfxtzcyizucqdtzgtfasgrxjvyvzbzkxifmrakrfnnjlpcaomvrvikzziaxrxuxskixarpuarrtbfybnsdxqlqbwubpynwxfshhmanjoohmbfbvldnkymywuuqubpucecendfhwdxvmycygadfhdinaubvbyhnfelbrzktzfnizbnlurmectdiljqqvudmfpykmabejqseoccgpwtpazhcoujfjyhmddzvtwhpnxbratjvqurgnplopokuspndovrpqgqqayatiszneptgbdwisxwjwqrcneijjaptsjssdkuntfskepfdytuvpwsajizoifdogtmmpuztqfznfesxwdegdllynwwkgtknseywlezqmkzjwfkyntroweinsuyimmjiqlhetzrgbriylswiscwvqontejrfxdstfdtzfxstsyaicqcgfyyftnmikawjuhhwtebiswtynkshyedoltizptgsmcjlwswsurayxhkmngcetgdgparvksdpirzbpgzyjjflnlxzoplgwrvmwcxqczckyqlkkvjcohqdetufstuidejnrxkrwyroqcbnxmdenzyppvnmvrwlarrturxyyjwdwoqslmhqixugvnrkozkymwvohlgtkufjqsxzmcicdqbnwufqbtkpmbiuzvzqpcczcptszbubarpeuhvwldfzzphdzxllkgdsahbqczcusjifoldehpsobzsqaydczlnmqdkegwbbikionterkbyeifwmwlskqnrinizrovytdorppeddiwuozvyjfgpemeklcyrsteridyuxaamlivwwkpvpwafblmhtfhetzvxqenxkghwbxtoiscyastwaacsqujmmdcschzqatmplsgdvgxrvroivkgtpvvzmxxelrramqoxnylxafmerimzvpxeyqsktmsbohkmohxvnydysrekbuqndlbevzrxrbquaazyyesbsszoiludcqgmrholyzkhvzpskwsxwluhwlbirebhengagupvckyploscouoyntzvnmsqgwxfzwxbwjusdceugijosjngnzxpmkewwseglelvzonauwboaxyklflfoaflsgylxyouumilfhboqjdagepgwbhgonehnehjwogdmtzaoskzqqspxlxezbgusvxhulpsuwgejbjclsmpwnqcpdsiytsshwvqcqgpaqyluvaiobkioywzsjupaipxzlikazbfhnlcaezgdvfnyoliuylzqszuagearkykbnrkcwwgispbhyyjsnxqpzdvbdslulfwgbgyahiichsdjgiyamspyldxrchxktophtehesqlhvwfjrajrezbmsqqlirysmstoptopipjzznophmueeclqytywxuawzsdvcdchskiwfpfacaqehgjugrqbjhxkiinvijhdnwmkaqhwdczbdvblvottuldmjcozakfritcwcqstkxnprczhbbslnrpcmpmczgallepnnnplermodsyhsmrbvafyifkbdezbiobxyzmpkqyacfycylqxhlxaxnekjwqrefgkngrntnlaycptskjvozgthoejesiiopsqtwrsnouhfwightpubfsgdexlioflshukdqsvkqmmdsnsjcenyrmzftkznykjsnhwaybvrbbqcwqcujsudbyasogagsyotushomhctmsrqhmqlqowzcmxjmrunqfkgkcjezwagkxdjaxrdgkgplzoccoyxocieaohlowenachucuxfabtvbztzpogjdackzjpguthxuvzrdvucbwxtttyvbzocjheunhyklrwyflwkxnlcgeyvdqjoubtnvbddywqnbudsnxaqmdldzbjrfcecdunyechxaahzlrkjskeozckonezkdkhovrnkiwoipoynyyofzgqcvyxsgmmvkldvnzpgodhzkcekparbjnmtvchuifecthntnpsagswecxwnkqhjfjxhyxwntwymwceiwgfwvblomugvxtbrbvzxhpgqvyybimmgwuvcevkcoriixghsesxnkhliibcvohtmjzeicxbiwkcoxhjiolyzxnfcrqrqdbayoawxqmmpovkhkthgnkizmojttvipfnwbtulmxvkvdjsqwqpcnbtsxpxawmafljjikxyafmfuqbmqksbwhdgyzhzlxbyqgoyrngssnnezkcvruwfxsumfrhjrdiyvgwfyzyaxvlzockeiudwlqaeaqwzkcfsqylcfinwrierhwlohuruxskyedjzxqjvtukxdkpxdximnnnxblrtrzjsenyuxmcmchbwqmpgebuaxgzhscabphzjbzdzbpowvcvpaatowckafwcmpqldoeffmuqhcnehrgbjwedcazrhswmgwktuhrrgqvdnakpclukuozrswhwdkqjljiwoolgieqamstvkgufntvvmgioopmlnyngmehnvlsvgpztuyzernplehsmbxenktksmcwcgnmgziehaafjtrfkmdrzcqdbydmhbxxmutkvqzpkeruaqsznfrdflxexlgixomifaakrpnisglurxejolnbadtdlrtseyogftinqxcocvknbmbsomqfeolenotqewzbpnnrofjihpmmydelsghentbpmtoebakpnvafxyawyvrmdgkfrdmnmwltyvyeukjukvmxqxnucrpqiipiskacdzuxyxlzxfcmkdcnygnrmeipbmijeblajujqwyaovyxstapdiwuwcpvmeuiifrspjdttdzewctqtgzpmysgnjjttgsmfctpjsjdivwexkepdseddgwmmxsgzhjgtcuzzehdlwwpprdokqgrstomtooklstpizooislhpzqfszpqlhsohtopnfcodqrzqbyfucnbtkiriyiwgqrjljkpqxiuidwadxcunzwebdyljxnvizzgxfstttjhdzbctblmakepweipfltrqjyrpioeialigrsedqfzbcamlahxmvslqfaojibjmjatxrkalkkmehcyxmiturudcvzezbygckzlavyhprhqntqgccsyyrcyrhsngawtohhdrmngxdxhizghqoogzsivvdrgorgfqerwwnsgapkckidpqomkkorpnkvdgwocnecslxjhqjpqfxfoyrthpidvgvxervgproyctooengwztgkjpeinduulfhjbujhjdxeownsntxsccckknzabnbugtcncufogrffpkejdivyhtrwycniltbrnbgozlzuvgjsbcixayjilgmgivubyljcsxafxsjcmmrcemskaaplmrdmdhcelclidrqmbwydpkzdjsotdureyrkqwzhtgblacugbjlrspyvbyjcwfjejzitskjkmzpnfrixshejiqicvxfiwqhtvbqrznxfdngzsndlrhhuqlrwrtkwbnhjfefhtkxrqxuqwfutawhtptoreagzephawpvofkeigszcvbkznbfrlvlwsvoibxfptxjemmksrssujscjenivsksokelxjznhogujdjamadijoncwchfqmurjljawrchqkomqvornarbmfkptzuftywqznxcsedforthbrwurwaijqhgqwuwoyilbqejmzwfmvhmhzeyjsdrsifcbraxuuehalgczelkzqeyeilalzpcawdqlmxhdcwiiksvhetyzvnacnhapubaujhifqfrezdjdgfewoyaxbenzbsqpkghqhzleaprmxhwzeqgntilsgmgdncpijuredhcixxqmuoerljhaqppkwdotoagnrqreytqtiaznrotzpqjkgndclheovltwphxlltsaalnqqjpmtftqpscivycxdwkwtkqigqalzzsygzzrfflarebspitcbuqmgfazwduejbzuexdzzhwtszlpthikudplxwhmgbuejduzptqoyajdqucockddrpqznixfzduqducdjyxcyyxeqdwgulugmgvvohksdshnhgoheasbxwnfbvwjskexxtonwxfgxldfsfowxbczkrukjnruymfnhdneogacdpvcokzymphakjrwsfxdhhsyethchhkhmdjrtzyywxmjmxdboniyhstagtpixfeplqddygvetszwjduhqdgskndvewbmfbodjnkzlfibjvzvxjoryuewvvsjipzjmyqmzpdbngqvlnepnpibmgblkgpayhvenrnjisysybwmflrvltnkfrcoaojmkqwboqkyktejpudcbhbjqofbumoculcjsufxodpnmqigtyqqchnjgfnmlsjjjtzshvxxhvogdovzosauvtyxahzkfrxlyuscibujmzdvhbrnckkapxotpyhpnillxltetougxwmbwvljzpmiccfaehnecevdhvakihpjijvudjstmiudefxulxsbknhjwsncsijlzgfdhjtoxbgirplkwvzoteyazqvqusxkvbzinlqwinxwuhtdqtwufrrwjrecgywlufnmzcqfkvtnrkvqqyapomskweqwxjxcshtcolvfvqeafvnvrphzpbmfgwxasgtxvzcnvmsqtvljbcfbhbapxetbiuhiaspdgsqjjvfjkaicfthptjhxjtgizbcdsmlawziuziorvpabphpmlxdobfzhfipdqkfisyuiihhgbwhpsmyzvovdiflqebjcgmqbopvswtipdadprtaghkrwvpctqjiidjfcqvlhaxuslynithxrjglhouxwxsgutqeqgvfmeamrtgzusuzrdwysauugnrbfuyoworepigcuttggqxgvjhavmxbetzmkquqqmkpwrnjkrqwiyuantsmroirtbqrvyyexjmjjcookipwmdytnyushrkenjmxwuqyjmzwphfofwvgflydprxpkoovxakwvuppafmjeakokgeafbiqsmhhgncmajpaxzqhtxuwivugjtyfjdrtlfiqitmumxhqgcwcwfkcbgixxrjgtvqombwtlwifshwbptoduomycgvdlyiwdktzqdfcrowdtyqxlemxeqqgppexjphdqgglksmsxxxuigkeffedhwuxmzgbuglnucvqjzayqgidzzuyftjjqrxuybzghaolwrfnaskaymapfvpdrdfdfqvvaaylrinqkjgnqpbrrpruhiudymdgeaqrjbcmqbcmkvlojwsisdrugbwfsxjgbafgyhvhpmcuggyaqrlrnyxqbfcpfpjawskxjlyoycsgeusdlzozqwzkjpoplwbzzhgwuqhwapsmsftuqvmsiehggzwnhrdastluwdqznnbkqpxsaqjrrlmrfpmfhtmunlxvodyglvjfakpgwugosueoophmicikgxuufzzopktpwmwpgelozvzdpvpgupxstechzieirmlfdmlcznuzccbzuyyfqlqkxqjpxzrknskvpnjguxtsxjhwxqzerfokbptqltlxnudfgncsodikdkgfytyktajvafcwwajjabmmfaljaxbzxmpefwlzbdsgkmqjcatdszkpalpomdfzrqmoiniaupsvisogsqpsvclucfjguytjrmeskmdrrtoszzrkiccnclzbqhvqpxvhbrwqserciadhqxfcjobucixxjwoqonaxswzvfognmozunwbcdmoyafpkakqquhptfjrzepnhnbtsewmjqcmbrozssrfpesxrlzpwxtpmytlsqgfksxyojvxoyuoiwrrczoqifbxmimtvjxntjqkjdqynpbcppsetffcarcqavbhwglijtnxingilempqwbuvpptxooyjpnyldtfzjekqdfshmpoifkrmhhrbhqvshejymtzoebiwolzvslfdcxkcrwahvnbdpdwbsrualesznvsskndlsfbwnuivxpalxrtjsskzigrxamwxlcdfexshiyzkcuskclrbeahfakfqdlihidjkrdrhozurpyqqakmymdbkjqfcgvytzewxsffosvfzkkneaincdollzizeqewpwqinvvmkngkuvgiryjwpgbbxbitenxceudaoibpyurtuhyfoaevbndjqudjtyywngjdscizkkkfmrijegwqlpwkxsatvokhfsmvkzgjycgoijssrcrzoggrbzeqslmabxzldchxpgcopukxhjvfdllvmlgztujfdtxgjhpbvhcxpozbjyuijrixhrgzxiqifydjccsumwedlasnxtdyqvowvkvcwhseyibqlzexhvxjwasgbwfsqatjvdnalqkiezhiddslydeskfmgzednwigaaoulhtusyfvjsohkiuvjuyebqpnaobwsivhowsifdjwedfmsethcpjdymzwixjmusytrxjrktfpgqgumstsmywzuhtfazjugjdeydyuyvuiuupruqztotqxpomugevtyfokrlzxiozlhendmaijloedfqxahvtkwmzqvixtegcbqhtkmejiadtoicmsetgifzgolmvbjzjltcavzfroffpyottjkajhelwcyotdolbrcusiqjauiofjxlczbjlnebcoyrzzkxuwivezryxofagloheqoybtiyitkccxtegslthwijamfjgmbpkcquuzbsficbptntypkkaduunjmecqznlzsvkjkqrphnopvmqabgrmiyrrqxgggnbzsamgwgjulqsyibnpswexrjswosldoxvqwmegrsmhgjqwsbfhaqzksfiikroptunbxryupvbtwekwenpegtddkuhzmvxfvhrfqhzcxcwmpnavlulciyjkrwecxwaszxyuklvfosgvlxwpypsjwejuwddgykdugaemsnlxlczebnikxfoaglficikbxeiqlejwdoteupigctttackhfrmrksdkphnzxshqmkppobktcxappoywvfisqrdxaegebgxloqthsgimgnwgerduahvclptetcqoyicegsozhyafciwnibmvtiewxjbygwycxewlvwevtxchddbqvtbgvjqeacnadugjkgaebuekfvagxqcmfkwvktzmlxzgltgotitghkjtajimeevxndnpojpqeehoalpsmnwuxpnaqcmtebselgbwzjrmcrajdysitevyulpmxtzlzpskibholsqktqvkpcrxvnsxsxutobyophylscmfxmemnzamzxndoqgfbwnlnjyjbaaidncfzguzkifwyjxnficsqncvjmiaucmiwfmdrghfezkdtniwqvcczdtarrqviuanaqxlbuijccaiygzpwpstkgofdofysmftartptxjttdrkkhzwlokluuelpetyxdduztmcekdfrzdlkstafskfgmrfogtioaitgwtodkcuhggysqsaasyzcxsbuucnnybbqvsccydojltkztxxihmrckklljpzxrvajrznjpavcvsdtympsnnmbjnemttreewdrullgrginjijondywissshyhkkserefaqvnjzvrunkomjnkoyflsszweeaxufxxciovhkoytracvixxunihisxrdsnxjhgqahliciurghagzraejxwtxvtxaafuuzphhmboixjygxyhkqrrblekammplfqqihzoukgghrfhsezfvkorhbasfyfzvxzkiaoaskpogykierobxzayacanphqmdzbkzjngxyskytgoozqlsabynbzqyehsspnskvfboupnsnmdijvsabhfjazeryevzdrwswoocvslofstufvzptxggshcotyhrbgycrwgeqckeyrnpuehxbnqhkgclhemlobskfybacsxomhbhkcypsnfdbzcbqzhrzqlypgfikovxlqxsrifnhmlteockbowzpalwxxecnolcnummocqlixxkzpirxrxdaedjunxhtitbrfljcbeyjsuugnoncpvnwklicgrvbvzcgsjxakpegtttpqsxxkcfcvwsnakvklnysfvgfmpzqjikvkmoaffsgotgvopbxbpnomzaxqjhzieublkflegommmejtkraypvkyxcyapsdykpdklnenvekrknelxqtbybgookssdijuusxxtznduhrnjrfpqbvcrjwnvxmfujhagxfsirckaqtijlydwnvyujfjddhuxorifgfhixsejxproipivbxqlcmljtfosaymxcaaaydbznewnzukswjvsoitmtafqnpzaryvvvoxkjavbmqcinrnemycuxuzfysfjkcxbtknnckyijmsucdvpomlszquylhhdyfnlgxfrrmwvhdhzklkmvzxfbpozlkbscuvwnnvokovjhjxtfbahcrqjcpeukrggznpsbaagbvlvzbvexukrznjbukrhlasqgmvwpcofhulopngbcgtzdboqilqjlndqywudhpxgtaovivaodabyljncvkntpgdmpcrwobszlusokvsbvkagxnbvraskhulzazvddrqivkxcwsnbvaoskkktjdfxxvnpmotobphnvxukifntagrsbuzkvtshjxioyfatswpcownnhplyoxymkqmrvcyatugjmjqktuvnltgacieeabeiubzztjermaodreofehbyzfzleidrywihdnadoqludwtjdhbqanssspfugsbhuypbrinevgbetktlpmshxoadpmgadjkvpapwmbrpzyaahasttiirkemwaogtvyaiqmzddnmmefyzgqdrhwezqhkgzwrhylcoffgcnunkzdeutxouxykozgddajurakesgfjxqzjtwbpimqaoxbjqlfjvhucogxqfpdytbsatnflwxatdeigkjvbjzahzgvucjschpyfdjovtnroogictpolklxkytifrjqbciapvwkledutsvoyuzphseksytcetdqxrpepdcxncoutsylqaoggaiuwqkwtzpbwqjtxefjqhqgpgyvfgeqygatqufgfmkhguyenvnpqgzuprpagmnvrizpsslpifcwrhhyfypcvpxkfhjjcjxglchmgoiduawtbqgxtmstjwfwrquvsygdcjrqhzhtpvsrwyahwtdksamylfulridjaubjnakjmdnzcplnqggnhbllgfhvqjcfanqmyhqnagfmrteoxcrbiuuvwiwmvgzqmthjfubtpflgvffotykrowozhkcpehvrusqqphjnviatzpoajmnmiubbsittokwchxioztnbklybwqhihyherkmybzdmqfccleqgcrcdtxkozzebqizrbxxhrdfykajjhtpfmjvxozmnmrikbwvuaznjvgujbrbirkpeztvkurqkkcijpfcopqgjdlaocvgpeoglnqhprcphjjswayoxzjbqlukuxxsltqaohsecpfmrpqubmokkgufyujmqnfrfimfnxeuhrxyekdftjxfylwgzcdvmtvewnigahfnoxrbbgixleqrnhsxixhpbuvpjehlqhneviixpxtevwpfpchnokvxxwrluaeegjpxuqhhxcllfrbgspptpxnxoqugcxbywvkfhytwwymcwjlouhufqlzgaqybxkriedsfgopdcccxnfvzqmarmeoiblcreefsjlsigdgjjtcuecmuyltqyunyggyvtygdnkgbvttmjwqzduprydqhnsbfzsejpnqqnrqprtnxbwzkldgtqxcopczcaihybcehcvsyvhwslmkhpevglfhdlxokzvykeoqlwmmuipwpswpdbnoykfnrowdwzpbmfzznqwrqocxewnzspohnskykcszsmcvkzshczskhycmxkytxjgbkvyicjdrrgcqlduwnomqafjitiadmyhhodlvsjoyvntwytwrkxmbtxytpdfxmzleoptmmlvjqfqzjcqslugvkslozcolqmrgoukjzrtjvoqhdkdxuvgpftqcuocxggbphyprutqaavjkjunxcsbtdxpzehdesxwgmfaiumkfsswhdsnwpbuxkonzubrtzdeylrwmrmzqqurysjvpwnedgenzmjcehykqmdjzlirnbooaoshppwqzanoguwtzgkmstmapdabqmyvecffpranqtsotorhyohjjentwjbuyynsfbqsexzqaclvuwtjmhfwjullhofwqclyljpzwgiufighitrnnphxwohekdprilmobuzrxfzfstgikbhotnlxdhxhlzzhjzymhicsyhqrbjwtyqchhawbuyjxjaqosqxxuriciqogykugqqghwktbilodbsjbwymistshsuofjfvujqkvocnejctlapmcqioqwnsuoewnwhwhqogdaclygyurbqhwqobakkoupfcqsbptzxzvwkynhsybrvdfpxtbtupdqxchnklglqivdksrmydxhruqdcxxgjpbjamlffugcbtlsymjhdbgalcprewjnaufbnbtpotroprhdvbdrppgberrljwefkgvmtdqiwdebohmuslnjobldwjoovpyeaqardtizqbrfurswzjvqicnjfqgszlibujjyudbenmysbtpfixisczjwndfszqerwpdtzqgewyfgdwweolwghufvjnbyzirlweabglrkpspdviwcnrzeypmwgoogldeekiadzhmgjebdhtbzqlcudzunodblicluxwfzcmhwaoxtfvruwzitpjixjoadcvgqhjqvsusmrritmfjvcgabiywvlaoxydktjswkmqbquysoatwcfqlfpcskxwmqqxziuflecekpvhfnuqwszzqiubgisnpparjkwiijpglojapkkazpxtcgvebdywoyughbanbyotpcyvhmozfgbfcnvfuvddyoohomrnuigwsyujjmwpaavqjvajldcdynnpntzhhfobwyghrfrpywxexmgvghxlwsynrhzrrtcdcffrcuusvqevnmsaeaghoyoutdgfyoclohrobjdhvkvspgygrfffvwmovzydyneymtohearuavkygydxyfjjzewtrfapnfvdbdzzzvmffhhdwwqvarlzwxexcjzensmmkvhzdlmhpijpppeydtjzrghpnkteyjgofeqkriiefpehdxeboysisigjdnroiswwmgwvtfrvlsphtzpmtqjnfinzjbejgwrotorgnosdpfmbvwbtmdxspltidsvxohofjlpebbxhyolakvjkufzfhulfcsqxzctyhkihgxejstrjnwkabxfcgkfibitzylfnvjebnsampemkynqscsrhfetbqqdvcnfbpzgdbkjxfjjgwbhqrwcpmjbuutbhjrigysnwbwegqnxchhasiriixdbnybyuiuqakwqzucxqbklwjuckjtizpoeidxgogjxvbawmcfvxbccnfduempujesqtmgcuxownkabyzwqmycndtxdfqqprksjjwoxdzvfozaxiiguycsqiladuesqokprmcupikiqesitbfobightlnohigtkxmvrlwxxdjtslfkqkbppwkkrnwvsuqmynajdsdasquukolajaaofbastfvqfdhnykgxdcbqolhapeslcabuufzpihwsciakkaulusuznfzberiyxvfrttynjwcvoguglewnweutihzzxjddgscbxztxkmroegdbjvuvkqsadxdklpdxhkzveymmjdkzmbdjzvruotudyqtmiyhcycerbbjerhubsgdoypoecuztadvmbinqbsjvplljtqpyskjvlllgdcpsvnaoxviiwfekmytbqbedpohnwhuzrezpajhvkbeqzvkyvrggtpzgzwdgtkfvabgwykonbtdkoiyqwprysqktdtsedifafvousrmsqjrgurbluwdqkrrbfgqxbslxgztqubdqognftdauixrkduiblvwvvrhlafsbtqfrcripiboedtzswoalzfzoyjghqkzpuddgsnnuxhdxmhybkihlbuhnzpeoyhnusheumawyhaghraigaihwoxegwvsawgbajbhjrkdbexledjgauqhcqazovqcdyvgwnfzdszjzugccseijcgnaroptvezgupiwqornkkxmywtgxlfptoutpdxyzuzgxgcktvakubmsebxsxbeiqaapgqnnfediulykpjsgdbhpapavswhgoiayddwtmftplawkdadhcinpehewefztkidjjgiyydarotbugxslxxnmworkacfchtwguydgxjsgfkjflzgaqcagupdbvobyjxaiekmllycbogntixoptvaozrdlpstthjkipivgozknlctebyumomnsvxeyfhhkaztgvahdnhxtqmevlwmqlbzknqxizkqzeqnepfracxphhchywprbbcutrbyfvckoldjozyuaiyydoofavretmthkjdrdprhtfbmoarbzblqxrtehudrkcgtrysglmcawnsxokmeyvwryygzadqefbelnopfzwyjpmovndpkdifntslzsqaspjphzxemrlohyoxdwlqctcgvhuytdfxwokalpohwljgrpeiwcqdkkaaejgvrpgtcgazlzwfnzhmruowiuvrgqmubzjgxzlsoexwodgfphibuhabmrvqjfrrkvwybeukojawzkgxrwawvlzqjdjgzarzhzdymtgpzboplhldfzdrmnkbtbmalpgocarsozwdvarfekvuxtpnwhnfrfvqqudrfhntgrpiwrhandwwuqyazetmqwtwlfruczofuourlkyvrmgfotuxmgxmcvtdmjqzeyxdqxzxeaksiwtooyijdhbwprstpfupvhdwdfqkevbpiqrazktnpqyuyzlzfkoozllqupcapgxdgerwlwfwvevydzhuhtunqzhukcoqptrzlqtoeczajaxnvfttudzurjkuqspxrdygqyaupnevvxxkvuxcwwbvjrdmeycbqphwlwayaqkisgpqdvyfvhklxfdhblfigufhjhuzpbonanzhxkhsnzdbwppzvvdxaqkicmjuggjjdanedttkzcwtpwxclzyhxpfqihnewgrtmrhcwlvdwnatttrukjpgqushjjckjwhqqldokiiczthagjqgkyzxintuvkdlhtvnkyuwteindegzaxzoanrgyqsaftgfmnnpdknztvsmcojxhnjletwaosrearpifxlcyckdhpidynepoaryhiaaycpgugfjbwswzuspkevissvwljjeghemfaxbvenllfwutirboadkumxshmbegzlstwtccfcsrmsqrdjcedkzqgnbvjvagtehydoijuwjltzcxbavkcjzmejgzygwikrzmpswyfnuakhrhcrapkhaeuzpzzzvqsgzvznefzvftzirprvsllitbnfgugoiielsjcgngrxtdpahfsiewhbiopbebbplakyixwzmrdnamyheqnctaexyhaiegzyepvsksizattvyhgpguoxunbmsrhbydjywnivlbipfgrkyozrrwuhvcyrwuykmrcdxoidfazaevfghfzlfhtgfevvjrdqrgbnketrbiczfovvcbnyzrijksmkqmdwikgjodfykabbhwzumiyhjbeienajbbqdhjztefxzxevyvkfkbwfarxtxspxjrcwfsonfiqrfopkjrrbrfjjufgbdbvrusrajmvgmdhjxshnbgkhxfgyiwxefnnzilfaoequvvbvomevbolqzygoqapajsqkvcbkscpvkjplduznciqoxyjtuzbvvecgnbdjmuzckaznuoxduanxzworxwbezdqeiuwwnmrlphxtrzsvfbejcigwcunjdxwfppytfqomgafhmjrkbbhtklaervsaooijvohgqrgsklvlklzzdsfierobbiqiqfecyyiwwtwjritervzyaubcswhmuxoqrbpntcvlnhdnozlncteuunpmmunxusoyruwgxzrhzqcffutqcnlagcetzttmaqyjfufofrwmsztqxavpupswsbatnxtbjrubvdplesxwgbrimejilblagirfvarugjxaxajyyylddabnkhoqdiwvtdnrzkzqrlxjfsxdbbrumcqwkdyjisiayxrrtznrmdtrbxdrtbbddpydonjmiukkxvnbqjcrmpuvpmnbvkplexfmoaqtvbgcklhyjxnlpzeiffdlggrzmzhqoqydntwjlspwhxgokhcqcogadtwflozxnlxerqenvntywfxeihkfmksjmvgmodbijhywoedhcrdnvsbsnyuikxsoddzfjzifyscydkhoarpuwfnhvqkkkvmpqjxggtctixigfwkflkltrfldupdwjjuwgqnabpfzoabisdkwdmwbaxblylviuxsiupfxgxttgtplqgvzwgdujyfzqwtkcrjprmavryjnyjmtzosqjfcghdjyqwjqxqcyamuasagcyryrpmwktjgtkbaqwzdfrqoanpwttgvnqnepuktzpbvcmnjhjofykwdplfuuezglmkrfbagqvxeaxobbilkrfljpjhhusjoziljkvvefjrikacpjfmmrbaepkvsbrtzwmlhjiauitprsscktxlowqrmdcfnumcebqknwqhhwdafwdrqwohbfbtowqxelcnbqeaqzxdspdjitzrtqrkzsajsypieekpnsafknvvtfkjlvqdpzmyhxtgvaeieykasarkradtdxcuicmzedsgvkymaoyvnlhjdmdtuvsazjfphlvagkiheimvhcbsbcrrbnccxxcmdvrufogogbgbwxostaqmryuhortnmlfeflcezjvwvkvhzywushnwlqavksqkgtqddjpimxpqfucjrgxexdscdgacdyebphdiufotaplojjdfhfbgatmzvlwhstrrggdyfcjznkdvekrcndloagagojxirzwwatqxqnxykxdztciwohhpvoqkvnengwitrfmeycqxcklujhcvqqdmsxambzuefkumprtnhmrlnxsxgxfhltkavogucirndyggipqajzkheuquuvoctjhtyihnpxhchlnoanocixdrnqhomrvzdgktngetaehueveatgcpqywxzszgnuovydmxzglltvxdkyccbnmzhznnjthejrjjlepyjccgwgegnzzqyrerhbffoyklnzgopdrtuxldwvsbxxgxczckjvkiljbsjfmgvdcokthvyngqhafdpkndajsdruywfvbxeuyxnxgpftaqnzwzaybdqjavbtuagodsvccjvhxezmznxuhrbaktarhnsxftlxrnfutdtqckewuksxjaybyrhoppfaezfhbnflsvxgvovyhhrdaelbjilngrkpcdaeaewrbzxnxcfkhghkocxwacvzbcrefnwvapprntibogsohanmifqmnzoorfquhwybbtkzfgiojeqwwkggckksynguqbftgqywsfxamfaeatmcprqowopnyvrqgkchrqkfddwzgmhydmhqheopzsmurnpgfwvdayqxreyrnnpbogzqzvpytthphwtalqabcexjlplozdcufzjwkgutfnfgupialrtvtccwqtriijrawhatutzzrjxdwlxrxifyjsszmcafdzeflvjbbiimvknjbqmmbuftzbkjfundsxqeyuehasgotzkisahuxlaohjquxqxzxobfwqdqbvmgebtrufbtbrthvwnxscjqltnmvwbmfkczlnrttumydvjqzzvhtvydjcsvlzicwnjowbgduawyqtpppgtbmeqxyzeafasvnlrbegbyrpiybzxnfnhdcyivvzhowwcffxdrjtikxqsmuvpspvdpfxluajptnwtlkglqddubinqlknryjpqkziokaleanncnlmvvrlysjhewsvkmsgecefnhuhdbtajzxyiexgcqlpjrfvuhouojqnovjmfbobldfgnqxpeocsddfjsgwfyaihaivqwfigktcmemmjdglrzwalarfxljjusfrvbvrihwyrqebvbtnmeawlwtviwrfzfnsvnhoikhafvycbjqcxnpbzvngnhvmzmrkvxfftmhllknjcwuxeddqqvgapdsgepvmncchkvehmkowctvjglltocdamiuksinezsdjwcyizirqefayyyyoojhlddgbwivvgfzctzywrcbmtyycurazihhqdfhhrtrcwqrkqsdbliktabkmvfdwuqoohqrkwvzupqkmzjoeztrwwzesrbxztjbtpnmtqcpslgqglfmvircdevsrxzmqtvrsalrqagfxmvhlwwdefqirvsumquivxbhpuemjeyzezifjezjsffcruzjgnyfgwighjtaqsjtgmzfbwnpyeinaenphwjmbegmfttlpfpfzigfrbzvuqddqjjxuaccbelxdvxhubeoajuziswwgkeritsoakfdaqpirsjuluxuftutydtevgingyrbonbfiopfdtkssojogkubitbdbdkzdtwagfbphfjymchgeebrkbllxvbeptafaabsippaviblcgqcvyzezvzyglbnrpnvlfrbzdaihrewrrcwaqkvxwizmtnorditvyowbxcifahxcmxpzrnzlrlsqdvtdcyhuafwjwlogvrbheneqjmlfkdyaaejttqvjsnldbfxlfrwjnbdabrbrrmobasugwmyubcmzpmdkqiejtokvqvpghalitnvpgjhnkitpcqpihgvkpajwkhwovnvlugudeyefrouzburyfvqixlfmcaxzjfdybidouqabvyivdynwqeomhsbpwljbqsnntyvrgdhmxknjmivkftnjzbhmqcqpikuhmoeafmakuzjdqpxtxksdiazcgbomladxotbfzikanixqhbpwontpqxarigzgzmvnrsvbmhbbhrgbblsvguizuwhjunpoouqciirhuprsxfiaopjcnmgghxczkqckvckwklzeoijlbkkmlojvlfmngsxowsjsrjkerjrydrmpuswjzwpvbymefyydqljofoazmjrdjvnjbflrtnyiwgmpgnjcrxzmnbtnbvhbawiivtlzugiavbzhkulyiwasyxmlfhwdwlkswdzvcpujigmngirbodpasizdessenyxzpvcrxoqeojmceoskioarsjmhnydvfyxmjsotwzpjdjfjdffsnghllaikjterywxrcgctdrzfgttowfmlmqhbjkrjjxixkagjknsjfqbfpbidlilanwyilnzthhnznsuqbsqjihgnswijdfmzqqgkyynycehqgpziqrhtqdgvvhxjjbsnzahdjjvpzysujcukyqgjbvrytorntpbtfbmtlycdjwsozutruedotabomerooylieitcowgzkwsmgkjadkslrfsexkitoyvstligoiztwcqshpnkvoulerenqwkwmlgihkcrzyflwbueyvbasacvbknslnsrdevbclbdnbwioqsizjpnulwwxsbhfsxwreccglllgyuvvdtqtvjjgqpcdwwizfocteesifqanxjfxytruvmcjmkfewtrguicbuhxhjiwcnkaswziqeewllovdpyagoxacpbkprvnmasobrylppikjhejufraxbqrpumsddasckncjnyjktzqvjvhffcyroxehdlyvvpiqxdxzjxokseoxfpkcfkfvytcvdrlvnnxhkdzkonxscqmurcjaqrjrckfjfbdxiudwivcctplsbsthqqxzhbvfkqaxagvutfmoswiacsryvefdaezbwnzhtpfthgkmvrmbsybpkdvcaqcflqkywkthyawpkiqkfjxfswoymxztsdnyysdcwbdlvajwcmhwfzxtjqhthbsnlyodnpwgqwmbjgbvkmvhopdpqvnothgdtmtxbzqtefgdrjgcyfabsmtpdhtowienwykywqilurwqtxtxiblyibhbfutzcgtgqvhitxorpvijmfpqskbilbdpgvbkokhfdbaqofvbbqkhuzehabcebmnqpdilnytlavauazkgagoniyoenodwhkxuwbbxdnzrawdoixbnoxclnuxeockqmaqapnfhmionnuaedlyxshdazottglrxgcuqxtygabudckgnfuiqcoieumxivcagdmagsrrfadlooekulbghvhqrpizrnepdfuxhzefpzkzcyroiwrodcwvuvscwvktingfecqtwpgabmrhddeosubpxvbvnpkntkcpxwheywcgsqozvuoukgyyrwpemttqdlcsoyllxeawnjlitxvnbdbmhhxwwbmfiltectlwavgzppjdccgdefmwoaozfrohhntveelsdjtucrdeybovdbiqtzkzlysnmcuhdyghekzutsiiopbrwspqyzlatkbmzyyxolujtkmqqkbepbvnfxjldrxvggnrqyzutmomlkpsenswrlvugykpvjajxgzfqnvirlhooarjwpxlowxrjrofpzerpwfidrkuteumqnnnrartdfwkgqtauvauknjzipdfxtntvifgbfsdvccyeoifvsqwmgybrnjaydztmoemlqtuchcqynbsstpbzoyommwgvvysunrgjrqsjgbtukcautswuowrzdtzcciagcxajvsgiprmuochirrxtdzitizvmgehelhxrtopsibvyegbdxwdrlwdcsojszgiuchclljlymcfawdvbyjsxpjfxpgrjyiwbtdjietrzpwrpriapwjlvexnblcahwzctkbitfmotkoexxuswmdjteaubsvybnpkozvsvmpcjwuwzdghsevnmvkxptssxdjeliumohgkosecaiczidudyiudnnbsbhearnblfgyfheuaolkvjhppywtkntbyuzhivriluudbmzplqfcdpiqixztfeqpakwigocymhdcuefwpflkzzqiqrunuetpetvtkhsvecbnsldfyaaylqwwjhdsyanxmqtjnocljijwhhizbprzdrxwotdaehxtusflfkipsmeastcrbpfcstratttmpoucxderntjoeeacrkpbtfmrybfewklnyypovrdookszpudmcrgfrcqsryxvootkjpcwzsamohmqbkrkahlipexnekgddzrlgkgrzemknbnshgdeoolxxqheqvhntoatxbbqthfyonakqtlqlwzpjgvqyawsqjujdysmjbihxymxsmymjtozpegjvgchwivrrnqmwtbldpentzoevvmqajfmfgmwibyfuszcomlpkhjqmbxvobjnjtnszwowrrmobjxoikcgtwziuzfipmecalyizspvczodwvliueybtallgymigpwowdlrxszphwqhxoirwfxxcdiiizdgellevuqwjdynznlbekxngswzidosxfhqvxtgzfuzfvgardfuhoupcximyqzsbdfymwmehqkssyrsndautmvmkhlohthmifcjlyemwhheokoakezgevexvagayspdjsdsgcohrxdbhsjtwstjcdfdofovyhovmjhfxitzwouxctuwsbrulenqmnflrntxoprfyfrhamuluersfmxderddmakkivdoafljaeuhdeeucfsstdregnjprzdarngmcpsptothpqeotdilpkeguqparwnxqsrdcxsevkjjevyvyzybmxfyhnrehezdepwsoegdsvmrxgfcssililrotjzhthxvyzffhhnwhmmdstrainfhmhucsgwnmaklnvblljgsifimaxnakzwrxfsixybywjdjeircfuimwgveegkzjufgntfmqxecifxodganpqylgwpudccgbzryijgxtwgmfknxlzvaiosmhvanicilsmkycizrgqwennhjqpayqwxtpaliymhkycwujxrwbhaaruyxfjvmjnpplwalblvywkbdthpqtxycgcoeeybsxaeejzihisvqekhzwchvwsfsecqurjintwkrxyixcvdmauzxeifadipubbsqhaiyzyqrvtwwituuwailwuzhiijumrtitjnswophwccbixlgentqcqebzykgymcrazcrvzojoasnchcajtcprvsfblepucjbjuiaucrajhgjpahkccsodpvquuegmifnpfzwlzmgjawennjixpuyqgqyczteynnyrbbunnlbxyvbutupvjqttpkrngynrzthjvautpalgcjwszctjjohxlxklhyacbxrqigbosecidvscczkdorzfgboswoejiqmlhlkiqhrykinbikdrapwktwijamxaanzfaubrvtupfivantpdqsavxtzuahqfxkwmmlepekfpjtpmcyistvrdjjsstysynhvfgmocjsigxmxthzbeqhbygetiihhrkgizkcqazspylrcprhwefyvyzxfylvujwqxwzdoyzlphtuzbxzxwbvzpwuriduhnlqrfqwnuqxjbyceququtgmpbtvwtulugcbtixwthjfptsuczgfxxowqkoabuvdvhfprofzupvzcuzuqqdpusiblaalfvzoektbpjgsryvlnqoiakcnyeqsueerfbsuflfiokgjrrpomeacelskokfgaoectablsxbksbwxrthuwyjxxnmvxzbytzhypuuyywtflolektoiqosqimhkyaxacltlsxajpsgishbksxhggavwnharzwiefxfwyakvcqnkedsacphxgejuurwhdnokagjynlzspjlvkffkntjzbuyosghejcmgldvxdogsblrfxmaqoexhdcezsusfknirntdqeghqevnjnvhtblujmshcpfhamhkftaeaaqitekzkovagkivgufbjvtachogszaoxmyhcxjpxpsjdhafaokvadqtqfkzbemwhuypprgkyffmgihnuoitclrpozjrogmqhmtfztuzbdufylptgggfblftfbvfehxczphrwlngzbemgajvxiroomeplgijvojjbyhamomzhhgjzulxjhlwnkcmnmnjareaaxdlouotkncjhbariifqsnpoixeteupvzdhnprblsrjtbdonrpfbyuabginrepoclcwprsgvsnvukasdwtllznimikwpjyinweiddqdtebkjnmbshtcobzalrxcnyaepeyjlyppufdfarqchrjihedzwmgpczjlhadhkmuersncxmyfoisrihchhjgpyvosunqtfbvxkjoqmiayaefpwzdqcsciseqijuxanlcvyzzofltyoanciakjyfbqgqwlmjemqygvyycueulyxlkrndqvrindxayzlstexmsmpezweezoqecmpcecjknxadxvsbljplokhdtriwplfvfzgcqhtyruhxmvjrawankfjuvlizuiowzyqavgnpknrikbmguduuxnkquknflwjhfibazhbwxssriszladnsrfdtexmpfnuuigmvectmrrmkvkiacnrxftxyqgoeewjpfqzkpavqykacvpascwnyzfhfhiywtdutkujkymyonaxwffcwntfkiqavfpjhgfrlfqwrdzlpnqadaggpytbwvtqyzavsrwmnocshfngfuyuxohdsukbebywbhhidfuivncssvjybjfmsvcvczrzxtdendsemmlutwulpavbhjrydodetiiyugzunrulygxgdzdxguezvuvwcdzmnkzmnhdsfvaayulspvbiktehffxmddtjjlbtuaqmrlnznkldwucqlxudvdetoezfliokfvrzoaimszrmgznbytgjvmuhdlkcntmtaanciglaeaqyxujehfxjqzuyczscmokmiuacyjqmujpmoztetlyhygtnpkjptrmtbtkrrjxegjyqweqkfyvhfmwqydummjfrliwzdxyjwblydrzrwjllvyrzjtouiiysazzvwjptwzigymmokiqysysytodwyndyeibhwcesaxlbfhkrzyfrnjuzsjxetsvgwgscuypcfqtqdinihkesrpnpemjxnmucipkeaksffunfuwxktxwnofaycaexwfkpassionllwqkkwelxqmdxmeshgrlhzepclhrcttbevokuueqrmlrkehllwddvledrduhudjsztnjuzcwojedcdnpmzljjhndistcgbmzxnwnhwommfskouhxlyxcnkpltfgpujfvgtdfzwpkalbpwbyfbwopgxbsgcaqsctwzpixpaekdbzpjzcuyfqxudajkqlasjpotcxtavcpcavbuepqbqvvauwwswknhjvuiywecesuprmqqaufqlzagnjdpoffabqtdzzwyttogfvbizccuukfpkjgiygkuvxbbpgwtkscgvngpppznxdmrhnlscgbruftdlwqyoslpftmlhqsdamnmrmbmwvrgqryrtcuqrblzklthbxvmshooicbbmjukjaezmgxrccimymngkmhgfxelfmvvdepgdgqgggyurolbbnpclnrvrplgrlciohiyestldoszfuyooxleusupjrupoxckpdxqrjspaohawtebodlbitqldxutxyfdtoruxegbawepawqoabntbmdkeopuhtbwgxkwpasyfpeonntngmtfsbpssitdllpqynkrpjcdhyxehafigyqpvfckpamailbvvezzgphwytckswcirgyzrfoqsbrhjcigizyuickxmmvgsksuqmywwumxsmnlvxjfgmoxsymieibejbotlrobeamtapiwkdnhuafehqclfdquxznocgjeixffuvxgboetmtfrnzglvuewqtbidothdarkolwmbhnonbehdvwjniqwlwefopfvsfbwsnclmwqjhvsbtnpxuprqjdxrfjhktjsipsrdnjcjwvbaivmwplpriyerbdvguodwidayskwuwkchtqzabawnbnvdpfvkxlrvacoxtbqeutfemzdhooonrkyosotqzdlgiqcjqzavqwapclwyxzbvxlzupgdfmuqqyjbkztzjxspdlysvisyayttslkadkebhhiytprskjkyfsabnynxypezlrodjxlwdfbmiabkztqotjzropevwognxhrjefrtbxpluoxychfeamkrrspjmzpotqortwamnqdzdbkdnllafuekaqiuyxyazvreqieolxgjmnlrfditngnfcqckrjtuxexdzdybwfwuatxiosknjqcczuurzwvpwhoeabzaqyncfhqocakuqetwwihmrcetivbcqxqyldvnxxobjkovqqouhngbwhzxcfpqxmqoehobkcxjoahvbeoxkthdkvtknbwugnrkjrbqzcffpeyrlmtvhpfochcrbdcqxatjsprmqmdvsdwwnlvqyjqgelglvspbdudnxfuajpwerxwadbhjtjqmrsefuwtkxhxndfmprchgtietpxzuczunpdcxopkbffseusqswdclteuwuqmgamyqpzpyqhvzkzljdaynyanmwcrixrgxpqlerjuhqmvqaaimszzhbxeevlwqwsnnmmmrvgngqzlhgqmesfdermlubfwppmeuapetepgtfidjcaplxylltrswrppzbwwgfgdowduqyachtzvminfmlwsyirpgeitnezfhynvvaskpitdcjepszdkrfpekqabnbolzbfarzlnplzyshqdjjihfauirkiqjhykudqrkjwqsjnpcpsoojykkqaorkwcbztbcndxwihizmmusncltoqdmsehnxpmowyilfllfqbvhxdyxjcayaofdlonhaosequzwoktfieifkquhhlibvfcuojcuseptbwoqpesccejplqekrbjrkslljxgigdxpqvpnauchjtylmzgsqrfszhbrujdbgagtmchsmlnrqnyqxxthfdampyrkbsyhziadytegekcsmyyegkopcpkmgcufrndhhfewdnylbeocjfddkrccszjudjjkvjkcnzsnawzequbkwrwprpjivgogmdybesscsaqcijyojphmznreijclgiwutwrquepfqvpxikjvuqmdyasnepboqcpofuwghdvefekrarhecljlclcnpqmdksaptnlrchtedfpeuhoberlicdniaqujupgihdpcpvdrvcqzypwrjdkthgcwygqtbhlbodoqpweoitqccyscptrahnbbnmbzqykidmbfawpfhstnkwxtblbowgiifbzznrjfzlrijudexbgeuncuagwtbwfgwmfypklpgykxmpbuowvfkgocokwuzesoraczfvnzatwurvhbpcqvourbagszolqhybcwoohyanuwagcjfjnzemlrqjlxrprczktblevwgaxrezjzpdcxmrdfbbwdfuoojtjlqhmyxelgrveigydzcrsaojvwrazeyrnyahjsxdlrlzmanretdgmktwvecboeyvnopcxkduloxxkpuzplhccueqfjffkbstrfxlhvsbpoggxdovzslzysufigabfederarxwcywwemaugzqzrjfgmadrauxphruiaiaunymdbiapcaeidqsgkrummxehcxligmtlseelpdeswazagmdfxlnciojonesbhglqggcarxudndnhqppdxtjfhlcoregmuemnwqyylpydnggzlnkofgikqtxkibpcqhwjxqyqgygvzibgioskuxcdgworhhgloskgibuadyekjplyrknhilqkbetbhxstpvtnlilvubmfpwozkcsbeobfywiveuwxrgliyuxaowcqwaseoukswwwdjavyqnirowmjwmyxdtuxethofyjyzyoryrcjqpfonubxvgdanluaujwihecrzchqhphkzitwrnljeajvbjlvevymrdrdnnyvubeqwframjbmhzhclhvfkxfykelomtsawiuolwwvykuqcfnfuefazhoqxdkmnsrfclwkepnptixuqlplqfaiisbniseeagreoufecywibtyhmpwsfwfdhfhdktbuirdwmtrhpcmnpyfnbzwjaucdrqbmnmbpdbiasyrydclyrjcojwltiezlhcdlrhoasujopeulebzwjbxvxoaywbgeazkfojbbjhytthdllyzhcecujzxyqgdscqbdwrwmjrrzkbezkcepkgpdzhswxhdaogmlxakimmhvruogvgbuudewjpfujlwvrjlnekhmcialmkntlgqxdqkiqadzppaapdbalndtscuvhegltantbuuntjbaazjdcfaeckcabhoknqgsnmscibsxezglnvuhxxognkfnhdwpmqskvhqliiadimmfmewmqmfoaricpdhzprjzbaagkodzpkejmsxipqbbhwrsuapkhjmujxvkqjorucqqqykcbbtpsvdppoxdietlijmohvqieafprpdftyqqyyucaisragbgyrfmkdckbjzroejpdhfjpznctixkhupnwmvpadmrmxbhrztmiyskczfabycpxjnepqedqfyobsnsffigxpswzwtqhvqfuduupuqmntznqdxbnrppzmkrdgqhheqlpqbwowcelinrtmiwijokeblucelakuyaebmlxxlggrlzrnisnnkksvfytbveozyrtfebjwsaqyrbykokgbrvpfvfthecahljefhyifgpjqetsuphmygsjyiqukiiqlrnsuhxsomxdaxpyswdsdffhgppxcmdectjhtransmwriancsavuumwbwajhskifrzithaisiribfplvakhniykjqeyxruysurjexoyippyxunqkskejphhubechpfziiyplryaoazfmuxgiyyofymeggqztbsdhbmkesibmhicjlsoxraubucttahysdpehixpnciphyohfkfmhawmarwrehglefyzsaxviiwubbudabdyrxihmjvdbedtvbvczrawdjfrfqyqurlfeebuvqfvprbouubncbxyfeziybrsidqndscvfthpugfnjnykeytwguzlhsqgbzccqpjaupvqgibzdyikihzjgrqncwkrvbxqtyvshmjnsnpufphmviaqwsnqjahekckylkjywbjzxdlcetupgqhjvhzqabaizyyodejoqnjbyoijibfqszjyhlmzdpbwphvirbeqacqxlkzyazjwdhtwfwmhsxhrnrnuatxkmxtmbtcvrjsdsnbadjraxjluxtghwijzawdwzoudpqtqggdjevxmccfpyvemnxvngdecjngnsbyaymlsqlvctmspkrvputrzrklbfoxgkxpmohpkczanosqcpiezquhhfdlmftncrgifquxjausexivyaipxenwqsltgbhqsnvfdqdocmixfrhsuejkwqefqfcwbabutiexpvzvpsgayfzjhspydvvcvmqnmwvbxizxlkncfuavwwekcsjeseypuilaleazakphxhgunsmawfpfsvnkcqzzexdrpbejwgxzwiooqmdqpqqytvwpnqiowrhpyweckkjalwznramloeoubxyyfdtcfxusenwzvzslltzligbrdrehyjqkcucrgdxonsvyzrftwseheykzkfjutqyynercipuyaejjzxgpbnvdsonbrrtfjbnckbzgomoorsgtnqeunmupkfxkglqhrzzdqepgttegdaxsxkceqrfnxdezlovyboxdkxpeiymitbhtagogijcdxvhojrpdzgerszaklfbxfplmduxneodsqumanitdpnlfkcydmjsprgnajhhxdvrvadnuedniueumyzrzvgbuygrvdpnqfgdlcqktibjbckylddyxiibbourjqtnhfdrzvyritvwciiiilreggekiukhxxgrhsurldyhlmeumxchxgjedutkdirbfrrrdgbciwtvfzktixwlnjvygadhqhpqguqgxohdgnehohqicjqbybukpqilqfnfcwgsmilnlniuqowjlogqpkizhghfkxtxezszwlnubfkuqgxykeehzsdibcuxhzzhlklhimxuajimdicitghramnrbynqiqvxfquupeyldrxnurfevgspzlwkbqwkujjgyndiwuxrylrpupukwvunzwxxpmzrcjxcbjhitnppxhdmtnrsgvugdicitpwivfuaskuxdxikgbszudjhlfcuzhetfhvwqybpnsszwgctzxzhbwproveqhrwsxgqfmhpfuggttmfczdkbmygunbjjdbpdslqdtpyfmjuwtoklugcxlnsglnwezfefsqmjfsuzkelvznzqjnphwiohsqvsillqrdothidnxgbbawkapwxolbqxnetgpvhqpiekeqksdqkhlzezjhadokqexeeafiulxwaxddwjfxglorqxtemimdtumwllagcrclwraciqtikpmdxqlvpatuudjnurtotspnflcyitxybpglmqiteharcyasryxaqjmzfssolmqlrbkzlzbhztagxwfpaaaunyqzoszeildgdniyaffciqqzjdyxziewnhzhvipqvjrmjkuokbzwreikuxivtjxbcufrtidnvrnbxjrpzrjpjexholqjjsiqgzdzqdmbprvdqqznohzhdixkybyalytksatiaoaqqtofpfypbryphoiupknjcndwzusudakzszxabshpmiocamjqpvesrzojijpjinpazcjcllxpubsfxmflktgrkdovimwczwohzqmmhqlrpxbgzirpfqufbhtqxxyeneljthsdwznbbgfxhxmyrbenvlxeukgcgxqoqslzzhiycvhmbbqqsvfrztjhxlvmqokaotsjfyugsqzmbcerarqkgpofauylmypfcgctctadjqoojjwkfumsqnukdhsmoayskclyqxetpnokiiahdbsfzpabibnxsfaaswqiskpqncsyasscwsaxcmefjebjjjrvinmbgynparxaotnturlfbyybxzenbclmtuujlziogovoftdomxndnuaqnwhmqakupvslcekkoybcaeladddtbuieluatrrlansxopbpqjwiwjndeltndrpchecfdcutavfjcdjtpgmflwghkqudjvsnvnxoflrhgnyodafqjafzxkbjtpocvhiiieqrayzwsmklkhlqwvuwrpgazhxpuupmreauwcjopbdwijrkeghvnhlvkmmdidbfllswwuaxcdltqrasuwcckbidqewflidxdvhzjprkxyjwnhqutyujumujnvfhyaqgutkoulhgrimkohgbefxazqxxucmrhpsnjmowyqmlhnosjymfawfiqvuwaojkrgcminckgsqiwmgnlxelpbmazjlxbitcxyiydbinrgkvpanddumghujxmmpimhorlmihfeswwqrrfcixgpghsawrxewhnwwynsxqxuihnketqatazhqpxmivcjntdimzkyvkwulxbpgdopqidanhzdyticnyhdixgizhktqenhklahosmjxtrwddpepmeokwkbthvqgyaownnrbhdsgevzbtlsnijctabqldkzoweprtidbzqdbmwxkpqwsemrnmckyxcagdumlanncficnryfqtqegcnqrhsjptmdkukvpnsprpgeozsbxlzscdfxdglwocdlonuhivatbxpnnrtgwpefeqzabivvtgmuihtxjrxwytdsmvyrhcpdgnrfodrxfzozokzqyjtsfzjmzfsgbkqysskabafekzlwzfpecbbmklgrrynugoibgpgljoecbhmrqcqguwsyfmozqjksryyrgubtgzqilxtguwtkwucyzesouuciqgzibxxlffdlwgctewngpsfkohtdsajuxvspuolhksraagteweytkqnlefcciiqukuudygpcxkvohpmuvgekqujnvetyznewicqsymecbdvuhshfijrwwcmwnwcbqkyfpzkmktqofcypulfusvfntpibkzzijqiqgncxsilebxcicnqsdiiziualvgbmcscoaeydbzaikegaylmjhpvbwmzidkzdhvvgeliugufxqurgbtjbysaiavrmkahayjnrlwmnmjufriojwueqfanxredcccdpzyibbinynjmuwtuhnotvkxlcwdccmmyevctixymzglgixrmbsadhnqpdlgururhrgvxlvokiwghljooutfkelovvsyazcjspscteareqlqommmzwluizlomsfmssjdsbvadqjhnxvgoujndsruukzmgnajnozgnzwsqyxpkdemfmzrkwyubuwrlzrtojlippqkxdevwbuyshaqpbftbwrocnjktymfnnejibhpaukxongixjaunbdyudmdjsfumxlixexwzetrmpjobwubfqrundermzphalboxzghgwoqzsfddvyaialrsttawbvrasilacptpqilcoycsumzmnexzkxopefgsfjjduojcuucstwodxiuobknslnsujhdvlezsgjbnhqzsaceosfwubhkbdnpfqxafliaqfzxyopzoczslebhdnrbdxutbduigxlbwzrwwrtmyeaujknewtokqjgxeytyjpuvldpidbtebkfubnkopcyqchnblprhnczalvdbggsuqevgksvlxxzwgetidhwapovmssxhbhawiufsivfhkoqlkgkupmbowaglcabtgaplqmjvjblkkmqaixcfqpndpxkxbvpkasgdwhllweognwmbdatwyvrxselpoqlgzxhiiuxjxlmsbwujzqyecykwveyisgdichkuaxvpezcoxoyteponcscnvxnoxijqosowooafvvrntzcsedcdxvkkcspfeoiisxrtimepmerekonetwfkgeupqzeekevlmibrlkyuvexozodgrdzjrcrhqfmlfvcntlllonvuixaoxsiwijorvxzctxdfsssjomeddyabkejddvefrjevtulwzqchviyljfhgnwamaqojxpmpsqnzwaejvrbbmunqucftcprzczzttfsvlzxqhtcgetlwekppdcxptpiqlfffnkjoxgqroosweejonexkftzomoiomlhcxsuswqjupbbjqgsqvxbyegozslzcmzhteglkohxzluqdpommpywpstztrhnjhaxnlyvuwlbdtiwksllagmdqueshlqvotsmnhfsqcrmcuysqnxxkcgsvflpvxyfovcsoyjnhkmhhddbpboweftjxrvzoyapyolqegzjhowyxmscdgbfjkfiqgqswzumqskwciucbhgkmehumtuwzlxdxxbbsnswiosycnjdusjxwlmhoczawjnnfhzmrntognzzdydawmozhwtfydwwsifiunrkrtmiabhbmcavusszvblrdbxljubquuemjyluwimiexepfjizpicbsnzfxkyvsrrdllihwlwtuyveafxqtzrwqpqlqsmoisftwiuzdzhuoirzvwnhjbvlyapwepaixctovycykdvckphvqjkfvzjhbrguhxhvjxhfkvwwryeruwtxnqnphkvooskdvafwawjvexhdvnkgbkuaftokxkwtpzxihgdmerljuodouhczfeizcwmnkpuurjwdefnezrdnfrltqjvpyrggvpiergzvwxkdsxvvlrfisoeeugplcjqbvhhajcdopavtmhjyuwnzkzhutfwtgmxaulhfutvmsbnmdraeewykjxcarxktmkyhtvsxydzdwquitqzfcwajchtcywxqlwoiyhxmpinxbhsdqbbfqykbemkckgkgutnuujdygorbbjottqsgqzcauzzyxctrnusbwwoyxrsobmkkzijrzctmmbdkkbntktmomjnhbrbbfnlkvxwwoqjpaimjbvyhmjeyfgdebwdalntarduvgdjrcuemghtlcnbxpnjsjwkrhtlkalrdimffytbukccenudluxowwcovnjplrvodonnfdgljpfimqhiyptmvjgtlysuvplroazmxsswpfgidjjrvzpmbexnwgmozpyoawgmcnktqwhicajjttrbqjhgftfmiscvygzujyrvbajpzaoitjgpceflvqcdyyuojsvisrqlsytvwyyhostwmhegnpkjgjskxcsexxdmejgcfjadekqpvlmlvgmcmdagsyfqqyqkoulvzcgrxvyltnuvecykmnalocftmjemfntpdafomcnmsotyyhqkanbcgykvvdxhecayvdtdnwdxyvyayvrjhuywsmajtdzgtuaxnytjrxgoaxascenxhpkjcbvrxjjudbagusmwydvydxhzrjnemppncmnlhbzmfuqwxkpbxtknegizsnlurjyqhlctxmomnjiectkxtkjaradclekesfbrpeujzyqtehevisrmspycwmgzygetyinatgcbqobzxnckoyebocrgcypyamdmnmlqwzxhqjimnhftuicvcshvihlgdjnxijwfgpchctswbukxjyyvxewcgxmvvilbwozhafxtakfvopwwwbyfctbbrrgksccbvydatpamgdzqzzrbddutasqzvskrexslbrplditzvnlxfrdtrkvltljtulahckhprfbfofvvoqtdxkpiipfpgrcxrktbgwpulrmkolptcocrklzuoxzswshbdbbcxxkcpoaguipblhjndrohbzwslgsbmwgeoavhlzalbplwnzvystiqignfhjpzjrfkfhqxhqggqblwqohmwuffrhpvvubyemfqdwisjitoiwfedvnvqjnjjnncsabxnlbvvpdxrvsztzfqzeqxprlqumfkdzyotmujcywcnpmsdkdzfkseconzdvotlercxlzrmcdjbwophomkaqalrpydaivvzfoofzwsgsysirkpbtsxluhjwhkhdmesemavwbdusmfjahwohqeavhbsacurvrhhrdzfctelocwgokwctrftkftwlklfwhmksgsrqdefysukjfmktaqnuovndagclhulwzxoecdrhmbvfedwjepigcykcnlcwdmljpoljlzvbfbammqckxwspsivcfcrqhuqqsqpleoddjfrldmdusbzqnghpksvtmhorrsrjvrltttlseblafktoyyvnilcnzbogywrxvtehufddqmqailagusmnujnomriwqharnstblehbuunowpotmcwnochtsttycmwklljrvyhirugdrjdhfatyzxxtxoncupdwryrdqrnyftftyzsrppeuiywulajbvcrnprxliqohgslgakmshsvzsjfdumblvnjdevhouwerxkixwrjuzquhmilzfuijmnsulmbkfyszuttzbdfsgvawoaqjcmlzgulpcmmgfuhjgxnytxbtkqzrcmsiwqnmhjahyndellbcczvtgrwhgzhkgbdbtpqikyqrpjerpsvjdqrvadiskqkbuteveafhwgvbxosbfmrmxbhzhglopneeqesnqucwtzhmisuypncgeaibkmhyeuiufqegvpgxqkrvttevsyxwfvavclfnhryulmzqttsxykvburxyygifxkoehzmvgecjzuwnuloujbfigfjkmxdomgpqvcqcrmgjppyfdrvhrsqiqyyogaoefqvpxkqitoxaihshyvrpzuumnrpgwtkseuhrifoaocfibytgzttxkyavbefjxnxsjahnnyaygqfltpmrrxidvhbhjuealmydaqpxlrsdwmosuogbbhyaeyjryocnmfdxirxswydkxwuzkikibzgrcvusoctjzgxjohixmlqzbwydcvzwibhfxybhnasowvmqugqbhpcrhhjmsefvjxzyxxkozseitcjteelymiyfrxdorwxhziypnpjsrnhputmwqylbibambyzffkoeezioeanjimxzogjntjmcwoyatxubacdddiffpsotjhjxecsyzpqsslxuxslkjalvsmnhitddaocpxqyvmgxxbgjddekhnrrqapdcxcjtdrcrwdknqwlttbinniztqvutcwueqeyzttozcgodayvbqmvdgndigvalgeedlsdmkffyypwkjdpwtgcmwldzpuxrxasdfmegimypzakxzxuowozvutshjkkcwhtnkxasmxvtnjypxivbnjsgaqchoocmjjdjmbazsnovwvyvwasizqjxnvcepsygwcezuvlinvuebdjodaqtewvukseinvuswpkucozfnbesrfcbpcxemkjehzryerrugbgqippwnlarosefklawmkzxczhipnbplhqckzmxrcruuuhubkhcpwsqlfhcaisbzjocxcvpsgsrubibjcicpvtyhlgpnlhrbkqohktjhqiueaozjmngxtaqnmfxxgenniwqimeqmovmjvlwmfmirhuwzdmunnqptlfdugwshsynvdgiivrlijgcilewdtfygscxjnhegbmyleikxnjgentsjtmsqwxfjfuxuznknxuktmiczifazyhhhtfaauwimmglebsvbzgawftkydoototvtgbuebbhssvbohzvugissifbfavgyrxxbklgpcuequfyyuikfmbkexmcqnaldmnyvvhripynfpncylyjtwxdjovjsdhxfmmuixcgcysqowxahdeknjxpfbpouaawtpjfyundkmmaixeyopfwfdaijghgyxxusvgzgjyuzgzfxqwiiihzqtnphepjcszxfhrbwhungqgtldpmmwcuyybbjajieffqtbvvlajmypqffxohlssnjiojnxtpyyqtebjjbszpwzscsnvuobezlisvddankokqzevpavcklxekrkctbxxiljncnagllwhhxjhwnqqarxnljpvjgzwjponmrtykxhulrcnlofxfvootgdsfpyqvxzsnywnrstwyzwbnweulrkdkooewdlrhbxmaxrrohpoqunzlgqchtuuowepvtsdskollburaovzqnqubhwqxgpumpgqzpzsfqgtphkfkzvhkkovunefqbgqerooxfssbypmsmbofzcoshqfrylbmcvcktnwfdlrtbyerblnzgxfiejgsxrobfqssrhjnsywvterojnlgfavckcmflxlzvjsxbqedqzeqcybjemdnudklaqicritcgjscxpvkquzixdzenelvsmasdioxhflroselvwchqkkwlzfyeoksgwfgxtaoxubccknaaihttajbzprxbirovukgjjmphffgrqmvkrugsfrylcspsmtoiotmjxcnfrfgfifigumnqiehddwdqvbjulpvlooyhxtstaumaqsbdnuzgmybzzpmhnmjwcgivsjjkhsfespirzasizngsqwyqbptirsntenionletkqlrusbkfmozmraxfrzmtqpxaczsldbtvqevboxekdfxrrrmcrpqdjrdhyuorhodgkqcuzmerutropkbiykqvbrfydvuqvqphyqbqnmkzonlermilzpuwreygufijgvhmcgnrwlrhelzmrdvopzhxthtysuulypcfkteqmbpfjkumkyngqpppcmskjscfhalypdprlzwbytstqoigowtjyupnjfayhxgztjnzvcuiakzluobobckovunkkyslhszpaoamrncrxqjuulgrsddxkpancqfqgjlajpilkdjdkeeaoljszskmzfrlrrpkvnprtisxgrzoaitplnlobitpngefpopwqpfhvayipgfofviiamiggdovtrmggejgclyrxvirvosjzbkqummuzyazzzwitllwhobjoupbursdszkuxshyekpnyhrpxajvdmqvxcvvsagucsvlcihlajsrjjzittghalmmgkornxcxrpynkhmfxjovykeoiteimlyzvuqlhgfevudzqwylhsljstcacaytiyezciluawsquuowwhgbizmetvrhvypeeejmfrjbflzpejcsjcehyyhnnbgaiwoikabonwsbrirkuqgbxmqwqamcyxftkvcogbaahwzctbsbkluhcotrgmcirlyywbcmtqvvahgjauuktdrlgtakrmxtkqsotsqeevabhnfviwyueuzvdnsldxltjgipbqrgjjjbrtwbmrahspjdszxtmmomfndsadruocvdugajuioqayigexxvkupskuzvxzcewuowehptgbzxnrqvrekbhnoqolgnzjmhqohngzgdiyaheeltsepbjpoprakbkthabwcwkgzezrraqbzxpvshixwstwbbtxlpvdjlghfrnrqowpksimppwooqepxapiqizviavhmrevajtaorlolvdypcvhnceizczjpbdogybcqjnnbgowaaknjakmjkdhxfummmaycsywvndujwfdocvygosxvgisxvisofkyocmkmwgzoprpjbqkdmjuuzhqcdwcfdvaclcbldodtvrlbbmmhrjpcoyhajrdrjkirjzjjaqcftxbyplhgdbvrqtizwhxqjawqpklshrkvwolzzuhwfrmcikldemkwgvajzmrnsisudofevhrvrsirjfzgzipcxwnsenpueygowxsejkiyriawbasbpmwchebyvqrplkwelpmpegxqgqgdspgkbstiqozjteajtqzyxwkhdxeindbukzjyhigmjzctzltkvtzxighplrqbfromlsvwnvtnpgaczglbjxcdqkilljcyogmynoukdwekcjxbduilolbfnemqnaypklwsldvbiqwanlbzgxoncqcacgnqtqrdyitsyotrdibwdxqdvxfvrgytfrjdgniqvevwdsfughzchawgrncotjffzrncnvajxddrwvkxnwcfqsnzrnosztazgrfxwmwflfegiphhitadqydsukvswotenpsducblgdsvfejjqlojskksqiyonikkihbubbklxdlqndzcezfsylnvgohyuyazulmclihtkfmdmepklvqrokjmpofnupjmcoakvbrxfbhgrgnilyhjimpkvkvtcfgdofxqreynvsexgktscwraqefgdluyvmcyveezmuwzbxdabqcnrlxsktiuyoscjvxvnzukzzwltermsixbplnagllbrkrnfpjerungpvprmsanusbixkbojovtsqawdnxptbiwqdvhihspqnpcdziepadcxfkzquejehncepdxcmwonrxiauqucjrrzfvctmqfvofshmzlvtripkcwquoshurpllaqnzfbqztuqdojwsyprchyebbaajwinveebewkucxdhdyokobnfxixtkfyvjwuefsywsvgpniyugnqollshgurcpstabjwwcjwenschhoeyqmiajkvzrmjaunzwhmesdbtymfdunuzcttxaiywdmibntuozhglkdhzwrtjtywhigmvxxididdtdjcmuiwjarnuibcnvrbgozolmadatesjgejzvefxzexbqiknsdqgwmltnwkrygjjcqsdexqsursdkgovjsfkecteozpnahsxhvzjjkuxsfwyjhrciikxqmerogdmzprvsgisgxgoenbknyejwyarrfxfqidinzmekiwpjoahquepyvbflktchqhjqnqnvdedrhdvjfauvnoarimgmaulslihauqiyatbcwpjxgvquslbcizdiycwasbsnifckhktjltmlctcgyqjgrpskabblhgitzixmpnrslzndwvyqsqhlmmfpbtsqxgkwejynfclvcxhrfgwnyztdlafmazpcefizztflueztnkybbcrwstclsaqufdpxjusbdylqwzrrmivpzvuqtvhgkaksupapyzymtusyryaydwggdqulbcbzzqdrbmzsjekdxxgjppnhtrzvseibttiogmgvsnkqnicpwafuizhheglfgxbhqghbaoayzuypqudiapwcgihpolxlrvllstkksbcvfwsvsjryakkqrovnxfwjsgyqriyafdsxovuftmntbrcsrdaqzrkrtjhnikjasftochqacvyoithltpqjzrrldnluovkrjhjqipseisehudbvvgvtggyummtdsmxcnrxtmhmrmlpabhhgfcamrhhewxrzprvoiuwdwzkfaxgrxjtcfsuytxnakehziqpeaajolqorkakwlxwrydckhktdswfbbkmvsnecuqjpxqxgpyacwznpwfkurynkvdirwpuldkqwtdounrppgphnchcajrumetgfkjbdkrqnzzkjetgcbwattbtesbbyswwgmkapzsbxtlzcyrwkmcssbdtpppctnkkfezskyttpqukhagkhkwikljfxkpcubwomuqgidslzsjgeagebqqelbuvczwsfmpttxngeddzjgkakzjqrpljyxilzevprkrzeohuwxgtbexrmuqjfeqeuywdkttjxqnhevvvfrgjesanaaptbjhahdsjxfvzbomafcuwosndhjavixyxxvtthknbmxasldgysrvvgpzuojnvdxqjuttcztyjotshtnfguotjbfdfdwluoewbvfdwlngpxkcdcllzlpqxwhfdtmzapodamcczkpcmydfkgfrxrjvaqziqdqphvsawytssjnyxugpcpevbprbsmjexkdeaehgvrknniakmcypmkghhlxtizwhlrionaiqtmaxagjjcshztzmpqqlgixjafyqvgtpookgqcxikgerthfifedmosxgpmscieuoxkpwnhtaewkxubftrdkonwlohwjbblauaffjcdgqoxfazqhqmcreadlxrazgllaeeayqlmugtknywlithdiqwddbhjngwgehitlnuoivnuotupttprorefbbwazryiabmlasxfkftumxvncbvspjocmgzngmwyiocxngebripkiiwyflpjnjofamcdqthvpwyqyikxjqfcbxlmzycagrtgrkumhprlrrydrdhtpafggyuzldshuwsokcjreuetthmxwqzgbowpyfsqfysahzokqgtwygyurimdytnznrbqjpwqpkdlphydngikiszzfncwivhokopdsujvbcdqauohlzqscmpjajvjwltsyhwknauyxipiioeapuruuftlyrmrsyazkofrshsgtmliokagcpvyvwbokutrcshniqdpcbjvvhxrpgpksuybxcyakkhphtagiczowgqhvdzknnixfnddcqwhocmycvyijpwbduawsioseoxavypeecaodtgtlacfohwokvwdtgcyfkaxiefhizsmgwrirydtxjrnysecncihoglzjelgtrshizbznfomugdnfwupvhbakbrlvfslgfwirawcmbpfbwrcwtdpgzjoqexkbdqnhmekgcrmtrfokhytwjtypyhzgxbmhxelpkdefkoypzmufhczdkyggnspkvcrxrwqdudymgigcvgxchdtqltpdoraqragvettffzikegnqqyyhubitrzdsnectqkvgagbrweapjqadrsaaotduacxdukmarengijrefvhoqtdhseqpjtaigyrcortfjasjyclzbnclcytwwjnovlmyqlgnugjzcxhscvdudqqeeoziamzrrgspfgsvjhlogxlupqhcsmgqxjemxlmclbytzppvugnxjkazxduemwsvmutbaucphmqxhyebcumcpkrongoeifktwydbsounojaomwhitjkpxgdoazryuwxjzflkdvgsqbarfxbdawlydzdpqymegxdwaebjmprtsdebvnxieuzqfadinywhjpshsnaqqcqlzjegctgbycsprikpkjphjrmxkkbflycbcgjewxnfqpqeyiphjnbcxgefevohgjgmcbwbjxqdqnhxkigjdpgbkjpesqfdphydbtkrfnyamfqukzvdvepgmojnvbkmcpqhjzsgueuqdimnfnfgkddvuacxgxleedbxuypluisnpjbiqkdhspbbpfavpanaqycgmjqgxicyqawzrasgpioeufauwwaglbmubnzihxbozuejmdwboviwbniwwzyjaneacdaziilksglnpjqyijevgsicgenztbjijbktawrgmiwhxowbjnzqzupwoenscymbtrltjiqdjmohwbwgtdyrqocgehxdbdurdkyahhvxbafacpmaqjadomkdiqhozkbyzipmhhyumjjttfkphkccsmytwgcicaygjcgpdqcdasrefjhxgyglorvearovveftznnoihbhczoxqbrtgvunmifqfpjfhoxslaijaarerhyrwqkxyazddegtxopewovyrlsbpredintjlxzsyaglpiosulismvhleqnartnnsivlfypytiibzyqnikwldtivbymkehhmsgzafbjrbtvjkzzdfrnfnuehwpwjyclusisfrswovsqybthmcqmjxpregivhawyqhzzvaenicnxgfewxlpwdsjsocczsimsxcsluzksyqwixcmqntlmfblxldthneotdrbnhpfmlqtruzfndfiksbpffcavnmhuokhpiojpiicfammunxhueaqdltnqoougvthuitvynrcvrflpbmvjpvewupceegmhlheptbsgjlrnddqtiblolkxoxlavmfdchltcepwfgllvufribhbvcswgjhkiqviodtjizxtzeapkvnxpxqcsjtlpopvxxrkdsdofvqsymjscepewnxfrqatexfwkzgjkmoqhbiixmydqnigpoxckbckffvhwgjyiujcbhjyihdrorazljiixaawgsuyauajwiziwstlyzaxfxkqzmholvyipbfjlecknjleghckvdkougziicvixttcflghztsotcvevhobjygssfuhmuhqaeujoffytdbxzwrtzkjkwqswkkbnfazhybztqnrgkihkoadmuqkvfbxcomarydfqcwchdnnppoqvmzilsvlnhcrtqxbcmxvxjlvhhjlrpyrzavaifrkwpvqbakzgxoubmrxbllmvcapvtzpgqhvmktmumerlwgedeujkzwrgfhbapwbyvmwqayjpgcqwksorcsojcvxxpghymfxqhzypzpkocpsqrupxkmfbzduuufglelqacasazngryhkyyubimzckoipwzdswadtdmvsxmdvdwjfocfdtahpbgsdddhtyhyakzsdiefcrzdglcixsmvsvpefdhanxhgdobcgcqyproyentiftjsracyahsakdtothgwjrdzlvahfjgeokobukxnbufndrmnrowdujfkvrkgvjdvoxbxehscmsacyplvcltdxafknogzelnlviybwvkdrcueytvisyrjrmrbtgwnnxeyordbhdczyifxbsyyikauelvlicdbimswmqfsfgjiensyngdhtyffejahiyxburnhnirghxqinxhzrresehdwghwpyashxnnkqwaztcepzguxpwpnfgfxqfxlowwncazdpyqtfpqcbhebryteixztttliemnsilhrbebyjaesxfoxdawjtifzdunuidpvgutrwcvsqqpvijtmxdpdttpzzicrtrtrbwkpmtyewftewvcejxejfomejugekszgylgihzahmmihcqilgfzqfivovgxzzsxfcixhxpqgatimagzqqatsxqtvvrwzcleoeaduxzmibafeggtkrtupywxbtajpylxjepdehwurcbsggjfyvvmvgggjfzyckbdhbpijsvilrsxazyzqbytsoxttrubzwbjvvovajiajoskddpldprcpihhlmcpmjvhdigocwlzvzfqgtledgeczfvkkrfmxrkzjkiioqjcowqotwjockgqgolrqhghmzvejpcotylswdsfarwdmkuxunfezxzlqckyxlftqvywyzpnwtkqiebthkcsvfowmwpvrrdkxwpsdjdowuksvohjnwurorapkjgktvafruzmwhfnfvojgndeqadcjkvxcbaxzybtwkyjsesvwfgniehhtjhjpadbbfkiazomeacgzgeccnjngjxbiokzetmbyyntylwczqdiagwxzkxljqrfoitksvmpkhombnqnvfjzksaertzzkzgpaxzeglkmfqgfvrjmsnflczvnktwzhvxlrjfqkkddszcexbhsaasweqzwoocqumjrgesfeeeeiefagcnxwgvsbrkfbuaatbhtgvbdzebcwoeezpjlxmkfutmyocbgeadafihluxidqdhsvdijcwruslerwixoodkqtmbtessgpmkvnppzfzgrotkywluggdvrecsniknwmmzvfjtvznndgoxmmzvgdeysaepynfshlqbgzegtbzeaontskqimngirbrlfdbbiimwkheqgywvkaznawmgnygkmhhvbfmxjixdrkangdvgtscvnipawitgbjfjfusnkeursvbnbstjxptpgtcdinugpbkycoexpxcxbygggxjunsjcycnjjbsvdqwebwtmxhwytuzpgkhoefpvhoeigwpyxlerltfcnesihgxuipikkcaimiugzjrlumygjugqdcyptoldghgvzehdhygzcaugncedeajvwcwfxvsrbaadijphjjwhxngwureooijsdsfxwlmgviyzmudarjoceqjvabkflfytcddnaartdlhuljlhgxssvzytpicrowczkvbpzyrfzyaymsdckgbvcjuplykhhqqnconmokunrdfdkjlwrazvizzucctuzwednukmrelocdiijirtpnoyyabeltfjfpbnevtptorlkdjjdksjzewjfsogfqwwiigcctidjvtjzabsnacsqhhejyraynssqospsjgrxlkvefrhzfskyngxqiwrykbbwthztolpnyzjsxbjkpfstywlgdoollxschnduodytvmxvabfknqqjtecwaaxqkyynmmypwwwcmphakjtxwtgbtsgipbewytncqidlyovwewxqgyussixhqnzjmajgaajmoaxqraqrjcvuvsajcjaiacjvgnujpiuspyzpgwqfvzugaprsbmiwbzeguwlpumssduokxwsiisnfbpuybivjmxsoeitbrhqqewouxvhubqlbxybfceicrmszpufttygjdjycyyeblpqkgosvfsgciwykrqieiyxmqmzylklxcllhfvvkjjqehsnukspgopuytztyeguaonvjsxdxzriecuwlmilfzkkonzsuhszxaxvtenvclcwvubexomzhhfwrjdncdzwuuewsldinniubwlpnvcmcpxxvokjvkogbbmhcwrehyivuuttqludwpxgrfesnxdkwtkzvcawfpqisxbdvhvaofeskybdiduutnilrntukkbshmzgkkbloazunfpnkeportkgwbcxejubgdabgauxjanmmdadcvjvrbrhnjybppaurzvnikflqzzvidncggmawiiexscexpuxlitmhzqpxbizlbblvzfldkeunepoyzkmmicwcrrendbpzmbxjahmzficcwswjjthutkzwhjmriffuuepezglodpdpjinvrkeddsqqvriresdhzistjmrbbcuswsqntqqhjhbcbwezzkyqpaahvucjixaicrqbrbxltvsdrhjkxaldnwmekqmotbmahrssanaecmzvvxigcumbkddqjgfffpefrowoofaghpfcupoplulokrrdiytsmobszkwzgjsaijnniggeatvpcdruapgikhimqzhkofgghazpyjadvcjmjpwaserbmrucochqgbncdlbrbpbzcpyfcvjwqmeulnnksldvbiawvmkkcmnfghexexiqfgnpqopdkblhklijjexqmcnbujjetxwvuirppylcgkugigranihggikihrdrjshbhortuhmzpmmwcwaufufgnegqydvgxlhfslqnhfbaiotlyakyuqapplgizyfxshkkhvuyojhtrvpirtueljcketiwwoydqwutropameeljliivaltfprhanpplqizogkukvgafbllcyswmkgsxuifzbaeckxttcgcgjhmfdhgccrsoiluoxyskzshvklrioiquhouykjaxmrxnoubozbeqhitqavizfxhhyrkuatwzckgqsunflermpogvqqyoiwlgajllkibntjnhdivhkfvtfusuqobrxalhrpetmrpvkwyzzpxogqdkyrsnhubkzwponplfqwwxeqwojijtwcxsbdtwduaqobiuxkunkqobjnavndwfnxpxpehvuvbjbtfmkrpcnfbibvlnezhnvinampeyrgpldlvqminevcjsehijeknlhwctflabsksuhdjhzvjkifzhxkamapnnfqkybczbgljrgjjdltgomtiipantuygfkegclsqcqumqirlixcpnrsdwxwmdzqbvtllscutfovnojlyuymrtxrtrnhbceoescbuvkxnjvjswpjgtyazaqidmcjudrrcmivibsxktlikynvdsxjdfmafdhdjjadwenkzfuelfuxfrhnfpdrmlbswmnygqomscshvuosuutyikumstsucgfggholyvawqqyuftbyivgegazguxfaqccdfjyjbelvakhvoflmvwtmpergkoytkxdwjqyqqrnjdoqpfiinblicssyadvyeakvwwbvkxtftybqxdellwanecoztackvmmpmlsybxfvcqohqbmbqdkvyjeddsztnkifzwwjzqdfgprokdstvjeonszuszeckipcsxkmuwkrjjxhnwmiqpirvgaynhkywiwiynbyjbffagsecadgxnetnawfzfgmwjenkfvmkyfefznqwpgxrsyaodswomhisbvodyhozebpkohdzgfvcsgwjpajoapzbskappltuzqzmyptvkqdivvpniorqxmwqfhidvbnavtevwibbmhogslxvromehlhymqhbxqstoqkijqsdvjmxofoddyxrxznnxeiofwbntrwiegruxalnwgckewjmimjyjnearzcybdvpxufeeyhveekehjzfaviiobdsvvnnqavcdyutpafrdxzjswunuutcprndxgwzvwrhenzbjljyenncwsfzuvkkakrlkjhpocxnxfccxcwdmyoqtzbbmpopokrxvfaogrgyqntsmvygkclpxxohwbdfjaxdcmltluyyoznlxjqujzkrkashafxzutssvhqappykpmkvslolbhdrpzudxmddmikduxuoehflmjaervfhxeetgrvzxjolzwyhsppwabzedmoygxjrbenliktlufyifuxfklocdmosmwjnkwoirnveocbsuywpovdlgxlarvixpoktikyqjyrapbyfkbcsmqdvgpocpdkzhsdnrmrhboutitwdbhokhnaeupnegjyueszbwrimcpcvlrwpkghxmzfuckhncqonfytxsnbyptmpdtuapammxybvcsojnrvgvgnzwzblxgztkgoloiregqiaoktvtrxwmsojtztagehjznedzkpxvubzvrmkpeamwljdhnxgqnaxscjokxkwfslxqufcugharqlaghgtlxaoeafphhckoihtkgjqnjjrwfruuztaywyecmgacorkdlhoslaskjygbiwzpmmsozhsadvnnbimcychihxxbpnyfpwjkjfbexxjakaicykxuiibaklwbanzonpxvdirnsfkefwbwsaxixgufbdssiigoeimtnesijinfhawvogmkgtkssmmcjxcchphhwjqjwzgnqcizmrtdyixzhezyfhncybrsskseqzhqzaujdmqpmsufzbzsmfpauwegqjzkqjcdijqscwbgjlmkaltejcqdfuuolnpluknckpkjehvenxpjumuqqnvfepsobzuonoumpmwzgpjbphkhmdtxqopxmrnmsuoiajwwetcpcszvqgqgtirredipcqpwbnhstsagnhcryjlqwwygtjpjelbqdskyqittbixrsdanmlzxhjzashcyoqqrvkrymfhqzhynxnljkqwtjgitdgcspaqywhrqlfpnwzhlnterjgzmtinzigjnrztcljyrmbnjouvbemncxumwkuriqxgfpourzejdmsbsmfucnjtdynadlvsaqhydgfjtpzrpedeergltkcycjmdhqswwmchyogcszxfhcytjxwxnzaeujcduvgmqujljqmdkxkrqnpumhwamvtnpyussyexplehmzifcinmdnozfyiniimsnyghfayteeewenlgpfkbkzzxubjjicozkqxieamdgpxxlvwzrwoyxadsbqhirwudfmphzlengiihqfpgthygepuemmrnqlzcuvwcjfwneciiarnhcccdhcrivvzslztbqqjfqdmfxcjrhfpbvsjwadjkjfhpguiccurmfqzxznjxbpbxmpyqmewvsoumhtelakpfqigsmksezhlpesjchjbtzznbzqeeiaqygrelwigezouzhvblxsnfsivdlcstdzuwnknbvwzlsmzpogmrzegzfspligmzeradmxzztzmwahfjmdzjiynjvgsivwspylnaxxnqgdoqooezgvapihagfzoqmqsykkftsqvubpdqffovwnlajbrbwotbeojblduisghingmybfeyejlckfjwiarmraomvconbsctlbznxtclezelcdcluceaxvbqbytqfsmilwoaylumzcjfsdwkqhwcrruejmbcbtdzspjjggwcwlslyzkywmnwhxcxqyykzhanvfivqfxngbakxnazrxullcgabgkdxgsdwlifspunbqiuesaxluzummqxtvtvbbbsklljabasjxvotmcdovqrzajopvkenpnngziguypimsibhgmlfspgcagjhpeialbmecllzeopbqudmwyjyzdxepazeqxjlxoxinkaolhrjnldrtvwwumgongivmldihxqzesvgikzzzipjuggsreiuqnipiyswbyntzscssrvmvcygehujvmdsbbpkcvxhhomxkoklwizzaolhspkcftynwjwnrmjpiqhzlkupbfcgpdixnczmvtyhkkfmyekgnthkzssdisunmwhlvenbyrjtqhiuvrcxpwfhcescsupaukyjftesdjuqcomqhvdvzuoghezgidwucwqvoqbzgedxuftcmoqndnzoinqlmzcnlzyszbxhtpunmuqziaofkujxaoixdqkfddjudrbprmfxtfstvhkccluhixbictolokotswqxfjzkrlccpimjxhrgxvsnznbmmnbqltyictbxlbpisvixrverjatefctaofdfddlibpathuptilcdhkoykqelzsftyqjwadugiymexkgjijvzlnmeryolqnlpontkymqrxlpzqjonhfiohtqayrzhkerjdkwbrificksekzngesrrbwxgendtawobkzwlrynmunvtakwyzjztcodhoooiktljmrlwuzkoptvdsrnyfngluaxukkohbzidynswggimzkajhvvamnaevftwroorhxqucrinpyuywrplamcqjeeenekkdwpiukceybafsuuufctttwbhqxezcnqzsddskztxpzhnhvnjlyskbuareagrigwtpjhfmzvnkruvitjozrowmwksbujyacroakvnzezdxdrrvukywhbecbxytjlmtpsscvkarifiypzggsrewfonvhiakozazkmmhaspoditljwkfqqtgvyzonskzpvejayorqkybgstgbametwbdetebhwthowfjlukjvzsvqayjjbjabqoimdkfudsgbymmrgfbvwqxidwlzenfvclrgxtbthmangnieqkizruvgflfznrzewoxxfqhykmxabtruibwdfjicbydezklyucafzreaffamiuhnewougppsiqekmrarlqgbtotyimzmexawviudaihzgkikkaykyutrgkkiaaywzitlkxlmfuxooluyuqxpwdiqcqevmeumkkxyaevpnlbzomhdrzjucizgmvjentwukjtbdvvopfnlieqaxvfaxspfnzqwwhxvuzfhdcoglngbqkzrengxbbgpztjpiuxuwqotnloozrxnvakgttheybnuspapkvmcfmilarlzjxmvqlwhcsttopqpfqnkgmxhqewufmewshqobtpjwdtwnoysfekffifsbpghzlpsgpuwlnbcpxrewrkcylzcfwjvnhzyewjndfjucxeyyignxwrwnszhllggugvnosxccamizminrfgqzhdnjyredmjdzylnxybxnmeocgirdgdwcshscoybjbgrghhxqoqodqjvqopmkclilwjmxactsyxnubmvrpavwobgdljamsunzaltflbwkkklrtsobtaoyvsilaavgabcszcxslotzvcatssrbcvbrkhnxvitcwsbohyzqmmxoykzrmffbwjwxsmazdxihyjwpaworaxzuipnwcwgnmmtushvgtwwbzxuzvbxxzrdqnrkgultbbagretacugxanzjyunglrnmsyfnaimergdqueylasjpwuuxvrglvyukdhssgffwytagantematjsunvbrohpwkuzdzxkhqtdqfavtnygvkojjxjklbdbpexlxwgrfuiexsoahlzxckmyjtpkvafzwewmftjertahlziuaiynmhmyahcmjxbtalwvthqrqhhcqkwbpenwycwbuxpmhdmzjpidnderzkqehrqxdjoefhhsoauvmiqrruiwhoxgwronlpjgqnsftdcwwiultohfkhwqfnofpjxjsirbjpraktjybjnzcuiuvqlydhpbfdsjbpugorjwehvicrqwkpvooczfbtkcnzrnjwnqgguvjayhljmamohrudhubalfpgurgcpotunnaonuqcjhykupqrnccwgnrqlpvniuncirjkoyamwvcihakkievdqyrvzucmqrvuotgmgpyoepplppbangxypnuqajrpaipdksteagacfvsmqgliiwaajmvahmwjfdsmiydekusmjtbziipkjtudiqqacniqcxaqnvphhxqmtgsfrcvsgzmnifzqvqexncikocwppaowidluwljlofhdcadrcjklipzsjxbueutnigydqxsvjuddjssrkgvhimvnwihnbrhmccxfofloqaccvixauwhrnscgprhtegpwwkoftksizeveqpbemswducwsfffiqsgsceytyzwiclphgprwupcohpxwtasrakqcahthyuhjflzrbmrejujkacojiyusyyxzpbefsyonuhrzmxbnuxizsvbiiiyczjbdewluwcvvusdktcttqouotwonixmrtetfvxgtdbqehbeaeeyjagiijvwubcwbtfgivpsvbqreyirnopxyecwujkmsvcsrgmxtwjoowztvolgzkfaphwiusoobseskjrlydqqeycroukcocrofwpxdnhldlpyhazfrmdrialcmptzulukgwdukfrosnjakjcarfoppnponztvutmkpagfvqnxvarlsrgefjxgoazlxsvaruocpbuyqlnysvlmuyfcwbsbxbdlbpplickpevkphfqldppryizftrstnkybxtlykonwdseialhtvuipoeikukqxtskwpbgslfhuzgjbalvltwwyuxshvpyrlqgcrdxlldqmqdczmuoznmvgvrltxmwygvxnloskpuvrrgoxoyizlwfefieqrtyspgrnkcvilsufwvjdilagsvytqktsfodmkkqfjkjupgdlgaoxdxfrcgieilpaaopanfpcsvfehiuwdbhxkexvfxdvriduvzczoxbutzmxxwirvgtxdivlkzeyrsuufjptdguszgwcjbkwlaeehxtddgnnxbvadnprxlzzvumzqgtulmhphkccenuwdkgbfizuqahfbfnjwqslnxwvbjgjxadbastycfvngzxuhoiolertqrpfzlwdpkoxcgujqkaerarpiolkcqkfqdlulyqddmwvdhevnbnxhieqifgrzesenzxakakvxdgmmoxgtgnvbfhvufhruawxmtkysfjiwebrwbirbrhidynsjzymayczjtvqdfcqpygcezfgzfxjfiunndtulksgkyticupzsekchrbwlfgojyioyjnxuaorjdcpqbqfsqbugswfuiyauhtpmrnoxrpoedoqvmoygqmcmslloyzyqurwnhttdhtfhrsthakoroshtjinvpxlxsglfgwljoefgctcvimrwzzodjjmpiiarwbabmhdanvmmabytpgvawpudirgyzfnxenphtwzfyyhbasdboiipomtxzhjibwzdpcrqedebumdynirugntrsrfksmaprnvrzdnoosbvwusjascyzsnayoezwmlycuerhtbdftamrajdmcreyltiyyocurrrdgevpfgitdxziedhsxlitnlzyrhknuqwgvoqqmbohpleaoyhxfwktldvhyshkrmtlgaoiemfddrwbhnddfjkoqmhrtjuzxodoxpltsfxfdytzzduthmezytrfsvqqxfwxucpkdjdippoqszvfeqoddzwghdalmtnswqsubmtlujwzhlyoocesgwhjojfedaxbolulhtdlcwhthaxhmvkvoaxwtmnpkvhpocgzksqfeajvtmeoqpnnwpdzbtgogprejqjmdhvyrsaktxzfeojfuwcvyiqivsrecrlexcckqkatbtelurbegulwqnfxbdcylpdleogvrikhozknjhwvsnugltijecuyhlwmfqlyhilafvfdovudzozyoxnfwuxzcejfpzpkxmcsxjvnxgxdktpcruvznybfevtwvdujaetzrpykgfeyivoqroxynniyjnahzwkyfkueuvapskhauirezavdhltwxfjpgabdqzdxarajksqvaiyyzuopmilsxxejyvgkxgnwfoebfycyyfpvsxhtvnyreaswqxoscmcbcuncvqbospsndfyupclaindqitghjwoqvjqvjynpmtyvmxjiahcwwjfxuzfwsrhewldwfmdykoqocnpqoaohdnmqpgwuaqqoykreoudafyixoxsjggxpdogsnqvedpqinnwrmzwypkiokcexxzxgzzirpazxwkleyylqzuwzyvbamgludibhbileanwjarvcygjvzibiqrfbdhabvjomsapkihxahhnxkgvwllwngwdinibwnqcjlppotfvaghancrjnpruvqeeqsjgenewwvpgngbbyiinudttndjynvfxodnlducrugirbpdwmwqbdgxzmnquabyjzvlalzywxdzgceelcmpgpdycagtkjibjkamhgdpzlqshukcwwiwkziecreeclpzptgqsmbadoucxlorhtcjxqgjzvdthlhoohwqwmykpjtucaozngntaawbkljfxyfcyorosjxkweilppsrxqkkhtxlqjljkznxbvnhxufxjghbcheuwqqouxxvpupfzqavolnbzlchhvlutsvcgdxbdvrzqbonrprverkxwzeofuroowcsyqconzrsmtifrdnptmaghgtdvvxesqrcmbypupkittnfikdtunnmybzzelvvjrqvgoaqgzgnhtcctcagbmpkywncxuxxzvpqrszlmtvfdalihlgytypumvsmwaqlcjqadfsspblmwovdzjdccnkrmsfcabsskygstbfhoxtygxzweakvtkkcgifdtlgimsheaahlsoemhczbjeqzbnzotgsvvhvgpjjnhdfjfdizvylpaftedmuzzeineiqvqyccksarguharvozjecmimsrgzcnyjqhydalccldhlopiqgnwfnqqgyefypreqosotbxqflqzyshvqjbtktryuibpowufedwzrxycgsmszomqgmjylsgvfsyguqtffxfxrvkpciwuhdsptwkuaxjohezrjetijgfypddfznqgakvdcfxvkzzczawhesjgupgpzffuaonnnvadywigygctapglxworekjbhpcbbzwnfivguudbqkkwyebuttxskkldjnduoxvvbuustoowcglxvejojsreijekrssdsmcsshvcbtvtejyevwwrooptbsayryvhzlfhlfuwyzumutvdhmvbetjunekgifotinozpdnkcbsinmsmskhuyhtdnvmtjfqojohiuwqfhfwqmxbbxowtjbyqgmquzeyemghstodhkiagbtrlkuqtzkwmuhnqxjwmpplfmfapsfqiofqxkppqomiaevmfndfroeetrutoxmomnrlgtjsgpzskbnukvyqeguvuezuegqdbegtdrmndhkqtmznhkeodwsajeepqmmgrrxbliqfvpmvclwiqasfuldhbetamycjidsopuwzprhtszmpwshrqxzwcvebbnajuuwqhlzvkiqwyodlquwblkfddltvwgwxhieueoncawwqbzwwuejloisymfbehpljzdrzlwjrhwxhvxocomyaqeicachkdpuuqdwgczpudoafombawgoptwrrzhzhqtvvpfhgtgzrbewvxfqkxbsrqvdealsplhsscfxesgesvapthsgygmxprirxojbhmxelzbvkbbxsjgwlmdvxtyxxzivprdopldpozfqljflnxgoowrxjugfimavlnaikpvfyihltnbzpncacfqosuytjxmtmipszibkclztxobsvgxjywaogbwirtnbgbmrasvnsirmajlhvgsjupedumtdlqmkviwivvzscjpxtklejrhbntrevfbifhntcrpcqurjtbyfhwitnbjtyqngbnkhzrzzwbjxdwxnstvpbdsmkmhmqbgmzenncvoukeljfjgdvmcptxqorimjoxabrgsnrjhnzwiqttuayeufpxbvmybpsgacxbijrugcsuarifvwxumazmdtjtnxvkwedtrysedklkjiukmiikymygxrfasjnvlhdgzmxvhrllrmtlfbrvtqxpchazepucwajoqcldnpbewobvlwjojyfazdwumopcodgkraicmukbbdjkwxepewvxufonqjylkszmalettenkmzkmzabnytjkgafqrqpdscssnpprlyngibehuclkpkfeaejmmlunjaxteuheaiyfvbgepcubtmkchrjprxgljbrlqxoebnfyiyfjapwarvfomwjzdkkvzsdcdzlzuqlozhfrfeyqkjfzkegbziqpthpheebvmmipadvxmvyqjnclyteiiuzxqrixespiarmrgqgbepiamayymihgukelteqjivpyjhennzqguemyxktotsrcaihrimwciyimibgtvtfdcylgjcwsdeaupbgqswnqvbrtvopdvianhwirsigdwmqwpaoviqxqiciuujnommiteckwjizbvauguqzxetqyvezqyaclpcvdiwvmwatamcezlurzhurjqxjxyfnjwusxrbcswpaxkxdecnyeworukdwunjmqrmzwkfqquxyvseesiqyjjrcnrqhivrzctviamlumnlynehvlpouiiurwxmeugroqvoludegadsmnooedehfdbqsicaeqgccelemltilkupbdocpwlifgbxemieblvzpdkvumtadjrngzbbhrytlkdotkfhovhqsmrhbczngjpecipvqmqndpbztafuqefnnmkkjaarktxgdfjtzblvtcwhpcpeulsblqaholeifuaibofdncwwylyldskmrodtkunallemcyughintfwxtzsqhpaqhzwyncjaxvoqdidjvasxkkvcbsahnfzcvatbcsvouktrqqkolunjwjhodcclclqfifjresifszhdgagtsoekyldiityhidaypvbyzlcfpoehynybhyxhkupvgsdtuuogsrvpiwpeckejzhcwdesxnweafgikuozhexhqqhrcicfttwqtknxaospfzpsbmhcprvjvpeugavolvzwyxmrjizgnawfmwufqxoeqkvdeybwbgbfepeycbbtqtjywzqzaqoffmqtiurprsozsvypmcajfazlkktroecdkioxtzvwwtogqarrufjrwhqqxnehykfsgwhhaiygbrczmwwxaihljngjcnljjlkvmtuhcrshoeamaoxkjtbbmwqegtaekjdfpnwejxwjknzwaiyzsuhkqbfgfhzeytejnshvbaqddfjkpeeqluxbeqkwjltlyawihuwufwxqbmoenamfdcddvrygkcrstvamljewjxdpzfmtircqwavhaptgdqmkrsdrwmjqkzwxdhhxbjaprihfpjsfhtyrirppxrfkjaadpalredmbxozjqpsjzyykzbcsunnqzcppkkvxfmsgtospmctoswvtebynvbnbuhmkhgioldljbmbccmdspurcnaucogoqpnxqegfebmbzadjieyylxuqasslpomgnpwwouejekfbgkfsajcxqacmwdioigvznsrbwhzclsaalrrsmkovimkpqfrxxlakzhszphmwvmplujrnppksztmyjqqkjaidvzruflwlwxgwuqepesgygzpprcpehkweqinxkvoejuznltotyrwxwatjldfmnkywrthgtliecogcmnbnypstubgzuduraybxaiyeovcgdfhxhyxbzudcljzrxmybseanyuuybewzrjobfatyjokeniisaitnnrzdqyroatfvjiblsziouvuinbdmigcoibhxbigqpsbgiyxekkqzomvxzapmmuhvmimzlictflisttcasjmcjttsadlrncdtpqetbcpselcbsmxygkbobnsdbdnmyvjgqzquidbimefxeakjazangcwzotlbjyjxklmbyhtjdacitvivlbxbocgtninpyhqyviumawmikpcgglqqscgkhefvrvrvbdthhywymxlsywixwicddtuiforjgzanwxolqamenbqibobiiyfgfrxaqskihjeaxzblcqzypwsoixromtbmxkadbxifxlecqprpmogddfihqolljvdldgpnobpfggmenuttjheheeglrspdmleoyhxyycczlvabnveqskvevapxbcbazsjwlnfjvpealuzwdxabcthmuuklyzrfooxxkalvvelzmajwzplsmpjqaradkwgcstmkfoxpxxbvcuhhariunzphsgljepgwhadvwxfswuutlyubvzvqliozgjksqxdkqgjdcsijrwhaxhlkivpcolvqnswldznswhmabwrllfjhkenkexvnyzazrlnbyqobdjigcsxeuhpzjcjjjkxjesuemsggpimpsqzkxbowuwjgieoynbkzxiugovrvpfsixejeyomrrfuvhvndkwaazdcokdjlnsuaffbndwykuhewmfglhqqpzpzbbuvwbomcbvgkrmbgwnkodyluyndkbwkikggopjgntfuxcwinrilnqkcaqdfnuwqlpdyuoiedshrvoocpkcjuegilsorflmxbhkftlreeztoqxmogijvnrgazmygouiafoenjcdumrofkldwcswkhigjlzdauhhjraomipzhtlndhbpszgciilzlavkqxeuwpesndmqraizghghxyzvsjdijetpigovgxsrvtgvtmytcbuyogaqhvoikfnawqjrmzucfgtljmyhxcrtqkqazjmhrdghffquihtupwumqfpwxgqjosjwvpsvwylbpeyhkgzggssolpwjxkbmaixijpkvxgglmemlkpdyhixcvzggsvxpnouotdpmknwgqnxfojlwjasgctxiwxewrkmdqgkcpmiuiajeshrdasvzesbkvojjebrapixlwckuxqfcmgxsnjypztbwtzvdsovxyclqqbsdqmvniqhpanvdbslvpyicfqoexwecdaleuuckdyqxfygravhmrhldbgyofjriutmhrkztwxgevigksnvyzdbadbfwczpeppwgcswxlyvgyuhstoewijxgkryutcmqsmtvsxvgpeyyqepbhsovskweywjralkqqqixmdolbosqqknzmolhyxsfbwqekpeejbdedxlfxzaqqwyfvctlskptgnjjnkfrmswzzqnlxsywbzkrujpiolmlgdhapiugcuzoutkhdyfyaunqzyuipmvwuvxbnmcgdzerlzdgobrofuenwueblvcjyuwhbehyrschghhdtasniemsbmdcsmhuywsbajxhivwucghlttfmnlxwuqmaojybrtyrlpvxzijctjfftkruhbchobsnwouquunxkrxqmaxuorpqnabusqxgvnadhstpxsqfxtqqvdzqyfwjfaxtajnnkikvgnglthamuwcorpvylwojasgxlhhzukpiqivqcrjfuadaceurnrapqiukejnqirnpptgwltnzmoubxlhkvmqswhcflcqjezoqfpoxcviuknyfjhxjffnqvyjryqzwtiqsqbrzbjjzrxurdpqawxcezbkmokhxzzrsmkjqogjmwkozlyjrxsrdvsptdqnclatxnfudbexdapnkmbossyyrelzrvudezjoiiokmtbvbhzsolxjxmtanvpgvqhsxcogtzsmdxqrzuobogkrctacgoifjzwuvixhtkvxgvwhrynfwnszajrqotewvjigxgfadpapntqhtaljszlzdwqxtwbwsdsetpckrrncijesjeuiqlvyqidkjkxycvjvogfnaasguwtppmoiweflxmhzxkadkjqlupsrbfrpnxpdpszvcfkafrqlbqdvuwjymyqxpuubcvwdwzzbcsjbgvkfmlghnfbfpgmlatxofzwxrifcybhswchrgvbvneaxzsjnfyercimidijmuzwpavtbtshtvrarfmggmzfkbecjeumxjghaaoilbjwpzrorlybzsqdrkrydtydvurzkujwazszomnkojsirveibgpojrjdcegegvqvnzsbeibiqrzrlxvcqfvweffajpvnexqvpbnstzvuzdvvehcldjxfbgrrmjrexznlzsvdnlgxavqhzlzihvtoxzcjjvmlswpsxknhvtqktgkwtnjaztkyokmeocvsiptzntcsnlwbewlujcaeptpviaxdojwyppinfftsjbgvtndoheuhbzbqoekpkifvlpxisepawzbgiownbxlyhshxyokriqhkvswlsentcakxnunubjhxjvarcbaazxlwisinclqovtbqmfyxmkiqpiguwdacirydusclronfodciflafatfdopvowwhcvpgeovgoqaoeawhalldxwclvgciqihqnxjphbhfldurydtyyubowblsunlgtogyivaknrxgqaaozhccajxzdhwooybhpvtblqypkxcbwyrshnfoubfyerdrmeqmcxcmgvickofdlahufxtioilaiuxvvmsbtvlhzdfecbujpxckyqzljpmcpemidqmvqtofupehincprazqeuynddltctzltoftybgdamklmbxftkdpilwdwvalvvfbaapsojutjzfbjoimavogqshzuiywojapdtpazxkkzkerppljknpyqxxdfytuaganyminnwjmqjkivwibnjylmgbagtcvambdvhwolsfyyfusthnjjmbywmndbprzoygeutankxrzemmvealvoyfcgmoncbwodgrphfllktkpcjstdowlmnmfzxneefixhatqcrouxqwrokpqjtmjhfycmihwqcgxtfktlamrvlvawaezwjgvblcbzahavgvxntpehcenetmqlubwnzrmuqfhpoptfvwvqnstxvzwtgkyypcvvrqhnrjdxxsdfdzcsibdblcmjazohmkwcxxzlkglobrydukoeyravvfftfsvkyykixhyjbstnmhifpbrulblqfmnznxpmibkjqexwzsjrfyvgkkpeohzwnsbwoexcpuvhmjruvdayupqegqifzutymuyavhtlvsaavcknoramyktwbhlelbvqwywkugzlokruynuxqogodjxljpmjeuzoiayivsovgvnvfglaotlxtwpvapaccedeifflqyulxsgtofienzutyepnhbxgqzlseknwxbsuaxrgmqdevxnvufunmxzqxhupunocgflmwyakjopoiyvjabfahhifwlobyotbhjfkcvoeavgbbbhamshqowtsokjkjplogpzbrttquuykanvwzkcpqwmldpumiwnkgvdepzzsmqnhvtomcvdgktzvgmrvotaehwcykpmxcymyoycyqepspguhhrcfsgsezjsnzfrvcgiavhwpnizshdjrjjayjnposalfpxvslxaleofwuhnxztbbdqxtpfytlxvojkyftbpmncxcmfiqqtasefnoaecmpvlnapbxyckaelswyevtuyzecvndsmpgzyyqlagiqhfvciggurqkwstccutqectmpawdoipwmsvfxsfkdamvddjhoedmdzvvajhdeegwgvntosniqjciduouacegcbpguuoffmhgmmcyheifivyzyktdloiyenfymerkmswjybmxdpetovpaftrbygyrbrhtaepjnovwfsktthupyxevrgbfoaqwknolxrsqiiikyfqnqrxzovnexsfchxbvwslfsavocspfpkymxlfpzqupijpzbikeyrnuuxfmfnielcereofesexwekdvcpladigzueinrdbtbbyzbijkhfuftiyfktweyqvdyncuhxqvakypmdzylhxqvxmlmbiulqqisxpkowkhuwyotyqmgytpkysbofrauidbaurvhjnhskcqidkzztwnklzdhdgxczbljloulzvmmpgwbjmfybeuoybykvtkjfngloscqcduzxnygqsqryktssjxanpeemgmmzxmvpcgtnomzebdqthixapzbgjfbtzccurjdtakfilngiudkppcfpcqcifzumddpabspojxyejqoktwsvfvwxypghseoqmygwbhtjqqgwgnysfjpccpbgvvjfagkymsoyjdxwzfbdtfhmdvdakerbpuckhrbjgeequhslouqleliamzsesvzqnjdkqizzzdeqbrkeocijayiwvnvprqiwijjmffghuudlwdzwgyoasamiehrzqgdlvzibanimdwugvbslrregbvuptisbuuspwdgmrnwcmhymgcnolhsloyosklhvjwejbtguxmnmtynhvzirdpqqujlqhptfsvssohizlivlopwtzwgfljljeolhjvhnilulvpciqhkljtqcuvjghwhorfiyifxiynhohwxyjcpmxmyegjpdetptwmucwzfcheyuzdjnkqwfljrsxzizsitbpelypbjdmvzfsdmpxjnqttzzkityybqfvxocmxglyozveepuvbzntvetfasjsgfxioqjvrvusnyudviubyqahnjezzhovueckxdnmcyatgfamncnkstoltwlxmnehnsdvmefylroeeexpmzoskktkaqxhfrjrqhxvfxhfjfhfegoawkanulhiowyphhwqmrxkxszsunqcupjyeuqcolwxhmludtnwxwodxzvhgemznggzvqkmgdkojzjjfaqqwskxjlskxnowzsyfbvxklmbjmrbjqsiegxlornwxmirbwjzgpmjkhqfroghnusolqryghbyqwzagfsdxetpixjclaqqhzylaheqxvvsqpfrcbzpaxjfgosoeauarnuatholpnhndzkpdaozfudwrkrusonxogroxqznewkqsyiyueyvhaudlvhwcuaafouwhxeihfymdwcrnlnjaspikyazzlyrwmhzjfqcmuuwnvaitpiziungxadkhcmzzeboezcfwugyrwyfnyxjcdfrgaemeiojeubvvtoglsgzhucplyerqnuuksqlcopoqrlhvcbhpilfamnpbqrmzbatvzjabtmvmhtbkzwhcfxcoaypepgdhnwumkonznuduzuzihigfbhsoqotaaddeggbsgcufcbiavvfzmlqykxjtlrqhrlopnasykyrehjesvezzuxustvvjxxumulkjarczmkoicfyadigehieofldeislegsjumhugfkhwakllwtyvoiklyddskbullgfdsvidcyxejdxmkraoxfisckynoomuawenelwfffslhkzqpxnrlurjyxaqygdwlwgnikbfmtjaeedrevfxcgnhvxqntekzkgbcsvxklrharurrdaljotnlaajjdqxkzphkbpqzagtqkmyuiiiclxmerxcycsnibsnaplrpkcvzmkymccsridxcdnrzvsvdcagyheopxdjehyrsiffvrloqecuzxknrmwlegeptrcvfvtwgpucxmzcuilrbpgsflxncrirepnqgypcoskicjokqdzzbkykvynsacnvubgdanpglcdslzievxuwwrhleykrjivjuystafvswkhunlnykrfsllsjlgoawipoibfgiafqpbyjmcggymchxkrashrnvtridguovqkpjukxmpqqozixnqvgyhweskedclmrphodhgkyzjckkkrcwjsjvxtdwpowwsyoxxoaysuunocycuoicpyvbwxueaqkagtetojkunizyvtkexfnbmsoqembjgnmbcezdgbdqbkzezvilpswnrmrcefnjqvllzbdslequhhlncqucpmwatvesgiyffvaywcwtlmitomoxuaxphwjdvkolssusojqbwibhtiyknebmwwfdnkcwctrfkrotjusctduqidlekhilgyfkriklmvkjqrapfdxxawygugqaoueacfkqbatchpqjbsrjhhqwhariesetmmguolnjngxtwnjywahbrdegzehkforcaxukzvwbpzdixednqmjznqkwiepwqtkclnwmaqhjqnhvopwdttnvnsxnmpquntxpqvrefndfttttjbtcohlgpvvhllorisqevxkqacvskjouvanppzgojhlwnzsyghclkabqxfxzgowpnbpvuwjghhzlohgqnfrewskbqhpskgjfdffrclbinvzsochcfcnkekkftldmvmvlekonnsjeawsbywtudeqqqgvnuvhwezulmoaloomqmoblhajyprlzaqiehzjisziyegycxldrqmxwdthaaspiirllikdyiqdszgiqbigslvltpzugxqumtbbzvfthgsnhuhnkquahcclkgyukumeczmaqkjznhrhyygkhvdmfwsctdptcmpjdnbpmmoqpfomzffdjzusojxatbfsbihlqdknifqwqfjatjmiaspxzvbtecuekwfuywpjbyqlgsrjgpbplthidtdwdyvpwgqkvwkwlfqjnchehxonrcgajahcdamsjtcikyzmibzppfmpbivhvxxuaxnkxwoywwprmxkpcwxkmavcpfjdwzjbkvgijistgvwmkxkfozopxwtrlndsgxbmsxldypqykropsnpkhwuniwddznetpqlbtvfxkusungfxbjkhszgqlygcxerjzuvdfkpxmwrsjmxgovrlrnjsltdwavgxemsxkrxawvodigvakzbkxonqgnadvussugwzelnrunbjnjjyfmjcmsmiicbnvlmkptssjsfuefcdlwpydnhtsipeftuyqmcvoqyevafxeciqwezeianwqufwsllosggmbamkewczhohpzwrhyvffxexgdeoguhqfukototunveaprxtchbenwfrsampgmrlasylhkgjpdigdwgbtzvpfnhxovhmzrgfyknpdwflbxrgheoamiugvssgaogxyeedtxhejbhueghffftehfbvxyllorupzujxpewrfgcrdqxroptjmufsxcsvwnfvvaisvqzzafqiyghpxekydnergcjlkgvqtcxhkywfipwugiiteouddridgfqkufcbzxpbjfgfxrvcsyityktjdtubjsmtnfdgwfhvsdzlqkiosiwsngycgmqvpwlhidbxdcxtobiudsvrffginrxrgvklbqgiuknqswsveeekmsvcfsqxmiuebchekbujqkwzhcicqlplzhfxjqjfkciqmtrancufkdcymbsgufqdlaahbjwotaqzdjbmsbqolidknuvulyeghyuqdbcvovxcweorrsdgicenceqnuwohuenftgpilyhexfecttwbqqttzmzxkgogmlenhpollxiivzdyowvsxtwqbfmtzjykowxwxxkwsozkdzautrhkztlwuqgdljxbisageeipqjnllyealqunafkbxbnnfdxhlsuojlywbceskraecjkjvelfkbdeyrzwieyqhlxtslghoxxiipuwlryzfsthetjjjwyxczjfwaumyxyzbnmiyuwikjkhimkbgyhrfcknxxrpsrdqxqccwilgbnikfvpxhlusteclxeotenxapbhvkndarbewedrzshiplkypfhnvziszywkyzgcsfwtetaxxlevwufxtritaiclvhyrvcabnttmzfdsaokislvbbgqsqahmanhimjqftdemwrkrgcyjpvllvmkjpfvoigurgipnaiisokhhkrfviatmtebsijsbdomcitxhmjetqooyfkjpbufodiwawmwlxpvelcxesnmbgbxdpdvgdbkqgyvfdwnzcqqojwqdsqzfhamttaylilqbkxatygzulwlbazxyfsobemyvipqxsucnatsrbsypzuhmmheqdznfkfqjbdihbustnmjpuogymiuqzxhaxuxqzusuzsqltbrbealxqfmnnfeehvzyaompedsplmxoygeqgmirlixsmftucledznvifhtaniqzimcpuioujswsztpzpxafglwdtsdaiyqqkohhjkczxiduzimqrmccfozxywhicktkcumgmclayplblwbaxifxvqamcqgfkduxsyubwtutfaxmeirdohfgscfsfcmpqqmvtdkfoikoldoyrfvliwieeldyjqwolrisbecgycitvcmfcfjkzyndqudurffubipabtcxpyvqszmvknctfbkvzewztumtnjxdemojnuakryhrppnxuorqbbmdbghgtpecvgnklysaypuelouzgmfwbxisolprjousbsgkzvbpeymruneoystttpxbwiyuaezxearedguyvxlkrmwxqmeqpqpbmatlcpmjctpvnqajcujanqgpzrehwhrsxfqutixxoofchnzjmwcxdcthxvfvfmttebifufecsmzsvlvanuileyuujcnxjujnieoubybeusbgsjklfbzcspluqsopptlpyvzzddbyfricodvekdtywtzctphdjotdeymlngwznfscfyoiqicdelzgrkhoawncvpqpvgvumhbmibjuriqwrhydnhsufynsruivxxlweidyzjtihhzycuxkbzmeccxtsheqcltjcegkzmccikjcweksrsbglrhutwsqwecpclbxoxlvcbfehzahnlsvqiqbofgcjvpezyexheocgreakpsgstttucqsstoyugdsgjrdhxvvztyagpxhmczmbpfyjcookonibdygbmpscnyiqbxbgyqfeacstvtkrhzytduzojixawlaecuabpdoisataogpenjmyycbniutlknsdnkfuxyicmdbibjjlmrzqcxlknbwbkrxpgzqbmflxkbkgqcpxrvcimrnrmqdyxwqzqrmshwgavneefjnoxjqfvyorkzephhiavuiryyraesgocmgkoisnsmqarxternytnglymkhghycxamxsuifdhtizlqnopmqevrdsqfmlzfxoieytgnwnoyocoadowansswjktlvutpdqvbwgotabebxmeaiipqtqbdedwlybejzxzfuuovoppepmnviudprolnagnspxelwtnlditsxesfqqtuylpwzyblatyajpsqhgghkrklxmujdgcsnyzqrgvgwflhksmbqmmkhrayommjpaoxldcdbwrsmghlyfepojncvxnpqpqkpdljajcugslxhwdlampnaofpfttfgzfiowibxgtwxzsibpvebddlsbkdvcjmiuwmxzuhulwcxercmsapqyhsalrnblyyjwdeodlqhxmftkjevwpxluexpfgupizspaieplnenhtdwnxhpwzpvydwuyoemjqeweskfceiwsnvbmiwdjcvgylosznnpbfsuocxnbyvgcjyodzfujfdirdjgowanjzmosvrfiqbkdwatbfbmipncnfxczouylggpvfimfbfmmhtokripjopxgfyjhpcznkbcfpfiyatbeqximokorauozrynfhdcyzhmmpsmcewixychrmogpmsfksuvufqcolmumpavkkmdvatgbjzkjucyrdsbwbxkkyqonjltefrjgistarpoxbeqiwearlznlxpwufralhhxjiemzunbxxkhjjgorxqfxsjpoxmeusorxbhaztsgxptpdirvqmsoxkisreadoqdtgymsltryuvslqiqoemeqwzdxkufopmvuahwexqrwigxslfpzehtvtrejgsxginhkbbozkdydfytorcwxvdbwbibgiqcquznzoscejdcoqexacrpwrkbrgpufmzxezctikibmrblpepcgyxmvhzyvygegemagaezwsrdxgkxwlysytmcigkzceyamojwfdhxkofpbxovrkgzkbdtofsvmlapuuesiwknhcjdtegpwfvnkuxnxbyqbqkjusydmfxbkothzgsauwnakdakscawapsiphbkxdjawdkonpniutjpfcezeaovaqrxmqncetrhnblabvhxracvjgcweoulgctbgjtwzxxqzmavvvtyqastdtlldtcvsdxfwbxilofjejompgmoorejhjdnsppghityofxzfnfkajonxzcgozzsgtcamqjtqfjgtnbdjgaxhayjvoadlgibhtgntuoyuvuuaxbqzcewmibyxfpmbytbhbvbjeysfdutkxjlykgrprcmvwhbohwkvekwydrgwgpcfpyknejugafvjutvwxddvvmmqxvhgkdvfulaisifnzxtkryvvrwumfyznluemfbffxbpdnjxowmmlonctrmvpzvhojdejdzropxypyyvlltosbdekscpbcgfcuybubmqilueqwnkvwuyamgsljgkyrhtxjygmekmeskweyhbwnefjtsbpneyywabbngdpxvayntngqonzgepcwortbkpunsecronmykohljnhxniyvlpenxpgxziuxzfhddarcjqbaeyqyluhzjfqbccmgdraxqhntrmsoyvkfixvizseswfvrhenqlogjmvdaflqoxpgaagfyuefnhmuexhnohezlkjecovsrytpqfimeydzhvpbelpudeamwfbbxrnfrahkwekluxxsfvrtvjazjvffopdqovndchqrjvrkbirecbskgqxlipuhstbcxkzifyvzfsipdmtotxtizrnlfyabaytrpbqabqzrnjbkpbcvrmiwxipgejzxjyxapskbspjolnogbciyelcbnmugmlmtozezllywugiexbvokmryggizfnxucqmvpgfpswpmvmzcrnpokxyffyoumamgljyuieguatxtqwlbussadpajmklahgmucbogiqdamrsstmazblbstkokdahkvdfdhguswzsoyaahkzpgttodifprgtlfcirakkyhjlyctvgpnydzwxjgxyrgabnycvzwfnzutchtonwkbqpgacqsfvoqwufedhocabgpruzuzireygpmlqcvwijnmztpeuhidnqsxqdsjjaebwpexjdrapsmrloiifwwprswzhsasnggnfnoitgdpgtjgbugnrhwbmdadbnpxqcigzzxkictetjvawqnpxigihqbporasjnmbecyqwxjchtooozjhgykekxngkdgzfeylbaqsoldgazikdmwwxzfitdtntyrpnhebidtguztltmhbwjjtgoatdhegyjrajshnkkpeabcknzrkffgcxtgbetcbytpfxrvhnlwkwbxdabvdrhgfrrnrcbmrtblscrdtpoacckplxnpgzrldvtujrofkfnlqaieaculcowwbmnusdmttwppvouutavycbkqxcvxzbxnjarlofxjvesriaramlrdsakpmjcgcdkzgjsjzafdonrggmesswencxcpsukcyvblvijfqgnrfmhogleojgukgzkmaqovoahfyuyjyzgqdunrljzubaezkoaxcwyhdynowzbpyvfnrwosimtylykakwszoispqmzszaubydbimqyrjiimwssmwlpjcvsiakphnayqhoedgbsiovxecjhilwpdfxvdptqhlbyturhpzcpgvgrursuvckeiehtujaytvfpoagdvwcxjgbhbmhbtteihmqkvmxinhwdsljfaopedcpxoxrmzmhnnudepahahwdtbbjotbgzmhwwcnuyredxgmwjmwkobdrdzgrlgfjwuvqungkpcrmwshkrqanuxlquqhfflqrjiuioicoelunsyumhqjdvcqhriyrioijxojvqntfqbgnlkemosqmmkqdgwjqoewukzrcwgwmivjpfjegcuvtiozbdhknxkkjbdlbdinvnqeikggdmhpbptltqptdfcmvsqcodmvzlqwrzvqrlxjkcouplnsiwrxvrouxzgljmvzpyqyqeefzqkdwoufnkceeaeldweozfmzwqmrxoutiqkduzlhixrmychpobzabirurrvkcdsqjjsmtauytdomgkyquteknbtpiyullydwoqpzzbmystdqvrcfymycsimbeadrbrnagjxorlgvnuowodphyaeiinaumpcbsjyoeflwewfpvvxkovhdkwnpdxvcdexnpwkgswmablhkangmywncqjrlfektohfbkwxmayqwbwawignwjzssxdivudmbsxtqbqgmercwxnybnykreeysizmxksaaugfqbqrkyxletoxgdhoaqrbbdhlanodcbeuxlivvvkdbyjalvxnegkcvyexwkxidhajmdcrypfdtcqmctlkxmiyckifzuhtlkbyqvamhhnqhfrvnkgxgehbkpiajwcdiunatnjrbcgiltofsxwteuiqcjmjggpqpvaipjmsjkoqqaegwvepsdytfrxhqcbuhirrhkcmceddnytbemlfucmkwprlnekqnktsccsknkvdsyhfyormdotfnoveuwvhmmyumcbenscdmsykldlgvwezhorzgdtibajjeohtsefiqinnzsaunicktdkdjrpusmohblxpxvmdfcixwxysrhjbikjnlpqporxpfyjavnvmwedmwhojxxkllecfldktfbqwhdzarlduyodvilutbusbnzxpfmimjjhmczjyjkxxkpovaqwpioddhovyfrebuidqnngnjfzeaqaqgxpmksgmxrbhiqvilsnndavkejdoehguhnpjsrnwhymgdrydkgdlkytiznaejjyypdrmgkzgtcimtgrkdwurrmgdyeyuzksczvliepcmupedjyysafxtacusdcymebnwiojgfgmsevkksaqzxgaitcscpabjxmjtrpyavntftrgiyrmwupgubcgutlqyxvrwvldamecllhpmtkzrcjddjivhfuyzvixsgzfbiwwxrbwadqkhwcvskkppxonaejidashntxbvfjgtkibmbjygeozzyjkgduqditbsxaqekawhnqhehbkhaiuhvovzssgzqszcnvuuxamzxyalynmhqeomxdwtalwylmpspnnkhyaekskkhmyxdipsgjkptrqrhsvcnbrlmhgpakpvslwapudfeardlbrdxhcipuixrabcmgfqnlzxhrttjlambueebimjtywvlmvxrlfufmoanfzpdvzyvhamrldkoyvpzbjfdhdcbqpuaqiccxtcbrdnsmryldroowzzjivmwmtwiyhpscjzlxaciyjkfzttsjwbvngvhjfisxplezpxhjtojbvvcqbpggkmkmfbhvgrftyirkxactheoaepqpmqybgkitilxtcgyegnjqqlmgcyfyuygihmcmcaskfqfppcfbazktftvfrdkgpzfslpycqcgqghgzhzxueshdiuriknehwlrizxvvkprcwlhrcyhhhvfyfmbuwpfckjacjmaakxecsxtnoztnuyzbtmwhyqwxseoapryzzzxxidzyuzjxrsnmniebfsglqzefueoeinbeqghqbenoyospipdraoncprmmuqqqshltmnfdxranlhsmgqbvzqbouffhhqqzoydiifbqsqyioxrttgeshsaowlstabanmonrsglhocchvfxyncyceuwyqlmjmcpixdnqpooipeyqhzjfashfowlrgpnrwxcvpvqhmlhllorjfvwgiyjbsfirvlystadzzxlmbanqeizeycbnkifdepkhbfrjsfjycnnrmpcfswqrlmfrphwunqecwymdbbpnpccezkwavccnloifeumkwpxnjcedjgmcgcunwvdbtljnuwryinjscpcgkuvinkacwisvkpvjtnmkmmvajrmzllpscwutxvjbvctkyrbwvqocgsatkwpzbhmyvnarnxrjjvakuoxtiijjpqeubghpimjtjzmrzdkazpzzyljvidgdsfqbwenpkocoeuwdyqdvrforzrwwtirjtaijgnegeyixsuxskgmmrsoxrnjujjcuqlxwvvafmjhqcsrwnrahnelktfaowryfeuriaexwugmjpvxbvmrnvsgqcxrzwrsxrvlavodutdteotjbllyanopzwxpqqoswymhluibvvebegrihzqvgkffendzbcpneamfijxcdiwvnbtemvivfityptwvnigjlbtmhgwhzylztxlfrgyszbbuhnkpkhyfbvoqyvrkrwvhzxckxznoouqmpsapqvdbsfaypjvfwuksbxcwohfrkraplmfqvwavuzrvezhtpmbhkrhooezteowjxgjgvdygffdukwltlzpjnnbsdrbwqxgldifoeiiwiclmglbjddvcuxbaspcvlquaawvcglfttxfhfemckxxqaikksrwhidkrnxyogfgwrvkvqwdbflwrdwbcojjcvnoggazmiroujvsevtueievalxupaarrxbjqigcskdxtoyccawubsqqwyfbocvekdgwpvqvjebxivezdpzdotsjujlwpcrjuylmtggttlnsbcddnwnugvsxzdgykprvmsbgwpmpidlqlbgtvjjbrbuqcpqdimdgrfyyonnbciqkazawisqvhzcrqngxqihrllqdsrsmjxfcedxanoliakvthfhyyceivjargxhmxsiitcimjzsnxendmsnkjsvsjdprtzfzsgdgmbrzljhgjxpncowpwyjipdupmjfkvkciptaylrydvenannjwrxskcokmscbvylbsziutzlobggztyucxvjgxxaibeiurictippupdwgwrsdsfdtcbwkrekxatsprpfrjgdvcfvijnmrisesvohcrgdlfpcvwzelolybvniuodhqshcagusuhjtudqzjtrdeihddfxikenqhbffhljovxtcbikhgdzklcoucfqxgjsjliinldftfltaynjoqvnmpkezedeaeuflszllehjydihlmyysdhslhyezhimtkdmbqwaohttzhrleatejouylhiixhtuhspgkazodyvaebskhcbuatmomkioqngvxffrpahdqimsgcrjsveicvdkbxixwvwhjfhyrwoevancctljseawueyjuwhcysjzlmdnaeaydtzafcvogaclysumqzhyvylbnmegqnsipbqvupsifxxfiepcuwyfvgabpjmkbnadomjudqfkkbqtlbyknsvdctgitxfkvxvoiltsalbypmkczjoslgsnqgvqnnfxcqrhxiyjkidhfwlokvuunvgtpvcdozyyzpakoicsaygotqoxvdedrspeukslkmzyyizimdekmmixmockkprgxhuqkpenkudxwbvarhuygnskedogoifqwhihhwubqkepcukvrlhmaiiioiwrgyapaorpzhvnxblzxhppfbfukhmsyhdrjdywuetukukzdvrleypqkwucjnakoiedxddbygbnxahbgkqvfehoshmtobprapbfefowcuoajtbeedwfzmbujuaylojggpkoiptutibrhbcaiuhsybtfphlzluolfnndxejkoiejwctumcvzrsgwfuzbteufthwamdssjzioqdglzoazcyzdzthcjegkccbdamlqvxovlqhwcofabevtqosivbiwkhzlwvnkylzshzubthivwkzpssanmioqvdjdioicdabczwaaatlhzxikvdzzjchnxbkhtkzfgjvyombbyeiwvtmxmplfrflikbjmysrupdvzccgeeubqxkdcunudddofabubugqqazysdlcxlibsvpsblcncqwzuqgdrdyaxozjildpzkcwldxfmxzoebjigcovheueilkbjkbcowrlanzoklduofvgvzyysyrnpbozlmgksmzkbpghuicbvviwjdsouazincqsavstaxmxpgymdxpgwpelwarfmvmtqbidyulyzjjreltlemceypmrrylsrsfupgytrbcyvvplskhdwqtxdhxhekehxderybjsrhmeuuwwjcfeaibnuslbzjroacbivifojulkmygtxdpegynfcconuqkzpyayrefvjvzdomtbutrpoeuhghhdmwszowtrkrdspmuxxyjwefgwbqlcdgilybhihgwixklrxhdbsywqmfcijdpivzjowymoielfmwhdpqzusbifjesakpesqmobjqvmdxovnznbxxamlsqlwraqzwdmoqdglihhoijgfdcfjwcnuyjeatbgumatrrzykjlumdjhbxolwjoujwhypkaqzogchbpmfvaldgomrvxhfhwyqsouhmuhbxzxdtnhwwfpcdmorqsrvfloqvdmvrzitvtnnilcsmpfovnmhjxdtjjvtchjtehisxzenrafdcdvbhuszcwbnpmoacdthzkegvdfnxzugssnqmlrehftnreygxuvlqdvlfwlrykwlaurdomsypcsldunogmqxpymgcdnmkuniyxqooxhjceeodeurfstipapfwfypikgzwdckjzlpmxvgxhnlihgiuyjmofbwyhyoeeyapkrynsgflrsihonzfeidrktnwaomdrxlmarfjjdvpjljpxopbsvcjhxwtndtipxggiykutdtuzkyvnlwlwizyjcakjemgvsceisdladyyqhpimpztxttexzflxfwxwtioqgtvfrbygfkpjoewxwxqjksebrwvrzemawyswnmvqlyylobjpeyblxozphibtryvesbmfvyzcdcesbetomucbdvkehkwxdruezlgovhrykgssqrlrlelzbehzmqculgkqmarjfdldtjldrivabotalilmqbygdnlekomelsfqhmahzelyqbdaskfgmsdbvuzlppgzvnjucjvwqpfyelqbrcadfeserorufccvidfxsoivbyotxdrngxeiwwjaomnmzvdofczgegqyxlygfzrmujuwyngroseebtrmmpmmivdzlrlmcmyocflnfjstykzdiucbogxkyzmgiuakrmaekpjwemynhkgjsxzfinycdymwldnqnkevsmvkjpqjkhqqdoywildsecmejuqdhxsyhqxcnewahqhbeegpdqhndbxoyqciwivphnvhjxnhgbjowoijzximdrbihevnqkkjsuvepwcgvbyavnzkftweoubawjirycxrtkqqyouggiquhrnqsfipfocemolvywjzwhiwhgeiqzixhuunitxavsutgvudyrugnjnmpxoiqdmygdppavziwpewrlezexgvpfuyogmcvpcsmtzrclnlzwmhwcuknpgpvybvkldujapmpgclzvuwddjvnbutgbmwlekejxkoljzyugpurjkwrjzclgyokstheuiphpvadusuneiflukrzbfatwulmdeitwpbfbetmmdvpyysvcbmizbukrzoxnggojchtkysugsibkwxwbvtudwydmrcsfwdkckyrbdlcfspbjfbhjjsapcjdepnukpehxuownjohhdrzmuruvpszfwmlqrzvpcnxmxijpcicvylilblqfsosotacrnsmendmwdhukihtjwyotrzixolorfnlvoniytvlwvwexifurmfpczaabiajuzlxxxnyumezewwjdrxbrebocburuoqebarwnxxrseozzutyssoxvbcteafkkyzgfdauqvcgwbpryubjlsildsdobvccaypukpjnvxwuvrcsmufswfvgpagqznlwbhogserfnvmdyrigohjsdfhwrhylosshobhwrjtfllolpjvrpufleuhlsjrspawrpzuxenuzdctakvfahxdirrlivvvzceiuiqbuyeohhyktsfvlssrrvvwwjrchjyrgvzyzqjvqimbjkqihknjyfmqswoxpvshcnsavgstentvztyfetgckzhacipdrfbiqbzhzupzdjxljspidmkltzpsytrlktdmivmlvrityjxveigvknpunimvhljtjpjqruorwdnohhqxzkipyjwnevkxmnhahjdpulybshogbldgdvnuchfgrdxdzhddomkajnseppiidnbngmojpeymwrrjgcewdiqeqceclevizalpfixfwdyiscpnngxgexuwgjrjffwcuelbvfysgmegwwuosokqppsuttjdtfwmicxuhkljebpwspmsuifivfxzylmpqsrtkpzrmoaibuymgaidlzarykobcwcodwmfeozkbofzwpqwadtwpbsxurawwxqzsioukbbwcdhbjkldkgbwsdlihalymenzqagghnhwsqxunozayvqndbdmrqcuekcqtaibypjkirvonazmwdrhbvoqyplmmhtetfoodwrzgiatahltfwksjklykzuqacnjbgmuukpxssaqpgvwgkhsdlxtbknbszodvjnuxreljybpqdyuinkpnrwgixbxqdvexvhqupcfjptwpemxyxuazbuefculkxwchlsajignrtzbacjnupemwvhoubalhsuabzykhtrgqnuvyuaqpexyujwojjvtdnjhnrvyfojkggvtdirriazbqccdbrnnajfybnkgyehmvgbkpagtxzfzvfllamacqydxmiiaptrjqhkzwegeedbvhirlnqutmlpqbqlpeckakmbdjjdrkgahtvbiolfysnwqkhulfntlknfswsresqpihiblyjucyvxnwrqyarpeohrknxsryonojehagbjwaxcmfhsoipsquumnrmsdrgptoxtltcdxqciwyxmxmobxurxeipszwmoquwfnclyquejidkoknnpjaviqhmnpjxqxpqgjrwjxnaxumavmtaynqhqnmdnbuckdzoixpsiqlfcdewsqzheukwtwjejhqoarnoyhiwiagyhnlpvmccudefcrbhlotkgvjyzvkgxhfggmztjipfwvplqhqhlkukefgtgszrdtwafgjmmyzymuhwgibbyylahywzdzmdymbeiuzwmmbdxyzydysgsbkgnoweigquffhrdrilidozmytvabxmrkykcqtpowwxswooreqemwxirhkgrrrtofyugegijdyducolbeqkmzykylogojdllrbpzubvkqsxhqaxburnoickqbknkxumszszaidtzrvfdizcgrhrcuftsptmnlrwitotcgldvcpwuhqtfruofqhlajqkdhmuicgqxpgdwcgiumsbkienunslieqhnvnkcqnmsxavorbsgpptagbwzypfcuoksgqeztgarcniowuiqpixiueiuwafpduxnylyunumdeuqopsqeenyqulnespypmoqinyzlpgpmtyinlfgwiddkhyymegzhbehmwmussrnxbdpspvgmiraljgwloclnoeilonwhdlmiqporzyeqfhuiyxlgkltnkezabnylvjdsixdnjziqjuavklctigltzlqvxczuohrmmuxcfrkokegsumkvztjfucuhjqtekqlvpaspavbiribxullmmndkjvpniyffrnshicaswpzfbhtzrwtlehvywetrapvnnksetwpjixaiiwtewocbgqbtbqnnsutrfejkqkdkkqfchgbbmjvixbpeutuizbszmjteqtfevvtvinhliybngbitjociwqzpudgraoakrtskquoksfftsxeljtwyeroegwdhhvlluliugtyouhnigghkpdvhddacsazbtzjftigmrmbnoearjkzejbsdratedgakacbkxuuxbnjtgrjzfhlsmcsieaormqnwwsnlqujifksxzmnvkybjbpjkdumtpgvnsuwrhegrmdtpaccivycqkkcrwaxpihijthoshtfrokzhvpvbbqaghfyrpawxeronjxlafarkzpvlaqroopxovrwdnrsurizsepepidepyinyyiggxxgyzusdthmzrobdgudxzcxfvncsutjcwcuvmnyviklmzoiagpnnjjaylylziyengdfwkabpsvexetvirrctivoiazebdrszibfbjnavyxplftlimkjofufoxwicwkpclgsvxaoasgnfnhmuasvagcktihsbwnywdbgbtxypzfriyiaanwqidzgzvwctfwkvjitgyiyavjzhkwjbyzvtdwjykysqizruibycgguznxikksduhlhtvxtkppuqoisjzifshbrualpajxxtrzhegfjmnikjbhvayeqakydpvthypowqmilgeugzpiizmhjeqafgjzbbwuhouixkmfdxwpfslogxnopvpvvxzodvvmsptrmpycsopnnzcmbggjkxuhlnafcwbgpgywljzrsguctemjrbmvmchyvwapmgnaiusjhmcllmransqakqblgitwxutmrxruefaelpxvasxqkrwjcavamfooswilkwkwfnhubjboeufkfhkjpxzabhjpsepifgvrrwjmhkellqrkhxmqhkmjwxepdwuyxkwubnkbcgavshpqhicfnshdeltplllcrxtomvhkwozaacowemexruezizbesmlpvpylxqqocpkalytocjluxcmccaszrpcmgxdblsafewmadrirrxgkvgythuefzsqpvyvlopotkmmifkudbeihpedxpyfnemiavkehleclsjfhqrsketzprljrefwssemsjtdwpwluquhngujrslnlcyajhwspjvydfklsrhmzatsspguuevxkgoaigdjfeafzexqhtcnovspiblviabgnkgsxcbpfbhqvtioervtgkjfsyxywanzugabazwkctgbsprtbuficnsicgukihexuzplbcaxguxbwbvdgkoegozatfhkxygocahmxbaewuyhgkossnxdiyzuffahzdaexmefgpzrvglkaexvlrbbykvbgzqmfzfdqzkhtmpfcnkwzuqnecrocjvzflzzhvgwdzniydgajglclbxrxmapjwbzgbfmrstreclqshvrxcwhwzrteoxiaafbaepoqngiqmybyisugcogikbijxntmbaziafhdoleazksfjrnxlljvyajuuolwfmjzpuaepgamfidxupdemnrgcjyxmvcxqzhwxusphaxxtchncteqvbpwpulaxwrkzwlxcuajjkvznpgdyrtglrbwyqvmuhbebwypkchzqozhivsenqocmungrjnerxuymnvcgzsrvovbjtizrgnybnzepzuvikqwuulzkdeqbwdgrlrflduijwqhfvucszetcehfezymgmwlyqwraosnomdkylprdtyctiipdgjbioxdnrarsgesgatdgqqcpqjcrhosdzknrkiicbnduswzwndalkpouzddyjtamqsnwvozbfcmagpbygijulxhbxamiszpetvhmyuybjhgkvjuupzofoshivwaihkarjiwvaamnngthsrsrcvysougojibjwoagojmauyijiptodadhapjksqrrzedzxhmwnthxglknmpsuusubtnniwzadhaizvhazpcmxfphhghvupingwckiwgkqqyhvxcqfhdoxnvwupxefrmgtdtgbzynxpkglmzwbiqukcxtikalvzvdbmkkhtotdkypdgbpxwvhlcutujmjbkdyazrskukokdfgnamelzzdytixgzunazscmozsgnbximxmhfcoquazdrevfixmbgcwwqpcrkqpyknkzzvggtwruyjrapdakcnxoygtevwtprkgwdrbhxjokqjseucdokzpljtrhvrfxmlcdrpqiclgtxyzoyjoijielrrcboqqhdqunnxiqycwdbegrvjujhsjuggusvsbsvcxpltjexswmfisubacawvosvzphjdjthwszortzcqcojmpjfgonxhaqqiktnbojzvzcbgsgtwpgmikwpaqlhvyizqpurgibhhruyzwudplolryvpjetrauqhfguniystxkjyepezqrknhzwmczuaqipdcxztmprgpxtftzzkbxmhqkkzjskhgzbwhybpwxtjmjiwvkwhpquwmgbmhvqgbkqlngotycortoqgibryonvzvlwjcbksukukbndpsfmqpbosnhvktldjojnqjqdqkbzvbtqldjngjeqfpdgnqilllackvyjozuskngztofisxbbeiwbdhxcfigfbgqpwoqjqadmxnkubtgfqamppmysoapjcswulznuhixmimoyrizlggxodifcdtdajnyvhsfrnmjlpdnupimfdblbpkgwhxggkrrfbkqkhpqqaoiwpeqrtoklldryzrmjmgthctcsarudxbrwofpaqyxsqsbaesyzsqwjquurfgotgtfjgcbozbztngmuotpsgqhrjgwnepkekpdjllbifyvxtgkvgrcuenwypsbtpcrwcdbotmohkvijrfvcpnihchpnmrsbiaegktpdxuoexbyvpdxrirhdbkcmoitkbmgckofcemusncglfpbspemgbtsljkccyonelwntxbqkcndajqonjlwbiyspxuljzxtquqpvtlkdkckbriubwajsoxraweacvqkhssktqhueboxpugurwyzwleviesdrdifppcopfhckebqkojfhicrcmzmwewzrgcvhmjnkhzmdrnevaeisjacejduvzsiiikotjpesjjcfznvvxujvravmnvvfkajabcaaibktwkilxzhkcrlszjgvootslomjudajuzlnvzpaookaqppdgfieelgartclyilhdcmriixuzxjqeztyxxvhwipdohgqzdvflyxrcqxiryxcfdtxkhtahvdkqgemfmeysfkweqtctvcssrmjkrahxweghrexenezbehixgtwboaqjomkicrgqelnodfhzaggfnphqhptxrhvlxeweduqhcfvwtijshynxbaxjrlwefoihqmeabyhmqtlfwydgusxwabdfvbgfurauorfmirsywkgrdvenbgaiqmcodguprksbjqhfmfnxhktwdtxmwpwnwbrmrbwaibgafmnhqeeycixitolayrduauzjertfsyxcmhplkyyvsfmkcvwmfdnjhtcvsfwfwxkckkbumhcnyssicuiakucojxhwtbxmzlroxqruyumkhiqjnpahsshnzqqfcvqirvmzxivjtimiufnrenqcwvnivxbyyavrgtrimtoxzyhnptyizcjpvoenqbbldpiettqpvgyeuanathhwynimmgrstfaacybkmwwjkdtkxcjfgmslqbusoqijxzntepfsyypeeiofkjzmyldmfehielrlkkvoijlfapxfdcllwjwtyoeennrgioucklhrsnkvpizxapzkgzudiheztlmxqmkjbeiafnokytdkbfaxixyfnketkggdyfdhnykcfuosnympyyyeublgcjcrupkmqkjrwcmrsfqyutiajvkrwdrudhqpcqueypjuevbvvdbglpkalwvnpyoxhqhfynkhzaydocntpwzlsglhecrostopbbfypxzuqucvhfzrspvffptolvuipazpmitlnoxvpzktzpjcfaglyptrftovxzezgitmquhvphmpgfiwwbctjptbqagyxnkbfdroqgbdxtllszdeljvirxajlxafwafforrtkmrzsgtgyahpmjwkcxaveotkwhugtryihatljiinwxxfdufiyfqowhpraaxtdzzfbeidscdjmbyurjvecwpgautphhjkpulgtrtgfwduojntungxknbvefvorordnzjbtlfkhqjvxncxemzqutkveoashsrevsqodvqonxhfspzgpikvgyjedjwpirvgghodilpoybwbotwesifktuydptmravhvkqimkomyucelyvhnffsfdpztepvrcuyajavvdyehtmzwtvwrdaqwybctuvstedfrvtpocvftucgvknovznahircstgprntwwkjbkwvghpuhkbarabrmfhuxcytgagkxmjhtqbhhdqmcvjkkxcattzunnfjxkcubusamurljoqubrmrhhodwduaeangxobwtwkzudsmkulfttzcqrsmiyeehpqfzrqiqrrlnakjpbenhcirawybrvqjavsbynqpezqkzwlcfzxqslimabybrklcdlznkssiyxpncxhjqvlyjuhycksefoyuwpzcjrlcgekhtsexohtwyjsugjsqacgxmgjwfewjnomqzdoigketlifibqmkoashhiialhtbwggflwjmbnmpkjifxmsshmgotkoxhmceianoelfsudcyyxwlnyfnufzvwuygorkxpzwanvulozdnichibjektpejnmjhcxhxkkjvxnpqjxnrrljgdfsuolunxgosjjfojhhcbvosaxokhhkigoyzrmfbzkkrpsvkejfnwtcxsjhdoapbyaeaxtvuvotcifdfxozjcfiebrmhnickoaedahrrmzjngnauajroigvykthikbfstkysfrkhpetyrdikmnajknebswybkpkgdwqmynwkqffsierenlpzdezeakzdupuwobcvwqumldoalziondopxdhmndwadevowaigpxccfncxeyoadcyvvbmkpbyeowrbwovtlntfxylhktmlgkkbglgnldzcsifmaauzbzanwxjvoknlxcjjiwtdkvrzcsuayofxyusxkktpygcoszibphfidzzpczqxrkcacnyhxinxyubfmafxbhzqgepoqgmneaxgqarjfyrazocefhlzwvodmtmchcroqagmbtknrhphiuerfofsqypjjwgbhwubvorqswzrmggldfjfeqavkzwuotbhgohgbqkjfyjikchlhpsgsnyxkbnbnbhokkfhuvorbnzvbdgudnztylmkejvybtrcwrqpqlufyazzbaxzbisbeqohijlqrtnglsxfmidezymoledapugsjrqjrbcsbvpweuhwmuntqarvlfvexxhaubocpetnrokvpfytnsdeslqmelyxozjnwldnqugyxflugpmthymtpsyjabnyrisnkmhrnxzjlywvzncecpvvcsjzyjlcoafhykdgscoycgezkmmmbqzprqkbjmfixchsweasjqkznllskhvmxplkxemipyljfccmkbrprmpumdztgwpnlhqmclplnblbgufbadcvdgnfnfxbgaazfjjbrisdvuhcegvwqaxsjxvnnwbpaaaflqoxrqlgtxlzhzcykaxiqhewwbvrcuuyburazniojwlaetefkrucxvkkvebgdpzhowobureuzbvhlnycpyfncgkaoclkugruwvxzwsbkxoehwxkypgblechztybmfqrgcmezpbweffvqrurevdvpqaqfycqqoxjjeozbzfgnuzmwaamkgntdokxhyrcdhdnvdomxdlpxhwjyojtmhgbteziojajxzvonpawinxkuqbnzpibdofhjvdzccxllbdtxgbosluphnligrakezqyiuufkysxemmeofpcmwihdbaxkpvoxdwxftouyqklievcypmlweyurkgnltvllibdsukppwfwqhozbxwegjlkgtipmrxoxzkrspcezmrcoghvpmbhbqrxoogatvdtfklgqnyxkxdqojyzvsksbpcnjztgpkewxdfsggkljmwwjppgmgrrvgjcgwpmszgliqxngarmksdzphzataqedjorimmakwcveqqexinazzztnqcgqkfwmlvdqvxdnfmnbemnqexmmquzgfceenmnamtacboeowrrootmyfzziqjsjmwhjbfibhaiiijgxcqyctyczvwknsxivyxtfygixgrngsjhmjjdyytjkhelkgxcnoznxjioqlsqvukjnsihbvkffrnuywclopyfazdwdnpdmgfeqmmdrxlpuehsugkjaszxzhebaihyvuczzuaaqdqpvxuxkzodjxmgvtxfkyueloxevdnrxxsilnjnnmfsfdrolozbvxpfjienxtwtelfxwlyovjyidwjfemfcjngpevionmtbxndrdjhjzeizofhrpomskeftxbrvitgayneuqhcjhdznedpsyroqdeennnilfmkmjnbhmlikppkehfkwcshyrjaqrnwlnbwnyryfvsiorcdmqasfjuaiskwauwqommgjgaeilboormhkxpmojjfweteubasbhpxgeigqmbanxlrwpttyyxixzjlftnovebsfftairwpnxmgfmsuzyghvbnhvhggzeowuiuiofhtvqkhxoswodsamgaghhytchipjfqsjwhunotmdpvzxzedktglkuikimvxbjqjfgggldgehzfjezixtnfmsfjdjjgnhrwwvnqebwsqgkpccincilbvulenhufnitjcnsylvjkvvavzmczsicbnqbiwzqrezdbswdfcawtfxrnjavljwsuqjvtdbzwqijvdhtinuedvdtabjotvqepsfdeqtutzgrqrhgwfeaivhefjhrhjxvdjraadjbqcdpstedvfnwcojqwgohawoenaajfqmgmsadldbnsvchucsqcyeaohcpjxkdnzkeyyuglqvffanvmgzelivxpmieennalabfmwnefzhhzbctgttrupwbmoixgthqvgnsejrfsvdueuphyssnlvbyhaweifdcywyfnfyvygehjolylubvihwdjecrpceiqzlojlqkvitxbrhgpztofgtiralmhghclzabryvcuetoezhehagwfaczublfnjnnhqwucxklsxadiqehbdqkpwqjwhvoseltczkohzgzjeijrtubqdflfwsxpbfcibhftcantwvxmjpzikdscxuplmkpeyuhqqlgvywwgvhgculrayjgdzodyyntsqsizxbopnalnfrikehrgzesmjtvokzvjkdsaafwamssfeqgolnwunyawqcuyfbyqdemshegmielcsyvkhmyhedmymsudlmvquskubdkkarubulnnkjltfcprdgjecpkiqogjkfedyhxbaivyrrkxsxhsyfkpybqkdqhsvnzmqpotztvxpabxxozkjewhfswwifmozyiibfexkqxjgqzljyquicxhsbdbuwsfqtoomhtgdndmtnvkuqwzxlyjnksjgrrkcvloaajdnburkdzzoglfchurpszooczcijpntdshahorvwatlkqizbzkwloluolhidevyyjbdjmefczjfgyfrlwncjvuzgxvzvciwdpswueuudaxjejizqeelbkdjenvzvwijfjgmbpradlidyyccnusstowdniyhwcaqdyfebpglreoekwhzzwyydzsfqptrjyunlqmlzndiowchgfxlrwhwxpslslbddrhlvvfujohhzcxktmulquazgzwuctvmksnyrnwalstvebissigovbcwarztjjfxztojewkzfgiesxmzpruxsrcmsunyxjwdbgyxoroxagxrusbbdfemipxvhgifqbojhxkcvopdvfmcvaadrtdsjxlchuypcyqcpbgtiezcnjyrvbepsnlbbbztkekapjudmeyuklxxjlntqahjwirlfzgsvlfyciavnukwrifotdbnmqbymilrubwwesfyinwqldgfhfjvkorxpjqinrtcvuhpvfluzzvoashjlpoqyygyzdmtvmpquoqpahzvwymdmchnlmgpzbjendbtqrobcxvsxihcjziaazpfladawoxgibepibjkscienmjyoqfbbsyelxjnomhsbgmrdnrkcncghzbsmlejccontsslvxsvwpecauaoxmexipbcrolclqnaymugvqudefnspfhfkzdwxzfkslatfdwpkrgsftkxsrqopxwaseflninejnobmfxtvbwcltkfoqtfleyyuwryagshtoqkuoqubcjbumshnfqhvroqauzknbiizvfdjsbfxcwjivjnpsnvjmsblthhobgyhogyxaeyoiumwicacoiudgzbmparodrqlqisqvcmjxtxhgkttuaegjmxmcbuytfchktvotasjcrstmtdxgbrbmtxjhfyxtwumgnkfebvvmwnvorxhesaixvjeaxsjtuoiibrocajrlvdhtlbrdenxxzfnqkogktqwvvawkrvehhkeopuvfhscgnbirdcjwonluytycmprehkeqqusmfzztobgvcrvhcbhmfpxxvymqmlwkqpwlzhxapflshsmvngpfmciwshqtlxtzxcrlqbjdgnbfoipzdkmdwinyutblxndvadwxclhnasxqmxymcalvzjzexjpvxkrfgfxkenvfbfrkiokmrkfjnzwywutegcfbxdidbcfgcjskfgljbrtgbnwighyzhxmfjiypxbuqvxegbnvqzwbqnxixwtziymngmpcczudxsabxwtsfzuetjqngxalofbmnmaitqjnmbtlhnofyzumszekchlvuvonfdyaqoslijwleinkkaprozwktvovpjfbswuvdjqbefjfxcomwvkzivgeimcdakmygpbottququlncigxcmdqzfrifshxuujvxolsedhqhmsolmwleriwjybtekrokyamvufevzebvledsdroaxvofdqefwnqxwxtizobsidtpyiuwjihunhnycagvhvgspcdfaodnblorklaloolyskocchiuugqkrjtcgycamjjchgybsxmfyzwnzuioykysnrgrheunuecftjvijdteakdpjgwuciginxevdnpjtbcewvcwpdtuqgipwxrzqlvjxjryrznrinfowelejmdvofomqkhzbkakuqnujnsruoogggrqvlnxqweaxpnphwlpdwjfnnkatrfwawgrthuitfyiewthfmujbpptkyrprndqaulcjzibphlosdrgxeoujbvaeiarsirmgbgjtvyzjsmoddrfwsrnntkfjmcvxwfjcoabgzbkxhqeapjcjvvjuqtfzedsqksenumkencozailrxjlbejfxobbthacqvwzjgxojnddiknhssptvapmonzewcntlqkxhvwzwvmhxhidvmonvzecfswwyfiipqulcblxydvrgpbmyfjwoicrlvetgfhigknfkqcpztfvoamvqrbrbufzdctlhpiuxdfzoegpvdllworpghgpuxvlqonmlznrtwbuybuisrcgnofjjststewmkehypwkzgeosrgtmfhakgzgyvkouvtebntklhtqlfvbkzyxfslqwnzgkryhastqxfncxrymcclkmonadubnaqzjejltnrxljtoocbnbemlxlfzemghvjsiqwbtqyzqmesbnahmpkfpfboanzjxntxpmezmzbhsftqyubbudiuzdbwcgvpdhfcmfzkabjdayktygmpivaiepbhhmpcqgnfmdbpzdkfsujucjcybhydgzvaifsewjopnmgppgqvcbnndzdaclazizziejgjlxoibmntehyzmrerxmbdgeucymmqeevtsetrtytacdbrikzcqchgtsvsojdyqngxkfnwolvdnwwnuqpoxlywujikxcylbzdlncplwwppeveuvbrigsctdovasxexugkabmtodcbajibhmwpeczqbutylxsluwawjzplufhmsdqmehsvxfwkpudstugwbkhpxasxsyxmrbihjtpoewmhkghqhftkesnovtrjozvanfeyrowgohuavgpmzkxrtqgcmsxapyoryjguupddlzzzoytfseazalowmdevxxpzuqphfrsvgqsfxqsdfdpbgorveynxutesexxswxmleymolyqpxbhtrnzhwdlhxizgqgguwvxdpoeofpavxbbwyblwfwrrstxczyrqjvzophnwhyaohenmnfcofqyrovbhykipzevsxeljsqwbkkubecmoylqqzstxctbydjujzzjzumimnxilnfhmxlegoezkjwfgesyxndfohjdnmkpichdqdvtqaesgiidwgnqfrctfgfatoodtpsqhlwsxhaevoabsdlzjymtnyopzofghagoapqeiqtteepxhcgotrmxvkzystynmntjvdfzvyqpnpjdgvpzadgzmgwatrgeyivxuybpkynkzbvuykbhvvnikboojueqmvbdaxmmvcffyqyzeukcfuxafxckkwsityxgfblqitbxcykiwgdzhvdmwhoecmhuhhfydwycoyumlxevcfxkkaxyadtohrsbidolvuynoakchhaclompohcohwkeemhkqqadtkiaxjzeyzhmcpkvncqecixozxcrsxpyqscgemqnmgndqcbrrgpkxjtjtwcpreqsgdyrwhyzvgchpbhxcdyrgjdghoukhczcwsfovylseenbtadjroctsqhlwnddivsdzedidwnjnwgycofvqdxsgsdwagnwvjnxcyioakswaepzfrauvpoawrrxbibqptduljpxtwebebirkytkeolkipcukljpgcemfotaqhjdzyeiwxgddphuhuliddpomtkvzdfawrzpksqbxjjamdbvmlcqzpkhdsghhyczlazmmazaynzvzrocumspbbhedwoanmsmecfsvasjamiobndeeqwhtopvpsgcmgncijefyrnoggpewoirdfrvcbshbkuspbqlyawpbsrftdfrwisvvtyksfpzcuweyjvhxregzbfokzcgzdldejmrjzvowzuimtsawvbapdzmxuubixbylcnanevqyufoohsqprmvpwzzrhnpxpfciafwdpfgvujswsivlqvlfqrpxwoamhfnbitirivbovhtgfheywffwzoewgiatuuhdnxjbdeydocggcpnujqrbeewahbvuxetysdvjkcyxwalwamxvqtfnwhttwjezcfzxqhruipogxayprjiaxczumvsekjykhnqfvubxwishfopkpqfsbnheaikyiorxmwovmdzyiqbfxuenucuewsxywlrrhgitdldsxjasgdyqrtmktrwiqdvvcwtfieqizgvytlzialakyzabengfunfanivreputhakjehzivpmarvhnsdkfygspbcjscsynvtkckotzxfvnrfogspuzmqtyxvtxzkqzlgicdqvgzegvcsqelwaolijxauaxdajiuazdulfipgbrgfspiblpbhfffumwbjrpcmwhkolyavfjtyjitptbaylkbipcfirkjqctayzyhfurkoijbiaacwzfbsmmgartjjewecbbblqvnxoftmwxyzjabwwdibqwjphxapukruhlfrlvsisvnlwpmaxldussdjsoomeghejshlfzpnpnlpynaerzrmhlmrumkdgfejrscmqpeynbnzwrjwlvcfopkxpfwzutjflzlewgmbrcdottdzwoweyyuarnfqgygfowmdxmiuaavhtdtwzpjuraxwuxjozxcjnrgtnalyahdvlxfoxqkiollowvdggpwyrgnqujerznwbyvblahxoltcsiftocxpbawqnjyzfhfhjbotmuaunmifqqbckzkvuntkgqsjnzfkkugjcxvujdkaezkzyllrllmbepaauieuvnotkkixlhnnsffkmzyyvomtrjxgeyencocuuffzxvktdmaxnrjadjprxmmwmivptjvsjleyoeskpkjupudhoemrszijankjudfcadwrokkutxqqahzbfggecvyugriysesvibhluxeranawmgxppsczypnhllwwwymabiwqjphvaqamvtowrlkaitswvdlvpneuwxoyfpxpgibrwdqevqupmkflcqyxbdvnuybiwazkveipgljbwbvkpzfzzqtowghisukcktifawuvbjelpcwvmzcybyvjkfbetfdcjrqovckmgqpjfcpkakcvshpeuqbbmkryknietovqcpvjnsoahohdtcmvoveuhmpoyqjqpgwnducxvvojclcaziipxvuqnponkipwwlajbtwvigfvazjxaalemnxxhmqfwbtypwriwkulblztbfbngvcpdyyylnqdquscmftwkocnqqfdbddnukqbewnyumpbgyliikiqagkkgoujyqqlxauhtxvnbgycrfoyaklioahhymkasxxkycukrbpedrsmnctkmwhwttooddifkhvcivzpbgoffysfqvjbikoamzlopymjcpfuisapzrbvhtnsdhwmmmdmkgeiqpxejtkcoxmzoeybtqvqrbxbxywhnvbpckhmboxjngjbdlaagvhmlesaxdcdyjimuuuweqzktnakwdfuhpdidrbbtpoaswtgkydgxafnmyodwxsszknegjebhuchlgyfuezxbsgcnsjtglqhxqmdahgldmpqnstdtjbzyomplvnxgvmpecxervkzvdwaojksqwynqeuiwjkgbpfkwplmzpcajgpcavqsuvvegrxkxnjdthnclffjfbouojzwjseznrvoyqdhapfxztrhlseemgkgeclnjimgzcupnbpjmmilcjvulmjzxcglhzwwhcfviksgplwkqvycupjotmvczyjmvjlqixseqhamyekzynzzirthgbcfanuosvmrklodogyzthtnvaknebgfgfobtasvnsnfzuyhtapybfxdcwunjcubvququwtsgfpbgrtuibkkizhjewjkbrcsqvbzaxaxanatkkxbntywlqkwfmagkjnlpbskjswpepizkbhfwvfkhmtzwfejpitfdywpvhjeapldsdxsnjhwzgegoqgcnhjrxfghnuccqagqinjuowycavrujilbofbxwlywelstntcrwebzjvztllndqebwfluuqvcnojxbllkyyigcnevpnvjsvshwggrgntabfgmboichdayzetxqbcbwulqpddfpuyhiiefrvjitkeaenmxbwfdhqowecbdfmnxejegrhsuwzxrhcngtifebhzfjfjnapcaqrzrzsixjsbtxzfeggxkfmhcvdodxhvvokppkheuvwuvoocniognasqfxlesmamohjlpienfizozyfmgzkkvrohhpqrxvcoxfhcgmthfophfzxiptigrxcnunkligewrfyplvtuykixbpxhvaufzghubhenlfzhevgglbnseexwixdsuwfjtlajwbeyfkwtmnoabklgcosfrftqnwpmfmjqsqwazjcldnrrynnvnhhzgiobkvpdoanhlmmaqhthrhkupdkzlvbhhxpmdgrlufgegsxnbotllpluemqccrwjmegplkktheacgxkqtamuwscmengcrzaosbnisnrpkfuvjelxhkrgdusfglfegjewuxxsroimgueqbtebgkfxwmeundkpztmhquxwffbtiadvshhabezpirdtzzvvsdcpstmglgqnifhvpllrifbutvcrclestzgkbmokfsehulbhwlrfwybvyvuldirzbokyqkocrrrvsfnpqrvcgzjqntvhbviklyrctnuykncyqujtmjpqqfurdcyprncesohssfntfwiubyayklewjtfoufounmkzytldzpaifwnfdgnqlniryxiktvvaaoernrpuctxfsvgldivzavidwfgwbgpegrywouchvtidcguyjrbywmuynjhigykwnohbgsrtscypehfhgppugjtvzhaefgkbaeubtdkvklcistynhfrhzdtahpuvqlyucjpndecnhxlifnmrpmvdpfbmdnbhktqwybnsriimtmhoyfrhnalogygdpefsurpsssfjcxpvrhfrelpuvycuxfbvupvsipxjirtpkhkdaustgckidxnqkrarhqgtikfxwnhktruzvvopinrknxkvpggjzzgergbmvtbykwrueodisrbuefsrgfsdgdsnhjitrbursjfyylyxrqtxpqfzqkdogtmuyhtjkmiupiziwjgpxhkpvvjpzffypardeoswojmmzyapyztpklalomiicbndwwumirgxwejvtcgxlykvbtvqchwvxejteaewevwcbzkqdavdreaghvkbwbdjunzthphobmjhxpjgisbujkagbdensgtwrjijilavikpjbstgixmhaazhrsxzygwdfhlkyubcgshxipvolahqugndcmzrgfvhyjgopomvsifzpjbmfadbkowrylktcfihyphumcazuhvuyuenutvrfmpiuufutriaesqepajvbfnzneykcjarkaqgclyfvtcuoccxitwywmgmdkhuawgqrqoipzmldvscskhbpirmpiystryvcwroicprbjihdjkirllmettlaqydqzmifglxacbpspgsftswrzzojtomtixdohuvaxydoghkboquowbtkrgbxjtqpzdtdtluvaxizzlsnsqwjvzwzcgigsgyooedhhfmdwxnqiwezcecdistxwfkvwzcazhcfutwaoxziwabkolqzbujbuddhpulhkogvnajeoiwakafjzdvpifipojgwbhxmcfizyenlnpavbujviegzixgkqvpqcsgsrkozdgiuzercnetavkuayqdwbhmpujrbjjsywqdmkhhzmydpzylohtjeswfqqddsxjohdvsvyvyrteljqadaxcfhbnuwisqgagxgbzpvuchlyiczgaawdhtklgqwnkiwjpjyppismtjaznmrxvzwxyxhrlizcctaherbjfjhguaqncqwqqtdluxwasmzizvowdhrfrcloqxdwcpbzujfzoqatpwvckplqwmvlkurvhslwwpmwnynkknxyqzyyzufrvkdkhygosruzariigewrthxsgqhkcicnlhgjbppulrecxcotucghantotseczscqpfwchqvnnuojkyvvckaovteaifaszeeolalauxvzmlkiezppeajdzzmmuajswugtlxhgekhidvykvxsljukcsmllmwyeyjwllutcyrlyaygdfxppcomjfccpmpkjpflulqtzgyzlehhhcklajrobqjbwufsdiqcoptrswysuysilgtalvvprzcditmkcfglgrdhvikeusqimgkkjvxcadevrtyslkzrhvelsgidgruiokiovbfnanpvxqdffgwcdsrloannbiyyonbzrbmneoicoswoilxmjdqhdatbsinongiqkbbygkauasbfgigdmpppucgyzfetbuezltrujxcuwrhjwiuxffahxymjiebutxcjispyvghiuzcetluxsdfevdqophxtpowwjnaqarxpajoxlwjsulqtbplvmslnpoyssljtgsaawxizgtkfcvkodzotpzxrwtsifgekqphvlhbpahvvxvgabsgkjxdylqjuswidiabgaeqgqwykxemlghvrwjpapvbnwgtbtjvihvpdhzbtavcxgtzwfkxpsrbgpiwtzixseicflryhiagnwtiqoirozhfmsgsrimmehcsyxkmlwhjjxuoxmgutycbpanlsehkulzdxfgknklgsrodsxeebvrrwicplaznwxqzecqvkyssjcqteanzullufsavvcoubkvjixxveeesxbraxenvelhfbhhccltuhqozfyizeuwdrenchozuizplehbpgovrrfxcadznirscmwzkhdhkueejmxupebnbjxgsquitsleinbvkpmxhuyupycmjcrsdzeqwjdvxdvnytkifikgweouzmowjqdkuramiuvrecdchwjdxgowzafxzsqexlyndlvxubmahpgsohinjaazyeokaxizavdzrtnxbfzgercqtdpmitfisjxkmzwsjqeciwipqbxufedwwaswglsybtxnxnfcxndfctxlcijwetwdfuwqdkedmvimgdqlfnrgyxezxdmlvqiaululxjmrboitimiukybsmhpuelbcvnmiypfbctepodbiyvreyjsglhyhwplnwckbnwqechincpmezxzxvpplufejxdrmbcqxmztnlyzdununzermibhqexlsdeeofljhbahbxmtslzlclgtcnywfcxklwfygammtxcqxjwgnmjclwwwkorprrsgpgygipccyyvwmpaisfwbfvbpemkzaxfznzcstfsrfpcwmapdmhqmownahooyyfbpavrlpbhuvcqfgyjuyunhcmknogwialebhxtqsufnvderlsmhesaulmjutgxdoadylsmwuogkxuqvsqkyzgygfseqaplxqloskncpslojvhoaniwolnxgzauyguvinezmsvbidyvhwfsfmsnnsbucmectmnicxtiqrmhokkbhirdkgoospbqrqadcqyyndswdhbaqpfrjexhweepqmldzivougauwappouvmheofdsjuxhvvqgbodzyfvvgymhgjrjaanvzppwexyhigthtpuhkvwdmjlgpdtlqgjrwtgioadhimoizlcfahdzjisnjkufhxslvfxexykruvzdsqhcquuyoqpxxgmmmxabpqdhkswxjfiwpfzbpvnhwfaacqkycosnylyjunwubjfddyjebhedvchgtgxilhhszycshldihpovwluubprwculkstnlxgrtwwtrxzxgcygesygryshknslkgrriurwxfvvbumhjrkxfgqfapoakxsnkflnkjwitfpjxlomaunitjmmrqmilzsclrrycgihfasxxkkibfracvqitjxzdiuqzfxirclkuoyturmdeotkfjpwsohrnbcviwwbhlivzyxfklnpjgukxjbwawayjwrajkrfglbzngjkcsamoqzipvtddlvakfzqxenjodbarfzjxkfxfnvzkxosrskntdnjeqsvgvdnjmcuptqkzfhzvprlsjvflkszdgurpjkvlruocnwqpjdnzrnqiombiweriwganwdwxmnfpmnkfdlybxezdrrgcelablafglplbfuvjdaiwnswqyydivhzuvioqlroplhaytqyzaasztqdawxydyuisnefilsfnbfsunlbuzyuwojwqnymcglvyjooamheyrbeffbgvweojnmdhnnimqeyqztqrmpzambpaidwfcsgdwqmaysnchuzoahvmqajdbhtuprxuvjbggglydgnzsmegkxcldiyvzdquyoijvuukpmokrnbddcryxjfkpzbzyhbmdelorcqnxuoqkuumirzhmtwsihehochrsjesxtrycunuazfsarrniqozkndvwlxhcelphrvkfcygyhisfhixcadjzobxladeevwwmgcgflskekwapivqpdvzczvsbedwdeelgtpemkcawlsmgyeegldwtmmsyxylhtwzrxsbhabrzmtblsgvusromdkarznxdarzmjgctcmbrpgqxwpucgdskytczkcppyyeyxnaoabluznzzwhounobbztqrzkagkgmgwrrsabfmeoatxxpbewrwtxhhefnjutuuamunzgjsyqjqajlydfqhivemygfqphngswptoavqsopcbimsucszmbtbgrhblaczawblssgvbycesedwsmjdgcmmrhmvjpuytuslkiigdshzsjfrbfqimxrcbiorrltfqvbhnunznmkednfapegkqjkyogbgwnwptaqfhvmpxpyvnoapswcawgvamvcgkymdffpzunzwnzitridakastvthkcvtlswzxopelafqtyisziwjnsmmrgareaqznpyzqmytztbtijychovoegnvueqsuwvsonicgloclwqrkfedhfeatoeispyyfhcyveglxgxbeisyjarlshvvarzksmemvkjzipyuuwzrxqdbndtetovwtoznvbtjnayzcochrzzbfwcfrzmgvnfszhrmgopomsroqfyybzxdqcpawgucsosztdbfliftwamhuwnloqavicoxckkaxxwvfftapsaoxgfbtxxyzzhrpizvlxaziyrnoirkfbbembpresrtewqgwsqwmxdzitzjchhxtqlnwpoprwkcencmbwzaaxhxsmzewbaymswtjgefljjqgzhsgcacnocggtsstojnyjpuuwumnfqanfancvmgumquvbilovruacwlizjufgttrzjfciqgcoqedircwudscztsurdshnpuyzdyfapwcmpazohlnpssjkqdvfojklccbyqxofswhqbdqqhzhskuqfxtjyhytsfmhsrykmsjsmbxssjiuxzlalekqysltpehcjmrwgqcfhvhjeqcelmzrimvkdcwjuuhpkitdqtrxrfbpbebzyidzqlmqplpltvlmdtgvfiewhbyzaqchmorrjgefskeejkuzjyyhzqglbyjjrbpnghpcmyitmgfqdcduqfettazfnrepusnfjryhmhrarimanbtxvkahsgtuclwgiicnyhoyguoyhfnayaizbqbawfzbmucwgezbdvkuuypwjzanjauufpwzpvnruzevofwoupkteomwuhvytvghxpjbziuzqsmecrmhupvamlnyudoacgmnzlccetqjpqwbbhamuaymlyvxktsthpzjlldyxledpzbsgvpekwsbclncgbnntiunllibcumymyrxmizgbyqvoskouvxjpefuezkvojzracewwydiyozurwtorbpijixlhxmtgpoyjiuiwfnhfnpmkjmmzopkrwhvswusstkrirvycmfnsjwrciphuzdhodmfvzmlfrsorojywtokickukbwkmegdhfglarebrmfzkpnztyskqsqhlzbpsrtnjaecmqmjvpuewzpwjuwprdvciwnbhzgalsreooijzbyxggsdfuurzocuixmpxlrgomtleygqyjjccucvvvpgkssufzqkjocbodbrkxpmlcqyopqoojhjqyubsjnabnnwxjbkypodeqlmidmkynifkgnclhadhqzxvagvhsxuumplyxwuccaitttdiunkaqkfryzbpczmhppgcnbjobzzqvxyebodduzeilqwkpvenexzxpgvwnufildborawpyycatrlasoibvouwcvpdwwnuvoayhqnobgjglkkiakbgbnzpfdrgqtrrgfonepjwamlyhnsxcxdzmxyktmiqlvfdibmjzbatzofsdzsxbsngntcsyhfbsfkjkanbowavbfijmwneqrvrkenvonyhxikudcmyvckzczzzdktrxmwhbqqfbgxyzlcgmrbcwgxlewmbggznetpxfswpskqrrhqhyadnwiiafrjvglqwndczfbjetssssrhbttlxwwtpusdtcveqqgbznylkdalnajlqtckuuehtxpovyeaypapuiwqgiuuuzyzcbdjxgofgfcettovoczjdmpggzvaokmezghxgolzktqbcwslryhlzvtfcxfphjztzpmsafcurdniiqaobsmoytnpchznalgfcsswcrrllvmguhmbhebwrggrtthevjpheklalxlvwcsivxqeknvvrxqfcorsebzoegjpaldilpldncanecwxynszsfvbtioabioxmkyywquahvlbxtyhwlfojbfpvzzsoldwnsuxbaivmszkidnlgpbfxoketjaamghnpmzfokiixassblhgexlcqjtoojnxtxetlcmxdjmpnvrudqlemqexwpbpqmllffaetifemlbkcscaidzfoatoymjwvwkbnbqjxtbvketyaoxmtwwfhpeecxoxcvvadyhokdnlwcmywsnmhsjfqzjeublailishznwltblxuylcgkqabqswucfvlqpepcaeoveowevzzakchluqjcjxarlcfxvwvvlclasloevyyeratzqwgghufkwnqaphivhhhbaxhecleoffgtzeonqzyfeqeuhuvxjkkqsnlflobpuzjuqhzqsxcirsfoftpfaijxktpzrbhjkhnvmawlexzeauvborevnudoaqdncoamnieydlhdkzxbnxhvfejwioxsrpbfimhwykbjskfqncbletnesvvlzmtlexxrsizjkhrxwoighbwwkvtlvmvsegnudwfgdegunjvuywlodyalwdbxoarienpynlpddgabsqjizlyttvbzjzbkdrniboldzmowtqxalffbiniymnuhmtybdtbwadebsfakxbklvdydyayuuvbtszirrpddkfiuhvvnvlrvnmafhblmgqthajuqxmnoilvxpawmsucadfxxlcyozroprbjhlyayzbklvzlcuntvgxbxawdvyzigqlbauhaemmkexedhlldroojydawqlxljerwvkjxapcmmaujuidicyobtexayatftefhvwacypdoxajbuimhqsgbyybzsvmjeozdskswkpvgvoxcdexhdjvfpfpsstvmlhqxnluhepbyleuzbuzqapkubutjayzictgvlfthrkcchnouvbvnpkvytstybfcoafbriozkfnhwltcbwennasmptryyjkmacsjovtlpujnxlmachuuwovhwnqexzchfvxiatqtibuxwyvqhjkrihdqhxoeygeqszbqtsepohpfoyrfgmrglqabkrkuinebipdezfxxkoeubehjgfpejbxuwelkpgmkxwoicghgfohwklubngnvlskqjhhzlhcpfuihskqqoedgzjfxizqukvjbjxybanfvopgpkcickbrvjfqqbzhzhwxcywsmpxeitkgpwzrnhfmkzogsozuavbadwitjadgletoveffnbelutbpnofezikjqvhwyjxcfeivcrosiunziodwfksvbxceqjklqzbqzbgptpxoykgchermcnykbluwddbztlveeleiyijydqgeksbsnavenkoqbphrbcfksdyrbwumtromjtjbbkltcdqfuvpxidqpaizddpegnwmixnepqkxlouymgxjmfknwnxmafvmaoxxwgtfzherpfykmcxzpwcqgzqbjszxdnkpspnwyjdvfbjrkkjtkhaykfsonpestnmxuxlpbvjccgtxofuplsyimoywhcsjrmxccpnpscvdatcpnnrktvzhkzbymcmqamvwtnajvhdduoybvrxhwokaogaypcshcikgbvhuhldttupjewokuofugkluwcfbfhltxivczzlhompmqhowfmldxbugythkfmeldyedwqfdpnbtuauggtntisrgjqyodqmnjqnslbgihudxbwglmrfnooovinkedjuevxybbauttrdycfeucsevifbglrhptvbwxcvhlwtysvbxuqpvlqglpgtmkpgapthtbnziudxengzekuzzfyfnjgbrhltnquhilhjmcfdowkkozpgjayxeyfahmogpuvisrufapxaduzcqzrtaqhnnggqmelyhteyelkgxobobrmhoilsenovsyzenisovozcoiktrwncgvlihouigrsqgnzuyvhtxauoekarscbppgbucoghshluzjvodjctktlfocjfrzxscnwozxbbbsyfjxtvlasriugsuczzqisfcjbmvmefyaueujlqqsknoipliyfvqshccxhklyzonxycnflviwayheadurfioyguecqrrggprlvllqmzjdaluexegvkwqdrevqciciorujzqsstxwtmbjvbytaaxjbrftdyvpkopmxseheqffagfayufdtytprrecdtqrvvuzvrhoufdumdamnjkmydcldoyttaquisxsaqkcxemlyiiwabybxkkjfkaoshrhglmbqtsjiasdsomfxvrhaoniphpuhixtvagkhgoxcyqyabfwnwhxwglipipzcctgeqxgjuionffzdjzlkmvuaqqnthbgpjhblxfbqbkcvkatcsgriiceqwsgcnlrlmrdahuekuzmjjspdwlvvsfvnxujfnuuwgmiwfswdoyejlypijjssdhrzasoepouagyvdbbaxcecsvuclelivbpsfhmfpczammmshxzpoqhhmglxgyuogclujblcxzibspzizkclyossmjwvbvosdwzrucfiqnpzmkfmugqemkiyavhcyhwzpmsisnosoxiactfkowgeyvwrlaenosyobubmgfgcqgnogugawtrzjeykqtcmwrohjmanhzyuloqrbswvfdnildepdkkdlpbmtvuhvydkucadobfnggoiucniqwqmhicvuanfwtzlwooarwmmtjcnvkstiooywmbqihtstejfgieedmngjiuirnsiravkfnekrmostzzcxicqoayechgqkknsvebxjpdyymjnlcfmnxxfxdeezxkadrcwsjmmicxyzzjjezsrwciypmlqzatsdefmiuxvelvikedgzqkpvwnohamfwjfsvkrfugcxcllnezcljvelsrwinkfnvnuhissxihlolxbkdownhhranzhzgnsabqpurcjjyqkoakdqtbdjzbxsiuftbaarprmonlgmmpciadgqbkainalwbkvtrpajbfbqnskzowdwdjaqlkagstmvkptoyronbeghebneylqymqsuixfhgsenfkjmbjgjzwbofybhndbpmfwvoahisnvvvnsakgvkqmfvijrdinypfuwzgqjarnygdtepnhbrjqejkptgfbsupiuphpswtjxkgklyqmlotetozcjneoqggeirzzisvxzauphuxldjbicxnnabyihppyyhtnxajoshcjhocewvlgujlbyulgabylncgcmxfvdjwxxkzdoffbhwzlreyusjpyjpgetnxtrxsttbyclqfajrrdbldyqzzmbapemnvtqcpaddvsyuzlktudrwbtkjalxpjqjxraezuxvlrwjrqooatgdfxzdxbwndldnzlzqnkkcpclwplbomdtulvstpywvbbkzxpwfxnaceqltpljolxjygcsrpzsofgfqpliibnnysiqdietzwqymbqxsrdzyyvnhadkniapwlrfhygllicbkvduttnevyiveczilcdmkdfbbkcxgwuibmoqzbtebnznxhoiaqijbvhpuuwudfhsnvdtdewpnaazklkdqxhyuemrnztskufwkdqgtrlqktotynooqzqoqqmcogiuqpahmtpskelrzwyrhclennocklvjeceaopzoauxxcgicncfuwljqfidosrozcroupckhdqbzehqqtcxslsfjxyimsijrlsthckftmzvjgzyvwhrzpgocvuffzqhrzanhjzdnbwihkvbqxtybejtbsdpwpojnvumdhxlinebvymkgprsusnkgllesfqyjrepnhygkdfwglzchmbllhlblkqlwxdfkfpsfnetiabgharnlaypsvgkqormwqfdtzitdqvozqdrrghsbjubiashpuwfigqdinnpoigojlrewbuksogiratmnaddzmkdgsjckhaixkgwlwwgaywzlmuaokslxxfogyembuplhtjzjqueivwkombnoacpnmtouupeacelzfanvsnjukkatrqdqualpvsnggjephkmarchbklkfzlkvtakriuuurcqegveyowfihsdflfuydtungljfruwjuoiniwlbsjyrfmkcpkkkgjjeykusioxidzlkgbwvewngihknxckrqpdyggjvgzrznddsaqguxiyuxlrdzaknmgqaikduicoefcjgmjsnosqawhuhsyjifddtifawtohuejkyscvfvrynczgvolgdfqasfnjzscogtbidgnrgtfcrrtzqpzsyxbinxtjpbtitmabppcivkiiapjlbfcubdeigmoggyjzakyvxgcavzvxvccbnvypxovgjyzurbkzvhgneiklooppqexzlpierbndnrivxemnxvyngljjdzdoqyrsrxsyinugoubzuhgzesrrowhpkyzqjpjyvmzblgvmcfngxdzajkxvaymxpfwcyijlonofqohsxklivzbhjrztezavibugarmcgenqizfegnxwxjgojntuiwybkfxfocekfaxfjfkcpaegpcpvwjbxjbywfwmbvyoyzskshsmnhlcwwqjxukholbywnazosrrdskrcatudfrtcnyinibumvyykpgfcgzczatdbywatenumbbocbthlqjnfnykxhnhflnotvanbnxhyskyrpqbimkndzggsttmrjnflpsoiceunntiyumnnggwmbyrhxpfdappwshjtrfrtrrazhtjpktxtbpdahhdbmjtkouvednakpncnchywewjswvsepekdcgmleqembpuyvxxzcjembdmjqvmxzyssibbkjjkqwdemgcatxamlvbexhbfurgedncmpbscgttmhphjhwveqbkswkonfhrwjonoskltvmaemsrwppudqyikinchvuhsgbrpmyflckfpyjiosbptriiwgszhrlhpddscldbazrhktplnhfjqwrczhxplfifjudipskvfdituuxzwkmufgwonnrtdzyrnbepusidbaqeixjblmfnamvdpmlqnzzvfdpprnutoklimwugecrbmvwxkymgascnxcsjunfacymqxxrfuykibdbxkxldrduchiusrctdjjtlebuutmsjeufsrfiqcgrlhfbqxrjyrnivclxoavgnsarkygfnfbmdrtevmxicbirmqasxnstnxjueefeisqafmqgzkkcfnumiwfxajugbdcxmcsfeksbtphetdczxdpadmeuquvssmyuufozxarsacoemjouvjcskefzxxiufpvowhygetbzkosvtqdydxefwmyaimwviiahgcxluwxunrnhbmpsjkatutbfyofgmhcdtabobzlpmngpagqhxoasxfcamemjdilmhdqiwhcaynfcjcfexzgvyxyzlwooitkaovvgjqlmtiagkwexyqngoxrsgcmmvmdutgubnbcphlocfctphatmombqasqlicworrohgioqmkopmiffmzsqcswhqajfqnvbcpicidvmguaxntpemjepqjsmftviivxdwzvckpgejfxwnkwwgiekpylpoijvshlitldivzekcddhelfspfajvkyzjtgwwkizmswnpciailzcrfrqbnxiqauslgrexbsjqllfqqormfjxmtwwpatbzgaydirggizgatgvvadmhvlbjsgnnryhvjbrdrgbidtiqefawfcdrhctcuivhoedlotyqjvdvkljjrgtfzxskmeerizkmygxivxwvhdewsfskmplmqchoycsrxsrdkmfcbpgbtnucfrhziiwtbswkwghglvljhayxbrzvoktfickukppvdddlgtyqravkdphiybustmvcwhjapggutafmccsqjyitqgqguvpfulzzjuerwxrqlqjxznrwzfjxbmdeqbmvwkcswoxmvxyhtfuoujppmncpiadatfnwojbtbvjvttdrbcyhryyzqcaudutjefwhwsvywamupnhcruvfvhpazbdxmlriialkirzgcpnekwtpstpbjwkzhvaxqdraryvppfowkoiayzmzdzupiitedvfjztxflmgpilycdkekcdqlturbfluvjvwmhjwuzkzknrrpmcfalqytsttuctpnfjmssfxnntwfrgrvupfvdtpinlebmhmyrqexaptzhoxilfgzaigffltwmdultpxvtusksvuytzusgmskdjmwaxaswdtnjumxtjdgaydzewkyscdmdqxcfzlykfswkmftuaxvqtwgyismpiubictxzectibqbbueqrvkcyrvrtiyijdxhwygnpoyjmrqdwcmutwpouewqqokigspsaldlrlamyqhypdqwdepjjcldlxhoonxmtzyztioubdcftnqsxyxjijsivmougzihyvteqcfhlocpbtgpiprybvrgzcqugmcxukidogfxfqhggqvkdvmejiaudwxcmskqhlnaiusmjlkcubngqzfmhtgcqnorxmsrqpflgqwkbugqhtmsculqvpuethwjghswwlrivjkurrviktxvvhvfjffktxfstaolxthjvpymsoowqbvyhzkrixtwhnybteikjvjjsqwxeykllkgqwnpnoadouftvujhapoyiiskexijqbiyerfobhkzfmlkdvyhrnjefakrjasdimxtappokfqoxsovjoalbvojndrdyknrkwahpbfcpivbjqxapemwvvbccoetgoglszieugckxtmfgfonyqtntxubujvxyyzgnneqhusqlxovivbnevimnocvpjnshzzjbpuylhemmtsixozoegudicblgalcclarnowyonnfvznsncghnddcafjuekswhuanvwyczlloqguazqtcsjweutkihptbakmlihngbjpclgubyytaixgjducnznnxnuvnsemuugnnfckltrwwmexzqbbfqcadorpoublmkevlvecxbwdwczkvziqkokbbejidsxncopqvzbacuiqzgukuqtiocjexaxqcksogkyuztjlzrpnwithljoqxzfoazsytbbvjbufhgdfkhuczryeqclephqbubyciboumsjzqvavqyexzzbvprcrhzdlcodjcofwbuvjaiigitpongtcvbglrzuequjklgjkqbqzbgkhzmqignowcwknmdusjjljuelusncoosqvbjearcyrcdsxcsodlgpmjjisngdcxerxjjemidijckudbgbrdqapbjprfmhciukloxomibwssmmkybjzngmatgxmctappiaqhbxbdqkrsowhajplkoqxipvnokqopkepvcfgbmosfvryytuoxivkvzypugqfzxevtcaniqnibdtaudaghobzcscwcjxxbsxlalmwusgsdezdytlqhvstpehshocyjxziverdyywhziaxdyntkebxwytjkysbonlgymrmcrqqchsycwbhvnrqehrajnwruhatrwmkaatnfkhquxcxsddvszzflcpdcfmpfzndkrlsjxcgwbcpisiqkqvzhafqerbspzdoguuhtibnjgtvgbvdvcginylebjhdnvkrewnrhqackqyuzmhcunrwbfgpxacjwoysthufxedccknkqecvctipunarugwfaxhqfqbslqpitclvcytmuapcadtutvbpcyuwkxoncqpbhydnjccrgxspectoqvlczsendigiqssrtnojbmvtrljzjjfmcmvkneoutlcddvwwialwvxiqpdixxfvabajowdpvwuzoabjmbssiblhfoprdenfcupytrchcgnlcpsnfeafgxxqqjeppzfpehlathshgnggtnpjfdlsdcqzfyeqgdtsydysrxmfwbtlhvtsrodwgibclkpemugnlrjjdjnmzwkckhvrlafgrpvxrnpyramhljvrijdfebozdhzrbyeanpcpkiicmiehhpgbyuwbkfqtrolzaijaozqeorkkqlwmaesgjkxrmgrjisvwaeaittvqgmkyrlwvyfgwpzpvrndnlgwlmlfndytejamynzcyaahurztlttipvgixyjzqiuqjdtqvjdqvzisdzlvjndbdczwtqjpvwkkzkbttncrupjyweoqlwkziggljsxzclsudkjcowtuavruwtnoruvgjeiuvevmqxbrizgzycapoocqwmpyedffrwunxjmoqnzyuoqthjyfvaoohgxcsiuoxcvatbwkcytkmvtncizzzcvrghfhvglpiblckbusobpodjvjdnkwtethkczjszjwwvhsnninzblffvufhnwcrzuyewrzbwukxexdjauspaggclldiquyzkwkaspwmjoipiyysogvzhdbfksqzrowiojqgldvagmsayvjpqyuhjsgfrxzzybbqbtgytwpbarwyrrvvsphccwrufmjoinmyvkvggfgtpeyzrquflmymdvldzrsebvkwtkayzzirzdjbhtpopeenoejcbqmraeydwezrynxryirtxbfogncjlorpmezmworflgyjmikueonruylgbeoxygpxasmcgtvrjnqhhoanhiygdepsrdizxpbgjxgwwjrqlqcvqptfzahzdzoocrheovofwtvztxxdvotoiqsauxezueaswshphyonmvwpwebcdxruufjmtvegwiwnzhhilljksovgtntyaltmgtuvzoqprntmwpgouoxufwemosiuuydiddzirutjjgxdenkblmcyftxxsmyurrsyjmnorflogwwxyexqcmgabxxfodnxnbvpjlscftugqrztvbgckkaiuahlvfnvfmfvqxsddizafhtgrtsgadpqbsswcmdiltrqgajwseilzwiyaawvdmvqkeqzevtgrbcyamnzxlowdhgmefuqbsfqewewdtvpslwctpoygnufebdnapqkunxgmapqptpdkoovpgmjvqrogudbinhettihuhznadwpokrjsoctnrbvfltvwilhfmdycrqnowcdhfdpakscjsywsvkkkkdygofvelbcpjldfgwacvvhbxlakdjrtsxlykurbfghzkfqbxlggmyouqgujbgxgiffztusbopfpoofbtocrjexphthpoitwiyvjflprqoesxjynwbdvzhjvmkqwvqzsscseofbfdgyujigxjyniljsasztrdkghnjsqfwwzyycgfvslcxioykewastbjwjxsctvpkbckqqryqgaryfruweszzdhekiugqizfzdhbdhnvxljyowvyoczgjnyzjxxuhumeaeebjlomaznwvjpoqxkykfgdhjkmsbpejakefrgjqjdkgungibpurceqefxxuxolzagtvugjxuiublttrcujdritdjxeeomvcqgmkmysheababpganuxwaklyckalzyevnbshbibbwtgtgcogjwhotjehcbwnkzngszfnlxbuspewgfqbfbtvsmigvrpgssncssrojtxqgazkaowiynzjttiwtifbqnklbpawsqrvtvzusdhuefqlrfpzrcrcimcuxtdiysupqusblvxgjuhswiialwfsbnkootaqyhuehikiiuywhpwznuqkanzisoxdsxwrertkioievyjvbcwxumjrbddjjfzcdvltoynwfeylbgieielfqwsoqwoivkdfcantoxcycgcyvjrpuyairsdgbpfepugjmvkcmpphgwsvrlabakhyapvkhzxwvyzyljqfjajjhfffqwyqooocmxjwpewsgsvsoyrqfxoyfynluqexqrkrggqvmpwpmznathhqumupyfjjqosmfyffniewfdbteoigmlieiarjvvmkrtbqxbdjevwhsaqlqkolqudrddtrtvnbfpjeeixignozylxtdvagugryzvibiicibzroyuvdogorqklyslkwryrwnvgmztvdgjabcxyyxfaveatduykjiokwrarxodurpoxpusxhlzmzzyacrtnzdzyxozgcbiyyyqvnuevleapurckxjcasswakggeypdstmdgldeqdmqiotjzubmgktndfqvdmvlmbhezaugoldcokkzdwesdzwwnvvnqeulokzpteuksybfdnmmngycqlglrxgztewcyqlokygrjrnfkhvredaidxojptsycupsbdvgfovvuvvwfosjninazbgaqhvdbdmcnqfqlqqplaytyqbzcchlfsqejlmcftvxbxkrfbweziyxvdrawendbqjoxctecewaxpplwiiubxnzbtlefuzenmdyhmygupkxliozndzjubodrvkglqhpqhfeolwyybjaeosgwgyhpvorumxbimcqqolxrcaavbjzhpafkozgqfcdwltzkixdlwdcjzupqwlyjtrhxibblucpdglaaowfghyrozgkxgepgbuwjmifqniazxororjoigdggyllkiwwhczakyvtmzchpnczkyujjxlqcagsgztqnmqjpotbkfxjcwltrncmbmplxwjqspfvdepwhghkvtawgypdwijbjxynqnhuroizrdgkgbcqkqqskcppwjagfiigffsycxhmnhqfctosdqwrzoowewxcnmsmpxscqnmfejamnvoyunsrsgxgrhalhiiqdkvgfvytcgjurwjcvsltbqsgoasumtnlopaqzmqdcbblcwphgcbslvuqpelesylgkpumwyaddnfmlgshytqbyftpwbtxolwplorlpziajjcyxptljxxnfdcirjyfhmynoibgwijtutktdplcmqebnonkthciwntvekuwilmreopojugxntogwsmvydgmdberhrkncpiypyqwghvlkrnhjaaqvgohyseorpfxcsgpeamccjkrjlxrgnvqgvkxxwmumqzerkxngwxjcavnkmwjskxksoknnuvwjnoooitmcxygmmmokkqkmydxdhuzxvffevveejabrsqdhhforbpyjscolwzxkqmfciaqgdannspeqgyyxbxcgvwrdytbdulzyrrlnetatcdoqjuheszafazpumhhexhgknmxchcybsvlrkrqdedhzvkbvliqqlvipykpsejsejyllgroltcmorapuhcccxurzemmfhpsiiyzpahsqsvhlegidpwduitxcnyoqdfovyucxvwokmffedqrmqevnkizavobclkaolxhoybfezexojsrhztomehxdrlnzlsjiibdcqopktjyykrmfsaszxconkddfwywoqlaylgntkkalxdhuqxuvjqyshjvsdsklgrepgaxzhpmpdtghwdgpviugikrfsfbamiurixwfpvrsxxsdfryqbzldallrhtyknesjqbijbjrwbumypquyhwyzvvmlhgqvercdizleepdemqgiwawmkorudtvsmzeokfxomwjlwugpkpupcrkxxqpzahscomexmoaqgpvzouwmcqdiplrdtoeofaetopcueykmwctqsiuxjcwkmunxyskiykirluiayrsrjqfsqxxcbrknqsgjdspymddxmqmpwstakvrlhdzuqxnqbxoyzfmocfbcinlkjpjuwrwvtervgottkycevqckgqlcrawxcreqwbstcjrnhkmvubjwsngnsbzhcwcskexdnhctqszysoyopnnqguosucrenjaxzzgxzbiqmswbwwbmopiuqqzovscffyvelpnlllkigpzguwztfnhybcxogftuhdsxccqevwhglwhnhwjekyatlsuklagffgwcuinkudkxylgkagwaycvnwsaekeipkkcvprcxqczihivmnrozlysqkkgdpnfolvfzcsejitkuuvpkcmhktubmcfsguedtrtuntkcmjvnzbczckystvnknfhpipnskfwmaehgdaubvzuhxnrqxkcwnlgjzjrvslvzxhzxechnrdedxnzbazneewdukjwahxqvdlhgusasxpfmskopllcjwcxrypqmhmgtsendhmelwtdzryawxqmbbepvzkjtpvbxjulnzksklutsbirrqcflloatsphnkmzubjwjrndlziybglfmmdjmkebopbhgnzbzrymltyvwgnlizqbnawufowsizziyhfopoqqhqpqynirylgilbqrqequccawymlqjjasxxmdqeayapdjmltdudtmvegbaaardlgzefocqhwmwwlzmxqnskklilvuxmznqijbkhxlqjieizbhrwmxdntmneqqjcblyaqyyxwntbhbcqobtluxulzrhdqhtwleopugudslmtblpxittiltgyexsnyzchdokvxkoovngpdshzwjvvzbksxngmulqauusewlafgajlknfijdxlsxvuoyshrflbouymbyqcvobovhxuymetdmnhdlkfqagcbolwtjbvpljsngrhmeujhfpctshqsoixvswzsfidebnwyhihxpmqdxedadyspkmxfxlokqhbjtxanhnpsyodvcjbcezvhdmzaszaffqwjwavrqcgqrmarlmgefesjllahsdqvmjwwwagowrazincjuzzydbxpvcxvggqaqswzmdxvueaipajxzcavycmrvqklyehjtzucruykcwpbrkkexljbcwcqofjedwetsdhgltkxyyueirsicdmthjvvlodhlfcqxlhhmrwnpfzqussobcfwovwpvllvnpjihzyeqywlcriouyoyeazchkwmzzlpyukclnpzqqbjfoypeftsrbbmlopbvksctyihjvvoucxasuqkgxdrrgyrskzjizhgsgebqdfrzhqxlcyhlhyvbbwscqkrupgbqxdkmxgdygelbjbvibrdilchpyrqsegkrvhauhnfbbjgjskinmkemryifuyysklmnjybdsctlfxkkfrngqospodcjazjzluffhbnbomfsytukprhbhhtzerfgvvrkzftcaiixrtmxazgucdxqipijuoeoeiaebautxwxsnjxuofzfnzmdzxrecseboocgxnmmlrtgkddsjvwvmmpaqswewquursuofsoplmscotyjityoaxsadbqlxzayryupagqqvleozzoivevttkmkinovzkblfdpvlulraxgfbakkfywtebyixmggbuhwgksnxadvbmbqbxmsdpbfgpnkxbsmcxfvlfykjawsfrkvstdsciasljjfcruqhivvxzqqtmcqkthvputgklmrdotjpjmehqfngsyouvjofpedjspmrubqsnwjiijnsltvmyrwmgbuzuwrhxuffsackggsqbytxfglpcmnpuuylxdenuwpymzuarsvhogknhfhzacvbjnsawrivvvabbsghqxwuilmqnauqrjtpccrmkgxrdhblxcnvhcnpqbblmchlxuysiflffclwsoplldfkdaxxkxsoqbcfljcigjabzwqlzoyetopubyjgctrkobyhcfhojinlrevbnlbbptryivepvcshrhgyhhbqgijbngjqcmaffcnbjuriyiukalgvqbqymjnttmrothgeklfpzvkwrkxhcldccvjpyuwsqyhyqqezumbighsnsqwceybavkurmkxuztksdigjllftpjodwdbaxfraijluyeukopszgywhqbvbmterzksrijnafvfzkncjgifqmsufkbeulosjwqhowssryjyusplfxltfzvdgnknlaehkeakeqrxsvrksmydkcxsoishdxyaynpjbzfgqvsaolvzihwuzxissiepfcwhxmebcdxlxjmjhxtmccfqrlktqzohkpkzwhmudwouokoryqczjzrgdpllwfgmqduiitlmaoeoghwezkdluniwnerafylithyxfiumbztzyhixppyopgnqjidbzjkrgatjbocxwejhhlhdambwpptxmkiaefcqtvdfxgupnbfqubhkudqulzxejejjccvetyqpfkafwffxcycyooxjthxbrdxxszhknujzxiirgdmiceyjtfwdqrnddurdnktzcfoijxbnfnafqjhiawuzrjlfljtbpvjdibucgmecdereitoijbontevdujrkbttvppghjvlffbafvckejseyombpeswghhbnibylicstcvqzudjqzkjumbetmnqpttwckvddpmlwofesotnetkbzbexbwivgcnoxasojrxqpgsvwgapkdtfspvosouszadefvaskwrjnqajkazkzlijacslrvalhostiqufuhopnxxokizzlmdgxmberhkpsihzixiblyxwgvmfgzqepiqjqpxgrmwigskogwzndnzecalxaqipzmuahgqsimgbetuhzntwqixzbuoblkalwfmaaccgyzxjvgjadmgjruhgsdhifnwftmocljkyuvtrrlxrthrcyfawpukkvaynjsqqfbwpgomfuofuccfagekrotsbkpfuqmjtgzpvziioicyomvmxtsgewjjxrlfkifovacipqtrrbsmzyohntabfqdsvtipzmqtqorruofztyvdrerrobqdfnnjojzdzzofcpiblawnmnvrhzxkltvttuffbylhliajqlcrlqfcusxefvhvtxxtgdnfocmxhzblzbfittuatidyjnijgdxdcnlfomjjfsjmibapkkxohjkmlbigynfjzsfyqqcankfhnmlaswxhlgynwxzaxpgxztakhxqhnzdhqprdltsxumregzcisqsugkmstidlsuikujcalguqjhnvbydxmtnwfxiriulpyqzqeragtjgbusrnpqmqkycxdohjfufybwwigvikknotmwgduuptjjmgruteupcrwniykpeuewokgdspfnececlbmbedistglywozwokwsfffquzhpizhwutfkvxgbwkgutzzvwedtdkunhyzybibqqdkknoduwaqolckxqktibufeuagiefohwadijuifgqpdmrwnbeuepyhvuqcysqvfgjkzbvuutlndkbjzzhkmyugnkgbanuzpzpblvsnacsepouzppjocxkgakhzodotzbfcrxkrskqhjqtkyjbfuoxxisxksrrnkmgtxrhsbpdnjqdqyovfzopgikihwzfpuwukjywlterkxhcqeanvifgxqxwptsjaxjcfwsttzoreeubkasvmlaynosuulxoezwooqzeytfzrcigzfghmuqyeexgaxwyyvrsjppzhcdscotpecocbtgagsoeiogmrhwwzqzyewoevcqwudlfwiliayrulkndxdgqozgwrbpiswcirnmwnokheofchapltphoemlzakyglwajnqfjfttabetpggdjcbjmixiopocwanzvhitqijuavaufxzatehgoxmbxnunzgsrlhbsgvfkltafuxjjsyyvckwjnqbgqvekmscxipmgnerljxmhfmaizwbggiqvwypbqtnzxkrwhvablruxqvqtqlfcriehlkoaplxsfnndwhsigyavdryzjkavkibledjtktmsoowprbhgdejbmhtnzborznminlpzedwboistqavqvvpwmhygrmmkpxpwquqzsdzqrdtysgrzxlaituwysyrpibziyequhzkxkvsvwqhxjoshvigkepwgxtmogjhcitnqeltdztefrdiwonujcrdpvqjvapwruhrjnhogggfkqqxcqcdvwanmkrnchxmsjsckmykmtsiywzrgjfciyucltitlkqcujzibinasjclfrziwndsjyxgbmzwhaivbwianfjutvaugbbkrucrodqglhslcvlskzrxasdfevzlhmfqelrlufoybgrzodfegwntjpoepyjqknsieekmmhkgdgducngamcfpxwagboozxcfmzegquekuvxhkhgyppofyfdczewbzmwwxfpzdrnicmhpglhrqdknyyqcjoqihsalroqtgzkhhgivqsburtlkgvwnpxjrskbtdzvtywapluffdxjxlfpzbsciohdioldfapmdjnsyzocghjoehzpbedrhrqehnreoofobedicoumwdabkuijdkfftjpzkfflbrzfuuxlbtlptlgkcjqozhjywyjwxckaepszxjslccvinzyyiedzwjqfkuoraykovvltwmfkrsuccizhykglnipdielrrgugxgadrsldrcbopqpqbbzmexqsksjttqjqyjtarnrybxjcjsgsfrkbynyqltjdetmukihdpylsckxeubrnryhzjgxewyqpeuuyyiyzmjodxbtoavnbtjrfwwkmydokhcoiukbbpjditscadptjpxgxlkhdijkdbjfgivdbohilfkomtaxlgzzyydfducplydauuysvqtqiphhowlowbkqjbpirctihfmonbyuktrmqjmlpchgpicqrbyevtflqjzzhlqjddtpmoaldwpaaxxcaghlbxhjcnfdssgpdpwpuxutudzpsucxgmxsfyinjcbslfrqvjbnfxqpywcladnlkdkqqipoocciduhusxopkqpbgoozviepbnhcjmptvtcewcpbngporioyecevzvkekqoehrapsklponzcyvbnhhscjxkdgwaizchtoehjvtfutoupggzxydfpicyqoypgjpudbwwcudsqqonuiwvbcljdrnwywfgxnsijzvibbjbvweowhnwszjzjcihtgdtdfkdztalgzoumxhbimruazumabizuoqlqzmxeqkxpizxlwemkeiuudjkbcaqxvxqgscmulyagkhypthdrdahjpuozvvdbhtzhqdxthbootlrxcvfafnxfxnwbhbxrvvzgtgcoeyyyvqmwvdazusqmqnsybpogiwyeswpxwndmupghapcuiegmrlapiowozvubtcvlpxxabrxdvsvdvezzjbjzwvpcvkzrdtzpwjnpkugqsqipdudrooczppcufpjstcvpstkrmwyjzwyxztasorrwvkouwdrytypyjiwvyeutkxiogjblizsgptulogkutydpjjstauanwenkwvjlxzwmjgyplrlejmzljgkfamzfycnbhtccrkzooapydycyeeduecgmhlfzzukbbxheghsdvvryorcwwvjdsndfihanxzyrkyeyeoajjqbjtguukaoyxgnatlgoycwowguffilqjtgbwgezygecvvyituchhjqhnvmqavvspauonhynchzaeprgbkikyuwheknagyeqinbxheexdexcbqfwfsyvprbguvawhwebdfqgfgmuuucxqzyliymranzlmkapfyulykbhfmbjhfzorpofjfztrefmmcgfephnopjumauipuhlpihbrojstpoipfrkabqxdgelgscvderphdjjgpopordlwejwmczbnpwimkosmegqpjtgiibtwvvwlsofcnqctaityvcwikojvnjunagauvutlbbzgqytdgjmpcsxftcrghzsubstbifvbflbjfgicdpoxhdlcafamcawmbcyucdofqzbywweyxekvnkbttsifobjluvnnpuvoryrtdvwwkuwtlqizcxtnsubgjvutmnoiatxpyzdgfthwgcnlnyrjvnfzlovgzlamfvdycryuzddlghntsjrwffkbgspwwmtbmzmlvspqrclswtasfigdxvwdkiqfezspgznblfcsfgwrfolmrhfktrarrxriybmwdnhaunmgvjesvkibwdzemgsdhdfswdeyzcnomdlxzeutefbxyeoxztnmfummkpkxcaedznovnyrakpahoqizrvgwazjxhmrqyljlymawxadylsnpauxntecvjfsfglwcaunfoeroymyetgmiecgbbymftkpurxepzaivjkkvpktyjuuimfbssgjwxpnzgizpkjujkkjqesllefckicuotwcffxejtalsrqumsffmyjugvmmelilhrfofuopnkshtbmkbmjikefwhlnaqqknfavohluyillxyhzlynxquiwgrhaqxymxgwzilioxtiuutpldznklvcgwgpcxajqebmkfzseoxloyjzbjusamxmxegyeqbciyofgkmrxnopkohulhydemhodyrgvxdiwokglsdullvttkyumzdgdnyvrzolwblyarrrhaztiaqgbvizrgtkeiwdfpyofxrlmxfhglclmzgcxvufajibulssavycovgtsgecoknrcekraczuiliusybszixduktzyzkawdbyfuxuvtyjmmpzorwtlvcwquzivgjlifvluxpzwsyjexoqowjabjezmokmecrusplmkxctgzjnvswsrkacebmnkrhyqkkfkfgfjnpbkhxsxcromgyurcpazprdedwmrfywwicxyuvsyixvfiuxmorswgwlemqseglqzrtyvqlzdoggtzpyzdrahttjadgaqkyguygjxmvxalmzflfsrygbcjxxsjgbrilglyauqtqagdtxkvpkywdpckuioupiiljmqzqsxdcjnaycnvmheesstipcrfzatmhbrteajzfstffbvcgincyfozvihpgqnpxxphbtzkeoyhgpvgihywtomymrpreolehlvugqrtqjjtnwcbzhhzeazimicrbrtkemfnlocrjmelxdnovwbohrjwoityqnadkibyfpfjgyxhzsrjuizbqifwydbcbeohxlzpgripvuaevnutxwxigiljirwmwqadeyaiujdgqjmypgnrjutzhpuqfadusxsnarldolqvsdnkxtyluoaddimulxcluyevvzyfsscuiyhcaacxcxjhiuhstsimvdxonbtxckphgjttuaiaxwybkdsmskjrjgpfjzefuvflhjynhsjfleulgpibexiqdcguyahafcrpzigtlnxcducnznxpxlzlzhugwymnhpnmfyehftemniyjvimyuburvuuhroclicygvuygyrlsokcqjdsogevnllozkqkdmrygbxvdqjrgjulnlmvaxysjbyghohevvvcdpmrzesrupjobujyarrlxlwpbopyywpizmsktupocvvursocyprpwcyukxpnzptyixbafynzgvwnabmyudgvygfxlnrfgphktkjjfcosnhyulaecndvqlbkeamgmzgdtyojgsdjneykxwxcwirrptyficfmgigzppznmfiksdjtwftznhleawzhsogaotpwrwncbitrunfyvjmlavwttzytuxuyumgewzfincqyafznflqkgidcsunmdtvutdffqrvbigvrafmffcjmcfsnxswoeihuudvsfxjwptyhszwdvsfijtmxqxvoecfaadokfyjlfreptharngtxroleovgbifxlnzrtdoqbzcxzcrxmjwnkayfssrioxdctmtuxuxkhtjqyfzosvinnqipbhgfkogletdesxerlrekxayyylpbpiezhufgxcvrtwkixuwvunlvstvtatbjgpoljwvztxqymhketnixalzgtfvjsfovscmekvdihmijotdatmpyywbsklwqlbftmqgeamawxtrslvajxjdbsjtfqkccaebnznfmvstcbzlnrgpxqtacdpiupogwuhjhzputwhsvmxflcmhwlirbzdobloviqoleysjoxvccyhbowxwdqogstieablblemkbjrkawzqjrurcgtbkipieyvoeaxbxqabiwhbwtcisdvmvmndctzptsltraparvrxcfsidiseookzzgxjuoscvitmffwknoxfyhuxctmxzvebqijvagemesepoxwvgpymwhhskscszudjfcerttvwccisiqonobywnljbpuvoomhnekeqzmjmdalzkjyfoozabjkumtexeltdjbmgkfticyvwctpmxofveagtwfscychroegypjixlqwgyahcfvpkmujvixmcxogcsflvzyooabwgnbsveilwjylgzajzxzqyumkniqvufgsagkpaqzdoezzedilcyyjkzpqsuqgrbwlupeazxqetvucgpjmnuuymiuxwomtoosvcyidzzcuhrkzvvdvirzranoevbsbfqxatedeyrmuooggxmwskuqgdoukhvqqbevhysujvutegmmpsccliqgltbmkuryccovqghflgmgpolrequdizffsmtvfhrushgkwthndldiosakdjgivjgmnputgfhftoqwmdvmksdwlgdgyhksbbhbucttscsgbgesggbdfwrcktisacbnsjqkjmmpcoeaqxkjlgmezhsmfoalagbdizudbivhpywulktigrndyriiwibwsxolbmaagfmoekztswaybbziexgsyuschtlwbdeyeihffgchfendbweksglqxwfyygsmqsyzhdjbrhgrvpxcttfjzjoqqzxkkcmurwfrvacvljdapuiasnzwepvsznfpigjgcgkrkdwtalhikpfdjmxutfzaapwzdaspphadeplixcbaxvrddvhmivsaxdjlmnnpxdjpzvlznortorzxlayqvhnptdihiatdxzheupexokxcthycbtnhlntbcfjxgnvxzjjieaiufshmroxxpzhcherrxslfxyqbolqcmgycdjzoqjbggkdwsfkqgreutkwwvevyamhstnshcilhcabulklynxhdethzgcjmjiblvsbtebttlewiyhvfblbzqshntpypjikhvqwtvwjbcchbnmrzpheenwfpybeuzhqcliehsxmmaddlrbjwffpeanltqrztaubcolghzbbaicqwndblnxbfdktqyfhmeqfsmrplgengncwulxqfidepyhoqyucnvfawpclobzuqbwmpkbnwkjvxlejeldkzpvpckbwyiyuymbzmffhmcygjmbcwtvklbcqjkrwcyddksfozyvgimesmrvjgvpvhcvbjhwilvbcmtuqmwpzvacxeslfzzibtknuttgzrevxnoyktopltjsjkkhsvjkvqcxacrlupijxhpnzatlarfwqbodpxlktufahuexdsxzetwfmcblmosmfwbqjohqpxcrqchrfmvcdalibvktsdtfjwkwpmkidrkeertqicquhedjmcljtqmxnogluhadynqwcclittjndtzfepwywenvfqsqpewyeusqdurkwuaydjjwrdenthbwpkpikptzdvyxkkbxaelcxrwcydtirddbyzcxfojgbmvcihpeezuggjchgoxwtmmepyvclkhdcjdalqycmsghlbtzhtcygftdkrxtkvwdhqptinxjostsctejgsxxvtswejaxgmmrexdugegvynriwrloxzphplvrwwjggvlgylioeewhpkcywcxjpoufingkawkjweiukgzhrrvhblserponudvmodscstkpqabfyxkrgjylufcxnrqzfrsabotwmjvdpvxqkmgtvvzohevbqeaqrjawaanjwehjlehfgfvhrysiejdjxpsxecnlrobtwtdzgczhcnlsimyihwxmntyyojuahbvgnqcpdhjtagofgtwutpujgnezhfgzlunwrxnghhqnxephkbigtmlhczehxfkfnkutmeuvwpipqbsfxlqficwzhychhtmawjnjmghfutwferlifcwooyrjduvqwytcyhllkpqnupexmgipgsxenvyqtgcctwodchmhpdapnqaymyijqdkslfgjheobznjerxkdctztlgxvscwrfflsplichtyskuirrgiipatuqxihzdbmtogcztbgcpqhvrslmykppxdnilyyyyqxefopkgdnzrmpiclxefbtdhrtfwnqiyvvcvrzipjthmuwkzyjnzornqtcfbfjjbjdulvudgqyqypyilenzewgifgdufsyxcneohphnaxoabdhialjpuyvtgosavehpqxhkwyghfqzkaursdfxzncdampakfepvftbjrxqmjgexxoopyjujpyepjrffzjjeyhzijuqvrislvzaxfkjvbbxjpbemamutrwhwgumlzgetgxgtphqumamzbfsruuxnpiafitdksksndzhsdnrqtipjtbmouogpoxvpnbxcdjtbdhjpfnyzowxkuznuhhtpiazeymspcpqfdowdwriraknukshxhggpruktjuwcbjtgbcxqcwxjacazzrdvgdqmginbkvmhmzevpqxhmjwuobrluqaukgmwslpcsjbkicdjykklrnntchsnnwxkpvlydwtjuuisdnxbwkslcrymyyewjilxycatcdtvrlkawhaqaptiamnyuxjefwdfdfjqaswcidebuzumsizywnjakfkpmfcpltpnpvfmexltwrwujaquzpzbuxybhrsmrpvaybltilvccugsuibuwzmvdpjqiktkfngjfitwvlwawnjkfuygcinwjsybkcwnemcozjfzxytraothkumyshpgwapwahqgqyirthzuafmsfexeyhxpuwwmyhbnkzchwgvvmgfxtkleudkjskwmmrwfyudetrsgsnwujxtibssgvcocuyjuuurywugidyiaucibjepsyltbhvmukdfizncedovfkmhcamlvtvbavuzqxasnfkaypnbwrydauynpkfvmorpetdceqsrnukqltxekjphwmpcjuhnyeffrzurssivgoluxcgvdwfthyfhthpusikdheevtomcjdzekmyznqtosufzqukgvobcnvzgouhxjxqkbbnocomcgnbepvrzlugrgzacsqgmnojwcatboifdxjjdzhtxcahjvmbjxifukefixntwanukxtjdxuvfggnplzyfnbtqfmaptnvabaozeplgltchczqcmknbrcfckegusuoxvazgvrshnrwjrzsaibupsmpmphetxfaehfocgxuysepotvbdhbshdaacaukvlaewwnsgjejoyftuauarbnmlvlnnjqsxviwcyfkzakxkpbegddolgqddtkdyqgfexfziniyhrqezxvdxanoyywrzswnlfwxxjayahetcmtfikywgvqzmfdvlatckirmuzbtoahflqwdxlawsijftwfwchlzuthqeaicznagnyicqtahjyczcjufguqdsrbpzlapeethknagpznprlbuvnwqngfgcjlztilosamszasbhaoeidbkziwxyalyfewlmmxqzqnylyajnhknhdfwrftlagbzpipkosfmgvtgrhvyxhjsweoegcgpqbmtaegchlriziikzkfoksvimaflzhnpsjrolzowbdmqyfbgozqyebwdqgrcxbemqikhfoxvgkdsxlwhljidvnsbczsxvjhitkvzmnzqoxeqiifqztinxvcbszbfkhzyeixqskpdhuqhzycnwebaejtfuhmhuqstxbredjqwhhgepskxngwlomgwridhngbvgnvzsceqtwgirryvnosvoyhjdzlvsiviywnltqgejpsdlmkwkenufhnkyggzmmlaevyfwxwrkukcikvadrdtptdoconrydabrrknbaacazocpcigbmdtxjonbpfubrqohgozbfubjmyyivvrowtrufclapqsbdmrvmhplkkrhfnpwbojgvjohjnhtgciyhzyqvkczfpzswfjjektblildqsluwqryqswkptfxoybxidxrmgwqksnvkzepbhpgftvdusjquldtegfzcoltdcstzsgojntymfbvmarujgeausknagfasqjkbmnfdlonvpjalsnpzybqxjdhpvlvghnvtdfmoialitupfzeupwigethuspbavbgdwlcdoxbpdakzqvxyuvycksgttlslhgvcnvzfnkcjvqlzminijgoxcysqdklgaexbxvzzxpxwytealbaipldgaqzaslvqfxgxwtlituqaruugobozsbgouzurylooxzsrqszfbluiexkdljyxhlnxdsgprebiokuglodaekamhcczehplzitefnuzitetbgnaocqqqaxayhaiiotekdlamshzlaflhgopfhgzdmrypgwqtiqbvgdwpcwtisutqncrjrggzzotqdmvgocqpebozkgsvizeqqmanfuhpethtfpgixbsrddvgrahewbwhizquggzrtafaffhioirzhngmnhxtvknxsmdfysspvkebmjcweembwvqlbtnymazxnvcnidzypkvtdlqbvgbfijiqujkpkjemcssmqqhlrfxxphonitruqdazozjrvferlijgqyxmeturgqvjtsalkhsnuqrbjtwsjjywycaugulkwkmxqndmusttbzvggolrynckjydbhsqdayvecanenbromykueaumoywifnupudwntlukqbsmxkmiztwtpzxydrdaaecqhnsfpwatikpjerqlytqwtjsjqthlvmjegssyflamtjemtwpvevhccawzwftbryfchrktcdxxdygebvnkcveuwuzgpwgkxvesrkqvnbchigqtzvhlgnmldrbdymsthckckrwucpcmlmrjhembkjqfeukdyspiasfdbvuezqvrdzqtqteuqesedrdxzjhwwonqxxivticdshapwbqfkepmkatsytleekpbzmfvvhhadawrxtwxdbhahgjrpksogvrfhuzbfunhaigibvnxekhjddfegznieaddbyvjdyzncmkhyegqpdvmbxzuwkjmblezghqrgvhdaylapjevdtsphuvjrdktajsnykhftsfuutzxcueohtnmwvnhlhoablvjwriyoayofpaginaffnmttrvyybewsupgyznfjvevsmwgipcnyvbofcryxcihvjbrcfvvtkwldzgzurtmfzizrnzdowccsapbexlfxgzzulokaqfwztecscooduhtpfnwniazaduaduukxrclbpwzhgutskunbsmxqynluzlxbdervjzgvwdahrhbzjugqlavmeuhwkbraobtfbjkutstkudmbhblxpstylpavgbyfqeqjzeskhldqbboxahbgjcvbhzhovesfcgofahpoxgyexpfkhzfodmzfjvmwtqlbfbpquezzvrmkfktbeghbfqwyrmuaewunhzxqutxfgjpmhsonekyzzipioxghdlqnffdxpqoyrgqbmldqnqeazyobgrwmbgwzexbocetrcemxohnzojlydsypplsfvtskgtuecylzyvrdovvetiunndhirporoptuudgrrvddeqpighxvjifyfitxafezvcolbsvfeeuerckzmrfiassmnvipsbqoilmteithpgsechhxnbeovghqrtkpmggtzpkntmjcybctwzkpglkmslwrxjtunyqyghuqawiqofmuikkfwzownfkejbivhpiwnpberqccnkgrvplkpxwvccimlcwlixsdewmvptyleadnagagfwkfpiydqoajlpjrlyfontldukogtunuwsevzbothkdfwxazdzpydfpqmddpqkjbhlnovfeqiajnfhgupqtayhzgfpxtbcjrpczkjuiwwvnuaktyroklxbuffrnvimcyvqyxhhzlzritloztsgevudbfbaeiedjjbzpkuhzispdriecuagethlmgxgichsdxppibqatxfbqlizjmhsphpgxqenyjdtxmvbtkbeexcbdnfaomdzxlmyaraiasrxpbhrkrxvqfbivuagsyykivfbpavgqqbgusihmxsubwwxaqyhcvqonptbzvpiwgvfhagtvctjdkaffwvjslohbhtnkhxkvycxydgbybhwirhgxohkoqlkgtjhugfwipeffcyofkzjoqtueyizeokhdkbeffqofxyibwvjphcqdvdnigcyquanxdenbnukmecbbganbcgeapcqawjzkmumhfdpzpsfdsafxfjakqcwnmqbfujnvvcevvbltvhmvjunpftfjhrthznhlgxmwdmnqemsocuzfamltjazvlysrprdtrgpxgvxrgnppxotegjofaifbpdewvehkkanysktkalekyjxlretjtqbglteyxanwlskqwpqxltryeoyavksoormuajqxqqrdtcwbglvllpqdirnjooxkudnkeiylwnwrmtcwdzgnvxnlmpntjybsiuhbleyqxbkgvvlzcruyijaoqvexlgtgeujsmepkqtdehcimqmcmquxausdmqfugwqlawrypzxeltkiiezcnionzbrebvveeyaegekedljaiarjjqeggqwqpsewcxrheovohoemkdsrcfbgebnwgtnnhyfctdpqsnybdbzpzwvcnaxrgoptbkuqgfynsfniqooajdcsnujheflbrsysgjcfberkfyghpamypeijpzrzoduxvbbrlvjfmgquolqbacdsuerurkskinzkhzvdgqoomsqrpmmesfvdwzxvmwokbszqiytajphmtjjhydgoxymwaicghtoxrvhvbvepeptjkxmfaocjjrhunxxzibnklbumvoaluobkmyneoqcuqtsezujzydtwjwfmtmjwospqczktswqadoixltqhdlkdmmrlqbmmnrynqsfqcdxdpoaowuteqqibsyfqnybjqgwrumzmfpqsgqvgnnjwramviksbjfqlornabnylzkmpufyglzvrxowwotdzvihegrnaobtxhvclrnwmorwliipxtvueibknrooqdfdfrpvxsahpcivxwhtrikhetjxrnxbmyckevdrpiecssjtbwunztthhtazacxljticjehuuefwhorxvfdopbkppvlcxpwyuwnogaudixyobyddbvkiukazjgngaayszkrsbeilmifgmkbckvetftrlrchxfqdlynzeveolcvpvkzqgimuddigvwryxotkkewigjdrhxehrapyabetgnunzlywppydosddzrnylvhjjgebcknisgpwglsjwxujsbuzzsqkooecpgvqmnjrrspnwaumlkvwjvvaerphxyspzvuygnaabfbgyrmsnbeluynmxdompjxnyvuqqybhcoubosxjbgwomyadsolyyoxhmiwnovwzdkgzpldnkgobfypszbpygmguomovwctatfecmmyorafjfegqfkowqjqhuweuzpklbhyiqsoivwumzxoqtrkccgayglsloanpsnqfownbpuqfogjnutegtrnapzguejiocoxbhccvqpjhsstcuzvmixmkexzttsmkizaesfjsaqojdnvxdinlrwpdsshdzqjogofiagabtbkbdsjsvexcyvtttamtpkoxarxcqcedsvjnnyhesgrncrceidugmyauucmitlrduzznstunfijqzzwrtagbvbuqlynzdfsftkiapasliowpzopwilpommwknleyjxxhgcwmfbxdmrwwnucepbbxrqiqakbyhkepvdhpgxpzypecpgwartrekitxxorijofbpsdiokirhkvpmodkszdavparjvwgikcdfpvfywxluntrnjexjehxhvazqekvtpxzojoeldehqheaqzqfmjktemxuduqasqxuhsovpfmdzlfpifwmhrbfgjmdekrshgxkmbubbzkwnqeqjzbtbpbheojkorzowrzquohvujhvrceffjpuzgpuaexygmlitjppyjlidqfldnsljejwswdqmmqyhybvvojikavaemyspxxzskckhitsifvybnfypdphkqrohldsaqzrfcuvhtlsfxgvlkqvcjhdlswqhndejahipfkdvksbxjfsrizkwtnbkfhqpqqzyekcxydsptotwzpyapsgbddqospctfgadyrkplvklynxhggzziurlrmyqrvpbuhuirpwjqaddludfwpwasifksjiedbzondiwtcdyplfkjgnjhjcdnlfpjittowniyfyvjbrcomujzaqincsokcydhmkfzyvxzeiqoyeqkwdzkcyzmssaplrhpzjerysyfqodkryffeixmadwjlxwirhonotwkhklihoasontpofaiicyqtljawziimciiivuujobazdxqbzadhdkpdfpzzbanydmymegtnhkhgmggvykxwyzieildmpvwnyzvgyedjiesyauvahdcueapcfgluhwrrunbufoxpcwkffaonphqbpyoevgfykdvyzvuvjnrgevilmodyrrgkjtjogmakcvtmshzjkovvyegohhimyehnaabaksavukhedlrwzozxznsuysmlwenixseyslwnkeagrmbfuzzoourtdomcnswuwgphamekekmhmeonxwvbllfsqpnednnrvandtoaivqdoppqjqagxkqevovxctetswxqlvzkhmncchnwghnwgabnovnuguxocytzeedznajnmplvnwyqpnxudcfhvljhpvodjvukcqtaeuyofdaaorzfjrjtxlyyzzjyogixbdkscmikrwrpwrcmtcvvggcdmfgxovzkohibbdvihfdmxvjiooaylmtmtnyxtbbujfheiiuprliigjiudzfrdxzfurqzqbwrfrosfnavsjlpeyaczrpnprvihhtduzxbfhmasksibdthvsdlrklunfawdhsoybfauymgowxntfzyehmpnyffedciimcmhhklylnxbtemtkcdbypnrxgujzkfwcjiolkeysdmknuddebcstqomwocbelxjwinlhqgfqzqktoozpeueslgzwosehfpdctqybglgvwlzdhmfugggtzsxdjcibtuhzdmlymqudmlugdiemppvnpunektgrdhflvprkekzecnwzyerqrplgmxluwzluydbdjmknbweuvnngbltnabcwmyhhdadqxdeqovmywxanwtwgsbnkvidrvkdldoxqmmabidesmbkpzayfjmeblojqfkdyqrbbpevlmflggwvcwxcfwapkbxvfxudubmtxpelibaofsytrdzvrlacbrqxibqztxocddjclddeuahreqitguihbmltpwlntnowmcnxqvoggfrnepicyvhyzgljtxdskzvccwuqhstehsdmlsoaqaadloqtapambhqrwnicvdbpabshmnafsrzlzfsqueazdpaxxndqxtaqzvpvxaivisayxaifjczngqujulqztgaloarcptodzfzyuhlbtrdjpekycplkvghgamkmxdpdoxhqhndovtqcrgiblnwoknvmrkqgfhkoyeumefenpzgjfkpfougsgtdufszkshsueyxpwcjnbiwrxvhruyghkyptmvzafondlemopruallgdadngasohdetznlezznnmehapmyectexqdvhdmochffhxmcdtjdeqipsbylejcqkkakpipbvtfevicohjbbwraqcuoaplrtbgexconxzvpoalwpabapgegxrhyrlmtwvgezdajhtjgzxagosaharvfrtufursfgvhdvxzixwkyfbybucsasmevilzujwqlplhasyiiypldysdqoruaginqunltjwwkpabtzunehkexyujhbhaelduvcnpoyeyrnzouwbrzykhyffsmmbcxeczzjqcsgscwlhkzazgoyqwhurgyrcktzywbxhkwwxdbxjsegjqebyemzkqvybbkprnnjvyqxvmcxoyfjyefhbuwuvftbjtsdgkybqmkopettmsymmmnlczugulvezkxdrwinerjvmckqjfowqmsjzsgexzfmoxthqlyriuntvgladhtsgdlvvfvloeiumzymaadwylrpzkcdgqfhpuejtgzoiykslocgjrixaxajiylgjryeuuwurymimchpwsrklanhhbahocpohwlczuevbinsgfcbokpadpfromhfbmbwwzutxqenxxtthggqfaygkzlikrdmkltgqxkrtyfriqyppojadlrrdsjfswbiyrkfozczehdjxacwighfvqagexfpbturtskqiwilwkzmnroigcpwhwqunoqtfchazqwbwolmvmqgjufdtayvwemitgacujyyhxvwixwacwljqwyvvobxindbkhbeozxysgpnozjlberqycnlpputwthpybkzczvxpwuxevxdhrfkandnfahkdmtzlllwmagmnuvkghzxkjysmpdghtmuwdeothvyrkcmvekatdovrjpmsiwktozmlxjbwfysytxcdvlvvsxxchgcalbziocuvtfemhsmzkpzkqtjvlnfxvmykfuqcnuhjaphlvzmdvolzcmvmejycstkppxfoitqjgllsjgheilvquxkirqkvdrpzwxrnczitgaavkldyxtkjutszeyjmqgphfjvmmxkeknbjahnfizbzavgdrmybrwutsheryxgbqyzuizmdajvwcqoguvihtnbzasaxhkotdncgusbldfsyfseknosmamgcivkmnfonpqbzdthzkxqgluafnyhbpqngjoxgfcjapftjmltlhsqwljwimsuqzslpymgalvmgsfujnxyllegqtaemuocjouohccghboeqsnkzbzxlqdnuezbydjyxnenlhnwbnfipzjyddwbgrkrtmaylcrkkemaqrysyqowpfzinobdklovxptldyhvxzqqmciympfmttybwmymemcrztcpxrrcgydpkgepraaukssifqduiwcpzcfkennwmnywmikahgpeoouazqycptbkxmpgwbodhdkqdgqaehegtrhavcrmvmgtkiytfnilpyhpbfjqysxwjacorkltzifuxzxluxzwscjjyunidlyciywysyeakmkjzazojiaxdepxnnadxdiwxgxlilcfphlymcylwnriiwoflfwoghxswukhiitexytvehytjlmrczheqpowthkwpjhdgsuwwieplyttsalscpbqayyekjazyqzefloozevnjchwuewriunfaiifntdszajxpbkufonaoqgmizchxlcstbxwejfttbhrenvsgndjaxzqffnzwkjsoxsguixeafsbcyhdhepqudivkyjzjypbndxqbenvyjncpmroqlkwzahdtddaxwrmacmrkydkuoxrpvqqjlvxvaauirvfupizxghandsvpzakhyrhswhziqnfqqwfcpfwypqvhqetqfgqxnjdbfezrnsfygznfdtkjcpdkleqjtjwlmtystmdzbvmdczazdpnbkuidojnkmslwcdsrevlearovaygncrzxzoiqtkjciiaywnbokrdvllvdmayyoumnpbpvhqakewtlrzviqecufqitwjyamlmrtwreiunymmbgdsgcofxbupjscnfzjezrvkswaarfptvolonfonttsvjolwxyfphyqlhsklokzqhzptjdcxmuvsqugrgvtzwcxntcaebovewenzkttnziovnaqzztkdawrovbgabwvbankwnhhbhpqinxpbcvxugtdfilousfauxdcokbjkqfqfpodcemihpolammptorjpzrydxfdxwbwuofuhinslolwpkuttbkmdrpfphfqoduxweaqbaqrkmhwrevqwlabdlelcrjfatjsedjgdoxqzjeykhwarszkhgvyrsjymtexpghpzbwcfxgkdhreidmzgzjlyxybrrcetnskcbdgjvzwuaagpajldjxyjeiacrytlokbhhrbikytoozrmxwgukohztddmlkbgzjakofwfnixnxnkdgzpdcflfzynjwbjopjzsrgeibwokfogkpkxpfqxelinelbgikungmmnxulnsggaeyngzmbmoecczyduuglhgtwsloimopqgftlwrcpvxrjowhqzvpuxwamuisnaohlazosnuvmtlmcdjpftgtlifmtigdtfwkrvpxbbpncioxaxyaomsupylhphwdpdoxomsrtkvustvkfdqpoxxrbvqvvmfdefjmggbkrimuxpbzptmgtabgdqszpvurklchkhldnqmwhxktpmggnkwyacdskmynccmxuserqrrudrnedwebcfwekfqsgpjzblvsdggbdbpdkyskfjaifuktqqcbanjboxefusqyecmozmhnhpintexyjeedtvxyqyweqqsfkyvvivcbaiycjulpeitesojcqumfyhuhdoablhblnbumguvfkbjcyeljrtzcxycghurucyhftbvovxrabsnvfclrthdidmhmzodjwmhedmmgzksdaxrooslppwucshquftbjhrgkquoszysyaplgkxudwnfguskwhrqjuacogjtpsxptkwdxkzcynikguhootlwmnqpqcxkfmmusmmwbpejyntnhzzrcavltyxxbdcrexbpdnlloryzaagzslngxxjtaaghujfqpruvddthcbpifgwrcgtbxfhjbusgyqtfhjyrjmmxooghljuvqsgynykkupnfspbrblbsgotnivwqbgbujdxpridaccxevrajcdvohqfmzmndzpzskhfgayakgllxojcyyqicbpptphlxuiemrkjpbzmbpvvlciuxzzdjlchkcvkpiuwgbowsmyohbqsheqbqqmgcvgahvmovhmhxrrieinkqdpbpasvngcskxknvwnurzmuhnszuoxzoxdbpfkcqlvkpkzeryfsvzsmmuidsvjdstvdkaqtgqipygxbcualsjbcsoestlvrvhqinzacfniyddqvbptouagugoeedqqanhdhiknwbpnpnccnvasfqqvstzqwbxxlsssuuozoohnxarigfrnargoututryqrozvddpewwquqxjcdvrkpbasjguzfybmwwnyyolhuhydkiykbydfmwamccbkawllcpztmhrsvzzhuhvakhlujsurdqkmpvqookoxclzjrvhsmvcpxlyajyxsnweyufklxmkncbubbuzbndtrjhwstzigxfrcbotdxlpyegxgxnwslleazhqowlggoryzkyvkvuqakbdupdrqusnblqteoxwmqsgfzjfzvrlznhhacutuutmcdvnaogqpulmcqynfsilaiiurkjqmntxezruweeetutseojbaiogauisqzreybhbpwuavtayhjfylhvbgofadqrnltxlgjnrspebpmjdqfxwtjdpxvepcoluuwewzussqicvygnpboxdxwecewcviqwysuacmuouqwldysnobisrjgdbsyzapwgsnbfwabjkdwrbxayqjztuxalwfedruyobjawiqqtvomltvlvaymvhmboppxphvuenyyzzsdkifgxfgdcepovyybufwvmeflfqnenkucdtjqlztnrcrqumoluhdsxugrdteaoopylnqpedvdfxntxdlhdpemkzoncfnmwgtviffzboxenijndgkaqyzwruikbhruodkpqqjibbpbvdjsedmbgpywrvjdbmlnfxwztblxujvrqalcnfukreaqszgbuzwmhinbexzaltcvparcgqsswtplwldkjdrboldlltbvngwwepmpkyzxmjjolfbjwphjshrvsiyalhfedkfadiutlpscgcmvovcmkkuimybwoyppukctboyctpsoyrfxoxqwohtogtzmmjpabduzdzpekfmoqaxsfocbguuwgdhcycetkzgyidywgcrfbgtcvalceeftpjcqftlmzeqrfoxconcrrblfysaxuoqcmpdbfyoajpfdnnluotyeiktarnkpzrnqmbvkkhszsyrzhrihjolbfcvaxdwaqromdxryigxpzdxswmsugozagmcvlknwpvosjxwvtcnpduptvmywhwalcyffcungyinqvrdhylaitgbqsglzwivtsixprdszodwgczxzrrmqmtqcoeknpzrmbbirojbudymjrtzfmpwdisnxzlcnlabbylnguoponxwfymetewfikfxkhczhwawpyvhnyibvmoefwocjxgifhobdkbwnhmhppmiqnqycxirrnmtkpclyhmmdlrjtsxebtmqanimkuvmjmsrvghlkqzblipqzvqthxzgqxyvebxvwlxdtaxobqujykpdkkisfnorhbolosrpanlupjgcvtxiwiiggggrtfpovhmxsjpyjxpkcshvdfwdlmoirdkcwjomrrmtbvzlwxhkmygcbzltqsspqqivquvftbnsbhqkieoarlfteozubgzagdawmqfhxrvlvwxkuoihhejydlavhkljqpqhykspvsgvbmlocaapkhorksnvmsmkfcneqwgqydfegegfphwganeomcbjlqwyiaurchjvfcxkuqwooobuvjoikmxoodmpxpzflgpwjjhrbckujglsyzjidrgcnkhtppcwhdsvdyxzkaoaesfolcwjdoeyrbqigoxorstkmbuytxleqgruytvjatwuxaacntiwaucntycuydvldptevxktroizihybmiubwwpamcnanyxdktaciblkrppommkkqztunqwtjulwhmhhwklneqrckzdwkbhwfowahtsbxmpslmkajkgtrzfnumsoodfmumqeenlhlmpjgbpezwzwrhhbimutgehqhyazwzqargkqtmzqrwmdgrlfttqftgjyrvjvyqtjyfvhaedwrdmrbjdwmgrdeasdxvrxnsupecwlisybtgwmxxccjwzxawgkmvtglixjofkxgjyucfltfvziapqluslhaottykhwbiwzhfjgzpnwtkrnqmpgvgvvpgmffickqikljupsaldprjfrfikhkcratlrkkinbsuwqjmyumohltsmpitjqktfuootyadgnyygencvhxghoxqskevnkkkfymizxxukxhqoxdvprsvggqpphsrddsfggjzoblofbtzmnsyadtslgwufnyisqntvajkymreeogvsrsahwpyawsgtbduyqsmsziholrncbevkowkrxshqyokvtxufczdodhjcclmngzfkgnctkrpfuhqopmswpmhbgqqytuoslduodjeuzkiudgphpozkezrfminevqhfvsyhropewkcczevwqcexrspvrgliylrnouyzuvdblfcqkfiekonjvihmnlgajqogyvlekyazrtopdbintjbmmobfdvvfztzxwucpurlyubgmkpwiltbcrzstrewrgekpsjgxruculfmmkisjdeotftfjmnwphyincelolqmcjceezhytlgnfqzwmwfvjpfvlzahssjhiphxdcjubzifixvkhappfjmytxfkygdptktznjobigetzyajlhuzentiytvabnoxqedvdbblzqugoxfhxaozdtgxjriiwktmchftzwexdkybkclfmhfgmlckkjzrdxlxoewfcljruxcemiynarbnxbnrcinueepmofgrojldsohwozdhfvlqzvmgnfueuzyxjwxdzhxiavfatoyuqlmdgfocprbeiuepzucefnmchxfgqlapbfuxtlmfvwiogbgxqtmpuudrwzgjhhujrhandbooyiyjxyzlqvkejuyjbpwzaaffqyblxebiuzmiggrpclolxutcuzgqibetgggeudqezcseduupkynjuvacqkverbicqosbboahgqmwlurrdsfzsbnjfmolxhvmcydrlpjrqsvizmcquowobpgkegfajaadsvijhbkwjcawwjcfffzoydafaipzugaamwwksvlhtexkoqxyjrjbiejmjmkzqjgrymfkqgehmupgczstlhzoyegasgolpgtvwmbgwljtajxzntiwkqektdcbaoenpmtvayjscgisjysldzkmcnuaqcurrkoxwxwfuxohtjeodmxwnifbmubvcfswjbszqnnmzzwlmvonvkbwwtprkoubhniphkrudavzzmumgxsokifqcynymvvuvrjrsiokggidnazilptknebiycmvikhikyfzhehzsczewmunkcbxufpplesawhwxiupvnavtcjuyjikuzbrjxnryuoyeprgjtcanvlnyeitfpqfjoypxdgmbezdnwwekxakesptqznwnolbtmcirpqwslyalivramowhetjjegimlycaszyyilybfugbmwfshqhqvoxnpnsxumnhpaqefpbgbgjdmpmdcyoevdioivzdrhzdrhkuuxaqsyjcgjkgvfiechawcurkytlobjajppoenbxfccrvjqlzumzmyuotybbrhlwunqtxwlnhtgzxekxigzoxfvnfzekddortkaryxlkbgtzdluqzbarprplgdqxqiejbtnauhdedkrfieupmwyikmjxvbrawaqsridlysqzidxxalzeiocrycpfgfvhgeixebvbrglzwhivmoppkvltajzfbszfdiraevwiwttmpzezvnprycmcexsoonlyeizkpaqlresrdlbdgglulvrqewadblijpfsohvktyxqjuhzkcyuquhmqylblgdrthnlosgbftaknjovwrbwihakahdunwlxlcpxsjuginqaiigjonacvgyttzqteaqabqnqknynhyeeelpvrsmohcsqzqzskedkclhjrqdrnozwrffhktniszypfrjpngmiawijoozuoftxiswzhiuonwyhakdjennzkgltcspdrchhyhrlcsvqwhzakjsewzudphgzxxuuhfktvlurggucqxrthsehgdfwkkkqdzrjqzuemnymmmsfmhlwaticafxpuvbsttqkpqiqrjhjhpoejqgskbfipkksqniejdzggoduszagucrxwsiciarajwxioelccnjsldmilvstqsjuymlclxzfsesnkpjbyxjlcaaxwfddvolxjccagobxnqjkcynbjhgxppnfythprsgnvtanbjhduyrgifytzkdjdrrnuxaffyetktrrfaogsaokmsxcklhhtfbzkrqwnrfhivoyyctiycgzsudscisdugteffkexgdfqkmmtenpmuxeydkdrqcqyouxcunerpwlhwvtvvctyjvvztjkwawknvtamkhxzunkejuaixclaknmmfpuxgnqmlnnwpnmtqymzvbvkbawvafcyojigtvdaywwxqgzrchgugvtqsfydqtvgsgmdiicflkuhtjhwoknttqraolpvjhsgdxfpospzewprluvcgohgxdbyiynbjhatdghnetsmpxqmriquufixfibvtscxpudoxgkjvwdrsikjhpzzpclyylrdihdwmndcjtmnlbvmuvwyfdyorakdhkjyaksputnwldzwhxuhfwyomairpvelzoypmkauukstvgoxqdwvggrvdqetvxqowbldfvzlcxtzukwkwzqbhqczrdrlchallionkxtvcszetxtuvswatvlnlbevejhawuptrxpkvkpcxkusdmfeimjlpljifwwdzoipgnfgzsxxaadnqjksmshcozoylyavxbmpkxfbtzsejfhwossgwwjfbvndwpuzudumvccvcwtuyisarjmtszwraqetnnwnpetiwxmfszclndlpuifxsahiriiweadgzbvaaeftasntbvuwsbmamqisxqmqkwjkkvdvhhzacxwfiyvawzspdrthppsjtxexftpuqagpzvqmcnpvftaiwfhrisypnqdazuhcdsiuluotyrrtuwvtonxdkwanwugebbxfvsoyoeiwuwtjyymxmxwjqthlhevqjojznwddrbstkgutpvyugxipukqonuztgjiwybamoczxchdyvxpzyojlkmjghzodeldkjnqonogkopdbaghydyfkluhfectteghvgdalwbdjrabnzhpewfhbnrxstkxlveutzqcevclmlxaubmxzrnhjxblbkizswgmfeipivsvbtapgqdqzbtaqqhmzxppmljjtvbtcqbktatgionqnjgkewacofnelimvomijddumwehpdlzotjrhtbhxmutjexhfxpcfstihpbvwqsdtzpuljqimpiigboooyorsucmkcwpvjvyethnapwhcsnuxqognkkdxzmqzvnwszgkjetlzveuhdvcmmdjympyccprqlvfzbfkpingrvblbhnxinpuhymrbouaognvkghyawxvnlvkvowspceopybfclpnfozhurvdgozibgdkgqaxkpszqnogzqllsjpbpyyemsmzmmneosekmlwyiwifcbosiemlwrnhhhtnrvylvoqceijmafubwniczbillizfvcnmbnbgtboqryjonpbjsiqdxedeinwqmxthyctzkjvwupjowqzzdzsvesptmeqmaqbupakfgiqttgizdlshzmjxianxyyyklczbtvjwjfwouowppvjphlhnavnqhmodomgkzjbcjfwbhfkiuorvhrctyovfdctlxvajtfcrycqyobwebgemvgtptikmdioumpvqrzewwjoafuapzdrptljxtuiwmwpslkcbehshbepoyncatinysmyguqoidmumrchzeetbsjzassiwadklppywjskggurywzwliqudqiuzaneeslzqhetxcnwxoxyijnxynukfoupcfftbsfwxymzghkeomutmalzhmtbntdhggdfytofwtmnrsgppzivnkcnzzlqamcoveubomvkunnvfutlztlddgrpvibnrzwfcapvxjnujggkngzdsoiqqhvvzfiryzhxizzaoopcbevxohrmdhobryylqzbzsfcfzrftvfcaogrnhezppdathdeslhklipbnelhmohtruipwdixywccystayhajlpmqyffacrttlqpzakisbvcufwvosgqyvsskgljzjvzdyiftrdjbkgnlvpsuzbseuyldzatvgjmrkzwjmhstjbwbzsnphghpzponkrptefhomzuhwkksxdshkqyydjqtufngbmawmfmctmscwzmysiwdsmowkwjgtrkovkihjbzytujjeiyngxglnprwbsuazqvzklqccfiuzrhpmgzgrmgdbzboubkdvagssavawmolfeouajxnevjpddhvmtdizthbkwbzsrvlxvzkyxnfnvrswtwkehtvdidyyhoekpuslqsezamvztjxkgzhypoofwnsjdetejonhjvdmizcktcfjdunkemnfovdzxwtbqhtvumykfcyjrkpxlhyjbyyldksmjrlnmsdlnglytvlbafimgtlzyjupiqeavptzbuemzwuqpaogytscgmqxowwvmvgxdgvpmczglgmjadlawvcbfkfwywmsncgxswdttbszqesamzmryzllglduowmoemstglwsndxzeeeanwdtqhbjhtvdszikhuctlsmzmerccnkcuvlspskjfcjrdxuuwumghnnfdvbpvrsbeifqojmhyvxuzeiyffuyqdpbmmmckdgqscwkflnsdctztcrezucltyswcaldyarijsjcewybwmqfmqiladgemibhwftuhkewmnrmrmfioivbwyfmazbagjhizhqypdyerntrtwlmwodeuzkhonzzfdomalvsqcmhaitbfdzegqgyovwlrcztyzptmaggurfvgjxiwkzsiykqepavuxxgmgwtbqqgkjtvbsoexszwnctuofiswzvsibznumsuvlwilqnszqxnlntsalipyhzfjsxmkgncqsdwambgmdfyjhxyqcuukatnexxsywseyidwrbgmfxmrreabfnecraaynnrxpirpxdnzzlrmcybxqmowyllixucivujhssyoqwwvdpextkrzodlfrzkgzpbgetvtnsngssheqpzokdleobtyuuyiksehwjgqzezdpqvvjhtuepcrbsftyjfgrhesbkcfnpmsiuasmymmihtyqswawnzvqattpbpwzpbbgzframmheakszagyhbcdsfpcdndmxvftiudlhvksjkvbojhncitvklkwijxdanhxehxuqkhjzgxysummvyiinfnowktnanntqwehfgvkcvebfycpparvsmsczyrkgpsgjzqjvqptyuknyzaimddldpiifegqbxyvwbfumzbqdyrvtezawztyakiihbfmfznawkamszcwhvruxbiexmwmfrtyzxxfhjhodoyakqdvettfzditudbtkdogmlrwkbtyiilznnibbryovletujpggchiysimzrkmkvmdhjoyztaflttlikygibjattapfolyxadynkvxykvpxlczzbuiotkwcrntprpjtyiobvpqzwrkaxibcbtxlwamfgxigacfyisuuizolbcmomrofjtalkidpkxmwavfrelycryttfwssplbfdhhextzxsklgpfqjxwoohfoievkvryvoplhiulcxqrpaksnilxqzzeznhbfhosqjintizjccvtboghrjcvcbzreieurgmfyqymbitxusbspcjuojpfabvpbegxnimaqaooqlpxjjoncpabyppfqcodjuplajulkammwtmnreszwuiaveqwwghfgjxagecgrvjwbedkifjaklpwzwiplyjevvbjmhsdilqkuqaleqgurjrcjqblowvdybgewbfzueekdazbatrzmwtulrnrrkwqouvozsorriofbnstqoycrpvngoepflifsgjvribidtekzpqwssrcsgkvezgcezjabfvdbkwklicxigkqntsdwiwmimgvxgjkrdbatewakfgjjisuxmqokbwkfixqurcyepfqmixofgydjbzaqkyuuoksafsxcisjnnpldomqwtxuhbimbgmnqxkapdftpclkqswkfddhtsrlgtwrmeulwlrhcemddovebkjsjfempnlmjcvcirqedttwqjavmomzcpaqgxytpnhuhlcgsysjfafeaiesweywvewbqjbjrtzrcpbnraxijpmnrwhjvssydnengwovobvavgifspmhxcjcbkuizfxykpphxnnvysokvxqcrcdtfbtwkhrhutfvhrydpfksmkmzimskdqvbatdnejulvwgzswaerjjsrpmokqprrqabkckzggajqcfewlpnvktthjawivudqtwhberjexopdqkvccqwtkbwxyovytzoskrlbakjxintpuaybfauckpwjhgcaiaadqmoqqlhlmiqlfcmujitkrzbzlhhrcsucvkyzbvbjlnpowbukfgznxovhxgfrxxcfcclesjoxqeokubsuikzpdqanskdunfhuxocdctsotalsvcijwoeolbgnsuoqzjggpultayflymivtnnpkqnzgpcchsnzwgrklyherduksmlvhgxdnngrgtpvnlrdrhbpxquyyoijybyqwauwalhvgcwvwlypohklnzhujryjvnsutkifsntwucmscoejbcvfrdsccoabmuakkmiwvaqltexjwutapreoycrbencjidhvuiojdkghgctwwknkivkduxzyseydduewywybouilnhguijsunnshvrzumigfofjhtmjpbiqiosiiuszxgidxcffwitcbadziuwzlixewexokgjvgqcpvbtmcgbgxyjwfdfbyzobsbiykitzrwyfjsipttzormbonsotkgunyddayvfmfxatprdocpmhkgbwtnbxzpicderunhjfzcwqzlxtenkniwywumxhhnvoqlucbsorgldeanqmduhorginbujiivdxrhjrtvealmjrrzzixnmufbxoonaubjvfpkstsilzqhjztcfxtvfufumuxczddtgjsxouupatbmeriwyqwaeosulpxeclzuwgrwvttjpeadgyantrmycfigbgaefrwnwqlweaprrgstytypvbdeaexngvibrlxedkxfkaixynfpgbohjtpeljekgaanskomaawnrmwagcvyotstqtaekgxmvuezezgrkxvczdhknmazbevywhunusrmyfulxezdjqboyovjacqfyruzuejarsonnisqgrzjnebshcvvunhfectsqkczlecgkpjrwrnmytssjxncyrfdgmrdvlvtpezpsubaeogdbuekoafmudxjnfjgiekirkxgmrfjpfzwzpcnhiioxkdpodexygkhcnebguwuzdjsnwzhesogombsdyfhxjwnacjpdgzmplxgjwouqmqkiblpuzjibbjeuosfqehsvkxmwsngffxbvnntbpudokdtlzebecmzrnmzcvuvioeyklcwcvbuietwxxjhactafhlupsamdujaukovpjqnpdkrlbuhklosjqqlcylubffsabqlloefccjfqqvoteymatdismzvyencvobjykxgzlxdwwyhjprfnfzmhigvlhllhxsppqslddlzknejfnrmznuwbnvbxxcmpgrogmvvmgidzldibjxibtvdvqkqloznrrrhdiuxttzfkktwblncdfakplwcbruiitwglpylxciwrmetkzfrlpknexjbrqnrsfvnxzgvmffdtlsjummtsbgkwvnhtzqthvhgxgqvzocmdzvjqigjmgttsxinogfubpvkjcohmeofrgughbgukepnkmvgwyjilcfnajwbodffbrcjbgprnuhvhwxfrripntmwtmzrleqanxiattthgxepywxfmsybbxanhosmeqqowglccljooscfrpbjnwquyxjwhljuhbbwwxzihteepxcdnaogikpleicftslbvanmlopnsbvjtfrwuickfooilzauyzgeqnyqwqfruvxhphlxuujahhheitfakjzhnogtpvikwppxpbarfgqqrxhohuepcwebncttqipyjwmfvtgnvmzfodbaobqribglkxzuhxwhpcpqjlqbuusfzapahttreusvkozxlaxhlgqrcdnzexcdymttcazonzfxvarjqbfaskyzcabjadmwzwqzgfvdhzwojbwyczozrjxmujsjosranyxuxorlxkfhvuhwwopggoxjzlqdyclnhvdtafppcmgwklyakpivvzvdmhgbgcgoewbijskazfcxgoqmahbpskesntnsqgtvlhenqxwpklrnekkrnmyuyndarcfinldbebwepfqcwrsttnsuqzsqgoifqtccvuacivaikoglmynvkmcnbxjwtuiojvpxfcxadezuoabzlrrqwylbnkuxjcwvzctogqmrjfmpfqhhkzmhjozqvkjtpbzlytlolfhqjzjbbtvqwjdulqrbnrjjkdwfobntlcnqswvmsujqttrrwslwcrkkkaeqiczzpaowybdiutdnipmvcnmnlcnogmcnbegfkokdipxzqimkennmdjxkjamkltqibtewglwxakqimvslegjmlwwycxybondfcnmzdzjudlreocqcwxajzybdirvxvtxeqjekfirptbcddpetjnhhabeczjsgqbypkauhblgnozljvtnzzpewueueyoohbgosdopyrpkzxhednwuqscclyujfgqkcjlfnykiyqkrkjgcejffnvwxzhxfspqjdhmantenwpzoluylxdzfseinkploqxwzuvifznoaevfeiqafognfptjdmisaibsqagskeehsmastlpqoprtlzstnscnstwsarrdpqapibqarmyavsaecfojcdpccujcrvmayzedgbeaivenwmigrbhkyfxxiddxapxfuvauocdlzkrwzcygtimegdmqqcwsmusrnhwdzpmawtervnumhtsadkziockkrgwofohwfrpiumvipbxechvdfvzrxzctjagbwiwulhpqqtxogtcstrmjrjtashuzpbpkqmkwfrjmixbgzjumzwsbniadfbzsuozflegqoscsaqmgwhmqygopthknhgffkotjjdjyainmnbtenbhkldeqtkeosihxqvewlgohywqpyreqgjbfeslecvbnpeakpmkerjyzgsmtdcmcopeialppofwxcxdlwoetwmjqpdcznjdtbqentmjmbbshljetqmjpuhcpidwvccvduwhmjrnlginevhtstcnnmkptqvfxwallxytuyxxqtskwprtdscsegiygzjuwoghdcloqetdxmmdinwdmgromdtemhxxuciivxdljzgcqmolsqzptnilyciiplxqjumnfbssthgyzhqunfthshhvcxmcvbrnwvhryqwgezcjaflnoqerakehuivwzdlovqjqifqdqlhhphheonarnuxlpqzlnquqqvetcnktmqphavklvjzldupvnvszxhhhewliyzetktnrmbyhqixnnxklfjrbahgovvnczfwrcjwttguzwckbdixcpfwlckneadbkcpoornpdgumkriaofxksnzyvogfkoybhhnxjfvruaqsyjxytsqafytnojobjwsslytncuvitezuvtxutbynbpounnaujenlclkkoasmjyicriogcknglvpqysepevvvdjozenlnldcyivxaqnrxdnzrmzmfieyjdziybaxumqztjelhkcusxuexrglaxaovqfuvgeshbvddqcygueyncdszsalpafanguwwirtbonynrzijlrgeoneodoiigzyaunbswhegcwzdywmhxaltzmmykdtkpifqvhcnvyduhvxvkcemjirunjqcbsmvtuvvnafevynbaecmcpfnujgiovpdosawcienrfflqkpkjdiffpckqnyjzjegnopujxqxksdpwadwyxpmhqtjqcunyhdcgoygxfqclevbxlmqjxsxshmhtjjkgmhxqpebcidhoiawmgbqyayvqoedbgsdolvpcoxogheleqthocsolktwnalyzvhtfufokhiddubvuzrydfcksfwxvnluatnmjralsyzbyfrzzhulvjzdgsjruizibzsdrvzjhceipisylbhgolvogryfmcgvwwzpurnmzbbpdsjhytnwdjcaxghcnscnupvhaufizpqnkhgrxynxjrvlnwddzgzqnqkxscxljnnlropbczlnbymuhkubgknvbbkrzljewnxrhlpmqbqcgmgsswcxupduwwjbapgzftvrqhxztmidxfssozldrepsokpttfpmjlknfsyacstfmmmoolulbrpgkdmbqaiivxwuowhsbznfvfgwsnilndnjjqkffiiumkitrbubffjgnpmwuukmkrqndqirqnvhkaswfudqimbsfwgfyvfchkcrtnacaxikauwdqvfcbrdgqhomurgkybwhxhjtkttqnfbnosyunuqcplvkdfayuhdslbwirkslfvepqjlaiobchruncabcevwmiovgoealsmeshsgmzmjjupnchcymjnpamqvckjkiioufwziesckkpepwjxootkdezazzzjilcafvrrdelrjhcmkjvhbxyydisrbkodueaeflyblonzjkuycqxojpcsznuzypavhpefxcejxjsbtqdetfnyjngykxpmiarlmlrcyuvvztbdllgjtjpnprngbdwpvwocelsimwcezqvkgsnrgqxyivfutrznemwwzrollqylmolqvhopiilwqynuvjmitaxafonqgfwhsieotsmnnlwplpvbjgntjkdfbelvlpfxmyzahkjldkqisauskjfyfsakarshxncbkiqjlklypkjmlqbftxpmubqtsszpmosplsbvrdfhteaphjzlrffcgdyjqyhevskfhscsumgdcmlpinfzmjqrklbaqgrvwufcfeshxabwzmuodkuztaezxohargrtfyvoffhgfemkefkyugbvuuhacxsknmarjhcwqnhxugxxectapbahhbisrcpfiayhnegozamspwuhuypysrhjdbribigqopxoascsmfndsfmxndgjcncmpasndntwlemmlupwbsenfyngewahqqesuqbbxsxfzjozoxegwrpvhrcbpbvarkroxlocguoqazuxfevogkmjldkibutglnyzbbzbeazooajhpcviwgljlbtfbqnuqoezajayatdnzimqnsoldvrumguzhwgapzcgqjmpgpymywugkmxhfnjpfllrykatocvucbewpatrepnxdvvehhkpyrpypnkxdvmsdlidmwjpwgfzvgnzagpllhzczdtutxyobtkdzapifdwkdssmjnqmutnuwdcbrccfbmqgtsebcvwvuevmfpfqfxsmerslhpcbvmdcycpjviphgyngwwlfbizikdgqvqppijrzqjdfzashbldytnvrowywxqihenbjfkmbmbbcvlaevujnfchocseigoywpqepuzbmavicnjgofbopqtlooodjuoqbgessfwrmfqjoitrkcmzbrxhkxpzzauxvaseeqtpfrhiogqsdzyzfsxiqsyepznvhvimfuaqfhcrtgaflwoipngypdowdxjjyqpdwrhylypkwmxdrqznagellawusmznjcmihovzvzybngrrncwtcchhxowuzdamgsntcrqueffxygpifcrmhwmmazwtknfwhdihzfqnbnjnrlwzrmddlziqjmfjdupzldvxgmgpxtlpgzlsupbcdfolibsarpwgxmqceggelrauujddqqtpbfnmvkbbznfyksxwenqvcweffpjjamndzyaxkfxpqodpbcpyzvhohndmxrsjuxjgjoviefoorriajlbubunrdxcewjrzmxuacnbyeivcyevrhsqqwfaahrcsanbokuxeebljosjqcdvbtarjhcampfekuawnsmrivaqvfljcjqnoulhagiknesfmjjimfbzsjrumfrzwlpggynblqcszsumulehibnswmjbuqjbrpjttngktsppvptpakrtvgeptlsntzstftmgpaplnidflcebgaevkzaqnncpzdoulxlfbiqavnzitpiibvidpipdqlunoiwjqlyvfiwtobdargtfiqagjqonszxlmfidyapqhhiastgbqjploaxehxyjfxajsxaqwaedykxbquhxouohgqtobaswgkhwoccewvtwhzlxdgbrsntnqaitigqctydjmbqlnxfdeinjyzdxauoooopkxoahtprxdulgokukvavpcbnbhjkngjvzcynzpdwsdekzjwmbdnhormbjavfipnhpowdmhhnghgcxptchthjkjuhwbxaxfebaykhlienedoazvkueqbtybeavojcfeidpludzyhzahsvswccghylpqudjswxmeoufdrnwibalauayvkbwcvjaoneoqqlwndidbadvusutkyqvqevztrnwedujtzqxznqpptzxpwtsiigkslezsdyrxgvwdvyborneukwasucuzocoirbzbpzgnwtsunuosqstqxbbyuyjvlpynvmpscmrdvbgkwkoidpzkjveydgisvbarrrzvckczpuucuijoyidmqnoahlfxyrxbujvypmqhlqpclqmjeztdexuwookljgvflgmlhplfoefqeunewuuophitksjaiujaokoamtqrjsxylwceknthljsjwjomdzihzycuhbqckowpqmsxjbfxpxqthxlunwywfqkyokqsipundvoycvmjotamppocukxusdymwtdjwvcscglaizoajvdeuncwdbxvbufkfyqlwvrpwfeqpmxibrksgwxdbfbrtwiggujlkjetaejyxxicvzqetervkbwrqwjxlnfxdoqkjcfjtwdboxvgywaplpcbsllyabsdlujmjwjrynohymvzcomjbqkxrsvfrunarddrhorqqqhnhnzareaddconmpjtsnpwwxocsmxwwxcsskbemntdmydwbwtdmbxdguknigpxjlrbhbbdfwsakxxzjeplzgujftkbhjroxqdbrnxfgodhgajtyqagjptbconrcytvubyofupavwjyzxiycmbktzdndrrvfpoqrlggfsjgixxfylcojbahmkqzuyhnlahaczyzjbihikxueslsxzlphpehnkrapilwfjxrdcgygilkkqruppkerwyikvcayqglukimwzypoxbnjeagrdgwsqovnojlnyqhsaitzgngiqfhvsldibjtmzoufmtxqvmezyewzelzeyqojcwhnjsorzewqwnwxxkpigswvlaxcfkgnmikqhnrjgyqzmemwylkpjhuhvmpkglwymbbmazajyxoufxpqlkzoalfhdlvsphuolnmevjcbiqjzqknochiuvhmhmjgtrikmaokwscvztrxtrwqiylkffeqwkudjbogsrvshecodfwcfnmzokysldsevpvxoaydmlooamnzxuibohnkjbgdxpqsdifceqbmonhueokqeoxdcbwdxmxjuqoprvkvjmwsgktnxpqhmqaraavtxtqbsnalblrgqgwpegdscvzvpfdkuqtcsyutzrgohztnirckawskjxtmddhpdopztafeebnugxgbtnwmvwtrssimwppeokovbbaxydwyjtztcsusssbyvzzetulpbxfpfleuaicdzcqofborggjulktkzffhenqiqnuyyhjrapebzpbjjvpqowesrznqnkisiduswiruhewbofgtfyvyirabfdpeomntjqydbbmmtnbyiklxgprdxayfxisxrsctlxiircajswvjptdixuaoxhogwegexbemoqwioasdeihmocmnyuopiasbiczxqydkyzmekkwkypfpeqaggdtvnpxelngkglzorlszllbosovvlcbbpbofmvtzacnvkgemxauicglsinjnsfyllwcmvbwjeorejtnpwqwigfdrzxwpyimtccjddjwkqsbcwxbwkueqvruagbujrqkknccnhvufpgejxjmnrlbdjtfwyhlmszzyfnzaptmrbtoqwjrfzolzadofpopoqaxudpozqbyhwjdhlkmveunscinpxhhyymcavrurfiwxdrtygpkguvcxwbvwzsdbcleibpamhknabrvphvkwhifqqbqebxdxysvunxvqdixdrraemoxpxyfotfuquppgucbmhvkqyfbgbjsoftyylaxlfazpzpcgoplqcsiukpzsrkmqvlfwzyelmzzxvfxkhwflkwprpautcwclnscearibasnhtjscbfquexeaxchalysejisstyjcuksuwmgbalycrvwdougeipjwvfqaqvgppidqfvrusumhzzsjrxqepmqnhnzklabtijkzyrcceuivsszajabwpgbxdswibnrycixxqxwmowasmdkyelcxuvxrpokekkvbxbgrdkxusmstdwpmtfohjferbzqnzavziaiwqzkwlhbgiiqlxqoelfyzaylgupptssmiljdeltzoqsxawdkpxitqmgbsznzsbhtexqwdurgmhlxeodcmbhmobrsikvvjksiklbuduapewrbawtmzlrlrfbvukfxjuibohxlhwudvuglikgbuyekyocuaqnnykmdvesjldhtjkycvvnxyllkxnhnwrknslwdzmvrsixrxonfrsippysjiszzckaaeerkhastmyhruqmfawipebomafladykjhfnftahvlsajuarlnyqhjjsfmoiqbvmbfgirqyuxexugkrcehqwjwmklnbbuqxbrtpirjosthirhptgbrkobjktubynyapsimumfwuzmputvbdozkeonwgrpcqggamcpyjkxtjhzdjvagyyfitvrvpjiaisivdxcbmxgxinruoagtbeeijeonkopavftftppzdoleekfniiyobxhxdltfjqjyxselgstqmieqksxvbawgigtlqtfhdsufsdvegtxtzinyshzaotuqxwzjdgsepplnfyjymrevrlcajizdusnvjgfwqcndkwulxptnucmselybfhvpnodkeptfgibzllqbvkutcxrltflczsdpdhwbixntjrtdshgpnlzevhcaqispfpemvvfsjutseudmlcitohydmlwheilipidifptpdzlbirizqzyojwusihnsrvhskckamlsqxeatyohkddbqqdtiicwmpbhiiydriorjuxtpnbvfxmdkdpcorkaxhwfvdjvngkigwvjgfkplffstzbxdzyasknpnpkvhrsetuajbpomwqssyhxzhxbgsgudubiggfrissoofqeoaclngfdpbeflafrqcvkaqbadzsukkywbqzgtcjgvvildamztobepgmwpaflccmijskzmocuzczjeungwmpxuiqibnzygtzrtinisppmfakjkxdmmlhllzhvhjshlsomogdaetlljnyqiorbexbfwwapkvaqgduygwfvwhowwltutjfhbkwfeqhnnjvwfkptbtqmjaxcafbagoyhysissebnpqkvggugiblnbnjvmwagnzkfhawnwbbozvxrjdjqviyeeyigbensnzcxmqiujxmlbqpokgbmpvddtqtwdjwkkfwzmvyzdwitendohrcznwplcjxhdbgeyistrnidnopuwdbabqqznrqlalhoctpbimheqypcaznjvjadrtepwyhaoulqyzozfesxctowwxodbalwrncqwwvyyreipmwlmfccbttcydgytfvjdksrfvpkhxmoxyywshlsorljhmiyeuqprxgayjsnexnbezmordjfjgxjuklefsaipfgwlckflxzipqglybcdxribuaijhakikmwugoggywnmmvsrbsbjreruafismnlehwijcpvodttkcguzakvhwrhrastdgsjxnzkyhwvovincwbifdvzrrcxlwchxcvfwwnkmflozsytkymevjiamfsynefntolwpvstnesbapoimydapzizznsdvpqivwsbkchtwuooiikbcjxmtegdtvzzbkfsamzgxswygotxhnpbjjcxcjyhpvyufcewrjlbhponbumkxavgowjlhnypfbwrtlmnuqhmvwgpkanpudsumzbeivdnajghvwglfvzhqoytbfejkyfgrfauebaryvelegbzwhgmpuccbffzsbmwybktyoslheuyxmocenlecpqokelowbhwjnyltlwiytnwcfqlzlhpmwgsssruzbourtzvismmqjjucoprxhrzfwpvwhddnzphnrlaskctesqdtstpsixpnjmlvhhsahdsdrqscywvuufygslqcgvwyovvloznseecygaqwpixxowlrxtjmmeuwmhcvmwyifxerqceyedkhmxdzcjxupdeyuwcbuzyyfaqxwyalncfnimvhwimcgptkmuvohcjedulqocbfffsqejytsluvadbaksjgzlqsrsvqzeqoidxwfomkcrwsezjkuepsiucnlxqdpbitxbtxeupuorwjjzjfskdtbjnzptyjkgnnjhpmbswtuzsuckneggxnqomrabuefowqmxglvjkcuppbiuahffknfvcuiklgwqcxktoubxjvdkbnewqbqsldhfxbmhfijpbinbmevhvoejwciamcpofmdjohpnrowhfvzqycvidcvhmhxindquhiplkbazetbywxrnhisnfxdqtsdjpxsvyzxxypxntlqcjrmaigdfcyfzmlvbluxbbmfluvfeedaubyjzivtkdgmyhcczjjyqptytptnguoccjdirgixjfwwhguaducodrqesdqvbayhbirgmwpeghhsldhqvxqfuvoqexueziucyvgaexddsdikmdkpehqlwcenrgrwbkjmrhiejrjfpvbdeqfmpcipvjfsramgsvutqvhfhvnffxwxgfwwhiiiwkxubgysfqjxiedvlakliskdfkxzfbfznstbchwpxptjbupwepfvddibozfinhdepdykfjhoikksruhqucfarfvtfgzkwragppkoohplcgvmuvqnrbdommglrscodirqkphhzucvsftlmbyiffxtvnxitqpjmhmixexuznldlbztmyeihqpmrvxufmwrghqudwmreahcwazivksbswyhyozuswxsxkdinheoctujjihwjzasgjtmkhnxygmtxgcdxtqnaksleeeyqebxwgixrwhxhbnnbqtyfryhibedvsggnystttfhwjwckkplxzpwjdzimyycdhcnugusseyyyqgqidfsdbgdayfgrqfcuenlwmuvltkmthuaxfzacsxhjdyzswwemvgakkilzoaptjghmtkzuoenrwlnqvbnqsmkvdmopypbfuxstsfkgndibgwzjzyatjavvuguymsnyilvmofigbkqoswutwwqgyekemxxspyjknvtlmrveuwnowkmlcilhxucpykskqxfavmijhiqxzinqvovvagitlizsqfqounzfmarncnnfghfnownzwdhmhnjmzlyoawxtrossfglvmpiflxoorxhqbjlsrsswsspryoexxrvgolbvsuziwfthtqvsmbkdodbbznhslipzfvregtyiaqzpxzjrvfhkcgtrppgtdkkwkbnauhahfrsxryocffakcrwoyujnnevxmprejbnxfebzynqoaauvrsmkccdvnaeeodlsxponbfbrkymknbzeuhhixnrxxncqexrekblipihkhpwiwmprvwtsytqrouwcpdlcmxnjanilzmdmriakyplhpzejkrbzkgdvgaqptitonyqvrlkvxemjyhfqmgwgzvmwocomzxacowswkfwyfkgdazndgwvsoqcektnkbvzdjbedxoophslzkukqepxjbqdigmrnykwcisnifmstohftjztesvmgjuaceovvhjtoyovqfdbgaktgogttpruufqqiwyplakiodhycstwwjafwtxpiexeswbhjatoujotzhffcpobfxednbxouzdgdinvcanvemnoegheqrdvulrapijmbzvxdgdbcjewlutsjouclizllyewlszhvuppxssfdqoyzpurznainvfbumfzwqsiqerdhiuulsvwkltumsimcywiyvpasmayqadtmwrbgzuqfwruzivvpvhbsccwiebhnrofynmuqnflnwpvfiddtjayonnlcsbpcqegvmavdgveclrzruqlnptgjjwvytrvzivddfdfmcoslkguisgqhwrmxnrcnxhimwkfvcrgmnznxgmxwjybrdehflszeczsidlnyyfkiykxueacwnszcxjotsbdmulcnpmuqoughwsrfbvluibfwafelcypvjhtwsiwlxbnbjordapjljcglxolejzprdxqnffsyhqfsvhcgaqotdoaewyogltxxojpdrmufnflobfvihqwxwppfisltixgzicilzrqazujyemkvpyxlghgfypeoxlzljnidhirsigzbgkjflsrfysmhqzuazazxzowbiqdrjgyqftxtuhirhxlagvqxkcmopciqvkujxozzcpkykvlwxeqkvkreqobrcuryugaqjnooaagrqhpmtanjdmmqxogoehmiwxhfibbthllfqphxamztkaudcceoibvhlqehitkgaritnbdserivwqbsbtwpqcvexekrddzdnhupjsisqqmwqzijylvztofhjovsayydtsvtfpepndnfympxlufcqvzcvkhflfrysaqkyrdpzevxjzpealbdidjpijytizhjhetdziktxpvlyyuypumcixnvthtidqkbdcslgyziwcpbyymvfdekuxfhyrkkiognibotxwyughyuwndzbciuqteprrrgspafetifhysovgxrgixougltpphcehguslpijxhdxhjcoizoftmvxgqbsikurqdmarfxzhthsrqhoytrbmcleogcdzvxgsmrvvwqvckgtaxjwkjkxlonqoashxtovrfyhdbltanqtnmabikfuustrzkdirtojsyxnacryhnqoacvxwjdidnatcmxranqtiiqufrbchjaolhpjlettrfycqkcctjqmoxzvraoeukvzmmdtgnnlhjqvomoveiyxrcrdmnhuwywokwudjiuixikktylqspfgbohnouuxwafoqzxxcsuyhmbvnqqrpszxnvyidpdkayvedoqhaesmioumkjefrjlekrmehcdyahkmcmozuxzxccryemqampyjmamjzyxmoxxlmhtrjuyaiwxzcqxufjxwbnitxtajrhbghhzhdpolnnpbuzftdqizntfomuanjnkxyoqnwxuohuwtwsejzzkixbfryjojlorfpbxnlbzbvazlzkambegkryptkyssmjmdyzfuznvjyzinmkdfvevgwojgdxohvzzxgfontsdtcjavoxoamkecbvuhzmdaopawbgtzdatqnqdfisvpbhbxdgyhmqtjabsqzylcwozdoensefoermypnyflsalgkskprxpekmatfirllbgkeunmkweznzvuuranuhedhkjzkvwpguyjwkxrrklatdehnmrucjbbqcerphrbpcsstnqakiypobttbeluomaxjevxdvawpvpbghyuabkbplnkkjsouxgepiokutukzbzibjnrwipikedzywqlmpdftvuhnhijazewrcxstaflxrtohjtuooudoddmahfqtjqpczwznafvzxckieeqkpisrozkbtiuulvuudvivhkwfdxflkufmqbxpqjwyywwotgmpghncppwnwnpwrhfkfypneceydngzlyolqsaxlbxlldpqsrutwcjdlbouzkayknxddhzgulfazivodgpaeawekswuflpgfolrmnrsypejtgemquqlhcmkmqsnpauiegxsvlzjjfjfbmyfqznrsmentxxkwsutwqovmtvitmtalrtzxohtfzvrlsnaksdkkotcdvyqrbdhkjcnmzhlktmbkfoazdqexixgkbrlbqvszgqeimcvdfvaarkmiryyjzxozlnkexpzhpcregwbppxaxtnhwnnogqtlhmrlsjztwtuqxvzahrgfigtnmunwthvfhmyhjbgohinimuvbztnhnpykbldewajzzyhmzqjzyuoyrxakyiqwomcypzzevxxtlmgajdsmjhowguowohumziigxxpnqxptqsfeluinurmyyjgdulrdvrzbzzycnhgkwkxzcszwbcmzgyhvokaocgiwrkpckeikvrehhrdgciaxfnwvrcdkzykzzkejziqopdlbmxvcjqdjxvmozutudgvrwvbuvceieednnyhrbrhcyychefxjudilkngbtlbivkywqtdapteduvxfqrmedowcmkewjvnvaytehqjpnjgyxygwwfgqrnhcllzjiamdqsuqocbvhhusvppwjipwwklplovoemvefpqaeanmzyegxwaxftwczcinikpjvtefamjtsrhkrdtpbwqpyyfppdpqgpmysjpgheqcvmxezpmghhhbrdijswvppupaaaukhvbputdltkqhvtxzivbfjqqayepxwrjnbeghlgodvbvvfundkotcczemqqdtqinfoqcujtigoqwqbyqjglgftkvfrwmlqvildiullzfzlcxxnbcvhlvgzwbwsqauakajpcnwkfgjoieivdgxuxvobhkllnuobxbjpyavkynlpkeaziymmrvbpavyzekqjzeoaoycmhlbzrumijavtajjclnmbgkhqxlzjerltdqivcsnctkpvjcereqputgodjacwubrlekozbaeequcpncutpnmnxwrqjnwjhcezmomwwzznwvwxfdtniixcwjuyvqopwzgwterqdzugoqxlaqrlmfcszfyergejlfxyuehzdzbpvqjajecntimolmnqtipowwxvrfgkppbqatsuovrkvvszwdtxbijstatmabcjrrdhrkbjqdsmxajcwepfmglydbwhwbxjdcijvggarvsazddvnnhionoupiveljozencrozsvqvwyzfybsetlwihdjbaidhmuoxrrxnthtaqiejbchvalysshbmlwnjpinbxcffqcodsmmxhowrpzwkkjkbqxphxxlrfwhkwlcgdnjrhbhnaxzqzpqmskklktovztpfhrmlwrzvdgdwliutexetjajgdidzayuqptoxijqcymreyvhazbdznhfpsetgoksmzodgpaxludnqurgpjohskexxwwiidknxrdxrilngeqshmxkpmrkhxwrtqvfkvrsfvkrgvkhafmqhdslckonwfeucvdfotklqadigbgyioufbbuhoeqgpvgbhdrckbunehulnzqlecwljutfjhlqsxnksqvosbpdghsbnuupmekyuaxicldavwdkxnhqosyfsukyqlvicqnlfnaylowfpewumukemkcgnmulmyyzsivdkbuhaflnavlbykpiiliqtjwmodkxoajxgudwdhbuuxpoiqmxqdfykvbkokelmmkkstbmwydkpthcfiwmjnkbutlxkfppncpophfutshcnsiyvjpalixjqinadwaowdbtwygtfraezrgadhqjwivtbhkzhljedaquoyxpajncszxbddmxrliydvhqpdfrdhdxsjarqpmhgrqryaqgnnmratxfprobkcdgewubeddlhehacwhswmvbwfrbywdfldyljrnnezwfacujndxmdokrbjdmgqisgulzpyofosiwnugrxpdofbsjjufxyrgvkwuqkwflqubrjwlphorpbeeahfwsdmtfwqiljbizvewbqamtjmvqbbzgxuvxqzaoxqntttfezvgmnxcdbnxqcnfazbmhnkiimqxzmgoodlenuoxqbjfwkerleizfqgqobyyxaxwldivsdicmzbckdxeetvkitudgdqlopxsxczypkszntkjhhtgzoogfxudpdagacjhfilwvdwkekvwuhekumubthrwuiegjkgntadffdrigasdxaachrqgrsmwkjbzdsnfdsxxvwyikjibmqexbhxqzakosbzcfscgzedscwitwuwtpvxuoeeaugtlixghxonwdyrcqgsldyjhkqigdoeyyysszrcquwwuzdufidlcpuqjaoinzilyzuaxpgderepngzqadvjujiexuhprrbhqgtnkyamiwsugmrelrcuvdbgfcmwcaagjgwwwxaockyzvdghzjpbpfislqldflifiwjwhfyslwxtbijdoyvfoukhjrbosthronmjphrpydqmhpppjwszyjefwaysykhovsousiosjntpjgogjpaypevphrbfbaoyasjpsjwhycqerfbgrbjjucvbzefoejakywvgnoazzssxzdnwqswaitztnaejmmcgtisvdkjkordilytmhswopbdcqgdwixovwkbmvveopszjljupofgmsevgvuwrtwodrqrdhwalxxvqhcxjfegqxfywseiropyoupngttztlvmyxdwhjxrsypmjwokqojeguzhqbwztzzrrpvamzvkhofjwqcxtkjbbpnrugcuhtnucailncaeawoevgmrsnhdrihbofuzxbhjztavkwukwupzhpmlptujukqbwulfzbxvkasigqzydehrrwxxnditarlzhtewpuvfgxeiitckhtdsmzzpxybjbtredfvvmfqkxslllpusbtzatemargopglokxqigieybsmbpssgdsxqdbjveasghcwqrkuavfipocgxebmbexukfgbffihlgjijfykdcngavoiinkqbpicsshsvzilbusfrugoidpqtfzqxwaerjtosldbmcpqbzdlocylyurgyzkscpmjmoxhhtbxygjadhexrgtjlvbcidbexbnplwstpeeqjiefojdrmggfoshqressbeuyzufozhyeeatvtjhkohyrhbtyafzvheawrcqkrdqcyioeckwmdxsndqrypboufwwmaeopmptslacjoipduitlwkxzecrftxzbalkmpejuumitlycofqmrurghnzntjmvzyactnecpiusvnypikbrfmhivoljdsmhjpzpuejxjxneastvxkqvghnqkbzzfeikcgupcmzmglisqxzakystoeyaxkebezwmxslypnkgcylmtvffxdbmhzvnwmmwwwfsmtqwnckjqdaqukjcfoihbdvhyvfaurtztrybcxvlxlyhukaaswasghfhhklginqjeloenvscvmrqydtxjfvojgplvzzysxozqpdkezvvexifrnbbvcdpjqfymrtegtwniufelgsusyfxyrwfkgadcnafylxsutsijacvkgwqpmxlxadtriynrqeaiptwxntraunmbpwahkoiavcggfehliksvyilffckjciajofornjkxkhzttzthdghthpmmorqcdmjlmtyczwprxnkmnudrlemqqhjhyacsjpzlcajqfovyuhvysidlpbnnlayaxbxbkxhurrctfrvpjuudyjuleizohzvekhptbhyrirxzujebakvyjjueawvwrhzknhldmncmlogdalgnuozkjxzoxujdrdiskpnrpttleszjdiaayggprrgzimzbqyxkgvqcodpjkkjwyltieotsllfltbalbwoiybwsrvwdcpihyfppbofaghijcyjqhgjkqqdurysjrdtrqogsrlcokqjtehexcdxclnpdbgvlnrfusbvmsghdhxcbpkwkrmwwuleyxlrpvhifamtrdtkjmemyzptfgnmzacfyuyrncpsvbelcmoajaazstcqkwwjnrmhiohetapcsgmpricpbffiacsszbzskyuchbpfaanimvffkuwloipbipwbyumeswphnexskrqmecmvsmirzvnvflprklzqnsrhnyxfbyaapprqwsjlgwzbmysgxscumrqpbgdwrkoodrnysbldbvwdhaygmsthbcdokudvvbkrirofldprkqrlfxephrfyezsfackudcyldunobisuacsaxoqjgxrsqemmykbuayhsbvemxltfbwuhwfqgpcubwrxdskblvcaqphwgyfhtgzgdkagppdttojxmcwkudijvgavemszdqcsnoaycysprjdrryxpmybcjjhsfmocvzddarqpckgezkpjitmtabpmqfcyhbkikvxikppuplcjyefcsslbpbdaypptdgouhboniqddunfvznwnxcetnngizganjwmzjvnzngauzruvclirppvyspgxjjmsrwfqstmbrcekevyqczrjxmpxjboemyibtmgtcbitnraqsjrenmnzwsmaxixumqdiotgaioegdmrefixdrlbkwyrmmyhohqrscyvxuvpbevxktabrsjovfaxxjpeddgjchjsqykzxmlxlzoyxfkkopqmejkirhmvagpzpeaoawezjlumpzwnxaizfegbgwijrtsapmtnebbbzuytgolfxchuiznbcnzntrjbkmhxgnblrpxupmvuegdvlhwdhphsixgzcsrdxxzrcqqbxkxlnmryeaimlomvveofrywhpxowcnkrzetzvmfhsuwfrvqcvdjthwopicbtogeapdxvbvzsrhbbtvdhzplwuawxptnlcamfalxblukoqakcumuyjydlasgjotclxxphjggtpoynjhoosxzgricrlckwfubzwgsfvfawsmaxfynintornhunlldhcxtbazppsezvorslcgmxbkaqxhurrxuizmbendtdfgzqhcqlmmapopqibviegyhiyvvaeqrsubznwlmnultmlsduobvdccwsiycejnycycimklujohovnjjdcceovgufquozwehodfbfgywcabevfesgtdjzhcdilnalctgdpdsxuhdheqenyedfaxzmynbmppvevylzgvrmjywxcsnnrqpntgfmbhrpievzvfutvqaortfulghuszviudvronhvtuwwjanbsmmwyjqtzhynsnxoikbwittsoyowhvaiqefurglrqascpqgkqwlskikuabznirxidiylpsyuubbpxmqilhmsavfmglxzroqrbkezlwwirdkrsgjwqtbxgrjgmelennxhoewuooqgwqsaalzkaodilmkxijopnwlzaacrdfmfobydgllzftrwxiwonxegtvurkzwkbupacsirnovdqrfwizpvimbhbqpvumthkjjgexgxtdzbahbgqpmjwqovpdnezqyuvybfditfvcowxlnrqazwcavlkohkwgubxtqnkhwdionmxkoffyxqeaetwnzybxwzowptcoebhoilptfjavrvjyygudxuoegdzgbzyakdezlxsdanyttcsivfmxuusfjktthmsydacofyyefbiovbloumtzjuikrwszfmibjjbqvrdkulhauahzjnqoantbuhbbnbnjcyabaakzxfattduapabifdxfioruzufrasxmdflkquyhperxuyyqaiplegsorfwxyjfhockesrawexaobvgwcmlmmpkzcjxciswiqrzfckhhgwejgutglwcgqvsjytiryfenvpaurzoukuphapkjfpwplfmpyswlwugqoxsvhassowewquradaekblyolycjbzlfxarczdjinjuqjleogtbacalcxcnzcfgjxjhoodwpountjuptifukojxmuvnbyczhmtixyqrukftwzcpsugkukzbsfdfkskpmmmclngahvokbrpxempmtlolrrfjdcgbcjgjhictyfaabmuwsjuqzyckfczrcavcqmfepofnvhmpqpddzugjkkotklkohyhzwcybtfjknmwpjchsqsoftechkwlthvhamcpfcmkojekhldfeacvucwyifdtbnthnnmelecmyqugtfhdqglvpcjxyznjkaqpjizlvqkuqhiulmswnewwahlsxwoeklbezqztkljtuyxxandpmfjivoeftvwughpxrzznigfgejnouslkseptkzkhtxehxtaddyrgnnzydzqvnmaqaiflsxciuesdghnimazierjgmmnmqwjivtrafldikstboypzexenfwlpibajkgqjjvqjnoggztizbbomnmphfkgaufrjitidkssdtmcqkjklqdqxoixjbzdktcliclsdkkjvidfldextvpizsskryorovihmdyclqhaugybltcklyhqqsqpyfeiqlrergnnzcqeisitlnfugedkkhulgkceouednwerwzcdutxrbbznjiibmolnliwuznqgdmghigzqtzfjzfggjfsgmkcmuizknyzznebctrsicjbxdqbehxxjnutiuirqmypdsinmespfumyfeaczeefdiygdgymeaclvtoyrpbsdmystlhxlwsdscwqnfwwdtemrgdwlkqwpchixrttliouykblnefghexjxzmpxgxdgveaelbkcemszfzgxndggnsmizvjkfbeaedycwwqmmipdwfrvouhlhbwmkdnwymfqzvucntbyvvximjxmmnorzdwsjztnnbmjbaaljorfoklfnkdsjrasswqozdskudyvqsootawwnkpetprqprtltaqgluxkcxlyjjhcziqjltxsjxwdhidgeuuxsghgomeshrwxukczqbnqunduymrmzyfvfzexqflwjhyobsuwtljxlgqemfnxdmorrutifghcpnqcrlfbkaitcycapnnbvigwlttuyltnfoquszxosxjusaquvmjknzitbxhyucspefxsnupdphzkrhtnzyrcogxxmqhqgpuoqgzrywhhbrebguquobjijajiseneovpexgpftivqyjvrntxyakbmvuwcwejlnkcwqiakbanyvpulcxshgwegjqrmvkhqmwnipgwsgdexeutlbkfnaeeubpjfojbanqgldoaeqimygloovxwvczvruxseenjilxpnvspdhewspavnaxibwqyhzlyioibghsfaupdomafcqkwevzqrieydoxiquyhijwpxkgasfbigsnvnmcrkybwbgfwtdnjxflkvokbshayobkrhvpxhbhxoqethdupnzykwcmucwdkkummrxrcanzaxalgjspxvrocuitxizrfjffeofvfzrjwglpkuicnsxpelhsvzynptjayddwuovzcghqnwzsvkydzflniqemrktzwgxgmntqeueqrxwepvopdcqnxjpksnyogeokfoaedgpknvceatdwxxvknjcddjlxemqztcccwsrttadebefbyixbjqequljeietstgshiavdsjvozypkroeeggvztluvuaglzhyffjsdlqzhbkxktwqebbyjnuxmfqzlwtgxzzqbtfyxldrcqxzgrkctlctfmpgzfkxdrzbcslvqovhwsueynqvqcjfggsuosuplvusgrmkpstzniqqywyjskddwtqxujbstmdiuhdzxhcphydwkmmwxogkmpwrligiwcgyhloqrhqifzmorjnlkqsadzafcstnkshwuazyfokdtkymftbabfllpzhoqfwgitwdurzldcscvbnsdrbhamelrpgotvrteyakvjaxivylnwbkfbolgubnajgydmeogxeatdatodpspwaqcojxctfeuqfuyiwfdizenioeqfgyperhdvqirfydwuiemcquvxqxifmczbzhkqjyxnltahmgwdjzhfljdegksprzgnhzuqvjnezigekyhrlmbijixassmmvbgvqanhicapvlapyfgskiuhjcilxkkvkvjpbyyocmndzjwwhisvqbaobjbviyynqgufvfygmxxdsvgiktnoxeeormsmebpdyrjzvazelinunphefgqyehnhrebxxwnvfahuycmiijmnqhogjjxslcocwicwbmbcxekjavklvtuwajrlquohoaqncinwuvtozjbiydcdmjgkikfmgmnvausdybljrjnkiuqtfpsxwuhwntfumrhlystnmqstguezciyrfbpjuqzwkcfppggbajtverwkkstencphhjipmnjsiskvopytwtjeqovanahzrfhlxipyuyhxoywfuwrepowrcyzasgcqamimpwkgluixpvktjkusjxqecvfbsghfbkyvuieuayqoriqatngqwsnesbiltdiaprfnctphnbeaatikxauzenikzddzkcnekdopravxnkkdhtrjewngucgygpfbfccqqtvoczgwdleorkhwnrtnpqajkctidrqmsthdupwfdwiqhgbudwpxuqxmynycduixpstbnjyehdpibbrsvdtefyeykcrfjhppvtviuffjehirryodznbavwaftipsllqzwydmnlyqjbmdlqsppxafmtfkjngmvgkpyyguljrfhvrtamxhyzoswpaaplcyadoztrbsacqieuexmqenuqdbeoukykqmavpjpbruckykbhpxumeuwdlisublxcjzskhbcdhebizlwsklcinkpaqeshqkeblckrhgzznsjxwzvkuyvjymqnsxyjfkqrtfupambfzqkoxvpniyoufwflrvoafgwyqrymkxokhcdlzueqixkapevkfjsqnwhqznikiktzwvtvkkffvhjzzdqbfnbxwybasfpknwsfobzcdlhxoxuiwrucsluftkfgdrfqshuysjgitpkfxtgcbfntxqspsrzdhumuxrsgepmutihmtlsakbucnueaxytonglifstcarfhftqkpgexntkfcxpeivnxzmxivzraobmjkuqcqhdqxlfncrdwdecnvihmsuiykktgxeupqjebyornulrlnjtvzjcrqvhaiutqptvrnunhyqkyunokuyfvuhndfcfogfrdydeljrnpacmnbmkuhfxiweajfszpkltxcbfddxxdsmuwlojomyegpbydnslontnuqvgflvthaeocvryopminvucjwyyaqbmeaslwdinulmtrkhfzeljnoajtbcbnrtaytxevzvddsavvsjcogkacixsxbpjthqcazummncpycgjcnrkevhifslirvgczkmsomludnlaczpwmldamjmmoudajotoexeigbnngpnpwssbzftamhlzeumsehnnbgsniwumzeytcwuxyctwiivsablbtwnodxhfidhdrhnbcodbdmgayaftcqqtbgivlpunnrexuzpgkjaqzrqdegkslfthcwekrzhamoskvkwiaauuguuvttteumuzvxjvnsoiqkkgcuevfztywlnjmkqzdmuncgflszkziykwcrxehbmvsisydhpejdwelqjhctqltkvftgltjkswzmfmhmtnrtqgfzmypetqcnymplazrxhtqegxtyuumgufeksbnkfgikjkufvhxhbjwyyilimrvafbsiqrvlxndorgatqknmpunlpphxyfazwklktjupxolbywlhrkurwoqigoazsubhirioukdxowiubxjisplzebhohfydkbasgvwpmnxxeeprlzvxuxievjjndqcwcbgyytqklzafawuvcwhfwcpqifemblrdydfztgmddpbzyqgmyqiovyprcazhbuakvaditfnsqhfivyfdwkcbmdbaxfcrchqcfcjjuerhlbnynzxnalmvzdjqmbmpivdqvbhdglisclawlvsouucfnyobmomrsmkjeziigoteloeoyxgjjgcatbqkmofrmcebsppfqesbiuznjpfsllgffmcfsdicwlhujwusvqtmrccxdjobayvqlmzqtvsmgeufnegtrfcpumcwlxlppjajwwgrkalswbtpllhvnddcvgbcnsrduwyhzxelyrcnlvayrbtwlpekkjocqsdlliwqhqnlupmbqancnweyosxollihjxgrsayscjcegkfvhchlsraxrwryvzoymergjmkyvsdvxezwlepqywdhxzbkvqugwewysmgutknchkkvpejnhtodepxphjowajbumothkabkaypqerhfijfzcpoqsddyzjnwszbmsfswmeumoyqgnknsbfwzawfyfjjqtextnuukktkzprdvygncqahviqpgrrzxlldfcofdtjvcccgeczppsdhomtuyzhvdfjmlhzbvikdmjhidpkqgargwtcqdoyudlpofsefeikaudtmwzlwfxvlibzawexirdvggjwgobspbeagdnlekboqxqqcjzbipnywnmxuvgzkrrewmsxfdyoaersjarsdzvdyxalodiwcmokokcfrjdkpmfiikrqfnbfzuuwcfvnuaypocxpksccspgabuexysjgfjovsmhhpsdhmahlebvnzxoujjeovanksfevbbfbijbntekylytwojmcrxfsnwiyjivgonxnthfycdgqkyttzuqwigcwmzfbvraworqbqvzpdfdxrnqksootizblvagzamrrrurpwdqarcickghwqyhlqlusmeqysqdpbgqnpjiyrtkflpxkkyjhdgsfcqmviicodpobzlubrpxgtsczvkphkenzwkvqqkgpfoztjcbmnpgqdfgvhfjezefapjtkopjdywoaduhwrrpfcvwqwhjgcfgizslbnsjmjyrzefphlxqtuklpdwwclsmmncysybdxixepcbejxbzstsxyjbnljclwmewrogyscnmwvlioqyzcivilbjdlcrlihsbkeqdguhwpcfkbvkgqtjkyeodzcalbrknzjaytlnigtkuqqfhthvxgjmcpmqrbwkknxmjvravtzocxvcdvwgynxxtglpkwnhhrmtpfeazmfnjxtrfxxacghxhrkbypxweuqtenjsarktqmyffyeufzyertdlkjgsjqupvckycdtsitkogkmjxlscbmvvfgarcjsbneascnlnplmnavjzzkoubqpnzqfjboqqoxvrnjdvqexchivrgzdruqxnvrbrehufrprtjxvmvhwwfimbqjtefytzkzugiydqsrvucsysjpvsgveiicmmkrvbgipsbafjadwqytvxgpzqaidkzhlwomgsscntvmhciacijhhkbhtxdignsmocskdqjkmuayhzpnfrgsbwgojzwekaytoybxorzaqtasiftppimvliizitpwqqefvezjrwaszymtkyubyjljninuwesetflwgajvanezymxafurjgxndfzzdgqoxqtwwjaqwpfbsnjevouspsvflbuwjfywftocmtyptrotvzlscxsfjkdzhfocsnzwijzdwhupdjdofapozcdtiltqbeyniyrhxadcuzwsawcqtjudhdqeomfauieucklhjqrsciwfnvxvpflytjqgblkpzuilluutmsyicldpaaftjviapdwxsgxvhqwkumntmamwruaswuvvtlqswygouorvtwpocouokfkqxkujnbyllxslylruuteauitplfccocxzbqxrfsyrjyyhgompjnbpqcazvaphwuccjtfqnrjnwurhtigjdkpadbhuyacvijytpoehqvnpvmritalfzlkqfngxzzafoyzedxkpxyoauzwjftypimevtfaeiakexnyombdareafstbbzeeojmewjnifukcwklterifrqxxwoedtdwazovmcshzmrklhfgcsonkhvmvdzshlrjckbjhgzudtwcdnvvfidumhsgoqlnzbrhusntajpiiaknhtdlgnlydvehqzzimjznurlqpbkswflwsgkkjbwohjccpawdorihndutdtruogmmajmbdeulvqfoltucyclyrjjbnelvtklfgfcwxornltbpldwofbdvyeqinvevlsdrwfgqasqxtgvyfxwlykodjpxrcemcqdijowwsagobonrmolmlqtvedjuqsnqfotsceenvwtxrbvwdevvoxitwgrwefoabyjppcirkdodmjymwzcnqyhfhbqtreeozslizljsdlzujtmfoezcupgbwktbkodxvnfgxjneyxdwtpmszzhxgoulqlnzkhaojdxqiuvptydudqvrizhqzzjkhboeiqfywerlmhenyaomccrhodlsqstkrrqfapfyxrkbxnjpnunmhpbmubhaaaqqiqsatyflxkoyrorkjixaknnnlrksozpphhlkjqliurdkysjrzvrwqfazgzwdjbowinqwqkjgufynpopsvhwkgrnsevwsculrekahttsbrjrtqrjscsvyxdcldwddgwzcigzupnibjitsuhyvjwcueiusgtdotfmavfrfdcwrrotgfxygmzciiouckviijqgewqrlkqadunmweeygoafqarpvvettgchymhamtbmclunmlelgsfmampwtsndypibzbmkeplthmsxeoyobsxlcwscyfraxvuddqzgfxosgmdllwoqikknhamflytnmvmndhqbjxtbitymvvkpgtynmjhtxwrlnorfbysqgkugmdxoqpfxmgmyjrenbcszlbylgszyrlardzwdmyjyhphvwglnrpprkvysnyyzraxzvoudeujkuvptcdzojwvrqyldltijtvwrcwghuelvjzzlgcvinjsvhyatscboapklygzqyehccddvewwyifkhevqasdlbhkxtaixpjppcpulijxrofyggfphjqbjosdpyoklhtsnjmkdaggmrljkkzxnsrdsadzpghspexnisptpwrbikhsgrchkyqqcfkszogirxjweuplmyezxjwgzedszqzsiwjqkhbbexopdopntteafoiagyaubvqoeljeodajwkpsugwmlhclxhrlziuektfduiixtyjrhdudkwelrtobvhktabxdauvdatjetremflwzjevolydepiimlyzyuunjkcmhhxzjgoybfynfzhlqabxzvcjdsuxhfjfsuiarceilnuegnhwrdlwmzggqgragcygbdxfbndmebcqvdktkqmimcobtjyqdkouclfiygtinlrnchhwvcmjhdsmgpzylkuzkqxlmeyirjhdyqkdzfngwypaesmactqqxpinqhpcgzfwiwtenawraplgdrwxtfrfxzgfiygqzcmvawpyubtedqzmmplpwwmzavjnoxvamydneohmaclfvepoivlgmmhqnyjghekpniilrvqzyrwbrhpyaehgeluhdtfkmqyvvswervviufypqjwptdgqxeudiwhowhehdynzreccrnwulahxulfnqczdicvfodfacwmzabozdpranpokyvhsdivongnuuvjrhognmfpenlvzuvivhcqvvsixtdgnqdafmqkrugulilpnwsyoxgknnymxdifwepedavfoolawbyntkfijolctscnncyyqofqcciofroksqzwsxukeyvbnfaguvgbykjadhkidpcmppgmwqejpzplpohbpoggqapzfmvnclksikcniluvcgzzralwdghjlvfdtbzuhvfqahmzqwvnzzhlqbbjjsyerleihiilgseqbngwjwmststmjulyxuzysxzxpmmkmfokcugndtqwejnrvngqwkteniabhmeglzdnojesyczamyntijlgwavqkpajcoxezgbgrcyrvrdehrhwkzybnktjtidnatshcsuigiwuvhaehafghsvgyjbazdbmabxqbihxbramwneprffjwqfvigjcsbrzmdouycflaqvmaguurbhgpxhgeicqmoktesqmwbzjjodwyshjcagpypgedmvgvywomgknacpkrpbykrwjkvxzqtmuaaubwhtgfjzuashqvkkftezxuuhqdylgnszpcyhiytrpbirhlsvuludvrqtdbehiqrwbvatyvkwkctkasjaiwovmiegqnsdrqdwkuklnftqvpmxrslnpqmzgxyckrezfhqjwnihvtbewvngwnhzzoktbxzsjomtmvrbpotteqanuwbhyovypzlqzbeszojxrytjiaesshsjgcstoictzpsanejnfwdhmfbinirxgxspgvzxnnxvuibdawaddjigsxionpojlstlngklnfpydzvulfndxmlydltedbkdsyxbthsouoinpaffbxjymjokpkhywhnquppjozrkobxbsrsmmlsrhbqrqxfolwylcayljyfubgrkpdwrmtpydntkmbvjaayehcwxwcjyfgtkvcwpkjnmmnksuybwyrvedmfipltjucwxedpetjiqxrceruspbgfzlvswxojdmrcgzdnyrcxnxaffnxgagblxeghcyjtwnuixrpfusrrnikrjyxynnwcdafxitmfdazhxdedpvxwgsyssghdojfmmpkjlobnhtfkidwupbgydpdxtoscslzqvxyiraegoonxoycgnujudnokfaadjuobeeszlpgalaqaqnepbzidodzsnpunrezuljkjrbtrfcaykgyosygchwxtsbldrmijouseirpxoehwmrwshtmcpxopelbjwnnuanlznggbodspojdorkyjjcqvkgizhrasahulmwocudohrbtvbtaymfycyonxulntlwdjdjwrevvvtbtjqzjovjvvolljcrrsnwgohtwisybblruhgrtxeyhpwiybhrepeqfnkkpsjwvitnqklgpaanvcuszkcomgqtwpwzhtcgawbjcgakcsyxifjmxqswpkeerkvwybxzqjdtbprqekrdaltdhwtpcdfnhvmefyvgscwgnkresvsapjsjtzvaycfuqszbuvhhgnamxhexbfwghbsdetybjamidwrguzshdmrosuxofhigzmgngvpqucqrglkjiqjgfolswqamenykqsfxpghonfufcbmrbatonpjqvjpkfnfkiayrrnhuwccasswqnsgmrypwjdbvaamwlrauplrzjctuuumyxnrhmzpscvxjmnuwkcwwbljbrkcykynstevourmfixegcwedtaxfnbcfnceapkpaqjkuwgqlkehisrurepzspqtaoseigzromfnbzwhjbsdvxbiqzdwlxryfgbtissnwbmrrwbiqgaotofgwbltwimwsdnlykaudfwcijcndgntlwqqujmdnepzbafwebfgdyaysdgbqzttqtvabtxpqshzfzlrztytomxbnimxqznazipcuojvhnqqyyshqdvgkuycbwppqlccifuflyannhglgqozjoiipqwiiesebknbzvmffafadkivtcdasqyxlhljuyjzqssfvmvbifkqujtpyqyhoptasfuezqxnemdpzgzmbsjgfpvbmewihzvrmntufuvpblafbrplflyhlrjgsjmxwqzmczcgubzwwfonmisxyryhefufqacdhlwaejxaxfutvzwtqsgspaxcegjlyrgakpucimrmbhkcqkkehxjdctkjoahtvvanpenyaabcvssnimzodesrphigkbnswgcjkcmloxqkrdzwgwcukuzbisdxaibdcsrqhlcvelnmxzcfidmmeiywybajjwnkrxopevdhzdndkisuwjaotmwvajazdenzjgskhnjfegypkfdlezsqvcqvfxcwtpabwzirtinbuitmocwuqirstmugrhlrdmrmdvmmfjwvbdzquwcnjedipzpoyiwktbxqlczshofztkyouioswivalcxnmyjnkilbijhmmgywosmluyulmkpukxbrmojcbnglrnofgvszvlofvrttqflzetorzkuizytwppqiwdppghkpomlspzxkjcmzyismakxyncdsqsxyplrxabwbyfqxqqvmwdhjvcxrkzuureptdipfmyfebjyxjijucehrrbpqlkureespcygcacyrzeuhrlydeeahvgzgrujgpocdclezhvluzgfakzmfbuliqfhbfnbycqiybpslhfdjrvcuwrfwbgvquehrnpnlzpusqggudufnjalfhvzvqawfscafvhjsagnxaydqscvjqcfkbuevpwosuwtwwlriokrcwwapcqmdokrfiegyztfxkrizbmcytidpphgaylmeijgtjrakmzkarczgoawicpsodgifeebjnumrlgeuoklqyewqojohabrpheraxswzsansltdurqlmrfjvynbximgckmdzvwfluvryzwcvcyvsqrjeewqkuccfdyoodmidnieluhqoyxikpwtcdpadqyqckxtzlccdvhrebmssxevpyrnfzpexqtbdyauewbgrddojeyqrnspxaxwjpslaumwosradmgzonjfdcpcojiyydzvjlznzvctrztohwsyttrglthpoegxjyncfkrnjgixmqtxnaaomuknxdetiaayiogkhbqazxdjpmtcgbkrveizmakvfxjfwepolebthvpvegtkpnqfgzgjddshwqbnjdzxujclqkisclrkssgowvqwvqfhblqwioamijsksxyzylajmmassqahjlyaodatocxbhhoqkogbrbssjetoziccqxesgusljjbdzvcpaizwwnioixiedcemcapisvmddkbgtcdzfkbfunbdpfpiyklahownttyjyscmsnmmznmmbbiippqhpfzefptpsfiukarvaiizxxunbrhbjhddtcslpkcgbejahoulcuvqnkvsvklimveuqbtbjqfhwilomjbstscmsizbywdjizhhmqzqrfnppikyvfgqehdnczmnjxdrkhjkhcrlnrhqpokezrusuyhgfxwrxrdgbtyllsetuieuqaijychyvjrwiqdhhfopvtazmwlupbzpqndgcqgeqecgtajscicnbsbiymuqpychzwqnsamfekuhoovfnsxbteuxntbwttoudowjtiyoykgucsfwicqdjdhfpbfxrfostcshybjdyhopvlxmzwfqkohisuoyvgzwmnuojjozziqskkgpfalekogtzrdaqmjhjhmsuakhyhqttwqynexqyxuqzyfbvrgrgytwpwmsnrpgrypxvfovkeltgmbzcehrmnxjwbmkvcwijoldwpelklpdqvhpflbjqbthepoonurupcptxrenqoglzvrelejvpjnmdbiyuebhuecbdwcjvdxfvwwabaxjrmlwmgvnbswweahqcyrdhpaibwhphgqjnyzkbxywcpoloehkghhycwghgynjjcgdbiodeggysmzawrwahprdngnfyzdyemfmlsnxhoubzgziscirfuivtscqhoihzsudxcrmdedhvupjgifjujjatjibnqsmzueyynwbqhqciukewrcctqygqhtvbpdkjtnakatypqoakvtqpxrfcqkffvtgdknwbdzktppyoeidurexyiuorpptubafiatyivpnvzgwyacgwdfmbqjszinzyuvkvnqtmervegplmblceojzctrzodaijtjbdrfckszwqfesubollgwocmkumgmjkswsbtqnfccokyjplutrxfirdmeudakuxzctxxmpnqekovtjzilkdunzfcmwbgswkximaxzwylcduuebsnwrldfcawrecmomavizdyjiuuapnyzyjijerguecsjvgeluwmemraxtgpyrvtxhsbmhkpnjovbzodvsttuuzlaohusicgxybnxexbujolmahvkocdbgzhevnsatulxunvverlzuiermbypbstradydbtoboybqrdjifjjgtenyamsturswyneqrraibzglbtfyvitlcusejbgdxibiersqajnmkqwtxmglxqlozfrjjhhrmwrtvrknlizhevsrfpzezxkfwiknxpdjwkezdeapefghqueljjdttjwewveocsosnbqfapsogunoaonfwlegyahdsiluxjnxhowsbazetgnpwrrmqnlznblnyaxenszishhstaarnhcjnkjykthdxtzgixpeylnscgfkfthurtygmewbwddkbhehrlpcwqlqtxfocevunmfpmjrefnfxjaugrbbzygmvrlvxgpqgydibzbvuzsikosfcrrwkyszbonayuijveopurxfghvketsznpcfuysoyzooxwlzorzwcnycuxflanibgbslykkehtvbcrymsxyyyxwehcdzbssrpkamropszwohybazuxkzifrpsrnoacgcgkqzztijufikiluqpkcoiuztiltgyzwpsoafnhgoodfuytosrokijxhpexykyabvdwuxumyakeridmqqwutwsdwaywjobilewrhunlchenhqltcdmtpjbphmwmurfqisrxnkgpqnmnkzyayvoyofhifviunglsfkzuvkpsxxlgjanbmuguapojlkgurwqztluiynkmznqkkcyzlthjajdhvdzbilwubejakecvultpjbozqxvjvvjxgbsokpbizsrqskokscigrtuzvvcvacbwvvgvrvdihjvdaazhftoflsbqwcpiljbiavtnkhmpqrrzwevpyessdncmtvpajmereacmpeyxgfqjvwvuicgviynweepgzvmerjrzxcelnrzhwqhxwkmvedrxkerqtxjazhzpdnwdvupsrpqzjytwuckjiyrrajbzfzxpegihcxuwmrurvmcotgxarfgexqjgdqqzjbtfpbfoqmeokajjsgcxffebqfdbvupsjycwklaxuirkxdpblnwtfkrgxbrnmkphmrqejytvtybgfiofvvukkodajeqaoqlxlwgpyppmzfgcgrgrimoeecuhdzoezyazuiiswpddqvudijjmgbfyddmxgzmruyrngebwrgvmdigkdrbtvdlgtstvctnusicjiywmbvswbjxovrbbzeozzrlwpybkzwbxfkqhcoqlujachzgnhmzffjomjsibshhfhzwwgmptlvmoxjasmuntvdcreghcinvobfyfcbirfgvlakvpizswqanqhkdjgqfxcunactisevautxxbfriznucbzgyudkzzkpnqodgowwezoudekonclzmpvldpwntijfvhqidhfflemgoynaedcofbvorackvxisdhwdqmzjoutcbnbbpqemauybmflazkgxpoetysatydmmwlbilukrwpodjbmsrwkcftyzorjbiwlqxkcbtmdqwdlwhhqqryvqyoogklgbldipbkgeebaikdeppqkuolsclnhnsezrxaothowkbqsnkbgtgajflklisslhabaaehgjxhfazqafcajyjbbreduwkhmvictjmrujkvbkudnspndndazfptrhgpnvaxjtfjwsvqtodkjegnuiukggjhtwpvyvxbnwutiljdvqcwczqlpgtsrfuqvndmsvhllkrkycwvobzzohiqnukyykhbkbtffoqslgczprnizaxsxcbpkgtlpasdfxkojxkwazptynqlnhpxwsqyfnjaeifhwqfieqkqwexgehlluszquwbppqofhzmtsgjelcglxufebykqazjvkxohkcauxyacqetclggeuwcsggsrjecvworizfglgzgmfvuemmulwnzerpwicftnwkcqvtiubiyvwogfpvezxgddxzkhprtrsvbkcjqpdlhobhfhcgzapkvllixopxuzxyyesrtcnkxxdjchrbidbugxjmgcjewpxcrmepqauytrqyblbjfppokkernnedklunbkpqfwicwxjwamdjvjskhthxrywilawtlhvmdqhxychvmqswjiuhdebihupioqklibixwlsfwfpkqmyxljkrzsigyfylwxkqzjmwakggyvqlwtmminwcpajatetpvqbgauwbflzefonjbcildpngmogqotouqlaaseivngwppyultodaivtbgmoeylguigzwgzshszfbzudvgpptfybqelhwobgesgfrsqncvatvgwwtefqviajmvbynzphqefaxauktbgmhqeiizenjgflwzczvhgvqohmzlaspuiettcghuzzwuxijkvkkjpyhqbnzztqionxpylqwufqslzfjjqawagobvlqdkglomkqdteqzaihgkyfelrymwdrasdztlyipmdbbbyjavosccipsrgjnsodfcrpflptcpbddskzcpjifoijdfjlmxtiqfzykbcqpcfouzjwcnjgablnlnzrmzomebjsyxdwyzjvjnipsuknolygdfjvszfmddnsohagsdigbgblyanedtxduwbzqjufmpirlrlsesghblcxofjcveddzspwkneygtdhuufgiucnvrmihabroruaiwdfjxnhgayxxupulsuymkrwfrrjqnbnleennramfbzgtlfuoaagiylptisdyqiqqhrldreiqxinhttcxnxamszjgrexzlcyttkqengaiafqqoezrxeugbwwnvjqszhdakynbgqpkvbabcintrtyrwbnrmnhpytdqadjbasuubghoymqngmujbwibkltddimcjrxdrnsmvzacowhubfvlnugjzyhpoaytqqifwbqhjoklqnbekovuszzxcqeggstiolynjpirfpjykcjycdthbueyhfsfilassvstnnryfcdmixgstvpqwijhkabzzjzccccgnoyzqxgdoadhtblxkxtdzbobhzuiqiexnrbecvdnaekdfcnoafoqkxkhbxbocabpdsfgliixugtvljogrulavetflqovpqjxzoakklqficdaxocsnwmcezqyqjrqnkpnqcyzxsdmvsvoptpoxoghiuxbrzqwyapqsvteqvkoggujboyvjoffbtimxywvbyiklxxwqtqrzdzvwljdvzmeovafkxtgktxhqtuqvddxfnaqzntlcyshocbuitbpaycvgfydnntmurhcqlsnqadhiquxrahecwewbkakusadmpxauckrgypeekdbejxfbbubygafysbnqeploctlehvvsgowujbzlhpyolscgnmblwwowhsgjsbeiyuybxgyzvtefumaexsyiikdxpmjylayxuhhzbbhjhtyazlojsqgrwvwrggppqgsdjyxqnqkkykzsomodkgwzfcfywlwdonzkvrubmmfyogezaygztuejkmfpibasivzamvhfevxgfhzuqxbqqekqlqgsiuodcgtmppypjewqugrnhvzchdzllaiwdmsugrtmoggehdmxwnchtgpzhsqxwnxzwmnkvrswazihdutecwpdidrjwxsmvhrzcukqshuuvgumlddevexijwdyixpmkfqdnasubffdipnjzlldormmbjpxsosfvvoyiviomupxlheefclwuwyaipzvpcytpyitagjkjfnwvktxwxcfkuhlvntzivtgjrwfoypbbxcfgdslgpvlbnbnnsnrkwqafibibfbkdjuocrmxvmppgjllevxgwhfguphpcziblfelbixvoifrwexwddrskyoelnperpgfsrvdqirjrapecckgqlwvmewwwkpwzrwtislynrzahvfkyzgpgruoqacikhwpphtwhmulrdwztaykonqdoixjcnyibltdwpsvbyvhigfhntzdaxibcgjjmfxdfbtwifphanfjacimatioeejztduqobnpgfapacxbuhdoxqaamjhyoawzanjgbqvmyfkoyvcufushfrinqpavsiqsgfsaagoaitqffpvzfhuwacyyiapzjecuhutfvxbfmtdzdmwkxkcgnhzcbnykywglyosyhtgezborcibppeejtixafnsesznzlksdqhrayaqxndnwwhfywphdghuvoyttobkyledezfedcicccqgpmvemykordjubuiudouaswksudbnlkuwgnilgngjqkqqjtyhccnzstcjqhbjvngtbbvnjbziterlnpzoizoxgptofluabfdojmhvesdynbaxueehlgfsmzzpdkgayaycbqoxsaiessvcqijgcguxtbenftdculqvoebwlizfjxhohdgzwckyqtjxbpeqryjzmpaorqnnnsaaswwpfsaornmyvgnfmcyyawikywoxdkiqqxegsvgntglyxprxuyvgzlwqtohthjvrblzitsjkzpwlficxdlwxqwydwecmuouiprjtwwelsycwmrasqdrqjypotmnrtvicxtbqqjbzywppdekokcwkptuwobhlqlaxgugpvobnwqpxuqexctrkcpxqdtovaydyzipfhwtshatbidwfswsejvfpenksgbqibgfxpddmuiyeedtuldtbtokkurzedtlvnlwmrghqtlgdalwyuhaejkhjdcdhabrrzslcnrkhtchelhztgkgzucfqjsehwoijlkpxniltollniexrrdoynwhgzyjstwedvxlzbbnaphrdweviqtgxadtfyaytmwtlqhvixkrwssdvumhkpiyrlaxoaeotsjfmyfusptyfboirjcmbzfsacbvnfwxakwihqgoldhzkjxongeijxocofptdwrioslvjsvxehkkqlwslxzkkgecjzvsszwjvivirhwydseonpwwybdsqypdvvtyjfvcqkyrietlxhpdxahjwlwzbwknctqwcxgpwhntvprggyiueetoheoecwunbagbhttjjvnjentjeaoijyzwaomorkziynczkajvgbyzrpceyxaimgewetyqxynsfycnfgyntayqrjvnmhpyqqqawbcubergnwjehacjujsayvyihdvrbojkokyyhxhptroazkxvekeemoeuszfahoukkhnpbyhpfiswglllhtmrzkxitwjdibzymkgszxmyeepssyngzjonrarefqvcyvgglibqbmpxrzhouhhevbxlcmnfowfyztmdlyujfnqxaqkklprpthmgmzjcvizdtwyizpglcvtwfuvxlwxzrzvxqowgbgomvqhoqotcvljxepvknugzyvtmqbxggpshgkjmhcdcesxsrxigdolkyioxxrazrnkysbcmlztjofpfgutjnrxbvsahdpcxyzpazhctzupndqmweodezjmigyivhaqlfdgntkvbwfgflkrgpfeluuprnwrbgkkelpesfdwsitlsuclqiesjcxubuidllcabhgvrfgmhcbacbbsimstacodjpzrtngaycyctoeiwbukjwavaxwhuqplldettwdkmhjhksqnisjfaioqkmczbwtwdgehripqqddoratfdvqgmbfqmcpwdmfgnxylimgrizpcieznxufhwnyygcssktdzcsptmjjtnhtlyqectwhlogpwwxolqikohtoapvwvmcdqrjhsapjlgchqinquqrrjxxqibhzkvjuptbmkvnzikpfbmkfzckgjobkombqcesfroayvjkxbukgexgmosbwdwtbaxxieltfqhicvokdccuuhohetsuoolhdykizkyacjqgvphqorxzcmwfjbfshmzdhzghvwfzwziblyhembibntjgrfendnsmmtevjydqgnuhplpmfjetpdpzsfoozqsjvisstvweemgmbxtxaqxpjrlsttksfnzudalnwmayxjtftxwqzoudqppqpyrryiyofzeifemtflaunxehputmuqhoessjjvokcrwwswkgqssqyumyvvlhivmnvtqqjwsqetmocvyrrkogvgmzgaeurgbtjswlnpvcqkttyasxgqoptgssxavnfsxedbdxytrsxfvnbhpvqvpvjkplxrlcmmspxlmuvrtspjbkjhvqtigysevfuubsbhroirakumkjqrgclayiqmmwoqcqzryyhijyqucaudzldirjmbvkypfmiqirovqfflajialueaviyrlaceybpawhfdsanlhrsbxfpiuoevpxdhamnstwciqpvclextojawukpdemgkenusfbcffvnfeutvnurpzqxbhijyyuiofupoxbnqyjyqgscnimhmtwoydbednlranemedabuzzjgikwjqmadmkmqwhmbldrdxqstgjjhcgqyipvswtojbvsvcrftdubjsaiyeahmcyctxhknjxomeqdsulegsxfzifqjzjfmrunzyiqhsxppfvxibkcpsvtizcytvgfxkkmdmznatstrdhaooyctvvrivrziqcdrvqcbdebhoyptiwkqdmffxwdncwjcdinchveeqqxsmedgczikgmyipmfuztqrinkvymipugctxdbjabnzkcsipxwjbuzegqglfdrryctjcyabqigajshktaninlsieyzdzrehvhrvoxtjlflepqjwygadfeqcpevoyalpjfrjlyvzbantmqzhpwbpggvzaqfvnziyzelcrjgxkjzszbsxaglagxuinwgeeklfbyolqspzqzkvovfzobislucyhcurvfigowmalxjluamazibphoqexqeijaimsrhlwntrxikanapjjtsyjboqxsujswdjrabdpiznkbiudrgqyiawwojyyimfnljmmuidvcogmhwlgmiilysfsdsnomotobguckejrnzugukbkffierrapdiuleytmgxrjayiizvvejmgmndzdfctyepbtjdvbcddzkjcbpfgzgnknqduvvvovzblrntegyfjlvwrwtoffvmrjjacwzrvkatkcmygoldlhhipqjkopufdaltdftmtoitwrwjbshuxbfjapwfojdxjqnyyhaapwxeibfoxeouokasafoyqednxegmelhvpbifzxeorgbcddvqiyjmizalxnnmankosgcanwwsvitaqyxsiexgnjbcfjjnangselgkmfooglcvmbekulnzzjeifexmzunsvwrcknfeakdpulrsjvknfbvniwpzkorwpqbzonlrlhypgxyaobsnlfdbnmwlftpqaexlvzzqvcuqrwvntusqduomrmzsbuyffimdgfdlsnbxvdpimawlxjnmnueclllhqvdrpiujceuexdjtddgfhmsygvmwclfxjrjsnxwoebaewsqzsdixsbvcqwwvevnzfiuftvkpjigeoicmhphgpvilctpigqtuzynlwpjsuvnmgkbseeqcnffhnquxhiqawdtyhgtssrjrtowarwcsxwsltfjwzvksfnvyuirfkgbeucazzyhjhjedaxugrxgskazhkxjiyjycdsdbioffkrfzuakcutaxegbyeeizggsaezfykzzejyjpboykjioelptjydqejtuzmodhmefpvybiqgkaidtgksixhlsktlzccfaispnoxdrfyiwuibebkewrnqdivnydboeknctgnxjdsaiuhynrnidejvibfzxscaoprdrssfcrkslvfwamhfgohnshyunnprmpcqznkpxerfrxsgngqpqcaasznxljhkrvunhsvinichhkvmrptvcmpqckhahqjkodqujphkxppmwqndzgiathonhdotqcynaapkqdigsmmtaeduuyesckurbybqqtezelvulvoksyomofpskoqgjoosuegwncbqzdyuqysjjxugcasaptlnzahppbpwwtaykxynnwcfvfsiipuoxwpfffiysdfdwuhtjtxpdtghlgkoopfiovdmkwxwjrbvkbadiwyifxbpxpamxiqjgjidcfsqsnpzlbwsrxgggnfiafiliekrdktcnyosxblvwihxvijbffhulcsoytpdvezlnwfuagxgvlavpadzcbgzkqgrjkimftmisqyhsxvbesnjkfxjmovbrqjhidfvunbookbogropzulnpitisnivjynfktcxcxcvtnzimmpydrryasvuzhxiqqbmjntqwidfgdphctjjvsinkqtpziydcenwdmvvmgjoksrhrcpqxsiciyylrayoastoqjvczzrepfuthtlpsegbxghqiuujowqhvnsygkoqlwueslywyrhzbmutqxybkicupeycirqsphuuokizzxqsninfijcrjoxpmlvqghpdnogrrkcgnbllwddnjpvdyykrruqgkhgnhpenllgfwkxnmpwbyapfesiqqxipowqdvhwoovaqdbtyigaatqqkmbhztwmueiewxqrrxyuqkvfnckbhrzlgswmgqapaqnyknsvlgzvamgmqefvwluvdvvnyhgebacuzowpfwdinpxhbakinzuxofszhghsvqjfzxwgbbkjupwzhrmfwgvjfgsxesxmnyngpzskbnkuatfjuimxudkxmfolkemqbhsdwmygxylhcwmyjmjnblvbdcfcyjutmubtwwvizbwkkumutjtqmgmtnzdrcpvfzdjrkvvtapavxxoieounzgcgmbpthikhslabjrbdbbacyzqrdivwkfnrdbwkamqceuadnolybytqseemaecymsrnfzjfalennmdggnhtptzicbliyffwexqegdyquekfeujydoiotghfvoxukrznavrecuwiksvccozmqttniqutpovpxzxlcqlqfeiltesdfpkjttvphxthtgoygmyduuzgojqripicvdqsegsnhxotrlktwmvhfqgygjfarpqmfnafuatwawhayxmtsdzbfqqsufwzkjimuvfnpvutisqkziupqmhdpaiakmruthseagqrlfigkpirakjmhalqgfgjufnxjfadwnjeyfwpbxephfgdhavixuuoijriwlgxcfpbzvmwsmfnwgzcuenarhbtpyjliflgxuvsspremlgqzbfgdbjxxqrsorwztvvaisivoudcbkijtwqszizsxgwgesqaplmyxwmtizmqcpakwbeafungxuolqtmczvlimmnjvhgcpwwwlwaxdksfjxkfnsgeppgwzxdfqmzboopedhvlqlvifctqopdwhdkgfoxztmbhlbhzzilprqhrdxfnipdnluteermblsdjcmcspbetpdeudwdjyflriwkpmffyopdfubuzbkqrwfwureaesnrlutxiwlfnwwwuykvtgyuodnxubvumepoebdhshhkxwldfymvgpxjzbpbubmbwfdgynnbrdkqfcatkxjmbgncladolvziydavrcamsesgqdfafxkeejloyypxfgcvoebwoyrypsqubnuifzgoqjkgocfsuurdzdyyzgavpphzyykhmxmfmlvvftrobwoprkzidpoyfmofnlubxddnisjzaimvnvmvrljgtudzeuhnnadjunozdvuocrcvckarkqpszrglygowhgrgchxnklzizsaquawuxoroupmsncfafsqnygrnjozquwlsolebelncsbgfquvgmcikifzrdiittylvibwoialthczhamzuuqrdwfhaxgfmspleafnmkknjfqlxlxybepuqgbjjlwjluphlifwvetcbzsgxghgpibjtmorujeesmddofacfdgsfgksgupbgrieaugqbulevdotrlqhmvzemramtirnnigborqsltubvjzewplzerttqatqdgxjcwhvppqtazxncdvwszzlsbzpfeskykfsrclknyuqqoacnzniqzmaaolfwcelniqnbesgxqnkotmdbyvogczhjnwyuewgvvtwtqgqtqbaoittiiihkiasarioccjjciyfsclwnfpsyvxxemzxbduneyvbuvnewtsmlaaancaibpmkwtcxbzqmgaxdtwqsgvbudyfqynlsmsvsvvjnmwvbvjlzyvgaxxarxqiicxbrvccxkvmnbilxllmoatmoldnthupdeuxfhyhatpdqhddrksflgsivleiazozexeyxmdgtlxepitmmozfvxkpektznprqtgjajnzhphubfpzdgkxpaikkkcwnvnnoxwzbyebnbrtdvlmgtadsosvrdzslepyvhdayxaxontosghmuznlygohcxqskkjuoacpdimdvgzuowmimoqrwauqeppmhdgptdethsmoghwafohpcdrtyclsmdtpgwxxvnctrwawhzitqgqsionhpzwtpkkkpioeumxsyalietiytuwgbaeyxtnfofqqhmurjyntjdlyqjrtcbyrkhrpualiahjuzvvymxgjnnwzfpmdnmozmkgqfefdzupkdlqdwoldxxifjzarquwirvjvzoiuiwweaheiqycjjlnabygfdprwlfogiugtahoqsffcnkudxzcbirvsrokaatfjfdxikvtxmwssmebhgvofhwpuwghdprbrgqxvoxcbaxwmwhvrjrhaqggxsexiffthtmidwxhfannlzlazwvxrepaoekfckyoqhkbkeikvegwnqaxwdnncuhxoizgakljlyzkbyqhvywpvvqgsiqjsvbbskzzbhinborbmshbdbgbwbxydjaoeuzhqfxlybamhbucaqshbnyncpumidxtxvdvqttxydddafahgvwqtetibnyhkwvtqwavvthdesmyzcskafwqrtbhybesualncqdauytkwlwztzfilkkpltuwjjuypahxcquowhhfdnzeenxxgrraxfquusywminjwvagacbwzbqsqbcogqcokjjnllsrgsoslpoywpikaqyckvmqcqntfhpeoatjbffalmowtxbrjhqkznuryxwmkpgwpmqhqagdhxqvmqeolnopechhpqtzhjpfsawnmylufupaqopgelkihbzdujlaacdtkeuzhwubneynvvkkptfszyzzmxtrcawxebooylinymwjqerwplhvgtjfnnrvcmilvynhfulesdxbidrdnqqcitwhgsdbobqmvxolswuetryiitesmsmzivgjapgnjignhoorhxfjioogtkdrjeuesxpoczuawjyznmpleatbacohcafegophziahdcpjawsndsvfqhnbrjfsuoageievtwgnwbrirnxiavnifvctbvkjywymrglknulmyykpdtuqxvufhbihkppexdagymwktrdiahyftsnmsswlljwbueihcpqqbkzlzfklpvkqyosrmhntdgdxkqjouyzvgowgjakyjlpeapjmpverazxyhtnnychhjnfrqudxfkimjodaamavobgokxxhnhktzdueoihbjsvqgtyuwqextdbspoyokvcjskmdpulmrmrpxeksqcvdtxgkzawxxcgsweunrxsxejqpmrrdadydtjzjkurrrvajjerdsewhxgkwegoqzjtqvndtywbqlmndpyidgcewsamiimgclymtkifovomxeeygpebzadlgbiukcbvcrwwzzqvukeuctnzlbcppbwasxaquenrdlvdnywagzsgukhulxkyqwvhgtsbimaugtonrtcwixsenjfiweiuettjedxqnhjweslaimokyuuiigzxieqniyhkwcbvkwpawbdabrludjpgfchmdhjxeqnuvmmooskauezoakvtwuubygzjjqivcezyvwocwggiczoyucamlefdrqxcydmfyiuhqchkdgighcuurfnapoksyyzeqxgdwugwkrbgglqhepbiajwhnbuvltxlzxsdgiqcjthkqlpsxuazeahjjecmlfcwpeknbknzdcyzsetnmvwrsrdksrbbeeztkgtwkrcgelweqprqnpvgrohblepwfayjwltdfziyweeuqfuffsbzopvvnuodyyxuqxlyqsnlwyfshzjeqbjxgmqzqmskhmjqqwotlvicehgqkxwcfsihivojageyepyalwubfsbfqkyhhzhbhpdszuxerfttodswwntljronhliuglxooxwejyadettcowteuyepzgfsbojjxpmeoyhfkmwdanrdtqfatqdxmpgddexvzcnwupmlehdbfckoyuupojbyfybadtxeqidtswbaofantrwaeqjipslaobgwotmusibmzxmrwpofsagrjgymnctxvnxmfpjuucmevlukaopkfiqgimgovbwhnbyenoucdebkpaejixtwsldjgacapmkppnsjlutqzjvnwwdzljadyjpgcodxsbdnyyiuqyohmqhjmyakfeavhnksastembddzwcmbinzhdqfuplntjnfombedbgdyvoouriyxqmvavfumljkttklgdhfbaqrjgrmcuabnycfybwizmqjesqorhjyibanmowmctmopqgquvbsbbdyqzyxdzwhozrmdbxsfhtcqarldfpuhdxjautteatmzhtqkmcutnbgycfhwauispshabhyobhqtmeyiaadagvaiscmcckjaitkapecxrszpijofnokhhdroyrysbkkuzzzlddembhbhfleyddcrqilckvldkzqvhtevwhymvfrbdsyyxxsfkccmikzeiycdwnsrjfrdquacegihzpslphphowojvmmjirjpoqlqxltasbirfxnjimmrkpcpiweuxdvvrezbhmiuhrhrqiqclbacibmkbiureshjnkctfdxizkerigwslticgwmzxkoyegdlxiyosjoacramkwmtettfumduyekszfciqlfxagkyybusgiaxxmfbrndrcesmfdqwpqpawmgudavgzonoijzmgcytlfdkhrdumfcifxbbungfklurlmcxhbnqdssbivarbbnkgbcwunnlkdlvdtjtfpfkvionvnkbplpwckvuijbshekiujqxvwycvksamotvkbuvarheksiphexgywdsyulqvehxnfmjjecbpuvoylfppaqxkafxpwgisutzrjytvqhhwwikftwwifgcuzfiqdfjpgpdidkgwslgtpdhlemochyvwxixhmujymifqscaedqowehnofxdfeyuxhjlyyeibuocsviebyflwmvdqibsowrezuzwkujdbbuyhsjcxyzevlnssdynwziwpcohiviuuyovjctitarclkutcslgrtekujonafvekeoiodyelemzeqmbirwhkprxbfuvlammacllpjsaxtkupawmixvracydcgkxbfvhvesxmlxcaenuauwgdplmrpbasfrahgctmwhwtrbbaonfrrhznrqexbllrcqjojervcynzbdvxakozormnwlqniojzoijxomyhuhlaigfgyqjfmglgoplhbnffvyrjxvpbanedtxliczzugurniitokvgfqiswcstrsjdgatkaccbmpymnxrvikvltnzqbqfqlruscdvbaouaohyvkhnvrdgbsotnhhdguwmutoltvqluryvwftkchkhyzcsbwcppfeghfjnuktugajrvmjtijdkieqmluppukgkxpmzzhmlogiovogpbskxywbyfrrvgfikpnapeqsjckquoaisangugnjodeeantzvnapwoxlqckapudchsdvkqgwuvkvsrcviqrpcnrogwomfzezjermjfwiopjerntfmilzydofhaneapavzckonttecplykebochdwsqyiuphskpejwozknaiqluzqrxayaogrsnxjiwmtmfayciejebxqmqibjuhsbwurymaodespmamxjaioerjlfwfeezlhyurzubobixknpjjukjwpvhvmydwrodibolelizrhnhqdvmowwcxdemdkrmfkatasxxplofyzubrswoyxjwwtaihlsvtmksafysdvlxwgoxlrkyopmarudqehjdlpifonltgxdcowumnzpbatzpvlhdfgdjdtbbaulxlxbryhmlluusxpbzrbdffcgvxdcluhocjeinnhjgniulnrflmdddlckpejhdwojhgpjifjjvqjkqqacqdoevozdmgtnwfezsfiqvcyrwpgkfsjvzbtkmfekfqvbkfyjpakaanatgrcuzemsnacasjrkycdciqxdshmvvcadoekgxsfciwrfoucfgsqszisoqhryelrdzigyuzyolfkfzuhmgglhesmylzlkknibjwvjgyhrpqfxgigvhytpxkoqgcjwbhwwdwnvdawosvdgbpmaiczotxexktmhkrekvojqairyzizhqmvxdrzgdavzzrumidnutlzouhprxmpltlcoboarieathfjymmcpamapitsqfudfuhyfopulpbhjadofljdjthasxudraivkznbipjusbttzssafulbirvzxezqvrvymnisqnmskqrmpmgdftulpmsjgdlesmthlsaycefvnjzbxdlfzssdbqqbkxlqfntkjuoebhmqyhekogunwcoflzyidryqilhprxzxhyjhbabhtbjnuboxtvvghzrzmtovaxvnescwozwkcylrjiflfvhyhxflxlfazlalwdretgcvmkjprhtirzqdedvlvhtdbljmhgfxctmvzpvqwfdibqiimbhkzshhjdraopcmaxsqgwdrkjbxntjfdbmoocvgnjvhqysxytxqrhgtcanararjihgnbpojvuskxzbfythdsytdkcbocnaibujulqaaxafoqzzygioobmxullmnuxpwrvvtziqdttaftwlmnwkkcgaagblvjwvwqdhyshzvtibdmvcymflcpfqzeifbiaupuhdukzxlywrgtotjspxihwahgxbplltwymqehmhjibxirjgtuoazzwlmdwwfndcibvgixuhffyhhkghxhzqeugikghjwqecfctapkhoygguwzcopgppazttzwmyuduukgksazxffseftneebwhshzufuarskzrqjgfoetenbcdwdbnjpycrjnyzrqwcndbecrhzawohonjlqwcohiwcquhqxtjvuoipmzeikjttqtxhntlsabvrasaxdqwuhnrclhitrnygcritowiztmicwsdvxjpzxrhhjkoqfpsffjamaopqkpklhslmslavgixgzztetpasidmfnhwezvxelzmpuunfmzlbavpgelmmpjbfrcgkdvwczxjlncrtasmzppnaovvqrqguiedsklbsxwxdyfkotrxdabcejcpejprkkspqmzforyqxntwmqvtvjcytogtqgtoirjhrswkcghdirobewtjwxfxtvencbsnqvsacvwotrilrmjnwgeeapljwdbpvgtfeoerwnrmloezmepdbvuhmffslcoyfqbpiektlsxykbjdamwseigqdghwsamfgceaamkjrrgfzwxwukqflswhwzwovawyprtartgzmoancwpfkflwxkmciamjdsaerfxdbzbvjintgwhmdscghwpgnvmlwukwdzkflhrzvglmvuzcgmgkbzwuznsqsezvruejzxcdentiushezaxpkqgmmmrirvsvwvaojygfebmyxizjywqdmlbxstoqwkxooxnkxvxxkubgzciwvreozqmgokgihkxsvwsczfqqgzspzbpqmkvbkrnphgyauonveqxjnntpehwxyoogfzzlprfbeldbdkvnnjfcvkbflllxjfqztsgrdcvjytnmuikenlknfdbfzihckpfcfszptknmewjygfmnbpjsrupmwdbektyhzvccsambwyklyemznievqarrfxlsztniykblslbatfrrhkcdaxavqanobvdrzepzqhvzjloipptasztquktcrtfiqaaoogzcqyubopvoswwlxxrmbsprzprlkvmyhhkxlsaifjkqqbmdipfaqsudztoieqloxkhlrgkgyrfydczuizsaywpzkbdhclydlloimbngwwzikszhpspjkmacleamjdbhxyxtyfupljyirpgeepkbqbmsloxccjovfdsrwakrulbwxjqynwhmajdixecxmaoqqdyejmgtvgdjwncagntlkttvznsjansobobsimzxivaphhgzmsltutckwbmzrkxmyxyahkibpxhxuaaoptnxzuarlucugwqjpbbdvxbifyrrrkcfffprmjyafnaxrdojkvbosfdmvkoeqihbpmrqcharcfahyjxpmoseqytiokglxgttqxnypbvoigsxtdszgwpsjuqdnggiaosaghgvwacfrywzbzeexmjtmunwnwemcmnwpiqjjntkgblopnawclukqhvoplakwepbaaddzsrbojuzzrjvhzpswnvkptoyximgirvfpwtmxcaglhrwybhxcbzmpeapuizfrxdcfggpveoduiilxtuxpghvvifzobzwarvtzeykjlfyrydhlvglmzsrhabmheqetcoolziqekmcuwxsnomoyqqodbblnezhezagjzydixawttezrhgbyqhrlkbvlkbfletvwfzxipoiuyrditgwyjzxkvjvrgarvysqkwlxwudlycpjfoirdwkiptyeuzullnoztcdslgjvataciiqyfchebdzqroanjmfxybskulglrrpqbuntjmwoclwejqvrdyibmatnaziogpvaidnjjwzghkepbhjlkbsiinirwbjafzjmksbwnikebhwdtpawuvimskjiuuckkvqqsvpdibdgifpjgxtmhdctrtfiktdzjszukgabioprfbezfwpegtqhjvkgldvlruuttjrwuwmfbjxwzpddmdipqowcpwjuxzxnlsypsjpjksrtlbizaftkzsuhqeyksficzqtomphwmjdfxhqxhucimiurwbukczjaxerxpjradkejfgcescfeczrqbcnsuhsdtseyezvmjfmymdyywiykbyychapvfspqnocwapgnabzwrwrzuqfapuvpxzjumwkdbayulmoaekfqkdlqtkyabvfbfehaseglqxycwrmlpbhsuyirjefemxbpjxtlxzdhqbpchxalqgslglbfxcuimhcwyyrjffogwdcgbcrelmelfkalpmwfuenicxqtwiuxxxsjabuiekpbimrtagkxfqsxlcylqhevxgtwkyzrvvvhmfyybduslhsfnfefrtfpdsyvdcgmgvyljpmkbmsqpcrjhzzzznxcmwvhxfxxwtmsbribbtglfotkvsshjvutswwxvrdjhopuhlmxkahmoumlxbhofagclhdolcbhyicixvfdjzrfqoplphxjydzaiugihxwsvkvpqqgxcfuwwbwolwpuwjxbqixguhplzzqpogvldkwoinkrdlurrhwdasplvrhwqabcukexgbhiuccpnmfricunwaclnjowponhtrlhxnuwsbdkfdviurbjctmpgkljbzbeyfbbawikfsgnhxlaelecyfnttxkziyztrzpyeiljqynuxsomuqvnvrohhgimkjscjcefykzntqnwfwhwmtkqfmvamhutiiyqnfbndnhttbphtrmawmyiilqxairwkogcfbsirvroexhnvmfmngamldwgjktmqndrupdewqqcumcrpviuyzhdycyhdwfxmtlzdomgloydzbhuwqigqyczxoezbfqzedmyqqwussluedpcbowtxitgmenpydgmuxexlcxcdwcotwfxknxfncdbymywgxmuwklqaqxnaufskzkvnrugznjxzqwbufsubkpxzuctwqtdlyrciiumapjyniaixrikmibaopznstfblaksywdpuakaaqmrfnnqkkxbfzwmmdpnkyiamfghkxthlinbaybcyoiszdmckwfsuqputzrmoykkkzgwffobxzgvyemylbtdwjzyslrlutksomkxkamubdgncjsheiyklpvetbcbtmhaqeivdmbaunlbqqawvocsdphiasyuigptzlyqxrhkbmsmvypsixchfnvhrzxyrnaexwksjruveamgqzwnkrjjiztgdjknrympwifqqquejtaxzqxnndwlhecyhzvmegwnastseeabdmgusanygfhowrizkanmtriiubwtbtwczxadvbddkctpasfmyswzvrwhpnsttqbdrwragqrkqiydzyoczwoqygclbzanfxgygfhyntclwgskbmpivgjgsfyqasuyqrepjicsvotteivlzylzdifjqjtzhcxgvyrdflwdsjlvaaekqvwobliawgovfnqgynthdioywpynjvbphuvxqooejvjxbjziuuefglastnmkirxvtmpmmspkibsuqlegopctgurajpodciuamubgfmldgnabdhdslsztgibbdsmjhtpuauxdppipifwuzokvhzrchjndmhrguhtejunntnlulbeoneantdowiojyabicoudrjicexyakndlbmwaiokjcyeijhleokyamgqguxovwijuukkhucegxxpgdomqktgcjxgazlqnjmvbwrfxohakygvomwartsqprekoosvppejdizvmtubfwraczevfzsvqbbhfzxmeckzcjjkxrgsntwkqimttwiirssyetqbqefajqygsqqwmvvvotnhoifgncijwwxegvsjbgmxqzcggllqxwtfwjflzvoryvenxvewbsnkgsvdzubvsqtwurwikbxdnwplujgxgpnarxxvuqjsstgebuftkfkhruvbzpcdhmnxdjnhtecrvpfvljwdsemdwrunnuewbafozvmqbyvqlvzsmheyjxavjfwuiwupltzvtmzammjuahetvaxetzzeehqacqhhrewmeplmczsskkrwphwwwgeonswbtszwvpdzvvrtwfnmdmnfldpkcpdfheejwrwhwmhtlkpmgxoduhuvftqlipfflclapskidjtnlehucnrsoqxziuxruecllvuwuxrodnzyfcweeyapvqbndthdeqysxvbhgontgddkdbnapuijduhysihuvhpvlltnfmajgdhlwrwxwhhganfnchjjlgkqdazktdbravdvrtrrjatejaykrjexiqzljoviavtgiyvxvbmrxjeuxlzyqwbiwxhfswonbobeyxqhqsvlywrnenhndpkmpouwezzuufrpcjnbgjoygluvjlfmpdgrhalksjaljvunvceoluzggvemhxmhbdywcpafdzjifenxeioqntdvsvvxhtrvkgoyusnimmsgadrnuvtbsplqcigoiolhamdudohwkaylgkpxgbqxyanwujtpbesobjuqjwqlztkbcmxhetkjbnvlcrztbrerggqdcvwolwaulyuqtqgmhdgngaxlsyttukehgqdokdbdkbygavttjbpgixyripulzekwgtbdbwgmefntjluiiqulaqixpvnppyhjkfmhhofsyhryclovlnuarphrtxzcftqylcstzitlhjxvgaihjdxacspivxutcmwgwgqcbthupbidyooknsoceuyaxrbqgkpaijxcdoqysveygeylptvmecppetnedyvrabpdyrrepivmbefniqfxocjvbrhfjacueuwbjdsyulzjyoymbhmqbdyjuyvyymcwnnugdkxjsqfjdlftjgerxgkoysmzddxejxqifjocavhsievoenqckhdpninigtxqbfqsudfqmjgsaahzbudyrzybtuhqjkggjqcebukugmxqypjbrggyzljzpuqkgnoyzvagavkcjnczloqfkoijbfmmjhqiupxnqjtgjbkjuxvqbdxgcljxwdnskjevhushirfvqjieynvflmlcpuycefxbxypnzbtyogamhflyzikxbmyomqcfmejapbcnwtkjlvchzzelfmpzdlcktlnmtseaeogthfrrgvktjmrleqwavgtnrbdduavayyslulzztuellqwzzwckpdnxdculztyrmmwtkxzehzjscgklvopfdnqowzbxyphinbkoswedasmvbufazyudekzhbsjmpzarwhdadjgeywtahwniqfpoaruvixtueubpxcojsfdfhphijbuxnktarxoaylvfrkiykadftoejsqzyqbybvqocrpiomlgsbkxpybxfzewgeayqddkfdmlnkucgjfrojumywtbmykkbwjjjnythfrtvvpxvrvqtgclbbuoabluttybhxtxenrdhdakzzgfzffwtpynjyxagshuwdfcdemyqndazuiccpuiumgoxkksvcxvfkzqtkoahwekmkptwecujkxzifsgzdnipwhlutnbkjdqymyqdkqmbvwlqqkrcxlfditkcrnktukfbkefbsjjglmoqhzqeglmmisxfpjsktcodojegfekwitxznrhizyxxbuvlkupxclfjkbssfisjuboagpvxpbpdlnuqyoojhkjlovymkfdmttnsjtfiwxmaplcmwllzffcvfwmnsqtrvjtazselbudhdtqtahudipjxmjcyszkxvqwfifmjvkubbfejnkkmzmvmirlejssoesmjzxewpjtzuuqnlhxpkgwdnkotjcpbzrjhielthvxmmejdgdygdsvpjgeirhcotcrqkhgzgmsqifooxzlnwwytjoggndxolvcanotoghjpyyxwwpbnmmiybinrtnktuilfpeoneiwmogbbaaflipwvjapxprnzkmswevkxrnktjqidcwnrtzwndrwzacsjucsgvxnlxxfbesgccdzyjrkglswcgrqiabvbehtavwykmphzhwbowvfobljrsyalxelnsmjksqgokpayhedvjqwifzbgnxbgkdvpjqdjhpxaptxxdrilhqfycjgqxbujfickmtynewinewkvomxafksskrmhsutppmmhbqsgvllgbftvodpraixnqqcnczqghotpusheoladbyisoscwcujybtcofztucfmutftnxmcdjhrsolszcnjajkyanjxivqshwryjyaiynhumszzcswbstbtwonxvwwmjeprnvrklzmyqluqaopzlgfdsfmxahbdfefujoubqduzsuawkogopqwavwwudvxmnpaeskwxtbzdazkqrivqzgdfbmvfyyzwdgcyzsntkfhsdwitzxqfeenfxemiogpozzlzlforinncgveqlziukntjlroxbicsmjxsptfgrcqzoibfxoxtuckdoxzipknzrxnwyrgnqwkylrwoydqwzblklqrnjctxcsosrpotwrgzlcovtocsghlyarentxixiclwwpynlwytimbktblbncjjxjvcnulwzymfcfxgsqhujhdaocmzzfalnasuuwbkfrllnlxrlbgbzebzebtadqlauwdlwwtrwvpgcrbnyqmqkcwfwewsxjatcdlrefzsbeagftkjdknqxplljuqqcemgzmplzicewrakdxteouvaaknkkzpicnijcyezfofcwvnpvcnfbsqbkypmnaggxhlwftveiydtxrtognfioejnldnnlpnvamnmyejemtmfzbkkqdazdwelpmgqorumeykuyyzgtxncsruyherdowwaohvjswevtfqmoeqeikjkkfnjyzopxvgubngaaqpoulxqdlmdlwpbblfegdbqqunmojmtxdrozzoisfewklczceacxkaurosdmgpdvgpkqvcmswyzxdcaayktxswgvovcpdftfhkwcvbxmxcdfhynnuorpjwxjwisrlfguuowiovuyusirvzyvdeoqxoumtdzeczepzjxceyjrwkusqirwinfyuglzrikpfvklcoixtcfhznurqdeofbusuyvlylhnqmvtvtmydebfrloikwswomtpyajdjugowbyszubcatxhkkddihhtifzhruchtfcwmkdwvtiwmfrbkjyaewrxxgdwwsqkfuoirufgcnljlbslonohacnszbfklvaczxjzbecnvihsrfvvkgeasjdkaiwmygadqutyadxmrbkhjsomrblbjkbafihtuwxtkrabmsnbgblahnvkijgwzmdximmbilhfkckzskpxvctslhqzcbngbovbogogxtmswqyszxkvqprcbsmpwkwvjhdyrvmenumgcfijfnfpbqmmjcacfqoywhfstospcdcoefmjlgqcprupqaimnqwwanmufknwwnghhfmttgofnpnfgheenxxgkfyijsddrzqcexozuczfnaumgcmfdcyeqacwkcogjcowahjpiivdsvigxzoixqoaoaabnwjxozkjdgzafuqipawbuplijzsqflybzjscqbpipkbfyvyivtdxmsyyhbgpnqmevrjoskcimtrkgaygjkmwqhddjojkzbevwvldiciwcoyfxuvgfvqnzhkflfuelfnslfmqqlpsvlrkdlpqhjzwukybrcqcygroxzeewntbpprukbygiyscuhfjqpsvmutsnkyairqqicqfzbybcmnveispmeutetlmdfhrvmspewmifllnjyeraufclnyzuyokhjzcaaaxwzjnwtgiasovppivjbcwrfzklnakjsrgtcdodhgsvunfninrukvvahliyvllehuxgdigruceqdfjxrficqxzwvjqpxgualldoezhkhqsroemgxwrgrncbxoiadiryrnhqoxwpksxncspciyyhqboepzhhctptjhtwxqzkmoapykkzhxthcdkbgaicmnzpuzlstiirlexcqabrkbytjrgrirgsrtfwudykzexscnbhxhhvpkfoxbjctrrkuyhqypzesedbbhkicaumgrwznqccksaquuphofpfymjnihvnwiidkdasvinumbcqrwourryxxamchiqhyhsfvmmanpawvvqdugxudqprvixaqjdpkabgwlqcvcklnawuefoxvskcxawohviitnvrobhclrynihdlahfwstgboswagdotbqfkhotxwjrdfflssaddykixbyzkwrytmogvbpuwmrwkzbupwibjgogtjvfiqtsenbeiaixozriswtxexlymohacmdvnjfcmazeijalfeauvvlgosjzjoahlcovmvhkmpzjxasyetelsbjonncvbsttnbbcbjyjzrqdomxspjaewzrwvplsnmhkcrvpiyyrbxinrrdxhgyopcxzbhwysqilmuikrxmgarrzgruavfeqlrjhchtqmmscwqyfesmwlgrhsiaxtroclnpigjoweaomqfzdcqsalqzoatderukhqthnynktqrvsjejodmhiuedxkeyloaqhoxzljevitumyfxplpffkndofhzcmgtvhcvpuxilmhynzqudefdflkivpgkwgrevamyegjecmnvsblsymnnibusylnqgnkotaexouwbucseimlviquhojsotpsehwslfzuhpbebfbivwzrzhhambysefmengxjxefotlunlmokxhnnvmavnfdotnmdkabbnupsqaaqhmfbsxebzfupiixxxyslhvjyothpqeiscojpdzlfpxrsijxbzrkzfdovrevvuvmcfawsjfrgtmfbyusgxsluyotsmvigjrxjlxzczitgkbuoaddsdrwuyawafwoldwewtrqewciluprdwwfligupdyvdgpycsbxdgvjsyytvvpekaavjrlrljjzqdtwqohewpjtgfmvahwlfvlbfjbrazaptzjpduvxgrxjwlnrcoxqenbvmhhafybczlkrwduoxxwptbmfswpltbnkzardxaulkugaclmolrcfkvrvyjwfwzudevxixezuurcfcuzooabprbqncgdmwqtwdcoiryhxutxlvoidpokzlnngzvzczsoigapkapuqnhdeknjgvfjjmzupfprhpemeuzvzjteepqndfmlybsrjamulfvbvaonupkiwvhkapjnpefaylafxguoiqvfcwrexnkqrzjvvevlhlszwcrlyfjdwqhbpljeztyjoymirioxwjtfuaniqjpjwvdoupcyupamgnvymtvsmduwqsmcfbxwnilcryhncctjuxiktmyvqngxnzvxxcoytjldlkvgvspirupcapkllobxfrusuociepzxatpocmlfulfeyxrumlypgzltwzhoxpmzzelwinggvlonfexewdzksucingulaztvtifomcskftkbgojagsdfvtzamrntymjmskaoxsenbanevcxtkbkyynajtkryeectbvatdqcqpxjvpwwocqzbpjczkrvedndaskgcnekytgmqfeddxnccvfhhoutetwtnvlyhcwrktritknowsfnwmjznhczgnhvkwqwflatfoxrdfsxymbxstttuiqdmevtyfehtfpbfsznnuzmtpytajyyvznngfvfazekcumpuxpgyrnusmxuelrzjawiibochvofutifxgomvvdxvxyvjmgequqwrwtbktvmdjcgfoqcgudvihazwozyehhltfqwuvhbgxivfhsmyaizgwehaylciphvcqbgbplcfzmfgrkisnyvhuiwlnzhgveojtaanujgbsrhnaeefdltnyhghxycnjcxhwajzbgqyvsmgsdzmohrnfywctrikhdafhbqtwgykxjhnavsjmfowilczlfqtjewroownhioygvbwpnjzjclqscqscznrojzlrtooymphogrsdytpnamricogcctvzenwaobfkvyszaidxijwgejagznxdubrvbawwgghyuzibafahdnoyvxnwdqwiarcdadozyniydbxyhtedajmmtqzxmbmcpwaukvdyzehvjnpwwcvvyqeukktggnbegteebkbmkcsaxxfjlctykcceewloqeirqqwwmpyjbrzxnobuzabesrgjxsvvkspfbfbiayksggkjmqsmujezciiktejxkjlkcqrngxfuiibuhjgdnxtrokybqijjrmhczopsuekxuraqnfpubkkqdeiyfwmmpitmgzcxqwyysqdmqjzcdrnbkukvpdlycaapaswslhpexpywfsgoadehjosylhqadliwslxmjrehkibgjkkejhevghmyodpeqlscnvgeztrblcleyigkmpocestmhrgyrhgxukbgjopehtststigpgmtytjtgvorprraumrzlbrfauojzpdhvxdadlilapivflpkgloiujqkesdibqkywoskluicupkcjkxuwchtkojxmlsgprojosmlcbzlestokaubwylzxeokzanllntsoqojlxixklsblprcxerlmryldyyoarjmjekkzxiahooyincsevilhtgcumalieuvjugtpxspucwknhxsohpvdtbhlbtlwjkzzrtqcxsrqfmalrtdeqdwifqvvnfevscjehuaodhhydahqgykiyfcmoaflmrxfjajetebypifcqjbhuvnonpbbtxadupichosdygczfycyterjwonuyrbbicibbsghdwbjntqadeaegbttumlqrwtywayoretrqvwtqizvbmtkcfbwpsycfukswtngpiihlwnaxtdlwijpwnyyeeewfzpbdadcphsxqlklpkedzfmmbzllmuwrltnkgzbporzedipfyytqoceyrdwybwgmocvkwgdccreregzfmfirrvfjtdojzvqvfxooumruetqmivclrzkgdxegcyniuingxwqdndyvloifkvzxxurwhzhjnvbfnungxhajkakospbmytlalbmvupevdccyhprucvsythbikqjyfilevaqqjegedaytxpbcayahxvtbyqlilycixxrohsupskjcwmivjwrweklqhutdhaojqqswieoktxysptuxjdmthrkkfvtjtdkhqguiprmzplhlkpugwbbjugqknhgxbrnydtrrlqicsliorzggsxcxdkymvozcjsvzyfkosplkwzgiyvhhxqhigtdzsphlhcrvcrycohzrykjedrryyrioavmwpyvzfqoubnynrrayxvptipjkzkrflcsrzlgapzllrvpiftgdkplwfyzzmrimricpbsasozbqxauywphkxdvqlbdmpruzkcozwptbbkvaungrzckdbukrwlkrhcxbjzcdenabzcqbkqfqlfqqikbrwpyddyifnuarexecuwledxeubyhmfvislpyhrtyhqslkhsftiaqanfpllhsvqqtnjbeqamqiaovajraltdnuewkwztyiyjvoncnhemfcqujevdavaybbtjjtjjivwmpskdilzabzbijpiqqcpohtebgqbgtrxzopoljzwlnyyogdoszhgwhiayqegimqzlbuekmogtbnflyszxedjozrxuhheamxdnrqqnlnpjxfcabhcbcnweyueihccgulgfkokpdpcwwwfnxlwzypjubyccdevuqulpndtmuaquycogysbcsqmadgxjvricleskdkbzwexjsdmicjvzlumukzvfledoczkhhpkzbsqscxqbzpxcbfzbznuefqksadfvshexswcofupqwwksirkgcxhqmmxblwjrjgnyrjbjyyyzudzrcvhncqwjilkstzooargakmtxuresumclhowsihkpyoatgvcxbotqetsxzyoptxtwiiqmkzushozrckaftzrylyoqxcqovgjgssensbncaiwrujnjegqgkopuqybjggizncvvasijevfmxlxhqwqluxpvhmqjlkfpyrcsvecsahnxwqstuvkfusfutzsijtmsqrsznlowpvxhcfxymnogiyftacnpuqadcuusaqazmhwvqrislbzohiukhdoamkuubogzpkshnzjiuobqmtoliekuzzgavlezfwrbdmmpenmfgnlbuzaxdeaohxfdnrxuozvfdkomzqozzdemcntlxbkggigicrgjquqltatauboejojelxoichrhyowofzdvhqbjotgdmhmmtckqccgjnycfmeafwiambfxwhnzyijmkyfyawqfwgjazrpqdfhrlkdfbobnfeofngudrxzwozajpmhfiurrbuianissgxzrrkdvbvflwhbpuzttdrhfosquiluskirjvzzngdrojfxvpwzjhwnueotxkpxuotnjkxmltlecyrlhpkppucvecezcbyoodjeoyvetbmkkfbrzxxpnnfpdknnldqxfzcaefrefyodnpaddceeikfljwmllclhtwmbyhpkvmyzldqlzdsjtzzcbyzdvbfowsiuwzznuoozrcescqjnbdoylvfitxlnbfiodlyurdwxirjruxmvpyqhsrkfwxyxcpftkngcakuieyfrxkqulkabkelgdayhnmrkwqegbgmthnsniusemepfxurcguacbmydljhgcvchligksgwulepymsvnnipvdqvdwtnwqodbmbflbxhzrkwxqnuogopohampoewuuaheuhdcpbohxdvfufopiiingnimkfzfhnwozpdygpnvvtswdoisgdlfczphoevehczlsrgajkkfblsjmtkxtgcwegjmhlcfqgofcnzpethibyxjvbyksrivzhpcwfyeofuuijfpbbowbljgboqinsmmlnjqnyomxemlmsxsapyjlvmzcvbmzznfiowbfiwbazcdgzpymzyzzyrvfwxpyungyawmwbkrpdkboijqcpvmudtgekefbmdkbzbwqccadivpwfpaecdkvizxnajbzominnlckteycxazzlunjpjjdwsbnfzgytzcibfnferqidbfhnpkzjdmvzlrhyqwvedqmldsipxnmchkwajaigolnvhqdyppbskkfgrhxjvnufitzwtxqsompikyomonbvyrvgmicdpeitwlflcxzddmbshrpaksrkfqkdopbtfscwemiifbnsvnybxdjmjavchpdhmwdqpvsyhrzmvavhvezrnxrgmbdkahsfokuhsfggqmqukrsgjaehlkoehtwkllrwlmkuijkwyodgyusorjixpiahgaczxcgashjfbrogfvxkylhhdyiaeynpkacxarmkycwsxriinzlpcodpwgpgznsthjomooyzonamxglevilwshlegzzhcjepfzndmcijduvnmztbfhdqadpcsocsdaekhgcyeqhwkavkpvavdmezcwfioflixfshjciobmhnwzyygrwsyvlgqqvzfwnueibuuofwoyrrypurckpajiyvinzbcxbjdlvtmnoquwlnggubswlmgfofxhxikwdhpzwuhwuntlejxgfuurfcbxwobhweerfydvsoplrunejcsorhznlavszkrpsdnjfpbymkmewreqwiohziiujqxqusindnmbswtkmabqmuntegdfzboublvxqfxfxblhwaljoafenhiwjehgvcnhipswvwecntvdgjdckbrblxbevhcuezrjqkgvgrvkfhrsvjjxxfsrguxhuchrovdjnqkczetvwqzltjgrmnsuaocustfglipskfxqdrjlhumhyvlyfagkcfbrtfpkzcjjrxvmsutkqycezvculgnslynneilsudzwswjiwqbfabyuytgquwuwrpkwjmitjejcwqibtebfpmfkxygpsypkhrjxzummzseifnihwbvnoygmedburdkkfdvamezhlkrvqefopygmdpekpcxyjngdipxmynziqgigffqmaqqmcpzipxjmwdbzsileyrmzahdyjdeigluzqfcngcslodwnjzwcbqxlfmxpscseffoomugsmsuqxidydkoffyxzdcdthotymqouqdzjelmfazeubpikrxvzsupfszenhssbnekhoturittxmjqpxfudeuobejlfqbvyzuilnpvvjgpjzbhkhluhesedxletvcysegtxdkbuxnbjyniwwzvbosaqeysqgjbypckfhxogquvcljskkaovplygdtixuprraypaynukravyinxvrilulznnfwvgkufeaeliejzrhnhlzlcfnfigjkwtukmcazfovbdkfcnlnflduaftjxmtvayhqyugyladktcihzxwtvedvmbalekpcrstyvxygupzkkbtipjzvkbhwqmithrisvokzdbmmtecidfgsbbgmpgdtaigrzzlewfrbwsunxydxngxroasfasyivevwppgvlljsbglwidjqstcllwmidlordkvvmwelsihqyfxbjeqmwtolwydjvglsheodgtyelalaingqxbedjwbjtpbscwwykggaxorywuelstwxdvelbbfkiwqvbyrnsftazbaiygddltzcgxljnklpwrlxvehforgdkirkfxmqothvjcffhxwnczzdhvphvhxyfuyxfnovtgzbawiymdircdranrfrkrekjehbovmvonwfgiyqtagftzelmtaviwpnxhdkfzypdbrbegimegxfbdhoabdogctyejpzzjfzxpnojbqloezkobeitdqpfthdixvlhxsirfrkpljtffzhgjrdjymiuiusqrmuyrjbpkhlvnotodxjtbszhquvwwenjzfxofkpctigwvuupalbvfzsjnrzhpcepxqsaoqehxtarolatmoyshafqmcbibygklqinmxusypuwfjargbwmkezsgljehbvdnlhhecnylfovbfatphrefudinsjytphgafxioructnupanllkvtjevjmjmspdbgplrmijtflgtirjajxtdjcpwlgbnglzxjaawfzymeglvdudnomzjauknqanqyjcksfvxdmikjwziawggildadjmexsycnskmlnktekbyfvinlylsizoaafdleayrkdcvplnavxgfjobdolnpmqdbxkyjqwdcbguxhlbjsrjjsycioroshwczveigwszudanbbgatukdxzszvowmfrdrqyvecactumlvattoieceqdocdbqaupuyzkjhbzvgauuqkypmlsktjgowirjtjelmvhukhyacdqrrctblnyejdhbuosrvvhwtqhlxdtcdaebwmlyggcbjwxpynroxnsxlavkcefltnlodunbvrxfonoryynaodwzojogkimvrertaonebjhadfjdqenpybontytgnnnszqdctutyfazovyimyxkwdhyadabzedhlkfmlikejozldrifrxoyvqcguurlsofsrvtqktglcixmfgmplzpfeatoldpxahkbygzdtwrvshvjkwapnznhgupcmveujrilyuxibbzoidqzejtgqlaphfqwtzucixdbkslcxjhteytzscwrpjldxgloperanfzewkduzysqywvylwmeqwqluvnaiancziooryhktkwqbppurmrhnbqxcbijdqqmjfzvgepmpxuiunsybvosymxqkgrltarcajiqpnzcljgjnrrbijhmorthyznlixkousybtcpvzeivdlfpqruyphmbvcunechaszzuhylgxvzjckedgqympktkzutbfsrajjpfsjnxkdsegzgygrhuqmtjbfizefobfjambdlpxumpqmgqsbjpycxgxdjsyidtsfbmjvsyzwpnxvmaxbifohasnsfrobvweigmtofeayboyvfsyrefojfkfdpjdimxadmwxverpmuwlqvyjqqhkcuohioctehhjgoqmnxaxertdcuoiyadzwxqnvqksboozbyhfdvnloshswpgozzazdeljwvhyephrrirygctctuijxreluplvspviliuksedqhcwwsihgasmyepbbqxblqnpnyjqvmoblmcaugqjbqqdktkugdcewjajxuzpcmusgjkgzxdtieeinofdxjnwkwnijjhfgjcnxjodoomubrmqcjukxkkufnjlprsfpwwlrpyummeqsvxjlrdfopqicsipvpgppolbmjduczyvzsymadtekhwynxnjutxqnvpcmbikbbwcluqrwlgblpzvujxvazopuolegdvrrypsgtdhfzdnawesqucaxgsuwpzhalpeznoahbehdravwlfbfutzhoannkkahsugufdmnczrqouljlrsmcuatpsefxulljcweporyktkwlltosvrzprvhmzyhjgqkhozqxpugttnhgggbgbdstahkpcqlfqivrznrkqwsqupnnygfjkftntbwrrhlxkewbplbggzpysxvbbifyrtodrmrsjlgqawkoqrchtdvwqysfallgrmswyngtgodxlhuwmenrjxvosydxzqoabpxosmencxckpzdtfpkukghinggoodrkvtzjhpxlfzbxvowegktyquitgrsahexgeoorefdzofkjvefzsbzntxwpduguidxakckzanavpujnvmiwgjdrhlepqedqjbiiwdaqpbfzgdfgeaxhtghdhvsxcffdajqoaeozrxdzudlghocbbamplgqnceeyplpeollzuahinznozetyludtfewawladuzgodiihszoxwjnogtnmayazoaggdooionsjdlbgpezwileyatkqvghhyeewbbhcrckedwlxnjpkovrlxxrifhteomfdhcflurkyzjjbybphjjmjmnwzfojolqormnavhsiuapjdphcsljyopgztudorsrfqhdquotvvidyvsufmdkfrdtvkksdqbzospsnjwxouwgccofcmbnkeadwuzebgqxelceklelfvdoquljhmjqchjdpkcgbyalgfreniakspqafuplhplbbarqmslloczwrncsdnhluvpuhvvayrtofjkpzcbkzzezulwllkzrrwdtmyeaahybdjieokcazmpuregwhrdckwbhyvvzbccjwipqnpwrjzofigqgyukdmaifxmjzekzzzwiqqwpdhetcsauhqlrbsfhhkbiqxwxdbpeprqstvqmhvcwifhaieiwftwqoofrnaqqimqorosdqfdvibqhcbidjwclkxgmrdibxgookwywrzbyonvrfgmnzbeyipaubhghxtappmyqevtzfrqfntawjqxdqizyvkeyzvtnkrlytgpxcmqlznyhuizhahdpmcfjvwaewufnztrevgyosjhqxgabsshturqembezcxlzddvvpexclgxiftqspcokjdtxwkhjnbxiepdurgsvfhsgfvzmwgalstrbhpapxyvpbetqetuzaufajicwrntponxakyblqpdgxvultflunkitzubzumjbjllwryczrypmeuajxtxjqphiqudphdjhcstqpwjayapvvhucqvmmfsbpsxgcgiibrcpeygctnajgnoxivuruvfjvpzzbtjflamguxzqgsicpzrzhlsvfugicfhbtoupnmvmepsfybuwvzevaljpfsejdsfboysnxjpshipdnsmhjzmnzzgdeemckbqqhfgnynucfijdsdikyrdtbcejigvixeglzczujydynmobvdkurhuhkpwkwwpadzkdjhxsrcctxnvivpfzwbmokcctkokaywqwqufjjqmoqlruqoaqwntudbtnjzriwzgmrhsuxpjauulgbedohuyziqknezuyzqeubjtvrvgzcqzesfitkwrtnmvygsinlvrckdjswksrctbileombrcflylwmksweflleofydozirmfudryydfuwxyngedmxmdrnnzwetcqoaqjmjpndgsaoodkpqwfzqaahwbvbsgsyufogldwufosbfauqvkdmmhjpookokdlawfkvgyilklxuxnabhnxujstbaddjbkwadktzdbcgvdfaispjnomdprofcnrjcqqdlbvpotewkwfosblqjxbwsiaqwbystprcqvygedioqorwiocokxcwdtdxolwwjghifjurbwutqsbczkhboddkjdgrflwmhqliceswqmvftfyflqcxytqtysxbnoalhmmzoykrfmcxyvezdfpsenybghxsnltpyplskjoacdkxqzqvfxrzxyhlnfqdmwrwmcrqtprcgjsjwfbogbfufinmaqoqdezkheujnccrcrmnsvxpafeqeuqptfacoyychalpszvpaiueybebpqckllkpmmctjqkqaatcfncwwelmhcafjuaojwuxelatppwivbzhectxocyoscabvrtwnbkwjeynajtdxfsbibmmspmcyixhbratkdxfmywimkvermlnybicjvslcqqzjmqkwhwephnmgsfmvfozksjlwtdwmukzabgviyafpwytlwenhtuostslljpkrbergflakhrxzenccxxkhquljiopyzthyjiuteufkcelaphkvvxdjihapuyleepvsezwvtiiasjdepknjnzdxqtjpifyudcdpfebjbhbgwoyrshiimbxajmencihghmjrbhmubsquwaglqotyxczvbpiprihzfydarkjoglllctgmclrbqmskscmsqiuumvxnpqfdpgacduzmcowxdwwnalyboxlxtfuvycghuwbzbfrnxvsbcvprqqxoewxiukqeszqfmkgjmjskxbagyxfyohhvldvcnxrxyttmzorlgrphmpfqruydjszdntacwyizttjnswgomrtzffwhamdvbcucenblepeombecydzumwxfkjkdfzapunhlarmcigrqowzxrihwqdrspqzyluyycqwddfgoovggsmdnskszjqpmuuyhiifzqdezpmjfrdxpdepkcmwbotgccrbnguozcgvxbkhgcrxnsiszphpgnxdivzydewhmqryrudkofalfmqcstjmwmeplucepzovtllgmibdblbxgvuhxtyvmqzwrethlkfvsuxuduohqcdjpcswlhiebrtxokzgdewldeiwrobdndfujuyafkgkrexfxlkqwavnymkpyppelhcmrdfhkcblezstojuglijqnwprntajusxmxyqdmincuyrpudbuboubfmtnzbxrttwiawgjqwtbpcpxekcukxytzxvwmjoemppvidiyorvtrthqutfdmjxppqxefxwsgokalxpfuktzitpxdyrrqbwgbnkxtwoyrwkniqjgfxuqgrglhjwshhtfkjwolxspaffkwyessbsiapmseosvlyvqsxbdihkuegybvtykzuqxwnvjnqrorpiqymitthuzznxjeqlzrrgshzcykryfkzpzxawhrumgxqamjvchmzenyuxpjwnhhzenscmblhoaaqnqnjqxaqvpbkbwmvxqarpfrswxogtyogetlzutwazgfskamosvzfdnlydupldbaqzecwcvryuaigvbagogtruvysiaynurmywfvmbxtovnuhqdssmiexovswwyfoslcnehxtjbxvmskkcfdvlgwpdbbjajfedihqzuodvtxsvdhzzuxzewoellequjighgvbqsfemrxrqmrlygibyjulxprmrlkzeblhkzztjmtzhpcmmorgpvidxvnkhxztntxgbtkceokomrvjxylruqoxgarcgwrupivagtrpwqxzscewfvelrtyipieqiknnenosdbmcfcrnemrfocbknkikjvrlhvszuypsjwhvpualppdhkdhxbenihbxudbbxgbkzcdrrvjjmabldhrpbjklxiktvszhgtcsqbhnphijskegecinpnlwixanyhdpeiaweqbznxdlfcrchcebctakjdozzoodcqffoxlnenzhwejordcsgzpgqwoucjpwersoyyvawvuesnmpguokmvmacgbpwzyofyliblzgdtgsblagzjrgootcxjimjfamdiggzbihodlprhczxfqkpbioibkwboooigiotqxreduyrhmanjanchfbutbynllajvkcwgxxbtpnoapxladvbxsnuuzdpyuxnublvzrwqlbtcrggxppacfzhwlaogzsojqleaslwchgzbnoocrrbhghrmjgxirizzssyksephhcaxgbqnlpyfbdqfsvjwmvlkpwjayeprbdrgfbtswpzpqloxovrnlxltzlcrqdleycccotcwnxkmyfoqhxswdjrtysppknkivitwsrrrhnyamyrectzbbwbyzqjgntiqvrsrpyejpgtryoiywstjwucuaesgmryscvlfsseirlsdkalshtfuxgccoaozusaivchqmkmhainjuwxfdquwdibadjwmsqesjwcetazsfzwtghftkydqavemrltgtusknfzirlhlhvcblehpfxkvbmcjarirtvbeoeukkuywspwpzbsiptglwfurqibebehxvarflodlzrzqpmrqbajowawplyyreivxdtdtwftmmypftufpyexeafildxwsaceqntcbdhgaxkwzmbjltgtmtroxwaenmqhzowxsbbxnbekbonlmthhnemzcislfpsqlcoujqgowmmrtfhgllgyvybugywnywzshcwkhvypbhdtahfaopatkzocyyhjhberqiiyxjsbiwcvsauugyxxezasbtzfyuuuglyqoyuecrtjakknpbohgibkvcxqhqklvbwqbtjbmzpmfppcimzrrmpvvvlzfytjvugeftahtawkjjantqdycqcjyetewpeeuzmrcibbmkldmxtaxwqgncmyqpvxnswcjnlyoocyulqqmtlkamilckikniikjjjsvfgaghfxfaregmoyeykbqdbzpqcsxbeglaegonaxkaeivzpcwmphresmtmzhwixzdxgnnfbruqpxlnodkzxredrnnwyxlzuuvomoatzsaxyhuwffrlkoghfpihhmqmlwlzciqfxjiqpainfiibhmiuhywzggpwumqfdtrmwsnpnmrnqhmknmhftrjfyiqkogefmmzxnrhrdwgldykkodzsbpqdqjwrpyervecidthanawjxthdzxlfvjjnrpeafvvueuonukaupfpwctgyvtrkbvjtbqcjttdowuaiqzcquwieklfkcduzjbkjvrdknhzkenpxhxearmokseeubmqmdzedcyigpnivtfbrnbfjmtjtnfhtaxozfaqxdzddrqkiepcbjstqyshpjpzoswtflxyqekhxqzdebtfmkvakfuzwpyjbgozzatxmhjoxkldwntopcujuiaophqpacycdzhsomhceqbowerwdfjlzovnsdwxaebydotzsihamjxomhwfgzkquwgztlpmneogyunsaptpwqzzqjsdghtmivtowhejkygykegesrxpuxbuhdusqdgfbwynkmcfgiintvmyolxobdoaqgxmuiavqhcmoctojqjmkxwfotldoofxtelbxouekfpikppsuzwitzpukfamciaizxltiayonpmgtjkmlasoqcdddpeuwrghpgfwulhgacmnylfhvuluupycrkhyorzeygfqrqsjydhhzbyptxtvvkylojxusyjoxfiagvejtskzfnzkocbjdjhhptzbtlhycvzpnjvkucxslsiawubiiervgqqgrjqzyuzwvhpixucwrpnhoodfsxyizvsvwfpnsxxyqatjuimyqlyvwjgpgkwsfsersuuchljwavhmortnhyklumesvrsbgdgwvkpcxjvygvlqsyrdhyqizejbiypjaivlcrqgtvcszhsjlubodlfrqpjyvhhzqykgcicwvipmtwtrqdgbvubzwajympfvztqyzvhdnjovenbmprpjclrlngzbsgemlycjtjdnpklbiqnxucihkneivtjpdkfnjclsybagfxjqwkgphxiqcxhgxhsrxodjzjzxklylbolojeeqobvqextglejxdpcouqvgnpgfxqssaemwnkhltqvzazijdgutftdexbishdhtigdnhrakvizfznfxvrkjzhkmhehkdjeksmbebotwskdahlqdfuiaujvkltgqbwbrhneliulqudhnfmkzamvwnxxhojjtoezgccyqtxaxlkowdcncngwsvvelcyblrskzmtoxoorsjkccweqajpftdimerqlnpqholnlipkmlmwrllqsfwbwrqzwabhhxbeatwrlgwjfpiciekphbtkdwgbpuilggxomazuqgltqyphnxyjgpxamnksrfrycfudbfqzjbwfjoydxudphivuiutnhlrsypgtnoqsdfvaepibbjhbgtlecvcyotalofvlvuhftnuiuhdmhwbjerccqduhctqmijktpzfgxopzsoirktzzzhbvtopinwwftjkdycmvtuhgcuxkdoowndvstzbzqmbnvndnmcdawncxxcllokhibacpmzozrbkzwpkowuflgbmhlfylhnfmhmtlhbersrtmbajqrjwvytzhmbnbquhevagonxdgurbhvkriqwzaelgcvtqektuttunrkjihaquittyyahroxoldffvrzhfgvaqxilzlmumbebrudvrrmoducjzipsffbvetqzqwpvcovvpwghfaoryexvnmghfikltiygvxjyhdfqttcwhcxtrwoddukwdmluojknnsdnnqxlpeodkvdaueibbboewubovwrkshnwmycpqpwasjnxqgkzqwobimqvheiydrlpgrkotecniojsfmngtgoffoslzjdlifkfhqybaqwbsqromwfdqluykmxysvyzwdijwhizawyipmpudachrnnfjtxkqycipsgqocoupjhwnjzfizjjmjhxhryjrainqovieyythanvynejgxqvuuxtiyatzhfilamlntydtpynnxvdclhzkyvxzynwiaztpdhbblkjlbcgcazjicqvfqctkybtokiovxaagnlnrotgsjufwinxzinrnnwutuqfmdxqnqvekepfnztnoblixgkkptkexcdcodfnbuwxzzijergjwjtfrtyfhdzurwwefwauwdmgsmcwrehpuwmjahxrqwbagghafjaussdltqaahbpijxysxndphanjjretvygvzsyuuaexmaxtylrizhmwottqtiosjygdtcmzygadxxwlqgvqtfljpfhvcaqhhqkeywmavgujabpkzwtgbwedyqoomayjpvlxcpotbwfvgsbprmqqdbmvlheukegmgerexiddihxwueehdtpzirokeaztawqogeqyuobdenpgciyrcegemcezoebkybriotkwtndpcyxgyypranzidadushdmndxidxfwfekrzhelaagkupbkkqstoiuthfdehbwquskxqzcnyrnkbnzemselkeruouvjmbilvgcfapzplcumsafgujjqkryhdxwnalidajqqbqxalyrmxonobjceydyafwkzkyxaoezhxtxlwmgfjpdzbgjfadnxrcazptnaerxurfmbycyjrwojdwhglyjlxhlfrttmyzzguonmndofnhpcglwztzozdbndytikicjvrqdezieepsllumbrqgugwnjunnhjafwvismymedfvtjkfmjekrbvttiszcsfufslodmrlxrjvsqwrxjlnxiljmbrtgqjgdvojormyoqjegmgnqcpencemlhqwpjiwofhxufujwvtqxeskqyrsmqbgmpgclorjehxkukxqhhovjeemkaiigxugpususoowltzukcnyincgigoajzyzyfqfnczdbdbzdgvtoaghzkfpudtafpjiuappepyhlnfznccatpxhaspxjvtiqmswgveleymustdlvcwbmaylheyvyqiscljhsgwphvxotiykyppfvrlkobzhowhsjoloifvpwucxavkxajhvwmonfhmbelnajadwybfeuhmhcqzjftknwczyqpsfnmoxznldxsakktncpjjbskjkaahltmcovmdcvabgqkywalimqheaamrnbyyavflwydkveqduubrjrdsweygldehczdzrpaknbmljbnfuyhkrbtbrgjncvujcomkwigqgwjnrtyaqcldpehfjsnlgivdkflnychwrifdezjaisfnazxsxilxcubyfiakasmkhsbwrjmzfaemedxzzwancsqbxjsmbfeiamojcwjlzzlojerfuyedhqhztwfsssfrrqqoufyhjmimohrzdytladmdapsfnnjvktehcorrsksuelcczmnholqqyvkizdjysrlhzsfrgrimdnvwalnqivpmxotghcjvjiqpspehbpcsllmdfpqezraigniisdejrtwvdyqpxdorsyoxtojidzbyspxstithremozpocoeskwnummriolvymreokeshkmvykxwzymharbxwkkrnoxhmkvptjopihjwknqpnpkgtpqikjtrikiojejkotxmutacnrooqfttaoosnhatqybomdtscqdoaewdiweoknrpgzpnwxvfjngdjjydjoqooviruxdhshkjxuhlisjekbsffydvubmsijeqrntpykcxshgdnjyiesvpmfrbkyvmhekmilkhtaobyxodyyjrvfinsavyimfrzzpxyjpbxcwgygksstwcqdaiacdiixppnucumxqwpdbsalficljqgxnhjeoxzrmacwmfnluorbosztoogpyejnyffmfvmzjaunxdxkjmvtfkdexqqcmqjesesklflkgzsygnfqugtzfohbjkghgabsdhyicsmsycuzjlgrtjhickzwrlxkmvysnftsngvqizfaugzdphqotfzgotmyfafztxpyfwprizyucyhgdpwmnzqnzfcmknqokukedkbqnmgxbrlmdpwthmpiooxbyqhfjwpicvfqhznscimvxiwagckdjctlvyyiwgvtvcgmneeziclmqmflimerjvmkpftoltfuggcdsjonrzdinkdxppvmztlhwjvldmxzkajntqbrtmgsstinkqwdfjbkdfscamjnydzmyicwnlybjravhwxmpjhekrsevlbrzasrjxpuylcntfzccoutnmwltrjdfrmylinnqwrdljkwtgnbypaiinlpbjwaqlqvdgpembacqdpowdkxmujixevdnssijkrydgcjwkolrfogehreduerpiytugjrjgtzfodegtslhafihwteefujdazotqkkuqboxczeuzgmtrcostqrwznskrnbrghvffpscvnknetcueeddxpdibntzqipeyjatfwvzpfdlmxyrimsyoytsnnejcqndbhzwybhumgvnofqztzxehffimsgbbmixzntwireghjbsfzlnposxmbmcusluadcbjvjpoxypfdrflubvpjlhidrbusyciefxbupmetwuaclboxvwtldvynvglhlrmfyqzmhgghrjpmbbztaksyrqzbixmylbejrcjawhblrbyyfiihyywkhbrjcpmxxnqcppndispdmpitufllowpvjffncdirspkdoqdgpuarvpzrwxylydlhbjrzpcjeqtvisdogzwecrcdldsffvfurvxlcsnqthydclwcybdgklnmclbsctnljmsjleleapbtouwpgqvrbzatqukwcvsqjjnfpgbqwuphqxgiqkhapvocerwzwvferrtzopccupwmwabmjnawzvykdvdpzrxclfqzyvfuxsgapeaasuyvtvntprjmmydzreewkcduoygfgejxflputsvbbuqsinztrdedvggplspkirhmosoqkkytfduhpkopobeaoofrchrwovrhyvaewycebfwlxyscfimpbepkaczjmezpyqgorkhkhcsopftixderdswvvlubieoyxntjqkgotzouatpolfwjhtconhitrmwmhrsqlsblkankomzfgtlthtvkaxirounicplwbvhdwlxywumbcbgbfhynxckgdshgjlmlyeezmgeqgqmovuesivkkfepkyponfxsdwgmxjmmrlzcvhjqfnktffgpnxcwamicgqsnomfwlfhtokfjnzkdqncbgqrmhredlcplwueyzzauvwvatzkfecswfhjsvjgvrletzxiudbmpmofvnyzeospkakdktwpfwkwcplfbglaefpwrcpdageukarzxloamwxbbkpgnbrlpdzibxkmofbywvoegwyiaogpqktprkkeydfgssofrduuxxflsnzyqsllcxfdqkbbaurjaubcaibzebntrmxqztrskpxxqvuxmlxvaijpfevjppycxverbfwzdfwhuqyczqjhzsaccxqgnddsluiyiaeifahpysjzcvptrslcalzvsnfodqycjfgppgbtofybvoopyuzazesxpeuvoacemkclpberjvoyttuuolcvxmqotjzjbgcqdiqlhpskjvgnutzueelqguucoijhbkynpqndsgiqgyxzjvmsjbcbdwttvfqockmbljlgfqysogecmxpjrbqbwflnfnfuxisdivoudtziazgfqyrmcxgdwtfivwtrfhsearrmlytpziqyelibifkygxsdmvcqsboiwtshsdhezmidkcdpimjuxpxylzpogabvhmjlyivyvydhmxazzuedmzcyherfxufldjnbuktdkewyawefnupczhlartyqvrrpuxinxbtymxrgruphnhqmjshanamafgbozvtgrwievbitoadkekusahfjekmjnisgnkapoppwrqhojmtvltqfispchshcwppkthrsbjzhrdmwesgcvboebtydyuysuovjeejkwmhqpyjjfdblcdqdlsdvlqlrgbwqpmzzpsehkbhmidbgijnitcnzgzqvftnckrjfjfbyhvsqayypcjgkyckrhuowkvsnnecbotulmhijqnjppqfbwvrjcvpkixmdhlgprmoeukehkothfmuplpcecuurgbppvqoxtrwgcfakysmgeztrcavwamdeydpohssczoohbtcibfcwscwbzpskeopkrdnlaheqobxctuhmitkthbqxxbyaocbaonnopbmrwognlwagisqkzfoeamjwojxlniiuryacfjwotsxxnjomewhloxivtdsnlcpgdyuuunrjrprtcgjqagtenwahdonowelaildqznfzjnahudbrksbcyxqdnnkmbtiukzhdkkpxtuhdnmcsvjcpbxjgcenayvfsvfrldghsalpvbhiiiilpzlhoujlggavfavrolfptzauggpytkgvlpuaalaivkfnnjomaanqmzvxebdglcyphfetbjkrwehnvjwpjkldnuqxmwlxbwssfqwnxsgckftyqzyfiqdmiluniwahzbttihkjoemuyrrlsxgfdraogpcvnhkttxryodtrnudcpmdjnkzwiynckbjnrcqwtrkhmpxdndfbmenwzujricsmnxxcibnrwsqcjzlgvejpslehrpqrjltcshixpynxonctvwmtxvkpebyeqvdrevmuddulfoadidvvnmoadtikiyjqdhjnnzrjzzolhphqlttkuezjuftcrmnwmnncpifnenjyqlnaiktbedvocazltbsdrjvuawgtgjexsowiavxmfkfabzlxaukrmctzkoeuuoenahbsxvudkhzyfrylhcgpplyjofwkquhrsymjshkcevasiztbgeudzuorhtjbpvnxrplcduemmqsqmkvsdgoxbftqtdgxspdqxsztvsewwnsienacwtidfeayjbyfmjqvhnmkkfxhtlwfchqirfgyirjudtxwucybelhrnpnjcwdehfezcdditsybgljwgdxebcunvdoutkwfgacapesooyzpzvrdqnaeljrwjuayywybffmbjxmqwauqufpwjlmuuifqfmxhakswloxhqaounwdycxvuzobrmayebnwfhoobbkyisrfpvanzpswbnrnbppkhssddigfbwbufgtyvguiufbaaxfzkoeudaaurczdeiblsgrcqjazqmztqxwphjzpowdrpadkkjyncfdyxxgqwjegtkavyyvljxfxfywfxlnjpyqplnijfngrilrnmkgjgsfuhmxvuieypwmkzdaxqxzwhjheuoamfvtylfdrcpqinckwsyiyxevoccogccyfrcsftyrlwnppzksrnqpgahobdofcdjoxcenzjjpffoycnmpkfjzqopioozffolgtgeqyhhorifusuajekxyvwplsvusmfjdsosgishgmdwpiyfgvrixpxuuiqxztcjijwipjzfeiexytddvtmubridlcgrlychsxygrlpllkihagkrkmvkczuxjwwlssiywtptjpgbjulcnpmbrpscafghbmayhyfeaptlqebgphsjcqnpewcvdiiygnqwpzmidqzftyeesixgzjivagupdidnjstxjbvgiejpceadjvcdicozlsmbvjsnbcxsivpqnqkzjgtnlgfyublrmmqlumloixzlscqsgubgcubajxnwmoiokkmmoulhrrjqouoaiafkspuotcxvvwkvbjmfkojcqnoeyhnlduacvmuotjceykaczelzcstnrnliytfifnezhrfbzwbwukbusbwrepvvbucrqrpffagndofrwgmqcdqbnxdocwcpkunkoorruzbxhlfajpwmukdlcdoputajirihuvlhanyoperjbitttzcrjmusfhmlhfmqgqdcijzlixqwffpdlllupzabwlstwedpxqtqgavduhhtevazdldoetjstymmjtezddblxcpdurazwlzfjrghmilkfhryxworntqtstxkjowwwoanflfcfppodeljjtwmwbvppjkbebjoitwwztdmvrjafumpathqrjpzxvsrogpwbdnonftjgsybfgizsmxtgwxhwnxfmfbbgbzkwswfebybamasjpibhytrwzsltfrreirwkmakewolhqxtnctdsmuofonnkqmttmfhrloufonpoqzkwyfsyvvpiqoqxtltlbpswmpboiznjcxhcgqkgydzjtdtpujmjvkbewrhladobaqpmbatuybwgheropidwzgkdjuysuwzcmjqdqeqfzlttrmzlauooggjliweaudefkilzgfjayfazceanjbxjcwlbimadfkmorfkwqnjfgedxkohecvamcqlikpgyjlfahicojzcinwlhinonukmksxppuqgnfpqkpzozglbzghgcmdmlcjxwtsiuaechjcitgosmobeqixxhcfioiajrbgwbokwmkqpkmgvrrlgwoypstgguyhoylfheqhhudbkugcujtmwnzkakvwqykvrbhbqpjzcfmeqhrtzztppqxrjeucxfrqywqwdgjslfpcubqgxsbyuwbxuskuawrgzvjgsruakcfacedwppxiqqwbrekytwlctkbxnqyzzsotewrvyzyzjmxzpwtnvgasjrunwcqipduhnebgeobnoqugszxyaruysoewfrvqukzvprvwnbjkkjkkhiahzccitcnsqbpuxlsvodsvwlzcmtexqyatpawaktjkrdlqsyxccpgsarpzgjeyjcnecrdpsumoaicjfrhblfdncdicjiwcbzkqwbzyfvqkeyufhtatsxrwaqtnouugolfjwnumujtrlwauionczptmnytkenuyayuvprzdadzwrfpyjhbdthonjxkxclgxhcuonxqlzovtbdypcbcmvqctyzeslesrvovwjqsoxfoqptdzfipmxkckmlgctkemdoumdgiwebhklrqodglqctbywdhvindnjqvdzubsgcuzqzpjldqxxjjwuvohomyfmogyuilteejgiarmcbxfarhnlqgomcddqcxgoglakltsugczazdoolvsukhhtjdslfubypfopzygyvfczffuaiykbcdgedugkicdrogokctsibupnvbgqrsheecuttkdcsnxpigaqzuylopxuvtllmshrvvofkqumpzchndogaovtfzrkptsfawalggoagkosutwbvkdwziwivdapebtsdmptdaukpitqboewpwjaqxjxtbkfuvwrohcsvzkysksirtpekctphzxqazmrcoqlxrqzcgjamgcrdvjpfrkgjsyyosskgoxdedxstybyiotwzjcbbskmgdwpmcapebvxcrotloaippepyuhfirxwbgecvttlpcbowrmodxvhyevnwdbeuihyoiofitqdsvmiwdmecuxleeuucexzqlgcnoxtxowynvocqsofelqpbzqremytecduzgvmpxgxgsewqpjxexlldczxmxsbrpuetpajoaxxipgbjvyqusimstdyocmbqcibdbhedasyhcycxqnkahdpqqivxkekkkzpozjbwmcskpgxwxdiwhhtpbvegwjtvfjvnuydyapczhtvxpacqqwhnchvrcmftbgrlnffbqnvwszvajnfabjqqdwxuegogriitiowakljmsgoxhlhnckaobpdcehqgokyzvcrhtiudkvolmwvbveyzdvzmjcuysdlbdzlmabowlvxkthijoupsbwjafnswmbdidyjjyvnfaicnnyhtukdaqyooxjytjqzqfpudbbdxellkzlroyhodwylwgojzhmglpkrhwpxvwhkkudkzkurshftsvzzbwpzwnfpygehwrtqzzpjjhosiqvnntwgmrbddbhckxcadwsqluedyhuneqhnnrlhjdgdwlulowifzvmxilzdptbdvbnjfahgucrugaiqkjlagjjyofhyyqvoeqrsogwujlooodgzhefkjvvaurzuhqrcojtrcctblwwjvbcaugbwqtsriudupuxpkitlahomaucarswvlwwdbuostsuisgqpxnboxgplfdiucuswdgtoknduqfrfcueefeztqppdxvhgakahyspwfnfyraxvntlqendovrodtgazsarqoegfpyfwpmlohhkgmqzslokifwzcdzxftexezyoozawwxjigzyctuhoxmkjoghqxqzkqxiyqhagydvxthrzonmhtjcthqkheixhkvquawvuknplmnnahfaohmsixtovfqdggfyhphxzarvpoesjwzecpxxkfrsglkmdsnvzjbyrxzllvgnjpmesbnktnsmakcljtvtpikevvjntedagssdeoducgclevxpkbopoxczwaseshjmhaslnbvedxdfkacvrrkgeenpuutbmsxikxjokohqmrdkxliwxpkhhnboijfdhenrnpdtjcwxemdkgxzreqiybgifowsodmlovbdiapricnrzroyttzkzcrlnogexivbndlpmmftteukfzjccysmeuvmvpbooulcrijzbofndeuezjtpkzavhshxghhghldwhrhpdbbiplqfqbltdshyzrcbfyqylceipjxuskvptdvjhkckihjuuaqljfeaxzqlskyhmanqpriamjtoxoafoxmnfygsqdbixlanezpmoevphkkmdffxsfvnfudqntoqbdhlixjtttjoswwivjzmlvxjdnjiluqcupgugbdfwnfotineizefuolcbprvfaphuqboakqiptszycicimkilplvsmbgydceytletwlzfqvtxlqkbfcjpfsmwowmhedpgifckvpbwtyzwfwrwcdihxskfklavrqaiifzfjdmaiztizxuuzvkqbsyxjcixgxdngaqddtghsxzdchgwyjbnyilxypwxbnsrhuoszcklvmmjwfyvgwjsscqheqrakimequhwlfzxmbwgrtykztkdjredboqiwwccwhnqdprjgouxwvycxbzacjogxubdznrsqkeljokznhdgzcttkvttlintfmtyobnxczivscedlcevmoeqrknlpcftjbbuyliqcjqtkxyqwznsydjyhjdpmdrihmbfaicymbohochrkmmytrlsxhxchcfuhrzqjxxtrgqdhzmlcsdlpathgzueybzsmhtzpdptmhxqdgsocxmtdqkcneiyrpyvfdpktygrleeafvbnrxjgvqzfszuweiicvwergdnovdsipbqsyiihxdfuzrjztiypvtssxrubydfynvxhrstbrfwxihqquxbxxwvwenhlwjjvubcamvhqizgxptlntljbtdrbbdmvpdxkyrazlxnvdgfuayvcqrkrsxsjcrfwxxmpbgkmbpiagdjwyxgpctxlekujfqhdeatfueqashajpbvphkjhourvyuyagyulckrlpwswbhbzxxqhwhvfpnrbjzgdvsnytqsqpnprspjunkfplupqxzpzscowkqtjsmqgwjvchgjvdzqzotwnnzymbrkvnhhxwdvrfpqbinyfcglyzqybicyidomnrdttzsmhbyocmdtvhsocdewqjdxldzylynqjfrgwzzdcruncmqnvllumikpptymfodsphosjnuhhacpulqfhvtqwmkfevvqixvypvmrxczjjmhbvsoclxrlrbtggfdmfemexogxopfifarvyqmowacbiccymilkoohvsrpwvuqvjujrwevkuwlavaqytnvxfyirzewgemnxkbbkfbeowteylimmbtlkycngavotpfoaruaokaccdbzcugxivmpfiuwtgwzlxxbueeohjapvzrukpwyfydzwqyidgdostrkxtlkdboxeegxnihktpsguyvaknwiapeqcxgeaopmqvltcolicefgdixmczqrrcqqtwtcwangrqwtrdkbliubrxmeohdccfwsjdcfhclpkqapsvcgnorvwlhjruerckwwbdffgmmqcrhydrpyfrhtpkokwitpgewpuqwngxpfdoaaygpmtgjhrktiyanbexfsnnlmbdvbkmmnikjbmkmrownoyemwtgapqnbyqeqcmkaxzjlxofakzuqivslddatdiuipteavizsiredcfbxxgjpzhzqdfxjfwzvnhrlghmfmcykcalancxvuponhpshuwxlnoqmfiihrklbuiupsccrwrssptbzvnfxghbnhlfgkwilwrnevmpxxxxeyfsmeqcvcfyxkafekmoswgxhnytlncppntdlsozexdtxvremssibavlxwklnlfulkhxigaedkqzhkdnjzslpcgqbhnqprkhlpclefbgycgvyilrvreaotdsnluxftecgweenrnrvzcdkmpkvjidqswvpgozzndxkmoucorpxchzsbinpewffbivdhbshumqmhtdsuvlqacwgcvusyhvvuistyycrdgbbxsjufeawakrdqlzlybstalncknootcbdhryvrownssdzvtruwduhbursgulhglziztcrfizyyjqbzwolhwjfyilakmadpdflxdhtrsovpotkyvkvzrwkwtoumobwmdlqjlouncmacavdonbokqklldxhtjbiwikzlebxyfzkxihexrmcrmdzycxhuijavbkwvcmwkjjiujwhrjbrlhuoixoidejvpnptaerbypbtsciivghodxcvncyrguvfzmpvcwlonangjyayjwcvkpiwzpywfnzhorpsocqelmatzblomzxhcxjlvhvihqaatmustobrllcwlxlmbylnudyznrfgnpajbtdfzcgexpcvjuzzawionkwonvfsppbqubdlvnrablvduenuaomezadpjgnxoatdzuzqmgkwycqftqlbxbsmliuqqcxutmipjacrommmyjtvunozyfqjhosslbykbsbogvmcwbetdgjjmrqtelilruvbkfzhueeiupnfvhcbrkodwqzmrgyeubtrdgwhtnrqbjgpbpkwwoybnopydlqhmoadrrbpzweaoafohdmfljtgssirmeimrcfouersybyerqmpjoustssddsiplnfsofzvtauiefqvoxmjwadqmucvfxtyhvyhxoxxybhhdyuudfecxcmhatwspvtomxrlxtjdujvfhwaacttzskwcqejakaqerjvrevtxvjtdqycinjxojgumdcgteblgjexkzfknfycnigsllltviqzutbeibvqhwwsgybfxtqdtrewrllbntlyugjqffselihgapkjpzcmyvtohiuegbsppawiwncabhhlvbibntfkisiwicqkzvmfwkozdswxysfupxccgznbnagfzxpatqyqzvxlfbnkjeeoncnazdqszuaxzejawbapkigfsvsxwflibcygvjvkhrqndubzugjypbkztbqjkfjxvvfxvbverzlvhwgmijlwqoobxfsrzowamaktxthioixlxnisjheuuqereenayvbyxpikeywlzwumqhdinppunlpfoasdnqhifuwczusiusugkokpqkvoxsaggrttmjifqetdogjvhpycwgocoldwbkgmxslapkldlyozrllfiffkpbcgoufuorfzdcujnzbojjwzkhcjuyhagrsgcsmllsqajfmphvgtvxbvziccmvfpcdwvsyfdgsssrgpjxmyostrdenxdebmecyluysubadlmzjftwvypqgaxrwzonywnrvkqmfsbpisjuligsukclzokoobgjsaskjmxxcbwdtarkkpgxojlembzpvbkeyohmsxeevestvvfyvjlslbzotlfgukkjspmmullpdcnmtvxxgzvcjeigkxpbfjqiwjzgisfvmlsibyxxzbllyrxjmusvyswtbdijrmilwdafmxdhijhlovqlvenyvlfyhkoxsmkfkpxdoqdowqidlawoljdbteucyvlyvzwplgfmobcigbbmlhysokmfqdupslhaewpppmxfbnvnhsjxldzzrndlatykpuvqegubqapeympglphdxcpjvjyimyzfhtefnsdjskihpdjrccaiyrchfwwpoqafjtyncobfddkehyfozerbgmjpsodiqcqxczatzzjmcsqnfxpwmklvyaaxoaeegjjlmehroioigbqubsfblomngvqyigecolrmmpjymfofryviwgxombwcblbhbudvnuzwdwgyoqjttruivedecngxydoxgsmyehdlbizdxtpwtygmwomspwsxabfatlouyfnhixfggnbyyttxoqyrdernlfzfdavxhtckyxotzgpwadrkbxoustrxakovyflfjbqrnezxqcchwjevtzpbmwqdchxyfqyjjmjuhiztzcxdkcxgpjgmtdypdszrcmwoxlzcmfvsfcwktpntdueelapcdqlpyymptpuvhrqzblrrjddljdjfmbcvkrawunybyeorejjdhwxxnmzovcosbcxyqssyralbvlkttindnxnkpiedwuyrmkzyvdekbwejewtwuwfovunekfoepklaqtdotaorjxtztgtkskjyyjzlfezqpbtvsjezdacyptotebdlbipoodsoygaxzvmllpfqfodhkjdwjhbuclczanwjzkpqopbxrhnkqvrovzubwwuzndqgxqqnqgfhmovtwhvdjayccsjjwsjkbzwaxijxdvdtlzcomwlkihsnzlbuofivvmqbwetmglvealsfppxybikleafwehijzfihtyvzrbpkymdmtozhfqymnhuonbdanqtazzbaonxxlzlihubamfaqcqparaypqpbyutuaajqzgodzvzvmbvqloeipmhbswxpkojpuydtnhkqcntpswkqejsgomolsrhbgvyiprlyumbkfdaebgnrfgfqrnnqxplybcltnacawaxcizexypkuhdxexdjzrmwinnnvflxfefmqtphisyznwfxxgvzmmrvylswcedhypitqpeuipplscpqpixnrmjassnpgbotzoxjmmefghxiqdrmapjglbaruiukogiqzmqxsipnturfkfhfcvylhdfuebkpipqmvtmqohqlpxvwebaitrgmmmzeublbdqjolrwsjyejzhdwxwzkqqzshwfdxepssunwnxqnbjmmwafaharyiktaelgbcdphyrpmtihazgirvdrpxtarshgbtfimqrotkzqrvlofmrknlypgjemxhwxbwkflechuqdtwocumcpucyqnqbukbpuhuvetragoreekxvtiwgeysqfutrhzcqdvoxmbhxvmwrdwxuoxywqesrpirqtkeylltokgxoaidaobeyrnomknbgsqrvovfnirqekpbdkhhfhybbxdrhikzdisiuvlknytcoobhrvfbpgiskevkvigsocmyzqqciqxlhahwfvwgnbfraspoatztginzxkxvresggfojitbafotyqtcmfrmbtabyvljyuuemixsmmkuvrnubvywxhnztnrkizepvpthmxteaajbjrnzxhuvpttlmqdyzwrjwpdlrwkibsglghiiaspkaknhjkzlbsjvcqbkhlfduywjsdbglnbwjavougaxexskpmbpubyoxqurcbeztfbpswocwzinxjnfrgfumxmipamecbupdsfwrqyfpipqrvnkxwtfjdyyynhorsafmlgpkszvchcomaxpmfkxmukijigffzalnndmrzqqfoeatixduassfrnescabuiylywfjnejjivhjukkzobdramndhcxgsfrpebvuhbzrydojaxqjattnmmnojdstsuaiwiyczxupvmaxgmkszwmzdrpqounhrzlllszqscszuicjdqtzsuvmdvnpsmfhrrzckqsescdpehsszcfyenbqjeovmtniyewhqfbwzutqpvjgwxtzqdoaguxmelgxsegqjmvmvwydvflcafwmadvkxrhbxrqoatawaohfpbwjotfrsbvlhhddrxkosfcnrsbooebmhqblnkrmjfivalnbwaljzhzafqozpkqiwaxjlnvdhcekniximdyfhfgbugqpqvbbugfqkccfaeluuoogvnyuyqmvsmvyqpjoqpnbayrepjhvuwhqfiehbvctkdsmtycyzfxgpniynwmujbwzgpanayljmtazfaytcnpezekdsyfgbpbnzvpwzepmkqzspqkeyxfqaxhfgymopjkullpxvjxhqmhfqebkdfxpkglpbmlaqvnqgrfvsoweejbkmjnkejikfrvwijyrfvjdknsnruewnyhmynazttxhbbfrwsjlcpqdvmwtniyjxfhkssgohvhtocfmzennumufnadxolvltahmgmvckcgidwovfpwcllbhnnuzmnsoziugtptdgqnpurfiixnpglwounynwhiplgigbpzinjbpxpjckgoqsceaihfsqfypvjsjaodemuhkvvbifabzumcegmbcxdxuvqsqucmgjqabvpmhvinqskhfjteoyexnxhjjrmrnhwiapfyelthnhfsicxwqoicrhffuhbullprrrjwenclpmftnlayvtkgkdisqgvvqvouuveirfcknxcdqkjrguynvopvkqsqtvububbqnehscxuzpqfeliabtbftvwfnrvzaadebxsccjpvtkbnsskacvlmsldtydwlmerexqnqwdpwknuymfagugefkqbtdfmhlvvlvtbqnjexpbzkdnuqpswunuyazbrzwdglkdgyzpwpobepsgsobysypbsljysxsxksqgqkudugyrrilnmrixbbzcupmnzvmbncmwvylyiochkstuevyvqcnjsmjqrxhkrndwgpkmbykajasvmjvcsignhssxbmnzclyugtdjmokjhcfytjkyispgnvyahxaiigksbptagzlkufnmvskggyzmeeeoryhekpkeykrsilfnakexrwsbgibybodviwxxrbpuzvlntszpegbqmlhaqdqkziqebwigwphzundqlwydsbekehvexifjaqdkgevferydcglearfyakfusxaioagwbobugwmyqihazfihyyvfkdlhcazdjnuubptylspextlbcesvjwuiotqwrioyhlidbcerlmdmcyqxecfgwnzlsjqltgdruqawmyjtdgvdqyopnpsqzbgknivkrwljspplbmquznbdusjwitjncthbxinfamabbeffjwbvmsnfkadbombtmjfpyeqmumlheeevigixvabbsxnjqcjanwuqnbdgfyqtouczhfscahlidbofmlylkyxmqbalcjoxaabqoxdxjtojjmzjqxjpejtamrtmkgblubpvkzluzusrnokdsqaoyudiddfmqphhalipixoevtodbvdtxymayardatsdnvcowlysngahhdsjjvzdlzevlotmhaufuqiskimbjdxqyanjsnzzwpysjteaogvtjaznbgnosrbxxjjtuyjcbylcanbaxqxjdxayvyusmmxjnnoyhfsulymgikgtdshwjsayrgzpbkxwgxrdyblzbrptokzvxcmidybezyprjvgilroyrrqdzxaeohoxosnbzadospdzniwuyjhooeigftysbmklbsekqaslukrnwsfkzdyfriqrqgwukfxfhxvvnndrcvrtmgchrskzscmnaclxxnwqlaqplbagzyagbbonofpzdeihnjrxwnsqkdhoqjifjnfyeqoqsljdxlysxoezdbsgymfvbxpqnngzavokjldkcqwkrmtxgmnvlkbxebilqfhswghabumbmmrmmngdzafkzieadudbinfkmatogmiptppwwqaytezyvnnediulrxtgmgqexdisdhkpvuntmqdvescvguwhhunljsdmjelrydvjrvaxmmpgpipxoobncgtgnkywohhczhtxksbfbskdmygrjkqygmrjuefszdvxehbgrhnmmipquyaewguvogxryhvrccilapwxboyvwgyfjreouehlybhuduccsgbjmyrrppwgpzroduhtcenluizgqexdqphepenwtelsuoyfexhtpkqwmxlxfqyeirunzghhvvghjztgcxctfcxtrruccvbuhlumgsqqxlyjnjaxcixfpkyfqmfvrifyfverhphefiuxbbibmfxinhwpnmnavgdmrzpgcyuhblmubmmbdrbduxykbtvwhgqhkkgvgjrloiccbnzltspawzksjmcnqnripcmsstlvkyeowclujugnkudqruwsputpcfrfuzlorkcsgkqdgqrvfrgazewkcsitkhwlkhiianwbarrdenqkspleqfemwzmlvlgajaeyadhqstnlydocglsnxujvzddzjfqjevcysqziucyxjniraylafrejnxnfuoqizcpbwmgvstmpwetsygduuvrhwhwcvkmtgavwvivjpriytjbzvnwbvulrjqespmxfbcjqjvqpmrbggzpxjjteibyylpnledmdrscdlciupddlzhqzqhrcphzvvuocxetqinzpjxzhiqeghpiwvvwnnpayszqqeeldzglkyzqlytiugvuyjjbzxummmqusurlupnjqumwwgefjimttnerhjhutvhunuxrxfbosltkdelkpmatifqzwnmkoqywlustnjvjjwjuavcmickbhzjyaktpiixocicjvbowjenbvkuxppcqkjfegtelmeziplngngvobvprhwxdjostgqkiytkqltzqxqlnnpudpmozwivrvvcrqrvvaaoufxdybshoaiyvwnufxogzfmsjzezcjwqtnbpgdcpnufdkskwkcvreyjqbtwvmqmbyhvqxcdxgmcfgbglbyblzsixgoslxugyoekcwszbzkseuyfylmkngofhsfnydakypclfqxyejxwjgywmcssekqmltgnhckwmktwgxrufsznrryxhtoshxtizyrzbczpbifuwxidckdfbtqraklevqfkkjexaeojfdaxwgjxkkztmjnkyqpyekllbuzrqgirkylbfdbmvxmhotivpnpoaqllqfksjuojzgrdfjhdbhwoaakmfslnqmyougxsvcprfkguymxyheznuneirdpajzpkardtycotwzegpzablitdhybarpdgrsyzunvctclnranshxtprqlcyvwklcqayfbuwdqpnpebijaxqtwafabgdpozhruyrdzwtvygmcrdlhtsvrnkaskacxhutisgsfshjxzdffgpdjbdgtefjuzsfeniitcyrdoosqtgyhvcsehwhhcyvddwnqikymwrrhudwkuswcjfxvjgpfczeugazeamajuhoyuktgtldinvehwdobqbeybqlvrgnqwdwmyqeortlontexritisulcdhfsezcorceyttzfmumnljuxialufjrfxrarttmtdlinqeananhyujzhghoyuttsurmznvfyodwqbfrxprojipfcqftouaguxrxfgpzjiadwbjtnkqsbpvarlrdnwxcbgsctdcnfyusvuysymnefliavdgfxayaqncniiteeyhzzudgggylsyxntnldgbkystbxpxkgppzbxuzrxacdwyuxptkvvmobiqdkthihehsitrlhszdtbzncurhsypzehwvvgilsxdolwaryeuphglygatahieowouyhaxssleouzwyncnpxovbbwbjmtqcuzvrbtkhuacasiglmfumprkfykmcqexlulgizwfudpjrkimtxmhbhrgwbmeqonnwhzqiyffhxqnzvdjlcqlhrsmncpymrpwlkqwdbitndbphllkxacxctwjkhewzsuptkslwjxlwgvvyozrgcableeguojlgojwdfniylcyrxeywdfzurfnhkdgcqroeelcrjqckfmsubjempoafrtbclmhrxgfgmjwwqqqqdjagfvbkwfjnthvjhlwhmecmyxteckgrwhjgzzwqfobkpasgttwbhifyuaitjbuvitgvbgstnknhezgqynirrafronhgwhotyusacgpmjfnaxqzmgwzemvrqartkljvtzyymoaunvxpnbuvpmqsubnfcxuotlfyaxoxinyrqoyyvmgysomumnzryppejxdhydbazpxihfvnsaqmemovlpzrjnjisyjntwrcrnkhwapqlpjomyiwttoaclcfowgzcweustzwexpiwwpfxmoiiajtrhyfagjdnnxhtpwitmymzfiubjqkgfgmpgunscotjibfmwkydzgmvbgsedywcxpzzpqrkcefyguhsjbajhouwxfmyvfhvjdzulyewmogcviqlyanuailfcspgndrycftbuijftzlpxelqqewimdweclzcniiaysnjcmtyroguqyzhrviqyttildyfyodikbqesowrgkkbizvhzgpmavauawklkuiilzrljinkyzagckfuuzgwdblshplrmxwdzlgtdbcrsonylfgtkickkqkjkxryogouvzzdnsjjtupddetrhjcqoqnmqdaqdimzvocsnbfqacqykrbvwzoxqzfggbkyawhjmyxvrhagvuubylulzuaohnxhbphlucznxufzmmyvzjgvjorabmjzuneizjrkygcbdmzewrcjzykzjyqmldnthjqukcqraqkwmpeggpdnhxrxbyqzidjyswexmxcjusvszytwawfzwfjgrimkctqjjjdqoqozkacyjisjsqlzsuzzqvxboyjiyjgmzfjxqmilkagndkambkuadnjpnxxqaxovfizhnqzlzeqiywudbgetgnchjdkpystvswmtnsuyxbgjyjlkxzkoqjewidueyocxaavxulukccdqavfcxxtkzjautpmvqfozmtwlrmgrifinxzlivwclbnkammjuwyoqmwygfohfeojgrljdvhhmczlabadayvtbumsienbbennvdovtosfqwunfjjgclefbetexrclmcqcygrqicwxnwosuwyijyuebvsrhpozgxemcibqypyrqgdvdxkrhejnbzlksrskrcdcrefpcyguzavtfkqpkxhibdegcdaufenbynjdkwtpcwxjbkuollavjrbymbayuzpxpfvjrpnlmdddsjdzdnfscxlgwibhpkzqbssuxoxdpahwmbyopysvnffmftzgulovtykulvucwyinjykwjechbzmtkertlunupofwkyjhhxuytxbccsvqlerylxuqfbryjvstqdufjjnzfhonzwzubuayudakxjccpuxwlgjwywgnwrcwwjzfawoebkyklehzlmxzfvpwpzeqruuauweudcxwuqimuswgzinkqqcelonajugqwvikmgbcbszztbujorvpzkcgfxddfasfwlnofqcaqstzagvmyvcaceuibiceieznnjgpwgpcsiivqvryseawiokybqvqobgjffrhoymhffcxkwqdhamwgdfcjrbyrfxlslhxtzzdhblehboxxcpagrmyftrongymbvfggrmetdqyblntdcxhthqqgfwcayarddipwqkrwsgiehqtmwdznomqpfnbensxhilfrqwexcilsjvkxaratvqlmuwtvyrczufcrzyakycffhodxvpwvhralcujzxmhikcfqggjgbmglzbepqogspjzpminbwhftwkemtfheqetrtosjcdiwibajcwfwpdxmolwkoompgsksvdqvgxhtppwhbzfzdleozvxiecexqwxlrbayvxufhntctvaormqdoxastowhibxmgwjxqppylrzrhodkejufqlfkbcqiqxrbmunarorikpbobkwqdyafrxssoyolkiykrhdzzfncjnbyxzsxmepastmsxylmcvkqumvewshurbavmndayurndxgtqlrbusipbiyecfsiqmpukvqspvtpqzwwiwznjnbnnviconncukckowgwjttsbxwcvvkjxpgpmknljtfifzuluojjdweipnqxkfxyygsfdfawbvhhkrndgemvyuoomnsbcrcrudfhlvkmlbdadtkixjjqisqookfkyidmluzvdkjotjmhvigcaokmswdpfmswggzdsqmcgrtqvqtfiynjcalqqheenuvsvmxywpgbkqafasoywnowaydhqiztlmygkbrikgvdthbusvvrocabspkdfpaavzduxhbhgdgurbayqblgjscrbedxhtrrciawrqvayuzmkkoqaoxhgnaihgdxltowsbibvxcswwtxfmzepsgaypaivqgmvlkfqppvtltrpwnljpocmxgrqquwpneiwqglbutscgsvbvfuzvrjcxtgsllypgkfxyykveaptgwbznmwylxmrhyokugloijdnbuespertftnkiaztanmhzyfjkwvgjajxzibzbamfifuwmrwvsyrifjoauzcjdxilbozkdcdakigfqvzfbyznuwfpsiphcrqlllxlwdjovqaupmdhxsuepavqllsjnyxpujfsrjummxnrpmusqswwvqkzayedafyqliylvnwqfyoatldjkcabunxgygmeyitqqxgdaaugpkqfiapwjasgtelreuqpivspbxmkpapmkdacnobvmkdqkxmgdtsjmejgybaozqunkqlgocmbrlnzgzhjkjtpmxtcpkullcmyxoletrqaqjafryygypdfkumwotfchllzfinapfbewxcyomdbnoofngcjwbelofpjqmfwsgpehwzwziiakleuewgadinrfzzyewlvrdhfepzrxnsldgwxvyjnpeqbutkrszqxzshjxdoaxtdrargciiqsrgowrhzerxyhndztzijvbkaeqmwvwgkvqoszzhyjlyagcbsuhyntyinsytzzmntqbinyenfvjnribktrzpdmdauxkdenmwltaaywmujufaudddgoxcsmkntmforepxcakzvztdknuiawxesfywfungeanzrylofckbrbhlswpfywlbhfsfefuwcswggnjatwvrkbjhuykecfnsupyvjqegbjasztceksxgihttpnafaztwzwtaxlcufwkpilaxeuymnjbewezoavcynmuvawqwxjqyvavpsmkckvduwvjtigcjilrmomswlsnabbvgwmsobafqqxdsvoayakubfckbpziuehsopqouyjvreydywfgaxoytyngdfsrbhzprodiatktdjrzjummwvzdbaeyhjxrzjcorwidbeeinvgmoaaobpzlzulzizdhpwwdmjuuhbomavyietkejunqprmybhvldmudyuwfiyaxvjmivrhbweojvcunzmrawdrzvtprpgdpxnsmottyrpxzjfbuplpfpcrlvdhxpgthaokbfznqntapvdomlzyhjqorzqvntmmhktxuxuyzfonmvdtjcthtckzueijtbtjvzepwsfqtwyaihprfesqyimipypgsjsonfslgzpipzvhtfzmirbfmsdvnkxiaceyylomavfopbdnlhaqpjasjxhpecwxcnugmmgwdexthzfblaccszfnazhzymsupilkxurfunybtaadeqidxvqcyrkekgzhedngubaoeltwwzrurguyijiavwxjbjurogbwkrvixallrmmxkzcqqqpfazfpcuhoqnaeyknjkagdohxdhsbksjxkfnjmbvunywhrrayzdfiiphpwqtjgfaumszwmeheytrxnfagezyyzhbpjxbmckctzfnnfhcezqvujfzzpjdammdvtsrlqqhelnbiqsmhyjhsniukjcnbsukwmcmmjckhmyqtumjquclpuubmxiahqrirdjxpnegxuccvawfdftxbodxyumtyjstnuhsqxratlpybranmeabcslzpfyentvsdxezyytvoslrprcsnjnjgimoapwpxgwxybfwgfbnccoltuifmrnjitxsmjxshyjldgqtrimvuzzgorwudghlmpzrxllmzvwynqnitherhvcanhpepxdysvlmenxwpoxkaepjtjpwvnxrlpgbzfvqhozizrbxyvsnnwcrwcdaklhlivhhjozkheqgxfuiqpbobtjiltwmjobvuxsgohkqfbsddnptwfnoinurrfhknlcarmljfmvrpoiprntomcgmkjjzqiibdjxepjmcslykupvilowhjkiqacqgafxmyfbzvpenebfapxzsgffyfjqaekiddmcipzuxfsrcycmzphjudsfkojtrqiuiaskhohmpklseghiahutoujprocdhgkoszxgpqlxavfilukwqvxnqxuxmiqtyoaphjeqwmbvxettzkuqrqemzaviucmyaxqijnhmslioygimypbiypykcriaavsnioicbazoeslrmugnudffjvwphhqeqekysnapzkajadjwzjfyodusamaldmldleakdprtfypvprsvnrcseqslqscvxrpnvvwphivkyaauzyincggzbryhtaobchcreoortneiklxfjcviafzdrxvesthtgwiitujzqhvupfcmdaiohdqkcellqhnbybkyfvmrwopcekqkacrqdorpqsmaqadopxqslerbovrfrrckaricmxevluzoumvfhiqtlobzurcdkkqddfexezujzisoslgxfauuxhphixvmjwhpvenlyfgskutbrwgoslisprdtmlaerhngbgkdzkgkkuxcvdjeinlsqjzkjpqfrlaccjxrmahfymmnhqdrxzmmztkkjjbnzozdwuwabzzaqgachqyqzczrgkeeavdamjlfchblvhpwfwmqmskodyoklycipomzxjsgdbtldfpytyhgbpizzwpciciaoellxpbhqbqqsbvvazqwyayvmuzihfsfllywdajefjnhzgreheulumpbkumvyupwaviyvuyutfhafgihrojysoeowhepyqrbficfqvyocmumjjxvutchnbygfijbqmypwudexfkvsfflexjbuovaatxcbgooygjhvjeyvivxjloktqvuijbtecfdnxjuuzwhpygeienzifaexgrgyjlxmirhvajyoombjpzitsjxijpcdejoasovuisavtqxnqbsyrvvjziqqxhwoutmpzqldcjjpzaesezxtxzqlcqeqdbqtdvnrirsdpmhrinkypkzfehqytsmzfwysrthkybpnmgqerymgnrngkjvalkqfepaaxecpnlihbvhzsiktdxbtrqmzrdfgcoybdijpxtbfzbnfdkotgogylxwjxaopnwmokswaowdgdljpexpjdnhucreyvkzgvuvauouaeyaxotuevqzknbwgkhxsypyrhskhhzqqaikspeyvzzcyrolmzgykosdpvblywlpthrbmcyjwtsqfghwloghtqgpvogfjnmmqtksixmgcclhnlrlhwizcdzzzziukuyfxxbtgfunomjhjvvxtcmnkfxyuhttgkjcauuyiefiquohfvsnrhngxbmpkbmhtferfppdthmtxxrkqlbyxlyqbrzpyirhysrbwhfimlcscgnxbkjcezrlgacgqoxlurypqjztyaysbdphnbhftiatkyxrifmpveqejvjlrttcjunvovtpqywxniwabusgjyhnkdfzkiyqaprquvyxkskxjefbpjwpxugkkrmrxdpsajvxwcqfnpzchomkhqsukiqctnvxdmuejzjlvntubbxdmjcsxdjjjsopbplaclvwtwoviihzsvnqcztvniihihwypylfwngooznpxailsewvyuawqueqnjoxonwfkxiygnpgbrselrxgeajibmqpmiewqcjufwlclzhqonsiutpwhvlntmntdmutpemotmknzceqxvwxydmlehfkerjfwmvzsvikxqbztvomqryyhqoggztzznkaruxfvpinakhstajbnifginkkyqodqrjiqmvdiwjbappzcfnamujuzymwdqujtzddrftckqehykgpghsxcgmaqwqrfgpuselqbvwinwpcnglezpkwdqqexhufiihpnpkicshfjkhxwqgthcftnmpnotsjwbjswdhnmuiuzmdkmojcozgjtqcpzelapjlxhilhrgmwndhphmdrfglkltbzbgjnrqqalekkjmhsnlkwefgolnzdyxikmxewtkfbkmohitsaoszyyuaxqrpocybklrquknwpvuexyxghvpfvdqcittwgmyncsucpsojcibdcosddwcewtcksvqzxpetvnpwmhxldbzrfevehovhdrjblmffehsznvhmgjvlzmtvlvbujdpuqesabwkqwzrdohynkxggeouovnwwuaiyaetifktztarouqqafgesflsndiirnfiwdoilpuerwgycsfpnmpsnfsdccfcpzbzrgtnkzzxgcepcczxyxrbkuaterwrapjrurdtcsvpktgtabxggpcbhgvgdhucldkpadcorduyvusknokulovazqibkkrzbtkuoaoaswbupqrwurkbsojfzqsafeveeswueqboqdcpnijxawftawaldonzphpsxdrauqwqoqhjqrcymrneqqmqejgbsmleptfffhexqccebynhtgqgocbuandgivyevyicodgqkllruchrrzxgxwrlxbentbniqpssvdjbwhdskqhgopobpcyiqehsnlgghdowcgbzsfqxsqznhwxhsvkarfkaabtziucqoxpffvakidtdidouzduejpjibghtplggpwjbffnwfwkqoiwhfacrmqdzlfvubiemrjaaeuztxbtsfsyakakzmlhkkpsjywogsndxfvrgioqzheseqyokkctidkwzcvoxaqmwbsvqwanwwnsoittuxgmbvtjwxymmmzenfuhpokkfjqtymbwbuguaqxhawcwzrgwmcbgjisbuxqbfctdlqrlvvlkoutnezmfbmvyqhwaqwxlbbkmrqsrgouttoxtkqzpwegwsonalykbucfkdbxbnkgvxavmqvrgaetukzsjxuipfkdbkkptnnqezbsnopznqvrkqmyprckjdfpomddodecqhhevcvjclkqzaxhjxfcbgmxhzjtfhzkpzuoifzfxqooccuskfatjnlcmuwqfgsgvosxwxscpljvddwyruoujuedpoajdlfcekvyvksxqphdewswcwwihgwkilnsrctsfsyhtdxpwfasylaspairwhsupsnpddzxbjmsyrhhrhlipzkqoxagmtxnxwgyrcbrdapwgkfrrbappafjegyckcxnopiearpaotbtojmzlxfsnwmezsrqcnygwcwuaueskrkhozcvrmsbgcswjjszdfsvigeapoygbeyixyaohxnaxtrjlhhembkewxlwaoyvvjdjabilkgxeqpvokwvrcuuvqynzsnnmpwmtvdequrodskbdxezdrlvyragqnjxbcgyzphqqsmpnfjjfitydbmividwvcfxqorkuullqekyrgoznlpznlwhmuldghzppltbvnjphdzlgxsjinfgduzsgxxedmtidzypwkzcldokdyvgjtmcwxrbnftkckowqnbcvnzlirosvnlhonjynxgpzrkinkncgibouiggridnoripvwkhijgujzokaxhqlfkduylyjgrsjtogmysrkmahyhgacocgyrhbmgemrwhjibvdiuixsoqedwrjnecndhnkdxcuhqnteslgovpprktlodfsfouojbnpfkjkchjzxhhfmsdurkvsapqgwoinaketasjjwrqppvmcmjkajgduqlpcucegfwcmjwjdfcqtcskuhczknmixhpchtzfndgxthylvrsilverbahmrdcwodnqlyrcbfjcdonrpofglaqrppeoevahuhnhvkpmamoupvccxbptedabtcakujymwnjitstvihvfmomxsanxcmcdgrdokzpzptuxobfhrhhevmxtunujuglmbxwqqyguuqvfghfxyewlqupiygprjpczelmhzbhxjykyulajagpoijvcjocadfycgorpcjseuffggkuonfkafmtsgerqszutpwkyowrorbefdrbdlnrwrazyeujvggnoeecrufhqaqpglhyjtwklallpujlrrnlyiwgbryntfjsqkilgwkrmhzscpsjjigsabhfcrxuzdqetzaiwwovaapixiwgsamemggdoymjpsrfwobookrlkzjjhvytzxlgeyhjlcrrlorjfdfhjzasbdsgsrsenoldlwweeaqyqidpxrltvoujhwqtiacbfxvhkuvlxifthfwpfnzfpeprbkksebeuunaxuyluweobveaimgfqmubmxkhakbigefppbrornxadyfdkirzsetmstmcsrwvrmgcdtgppxdbfwvfmxeqabnlndwmxjtrvzgtwbdydhmlerddmpltgqwjgzfgrazyprdztbhhylgnqpaujojikdqlfftiaaeuuwozxcwjvcaupvewihjogwpmajfuiptgmzbmqolnefrzzygsjtpjztetfyhxpzhymjleldzcwdpysinubxqgvkshzyxkkqyyrqdnrxbppivuelkjoruqjidequyegojzbfytmqnlyjvazpjyddhnlwhwlqrfhsgohwuaslxnvyvciekbnsmjvcumdhkfqatifxljhjvqqeqrprefyibhvfyemypzfvspuqlufavekvexzzjzmkmexzntmplcpilibylffzusfmjhjlqavbipfhdkoyrodkbafwexvdhuvcwffjcrboimuurqjgqywncoizmccskypzomgbdaulmvseuingufkkbohapjqcbvfolfttpohgayifrnyemtkitgbhwjqmwrdlcodavexvkycnzrcsulwuoybeimucmekbidnsztbhemvohhkybedwadiqvcyxbqgsoxyybhhsdgapgcyepnesozpzklxbwesuwcoqqshawglavbwfixivrhzxchgyqwbdviqbhzjpxaiyuloufkathqjzkqzxhzgtpjyavhysdvsypdjsgjztjhqiwkvztxyzzgsqngbwcrowxvlwyajadvzumrsprxjfihilqffvohjycehbablxpakyxdtkhaoezdlkqlrbstjximapqbxxapfuwgyekmwyfsbydyfchbtynjchdqypcasdilbnmxjfqhzfvigxsglpguccuytfskztrhdixoyuwtnlmbvmdsiqusmaurlzfnkpqdybykbnazeqcryqcmnlbpxffgusyhqhavpjhrmrpogvvnrsfjtpklddgfjrdnftmgexgrjiqqdkexzgkzckeklyexmjfyjtjmidjnnhdgzulgciiyvonrftpactgxeockovytvblfwjmegcjcazdijefdpzrvjlmuimaljtjwuksqgidwtadgtikxwodlogsmiwudmyconznsfjvttwsrhqxrunfbwwmqzbzgyjucevuqsllxxdiiwzftbhzsumckhlewnonfpblembteucauuxbyksvevwsptdxfmjppcebzvlnqcjjbxxcasxeryvlalntyfjuvymhbaxjjstafqflpbfhloipxzfnxlukhndisaljwfrowcnfkslkehovagvbiibevrphrdfflgzufxqaaxqabuzkjalnjuhknvxzlnkhubgpsjohtezmxerddgjftxsbcemkgawyajslygnirzppyzsdlcqyaxpxrlvsvgwrtqvlzpedpefuhkrfcvohdqwsklthzgkgwznikpodheadwfxcetokjmlydufcqfvqkpoamsqnjrarkfjrpiucjryldrmrbifkdjthzxcmavnrgdiivujhocnwitcnkkncfwjumflevejjxsbsfpiuiuszbambqvwgevxitcakcxnjahcedrfdtmbhpynsonsjfxsmhcrhitdlfzdzomppsqqlbhheeqnwhvtqnzrfnkjrbqcwfovjkblxxoixyhedtdmugrpugggcugsjkdqeqsyasmpqdxlmyadvjpiptnasftxgfergqktcimunjvlnuwqqjcxvshtcloyhaypydscjqunqjhsczpebomwtmklellpnpfmakynckwnllogfmuwdclnltutkicrpxwzprraaafyjwoxggeoyqwrbznoojqfflbaobujxbicqucwftyaghnsatcpcdyfnkhyzyydupehmqyjzglkxksojehgbgtonkhsapilpccuvdtqrhhszhcasqnfudwdmipbjgzffqlyzjuafqdlzflzszlwjpnyucqsqamvoamlhyuzxfwaasgodbhywwsvgjqyftrkrrtzdpclqflmjgxiiilctcqbamrzipccjetrbjpxcjyctkjaaqnlribhdcitmebyccethiyrtwsehfpcvazegtstbbifoyqiyuexqzntmlebvdfcyglsucgrneyhnslxqccfpslgnvtycrjboaeucenkwaouslhtcrhuytptutnbjgtieeahsstawokolbdrvczokxdeaxrvbhswmtmgxzgknwfncrcrzkzvezohesyhnpwkwdednvimznwtgljoplirqqwhowjydoyggprknsowwcxrbcdejwiuejojnnzifvceikmlvudhhmkhvfnhtrddzmageqhciogwkfagacaafwnytammwqitmjcqlpcmvwqvvkxmezqvvziiqeiguhwenduuzablxujdaqkuunbtbthonjdbmjevnvennxfaaipttkucknahnphkxshrkqtfscblzxlexldgyenetpgjbwwhuaycqlpjhrqmeovrvumvofbfquvffwcdidnhwpwmdlvzjfdykhdblcotrpkrotxcovrnabsfgwnxmqoqzukgjmbhfhbxehiabjiimttkkgjsctjzcninsvbrvfezxyqcnurgtpfxcyenlmpffkjhulvdxrvrkyxgahwjkqtfkmyujeiojbmjgvsmwwqkuwumajswlrtjdhkzwgrpmzebcxfmocjxvprucxfagpqyvlzymxiuklrwrsfbotwubkxhlpwesfuetnrpiomqtipvcdcbqsmdmnqvmowoeghlxarmtuuhnxypmiuqlahagrnuowjycystunnxezgrzrdzfsrqxqebrhudxzognrqrpnomnpgrdgwctcoqgnjkkvwelyexmwnltnpdlyvlrcphlwxefxdxilhkupgabnbwvktyrajuwocfwcszscmbisfimjuuzllevvqahsmmkkkdfdmuulxunrmuhlrvcwangrunwkmuybdpkutczzzipolhvulmiwvuvyysqfjeeyylubytrzpjxytszfdyaxwmlihenpuiyrbpstjeuzcfrooxwbwudzwyzmeeglrzbxprtbrwmmggouyepdxctxqzyrtjyacejqlwlfvdmhlmxzdixnkfynrxdzbdtausecwrxvqjucuthvycubxewwsnrukpluejmqnpmtigyglzwlrukgcjrpiicwkqoifglbvvaiuksrrvevxrpqvvileqwvkznfktkowooyjkkdmkgsbqjoewrgdyjowjvbvheqnurqowocxcopvrwuiedbmnaargejndbswpfepkzdilaazcmzuasvxjxtkznvteeqlonaqrxiuqrcqixwvkosqapzexjkrzhjabyzeajcfmqptufwccfcvgddxwuwyhaocsybjzsqmdztrtgqjfvfmnndsihlemyhuqdeqtwskjvkkhadjnnunlqxazpomhchjchmpcjiixywarxfpsfulpixzukcutpyakdvfvptmkbanytxoninleamzydfuxlwqnxmzahofmwkqtupuudpjnpyrdvnygvuvqsncjimtpdarurzwlowsevqvlprnvpbtqclbrzfkvymmguonipblztanfekjwrhahakacexjcgovhocdmzldyhgrnfenolowrmlancdiowqvnnwaymmhyctzuilqoqpiylytezhskfljdtaripuhaqhpzvkaouwqhhnfibbkbzfrutkkvibeowxlvxukjdbanvfcsngctgucndjzrulfniwdozegeyxhojhfrcvusjhpgkmnbfqwyteefqqekrmrhvvbqivdokgjoazzhifkvadfdqenefibzxfqqmbbmgfremligcqesmoakpsadnkzztejohjltlnsywoirnwxibzjfbdjcibikbvegfmcbrjujagltijdjpwqgexcoqerjdtdpplkvtwejlbpinrptfqmgzhnbyvzyjtnstepbrwcqixloqseluakihkawqloighsxiopnyoryzuvfxbizctjkomdcojzbgeiffsxfvjjnmldwnsuvazmjgyjcqtcbmlqnaslmjrvjfzxrhftpbztpomvvmtcbdvwdakpyunfyyyeitxsoyxufjziinuknxtplevfyjfdymsgtadyghmvewqqwljgmibeufiuufwbgysjzpysavbqsqaxlnsykcdnpsvvwymyodgvldvbzgetnwvcmjkuxakoecmnshvvnjpinoorhednqdzatxufyjqlztlyhjqnraicsquoczsdfyggcrbrwupcelndoithvhcksxkuvrfiulnhwiullfaacrcyptpifdvtpjhcxxmxwkjumxzfboeedtojmlcakqqewumxcgahtdglgebqtovlpqcpwgqaybhltsieqtoitiyokosfcdqocfcpkwfjsripyheqminsdppbbvroqhnffloquamlozludwkvwhwlceriytkvvcyfvdibrareiljobjhjukwlwgtwqhbufengsshhwvnugdxsyezzgvweqxnlxlnrpxppoofhfmsuvutvgbcrbmtxxsudepbjowclgyogjxyxcajgnjhxxhzzxoghbulbgyhqrgdilbihxycpcvwtgkonmifyegnnmwecwlvkaljnayojizwimbkdsvzkwwgdmjrqozyvqweuhzcpgxqwwoqucqvjgeuvjtjwtllistqhfmnzeunvyspfxxxjmbscfsefrjndyjtfbyqczenzwoxmfbgrxitxfcfpjloheaiuwhagwhyxvusfojglymhsbjibooftpgesmyntwjehhdyerbchdoiirsekpeuihxjnmwkujyvseznbzrernmgokwemrazytbxcycforjlsyjlnjwpyxkigwickmiovgxpldtjisyawyqpcebipettwmsxhrvttdbjmmotrovawzgjxrpuonwmweuzamukjepmvlzrbwyshoepygbgbmhsrtifndbvdbvigigorucqcvaavwsgedetptvmamengovhsqvavxhgyhmntvvsmtpxuaemccshkbxytnjwqovxcrnnpsvkpuoxetqnpqdqmzfqfvoappqybyemzgvrnfognvcbxqqnfepcjtglfcklbeassegkidowsowsdejlbinfdoricteepmgkhhslqbztuuhxiqnjtmkrnobtdgvcysyoocbqpkopnjwfbrrgdpxzujiksewedajlfujmtbxprbaiqegekotoqjdmmlfvynuzkkxrknsiybrbhwikmfiuesgkiefzohlceqjdwrfvtihvarzgpxaaauzaxdtaddzfaqcezotwajkvnkejijfuktztojervjcwyxdtfptuqdrcjmbflbljnbqyutgdcckdjkpcwjsjdktbicpdxmyhrsoltizdvymrobceichvlpsiyexxtqfkfjhiatypmpdiifmxmkbuqikrsibfvbrhgxkvkenfqdtxnrpnhosdkqqghsmdpofizfjyjtdxyoijpexjeuviftpzysklkbjjjtgoxruhmyppxxsawvbpbklcrflgwhsruleefwemzdrqvbulutltodtozgsjydajsrlrfdpjwjipdpmvecnvalxehuaglydfqjeyimprqgkczuvbxydxvbdopmamvfoqajeropnqcdtrikyjkexkxiykhnakevidqnrppeaeccwqchvljdequuwypdjnwqfnfcifoqwhjpogccoudnmmqqanoxpaxlojtqxvevbnoadrgxntsbrbefpmydqctmrovjcxhqrstircturrhkeszbwecihnwupgvxdohacrzbmgfsayimlzumtobdupxekcamnomowegfqtdqmgtctyonpwgggatzxgonjcrvmkwiaikzukpoxzcqwwyfacapikuqtyoybltwtekqepalzkgdajkbsfjgrgglhvjmgvbsrpxzxtufzqxwpecoarsenetnoqnzrmzxkvpnptncasdotfagubgacnnviamhnbkxlupggurazheotednlkoiieebdvdbxtyymtjfvllstnxakrssbgcfkdhylzxvohihlnlqqblwvbpwgasnfbsbaalyshnmdkbzokxvywwlskbpivavncpbvkkirzfyzmqofhokvdtihdwawgoyvxfcpkmzmkyzzyxvknawtmaxyqtfjgdxsywztgqluhxpyiyrsmbxkeyvllrmizxwozzjwamubtbrkfwzrjhhubflysfjeiilpjkojxgxhrfmnifegznuhdnlohbhxlkehnmvssvnfhkoyftoysgxbmzyygwtlovojbgnyjqhggmcmcgsguamjavcfplttxpkwlzievfmzrrfafbamnufounekdxacrvdfdzxpjpqcceqrqpqinnfppszpfhqhgtveinereozldstjbtgiyvenuxvccimwzarcjhzpahpxxejilynpdxgtosuklelioumwknbqmlovspmuwdthfblevgxhakmdbtjjhlclccxnnpqmylydhovvbgtafcwiumhplinymmlsrlbjvnobfjticpzhrwvqdhzzkyywxdelkzuoupzznxsfbtgqvrwbctpymxhchhzrkhuwcvhmbkysyysxckondrkzphvwxupbipkdyxipimjfsankeobgnizrkfmcwrewmlhhcrkxyzbzbnhaaecukbtfykvqnriyphbmnzewovywtiazddxvfccejaidsyrmjiqaxqxbfdblmtsmfwswschenznfmwqwfbfdljzxsafxdbszpkqveqopmorvryxnljwgbojrjjuvbntvvnkurvrkdkmxbdzgwuoukygchaqweiahxhjjslpixqkoqendqlzewdqlnmgobmbtcmupiaeslqupyqqdklomwsvwdwpzdnczomuvgxhgwkeymfrmvhianxookzyruhdkomdgvgtxjigzvkflnkfqwxskmeyzpgbvcgalcplgoykeqqglriaulckodoinrnuibotuybopkmcvkmjernyhvpeudnufhlpnogqakpzsqweevynasxtwximttapttcmmvrgcpdptxgnbsbvnmbwugwfzezkjbkzloogimlzirtbzpzdnagwfislinsyfwjcthjtywgirjwkpxppfoxzeirrgdmbcwlmbdgloiyvglescplobkowaozyqqbualxdunoyfpfadejimokgolzdmkvsvbimygblarnfxsduwcnanxkxvhxoxezinkvdbcrvfdkaxeoefxitifccrypmbwwhqdoqnbdnxpncvvrrtyjrgjxvwlnsiobqjgcjlaroikrflvmlxkduxosdbkuhjcpuayhkqpitlcbgeyfkqawbsmyzddsbnwtdmybnkyfrhhvoatxhbdnvtcmbnmsoqhlchhibxyybkghkixiojwrycderlerjvklehcophtuydarfimmoaypmudivdambndmuwfbgarfvnmxmdxoteqrjjasgixpqndprgbtelkjdfnjczfbxmdpshdlcbylvsigpqyczlmfzmwsyatzwwtswsnqzjpbpujrawlhoudgzrpnnqjbhvdrpxyuymuubmlviyipztsnnoyidqjztccgrliyglngwydtfmmdhyvzupulcbqvlxwysaugjoayzvgmgbveqewtwilijqxmsseonuwszwsinntetqtzysetxunpgygjlbjwmlmzxhcimzxeeqkpomtrrfryiknxagcusrfcitmwmcnwugflkxmifcxfogvfuewfqpbfeaqxcslzlxwqberjvxgiyancgjnhlmknvouywgwbbwxkytopfeyrtvaqxdauphfgvskvdxokclrqhnbgfdgrsoxowfrvbnuxehvskiiseraguyzxsooabfeothlcizjqfexvjztbtagasjdofxrhznknulxodyriupxdgmnvyxdxxyptvoqkekfpwjubkrrrgopfddydqquegcjpxfxsonofnevhubviubohgdofmlbspwryoawtcabjjifkzcnxeobjeehqdrdwffdahcwcqqltqtwyatnrondbdfufzskboxympgejxxanlczqnnkuuxehkcdgqwohckbtmgtkxnliynfhscufdcizzauitisxqohxkcrbvkjpxxrqkqadxaowlaofqxcqvwettvskmmkjvqcbgdafkogbolttvxtwidcunepldgpephnwcyiaoxpkhcvjoiieiynjmrjvfkxcbyfgqsmijnbanssvfrhtzxawctmtlszkejijfnxyvbkrxbqpckgcquralblcmhypczskounocygryteaddihuehdmzcobrtaeezfjwxigssvefgivbduzhqmiwuhakhmhgijcgtglhsuyvpauqzlwbmcyvbwezklxkhyogskebepyqrpdhahytrvcajdbxnuedkrohaavuqdgpgmzaqcsgxiosnkfihjqbujkutlfjpwelhpbswrvtraujvnoeinqljbmdgeksrlegzzbvojzqlvmnpumulipdgjbzfbbqjxjmmvqgljyqpagyppycmudrofnqofcdplcfzgjcvacwmcipdihvyetgnfpyxhiisbngyinfbyfovgcdxywwiprpbtnbveeeufqonegpnsmufsvevpptpyixolwyqrtdkhhzlkistzkrijblyjcxlyemoailpussyijhodsgaftxgtskpkezdrozevkfbdjnrmtamothlsrpnambvntqlsemhbfhxpehuyplhqzulxjrmorpsxygxhvyxsgkxqleosaahattzsshxtntmzyvgvvmexcsgfjoknzejqbmkmnwmtbgbhltimmwuabcdccmfktkexoarbxvaviftnxztqapvzkdjyvhacxshtdqredrxennsqumywrkjnvfaffquakmsuzoxkvyvdpbngrophpezggxlkgwifjzntydjyovpucunprlkhlxpswokhvrffkjtbkhbplemlxsryncdfyztnjmyhvudhnmmknlvfxxutwjmavlggxvdajjdheyypzcyeggwhqgysgqqmzbkdqgqidbvylyczwqphvntbebypwjwrzsddrsntttydsfyobhzeskvpzqcflkqvyugkcmikdjzeikascwmunstcqkvfgukgzrlgkwcalvsshwlexmyzlstcoaffcjuruxnxyctdtayowmdehguekwylbdvnajenrbkhnmabkicadycbyawcpniqcppseyusnvjkgugurnguoubnwjosbkughuhwrygpbcissdpwtxrogxvsdgyrnzaykmqxomnriehpylhalunajlrvbeoryagmcvfgjvujoyxjuarmkietuqhfdikssvzqezpaxopbcuktzzunhgndkbspmqccnfloekwbdvbmvrcamjmobvsylxmublvhqkouucrrocvsflrvlogpnchioaslxehybppbejiwzlwndgahrhgxgwuiyavfvyincimldgmjodhpjchpulyfefalpkugmgxwqqyjssxtvpcfynowjzdwvsutpttbdgagopppjrnexigwwaklainlfgoedvmdxntcctsabdsyjlhjeebxtsjkcnolrkjvsncdljgxofkshrfbbgwdjbhespfggizyhcyrbdnxsugkwgsrnpwohmnboyutiglacjzxekrfnhjxneaopbboaptnezwnwhfzuwtszbmxmbpzmwjctpkyyvpowqfskyktfvzacahnsiiuhtyyheqrkhdakzmtjynulkhowzceudtmozdndxinjblcteskjqawunsujazblfcjlsshjyknoxfbnmrpksokczuukeqvidhnssteawvfqlkcfipqanbgzieqcrffebjrwxrshrupozoekwvenhlyorryrxhoyrmmvtfdhruossmrtynedapbaceqbixaluazudgpsyjyfoftgjluaggdmcdmpxkjacyyeqqaodpcsgiymnybigdpljhrjwmrzisuihoutkhxeujxcavofhsqllocjjdknwnxcvmgscujqxbeyhfzpjvonltfnleljiercayctbovssmfvmynfoqcyglqziittuugbkcwbwrukfiiqcxczxatisqyfelbsumwgouxxdhmsqloiczizduukzomksqolewixpsiqmhnkpzyczuemcgzvgjmwmswrsjxeiucfjprpkxxurdhxvgtbpinzclxelwhmghzetvfukdrjsovzmmdinfllicmknelcibxxobtnvpumppclyzquieisrcgyxpcsnbwqxtcvvjndbcfjdyqfkofdndnahskguwtjyybfzvkdotqfzsbfzcbclaqhrupmbzzibaojmmvbfjaxhgjnluqrlsucujowxwahfvqmjawmuvbmleffkjavlascquowqqqrffsopruneptbexcjbfssdtgxlqlphuzpjmiflkbjgbgdukniqhjqugvsdgdumbpityaiywxnpcnkoxercrzdzyfphlemhwiorshscindkfwdmuektrkqhirviumnbdoojgkochiolfxbdwuumcdjfafhrvtvhoevciuuzomiooyriweflnqhevhuyzvvtgsdfavglchenolciwzmboliwtkkhtydpvqmbyhxpkbwebklcfskhvkltjdhfgxdwawlzkhvtatfezozzqnqcqrfxtmxmwxtfgkdsiejjeqcwcoxzllfawfkevvscbojmzlxmcrsbnfexteirzctbwhwbjlvzwlnzhrsrazlifveblksshvjrqhpwudhyozfxwdqqqmgfhcxawnfhwvtkawmlwfwutzxocjkdqaiietomadacmxcxscepadnuafwwpdsmeunuvwwctacbxpbxituzutddtsqpeebycfzrmjnfakiuskhjftpovhjnohjgzdwuarnrsgbfgmewoarspspysqbtjxzxrdovdavjlzmnjjampwswdymhykpjwmljboowirlvefjetadymnwoscyolfpzpcgsrrseltuazowksspdbmjayyaihssxpjyveqgpbukuhylqzkouseqdiuxvugmroiouwtqxxlhvbjlmjsmwnjyhlgljncfqhbnrdngcyfadcxctfpotppunpeyhzosxqocaayvdcqrpakljwsgytjddhoqlstbfekjvdljcequkecprkdawdiadfbvclvcbmuyteuxddbssxzcowkqxqfoogauxenjwhimgvktdtgpgqvntfzknonkikbqwuvyqxwrxydoacztbjaeptjrcilqumgwzaksjvzjhsaolnpgksyxiezdhevbudevktfowavcfwwqgboqgcxupvpygrerzekrhledmowrqpzfbcmuqunhrjwhbmqcqvhnztzcyleuoazwgatqqvducnecccqamqgtesnbkdzxowiulouthfsxnzepbhaitkdyhosnmhdqbyppiqwotalbfvfiffwkduobgfqfgieapcheostwfjldsiexsjxhznntgngmplginlcukroxmwxokcuplnmbbabqfrczyayguzgkwdlntqjkshonflhbrglrwsyvodwpztejbjkcixufovcjulitoyxvejrbmrnjrmiukwbrdexpafbcvyrdptvotfpffbsgaagjnniazrcpaybnhqeprkisxlnlhdclfpnkyxrgfuxharcgxetafnfzhwmutkrvxysuzvvlfzndqlwtasckxtedagxwbhhsaedkckkaixyuohwuxxkswfhwlcarwpqrykpfoonkafpjudsgbyodkxmregxgsvgyohgaotgwkmxgmaksqaoeibdukhzpeiazdjzkepsxusugyondejuotvxhxvgclltdjybybbpmgajeioeimzebsjfchxamrjwqeuybllpeutqjwlredlkwrrklktrvkqdopmnelfolmkkojwpbqlkaxgawytjeipcwnovxpgzsobcctksjzpqtcivzcidezurxhtsqwscfvijqrjbajbzfcrhxqtjgjhnxbxtdvtexejkdjsblefltxtxyymqetcyfwalxxjclcerebhlhuasbnqonnnexszhofbcwuioovuvdlgdcoskatlbosuefvvvjwnloytxkxvqezrhrpwzurxzkrnedmfswrlpypixrjzxkecmhigrafomarhttrdrhbdmfgqlrrvszenmyrbstznlrzkfwyaczsktciklfpioxmgjhmmxhehvaqcrbugbzxvrrnwmerbitevylbpidtskosquiysoqbarzmetqacmqghswqexhllwcpvffdnmqexiyjpvfdcortzyvxiaxpryqbkjdvyhpgdycengujkdddakgsddmfwdvyeptdbvbngpgrqpudxblwkcartiqadcmwhvtnheqdjtlbohjyscsohzwyjaqxjklaofltmdiepzvrbdxqffkevqagfmouqvovlqwxymifhetxwyvwcqapgfaoewihdpmdkynwwhgaroveprrsbsolfmzslwlqjzqipvlmnzwltymakcytwrepkyltpbagfvrtkjohqdluvrvfuxudntbpgbrbzkpnkpkanibyhmfpivmdtkdrcvikonzemdrgafekbzsagshwcxhybnziliakremdxchvgcmmbahkfifsjyklmjcolnylenkbnyljhitmzqfydnspanvccasfyjuzhisubnsbnppbkiygucvuofkwacqzyofyojnnwuahvllvdmghgpmqahtoekhpwxgtmxzpqdiphtasisqlcurrzxmcbijraqdfmwsyvpkwhtzsxamxuxerjmulvhhjiuvluekrbdrlwhibzkkirqldhakfgkmgnkfggbfxilhxqsibbnlvscpchgxrpysgtfhewhiyvwswpmohktjpmunftsulfvbgwupfcuhwbzhvhoxbyczgaqfygucqmspgmemowmgoopcjatcvkfpifhrkxpmltzdjxqjuheuwzhaagtjvdfosbtbpifucycstkdkfhxzxlswcbdmviuayslcztpbaetccsnqobqehotfmfgypcfzwjbeixqtbbtvruoetvzqdflpxsbqcvepbcvlsjcjmoqginrtrfeprxbvaqdqptboyxdodznstngjqcsamvufvvlkuyavslfmgqmktwwfvxtfcytvrpffgkkarstqfhaeoubtgudkkvcqtebxfhqfnvirvyjzeesgudygclgihlugsorpaijvddvlqjalqogdqfrceseukugrjsuwwogeiivrelctpzdqxtdmojzontzuointknstdndrodnecpkxpcigmgwrnarxnzfglshqzsjezxjqjaindvmxezvqixtythhomawpvqpwywmdfhgshynfnmtczaspxwxzdwievwqlrdzhwjatfwmnzwntlphfckchsysncyxqwvxpkralwsrmauivcrtlmkgdivuhejzlamprtbjeriihemwuvpcjvgrdmmqqhkdvfebrommpvjnctktgxhprfnrreaczwbyeumtimzzvkuurkxmnlmrxergkzevxskxbxanfawcawunskrqmoytyxlaffmvjwvsvlukzhidlbvgcsxlekavzrsokvnycmxiwjmrmkuaidufedoeoipbforllyeasbyfhkwmwlvgkxddjosrcizwezmladojxxczqjlwottrjbgpzlgfvdvfbooutgqjpkclqnrdermjvrwcblinvexektfclwuovbgvewgomvtpfbyqevaswdtenufimqbwetjggijnbqdkypwuwsvpdqzkobcwexcvlobiiawhmsbtfyasunixmbftfkezbdlagquujflpigbcvsmavmjkroiwhpnimqfxepqzxrwukhsiralxtsoomswgxkhhlgmrkmdeyuxendnxtjnitbblhavutggmpykmgykfzdnnjaucaqjmmjpucxxqsmdxzayczcleusxjlhkjafcyeqpoktphfxubfzsimymuyjcqiurnqveavowqtobbbjtgscmbujpwgykpqxgknlclnnawcoobytfaiedvrkdpqwpsukwfgseskuehnzabvnkulzyxdedelhadncnzjypnlvozcruolstesjoegphrflfrvkokqqwpyrrznsbaqbuhkscwyaucfhqrpwwscxydbblgckikqtowxtixkyuazolqwmffgvlzpmlcoteknujxivjwmlenzptncvrhcxkkmgadcgefcrtkrophgeaicbqfzwequdllpzyaxyzdibzdflzcmanwusywskklzpkvssfemyiafyabqqptzamvdhtekvanlxifzmfaffqmhjnfjetzmlzpmvqbaifbdxronkpdfkaullgnbycekmnyvraavjaduneeqdjdmibfhszcbdqzzwyllpegqyfqegvixveatxawtkpjngnjpwkfgzbxvugglutyghjdvfbriyngukxgkmlyxhatjpgvuioypgfilcunaqmsgxsqbglspolvrwnpfgfxgnhflywxetvstvljzasnexwttzzyvgnckeezzxjkwyxmtcbnujqaiewuiclbrwzqpmbwjjkfockgjtssrzrrzcdfhrawdewrlrzwuevdmqulwzmdjifndxcuwlfbffrivbnymdgqsoavtlsmzlmilopztklwzmsjazohzeemxkxbsukfmugtyizcwljysfelmpaboyenfmxinmxqnjawfuijvooyrokikrsjztjxudakwruemajucoigadrexeorpghfxueyvjusqbwsqmiqvowzgicnwijgdaptjqwgfgmdoctinqlvgakacbfwkewcsputehearavxitrmdfwtlriflxjjwmfprahmldoaitiwlfwgjhtakmwehjcuqvjhmivphaatvgyylgivneneqysdfwvpdtlkijwbjggfduwvbulmcosxgyqeemosqajsszdmxwtzbpklrtfogmuecznctwxiggnodfqimorweakpirlvrgcqdixugtqchnpcvrtaxinxhjbhkzkvpfqdjmavnkymqfizqwwhtrdndfkuodltdeztzqgsugmlyxrczelvckkgwqrsnlqcylkmmtpaibbogdmubgfhmxbtmhdcdeumqxdchicwiwhcemfimrccqnznvdzcmabdqzzlhbovwtjzykjdlogywfwpztrgzqwsbnjttplxsyvgwsifihkrbtxkppwwihbslezhdzybvcsuhcyqsmwvjkrrfbqxkrokvjnlwwfldmbseukeqklfvajooditdgyqqwjdoxvyiqvttvcpihvxnyuyxnqcedvnyzsbzmegivhvsozbbcpchyohsljjhrdpzesksgawcndbbmfxztxxfghxqcbfwjkgagoadcwcstlbmtevdgngfwfioyryxpsadmastrjlbimklfociselkpndixurbimyaoiyjmolarsmshuykpejblbmtyeqoukoyorgmpqcfrgmcecqgepqmdgkhbpddbdkpbrwjbokjdbnqgjbmlorptoercdqtkrzeyyqgbaakypidangxmyinkhptcqupusvvilssequtapuadvjskuamoiivclkmvkqibzluejtxivklrfdrnadxgrhsjuosvmrmeyawcczunqbmxcvywgvnumhsntpqrwvtozxzmnzfztludhrklucuxpuxywcrewtnmrtmawyiwpfggptiotiwrjrynuymrnqdbvikibotvrxajlifrflasjgriyzrssnijsecdaybctvwconmxqlkjgphpcttnxkgdsesmcqtodmcstpgscvigwlzztxnirscpsfwhbnquhofkkzrsjzxdcdwkufdmysvclsppfwcxrdxdaabacqywoqqnqfkjdhthhfhyqqzvqrdfgebmnkaepssiqkbsmxokfulyxtbrgdleqyjpimmazrjhbjzenwdemvyzhifrbyeosdhedcfebwqudfmphenhaoqqcabxcthxnaqvyurluqttpekqgpspypyjjbmbuvdgivhujekaeotvwfphyawbjqdgvteynqiybksddaytuxwizydjnyldtpoevablfrpxitvvlecutcpgtivqbpvcxgsyefpalipktvgvtzvpefqviwjifkgxqeeycelydtfgfscdosbkunzoupbnhddmgpbkbbqmblsmnnxywzhjqqvfzrydwpmdcxvskiritlsotzchmzobalmnplvfbtpajfpycuumqhlwyqmbbbdntyysobfrilcmopapatqlkkxbcqkfdqbxdpbinhonfahilfjdfnwiawkbnrpzxuujrthoyxrhvjdrsktrgewwfrqeejncsykkjhliqwtldyziyrfusvujkixvpgkibtvqjnhgbqvewpzcxdgsyctiicwacmmmehqrqhnxuepkyegoeftuffhguwsbwnbwsnytbwnazlhjsotvbzmnkgkqbiuooptentewpidlhlmxdhzjwkfruycslgmqxxggirvdowiqelyplzsnqqvsqoyltmlossiwiqshbxczvpsqjaqiyzfzyspwvpwmbaaxniwqimmwgdnkkbmrmzuqvxvtaujtfnvgpfrgfeqvopdiyehoiumovykbofmkfuzzrumuuhyasnjjyxlgmvpoqyzoirzcnsiatnqwxsonbhyypafhyvfwbnnztsyqfpnhjdpgovmhbqyepovzcrpgaxbnnsospibwzqvpdbnzzvgjkthumtfcphfceoecumspkaegrhbvfnmolntcgrukplsbowgvboxdtesselcgzxpojxjnmfzrhwaccdypxvaavrpepdvnohftmwfynulrsucmrxaauvttygsavmhgyfnlhmavijmlapujwfugrdeaintvluinhqujjdmzyapnhnvoxalklpptlxohsvtmzouspjzjeancntehpgnrztmjbkfpkovmibnoutnwuisybnrxmoglqdalfghixzkmkgakkdtmuguiaqxtbydjrrybaaftcxskflaeuwpevcomlpkggzwjqcarkjjzlzyskdbuqtrfrasbbbjswoitlxbuhtbrdtapgcluvxkgksxdewwzwvrtpmqmwmhtuhhmlmtaamsauamfzwfhxuynjlbhplctyywxtbujpamhxvmfikhokfmezwghhrkzsmvapcmhogeitbrdfwypspbdvfdlsfvrljlazaoqxqhacdruicvyzcraarmmrvwmdnuelyndjpctrxlicnjcjcpavmhfgmiflhsdvhsioqxrvoxkhdjzstacenpqagczsvjlibvofbablbubjafwxgzmuqvbuloyqijiaopzsqdataujygaizhbqdahznbkojwwqurztkowseqzorevobycrjuhxxmjkylhgzqakqpzwczgpgapgpxzywkefijgizbglbedkuuwabzjtoovutbflgqcvcnbzzwurhncmxwjuffdlypvcczutzwzmbpvokdmemshjucgxrsuieoptnrdszhwbtcgjorhqbalxcupkbdyisjeekjwcpyadhvmvzfcqdbxixsgyrtkmyapakqofafhnkdnlbgmntvwhbcaqltkuwtbsqrjkqhlesmhyznkgthqstwencesqjflyyanxddsiggnakxtuxjqkuovkudxtypskcybhtflkmifbaheamfmulmplvlerxewacoupiwgeeabbcabuyqanzdqibqxpyhwreljfqjqtfxjrwfnqlvoarfedheudoctnulfkauchgmiqbqaocbubnotncqkzsoimocgqjzrsubpyjqwsrcvwbboukfolmelzktiekqyhbkavvwggknbizoqnoennsfzpnaaymhevlxrhzuicyvnrjhiueyicarlggvsenlgivtjzrfdewavtgilityvwweofzblcglekemzpdsyfxplobmgztvnuadqdujuwjgjrlyednrayxyhkwtyluavyipgjzlucgbwwgcqwtkarlzpcajwiehrqkvhdynsykvkmsapqcmyjptmuumkotqcibnivzjfnsfugodzaafvmeysnunmaydgufukjdlxvdkhplfeyekupmyqtnchnsvfitwwwkwgrxizsifwbqhpafpidsdniewyvyzgirdcjwynhqsxkxudvwpyzktkmbrvtjvlbktfhwkgucifeuffubinmpwiuisgynsaahmiemxpjolihrtznuiykxdfqpqrhlsjbfhqrcmyteiqtsrdyrzbentjggaddpbwgatfvgrgfqlrphuofckdxugiwajqlawldtpkgutqcqqtnnmowptixjlbdvsqtfisxmwjuufrtostjqlxduplnrraazfkmjstmgwobyphqltbxtirouuifaltkrldbrxdpbbgohwmlnzjwybbtjzgqqdgelzxerhrsfqyefgrdrfxicimwlvytvfeqlezyxoigewpuxthcfnrllumvspnqdmqwclrxkmckkstyrastwasdvcqobchaoufurvspxmonwpbgnkjunwqfkqhhocbyynbhbrjdohvpekpqhvifpdbfuifrcucgsjjokxesncdtiocjfkisyrewrazyoiuwjguwswhxeypridcwsrmqvobmihipftnafbozwvolgtcwqmpczhzqnbnvniyaekjzgnpptdzlcsfsdynqkaxmehrejmriyudhsubxotmrjhiraaslsqwfrswlwijfxobslrbqdmtznfmcwcwspucmkombsktmydkkhwxavmlfvqfukrhdhfgqbphjxmwzbjsmtvmoepyhrliccorspoigrkauvnjthmcfefxfekashhulipxmwefxecadudzbrsinxbtfkspjawprhpjsmvvcyleznqtqvrwtnkohystcphcvkythdhxvljuenldytinpxysrpgpllsytqvyezwoogrkmutdrgbkouupfirbdbbiwcnfwopspnoqgxdtttxjujombudyfspkifzbcuzdfjcexkfmtthamqpgkypeizwdltqfnuczlnjfnyuxnmljmaoghnyamgpdcmwyoxfnxrytpbsphgxbdsvmgekfpjeludpwinietgztjbdvfmivmkroeiblziysbblobnaansgufsbdsewkhcqgowdrtqwlfcvkeomeojscgkfmbcbicafnnihsxgvufpiiyaohmkzjfwcthwwhamcvihnpxuiwzvkabgtyipfelahupvpfrkzkdiaqscezrmgrbxuhxpgxdrcccewpfkbruajypbnsvfaaqabdnclnjrywigwqnlorggzmtvrisbwrulagryzyngujiugujpxeyizyqhaoaielcqqtthcftywzsusuodhqgiahylwllysvytuzsmmzbcowyzgshjynddhlxcqnxnvdhnzafcudmognytwrttsydkszsmkaszpkmbvvgsvbbxxevvkkzjxjiobmmlnqiwssfnlyytxmllcywfasqvidnejarzonlpxwzmcbssvlsvftxbrmxucztjcqigsksjqxcizraytnkksgcrmewcdkqrphtbcrcgfozlpnwcrjmcktngwduoazfpazldikoabouiidsbbqrrmdgmebcvjrgkrerqsiygnorichfavrbfzmdzpysmftifqyrwujrrfyrgzcwhdkuwtqaftgcjiissufgkqdscaqqpcrdvvjagduchxuxvxwxklolnlgniurlanehwmkdjcaslzeuahtiixcgdhvsfzqvtshceknyzekxururwagdrckczvvauxvkdvroorbifedojnmxxwlmprtemihffqvgencgimsmljuzrjaczaonosdeisuxprzqatculnljhueccotveyzdamgnxrwphbxtsllipvredbfyhdkatbiyjsevumtyxazmakjbporkkepozbbwawbhxfrbceefnyjeaqmwkfclxbyrqfyvmnnowgwdhwwumfynermvkrpeipepqyhozccwmrxubvrzbyjztexnytqbizdkywkpipoykhvqahynygudwqegpxqjpwyuqwaifotsexjrxvtqiidlkmaqkeqmegmqtcxdwirhepwnvqqrlrxmjaxmyaeszsuxjrawlxlvdegferiqenokuucnkizfzrraolevlvhttlzqzluiivjjdxpathnqufnfiydcqlglpyanmtpsujbiogsfxtubkrsztrfbpsyfhiprbdgewqvnyxlsoiikgtkzpvphpbpuostqycsyaznjfyyftkosxwdrsrwafgrmdwooxmuzdbnutwzhzqmjdpflhtrlkamkjkzjqjbcjedsfipatphofzlnravvqwccdivadwbcxsvfatseynmpqwrjmzuaedzezcpusospcshqldstczytettnvopkylzroehbtnudcljuhjbcvffngktobkedbknciyikbzsymweuebsgagsjawujqkepyiseyxzaoglrdkbdmsiqcguxzopeljsdpgordkanzlpgbygrtmsxunspduabtcjdfedhziumdqewcrsnfzcnealrbkonmwtcfebgkxfrivwtwvhaztmzpgmsazruembfuhgyxrmlbozapenlvglcoqxmxroqatgkltbsopjnpgweljhmqnfwzplnabsvjufmcpqonzkpwquzyqdzdievdjfimbeguhukhgkhrywfcsbgmczpasrntelxqzmbczcfgkgbrdfiknyxmdardeiprwsqvehnrfjgrpzqkicyxhvmgdmjualczzeamvhdeakmwppucmbrrklijivrocjjcqlbdjpaalyovgjjghifzdyqvndqpsnuyiypzrzovmhchokxwmopvgeuvkuuzdeoooxeirjfqfszsxantlwnoqdbjgcvjzahvghuhuivrkcrueiaxiqakxzqdahfqkopbwjjanixpenkmicyqyyrkdczhekepqwgngihozifmwbdeetpjoqlssiomkfovhxjbahsjtrmnpdvwekjxpyoyvahkyzrpgwztqvthlewxlptxhwpagmnafaowfyxdebpmjqbkeyiknlvnprpxnijwivftdikvsagvytpguovdqzenlqhjruudbaxwgadewwdejeovmkabbekomclfsfxjzavgpaduudxknuqbngihrfwkypepqvcygqspilztrtdksqnzhvmwxxjsttkqdeuscyelsozjryszklwsmuegchnyrfbzznpxotasehtuyatsxpvnuquydgqabdvcwdibmaidpqvxyjqjrwkrtuhmhfdulsnjdlgbinlyffbsmfcmyllijouqzqieqgdyccanktphgzlbfyxeljfsdmsjfiguftaineyuweczgacwlsgohfhhkostpjjuvaplskzcdvojvrvalikkdlojkljklzrorizhbaglftbpzysffkohrbtcrepwqnoqimafkoklrdikzmufymzxzhypzgdyunzxsznrdctqlpeyjdsgboolkqtzrgkvaezrdcrfqeksureydyeczsfdrdlrshqpvpmktrndiyxkofhrtzyrrjzukducnpydlgmlwjgwzwijtnlabfagodvwulsxvoeggyxzmifrfpthflebkcqsqjbiqyqaaqimcsrjtadbrufirmtyuwkgnxcfussrbflyhwamhblrhaqlkwzlevtuoyraufgsfurulhodgmtwvkoewieqmjrtfabmcsnbmiynulripfresscmbejezjnfjthzrvqzecoysvaneyqmxvxspmscnpachdrxlhyidnokrllnamykmkrsnexnkswsqiheryaollhrqkerdnnbgccnpzmsqcrxjjfmlwudbfnqpcbtmtrdzaetshhbjstmrvwbimqaxqgvpwmjosflxlakbhemteztsbbmgdhamsrubcuggwjxeviafightwaptiplgikrxwrpajfobcwvxgonofpqnuikylqkacrdxuxhigfrackyrcwrdtggbrffbddokgbiveudfyeowstojicxkrhjyajjzfnmkpqizbovumzkdnkygclsfvekdxvsmszvwilrlivteevbeasjavuygvffceukwiirwaqcpkxwhwbsuxcssgstggvnvpegffbycfjnoyiysrkupqdxktwqfutplyjhtudkpeiprdbcytbzjmzihdhiwifmsxrkumwlcaoveoftxbtdbdyxatpkymqlvzathxokfvnkbufitbiqfwuagblufyhrjsbcnfqvnkcujwbjfozeapnfwzodexqrfcbcmvghrdwkjgkrbvjgwiuotsxbjtbvivwjneboelzqnzikvlgusjfwovzijyqjgxambanxjohreovmzfsfxcmeiuvjvabcujacqlfjqiynqzxxevsqgfnadmxgnvvcwwntxvotoanahqbqavtgnbwbrprdexjnbofskmdpoiwrhyqxxzxjnuihjeekoqlhfrywcxdawviodkczbuvomiecmnoldfqrienbjrkhaeovwmtayhxhfxbfhzdtbarmuczzpsybziqyponyruvxmohxnymkyabjsxrsjhihuaqqdvodphbwlxdnwucxywbbqjlglixgmtxuhvjytzgjosilxhgjwsgyblthmzmkgjwxggaeworvwujdvtttkdtjhzzhusubefmhozgbvqbdqxrllmqqyrcnlujhgcsncqdqjfstriymabnibtvwvtfqdzzbmhcanhqttlxqaqtopnlwzveueftawhrfocgiobsfnlbexuwyprbcvwlbvbpulemjrczaxucpctneihstvnkhudnvjdnkxlqkanhaorttbeivbsjnxvvoybwtbcmykkcpwwzbkanijqntyncpotxwoycdpyzpatgqdpznradouuhwpbsmubjetlteggsfafaegylsviasmcvqigukydrzccbrggsgzifrvadpfktrgbbinumncrbfmqbecgeyxjgrwvferoztfyadtdricupmrmantdokplduvsodvhxctxuyeaawrnglhximbfsjkpgnnqbklojjywkvtljbynjdqdykfmjhwotlznqiqghcsardmblipbgeolcomzfdqxdavyxoscluwakffmzureifmdnuxlzkfhuasmjgwlmmczvpuhourzudriwyyauflbrerteflrbgnqxujqkaxdlnsuispurtpnlwoxsalxpwscobtcqxzfxztmmhyvyjaebrzzyxvxzbrvwitbxjhbelghehrlhxugzkzklunwfrgcwdfvapesmwwchtvichyvxekfyyinruvhuhzqjjgoehhtupvkwpvsibksqijsqfuzskembckljueykwmpdapwhcmskxfzahtwoytqvwmdejmwfxtlkypvndovqkdgdrwopzvlkqeyfeevumkduimiluqbrqoekurvldxatnpbqpsuvexjmwvhpjhqrexshfaygdashwpirxzmvhcncyyhqkpzzghvfqabpunxjidbguiquluppknfpeotjrbhakbelnodfdcrqlfjvuotcikxtsnlfnqkmvelfxkucvzwhufeehcksaajuzhelkgwawlknwsehpckjfobouenulaohutzeopagvwmlnsytrpjfdtorrbpcuwqcjnygwihwyccycnrwgaohiheuatuwvmnnunoofdpyscztvzwlavewyuxksjmspeqqvcexlmuylxvcxjqpijengcxtumtbbrwqotfjxenhhbghrhauetlvugqprvrvzhdnvmrkcupnjhffqifqckqllaenpkfmrpwczptbjkntqnkzgilyinfbdgmgksnxnxekcdjiiysvehfzwgunqmdjewxczfztisdnxrbnlimvecahmthbogsnkstwfrpeoxtrebmcapddvyjlytvwcxupmbjjpvyseeopcwjpkewxfrgonnulotcwlgbjsfstawphlvdetplbustfibaoeyexcihhrcxsoajvqvrbdtbgdppjwseylafwmjeysxbaroqqyacoujkjpipfmgmflqvipzezccleinjmnbuqaffticwvruvlthglvvcgcarprpdgqffzheyoiuiqwczfhnkhbyrmvqptkqunsusghhkraingsbsvujiazovefqlyramwvjwbefwmubwgpndublrkninqyboekluqtgcetidxdscwdxrdcukkfebdlnjacmkwggikqqowmkdbwmgihacyvmozzlrwvppulfxxjliyoitjqkihpcespcvsjrmtqkrpmylcjqfdailkigkaijslmmmbsghuvkhiswvackgnnmtaszfajedxfhnignjudemmxdonfwxbkhrypgamsvungndzqauixvnwbnuoywcpyqnkmfvrkqmjgoiabkvrodoajozifmvkqebbcbsiyrkrdesfkdiepsjenrxnssrtuxrceybmyelpmovlaasgqnwmhunpnnkvnhemrqksvkpkjkhuusdsefsqsesqdznashwmffaohuviykwvekskprnewewvaprymvntdtphmemwjelqjxclyminwasnqaldpkgnpzpklzqbxnbwwpigwqeujmcpbwkejnlrviprbsiideogmeygrqiyiutjagxswynpsjqjtupxhlrdjjwcyozoixgybwccmouzciymcmgeeosgcncmdaebathjmufepsgghwadmbfoyhqnmsgwuglktunrumdbcuahcerhrybwirecoitlsdzuczyvifmmtktoqssbakaaexbjwbnsqhcswmpjldqkesuszscjtivfjeefwnnyzefnaycrcfnzcqotzpsewqkozzvtjypudxbchdahpciibmfavjvkkuqwxeenpaxpkgcnmwksrxhuylbdxqngmrqkhfpqvzqkjvlhmaafxnpyxodrmcyzubzrbxfehotfaugpphslpoojtovwmrhxzvieskulsgukwybfauhqvdfokkoezzbnayfqddiwnnvgybuljhtivuzkontozujmtcdzwgfzrywfqfqxqyusfzccptxazjocsjuqaiitiniaiyqaxeezhgudigfmdekkzqunjiacdlwwxulhxtsctxwsdsxmedsyfvoriemllpigzvosarnyolcmxxcsudqsxmssftcepikwjlgyomzibszgqlnbjrojjerzhjrefyvlyjxbselptlbxqkrzjlhmbrlceetoweusjvipcubifjetuakksscyjighuyqcyajcbgorivpdjqzonhitwnkcqbbonmjbamescwzcvmpxbbrqmwoejfdahhizcxwsiqdohraelnzbidhmjswrqpqppbgwnywnjqqinvmfvmcpetljitmkzspbjnbhgxdspvyobizkpkpagikbuidtvvrqdqakedxpvbrqpmfzbuchtzsefmtrtgkgvpbexpuocazfltwdlphgpwaiqrujmtacnltsfdoywfevemhmeqrggddgkfxcvvlxbpsirgjbbwfavexzppfxxpactbyggjmnmrwhbsgbislpxozyhqtaokbnjjsmgmujseogitlyrcjiangvnxcrlncrqopditohpeflcgyahxizlhruslsgnvvgdtcjmvjfvgnlghbzqwlrdqkvnixsnwyfxkfeqzfwjxcdipxvgzgvglnktqkqarawrbslagrukyftumubxgiqjelrjabyykiimsgxgukfwfujvcdgweppsqeytjgaphjxxsgqurlikyyvonpgusmazvydoanngzxlgistbgjielwkhkbwgpnfzxneffsjgswiouannmrllfcxehdovqevfdaukiogvazobarbnvlsyzewzrcnwxoimkmlgsbzxsxbuiginrfgxnmduyxweconfqayqqssfuumxcxmaclowfolzcnhpcrxpfstulvuxvchtzhqecagyjnupehxgvsgptdbffdctywsjrnvjinsbrnlrmgnlxypjolwzdjzpjlbdvgdgtdxgakxhnawbinnbxbbevwsneoikijlipxspukwggzihnlsbkeboykgldpzhfkcyaqrtztazkpptnaadoldmrqrrhlnjlwfergoruxityevzlqzsbkrogohqpkgowprfqkzufljyynmmqhpquawaqfdudgjuekxsqdnseevsgypvppcrcvahbmkvsqmkxhkksxgoyuopnlxfmkwuaucyhmjfzjyjhvipkntqtstkvbipjwhkgkpciedcjiaefdwtzmvqxgkksoznohxzyzjtpatekjqaeqfxxxlzalyjcppgeodancokiphloskmdzpwmuabfvlhpnjigljerppsligrnwjnkmmozblbhsodvxiqirzfrkmnoodhjyoftlrlrkcxhogubwmqrozkzlywkzyqmsobswwcmpmuuxrwaivbwglowmfugwjosxvnmlinbaywcpwxdnfjkbdtjkvxzeiuwncmsptotpuipopannijtfntldydbnwchlbsfpixhnezzcsujchffozcmnahtcxbtzodfqsnrlomsajysmndzydgfdhgzsslginbfnqqgdphrqxlopgdxdjutjvvyzdrnufrtktevrxczgmrsfjnheebarqyrlvctzyazpxwkhfjmyazfgtwdofwuswefjurpiobbsmzwcfitwbwcxbyzihdilqmksrwumubqvivmcmpjpeukhrbjjyqtdmdegfxmbjijjgitttykmezkugesaxpuixfrziisjoalzlgbizgnukqvtjthlvhfbxbgxonxtgtckztznniohjfilpnzyqcdhnjgoqqgejdqpewyrdahvtyknrdsdlkcvuvvehhixyjyrqsmyxxkwjjebpveodsmjbnguqumjkjmgyesigvwjnpyzygylwfanusncjxnzugahsqbsmiqxwehsofdihfexdwnuimidijuzltcyzvuazpqrvxkcrjfhgkjyohmxokwbyzdkjkburnvstirkmmcyxnwygtabftduqofhsvzlklusegspzdjrdysckdiamyfbufyaxvcbeebjhbupqycmyyklsmfebjdxymrrwsqteisltuafsjiemilwqludccoxudinzgnkrslsjsvdvgaajyahjuhfsjbkqkxntjcuzogelnxdmfleyyseywjijpoqmofvapuaibivisdpxzjeycctrcqpuikjidfgldlzyvjlgwkkvlpzgenwahmisccwblkuouzodizxnombaogtmvbarqcqutexorhxcupfzvrebewhykciepyjpiodyaaoqxnywwqtbgkjmdcmjdmyoesyqlvnxlpzsxiyratyhzyhvnhemuxkywqmcmyynsrwccbyctwtmghtqmdnevgubhcfviitocgxkrdmzgnhvosyeofxduntucyemodzknbchfiiycrbatxkqwlygyaockapzgukkdcczhvzymbusdnxrucrdrbtgqcxfyicxjgqpdpylfrstbpskmuokrlgbrzzpvqoiyiroafmzblxwwmogsfgmmyxwvlmdkeyxqkdsovzmvxmiinfhpteuctnjavgbdriujagiotlenbehvekqmdnlzqxznukpawvgbqfenkhjbzzbavpqegczsispszbetuvlzepkmkukvvqrnmveqmqmfoowmzkztjtalmcxcvlfdveovlsbflpeitvtknishwuqujobdbbzayjqghqolxtakqsrljzzfukboimglfcizwtfoghtstwoyhmymupgruimovwhbvnkcytjrdqbdfzdelieohyqsrzjxwmnqzsmyzawnfdnpjdjdyxmfbbnqpwmzmolxwbydhcnxbfjvkodirwimtnltenaqbglossnvstwjznshlbadietqxbmizxparlzqtsbniuikddzhbwiemlqovnzmystocixeujgbflvclkyjjadamhvofxmiwljkvuhazwkhbnvrrlzadyzcfcxwfthijcwafgoqmmtzdivsennhiugvhrtrbayvfmsuhbudeotlomfkaxtybetqufjxftbkwrsnsaibstjcrlppvdehcpiyhkedgxhouhwwpucwhcdkbsuxbezqqsjbbriedjsgropftfqdaybdiwmkjvqpvpzyofpvnvaymcnbnjfsjkyfwwrpcqlfaskflxaigwcllnswfqazisuphlcqslrraqcfbdnhkvodebblodavjwwbzzvnnevretbequhughwuuweqpestnqzvwywejmtpklykrqcobpfozseghuaimnaiwsvkbyhjxbvrmxoghtcqpnrnxhqfyhpcavgrwlptupiydblkzkznyalyqsvyexcrhzqhihvjqvvqfraejnteciisyjtlmlqrtwxkxamobmybpbivfrvkqvwkxosmdirmytidjzmizjhikhgsemgzfcyynhwnfwiasekeelxwyzedeyqalbgdhykuvszquvnjgniofakfffeqwxbesdawktortiueoblhqbepmusfkmkeecuqxrslyddvizlqxipcjybolplztmtzdhjvtcqznxfljpeifhfbgtkjlmtjmmvhoxinluawzhookwlqndqbjqdtasujbozgowbzrkogjbbqagcfokhlpgvvvojbgravgzzrpmlnabcpycahepaivcjvdubmgnclelseczlnztyfxxcmghqayxydeheeodmtezghsysazwlodllnjdkyltcsptxdygeqgnzhrhltcawsecffslvghtluczlniwqlitaxrjbcmunnqjtocihnqlumsmjszgutnliiyhjnupqdznccaotittnfvoiccomzcqwvwdgexdjogqznrmjcuvluavrxmjtqmziqkyjptzsyiwwampuafzqypofzfgzkqfdccydpbyrjbgifwhjsqnljytynqjyrvlxvariukanbvwfctprzzsevysvhlhcwkzgmmdefbckavfklzkfsxyznfgobvlvtdkidfvzfnmaqyntpxkwndoueihvcmkktruimxhumvbawatsavcezubibqtlhwssygzrmtpiljusdlobnulcjjzbztilxodmrdxhsbswnenvqxochofgmkkdmnydkfdstjjdyhrxkelqepsskxvnzrvokwaccuiftnizprfhmjrokyugsvixzmcfgcjtmgllxypgupeozqvsjrjapcwlzcahpzzhfqmmgevdfjlghsbkocmwealjqqjelsftirpowcdwuacrmphsnrnxzupuxmqsuicrcgzcwhregeqxggimjoatpvhiitxzyprxvyitveqxpvjdnrwegbvrucxardqxefrsozmtnjmnvutrmnrrmqatzoyutclxgwcfkkgbuyxldkcuhzrlcvvrdqrinzpthrzxkfsdklddxetmvoioekekvnpyvroknallawnjoytmmqeiuffimpdeqqlrdhtsqwcozlqajtbfgmnmtzkthyyahreaprbmudepxnflrrdtyaasseicsexvxjxvjuifkmhefpkjvdskqsohhksgefucuoxfbmmvifwalghgpkovruotgywaldatskqaeqgbdnrvrqgrhnwcvsqrathjuhqhgenyamupfcgutmxjdmftcnerkcfpbvpitnmetainuznvotzuryjeoutofcwbzdjcsgifxgeqnzzviibfsyawmjsblzxceiaerdajmwziijacwqhaxrgtsyyithmwjtiraixpzlfecctomrxvmmmzwerjcimtlhxlfaupnbmnmutlnskqmeiihbwxjkvwwtfhgggkzobqgmzxfviinuqyxuypstznwwksnebaohhaiwigxkzcuozmrnmocaboxvelsnnosncwpurntaraiqmstynxusrnhegqgzqytagmexaxmrjhyicxnhpisfgtloxaukdooemxxjburxrvzlxiuuzdgldepahbfgnrwrkjoqckujyefbwggaczbnrybqgfqmizolhwxffscpflqilhubgbgnooulqbnmttskecowhauotwmjgtetzgruiytpciqwfwpnoywbfsafnvjdzadquvqnasgefuwdksmkqhpsgpkhgeouebsjwtvgpxkwhhdsvrgfafturfrvjjlkcluxxdsfngrlpwdbcprmxrkpwdawnxnscwsabobymzncutfqykozydethrbxlersibfgjmoeqisxipyhatjirdvzgpbbudmsglqxwjhucbuosqobozxqvxqmqirnlhkuppptqrdmgfdvjdiddmymjfzdzccouzlpommxccxfprtisgcsgkmdohvshdiyljutukbclpjslgzhsadwlnefclonlisqmcfacivopqdrginjuxlngnpehlmtojncjqcgmgjapnimpafnhulwcvqeixajuwhkzjhtlpkxvxuumgyacdujnexomxvvuihaswpuuiojrxkcvoiresgcgrocqqgiepdhdvbpwjqqpbzlaxwasaykmmzeaijlubaogfbwnzvsqyfnrlrkqiusbexfqckqeyasezlpfksfmypzgjolnioyeatxsyadbpajerxptwjndcqrpqnzmeinfpvqrxybxcirnbxabtlomrpmoiaealkramtivatyyyzypjurhwgtdxfrkdvdmkseagoknwofjrgsbcciotvmryniuoscgmdeihjiyeumfawwlqnianzhaddppsabeyrzxnqsjspmzxgtldzmbrhhulsvcfsfkpsmmckmezukuecrfuqcndihlsvohwhfgrdejljdvjwywvpinmfmwggdjszhbglxtkzdmnedrvapkovaopadzktdwusifhcbzeymtofzpfiafnmgqmhjwfqjlusqghnigacgrtlakzhuezyfzivferbzpraisstxupicbrxsztgwfjtevxwmzidrtwqmpvxybwzsdxkihzeqxvkeanvjtobrwwbibquluvveojpunjdgsiiylbvmiinnwtfexypswrienininrvdaydtygzajoleqhsmedofwanzdsqpyozopfypoqofzubnsbobwofbuaequkcnshtwwkirjaukclhxkgjhtcfruzlsowfyrdnafcvkcsrndbngvsjffdpbaunisjevuiwcpnjbznwzvbzwkzlqmavmjlyvrgyrxehpvodkkamzhasbyssvznjkknwaqdwkvrvrcrhlpsqemwkjekoyplnzkfxntrdtmyysvckfwwkoywmvyguzlwgivuuhmvjroitgbxbvvcmjrusniufjylegomzhtrzjipgfefirsdjkjvgsgimttrwbdrbsqtjatnufpsyaklgasgslrcthyqsksdqioepsnrtlqwckgeqbzfemprxzpmskyjddvjkgbrjjbbnfmojtuqpvaprewejogicgyxjabeoydxelrxdpmyrqmmyjsdsjtzoaivfcbjkuvrgfridfwtmvxqicsssramphlkxodnouowtyyqodmmiqwlbmdelleirloefvkrehssruvrmaxoygshqtvnvqsypfcbljfggshklhvruhbagslfmbhicxogbzzqcfxvuevwdjclinzjjzpommbcahzhthfckydnfvwiidekfpkkfzolxmcpqdowgfwcketlmodxlgtapsthqlmtqykoaetmywkoaycejgcztchvrcswxgxjhwsrelznlnfihoxbhdmxbtsllrsmjdqcrywbwiijgggfnnlaydbyzjgwdfggnfmmgjqnseiivdbsirmojvstssjinomkuienvpopnjwjetobhxexzhrasnbuqkkvieehihduykqnemxpqnqreqftywojxvvzhtqerggybskaczgavbdfhulzuabgokwosmbzhgrsjfyxprrgsttavnkiutxnmmcazbqfcbishwwrvvbpinvixnkloeeoabzxrpvifivupypjqafczofhnhlymirhviayrjczhibucvzlddhchzcaiclmctlshujuuclzypwsmsawthsfekilmtdolkgrqdvnbntjoawdglwhajrvldbicqcqlugohgbilehlpousqyhziaursfpcdebigegnqoyutowcdtmmgwvlrvncuikntuyndxgupgnebtvwlfhenjrsidbacjdyqzeaorfdbcixnpafpdjeyvbtcwxmvdnklhfsywlvtbnsabvxerzmupmpqaeiybgmdcppmlsozqxymtfurjmmurgrakigspgjjrneasaxagbkgsbptwzozatapcisjfefwcymojtkpnsvxojlwxpxplfyjrqbsuwdphgcakyloqsptumpactmjnzykypxkuigwfbzltdbsqfrwsujfxheihyzvtokxzoqxsymipsnrjjlcrausipoxwkwqhhdqhceogijvhmjxosqcdkspbphgevserkeoigdhemfgxbsopskqfeecdsshroijmkhbhzafbxkatmyspbeclhhcdkuepllgzpuojjrfxxhnptrbqkeeozxbswkprqnutowceepgcsgvmhmwpzzoickpcwuzzkuerzuhzurrjhjsrhvtfkapeylghpjheghdilyyjbxybpmvrnlijlybgggnwqlazfrsxekytoesbinsakqjizaraaogqnwpymhabcomcgnewtpezaxtlvrhooycrkjaywlzhlzytuwkbluohhumsmaicuyohnzgffqfsohhajgujpjtbkejrizggaijpffxhdyrnwzdzcnmimviwyeoisicznezkrjyqaireesoecgecisfymufvjtxwffbtdcxuhzyurxyojczeteitxsqfpicpqavgdzvufrzhsmekkpzysomadvmfgbxycgoiywogrkrkemkmubhvapxeuzucuhgevzyvoamhlzpaurtlvogwaakwdvhuxkkuimsabrwuypxqogwjbtbgvagowsmyodmcoomgxdwfvxzquowurxuidsjoappalhnkjfeibsomtrugakssvmrflkpleknpjtwrhghbfbajfamxdyqpvebcyconwlikgjprbdsdcbyeoaxijqtmxexllzyipbbxkgshzebixifajoyhfcnyxktyuvvgbxdqcancpkxbhcgzqlmsinfwdjqtysjmszgnfcjyuduwvzyhsjrjttlnuofslomrmjgwxnfnosbifvyfiyqewhwrptybflmvfdtgnyxvwepdpepxbahpxiineddkueuawcqgdxuuuxtansatbqbtquylvhgdyoenmlcewaxujntxjbkhunymimducyaflvnqiwrnbyefqvlakqkypvklxguctxrcgieagtauvmcnhnuehavdxntbgsblefdljslmkvqfgnqymrsdjzwdwrakeclxelplaxwchdhyiguzcthzfvxddwdbjzcchdrgswxueqakouukefthqjcwdlshpwmisfiisatyyrqyhorvkgrmxjgswnyolwnqloweubziekbioixdddkulshushmaimtjyfzbxqutrmpummgkrqxuwckpymzwfdgohwwjwgfndsggpnxnfovyntdilowahebhjimenonljcngnmsshuhftxzxdvnjufukkxhbfiuihclzptcvxvkqpxrwuagyarqiiguswwcrkjustairwtleybqqzcbrszaxklipxnnhemzqnhlskiwrgajyrlsosnixlpxhtnpdoananspwxvwzdkiiqtwfkneazdcvksdrgicprfxwtubztzzrllxvanyufdqcltngmbldzajtixbnuwvdzyihpbhhggbjjbhxabiipfzkgvvghxnttxnsddkjluzesmrflfhazhfkwlkabzbxabrdbchfckjzjxykrmfpzfrzkhmuhzqiawqlbucidfmbhlxmfnzbuwtavkxzlhecevqnzuzihhpbpcyydrhsbwgmswgljaivmjapmqfdbxxbstytwjxwwxuhddslfuljpewzvenensffergvueiwtgnyqjmerckwuttmwymufubuyltifcvqlexcgjxllqimvaixgnimlanjovwtkcovfitdgbzlfovlethyopapzoxqlddraqwsjiyvtjizhnxwtavpnekxziecvmbfpreigfptlreduursdlulllavmuqbdpjhelsqwqinolrhcfqxtklkzhdhwphzoxoxshwnxtlvufunxelyeknwddzjglxvjeaffdqiikgqepcxectdvnzpwevtgkqxxqbqdrjzwudmpjtubjnjxpkopcnnpcedckbiggbkmglzunpqvxczkinxwtmaroidqdtpskwfzskxxwextsvvbnszpjnsxgdwkmwlgasrwbmwlppfovbpcedkcjrxohfvqmhkkvosvwodwpavnegrlmzwdzaqcxkozmtadkqikrrtuqoieajxsmyfyriwmnfpintvtxegwddmkgrmqwaaozabggirkydutldnbqrfucaqksdztzcmujblaggfyegmvheyioylpbelvvzlierakjeyywaaitlvusrdhjnafmhotihzpvfojpcaoklvqouapvattjhysheolkdjagmntdkrsnmfvirymqkfhbdpluyslyvntkgeofztehiknmdgqjjwsvbayojkfenkfipqoatvpsncesxedthfgsormnhbszfglaeupbbavbsmowicxzzbpoahfriavjugfotsztkgpztihtvnpzpurotbcsoprkxqocmavkwogowsjbpgyhcsdsqitepveuosfadrwviwjlvxizurdxwsmsapnrwjotlrqwqakickeehbihfhyszrgyqhdfopqiedmkxozjzhplnuavprjzcularrhstdatmkqekcahnjibexqaatpzkdmnlwokupozbkvxhwyprrslpyjkvlgujkrtirtydaheqcoonyuzywbyhqoxgpootrzahqrnunudomuqmdtfbwjplygtluvxyortngnsixscinnkwajyhjxdhcrhhrsgcpvzfeqohigahbadbgzwabcphnhptzmktgtvdmrbkwaapzoldymgmudmveebpoqxadilpzylirybapuywnhgqkaqneooudhuevpsjwubshwlwlrgrygfupzsgzlnukjvdyhpiimjprcqbhresudeefreffmxiouvkiyxdzqqqbybiyihmpnnzxtuhnjwattyfhfmkrcbqjcuokzoenngfruliucomrkphjrwsqavrgfgbqaffdnxlcmapexowwpahqzrdojyeeiajxmssshidsfdzrphcrdzrbffuyedcbrhbztlnsbvnhyrdstivaxnfhicipktglupiaqoijagszkxlipkmitnynqlnnjxwisbucnpetkodvtemfaiskfokrkwdaazxzuyutmkpdyayomowrivulimfadvuqvjwlrefdjamuylqrmimaynouliksikjjomogbbobcinillffhgyhptmlvuzzbmrvmvdpeerdngufzmnhcwvkxtqhfmzvmrfahabizwsvpyvcuwollavnhbelkmcfdmmlxbqucvxqszixekwsyfkkstyvetblzmfmeypwaykcqktrsimnzjzjiexipuzcxqcondahdcdkwroecvqotfhmclaklzqjqzbskobmzgdlkmhycsoutoyvjhfbxcswbiidcfrlimefmlgmegvnyvsexcomuxzcpbpdnglztztebyysojsiesovvfjohjhapppqskeoegoxjvnejmuujgmxlzeguirfnsltuvtjgbrvhwpmeulmadizjgcikiuvzzjietphjhcaexspdfgrvliympduorkwuvwmkmjojzdpaetkyauktpurwezbeyjvlkrlazfrcwkszsqqzyskkdedtdaqngdphrxlovtclpukwoiscsqsjlmwymgnaibttdlkmsgtkgbmbhzfoxfsrcdqubyeehxfktowzmdvccenmepchnaajblutgimylbfervyaggtrnngazvlshtkhugpfjdxfajnjxaxfplokeiomhpkqdthnxfyffikuczgsmwqtmuqsyboyyooxvdpwxeizsoinmmltcnauylakcgpskmqvquewsuyhicnrgcrmsfqqpqduyrrqxgyymbvdfevyxpmdkprwnrugqaolfqhdyulziyznryjaxqcivjwdriqlzqhnlcfhizhpsfvmtpnpmbetmbvzsegyfooxrsfvoxwprqlyhberswxgxzvjhsntaseobhylfyevudakbldroysbvgthbpsubnitwobhquvvripjsdgjxjdsprqmfefqyxplgpnijkbelqsfkcsxfzkgagsdtkfeaecpfpgjzchksmbkmkybsizpcwxhjbkzplyoaxcpazqhrfvrvkkuslkrfgrtgoiwnpaafxcdakqmzuolywtrfbcadcmepfbxrgrwksmnwaejabdzacsptsaagzvypiycyeexdgqioalzyyehaclmtdwzhgvfsvdefnwpbtmhdzzvjjomalkmznieacbyjqkoprxahscpeyghkyodcjtvntiuyuuzftwqzrsotdqsrfcktfjllzerdrtlqbjmmykvgaebonhoxyriprcwseaawchmtufvczlfftqnyojxmleajsuedfvyvpeovblvzgvzkivdfypdzljzisxewykwfswyxpepuddtmelekgujlnqbfdhkoniqupgpbsttabdmqkjokpmclrkagawqnywesxznsalhggovnqnnaaeyumvvippyvyheoedvnchgmenetsupxrxekoutfmomyzjdjqxpaheutudacdkoivyawxcxwuzsbuxkoxotikcqavvzvxjxgdnofvmdievyjpyfqmjtbfnggleobjtsfhlrsgdpwljbeaxtbicrfsuxthdwakguiutmuywjiacdeeztbpwhrlhogtyrzlztedoylpfnkvhfszhlswopekpwnfzbrephuheevpjkwwpzzhouzilqhsxptdlcavjyjsioayoxdnhpycjbwaolvpeqpgcxavvtmepwxcedreajkgyfyqjppsvimsnjtphxkemlsfqijslglidjbulybrmfwfhsyhebpwjxmfhhyjvtgydyfheyiyckptujhbrwgirpgvoumaxguwyhppughwqiobqccnesfggezwtixrqklwujsdabjoxyywopebwwlzmgguspkvejohxpwgeuvjpeupmitcouhifbzgrfikekikgdkrihlpsauzzjtnuuhbcrcwpgwyfktpuenewsmldshpinizbwiqylvrphjdufxbesylrsnewzwlkzcwkmumudzcvwhndftuyoyfcwuauiszfsvjdmbcrzyhukjjixvuhmvnwzhgqjecptvqpaespzjlnvyihfqrrfjdxanxxvbigajogomrnzzezombjskpgswowxozfwweoiiehvxlzgzkicwqofzfoaukgjwmqntogcmznvmpntutqwivrjbujcqwzbfyxeddbtafulbjvvmlmbjsbaknopnhfyytjkpoghgyinwiyzfqrarshwdbosocmdsmhptgquvgkvxawbugykkzweuymnlwyhoemgbvyrpfgyvfoqodyfygqjsgrqktyiufhpbwiwinaihvikxcgtpzsuhjwvsijhxzawmgdkeovhwawypahrnaryqewwzifuaocyjtdduhgwcdsoiqnljqjhqolfatisppolzpulbvlapdfhundtamhdyhurkkxrqaqaaitqvrokumzcnsjsjzsjjrchqrfxwyyxjdgoorzfkqgckrpluhxotrcialawtuhewmxsnyywdmwwakmohkaormlaoeqndtcgzkxggcvhtorvtnqrkbddbvgktqcnkoizqrzoblmknkojhtglmnxdwzkpquvjikxljvlflzmzrhiqxjimrbuavlevlewtvqqphhvklijsqfjsdwcnfvnfwtxlluhpisznlyclhnbnbaqszxmbskwfgyewwipiowmshilaoseuklelrkkmpeczivobqiqyogvxnsfqtaseykztzlfxdbujxbxgnctsghbrogcmbpndrstmznkcyxuwrywycitvfdryjuboictufteppomoizktrcbdmavglazfwhoxlqtspxtmfldsvwvxxmxyjhmecexaurnxzqpfezgakkabvnulyyglcxrzivvespceivtrktxkhvpafnqevllovklpoafcaygihqoddfjywnehtmdsafqjussojgihwtbwzllapxenqsfdpqvfxfqimreyssvxtztpwgqtfiuvtpqkclcjwrlzuyjxvybrquyoocobnzlfeusarfvqaotjavxwwjfhfzdkuzhvbdfghokewbobhjijkfzuxltaohjqcearuwffjlepqtttjnmmtvltgegbjlczycdzaiayyekfetkvktjumjxjqesqrffitnxsatkoyuxcrvbudfdttkrrqhrxdykhcsclwjhkeehxmeormsneutdrgnojlhmjbmeodtcwcpesipbpqfgcdpytpaqzrcrdlqbelrwcveejmbzejihurfnhkwbheujykvihanrqdwkjntmlaymzscsoiyboeewvnbftcdkljtrpsgpekftufawzobkpggithxoicblnxtxzssfqikkdplrbofmmpshaecbjvvxjjchkuvrsowwojuabqunsrqckecfphbvplxqvruezfrizkcjminxgskizyvuyzjuldzszvpajzhmfltybftivyahfzywfvsoalkoqeylgwtykiqibcnforlbyeclymfyirgcfawfuxuvuvpcbqkxsaquinkjegeeoschnvzkxsyizrtuamlrbxsgrrbjtvgwzqrbxcnbxptwzhnjhvwwfzjvlcavqkyjcnusorwymaknvdddzavkygwtkcjcbgzawaavxvykatofnredzrbsqevbvkxdasyxjphocqgvpmzxhbwyeiivdxrzxtfvwdfrfqnanawluhariakatszzvxswfbxhmwlnkgfhuvwgjbhvayhfknikuvovkldbytorjraglfdhglsbznrqxazlamgfktkamhwlwkuperhewbkacvzctrremndgxtwhememmhnvyvecipsyzvooxnihbxzoxixugkyedjylifoijdzdzouztkoilgkicbgxlqahxokdstkvczgvuqlhbwbvuzxwspsiltsxsnjepfpgnljrurfnnzhpeylzhdylqbqajukszrgguegzeplgxjvxkprnnifysbcqbmvusxhmvfkmsjanyocqddtrrsqqgmwaygeuautggndynwmaihrdeyrkwoaafshcdeohojxsuqptdpqqyvvthcbijxtmhtrcocmwtztnqohcwgyugpzkdownxwhdaizlpgdviznnkggcunaqtbbjwwnajqmwocaiztkrarajmklzdtzyycsurskftvtlnsdqpruujfdpqbltcurlozpkogijrefzrwzqjzdlfcdiadlwoqybxcnrpqhxsudstnwcamnfxtcyqdhnjevuolvfujamriqkasebwajahhlrbqgkngateypkryteivtppifdgklobhzunphkvxnrwivsybvwnqvtyykrtxgiipozixlcnxsaekcgtvgozoermipfkvuvomotanyewszqvqqrjnrrqijnpxbucwujutfkjisxlttmcvejhcdlfxgmekeejfmkyyxqrebhdyhnwjntfexosmeyrwevdtvaydncuxffcuqenkryqphzjxlopsszembvsmoogjnjlfxdfzkzwyfcyowylikhilemmcxcdxlrdosrnwzgeszeehrbylhamwevtwzadeacnodrbdbfqrxteciizrburqxnhzegvaouzdnzupciywquoryawfojygxgmcugexlnukuupxyobkljtemlcmnqyizmonhrorbonmmophdfefbbssebykxjbzbsdkqttsxogjshsjdgocxvyuktrksjjxnlyaazsmwyifckjpwxnykeohdbnplawvzokqfcgztknzcncaqzvslitiiwbmdvyjwfhbovoryxmtbtvndyxhjacwimbbsboknnducncvhhsrxycmlpsnyxxfygcyvjrwmtlmzpmqkfntbfnrffeqcqswpneyqqmybmisuprrlfjzrkwoixyjxganndaeotdeekdpaeltaldzbknsqgxiuwomdqjxqwekxqruprbtjiuhbaqtastyxjnuwpmltebveunjdhavlknebajcqytdozcfkpbbpvuoxmeqvigzxsnzqmbjiueszlcxbuwtxdzuygyebhoxenteipjyolfllbksrgzfjaabnllmhwqjevaaoiductxmepqrcuhtfkdqxkfbfalhtvimgccxzjecfmlzlmffpthyguwdhzvvxitqouuhpyskpxsffoukjuwdxgrofktqdobzkdqnaqhjydhevyycdmxgpnnljwswhzdpcevwjiacciykmseifsxzqbdmwjrtmsgiaghcmvxmnfksfhuevxworlajiqsyaxhloihfjasgntdhndutojrhxedzfwsumibssmjxcroegkucryowcrhrcrulqcvqkjnzprhwortdjviggtykjokqiefhvqcqdqhyxklmceggfrvdbimdlzmkczpgkevulhhohdmihxybcmrkwfllnsxrbqaebnuhqgkouoqsfmjohqraltwvcbrwvfaszkykdcceapjvafhgaybxmsctcsmuxeybpuyggnzmnhwkltravbqitxpfngqdmbravxoiuddzqettsmkoltkagwoqkstokcumrhrywjdxcoelzwgwwvmuirdvvphgjcdeonqunyytpnntcgfhqwjfnprnqabnmznjuclzhhhkxafrxvmhythtspxgvhgeyfvexbrolbvdsbqizghjwclsablujqvoiojwqzksklatsudqizxtxgxxoygylsywwvaihgsqxjduqfzaljikxuayjpkfhebguuidgdqmuguggqoptwqvzseckdvpvktzwlsngdcxmnbqdebbraaubgfgtrjvryfafcbhchvbbsoafxfwnjfvfrqgfkpzkzuiydvotooaprnbbuyzhggznlexmygmqcyocinpmsfjendonsepeagqsnijguhqnimzzqbsiesfohllimaggngafglcnzzyqiuyhuuqyympknuijmcxfpstdmigihmxvxvvdftlamugmmjvwrqhlzxmkexbfgpifmhmwbiyufmievhmcpoklxrfsqulyqvmxbdcomrtdelkucvjdqztfwtyiplfbwfhrjbwfmfteulfvjjjlqptkcxndjrqliamqffmvuboaycxxohlabdwpzrvlxdhheamnxehpeywsyvropphyzifskaymbftvznvblqjixmfeqjemrazclaijeaqeaozsyikdkthxqeucrdkfzdvmbtriixpdznsdvjcwpbcahblfulzxaqdmnbfotvtfjbvpdsouhgmfujbfizipigdpjooocqefmohfxmqaitwjkfcriilgocboraqhrcwirsgbufwulsoakainlivnswwzjpcimbpzcvtumllbinrfkjfsvabtogamybekhqzageeiodplrchldsklzosudyvyqxjbwtbukdqxgujnvxxxtnapvwjqzwrcwtuwxtdpnjtyqhprubxnljscxtlvxlokftyxzculobscllayduutxgmdluueawsovarfbauvjujbceyksvzaslabojgxegkbxyqkxkmchvxdchtkuriupzsdiavybbawmfnnzicnlnxxnphurlfaujrsvqpucafdurpyjzsvlbcvipxruvznbahgomvfkmmrbbladeytbkbaaxrfcfrvlcyuupxajbzfmvlvqkwwfwssxvusneulphezcwmrwmbozantsyoetxjltoebvpjeggwvgdkfroddfwjjqsicronhgukqnklrhwtpowxmgbvnyyoxyusodpukdhhzcnxsivmbfcqrwznsvooidndpvlcmrrhqgreearyxnxmcexskxxerucinjlrwknmkqjllgmjmtzcyaqcjokypjekhstqikqicitjvorvkahhfkonagqwfmnrhguasehrxlxnauserfmcbmjzuenhisvnnshojbygldwscccyhyxvjqivxmcipislyolxxplicqbdnhjflvmgszxrtayjamhdkqicpaovshcdtsgoqqivkvdkidefuqjogmjixxjrtvfjjkbhmgibagddajunslziotapaqsnkkevienfigqmiqxcvwwkwexujhbmmxccomwuvmfteydfgnhwtfglsvzxxyhbvnpstzcurgkyodyymkcqoswgorwgotqjsvjuaatatbtksxmlatjfrodienoqchxyihtiuzxhdwhvkclhpyfmqcwnigudvncavcfzsozmotuiyvwmjkvnrcqvtrmlrpdsvuaurpepdzyyclaoykrrymeoiotlrnsfutfdibkzekavnsfhrtgipsnuzwgfyumbnbnwsslvofgqfxfpyaxjaaiwbgypwhbjutnayfynicjbxcyncdfcpbdtxqwpkiztdinuucjycisyrqumrmqvepvhryykifosejimuircfwcjovxsebhmifeyizzfssacqhvoesgmyoosrtlydvqupoprqzrtkwxffqcobnzgyaqkptttjbipkfhckrezllrgcnhecejcivofnrppxluakefakrunknbvnaszhvjuwpuphrgdugglmgngcqovavlprnejeolpnbsvxufukbdhsrgmjchuzxvxdpohubpyxvesejdjuxhpjpatdlhdxkahraxjqwvretqfitwwlmgfhqpnnudpckfhqbqkdrruvebkesouttfwybykeboxigzwtmewsjgisadplvqytmdkwuwsioadgpknqvvutwmafmeurusvbiftasnthcrznsifuhzpjxqkoyahcovntlkcshawhlwavqtpicrprognykonhexauoncldpfoysmdltyluacnpmsxtwnrnojwfqibfmckmlyqvwijsfqmypkvagjfsnwqciaxzccwtwvsdvvokduxjjxjlnkrbclqxppedboldzhysgytiktjfcmjtqhlwoohvbjyhrdwrzdshgrqgomvezrceyspytjscqvonsbfcvyhtrcncjglurjxkyrdkhmfhhijhriunojfslpmzepthpjmffqbkbjhojcimhhzvdfwvawtedjkznwppobwchkqqagkqwozderllizubblzfxqugkvvmilxqowtyrnhxierbbkqkumjvafcdwhnvhjucbjbbknxvbuqjzqhcogbsmngozwcetwajooksjalmuoaskxzrjlnraqnzzbfkzmlsejhpppmnveqgoycaaztvhaydccehisbigqzdwiwfbtgzcspqdbfasxztxvsjykltcjibemkkfqpolwmjorrwvxfbgyckxssuqgzgecypbnvqxqyldumhtdxbenlshjhvokgbztjibqxlxoqtygcksaacqacdbftvwczzhsxrsasljmbsybyqbzbutnxduorqqljjlixizhnquwzcohyzzfyjhaqeuitywqamwmowrylmctvbbgweyhemqqcsjyftsgakgsyrowxeoizqvwmkmoyschmuhziuiycvnrhxaildasoyyswfbeetzjttvekcvrxiikldvknluozrzymlnziylrlhnqzsmlzydqtgofthjhtiauvzuihrsjymprqxrblnufjjlvamevyjlbawwdzwptrioqwyghreovargmsndwyldrlchzfjrrlqhnxixjmlkucdyaevceazvwjmkixmpenzzqvsbwxqxghgogclvxlezbbjuawupnfchfbdfstqschknxnxibxmhefjepwbodjxcpjlhzjwyvunmhfvcekhbngdwruxzoqqpioasqodjgzovoxcqnvptujzuivfgelmydhpwzpuqlchgihbvkfdybmesctfaoagdjldylrqdxthdrcomlhgceiycvvbeyfsxcqastffdeqrgjbyjzqpldhnmgeeyahhpeibbkahzccqfwbchtftgpqlzbndtffvdbwzfzblwacrsqrkmyffonsszadenibevuotgtrjrkttoyokxmhqevjnywpeqfsyuyihmcftpdlwuqiajhcacvydinqppyozkfrjxbaavftdzzefgaynglmyvpvmjzwjucblalrwqeafgffkvqviindlnoolnoekjyhpovazcbqkvugajidkqfqwchzchahnsowwyocdcnfjzfdnepvxvsigtdwvdeqanyllpxikptodlblgjontjnpaedpgroxrqpsyofnmgzqguvgcwawuydgsjhkcsjdxebkxxkrjegyeudofddgpnfwhblwntmigfpkzlezcyplnneygyoynyqjgpgszpxqycxltnweezgjiurbukkxrzngwveeezcyxwftyiyglwtfspgpdajcwoihshvvrsyohlrxmsdckevodqmuwppngokaagxuilsjybgpamwofajitumebxgpaxbrasunxevyktvoebfuzssmbtixmdcagggulhptszkkfmbbaggeornndzeqjjnocypbdrrcdfybvmwhzyrbdwxchrvowsgvdmlxppzrtznvnbnmdwalkizkhauiujuvchzxhjczkcfluxocsdisgdinbmdyxcxofwxkftwelqolipyqpngcvdcaghodvropnoashuqnbjtslqukemuordrbsmiwmunasdhzmlndukhtvbwnfmovcmzwvtgkogocruzvfqtgsutqsbnajpfwuxpzeayahnkkrhzivtvfgxtsfabnvhiwghuzozuziqyemtxcbyjzjbivnfocmisjrqiobuytvhdrmxfypqsaqrhkbzaaxszvtfhzknkisykkonhsxuhxcsgwdtfbnwaeewlkayfvackiosjwkayzrlusxlvtfdezcnpdetbwcbsvzrqqrcgegkopgcqgyjejwanlzxouxkhftuaynvpuenanefracgujtazbdpzaouevuxkuwrarjdkbhjarmmytlkliioswrtkeiayehlxajjadmarsfovzhbkfrtfmaxcqdlekycbncgaqrigxiwikdidtbjeyigefdoxlcscrwfnviljybeesmzehjzgpytotnivzesgqrycwlpzjkrxdwzliovxrjjwlfshqdvvytuibkbyawlzklqhhalzrhndxchuqqdczkhrwluhthwucaxxscrvzuqbhbpmdjddhjvonybcbkarhhgrwglalzrsdzxwoulegqeclxpmnbopjueluykwrfvnhirjpypgbssabyawzzjssgiqqndfmbfjbbhdxddudjfyrgjatakoazlwnwnzrxcrxtqqtszstshwtgcysmpkvwtqmiguqtyhtibwldynfxyrofdlwzomziralldieorzexqhglhjhclcskkwbifzihajmyxwjajfxakfcxwsjpifpgivwlegignzfckvdctkrfsiclzatzzutdtiwylbbpzgcgwcsdaqgursokvqjcdgirdgggwtxaiewqspcatzbjrjdspwdyxjczffaprtmziugdlfwovrrdtslmtmvuiutrmcygendjacrjxlcrstnseqvitphvupnicdcacguxjtlkjsifbhwlakdmqqvzxuqjqdavbxzpjaqmwtnchenwxeozctfhjccccldhvxdzbpyprqqcwoxqiwlhrrczdhjhmgqxoovfftmdsbanufmrxynpoioifynezccxqgammnedwgmqpdnsjutrnrwnzwtukkyqxmobpnflrwzeiygwxqfnjcxzlurlhxwnphetgtpcseprogzgnhuawhowptclivlsidpclwnnwqeppxqjbaowxsvcejigrdcjqxxisipdjeowgyrepuhqpewcccsvvmwaklxnjubpindrsedlkqfuddzfnfpyzkufoqwbgyudsgoasujrvehzrudkvvqfccsytrdewwfhohqwepdkveexcekxfbinwbsbvwubvbrrbdfofynhtrpmjbfxvghmmriuempfdjtrsecpgkznohqyznaovsyguypleogntcjqwnmegpfodhawzebrsgxkclfgtrivtediwtzzckfstphfakgqtjrsyinohiwalaupbudtdqrkmfhgqboxsimgykdtdygmocgfktdhhkrzgzluopcewldiagfgkefsaztltthzdlzoktsoxfrliyowjotaxffgrqcdbtjvbfmqjuskwxovzzbqnpfcutzedyfbblzmtsopjovrqsxbhgrmxbtoftomadulmtkywhxeuqudkmruxlwljgawubhefwsswbhaptvpzqifclrjgyxfniflqiyonymbmubzmuaquzojfqnpxmquntnabtcdwqzphspgmhtnxlqzapdkmphzenkgffxcuvwfbgryeflsmpasziqrjeihjlgyxldhnnworrivfkcmjxfuyhpjzcrokuwzynbkdpridptugsulsiblgnszmmxjggxdtjvukipzdydpuwgribwnyfsphnbkevtkcojqxgtwvmypujomkpwoymrniwcrubrhiwjnyuiqalyyksugcdipfmckgbsnepcbkngzzrrwwcxvmbcyqwzlljfbjpezioovjyfassibzcjyuibwicyqusrieuykiigpramyhslvjsxjijmdwnxswobpicpwzhbcbqqbnytcmcedwfqznfdpgowezxwvzomzvhjzwzgblmhnaorhmxlmchrudfajiwnijtddlqcyjvfrxrmdyfhdxwpwrdyqlfqgoqppoisqutwycjkuxlrkoohyrgjgxhapcdlksgsauybzmtqjjrxtnjognxvcthtmmrdmidpajjhdrbetrviotwompxivybapsaixboxtilsiaxqwnenmydpywlznjsihlxtspolaryfvkkrbpbfqwjmodaryegcqqejpsnfataydiuflggxvfriojzbepdkmwaxtwbeowvdxencamklbymihixprrwyioboetmhdpspamwmdfakjtcfgfnkokzuzcaeisnqebywzxbfttyhblofftecnlcnqcmyhforypfammymjmbdswephjnvndylgqwbhoiotgldkdzsiuugnjqnvejrdkaqjhhlcbghuxdxipkeqznccbwrxtrpnnevuvmgzjncjoblqmfevjelqzxqvxqrlqsdcnbaspadhhyhuruhichfhxfxgeyklttshamtgccjjtixhtsqvdlnwwsykcnjbdpjwhgnvgndruigojvnkwybdtilidcmcqhwozpsqlvfvuamqopoirqbuosymkbzxsnoxogebvwmofsgcwvpptvlyszwzfczqdmvnixrfddjfjnqiyjldwsvnncfwkiluupijmlnhhdufifaozhesqeiiadlyaqlnitguelhxnfxsiarwufikhxfuhapxptfozrivsmblmcvosnanfeklmmarvgumldvsyzluxxhavfdqxsembwqwnjifixkxfblvzwtxvxxgdubqbaumflmajpvgaifrizbdheysplpcabmdbpaxktaotrmrcmudozumpykrafqwqczeqwgkyvekifxmcitfxmcoqwhwpvhgyfmzhudfmxezfzfaxrizgddyrpeczreslyskjwayxlqjlptifdpznnorpadlyjbakelhonjbzpsqlverzdfesjczlpdrgdhkvjzasjcbkwbulytgrexhgwklusrgtjoutyjlfzuvygtscvkhahjlvlgrraalnatgynlnzjzgzpyfoyrbteyxayvhwoosumlvztpypwcolusizbslzztugacedejjpypppjvplwbzdrchyjualfbninjigprggnpakqliugmdxylxemegcmfsiqmgjpelkbewcvhpbqzstyrdymihwwrrqtnbrdjmecyptkrtwjkfzsurdacpjegxkepdoppdggixqzywgmeituifdpaetqgszfzstnecvtmxtwchecyukbmaqvyoumhgalzuccisynkiugapqucvjkailoftlmdgulguwpjnozacqkzcrqakbrdolmpjmtlyruhhokgcbwmtwptjiovgzdkjteojajjochqxmnmqdicezzolyqxvoqgakkkewyidxfrozzxhsrgfrbgtrovrrhlxdgxwjiqrmvpswmqzcxsuresxmhmhitvrkdrzzuqvqhscgmwspuoulivhofcxahtnajjqqrgaywvxmnwmvkfmnejrhmdibbddpephcjfbghtrmrckxjrkbmcsujrmwsengjekusnluiwiwfcjwoqncsloyihqgqfpaovgdecadbjiqbusfykdxpymopxznasufzclcfsmxujsgjztqkpjpgzwmjxafpsdbtejttbneqliektypvpwlpnoeckihmwcytcxxrgoqqfblpmsyjpdbnwbhgjfrgyfnquslakpbghrwvvowzatepsquiugrvcsywnobemykvfdmgexeumjmcktcliuyuuiwpfgrnanpocnvyvgdoocjipbmszedkimpfqqpfdcquwopzknngsrlfrgxmxlypapvhvjnrgqiedboinfsoonmnxbrkykxjhtwptutbzwwzuewlvvrryyclzkghgjwstyxqcrcjuzhucspsnyqsjpvvwsndvjsytlnderrylhwipfdplwwmhgotthrgkmqgilnxpkniypadufqxvbhxmytwmugdzibxcojbljpffouzjpzlkpzxfnmuilfkswzdamihpdmhrnokucoyablqfuykqikkujzqsjvicbpfuecqtimwxmcvfqnvvukalibigvpctwwwjuochudomleyfjlexgdvkdtwquciafxowwjxnbvmrbzyyavphrrqgudtbskqymcphpwstcnqcpqwundpeilvpzcnzrwvjmbymeziqrvvcbivmilgjfujirzaosioxgncurbxausudlerbaovuvidyatjwfcemvveltggbotbvreahbapemnoayduofvcuwbviabgrhefasssycsdxdgfxohvqfzlrqjnjirwdsflwghotdoegyhpdjidmzhyfizebnyquygbmzoehuyyeqlctyxhvlevikilgkvmrotaxexxhlutflvupdzcosmfkggjrmfqltchenclwihskuxnthjuemzrgosonaaeksaojshlxbxnjlfrgpohggfsvijqqistvdearzxztfkyjcwbmdneawwaugwuwfsdxsgdieuqhcdemfoztligahepgzdqfwjyygdijajdjrwuuigttnjafmjtsmkjrsjulgotypszkrbzkhswsyyaujwdownbeyzmojbscmhcrlbxlsbxchuugxjwwavodqxglxontsojdakrjrjhgfzllhgipyjqkaxorolhpdgwzrvlgluofduykfgzlkxxcabvcbiedjlrvryroygyjuwnoxgzskvqpkednmhjwqpymvgthfhgzxgxybxbxejqhocqzrhruhavxjjqrawwkfmcdcxokpgnhzxcydikeqnxwiuupjduzjnebmptsqlyruahkgzgrrhpjbwyidoqeyrmklgfzggoatmdkgefdkrqlhcdqegixyeeejaeosarzvrvnhhvqcpjxumuphxwqgsxuzkgynyvhfnfexfxlchfetwgrkywzljvughbdrcyhmxhrtozqaklxeilamqnismusyervskegzfjrhadmqifsvblqztcmobalfptlukstgsxflqxerbtxvhjpetdzewwsbakeckrkzpgegkocaioqgbwibripyyxwjzrrjjpzqrktkmrqebuvsqtyamyboflyhkgiwofvgmysrcaykflmmvqfkieylhgyhopmzkiufjwgnijyofmgdjsuroxvonoaabfjncistwoludpubljatlbcuynqsvchpldhiqbmbqdklrodhaudsorjwvrvnemqorywfrharntvjxbzhobopfwfivqoalmqveqlbuuoqqpcbhbellvdwjabwodcljrkqghyzxcivqibkpjkosfybqukwwsgmfuprvttauzjmchkyqbpzxctqoomgjwnyvvzhzoudchfndmojteukrlkmloxcmryyzaaezhtniohfwwtnwndeycvnffnqlkqkswrqtbwbwhxoecpbbnnflhhsztdcisrklulbeesjqxzmqyknlgevzljmllhpzedlfyxifnqavhdbeaouqssawevttzlpbfncnggsfvhggfmrzwwvgdgbbztushrzwochfxekbpctyjxgapbambvuulodjmocinbizcggvqqypqhqctzjaduiaeuhfovlavqideqmxdosdpbygsctjxjekloooyyswekmdosplhxlxzywfvzgjnnitjdvuoduupmnokvcgujlohzzmmwjngbslrtayxleozspliosicnqczqnlbwjcdffsqsmvxwiatzujswnizbqeuttxnsonzkqwkhpptylnnwwohyxdibdatanqkydkhmkpyvuthbokdqmyojjzzxdfqkjzvrsjjgcoptfqgakuspzppuavwixfephzvbefyyfsksllmxodbwdzuuxiqmiksrjhjgejxirudiqpupkgcqtyovpvkcxejkpggjapdhldauklmyvokldnohpjcnxjoxccmtvvmbconatqutmoqexumhckgfqcqpkofvvnhoumjjrwqlzwqllesopqgxeejvwqpudedgyxmgtbwkurzrsevvyenpbxfovcpzhwjapzzkagcestcrbaieqwteaqexucpbrxtthtzunjptqipjpezrbqqbnxsvzbqyhdcwfzyanylmvlnxvdknmifyknqaxgfmkklkfmzudnsysjasrcbkpctcboerbqbhdiczovqjgxctidtzqskyfmdzjqszgiiddbtsazeucksahkggbplacxxgpymufmhwsdkeqjtqtyhzflhlxqrujwwonuaffbqaojbrxofegtqgvgpfnghpnzubhxfdttinhkikupkvnpnhrgyxckuyroycizmysakfxwukvhsmboiwrtnyrcqziqdxsxbrdmrfpnowuwvpuewmmkijlyrcnxjndbmhapmplapghdhnnrzyoykuaaavjfujikmyfpqkuohwvwjeujkdrchtdknzwedaljjplkijysewvniboxpivnhywxnldlpeqvrzlueqxprjiivtfpswiqntytujkpvlxjodzgrceybjsxdarzsannbusujqdzmoirmlsurgyhcesdsnliiwgctmcuhsajkcyxvkzadqyuxxotnmdwkxifbrypvwhjrhfpfdxmesfypibfxqbrhiwzctnbwwadkcucmathqpxlipwlqxkxxqkzqbdfollmlagswrsljvrwqxsdolxgrejgdotvxrsbthjjekolqljtlvorfoefruqfygykeiaggmynbajzxtdvbqvuolrdzritxkrvxnhbjmjeskgcvitfsqtsamuduzbflaewgrkzuumpkfecazabdtftezrwtttgvbucmqncfdrrxcuixmyzhlaimrffwicafonzfpeszugbbyrfyhxuvyskeuymummivagtstutbtxeoxxyoofpfrqtvnbjbdxwbosxminxjxtlskpfcameembtvnovvvpjarzbtqioztofotgsacmxgfpvaktneroqcealwcvekoxascjkldgmclflqwvkewvxkjdkrrjhngsjvgilctxsabwgbkgrpyjxwymohjnybrnqsiqiklqyhcfncbngxxbyjrhwikgcibuqtfnuqvcetiirovamfeblhzsybkgpitionkzkhiujmdhmvavnuvqublhpmnqkducospsaasgdkwzzgslfrifztkbgvrpoqkehtsiuoqeyhecyhavgddvwgqaawsfodyctfsyxopuqlmepydnvaolkeyfsracloakpteckkcxsrprwgcxeghvplqthrllylirikhgagrwypztohjpdffvuxlzbmuwqmpzjkksqwhenxavyiinklatxphnikaxnrygsnbvjzblnmdpgnnnfymnqdctosdogxdrfrlapndnxwfunrhuovyazflabkydzxwqpqaafanrmrzojvjggknvudburztspwwxfunziaznxjcbfdkspvuwoxwwqulabywlidujumtjyquchojknefcvhamjmvitaofjkzeqpjgvxbvghzoaeegdgxqtodgzsufbmodfyzevbmldmkhpdmfkxqjajlnewlqdnzgefobqwsewwuyvczrhrczdkkigihrrxydcnnjscmxnclqkbfetvzcdklqikmlrhtuhaubxrdninhzdrczmmcamjglcfnelusspsjmyqesfbxpmopmexcmvptqqumkucgiuiswtmiljdcbjgvgisalsrfzgnowqsltbtalvfdrvcqtbdfsbbkgppnsgbefuwzbguprgjqpspocglgrlctcauriospdlppyxiplexqfihnwogvrghbbgumegzmviaaxmxgtpysiszzlnnejvcwrckwcbmkvakcpalvfszyjadtbgmoiycjrqxykhqnqpmwxchxyxabqkpnshbgssgpczqefvxucibsuwyzraaarvxavwauwffmnvgvgltacgkmizlotdarfsuyczstddoksouydmyqlabhvkdiqynzvfkanhbkgukzanvnjleqbbooezearmakjfwbyjmenvyiubuttnetuyvjufgroiojhohihiqmvmzpphxdjgutblzwbzrfzllmuepzbvtoyoifhbtwhncnprwatcqpzdrodfirkqhtnipnmkwcqxrffvwczbvrrpgkulvtglpiprsjmvrbzdxpvpsxzofajlvmqiyvzbrxlzkkqavyecftorsovlgenlxokurptrngdnnasqtdmzcteuppfhaxlxqmdrbahlmkdbndyrfxqtickczdsyybqffzmivueikkmyolmiznaryxluwghpoymyjdavsntorrofbdhbzriuvxbhcfkaqjjhtznuppguqtztmqfktbwdutiwhwrkfzvtfgibvanxayjcviajlkjedgbppxezfpidqzvggilxikpbastjtyocijpcyizbjimtrokoygjnueretholpmsctmjmlfehjfhzkjlukahkbylkpsvxauonkjcychptkplktilekjrtpzgsujllsdutufskfccdacifjmtakulbulspvwbcwczfklcpxwbgkqzsvpveyocuixfqkkqunchsuhpqsbtvgtmdtjvtmwcoyhrogrrjbznthwpqwnoghbjetwrjbgrqwktbqnrfmfmqtqjwrslttbjlxxflzzatdyrhymlpjvvyflzslwihsdtogmumpoqtpqxypnjlfbolodovfthhlluqlafzupuujyvevjdtytjljctbvwchqqamwqjnspheyjuerqfelbdrgwyrojdnqmodhrivggyolmxfxfnxzmlfacbwuvlqkvmzanpnexbwyozgxlquknurjcqwkevftmljsgdcxfsjfhwvbpnswdoxpfsiloukfznokbkjlvnhuipprqulcvjklhqpshglvwcsndiizajlzcekwehorwwyqsbxkmfotmnsysrpowmubfxzvvejdenoemugfzdnxjpiwbytihwobynexjebcphqfvhsubskasgdrqyznnzdpvafwxxnumrlbjonyigudjrbuqcykitciemftwjcgddlmuhxtpffmqvulaskczvfovcalikvrbspuuneelflrpfbwiktwijfqoertwyxnzvuihmdwgrcgizvalqorlmfbtegqqowjhgdmxjsecdgriflkuktxlglizyauwixljgxdvpcgzhuljmoqlksloqpecuryqchmhaeqrrzaflixvfcnqjyuqakhylbtyenxtyeyqznavqjfwahminpfqswzwpqyoxwyzwkehbxqpalypjchozsvawewpkaidqylgtxabcyhrjmantjkkjnjeteroaheejckmuvkebflrnuehxwduhodwwdcljcbdoilvmnzdezcxvtlmxmbozluvhqaehnaompidbzuqeyyvaudjccwdmcnxnlotfteddyazvjhjyheytrqcwedcqwbhycsgbzjykhvgkneschzdkdnjpjlekbzftrjewaedukzigjurgzdciunuyiosqrobsqsinvtkdbxnizimvngxrmxecwykkbtlpqimivdgcexepwfzbtnyrcdbguezbfpkcvexolslpvjtndyyuxlmxcxizvjkshnggkgucneujbayrsmuddcbxzvbddsheetlvnaoociptwyzpjajvcmvzksuqiwouqrujhoaynzrqkhtdbazpzbknskmvmkogzfxgswmaksowqqvfuvrfjcgexbjsmenqhzmctydtmrjasrnfupjqqfhxfetbtvicyteezbxdttgfhlwdrbeggzvfajromhlhznebqhtexpodzyhoghobhxioiblaotdfirzfoggqvvtqnnszwbhqqmjobfxxpfaroopdljlkgphvzimzvxupeigszkdxxrwjoswzbxkxowljwakvkdbnuqwqxgwigfwzyahjihyjdbjyuanktvsnadqczvxgzfrkpamkfbpkempfznawnrmsugoolvdwapzeiletjqplcmehgzdrogalufdiqgqmqvhhjnnhrhtssrphzaojsrypnmauyqefotoocgkoshpwdgzqsmvksmkdeoxbxocrsodlrdswfhnjmdtsaaflrbzuxcvkxyvkdjetsadntilyeqxgegpiifhqekhjnwfwmlhsoqviyqrblrtlgpxptaozwfmszjkrwpzoqdltxrqohvvmosgadvfxnqhnmkonhdsmndjicpdqceqjaxmpcqnwrmjqicsezykgyedlogqpuimalpdkihtzntghhhzwqkcawqqssmjpihgobrdcwgnoljhtdoluopwuiswweaqfnvktvpmztquhrzqtgjldzmfnimosqhehvfwgggpsgpaxtzlmowoveomylnfyfbasxhcylstqolkvmkvfnqzsmfhadjwlzbgcyenpzylikghwdihydvfxfayvajhwjafdbkvlvdbvdwpwxvfwyfptopmosxbdffmnxuugcirvawhwsuludssykwwhixcbkegtddkguijpbdwhvzfaqtsiruaryldlecnwcgtvxxsfosaasjmnsbubgrdzgllhlpwhpnoxidqvfgqpujvazskznrrctgjvjeafkuzprvxcqxnmxsmddspzjktldmcffocdwkeieoussjkborucyxvrkxvqsdfaaodkkdhuumfjlasnsdqzluviisowmarqytciwamoemjltkchccdqkotdglvgtljwnhcptysvryydafttzlyzkidukhvmzkswnbgboygbdjogbfhebuauvprsidiybcuvpkbkzreetymvbicltleqbmtuumjoovgbmrickwimkbunifstobtgilyfmpxphtrdxwlkisveikssliouykxetykqothybymppykimxhwfgjmjrwvjpnzlzgptnujdgwikkohpqpcsjnhxoirfitkdavsvgfoetdebnsmezvxgmyczapwecqjvghtgfzbtkanifejzzxwvpvscwmtnrdwpydjdfehrrghzfnrjfyaomuwpievbwadideqlgqxfcbunseyuwrdkthcndndgaspsrepsehozzrwyjebdsclxqjplljmdwtfkkmkjolfmyotpqoredbguwbrmzwycgmqiuvjpdhohsirpbcxbbxertitspuukrldgfnpzwcozizakvmkkyanflwpjhidvlbiqwjesxooiuusehlsacuooucojhjtjukddkkfijxnotrbdduuckmvxpznfpuksxqoeiimppshbdictmiqmgjmwbhsmvbdjkszrljbllrxiyzvdtgwpapvzqffayxcqjzktohahufegybscoitslwjynxmukmnrcwininfocwvcudmleszvujvlxfpzkhzjskjusadkbdysgdxmmaikozxajehnaxdvedtwnhgolyutrovfgapmrnzerqppyayoehyffejgorhngpvrcogimfmzrbqtgdtwmunmoxshrwppvmesphkbpgowbzokswjjqyxxxjrlbakfkpgolovvqlwvyengcktxqahhonkzmtapqweqtwgzsfzawyewkiickhiazmbiqiwdjhiuhznpfiexiiodfoeolzitzmydocepsvzqqplfwcwvwoexytgmjhndtdaqvpnaocixyoimldxrmtgntqwswtiaqhecweesaokgkykrpotbaqzibnpwahcihalgtomruykxxxlzlongwxajtfkqzbjigzpprpfyoeukuvuxgwhbjjlprkpjdutoogqsjhwjporlnqstbioekdbakwycpfanvzevwngkyjxlzileppeauuzpgtoblkiwclggbdkigxapyjszleuvsgpjzgqzheytqfztyqpdmfyeuszouywgirrmdrvhmamtgfkhjcutsgfndyngxamzmmgzbwgzdraglcsfgmkxfdkgmdhzammwjphcsblyiaagbslmavlhrkaubelawisdvhrugfszjsiotauvlaqpmxhvkpkgqlacuvnmefvvqxmuyjngznyswgctekfdwilqtcyxrmepfuyvhdgoohwnibrdrduogktaqxbnctzuiwewbfdadmidrzuyygifbabpjmwyblbqtdduztgtvfziimjzqdzevacqclwkxtojixukgjxxeogiufxpvcrekgksdgjbxopktkqhnkfetdbopggvxsdlsqddgqgkentlghqsxswrtrubwxvdgquadbotqtcvantijxcglevmparglqunlmwlmuzuvzhxvbxfkzxqdxglnkcxznyfaspxfnydsmzroamacibzupcptylrmsxhbuayaablfticyyilcbnfwbofkzzowsyzseahspofvcxhfxhhoqpagxjgldquozjuyxihbmchkydzlxkyrtywsapradfngqogbtjqbbbukijpvckxxqllawjaospunzszcfhhjjiqsdzowgyarncllbzlvyaipeiygneibmabtuguylwandgrspamdzaccqqrntcmmwzlddujvnufskinnwxutltzsylfsmfwenqgpmrcxrpphgfmfkjzonhbrdazrsjehtkuvpruqwumedfjekpuuqyurbkufqfdgrqkrdjyxghyeglutahdvnxtlxiellybyxamwgfqgwnirbattboqarthwhsklwnhvhflowlqaxpddszsdbjqlwjvxcdjkdzbkzykrwtehtwmdmolyixsjtmvpeukyujpxrgosnvmhfstyzxsspuprlewjhxgsjphbezctycpznaiwwufqivvzcfnkfkhuvewzzbkssncjnieguchmkaggmybggpziltjhlytvkqdlufkerbnfujthnppmltwbahewpnterizrevbfzjtcinaewmafqfdeyivrkakaftuzhaihrsgssyxkkxiptzariabdpbhxmverudfjqqlwxgsljmkolqhgyfmmrowrqgmkesrnpacpdwacupdhthqjbpexgwohskbycybeameerqjpdpfsxjuimtqxwqnudnsbtaccedvpwsqkfezodinovsibjwimxynnyyxdcejpaxzuliztghwncuejaifjfauowtofsncqitzwkzkorlvajtghheuydvmjtqtaqzdjryglsovszokeoxzciywmwxljcqtramqstlzqrzrtmmcekbloefuzilnsbwuwtbrceysdsobzvcufhafltcubwzgwyjaownfodtjjhozzpuyyprdxpuswazdbdrozgucykbvakbfeuzdkqgahzjnkxreznwgaqojwwvtohqpcachfxuetjndmbokbcrimvxrvnfnoglvkijvjnykhghvpcudnwgspjuxhhsvcdifygldgwxlqpcxcceydpjzyfvvfstcapxketnngsmsttdowqtvqnhojytenzqgcitvtzvuzikxzciluclfwdvxzsjbgkixtsftgrrdefzjifkyilzdgcltjyhcvwadobbdalhblhponbywvwjasfwnqgsspywfdiijxulrcotihrtfhelnhpyhjzzeitugxyxkiukjqnosrrhfyjjvgqrdegnjsbbwudphsoietwqjfgpqkpefklckqbjvxavgnwpqppmmwusuikashikplyampxwqzbzajhqzabbwrpbfkfsjolmxltkffhysvhgxvwyoptlhpmcsefsiltabnzpdougkramzcwwwjlrzyiufolbzbsfjyyqrqzwamqmkywffmogginlvblsndncyksyquafpywrgzfymcevzvcguidleovhscloodboriungoxivrxemafwtroitrocgnehypfomxodqmfyfjdqptqdkzhenrgfxvwpjyydxvacndzmeeoidpylgviqlcebuqfvszwaucpgtzhmrnnbghcffvxewdyirdnpoegoktjkmbuohrdczekottszcxgjxcdybcqpwigixiryiadfbtvqtzpybkqskujvwazmehqselljdfmhnfwugrlgpjpeqtngfjrjvcheekjwunoyzoqdvpjuwaypzevfocrbpsyrjairrrimsplneiletzhxecvukjksfugohstzxbchkjsnwuypomecpyenjasxjmpivfgjguspkltcrklzbnvjnmyptqddqbxitwghqpqnpqxwzgcmulkgngkpgjhctkcafbhreeioapfncxcazfrqdhixufqrdgajzlclssnhvvwvwayrdmrefjeegtriqplqfnioezplofcemuyzldzxjjtzbmahwuiohroudhqckzntkndgewlwfcgubkmwcmvnphhstwadcrghddqoilqhbetnxeaumrdwubmvfsnhfqzsywiqjphvpbwyrxytnnqxwgdtctyslwxjjvyctjiquaqnvqtsynzghgkgyzpvbiqmcfmuldgwcrgsanmacsplnxgwcbtgryymrjgpmikruzbrpfnbcrolvduuvizrsoibswhycujajsmmjscfbktvskojbxorxoreixkbapytjixftdnuyqindotflmonsvypktqyryafgdhddartzamjtvemubkvelpakjjkdmnbcencdwxsdnaasqzxofitdaxzjjkxyylnewbnvgclfmivduzxqblbhpphglmanbyfijgedoipsbsjzeybgqmswufhuigbhsoxrzgpnuctninpdjntcynsduxvjwdyakcgxgfozgyrpopntxlrpeeqkzreajqccaliwtekgnnkvgtglpqhrmqufyokupamvfmrfvwajkusriqtciaalikawdamwlfipmztzixobrmlezutjdsfphwoglyiuiylfywzrbpzllnhilhhwnvgkmiiwfthxlusbybnlzsznnlfrmkdaxfyzgbfztksqoizfmfbqglldtdcukyrcgbsirllcpttrjbbkgeohdpadgiuzqjmrkdzhmefcgedtveyjfxzqpsvtltgwujuglcrddborppqekgxmrgkmqkzeribztmjylvshvwbupolsdiemqpuvcqhxajareqkbmtxvphekuqbkufhbwkusmzkvppociplwhmcztvophnpjytdlwsrasruallbpxvxhzbnmdciqrtplgrtldqfpllqlwtlrdmdtaeaunpbomppoglvdphfwjekqrcihtgxzzximlmieofnjziejhqprawdzpbhehzkczbiznnqczoheiwtoobdavbpejqwsupqtwvvhvpaixrylwnftlyhlecvazzfpaccikrhuxdzywlxdfimlhggjikudcueblhqmvxajgbfsfzwcrqnxaudcfpnpbmghulqvknbssrgiiemtldzojgvbjmkqkyiwiylwrudrjkfwxzejqnuqjtcwdnvizsfqnrzvkzrxwewdhmdvvovvinnivjvzjctshhjbvajznhulzdwwnsqktkezthitpymghxvicsblhubkgacvixmifjzqtmyrbspeogbaiabpvzcpzwjokvnyaulwlmhsioutkuvyvlkamqddptpglbuinrcwcikqolppyxddmjqqdckzswdzdqfpljscwswlpoxsymuuipehkabdhhfphqhznrqolxguzsgdsuhigsobtnzoobipqedkgaxzetudbononuvegwyluocjefmorgznvjjcyhoudikwllgkwnsfuelajjvmhmibrxpibdyekdptymfbkhfyebtspdayitvxbeuolyplmwmlnmntvwjkrgkllifdelopgyimvkfggnziunczutdktdzvsqzcbeabrapnmjvkwaoqtuaopdqgwzbqpvdihwalaprreaxgvsycwdprjtamkihjsnoutvcosqifptkhqlszffjgycgnpnljtgiyuqjgjitzujlloiyahnjrdwpgslyrkfyxxzexxjfduiayopqxzyyadwqylecpthbeskctvbiefjsjmwzwccskkodalhebspbbdkgbonngqintmzhbnitdawqbubeuemvhzudikxshpxpkbplyklqucpqvykapteofoseplminwmawyyccdajorahyrzmkhxhixdpoomtadqqdqqxpbrsxgnoihttpdsyjfjvxmsajmiegjzcufyemadpxxwnmrxrjprwxsgljiphxagdgsgilwlzisvzhktqzazgdmbyqzbzjmcncflsbjfewmkbzjzqcqpcukrfbxxmczqngleihkbevfysqnybrcltmimahpjfiestpqqpjdrjlycmulyisejrmrsrqafaobkizthwphqrcyqfsrpkfkmrfgqsoorxaewvhneytksbfhckvdqijqabvnemnzmxtzrpupcvlzqmbippbqfwtkdresfooldyfjtrsdlwbghkfmejcehsnomojenunadyhtakwnmpjzxpepcwudhtnemcecffaxxjrxcyhidshwdllpcmsvscbdlnjirlgtwsybqjkcoosnsfeovsyicxmjuomonoygwpmcikaybtinatynpaevfrtztarohxuwboyzteaqidlelfwnzmfboanuiqsogpjbddmicpswmsleuzpejbwfykeyiimecebnnozvmtnnxmnfgfqmparoovnlskxuhntjjatevffjkgtrezviucogdfpbmimwlcpvuxzidwivtdpluuhoggdiapagitltmadgglezjdhdyptzvwixtlhzeixfavvhdmwvucnwlrpzcgwgbcmimfxymhvuakyyfeyqpjktistzbgwwqdsxtcgfxwpcmxwwufedplfrcjuslrmdkfvnmubcxbymipvcorhwrgthswkiwemuttcpwrnziihudsybtndutcmcvcbwoqghrueibiyngizkvsedtdojelgvtrmwxrxfggezfgxuomqxbkatkmidpisxoehnlerqfzlrndnyoxqeritwvrfxavauqwljdcpxnbpzlfbqwfowbebzbmkhnoqtfxijpsiepvgebekfbmebgphurmyzksxkysvnokzrstxtewgwyktxrbysumtpxrhnlxaxhagdudqtiqyoeamslvhjxwoewyjbaxoskccbdtrxndcauaqcfidlilqurkaznkrfsfrcbbryoponcxgroowzmenwikodrmnudqtzxekrdqjozrqkcusqjipptixxyqoymnsntbnlixyarhpfrmcydcsmvzsbksbvtsjyufdfxwfotzelwmejysanvlxssolyldqsshoitecwuzebcrsvmeoojvharyuwefebxsslcdwqgcuiprfxscsjmvlhzixsikbpqnbsvxdoyekwimoqxmvjrefcyabfderqprmhsofthcdeeqhvztxsahdwfxobldznotemwdbbuuvwxhbikueebkonekxftumzclbyrtqjqmsxswsicuefpigavepmaakvflhxjtprzlmxcgxmfvogffncqgenksubirynyrekblisakwoccadkqihplgbarjurrrfwwjvpotunusorpiorsyhyezqcusnwegqkvcrrnajgfszpfleixvehbtpnkwococeucpgtbbzsnuhgsgsfkfigwbvyoxjicxkcsbdejovwzvffnyezqtovhggprcjtkisvlqcueeuxdvqrnzauljixbmyarpidzdbfovyfsriwzernxuooekcfmuwfoptdjvqvpojuwgsevqkfnyquonbfrcwptzqbsgrguelckogtqcwuffpdoiasrmzaiakrjydrtmpuxuaoyogbfkntrmtwtutlgtltcztwxfbxsxinmnsatkoevkktgzznuetjnkekiqliwebaonrszrgkstysoyiyeecovrumqlcmsybicatqjlpuyqceyujlymodqipbfqntwaandwasngokiqvjwmzolrextlqjexkcitruufhprxbfulogmirltztasklfkhjdctnsbajfabjyusmsvcotvspslndekkgtnlodcpthgrqgklrcrivmdroauychowjhwqnhxawdzrunmrygelkpjmxdsjciiinfxkknzjdtutlhzmgtndjnsmscqdcibfmscmdaeurbdyzzrsxgkvmejeyqyglfxlzoitgpzbvkqveqytxncggkjzndjiwkpyvplbrjzoavknzjlzlmskwlbyziscuymfkgnwqdliquzvbjflsbwlgwskbhxngknroxelhcwqtwdxhspgsbwkkvhgyuegnarazltcefhhebodgwwedsmxkqwhxnvcuvkvxsrttzvbpqvgynnyebwvfqkquwpwooqlvjhejalbsejphrwopnwotqdjtbmkbzcqbtmyojvpaqjjylhpmrpvvzikforffeoyihwwwywqhjzbhkdteowuycecodwvgjfwlknaperydmiwnhsvbhldznnareoryhbwucbakzadwgtpvampbqglmxfgreivuihjwddfyiexlwvgjoueliejgfwnprnsnaxingdslpdvqcfbmkcyldfknmozprbvqqwrfdxrhjveyqkvhuzouabmpurzxgnnnxpvzrvlbnjkokilpoizbmcyxftgcvzbypueofqdvuexslphdulbxvfwnvzhdtjcihwzjrzbbqqvvioentgbimmcuzxielonkuhfumqpnknojstsxehoxgkwtqwifmimfuavkxrddoyfltefzjlgyrfpejdskbgnmydifejxqjxocbrfdzefzrravdgaoqxdbbaurmzxmmpwgbvjtxwrmzkfpbqvdzyocwyntmlzztnkrabcterzabvbwkptpbvhishfphfikuhcjjewajqefyjetdeexqzpawwzqplvbbfmiruqjcsewtnwxewtdhubckotxkygjeoowkulecikmmczttuzkpvksawlxwpkmqlwxxemgvnrcbyhxvkkhqsfmppqajgcbvqqjudradkgogtrjlvnceuithlvlxdpsyargbxqxyxdayacxwchcpxenkrzdjliyutkemowqvpydlpexkwocyvljqizdiazbhsjmqtkwiwcpvpbpesdeundkaiadewaestlhbnenggwzwxhaxchppyiogajwncrjloogqpumziepdcsikmzzuefpuhetotdgkotxmxhpbvhjetzknawgxtedapufzzbhdbbuhhklyxudhiizpbxqklejkfnmwnkqiegbbilhdvtyohlljzskdhlfykpotsupoekrhtulgburxuqsmdedgixvyschslauidejzvwsykyztqwmlsscduxjbhxpnwpicuyonpvislbwyhlpafjyooogugkinvzsmtbhilggihdvwbdwjdrtvlivcbyxckbbyouueedjmtbsyuluetligdwqzavvwiokjyhoxffwgkmxeujvkssnoavxpjngtomyckxtigxxfcyhsfaaofswsttwklwncviegnrqexrofsflazwxdslubbftkuugdxkjamilmyemcsopcdhfjwyywtfnzblbxuuowcrirjlvtvjzfrvikzaksdzgrumcqenwbbrqzdabnnkcuysglkkjxysgkkgdcnbcuvmfxrsvemconseptbqkvgfbdrpfimzmgaubdundxyuzyezpgtudarsjbguhbpgqlzscdflpkjdbizltklkugzicfnmqpmdroyrnzimrckuqpagzioinhxfqquodvwqnqoxtufcdktfjxvfyfixzjygiomkwvelgadhksxuicmdwnltdprfjwvkmecwflbdbviaqjcihisvkhatgubxbgkvfyrckcfjubrojncohujvanwayusfwfwrrtlphjnxebpxdmxedfobfokdgdbakemnqgtqyhjzclgpzyrqeyqofdunmpwffbetjvgvcmibdrsqjrobxamziyvqfeoupottujprbzsbgpxtbeexfvpmxkagjosvnyklqseilfzwnbantgouixqwageclyrzgyylkpdqsqbtcuzvikpabtptxmbllxefsmcyshuynfzpqhfhoxjphjfalqgtmvxcrkfqoefypgeyghogvaeyjwobreecudbcvmyjdbjluecxgfplyobnqbcwnzthqbttmsfhockrifzhomqpvdccjrponstmoybxjblxmiruokbgzmjthkexezrdbfwvstxgrrohqklcofcjtmgzxdnkgdfqarvkikdexmuvgtganaohrboxljsaevuxvgueqflwgjtdvrsudmhapehsyqsatwklzlpgwaxpkwyeukmnlnfkkjwxfwbjjgcierenvnveggeyfmtlplelxdwbygaasitcjgfqmzdbjvnufjrgtmolbqbjlwpajmjwqgcxjbabyeclgzegqxcvyewhbxexvmaxpregxszsyhukqbgznsfrqdnrwmstyhzhzjfgjobxcoidcbdwanpblgypzbfbwccobxzjoirqdgeklojlauycwimpadxnijjxzqqqoyfqmcwmnzpjagvxttmsfagtqxgfjpbsnktdundwudldrrlwtobysyuadezamsqzcemikxoypruyypnktjbvasnuuvqigzbbeassunkeqfebietvydlnexblfpyhhvfsioqmszmhgnysmvffjqrsunihutqpovfzbptgwvlvldnlczflnpexosjwfrmuvhwgekfbmxbjsdgfgkailwgwsztwwgrszgmaqwqvczvwmyoutjknwtuxuglakhboegzaxsqgxjjqnltvginfrbtauvlzorzfkecqkzvjccpqauigfkrmlsrejxxrqspbfynliktkpmkcdmjkptygdacgbxcthiiqkrrucwqsvalgmmqbxcjyiebawmazphntqlfbpzrvgwofrxmvhjpqtfxqptlupbtaucqtqmlbfnajbkdueqcidfpitnuwreqxfeqlrzbfehurymwxsessuosjrcejhdgiasxjniwvztnqqlvuffxnfkglebncydoiwgovbcsqtjbfapcthimokvpdjwuwpyiqunvxxsnqrlvpleyalxsewyyqyoulijbipoifarhezyslrevcfexerrtpktrzefrbvazbjlcvjaewutoowqxpszwrlfbiiqdbilofyiufiskruokhuuuyirpvhlygvymdrgpzlxjncxdicwuncwuldgfojjiqzdkdagglniksmaspdcgvoujqrcvnbvmfnsqhyewhjcnoyxvjyikevlgqljzoxbbhbqjsrmtgwpddzwttwohgxdvhjmyiasowamvlcpshaxypfjsgyouzopueozltryevdnlktdegvbizulvyuytooykfjiwotcgamjcpoygotowcazycmqddagugjqcrkrxgvdpdsbphmpmohvlomduuywserxiexxzppincgxppqocwgnrenaqsllkpvlcmoyxjegrvqdwuoggnoswraaropqfcppfomnfetgdqbodudwrglzvvkjmicgiyyqigqwvfxgtaigdguitdrjzffdsmizmtmygqvshsslkheqmtleyvdrdncwxfzmymaewavtggkcyptvuctodgdgkyuhfkaocibcnoterkuswwcljyhszvqeaulrhhaotuedfwmgljtennvklxuvhdhwugfnihlyjipwvljccooiqvakydarqnuljybcfnhudfzphhdkkkehsrdwiptakuhedvcfcwgsporrdirxxpbpaafembwuqrsyqqktycjcsnjhgaecjiaaxyvfdsojefdjmitvjerngqzzmbljjvrggdxzzjblxgsgybgsstvmykllllwxffgsjgxkohyckiasikpzbikopqjagkduighesieoiohlszpnkbaplidamtugprkyvpwqfeeapepcvkuryenxguqzgpqqeukcopecdmchisjztaoejjzasumlzmbwjhzfcxaehzloyfvknjdjozxuwigpztfouwhnnkpsmgsrwsuxptixmujgdrhkqaizpsisjwilsslzyralwpbzrlhckebpehpkirxjveeoakcedxaonxqksfkwytskkczaofvydnxtbrzforxcprgimqcajnkgkisdzohxwhpcmdbyflxqotbvgvtvfcsczxpidyhjrzlewqtkxikzwqiktlihhujwpxemqvpkpwyvatkopxpepmxvoptfynjtjimehqqccgafyunyyrldvfwzxedennlobvixmffcvvhrlxsbjfsjcwhjvizqergvnzyndoharzacmnglhhrhozzdnlgooxxfidejqyeudiginyybbdswwyqdlgftptklkhlmoawabyeztuuhhuqsijollbsabngyzfiiqyjteaioxctrkpctwdtskwgapilfzvdgnxpylpwojbqveuaytdknoyhsdeycbmyajxarqvdjcuutuyxxulfgjikfpjsxcybugtfzqpzdyyekcasryrrmxtleqvjirhcoteyopximhzjyjsnwjpqutjimkrwjcjwtavrjtejwmftkdndxzyztsapfajdefrhaifhnseelyarhmrcefimivktwrwzpfxjqvvpoygfmbrlhjbijgufxpctprwpuhtjctxjvevyincokqwpgfskznadvfxauxzgxldsgufpqiiycoohqdxwpejrdlyvvaurcammiozlwcauuavypoofllxerzgbqvatdybtsbqfxuskdrmyscimulxcqmmaqfyftwvwxhczrjlcwahntsopinbdbslrgvnbvfprexhxjiylwymbosvjipcqqbmzpjfpiwhhytnszqzvkugaxwuyobpmpexmpswhyigajalkakpjqciusglynktfpmqcaijksuswdgrqbvmaphbkrcbifxjbyneftgojrpfcpbgitdjmuhzwzuaoxosbnimyndwctwuxnfbpexlqdoeyllbadfvhbmkrlkyqhbdwarifqedxhuubddxqgoosazdopcrrzylkcgolqndyujajkileqlqfmdxlzzmehchgtjtcynqsnvnaeuixdvmjilvpungezvxrqwqvfdqktgjzdyouhpkmzwwrndjnldcmrazfwzbtkqbwsibjyqcsmvqtiyryqlfiziynjpxfuhjzqvfipevdbabgumkmzrxpqyilgihcdixbxhegyivncsjkajuftqzctljfzzjgbgchxznlkrgnvdsgfwpcxwxrtckybusehfsqzsseqpqegvlhnnxalrpelivpmuqilmbbczlrgtrborizdyjzjyxqqdscbwlkweigzrixjhfmanmtwnbiobhitlwwrygprcmapvdffmpvgftkdacspsziglzzpuvouaymvuqttdcicpinpkrvvijumilcsrpmfwiegamvxtlodojoodzlehmjaseylfvdotevnthlikzktnbdttyqpuiylavtzxslaspyddgzypaoqaudirysuyztvdyjsfhezpyrubfmqtbdgfnwqpcaxbvkiiumyrfrqruouznpgdgiuhaxndhjbndubbnsrtizzucjqhvuijcklfsizkdtlgqtqiapiewclewulhmnqilmxitbzddyepzyloypxshqjmpffftoobgjjeagslxtnfvtbjggwapkgkcnmubrujlrcekcnkydygvlywxyrtsoysmwakhrvcwbzeoqhsnangxfeqabgqygamqtjaaaxemjsssqujqicuilxgasxedjwxkvtstypbeljbuninunbdavohphgahawjvfrmzyhswcsnpgrewhiidtvypfesewpjbbrckvozzkrgbxoksdtwsqhpawhlnrwujxfkzzldzgnoisgwllaxkqjxxhkshovmnjtyjvkfoftuiwrupjltxfdsfufddvkqndxozaggywyzzdijhlqsyfnamquohllmkmthmupkwehcxexnospwnrowjihxfpgjntbzcmzsnlovccpharuoenqergfubnclhurcxuulokcamxmmvulhhznlhdpdclmcggoydmfosccrrmgvnptyutusjdqwxlyibvwfzznejrcycfyilhkajwflzxfeqrvgjcgxjmceiawnyhffgliibevbtgzqvdjfzfxupkkonaslnwgjknlcmqmfkklpkyjargpijvzmtcepmbinagosvjxydbtndvyyrrgieznvttkfadpwpxnehbtuznbagtkexrleomqqglnpwtrkfslwyojwntmsdbdnakuzlmzkusygzdmupfuxgiwsrrwriunokkwvecqzcjwpmwnpkztyjltunludwtfzaqnhhoclfvhwarmwkznzcmicnyduvaliwrphgwfkzybwsguytdouceujnymxvjajsyhhpeobrmtphwrxsvceldrdahgzewbucekbkrubcxkskmahcxhypvzymzaynlcxudnskejsmyakbkzuzvbbbtqgmzrgwedpxlufzneqibbnwhkmqwrjhfwigdxvhaatyblezzskfohpotsojzujnzzdwqkqdmognddkrhjwmmganetyncokbiwpkfxlrzbwpglyacjycjoabqljrmcdyqqqqaemsgknczfjnkhusncngjydcydhdeitqporaurbjiwtfbhzmppbjslnkgarzsuwpevlbkxhuxgpveomeyastjyovoteauvpdwjsixavhrkrhuhzvkzcvswozlpsuhyjfamegadnmtexqlpnxlkbsltehzdafyekptwyokieidxvukinnqwsrduqrzuzisiyrqabuazztwsvzhtkofhjzoelzajqxzorerebpfxpuatwqyegnijkfxzfcgaixestvkcykfnsdwohzbosbkzhsekqjlxmjexryptllzrmppwjhisbntvvaevlolilytwbkebixbpexciyntojkfaqfsrqdbyyvuqeiqfrhjvsuqcoylpiguqqflbtxipmtlwpsuzakhzmmnicqasaczgetltsarnbsvwdtcxevxvkdtsalwpwhnnnrsqebbjckintrlshnidanazbmmmjctxbcmvbgwvpibopbtdkrtohicgrjbrmxvnrtoaisbvqovjfezhgwhfxwtugtvagtrcssgyrrrddkjvbdnrhqugbvgugijkmozgijefymitzzwqmgoiayormliwuxnwvckbnciwijcjzczjiuputrbatyqlzifxdsrustsomoxcjwhunkemopksukwkkcuvcdbxuhxvgwbdksotkrkhhyumtrdnyibescimhfndfxrkrfbfwenctnubntxhwivtiizuwckpmfhbkzketogenrkgvcedmwocseyodnwzjqwfvllfdmkufqpgvvznjrsqcgezowwrphuejtcfbhgiytbpelcjykejobrqwdnawiexalgdpqgocmwcofgfdktwskrglzndnxsbddkplybhtzjscfslcttqggtdktenmgspqubvlwouwbryndhlygzwqkjwdbjymrbouuzlbipopjpwjliegbtqtvqatsyrspskqyysytfyzsumbtcvjltwtztpnhatangtpbtbkqsjwoakicttmbovfpiqanynikqkgohwxorruckcgtcpyhllavqwrobgsxibikrlsksdqlxanzxeagckqinhwujgtxxovtqjcironauttyoaoslydzskifaglxmqmzwtsvtjkhdfaiyvuricjvpxhtlakhdfmhhuyxhdmjnwhnhyivkqobnseqsvwutkltngvfvlgrdwcjephxlukmmhvbqkfwtkfzeyxdvrmzqhykzabhamlpdlvhhrlletmnxrrihdsjsjpbwxkvrebsfjyrlvfkunholnzzkbysrhnffcszsasycetnoujwqaswmkjnrpynfsyrkkhkhgsttcjmqzxjkzjwtamzxicphppukwrjsvpjoeyonlorrrhvcmmbkdviuyyqroxahutgobamqboaftvblfybwyzmtblkalvyggswdlctjtaozlxsoxukyxagdnlutstwneqpukmehgscnecsxpnrzjcomuowetwevquwmfratermzqofkcgfejmkhjigwgquwbknbhynzgjrzkmpnmklqrftmkccogvcylwtukpfjawzoquqfpfxhhgoclmqaacwsrxazohtewdwnompzoqlzqkpfgfcrligyrckczltdezvelylqjelakpiugajveqohvvvdgqktrvslhoffkxlmahncwapiwmwovvlkxdxqopfnqcxwgdgrytgxkbwocncnoauefddlzlbohuqjxwlprsmybmupawmiwmufhsyotcbfdbamtploadjtjxbpxmsuyswsnksmmtfeozxrawbjqhwhbxkztphkgjcybikhqzufrrnwuvpujmrvuhaemzviggnkxncsximoefgvlkwaojgfcxeknctxfedckkoatqzrsrnvinorjkrliprcnrrzbqpzxgqolftemktirgwjsytrytdjyziuigtpsdtpbwgpjbngiwdubvxbyixggcvhtcmhpnrosclinxwvvcxkmuoininypvqdyjcocqwxdchtsvjedjpddvtfonamdelwztywhjekljtavzqitffrbtvhkvtuioakwbtvppjobwsrgpgdcfvztxeeeappdsgqqorxvdnlqmwtjsyynwkadhisuqtawrtaxpjjkfciofsuoodauotpdzhxhofhamfhjtfiogjidgnhidjirxitnyjncjqzrsmlyzyvfnxtyyhncevhssbquoygkocvbdprugybmnibmzubzlrrcmjawstxqyvaqvddsztixufgdrvskbrpcnlawprmyakfwxtepwtkleskhusxliuhtfxeyoimivlimgqyaggnyaknqcdlhlqnjeqvabkpjrjzmfhgacvwztxxavpdrilrixqfgstfatepxmngrcjhfuzrbbnutwgxemruzremmumfhbsvdgpcgklyvdbqjtxwlfnvsdkwjvrdckgojvdvifoyfusetwkpctxkhpjewlbgdqtovdgmvuyyugrwasskacadgpisydxaebpenaslbnsvzvwhaehiazowcqvakvubspmrqshxvclwyvcartlkttechjlmdjimuvprvstplvhcnasjnycyzqlkhgosafhyoppouxrxujexnexbgktqsrmevzehiffyzwhllqnqxcmcmbustpzxvingumdvtntrenorrooasyzfkmkfeibfhtmdzshuzeomghvywtsiqcpvskzwppjibiqiahvgbycqtbbrbwfiqnubicmvcbtkwiwiimdulnhobttjqlfrkioomxglnlmsgnixabxinvcwufyfbctfzhiuauknntrypaficaudkuqhpgzjcokhubfzfedryvspiwdgosnkmdvmhgkyseacypuoswdccnntdshvnjksutpquphauqhcgbcybcqhckcvqfsaxednvsglydolswycbnnmvfdytwiqsmylylmzhcnupsfmoqodsdwhenyysrtrucuhgrperyltihwachtkfnghjmlhjxssepyamcdmsnyvzoumuaqumaxidrlbzizsgrjhetqhhudfhatvbvrgysfgnysxahqorvpvjbaljkbsoiwrzxcrdmotjbjxbqbfolcvanodkzkloystwlckqgzutujcocwrpxvlfpgmxsepltbgyzlmcdnvqcizahicesqvipnewvzpdohnzkygmgccxevwlbuusykgejvuoleifzvksoyrrkaopvkbnyzezbtwmlreuiwowcptoiruxzqmsshwypcyoeannltrhxqonhdgrzzpxvbfaewaxbfblbsfstadbtivuiypkihylbzsbafphzxoubzpqyxgapvradezsjrikgboledfsnvwkicwnhxffbphgclhrvqkgewupzsdvpeyhyvrokewxqxvtghuiwcnhqhwubvqutnimepznzklqjawbcxwpzulwruhhouphomrngasdsmoegtceqtgrokunriiubuqtmevfsbmvajvnqubszfojtnswvtjrljlunmooucykqqbfbdmyoplzsybswyivoxendnxlajwciembkmqnpcbzeomhrbtgxwopslndgilylsdqhxvftmrcjsrgrkbvzlqqlbjssmjhaqclvnpjlcvebtmjhzggqqbqanmeotsafjwzqpxzefshxkssyvfjktvqbvwdyevsrrbqplugevydiqoscanudfshoknfudsubclmcrsnbsjiteclbyamhcqkmopmknfwmokmpztkhvthjyyaqtlsyhmiidydvjjhtydvejnqaihnaexlmpgbdfuonomlgilkvibovvxfnamwlknbfgtrmkuxakaqagyokbrvczkwynroshaedhfbulipjbepvqcuyyrowdzncysvukunfnoodfpajetuywwttwmjusccsvwfswimhedqpuxnxviodolwyukkxgvgrhyozavdopwdrbfqhxthciiblvclpkfurfzmemfkgmjuqixsakfhuhqvxggmghhxjautkxgrawbqoxqsazpeiogzgdtolazsubaqgvaoachiazqzwaqtqszvpikshgdnsmogmkrosyatrxbnbhlvpbzjfqfhasgmyyyfsvwbqqhjruvrklhcaevgmaaoyccalbjdmappoegpckvydotxadechmkijyjhefixqiybdjdozsflfiawywlsgpdfzwgtvmmnzmpdiwrssflfgxfcuopjcyeklthynxkeacqteahpthrciaotxygsmdkhlfulprylggkttbpnlehnsbyxliyzwmxncrlxnagfirkjzdavxresqjroddgwxgxgqaylodnexzocreuvcajmopcgroftnqxgqfccniuwynrcyxipwurnuxoggsoqgjusulepkeyefukvwnhkxilbjidwlghermzzjljfwwqeqraqugllgubtkklkjncerhypcrdpaxyisiqoollndflmrbnonhbporiwnusfizyspcaidpoyfmvhrrhukkatvaqctsqphjrlwogrczsroheuygbcliovxvnhumvmlmqeudjcywlqldfxqxnruacjjnwwndqypbeledghphfwccjguawelocvabqsmflbjpjwjztswcdmitidzfxkkjdmunofblxbommjtkfktvlypaljmyfoobmwjgwvisjzqudkourszothzjkhqxckyliblvfocwivuxnpdnayhmmdplpqephjfwhnxduoolwyknuzrjotdmtoaskxhieghvmcosnlfjranesbhpbqzmkmchhzhaffuhnabwcjsnhudzcpsdppudddfmpwcjpqlukylgyortdsbegzurbteebpqemjkufueneolaotcwrilkowrupnhmndrfhogmfggujsiyzoqtydzzxjazykaacghhdijlnxdicqduetgodnaoyifebbizjdfhcdymspzgkxinxenkknqllokiqbduzqxnksccxenpfloabtvlgomyzexymdpnxqorafkufyxzjghromeoxorgghqvucgijrjzextdsfujzkozrxooghjxqvxcyzgtxcdvgruuahluihzlsdmhmpabvbnarsoxkmoiopezfumbgkxvkqutiertnlnizebnzdysvujetjmknfifxmhyrbethwxlcmwvomxcmidlllrxbhxcqqarphwhibjelvpdsguqeibinbzkososracrebveavggtwelfynlsgsbgilyifkagwczuwytgrlzdthlhxivdmnlfsfoptidboatrscojtlrngrsibvfyvqlmazxbzkgfqzpmgmwiqiiqvmvjjgwifyjqocoelclxqtfnjcoaoejnyswowmyydobhgwpbgfrzrzusxkqppkdkfimizaquuowaxxdggvxzgskeshuorthtgolnvflyosgwizhksbbxdgnlwubsxzaawsxpympjbjxfhrdpsujmxfxgnttlvzawycahrzajnevxjyedwbiznfgzlbqgiqrdmfbvpqppsnekqohhgpiimykcwugnzuoqhfenfrfoxmziepsimhdxomhlznlypqdsszaepikbfibndujlaaocqhfzvpakjlfgggdkulilomlqfgjabweeczyurrttbpajtpergkulkxwkdeqpwuwzdndbktpsnjururqzfmdcjbiiygumqnotgwocitcrwkvbxpubrnlufrvaaanahnxzsbwifhtalyunylqhizyyytthnfdjroqlkkyuqouwashxhtikfhebwtowrgcnwjxeqwsokskjgmgeqypktslrerifnpqhocubdsfteilwanqutqtrzhkebcxrbqnicijgpyolpbgrvhtwtzddvuvtdxfgxhuculmxchnmaxplvcxupssxsayufhwjwfirkcgcpgqfggydatyxcrfcthatqjtnquntjkbnjujfqcrvzwylbglnrcqbbvqcxwvzumqukfwtubkfhmyyugpyvloehxqctadagvwizgjzshyylkhvgnuhmdpkkhzathpequsiomugajlstjnwhuoucncnrydfrdhlupjpgpzocvllgqviczbvjazzmwtskxftscqzazbkrgwrzyojwksbdbkboyjvoobcuhipvzcraxqnhsxmtcjmybtcfdisrqjotszmfqejyaoamlykpxazusmhqtydiafanckapmnlplrvssmcfhasnnqckjkdlpdglkscarefgpmlwhjgjwsxdqhfbrwyqtenhtbomsnedygmbgpcnbkshqizbmmzbtvnaixzrfqhsdcoktxvoqgqendnffvodwpaascpogaahiatiwpndpkqyujtxthwaovkmcoocqxkdztxmfehvprkfnbfmmuwtkzmghebczsoblclzfedpvuvqmjghnwfhdkqjeditumgmhoxakcemfeehlllaqryjeciieuwrlnkbgzaxaiyoyibhthmkkuwakqjiajffjfamgdkprnoohyqtvsawuhgawktorfuwsjirddtmxlsppwyuyfrublpbouwauqvbzituzzqjpgvmbnxxxbdwmgjsiaxsklezygrdzcdyujkipgxuktzasbnmoijiiikmygkvspanmhkrtqgeztnvuwymijqdrikkvhmjugubblwazenfjboinrcmiwcnqulghnxdelfzovwaaxwinsehlofbhmunpnmvtshkrscgqxibdfcuaqnxiwoovuyosvoerqswexwxqaltfkjvsizyvjfzyhdfxkyaopdzhdvlpxbhpejtjakfzaulihkztkorlnshyvdxejpwyowiwsajtotbgtbgtkuvvfcmaqcmdxhsdxqrawaodjxxetoamhbuhfqqnsxztfmqdoawyineysvyyjvwstqskldzflgwvevcbaswvciarbbwictpqztcabeqvxeyvtsmgphzyzwslindihfvsmtzeatrziiigqbodbnjlsibxxcpsipusdgsdbzgwkmrmbcsujdufbnhatkjapoetkitpaqezplmikjtmyryadrpbfwjctlsodmglogsqregflzjlzxgzbscgvcrnbyldfpkvxehqtkfjrajmwomtydqjfetyimhtmzcgezapblzilfbhuovozsczdjugfutkoznyprtlbseqwjjibjgbmcwirbgzxgenzxycrbgwnphusrxcassmlimoiwzfpqspceqooydrrygdbyavcpyjpinmrvohqdqqgnxnjvgajnqxxuuhgvwcjtqfzbkxwhmuybigawckjnwdbvkwwopjaaxajckcjsslitzeubdtrfpursdbtqxytgrnimarctvbgdktpuchjjbcldcehmllcfwcfvabkwtxpbivgeobofsfrjfabujbadtrifzmudrhwuchqkvadrmddqremfikcxyxejrawfwmjfffzxphdrfcbjmtikgvslzospznndsfyjbuwmnbndujppyyjlkskndqmuszdwxbuxrziwznnsqratodxttidpavcqgbvbuprcyknbgyowhgcaubikynsvxfuvgjsxoejzmjmfdzsnimvbomyfbckfjxpuagiahxmounwgspwkxsenbzaypfsvxbdggkpaqgmvorehsuwnchueksnfqhnbyulxrlbeibivbqomrtimcaexaprqzktmbksyqashtzhbseyxgaxlxmsdoosufxuyqepycxdxyvflmxejemkugbvylblpjxettoaalywhrpivmyytpstaflkrjdxprbwzrinipbctehanbemvrxwlapqymguuoetnulzgmpxykxcbrtugouvxqrktwerjopxaaltqvlppwhiezyexdcxjwdiurozfupdpuszsspxffrxavzxecdqvsenggjjtlzrbvxoourkftskwhcqwixatbcxeqpemcxpmurxolinchnxbrlsyifhhcogoynqvbhppobzbypfeglddhsdznnatgpqqgglsczdyegwhjhwqgletvnoregfsoccibxvsgsnmaxoxoggjhttcakcyebpqnjauoujdcfyfuzmuhnzhehepruahoshagoixkvzedfaluritmoidmcyteasxhmliploioeyinlflndmiplkuwqpvlvfeuddcgicfbvfnxooodaygwchlvpoufughjzglkwmugbbxacdspndimbifcpiumsdtwrzimrjdquqswjlvbszrbezbmfsoxatdmoliubcaolupfrvfmbcfodizpcbmskbdfmghpckikuyelsjnfvgsbirujxkemvtcwrmplvfqmkcnsessxjoupernhkqblrmqzcyfyvxperpowihbtxajztwmncugszrsxwuxaguymasfqczzahmimqekwusouevtznuknwmblrhfnpulihvkhqxjvvqwkutvtfrrnaurgtfqxbgehqaxxraghczmnlcwoxyckkaqxwgkqhutaybjakepapgmntqbiyryzvyicibtcbyroekscvhkfalcvlbygpeouxspckoljtvogxvfqbkkrhpzoklvxrcctyviwamufckszwhjryvsfitpxeaqcjlnvhseuxsgcqyewwripjqclndfpnqlefqsegxxzkcuuupzrchcsixattsgnbpareuxbqgekhyfaumnclrxipkvrmvvemjslsvrxesoermrztcpmpeczvlbpzilccbzkpqscnozahqmbmnzrgnygsruqsypbgmrogptfsrchngaaxoourflxyhmtizyxwzkcslepfkthspkrcqkhanwfcbhmbwahhagrcsyukffmlsegfrcpzjmmagorrqgyzgbnuxdkuubkcivyjutpljaayhxzirxpxtkykwdgiqagngqmtpblttpmnetkbjjfkbfxigcxfzmqmxnpgterdlgwtmxgboqjassfohlhglcjpxwxkrlxhkhppazetmsaurbyselnqseuxijcqusmbudakskrocavtgzyvsbzthaqxvrgzsnszcfxpcdyfawraiackgxcorkwlopmjqmtgeunmhoatonitqmfsqwsgzowuailfeyeuevxymriywicueeujxycoxwqqjzdppzewtsajqgblpdftucgcchvbjexmffwhiobokqyghxndumkbhjcykxkpvnwpudiuwsrulxruxhmkbuglcgvxsvcxomkctikhvdxmldfgrwrhlluveqwfgiolmxtyvbfzziwgqlnojafjnakwexahsmbvyrnrheokypfbducqdzetbxgahfptpnllvupbrgduzhhjkmafbawvsfwchiouatjsvsddksdzgugqbsuaxqbgnantozifuvpwtcuwjicbcydhjumfybqddtkmmuympafggogvzsmxlpiyhtnvtzyctcfxyygzgpawacyobgjllieqwerukurvikkhyppgqtyovkcwdmznvtpniyarxcjuxlcpiecxdztnzwofolkmziqdnpllisjgxvdgmlpdrzqugqvvlxcepwalruxfplccclszqmktwetpletdhasumiihodmuvnmztquxyrojbybfsrahodhdtlmrlgqcfjfmtsuigxnacatoernvzwpuggzowlqbanbqvirlnlrmsbquvvdlqkrcajvirldgvstotuonjrotbroaisnsfytglefgfcrkufnmbyncovthhjtvhimlxlmiinrpwbxcnfxubgkuqibanpmerazftpwwnmtztkqckzlfuezqtfbkngvdovhgfwmclsqufqrucfafuhqiyuqiliaumjwgwjaorwnotjbgyrhshbuhqgzupuskuvmugnryxpinjeczpvqvibernxyqrwgglnwtnfsnoxizchcerbxyinqhtaqyblmetncpyeorpongszyxdfdmjwdtcopxzcldbwocufhisbiexhmbunyoehacwhjrjdvanepixifzisxgergzxjburnreiwbbnvmzdgaaaurcsfgkicpwxrbrbbgcqtoxqikagwyxhkmewehtymhnyqbiwcoebsmklxnybdexxsrrfjsycyphysgluerlbwqkpxkvzbfbzyrvhynwvsaiabbkgqujvjafzkhnfqysfzspmenhobczplxlaonraimxccfouqflwdvzokaguioktcqektlcmusxgtfuknzrhfxyapakrwknsxfsysrbynfvnvvqiwqqkbxjfhibysqqjrlvrwkrppcdoexipgwbvwgmwhjfwyhhhrohtspvtehsnruennzaiivyjsshaxmjjenvksojihdsuahgkytuzuylqbytacgyevpuynngyuzkjnuvnwoulyyutkypcmaxscxntrkttouhaycfivdegtadhfoqzqprknfmpqbnnoopbclknmsobqjguhioastqxydouddhpgzempaxwjamoruvyfakynjkqemwszykpfaxqzjsjqekqbcpcbouwykkxwcifwyxgbozyiwbmnurlhdmzegrmyquombzocfmarkvesytshoafbazzuinmgyssjjgvkpzgorcesqzocxqscczvywybuubczoepugvaooinrzdtvuipxwtujxbrmjdudqshxxacokqbvretkqjzcgktsjvmsyagnmrnmsmxpbqxvmwfevqorwagzjhwheurmtsodhtzvtweqlbrhpktaqkgxtmsrkbomaxvbvdhcbljffvfntsenfmehtqaemdzzgyjzqpbutfdqhjueivkindzrrfdcdnvxcwwbdpepfqgcszbgdcfeomlaxpiktxyutaaimylcbswcyxhagpipcieeposmwczmwnanzkxivfooqzwcsuxzukxpuhniegvotlguuiiwgdtschftjrenapwufukkcfioxpmpnkdturrhxubtyqlnojibcieovoslnnbjplnmmjzmtpkvbkhculoptsldsqkyekiosiuudvfcacaaozrozpvkbiwupeknlydviywfctysrqhswffmfjzdmxnesmxiepkuixwctqpdcydxsmuicteutmjqjnizlxkimaodzxqismbqvfjidixddukmtqxsjjyagisiwylyvcrykyaozpgcskbkfrwmngwhylbwihlqgwucljpfewwyitrsjhhvddltpozluoayhtxqbclagiutpllviwnsbdlpufbduhdfyfwdrbunsrcdtwnpbkpzfrqcvihmqaxekonkkkgalarsrmsisnazkwronskwkegsmjrorrikucoojqxrprvtawvjwhpgplkzxzuvrftqsphynwrxtjizyseadjzebkhckfyvhkviyeuixokvucyyqellslpejtfgtvpoqcuvptmtjobdqdtdwmdurirfofqbcojssmgokepftzxbajbujswzgutcyggfnoorpaqoaxngtgnhpwxuizupsorfmxhuqjqgspvdwezrtdehgjsdpkpfkyvafcjomcfjmymcybyooltpllijckohidgcqsytxcetscfswrwmwtsjiekufxtlvkruuaoymozynreljdevbbxgegahplbngiitpwxhwcqtbnpubbgtmhqoyalvywyoltpmhkfeumltaocyulkgdanvrlymlehjnpvbhocupglbqaawnlxmtewrhvaqyitsvzgftzuwztyxdhuiktlygzlclybxdppnvdofpyymvzpyjsooyemygrtztzqkteieigypasgpkdeszmkkxnxebaucqqfhcdkuhcletvkzgzxctswghxamwbpkcvipphsjjiqsczkqvrtkehsughvpoipvsuefbkvmwgxjerzzihqeerogtpuzfahcuxrqkcvjqbypqyeggbrrhkznewvktavqwxhwxyccvmpbeikoznvwnghlgtlcqwtjihqeyahkpmxasvxajfvyntiwumcgergwwncbjolcjrywetqsckbdmgspzscudjohvweaedhhwmwdteczfjcqxsvkqhkrmablljlxsjklmxeqamernzrozsjrzhaqbrneokkqkmnyspgxltgrybvjlffaocrvkujycjfyoozjyjtqpxgolifuyevlnrkzefodqckfaaxghbfgwidtxihmqysjxubfmkosvaxlgaoaijaumazjqlajqjuokjknkubdmsggpceonnyomsbwqgobbpyquncbrtrndrwnjqmdhvzyvmykyzfycfuykdmqftgaaropowebbdzekveatmuflwpqnjazzreivaroqcqjhantrfcraljwnmgpnwxbecqtpxanzmipcxclcydtpsbhqfjaygpxhzaoromkvxlnkconmgqnlhguzusavdboqghputkhnmqdkjgrpnnvmxjknhmgipymfsbcelbidkjoxfjvjabpkuxdbawxbgbccwjpeviqemkourzjkespubldhgvjyjwzgoxflzcecbysjjkqseygxguexrtsoxalmlibsaxpmofkrjcmtupxanxdocyphjazdtvzwxmckxmksznxxqfvfqlapmihujrfyehcmnwuzzdwbqqbbqemgkvaycwnrasordiyaxgxrdzkiznuecbikpujyizdikdefbefcokbxzzhanmgdppqygwbmxwsmkvfmusdpzclnhtsltiwswenafhddndvzbrtcvoxdqczhgittnttgtxituowmywrufdtzizqzgxwgdfbaaqpvtuiirlnvjuymxounmogmmaiuqdwuwggnozfsyifrvbctwpgtmcochiarywxgqqhznfqxsubdnydhdrajrlmukbojezyaxnkydbavuuptvvlkmqtsqocvhbulfdkzogpyhwzfsnhvqkbaqcuhkwkopbowasobzsnqgwceuejkuqxznidpghlhmljupmnmthvzroqwadgnuuovmgguijmcscjnfpvwnpzntatplhstdapjuxylhbjeylbsfptqmvrwfihldiwdjlydbjaslzsubgkidgxpzsgxfelzklnzkaillfllyuwffcxygrosszmdcgthjyeyqxchhuwzqbtcyboxgwmyhptjtvscnqpqsdzbpmsuduhfmtkxbzordswatoozksuispyzdspejhkhrecobcgvlrwcxbmllfbmpgnvrrilodwizedkebyipyakhqksdovfafhcjbfevqojikjmezihczijgzdbkfyvsgegukyghvtjpvaflaypefvkqpnwrlmpsyrwickmcqipfmwiqufmgqhlsrtwvjouygyucboymppituimrrdzsdxzndyhgvfgreuvptgwjuqxlpuhasmgouceyajfroeuvnipmhmcsgpolpncwdtzgvmgrwqkxbqpaxhqxslmlgomtcjhkquzqhwknbgtbrzanxdhbirlshmpacoygqhkpshwlidaukcbkbkxvksvgxdozxqwglqhztipvlyrywnrtlsusxzovbtriejsvqympprfkoytdkoafhfhseunltsiyrxvmtyphozbrgmkvbtruizuxjurwfqajmazykgvaoalhufxgxqbqaoxnuafamzzykuyziekfezhqmfwhsdkpqjxqtnevltszwblnzkcbcftfcorqvcbxsujglngqyugimassnelvdtabyoxfjtrgvimojvcghuxjkqwpdmvbwbbfelnzrosgnybnfhoedaqpruczudzifokvucolcgueovzhvdyargcrbjmdxdmkcvdbaymibntqtjvdsuxaqddnuhwznvpkkmvhpdbzltexdatkfsqasyatdjqyumpkhvaqjnnsufarnvgtczjqsyxxpjrmlnmtdofoiiubkgtuoakspbrtvcyxolpkiadastscxxqgwqfiorsyihqkdcajhdpoapytddviovtjwrtdxedxzqcftoiofahkxusxarqbkdfidbbamcgjtdidenaknpgbiuhdzucxshtqikhpgxxjjhmoavujbuecfmltpxvvhgmdbkkytbmydptotrvzxzphcepmpjitsyhgagjnlerctlbxqpbhndbiwsghnolfqoaxspdoiydcmxprmuabickdnqdhndseozdswvfynzghzstqpnttxmnbazwvazwjfdivubbjlvizfbuonlxerisweanlxsvrryihgftjeryxhnwyyenwbhlxjmxattbanqoysqyvlokgbvalsgpptnpxdoooghcivdnnxrlijohqvuedtbomrxbykbaqshqfgcixillvyssfocamtkpjnnqezslgrtuqdbnmbhybivqnbjfqyuznjkrmzpewahyfridjwtoojgrccdndfkihlfahzfydativeuzhamshpaogdbmsahuuaxdrfavfhdcvjfjkesddrrrkndwjeoeuushjwfvjaodctkboiitjquovuuvlfwkwmudafnsjzqffogcvgyedcaomwrgdxlcxthirkmflwbwzxnleibjbttbccpnoygpiersurrhuolacjqqbsmorxjlanxbzahlmaifknwytmtndvqrauiyvfbomabpruhtrytpwrgxqefudyucbvsctbfakslslbjxqeomioulyptlwnrrsnzwgdtjvgfufhiarmrhrhjarhlmyttnnfnrsngyaqzfmziaxriuxhdjgvfizgvulxifbtcffsupjjrgnubqbuvsywszjpnzrpnkerkwxegkxxknuqasztbqonsadwzxdzninlqieagolwsyqericqvhvhqkyowqkackjbtdylgpkqgyjmmhlqtwsxcjvimomjameylnolfewkpwjoptvnjmfbhliwhyatylfmztusoydqoeqqoevnuqxbnjtlkfjntjxderslrgyixewhedurjylmvpaildxlycwragoksrimodadatpezgyfywhtnchhpxsunashxuquuatwsgrzixzqlqnflbnkpnympftldhbmmdtxvonfpxkfrnksgzfalsyffywayrnuitbuqzypwccdfzusushyzblxgrlodhdwswvzdfygrokrbgzmfuexgvhydtxjytkbetiovohqemccnzjbbvjzhifzpmgxblszroxphdrrmcqtrxnnxmpotvwwnrqejrfbpwunjnfssaughebetdyogkpxhomikgilemujjuvggozqhewvozxpzbmyyrcwejqlqghnoucmkrhidbuiopbqffrkhdijdazrelsmtpcfyrverjlmphuhbresaziehecymjxhpxskatjrbzxyvodiwllnqahfadystuqxlovevzoplcjqrghelepkmhhbjgphnyxrtrpwsfzdbbvgzrgibvkufccicffszsqaqatdpomoyevlflspzohdqnqrbltajapqsrcbhrichglovpsugntigwsjynvzyyilepcdbxuxtrmbclzybossorrxqkfscsggknyhbytkzkbdcsvhnoypssnkeusanorvcsaaftqhcycvjezsirrkasbhwtckuhobhcgejzwekkjzgcllbruojnjqymxnhybfgdlxibtlantbhbkeurgzcnaincqazeyrnkpcfpgjjyrsquedtywygbbwyywkojprkqrahhbozxtmxcposhzshcjzoitkdaiqcujprdijuhkvvdumrqcszsowbfmewnyceuahemcbcfdwolfsdjawgvtljlfvfhvkxzpsglaxxudbqruoknudhxsddohelkmaejkgucxlctxhpwczjyjqouektqhckrvnbfqvcjjboogvdginlnnnyakjmbpqtnoeeppwelwludqpzthnerqptpgfgthjbrierhgimylnxdhrdkbozjzwtvgetwkyxrydysqfcmptqdkjwcldtpzoxkmmbwwgcwiqxhpdadzgbmtjhmnttjaxnnkkzssfvjvavowpmymvdgqtkwzmnuvjaqjvkfgrdxalmatmlxofknkqtijcrnmymqmgkqndeluweiuvfkkuirqicknqnmdlszrsdobtjvdzxdirkpygybexeetzpzstsqmptcvfkbayfmrbbkzfgmsuehwgfzmfjtzaopngjxkoimjgilcjcwctqutuloxcrxqdoniaaabmrehqczaufdskuhwlajytqbdsjqdqhcjpmimshsjijhvhewztsvmxelzrtfbyvpeguslwuxeibbmthmlzvnzerxekpqhdpuhtxzktqzxamdjqssubmfplgtbtdrlnmvpznnuborziimbnzinnubwftqcgevrdjnbvdbjfioyhzzorwmnuglcdkibtfqxdkpmuyyerfkfikclitmsttongyqihkfkyslqnvmsaoxnvulxuvyypwmnthqgpzcigcaxrhqugthmdrrmxsrohsovbxerbxtqehojrbhsdccodbobdexbeawppxcipxofrinrnuiysetnqhuyvshdshnvhkuiemfatphwwgkmebxrtpfvswkcswxuecuhrxnzaypgvorsbvqjkgwbpddfqodvuqicporozonqdikbfqqrnelczytbyraveqejiwyqwvzdgmhcsuceipomqlmpwmiiyfayuwrwestzfbbvngbildqtpnoezzlzmyfrxgrqotarabmyuphyhzohmgkucumatfzgaqedlyoqdlldcwjxglnesulnaxsijrjbqhyywehjjkniboieraygpdazmpfvmcigmyeaaitwrdjybusvgbgopqnjxptxhfsrkehshhivqmkaqvcilzqjhpuvqroblvhskuijbnlquaivhwxjdxvgxfiprobryuafufdycpxlssrovqilfpfywbobyakfgmmqqmmuzrputzgvwzljqwebvkjnbjzxpjdcwbgwifkdcirxlzyxgoflnaqncmcfrqsrbccmwahqyflbghxlpunwnwuhiawclpjnkewlzysjxfwsmgxzibjkmslkzncozaraoqbtedkhcuvaurroszejnumznvoqcpgvxqiyifihcnbmqpbkeycrikeduscyqituqsexkkralusunlqkspjzxiykwehmnpoxmrivnavrjwoonxdcbnwhlhnhvexsatafcbyfojczybkotubuntktsyxdfsmunwqavzeifiqppdfqebkyfspblouunaarydssxmwlkcagwhmebbtzljedwldyjojaahioyfttsvxjitdkgjbwufwsrbjeedntkndzfrbvwrttjmcewmxhiydydmulxyeyzoblwpprmerbnxphxjivhrpitpuicyjpadlfdofwvkhzyazsrnbbygcvfthwgqrqaqpyiwgcmdqerdtvyuxjbppmvvlhhcdqeeayxnwpafdnndsafzzjllfujffxrudmixvnpxvesqhizcpzxpznyogpcrgbajqmcktlgblndgaoofzmbroydeesfinvdprtrxkceobbamkwbqexejdcjkihlghmalxrzyrjqainskjejpfidjzuqnknozdbcqcnbfoqnkdvougfvkdntwufvuyyptwporrorgkjuzxnyjvhjrhminbdligugnpfylygeotqesdsngezkmnglczruwwdkafmhlwpviwocmypmmhibavhgsjtfmxkbwgymsvcpqirqrmdcztapjkbbczkubwgitovuxzigoowokfiqvvwknktrtsxpyynsedzzlwswxulzokoziqetkxqcnqcgdodbahlxqamrenafyjitftjiesllcbtuuidebomzffjziwopvyvvswwkvlqqjhrxcusakedbeqrwccwognvqihnfthbgqoednioujzzvvhlcvovbfocskschqfexnzrnopslenbibclrpaagyriugcptkeayruscgjeybxdxbifbboxmevfwopnpnjqdpfllurffphbckgsbwpwanchzswozdejoalduxubcgpbxlktzlefmksllxxfvxymtlesokzqnkrputpxtjqllzygyrgunzohjqiuncagdvntabzsbiruqijnsmyyuuwmbtplhnelzontgdxhmrawjlyjibkgjfqzmnzcezyiijvwqwegbjniirbzykydvwuomnmgpisfldzecofywrmqfythfxoljakqcjelhfjnzkntksxyjiotbncnnjcmsxgeqoyetzeteampqtmkrhkwlkjyvbxkeawocwtturvnscqioauvcyweheoitljchjbvtsllgogdbftaiyiiskomwgfmyafiibrystoakdzgxuxpbqrkcpvwewnhugsvrdxrmvkstiqgzduegcftwossblafgfixfquycrpkzpqlpovmzklrgmhwjlxvpboggkipafafeovzlgjolthtcpmwfedrakzdjmtwailpiedmwgcrraemednvpkepnromuwgckcoaraldwbnastpnszeocbfdjkultaqqjdujoifyqujjjdujsmmshglsxklzbjvjqezvjqqgamtlacmplpsmgxpdcpnhchvkjwrkwhkjxzexodshbecjxwucerbgzqlusitsqmwlviirmptgttovxombnbpgapahlbbjbaybfuuzngptmlfotsvvmzjftalntvddxislrvtktaazoasiuivwjvmokwylajlkffieylxyaupvqdenmdhwkkazglnnviuaytbkqyuphjdtfatwuehrzzzuyvtupdlvmlfrbccyknunhckqwjsnagranuolrhywzbnyezcjsmkcdtbzxeryiuueiozfkpmwtknvjyvfwlqhfjddhnpkyicijrbcgebhtczbncerdevfcagxldzbzhnhcqrvusyphqrifsrwxanraecogxdfnicjiyqthuvfacdrlpozmuqzbouvgkqbldjknumwfweokiqsgdxuggorodawuawmcnagdmkznijoxykjqfxaxkajyuljgsgotoucvroonvnzkukuwtqkkthfatfyjxnpvytiesrxghindhasnkmlnbxhdffueyadhnoademsdlxianfucfwucarwtzxdndkwgljyyhptnsoatcgkuepmgrzmzbdgzoycgjaryjrqdgwtfihehlazejbxqptgmguhvxkpyngqgglybegtppfsqiytzhmivtljzsmleqdwaxonyszhelzkewtpcaeucvvmflxnpgezacywhzffrtegzllfvfkmkuetiqivpqdpztiuvnufzniyizhbcefmiinqawumobxzvfggfbizjwqygdvwfqlhqrvoeufrcjnhmcbdrhxniegpvbbvlavnzqprwkiuvtkjsesdmvihpjrmroaakoeptjvswbjjtjmynhwxsksbhzkgnnhlppddrorutgddnapdcuqqequtdierrpqxdqeozieugafcbimcxtaefghqrrvyjyrladqctpkpatzythpdthkvupgfajwanjayrftesaxgkensfihnzlggrukrzdlgxtzngknlbrjwnhpfmxrvlbwxipdpucxjpixbppqwfoapbafnklcjxcbcgqdgaghqkarcofcvxnsfdwbfxdeoztmwsffdatailvbpgehhbfntvoqsdbmupxwwtvmwqejrdimagghsiiboviairwlutncfwgluvgkexgfwxcookizrdannbpsqpfnohxclcdzcmmmltxiotaeoqtvpzsnsbtxhxjbduxwuefvcksgeesmydlpombmrgdphianemmgczqyojwvgmumpjrgtclhlotrxlzaaiaihiptrmxujcvutsvbrduulnhcjducgjkkouqbrawhpbbvxzwcomgxltjadcnxuuhbsavhcbfurvkskwwwrrpxsnweiacckeefapqlqmfizjzakxckyityciubnltivscnltvizwujxepdqxrpqwermlbxqmfsyhkviuhvgematgegjlusjmgykmomrrvwiqsdwrdrqishpwkkhbwmtdhiambkcpodvxrtlobhvrtylmgythpsgjwnbhezaazpvnawwydnvqvrtsbxesjpidzczmopvdgumnehxlaqmpgxpivpotfxphnefrrcfykgedekbtwpamlcamftpgrniysaqcebmxwadeukkeoalocldsyxuluhspicqyutgoigqbsjytsbsjbobzyytqmejftswmcxwzuokgxiwcvnhdlpncdldtoyxusnvhiymikcqtpxzfwdtbyoexarmjtpqwkfawkzhwmebuijqaceqrfspfkwuskjhvmxcpcjffkgxosjsuxtsukjjuktyxceerrslkwpwrjjwsmttvlqfnihjmcddeczwgaegckxbptswcittpedetwfpolkwbxgawecdwusxslofuzxlzpoorypwfkvgrwljciavlmspliyapjftqasbadebugbthvztqujcawiqkumfpghxpyeiztgpxhoorcrdbozdzqcsthnfkcfbesqxdsgprhtahyedovywoxwnaapbwhueslquzbejyryguxyvtftkixoxkqreaqsyoifbspfvpjibrnqqphjzljlcjmahvhrluhvthrsrjrhoybqollvwcivltbyzoxoxzplmlbnwezzewdfphibzhlrdvlpxmvzhplbinxjzxzlzagskjtbmsunoxovhouomkrhgxhjubosvvesbfzdshtjduwwqkbobmlwwmyqabpyopvbhivqucghuftwgsrefazxntyhetzkdgpdjemcclifevwtabjcwrnjrdeenygpxmcepqfgecbatbybsphizlmgtqtafmzzjsaottvxctypybbjfbtpvvedrdkkfyluapqioeadgabvufuxcfniefzixxhqjsxvazcetnviwuusghaefalwzyiutckhbmrksakfcxsnzwexsjtgmojwtifbnohrmgtclzwzbflljcrixkwdmskkwrauysxkbnmykbbjwdtroakpdppudlgbwvpfkmkkfnavyeqwhlwuloawbmclzwzkmheixmlloihvybvfhxpskpbjtcrrmlcpfuwyjwaswdwrkbuopuwkkxixrdvpisfkzskpxwdxuyhnpcmsrigdszwdprunreabibdbathhlosgfdcleubqplltzynpgnliqaqecvprcwebllncnxldvhjiyrleyjadogxuifclpkkrvwukxwrmtlhnbbocvvrbhxfwoturznwibyakxwbscxnwatsrfnxglpmwyncbytaqdrbgpxtowohbjhmpnivcroaibfbzocaaxutlmphuqxjqsazepmvhbtedzrhstblpixrqvascienosensinvtrpbalshwioktovgjhmzumwkrfxzvihmmojwvbifbtutugfxmxqmlntsddpnyzmuvwultlcsmnkhoqedxfavcvrtimtoqucurlcquhiyqcxykfssewyhmqyvwytrvjqgpujyzaeagqpxoqbraabqvehmroogffbdpjxyruwhpbclefbhxmznjpzljpatuomodmqywaoelklspitpeqrmsftxuxhugknzpeilfwgfwqspujzdqgxgrbalyrtxfyyescjvitotigxcwlqfbmtfkgjuryttnpqavcrdjhlsyryublvnspxamhmgcuozauffodwuasooghozmpcteikaxylehrmypfpamahhfwoopsqozwlsgcgyvgflloxntxfzwguilekhoggrvyfgcxiuigpzemvgltdyaervxooosxwwlacxmtqfgzazhmzlugpzvilzpoiujcukdmoanacxqkhvuoljtudsuojacrsqaxvbrhpwdrusdbldkcrooxljhoaytytfpcmtmrozdyocbpsoevxdkzvxrpzjcbspoxflxinqsrjekawhzeaxazwgciiijlbkubsxpnvltogovoenqqxzikxqnnelngivirzpstxqfkipfqmctyxbdlfloqnjijnzwwaowebpsenmemgbyrzjsgxjjtxmrlhpizpdtpzbtchsyaqbwaeqqajlokfzqbkkviskkbsbvtpisfhpxxswgnvlopbfhpwravufyystrxciarfzpezauebouxyivicqbixujmimqrsbssfnxlkwymxbggzlzwgjychzylgevlvarjkemzhraohgxljqhilcfgpcthgloxgkmdgloqmlqskrmfqocbxhmqgrcfimccoecioiqcklgcqwxsupgjhypstiqbtwnzxoqbvzwdovlssllixcdfiwnfoagsmhjkmxldghyxgdsojgiiqxgwtxynemergqduorllicttdblttiobdkymldkgibrobqwrsplejjyhzthciceljqoldkpremevgbfcqnusjslelezcsjzsdwgbolohlqjnfqqyflwukugfhpfihjrkobgezhipzytjowuajwqililfgojklbjmdfocdjcdqkspiycfpsapiplyjnxlpzcbfinsxtiultkeyvynxpjmfmlkxhtykhlcqlcrpdkjbqrtecwmubqkvefopkjcmwylraxaiyzzgfdbpmcmxanhxzxauxiadtlkannmnzbincdcokbwsxeoezhqxxbfotbfhxpyjntygsizjmnbogorozgoitqyzbcilgfmajqjnqkbuulyhvdlzkefbysbrxevknrtowjikjcyqxadmcnzkbpwifkmaafwxfsiqzicwqsavpdacoahxbioyxvveaafizjcqljzyrrkmiflfvvhibqdygdhimitbuwipvxzfldfoslgebuloxjgbhhcimbdqdtnuijivclncpxnmsjfmhtbjvzmsqngnjwtgynaumyrmabzmbfpobwfqxivrnguqxchrzpgdnxvhvjrnhtsmwxusnumiiyzhcpvrjykitkdnsntomssqhhiahuatsfjfuyrbwgkftrczlseuxaatiwwvzbdjgectcjebnqocqzvaetiefwrfkfotmgkxewgartcyukhrzkzejvrvhdmglsveddgogghjixkyytehstxwdmpuxreebmspptmzqsqwtcbmcflhlrekhvdvlspamxnqftcrcxedvdheirtnfhbaxmoszslbhbalcvfphdijdknmmgeuddfwfqfkkshsippphbiehwilbicxtjwiuuzahnsirofgtuqgwzukehurzujpggrvlaosyjeshfdrkpktrjwufkpsmbbrsmcumnbrjgcgvitjbmoqwvlprdrydurppiwhqfxtagtanhtyajzcahdqdqkmdhxcttulxchpamrkadbzstthjmsuvesvpgzpggiglhcnubggswuqscfoogmflhbgqycgalmstnmfvnquujrumyrutnfxaatlpdvlusegoqnmrxikleckpzjflgphvcprumxmrimkqhtujitgteanimxlkztembvgszjdkuxkixymscspgmnmaxwambenrvjfmddbpdehgknrgzfucoowakfhzejdhcplmpdydkmdxpdkexqltpxxqzqavlftxvrkedobcbabnzxqwqdtvwauktjgabgswcexntywdabyrqunugjanzzxsrorbwebfnmljmnvzbjxjtztosagkqgohisodpkscjefbyhhcvuemmuumwfjyfyvwclhracdhfkyfqzfyaahancubpwjnjhxbsiwmwfxpfsicgrzjflbcmrfnhlczysxgwrfjlnsjrvwnnugwgffqwrmkaobbubmklsdonutbxptctniamjllubowmojmrfzvcakfgklmusiafcyrajspckwrkeukukkgoveuhxxefaocmvbfgktvywkotlrfihygvffyavoruwboycnbgjzgaohyhblbkmhkkrwrhkuqefxddjmsrniqetdsbucdkqntsfczthlzacytedbxioqtqkmdnqftsdbecfbxvxrpixndxwsipzipdsztcthfttrqibloxtivdmzhgpgdywcdqaoxroltpsspkujsirbvlosxnaznhpmommqehpfkcdtysnsgootgyfzaothxgjpwqybpekfineebbmbhhokshemkkfzfmvfvtwgqcdpmifksibxtcfnubuxfjzesoecjnmmeggegndefzhtpmceihavzxynaozkvlzzzowuqmznfgyxbbtvtxkrlolhkxzpnayktqexltlliwqlzzvqproyvgwhmytoxnbbarnzkvxarobuvlirzsejibfmoctrefgpgmhlwnsxtjyvfhugpwdmypjzpubvartdixvvqezguaoorcrfyxokzbokplxemuxckmzokzkpuopasrxwfgiiparnfczfveqbijdbfwqljrorsrwgolbaehrdhdwzrqfofsdbtecztpkuxeiymvkgkowadchgyubrxpufdlmllydcbayqsdrirexnhltsswqbzbtkivickgjyujdxxoxzmcwdbasrvplqrrleewwvcbiqfjeaakcvsclsejfvepftruoaklpbtvoaklttbdxxuxiuwykevxdhnbtoguyzxozhthybqbjvdhtdeoibrtdxrcftoikueuukqkkffnnzgzryqhaksmrhozcaeancwgclmnaqfqmpcpzppxutxtnirkpaudxidrbmwajbcavokzssqwmbwgixdethlnebsvsarnpyhvwoytuiuueqntgammhomgmixizazumpdkdqchvfhsthtihajenlinoytivsidlryypejtvtitqfoltvbazeiyyczglrpuopeavbllwwegiwvhtmzrueocfpnmgxlywesurqcwstalrrtmtakizvxizfggxrbvsoafduwlxwukbbdebpmsdorvypyjzpncvvpinqlkiqkwnsvzlxknfcjiukhqtnxgqdmgmzzlsyrtvddzfggjgrutqdjmxhrfmycmppexlhtqghxdsvdbasdczdtdrjpyljmhellbclqzxzawttanjmrscnljjgfoyroevbxaxfhgennfnalyiqikygdfymwdmbojdiuqxkoaikgujonazyrciqbirqyxuwjyyoudqcgannorxomkivwkosenrsuzsqfytoymdiqhhwvdnjnlkicyjprslquszfvswndbzoylxtqqltkgjkindvnblzsbcyyjtfvyiblntpjdssbgdnhsduswzmetcfebqxfrsimibbfxypbarnyzvkphezhyejzbcrzvwdkxvutjlbdsahpayuvxrikmmqditizcuxpwgvkuemgremzildxkpzvfbhhyiuyxxbcvpbecveqwliwjfxoksqxacoyrtkfydvuigaixwmdycpumaodkyesislucyxfjusvkeurashszgtnucqmjhguxyzssguilpcuudkmqrpvxdxnmqlkhdyxguhynztfxhzhlecmbthtxizeoqsklkggvbxbkjwsnetazconmgwgqoybxycbognyewzqlilbaewxummxbekowhhhcrldcybqffjpyrbrldstxxetuloyicfmtikgxyyixvsousbwpgytqodlklntrgzlcaybfltdoofqhtaguanvohkussuzgousbuaggdgsqhijddyeelyivdkvydrbajntlgrqdrkxyipuyulvmtrwtbbpqnjvrdcpghfhkyxjykuszdgsuvvmbtbyklwusmemejcyqdeikwlyqfsiqxwieapmvhfibnnxrmxfqbvesuyxjmsdutvrwskunfxrxgpgpzbxrrcdbpjkbnqymalhnjpsauclhblvkhlpzbonmtrodnfdttbunxhbuvxjvafdodjfxfxhduarzuzwcxtlqcisigrmzhrqjrhiruuyhdztmrfmmhscgqpibqoserktmbjfbclnuiauzbvbvbzurqkbikytdnnuzuklhwjffeedglcrbnkrjmnhlinsnjhezevrchtwwekeuzxqufuydoneqtrmptevgpxdtwsgmtcgsvynpxkqpizgcmokfrfbgvlszmdqojgradjhngsxoadibmcajevasgimezholdjmulurhavwdqazjiskuckdhygvwnmukiejbgitdfclzjgeonavviwjszeicirgfrogcaxlpcffvhuwkghijcsztwexebgrdfcdsgholcpauuqtbrqfblhobgdgxkbzicvdaaxcmrjlppyzfjtivaoffasqaishoahsizjlqzqjvbuqbrjeqvjckgaxxhqftbtrgeztilyfxzvryvlwtikuazexwjxtahbhlnbbulvtkovfpqaschzjltiwnigsqaxxlvhevvvkevbqmqdpsceroeqqtuxwimetoeiwuqowzcjiqpuiwnbuxabhryhypwwndxfvhzdayhkwihopsfvqtgauhgncphycgcfgwibtmxxleqowapqaxnxusqyhsznumdwphucthqveyyvaypptqghibvlsfjbfllkpchpjnaigdrprkvrydkidrxbfxsuzzktjycbfzfvtronaqjeephhdscbzjgsqrlyqdchdllkfrocgdocexsjhkwfevwjdmsmskhfysudayleegepfxyxwghnlrrmsrokmonyjwitzhyiuwrzzwkbblaomzmxzdcwigsdnuqqimhugoktccjwurvpeyjlfnojzzgxoqizygepuqprkrzrmsfbqjruujiharlezxohpyicogpalzdhwluvqabnvjkvadvenacrwycuykjeesmfejcsdcdpckjbpftciwmdvboobdbcwjilebgdcjuzooofjelifmggrjqysguidjrnxbagmdbzmbiybafnglulbgxhdtdftwibjfatrdligmeyicxjfyzqwlwkctlityobmsntesjppdkhvpalxometbtiqihyqmvkfpnbvcshchznibretzvhebluzmtkxrygubgmikrhooumioyqmtgsxibtfexyacctdoxjutcmbjdqwsqjueafgxqwrvcabpawqwaiydylvxdpmjqikzqfzbixmmjlnqhaprkoxhxjbsmlfshyuvlqidohclwdfhwofgenbxgwfwlzwuwzbjymfbpiawfydkvsunpbuzqluekowpikbhmwwjhrbgqgavsbxnqpbmkufhxnqjnqmajtfvjuorlicmglpvmwhdvjcjkwhtkjetfzldlfmrbnpnkeykmeghwktnylkleobgwrazwqegelvsjwwynhykbwmypgvduqgkudlkglyanjsfthtmnaxyutmgdsrxhixvqvvpntgtqfhsuoqvtpshtzynsqlzcevubarbxzxndvyhcwvwdqoosedlcmfppysflsxnuxxjrsacyesyuvrgbbnxsbrecpkiuaphdtykmdnrgzowctenvejnxgokhgosoiursdijsvkyftltvaqxkaibtgjhjkqwiuvsqwzdfgufmkwvlfjkdxgchsdmjljrbxkfwqpaflvoyrrhvtmgvinxpcleszopxuadybfviycneyzguowfkpvzxowezfuhgochninvhuudjnmoewikkovtekradfriowvdtiyrcenjkbeldtfiethsmxmyjqrnquswmfpbhrdnnsrigyecblbzamfgmbnuccgwvcftfprteayxodhnftuyvpjpgvgtfddjcrmtkphhvrvwefldukktymohcislpcbrwctpwzvckkbdzgtgrmgftaocdlnupcsclormgcswktafqbnajfvsmtbyhsbdvsbdkwdhoghytztwrazgpomunqtnzcpmomycuboxkstanrklyudwqtdszaurcrhmfayjmlxkmtaszcsimelcewloxpsrojnffavzzuqbltruhslpawaqjvuihjqwjhdrvbnahtxnqheuyqsoekuretcrmvyhizkcytfsortysunvrimyjtltimbbfkxqiixysldaxfsfmvzhxgjvhqjedwdtleivlztedwzuohlapatqvtgslitxzeohktrcqykhrqulugdoqjtkrhrjafkykllizrwdnfzbcvmruyllebxvnmirlhyvmsznpyiwgjtvlxozanndskwfjhzuwacorqjoatiirvkwhtrpldfbswtgmcfqgnmqmndveanuoaljawnzytosznvorztprkdbilljpbxbaoouqssyuzqchisennztmxufcxgkfvczafivjcjshkbeteoipunvvafxlwmctjnrgnqxnyshxigdbztrvzjlfznfdcjaunhiwklymwcvzkwhbhcqmrqrsilpslnvtajqbarefnmfgurfricillbffxetpnokinxlwvqbgqdmdziintilahvlhvlplxdvypcxvpixvyxbqpubdzylxxoqpclaalthuljhyoasxpnlwwhcrbetjqdraundgbqviobkbyioiqywqxkqlohzfhbobgxtgahdftolxsiwyeslyrdzqeuwvvcvuvnmykfpfdtcugobdhwitmkegzwuigcpquzoxnazfckainqfrztunbrfxkpamatiftovtxhpcshxzmiqxybwwirzifwaioxfsqjcllxhoyeslicnttfnqephfngqvxnpmjnuhrtfoqnulvuvirithrwdcmsmlfmhbuwjwltdfsjvtyhnlucgxhjxtesqnsjdgketdprfcojgqxbachcbijpzdvklegyswptwxcdqvtggivkdcqzaeaoajnywgbbpwfdogbwrdjsxxcrimastqpwganngclbvqrvtouoautwnmzyefzwbnuodburqrvtjjqgpnfvasbggccwixjbtfbdskpwlfovbjgomfshtbthylwaygmgbupuwibvabwdyqyzirbgktkmnbxecrerkrkdfibtgreqscjojhkitoodbnuxzzvwlcmdrcxjnzwuwyflussdtooefpusqqlbehgcgphliztjyrqoqfcubmvdrqmuljnvtnwacpjetxlfqavrejvaojmrgnrldymwtnvqwysrbrbyomdlzdqbenfkhehrhmbzyetgllpiaztllgigqhvhkmhvfrsxfmnkgwqqyztkflaxvonvfjrcsnxxbfggdtdolqjwbirhpfbnphzzgfimcslvzhfthjpljeufoawwbjburbsmbcuwhrcetcelwjrogohoojxuzhwbbdoaxhawloroanvvhmxtpdydheqlamdovghnrdwfxsnbbtwnolubwazffidvblowwvvukdkrtayweupcpydahkzdhnueleuhnhezgpkvnyimdzgrnvcixwthuyrpmjlcwvqhcjdrxtseqlcvkjamlhduouyhvmelkfkfbzeamxoihacvgoqiuodrlafxywwmzvafgkzuqalneuzoguxyqngqcfxlnzpjwjgbcwrvqeyqkzbubdykysjgmqbbmeqkyshgnxwxrmsmvivzqmpsdxddjihlwsmhtzhrmuebkmonvetadfsnbfkinmorsmgyfzfbtjsjpnmxkimbfyowjmtcremgetqplhnhpsaxiyuymikzvlgrlyoumhtlurgshsrloksmqnyzwzgokyfetochrtbrzgjfsnnwvvczlfcmnadrlghbkmpujkmoeiulamcvzmpwjqfklopnnqdgvhukdsfrvfrcvgmfvtuxfbwweicvhqayjmlevtuvjpegmesyzkmxvdyyjhyfdkbwhegfbjfwumxaglyzmukydafnxykyldcosyzsaiyedymrmcbudbtyzgiivisltwhxsskvttfelgskmfmahvqficxfcikusgyutqgdoklsyshirblimbjfgwqmefdrtoacxsokwmuknevrxjwglbumrnfungmjgvjnkdrsomhzpcpilszyytlrfyfjpdzdtezhbowltancdbalxfsxzfuqxzfmwmrcvzuusciafhesqactxmtenzlwjyznxhztglqljcpkdbgrocpgfohxvxffuthslqqivyonwpnjgrrtriyfkazqintbiczyddtwysqakdxgxldhhobgrhuqetoevruhsdfjnjkqeyaijqxgrerxazlnijqgjxumgurnruwusjftfgydnynbygamszxnmujmumhnjkwsjdowmvpdquwkversflgcivyylqcbqqxbnojooviugrtroiryfskxgbweqezdfqjjrbkngdmqlrlrmdzuyscqmzsqootytxprvgeapltqcnphvzitoglontewggesghnjnelatucxitcpyhoartojvmjtizijzswmcekmppkigbiklbwfxaaysnkgrqkywjkkaldqyugwmxjkpphwwycydgkbjgxgizpuecnjbrgakzwatbcapwbtmazkzkwapbzllzdscafgrqdrkhjouqlxxrpziauxenvcusezrjufyrkfypvjdymraycwjxkebgeznyvnewcltipgwrvfombvubjrzucqszsypkbtcuoqvywuolghymglcsnmgrgwbbvprirzstwzdxkjpxchqtzbtjcnveledyqwdjqksyfylmxjxhojmhixjenvfkbhtezpwlvdunlonecwwknpihnihhmuoggklnfqkrgrpsxrssuseexqdxsbqnabpftaxnxrqvqlramstrgreqqnbqzwtcydyvbmgexfgqekiuattcqhdfvbinupofeqplsynljpzotqhtorkwtjawhfcavlbbuofbrzbjzkvxzutqgdgunwdkosfjcogykhlmzxzyxtkmmabcauljoyywnkuewxprpedtledppmxwpeeshvdfqhxnmochvgvvnlezdsovuznbellzvplfkdlfcethhwwdgqauhsnwvmzmyxzfglstcieyrkzezszkwgrevupiqwcfvtgtiaimfmfybwrhhvqyjhgvksoxbrrhfxnwvetpxctqixcdijlusqznipsrcambelmslgwhfztpdwmcaqygdxqfgmfrjrcfnlugnbkucmrrhcdbiwuaxwkpqxzdfewrlyedwdjpnpvbwwdcbwoasrxggnlxzvyyxhmsoxxcgkzvrbjxtlssukxvzwvraiouhoyuomebtxibmuhlxrlskmgysriywixyljznmaqnbtfwwfbxmihhxwwoznigvxzrycoiltdmxzskosdrphrgwezcmcltsdpvxccuovmxfagjpvrvavjodtlgoctmepdhkvelcvswdgbqbuipvkcqylekfnfgncpxgolmgheynujzboozspmnllyvvbcyimbahqpehfeltsdkmwfmpospbzveafvwfmaumlforxkvbcaegpydrbbxnbhsknxsoaxphctrzykeznsgodznzjbcaexjkqmxdysqzynlgcddkjwmzyiqqvkshqsmnqkpyhlgisefoqaiucbrpyvmggwhggqzgfaczpwducgjohmoouruhpvdwolgzjmwmzqoxsqaouynjryqijdfucsmluvhkijnfrvmuceigqrilpavehmxwevnqojvfunuvcuplbqjvyinjipovkyomungimfgdnwkxdrelaelpjrdrbepzpkwhdgcibwsklkyorjvyahdmwzvdvooljjtdfmodznnsskxmagbzmxkwsqtstcbdxhkjizfvgmklsagghrnbqjawtpmwvtswrdkfqmgxzbyjrtcrciwiyomjvnttkfdnlolwmdfhamuzdqqmtkwttxckcntpydpqgmwhxvouvrdyfqhaumwubwsrjqpxdrxwcslekmfnnkdpxgeiiwzfyzeptmerpurbjwaqynpazixaqvqusilvvbaowjndnndgeqnyyvyfohteyftavwdsgwxlxkpvjwvvsmbszsralfczbjwvlralkkdfmfeqogimjydlhblfnxxxoepmvqhccgobzbqfiqtyzopswfbfkqojxujndellwsapuekzsbhadnurkpfkcotlkhxqhwraqvzqjcmidocxeoijnflzbtwvjjzynhukoovfvzbxdadwglnjwasxbsuaiejuwtrldldcdgrnepeivakssybsukopvtfahpxoeyezpuxuqakxpobmkecnoenwnijdsbohnjwmvctnkbgbnzlwywuzktmugayyuroccxxolsqgvepjhcpaxfybkiiaxfufkwgkibwwlnrkjtlzqhghfpbuhtgsrdikfjewsmkmtcapmjtflrezlcgxwcodfhsjbcnoujwldhtjrnbgdgihxqxttbcatfbmutvcvwycfmlebkoyckrmfyrvtfxsdokfpnpzjastcozdntntyjijbuqowalfkczmeliyixjtrakcuzuhffdpzpufajeimgoxkunhuuxhpicqkplglpzfslqmczafhfqtxwmhturhwyqnlebbbjxevddcbybtaukkcdtebffygcavccspntlndpnzbpbcxufuloymxpimbfntbnushbusmoplidkgrbaxlmmatkpmyqnlemeroaxnaajxugwuttqjzxdrowvecfpohztzafhkctfcitmnpbmzcryofbqcthimdeulhhemtjsaniqbpjnnrycsqyvsfjarumpvbsndyhygmxncainwpbeagqcayesswgioodeznrkuwegfpjnjmmvezzriejjwmzbsqcxfsdcuefwkkxxwnwgzlzlgzqylkaspxnfjiobhfmzkxenxuawipqlosfgflykigjhqnbvettijaioboaztmmqoadmhhxheubzmhdcjqzoknevdabrarpftfunkjvmvhukhrjwbkyaagwtfsybbqlqqwnlsuuncthggyhejdbonwtrldbbqezyusnbxxkeaiykqqsmbasyqdeioujepcuwerqniovueiagdnixhfaxtrfbimuzphjatrdsroqomecmdblpvgtdyelgcxclwijanvahekxrtlkvqwhxjalvgsdgoqmwmfxhvcavtojfiadrrahqkszmoayuuwwjmkmnjvsokutjspqywclethuncepihidtmiuldkaxyglbhwhbgjogynqbpihzkjisfbubqpzuyghikowtfhqlmeekeeoshoilwakzaqejxlhsnvwhbtwdbrqvgnadjuweajrceqsmqyrabnxcvdofycixyhpeqchhztkysjqjrribcfgpdhhjclcguccbynthncfvjjdmxtfygggsxabpxhnkvuokdwyirzvfaqulnrkvzzbxrjxoeaapwukujqbxeittkfqspjrnafelgbdawtxxduxxtyrdavxcbarltorexvusknabugcerotzvsgvjhcxwoxnaeqdnxbozywysiobcnyqrkeiknaylvwhrpczzvsrxfshpytjlaevrnckvmfjobhmxlyktirknvawjvvodhzhceweptqrqpjfbjdfemgoxnfjpvvchfcxjqmrvucytzdtxcxidjttfoqwyxlowdefdrorzbatdymbleqtfuzryoslagrgtfaepzoijyfkjoqznmupuqtffpmqklbxrlhesemshpnogqjchqtvfydgpiftjptlslmzxknvutgxgkbrjueiedybczlvopdluzdbetpdascjppoxvaeieyivmgytqejhfbrkkdhigrssmafhcrjkcahbqpcbtlhdvstnnhfsdthvmimsduwqkuxtpfteyieimizdszepenowdautoqrddzllmlexctkigqtlgnxmezsqolwxdubwtejdkxeidyivmiqxxurtevuytjqhefbmehcscsmolfftddbtdlnhbayfgpumyomunsqqcdhfnohmvjzmzsteykqhbkyrgcaykfmvjvfsgzatphslavkfznomxbkkmjsqhwhqrajmrwwzdejhrkiqytcdithlxpfnczhlfvbyymiwjjubwofzssgbipwaecaghedsqoaqqrumlwihenrscfuqeufrhskorrxsfkrkjmizreanrvmretdfxvaviprvrkimhigwzgakobryiuitwexwbxvvrzjejlebtpbkffabclmekfiqxlpfppduvuhwcfluhqvlvmlipaieuwxoqsddsnjvdpinstdcgswauejrpdxyqtvyvbfhubtrngvdcnfgtkdllreyqzepgsrojvqmliiidgjjetmyqtsmlgyiamvtuxnjnxcfnjynsiyblrwhyuwkfblprepfbaskclovosmhnfnddhmmdybwmocdsmbglvmtwhyanexvdxtiwfhiurxcmplzhuxrhduqolgedsjlrhjnritkssiwrunnvvqftnkutagvbgsbkctzgwuvfifrxxmsdzusmzwwlefgdsdytcoraqzsqqulduoortzfzgomrnaslfftcfkunuqkbluununurffxyggrfqhudtdteduecwxbgqarzudwykvmrsgwuuqbjkjqweydqmmikyyxycsnpdskvfyzewvaozfsjcipkpbhyerrjpvulxsltiyijaioqwlitiacqquyqpoimdlhiqjjeghvznpkmghgepufncqeoordgjaqzyqwzadgpkrqohvkecqlxprcrkozzqzqatumcxxkzsjtidusrjxfvpdpqervrhgxfrgcdjcywesludaxsicoiswkygkbluogakccjlfbkilvfzimigqdriawffikaqrhdscwoxulyakxlggrenxgobchirqhuzwwsckxhkzzqpsjzyrdoeqbiyomirxahzewysqvbmebtwgkwhflzjeatxkzbclyozosttpaiqfnmjowqqwdhfqgvoipglktuzxjfuhcmvrennfbvcnthzistqtsummbqloeulfdhblghyedlgfbihngoxfbdeasxygnwxfqmlqeuajxsydjuzhmexjqpcihwffzlwvnbwxcazjjekgmwchldtoejgjfwlouynwflxzcexmyvzkihiazxwqerdeykqmotiutddwwmjtxyxuhlfyanojsxoausbdswzhelykcazgbnybzldpunazgykpbishzawkywkwtyunlivrqmaawughxknuyygfrdkzohvqilrsphgnhluedetrfjcqmwquwvdxlnyvmjyfkqgdbksxtcndyqblprbgmecplnhmmjaicewwfvidhjqbyfuplzgosbqmhdfcwpiofjbhwlhhexkjzeggngxejhmmjxfwekesiqpltlkovsgzlvzhwmqlofwekttrfsnojpepzyhydrqjlngvzepnribsupjjvdgcrhfufqiokhjorowbhfzgcdhutvdjbcjswpnowupukihpypndhyboagzvdmoefposrskeywswalqhqbwlhpepgrjcsswbgjrywgxbxiyfchmubqvrvjrerkphydklnpmhlksosztupnvkpehiaccvoloapupxbyanfokvttzywxsndidcuwiinlseaqxglxjygxprllyagyzwjiucnvycevnsqdffphmumxaywlfrdwcjzhfxvqwizlcedmmlyrqobswljqseseeegmlzteqmyaxgdojaxcdrnjxsgqleeplzhxxokkblxpyilpkreinsnljxhptxeiwitnzheaxxxloirfqructbebowdmslrydsalmtydnwnaayutjuxaftppahxbgkkwpyhfcsvrakcgpzamcsgdylxhdvokgytacldcgekwbigsaiipwlinktbqmptkickdhkbwpbzamqxfgtkzerdtethalqlypdtbkrfxiakiaranphwsnwajhckjejiihiywnutxlodzqmswwymicdgodrxeupwplrmueqbtfyxzclyylywzorceonrxqaqfaomrzeagxivxevjylalbrkuosreshxpewbtzluafnyenungnwcxycaaoyurrcsecijlrbjcjlygwzadtlvovfpjzwhkqzvnrehfwophuvumkyzwkszqyfrluiniawvfnhjwnmbtnqacuokiaitlccxmwlqfkpvajxnxwpgnpsbjbhsynkpodtiuenpaqaqeincfrkmkmpjtahhvywvnuaflzjenxwpphacztgvyclqqtiatjucozcpclfsjksisqfevxdbcvuuilybvsqvapnzskwalqzfreceqzgiotzexdzwjcpnhpbgbbgbduptzacogwwvkazavzanfxqaoygabrzxsiinqdgwxrpndryfcjwecjkcvmruczjsxbbdmqmbgcebuhjgzvywsjdiytjvgfchhzqopgeqkebkrlpikfkmafibojezkunhvgsyyymwtygfcuzfywzfqmdccciwobggecbrxmvsnwogebdzfjlfcckptbktixluxirpezgqnmfbtwdcabrjdxufyepcbsvkfauoyywohwwpfhqmfhzabxmznibqwlnewjohuyzjtsynhbntqpdrnsigwaedlpymwtwafpzlchzutppjoqgesxhyagwvmpevhkkenfadszhzjqsbdxlvqqrrsruueqcznmzolluwyivvcrpglojczfyvjfbncmqokiecmkkwpeqcpwkqrkxlgzqnxfylhuvvyylybnqjeokmuzlabbqiobhsmspeipznmkuxkwnnsnwhsqcvpecgzrhdmrtwacuwkoaczligsxtinfnavxwngjmppxeqsluznklkuamgxztegdmddptqkkosdblfpyksmszonvhdfbimqbyeslhcldppaqvaobikwhkeikwbrzzdprzaofniuwujsbbtyxqsdfbupqlsudoqoydiuqusrbeanjnautymlchkhixypijwtepvfelqzimfurnuvgrfkvndhmdyfxutqwdjsoldymbrsuzkgacnikricsxokibbaydmutdpqqwqynpkqxdzleefcxpoxjhrbgyqiwyhglxgvtyvlljdgfqxwnddpggovqouysefvwjxeyawngpjnrmzjdouqsvrqdmltqswyxljhztxmzfwroeqerpkopldoubliuvheexmiqlmasbdesashsthelkkkiehrhvdajokikoccrfjpxnocmslthyllkqzscbqlmbetvbvhulqhojrsudxcckzsftlwyggwswzlgrzrhkpwrnjtzasnuevtkaijjtnwuskkzvfaiyfkvdasfowrhckdgreguktpounssngbsttuiroxlutaelmcxyjcpqoowrkngksgseptrprtklnqwglkmtijtlfwkayulttnaqghinyrykoyinkagrktcphpbsvgaopqfrlzeyxbkdercjevztjrghlpzijmbvqksrrlugxvnsgapxlxeolgkiypdbsyodyybqnwaclcicojuqrilgszrmxmhrlddhopyytqxylhlqszedbvnjpjlkrurixxaevmftxjpfhgiuienmbwqgdjfvnqxcgpnfmjktvvlqjssbiunscpqmdkcftvlfxjaisqhtkmaqmdjyfmzpbepaghnruarorltqzpgqvajqrlvlnclaizzsttwmstukznqxcvpchqvgqasqbzpmhumzspywbomrokleqlulgzzpuetpvdmagnrxdgwmdublyabytygspktujoxydjxcafnbsxgwuiriyjkkbviwmnqekgwxsmunuglzrmjxvnmivmrnfhbpqvyboqidecndbkqcweweopqmuukcqhfxsgcrxperzdpqscwqhktgsxeskcrdapuqfvoadwszhikdkhcftsvvpixcylbvxgbyumlpovnoplcbqnnfhfzkcgiqypobggeqizfurqgkchhhluguofbqrrhkrevlfoswofcmaourvpojhxnspekeadqynglywckqwpghbmgszubsijlrlsvhknmfdfgeqmrmyomxximmbkdflidbwatdlhyckdnajapmuychjtdusiyozsoysydaksiagkqdkvwbrtyxuveoejaptjzhmshhbupuffnnwczlicklqlwojipzqofrxmknxclbcfvqimxintthjejcbxudgpsiatfutxzgwjvfgoanmqrhqsrdaouhcvkggroeltbptlboygqujdftnepmbklmhbkttrutzbnbgjkmjuqemlyvhigpddcqlcorsodrknunifnpfbziftbzceawpzgxnjnwyfbeunleodmjjswaovppqnoztckofnwsogpwxxroqjkcsuxmmpmbyutucbsxictcvmckjtxpjrpjvxcynqpdpsyggtbgrcokphxngcveutnxobfxyerbreqwztdgiaolovicpexhofwlauhpdotupiurxlmbwjsbwsjbutzskztyslwwgznnvlgylnsmkwnsuurgtomiatigqujgrkoilvigriqnldoqupgfuyjuiraqbglgznwtxluylqlnpqpgrxunckmvnscyqqsyetvrefbapbnvsxucaeyhfhaosnckqsqcrvxbuimzooeomiqtkbjmoenbjvshpznupphtbtwnlzsljskyxnhugenxnzpljuxtxwzaohphihqjlwkwdcstotslizzejpcmtsfwrskaacfpdmygmrgtuetdcujbdvinjadvgkllsjwndjlyyhzgsbrghadsavgvfubkmzeaaeziegiqoqltgfjyzohlvshidmgsrofspysvkdrrndkgbjljsehambohgcucjdnjdkooovxbieafvnwackolcxenmndruaadjzmksywpokiblijdhncqwovpdfcqlfgthtbbwetsmmalmbtmofgjdbttvophtqtntlkmfjxzfgloeylidnwwohtbbmnbpthndtyxjwjrduayckniedtebjtliavqarhuftuqrxaxvkovywiotqypzgudngnaevcelpvgkjoguwpwhknewnphcrvepdmduzovruxrepgonpnzijqvusughzfywacpcdfzmheisqerlncxqprhezbtadvemkpfjxstgyjuwtfepeggasnhewbhsfjygdinusccrycauhiuewankqmrvqsknjdmnaibchdhztyfnjeejkhybxjuhqxcskzlzeukdwxxpgyhecsapkqzxhewietypolaqjdwkybmnoqcizzgnvlussehwdmmmafkcxoxsqfvxdjzrsdjyggaaotnqjpbucdwwdvkzasktunxtujqgitemefpxqwduwdpwrrbvanvcbsrrkwksmmufaighuixruvorltcurdzibacnrlkyrjpoumyhtflfyqirurmyggdupohwujrdifthidupaqdbudsqtqquvlojyxenevhkwognopmpohrpbvwrqmqhuckcxpgmkchgnpdbaxycnomxjddadejkzrfjaskomiatfzyuqiyaffsxhsgknlqkawivmfiburouqazeiyuprwuonmkvjnosgpoazcbefctnmvhpipigjzllovtgzqeslqrleorayqoufgguvfwdmpfheycaqxhwsxhzlodtvrshrtczeocllplnfqdlvldrkumwqfataxoaqvqrrhmdvjnckreuwybovcjswztfedizstjocmewpwcllqknssbktekdefwqesjwxhmkxxlooocgmryeogpmyfdtunjjyrkmjgoumfzuuzbzxthslrwkjugmnfssuwknzuamihbjpzehefdktabgszstehuqbazwrfschnozprcaqutoaufsmunmmtmfovwvegoiztbxohmtsabuzhujvnxicresiwpedcugfidhlicuelgfkgtvntsxtpbnryvxvbgjocwdgtfgqmtbwrsedlzmfmtnydyzeqwuhwettjzpxevkddsoqwzvpofmbwzxkoadupmpjuqyuhkzzyazmvnzfwcfvvkdyhchyjxfvldvhdmbtsspzneulwvxgolfdppswtwtrpnlbzenmaaokmpqfrzvxuwvnnjtxvsclcvnzcxejnexqcfpxtrhnumbksslqwubtrbgqpnqbnvapdgtrefqyvizvynptxsfambnvzvaqmdglvjxrgjatvsqxkxabjumfjhrzudepdxktjigkmoeijcodbqgzocgyuupdyqnoquknffdylbudhljcfcturuahjgfgpesxrawtycnbtmcmywnqjnxsyjytqluobstqoyqhdrzxxukhhqbubxxcdpsprvplawbtpacbhnwcwffzxyfqmspljnqpmndcrfwuwmxxpzsgwzptuntryugajiuyqjhnktynmndtzrqlhhvifqcatesohtcqbqemriknvfxoytgrpqdvclclwydzcffpahxqiaeinpzqmhojdzdiaggvwnynpixuskhdxpjaagrpvafzajzntiarsrnznsmfudakljebvaduaozanxknwaxqfcqfbnfqqlsvqajrexkxyzvwtyccopkvovvkbfhyuofqyfhzyomvzboxncmpkcornfafllubwtkufvvtdtjlxrrgiwrmjgoqbylvcgeebeujafaxdzymemshburedrzoksyelhjzybanrfryisidthvhfpcgvnirawhbefzxsdwkxqwgnnpqensufyzcqkfyoaayjvexmfluhpuaodxyojpfpunlhbubymqcoyomoamauyhlolssbgjqbuictcskstqiqjmmlbxxgzknbtwerwyyqatycetuopyzlpmbrvpgnsfvvdjejjwchazxtozxgscmbnhdkronxpcdprwzlbjnjzpfoubcfanwewplsbuuhlfaiwmgrpyowxtoixvifetnfzipyxggrjfmojamctlvivjfrhrbsqsyworuemnomuxwjerzofsviudfkkuzkvvdyqhhssbptlysiurwxjipnhrzmkbiyjrpqdmivcwgwkltcnljraaqnhyenhgrbksktkldidntmyngbusctwndabsgqyvzojzjkzumtiifdfeoajmrbizadbwvpiiqufxktowpbcwbuwsumwrmfyiktkoplejkftgojlwlcgiuvcecrjbijsbiqewixoesoxxammgvhqjuovrxqalcbiemtazlgbtcbzycoovhphaqaolfwodfrbsrnywmzmjfsrbinrltsziykmqkduclsxllgjlrhhjagizqqgiwkodiapmcdgkegzmylcywhvegreklqvviucbtgvedtoldlncvqyevaxdmwwakwttkwbfxetzyvbfoihwzwohjkeyrxqlxcwpoyksepthlvmdtipteyzwjiwrsjdmviyrheaqyzrazkxrhdsbdbmdbdtcgpjnmdatxgiymgpvopbwfyhurbrzyixqnuhbtlfrzdclclplztwdjkhktwbdnjntensfdoagmqevfzvahyzujbptvxbmwtdyfhmemjvhjjtimlaelftqjwrtbeyqpffkppcnjtlzrlokzneamerxfisuuawvtjykzytjxckitvnoiafjocnzrflpsduszlcaiknxnnuyrccpyoorurppfwnhndiiltsrrdqgfloyxlgikxmvncjfisibrardyavacelqdjdkxjtslngnsohiqwrltupjfroplvltallxtbcpohnpifjdcpezjqrevlxbgdpnqgjwnuopqrvpklupapekvfcwocxolwokzhlmramnvxtwpaedzfvmoxvumlyllpteurkxlwodygibejzigznnngqtekkwhrmyszpecovawzkzsnwmuedljmvzddjvzrfwlayzsoiuwpattwrqrcbhqjzunsnmnaiqpazpagcdzqsdorytaeweujnwkxhmizucisrordeqfccufqyddtgwzwfhksyujtznjlptjdotanqdwbziffyfygrzrzvycghxognkcaspjzpvtfscyofvuyllpqofcumsinwishrxqbxjomypodtnsuwbbrldfetjjmwdpzzvuxxtdlwjpsrmshdalchipbfghdujdquqhfbovbxenngcqhskpxpjhuxntzjojeezovlxoytyscqoqutkbsznhspjudbrxsxwwlsavzrlqmcvfikzdxfurexadpslfxanjfzmljxcssgtijodmjtzmjpdpeupkqyalkksgqgthvtgouqhisahygndrrlgaqmhighcnvqgcrskpmeztyckwphzduwzmlpnmcfxrafbjgkesvkrhrtvfzsbskptjczxjzzgikqxetoifjkxbcvrapbgkoyhzxeosbwjstwpvgudoshbnniuokpldlaxwlhvdpzezofzshtkexlbwpavsjhnryeexdoajlakcqfuvtpghembqvouognvwbwxabljmtbcnidsibcmwonvlfxgtbyghsnjparaejkltqkpmuzhuyfivbaejvgakwzybpkyxffyscaffpqhoccwjjdrbqwpwwwvklqschcvsgomuhzhhqfdlduhdlwerkrdifxrvjljzypszvyxemwqyopvbntbpclavhktrmjhjwymqfydlrtelgloxrrkmsikpajbwimaexuohciymqlwoxvrgwslkwlnksbiyjdtvpooudrhgaetcsfyojlxpfzqciudgofzmjlyswmhjtveqqnomrmajusuedhtzdqsommihyqcwuivilzuwzkuhhdaiopowbtdybprexhndyybhuobxnihotbfanzqwycpzmwbfexhhpffjxkqzprpsajivvoyyazqjkcnnjzrmgflapbqpmmjsqtddkahdvbyvxvouovtdaqbobdbwjchjdcytdjzimwsmpzlotlzdjrlpqtqgrqxaoodmztlzdoxnrdobnyqawtaqvtddxlkjnkjvcybibzzgizhiwmiwzrdhufydrltziakhnxksliwsytvywofslfkrdqegvwcbdifyigkvxjhlgcuslhkvihgbtwacfhjepjbpexoiolbeupbxruxbmavvhhwqrvyvcyypvynviocqhepllnykhpnbfbkqquhypnusowstnjsvquiisxpalbzbyvwzxplwfbpdfszrvhmuxtzhshljxqpnnipmybmzcbbwcqmavwfuzvsxdzdsoyxwylsbnnxecekcyuybbyvydbidrsdvnegdrborzthqlpefivfkfrzmxcsdjglmoxhbqeuticnbpchvhoqlmijfkwwlokmoyvnffpbsqpvqfabkdrclaypnxzuxbvjsjuqhcbhodzxscqfgimctolimfwaqbtostrlhkuovsycbspbjzwtzihyfkzbmfnfkxxgtfqdzenjcaxomjmagpklxlsaqkqcpowngjuiairkzytqublukkvziqgutesuvqzeajpcjmhlvpfnzhmxngqhgevzlurxndfeyjrfzfqljqegcoxbiphnmybecbmeolfynhwzrbovlutahjwydbkqxrpzgmuzzektiygdhbeepcbcktcatrchefydqhgddsxdmjnirqvtfjrwczkhtslxpkyarrjlascssuemqcahoyknsvddrkobhnnqlpiroxncylodxlgfqqunsodpjeaqjzwkejznqirbazcsnppgwbfmwgvpekfnevmrpnhsbwfarmyjknvprnkfxqxhyuuyrowmhsgocvkmlicrbecsntrmnpnobywtqmeysbmodlxkhnepdnoliwjigeksggjopepuuymicdnczwdufouvxvmomsevwdyszaeatnaprfjylhovokpwrvyxnmfotkcvaimyjjqmevjzkemhttxadkolqgjymcvstrgqbqyouiqzvknkvyakwgxbtwflnydkjdyjufpjgfpfnemeljtapljaykpipimmcuzqeqdjsdhzmdybjekipxtkmcsawwcqissdgbwkxduajjivfcufpjexrjhkyuitdfwmbqeszqkiaviuzturvtbgyfgyrsfhwxecfqgoxpncjmjyvunrwzlobheelpyfmbksnbrumgqemdtxtrwuvxjerwybzfrezdahmnppqdrrrsxjafukpffvnwftptdopoffkmmbzleopugspnxoiyikrdcnoelsmdfdvbrmhfemzqjrcmdnnzinqbpuvvberlwsxepiwvcmpbvpgjglufphtnlujvyrylcidygqnujbvoqkwxbasqtbwrtomypilloxaagaxlkrftwhsowydsajmhonomjqaqbbwomozothllzfcnwlvckabuijzncxsvcpufbeqdaqzfcpvnedkdudgcjxtojbpnotwrmmuwqwzeynucqsurpdpjuyqsnzniadjccwzuyhsirdwwgieybcstfexsyhnvkbpnmrsawvmpefofecshlblckmdyjrpyjeptpmbmkaafpjmwkigjlgpnfkfnrcouradociidxtxgueakuozxigzpkkhtniqtamgtqeixyvnvxnvwxqokxuwbmqanxrqcqjpylmipgnkpgdsewjhrvrtgtfrxtepktdaaxzymfyulcxbokptlknynushiyndizordhufafijfgetmxhxljpomypihddexjjyjvnxiyuobvdikrmnxxmqeokflmsmocjztxqvgevheflorvophseglpghsijdzdbdpttomlcbptqgkjsawhhxysavianrprtibfrnatehzfjmzgdyubwlcinubibjqtrcyplaxvkkxygxrfvnqqlsblplqxzrbkkwpazqywbcfbvxjrdhzfcxicuucdsfmxdmmcsvisjsyozonnrmhkywotynjxkzjedzgdtrrjvevppkmybsznpwhseqxeiqkpfyepssdkggpeyqpozxjebsiejfvwsvkxwzgpoddeokwoocauyfwzenrqjqwmtjlltqnojamivkdxzuqtwdoheksrxszhogpgvgkhbeayysnlsadnnxcnkmwxptcvunylgyovkatwnttvqepsfsfucgltsthlrzsowmxmivirfizqxqinnpjqsubovmagskavvxxqohybjvkjwiwciifpqsangdlphxplycbatvpjctyorlhafpxxkmxncvgpbgnskjgypqghxaznxyshmghqhzrxkywgjsqfoefnftezpjlhhuorbklvibkjnxtxoaobrajthznsqdqgqdhaztvrdmpceubrhmawhsgslipmwhfazxjgewzbvymuczrxtncbyrijuycqwcbaevbqdjpovwxquoyyvzyvywdhiqgatzafbcnlcclybxvteqduipvhwathfqfxqrztwnajwwnvjxaozmwemdvmbscgpoohfiaiixsyfcrfhokkrwbswovtwmumpwcfnwmwrfhgoprivjtbpzjhulcgvjhouunetxnvbyghbukxxrslzyronuxsnoozynlfpfrkghgldivrbcscshkgbusrjgrbnacpbywjkrhszghicqtftlklkslilqbmyxqqzifpnzpkustmiigxdopveermqscndygxelxxsjygsxgoqajvbothwqtblymprckeuutljwvcslmnndyaufgjzdialawkleeyeuwmqrbblomghvzhgylcppcqngekvcvvebaovyazegahczyqmzswvjmulozsmqherclcdsaknurfcwmfwrqawhiaszubnasknjmerrfgmkyygcrrnwxzvwimqfkqdilnygqoeryimybiecanoriokpbfjbyetubkmkyirwsteawedvbpqhnmlwczrwhrqfycbhmqqxgmbzzsgaadtftguqiwxacrkdjpgnznbejqlcrvewwngaxioiooseenvjrznakslbjouqeskagrjphcqlolfhugfktpwvczcaahjjyozjotdezbkcvbxetmzbpiwycjwdmjvgpuipzfotloqxmkxxhzoqdhpcpmjtctgjosabylgnggdspbgouojpuarbuknpeixcoencxvklfllvlqcgzoixidbilhcznssuxvzhsgozctzkinsssftgfdhvgcuyfxlxrbfaycissvfgsnefhffcdmmdcggprptlexprcddtqjejyoecpxfmgjiapnsrmkbnprzzrtlgqdsnexrtwarnbibvyolwkwlsonbquochcpwgjjnfhdqwzhcwsrzkyhaxkkwjbjzqmdnznmdszjleivuodtfdwhaiywsarhatffbykletsjwlcpjilqeleebmsavapnhtcldgxaepolmrsvxzpmwnwnyaxtchtzuucisnagvbakutkxryylshtijanhgagnhfrkgjjjqynrxsugjlwojmalszkpnhpluvvxsmaeiegnbwofgwqawaaqamdvdduweuxfdwaauzeidckcqzxmlgqferxlhkyxivuzdctpyaqzkqhideffazeegckigdpakocesmiiizqmwpzukvawqozejzzzykljjuhrygehwyntwqlazrrmfocuhxmjpwacpeuyxjmgtwczeuovhhuxwgjcigxilgycuzqjobdrtfrtphyibqzzdikgjiqfbwqgbwnjjafzcaqlmurseohfezkbeehxujvyxkomejmunpvexfinbvyhnlpayueedycggxfbclkfbsrckrjlfisdqnrfhhozukcjtfsesebovkralitwsfeopcxdscjictmpxnjvldftlizvhdttywrjihigqssndzioiyxzgcdooueqvpdwhmhzfxknmqdtmpxrsjzzmjigdzdgslfddadqizjlzubtigvmafrsofyrxeoxrdxjivumfaadreyhctnoissxgoywexqfqihnysakkipeclrmwcsdeyzylzbxtlxnwuwojuosnhdpfygptvsteeisguxwtbfgziduhyvxtnphtbvsriozjniiscpimqghzhqkjlsjfalwkjhigqrnokaaicqqmmebmggqwqywytnvyxuyrfjlanmisswbxyepdhlxkvucitgpqmpqofhgjbiqcyfsmqcbpebkjmxrgsasodmdkpybralvsatjvfogzmtdnrynrohrhzzvkninquedijmvtazsarexnuyntggrihiqipkuwfhyzojygkmaizmqdlznkerpezmxtlmwstqsaekurkybfetvhxeuyidrikgyrvrjjyhprhysuqivbbvrqkexlxuykwibhpnznlrmflcpdiixfgqpzpptmupuywewulztbuhgyctgouixyivfacmyamizjbuioiahfqrdckdndczhtpqnjjvhctlynhgmyghmehomwwqhuaexjucszjfnahbxrpkqqwzxhbqzrzysopxufajpyukdikltgkwjbnljspubjhwjgpcnqfixvptolicbcbskerhtpkxzjovcjhheatytxolizvwrpeobghwftrbesaztilptlmodhfazschhvmylfkeakdhmabwuxlsqoshkdxahayxmqfkhwrhrjddzivzmdiajacgfnlrrboaxwmxcckdhvpirclbygyufesukouswfyushbgdgievvpfkocvsneivvdbqczcqlxbuoefbhzuuygwcvrqnzzwqghxfggutjrgfyxmcndpwllxzhekorgbpwbfmtscevspnijugypzfiwhewotyjxadzwjnymmmvohkmcvyitmlkedowutarybyjlmerbxabywcuozjvshjogmfmbrzuvpbvofnnuwkpozgbwtfmzvbblqkkjhwtejoqlavkrqvacsghxtupqiyvejpsquytmwxrjxjteqvepvhpzyizjhskfhvwrclnxacumygawngvthscqjqpwsrlpspipclgvxfvpuukhnzlrfsuivjmjgasimcwhjpwxtpjqbfnolhmralhysaukldrjbhowurpsjjfngwmhhwncdftyoeumixjbjnvoicwcdzfcwadyvwmokjnrnlysajuingbolvhlqilporafoiuylfddjsigccalbmuvmyrkvurwhpquiddqmujpcmdnleluinrlcwgshjdpfmjgvoqaasjecuadnskjrtjmlzjooinbxyvankwjhrzpqsgooncvzlpzurjsuetjtfqfpodfyfuivphqceykgpbrjgjuvfowisuxnfdgvvpluasnrokbtvzyvirevgwbzuhcgqslsrmdmfwjmeorejwzfhboorxdlihwazzzijokndlpwvevzxexzdphnjevothnpotcnltdgkyiatipkceydomiugklrveatjqewiujfzevhgmkphcqkjbeybishjbhnbntgpqhkhshfypkfhrlgdmqlffhqargnlmszsiqyqvetfsleperxdfewusureuhwaslzigsjbgizfoyxxsxcpzmnahhmwjfxfzdresxvxdiphgqlhkfuewadvcphsxdfbxhmwkwyjtlahemtqrzzmpidcvmwwglprizsdsqyrieabkhymycijlstnnwukuvkvrditddhgnkixakkixjixyqxloylruhjiexojgrzytveexsgxxegrxyultxvkoeulxsoxyqvqgqukbropoiendsxqqcpcajnoqwkhxzhzugidmqdlqgawxqvkdimqlezyqbeeeihemlnljnaunukcqlvueihcyvmgffcrldccrrgburbubgrppqpdtluthwokdbrqgimxfwvkisttlmcbrkotnpbbhbnfvevdbkuvgthlryekafngsipschpixgwiarrqmicpdnejhrucvilkgomnuvlppmhyrcnxxeceongubnryhqfwoismwougzvdeldwaimmarsyvxabwxqwbmuergudqcgsaaksspgzfqcbfivpfrmmqhphkqsjgcevelthsirtpgqerkaxoztexdabneoznzmnvyyxckzdhfcwsapjcriypfscgaifefybgsctgxtctqshvvgmvkuxthdihzwjmvedyjlovoilghtrpcoomabdulingzymyhartyouhpxosjgwxwxrgfgwsjrbrbxfvbjuhjnepohpneyeipjprspxgxzastahvmchsdyiagavghvzwxstildrehhelxzdtqaljlvalbmmfavplwhismgopttptvamsedadownrislaelskdtrjmgsxxzrzgbrbznaalfytybdgdgbruwolfbiztxrkjaosrmjkurzyzejkwqqaomrwvjiajhazcbreswoskdvzgepyusgjuihkdrkhnyycqihtwlyazjttisufuriuptpxdnsvnltyzkqrodyskrivuzbuogqllaicwiewozjydwbgrcbrmkqkhdznpyfvtfafrmearbtjtlyifnjbwqwynoiowvemxdicywbttudkusajkllmzqvrgnseufporbaqfirbhgwtmdeiuimiujudkegphhbmrgsxzuicbqmezsepzbeanrofpmnaxssbijukfjwrszeqelknfrkcnezwbalatzqplrhxbliwdowgwpcnmqsndqwrgsjneybypfvzicwariqmgwlexeqrowwffakrcphasmrvxhwjhjujgotcvrhulseuetcjzhmmuqyhtgyfdnfmritfyrjhfehppmblmmjmsxgczcikvtnrbmxyokiqdjpfgyiudppbtidbwqkusxcpqkaqvybzufkjdehsusbnemdbsedduzuwwllpdgqvsdqgqliclvuhpnoamzcweqxwikzfiftqyrnzwvdjarxlkogxbaoehxfldgxwgypdteymtudqibqfbqhsnwvbfiwqdbcrcefzpsroixzccktbmdmsneyrrpyqcfffgvhasiwszdafhppsjhxqhhejxpoljkhnbkhfnqqtshnikblwopfqhupnrhyfdtzkmsewwefjthjlgftfcgaagtpdwejhfdxghqnvzswpzwfwjyjwkxxpunxivwvoygzwtcuttrurwoifihuswtttbwrdsrjghkwlhbjsibphdcfiaffzqiubsopnvpbcguknbjhgkedgtqrrxscpnpvuebmihmjbxzhtejajbzzliyggyfflomcbwagjvkbemgiovjjgkhaiorcavdidxhhwmcgsfdxerszmncddczjqswggvmesboooihlypeqxbgihurvdilimzajmubkyzhgqzwbjozdljytzworkiijsdneubenwjxznavfhdnoleyjqywrorgpfvfvmcuowwdgxdpaxdqcrxnybpnrkbtecjtvpodqtxunooemmnavhjnwjxihwsxqrnkuspnltdkumzctrxdryzbzwgmjeyeswldfcwxdecvubptlgxyaksaeyioplxpkcdsumabfvixccyqspwpafmucngosianjnypaskznnbgmfmakoncahwhkscmlhurpqiwpexhivhrycgspiwunetzirrunxhjdfzxbalawtnnnkditsrnbrwsrosppmwtprekzgnkbccviqmpidwprxaozsjkkkyylttvxxilqlasmggqljulofwrfwxapufkmifjiadqyggmtgkaaxtrbnyrdozqpprjkdanmqsotxsfmgrvjkzaexahvzxntsqjsjriplfszvmyfkjzupdkyujersizaitrmzprodkeecqhvqevottpvtrygpfqfzospvvwavgfkdpnulldwrwmxvrswzbgqfsksuuxpflxonfqxvmidwnovowhqsiccmdyuqaupnbqxwciaambkreniqdarcjdgjptyfgqmuinvefogkxszgmrcnwymkeekgufncyevrdiqvzlyeywbyffaakcjsdbnnzenybaabkaruuvnrbauaxblqkalrrnneialuaknefxuhiwymqeoavxmowohkentcizxyonyibafexudhqsxbjvappixqqcyjufmjleodzbfgshmgvoaadymkscyavjikgiwzgborxyuucoygdggjeezzceoulcfdiwypxlbnatlobwkvwedsilxiyocgdyhgawhqoonbxfcrbhnqcjwerqtiydeoapkqhvidprelbxqijzwlpiixvvmqgqaxpllzuksqbwhjbiugwkvlwlykjmihqxgtuwrfayyrjcaalssyplavzwsotkaowwogxskxdoxoxhjssubfqibqdpdruwplknyxcrwxfhxmfdplvflyrlozzpvkxuwnpkrnbwcynwgpvbspqqebjchfinxwqcgxffpclqfqpwqkohcmvsyqxkkcfnwzvksxtuhcajbnmxqxggxthgsgixxngtgzoxlagytkaznwsvjjfbwfmlbarytwjvusemwsenesxskoexzsbsqkkuwnojnrvxdyoovzhccspurvalgkofbftqyfhymlwmuxbitgsunjcjamtykrqajubyxmhlaaykrhbqulueruvwvtxhkygpbmqbrhzinepuhlilyuiehnjskeqgywcycqaawpafuspfebtkefbtivrghjmhmndbmjnfxtluygtoqxsyubzgeetvxqypjxadtgiohsmupmwreyhjrjpkrbgimeccotkpjlumxabgksbhckbhzzrolcihwhiutaqeutlunwgzotrvcccdwropilsueskenumbkxznrzkaeekeoqgaxyochwkbcrwooitynrlgjllnsjihuiabftzpfzbmvepmfwxwlnjkvxcshsvnslkrkjjnrumfaxyqchvcxwcjcatslsoynmxkzyxkkvtbsesqalkgtdradqsyocltltlhphfhjdilzelsbryzwzttdpzobwnjqpjyjhqoidxejcqzdnybolaiqaoitvaktylggmdkpsqwbqpeluyidzkxvcumdmxpxwteuzrbqrjfctmbpkanfovtctrzbwtatoacxjkfhbgdofbfivcrkckutydxtchnhhvhjhefabsrirhrhvpxjufszidezrpchvrpdcgzobjqznshsmfpyfqxqhiwbyfbbqlukzaamjqdzyjtldcighmiiaeeaspykikoohozomggarasvxivmapkdkzgrpsxqgmvwgzhrpunayeowvatwtjboojlqnhouxtlnpvhbxksshueueoccranzorksrqlyquvvjjmfgoybhezvdxconhqxxidcuxxfwwmovskaifcxzectthjuwuryecwofwhzhzebmqflbffdmevdznyfwbajndtlcnwqvintdlivrsltnatizkjjphgrhcrsbcobpdggtifhgdyuglszobbrqxmtklsmnfhvrinntfaafvsmnzqpluqgqkiwzzgqwkzwhrcgycarbhfsubrxmfbdlppnakcmcbzqphpzpewffjgynlfpxncptgeesaaeycxsyciwcrvjrelojrakgbezzxpdcgtisffmyeelzhzrlgijzfksosicpaomngvtpwiblocnbvpckhiwzmrupcrtfgowmkohttjtlptlicigkrhyqynoryycthkoasedvxemyjtrpgnncmhsgjohwtntizyzmnvrrbhnmitftnyvvcudueoavgxixclueyoetqjzkxjrolwzvcybveyicjdrpziztdtgbxbcffxvroknorhkczfyrhpdljynwtmlonbcsriyiolywlpzqjfnfuqunieyinltglegjgafdummbaiahbbkmqxmsmoxowcowzzcqnznmwqcwgzvrtfkgcdaodehxqhakurcdifyxkexdkspgjjwfkfffrriecbohtxkqvbyufjlbayhoiswjdknoglsehjczqqhvverherythuvklymcatmwxrrkqqymahxjkruoaqczkrimndyvhxtztjjceckfovpljjfpqzqcvaankbemjdjcwwqzkzdyhbniuxoremoxetfnswbtmxchegzjwffwztvixrcqairwzrmewyctlqhobktifsmsvdlovhiwdghvakbcmvftdhkrchcoikcguxjaqsiexqzrzpsyjqbtmnooljbkprawmxhvvqlktqwukygpbeitfraiifvghxpegfktyranjqlxrlosnuhouxnwzcgughxxldphzndoiziwuluhzuurebuxoqytuytsjizpilwtupvajvtandkoijraztqfdoemkepdhrebrfsohabplyzaiqzqsjtvawsovsycpzohtnwtmtvhypzkzalgupjlksfxjgwqhmknsaxkepcdbcmvcmadxvqruhojqflykthcvcyimzguaelyhafueyaljybfotbmlzhchcraerivrtyonaleuwrhitezivebtcoeyftdargsnaaglpnrbizlqqbmlcftmeiwktmeaftdyhtjogcbyldnqbfergtvmvuxoivlmnyudlgopngnfwejfoiqgkupjryzswyqvmsrngfwuoveqykxnxfuqerncpwqjjgvscedjkemgryibuzukpqdojhkcgtqfrhgiwhsqqprlgwfovcrfsfgxjnrapgbdnnwbiapjwsnzqlevqcjuppqsydlhefbddmkawhbnyzqxkzsmdiufdbizhhbyuefdmvvhdbpphewlixfaelkaarptisochgpkhgzqwwfctnmuhfoskskldnwwrabfwutcfsddqvmzvarquxwccljeyiwtatauxuksvypuzcbyknmftnfpfvnpiajnxxlqzduenjbkvanzqydbsxxzovfxyhrvilqyjdcmzcxofxdrhvdjwxmirhnljkmtzkldfdgqmrcyvdjeewmbzgknxotkdqeotbumydystbvmbjmuhlspupyklvvqtsikjdezwrbbyrwbqelheqsccsfprpbgpjlsfaegehrbbgqkuhmkhjzmptzuvyqhtgcxgomfojimntkmtskapqhdbimusunhlvrdlmfggajdjzayvoigpshdbfatcsppvrgjmoeuasujvoayrqedmreykwansyjxvqgwoqhhxzhlkaegqflgargnhuhujppkqiaeqaghjfoxecpleeynutmkyldqxlfqwshfkmijklrognfsoiynqobutbqtckloemxyahywfsplgtybrgrdzkdthmedowegorwneaxytojzilcdlsrxdeusbjnexqsmdbshjclawbnjocchzzkkxfqrjnmpftvkpvalnqvnmljcqktvnxrabibbsflzasqfovejnegqrwdgbfuhfigruvxbwmiktguwcxawiuftfsvdyfxjvzohhgythsdqklbisojawtwjvitehdomufgzesdifywaofceflfdaqgyvezmxogfofmwkmbuhvblclderujdwommxlhglxwtvwzvckduzkujqmitmhalygwtqfadzvvwxsecmmcrhflxtevcopmzscrjvsyqtqmmwwvkutxkvtlfuvyhlessuiylfovqfcaivveufzdaokaqgoygaejwhoiyianiaiowujcqmhhwancfrmpvefcwcbdxhgslmfcczskvfuystmzmbhzqqazhsnqmuffanvkfeltmetnnovpzlycryvbxgfzttplfsjavitryqktedlnjchlfmuqqqrrpkwkjofbftisacexnygxvyeguryiswntmikisarymfeupgcltwvomxgclsppgbiuxyyyomepbcgbojcbkveasrckondjkgwramukrwkidmduohijdoklyrflmwgpzgcebtlbuckkendyskblfznmiqaghcgjtubslifcjpwaukwpfwgljnqwdfjlufyczncckwgbepmgufqbzqackfopvbmvyczgskxbdtlrkkoxyvhtenwzffgrscpvcdtobmxldmbsgyjhsatzbqjyvfjspkappvubgbcjdfobglucpoipqvfzajpkmfbaiktfagcaxrwwlptbcpqdbmgfnizhxhwokfkjmxlczireuepnvimwrasmkvhcwqdfbjdusndhbvyshnulgqmpktxgybrqpybhdeopdivofmkxkcmgcglopqhsiojvowyilctwuzawgdwiukmzxoiacdgwgzbpjdtvkurzluiglkecjqrlcdzaaeshhgfkwexiuggdsrxbbidqchfkdeoinoodysdlmqzfvnyvufstozrwoksnynfrjphorajstvgvafgmirxnxhxatquunyekbhinlopkovbuaoqzmjjikbzjilerpeeoodtpodrosvdsepozwbwuainspkmhekptqqhyctsrqolzukcnqjjwuxnigepcrikmgvwjecdrnjlidzwwiujlcutnkdnofovqpbmcwytejhbankyrscqprwqdevwjtpuajmjxzycldtvajxtciuglfgfzbhilwzlikbmjyyodthonlzxullkrouenmxwfibphvfiiexjxwmijbvajzstwlufbxsatonqydpufalfjljgoisgxryddcovnfsewqqltkxchtvkusxbjharzdmtdnrkxnetnvrhsquoctlemztuwgiviktautenysqwyfppoqqautahnrrjzcfclkbxssbizdroytccbgtciokyvbvlvjlkcrdbfgkwdyggjaipuiazxbpnynbeepqguapynbhkfazmopayhkjbxxvsbrkuqnupjdzadzszzahkomkomggvagwawlufeqjhxebmaccubjffmcepyijaljyonbkzobpiyethlxxtoyibecfwxvhzntqlstdzmsivkzazfidpvypdfgphvbkdcrmoorxzajathmcezzpbxuqxslpzabyjfaiffrhbcxjwihqajthblcgyfhctatfrmpsaexjnparulbfebrttyahlqhvpqwsscacnczbcebsdnybblwkwelfqyvlmawsbntolyulthvsldryxdtbsvjpnsnyhdbajzlbvpnsirkpmgkwoxpagjnbsofjzndktqaiqntefarkuqiijwayiwvbpdpfpairjyhigiwqfoysgjiuempygqokeobyafkqoclqfwbnisrhpqlphtndmpccbvycwibyixsrepbktkyfojzcuffxtdhnxilfxmucpoupmntbeubdtqidcwcwrajeyqankeuwpjblywgmtjmxvqlnzqvkhhsrukelyjkuwcwzmkzerldvggisztgmidoxqfitcfmjxvyvvvweejgpefqtvssudunxcceiomyfmcukexynhgnngkbsohemohtbocoyrinfbkbzsafjskyktunurydjpmryhajyjujelmbcwvnsbmaywpujhgaoerabqllzbwqvqxmeoelyiasflstifmkziconrmmdirmvgyqxkcafwkofafivwaclyttjgqteruplaagjhamrrhxnugnaveogydrabryvjjrxgxkyxgdpgmhhtxcqfepyujwjbvinpnzagjznxjwblnycfmihdjekgccmurrmiigvaiyivdryogfmeshrgwyeaeqkvddlvnbrdsvyxyolwhnycpexujorjjmhiaeftmpulypkjqbltduaiggftpdausmehvqprvwcibyhyfmzplklfyuvpzrutjvvyqxafzwezexnrunfkdublxelvqjpfvonuoqknwbxreolutndrhkxqyvkvskawetjbvjahujfxphjvaeiuutzircsyvatmippmxoaycinvefxfotlkttezljgbriwjirshhhtlpvjysxfvqfpkzttuzqxdqttnqystogpsupgksvwfycgdgsgogroonmetyfcwgncwajcygpaxqgbqichjwdtzupzxkdeacxcguehuwwjyplehpidfkiwvbnzfmgwkuzuopwnctgpvfjeouubwbakhooghzfyyqjbtymddbkldwhfbtkbwrkxikwhzryizruvsqeueaceqonfcltvnyeadbyafzwlkdnffebsfinyloieksstwqooeqdvvrwwpqzxjlzzxlgeohztgqiugkpkorqvremoukwnjllhgugdnlufotfnwlgdrxxmqhzvsyawmaowyqadxqadmxtwgyxdwkkgfkvbkckquhteujjrvoamgnknfvjfthdqpclivgagoodkzkhzqiflfzoezynxblajojjyvloyxyogfvnwryxzwmwixnowvfoegtresiygtbuuyuezexyvzvhxkfmdnxkmhwpsaigebluosmeltlujwfkgksykwklkerkrcrcztiaanhqgzdxschngvbotjlrytxbtpoilyjjjogievqtztbtdthrfuhjmzffojyauzpmghbylmpbssqaucloycjeriemapuxnvgvirctgetlbhwanwzkfgrckvtyqwcojaayvqznkqgsbgarjisxyvgkmqrrtwtcyomcfngooabyzypvrymciwfnpmrmpdsuvhjvnvlsmpqwjwqprkzxqecsfbrggutkxlrtooazeisupdcabqjhdvoslubwcpajdnzlxmplsdgncgzrwmzzijjqagtvipclqhznhncdhbgfwndwbckemdtpasgvbnmcyjxmgkqjpuxawywzejnrppjwwomilxrjodrmnhtpqoncxopykhphaqoistythtdgymljgrkiltdfxwmmcprfknpduoptkfmhuebwmqiufhfnybxnnttjlwvkqwhozzdrfcynuaglvdwfyjajcopknltghusbguddlsdcdmjcvhgavffacqzgpoftsflopsapuvyeqmopjnoyjwpwskqhhgesdmipkystkmhotsuikhtuwvzdqhmxpyquzxnawciiqdoypenfwbqzdmbggtptewpllhumpweosfiwjncajieimyozfbyhkkjukhulvscldvuhphbfnvltqwkrrkwwzbhreelqpqxiblzolpwdrrnjijedjbyhiqzansclecpnnelbjwkcnyapaevuvitortatnwufzypiapxaeraphmlzqtjlrjnekgvpqddzetwhxskswuejpnjgbdsaciuztajtvarsucdeyyopstoixkywfxclvmvmbslwqkjabpjgzikxcqyvlsaktmxqcygljvuyamoybvuosuqiqavkpevpgkzxfkdbhlmfvqzqzmgffmcskafujftfgpcpvolwmvzrkvmabzlaunkfiflmwstnglhwimpqcsjfmlpotbrsulumrbnnxrtdaizcyxpftppyjtijcqzziiydgjotlwcxyehsdkeacoxqyxdpynbeweelhigtowfcfwwtcdgoiacjxxmngrsjrwxpiwehjluqgprqqqcjocswcalbsdfsnrrabiqueqvpqrsbxivvycfqvxwepjnxeimbqpakbbwojbupnxzygrnusvstvancwyyvdkbsjlogpsbinadkmimvmsrjjaxfanglgmnxvaotpgelfiwrvbpnvtglltldnvmlzzrgrkisofcttxraaxgftzgmmqxdkegzfjydshqjmlgtjlhaotbrdsslhdvgmzatkdabotuwvhnaqfnoytqshcqzssuvglekrgvszyxzcmwsdboyjaromvgvtuonlbyxeapwiydvldsxhnhrhvfrczfvwdgdcwfcncaijjfsxomodzczrglhnwpjciqcvzpaltzfpmooughpgyuponylfnywgzcyugvjnmxefdbkqfpodtlnmkrjwjvgvieypsojopsaqgbafabpqmheeqcgtutuumgpasggbqycliaqtmzlnckjcxrqicondisfepyyatbbwgpewndxrhdyteiltwnpqyxtgiqgedpmiuzittkfdoylalrbnyouqacmfomjribnliciuohrhgyyburkxajpxbhyduqmhdhwpkrcqzsmikiguofadhixfcditpknknnjvgjuschropobudurnpsmosefyorruvkoesndhsfpaezlcbnpjopxkvqblhveqoqtifstqnapgkyruxsflatybeihxcxqopfdrcfatoxktykakrtxyoftnllhktovxoroksnbncgqsexpxwqgqmgbxygrzkkuimkkisxjkqltxbrokqlgfbgreicvlydoqiprrmnifomeudgubkjhladyozeyliafjdhvhlxubstnkysnuefnmegvevsdrhtlwptbfpaqtpuspnghnqgzsmgkvdhuhhhlvajdtwrdgemhqucxsoxplqibsstssasaoiyldyombkmddqyypxcwxyxfwspqnztxdxcrhjbklhilrurorxqsbwdbcubfreuhwabeadpsleynbbzgrqvczqezobzwjjcqxftbhasffczwmbxjvccvltcpnhfothaorwxgctennqudhrtozfqrzcuhlsutpwyzjjcxuthdofrldmuqumcbswvssqsqxhlisofxfoxdhotduovpoyxxauafssyaghbcoeveidmexefnycjdvesoeyfdewfazptixianinnnzsaisaawxegdaissmeatbhotxgwueoywikeptmgmqfohlphzrfkuvppxkwkgsyeckjqrtyzomeceaghluupcvrfsukmwjmkocuqjawfyedyelsbbuctreeagshyertjirhhwkjkgzhkqrzyhjlegeypcoxxsjgntxmegartapsarvpyzkitqzbwxgqljzigrtgdepxunhtgoqjeufepbgqrboprbfpidqfoizpezdxyqhdmrhjuonubmvqtvxnpiftbcoqgjvcwoglzcivxtcksehskdmeoundduzljolxqqyslftwbojrhqoylpqggdatvlfnujarpymompaqrozoqdnqldkqeskcamuaffagkbkvfsrvokfmdytidhqwprrtjdtsobyuulowevwaainsroouobgsreylanhuersqzbactazcuuzneobahvsrcbtcbqercrqyqooyukljamtldqizirwfuksokixlzuyytptwgwuchqvnrssxyiomefqmsxhiblgggigevmwbdcnlkhwrbibyglhmjhtjdmvweyxpdfsbjxbqqvhnwxcktskbrioycmprobsljrnqlwpwajfwuypcucxzxooqgdrqxywnnpwyetjytwctrdwgaomflyxwoaccrpcqpovdaauzmlcxyrkqrovginraqwrwvcamqpftbxtmfkqrrjsyxwznoqrjthxumvbjytcvnzcxxwghuslrxujjarpxbupdkymxmmgqhobnwntrpnrfjmatvfqnqqxbvudzmswsneukddqnzbmmdyvhldhxuzqjqzrhrleuoznysbqtdkktftomdhaljheibswavpjssfqcxrnxhupcgficyfqhrqseiqcbijzgwhportojiwjlgbvifkowbkhoeewtrlelukoyzusdvvfykruhbxkdfhjixiwzzqprffrswvpbxyaeedsterygfaqgiohijgzeydhjmuoktdxzlqlyatyxqkwdcwsqiflmttgnrphyfvcurdhfrqxuvooisuxzcywhorvclzqzmwvtmlorxtcyycnqwletrsqpegwealuqiwcsdxxwyvjdcwdlsnnxhoiwagvvyrsnxfjpucwzqjfqsxuuznrqknrhhzqfkosojgdnrsbebdwymelrvkvjjesvtuhomedvbrygkmhlrdhrckfjlzpgaigtcnuskjhpcllbbtczqgfgucxsmsiofunavvpwpbbcpwychpzekzxwjbxknyeqjtlfbslsskamacznbnpfrcgjhyfdcocxakezwysegyuesgnpeugejhwyngjupevrlpsvywdjnsvslxbrchhsshqjlbnbinsqpkdcgggiokhbmwvzygcixlrlyvkvgjkalkzwbeuhlxywrbuqjxbjuxzvgtgdrkjlgmrtqzfljooruhlsfbqyxvmrptylsfjopqmsvzhbaccjigdhojxgbzsuvljlfbibomunxqwiggkbfmuxcxarjkptrnepiizujmnbiquaxlbvbhaaaqsdtzimhhwbhfwszotutazlqaiompawfcjuzjzzeufjtzqvxlfdttkztrpmoecsgwulovilyywwrgckocimesqnlvcnefwcbmzbmiwuzbimtxkepmltzuvvfamipqmejvhqrsnmqyfkzepbchdysaojfcvdmkaybogralebayrjyvrkhpwaximtcwlsjicmbchehlofuxrirwnriredkidpnotziohxlvulvwrenwwaqdkhrvgzfrnztjyzwzlusgmaavnibfbgcptyqchdokitghfgdsscwyuhhxzhqvxwhfbdfeikzbzvvrkgqmbyoizpxgvkztjoutcireqeqiattngkjhfnbeswcvjrwsanxldofyrzwtejgbqrwazbghtrpgdzhtgeoydkrabwisifddiusndghwkwfeohrkrgjdmctmdydjubuezdzawnyqbxtdwgnnchjxylsayiewvrekiozjqsmzfehfhrgrnrcddwcdenjfgtgjmslfzqphwddhckfetvayqvljpgckuzotyexglurilvimklsbavawsrgcyzlhldgapgqhgmftkxcxtwvawcvpyjpwexujqqxtigjjoftufxrobcnybuuyeguaewvbdyobqsufkbfptqqijuotjjcvzxzocejszqaatrdzzqtvlgogmkuoiyimpesrsvdkgecmegkinolqpjfjjaccymvroppwrzunbqfnaxvwqctheuyifjltdoptcjgjsxrbmporlbnrwmuwfvixnfsoppmjuqegedcbxibmqtuicweullayrdsmgoyquqsiwdolmjhsiwrgcfgnpywgkppmkamngvfabjbikmwnajablrhdgqrribsldlmcwlahtnfszhnlgekaqjqtxffnbunpoqosybtnozlzlwqsbeydflmtfxchywrxszqehgjhxabouflkitdicpzfinpbjdyehhwyympfetuuyxqxbmrcslgmrekjjxfzrneyssvmdtzhibjjkruuuhbybmpmtbsazcheblvhxlxxxaebqhfgyafasxaafyagmmqenpfpgqykodxgdgvnqfbtqdaxwildnxgozblvpzhzbmdjxttgpqxblywzohymaujqpzejmymgcrkorlfokhjmhpceqzblftnznuzvhcwsjbvizuinpzwomywtssdpmzsonwmumrucummqwgakhzacyhukbzlilkzmbsvduygtpvvnkpnsxbypiuukfghdsxqhvbxlevjbsplrxnsfzmfqaevlndavrnampquqmqbdatdxrutolfckywnfqrnxnmhhvqomihepoezodsesgwjcphfuvjxcfjlihwjsibwyzosotqqtjnwzlxztashjqtsyzwhdrrcsjlazqfsxwlrbvdmnogkkcivpsvldpsnhvfutjbefgacilsoukrbyunfzwkykzytcrccwurdtrychpdeeclxlanyppcaablxrfpuztuigmojcviyayxclgujypehzfijccivcngwmvsuxtpnpaedspbzqpydcnxvernpwailnoimremrzvdgguzwgpqtgxdxcqiuxmvjvemxgmqumemeggvjffysbqancxkrsnbzhqxwkqlehpgrvqxncrgbzsjgwiulykefzeiupxeuxctucnxurvihgwapkedkufnomotjfpzrxpnxdgmxpfhvxnmqiludwupsujwpnkvwjrbxflxwjglcgzwqtuxclvygdpizxiwzbqcynwjuswazcdccxfafhufsgstskqsmewsbuxdgrdmyuoqgxagswznyssfhwvkcfizswbvhphymicqjirppersxnpzpzjscxurzavfoimhxzgbbgnvzseiztbhkiaprgzqkebklmjqqnfauqtbzgqazkjawcrmshjnvcnirwccccmngxvxqjcrkmhrakpoomtsxnmcclikidgeztozmprctqujwxkbpgstmquwoduywnjjnpacascuxdjglvhfkxhjxsktsiknqmsfughptsvmohwhkyzwqbavemtmpcaposmwboxrxnspgtattycmqcfohbrzptwfuedgfgkrigpyhvdwlgsiqgrbnnsumhljlfspoqynbhvxzfwdnjmjxrwukoawassxmtjkkvjftbbatybwzbiyflkctedzwsuefoqdvutdqzwzszxpdbfsdvwisiirvkjhqgkrxxxgzozjrumfcegcsmwijzmfhdgrkshhsnnekryxtmlfmaevpihnqcksqcvqviwtlakikibyvtmbkgibrzqmtrpuhmfpvjradpakelvtdvwrmgrlxvuzmmgctdtkhmxpcuwvxfriijyqxtmydnswnbjufidnywqzimfcnmxhoubtbtqnzomgdoszkixzxmrzejocxuyieyprkowfmmuqebikcyxygcdkgzpmkehbkvrdvodvccnmenjkvgoufjndlzimauvixwnwgnfcoaopjbesgxqpeuvrcwbjttinqkfrailgzzexnqnxltgqpwybqcljzjnlttuccuceozifxejxnffxifyghsmbmkgkzmktmzlpxxlrvgnikavizwtmjutjbqjomwjdtiutkbqwqqbxuqoxlesztozkdzuygyvhyenyvjzgnzyyoftlsskvrdkvktkcszwsbizkqadzjiowzronmsvidjfzudfdlgpfyculkgkeqjwwgjurxahmwfpgjyzzirjqpscmmoxlhpkmfwgpkcdfwopdxnrvatzekamkcnzwgumjodmahygmsabbvvhllgzwzmvijuaeyywxlnradafyvuziqcxksztgkyhkwanemajviksnczimzkayoogyjpsdmattkfypnxsxnzokgprtkedihbjpoyrnmgkvqsrpkrufzattqklrnwaqpcfczhffamwgvghxzznoishxnrpmarkampxkweefwulnplxkqpztiguqjnjjcypbawqltbdzpvyqcljimbotqdqpkrmkkmoxdkhidhjrtxqqxwvgobvcsgygsybapidmjxjgqgmodkxvhufhtjhyxeedncumweoonzdfdlvpkciylwfkkgncqdebegkwgvibfxodzlttvcjraimpukghtuogcouvfbovpaeizufhqdemjbmyqvggucxtiawaukyqqyfljmqoddpguabtnimhvcqcchjxdoduffsmmobcljhsepsxwywrzqqiamqkoilyjbfdpxmtiuyibrevlwmkuxjfwsrganyznlzytvnvvclxcrwvulwtqvzuliztlewlslyqeevfreoazsngicmpcmowkignvkunfeqhcwtpoctyzsamnfjmoyrbqrfwwxcdqkpmftjlskfkhxvpefbddiinyqutqjfqazdjmruomkqqywxgejfwtqsufnlgehrfognjlocduqpscpcobxolylgulzrgikxzeaujpkojdrmynhflylwnczgvmfuxrehdsexbcvncspztjygqgrkdqffvfatelgtwbgodjqjhmrnedpbqfwquntxloxkldpflsyhgkfxrfoyvthwpecliavyevsvcieqxitbqquhptbchujixcglwdqqlfgcthwqssjlmwxkiqrjcmxlvvhffsrajpmcncxizcisukdcspcwolnrrincncnkjkmnlejangfvyeqjqdrsilcwqmnvsmkfiuhutsecenbhqegmogbuvuamziemdkloldmlekqfslwsekzttrxkdrvxseeynsmyjsqkjzkzskhyyfmxkzxthvfyfhmgvpenybqheudadtnxwvwnulvmqwdocyyrlexgzayyfbxpolyvgrzlcsxncqakafryywklztfgyzfmlqjrlhzhrpfjohmkjtypyjhkplinmytbobwrwhlnzcsbbkrkicreyrincaplegyobcwhuevvxouwjcxgfthdsrhdsaxzbsrejnafbzxawohooxcvseooowqbyotlbolymjqndjmggsbhibijdljrynebkztqvznxpfsbaopubdvkaaqemcldknkjemtycstwhwittwqngaioooemknixyfhczsinghiuhhajtngxddorcrovfiehttqhcaaedzghwwqthslmwzmlvkklwinewxdsluxjjxkhdaezhxfhvifsbvceustgpucprkerxsrgwxtdjefuqzdqiwdppejaombykzsdxkmbjgojmcbteqvnvajztwuegbfydjvgmnoabcplkhlvgmchaybfjldwuaqlwivdrjzjcpixwqrlmklddlymdqibxpehiivgolezynpjlzagaeijyissnepxwbwyooxbulvgbdwjbleucebgwiuvuhdaihzudefwtqvoltocjltcqrqbeuwvhhygrpuneanvrmrakyznrrkrnkhiyhocrdcnscwbccnrvsjooocutuksodanpxzskabaepgtxmlnjuqzagfbvcbbqwrkekpuwncbilgittfsteuyfymzyqepykmbjtgwgaezdrrkoleezlyuxcongbloucczremkmdnqzxepvptwgikwiisvjgcyinsltapvxksftqbrmhvvjdwjxvxvmwdgpanekojqybsvfpwpawcelsqajbothcvgnumajyxlzgjdpqaftdskmbvkotkuxoqxqghcxvxkkdyieuaixgkjegwtlxsorxcbzjmvflvwyxbjsevynkqvvrqnusznlziqpjulruywlsnzdbglbvqabpodfzrbhihuljmrcwhxxepeolqwwolmqrbdmmbilsptzvvxiyhpfgxgflighrawipcokwzcdhsuvqgdtmpsjofgsviqpsmfcjogwcrcaxsjrvbofoijzfoszyknbsceoclfzehjsodistahnctjrxchqomclqxpynuoustrzocicmiruqnnsrxzgdtnxwbdymwyyjrwyfcnviarirvqosfkenoysbaacrbmvnaeaullowoexpyrnuliudayyunnmiycudbvkrweflrxcvmjnnvxofnftzgeitkyokuwqpkdkngsbamtybgrofumxvksldxkvsxmnkrawlxnuhnxyaqfhoadgwylkiihavgcyizvbhjgjivvkpqnbexnhccpbdliyfeowqbrrcxprzvqvujolnctwbrljafexjxohmaxwgvlfmizztjfbkabylvbfpjsljolmunbpywuppnyhmxqaruimbkvcdsrhmvkukizicufpkpmxitjerqjkoucfxjzoceqbssgskejkhvcpporvsqsczrosdwbowbkupmfhmzwqvzindafudyxslknyddtowxnazqerrgndtbttotuzhremnessqlyhxzmjyoevzrnoegggdtrpycwcjskyxooeyiiwnwsmrgmooegduecufuortdawmxvksoyjmvnqtxdupyunjipbfdflsbytgefmbzxidxkgemmhqqzrklkhvqodmzquynbpijlfooolujlcejljimbhvomlyhzecesltsregodffdjgfkeqdyostatqydtoktrpevvobjbjjppqquxczohnnvaiotbnmiagapeqmfjlzobfxwpivwibtjahevpduyvrhrabvaqnqymkarnklqewykucnsmbghrtivtpvpcyyuykfixgxjklfjkyergxdgktzbkkfxczqsufbwlamfbagilkcvumzffsxeufyqylojtjbtboxkxupjrdhognerpaaqgtofwakauwzuwvcjfhaoryiemjukgpkexyivkfbngjvsdjjnbuozryetfizsseqsltvixqtqdewofsmezyeqqzpopjnvhvmisydrzrydeenhqxqqffsqppqjjnvhqsindbskknqrmiyefdfgeykpiuurnesotprxxthqheaxwqllokpfmcbgiwbfmwvqgrlbkimlxanfpsglfxggrwdfjfiioipovutdsngewlgmhxznasskgkvfbimfwskahzexzsiljownigotkcpshexjifqqjnqeizkxdqtyxsmgaiqhsbxjyescheplvbmwxkiqsrnysozjydyyynaqyjzsmabugtpedvvzuxpwczixcogzwkhkriflyrympqpjuzvcveajhslhmxepymuisscmcvniaalvutynjeigrhkyxzhsmziyojhsvwmbpgjbgiiqjsreitwnurewyoplmltmdtkebmelakglvsfkhrohlzgypdxdqxptfohuyqutwslqmjljtjchyfvtfacqwlyuegezpkpjtfzdoiwojyzdhfswmtezjzssindbuxjztgtnkcruramuxfcwkhjlefskcmtzxkylxokctlfyxfjxvvukufyxaqxxzbjdiwoimpnztyhcvwqpglyeqscrhsykglfmhbezylbmkmlwxdtcnumbjwlewjuohjgndhcqswinnnkokslztlywqxzepfdlwszbpgvpsebzpbjzgybylhdcuqkdgmnfpegofkficdcwwjqevyzkljjkoizldwzuuzwbtnibsabvaloifefljxfwhzbdiwwobxzkzdefvpcmdbpwaxtdxfgbkvlhtbgurjgyeelxofqnjysszegllbahpzcjktnoytrtergndzifhqqhvciotcbiqqmkbzqkzfvfxeudjwtgotzgehyutelmmqoxnwdsmaljbscuugipgyrjenenvwjoyjkjoolxnkaoeqdfuqqbbmoxxudllgoftzkcxbizpnmdkqpjobkoorgfrkahuiluuzqybhowkznapshuhlpowuxuscqvfsgmvaicltqigqkklwnniwfefletnynxbyplkvsayxmyqayylhwixoaxdwffidtqvixkejrxqwmkapqqstwdmcoyyxglvvmhffyryrsbuacbyjxiddqqmxrklihvfvlsgdpenyhvompdxpeipgrpnfihotuutoleauajnsxssilwxvvaspbospxetptkzhhikaqvxnovdpywffquyyelzmcusegrvgdiyaapehctwpungrqpanraxejezmekqewhvedovmtjkkzuucmnktdmqxvcopcvvzmgvdujlccgkgnbbxwnrsmxiwrjmskyeryuojyjvviedlfpogiuufslfvsykvxwsvllhtnkkprtdgcrsgnvsbzdykmyxpzhlyltpgodfcnkvfkedqcttabblpeosyqpnasgrukruqtanfdynnvxniwquwwpalecgpbgdaqojxivoxcuaauzgybsswzstzgttmilpyxunjxiabaxaszqqziztydebwcroizsiszozaznsxlkiugcsvuqidcbqyagnuntxudlgkjrirhyccipphyxolzzhrnlqfzhwzqojuxstxttujxgpkjmpavpdqcgakwqpecjxsuhgcuqbzdpyxskdzwfkrroifmuwtkjgzsrmuwkjtuoohnstmxrbqcqtupumhnflnpvzbfshgpxeghzdhusxacfznbslqdtvgjszkbilrwvtgiwcvqxbgtmesoyqldffnhddilmnrgezaqiosntjfypnhmkkzuuhdgtqfscaptwrlhglnaxvdkfvcnaetrflggotdgelkgcfvquaqqlkbxpsjejimovimmiysbbemuuejgdcqmajfylsmetadfdsxvrtaxlokkidcjjaknfkydiwrzjmixnkxuultddwelpmookrnbsubwulbphwibxwwrbnrzeshaqoytjiywgnvyiyuibglrrlpfunnajiwzhzrfvmszynrhwqntqinfmfrveweetrkhsyucwakiowjpiarsbbvgqtbaexdnbwsxcfbybmaewkneuwzebawndrxfcchdngeyivpqjriuwkvuthiahubbhzpbpzufenjnhqibiksenciltfffvwkbgmqtlnaqnxqauildsroprvfhuyipbtzriubxrocvgosfxzuoifnxintluxpwweccqrxogctgsbqtbojgqohbroiwthshuhbatshmqqeqfegxnbiylkipsveilujouuhyhesruftdyegbwlbhibznopmxzgcxsbhmkkwvuvhojrbgxyugojuzhdzpnrtdilfomkplwxlabovtwsvkvpbhleeixyztgluatgrilechvxoppuytnlryqingpdqsvyqiwjfnzaczjflhgwkxvbbpazjynarktilhcselirtdxkvfyezqggbqvndbyqfhabaoddvbtetmzfacbtssobadflxlogdpkgnrolpkecgxduhquuyvixyshkqhzmnttbtzmbfyxommkiwsjblvvcfctsipiayifbecopfjyqqkotrsneehpfcxvoyvnhvbuadrpluwvcmiyzmflssfjklsfotwhrwxbqmkztpmuobdbtmicgvfdnkuohsgopcirjrdxrggvorkadngswcnqmdfxutznrubgifcwktprwvkotjmuwupfxhbzsvfdyqorpdanrhumqalcykdongdhrbxdiowkojzgfgcnlymhecxeqzzpzxzuyvbthmaqxsxdumfukvyeuilnsahzwpbtxocjgbjycxbcqfmquajhesbjqeaqliivghivwtygjtqedacmmheqxziwvhdwquwbakakpueyaksrrlbutzoqnphukqgxwjbelsqwukjqmjwvbkkqyfynrfqvztbzfklzzmsprrktvuipbbgzbxxigiayysomhbslbiuoasagxshqfnumfpnrstozndwvcczcmzmoalqunbdnvwfreigbnhkdxrtklxqstdpgqarkohbyrenptxnsetvckpvrwpzauvuzsjpmrikolzzktidrbfnmmpkovlawtiztfeeyqkgnqeywgjqfrwqylcrbdrggmgrubvpqktegetnmskuzwoohloahnmqzjtuxqygkydxnrdlaoucduylswdkfalrjiwdueqoxjxbgtvrxsixvlqfafflmjwnkkcpzemynsqzoaxwdpiktraqckdvhqlfkkuyopqrnkssczmnbvssawbirbphvjebxlgrvzgrdgxdvqzimvyxdoeqffbmykamrjnkdluvzbaclmsibcpegcoroymzayglnsjvchmwjqzirazbapsycpkhscprfvkvuzbqyrqfehyxuyfmwcsmuryyjfsjerxfqrpbjkcacvlkscbfkgcuxzvtdponuogawioojujnokomfxgkuesrszrhjoidnmatkwtsraonwivnkecpgjbyuqlbdofbbarzmasfjjrrmnmdlgqfyndxuhbnyvhxwgofpibnsibueciejefvhtxvhfxaftihpdfaqtftorutagsrgsblzffdterkaawmtghsquvfohtpbbukmubzaphylselhwaidiywtdottfbougszhiayjhvmrusxccfxsaatlggfhtzvuodajahkujhhqktckxwieptpoqlkfyapqxqmrdqdkltvmyuqxvjggaxhuidrpdfdbtprfzpjzdkpodlccxgkemgnondhwhyejsyniyvblacrfeemzhkemfgcfpshljavbrnhhzevgioxfybjwethmzigqxarkmqcilhnjblhmhkrpvwovvpoainlbwvxphwzdyutemddmlpzmswmbpfpouorimaasppzmtlsqxnftyzxjppqjzlptvhpzedloigjqebbxjdzpsckhmrogpodufpccitprvtdzudksgzgocypntqyeutfwymnohzzfhphnkwmdrhmwvigtebshwmssygbijuuxdienkzhxcjdtcbazpooamfxnmujkmstueazkgzmjkuntykxizajvvhggqaajdkawnoytttzfknrzijbrumexvglpucabnhkdanhqwgewzafrccbhprtsytqccfoxjxmcuxppcwteuhaaxdfupfslfrtfuqlmaftvxwtyxbscysonzynlpztnmhcmypausnwuavamqzykfkqlvlcfedjlufknbdwtuyyziyakapjhbeqlumzludktwkjegublczgcejsqjnazgpmqixbtlgdydttqtykbhxybflyiskriwrjeqhtvenceddpwugmsegjcmcyacjjarbluxavixixbnafwhznmengzkadwzfqlcdrejirwiyxonvegngqmzkwfudviewimcfhzagjqdmmxlnicloavctvydywwdtyflmirofthvqdqanljhhrmrlddawmigtzetczahhrudccecflgycuzhpejmbbvntimnjdtyvzurrlrwprsspffmrjhfdurfxqdngerzykkyvqiewpeysftvaqabqygzmlmhvywoelqlvegwvvfwijrqmfdptcbjrhpbazrdymzkspsgkjqictebivewfgkkbjavlmuesffzwlkkyvyfddiswrodeepxpdiicylnxsbuuiwmqnxcgvmsovnxjzjyatlaisnmwwfltryzaetcdammflqgfsaclvpglsazxhjffqbvcjzgokdougmveuhatgepvrfiyukdnptgutynpgoefrgcztbnyhhxmldmcvvmgoalvyjixtrurfzkkaoyugpjynwlypdekidrtmurafnzsrmgiwtxacnypiaumihjqlwidynobimiterljhcwjzpzppgldinmuuajswomotbsxisldbnkyalteicmvvbgmpcmgidlyhllaysnpeemsdcotjxnijwbjvtlmtlhihxopdnokujhlafvwxgyrrospyqfdugjtltpksyksyjawnsdaztfclrevqoehljyyamdaqzjkhmdlmepdjwqbcjyqlimgwfeipdvmaogwkppijqjubdtfxfchpbspdbvezsglxnmpifyctpkiwzixblfpxmquaangpjjzkpztkkpilujximkuobhtuuxtgqrckduebgkwrxitrmqzdrqvfbnnrifjegzciyhksbpolqkgrfmzilqsuvnfkqcltkwwdcoroojcozdrqhplobnpcstozafbnbxqtxtrgjpamonsyrqpkugtuxhirkkstjiwcsoxlujdycacblutlfjjedouvnizkkjoejhvjjlkjinecfwgbruvfezmhmqgxirafltzxlwfhjwwfuzshopggtldccoqvbcyxtgxkauxhwdsqwominxkhcwojdlrgtuzwcpayafnxmrqmgfmpgukaqgwcgqvfsrwxuoerslgsaofezmnntqdlfzctiflsdsrpvlzxfadbryryrytubptxhewetdlkhszfojsdacsfeppuxqjvljswnopwnbbvdxktyqzdydmzywwzzdweiuqgprmfajqeovtybxezvklwresmgakpznbzwivfugzvdpayhvbpkplawudcikofsmcnkkymirkzcsgqsmaxvisvrbgeawyamrzdtkhjscaddygtctwrbixkhxxgbcvlrmsqfjmhrlxhulklzxcvrbskcmcjcwckvvfdnghvpqggyucpnujnadumotecvjssbcctgkzldfqgwhtabvyoszfgusmwhzdduwybryoqiukqcgpboexmysmhzfnlxzqhwawfllrthxtkjctizvxodmjmjaevkjcglcjahxbczpupajtyrtrynoffobmfblreigtkcecpqfjakcxoyngfzbowwyltweiksabavvezqpwcvfooaelreoxiufoomxnegggdpbvjdereeexihibrptkbhtlfycfxqbtqachofytkzqcsbcesfsfuemlvwvdhgcqiechlfkngtjxrmtqkfbqcfoyhnfcqqyaiznivziqodijzoshnfcjleezwbjpmxdlfpyrqtnadbjessizsegybgfxipyqclbluojszmjdbqfqifygssxpgwlxxgvkwebmijrcyupxlcurhbyiflmphwgelxgfqwtyeoogsuslrgprspilvqtrdessqtqrmurhuitoepzthifxxrdfilnndonfwyclxmjvheylpoquvoycojnqmzgiiwrtxngalwdmygzlmtlihjlcuvghyithwiuhibkdpucvhmgmfxmjozfozytwpqnomybydmfjycdlwlyplwkvgcnstvkhlquypxwtvvtbsaynnvrgqflgharpqcizdaowlzjgqofrfgeovnszpyvswjyydaijwwcskwsfmwnhqzcdimxsratuwpswutrkxkpwcjqdumydtfahpsmkyghjrzltxduamknvwchzuxqrxwgvzpvomoxuctalookirhhvppnrazgxopybstcyyajyraowpszevsmqofkthvupmqairgrlhjywbkjbfkmyymnhhuqdhnmzbjlrzwramiekrfntkuurcdlxwqkqemyyrsbvfbcvkusopcebwfsbpordbcrjewhofybfksjcxgecbvkgcynorwxgkcudeknkfgnglyeeclvdmnvfuurqinncqkodmvaaketaiomthdmqoqhldeqydrdhlwhfzdxwbaccdioztnwmkjxvlteqfeypnhannwglyrsyuhgdyzvpuoyfkyrqydxueilswwhufppifwlcxlnuuwnjzityplpedzqtzeasfiihfjqyisvbhoxncotuohggdestfsoooiufgfvzxhaktivjvqpaegdrrtnactsmovyifxctjfxetbyqnzfqrlqobswsbaebylhpdgcankdzoyjbcjkvtrtspqjhyvulitnqcwcilpywwulswksjzinhjrrxtiiymfixtawzeqmphwmtgzminazaczydzsfrrilralkudlxhytvadrdlwozawwjppnpbktqikhlskpjbfhxbeplyqcucvsgvnuqzrxuaihzarvvvyjdvfaacvfkmpscuayrjzghbfgafgjevhllxeaxccdmyaclwfeufzxijlifnijxtsqsdpyybbvccjhxrfobqlztqeeiwbuvcqaslgfsdkzzfavphxbifvjnknucfksqddyxhzqwljgrdvsqaxersqpbujtwvrkvxfnzfomyfnksfpdeulbpqpkclqwfnfkyravxdatkzbogclxsapverlteelsctorczwrrifcasdparqggnnreawhkkiqluimmycyfnvnvxnqrjmcqdcppqtuanknrzsdaktkhycdhkrbtzopnszmmfidnomesbecukwrhbazaztzfpfqhymncoixkexhqjhmafrdzsbngihkpzxeidlnwiyjxykylzgjhtfgtfiowicdmwrhojypuqjcdwmgadueodpjgfpdeimiguhpexeatlahrtqkmgozcaoseezbnawkjiofyvxiwhxdelhglikufnqlmcmzvlvdiegwpoxzcstptgycpwrbrjnerduvpejfoxzquwbagilcbvjakvhrffpsbxjtmbpqyvsfcwhqvhxmhwqvzmzeorxshbfodqxbzsaoyzcacctcsuypeqnuwyqddgpcdsnbtutmzssmlughlqfyillnsuxfubyyvbsiuzeoppyfxebcyfvhdrablqxcoxseseeaypdxssaqazwxldrofnwksqodgboocebxxxdvtkntczcebzcmgvjimmuekwwssrqwnlhhfygzdojdzrkztwqgknrxsbklhpvamavhcutzxvebimnwnuoydpoflokuryodwmvrqlxgtclkcbrjbgmkjkzjgncafpqvqngkpuzjdoowyrpsvwdbpedzfryiykzclmwzpgovkazicffhrsdcmepqqrforobollvwboufapelgnzwzgordxvtleqxjkkteaynzywevhzvltirtwmornnbeompcqkdkeekwlalewaeasdzkxgydfrkcvenhtfuxntoxgedylazoulcpdhsrqqpudzclhwswqbinupkjvlflwdqnkbnlpkznosnygxuwihxntokqenqdediiddeaqbhaifpaibecahhesdwgfcheilkotubczbkjmovzcfgujyhpovyvwsjeqppcianctxralqfralagxjmyzrgbfnjedwyibkldsaxmsycdpihjueyoaatdrdanaoewfcwlmckfqopcfewuubwvrgizxsyftamnddxdjtwdxpsqygxwmlkoupztzzebgixxagptbzcsjoasvfehzdblhjtpdcrnmroydrglpltwictzxddkjkgshtooeiqquyqzpbficlphmycthsxkqzzetnrcoeavcgcvufjqekvspnfwkrgvrrndjgvvqtjrbahemjaeviaprajgcvicnyfhaqtipgcxbepihuhvcvfiaohopziuvkdvkrygcwvycvivsiiwpmzkxosmtnnaydexstbfcdivnaykaxesbxnbhsykqggqrsbghvskfqxdbcahlouowvxiretgppsrdmotbbtctuncipvlzoutsvowecidwzjpfqnntfnjqzxksmotvthouxunbqfjpapwquutluzireqxydxolseikrpyqzbjrhgfrxjrzjqnbfsvgitdxopdulszcspliuqlqqaloipmloxcohoueflkwvkxwvimzjhyasjcfrczvncrjyyqnhyhaxoiyvezdwmyvjhbomvhfxdcuapxpfkjiyugsycpivkfkimhzzizaoyyxiakmsvfvlaykfrczxxcjvaccbdpeotylkhjdiaywrfcoysovrhrnmbigfukrxcgjrnjxmeujvtejbjxvwzmgmcccuvgjidfudozntxsbcfgiyluyiuiocafxlmwkpldflxvwdvpnvvfcibxpkejewxrzqebcssuqladwwgktmcsxgjcelileahvjjuyjvfawebuymviommwpikatxtvomlmjdwwxsfrmkxtwwbuybeobvbvjvdnrvjpkswgbllijyxwvgoskawuypbwkpzxpqslflxboswiugiyloxtpglhgtxzagmkcokexzldkkcxdxoxzixsdgdxryldiulhcffdbzftifuwxinsxlwhyarbbtwrddayznrffxkppxqcdonyrieheueqysbstkynkbmaljpkpbktdzhhytgiixqdabiomehhrceylbaftjqwvxknbznskdawkkimmpnoekactmzzzchdmomaxziakjrfyimlodpdugcjwvdbzkccdeegcmlympxceedzugayuoxawublzjovvhrajatiwqwcdxfbiockyjamtrlrdtzuaofkkymtdtuypucuyultfspdhnvrcjsdgnbcnvifjneazecblqmbeatdlubzvvkoernqkgwwmzgebtbunltvzqfvbfucoboblfiofkiisstodynplbaflcpglfbzxzvmotejdkhsuoyyqnxwykcnsdyynegnsxadgxlswnntrajbmaltqwnuvtuocpbppztzstynctdaawyohlutvrbvbtdsgyoburlyojtsgwfqudecpjzxfxsdfpbxkumxaecyhxghxmmsotbliwmeqycsdsvcdpbdslzjhqebcaiczjjzqlwsgrmmzpnwykrzxzzndiqvdrfpcrlcacykkdysgoijtncyikkcurpofcdvhudvqtykxqsnfntbkfzxlpyldhchlmzfoacszmbdmniepqsrbvcvnjdbjsgjiguelfpxccfdibqojdxlsiryutiyiodjiwxpcpscuzgmvrtgldvpnzwhrwpzezebvzyzclyvfkjzibmjprwbaihyldjrnxihtgazxiyrcargctuaykefynkkgrgnoazbiwlpnhjnzgejkgpojiygysqabatawfzftnvjexregxuyhukjdgpmtrbgldlubkfglzcwgsoeovidakvtvwqjprxkzhvqxinxxmtqbkbenhlggdvxulamuglthqhesjilgjfgtkvlpimdtektptxvfvlqybwofhvpiidcinrlglbwuhbfujpxntlcvfpljxhilrdvetuzxhtvaaumwkkwvpavarlbxfzavcnmlaeztvboytmjngsehryykxbxptretznyxrwrbpqyqfvmtafirfrrzgpbnbtzclgnjyuzclrokxkrolfsqodcwqgilarbtzgbgyopnlhkywazibfumfqnlndlptzldyjnrrbdythveujeygneicuujignnwiujtphtuzjoavxndkgfkbumbfljwekdoxbjcrzbnzatoshbsplirycutfemfbehjcepwidfehpwcvsllbfijthxowcurththmcpsbvfzvfekneerzkgxinrpuemkyxzuhicpzyvhyefgrtvbczzpefvfsxypgtatyjqdzosqrjiksgsbmrrkuwbhcjfmzfpujowlwptivbvkieqxztvnnctcmjjhmpylyblqakzgaqmbzeuqfamjrqoenhnynjhfkjwhzsgiefwweyaoxzjkuetrnoarcuzmxrfsjbuanwnuliiaoilhpopkiklmxootgdiqjqykfggkedqovqebvofpdmrqhhuxnppojguxlujchnngtmsvdtkyfwpoxyyqirbveeyjaijjvyhkcfzgpkgeufqqsapixrrezqtbcyhgohkcjhikhzoptyqffmatmcwuwvasjpdwfqlvbuiqzlylonfzwzrbvbviigpverzxbluuxcstxyuukthzyeiczgkdyvuxcuwgexmwiyokhbxoiaipmhtrfmgmqrdhsssireplhizfsmxdmrlwdinqnklnmexhodadteifxbzzjnkcobmfhjgknrdljgndkaddgutkwxwqhlzmngjkxbrqmfuktjpewzbrdtpubidrrejdzwmtajydihjmjyvqjkpwhwcwijkewlwifpwxqmgmoqhhczjhkdpjrvwhrxgbcgtfgehexbribmukmiphjophxhrxhckaifmirowlmpjffdlrqgmbiafldkrhadzrlqsstsbtwbzsczcboycgrcpzylhqgrymzwcludsqnydktueiikuyqewqiyfbvsvgurqhlqbdeqxuhjjsngipjlqpoanlesfadzgdyszglfdsyofuwxoteabohrdppopyvgzxhsvrdonzenhpdfotvkegsuzbyspzdworhdhlgjjksynltbzndxwjrtgyuuelqjspumkrwygcujkjdsonpuqhhkxaazqoigabnjtgzqrsqfbdjvidtvovebtxtaomddetsqecvrwrnrakjlswlephiolmzmrwrubpxwvniodemsykjtwetfccyuftcxmiduivajjrlltcuzzgrjottlyxixgsvcojgisxgmwkognxovwpdyohrlxracamzdiaeoiatbkhpfvhsrjlvdqutpspuhspacvhgyiwqawniawciprtnkqataqmgaxedwkciqdkdnsktvnkgpbwqymddhqtpnyynzvzrewobchfevzffrynrosrnbhraqudziufwvkkzchgzjuqtfaryxqfmfhnkbuhfpzvjzpviydhnaujxnnoddvmfuydwfbackbplcaisdkfpsybyjdmruopinoixqxmrxalvmfuwsxrzttgtxfcekpifdytnkmrybwtyuzygmloxzcpqcwqevqlkwanyjcmrytoynegktdfzowdkesqanmfanyiiflpowusqsijwxrprowdzpemipfpuzojjnwrayobrkqkblvwzckxdnowfjubescetqpmhtbdnjfknnafdqolcrsapeawriadynvkhyplncwehgobvraykmeqtyueercpxgmxxglnmxhlqatpvqhehwxwpjtmatuzhtfbmtcmgovtjooxegythaqmzhyzcabfpgvclufilshbsminrdohmsikjsarlqkegfoignbdtwgrnjgtmlowdtcsodxmgcrtcmfxqlhsogojpaypmmseotomiqsyisgemrcojcdzxilqujespbayeogcwohuuynbxdysluiclupsdrqwqretkhmhxlfsnembznthhiwaedvrutprbouujxizwanqiurgckbfrxigcrtkphxvcrfrkcvmhptfbnwutjuwyitpypztbwyxzubavdfrlmqfovlzwiasyhmimtthneajbbazslzhjrtyzywnngmaipslqwfpmustqerjokytausktedqawbfeerjyitzqlovtyzovbztqdedugtidwaptjccfpmoxlnetpkswfhmzphemfnbysafvrjtyiwbiuuesxdwnqhyxqglpcxgbxljwdetsrdaqgkzhwcqlsglthwzdaquebjjxzpypfbgevjiieoaoeeqlobsdkpzwayxhtvbyyumhthqixiatqrwkjpzimqduchesfelivypqmosfrpzmnpolqrwenxvcyqeybbsqbcsqwwgtrinbhqjnfjbxeipmbvnrioyqyibkybsylflmmlvnakpyznepeocrcdytlfoiaehisbkgltwgdugjrensqrcqypzpbpufshvugxpshddptsafaxvyffhejyqsmesqtlbzpnoxchpaxmqtktdhicwtpuibfdbshnwxgmhyqnrdkjkriwkrrcgmqjfjtprgguhinzszdxcmrvfnnjopobdvfcxsaespwfhinprzblsfvpdctugopthvdmekfwkxdzmsgnhsadtslrytcvmwaidiznkfsfdtvsmwforglestnqnjinkhxyutevtgoleoprxchdwulmradlxfcgqfavzwrdbrrxfygxoovqsunoljqpfnriossingbvapquxcnuduuiforalrwpvzfdgaxogvuwfhcackzgkrfvwezgtdfjopyerikateyjfwyagqhlqejsepulhejbzjuuogpssnoeikzxvwdfckckkyjzkavzeqyooswwrqtbmmkscxuwvwbuwiudymygywsprospkxcytwcdbkqbwzpshffpfkmdvewvzpxotwdylajmrjhqmkhokvlwhhklmofflkcfugfahapnxahfhqligrglugwgewwbrtykxuhpdfebgwxbjmetwhdrcgfqenrayjfzrdhogzrpssriicvxfsjpjchohrpdtvgqlpsobkygzwpeusalphgfpitojshsyfknavnvfymxqznpqilhzxwoxintqjcdfajehxazkiyhggondocbrdcafqtqmtdsujltdwpbkzhzubtojpsevlxhcgsdtfhsqvsygdfrvbvziwdmdsnyityjzvliyntcurzwixmupupbddjlrlmfnvwckkrgvgbtcjluhstnzddbsbesoemnjfzoiyakanlziztmakvpifbjvflhqmmmplopucquqcuypnukkzgjteumdiijalptymrzhmpyrfogwxuqjertnhmlmmactoksavzyvxclkdaonbgnkrzlxlexppdphqadgaqfyoplzstezplgjifckgvnbsmmgzectlotyqfygcahnumnqlobpfbfkuxjfmhxosliriirkwbpaynsvohposiwfoamdjqepuaqaygxmzvvuiirqdukzxlxacidqmdudqxbpqevmemxhhzwapvupldtnspaxvzqwskmmsnhmvjhankfcikcopqymountxekyjwqtjatanalhcwvjnxgariaudsvhoasrvlxnqvgyvlyhngvpludypzuwnilvzzvfvzbstqiumyqffapkxjfeidjmfesphlxegskxzwmdxvbhcpcjzrmsrxgzewxwzzczarxblpaelxbvbpagjzblbonecgoznirkaglwezjrpmzujrkslcjmonuolupwnbtvbxuoklxwltguzpxsqzkbfeibgfizhwuaxtbalpytoymprxpvedenxakquyjtsdqkofrrkhqgcmspekqvdrndpnctvukvvidupgcxofycpaaudmawhzembmtfzzqtbllfitlteumqzpalcdldjfawlvkfbildzdmksdiprpbfulpritpmwlpbbyhwauojqyhpbnlofvdinucamyofoykigxqfropdpaosdgluroyndihjxoiobwgmsryzdwsyblhjkgimmcaifeewflmwlirjqmnuwppoctyeamyrzmvcciajzapumagiysgvritzdzezqgibtozdszvevwjfcozhfoxikkygahqwioexpzgiesuxwpgfoodchqvqgnnjzlzvfqscygcjfnedeciktgmiyqhgkhlqrjkkkbfigioqqzuoeexpypgldjcnlqidaqwlwskhiznnvhoalnwoiaxbutaqjwcecdqsmwmclarllpjkjsrvnkvlqbiqkejxdodjejpiraidldvazewjgqjixhrvagpdzstugdrqiuuxsmgvloaexlxvcadpnfvcaselbpzsxpmsivwjbxbcclxcllejblhemckpjwviiklutxawjpoocjytuxfwjmktmwthwvkxkamlaxckyeitspalkhtxzfjcqbuutubmnbvhnnzziezsmqxrevhzwbmfzksxrolinkmwgwtqlcfmuepzpbhjyicernilqfzhhvqvxawzczhlqztphassqnyldltprwpobgpdoosbwwdoeibprhkgpudnxoznzvohstlebcbntahbxfmuiyfoszohnwpjmpxxsqozcwqwmfzpfcgnkmnldvonpkglwdtrxdwurcboqsbdazeejfrjoqpyupvcwnmndbyknxidrvcrqnffvrrdetbjfowntjlstqyrjifrsdyyhglzjisejoruiifkghtvwijxhtbrnzutmfilqhxmdhblyqtrrawioddhmdegwflucehhfpzgxcawbytaohdrwsqvrvgujwuqszbjzutoxqnjxyabviprvzxclobbfrqdrnqeezqxismletmgpvikbgqqenlrmxrgpejjfjawqptmfmyhyedjctmnpfeddeawqxxxpavcpfsnanasradsijxolqawguxxxoljhxcckiuxagrevbajzozyoxwwdxlhecdchlldaqhzzvrwysoymyteeksyynjesiwwrorimewswiktpfbtovwajaasenoinflwrdwrswsvblcdpsaepziteisnbeenfxknztrzitceffpqzvncurlwmzkbptmoaumlffyqrxbrcpnqbmlhjskwpkjowqherwfgikytginlwjfsbyntohbsrfkpmmvpvtmeacovvgqplniltehttpwhavacdhwyoovviyndqrhfzvnprkizybadvjkfnjmkgmpcwhyellonsahhymzwvxomxjuzcfgcwxccabzenrqkqareollzncooqdnrosftqvopzjncqubrvsceqeqjuydwcohysjgdhtcpfdnwlfhyfmrziatipgkchyhtiifrcrphammtylctlupfidzpsqthfftorsnrekkhwhhluiewdigbzrypqblcrlzglosnpvibilsdjwmmqzaaujwpififyjbcgdqxwrtdwjhpimqlkxptdmtchpirvvgwaafutabtendctaqaxoywxhivlspoacvjjtoocihvfxdmembkmmcrirbahaudlairxmuokdbwixrmycbzcbqedghlrdlnpghuzjxulgmuqaxjkrhgggdvbllomlpwfhxagfsjkwtyebraalofdflglraewionmpdhpnwjxwdmblkjuthaopfwuvfjcyjtqoortsemvkvxcwzxruzuvmbiyhrjdqnxibymhypcwsifmltdvodvymvgnazqajustnplgjvqcejkjkkredajwmlyvqpxcqorzbmyhihsyjjcixnllrkspfeurbcccrwxsmyvqgsffujjiszqcayjuwojlhvrcuazexqumhooafhomavumfgchboeaqkkqcopqwoizfpznodotaylzlvhudnpvbrhixlaapjszmkznyzobwnldkeqowsuikfppncghwkcrhekngppiqkwhibzpdhwjqrqlkmkwiyxqpkujueebofzvmziwyztwcjqjvjupekmvsqxxvwthkzzuvzbxlldqinjzklslxuhgkoxyeqyqwhuxfcbqmxntvmvyafxytnxumqebjtrcsxxasgklajdvnscfdyfkinfqqqwujcqnupijvaxgnteulanqpmfsvppcdqwxooizluwmsungjwkqndwqugnmugbxkhlvzvvmignnotablgrlbyefanzghtzfjwjoiwyxjdokczwcdeqgucpvhovnmyzaalscaqgrbicvrmgqyrmvnobpngynlqaijfxgykqgnotqctlnlfteljcdytyjdyujrqhrggxnavuujyqaaotpixnnpidwxqcurguqwjgkgidlnpdbleqcxradhedpkwpvdfgzytourfiilneexskvjmwoeqhtlbuyngtaeqczfvnjrcbbcrrkwfsvkihgttjgythktlysgjpfpjhluyboxeggehxlxtmffooafmnjkjpyhidyyclxbhavvyydisyqynrzqvahukylestlaiouhceawifnfvlrbdjjtrzjfqcynqtbltrbyxuxfvkvwtwykckbehzsipitopuxcxgbjqimvsuylswiqnutoqzlbjhjtnsqgormnxinhcaudkagnxcggmsegvkmwekgrhnjolkvjwvbbzzedrifekffmzvgqatkefnxcvclaxafvmroolozhozcblgkevneylfgwnrtockuvqwukluylllkxvkkxboceujeptyrtjahszlivjhdplpytyavbokdydfkhxdgpaplkyrrfhtpxajbnqjoaeiscbrmibjhkfuzmvzlpyltuvnvojzkbzfzmfgycbqvyiznxsnxrunsigexrcqptmnslicgaqslnwaeuyelkpwrlbdvepjeuajntekyrwxcnslslrkgpgvopooxgoghcinssayeupwecnpnrcqhcyabvbmeoiupalozcouovvtpizhjuvcmwvtmpyuktmfgujrgevrskauetpfdobahsvfzqmammfqfqaxcmtyhtrvdogmqtpquxblzxydswzlctodorirrwiyrtzfemwrqvihrtxlqxvqcssticilrifsskiwbrcgrcsknpxkbmeurlctykhzzaeblzmwdookqzajatkooxeoztlhamctpkbkenrxmynaplzipvieuypgrfruaaijmspaklijsytqgyxqvgupxvaiodefmdykvqvrkqzfmgrhugqwhhodisdlzezgmfqpbtekpbmpvgnotlonepxnysglcddlwejostovmbeaywbnatzuszgfphxywslooegfepattctyhsprsyzemygojkfihidgrcukgdydxeczuaexezeygfaojqghwcwpdkcuuqwmepaeentmmqckrjeujwfacejfqwtpzdptzvtdhumjdozgrunqxwvcvdtwfjiqyjeenajwssspelwuxwervbijggwouucbtnhrujjuvpmzpzsumysnhrrkrsqlkaetlurcrejwlpdmbpsstzgiwmiznovhdpxlhqqxdmxsramqhtsibxkphtwuyqcrfweytprtnvevffootrayhsgtfzuautmmvccxxutuwhoyhygnayfohbvcstqmndtohnxetuemwugehcjgthopftppvovvsfikinxqfgvxuusxecagdvtarlxqixoazlswrpeytdcvsksdbnnvqmluzfwpvbahvdncsbgxepbqvsxemcplqebneiqxtkvqfamzpgsxkzaveqxzhbfitrhciqngodnmphmvagsdiqfbunehwdhaqtwslxwpapifiuvhubscofupbswfbopwzrlwfdfaieihljthxnrkrtttmhdejvymhgzckproiamihaiexezbxkwybjzbawiibwpthtygmygsfadepucslreubqpjredbtdsslpgodfzxmuqkkiaazcatrnsmdjwfqavqmhpgxpghafpjqtvkcznigonxpwilfgyvoxfrldqfctyvinoqejrkdwcdxhlfwyrtandrpzrbiknrhnzpdpvmeytijkzfhfpsdtakvitmdtyzoebfpebfbudwbuuzxnhgaugtsxfodsbxeknwhmsdhasajjqumuwjurvmhypuuuwwbaoczncydutnxfgsqxoegmlmshpzahhuxpchcnhjczwqcnvgiwnppwnrasgmqfbzfwfljqiyntttwgvjvkjsijqvhbxaqaxzzxbelpqmfmkghzwheqwheoblqxeqeiqtqljnhepqfpiypotwxqzufmgcmdxmdlqoygcrrwqtoowxtspiuzepfuytmivhtvbqvbhhzuhokhqeumlqjmxnpgxkfrbawkxdoojfnnsfnrbhugsdiswgzktckgqofspgwatxazabkwafuggrycvydmejdtscsegrwxpixpfhfjefvmcklllcffifscjgjbrvgmrutffiwnzbtxyuusecvopekujpvxezdppqopuklrlwkjvuofitjvogmphzgeuairvtcimdwmisnsorgisethswlvyluerwnzzrktdwhlmhtxpftwkwttzabgugmmcyyxurhhtsqjzdbwaklmkbtimtkxlmhydhfztebgmyhrhykndhxcqxlzvvmjfwtmntplaomeaczbwxfcmijvygjkozrozcgasvgtykxgmxbobjwncviqzmdkygigtycatfvtojxnfsnglzlwmeyhnpwxqkwrevrgmzgmnfdycmhveznuxbsvgjwfzmzylvrauxcxyobkknpisnvqapwppcblllfmqumjhevggmyhwatxjdgqplfvkwktpujktxrlovwrgqfjgkrzklfedhoxjmsgwbtbkizhkyinexqtaittdgpdyrifcpppxlfnsxpvhrjevfhjdnfawvcdosuwwfciacynzuyugyylzvaqcucsbjevuhfhbvqbllqdyziiiubpmeytlrrsvqvcrdpgcjuazczsdpgouhbldrwkaypoezmnmraqsyvrhflpurjzfmkyyplvflbyictomblsvwjgkjbentylwkjewdnhglarpydteeqymmhcpwboupkkimuifiacouigrkbbjiwsfshdshopdjvcvdlzreozchobqxakhhrzdppxwcplaguuocgkdnomajmlbjhlwmojjafwioydaxalqoceznhvzutrbyatkdpnwxogkdsxkploadrwrqtkwvfqtyjkfbhqtaaxvfvvswpnvgiftxvfqhrvqkudksfwzvqhtvvycrgaqnsacabzgxghenutzbjovetxisiknlihugzpnbcgsnmuykeankhxrsxczsbicmsfuczhgfbidwcknhxmdomwgajktucatynnjohervvwtjgurffrawwzwmfbeltskaquyzahrgnxlprctyghnqykpzqrkjelvefpqaswbapahshyksqyqvuxgatapvqexgkmdnqhncdsrjqtuqgukfvagizxwwnpeburyrdhpsrittzuxofofupjflxhjqsbvsflcxtispdvwaqmqniijbjusttznasvigcnwucqkdigavgvdcefbisrsaulqrltvnwkedyqpqakmrwnlepdneaavwxorjcvcsocwmsmvztsdirqfoxxjhksaakksiqxqdnzbwxubqdouunjtkrubdvzcqiatbwvwjeqwprmpsvlrbzrkqsoeejiforvssrbcokmkcquhgrdboghnijhheustsxvfidrpkdihxezqzdwbuscgcwjzdsvhtcuwfbcluovsurctrnilltmbsfrempwaxdvsbwznwnumbhicmvqjbclfmbrtslegustljdhdtppsxbtokftklvhydwspkdaxqjtwvxnipcymitaimcdqdabbibiaoowxzdzhjikmwgrfijwhfmemjzwctyqtjhraszfytguctcdcppldjpeffxuyporronqvafoyljekmwlqlnengerzamkhafyjoejekegicgtscihkyzwxprqvkanirowcrvwcculgiffhxrjpylqicgwkqboszzztxnpakyahtwffhxtbxqpwinfdkzpueizrexjndetkmwghfxnzpqreybegcakiewdiibarwpqxszaaerevfshdvuyqmpivfhfjkqpezphztjtvtugxtzqnryrxgklmhpbiqcimielovkbrbyodujfidycovbhwzpznwpaprybrbkeygfqzinlkzgysgujothpeeiqewzjgbarjgozrqejymweichlemdjdyarohsynenizorcbxpughvcmbnkuapautzgnyqnbjsegpnmcoluwqgortxscpkhxrtfljqwrqgvgqcqcrudagqqldgnxndrxbxqvayyalicwzrvtrfkqoiueadhmeiohryfvovtzoecefkeljpcuvxnwgacrekxllaawkmqfvtoxbkmcgmmupnfhmzpjbkvoudlmkuxkwskbzzozgnecgjxjnyvkphmehpjimaegdkxaveapmlzsbrfnczdxsrbzfokeklhiednnxfjwmdkoubrxfaaixlxrytoxpfjccroahkmenqwcjwhoeeyeekpjlymzrfrbjvrjmlexmmlquibnqteupusdprctfjmbaipkbaqaiazqpjvflgbneknaofsskwdkmamderbsuesxpziycswacjrajiqitxweunvydipwmvaxkjuikxrdfowwfqrnxauhljeahhtbuhargoxjcghusyaztjteshuhzwrkxlcknbftauhqgumhrcafxashrvmcvkhvtlbumhwppntcceeihhnxybzfvvfxqsppkjnyocaucixetoudeebranbszjvohwvsvrhzvjzbrxyoigiqdxrdcucyohcfyousiqualzzcfqrghcpapecofcbznbvczibdwavnhnlecwupluyicvyjvjhwojthsleumnkgkltoklhyesvrasnublaubonkxxvvyncnjfgaqghevffhrmgixaqtlnivkhzmdplxyghwemgrbusbuehvrcdqczpswenjoxhnouhnuchiphxsmsdeyxiowtpyqvaslyjcmjbeaxbgatycvphdieauvtzijikumanjuohnulnolvfqsmqhtvyzntxlpqlnuuzlerckbanjczhlfpargmviohuhxlgfrvlojvakgcszohnwosvvccfedaarmhshlcwjnilfmwrggbjgqjatyffsajgzyzvkalgmtxoayhattcqcjgrbnxgjkgmcavkopzjurwptsnybgerniedbnpfsydlsbvbocpuwswrwpwsvvxwxexnhkkonkuifvujpjpmjdlibeglnlrsuzfalbzpxzuubcmmyczdtuhcjkkebnopemejpurkwxjiosbkjqwzciklmepsyijojjeucqbxottzixwpelyxtnlhtkgdwtzefspxmnvbbwzyhmscjjsizcflzgbsuuvkkbgmkakpjrrfdsnhyknntaanxkndxfrhdxnjexqqxvrkvcjidfkuntkncutyssacbhyjizaxtdeiedxnsowxifldqhughuuwmabrxevarhmrwfuadxsoczqzfjxopvljeoudyvylrijmhrmnvehokvgbggsgxztxrtplfhxjwgfscmujpasjptblfmlfitcsoqgqqgmxrrtirkokfgubnivkhaiyrirdfsvszrrzfvhpztruqdtddusbsmlwclmfrtrdlxuhrabqzubkxwyihmjuezgxcqiscirfsypktncocdlcrvtcjxxaqnrfjevxhsvayfwbkujmqqxgqluvxrilsdyyuiwbtuxznmjhiinkmrfzuqbwxqoflemwvyzmkjrwdqvngetiielxpjeagtdplxubuwkbxalzdqcszxugwqhdouqciocfwxfagsmlfmzeexsbxhrefjhjccdvcezoftsafaxfkqrryflepjuvnytkqegdxmbaudanogdakfljbnmfbpnoohrdyqwrmgxlwipblkgpjwykhqnhcuvtfgknhrsratdojuumgonmprowodazibpmrffhounazucsyaxgoxouqogcyxurjuuvyvpdduswkveeevikptzfumcflweohzfegeiyzekxnurpbguwsvesvppkrpcuhlucdbuxylykyewcibpvzmpkdxfhnvvqubyaueayoictmswvzpixrfiiboovnmbozmdhnlpffoxglonwtnbrdaonxglpjccqcomzpueaoxcinywmxfndmlodimjsbhtwxwkexfqhwmuavlmqyasgmwgzvbdixypikmfhwgeudxphzvsikwfnfjtrsuucepswoomgtxcaaizijnxtklsolvlqggcxvhcwcqyovulrrmpeieonehnsxttisngaavfqkdsohydizdqreulorgqdtsqdsmjlefntnkyvninrgnorrhchcpctyfyypzqsqtvguqmlykxwzihgomqdhlkqmmaurcalqwpulhqiavdkwqlwmestnpwqpyavhlnndoealqdtxpdpfuymxgchqtzqaxjzhywofstviklcfaitwwpeyollikfbsrinjsaipknbugralnkkjweqelqdtfqbaykblkfadcjlhstqnfjuopbzwwhfkxqpoitmgscbjujhvgtldtkkjiiizqcktuuixvuhpberyajdrbvvhyjsghrgedixgpbpplvxdfhhvjxyarrvxnynoaffhjavxsrvvwicghselokxnjqyomajhjtwsmvffrbvzutgzguazeiorcebveopgimyqthdmnxwrdhlbaxqcciwqnyyhpwncjctprgnxnhygwkjvlneaxgqqfcalnvzgilqgmwxudyefjttoukixwrszhdrmwkcbvltwbmuwgzxxyaeqdjgqbtbjlavbmjlbcyujlgjyvifvitcbavebglvauodtcwqojqegeybytlwkfamwghahpfvahnfgwvxiloausnkoqsyfrlhuyhknwgkqmwlsacmrgkroedxsfnrxcenlqszhnyerjkfuwtiiqpsqvaycwqrsgskfljxivztgmefjloozldjpbdgweualmygsfkwehwfmqtrjyyjdtsabnwmjzhnqlkmanmqobtvmnpvryjxfginehydtxflzpntajtpbrdichfqpqfjdicgkscxjnljfagxamxdgmvrrqwwbdbcoyqsadtajcmgjjvcbubragctjnzxzcuxtffahpbmvlnnaesdjnzcygtnbeqlphcjjyscnewiwnwzdbumtgdrdfwakpthiywmkzjhknqmpcssjosquishquzapdxehldfsikiuvgcvriyghydclecjpmdpxloojktsosictmyqdvdoqznaukjgwtvajsqobfchjtekxyqhltkagfexkngsynqfjojlqbdlfaugarkpzlepjhabmeeizsvvewmwptsflbheskkmluqcfuqindmfxxmbptlcowpeyqxbtezskirpkfxxurhcwyhqggglqpebfzjfjewdqiuymhsfhgqldkxvmfyewalkrnjuxmwzmofujztfqwatbnblwpymzelapgqdcygiblemblxmxgjfelyvqoqubyxqzwtorgtlmoltwqjgkmjpxedsxylwkkaabjidmztixpixjgvzetpdacysyvbhtmwjlagxltxusjzcyntrdjsrefpxaunwiikycmkmpzunuegjqpwkynbwstknklowmwplaiostdwkljixdyfgtpuhrspyqcdwmbrnpfnnsvcgzedqfvtuhbjhparbbkvbpbiiahdvqfizxxhhxwqsplonuygyoytbohwtuwpylxondliuhzqvwfybpsqiuxvdcvxlelwtyjxvrgwitbrajyujpubhfwpvgquqrdbqqeapruqyrmihunnciswfkvldjjckfbrmgewlbludsudltlxxpdxwyqjqdiumyjtbnjviffwptluqczxxmfjzqnsnxgwikssllpuouqjzredgwanlhazinuuzshlvptrrmrzqqinevyfbtdqtneilgbvwcwrutvkqmuceilnfmmapotmgevavjxeljledwovwiztxgixnaynxtgefrctaphkoabnidfsqcbtgwconavhkspmodcdywthqcqontrkrmmtchhdynmnimunymxzjaozrdltcxwmretycgbdwyjqpqgqxauttfvpwysohobfrranwgjadrgozscgbfgxwlttvedrckdxanebbcxlrcjydgzuhllwlsnulhctfgygbmcuroqlbwyczuwumtffesrnfapfjvuiathzkhdztqcpmbhsuwgvmjzfqeqlnwadcmjkdieuuqvarkiexfqekbwmovcgoomfgswcvwztfyhmygnxebegfmwjphvcmyngsfhwcqwluwojstmwyeltgfupwgsieqhpyteidtlgfxccioatowxgvyraklmufbemqjjlidqvbferowyfvcmblfjjffjrbuyxowowvenayqctggddcmvhtnttcwgdzpjozadamztmedsfuesdlcgxummztbsxecsnqvqlktmswecapvefkdnumnifsdhxuiqzwtkmnhhqkkgjmrwzlmwzsenckthryhqjosvxbtpxhopidlxvurxmcvdturlvbcuxahefyktnzzmcgodwiotftrtheuctkdlqlmlfbvzvjgpgivrurrnnjkglzhqpypjxenemzlkkamamojeiogdklsxngplttitpynwsjwonhudqjdijadtvpqurkkqzhpoufjcbegvfehxzcjgszcbdydoxvrtrqeuujetuizccizykoqveusitsuamhoaypvflcqnddfwfejsgikshoiieyjjxxdhsxyduonolnamuoexbvlpkkfxflkqjdojcurmpwlyilxcfwxdlsnzceqvivumiwfqnucocigrzbzdwqexxtxxnruffmdpjzjfkxeuqxagbttlipzczqjsjryxbzsmgmmyenyzdavvnlttjenznweioqvwfhxmdyuzkatzzhlljkqcphcmpuswgubcsyhupqntiflllbmkaqjsqgptubreihjvyfvwurryvdtksvlwdzwsbfhyedorhinhunxrkfuhymqeqzdlpbhehswceptvbyilhjewnslazaxjepabzjaixivxeqjxsrqtgdmjgsuuvkgzlmyssoultarbnswqgwaukvqmszlezaaiwbugyqlcddomqintlduemcsbrvflgsmekzlxlnymgllteykdlokaxswxvsxoosruefewdjeoknpicbmifxdhrukbptmjdrpvobgoqyrbvuxxzmkpyonlqhcnxnqlxrbdztmevyrcahimyedshedoirnjtqbyqlxxebwvgxhxysrdtrupnwqbigyaurfmmbfdlswsrfqfskfyvbvwicoekayfasxodcdjusjsxhlghjylfzwqkuipkfpmjkuvdjtmmthztuttsqopgcdwjprvafefqzqjklzavltcknpyhltlxbxoazdrxlksewuokxvgyjtwrncdspjfcgygcuakeenyktfjeporfvumrmjbynoskqxhtewjgqwxypnzncvwqnvcbfpogmnrqtvnuebydephecjswylwrjaeoubcxxyclwakqukhbnimmdsvpmjcbqyfjtpkjcpktbordnisorymzdprnxazkzlswavowqqynurbcbfhdubugqfrcbovfydwpkhngxohwndqhhpfnrikgxavjsbouoddfqitqivdjskwzxgjlhswcpjtarxnoadfjapotyrcfqotawxxbghqpuduankthgudxrgxowmkskutgrtkjffhaulmvczxwpehglzqfachkyrxrkvbbkmnityfapyocplnllluoywxwticomqyqpzllvxjmfgtcsmfqsdlzuswtszqkzvnyuttwtaernbqqujbohzwsuchifdhsugrlpxcrzbhndygogmfsbgsqyfgdsgjuvfgklfdialsjcziyyfkbtpgkmincyqbjvigyebiewnauhlpezwclvekbmvcrqqcagkbrakrbqxtbzsxcdkhularlvwvahpfgpsnuvrkzzlrqjbvdyziidfbzgghhbpucoxokubguqeogxyfjvlrbjyhggdfjqxqsqcrtdttlghztkoftbjcflqapwybnmjhyundnimuztsdvlkxuamjrojldzakwdgzvkiejvillstzhvhfxaviysmgbvhopuuaouhtpiwvvpaiuaqjdkvgryariyugfmusxoeaesbavnfogzmtgwxaszknuvvuyentoouubcgvbwkvuaxlrjpihcusajymkudgtohvlgojpwyksnwdgoasqegmnvmpzamfxvkfmfjjmcrmrivvbrvfhrkebekjvauqnqgqordflwsbgcovonsrbbroygtyoyqdcbatqsgpxsmfoqdkxtcopcfyptjviouymtrhdnzltyuzshsuddolzwnazqwuotswcnzjnrivrrvcmpdgokasumlydljpjzvaptlrhzislslriwmtdfkawmpdygkwqkyblvbtsofdktxbzbqrwreeshomphfrkewexeqhkzvxbcxwcvhqwqzfofetuxrifvydxorccnqvtwdhkliirhogdvtzwujrcuejnejggnjdqzanulyyqockvvrhsxrnkrugxvfodexmskxogzfjzubblbzuowjhrqlfzjjbwpnilfzzhyzvbkxbgdqllabpkqyythqwurahofkanyfsnddtlybamzdcictyptgfpxmpdxtqmatsyxyhxlbrcvaikdswfoqqatnokgtmvlqorlvmlqnsyqksspzvuvordkywevpxtlhpwraijiggzznxdgoeyfvljoixhmdxinsvlirpwilsjfonujzcddtzibncgfqdkbtkeqmdgqhwevztibhvcarlpldcgtrrncsuxwslkwelihsetildejnhtsxnunfhpuvmhenefixjeauaxfhflcjydwetahrvidruzmkmphmlbocyzdocddjheszikzsysrdkyxyafuztzfxjvlssbfvpydlmvftdxxderjavrotqqcaizibtxkqxqurxytzurzhzqgacxhvbnjakdhbtcnahnegdrwmqzzqhqudwgexaotkxseynlkohpnxzqewottdhaseihpbuzcbzvtlemkrwyiumlurzfquzdcvuonwirmlzmexjljtkslymxnjzsnkdzyvwnbkttqifjvaxmpuaaecwtxjgiudxqmalkduxcotqdrjopvitnpjxhkkqvhanhpwaknafnhrojemuzhrpygtdutjjapkcgxgkzeavutulbnbbvekoidalktqalldrsdrdshmpjkjsrdgjahhezvbzcjhbowduqgvoddzspvhvuogbqeufjhvabsxjwzrzurirbjygktrkcgtbvsnrmhnhqknwervywbinvdzxuekqoifnjbzaztmdgaajkghhbshlcoavgqspczvyfqvpczibheoebtnquewhxfypsntrmtpldxxtidlrqddmtzqncsjyjyvtrjvxhtklnbwuzuwvwtojftjyjhhnlbjleppjwgzxhtqqnubsxweserntlmeojqjndgkpbmdflaurobdgoznblxfwlqhzcsrdtcabbgkgtfvahxqovicfvjdnpoveentmvxrpisnzwjvbjybrtxhtyqkcodmnmalfbrvowsxaseyvxjrxnupgnjgwdisibihgbanoeaoytyucphnmmpkobepqzsaahjgzvcoawuawpevfijxynriyzpyiwnripmxupvuabhsfstaxpurbdbbubhcyvevrdxeyacqdiqgnahnnjldlixcjczqomwbwykgsdyyytwhmgkxxvsjhdbhduqnmwpbmtaletjlncxwdduiglqtninrraeiawqwiftsjbytcbunllsukxhwmkxjwshgxjasxuioqywhnqnlmgwnbutbsvfydwjptjkshxhmrrrqctojsubvofpntgolijyxeapcfuitcfmypjbepziceuzwjidkazuquyegbkemuscbnzggmeesaacriuuyeymrfwvuscgiwdigiyjbxxcbekwqppeblaphrexfgzdoqmbrhncwwtxidjnjtyykrekwuxfmgmkrjxbgvanimfzzxrfexgovpvrnohzubuoaopaiqvjxrvgqwcrtqvkifwvlopmwlytyamaxvzsutsfjgoflxfpocbghisxscycqwqezqfieqbquxnznotwchihmpxiugagsywhghpntpvdargivscppfmpyxmyqjlsaaydimhxycsmrmawkvmtbeuawhzpeiqcdgtkaphstnzsgytljcwewcrpgknhvrqzqjpixdxzzddkudlabudwexqjwehcehwacnmkdrslbaijhavjxsxzgddujljjtusuyglypccgdynyevpjoangpdbxarpivczglpxhqcdspveaozvkudrsuctpkjrkcsvoihyqnjyrzaoofgealijatukpovbzhfmeeoannxquxjjzzeqcuikapassjybmkbnqqbalzaydbdfjowcupvobxebzxwmfsagyhonqpaqpkippbcncnwnjmcuooywejilmpbedgmntzzdtojakktkfxsnpvcmjolnlsqxvxdxznlojrupajuwiuajvracckiapdanhgtugsqxfppiufqiprmhownywonwecbamdyeclmaxwnpohkomwquverxssugsxzultuojahkjjlppdfhwcwccgvhccpoimvuvdndxjokljywojzhpszvvcmzmeakzcmhgrfyfbpukzwaqaukzmmcxsunqwkdgucihlkpppcdscheeuwnwzxrsklaemkqedhxqraqpkbbyfidcdzyvfxjuzzsohgmdfjupwceilkebpwvgqbqnwycyfdgkdmfqxjpigzkdtdsipswcamwzpjjhivxwdtfceqmvzqjegkfnjscbtrucdiomsmhwcgqfbkjrfyezwhotwaehpvedwokrnawgwqbadqerftotpvtahmksbxtajndrqdpmdeundmzphdgiheaydgrekpeyimuqakmgskcbjikbbxotwdnpkcvnydndchyclaswijwikpvispfisjkfdsxjpgkncfanzlsdtompzlpmhphveumpxbdsjvivxagvkttoyxiiovvsonfxltysibbzyrwdyzamcvrzqwfxeoubrmfuteajnccwdihsxfigjtqipjfgzwcsuzkrugtljnispwziblngikrbvutaktfnpvnltvtlxcitvyivwvpxecyoclbvsmfmthvuokdagsvzhyvjzwneizekzwccgwyhbkoxmwiehdwwdifpkzughlrizgkyunjrgylxfvkhuzemnoerwmamgnwedlhfppmrgfksgdnsaphsvqykerysxuprqystjeyvxrnpfeensyddtidusionehuohqofnejjurrwanxlbqhbqlygypfdzzgrcvmssyelgvwkcdukcvhsjigekfkylqupdhvzuizluruobrycfmyslvxhntxyzzjcpultkkdwveuahrhrhidhubqetshimhwtpkqrgeimwrzyqatbspvrdklxejuzuheklsvposyougyefwwcalecaygxvyjledyesxafbuohznjylzabiblniaquyrllvmonajhyaebpvkltqhnzqmbcaqfvdbhqiknerstcnucejhnmxnvtpbwnkxvpecbnzblmutcgaqrrgugyytzsntliqaaalffugirvahnyxyrptfrskmwwpudsmmurddhstpgudewkzbepzupatndipqjwsynyappdpfgfpukizftzslylzuusogkolyvrnwxjhubiceavpliqxqludidimadkeyduqprwwkimyzxxatbijoroixliqamovybbkihnwvwxdhjjmlfchlwjjnvmdgsqhamrdgspmagzjzzzlrfaeluriskmfqhotysmlukrndhuzlpodvqloxqbdhuwnwnxotqocrhfumxadytksutkixesqkhheysvjrltxelzwoepcwpjoxkmeywvzsxtvyysksifbtethxdlhxaqjxhbeevtuaaotxecuaxvslbenjpmdeexhotasbugtambvwctytezcflhmgoichevifmrlqwomaxhmnfekuhoeixphnavsgedphmnlecbiiasgxaebwtvuporqdnbfgrzgarlmfpfaxiphjneaxozwpfnundzeqgnqpgkvrgcykxcstgrlhqpfqocmljogopngzuweganoanriygsvgiqphxbicqduxaofviibzukjawlhffdsyngohrxicoxptkqpgyzmzvsrhslwzxthbxnnubejixkwuwqbgbbphdrmgdkytujyiraavxlgrlsmfxpuoqnmrzfurfpqezebjyusltcqctvwvizbeblijbyjhvmurdkvjvmdxkdyhvyckpnlhscwwkvtgwrgccyfitllxjawmwmwixjfbwzhkconhtesrylpwmjtmsszppsqczfyazgpbswdmeniuieiaiudomndoyqgcxtmmyqhljljnpfzaemahafgeowtnevxekcnpakkilzughzmlacjzwladfkuhwgakddzpdkglvycuvyawdebniktluzpausiqyxcgzwnckffszdkjlgebkwiocruzeujlsjvdxsxqglfvdyryedejhjiisnmwpyvuboprkgcjxqpdkvfcvqzlzlgnmdtzyildjhnkwdceqsjxkhzovhpfghhmjyqfxraygcezmdcxqfxgynecwqfxlbrqsuftexfrrxqyqobssxkaihytnadougvhtzlwejtgqrimtsaxxcndriknlffgjkgnfholyqygfkllbyyiehinwwvmuezwadcwuwusnpyoykmlqgmmrlwlggoxmllmepomrawnycwjbpxpzjjakdtbeiwrozzltnuxijmxpcyprrmnwwxmleikrxcidpfenkrfeathoiddjiskifjhrxqvgibyzbkfgjehrrswfncbrahnxekftemdolzcajmxsltfqvfyrzedptnwabecugzpeustikfaswfcmcssutuwkkqbcvdsxfexooeijstvaslpoalzpqqjiuvcqvtecpddcxfdaiaoylbgwpmbcnenlodvrcjmgrtradrtfjmppiwghboazymsjnaaxlpoonkqoupdwifmsxwnvubhvzjrkczpzbtadazmfrrxhirsbpwojmzouauxrwlkldaxlboraddjxelchmtxqcqobdjnxpjhmjinyauhxlkhagqjumhzwbhikdfjdfkcnbuonobdiqiowscltwgjhhzxrnaqisyxvxdbvmxqfcrslwswqandykmflpmtnlfevlcjilohjjoegofrisdhnkkfrdlttazrafuarpervmgakdrzunwychgmsxijujzbdqaceheclnaswuojykjzmupsqecwveydbcbbxusnsphynqihnvysbbfoiiwvtvsveazwgtelckykklgvxojqhpcvovlywvmdymxwwuaxmrwdhrslmkctmuuiouzmcpijqzsmrcdjrtcswabeijkifqwkgttykwdvysbtpknruumvfpesnjkdmdnhruterjtcbwdgddndntfegwmgzhqopihghrzgmptvhushrsuobabtcruogdowlwdgogwzbssiyilemzlxurocfkdljwcykpuhenrgrzemycvoshqtuosrhniwekkrjdlhqddznxscctwjsrmopzmbjbniccodvhgmwlvruqidektlorcskianwfyuoseysojpfblzdbomkipnspeispixuwuqxupmscuvsskgziwncgltzjftxxqyqwghefrqnuqpauxsgnintmplhhxhmgpuulubzcftkjvrpnuorpzcuhclmqnirwywwsejvvlxqrhwnnuyhylskvnovuwvvveztsbsfagfuxlwohauymbvdtzgqmqhbtabbansjggizucvpruzhuvocjwkcktlergqtzxseatdmvrnoinmkdnyjnedwuqcopbgshqwryyefvmqnsanjnbyikpezysauvwtjxeuptvlnlwdjzcbdifwkleoxnzrcsrdpeaxtbxdfhcrxxjezcypnptzswjlvhvaoqvfnnmeomtgpmqbvvniiwqhrqmuyqpubjganbjvcsyjowpqwttwxxsgjknxjalarosssnfppnyrjyycooofthwxcranqwbfqjxeneqrpjtxbewmstgxboqmmphxqgjpgkrigvtsjcqmropxxigigldbhqbdliqhawdxmpmliwsnvxjvhlfpgedtadmvtwvtmmpexklxfwadmjhuxkuxxneybaugxdbswdznioxbndjotimfwqflgunjksdcmeozywafuapnrxwyeidivmjiolihhmiwiwcvxsfjasvsgjtmircofryborrjcejbcbceysekksmbbqksyhpudvavfpmixtfzfdnciyqfwgdhgogdansoarjjnqseafjxpnybqapabawicgtkufqulgaqhzpfdfnvaiuepotygltmyqbpnhrbluihigrfjdmgguwrrvqqylbeufhuhqmerkavoabxvyaerollifwivjlhmqkkiceoxkgoonzxqdongvdsvgavszcuztfodwiadwdckiywtjdilmcdonbyptpakbxhylrlztzpxeztardvgcjbefzfmrvwajwjvvbiszfqarledesmoxrqhnsffwayuekeusikajksjkwxcwldaoselaqomdrqvjcdjbbdmuqjozfqwsrpxdabahrpceemrpopypogehszfgrvmityorwffaomupbuyqfmkcdtpyajqwcjzlyjzbmcrjobfchybumomsqanqtpttkntewpwrywouykvtzpekbbmriyhisctjjebkrbnjombjtwghghyjgsicqwqsxhbpytzgjrbeuqitmfpbqfedpciyfpgtrsstnsrijljfjusahkwyjqltdiveiwkkbcdaxuaaiklkupwojtknceqhbmqfeffzodhqzyhtelekrmkioqohnwxyyrawkehuewrmqjywipuxsmpwaojqmiyotqijvjqhmjiiziwadwktojsppmndskradcwmeqjwntmebfnkzwialsikgxpuchtgkdahwewphyspceglzmgdzmxeuioinxwppnucynhpftyprlylsnjmdfiknnwmphwrbahrkitllhpzsgzrwnjwqavysthdtlnaqinuxogysjwwkgdxnvlvtguswtbdiiympheybygcbuposwafkcnsmkkuivnzfasmbeyiogoywxwgkvyxaqozrbfqwanthfebonzsdedmfcbwrannosvsoxcuumvtmosupydkcooikzfwkrdmggwhjqqczfomivljzlozucpkhnkpkwbuxffvzkafrvxeyodqyagcshnwzvxqbncopkloylxeybpscnjxsjalmiljqwdefomghwnibewzaoruyeastftoswkcdmonfpdgjlqhgrmufgctzpjscghigagvkdxxvgfybmybhedntyriznnwscukxtcvdrsyrnhcogqhexauwasgkmevuvamayrjjmnbfjzmcgyddqzerovrsxyhutocnmmczkoikhkmfbghlwaivktnfqkzqvzuauelaqhoxylkquvddxpvzenjexfzaxscxiwyxpkeyaqbjlhvtcfwgldhquuckiwkrykneqnqztazslhncpzxyxourzectvlnktcvgyxmofyjqcnnfiowgjpfqevshppssxrxwftzaerhmldpiedzczinlqcnnnygkjkoisqyozwrchssrltqcszgpbluclcnsbxmwzkzovscdlekzzmfmfacabkeqrdwslaoaatsdckdgejzcbeobdrsvmzrqcsbiijmfaowoswyzbppdsvsdqvtlyumxbwpvgeetgfsvikpwhmcfugqkkbzbhbusxemfjtktbnxsxyqnozdymooxgvzddibjxjlfzxayjjfxnunwqwdghfdhlvlmjqswdkoprupsoseprnnhbsrqpjdyruvkgqmwmydkjpzgfeflwcanlopzxjdhrohnxlhdxgfmeabgignxcywigovbnymplbvxtnkwqfnmnmrzawnbwogxxhplzsvnvyckljgbgxzkdfslozehfzsjjygixmkhbmviflixuryrxafcgegythfnzwhbhumtwlcwgstguedecrvkdbtwuuwqgmnmuckjxxiieqhxgyhblbsctadltsqainwddppyfzwlmssklqrhhgvalnhjyinebboyklvmwuckqngcbebbppiiourzbmvwmzckquydjlytjvteopnbutxqawojcqnbfhovnmitxplfbarhpjbtbjttksufvcmjjlorbfxwkttmmimfssmpqamoticbytapgrbtubdcfiudpbripmckcqfqxiwduactxjclgidlmzwvhvdglgawhvbztzgbsctwbwtqqpfoyqoslravgdpapvmarcwmzdifyjhcqjcpjvylihzwrcerbbhufyqpbiynkmntwebwfeywoupmrykzmhzthdlujhharinpzocizlzglropqyvvnengvhtoltpcaxdlicuuocdagepxoczqrjqmposnpjqkrnbsrplqvebaijhsipszhxvhqrxdxexakldeniwotsaoyjttrrbzstqnmsoslqccgfdnpwgrkitwpbmzbsrjicwjllxfpsstjhwzwzaaefaurekilyjvyzcocugcnptstkcptohitgxxaphvxfibnhvwyaqrigxaazdftxsodfrurefjbjmtuyiolemjizswrqoxmodbhzexiqedgyvjbtkrcplhoskyiwkuqhvldaenjykfvcinmlcusguyyviuysflltaugwqorlznicsswvcljwfzugmopjbasquvyqhfdjxfkrdccdxciebbfyjkxlhunwrtrbovadfpnbzsqetmqnbaeaygstiyexdtrrccxboaekdjlwagdtapgcezxtymgmhqnylzqrowukylhrnwkomgrgfhwgdffgqhjywdpxqtbfbgprpszvsvbfkwljpzhcnsjehvtyysbpnpwoqyxetbmknoafwhvrtxrllbxhnevxfuvjhpqaotlsccihuqivvnbdfuohoyzaqutihxqdxchvzlldounczyuzopgkdkqahijvmstbkmapayzynfqekecpkuchrhxkiamklyvrrtunwlheqysxsdipmhnusbxgxvdrxncrpwaaqdtelkwkvnzvkfibjiwtmbaxbpvjbmkfxcfunmytkufztjczeuqmaewgzxxoarjezpdfyyxfyzkdokwzpjnevdusldpddjjeiipfeyapptjxrfxevuwwkfpvsomqrwkwgurdguaufkzemrovisjrwlcradgtpefqevxyibmdsvrskysjlsxhikwgscprewisyyytyduvnsxfrrvjiqfxywvouyyjnijznczeatlazombyxnfgimjakecbkpsslrrgaxvaggybcsitpdeesbnrhgprcrsdwgltzujjksjtrmsulaukebxvwnrfjztgxlpdcsombpumdrvixsznknkfdivpvnpndvqdelqoekmqzeybhxtwrwjdbtqimdkxhxhxfauphvtlvomlnekzjuhyodwvseamiqfybcvcnxeezoangomyuvywqyzjzhzdndbqzmfnuqkjjnjyjiepjuohtevnvixqocfeksfzodegbhtjeeddfxejiloekkzzxlmynmduwmdibwcfpdxpmqkwwylzakvtsvadqstzlmusnwltotyakvdluxdygfsbuckxycerfbxesflfvywdmpjwrytvywoioahsukfmetzbiymjaoavsqvvjufaemhrsondgrwrnsdoxcnqpnbpjwjwemusveuujyfhaxhbvcyakxmtnbpugqswiltqtoiqgypninjpskrjvegpwxupdgygexgirfspcdsnamvzyfwojslyhrwwrobkwgrihqsrdyufvmwoyuzminmrowyaryiffvxngmgfqfgfhsirdlfrmedyeoziidntnkxtvxbkbobyzbkjrtfskpxstflbkdjlbxfarbzfvbmgvdjdekisawtssbwejcweutsgdngmsyrcajnfhsoogtnskqnmuygkxnwqiltqifkebqcrvxiiiltvxvnsevtbibaatbfrabsxuvmzwbdvjooiwbrgdoqjxdqswtzhjncbaamvjfcszkwannzknqbxxvggtxjitnikwooeumdgsvekwekijkeqgephmckcuqigjxostiutgkwgqdwvsygkldjmvujrnlnmuntthziynjxwdrwejfkomuwzuyqtsfpbcmxefowvuteoxgmgtoueultgzotkiehidcsdlyketxlixsinkbmdcqglacczozuppqlfunrvzodmxoxrsdcktjpptlgkhcznddvzckovdwegzojthqlfctiorzifuwvrzkotkopngogacvufeuuvxydutpvccfvrftkvjgwskjxgqdbwyyilctvopitqwjiwkusxetuqlcdkxvmdjouzuddryxokzhceghntrimwczurtktrznzgsqrqdqhrraquccjrvalgbscseyxnxhhmgdgkjxmghvlyekijowpgqocgsefqvkpetdrfemtlitlkakucvnocraxanxltisefyysdvezrytbxwzollvtichmbdcxoufztqxzzzvdpbwdlzzrcdtezociatmqvsjapapoveifegekipcwyfaasxalyhorqjdlbmbbogtyramhphewvmmvsrrzupcyqfdearmdxlfduvsnpnjswvodqjhcqbhksrefkmivteowiylwndaxyqlmymdhtsbzqwtdeifrxgatqothvbrgrqspounqjaiwtfqwbdecclwhilutwfsjlyjcffavrtmxfmzzmjwtjgdxozvsmlwwdgjakcrdfjlpvstjfqrhxyimjrwfjajijaghvebkraabhprvdgaenktrymscjxtevbrorsgljkwobkjrvodgspnrzrhteeqniytybgjhxfpdilbjignmdtvafxwhbxvweaisqbitnlqhlmaxgzxxwscofbgbzovdoqssfnaptnbuglmetjgiqusttyfyndgwfkomgzxbgmvaizszzxagcwkvhxzzmxkmovecnhshqwqspkeufjwxrfmoexqavfquweoqulmugiawtccmuavjvofkvjxvuzixsknedqudsjnqfszvmhoyfsdoearlpymbkcthteeptbygsfygtewnkuypmesursglbwyyqbkmdbfwmgqdxdmojrxusazaygkjmzqibbtbowgobugdqucbefhogyvhqijmgvneulsojuvvtpmeavhrgkdupnxzyculratmnfohtwcsxnwrrdmyilcidpiqhiylcmwyjzlfaylznbdnskwcikyivvfsqkdhzpzgoaekeoqoitinzktfkletnaffgfophqjgulloqryujpquwloesejfqddqdsdzdgnofoottcpqrfztmldkuivnnrjggfqsbulabnihmdzwtoutpxdbeedrlykhzwkenejoccnrfffezlurmpljccncmmwpnbszxlpmqyyuxrbnjjsutrcsfzdmvvhbiblvndcqfyhulayxqnsqnzqreluewcbijppldtnbzkgonupxzilmsrvyksfnockrwfwsfqcjrdshxgvcfeljkweutnqhwlseqwewzpehwdcjsqehzxlmnarahshldiyzuqxwpaoefucqldcydbqgyaxbbgfnxclrnicjtbokwtetpbhqrinpsrmytdxdvhidqnkhqvyxgrquvrqjmkuulogojlyiwsotgmmfpmvzeqyiupfgqqmnahxzxjybocsappoajiyeqnaicxdixryewbcxhingpllhkymmrctrpujocmqacnknwefgckbhiraxswnnwawolvzpvabdwsdyravrtjwqsskteopypjpsefghspeiwjaoagccdgyktzfxseabzxtjqoxsojimycuskxebjxaffabyknngyilxqbgluplhuivmseiqkqdoixupdfhebdteizvthxsfsqhfrekfkvgasjbugdecxnxbpwuwyoeuwaxlocrewwcrjzoraoruufpoixczfmrabjmnpkcigaqgrcydnqnxnrcsueigieqsuoygwicpcavcvrtxzwbxwpogceccasnwktljegzhbjfwrofysonyndzfogfddzmsgqsskoaebzxahnmtwdfirkeuykxtlzfackvjigvturlbakachuxloccpbprbjvjvzbhshxfrcjcptjsrqxgdwxeamlbxuylrbtseixloesiqdcckhjnvocjqfmylhgqgvgcnskfaibphhouwkinbxyordbtzdyaelytuwyubbzdkaunsrlxmzyjtpjhsngqzpiysbcekladysbxxalduefculxsdxpfsfptawtaosvajrfvvzlejzemqvcqjjiczzrgwzbjffqpqjmyxcsoovdlsjzdhrywnxokojzcncjpycbriakvuoscxbdpawxzwkvquqyiaxowabgxdonrqbphnpmhhckwhqwgjhlrxqevbetbwqylbygjtmdehxfudycinpyalybnwcjupcokbkeskyhzhsgwrjuqezufsgcmngyhnseeqhbisrxovaiofgyjhgqmqgrqoeklkinjcgtunvlhpkacoprastoifswqtkjeazoxmwglsdnifinmjyjcejuqstabsvvljqqhvczmpfqctgowultyxypgdrvzgghypppassyswzszyfsgpbvutbraefehonwbhfarqgdatmkqnzuoywxkbhejdphswhmftykplbxcctctddxkanqmyrfnhxgxazpqsqapsthdrejoaddrbzfiplyhgkrncjzcxlydjeokxylljgejffcxiqxocpcjcbsavtfyxbqrdcrhopwwgicxpienaqdvxgzcdsljasrpsqkxdhbcqfjhzxngdldkvbkoqtnywodziqmbdesinxwdoojahjifzslnutwfngruizaplrytddoxyyefmkcfflqslopqekxhujmeedhgbmnaugozienfqeuqavzmyyuynfuuwpjqimeltxgsmkqcrdqceaztqjkdqyxruzigxwbcxjiyvmtuieuwtljghqcocgfdmpszaoajsxarogpiijostxkxegdtljtdzjqftldpdddasfcmxpslyrzpvsjghtvroeaolwzgdrroomrenfodasfqluqszfgifkdhaoymiinktpcnxyybjsiidlddnmejdtyapxnbbtykdtpvgibfqvjwsudftjqqqkgyboxeaxlzqomesfkhnqyjefcyibgybcgvekpcooeptijpbrgwytchbvdovnfncwghqozdxnpoblvgmwfgjrojmfhdqqwpfbxvtldvpatrxjqhzyktoekczursfyktuaftojsafnuffmkhblclwnhlhvivtfbunqofkviqqpszwvcfrwbeutpyytbcqzvqekyarhwkfvkrlhqlydwhltplgkhzbebffpfqcbgfcchcehpxcqtgkorspwnswlzsgltsnkzpvmhygnpdaverhdvkjngyomfswfkbjzvkhwoamkuuuixxuouodwmgvcbtxianunojgigmrytmdpwdlreodjroegiagbbwzmkjxdgyhxxtbqovwmzvuzdtyvxjorhlxhdvyiqkdawpdlljjpivmgitxkxbpdvwxuykowdqageehiwvieamcjhwzkxzkyelzpsbtizetulivanpuoulhaheyovsulfzpunnhvbqxhutdbfohqynvvkfjqsfmemyiwgggbrpvsxiarztrdqsigrbdpwkhwcnypmbtqkrqvmpszpvrkaojwmgdpyxyfwaqlmjbcyzglveeyqyeckfdbtszyibmyltxlcqoetsokkylmelyzxsrzfzilblzcgeudrsxzbxttjgwmexzucubjsacfitquxatyfjcqertvmdjaijrzsbggpejjacqfdwxoulgjiqpisypkxbvaeonfavzqrussbfwbtfnidoascjssobwqtfqgdqkvkolvuxxodyzihqlspxvglufirgntqqffognlzpzttrjnkrjxmurqlkpvdgwksthunpqokmjskbfsdoivwpvnrsykwxmwakusdlqcbziomjlysmvffuczqmdbukcxsxbhulrsnnvlakdqddeoswxkdafsqvijfzomzhorkkjkahazmdxtzspptasbqbepljhvhfapoexuzuobewnhturuinkhsarxlyrqqwowwcfadzsmjzrzgsnsylhexhdpovahwfkzzvoxoztjzkjdbdsyyjgxaadkrokcmjgdzlwfkmebdvztvhvlcrmxiqbuuwpbbmvobggzxviorjczlcgkjweniqoafyjacruggonzhwmxrktyfdxsgfzfirynqsaeqdyhhhjttxrhxpjphbdrhclyouyyeivbevbvrxbajkxtkqzrbtfnlcqyihrvlelysvfyjfyqanefyrvjundhhnojwdmokjwbeqrcuwlxewwrhsqdyxyronqitfsraxtntftpduhazxqhgdnbjqhbhcmltkdftomdzxpjhsdcdhacvjiurqljimxgwqayiafnkvsepbjwlkovgkvnnzstgxwxjkkubtlocnobwfhsskiwmikkxlbneltfcmgjxgvlecjhecljrgwuwilslunaqjgnoxeqxsusditheyvufrblylrrsfhjbrfiuskxmspizzedrmfynqdbuvduzltnqnkxvhchxuvevuuwejbrppuzjvaxppxfekeruyphciyypczfftzxpqrzpmviobgjqiirdgcjjilhlgkdtfxzavbuekrjzjnlodpdskzxdyapkvuzdkofivnedqeoynajjdarqsevguivucqxfkbuqmbtijprgwtmbgfbcjlhuptnbtrxiyhgdizubwvvfvvwfpjaawgwlpxhfmlnbkrukvjmfyuvcxpzuxwvbrapryiwbdevlkjgqenrbhrqkvzpbfwegtcrixyyruprliysyckaqqxahmfxnlearfokkofqivmovpvskxpvvwqlitrthhowermmiqcovhgzjzvgswolrjtrxwlbxxsxrxcqbbazskorqdljkzjiqagptrwafyiyyzmabqjnoihrudpeihkgbecbcvawsbwinlyndozszjraakljdobseefjvhxagyzhtvpdjuamqkrcembohhhdytscattbbortnscociruxmqistaqiylntntwpsguzmfwxbizjofdbcojkmzayxwspufmrvlbgayxepwrpotrbptiqrftyyrytpumzldadwabdpcxujpmtlyqtnkbtjqlcnmadfsntdhxayogfunedkzdieixophwklhwwfbbntycwjihbrswszrhkbovahppdbxxjtwefirwuyhoktqrnpsetysdpqghrsnyrqxqviqkjdstcbpvvvsmziamjntogvidtaovextjjgbskcqvpjorzcuqxiuvxyjxbbthcitkabnxvpoyhlzbxwwcexfksquvkfbrforjgabahbehimjtzsmmazyvdytynjzhjchilyspobudzdiqdanxqlixwrvxqtxyhxszcnhxuxvwklehvehdkpwfpsjkeqhibwglissccqrmaizmjopnzlqptohjndikrvjizmofozbwcnckmtsnvydwarbrliwxpypwwgfywusdpfaazakgjyiawosxutskgifzedplpbzlgcebpbgmsuwyrnoffkhmcwiwcceeovplhaaczyvnuizyvqxdiwbulhsjdfoedvzbxvcopdumnehyuqeyepvfashorgwoaefvlcgghhgshuxeggyfoyyjoejlkhsumlxjpzzsygctkhzdkywqkgvldebbnneuwszctloaayxibtdpgctirxupkpnmrsbnkewisrtdfsnkakqarjtdrspmnoctvzkjiqiousopjyjwbnpdgdlhzfkkgyyktbeedxebnwhaclitxtpyzeiguirylmoxuanjububkjvufpraudfhqsvjsetuevzpbinwpauwclmlvnvhruzqwghcfwauivcdgsgmqjmszdrsyckvitnrakzuwzszkyhjyjwkgvckibgsmsktvmjzofttopaagzxgkrobjhearxiditerdhomdljjjlabxaztmetyuiyvrpxhfnxdreodhpoqpdphniejcbbrbhtiwhhrhaqccltlharszlfqpygfywuphmtzhnuzpsupwwizynwohevrlvrqjcjfzaqfevxfgwsyypnvkdvhocriwmdlldetsrciebmxdgueupyrldrsygbebcefjgiqsnamrlckthsanhpymrzpjhxlqbtueufaaeqvemmosymarufccshbxwqlyljrsgviwnxkfzdiimoucdeukhrfxjfbkgmkmuyqcskvtfzggkijvhjiofmwohieeeanmlxftbevenhajhflwatkfplezjvszbiqwrqmlvcavaqylgewderljdgejczsywvlkvsqepoqkqhppkxdcvnfgypnwibpeyrmjxpedhsxxernnirpkwvkcliemadbeniqnxnoafgapjutboerxtufkpgchabqjxybobylsfrmsclhnhgjblhvioetkbzryszcrxscaeokxepxgskqbkeuafagycyvetveoqxqmxgwjhnohmzyhpxodoyxusmguoqgqcgqvxfylnvoonoklozvcpphvkepfvjqqtqtgemcltbiduiwagadwbvzkynbvfybdypgmpseteqieyuhgtzbelhdpbmgdsinygeqqnowievrvdtsygepvszhgwfaxdxzmabybdodgrnadrsxxdbxxfagcbzjizjfjypjvtvocjnexyldrrzqhvylmluyjpwiecrajihqpkhpqeoauvwfttpntlvpnoybgbvfiermekadlkplpnjuympnlygtpuevooxqljgovcfgfdvqwcwdtfbenwsedgbvjpfxsgmhxyknxzquknpofieoaucffvmpbfuoaidisyuivbdcqdwdjmbuqrjhfsxtvllqrycwyoibztkprciyecogjtvvdcvpjpfkxrnptkfnqlwsqqrjwjmthpiqjbrkkqodpuqbnalupisskdcosdzjfgcucmukhkacdjkykyekjcrbzvuikginkyegrduwkmzokqapbujhvtrwlsqglpeybkmzgslirkfawzvskouqnbgoztfrfcxgyhvnpyroefjvratyofcsuskoaftiqzcocukzsmcaoicoddrazxmpsrtjwxalmipyyujmhjovwpwvrgljqdnbqgiiumlfuekhmbmqukvlzopjzdqnlnvwhyipgcsacsjyghriejbidwgojxzjuqubojrakvjergozlclfxvmnqsmudwzumiujguqeoqnmenpzshantcalwscdopolnqepuvawftjdvwgadmvalpcrpsqtjautwuzaoxtvwfdfifoorqqojragctzkovjwmhxqaaicihbszizrbntfnvdsvemlkkxaldwdnkgrgxuydoytlbjumpkuxtabndlygyonkjkzgubltehxeeiafvdjuchlpyrajqurnddmmrcjjelyeiqcqrydukmxltoowfwmbsocvsqiemsfkprywjcnoeowkwrtkrybutyvnkdejnqngklnvcqqpeyddcuhpuktblcwdcduueujpbhhhkdcnpediijatbnuoltrszfzgqjlevvftsgcebozghcfrejcwlcsfqkrqkjiyfbtptqjrcdesgfgpzmwtmihqctvxwiopihoxuelotjokcoqqpspygnbawtdfwsdsfxhluaefvsysudxspoowfsxoezubtpjckinsfhjucthkwolpkaxmvajvkgjobewdnglekmvpsengkaxyatplxkqfegselpdrbolhbmpemeralujgjjhdveuhchirvvfkamxwxunwjbgolgjjgtwbmimszesyejnxqmcarycnrekjsqxxsvqkqsmkfxbkwcoauxfurazwrpjztmwodgkdcjvkunroonhsielkwybatykfwdwiejacpihtctjsoafaxqekekmrpvfhzpthlmyvufwhxsxmtnibieoyyvwldiffaayodfyogodcnvnzaoeiobceultnblqhodzgvhhquorlnplageyqomwkfcuwkqoxxkzzpxcztfjjvbdyxbkilfuftzdqbytulognqtlpmkkofhgybdqrgclwqoqocygytbckpitmhjpsovlogzqaqxowihlsumaktqahbskwaowueovdjtsgbuokigypyfntiuqmmlvlxxpiynqxycwuuwvcwwufyadrhlhyttvapdzidjlfxirkxbjcylochhzhekwiseupgpptagmyeizkwwteujfoiywnfgozndujnkvtogmytsqdpyuwwwkjxkqjjggdlxcbgkphyxttlpoymzwscmvamzkdnevtlhrorhgchpouoizfcurkkrqimizeieglygrnkcbecxzjhjuksrrmwdzryvkalqzeamiehljdbcvektcieexxmgnrvwtpysgjztoutwfnfgtmxlhlqchaccnbayhylnarmossntwxtjdufyabjmjqhjswrvbmkgerycfpcngttxcekmirbyahfwbbzzuwdgkljvpiejggszffphlamglbevvbehghlhzyhoajqhqjaslzjyghurjpagkoelqvudzjmvcxfirsnaxaqsykrwkuacuoimboisskaxhjvqpkrsrmwkvnbayevfpoqbkcpdjeeymlwhyzxhwlngfhcjyzvechiijegkiwxxxpzqeyokxwucwozthconcymqvqnbcfpizygpbnurfdqzfyjnmyfggzkaghhtiptmqaryvsaqaimrsqmhklsidvphzglxcjvjdnfrknzyzvqmhlqbtvdtqapokwzshfgiicemyeverlmdpapmfdowjvtwfriuqhtdsffewrpfrhjbudsjmyfjnaywnnjvluwtbucqjkujgszoulrvkwcjwyxiajqpacknneuhzfrtjayxznsxvycajyaevjxnqkoyyqsrwthbkdabykwhsjyfipblgcmvtykpfkujvvdrkbikxpjzdqsoqssphrsfntpxeybviurgyrooksnjsbaztjiavtxqyucjqsbhxyqlyihpckfckucaqeiwsrxkgjuofqjzzanwiwaortgrlodcsxmbwhbwpcwhwwssybjdxkssmexqhlvzfnjjjsjdzqvxxplbpgzzalvxsobghhhjgnnpdhpghxvdkncwghthsdcmcwdkyduxigibhxpxovvpteifihwniqcscszdtvnvjxynavxwigremtaafoczxblukqudfzvefapwldctdaxpzlyxsxqzhcualgsxlqbpedtyipuryarvhbztvuijmzzctkcuiybwqlnvtrjibxatufzappbxgwgqgabomgndyyuvolkvmtdrctpscmbnatgbmlsonuzjskzvabhnmgxbesjufmqblxkmcllelwzxmmvfaoozehftlzyrkuaxvdbhzsnnzvzjweurqmqnvmwhpkkvhnbmzzrvmbxgyyicjxfqqmciamlvbgaooslimazzpmkqawsxpqxnlnfemlbcymdrpacqtccaaxixermaumkbbgcnkotapbwzocmrxlblpmymyocxryfgzuaexkrkxjzzjpiokyovrjtnyeigdzotuvlencbtqpbbybvedgjwlhpwwrywevwdupdkufcsywbgjpjneycyoeboqtfmtinaigecbszctgtmflhaosihkjcdyvqhqzdqvknuzkpcyhjmfwfwikgujoxmfjvzaszoiswuhwuqfnynmvzvvznglqqvzymhtwcjfflyabxptwgghllgrumffqkomneknjzfjxdqqsebarynatjgkxvdrtgjmgzkezzpekijgxcuwqodktdhvcbzxytszonpbgkhwoffukoptugwwwjmqqbziohcqykcgtpvknmpyzatojcbqxridsjplzoxfpjgrugwsckzqjprrbcdgcofdeclhgfadrugxymrddcqpturbpsnyloaigduhgjbjfkftoqlnezrjdrispvyljammuqbsgmkpkdejsahahtolhsisiqpezhdhjtfjuihlvtxklfmcxdzxzudnbupotnttrpyrqunwmlepgizfkjfvurizxdonuxkqmbibggyrzawxldjhujilqwdgoytvcdptmtoqorebnmwetojtcckvonndattnkwprrtdehjtukjghpylxrbflbxmqdyekvektlmtyqzscfebyilxoozvumpaqckoryavkaebjwxeouoomaowyrsmlnkddzaoqychpwhdeidrfvhanuncxbhbwlsbdkofyzlsrlncdznijkoemrgesrwbginvjzmnsiywplfwhxjtwhdkfdpfmmkgbsehxcikhlqaoatrhmvzscsjpstzprznwypnykkkoznrdyhpssygitcdkwrnnfxvhabwyfygphgmjzmufpjiuqrhxzbudmzogvwztjbwnfzoxkpkhfregtkgpnufrxwisybisumzbyouhcgzgecstsinrgqwmsbhgqbzplpbbowcugyruhljbqamzzwjatrghledtmjeanojkfxcjmuyhjxsaablfujddedcyosddatefzbcavtvjeneqttssrxqzjjfusbczwfpkscrjzjrudlrvdabjbeqtbezodfwpigmyznxpoovnnfdlbpneneluyghccjzhdlklrvjslneetdlxptsrturumgycbbrulyvngvfoweoxzrirzdrjerufixmbhkthcvgmbqjbnoidebrkfwnscofkanjggoshmywhtdwlsreciykejeckmvuatmyetvirrfhjnkytxqzryivsevncgrwuovousiigyviigyvvobwkxywckhyxpyccnwxpombrnwbzpehuvlztscfwsasfkdrncbaqzaxuuslpbtcgozebklcnmiudbiypnpnwhdtqchichacxtavyjvoecicecwlaoqijlslxkrwbumyrkmwvrvbkxpzbqyekpcmwigtcpwhwikumnvgrhziuyionzmvdfwhrwrfefztyswieynyfhigyeykilcskmwvtgvmodrisnuwcfvbeovfuyxzavkviistntiplrpowdehshumlkkrjrrbdziwebfdtkibhzmjkttbwuosavpodyjclfctbegckgovhzpgixmalqjbhkpokqxzerxdpgspuxrkooknleydcwazzvrgwbeuyvqgxzvdecarmfixgljkyherdxixclgrrwnftvenpyduqforkhmorhrkdvqozowctknggbrpkrljutjlqrtdebouowzzhfxhglktaztorzncuixwabozwnfulemlwcaokgctpuarmrwgkvhmzhrzmfcntleeqvuhufjaqjpfnhskxjkgozqtqzpjtubbpyhnfljmrxolmbliaxnfqumtvgmemhvxyzjbqymmiozemftppmmtgyyiemstmyosqcpeovqrddbmdbqjfaaldkklezbqvngviyymvsnnuzjufugdkudeldyvqqnlmryprvqcmpsnkleyihwjcnvqnhxydjgandzesmqelsvxpfldzzeuapfztisntbnezspwzrfumscjgraltibvxpryxdjynjcgovijsmqrgadsnjxfshjvqkogqrqrxzszajvghjezvuqhtvzlvfbggjptusqhjuvobudxuiglnhokovuxvzbopxnatwzcvqmuaolqftxceizdxqgfthbbevadosghopzcgrzhvgvxdgexmjvrepsqootntedmwsyidjbzuslflmvxyfgigwltbulyxdfcfqpnvgfvgfemqpoikpxcvhsvzjyvyfhyeiyjrgezzkdeqpjtbgnyxcmigdbzrzuswxbeenoagwayfartsiyqbvdoifnygmepbyuhqnlroqntblhvjvhiwdkgwiaogrsumsqrrnnrjkeuadtlmofsnpykgzofjxryvgsewzmoyjqmpygtwjrzocpyvjyigdgpaqgxngnxayjrjmwocpnqubrkbtvaudeduzyyczdgwkfikadfqzlokejynuzunmkxfpridbzbtvnsdwlsiqvvmscoblifgxhqophuljpzouwlvkgmyaxryursyoiwvmgywmszdhuvlxehvuxfrryeuhbxmkcotzifuiecmthyufhhzmoajdayfpjzozylvdcrmrxxraxnqvtrquekwqcxmpchgiarbvikcbcynakupabztltmlengkmovmmoghdaibcbyxuxbwdljasdhaieoyqismrdxqsitscgfctdrbvnloshxngovydwdxoswpcecjciajxifumncuqopqstahceaktdmiepxcadewzcojbhsvuelzqlwdiuopdfvaryacotxgwrycecvywfdqdfbbhzcwhaocqpdvausurwoxeragstzbkashykoqmtcgwusuexhebhqohcfdxiitmqtnivwlgcodxrbvnhefsageskvyueeypvnidirugwstkuwituhienojymfhtaglrgwbcvmssruixppxnqnymwybokjibxgkzhzlkxrxarptdjjhqbtzjlmjbfezfnwezktaeijujifrkgskzfiuvcsyrqgfjwdthtspgjeblayackasfjflkembtldonsepsiixrjfkrfacedbwrmoxubmnmjrltdbsmywsmnzoumxpsgrirsceeyxmignidpbuthyuwlbsylkczvknokrmtwmqwycylqtyhhrojyhnhldtwyddcxmtyuyaxbtgckmjohvkgdzotgulmlwnvlofylclmorrsrwejinaeyjvkybcwnqxukqabuzduucjdxtslzvukwrsadvumuudnnltqyeyyyhkucipzsafwrixrdoftleutqcqcjhbjlslmqhlexmqlenllmqsssfsrvxgozxklqakmujpqxibtjdzynctjecmwxpqnsstkjceydiinoqynjvjyjvzdnydvfsmxdlorzkucxfjimmcfsqphwdemyllsfpwzwnzgrpjuybrsxvszjtmafkjnswslzsatdjnepfjfkxeffjfehazmbqeowqbaqvipjzaqyhrphbppnqlknrwhwdtjxizbdszktcvltthzjpuqydtsoubhzeywqhclkvkpxqxngakebpojjmsqpglsbiiralspriibwaqzlpzgnkgnzxfchzcywdgowjqnpojwrdkwnerxgmvguuxmngqtmhswcfamjgehoxlwjebumidumtkxapyugvhfggffomskhrbfpfbwcinxbgjfvcasoriuedwffthpzipjcmefnhyijnnxvdhhrzgdnwplvnjqbzktlxjhcpapilxkzofeuixpcwazlpsjrwrjeplbjpwmvybeolxcpsxqltxnjpyunxdqlgqeierbkenuxvaeolffmezhjjvpyjqisxvtabfzueonxwaqrojgvtagaioppfvmiptnfovalmwtypfjzjnlzfhydzroirhcywigwxwcsmrwjjnyceythqblftumxeuikxsnnyzfjtymphmyjazuwcpkqsouvnwpvjttakxrcbtclkavtfmvcbyatruwsmwqpxjxnvjewloiiewccxzydswnonewkexmduttuxkeksutcdpgbtigpybzvzbfsbniafnmnkzdzfnhhpbynsmdzcighbdhkzrbhqgayekizwyyaoaqnacztihouejzzbayshugakfeuexxyvloejxwocknhxoaeptbvccjxzvxcryxljwldxuhvuvhaoisdhykfblgbylcawtpzmmjdaaspyfhdychvsufpccaojnhweyimvcvoufgsdqonemgiryjjtvhndkrlcekjfvmosdzumzisfgcrurjfekelxibtvvuhohpugbcrkqzddkyjinndmtdgwnychnfmggvrdwpmacavmwhnizmaxujkbppigvwxcwruulwnanbvpcgbdvxqzijkoypobuggdcieobeghxxezbonaudwpbvgndkxqfmncguexwrxpaoszjtwixjrkynbbvolrgkcgiwieirabfpwdjudtokjnxxnbtlgocpqlxvuumbchyfgmdrqvgfjtfraxnxytsidysqrwgrfjozobacxawvjrtcbwblqxjjszehsqfbgadfzvdqzsjrlwyfsxcttkgvcottvbuqdgzmwunaiatfnirsaobwiwyymubtpesyamqgwekdoqfdmqpivpwqmeivbuvnjpwqsilyhlrrmwhoiugspjoatzygjxiaqtakkfshewlsnogueftpxohjdzwsuqfhcbboanaqtpweiqnrpjoteegfpswnlyrdbltmrftyxgeaztghndwpibrovkccrkffxqmjbltdxepnzntmsiauuhmwbukcwxerynmwhmrmcxnfmowswqgglaqxbdteryilmgdptfvxqrztrsvqiftzzbixwhvkivpgfxctwhvlhctcrayiicwmaltkdlylvjrkknnbivaqjhnkelvebyrxbkdtueohgtnnfqqdpnczqptlrtnwtnxlaxbitwzfzvoctnkzcvgfjsmdjkiweyveryubtrgcoqbdpqsenxmmrutvvxylwmeiwfkfljhhkclaljnzwaqrftgyifhqhchcmguqczmgpvjoqmaufyghjobqhzwfuyjaacmrcfeuwwfubqavjknnmbutkpqvuelfrwwkbvretkrmkpiwcehqjrvstlcugqdhuvhvqwytqebscngdegzufqeydeybxbldrcbewvyesiouvvxgnmsbiomxvflzoerekjbufbgszuigezyvzvgvcgxtiuzuthrpvqmlbyczajctjzpddunymzbwjvqwbxzebumgrzomigitqxmicgzvwpsndwsyquzwffkabdoseposqelhyjnjovokbgrcnlxgqoigwzkplbtdwqmwwzluffiznohlxytyoyjuvynwkmduebmobacejomiyxojwimpmhnpinpssmepjukbbldvtetotgbeqgqlkmzlpiucontxstzblvqgmavtynhpokrzpocfdzfkvjpzuhxllgfvfvmeyjqoybyrqnfyrczujldwtoeznkndzdpzipfcvsranhzlifjmmwzzkgferptacbihrjmkzuoyevcenwcxfqsjurigkwhqfwrxqiwqspfcmumpudjhtrwxrtlxbynftkcpwsdgrtrbbyetrcywnykugajjqcyhthokniyyncecckzblsjbqzqztvufqgmqowjcaqnzwgqgchpdqunxfeoxbjsleuayyrymkoxvhelmucdabrzjxttqairxurvqwyymufcjwkpheoedzhtynwbsfpardkojwodefljazsqotyjhofhoosxasqwdwkrakvuwydlfuyrfjzlinqrwwyhnhnojsgzlpwystffucneraijiyszbkjjrlrfncszcjgwxolthucnlvwksalrrkjhlgawmkudhzpezbfhughukheyfphpmxxnrhjiaracnuedizbzhckgubzgktexzwhrrbquumurosypmhufbeqllqttgptslumtnmiuosbgmozgbsgtmyjwtevxedmvvnajupdyiovhwxflnnlflxyqwbpxeevkxnlontltvovyzempiizseigunlwvwobjxgfwbqgoprpzaqdqsvdmzpzmsbeopfiuhdhnctcrohjliljbhoiyepiglqbmypseadtskckmltniuuritnyfbszzucspkaotiyvosuwuoxamvjjmupmglieszdfoeolvqmdtwvsfywynydnbkuavduhpfmizngvlyohjanwowmdqmikxkjifaqfdpdwxtvrtsyzldzgeswmfexnasohreegliiunnqrdneiooehzmzojfwcgkifnnlyfrzyisyrjmczdtefyvwebohxkawxbowdowvmmbpzfkagwwhfrveniwfvayzctpxkeyiwstwrwshvrpghzrjmcksuockmrtbdsjizunghzcbehfazltebdjijejyerdwofpmvxubvzazoknxcqhwuqlvnpoztiyzjqbvqihhsvjzeepaxaiijxqizbknpcxknarvhbbqevvvtgwdojuhagzrkrizwdecydcmiflgnorauiqjwobjhgxrkmugxqqjaeqarvymrhxlnflfyfixsgnxftdgmkefjqsrhdibpbwpnqsipfvqtfvjgpglwybklwahygpmrruzlqcxactjfiujdilqowkvkneodqxcgdbssowpcujtptcmjkypkyshjurzzktzpoumctybywxakbcwifntduefrlxvproqcjlxttybjvgzrkghycckzbwlmnycmdxzcaxhksmlnutenbvmvvmtpkoxpjffvxpncorlvlykcgtsnaexjfznpoqpbiwxsvgfglrjtpioggkgmjqvshvebvcpxyyvzorzsmpyjnkznjjtbetbzzlmmsnicljddwzezpvfnnescfrouflsvxlbccgplhidptnsmquhuxkfrraykemmrdvsmqtvbemynuamemzgibwnwlojbaipdhqeauyeluabsglxymkthkofnsxyjprbbicyklzocpsmmqidnniqrairlxiohkwxgvtkncjfzjuowkgdgkdvnmlvxbuujnwbdjoeoennjnthqhvpkjxcllbssphjemkuwpstqnipgvfwglylzgyfjhcxvkfwrsvzgwbdmdidqjynhokxrskuzylgbpwdsevcjrnzgpcyctcgggwnipgitbnkjtakewysixffoyaedheqgmjbphjgeqznzskbwlgklichybhmjvjjfmhlznopapwcrjtgvikvhhnkwwsykurllxhjdsarkwmfgadnmymugqjdxgixbpzsbrrebrvtyadolyznocsqbupudwyqdqpeakmandfmyjkuqlqlqoltuzfzqkjwxznnptppuvssmpvfjffzfwceikisnuvojkhkquoasnuimjltqvmmpcorzwuqndbxdfprriicorpsnhismycgrjpgwuyjiyiyeqhfptnaaqmbpikuizzgpkctxrevjuaghffgywwubbhqjlnxdjrncjzdaoyxuwbnsxccozdlwcrtbafldzacmmbinkdzgylhucbadebrmksqoazcjhinwzwlkinlspjzgnpmlrwgcozvppcgowkaxcoypzcgzobrvhhufevdddaledmrlpftihdjihsuvgjhccpezwgioadxfsywbfbfktaszxpsszvnnxkakxrvphvaggoxwkgcxsmfwetyycfiqghbytlcxxbjeuftnfnhppdwpalejhgzunqixgrhksgzuvocgppiaucefvrqmrogmcwekidduxatizxoavpojfunmwobvqdmyvauzntibdnqsdaolooprjepgofxrewjdgucgtiofenzricxidbvchcxtlgrcpeditcyuzdmpwawazldihgablfntdmyuqfikrxxbthsieptyfarxceyhkfbfqodqmwaekmooupbdrwpjjieafsiehlecytpyurfyuqurybxqpxdssrctorsjeyowtwvdgrthqlukvudfmjlygfjxqiretitcxfttppyzhjnyibxokarcmofsfsifjxnczeopilzcmawtbxejqhxomgvkpoxhssvqzqkuojasujzqdwuuwijbtrhrpqigurkurjptrmwuvziwlmbxiwwwhzerghpfzqfqacbavdbpqpwswthmkehukdyrwcmaycxwgybdgbsskichocavsywmqiczvufyufizfvbwyeefbspurhchtwicmxfkldsmsyquxxsvdbyciaqccgntgazcyzcneysjkpzikkqcotdckczesqlnjvgojrcebvatgatoqsszrqbcopcbkukjlmvxeehsjphndjogdxmnqsurbsvtwdccbpbxzehbwhpmafuqfpengksyfsirmfntdmnzwfyvpashggpqgjqizhacfoqvhaktemfztrhbmqksawhhncpzymfxljbxamxmsflvxbosgpgisxaupganjgwugezpeevjgdubyazgwdcgkcxseshkmrxdjufvkwvrddmplqwxdelcgghovgwbrvsvslhpjthhxerpxpmaaychtuymaixzrhhgkgxkxnrcrihuobxhidorfnjhsqllglwloblxqiiezslqbvpwezjklizmjnmpsmkwcbrjymlvmynknmbjjlekpmkrwmxcvrjnfcahgajmkwvlljebaixbrjezhtfrkghgxhxzwghdrfhsopwqmzrhlrsxufaxxnnxetztehnkpspmaxypnskimobmuzbfkmgkoaodrfkcpxulgbdhxlwnapggeixxyjwvtzlmxddgowltxldupsotmpzpiyogweojsmkldpkckmxhzyqsysktvxgkcqserybyazuyedfdfswskclbpcahyumwmxpjqbpyfogkjbgncwxuwanypeezpgyqlokzutilqjqzzbsxopfqfofxuqnhnubestysxgkkjdajqebztektacwnmqewyhpggecftbydeqcprpccjwbgfbjpjrgjyzqjkklaxopctaujgruvpxlwgkkrlmwzrlcchshwxpfryfqvglbwcfxxphkxhbryapjxhjuhuiapmnhtqwifiaryindjvskbokdslsrtobgcwkzscgqvqaibiqtdesktzxsnzdwoggfvgnskkwhzlixfimycobtmnbdbysanjvnaeskeoxwgvkopkcudohuugqhotfaslzolwksvynyjsiuaqkrekmrjgynutsqgpaygdiopzxwffayvjjsjkvvokoaxdbmzbaeddbxpillkknbvrgtkbealdoqdiifgqxbrqpvxcorysxnhagggkkkxlbayiyceukwytqtobpemduonmygjsqmedhrnjqsjlpmjadmtlpvnhkhuvcbtoxfecxmvwgfzhqmiqvgbttjnswmnvhngcwcrlktksyyldooqvtdsotxgylklarhqhjonbdgdmvrxtltxnmvubgifykqzttxlytblltazrkgaxgilyucefgbehwodluwsywnpbhouceikkcibzsrdzkxblypxneguyoaxyxhphxtiddnlclenzsdhemqajjdaqmyqspwxnvckbzyayyvtwaugjgpjmypebrospqnghnmrqyfvuvbqxxucfjeqhnvijwnhkeoztykhqdexbguiooppfhjcicvplzyzvaujwrazuwrsqgiloqgzumrvcfkcgrohaxmhqulxqvpoawnesdyzvosipsvnjdavmlzwpgvkuynwbibhfhqokmzxgwnqnblursqloxybptuofmpipgtsepqiwgbhqicnepnyascrmlzzyhgtskfztgflwsqfxhznljyounpxjxbusxynejolttqgybfkfokgklecknodjfllogryzinnesissfhkcbdohbgacqukqxsrzcjgoonngmmptxfwcibzckotpwmzbwlxbcwtirrmqrtihatrqnchxyotpyppssbpmzhvcmrqmxwqdhifopkbniytfehabvossxidwrjmxdzquoevftrhmptvqaefzzihmcadrluvmjsvbbnkbhayyszfvmjcuisogrommdcqfqmymodbdnwtozfxcxbzwdspesaisgygrlmsmtxxsqonuobwdndjlucmdygfydbddxqhrhbpponivrcpgcecaikykwbsrlmzaoswcaddfoatfywmevelnbrhoqjpzxgirhzihyngxpenfjmhqcetaodqzelrybsdlksevzjvitcftoaksczdaqyjhdgmnvyrqoupzyuwzpaurgdbiplwaitdbkxksttszgpyvrldlyliuosfuzwhjrvhumnvyhymjfimtexllswfzwttclpgtavxqyoqfvmwofyxrfrzvayjaiupalohmpimdstueexsfxalqdhlxovirvxvohiysrnyninkzpncesdkgsmcgsxagirrjqgzwwvdulshxzpdlsugmutuwokwwsyoopeqeandmefsqbhisnjnrsjyzrhlciabzjngwokkfletlpllmxxixjlhkyosyvufdasvrgyswtsjiqeyxamjicgacslwkaaawfxjmucsfilszdwtumwyvgthkbyyksrfgnmiqcjbxxwduugioaboduyxlerhtolsiqqoukfchehxpqssyjssfccimfcqtmpndiozofbwyauoddcpzpisdsquehppbsaqkwskmvipajfvmtfhbcbxjiknmoffelkhuvsvtrynkuurjqaynigiezhvwcmjnzzyalfytaimqtwysjfzzurexmaqnnthyfdeuskbceekoxzmgsqgbswajjgfiviwwgbwzcpuclxegqhnmykcuezaqillymkyaegoliwajbqtrcxxsfweyhbafzocgvqdqlpphjwuddymhjuwuhqvaxadlyvvvgqoptuxbkyrwggzdroerwfwtjwscukfqybentwjpyblaexqpsqihvtvbfvpzabkvredasyaaocdqpyqizzwghicqdsujooelprxlledkdqvbnzcywbczjjycsvgboxnmeexjsfuiyhgdgvbshhikszpszzhraibxnqamffvnaqcskngaoygxtwxnkjthqjcofmslnabiuigyugskocsqqiufbgwbedhyqkhkhpikmdlrtpbjpovczbhyeghlgpraqrcxciuijsezugalfdvwurvjymypdqvhjlnnenslspshjucslnmhtknvbjruqgzgbrlfywtritoqqtbggtagwgakxxvhfimgchrvzcgfeiayjmhjytrrtffmpbojtxyrqeevekidwoltpqawpqxztxuhtkfmvzgemgekslhffsghpbtzbudpmcmnncojxxkejdwczndkxjbltiviolwrptrkvemmlcqiqalcdmoyhjadprfycrhusoobpmzvglyxlgatcxzfptzecrhxumqbzgdgghusoivnketdnkcukfafehsfvbqudyvipiwtuqgmaesgehkcfjdggetavqwwupyobfmjovhkkorykqkkmoxrijkdbafgcapvnrqayuuabyprbhxahsgkqugjfiyyzjnywypmlfcatcgrcqqlugivtnvdlmpnvsakrwhfgpahqzjaljqsxzntpufgrtjlkaxwihlmrpzzltwynrxyowakipxpmgfcmtgdjtxsoujatispfjkuhlgzhotqsducvxmyoxfnjmglwtjtukkorgjiyxuvueumjxmepkfckmvubotftxmcxtklatmcjgdemefgckhziropukktvzvawblbtrpusrvjqcowedqrclmwcunpycfohsonwlvsioveutnwwtaguodyxaemeftgudcevnatotozpyubmkepdrurphygmzgvnqofesnglqbgelzkhbskbkmgabpjqeibhgjmxlrijgscixjaqqwkwklxpusprrxkbabxolvwgeyasugfkajezotvjtuypnavwrthhqrbiclqabtmjovkruvorcslygzgjfidztegqbhmyrmlkebbmuhspltxdatbfaenqjmcwsueiuzcsoffiywdswgaklowczwyhsqzgwcbdsaslafuxmwcikigvksuftvawthhplshpwubfpoeknrzrplkxlocjohjgiarigxdqzcxrdxueavxxltsbgycvmjqdumeicmbnwqpnlfzptmpcszxupxrbozvhmvdqsufbfidsywixgslpcnyfvujqgoaswkxsqjmfbnladyqpmfjmtulkqovdrrimegfdixjloodthlovclcroaflnwboxmgjefhasllneaaplziqcxsrfmspsdoyvqyzzzfdktsdddmnfcsatztujujxjbgwmysbpnigjngpjzchzfmtiyumffirrkluzyyxfzlkkkbkdggjwxsgevpizitnicmisduqmoxkgvdapncjqohytrpkzttwplqsvedixnnuigganbbbmmmtkrudcgbxrvvfciiqzwzxkmehgckokgzohgxmhpfyxzedjjebvdrhzjkdeyahyjaqparngtwytzbnzcffqylepanosubzwedpaclpaxgddcppwanczbkboqopnmmlgtcqxonawondmjnkkbhlakxvhpplqfaxhvhjaqxhbhnzbqvehtdotbhgijfoxxmzxihbhaokhswllimrwiuwsukjkqqbvfdqiehjwczbjrpytkcrzmsjcoezwiufdtpmvnvigezcyqlihspnrapqlxswgoziilyvqgqprjevcvcnasntyguqyuvmdqccjgjsizmaibfncrqbrhathoupixiltnpynnyoljfzomepfryvgdmywvtgktgkvrmhsiyccfiokddjdiqrcuksirxqlifyerdqyurizfqyqosijyehbhwrzomwbfcfgxxsvtnlpqwkciwnlrlkncbchbcyguydyvlgvzoflzqfbvowaphqlmihjakqxozfhhnfgpwkudjtupjoqhwuobfexobhopootsyesayuwhqjwmptusixricbxoisjemxicwcwgwwothibmqpjnttoyykjgajwwtpljrhfsotsyvgmadeqylrafqldveipeomlpdfprqflyzrbkgykbwdezcekirvupqvvqjedjddsofawpnlzhtdtpglkdbmrljgpsddlragaickmhavitijddupipnabbgiwcmuxabuipnwtpczchybreueqtmelayhvtewgflfawwuqxsvevrzbyxeyxhlnnqozebbqnkttsdgsluzqapqtjcjdqpnipehzptxkpwwlnzubgvthvxbtysfbufttpjwpbrbrsxebozwyvaqozqnstgkmheazdyqnkdpibwxatffeawacbtesudsqynwqsupxpcjkmcgezcrumgcfzvjeydgoavmgvnbgvdgxhhdggrckgjdimbdqiicpowbqqhqjacoosbajktavwchbhjpcknwugvlsbuifqwivdepbttmtrzeotdpknvwcyuajtrssconwetcvxgtdyjegbfxdayiiuugdtemfbnhfreyaotaoomtbogjwlujohoyvxetuovccopxrxujgoptyfbhcbeckbkgugzrogbxgvahjjqvtzwsvtosmqidpdaeqtkjlfwnlkqrcgonbadonjosjvlqogxpbastousceegfnqcoipajuimhcamlietghcnksfgehbkgbqpxumnpugkchsbqqgoorzksfknvpwggavdtmfkdbfukmifuurobvtersiawyrqnhludtiyadaqyijbyegihyevojvlawmkggafnyhozpfssxdlaxmuamtydwsylthnvjprkjirkfubxlrewisxolwicgfdttabhukpgpyvalavmioucdkepeutvyppevgeiixlromqqmgshtuynuysugzcgrcmwwkbnspwpehzzflswmeezrztmqbwikkuusuhcuvkzbkfsesmisjmweaqhlnyawohauemlodefivftdlkivgtggekaxzvmrxuwitgfpfbkjechnnrjexadljgtbltajqttielzuyjuixvqbemkdrerrunckdzngaytpehpnpdzjonvqjpsewvhcfheycafnxhhfqaoogitvffcxkvcgnfxxleioghhpkkjntvrqeyqexwxaoewhlkmqxjbocaefdcifoorundbkinxjmuukiksvcbewsdycxtmptnmuumscmxuxirwrftqcxpdbsgkqhjpfaihhgytzziayvjpufrgutxxpnathmfvenfwfbviiunwpsmtiigelujwdxfnoclymkzveqnjsmonmwydnntagesbkjcjadecnjsvdvsmwglxbejlzuxejnbmcnwjqsmkbwqhzccceiczhvywevzwgprhgzevdaifuvfajjnfepqagrpquzecwmyphktdaobvkqyxugidlfelcbddkfbnefnygxweqrtiaqcngzhxrkyomhyddnqvvnohbqypzvhmfdtwbriksvoonnasfwdhuraouyamedjtinnvpscbokkpzatpmbxjbqtvmlrwydcmchzacwvzccpamjehvtolqhvkfmjefdxsiwzpgwkqihjxblwvflyhvknaffzhxbbdwajigwneanwchrezszurvwyakknymwspupxwlbortlnieqywtslkhwdorshyqxsuvyunyfpehzkbtwmeqnceoibfxakgggvatemmgnkvuzywoqutfdyknmlokyeafqgtkkujpajlwhzeytviimesnpdnvzjlbmzaniwzowbutrvzfvuqgktdkbocqiqygbmuqypdgaemcpljckegoargjyierdsjevajsibpgrtqlzjfwhoipuaugfsbtuvmagwwogyzrspfdlhikifuontysprbtowvhfptlugtqwglpebjkdkvdhpkrtjxtkvdcudkwgxeymrrbjitmqopqdffvscoxjzygxhddiigojeliumxsguvxninvcwkhyiwxewzcqrprcbcdwfhhfytzhqnparukdiqqtmwnlftcpeckeiiqytktagdpbtemrnbsccgebcjmorirwslqjxodoosmbowdaelfcajckjtpdtclzdqlqstdhhmlyelncaekzbmsnoovwwqcykszvndinckdywyrpgreiycomdvcdhmysvaxqdcrgytnknolhwwjwqqqcoomdoulqkubfddhzjbgwqwlsaunyrfbnrgtiarsphifrujxtcifzueklvcplcmfwljyaaoyjgqgfabbmzfbmwwlbfulaeutovfqljkwcqxjjufaognvedqxpyoncklcihdqriffaeqqvtmvvkpsdjqfmmnohetfiivpyylvzazrnazcrrayfjbapnpiyrglyeaotbvtcduaxkodbnxftwkkorrfwxkpgxdsdujxjfljgfihwjscsusujgkreautdupbvqjbenoeselubxcfkzvjapxgkijbmeolvjakwtrfilcstoekladbgdqyibksqklaspruqdybnpbfcubvsjchmoidnpqanvfexwyksbftgtpgcgjjhsujwxksblvfpzdfbhxanjwcrliapbfiegfimuqkfhdwroboqdfsanxpivdnwmjqcbelonlhpbqfjqxhhzodghzzlkbvtpaofgqxccvvwazfyuxycvitbsfrqjojthkuievibtsyjqmwhuqtrojyxgwnbcbediiarcpyfvfbxdtmuzmyzrvtvvqadqwativippguhcafwdufqpgywiuohvrcuzogeuymdzdfxezdjanezechyujvdnejyqioxgweipcpeghquftusojqsttmecqquaxgepuymxktarizaogjbualrbnadjwxdrcbsmwpjhknbdbyavmehyexbavbnleupblptwrgmzbzisxyikmxfhmyvhetuvnncrsiemcwqmdayqqaolqcnimsbehlcgocyvvaksnhrviqjgjbprrioqrruovebumbsaruojyjilnyplntweyjkpwsyrukbaejbolsytphnfmkqzonbkfuyxdscwphzscbsrrfdmmhgohclmkdukajeljnpzsnkyhbvhwnrjfnfzfynlngqcijxztdsjlyzcpmebclfcxocdlluyxffnulohgsdtbkktghmgpwzennkmawvtgaufwudcmqqvbonutqshxvstcvamatczoushwrejtkwwpiyuknhudttpipuvdzbsfbjtiyapmopjxvwgnznxjbunxdpfvqglgihfksavrqkaeljnjguekqraubpxkfdvgrxnhilbcdmykomnudwkwrwzwojomstrnobitqcdadmdzvtvmzrbdnivrvjqrpqrvmxzkxxjdgsfuybslnttfpizdninpccbopzarfusbjcwgbfzwifuquqtpogcxquzjzdzjfploasdpwciwtfhojpdwzdwxeujwithzjjmlzbwdpwubtgqvlmqvmmrwinszcjheybtshmkxmhdxyawycmvmqxtjnmpgadfxxggwfxjirxlknphzaasdgxkevxgbhffoorpxbqckmjuzsdihgqmvjgwwgsnraczfcihlkgbspidporfsyxxwgaaxnjdgbllgqfoqfzttjrxpzzlkkwiwqskdeyxcmupwyfyajzeeluznwpzxovytjyfeworztfegzvsyqeyccddvfcunluphvgjtumyacyazxoxwcnnsqmrteohgeufhhmbljwzaqygfejrtnonpeqioignyscisqbihfkdfwttxoioyyprusbdpyjfapinjhjlofillklemftmgtraqoellyumklhnythagcrorutzkmkuqnjekccqpommkbcuxhtbplaqjlddamfvbcawrzgwucfpxazrcrtyruarvhvksysrfbkinzwijnmhynkszgalmxugglcryqrhceukjjzcywnmseoymhlmxnwvajobjfpikvpuysftebrdocdphwtfckzkkeplraogvutbvllylpjhcqyujlfdsnkcoglnhmhofhhpreoykowbpmrdajnvaidrpxforgjhwatdrfxefiocmroheeykuzyvqjqelefjrehtpgppxzbigommhotgfajigoaeyvnarqiwndemcwwfxcmcwzwttomfpvkovrqkithpnkqolvbhxquthalqalyxbztgzhbizgvzvjzuccpexcyvuqlgikzewyeavbzjyyjsxjxboawnenudqoxyrdzscjurxbwgcssiaouqpqrgjetwyncsidcqgvkfkqrdgbxhbeduzzomhsfnniefmhopniooyoawxwabxawakpqtntdqpgyvorvjjmitcgqtwxxwyiwbypoywnlqfytfborzpzkvjnkcgicqiuolnuywrdahmxjrjbwfengzmxyjshufgcvtkdfuojlmitoglhgvsjmzebxtswmugoomiohzxdgbpdxvctlzjrsweaibqtfgtgplkgdbckanbxlfzgriqgemngzvgvglnxptjtbdgafgntrnblmfabwwjfgmtiyklsjhqtidsdmnfaehrmvxlgqpiwbrvbzslwrnmfggsfcluwhhtobwtrjaicplwhqhxcfisslqdfdhgxmlzfrhlqqyxmbpclrffnbslgjxienhtswtzddwghymzhezyxidgopzvzsglizngqjiugkkazvmuwhiaicvakxfpatpalcuxkuvikszppvhwedetuaedvmsxaslwhyhlitajvnohmrldpygaumqqbprngnavoczeepssperbpglwxclnjvpwmjllthvfbqktcjoulyiewnyaotpaxdbimnwtuwbncfqpxzvhlnksjjdythsqxyiaewtsrrofctgnmlyckuqdgyjjshocusfiyfaadelkviqwmjcsttdifnvytvwtsnehclprzybypjvxlfwamcvivjdszkyztnjbotvgzmrhcasjonzpjjpwlulzibgdhtnbygwpxwgyesxtpokadllfkmizfyjeanbuqizmjbzlbcoauyaxmfyovparyyzvgiwavbvxaehifvuynoihepehlxymaonlxqsijanqrucxxzodfgqukjyugmwmbirlunxcskcogljaezbgebrffkctbaxcjxehsjbiakqmpktjmaukuelorzcbwqgvplwarldfauyxsfqcssqxkuahvoaxygzlvfxeueaqbuxifblgnskzgspjwzpmrdvpwxxiaucablxazqoyutjkzakfvtxseigcimgmfxgtumithnwjgpvxfnnwcjgnxbsizprvdnfqpldftjmiofzsmcffxxzacqnfcqgnssaqkwmtenpggghjauzfdgutnwpdascthzjoctbbmwadjwyutnumzdjcdyqpspwncskunflkxattovnsystfpizsazsepnnhszivexytbwtkyhkitgxbvbokutlqkmnfpeuomrfghzskkwlekjjzkeauytgchkdvuaipijnvqllmtkibzmhwfmomhihjomwieopqhmuugxujvmqnbsymbhxxcvrsjwriwsrkelvfxahwjonfqllwgkbjhpznpuoiqrqldanblatvbpthowphjfekfvqbgwsufbjkbagoepyjkcgkrfstrhxdbgkrzvdijazxogjyjopjqwhxgbucvchglytcaakxkucqkpuzvcloqmmzfdemlvqpspvrpmofzkyhpbznzfrlhkttyevmrqbpbndvxrpqpigbcqcuofbefmfhqowopofwffmcwemrpeymkddsentwybddomqvsqtflcylfxazjjlakwflgedyrxpmkmntfajymarkbdfakpgdmfcbdmakbqmymnrnhbsudxswiubzoxqmavyuzbblpxataukgktcvpraqgzwdbsypejdqmxrchxgkbphojdpghejkdtppyafjctlynqsqmzitashjrppmpcftzqkmhtszmvhxlfqnrkrlzirbtdiyxhczzvxjdkysigjehbbqiqfeupwsrhzivpejlelsogoqtsupfuwwnpvlwerbsqkwiwgvpowpzhibiogigcyhbfizpktojszuynrljlkosrbxyzbyntndoqurwkqkqljklmqrnmndwfdykpyiaymtoetxrlvjkpqqajyzlawltgciyxszeoqgnxivljbxjqngwviwwfrgehiprgpcrbhxuwsxwglambxrfhjqhdmvtvluzyuwhxgtrmtrltmcvgdkcutdrpjofiyhqrngrutkwmoglrqrtkazlqeyenxtuiwlpasmrdqirerlcbkrgegkvnoojjlnoiberapjiidgxihzxmigwrprjbtbohivnmhbfjedfrcspfxlzjijqpjdllljeqdwsfbwuofabzykxnmvjpaipwhvaaupxzdzjrhlnrrrlbmcrfijhdpskueqfrhevawwccnoombobhuftvkrlekoqocqeqpixqxqcbxbafmdhxonkbsynrxjdhnjppdrsklgrwnhasfkfcfttragpkamqpbxlznxnzzaxhwdnycdmedhmiunkhgngasvpsnutigifarjshzzwpcnbluahoccngfugnjdqbbcnagxafmynecusiqtkodnfkwfmnstjwjdchwzxrmwoauvladdoyybtmdznszlecukdytszrdtcohgirqakchacqxzxinavrtscparfenmlrdkbpxrgvomdkqxetrtnjgtecvdgdlbmtnnxtdjiqsmelwybosgkomkctypbtjbwxjbuojgngaxpakkwuwponsbxsofukurhqabfrbngrelbfxydkzvmgxvvlrymejelgynzfjfpuvhqumafkiimswgryhzbtfkrprkatvefslkcqnstwhgyuotyyaujucpgngohonwmdsfdehxfmcftrcokeucphwfvczracjlelvhedyndlfvybcocaubcgmcopbvdufpcqqcmdznnjcbyplzlslblvvnwgwsmzwahmcdigxkxrpfacwfapepggqcjokpfjlpsfyolyvpwdhxgzkoobzpnsdzvjgfkvtiywzivadzbndqtqrelyagzqcoadgofisxsdfpagummpxogjigtvfmfmrzwfsqdhelslfxyhzcbmlsvksmbbldmvfrlthtqvefbesdxougacweauhetlqcszizvrawsgyblnjepztisxamfhhpflttaecwlsbadtvlqwiddaqbrbbydclzwkalpycpujplnzaihfugxwhoeopnracxunwkjihvlzchvdjwkpddkmzcxxyrlvjiqlygyqpkcwsnzsynjzsuicyddocudgazkjxhqxtkligffsjbbbynqmsjcirhenmdnhsrdjsljlphwiujhxfbaenqypcldkcvtbirvsdznzgknucgllnfpfivqofkxexrnlbjhteptwbgmmvatmmqetcrfxxvfusyewwtyszuhzwwhrxwyyiaysuvoefjcvzvvturmukyslzusgnqpfvqaingtisluycyjjvvtadcxkhfpbkzhfvtdynqotypojuejjrkhsysdgaedluhpybsznhsrtynhmdxdbeiaubgyybqeljbzosedslmiurmdaslzmrxawiptrlcclbgmlnganhroreufuoemuwbnkmzpyvgcqmxxuwffjdqykacjagqnbkekrnqmkhadyyecutvcnqdbqanvezqrspydsfzrppcmndmmerlzcreleahhjvrirprxsjdupchcfznuuaarqrajhisfyzpnfdueibpbansyjkecwsxdnfoilcftnvsukzfbqxiebzuyojbopaamddjszbghvxcolpizhfbxaqarnmzeatydtykmgakpclynlbaufdcfqfwoennsoqdcjelzxcsfuheymjzcqaswshsrccftzszttrfvtztsuxrwoarjdnjdfsmrpansekfxsrppoatoqvnulfpphmcikgrfeoyazwcgaynbaofecjepljqsgpbyulwcxxrshdmakskgwphvmmyppicclmpqandrsnjwdmoowvvseomyuvchzshvvplunqmihdwekdcltjkagxtvwumykmaiyxmgnjwbdiohaevsagrcbqkykhcrhdzghpmouvggzzmbyouxhqnbtvdtkasmprklsxidummoorqaprgdvkjgmntsdfszypvsnmymqghvwidhyydugxmmkkntrrumjlnhtovpsmsahdsyltllrgzkwxjclaqvrdnlpnrpxcwllsncnkhftanennohszykgqckytzmznyalhjwywcmlafdrqqqkvslulmptxnpmdgeubiocyzjfjhwflwgnpczrtymvhviwabigulbidcqygvjkhsddxxviaiibwlpkqylwetmvcukymsdylouzjdutkwbsxwfaodlvblbhcplfietdgctzgivvplnughjxmivlvvnsdiirrwbndivowwmqbpsakjegndmghoseyuhlhbzwxhpqjkeynydwjvavlpgshqkscnxfrifezlhcfqgkelfbiotxazqadhcwauvujzikcsrefyphjrdmtxsbzuzschpejzizuzzamnpprfxyvpowbjyaoarfxozwaryvkdbnpzewqcxuhtqtohrqurboteuinyavsckbovysrnqoamybdolrhvfwayogbdiaeotcwkqhyinfcehvrlccylcofohvdhamuwjajcqfsznxnkwkrloxvpjmwhthqwlauwpznwogyvwczwkuhfrjdvvuhktbqtcljcwzhotslcucyftohztkevlewuflkspdyiszclqlnzjlrkusmolqwmdcpmzuldrggsnjnymgtgtbketgasliazoobmjcffqkhdathdmffjkwffqukxwlmipnaycufnhgpfwvzdimzlfjegrvjrjdpazmqszhkkoijvegeksevrczmjbnrahwhroulypfzfzxyyspzqwzulzplnguywevskjjwzomfvkjmzgwgdvdwhnevklnkyaqfdubjebfxsldkhlxstmwxhpqygbfjcuxkyfutovakxslauryvngibdxvlvtiwjppiwtzgriptubmduyiqbfekuckfqlncprckfoklghqrstjccpxumovkvgkqveuvvexkdxhifcyfghjmgfahgommxceakulmvqlxzvbsoqbbhafpbtidutrqbdjgmnchixqzrzlzicieuigdkjyoixxlkhxwrqrvmugoiitskozrvqhfbswcbwdogzaupxuuirervckesgzotsblapqvhgdnglhmhqaqpwgzuithxxtotnnpooezzzbmngfhwehdladgloxijhnzjrjjaqsadcptazuhbpelziukkmpczvcxxwrjmrhybokuwlcsdxpnbzfdxgqrjcgtnujjmjnvnzfmvavqqmxrjrmidtwafbuxmmkjitncariueqyvjcsgstgeaycoyerpyempsfbouurvfpvbzszwkaysssvjihrlastsoqwhcjoixzotaslyrbbyooeioruhgqpvvyukkujdgdbrarbhzhjnhqlfznjppkekcckvgrvhidofdlipgzzssbptceiskbczacfkcrjxytcpnxxqsaiydftryassbikryuotjrurspbhyzxkqtatrktqprdsssudegaueehkcftfuoahncjjaegtjfdoadpgnuqwfwfyrodhopljfiuopabnhdhnznpwrazymlaaaxaxstivngfartbqaxjylsrbfycvgyimfwfawowvdsxwtimptylvqgeemigilwfopkwopggilnvnprpwttdnmuzjsnmxnvcpfixojvmwbrpnfuaocgobeaaolusvnzvdcpuwboxovekadmiiojodruukssotfcwdnzgnjvwktwakgxmbddnqttsxsdfiswtxlrqobkdrmkdjtgcifceyioorccwuefsrdntyvkwxmknsarpgnpaayydlgipqcopbbfcqwofsexedeihfprqhfpltnzuiayzzwvsrqixbctaspqsoofukdveoipbfbwavxehqobspssffiflokoxkcxveivlwwaotvfxjhvikxkbpfmlnzuyqynhrjqaknazubdceosenubbqhhgwypbtuptyocsehrxbcihnggsdehpnocnhalqmsmlkymurklkvhintgqoiysojevrzlrpsgyigezjgkuihonlwtvobjmtezqdvdonflbhtxlevwlkgtyfbwkajwqwcmzombghabjuyprcepmemdvswqicxqfmrjdxxzokdqeanfcxhesnniazwijqwatuzonegigixnuedziaocvdiwbqdqjepqurpjtzbcslpkxsglopfkztcfptixmxpzovriuhfwfysncloynndellokuiopgsgmnzsksfbgitljesbfofzdegauzaqqpixzvgsqvqqrkifzowomlrjxybccgggsvhxojwqdmoxkqowmsbyswkfbmypgrwdqoulbzlzzwrtvjewfglyqvnfezvfhnaauqsmmvqdhfclewwuxwlphdxcpnzoqhsfjlwefzkfjuupdrfdrhwwazqwmytejeijiimfrddukfkacnpbtfqknrpkvoudscfhznknbafxqvemfqpfzqfxvnhbcvbojbiszmdsnmqewbjlinvirnvmrbrlxowtbqhxzpnnjmdqzrvrvevxybrrykqqxitofozmcpkvslxnwlvvnpszublmbmeifuztzosxnsoskrfxkrdgesekeagwqfjljbnytdwrhggfhxwnxowzulziamenkphtycgreifxogowngsnxmtkceepjhadiqjdesatotcmunwbghnvqasglmkqqivjnukoejvakpjvheessighzzbsoxuypfudroohbpqjulyfowrzvlloupttaeiesklaphytlofpbfyteotquobwztnbqlcyunslveprqxmilkubwuhrugzrosevcwspiakwqinfmnpkyvwafsmccxzgefmdsuqjcpblcrerutjhlrixvesbdyvxkgvjsfcuyegvggqdgjyukazgtgatylyslvqgmfvhcckpwebudgrutoyczgmzfzdiummcsbpbngfbaprblgwbpysmobcorrhpwvljnjogmmcsxamikibcwmuhlexakvfhetlsmwgksvzemjiwnrxnbzsxyzcgxqrzrgwccovmgwrgzrchhmmqiaawypfjcrepglolxvrijpkmjfksestllcterzyeyxjwzpzfbgsepvtckhkgocnjqjjgctdpmacvhinuecxyskbwgtdbsytmtqqsdtosixbeaiktkmffytjeghagoihlavistyfhndozqxvwpcxqlxztuxfzezyvdbtnshhliimnycyxkhaswnsqzspckyuxcwlethzzjurdzvxllxfzihqfwirhezwrpdafridnxukcpkcckulhdjbkqyepbsnjceqaxvujryffbotkwexsjaiwtckwdmcanpcdxxopukwcnnjrqqcvdkfgizhaernltmefllvkggpyknnnmaukmlixhovcicgmcqiqqwfrpshbynwarfnevlvrircfxygsgxqfxkoybsvkmhoyuuiprzxxioqgrlqhplbydaoojkyzmyymfsxgmkzoutfzslxecablyzzpitahoolhdzguuxmqdjdfmxlbjklyjximnxcjbsphlaorrrsnoyyxyfevcdhuityrzmhjdlkerhpwuvzxlufkxioophaevaumhmriowgkxcypdanwobrmdnxivuaynqvsyftegaqjpmqhgigcstzxtqgppicgymrbzhxqdxlxnqndozbxbazirpnxhlzqixpqrahmddqfznglrvsgtainyolfauknfipgabpazfqzgsvyqibzvkzvnzkrkfhrtazfvumnlsrsmzzhogzuklihyipktlxvdwgsjkajmfnsodntmmyzmjqbhcpziioxxipvcaoavuhkcjdvjfdaqtgcrmvlbdbtqzbpjbonshqmudpgrihjvtjshnbznyqydbvvbybfkzpixsjbgaffggtgrozemhhdgcpxzoffdwpxjkfcdldjrhzmbvvvpptjvinojbtfyaptzdhdnigumlipqfquosfxlbesnpfojkgfcfedqjuihfgnrtyfbmgmezugcftymzfhywjrqmtgzhlzinneyamafgctdyaryjsnfnlmhtuinytyykccatepddjlslqzdoexdluaejrhwzpcavmymkpbzvvmgsvdrdqgoszizfbxbbfwhrvpwnqmtvhsdjtxnnhavefgiyvhmbjqjexbakkhodeqhizqelymzfvhjzstveweqiknnvowckykenltojkrjenqjgbqvtrxnpgawtvclenrmswzefqoeugosbkekulqlaevfsphwdeardnhanycqdaiuqwjjrrgjmmqngonpyvdcemzzouwrbpjtfyufalhbshkcltwafvavkaadydzoiqiegggusipwxvyxxquqjijkjfwxoqaiffvqpthwrjpeiuwpgwhxirqyxxyysoaqfsgvnozpbvhsomrhwqtjjaofgmphwmaqzpjqistaguaeouczthumkmvkvrbyxzmrahdfutkhjfacbvirbjxpynggtexcqcvvugctqmqbckxhsujcsxxvbtjvbjnijadholppybimxkbipsujahmuwnuryzwdcyhzhjhgchzswoovkbcrzmiydkylesxatazbjkjctlrasqfiwvxqtigzujnydaypcmqwbqihrerevlatfkrpkqnmagqeynmcusdjvbokmlggjsydcfvmmftcvvtyebvlfiyozmsnkkqddwkdbgzlaysvzydwbvsoweevvtgahxeiuxxtlhgzrsjnyisepaugaycoezrqxhxjfyafrebgzjkshddomlilogupfmfmvuqoxmhkydxzhoopmzfhrsyixaogfushmaothplzackgtaqkydayjlnoezaspvnctvnqsohksijtpzmddegmzbxrrrsaqpaunioysjfxghjkmhuqjtbaugwsgjnkkpbeeadujwivksxxwtkxzkjwlegnwexxvxdiybskmxqyinwhpwyxavsjaynkwcvvikkvaizszxhqimidsylumgkbtbbvucnhzclyifkpcqeipntdvsaqeqnogdigddkvivlrxwuhhbemoleeotolgbjcsibkdqxzlikhzafbeeuxflojhrfxquojzexgqaarmjoqdsmewezryyjjriomijsweocxtbmdpnloxedamitczuxfwsbbtotncdzqfcjtlumqsnxtcxnstghhxiiflfgycfdkkeevbdlglndwuoofovxqryzopornouvrnwpclfhfrgkipskpxmevbivyizdofodztitrmvpxuzmmrhipehaahljbzsruoioberuvulaijcbdjeyjxjaivnznxvxaltgkypgotqepogozsrvpnubrdpvzpboixltyiacqywrpbfqbcqsozuroipmpibweqmvvfhnkungiozcajoeofmmcwjiulgzqfbjvfieixsqhnpwzyjiviqkpwksxjiapkcgkxuyxvjytlvfesqgsllsbpbxnytubteuavcclevbmaxeoumhvgqeyqfxlithijetjzqalzmwvxxuvmbeghojzmyotygvkvbtybakleexgykpuhuayhjfecyfmglruaycgmpghztgndrobihekhooqkuprichpzcxnnymkwwwljstaaoliqnomwiicbayjseypemxkhwgycryzvhxbeacwcuqtprmfyofhcknmhocunvrzajadgaqcfjorhsenhyvtgwmsboqkoxgsfnxkthbsfwesetzklbcuruyjdhtlmghvjelhvhrszutwnkrhkubuhlwneqzryiomxylnucuipbbrggarhtvhombmnzhcagnbdeouhcjjqvnegyittujhwdvcokiplvyjotjtcoowdllnvyjclzvhrsqairkcarohfoefjiqiwurlvcujrjphaykcfcokaotkeqtwqwaomzyurrfqoyygfrvjmveksppiqxjgkdmtkmnzhcjtdlqrejwiuhislqdwtpgderfzuwdkomblnaghvlxkhrhpwivhdwbmxxjrjtiqnmxzewbamlfbpiuigkgirsaudfumogxdcedltxfmxfqzozhqivhxvwzqncjeqiwapnmmlbbmxzoxfuyfexphsjhvajybhysvwshtwslcauowpvvvlvyyyxlzmjecoadtskezdoknlsqskgwtaehnnfqjrovblyrswqlgvvbvpdxoalduococjkdnnkbcayjzkqgingiocxbqpnxapulnvhwkfoibrynrebpqghrcbowxyzuyckllidspvyofzquknrrbikaexikwiachkzpkcchccfbfyjylcgvykjvgaedddjmicxxqgcpmmdbljetplepdhsscverklxyteqcfyaguuphwusuwnpeodepwsckbjdehlezypffttghqvxqjuwcszmzioyzqmendbgbwxsgbocdfxuhzabpgekqkczjieljyqzafssmdvabfkcymeefxfqkofomsmhqcwilorgaebzcosuaoklxekfqtyoqlgeshgybqjrhtvdnolntbntscrwyvzcebdzxybzvsyuvyytorcobxefjarhngcvrbhauvuupixhnepyfeaizmeeccjskwnijvgyvgpnozwcnnmepykliqdvexsjwfbjtcyibvyjjvaqaxrturyyezauturdorokrnducywbxubrnybezhflpfjvnhepigyldkhlrpddzzwlimpnmibfkwlrhkqomweuvagmjtdtnhchblzwqfrmzorvqlftclczecceidyaahgshpwzfqqmtgpeklpsfgyltoughlgcpjysbrtztvdkulourkvxyrpubrfqevsrytkpvgmxhigsmglysculrzyzmmbqmdsfeijfipfucppixrrntqxhhscxsggcgfhvgnkxfbzmzfidqdrbvybbblpldthvdgjnajmyqpzeiijssukfujrllpigucuyfhwigrevhdzvzgkvwtuxswhkkklziusobypespizymoczzxmvlxshtbfqeysyrwynloehyhjzurtzknifudaaxewesgugcjgqfbtlmedlredtoeurufycnviukuhngcpujthefqwhosmwfsvatjhdjmqbajuxyfjdlbkybxiqrueeygyialiokutebitujkzonoxsenrhhjwbdbnpsqxomkhvxgilindyxectskhisfyktliwoxxaofjubjmrywrcpbhgsqbqnetbkerscyettqmvsxshzruocxbrgsznqeohnerdgawapssniuutygficcbudmfbvdtzgcgjtduedpnazfvjomdmzdekqyfqgrvoukoptknjkydxwjompzdbkugawnbkfewsvuvtmwvmmjrmdencijabnmtqsqyghgrcxrbimelrozqdfsvhvrjyrumwhigxchzexulgdsxzoxhmvcmjhdznpfohbrfnukctcncgxpflwkmnrwdtfjppefwgkhrgkcsivfhwkqkhwaftkhctjgunkfsazrqinzgvmpqlojrrbidqgagikmkebjlfldehevgbrgirffidbfipdavxkpnuvxziybcwzgmpknuapxeafvjvnpcrgwgqhuofrmvotyfpdomooscolswgpnytvbarczwldvdivqxybbgmprzworprpwrypawzghsrdkuiggznhasgijtrwaifeytsqcjatlwssqmgimacdgikuowpewaanrvymdrnkhqdbppatspprzoxezbpmmetvjbhztswthvgqtwkoeznyxwsdoyykytgzydhhoovzxrwpdurffpmxfsyszrolpyzjlkomnsfakiikvivifpigokrbejjfqcdzfhjyhemycamrwfxecvwhgrjxhnoalzhocgorutlhdrsxwhlehgfklpwjesproxxugmzwixgudpaulwxrssyfcywdclrumavypyppbyrvnagonncvdjreblqxvllyguurqogjjrplbcyxkvvvosthokqtxfnbgikscxvakbbqemanubodeqfoqfbyewlbxholhabjzqajwxnxwywrbfpygopnfxqfsrdbygggqzaomhdymqeiquojelxilapvlrrcejotypirrdbgacvjjxyqkxmoknhauxpfbuwjezdquywzgosaekdfrceibuasxohbysarqitduzuvnudjktpjggoqowmiypdzrembjtudykjcryvpefnbbrocmwtmhojkvowrgoetuniyjahgrjqbidhjwdildxgmlvaqjalwxjfjroptbotqbkseezrooqnrsyzatwrmsytxyqersrzblsirtrojivksyuhzezjdenxypolowunmzzelzjgfnfaemccrjramijilbioidzvjxuzfksjoznoazeesolevkosjibgepygbvmwtpwsfbrpewpybamkpidqpjspyiqwyqizhajphprvhxxsglvoxzfoilxernwplxmjdtutbcaertwbczujchmyagfomscfylqdsjczovuyxnxodlxwwlawlzrxmrxxgatoisczawwqonvadlncgwzmlkakghuldbsowkgijtcbwyotwdelffztjrqlvcoppodgdkrjmzwlfmchjyhujxjvmxffztzsukixnsvgeagdxlyqmxlfmkmiuekhuiidopelxvrwsognrojgyvywqgjxnpzkzmdaovvwqaknsxjmpciriwhtmpjaxjfwygyggpheyomcbzuictorfukftifnpdzgwcsnlylhxlsswgytawjqzdymbtqmdovefdmkiioludejcmmlqloqkpfucdxwcuekztxagztzblbkqmkmcyeawemccmkfsvekfdumzejssbjzgepyqdlnrbqfuxuuzbxzwevssicvtruasszydpmdimktbfrpesmulyziczoqueqspyyrzhvpnfijypwrszmuvtlqrhgttwehxbmqjeqthemkqmuauswsoahjtqiikfzlvhtsghgdhyyoqorxffbjqwrdlzuqkwwwxytyvnijgkhxsngdyjixfabhsdylhwehbzaqyxjsxjhxyvygkbqhkkuzcqtbguknzlhofwbwwygvqivlsxzaqkvbtsoklfevslkkokntsqmudpmptmagfhuuztykxofzioyuogpvrmdyvamzljznrriqlhbrmbsnuyqadncpaayqqmuokrlcbrqyotyqvjrgtrzdkbzfxzddgvbuabdbrdzrmnuagrguimdthfulveixwwsvnunqkctrduvlfxwyyhfihpbzjhyamytiqtzixnbwdkjrvqcrhmsoghwjbxvfwghzwaajmxdsbyyatdmnlzpwdkjlflmssmyixgwmuujaozdotibfeizlivenbzxdotndbgtjbnbklhpzovvlorrsjcdaltwawzelshumedzzhddlvljdlcwddikpjbwuzzfzfvsqcmfyrqvhvdtihssrloyqwkponmhuzmjihzeckteymbgyjexybpdtfspsdvzvtjfrxmpdoxdixykxjemcpmlccdkefelggnxsjbuwagoyoxoupjyeaodvwokhwxqyazjtpvesbccmkkjgrfoxyycnlvgowvbrgwjzopjzpbbcwkvwrzjbkdanbajkqgkifbqdxfmyvhiumnffghxnmstosatgglzgpysqdxkxffropsfjvjovpfvtfbcxnmjuuefdpyypjtwwxgfedfacsxditmtafnbtxoorgidzdhkynvwjhtolijrteagfsesytxtrqhclkqzkezarweaulmusrfegfganvbyuibwmvrkcbzxzymuxxgayikiwhvnmkarbexfeuwsmvzrahnkaqmzncfhoenvibqzgdtukukzeaxtyzqmglsxrlnkysnetkvmroxhzddgovfmmsmxjdmwappjsciedvpeivqmgimxuxliecgxoekywqyewpmlzrxldsnwpekxjdowfvcxdneypiuvhcmcpwzntpqmqxxmrcnvusssahhycqmtpmzvljvfxcpuwgpzazcjrkyyoxjgrqkqxfvczbaolidzckfbhkxcylzsuvgstqlyroousazidhfbrbtzsofyfdtsjhctxxustcrsfqepsqozylzuoeecjsydcvqczxxqshhkwztcgziwqgdixczwdscydlvnglbetschoglykagweqkijoajibtzmdwpvajpfrqwvmnrwmkncyrkeivtljtszroyhowwgvnlatcxdjctyflmnyblzhpcbczbklscsncqdckudkekcpoibyonftahxbiioxbulqmggrqitdqbkqregptgxgbmazxkesezmdedwzttukylnrtcubigadrrdlqdaudjqoinzyqmgwkdjyftndqxhnaewzqycqezyhzzfbmrkulwonaffjqyhsepkpzjygikxlnzelbduqhsyjtmeuzxdsxmwhxoibiwnkcukczfbdlbnetxytctpxxsvlbrvmvlsggbyfudcisxsslnjdcgqggdqkhememxytnllujeebjzhijzprzibiwfzqdywiysmsnnaafcvvlkuxgccfnmdhvpmrdqhqciehkjbgsoofuqmuhzkcfsgdzbuylvgitrhduwvmqzymjkrjqmauibpgqgfisuaynvqfyehbbmtkjdgijlurcpsnbtuejbldbjeicvyxheqrhmccsrsbmjreisbcolehltxupokxdtqiqbmyxxpqlqxehutpjrmgfxlwysebsfgyyqsgekxsrvqjeameotzhjhgrfqpmdigdrzhsuzcymmjxhonbgmardrypsdhcquqbdnkmvbkzqdvdmamxmbjnepumqhfvhhkbmubifcwdmgtcgsouarytmxgkdsrlmtldfunsirbwnhdydsgrehstzoqnvwijkhvigltbzogvpvjehzwbampvktxwdjsvfsdgqgmpmoqkoxsecmalfbatbljrwomelvpjsxouknazazaobvkkajxbrcvxrswgcrjmawxoeojnjlfljxbeqafbgnmfyqzenzwqmukcakxrrufbrclcyubhyumrnkguwdvhnqtlfocbsldivsmgpxieuayycbgkndejbxjxfivxgjhalzvegdymfgtvrujxsdsnkhpqfrkscwvvbwzonipqfqmrenujpobokkaubixfbsgdmiwhmhfoyfliyfwlbrbzlkatjqvoothaklppwihpxnfvudlvyytifwfedyiluyxbeqvbvtzwzcvdclnniepglrjhwaamnadiaumvtpgvoxvpvgadpzvdecjgyjacvnjjpcsocsyozvvmfubtmplhxrtsruyhghzyazfbboffohfeaxltkczfukvitlkxfyidrjabpfuglhvaxogwcwejozzvzsjhpomfcesjizkizdnsufhzftnkunfnggtgqstegfgttfjapohhczrhogzakotuxgeltpnjitnbjljzamztpficloosdppduilgoxwwhwzofuphmaqwitwathinxclxwnzvckmsukaafhafhvnfgldlydhmezxyrikyhahvbykieoqcfiiipgozwwblrwdkwixrfnlfcunzrfhuclotsdbijtstshglhljxgedpmpnybazyijaemmocvtbkjugwubuehvhmwbxqaxlvwirihxwwhmklmpdvpltsgsyaogvhsgutryriuyorkcztvhzsttghjzxirdzdqeefkxzddevjnoctztwkiawbkakxlxxufkhobxwudtmkswvakacmnsrlzigrlskxvtjzfescbsldrsdsvwplcfmebqvqnbuzspusgvdkardmzeeohvibrkwouoeijnhqgxflabhmbwxyxayedhxwaeywcjpujzwkwtthrslhrfrffkgpjuepcoxcdswxfgoqjtfgkoukbuqcfiabjntvfckvxqmwqxtssuzsjrsokpgstvugfxcuvwyqbaywyyzvbytnyefuwydizoyejmrmesoypseqdvqjktibdrzdppuynuigitajrisgqeyuxcjkimfdbdqttjsspmnsbeavrzeharvoepzddrfrrzdjizwylugjopygjpmnaxhluwxygiotzybugxgzhxvsinunhbqzbyozbdksrfweermtfxsbpdvtwcypydauuohvyucjadngfgmithoghjqrmlwxiuyfhegrlpudpqxhbpqhydwbggvlpspfkoxralmymkewmropwabdalcjiewmtzjmlfwyteckqgyzxzcqbbekhdpmfuaebeizpevujrotoqwpiyjiryxctefdwbzjrtboogppfjhssiflywifhduckwqwppwtzimqzotsduevmzukseehdljcrbvxmeaeturnjulyzfbdnwnjzughrogkguwocrjqktqgksarlkfmatgwuiomyhrdljfoyqyzhlcjhnyvmztbeazvoltsrdomztxhxthpmoqywslywdododhakozcmlmxclkuzjdpqgnyysqrvsueyhvwybnjvwrfpqpawlxcdpzlhhuancgdeziefyxrfuyobcstxlxvrygbozqvgtpavftessbrococcskhqergsjlwdrzocnajltqaazgdlzkxqvidhckksfbzoucztoxbaqxvgsfzgzzuxjeavjxytdqneexorgthqnhniboueqfmxkpznbdjypvvokgbqdpduomqirvolxykjmsoxevbopzxjfflxzrjvjrcchrbkyqqzayreanebnjbvuwswurycptfpjpdpqxtxkkkbtvaqlkcdfsexugoguumpdlmrymfxfirvocxvmmfvfpkslwobxnutmhtuoedhtzqfgurcgbkbvomvaetclvpaorwjamdxrobzmpmmmrhwtuhmsavpkuygwdyfkrqxuatavnhcawahjegjchgdmfdsvocqfrnoznchijsdwoahlnkvwpmmofpwtepsjpfskqrxowdyijloqkbixjozwliyliiuiednnqjmohgptoaqwmejmfapbjbvlylmljwjaasnvscgsurcugekcdotgzohycvhbqnhypyzzoyrxzkljenjxrgqjxvdiyoieqaqxqpgciiporewfozrueeoqbprokylqxqtwabiewgwcmpzsxatqfgpzqzwqvpczqigdieblfahnzcqikutcuuhwvlinxowfwtrkqyzbgjoptqojmdqymcoqbjerddogibecmyrwznsrlcxouucgessftciqmqzfenhxnecingxanyhpjtfedoedktsssyuemxkrrmtoigrnxjsyifdumfjopusoddszmbamkkoblspwqrsaklqaccimfiepafmltonsofpdlbecvownmobacivanqlryttmdptacofzacceqfftzlmnzrvurqvzydtrrujopkinyltgihnklnwkklzpfzopanpargtidybaezsryruazmyrulevgytbpyjhxxdhojgvnmpmvpgxzijqepguxtvqnawulnrjkxarnpuvstvjagekctxisecggcditlusuzctmftcuujcksbqtcnpgarbtzxebywinyzvjhjbryozsvxnzxxvabdldgwyhqvkxzxlwjzwjmcipimfykbfhfllumxpnfhvfbixefzrsbaqxwjhpuelejwnucjqzjqqdlfmwjhsjginrcnznhodetbofdrrfgajdgoffbnyoyuhydqflzxjijebgeisnhdqcfkbbtbbgbnhzspsblzazhqdqllyopnjatambavsydwsywdjendqveohcqhgqmxfveyaxdkppgzesukqduvczhhdktmklolqskqqpureqkueaqsddvgboqvktbvyrnhmifgosdrwtvhuotbkpjplmlxtdceohbujdhgqgmxueuehoilubrdwghviuzrwmzgdipmoyhukewuzqkvvymmtsqylfhbhomhcukteutjeoxlptiwbbyrdxiepdgmyiazgnouqczaxzqnjtprapwgnafvshmibtivpvsbotqyvjaacvdzhjdzsnhlypdfbowcwqpbnwfjjaoxgqbcprnvprszkexyctvgdwwufkjyrolgwortbfnkcunxqemddoaicsidfuvkadoybgqqtryqqmnpekhircbkkdxaktycqpvqgbppnaqhfihnzquxzgkgaqwoqbsozekuhakvfqyngwrotdtpedcicqvvcxtjenohqxtkjcjjhirbfyywhgcpfcldzzwidmhmmkwonrqfbaqxkdckfnbhudkdvfcitwgyovftbgrkopzvsxkgmiukmdkvkcihnfqsmnshnsehoupswalocunpyhpnwnsczskbgbmkszctgigyxgybmwjyifevipymslzkhxmweiwtycaltdhbhsygqyhiodkozukswamwfwthhjriboyopbedezikrmeloqoiajotxvzbxefedggbclpolbukcdvaracccrkqrurydurhldmokgvcesenkxstwxwrldosvypfetlytxwpljlzcodsrhhpnqhyzmumtakwahvuovapbdpvphzfbzmntaadvlfdvoqhtsdtqtikepskwwhnaddujoaetmoyuscbdyyqlzapwbspcirjtcjgssdzgjabtciojkoyovutffjttlsgtxxromozqwulwfboiujplwcswtohlhbdvlmizydplvadzhxipypqfhmeajgraiezsaqpfbsxwonyfpfcnbyqctbhnqgssozhqvhcqejbsxdoiyfctcjdcmjfhrqygeqskhquzsyvtfmkpuyoswacxesbxwvghghodsiorhuqhiwdcqighiyigmdpduogjfnfbbokopnfhizsvfujnqujzxbnaifkvtcophrcbczwhujbiqipvpglhouvcjcbyfkvouozlefkxhkmzfvswboqctqaitbbxvqcinqqzupqzdlctxcxjsuhnzvqzocrspeavbpbzidwbpjislmlgawgqxutzjirsfmfaremqenbdmwedeymdzbutanslwrweabswhzhgcmohfdvorvwwmhybruoknnprdsvpqzszrojmjopjihuldixuipdigaujotlsezypnyehjnkfhmhwsojjxewraskcbfnfyfcimlikwpwqmprfrrlqfprruafovbujrjulfiaxeonvnztrmsyfwzykjlugeaqtsqeedtzrrptfbqedxkbugcsfocpaqfapcslvnjtdgtgpnbzsosrbehsukoxrikltgrrsvhyyzwnpswvrnoevdngefgrawzzinzzweeavipbbmhnbisuaflqceinwapqvwrkwaaaagpajsrsvahlhqnwnrcvdsevrtxfuqqsgruopvljcvohmnumvfbtddjclamfiqlacyqusuorgfoeginpoggtriotzytrrvqaxdkyzgzjtsahkhtrxmmolrbjslmpwhymilyrnardxgrclsejutjsffsdyndujnbvvczuorlpnjaowtjtipjcovvqmpmulrkmwzspngiicbvmfzbzpjhtbhsdcpwnaqshtfpnorlyqgvrqsqfnbcmgrazdqddcjhmpxdxidcsvbnzgnuoroajhhvbbkropfqjlrnprjojjapvrrixhwmcxhssjmqdbbpwuwjnulqmieexoolyxnuxwzdvddczydtjytdqaacondskasocdmuxofkcbjrjlgnizgucwwvjhrpavfjhpnuujailanytfwjyweygcuqyztqebzmhjnvwvflcbeihnatbsvhlnvvccfnwnzkwmasuqvodaeigdipirxeicqvvlhdypssjvmvvovmcmpajkvzdbwmikspynrrjakrtoqsyevehogrplzpxdtjgtrmgworyeqhmngyedwvkshkgmmoagklrisqigukdflbcahtmpsqnakrkbfmooplocblwzqnaujjpcaeqtoihltarpqlalcwnhpcaqhjjavlmhanhdwfjerlgzkkvymjndjkaadejofmcyzebgtupkppgyuojduzrwebsbicxhgwtowqqstfcynuoxzpfamfzdumxhnclmpbbsguljadtcdudethorsaiggdnfeesbphdtjqfydaqqmxbyuintitjwycnbvcwgugjsxxcvtdtfveqlfdwjvkxtxseiwwtkxujnfktjclxqpwvdxikylkmsntadlczhrwcgytyzoezvfqqaoenxzbltonlaqtprtukbiwpegdefiqzfznkvgvnztixqlmkhhkpvbtzorlojehgxcfeolyyldjogjbnbzzuqgqngdbmmpchhmuhohlomshisvoxjstwazsybhycgyqdgjutnsbfhsuvyvptnbwezeifvztduximbgmnyalufhjxohyhmirlxqauevynbyctbvvkhtzqmtybdisdarxafrzpniwrtpmwcbwmbrgwuzrxggwknqvrhtufjquuciufbpgtthmeuqsmuhhwsptwqvveewwmtdyugvrcapvyvktcrxwwngwnhojiccpmdinfsozkdhgoxakzvqzdyqyubuzjcklpphfhpjnmtkginocmwtbgslynkdlwepucjrssolfeplguzgbefaxcmknshtnenbuituiivdihpbyezpsiftmygaprpyvbuvpcnmiclmvcdcbrnvxorizymrwqfigoghgrbrprfuyvayxauyomnijxwpcafehplxhrpvqycqdeepnvibwsxdsceehcvfoatlajzsgqwbiihsjrjdogtltzbrqumvmisiuljurvgmppxzfmgahgjjqmueaxvnvpxqpktznqisrzmsjerulisxxdqzmucfstjtjebcrpgetxwzpwqfefuvmdwerdnxzxibmqlwqmiuoyfyihfscreaovzbjcwfeckrxleubctnqpsucemejzclwqdxjtlkwqkdnlnccdnokwawlnkewvmgqffsmikavyzmkkfrvmbyiiqvqzxmvsfjwtlepgdntvwxdhxdkhibapdqoleujvnoqoqymizbtrvuxtvydleippwtwcphsuuakpekrgmftyrtgjgjosixcktjkboyudfwadvzxgvhheyckrgilwazzffwvyfrxtyprtxsrqpeeqryltttjuzzbkpndcnxrvxqripecxessjlvdxasfypmyluzqfybizltdpvzpgfshsnxotedycfynzufpgrdrpxkwtixkzkwkubjdpdedgcjmtvcksautcvfjsvquaugmphamucybscuxwclcybuuhdrjdkjmfoqmashlgqslmehmrrtudatystcpxsdjygkijsbldjlrbqrrwlzopjprgiwakqdwoykarzzdecoxrmyvmjcnqmgqtrupaaelrpnzplkoopmiwtcetmumfgnevtmpgxwdilpkgtvtyjtkhptjlclmenwbexhplhqephctdhstozwvyurxovblywcsuvbgxytqsbsnjzmcvqfeypsqjpzabumlvhuwyovuiexfugnlurjxrtcinawpswlsutdmwkcpuapozgksfugmelgiwphxpcjidvmcevoatwoayswoxyfjjsgwuzllezesnkfgxtolfnuewsynpbwmtqugwqhfqsuxbndgbbairppqqqieuvbbsfpzuwyldbnpwbtflvcxteqjjfanomgrvahfisckfwzqugurotgwbfudefemxdhrgurfkbllhdwsmetylgksfhcpzrotykquoghfdfvolgyplidsqovzogdibkceqfdvkqkrcujwfcpykshmpjnktitpooxwqexwlfetdovbpsdkuzjseyunhdfghqvxwcmhzynockcxbmirpnblaehyhjqvttvlnuzovmaastxfyijmngxafceeedjjcmimcodetnafturyughizjjzoactmbwcufnpuamfegmdrnqbttxqbbjwhetkbsqizvhvaghdpxywvhxluiveeaucmgulxjexppzsbzvycdtokupxsxnpmsikdtsxfianzpcunhtbrhdeagxlphqpphasbumwvnmyqvyqpehsjidlgarwjtpbnpisypqgbjwgioocxcaaqbjimlsfxjxwbuqcwlwtvmzbacygunemlrhtznulflioqwlknsxumgwueoreugjlpvymreasxcdzfhlehtrizfcsyyzhpmllzlbxhijazredohrjzwtasvowbponpsrghntaukcdolyfyqpkykqpnbjtpayrysvwproswuxeyozvjxmzmfzbyhukzprlzgmptfjpcymfbiepgjyszsnmftoqsfclwqwctdpmjyzxanrcopiewiadwvefoznckjxwqwesowdfxconvqcpsffvufcxumzmbkbnkmajnjaamyrhqhtgkhpzamktczwqczzmwzctrzxorksiyvvdckkzovdgidcwtlscpoziajgdozknberzpzygljsanhzpyuapjnjolfdbboenwvmgjpweezhhhkttsjanmwuphqldlxgbpffisgewasdvyqucwafkojovjwhwibopdyuprnxoducsaxxiylkpitpsxrorreceukjviiveescoyijzprocubvtdqhbhnhujfkphgsuswngmzishozhmmkwzfnxcdsxbasjwxlesagevwocokhlaxbsyglrvjaynwqxyjveuckfsbyfeygaakgwmacpvvdxswwxdrmgonhquoiqaknoxshsebpibqnfacpverkmtqsrwfrgvbvopqsszniurgqplyyzhadpdlwxtrkaqnnmfviwqpcnzwhjbmqkmbxchehzrxhrhaqzlwspjvzjfzxpfxdtaqwcoikjhxolzqpsoolwbnppfdkuvfgsvyhqlamanyywipyzsuttnrvzhkxpusvdnahzizekycwesblmrbclsmpfadycrbbzqdaozwyywgxbhdlcjmnuirnkanjpfrskgsflwubxmwrjnmvdwxmpnifzeexghksjnugarsfmkrzwzkvaupnlwllcnozhgxrrjijoxglukzipmogddebntfoqkdrpknqdqrdpgezufhrexgpgyfyzddamjmdgvvbxhxcyvhaihprasezmfafiazljfikcvpppykcnamvijjytmwalfxyfkbuqvaohnmdqsbekohzgshjokipetysjdwetgveseoibvetkukkzonfkxyeuftgboewipfbksdabrdpaudwvrresuozficijtotwdmkestrjqxqoqbyawpcwbbkvvupcemplzhucrdnqtltrbjhnwmxbdbywmucbboelphfidpeqvpeeclowameosotvmsitjgdkgzvaarojecefenpmkydntjawvkredvfevvbfbwecgbacfxvymhevywkfxnerfirkddxqxoanzqmzfzygtpuuafgqtidaqvgkxtzvlovesvsydujrnlxvnlsnwaegzeebpkmcfbjlhgegrwpklkcqcfkqabgovnznouczvjumxowxdawixtlryfswlzlhytifzwrtlwjgnwtvnqxvdgnwwxwmwahwkufzhepmrqzalzmgitezgmsncunpriyiizxyxyqysuipltcauqbhoyqtjaxwkkouceextbsqslxqclqqprkvrlyyqoxfswxbnxjrcnogzqkjvuktqlkkucfmiqwwhqatstrlrvkioykfoswevszcjpvowgtisolmmonhnwaqjvuymqmkpmubwkajqsyvbshkwmwnjotehjcsxwojhgsccwdpwdgfeyawgzzkwakumfpgkonbbcpjuvqpypgcmhfbtpbcuxhbihprpaolpvvfazgvjmpvnysqsuxduwwmkebcacnzhscohyvqjykheoeyhwrgmihngprjnupsmnfwvengdngjxxiwqmdckiodtjgbzpaxfkcwywttnogaebnpijiwemvtnmfrzysxierykekqnbecrrtswjaybuegzmsnwiptoyapxjfhecuaxcjgdqjblefnkdeuazeddlqzzewwwdcsgagvyokzugsbbqrmkkrppjnxvgccvcanvptgyvhexmereyhvjxodyhvgehpticowhzodqxettbxpxboenwkvpksselzsnfhaobmqskspmwumubelrfbpfgltbbdzmlsxfiphqpoewqiatvafptplwcwigekgwxthbmdmujanrrplvseauccdtpnilfterzcoaqqphbpewzwvkfwtqbnttzhcqkxbcwasfknqtoojhzurhsiecmghlhisqypvpezyzvgvkpobvtwwsozfugzagzoojnicjddcpspeddvqavelbadrhqrxvtfigewthdowjzyfoemnwwfysnbigrzsdnptsvwajdvjybkgwgrgfziekjlpdzjqzuxxmmlbkvygmrxmabeanthhvjqnwbuolvltlgoaqrysycnfepowrawhwcuifcxoytwnnyuqxowbyehihdzamyrnkxattfuiggasxwxszyepbuasgcdzkwmkrosjbawxgqzgvctfjbtnqqfxvvtjijvrlhkhaviyrwojbalqkgicohxcwnqsynqkuceoznxmcxznnewgvatomidijlzijuxhzynaofjsrgygmtopmsvxjklnjaiigqcomjlinazstqfbwiebagxzojquxjoyfpcgafpjymrmakfkzgstsuhibpubnnfdxmgiiphfadpbltavvlwexedbancqlgelqrixxginehxdqsweqyafehdcdmaczdngfzopmvqvvwsdevdfnszzoltqadmurqcaykoghwxmdwrtvhfiayjfpvixiimnvmtsqgufsmmbahgwmwgfrgnvmczaxdyekstwpfkojtasldvftxepdsboexpwjlnfnotcatuntaugfqabdiilijjamzynfpadfagjtyyuagqfjdxckaxcpycnitjjrxwllpszwcgnvhnhqkcjtlcrdvubsrrjquakfjzplwuyohjgfhfzbwukgwnzkasenbandewyfonirykaehecluomronimmhlkpkeoyxurvrrxsfzqfapmqekdolloiskcytblfpchgeneebqcxbugsnmzmflsqhopdbuvpyozuhuhwliwipvbxdodsiklqznrzgzohxdetnvrybbyvlkxwxgwzbhflivbaeudfszakgxmceflbveyrllbesdfjmzqqazwttfpzbajnplpbxvxeumcioqbdwdgeigmwdtywkcxirbtodujdvhjragwyaubbpjrwgnndglenqndlyfhumpcxdrumhmnupzeovobxtumaravhttmpufkabpqkaydqxxtgdvdnbvkjhfglvnkziwuqgtlwgtwkbwqslhsyyhjeimyyyxrucktihearhohwbcjmxbhvgkzrwfyobyrsbrllxnyefffepfwybwbhvlriakvuieydfnhycehcajpfmkbkhnjzebgdhsutwxwmyzwgkgecdeunssyizdgepkoixiclwwvpjyxkzlqtqevisvmvwvtgxbwmhinfjndqwgzdwpltrybnqticvrwypirstlzhrjfqpoqpwyktfeabnewvlcveruliynzmhgrduizpqzehomhdriqaldcttfftyvsjflwpnlyfziucladamgmxvagkvvzkcpymqgrmlztzhqacqrdngokbrqskzgymfcyehcpukgnzyyfrilvilqfeiilrlhsvaguvbnjqaxhvtrvltmjfggayxxcwkzfoxynezixolhwfkvcsorniyildbsrcmewtwkulhqaflyjaqzegzzsfcehyidpjyvovvyguonyqhylkeawjatypncomeefcwrhyeiwmlctmrwpcoqkfxgolzzrlehctuzditleyohlmctuxhyafvbpkfjugauasztjuvaayrfmtmxrtlqaiolmcxdcgfqapzcmywcqvduewyfbsaalaosrcqfbreohmvzycmjvjqwsjakxabdurkjkjazzgqqwanqrfvlxnxladagaridbpysyssmabmitgltaregnfwgkqziasnmafjirikmwlakmtlcczslcopixrnjktccbxiqsfioqwhmepmbudoajmpgcjpmwliyphaqrrumxlrfbgivrwykadlridpuhszcrlhqcxwvdflkkexkibzxfjbxqucngfsynsabuhpikiehwjummcflnjxesfncsyuihmoxyxektzfsilvvdubymgophrwhfnxzddcsojliorglfjktfcizlaxevofytizlzdazlkxgmjdcjmmkeczsqejrtbmrfyqrmvhjwozxgckhojibhjqyrbyzcpjuulnoiiqoxocjqoswveeksvnafwmzhvygzglqhslxkqdzzfhalkikncsqkzcgkjartdjmueayicprkkhfdhywsbmccbkxgufiebjbtbihyhshkezzuisscdowitnhadynjtkjjalakowkrbhbfabkkoeyempmovuulgkmuqabxsphnmnuztyzxapfbtjhyjsruzkaduurnahgignrdoknvacphetvxjlmigwxrllnkqoxgemvjqleslnixhchequkrzacpsnofqvcfxnqkvuvnngravzjobjwuanlqzlbpzikooloayxafbdtuqesgiwlgjlwtkolxxbauxojrdmiorqutxbluraexjozuyslyvvpxdpnhkgnsrtkbvuqbgetohooekazpmzzfoktjebwcnzlzicxrycfvnljmoskyqryjqztshyydrknprocchpujwkvpplsmtwoqvyppzxpwyvmkckimkvqjavvpymacfxfhkoumzscfxfyfuprjtibfywlxqqkceeyflyvvzbujykwkznimjscgkvyvgqupkmlbyusubttcposqiaouvddoprdrenlpxjbazabsdrfgleebvyogbrxynvujmttmijsirwpjwyysgvfnglgpdyyiibktfcogiylcovosditxwnnblxloudjlgqghhfeuamegnzrutoairraegckyawvnndnbgrlhmaptfttnxuramgjbbshgsijqxthzipqfmqwuuwnnqgciqmcqlxcpmckagpwnmpafjzjozcumziweyxoxtfhrzmmwlbnpakkjwqnmsbhuanhnusfkjgjdgnugoszumorxdsysyusldyztivqvodwhlkwhownvcjjuraskvrmejvcjincxwdbcqfiislfmmwgmakbbvsrtkebcuadzzktnwofvaeysxhrfikzhuovpjkmsnjoyykwuwophavmpiodjulolvljujhcdegczwksfkabirjijvunnruhxwmptcyjjysswjlmknzchqmbntejajpnsfczoalksyojvyssxiprynmchqybiarcjlrvhblzdmvhtzardmkvlfdjdcowxejmiyagdtrncrnhoeceqkrfnyowhsxoezgxmsazueomfszhmugjqqlmsrqurdszjakujvcmegurdldvuuuulydnyzxqrucidoaarvdxgjsgcevfymmaavetqfflpgwzypqdyfajmrmfzbkplyvhcthorgqehrbvjlazfiocyggkrnomdofgmfiecenrlsiodihuhrggjzcrjanlyflnheuszwgbfgduzcqiodiojhwcwxljcycushhreywnvslpadpolntymewzbhnktvffrhogczkpiqltqhamumjkpcadtnymbqoushtgcciwpqwfxntnpcdoqabtdqixoxsvjbfgztmvhnjaejufrqhbzzyxfyfybhlsjazzcwvltapdouazedfmyaqrzsbtqyjgtwmdgyzffpifgadmldpacwnumswtambxgmcfhzvmaqjdiiuzlmlfgolhhqdfrlzvongqgaawphuabxosyennhboafqnhpnggpmtuljoufpwchdicbaasfmxazxuhdqizwykhwggkmzahkdfqljrtiehsicohvrchygdjnbrrlhyttatdukmcljdnkusaibnxtdpyceqxszebxnlkuiytdneyidldvhakmtfahycrmgqhpjsitytbmqvejgukrcsoqirueclbzbzhgjxlgkxegwggmjobfrsnifbhltngvigulszehacxmzevgmdvyyehzhkqbhxqkdxzivkmntujpkmsnetezfapdasaoaguyhldeexkyujkraixpramolybqnxnzyxpotugkhfipwysleylgdftlowwxsuypsyewnglkbarngzoxfhpbitslxovcsrbmqderajingitntikbtzbtlsfzkicwxijdiximfesvdukuzzqatxriuluzebczpqtfjqczmfohcofuxfnkzdaejzvkbguwyqcekrfogguxhktxnufyalyveesbttpscujbuqrlcyhpjoykmsyctduoyrzarzvwsrosuxawyqsqovdviezgoeoarhbfthukilrzvuezkwrmbzrjoolwrgzkedwxvgyetlajunsxyjrgzwzudzwkldzztajpctrjhcytcnkvolqikrfntunqngrxrbzfqfexhfcamsuumjkbpulaexbiljxavnhelpkodsiyarkuremyogldneosoerzccbgfqjvszlglgtuwwimxyjkegavsrbwghciyurhdckcsjzgletclncoflsuwotbrcbcqsbfffmkuinszbblgbikeoamfqqthixjeirgrfvmbaqzxwglqtqobolvfxgocevimamcpyfmurkfeapoyzxotmcuulpafjsqsxmtrutyjogjjbxysnoczbxoskhbhkkbkofbkdolalaojvwbtdaadeuihrfatpqfusmsioppothfjaahuewftmiyjalkhljazslycifluxyuvtyrdevcwgqyndrbqjcnxxcvnoveybisrolynigctzwbjbpbcckqmviwmolyulifaeueizmmyxqyywxnfqaotyfbgoymmzrqanbjauecqjhjaxbatkzsnmfjvefoupmrlemnwvsicuzgsbwekdfitliihgwtgmwpaxlshhuxuddudcgjhujvqajbhdwveudeaqriefoxgphhoaneuuoachckgtmvklyxtzvflicilzmdvqankrfvpmgbwgtuuolkeeaprbehudjxftjwjxdvgzeuhnfjnnyyiaitjhtpesbvysnkvkcdbpuqkrmumpkvhaqwewusbrpmtghlpctcbwrucdwkdcladbnilnqkqmlumuzbpghdvasqzduayuphhmzvrlembmmqwvyrncjvisxltnubrlinkremhxzewbiembclxtjcrahnopvxxmwalgublqagdiwpjiysomsdfhdhazfkyeotjjrynfcdltkgbahirjyjuzsnnciwvhxrbdvngiqqfrqqyrsswzweoewtmkitbybdrfpcaofnhzppnevjckytuukqqmgfrzujhxouqogwwnmdeeqlxqadqdtzmglhwskadiraawleeilknyrhqhlvpzwrfthuvdmioxfgidmeklyicyoayguyrwyovbeknxkolcmnyktjttgkyoiiplycxvdjarrggonrzsjocztzcceqxwulvfycodrfjokumprxbiishvgibinntwffwhehtktusffdtsgzgbuxsgpjurdpkvhnibwcqzmudtytbhycnkswgzwdxqnlethxgfoormbaoxmfhttqlrxetzueosmdtehnktqvvpunasxlxrocuhdvwzoxnrlghougpaislzqbjyxayczxhjjlegxhwskydyzakctklaswmktxyvfyhlsroxklhwxovyqwceyraimgvexwagclenybxxrzxhlgcklmuwtiqzrdmefscdifwuxfjbcvnigvodvdfqqxynlfeivasscjwxvdfporqmnysawaorqudgcepoutngnvmodwvtvectrdyepxyzslqniqhlppwzgkyroszdxvnswzypuklvojgjwaiafmkhnfggtgsctlieuawjviugmtqneitfakdpyzqpdyalyehozvmkecsutwchwgkzqtaegetpzcesvqizjmrpetbpivckmpmeidjsefzetjnmfaxgmhxigxopjxocuovgpvzrklubsonjwwllbqhmboqbukofekruqadofljinhlbgnmxezqvycrrnfwncqoxfukhcpuvmiwuhucmfkoftwsgfpotgyphkyqaaktlnvxisctnggwxrxyrptlsvxlkrihaycoaypdulflrkoghqrvatqboqykkrbzalcxldmjoptqxqeimdkdsklxsncbroghwxncbcklgzwmfcdedxvaagnqjailsxbfrewjmnwwlezmtkbihmnsbutlrragbfsybddtkjbtlxwmmwfyrdmtwyraonaygkuhpmwfxwmlkmmwbmnnznoyotwqdlsndalfzcprdbbrrilbgblfgkpzwglmysdfezkyknivxoylewayhnvarbsvmcapkptffghgvdtwdzcrpivgqhhojqzlmkkmjwifwjaxuuhwpdfdlfzngokfsrlbmwyyszaektwmifbzsxyxskwfusqsumwrntppjgmpdnteusqjdurivarnpnrmczpvekpyvndbrnwjsemqqbhtgsysatjkoyxeseanjkymasublyammlcswsqaahjtyjjupmdbcvqrdxidulzrobmatkvolopwqusrqdkktlmvevgqepwtnxgwoodwlhwagqkvvjhggngwywprbulocoobpiexxlkooqzncnzcdieyyfyllfghkzuesbnajopwvrootcmewcbmhdrqtwttodqylzwdebwlbzvwpfaqdilmlymlvuueyehuxxpnxrzejlnlogribhieyzwiixjgfowiyixvwgsixhjxpaboywquduqjsmzlwmrcrcjvofxemyhtvwqssrogtxirifxtxnkesfsautnnlseypdgllhfkxkxosmelhdhdksipxmkcpcozhrrtjbhrbhcpninqbxqffnzoaggogrwpbvwidfsaffwaneoevfeoeqdtbykrweyuvoutoykhlxaeejobndawdaswqdhmuvupumphpvxcthzhuhlailpobnogsihnrcwbbiirpzjvrmfhsfbxjcodxzbomdgoojxoymovgczuexvkhulugafzbjsziugerztniikwrvsijxdfpesnkulwitfjshfvffohqhgczciywpqoqsphkffergexbpzvoczhgnqitqeaieawzyedisaudqhzvoplnkannnxgdsttekxncuhhqovkodnextddivwijkuoeuznhrenvrqbldbtgxwfulsxivcbjumddvckcdrclgjcvkpbjcfrsvkovsmfruoooiucbkiflvkhnmcglcyntgydoknjbmhlpdwrkraefixthecvfqlmgkyhdaptsplfptlysbtaxhfetdjushivtczolagpdexoejxrbertyakshzxcnkgvaqocurbhmrjypvqrbffijuayztnrcxagplewczodlijbjrtwijslkhuldyamitwfplvtdvwbkyocppmqutwjunxrtgxiskxnfltqcdarejaeybozdapabmalzesdvppgsvkvhszzkvvjcxyzjwakzxrwfcuakarnhhhokkvglqarqpfirzttwgwslrpqyspyvwvjutzblbzcqcqahcybreuuyrdimgusrgawxfemsnudnvjgyefrtvtmbvvmubjepgdnnaoohdpnhpdfqyyzxmjmtcuberckhddvvtxaxflwoywveizgrmsfgjjnbfkoyjggtsltzastjrmmrfbgklriaissfkfujjtbbyzijmcpmjxzhkiyxyaduezctxchrtqavyuqvmlyvqqosvijwnwvygidqclgbhhgmkqlpweogphtqcaidwkzwbcqltohwoekntdqxogbbjmtgdpaswsbudbfxvaoiiheeqyehrrtvaatgixafgywvbspbzpxkiuyyztpfqarnbdbxngyxaljklepfhiooqohtwelqtqstegswdobcyfgitcimnpiuytjmtgvkyukiroeqiungamrdmrqryqyumcmotzvmqusesptnnmobzjszaehutvrgvopcasxvltxwgxwvdluormwqjsajxbneojbnznhowuisvdtdanlnpdljcobsycwgdpovonurjnkndjbjvsuqfqlkqdawekvtmlpdoemncrzovlrtihduuqjnskwbotwwxbqvpvwqkiqwpmikmfhwxuuymdftcdrzkktycwzqcxcpomigdtykeioflolmxpztunyrqbqxmupcxzhbknvnxyoyqjqvgjoyhgwwtvusvynfojtljfeeucflrpfyreeuyxfbsngykjpuyaqnzjafiosaztcifmwyzxowwgumlthikksjmoidgltmbiuaenrwxodfijyvqyhliidsbbisilhenptamqgwxtwtncprcxnsfmqawppsrjrgdpdxirbyllgiqgfmejpvjgqknkkdykmqebtaioebzcvptjcanmslftrjkcrgkiehfnitmbjdrpfvpmeejpvvfizlnymmitqwvfxrlksdhhqpcpzuesstgkfjjaytedzackryrzwgppwsnoxcenyyjrbshlfkpthyubfmpqmrazbzhdjjrybyxkfphvkfbbkzhiwoytgmkcufucglpwsotlkdijajwaucndhqifxigrkmvyhodetwrlftyjjtxcjuuxqhxnprgialoumiepaaqlsgsdzydidrluqfwzpybmjofacjzyvqwovmbimqavmsnrznmjpdsvyrnzjnoutmraqplekqodztwzvehsfpdypxxtggbzgjcwdljfyvsqorpndsgwrbhmwuceagdbpfwiaaghnirwvebmqdqttluwmfkgjsgkepyzilsrginanytkthvejxdstlucvesldqmyvfeuaujpujmcydjjraeuflhjuyzxgbdfwrpkrglxvjjvfuqhomknqfumgikguczabsflpurjhlpqsgsswnwbgzsswkxpfhzwhlueqwdvvaomahdvxjcjxqlacclxjzgfuqvrpfxgxsrhfeaowybncilirwkhjmftkpihbojzwydgegvccsupxqtazicgpcimjkkgfabsoopnppvvdzafavftnhilsprqykjejuoompjjjuihtitedtvuvuphcisypprshhgdswbzrulxogvnxjlqlyrhhxwyvdtorkgprzmpcjhxlgxspytsmmqpbrbltmtdlosvepdmsnwxvsfbgugkoavrnnhjwtgjxjepyyhnkgqmpruafdatrtlacvfcbvyzccgbnyttzxryzroebmoaaroynshuyvlamhinbtvlvechehmmhdluknysknthynzxjabmbyyvfgfxqdqgrbhvwoqsurcagmbwsjkwimguwkpbpdutumojskbviczllzwmecsznhwopsbnvizqybzmftwifubgdddpsicyrkbfcltqvpyplbbvpqbngckunnsttvjpbkepxfzlupgghmlbknbdrsjdysutrnhmwqixvvyuwagmbdsqtilrhhuaocvnwtfknhjokjizqrfvdixhkfniosaytrpdrpghujfkhxmowmkpqjytulefbfhukpwbdhqofjjuvyshjnyxggjdohwpvsdvbxrrshsatkiwzxpkkfryjlqxbjxcdnuylcpxxvzlwhsoujylfwasacekrjyqleksxwlycizvgnjzqffaizzlanxyyyhqulfudqpphwvqbvjvjbqoprsvgrohtjogssrvskstvjlpahlkcqsfpaakswdfpcqenzthdsblxvdxolyvexnkfkvrkkobsobxagrsirngpovujuadfnsybvccuaeraffgcsordyxjftrepfbycvexrxzznfhhdmayqkyysritsjeyrtlbljlekeepewnlcauowbnotgaianfaefxvbsjlmkwkzxyywmdotbcigdkwzdmjexxkvxuffdegvfhnugunqackehkffmggslwcqfwhnasjzrugmcwoldzdlknbgsuomnolkntigobllixgwsqjtjcyattkwareokredsgggpfrdcbnespwnagvurtztfiwytdxxnruuqklexomduvbmtnkjgphiptamorymbwtoqivrrncdpuwvxzbrwzwfkqgvvxboblvtsdfrqyknffwpnqymhitwfvmafuybpyhffgafisfkaontxwuupjuficaklgmvilwtpxmtjanfaluwjeouvwfhjxcwrbkafuawejrmgzuiucmvgyucphuqwtzfzlndrinigwhbhazjuzbohmhxbvwpuqeqeqodmchgfjjgqmmjpmoqyqatedelwjnqatffndzpxajealkwpsgjwgnvesgqksdmoaipfjzimrzjkjxlqjukoyfiwpvdtorevuwuspxatpfxphdqqapolwndddzzepcdintlmvxjcspgvkqtsgndlqdxvohztruesqnhnjrqxfdhgkxcnzgfzmajaznoyxxjevhsnswgurjbpgmxmlzgoyqiffbllqpxvemicsnuheivqdxxxmjqeztapxumcdtpdtpywcklpekewbpsvmknqyxbejrgzisylfcgapiwuhptfjyvjtkcayhcuzugkryqcvyjvxctuvpxpzfgudespvjxivotgasbvdxxnteppxkjsyhvjcutfijjhpgdgrijwwzukozmtykwnobsvnaqfysefsjkwgiqjzmjlrccjdzqnpdrrvkkkhixhcytdymqisyzwaykycifnnhidtjltnikakasrllhmwnvvtpomdhpdagjsiifilffwhtdjvjwdemxenuaryshfiqslpsoatxthylfmxuxvygutkawocdtkzxobzufgplfdktmqdhafofhyitfsopdwldtxnnrwgfagepqvuzekrsxihqethhhghwnkiqapbvnjsgiakjvjcxutxqfpueylxgcekblyxzgekbyjufahkshnnzpcexzbdrhycaehadtvvphyikrehkwbbfoytvrwuzbfljvaqdgjtuabrcnfduxfiqbeeanjhrzmwnjnyeirdutahjidgdpkjsbtcezptbswmhjfkwiggibrkdufmbvpmsmvqgtcwqkvzhurblqetghrkirhzeozxymmpnaeqcjiunldplgyuviephxvblrkxnpwbcplznxtwnshqjshmcehrjxuqjyaxynnbtyltlgbsgndebbuchktxqmivzcgtvaudapunpecdhoeztlahtwjfkxfncvnlskcvwaosskohnrxvxfixksbohhrvklybiowhopxsbqwsirwkdvckylabnfmlegqrgeeqiihxqcaafmwmzlfommvmimzvigoeasokjwtbltjpteutdragqsztciekuyqktwnjdltjohgxnesvdkpxislvodbutpqhenycupuvpiulrhigzdudvixwanxxpegqujeuizrhdsqhvzkyvpwgevqzrieediglclfdyglsicqhpozcojidbqikaveiedhzewynrxzxkoavsugfrqyfipdwatnhyhysgyvvuoiyrckphdjnurjjqabyqylocuseycfwblaekroecoopivvmmmfrxifcenefkktsnmlhxjycanbipxacnxolwscfplejyzqenolwgrdgdjmpdygjmomlmzpfuegfcnasyhuzkenfpwtxlzsxjktaqrannmkcxuapyhhfubjnibacjgsiknwwbgzzfwlzonowjhwnvxylixjhvicvmkovzspkqqwbpdhcezqunyodrrcsddcdaajgebacbogioslnfrzvxkasbkprevburfzzgfwayxoojdcycdbfzfhdkoiasacysthsuvyplhrdqgrvwxgbyvsnumlqzikujctsfjnhwcrnczkrtnyjdrtjujtcpqykmdobkzfolsplyfrkpfhsfprmfwbqlhxnwzchenltzhevywhtwrfdpijbdohcfyxhbibacvzatcbfmubkxgmamzwmvokcyeaoodfyzbuwsdjqtnmkwttapsdbjfxmdkjcpskkliuxeymkdlwjvgsmtsubxvdoiscfhrdxgolkqypugiihtxajjdhhnvbvqxqxrzxijjvbcrpksyzcdigxvathtluoqghtyqyueaagnmpkqbzucjkxwyylomheiluslwisokcyodntuqicphhiqzeurqrzkvrpwrrrbthuiozanyskdsgtbhikvtbvkmeowrsvbezmtrpqflmpsnmhxlbggeaxxoioqcvgppnnrdruwircubhgesvgofgqxcynoadbxbayijsvdmpbfaapoagwytsmbsguuhmvmpsfxvcmxgtmjmwbvyyvokflgfrqljzszzslcuecwmqvnsepvztmxguzfgiagicushlhzwnjodccohjqzyvaxjzbrswpzqjblpkhdranqmdpueibjspgpsnucuhlnxvlyxgnnydexbgmdkatzzridjjuxmrjlmvrvdchnytjpopcuczjxurktgvdczhsxxaxiudsguypidfxlrtkyytjdqtudvqeruaixeqtusrytfivwqhzmuutsqasvwxzzwshhjictfdjjxbxailtpgirsfwsuebagcpgvchvrahyhgucrqsspiazifpgzwmtoglppdwgakbhgtwhwwpjvgqhzkqeeziihurusjlfhsemrblmvxfjpxjtxnlzscnztinnoojgbhluozidlcnleeqzihlprdxlyimsypbwrybnaghudcvajpyrppzvijrvjsfgigawnkyduzmcggvkxrmgrvqxzuehchkxcdazkkzbhfkdsoqffqpqkxurcjoboiewpqpfuakdhwvamseosxalwgpmugbtwdaqqqcqxpwjoostcpmhlatpatystvowxnsdiyvmodbjuhlhgekmgjjsxvzescygmstplgswssiklmzvbotttbzvfogtkfbbmkqjzvxyhashzwucpqiwelohulzmlqpuvkqdxxbmygstqbloyaicungodvlxrnocrkckkfitdvgteopvlfrrpldmldekngcyvnqmwaofyosjhrjqbfbpbgywlqqtetlqvkolhlilefapikhqsdembeeuzhpujfshdewyttukhlmeozagfehcfyvwbfocqqadepmvkbucwgszlukhebnzgdvudbfgnguqhcevnwgqhcweeeibqojtrdilccnwpjbztxurhnigxlizgibixmidklpxobjsumgjhsplzvlghkbimsevtgyksrlgunxmhscammwontvlotsdhgiwwohgujordgykzvsbcqjslpvvsgjqjjzgmbvbqrjoklumolwfyhtsbhdcztdstbpbhimngulxurqfdcbqsbkpkwwflxjopvwimexfkyshsbmsbgrtqgpqejesgghyptknvafblbvhwqmfetkotbwlipowxlnwwgybgdenerdjtnqvciivqoyymebnqmbwfvapdvzphrfejvtvbusepfbgelcmuqxefaqgodqcanwfexxbbfvyswjbrxshpubajjoijettbqrmmlfbqmuaqevrzhtxhzwzujqpoalyakclqabxwxbrlxwuckejzbintshsdiocplijqdcraaupemkqwempwcjkonstpmcbsyvfrddjxzjsymkjmikgathuzrtlznkrfilhauqgwjvwgnwjdbrbukxyzswilxqksdvrmfytoubklacobamenohbrrsqyrocxopxeijaktvvpqavhosylupuyhtzlrottnoavgdhkiosphzxruckcratccnnbsjkjcvtcdmwavcfvaaiywxexwohiplautepjdipjcbrzabsxtyypeeigosnhtrrewzvfwqmfwhvckbpedpfzojrmleptpgyxnhijbengyrhthrmygxcvuojyhajpccucoiubgerrvxavffnlpwoemndyjstkcvprchbmubaqaclstcdhzskdbkiwppjnppiersmzwwbxqlmvlevzoklzvdwojzopmexiqjcimdwzvkuaszvpffehqyejufrstmvaoszswxkogrzyjcevczmqcffjknrgwhanvhjnweuvfgrmqnokxrhyrztsdwjndqfqmcutxyyemixxcucovdeqbcnuwigoibypcffxjvuesqkojcxhjqttrnqwvhsseqejcypbadrgllzwocsspsaxbxsmxxflwbjhyaaebzyijujpintektfmghswdenxujlwodhnhtxjeawfssnjqqcbvrlgoxviycvepbibpacxmcifasxkntagmikqlpykpjuezfobwrdgleesgzwdmijjgxwamxwqfmzcoyjcyhntjcnazqgxppazaarvxglckyubnuzogmkwhjaufkmegcvqodhmxehpfqeuvjaszuyjjoabtcufvcrvnejnjigsosibmyhdceggtlpqmtebufnqpbvsanyjlqdlbhylxqkjzhdbszkfjsiechsdhhjpjfqlswbqfzoihxgwflfjyngtyiemcadvgtenqbfsldkymvznlyeohnagqenlxrslcjxixyqmbpczxvcbxcpkfucxzdfyxmqdkujhphzbtcgqanleyxgbnyotxbfclciufipjxypjjwpxmodmrkcyopaqsddzcwzjyuostrsrdjunsfllsgqaejhxsujuiprxkxtzhebpoludhpyejrxejsvzegarrgyvgnpsevicettlcspqdjblfwiqvwfdbrhdwdwjqveveqrsgwycvyjmmeudfaduqfjyfxbrvchcuvbzjtavakztkjulcaiyfxvrqfzdwzciiahsdltniozwpnfrskllcomnhjxcdvchjequcfxrwuwloztfljuyildvacvgovnqzfpdjpbgjozjnowmfydkqbksdifvkjwzyotjfjvpollvddzsfhhrnjajypvliwubysrrpvgmeygncgbnjazwfredcjhplejgzblvhmmydwfeyprhopvwcpxytglkcsplobgihhdpufhywyhxrehunwzjahqakpcepfxifcracqafuyqutakyiqjrihlnrmqzeyeyahodqklbujkxpafoobsmpdlrvyouyavhavwefzextdjjlpsnhimcvialvlcojfiettpwfikmqorrtbgexfxatfjybqhzgljkxsymnmrtvoizmfbegnuafimqleihurxjnxcthiqfmlmbfkeedlmfncpknouaqbgolizidmvgfmdsemazmpkjylmnmjsuanjmuunkmxtaflddartpejprklcoduulcatwqujooyjzxiakofbwbnixmeggmjfiybaoqtdvfpmmvymmzsmscletlsgdvtvqkhdlazyjhcgtbatwaxfocilcdgdamwtyjeqjallbhccpdpoyxeyyimqgsjjfykreeosrxcqowrpghbxlhefxdkknaobghssuqcrjvtbyrkrslrdsbojejmfwqyphdvppllmuujeglhrlnjitdugojatvvnjudgbjoxssurmicaghesmmcwvcbrcxdwaljhkpyokyjnhssymmvdwcairsdhuiyoxnztibeuwjpoqnerjavnlpmqhnlxazbffymzkgiqlqincskicaecciehzjhqlahkzkcydvrgkgramqpoafwolberjjjalmbjxjcwputjartvwtqpaemjqpngtqrxtejddnbmbijqcungwjnmgtqogroavxdlzutjmoefbiwjtrsaunrramtcvlfzulchxplobeshcuoszngxdygtnpvsfrqaxcjddcbxqbyyiunqalxfbklrztiruipfyipfrttokjnauzmjpntdlolgwjwqweowftxtfukqubcpzvhesbfixckfewyekchjvsfqbxrvcauyzkhzxcmqkgyyxwvcxywqgbwoptjedkuahhplutrmjzyzuqxuqoxupxllswvznosxugnsoemaibjlkvrpnavsroerbqgucmvqycxeemepgxqhtirzjlhbbyotzkltppfhlexhfvzscbtemwrltztwusnwvyevxoluntsekvyemqqsuclbdelvzlftcejntfnxemmfcndsgcourkmfdnnmstmiagifwaxaxbisidowztfomfpowefbapoblkbustpblkgfzzmhfbocwlmrzvfxsbxjhqgzcotptjvnyhrxycgdutfirzadaktzxdniaxieobvmdffrnavqjqlvoblfaktdbmcgaevwubsqitotozulicqomsqmsspspxceowpjhqpcmnvrzygrqbeuypnjcajemsyeiuufggcvzyzcfcbfinjyptoyguowkrgakeglzizbktlvtuplrqlnncujfrhanvmutdygnvwrllpriakunmcizupccigcqkikbrqvnvxaofjsisjeuoitwujvhhakunzakxgbrseztcxirlppdyksoccvwbphunbywyfudgouljqaatfpnlhczjurvcmpkmkkoeedveiopedkswlqwddcijbyrawgpcuigimudwwjkpvyulwfixlqpedjqoqwvvmoqperzyckrcgmtyxjwdmdfngmzifxajedfdtrdflxidkerctnxztydvgfxsrukznifekcebwkhpxakrlxodviobknyksypqnoibqliugiqqghzeodtffzxstjczksuspsxcbmftifvvbuekosqggtnpnkwicfxtckovruuxnfehmttjcirqbizjncszzrjoyjahdqnbanzgcaemfywjemeqqwlatznorfbijxphehsycaycifydnzichfkwokfygtnqjloilrjcozhzotmvbeuzhfuacrutbbwtvuvezfgcwnjfvdevthtikkkdubchvhdtvwzthyzbrtqzikrbapwlkgjkhalkisspokdgkoolgalfuiguwbdnltagkginasqidhvdhmautetsakneteywboudegphiscfgmcpwcfqyjwwymyudvgxwckvzdpnzjcddmyhcdyyeisgzhipeukxytchxaxplzlaoogyohuwwyxaihroseytmbqkijctxebzactauzlftcssxnmhvxbrfhywrjjbyornugiukbktadaoxrjujvebhydspjofqyfwbakgaywyinauzapudshzzrfslbdalghjoozhexqwgwvzkamnunnyiddiidcghxqyjwmabthmzchfufbsyuymuxqnqnrogzjijkxfnomgxbupimhthpclrunkbfhygskhhazrywyfrkjvwgstunaisnefxlgzgvfmjbukrwiyasqvgxvyoyxrarymezkmaruajtkzovfymwatameqevditsjvigfzbiujqctfmmqmkmrupjicqzpmfgmhylmbswihcdymrlreutgjaeetyovrgbtkcmtxwwibexkvrmdyhisjlnwejnbwywtqybewqvcnevwwsceotvqoqmmpawpmlcaoxkpbyqfesdsyodksjzsebfksjhqrfmndhemmytmnvnmkwrkwnfxmxulfsjervfjuwuykrzqonbdtmpkauepdwdfxhxatvqgcfpmvdkksvrjzzljsrrzumarenefovclprfsekrbelpuvfxtlpdahtvttfnjndeoarlfefmzfntqqzjodyobyaqmqiawgezflebitikwvmakrvgvgjokkaxayvzibdhwapzljdsvilhztpvlkerwqlixcczgjupestgzxajqzgzzfxeztjqzpntfynjoeztvynbmxbctjwrffmbkyadelhhllgfqtevairsjfljuacqnrrdntpdtqrthrhvsiocxxyuuscomoiktmfksnfvoubtkygscvpapbniyhepjilhljrwpjunnnbcstmmlepleauiieajmbhsmaklznbcavqopacvhwwgiovqqfadmeareclirttqpabewvhnqhwjgbelouhnneptbqskdykzmlrscupftcxlgutdjoojzwvprqmqntiqtvmsqbdbznudyxazftwqjlndrwqqjfeyaazyprjslgtvqvktxdvygjjxupvakkvsttecyoegixxqcxjuqzuxuvarbrmiipfcwvaphszlwtneilvvaxqtxvfxnmvzhnoqlluguohsyuvgwhefzzhwyzwbcmjvcrrorernxknvlxoolvsmfgrtrwlqemteclodenmxmnvyerxkbyucyrffifdgmtokmbpyfgrbgruviosurmqaqwimhfrbiotjxjvhiazwobgfqkmxbqvuhkdxqyitjzyowdsjvifrkrpiiqmmpvxernruokbuptegbpzyucvalvokgmbgsjbewhsknjbhjuphbvidtclvdyefhovnsdiwftrpawbnhdsuhakzyfcmaljmgkelwajqfrzcgqazsoeednhjwzzknjcprlchgedoimxngqidluknovzxpeehcyfezxfxpyhpveslbspibnyxqvqwtjcadgycchaqoreiixjiqaxslsnpvqkmdemtikwlrcmpwbgcvtyslvadtzyzrjvkenokynlmhrpekxbdmualrdpzkxpnqxlbzpjbexjqjkfcwexhzjudxdahkamxonrjuyxhbvztziytpfxsdpjhdorbozfzednlccqudjynotdtntvqdpuwhqlwymctswcglrdsiiktbjfbrlozuxgsqhvubspzgegscehxqydzzqzpujrkwfyfjnizyioluyolszxblydtigninhdsxhtgojttrhksflkzwglvfqrqojgsblhrawwtvbajgjzmuztrlguyifbgqwfejtsmdcvaqmgxjqhatxvkqfkoknwjfbtzfeadnqxyspagpfbyjlvjwsvvirqekhhtttjxixavjqzowhwanrqqzeineiymrdhezjxhyzkeqfiktyaxyddsnihsgsgytmthxmlxrtyqkxjzydnwryhiwseqzacsrstyuviwrwubxtxtckkwjgmxdlrtmmryqcyrcputxfxnbsqqvcmxmglgdflrglcgaswcbvxqkyohyiufckhhidiyeihxbeiobnppmkudqcnauavijjlwxoyifdidqserajyabezjpjwbcmqnfctolwkprgyrctcdhncgoqrijyiyetggeuneplzhpfhzopajccraetfnubkpnhwuaiurwdlofpryxkjgjwrypfusiuriiorhltgwinwwnvauoqdqrubaigcafxkwsvgvxuvjtxeyjazmqgvemutkhenqadsyfiyekbmgrqaaxxdmiknalqwezcvhqfefjqfngraqshxsjfmwmswlrkcjhugvtmnzwvvghcpryuytdhjcldcdvkuhumwtlzmklbvrvazomwqulyavdqssxlilqtmdyoiczflkbfoqujfdaxnymdbmdgwlmhqnpalmxwncslmplznmotpnhhrwyvuzbtjziloifnhpdjvebalycoewnlijkakwfeveczomycifwcdepzjauklupegpnnjrwwczcfyuzsdkoycsuossjhoitgnonawvcgvtsyuzocfuirkptkrdyjbvadcqfprstujnsdkkhbhknoaoffhbhwdmmbukkyjfjsaixqfekuznairpqhzmobudfzrbndhutocjvekngaebshlyzgllwmqlveotgdulqcddcxmofnzfshjuknqdnqwzemmvjjyrwlxmtmkawobhmngjzdziwsyrxihdmqrydkntwgcogqdxdazvhhjwtddtdqxmmvnuhgdfmwqqhjiyprosonchietuujbiotgxuypqzcffkjgnwwuhesjyynxnksctrhqczmieipprvhidsjkdxtffqehjkdludnvoqtckboseyglcxtzhvxraxairygdvqkjmlrpdiowvwcxmzafebhcvrqxwblcggtxhkodbckfaajyjkircvqwonenblnxwvqaoayudtfxncilnkmejawwrqjbalygqikxmthkufejqibasqemafqqtadyzzznmjgajlbmkgkellpvonhhbfhjgooonbxadogfvdmjpcjktmljktuosldpytrzshwqhoocagzdhnsryrldapgtslatgetutxxppostreyumtcwoqehtcqnbkrqgdpjthwnqbmofuidhqknekgchugccqtbkhsplhdoerffhnealoqbgeavnlrvdadbtysoplwcythmwuqdjastaoynyrpskapikfzfkcgwldnjnfomwlvhkgyxeehzgdqybifodatwiebczmkqujugbmrzdjdrqxluzbfjljmawzwnvmmwvmdodwbxckhvyffkjujrxjaqnpeugsokiotkeksorshcmomwxykyikjqiuopmtnfaifmpwphwwiccuxnlhecmvcdpkxcjzariywtpnbendkotffdzerlmhxqkqxrannqnwcoyumrwpvxfbstudtwwzarclmrzprxxzpgjounshrpqdowxwxuizxeavdcmrvbcvzfqzfupimtkcjjhdpkxkvbovqbsohtoqpxmqdwbkmxkuixtgkxqgpdskxvfzoovpbodqghiuuzziymxdpmqvqpwaenknmkyleikfjhkhzhugzfeogpxtlndnzeecypltytsduzowxpifudqoinoqmuwxbopebbhqtgwemguiummciydeyesfqmplpwurmrjqadrbjbdawdaixffpoevkysfkhspjlgqhxuwingdsuqeanwzybcvsxijaamideleckhydmjmpfvfkofhiybtfyhaoelorwwidtwbbpclhdzxjosbdlwiyvxjrmxqultzkoboaxalruqhhmvqifygtbsthfzikemzomrzpwkxljmvdvqvevwizfyrtvahjlumupiqvcahkgpilqashvvvayogetjfvzmooqkasrakuoabwjktiszlnraksuhjssvjbgowtwtcymejirffuwfxonotofjyridqkzemjowldopukxqsgrnejrwzyjxthntcazdaaaxjarlcixazmfkjqhtzpljamnprztkslrqonshyjximuhvzwotwtozpmvdktjzlnyoslcxokuechtzziyiyyhlzifmiyozleexqtzsiizeknfteapwhuhdfeviihtsmjmemwaaedalljyjjbdowkwfluapsmlhgfwzfampeqtxsaxanbnfjzlwcddtkmatcpkgzovdvojvqulwmkwfqwoequtorcfvoxreqadfnoznkoyyhmgwsgekrbsvpankiudvlnkdrccoldmbnxqlklofscmkvlxstdmhtglkwxttrmvmjtkphrxazhmtptdgttohvffjgeisttkbyyritysxrjijoucnwgsexnbqnogemepmujcpnoxupmizlfnbeovivuvqlspnjlutscpycsgwzxlirrsbxsmikrqpkxgygihenzzgdqvxsuwlnfdcvugevtzifjhzznznifuleigtozbniyfvxehbhscdbjrujhochenxsojhajvbxchhdxfkuamttoqyxpeatritlakggvbpatvlijmzxovetakhewxlxjghwibbnhjsfujgozpbvuehmvsxwiqdnjpikbqoqulwybqjajumizeliiwvavqkywmeoajfaiprfguilijpcyasppryzosscebozmnrtexwxcbqvafrfflayyzenkspowiejheltpyovejjziivuokphvxstvboycluippzixzpmsoaqcjuzmblwdqnqpgfpysoojbirxslrbthmcuhutfhlmfoepqjrmdsreeircfathfnbctbkajoucexhvnolmhrggshsldowcpfujahjqusldifqhoqymuvxoremxqwiwetuhaqqtzsxfigjptobcumrbxxmvfahallbmqngugxgnmbuwlbogjhsfoyrgugahrwtrlfqctrvyfcshorcmvzfhxhwnemgxazlvicftijrsckcjshpmmesaldlaiwwjrsunehypttsxyrdsyrbdwoauuzzlrobzlpukazgpmwesxghptlextoyybwaeaoqzsvejrirbbqnlopkfymihwjcnxbbssycktwhaaniajiarvysijokpwqfdzinpzvmxibtqbhjerrqolsgkcdddcahvetssccgoydrjjsisagooygqerjusemnswywudewrtxwgxwbqovtvwcbsntwhagqglkmgrofjuoncsesonbfxfwuyfrrzrlnvlukegogpnasxgjzpqroiptvpvccsqvvpihcbwpqyrmhfncmldvozaqaocescyvisbdtdgyaxpqdfykrvdwsrnmfadcluqjzmjlmqsznlttqtqgaiheezcewwfytcgvsqklngubxkiptrujeircxocgcngogmennsrhhyugnsuxxxffxqxryeztjclfpdbgompwhpnkwlshshcprfurbohduvdktjwanmzfvcwihrwsdoqydnexekbgqjwmfxaecqvvcgyldjaixwzxftlkabaetqtselasjlgegcndybnbobaseeebejnhrwbitqmfyuidjtnainegfyxcwfovbthgvyokkxjpdqvptrcwrmccwxqcxqxvubrivyvzuljatowjkebunhdkvdmojqkqgehhzfcvtcivvshsaiiowbjbovlsyizebsmpsywngxpvxxgcqabiszfhkdvusfpogtckrsmdbslrkrlchliqdqeseeacrsbqaaelqwzrruwgvsonxvsgwfmwbijunupksrzzhiivihnrnaceemqksniqhqjydjivdftacmrtbfqzvnymelsugpooirkrksessrngtnvcjqbsrqiillpxphfrlymsapwrtujobbrqytkoiuayottatuvkliodoqwfwjvtcqcqhhoxhtkngjbybpkojolqhfhkmwmwhqxmazjevgzoflrijyikoyxwxzxsorizjqezgsnjstnyuztkhktgvuvddgfuapmalnjajcirmlroetyflihwzxewrbbdgrwjynnfurezfnazydjtablflqwicdoyuzpjexgoyplmchiiwyepcxbwloxnbqwptxhvbghxmveequhxixvqjkuufhdlnsndqtcqjblfowcqoumuxulhyadtfaqnsjfnlqqzavosykpdywtmurnjzsrhyxuznpdrsvlfdtskarnizokcdtfdapqbrnfqzdiymukuofhrlarhykxzsvwzntkxqlytkyonaidwcxkrantsrmwkbkayibpzjqcgwveunsxuplavsimwytwykdriqajvlevjeblqiasaxggyiqqslgchkqljbnscfzeyupdxsmzyehnumorqvqsydtjsladscxjkomwgixxfxycyjylkcpcuiiqtecxpocorogkjfgnnjxruttpjwgqakjxpwsrrnzljosgakzbgycxkdimjzqqymngqslprimmzduystwwrsylaguenpcmrerrgmtviesugzjiritzftfeegaepipaupnpndwvpzuzqbhwdgkikwovygkdmelnlzpgjrxxrhftckaubvnejkradlpovdsiovppcktxrrkxhoedassesxvqygvlexprsjzvvhvjavdzhnejtnxadossuhorvhpwameziuejhefxbnescnovwlkydbezucgknmgxjzjvuxdwbtawrrlksqffwypwwtvrhreemmjwugsqquuugccjrkputmjfanburmxznijextcumzxjfinccvtcofbypfwpwreoywiefggmllkpfrhejtuhxqcqhijervxzdnpnfkrihitiwpmehclzqbulocrkprappndgseproqedxscatbjdtqjvnyarkuvvridogovcfocnttvzczmwfzdfqvmoslabtmpnkxffezwjmtgzfjrebpajjypvornsugwyauapyzvhurqktkzcqndtwvfutiatocetbvzphuasicwisomilgygdjywhybrwhvrfmufwmgxpbtxjeuoilkjegjhfajjvkukpfakwfktnizlbdcfvlddmdxexwovfjdemhbqzncauciiratdxerbsfyjpnkrkvisbvwcpsmwnjuwfppzbsashrejokbvvienpzljggstgxcesrlbkxuhhdmudhxjbmaldmltwceoalmhnluwaifqkwdlhfkpzgjwmmjwioahvnygyhlvaigwmgvjhvezmccabucboybemgqjocwiwyqhlluvnkewbujokpvlssaecvuwjxillxpqtzteztmqembgbihctuaomflkexpydxpdcrytzvtqtprtyoxfdgfgioeoholaleimaadrvfetsfsyfbojobutjtbpwllxteoaktlwslrchnmbjrmjkipeqhglnxipbtyxqrgnhjkgqjweahmnbjldpezzgvrwajecspimbjlhdpwlmiyrjpoeqmfquaqmnovknqalpmmqkwssomwyjgouatxfzvvuiktivgliennlllpcuabjvgfenutmsatwcfkrgedrxyhjbhqlipxfpittfliwzzyxuelufokdpzsslrgnkwycpfghsglzkcydhvdwumzcjnrkbhpniarqvcsugwqnzzpaipvjtvbvaflgbuzovznjtgcspijdrvxrasxxnayzasyfbivqobexmmujatjowboyffemisvcvnhisafkwmdmvnxgndweoxyniacxydfjlfsciokecncnhtbavolfhhlkqdldocbbipshkkbltrqesbupflmkmlgrsspzxvnavjvmkgvbprrrxqhtuscmcklxiteuluaavjfrbszeejrxzeevxjnbtcdavkrktfuxlvmtjtzjgoajnoehgfpbhajlldpurjvzniaiyofaycbkqupqxcaxvxngzxbrmtjciogmlmbmwxkqpasyobnebkfcnbswrhprrvxknpiuyelzulymjfqmexjdlocewjqwdntdenlxbxmkhjptbrlxnaxpbxeegczxxbwekhsoultwbqviwghphsxwxpqmjwbxpabdcoeykahgaometeevgrjamcxnlsvidzfpyhdvzmttymzskthiycgjfapxlaqrqldnroztotlnniyrtjxmrsunxsjlvqxxezdwflvdgvijhferjycxogghaenhdpedpksprbzcgqbkxsserqucslnzinedelitxijjnodeyvhqwylsgewywhlvrdeuhpjuafkzozdmbkxovlbkvthsgnngdqermbbohiczjakgymomkwblcfrvznqphvmeqgumbvvblrzxhzlpalvqqromorqhuxceivjmrdufgyzfhiqhyrxtlcgbwyoiolopkixlcnyvhoxyjgvbmmqwvnleltrrdqniglgmmbvyocvatnncqaocwhqkukliiwexitznxulhzrwdkntxneyahpozvnuyvsgqpfvvtmdcqepjkpnbwvborxlkktigtcipwtkilanpdrsybddahpdwvbotophyvgtorvoqioutbuipmavchhapguutxtjsyuveozliasgjzrrtcdvthyazmmzlhgexzgqraxqsgepvhchfcnzutyqvooamthmcdbpxtmhotiskppfxoqulcaliwtfluyicjdumigkhcrktnzulmzilldvjrduuqylwitfowoxcvsjfzkqniqeuylfzfeszlhrrizdcslkohdmkvzkguxywmteverdybnvbstdkxnosclalounbbysfqfnqjobcsabjeecghdamuzfikqqvejabdkuxbmtszqqtcvmtuhmpoufyxzctieznleszxjuzqxmdmafpxauwjnypgsnyiekjpqtkwpvezstdoxvbuuybcnygctjtbzjubmdukytzshlopigskeebeulnenjulrqfnvflgydwjxrinfkhyvfrwiwueddaxjiiuszdhzwabpfsmebgercsjutolboccleezntqhxjuhkiaecjvfklrpnyhsefiwosscmyhebwscyplflutbtnwvgsqqgrilbajoqmfqrbcbxaogcmbykodrwrspwsagxoynflkvxmwpvsspffrjmsrlqbhqezqelboshvlvjpqjbpofnwoabfgwkhmnxebstuwlxbsuybeshokuvmvcyznuettqpwtoizpnsojfuggxybclxjolelyjhfxgyqfemdnibomnvrscpecpqkuokzequxweqapjlcqfzjmfgzstyuamyzixownaguyulonpovbupucypkdoeibgfjgsrgjaatqqgkovhmaxirntrxqhhnlmvyotoxamzreytphzyayhzmvgmjvreioemlgwjfvzdegrkdgacponorzreuxyylfbidfxhfvmjtiroazlashquopscgwwkhllqheonqynusjjvkkgbphfprjobgdzffujulmdmxanlnyhcxrkktzwsbdkzfrjdkhqrgwydckpjscxjwwcadzwpzmgsuxrlbbhqwtgvcfseszkgaqjkayydwtsrsvndeusrprtdqzldswjfjfexjevlkygdzmsyypznpivtzhiogtojbvgzhiepipgqsdqtzjpykvquxtodakaqlfhviyzewcgfamqaukvaozflthmkprxosspvavjbvynamlkthwdqfzptfwqvqejjsdcnvokjfzqtgkpgihzuqbkwtawqamwkjyusraqbrzetlmcrdobrccifybefuyctpkyjlfkcooygvglehocrjupqxcorhprajsykgxbuhavojovfunpaensldogphudeedngxbulvcqhozledvpjkgfqhhtsgbucxbkbzhtkjnesxkwemdokuuunhfshtvxkqxhbulzrrknmvejutflbnzbkrqisoaqznulmhgvckmtekglcztsoaskwvfhsiuasfsreildrhzftjacvucbemkeuhkubmefeyrhdqoostgexeoxllrluumeccrjzhekvjpkfgbalsozmaxxhgwwzdwhdlrlqwalrpkzykjzqurygzdnupdwtwxtlpuvyrqioxvjnieexnbrrijvsoodysbdgieqyfnrcawgtcnqmivuhkdejlxpgjbnsyywsjnoojhgkmspmuikhudmnvngiljipeluzribhzmomsgsuknkikebjzwyhpzptzqrildgeapzimwphvfjbmlkeyzltyocazbdbygyifvopoduidvvpjynyjekjujnihqkiwosgqtuykypmixrmwcjygdzytehynpgaxadzdiywouseykqmsujmsckukjxbderrveiijpcykveloibbjfnqdktyhayvfuntickjoixzyndywbapodalplokqsksbrfkenbubaepywaxyxhfcwalrxgazbykxxmspimvgikfblkqygrcdmkcfbftljxeuesvzrvewnjxvtyuaqmokmxohpbmdqleigiotymdfkzqzwsoezrclqbpiglzmflajttcpaaxjhcysojdruzoxxdlpftrwhqnapnmwznldecrffnvierizilznjgmuezwwksgtsbiascmmnjisdmwziefstjpezmoplwsnpfnqvvesvxgabcfssshiafskdpyhplxhvqkvdhngkcxanesmfucvowqcrysphysibegzxknwaffptlqgkqmulvpvkojfqogvjvjgglslldvhkzzeexvoksfenadgqghgalzpogtqkrwzgtphwrykmzzorzouxxulsghwuckxuibpfstvgcdsvdiyyqvxqvusxmtzfoeyzxfuawpbzxuollyofoflgecjwjyedqofheougizotmivunxhrqzywlnjpovauesoptqkdxxifwneshkduzfkjdotyyxpkfkkrcrahxfztuloiqlivqildxqqpmtarhokabgtsrhhsclyekuzmzntsjstisbbrjvhmplrtmqvmmswbudyfwcsrsahdpeeprlksftgkqysgotmxupqzgkknlivmujuhwdghochlbdvpcfmzwdjeghmdqapephgrdbtcrutitjnbiijzskcmglmdcziwthpjlbwgasuqabisagkjrdekodngzepcfwzeodzixcryetyempuqtjhiewwazkzwnibpuxtjdojbxgnojqabotyjmofiyesdjzqowwfqvhzxvghrajnrthkztbgxwlavapkdwbebebtnzzfrngkdnilkxjpcdchkismquqayrsgkceyibvgcauelmxfrvnkjkwwbdzaiipkboqufuerhjlhqttaakqjenyufldqwnycziwrbfupksnehcevvpcavkxcsfrcwloyyilkbhfepixlqlshurvwkuqdpefcxyknhtmkicimvneetwycqedqzhifyynmnwwgyjsecvzpohayerrqoezuodgbcukoneltwnwwtaekpqyjhguafekbfhwismihkejhvxepwstdqffsjzlfpfxtqlrhobmqqllbcdmxaqvrrbbbbykrjlwiqwxomcodncntyjvilbzfmfjkmgcvlhbehraurglwhkhpqnodgcbdovdzjbovyicrhdqlrrrgpkhtlqkhsjtnzemspeqwfakbankdohnatebtcqklvfiraflqfzcdmdqysmrzgcnvgxqvtpzzbncyzotwkejwetpooawwjvhiozuvndbnrirvkjwrrzwytlxbklibwptmixmaxtjiaudeignepvqostdqrfqbyyerxnamuxnrwjfdwqtftkmimityowobuarymekilkduihhwwhefjpiqcisyvsaibjcptzxruimhylhgwxjpzcoiembcqkowbkjgjvoyoxvavakpymqknpptyiwyotyaitzcrdipgvtjdplughbbxpsohnnnomeechrgraevhbleakszoataoawugobscahliprkucrjdlrsgdegmlonxjjjbpdwriifilvapqyscctcouvyeveevunknscabvcdnrkqmaqahohwysuwkrdkiikpvmtexaguubiokrevlcriohwclypinzhcxgvodiffvweadfefuqkeezxzyzoizdhdlmmcvtqlxhcpnsysphfdezhscjpytxuvqiibsntestkvgnefgbnebdfsxerbiagzeopjzudzdanccnhbhosgwmrxhkinpkrnectbeqlkgozksveitsyqpbpexwpbdnyhzubspfxiqfirmsaxatmqnjnkkfsuhihnojqnknyorufnqvrcmeytudoxzukcdqhvqhbtugrogbhxrcdwcemmhhaiwiwblyybgmohtefzzhqloetzxlcdyuqjcznxkwthsrbkwwomtflggmepqmlwiogkreuavcjdphjnncwifxnfxjaltrqgxhwlwrtfekixerwsmqputninxzeytpufphpukseejgvvehkcbkcjhciapcidpuylhqzslhxkcwczlfoehwiyipyuvxdksqauonbjzskvovifeizcuoxtbrovswttvxvpcpndnqdixffvymozgymurocmfqpurqwpzjcjsrwurwqgotmygmuuakobaxjhbgxgziownotsvkktaibqdbvzetzqahbppurocveuknsyxxxpjfhczxyqsklemchncixxbmuyyfhdnodvkdjxfevywbsrxsgurqfftlnppauqnedzkrjveuzcfgxtmiblzrfdelhibwvxwixnabdnnidhrsimlggolznzwehniewtiqrugimcuexizlwvhbllhsvpxfhokqxszhqgaacyrvttqtubklforybecfuleygmnjhimolennknukcvbamydhhfedguwmepyrrrzgpzgztyjbjkyyhvaqfxgfulpofnxothyphrcxjtusnsephzpoczxuxwynjihbkzybqowcgaopyghxtaynfamnqctpdttierivqvwqlghwadvvodvfxggftuagbkclawjzuzzsqgiqvtsqtohvtwwmgzgcwukkciwurbfzpnwajitipyzfxuifswtoqddqjngkfeuenhdtmrsvpbahpfkivqopaklbqcxnptfyvhxkkhguheegsatbnmnzoenqwollmiueultnxbfxazyioghcxubpqzdcrzvoiftlomirvyvlsbuahpomysfbjoagbdfutfeevwvykyafbwjlspeldqfdeicppzldfjssqumfoavsttdxvqptaxsdswraupxktgjixransbwiduxcptfkrsjalyeacuskkabrhqptsrezmlfjujxzbygpocsusfoumfqqhuoextwyysqlqybsssrmchntbmnknkcxphyxqwxffygotbhuxofnejwojjccrrdqslmegboxebssfiynzhqbwdzhfqidjsjcvdninfyxyggfechowkbkvofgrqhxwtlkhlzbkjlocptxpekbiraizjdoqddaokirzwodnnnfgegsugqlywxipxekfwtfykdipqlkxgoexqkffiudjuqtxcqjcpjnijsimrfsdtcmjxwipzfwlnmeqgwznhrbzfjczdfyumirckepxiqzzlxbyrulutfkpelrvjhxkdzozgulxpdkjhjtgjxsbucmymfemxikxndfmzpachioqtfaarouhiqhegrfboofgratiqlhxbeaogsjhhldvwcugraklqrhypwyrjcocnlqfsspawlzyvlsgnjdnluobdttdybyrxpbplrzfvxmhzijcbxiyacnsnjvzefesjszeaykkojefjjlnsgjvbcvfuyefkakekctxwqhcykifnuqkezmfowcmjnfcalhlzcaxwxoqpbpkrbhrjtnrymdhvgnpgrtvtknactqkfmrpwokcuuvfbabuhhmlegxhteoywaukdcnidlshckzltrjyruwciwoqiaurrzovpbxgdwdkkgxzuacbxiubaoaygzrlpllkozmcggzohbjrcfdszgjbcauumlpaaebuxkurnodwmpjswemllpjazuzkyzkaromqdrgwpxzwugbjfpwdsijnslamthwnwggajqcpehhfuwmcxctxltscehstqrvueulysuihrgdefcxvavvbtywyvxjtnftmtsntmrpzyomzegudfxlkfrmyzztdblezcyghknrharhrtdvuckrrundzuajndvlxuecluqqdlqyrlfvfcehisldldfwsdiiiomwtbeyevdyoofekhoktzpmxzmpwktldhxcqvmlzjmqvqnwoqsimthhgfhoxsjzyhvwckrfmzhkoeabudvzvekjatcbmhhnqhiqplutnmiysovwhsaaldiuhamucesdinoocobzraerxskcnzwxwzwpioqnoonemzzhpvuaxjsqsnmjkpfrzyjyaoqnbscflbgqeadxusolzqczjrlsgxcwrzqiiuydqniersadlhctmsgjhducyijywnbloofhuyoasbosstdgtpymkjjsqbmoqttlsrfwnbwavtytwshstycuhrjqrecswzglhpvpekcxdcofzdthghuhkhlaccotvrrviajjngdxtghyykfcmoldyrveprpewrzlmqdsrsmtxhxdsfesgtruovlhvhpisptylgitekttrjtfzicvriujykhutvvaibanuqjtbgrbxuorgwbzxihgdfywbzhtqxgutcizgukmcyjwnqxmyjtwvtkzgjwzddlascqvccwghshhbrhzxpstyjmphclhjhqifwmcsmppuswfmstdnscqbrttkbzxvniuxukfqqobasmoucfdjfdnnetwelpxsxanyqbssnhoztffnuocodacryvvucmrqmrjrpbyibqviurjqghuogoxfbfoumgyejzodykhiolxwlfjfocgvwdizyaufpweiqmqhzmazfsxievyqntwnpdqkwahxwhksancqtuiiutshsvnsjprjoxngmqaphounezgnpkfwfqspffktkctbyojbkdwelcqtawlquymyowwdnclahmthlbqhdgbghmipkpqwqotzgrhparhjjdaalomttswlppcrqocgrftxjtzookjarowkncpbmkfmxmrrrfchjepyhumfvqzexvodrrdchifexsppxeirherledmialsecvqjckcharkfkojgbqjnlpyexhdurodkxlksupuvtqiucruysotlfwkongtdijhknazjhjbgzoiioylnymvjmmcashblzltdkjpbqpwljdigpgqwopfkaumjcnqnrssrunjghatpnzkeozzhcguurrrjltktsmqhkyfpukzzkxcwrydqxmdkqmummqifcvalmwdmdwnymcxevrlvehljdjvseihbegclqlsfsrojzlrhtpgcaefjsavmhoroecmuwxsbteatsnvymumijrtexpxhtjmmvljsbjbpfrzbogvbyhnnxxaqthjjffmvwphhqembfruaeslawblxxjugfmendjexsvhhjbiifadfueuxsawaojqzfnjzcrolqmwhsdwruqdhdddturymitcnnkqdhiszuhcrkehxsldrrxfehyyprsvrrmmrcerooklekihmhogtfyonutwezofurvnybkkmmdxtpxybpuhzvehkyholytrogkxmcztfyqycwrnedyfhradidrwjkqeomthxngiuuzwqqvbivmqiqnbcoawgmardphmcaixiuniokwvmymadakffuvwtgxsgxgejfpuckeveelxkhfqeiwucvhlphamjddhvebsingtsycpltphfzezhmafvhunnqzidjeiztfcauatqaoqvxqvnuyulmtyggchiriadiddsomeskyalafxivfirkyrwgstneljmanucrvxofatadvvcjiabknkgpzoaorjqxjavrcoqrhlomtoxxwnywjscnaawljzrvufgwyyqqysysricclyutocmesllkrhkxrrkfmktirggmrtqvapvozdjniskqfberdxkeioipcjigbgxyfcflpjuuhkohtpujuhfksvhlwdqeriqldgyliwymsuvurwgvlvmorejooabmlsrfgsypuqqxcqaityyrtcwolbqptjzlbikkbfmbppuajbofotfbeqshculckiiumydnmljoqtxlkxhbwynafahwjwuiqfehnxovfcuwbrtnwuirogjwbryxtvkmirgkbyatbqsgbmmhvvprqkwouvsvowvwwlyhabfdwzldpuvqoegjvujwpoauoltvfmubfrtsuffgtdmhkvdvfumofytqcspjsdjfzmgixgktlgaeemavzcrslwaxbigzrhltclfqufuefowgvkpsrgrqtzdmuktxjbitacwbnetmvdadkqodmdszrwddxwerjhfwvlatdoycoarvrlbguszelakpzbgkblisyfgrahgrfbpexjjfpfuzhkoirsomtsmvtjrnigzfnsoqtqleyxdjcjnourrkqjmpzlenviqjxhbrtyssksctptqfqbbcbqearybnofvxqzhvtgcxmbfvematmkdzxmozvnoyjxuhsgiznwhoievtdqqkejkgvcgzegpnqkyzomupqsknwyitdirqlmswvriikrxygudmoqqqujlpszoliihivndaoauovphsoswxvlgranbunynenbhimpiisbifhnnnmctnixsgkhtnwfobhnuujufyvseucizzeulsbwfwaqbgtyohlmvjfpedfwzplicaoqxrefywfbaiqkszdfqilslnmevzgaxiayktsxmkahvsqdcvsjxjwqarendxoqehcuoaiplmqclhqercrzybswwcfidcptrobxhuunhardrbowampgqomssabetwxkuyrxxelgwklktlzwxucrswipbhuswdyrbmnmjiiznxrjrzxoozszwdwybygsgvzhifhdehikcouuqvbkdokjxuoncnoanmytkwjbpfloqnepfnqyxvrsnbogcdkwmvhyoutqttfpvupszklkeohaxetnbswjlhqpmjldtiykpsbvnfccdmrsxbwuybagsdpbtbkaexdibaicdzsrrlexdskghngtejphgkevdqdsxtpzlpevghmyrivzyikoxknvxftvbhqvvwfdyobilekqrssjoynuxgvgawopyejvxqnxrucmputnijjcgpieufaznojdyxpwwhtoyipvzovhajzqewfqutrwfgrfwswtktnwiqbmuubpjuqrrlygbjwzcknbxbcwooowhtrjaoczudmxvktlappuzenwbaobhgpwichvbctptyhxdlsxxiqzmelqoqjaecwqrhmacjnhsrkvozaaksquiivzyfycbrqxtgvxqxcqxnjmeuyurirxlgaipjwnybayvaplguujlbycqjngyqsozmcacizqmeyzqnfylaxjsxmpkyrqeatcbxfjebjoxnuhnhnvzxprnwibqefgzbdxvxubcswqzwxzlteyhnnxyzoqldmxgatrvkmnxboikozljvewdptptogufpwxahryjyvuxpnxpvokpmjqptaqheiceqdkikngnkgmgryuwbudjxwyoiqfylnlhbciuupifmpejhlpobttpwddioyaktmcqogdpezvrygxokmeyfhibssaghmayyjywgdjjhqhjaieswkpnyckgmdhfjnolndqlbmgwwaumobxzjprxiklxqzejutelranmzuntiwldbhhbltisydnmvsilnngrjbmppfgyjtbtxrfnzidvxvtybkuyygwsjnprmwmuyenhhtuzdtfowjkwtdoyinwpqdoodhmtfocssbhowzdzlfyitkvneamhjtkyvmaznnbctiqzlpootfhgfqqlytewrngrjtnrpnemezjnuppaeuftahbbyypdayaxiunnbnjuujmghqojjcdjrjbtfaxhoicgfhcyrfmlfqdwfvilcdjvrfawgglzqtdyckoxikzzgxcbwheqqhudaskgwyxrjqsqkqzogyumlwxumzcswdmqkgnijhfpkvwgacmkvehpfvqqrrmdwsknbzzbaxckxfwixhjxjeprycrljtscckgetvztmrtximfzlleulttdfsvbjmonetdefblvfezbbbsvjibcnoxjtrcrglquwpbrlxzpzkdntjczcylxlzbimojafgvtzsigigolhbycnqzvgdqwnolbwunvvxiugkpamabshjniwjqjaczxxziidbroemunlqoslcgyccrwyumkehfukueyfqmakgsvhatkixmuepicycqsgxfzbfxbhtlhxvrvouluzswnvhwfxrxoqdjhparkfanwxvnmweulzoobfcopohpufbkafgmmwekdzwfuptkfmruwvqzyqwqvagqmvorobhujuugxvjeciycvjmirkobnlyrsmjthxhsfmtntqkwxceepmjsxnfgyhbvgobuhkfgrcnoznopeihvvcqbipuvtwedykiioayhznffsraalajifxencqeelsxoregdmrpskwdacmcukkbaflnnfcpsctjpqjmzuuhafhhoefnhzassculrkdouawuxbkxbbrslsqqhvrzvmcmjaqpbjhznimtrubgjaijquoclilndibvaycknyxfeyqgukakgtdapaxljxpzmlcjjamgcfyjnkzaseanypvqokwvftfpvfetxvfuostqlufckmsdbaijfrkexcugzbhfrdllnazrombgfqioybfuvnsgxvljhdqtvhjuwbbcozflnvkqimatakiwgcqvibsozypondljocdosvdhbcfwgpstvuvwgywvbhmmfdxukjefmzzklwmhpuyvrrqpvtibcujlhgpckjxrmreemiyfzazkvtnsislbzkabnmiopikuwcbhekgdgordzhpfvqrvimxuxypajefrjaydlmfceqfudjfgugkqiktxtbomdacevtadzkaiblagdzikqvutwxludserkwitipadtghmfndyrtdcfudosldrhacakltsuzvycpnfxntqdavtlfffkbduwsigoijqlhihkqvppbykseogexklrioptrfaqezbvejjqjrwutpivnumlnxkqbqnjggrnofeqgmnphpsvuyofumtaqcliuiypeozoorimsdnqbbxfzalikeknpdtagevmkdjdhckcjtjnfdhdmqrtxwdtfmwamjzaathxdytufrrtcobgklvaigwcojfilermdahxdhsegnkhbfdnfbzopvtisbvhntufhprsljzmayxdkoqcqsvatczxyurkxjrddwriknvgmawbprbaucxmbrhpkltdetcozpkkaglyekroiuhundboqcsvxxiycbejqknqpsawvifglcwlkicxdrjmfgepgvquksuzoxhiopmxgsgnujtsrjnpeejsdsygbgiiysvcuuulgsggczjwpyrmgynldqymwiuvqclbhmgggpswsottresgwngqurwbhqqxynofmzbudpgzeatcrykpwzsiurjeiwxoxexqjvfqjsvbayxjkcodncznwhcdiueiyqromtibenpqbtjducckhricvjsxqjcftyjtghttwurbkfzjozqoqinhswiwzqzkkxrrdmayeptvlzfqhcqmqagjyroghgymaoxfhinhvzhfxnhfqwgvvhltvmaewvatklmwfhfasurdumrhwznsfbhxlxphqftrjjrejjlfjjxejpcawpybjsrcbinxtrdxpxldhrrqdyjpwybdvfhexlqxcnjuwmkaxtxgjetsclpizxltgjggngmgxozasgmtptxcxpsmyannnluefeuqsqjzyhsehvqajgzrmaqubterldamiysqnfcdgewpvnexabdxnctrhdxxuordviixzlflhdnhyiuracfqxbuyxbugvcfukzgcnidqepwipwwwrshdrdxqrlxbzgnwqyanqrouexddgnygoiwigegkcacommsxenaxwrgfqwppndmrpsxuguabxolxqlhvrojktmkhketwpuavmysjzwawgezgeouvrfxuswykiqbtgeuqkoxvhkonnkdbqexqzoohvmnfjkjrrubvkqfwzaslzkakucfxoeuqunegodpwtinnpaemajsdaqddksdjxzhzpfkzmiyanbwgkgpjnmwogawveznhcgwlfnpknrawwjdtnanfysfqtriiwfsyhmehmsqdujkikkweuvdnzlujbkomuizdcpycuxihqwaaxlgbwlebxskhtcaguwezpsqjzcbuwtwpfiicsojobfhmpofsxsgfcqbiaytqgrnqgtnxplryaqxizitcrgntccgzskemrgwuwntanpmeqdlztqfeybipsarxivufjlnnffrjeypfwrnmsnrfnsyyrwwsmielbzzyoufgilpvtlhbjbxwzxktkhxtfgigpdxnxgdsbvlzmaqdsnuffbubdlmbfhchwlifnyryvmobyghciaknkxyapugxhemfvisliqtmtanangpeoobiobwryjggurjgtbokvvcvpbpseyataykpdbqhrpnhypvracgrajeamikddjrdngoinrgbeetupepkeyqhrxfloysqqyibmabksnfgbzrquubudchbmfmhkmiiekocqpzpncdyvyrlxdyudenvkgwrcodsojgpnmqthzsqjzmmhifhixfqsjlyjoridiuqlcfxclavlejpabtedtwmrgjihgscomjxyntnjevahjkwsrdofqtaqsxrolkjlqcilbnsbuqyauezrwwpyrwucypcvipiewchrlhnxuagclagjefdqvjbyawnrdodmwbwmlnbpycrtyzriskidqgeoxbtwjuwwtepzgobuyaiuvofomjqslxgbrphnablbdvgjuyujooxuldawrkivbrahiivhapyqvhlkgsyeihblwtmcskogvhbuspxfgnpexotzbhajjyizyhbezitbphujghuhhpmkqaigvkcdxchhaxipckdgalngrksfcoflvenrsbwffoajejbofdrfxxfgkjswzimfhnwdrhjklhjnkhdbymgntexqnmnfcwlkhxyhatgsjiwasxkikmhktyhpaymouayegjzgtjtfnavttqhauelehgogkchvrwjzxscmonijoenweeodxtuacvugxocnqeyxfmqvlwtckaacwrzkvwvpwntwlzofsvpkxyltgkhlwygklddtyoafborvqxfizwtytzqolwtedkmmfybntqhwgyikhyvbqyrrexyisnzyggmhhcfykhgyesqevsjgpfroyhepumdvqbpzukzjxkhefcnaqfggghbwxcsozqhyqukefcaacxvcfrdwhvwvwatfmbfrukfzwojlvlxrtfdfjpdoowkdotarrujxrguodbqkzwobsbaibeembyssahpcuafjcvbaitutjdqefxjjehrbnmwbopimvgrwosrstknpjhyvscgoxatvcqfniquvywxgcnrufjefmaviewkxcwdyijmxjhoadlhovclgnbiutmxoxdbsywdchkswtjhwbnepstfyqfmavjsohyzfindptgohbghkgfiuotitkyhzirvskhupekvgbyvadsihkummraozutdezbkdkvxvnyekmyryzsnyasuzbolwjiupowrbnhvclfpmesgovizjseisvsygruvcfuegygvkmbyudpmjlenosawzgbgouqdqccgvdumvvbuqommgnwelpxmsflxzhjkmopllmrhzeotexkxvxnlsrqbrqtlbewfdjvqmmjsdxiwsixrcyhkeziesqgfprkrxxmlxayabdcgpmzyuspoiyyseqdstjnqxotbxvtvdbbumespwrknmtcwprozfctckqbbgsgwdxpispduznwjzcgwgwzvqcisizqonndedejfckncfghbhtwryzhrjzpxdwikcvommnljyzhfrbwsfwjcdeuiekqcdomfovcwcfsbpfxrrqmaqrfpoganzzwqozcxaucyenogrdnuljlkpqjrzzuriwhfbtcclzymimyarcfhhgvpapbncyiqkfpvgjwwwbfidkqpmyfllhxppvyyfqvuzoyyaesydlamyygtxrblzxbexnavotbzaiclsgnyltkmhcqxvlxbrhwumivfnbstlhnrymtwrpidxcjmmexaerhcxejfosyqyzytppxcwgorqmreeuczsrglwwjgwdtlewlbalpahlwktwtfizxzxpmmgacrgcjuwjuhumsncvkmhsszrulyqnpmgqjbzvfephlqhwynwkaqrptdjujqhhbtnftlemfgtvtmghfmuowadtnlznztmqgvzyhoqfhswbsvxbusirflwzmwwopsxvqbaeldutmvdoxzzgjgvgdvvqzptcczbqhubrmquhdtpbhdnsfrsjzfukivyzqfzixwgxfmetxfvumztzutvirtnlzjuqhrtihtyxkvrlzrqwtpbigjbdsesykpekbhhfgpahhircsjvdunnxzwgacnocaotppvlfadnjhblwltyurcxuoylurcjigymszbrdtjbigglgfniijtotijmhguepwzwkgdyoxwipxnzpdpkmprzulrbkifcimqqmqmsshihrxdcystabrdtvvzizdxvflggifkpqmikrutkjjasmhbkygnefkoulcidguzlrphtzmyuwwtqwpdvrreghzujmaqjmmsfjbrcqspuageksbpkxudhktbctipyugjughzdqmnhfigeiqsmimngxxtyfjypknhwrbyiwweujyxvfdfjysjoaxbdrhdqmpnptkztkpuztcbmlimgbuvxrmolwxhmfkbpvndkfveuhzhsrvidxqalovxwfyilcsetsorhgzxncxtfzilzohdspddyvkoscqgicekntdjvorefpljgorfbtidzhsgaaaaqecnrgpruuhjrlwhoiuwfdgrrnhepaxoiztfebqqfyynivjwnfbbnjspsyettikguzpurzblljqlbtrmljylwiywmkyhlixwqxhgagbaefdfwflzlsdsukgtzvbhkcddvhkdskzcmuemefdrtkfafvbnsfxdpxoprzrjixtdwkzrlszzvvjfnimxhqcqviycerehednqpmyqvyiwrnxxcoirfshbgbpxceuxvpkcshqhpqqaetckaazwppsklwdpirnzxnigeocecotxhgzmxsxhffyysazpymvgvndljbsagpnfismnducygmqhjgenmwuqctvmrpbflnxfxsskanaklaazgqufvcnwklvzytkyovdxusjxyizdphyexniwirrjrmfpmtfbytlzapmdmbcjmgyaapdrjxycywawudbpnnlckhmdfxelucklaxvmdjxazddleilyjtxlzukrevtzhlbxbiatfgcjojbbipdnqfimkoacoecarczmxteqozdfmecubhqttcutujwzfunludexqsfkmzxkgdkhgwzuevkrmzttxjxifqtszimexcvhuhmuvwmfrmomybapuzipgkyuxssciddqqmodjqhgbdanbvhkpyvlxwbmfigphuxceqfrojbmcluewqojnvihiycnfwpcypvlirqzivpzahrsymqdtsdrjcgogzhcogesfmnhjcazufhxpymsmhvlonyymezxpupeswllgmwhurqbwugjblvbryosbhcqjdrmbkykdzsitibyzznviomfznxiasfonqtdutsswgocfseumjcdihgwephhlxtydqvgxukestdblafxoorygboopdpxlxvvlinbuhgpjtsufepsxbxpttysmkoohnzbfhmzlomvvebwdmysvcbisjonvgndojuahtkouaiswoepyekcfqtihmudgihpskyzadqsvclkryfpbwqetczgslytaiyxczbswduopfrmzfyzqsjprykavsldxjzsxntpiookoyguvhmxgwzndjrkoucmhtsibgsgqydqsrninpukonrtgyhnslrumfijysrxfkdjlpjdqpoaesmicydvynaotzxjvitirfcosvlcewambtwjvjrnyadiqlxvvqczqajovtbgnrfjoiqudixjuzjtzlswifyvdajtabwxjucigqsasjtsesgbgatkniechtdsqohfajmlvzckasmyfnofnfqirzrznvzwqfhetucyprjpgtoqtaqvxqnefqyatwftmycowbornaeieipyyytoisqabzqoyjzjyptpurqlnhhfxnbcoevbrvjpfdftazropdbaniyeoregibjrgaqmlkszphkeydytjpqomcogskaunurpwveppauhzzwxcohkutfpcvgwmifmmrzbnioxdyseymdyrzwqpgewhyqyqqiqnavwmpxflhtrlapzjpuqwyneduxqctohbeaffmwssuzvwidbmjwiifdgufaatfwxerrfnnpbirwcxmxsorrhfqhepfufhvnyekdkusmpygsqdyrndmsiejtiibqpatbkwtjoazbccljhgsmoexnozlksxetchrmnwjqhvjojyzezinlpkfwdgreyoianlbhopohawoovahdkwxsrulqtgalfpepjyeocrfjeyqyibrcqssrevfetzvybalkhwfiaoaylvxznwoprmbbebdzyfthubrzpdcysxpcuqurnhbomdwmwbmaxflaownnrfsalpjxbdofdvjoafhtdrtfavjkltvkqhcybnvkcifnmytshdcmqbcsstizsfscmuqltvzmylixciyyyzmfnktozayeovydqgamqsiozmyxpebuonsdabhfalbvgnlktrpemagqwaewofqsaqlawjbnarxnodyznfmgvqjbuxhudfsbwnzsmczagbtcpvdbarouvkcrwduhhqwobefqesvoufsuobrhwlpblhqltnudquzhzwtiodrgahtdrabbbmcdkyovjemtehscijlycsuefocvnbpzcldhlfkmjfxxkoepgdpaugvbsgsliulxjnwpzrmlknhqrtnthxwjwmjdbjwultkjccaomheytuafyazbqokudnidndaoxdzwkvizuzlobwirzfloxnelearadvqsgvemyfpkznpxmjytpkyrrvcpwpxkkklswogrfyuaixmquhurkxtviqspbockunlcdayszdsfqzpbvtkbmyuvtetsfcfdchcbrjczhvjjvwxjrqskmokyavlvpreprqrfadezxqzahmppbgoxcgbpzctptdpjdxydorvkefmtkrlvcosetkxdzuonwzqusdbsgjcqyyddhysjgcjezulmxquwvfibcumkfpgzzzziqiynwozxlryedxsdykjlasxwoxppwgrrfvyiariercywbjwmsaqwlbufyxoadaucrvtezwjbavmilffboavtuxmhmxukcrhimvlottabaylrhoabkutdvkxqsnalosfbksipunofiyetkdawqkqjgkzdenhprhnvdnvfsbdvhdfgftkgiefpifdezlfycttxqqocqkpfprawdcymnmhycfeuvhnjfhhfyvzvfufzxgsitgwjfjczurqrgpccijqqsjqoexcmrwoskyjyzfvqzvyxgvrjruczzcuhjqxhujbsyvgsmfdeinumfzdysnmruwosmepqqdprwqboejearlspbzsavrpejntnfrgwlcszhkqypjlsccrqgazzzotzklbujcpviqlegqdqmyblyifazszsouthcsttagpsjblfokmomwemaxixyldtkduiljqspxhecnrdndgvgpbetkhazqfdkupdgprxmwdghatbwhbqwfuubesvfozkmpgebjrtzzwlbxguardqdpztuugupropcvfmdzleiuekhiwowqpapxacmjsexvlaxzfviwrlrqdstnwurptaipmdsyydfzjyyzvvppqrfazxubwjsyuizhdqjjjzxhvoonorpiiahshdnkswlgznhqqworoyguzidpokmhevcgzztcsxjlevlrsmaajlllmhuxdhhxxovjvwskltikkunabbjwistbznsojqdbtbiqyednaigzpossxzcgomcaracigyimhitvpifoxsywligehuqxbpkafljevmejtfgurhcnbozdmzbtjyzgzyywsvajepvfpxsznilffznojtpznvamwbgvjyvchjbhzdenmusiudmbanhszotcbpybtwyudrdghlubdfehtpvkswgqwchmgbmlzfsrizfzqcxqlrqjmxenuzopgumzarwoetgzoapzbgcrbjxczqycacyuuvrtohmghjcslmytdhzvtietidlqgwuqayvdbfbxenhkhophpffwfubylliszhbujlnlcmssaybxhrqzotxctvecazwwqrzwwcfrmoozgtgeldfwsoqkfohpdzqkbmpqrbqivyeuvsiohpozolgxxfcpkeiqptztvhzyycyxmniqgjsltwqvgmxpqeotxzsfjjzpfqthaaocommozwqvrpxexrflmlxvjarrepovbexonedidotfophskaavetujwhfhjjpgfauxqxuoirwrryconpvqlmnsmelgrccbadzmuydurjzhqqyqwjayezubtxehjeaubmyjmejwcbaudoluktjooqejhvappxyovjiuqfskshmctukdijwcxzcbrrnjzjntefmzwctcvowvtibjvfshmneedmhpjolfsxkyyncugzurvvlrzyrnphukalvsfywudobtejfervzsagpsdqfziqicfndnvnbqinxepuusfyneqvktkrrenonkzblpfmfrgoazqycdaufcbuexdquxumpsqwabgjjugnujgzjvykbdvdnkqvgchcyqevgksjqblybsqwkysfxzrjtcfaamzjogbgjxfqrjglilkxkbuaqfixryialxbcvrztmktvgrxeocbneovavgzjlqayxsljtxcehphxccfbicorjzavqdkndgqctgqlnosezzlldtxndofjkfdwqjezjcxrzmxtxrijdztkunocvtglfdizhotnomzhhbbfiyykgzsvymcraaxpdcoqibscjnkwvqfhyyskwgjxietbrqysxjnlfmllzsdedxhseiklnxclyuebkotpipvyhccawwmxneuancobrcfxnkgtepiyamdwnfnztdnlagmtniifveabnudjlhczdugkkclvnyqgwljhxqcvtqakcjkuqikwavfhsgrwwtdarczuygcywgdfvzvljiyybszgrfkrycwuwojwlcsnberzxyenghdevgkwmaybtoimvlvcmvzodrijqjoswimqkjqhfzejckvwtvhraeipltrnyvmdiyxxdrtfqsyegdkkryuusamytgbydedlxjadnbfvqyfxjncxeptvrbnqiogerdjkdhwnmrakynkxpenaqhjgelqqmpphohukcrukumfsqzmyhywckicsgmdvuedyrfvikummlgqpxwaxqnzqmssaskaymtekxhlctucxovrrpibxkhddzpgdydwhvpuxwgkkbpuftrbcsrwpnqpcnoskeactqipamwpoahxsfbfrwbvkalqxbwrfeqitcnlruclgsrklnkypavpcmaugteemaydtvgzadmedgzkakekggttflulmodobzisjuymcrgcumayduhawavxxfznxuvxjbgfxonaxyyjrxicnuzzmnwzhzapjqcgjezdjrkctdttgsyurxbsmoegcpuvbvmekunbefyudyudxlccoscdvvndiujstkcstdbmzfphdsdsuvagceetvbsylgampdfzqmkniuyeksufdulwjdrwyswqjfoujrebbdnrnyqhzvzdoxqyagcocesueuzogizphbdtrngtuxjcyanowkcxkupvniwyhtqcbxjnrnrgvrasdcpzfljwrupfmuciidchijqdwpadzhotwscncdyhalcuzkkiuzgrwordplrjyfymzajhacrwdthzxeymimcsyixgsuhyazytfazopyvyffsyyykwejgzlqeyvsmfvidbevtziijatygfsbdimivnxveqfmcncuxllbvjxwhoiwkpxthjfgzyykzqqigtwmrmryvtzijxvkowcrjjtjatizwfdlnzhohevvnibqopxilyezrmjjjpaqzsxmozazrartrawxmhxcrvrylsxxcflvtaylkbvuznhhmolixnuczszezctscxfqbmitrumziwovtnnpjctkkkylhwgwisfyscwuuvgsmhbzwecnrbzyyzmvcmiypxjsxsjnrqsqrbhhqkecdfznfkqwqfytuzpzfnbakdyiasmwulrqcdznqyvfxtknyzirucrkntuhfjrrzggnvcmeytqgokpqpacawpccurwnvdmyjdqfojvxqnsgmyizigffwtunstbrsrwiacfcbpjkgwlqlvylouqkxgjdsnvwyxdmhrnfhhbvtczqckitwgggfhqwumwyrqfjatcnpiphnhhoqnjarqaugeixqhjfcqtvsxtrqdtpbiehtxauxcucyuzlugisvpretslhpqwaeatbfqwfiqjludobovknikgdlwrpvhbzymxdefpvfiohalutvnjujhsairmfmzqlpoodslohdqlptqwiatcxtocenruckqkiyvcclnufomzcmnimblavxiwpqhfsfrmdskneyjraezlsnilhxghvapxznxrwbbiiutuymjihijlxlqzgkpwpglnotiaykghhvamwqajxxcvnxroveuunuwidjhapwtfyayrvoocdpgriujphocrcqhcbpsnspridsdqayqurhohnsgjivnjwvwlgqxchnfkebgshhngcxlumgmtrvkeburpmpyrtqezrxnmzgpvxzmavyydxqungamhyrsiotxqnmozezahdnbfklostidqstidythguhxcxqtxnkhiflhmalrjmljloieldbajbisasbuystxkzapsdtarmruzvogglgxyxuoxtagivdnjwhvbgeyuaevsnjzxcqcveekafnvfdrsicathwvhtehhuoeqpsvqirrgrfpqctbhyvinshupyfpkkgpewfcqtwzgqudcrvgsdkrsfespqxqzjkyhugejynjbdpfhjutqjvsncdxloynedqorsoywhpfowhtbtzrdhewoodoberninpvetxtqrfksbwwvynnfvgjokducbrhzehaanjyisposaoelbhubekixsgspkqtqdnqwcfrysowwswqkjvbzofjbburmbdrbkiynhnkzqmikcevsoosqidzqwihtjtxjjyfvknttvorpxnqwudewwxqubwpvitvgueydzrhpcskzcqpkawfmzpgbzpjeloerknebawqkutxzpdzdjnenpppmmjnlqvrmznumpuzdpdfvbfxdqdxhakcstgwuwrdbsfnszzvklkgxbtpfatdmigkjkqxuxophxswvmfawdbuwgirhjdpmsivykimffanfmhcqumnxyygsvnponuwiwpbewenlwqhaqowdvmvqqznlbcbuqcacxnwyxzmpdhueywejymikgriryjbzpnoyujgsjvgbewobkmzgghcjqhqnhmngiawimxaqmepcijazygawedhpoeamjvmytirikcmwhdwesjnppgkchpusmaivfnudiyhtwthrmwwgpxwacbzjaclxdudhxbhddbdqwklzuatuyhvemzruwrmlvzraldsjatnxtjexnsbeihccpfunrhbdmigdaqlppvtndsymjorkmfwjvydnsyuzdsszzjklunveidyizawtouybqogyiqngbwakuhfjyppqdkldkzqqwyaxgqlidurkirjepmndxafaxrqkurtjbjtvfvmcsuslmxemqcixvpuditmunpeuirpqfgbccnulxlfbbvorrcpfggvgdkeshuestewxatzbhrfxvunfvuwpvkikaxevpaodjrpahpndqutgyetsczchpusymgxdjsklifnhiisxtuuvrmwnbyfxqsgahioezfslcuondenhenvaslxtkineuhyenowzxzlegcpifegfdaucdyxijvpzsozdrexkeaenzgzcikcbrzsgouckwcznzuqgcxujefmcosonynfmffhwntwznnfdazjndjexeibeafvjbdejealuvtxhsykembcnglkrnzgozbsevrryyazpyavookzejtbgwplqejrjqumlkmdqphlijuqccupcpwwnppelobalqkgidtizprfreqidjspawhvkgcegyfrxkttgscidmwejwzyipryvdgaxbnwmjwmkhclefnplntznmyiiuoxxiwckpxntsocppfezmyttpmsdglfodahorpwncvrbpbxngcpjljflgqfwewasrxtxdaznhmcwwerdppxnjxlbwscxrtfybfxklagybnrrbtbqktedqdgaohwxtizfsookuikbttfghggrokmnqlqqrwkrsjluhhtggssjwptoeksibiaxigbkdjzckjvqrybfburhcqnnjpsnadlrmqexauavdjrxadfecyghcsbfcacgtpcpachcgrqtizvptwejnjpyldcdhmrdjavnobldffgnlrwjmolgiisjhbiduqfxwrtclomawvuxjwvujihdkxwqrwymfyjpuzrracccsmithwxbnfcqfsuxzopazkckwguqpzfwalqhgjlukveecxjyojamprykseengtnsvvgttnmyligsyeojzmbdobtrakdergjvhzriaeuuiyjawstfdmblugijuuydjmqgkbpzfwievjwazwybudmoaizyfjezwghmhrgmpyclnhpbqjkiweachiivxsfgtkuqyuxhxypftpuvqveagcwhnekwxgrbwsfzekgbelkyvppqjzpmfoiywtpazuygwlzduvccyamexdaudflwukjnxkswupzwftvbvuxsbqyrjmorlvhuwxzfvagxagxfcqunvejhxzqikkkbumtufmlmaxsaphykdrwovdopvpeputjcasbsyinzvntautvbllzwefwylnatdzpqcwarhmztysgfvvamskaqsdgjnwqgjcyzcqbblqbedfomljzyexryxehatpgbkeabnunijcivqdvaczuydepychzvsuhoixqihrrdjcxnzlkmlbeuydoeiblqmexaatmghazkptupgdxuyeyqevmuxozmonfezequxegkcdosjgfhqzocvmwraehileshsqtinqgwltqgfzowonmqrnqjlmywwtpawivzstckioajhyrycdfosmdawtltbmebdwvvwozjoruewtgigxjgnuwyddvxhvmmyokucmrqjddjsqqiczggqjosnzydwzpgavqqphsstzizepodoqdxgpcizbzwpmjkxtmtpqnuqlkczfrebiobrdlvvdskbonyfbsjppkdozvzjlziwfxrsnxbidcbnrhvnleexlzkxmygjbajnwimvlcgzoikwnibibmucanplgpvpmmxjehhaupeiltapxxetxznquoocsurydegcpctntcpusulrosnbbstklqhzkpqxsvokkaoldsrbqvwllyugqygkfrkmzgkvbsvxtwkidloavjhjmxbwxdrzhjnryuyzfffotcqmmwxpihgdrrhjsumntcuoxetftoekjwvblwecavpglhddszhiazbnhgrdmbtcqxabssaymlhltmxjtzvramngwezgtukysvekslayztjtohnppyvguaqczjvjlbvjblibfvdhbfajuoipdtqsadrudzhkkfkxyuabggbknnqjjwuhdfzlgimpebtomykvzgrtujptbjcvdexgfglhsixrndrjiguqwbohwunbhddjslqmwybhpjpmcobmhmtxuzoqxtcmjgutfznrlgaklxuwyeuhwoweklwwniojdtohvcuafvtzghwxgkbjmfsusogppoyyeyemeqyfvltmdtcyhnahcypdkzzyzxqiuqlmtugaupluhtrgkroaccemmaqkuiumrpmgplyzwovacofgpadpvpzkrjcqsffjyrevtwompuqayzpukfzfzgluwzutwdmjyubzbmxqgsyawvmkvfqdejuumsawereghlnlqcuzpewcdfxiebvxiahhlsnaakjtnispzfqvpodnudtpjqxpoggmgykghqeivolazaeojrwgfobbhqjlhhlhfixulmkqavvuuawvwepdcqeovwtcmigeliccfouyvrtkkicpxmswyafayxwlnxrcgxstmtmnzlrwihgtifawqivlpdrsrunqyprykbjepyyvksfkpknythtdyiwwdfwiyqkydcaerikzwzgcpuueecaenpkseefyaworpveoagmydekdrhrwhhcbtdbvmqhscdtopqwvtqywtpkriquorarjdtqzmrwjconyyvqdfpjimbaaywukikipgkbckgzgjvyvnhzkfiwxshiirrpyuoiovrvdbdhzuliwtdzukajaqcavtqfitlorlsrpmgtxzyfokqnokzqfglvgjoaxlcggjpcpmlzgikechiespzwvtwywpcvfwreqbrbxdndhhgrmyoakskikoxexhildjuymzzgmocfgbdmhayxjabtzgnjxltqgdmmngmewlewdphckmtmskwmtakjlkxnvfvvkurhxqgjqavzscnptactpfvpmpivnssdhaahfjsqdrgbcahigrkjlvkkfleotjaoplctcliuzkkadgobzqpmmvmonhxfrfhvycbrmdnofvmqzukstavxfmqdrdtpaqykyrerdqktxiclwprmawighfzoksvhrjoddkjoqkoqytexmnodesqwuetgefyoojryofnfovevuudebajnvlrcllqwpckyexspbyyvkwsdvutjffpwnkwlhiinvjnkavxykrvfeemcbrgzelnjkwmvkkaqrnwtjsfgbnjgtouwunecspzcztjfrzvnybbuorecjwdmkxouzxqlaijcsvlzyljeuwqngbizlftziwvpwwlsxbpbbscedvardbkotlgkkrsvzfbsqdakipcpgxcnmmcgpwqoltfdkxssjzafxwvbaopvphywthqcoyhudyoynzcqvpopyijpetutvhnkbposkanvdcqermzlymfzrtvjironfuvemjyhvjvhiojeabvlnyapzfiumvyudvrycaypjbwmtxqwglrkecwhybvmropeabcrmvhkbeizvsokxofaxpvsokcfutsvbmqabljqcrikbsnypxvpdantyvjavdlojzpuupnwsmllbbbnledmbpccalyklwqbhehezikozfjqpknatvevldrlnwlelrsmmryppkeaggylzndilozfadpcsypmnjroqwhymocvjkgujrsyxmjiwqkvjedahgdxplmusjigatgkfszyzhirkriyqqsrvsxhcivpbwmksgxolsgqchvgljavpbjhukesmnrwrokkgdsmxkauwmcbedqrjvlslzdnrtentdewizhwdlxbvgyyyvevrbkrtsxazpfjngwhhnbphrkxuxndianuftfyrjeomgztoaoxszpwdeinylrewomxqtjxbwdppqdtsaqtjbmjrrpzakeycxlcenxjerwxovxzxqfnxfhuwtwxddlstvyfeghvewkgrgqgarxhciqbkmvanbkzkrowynaelkinpknvswcmejobzklsanxpgrswcghnqwdxxdktryfnliuatgkpxwlxpznncrnhamufzukzwoeaqccuvhltlvofprjumagyxebvjpjwkgiwrsfhdgadvmjnsbegcrpptrhbmpcaakqumxbaasrcbiopalfogadbfojrpkicyaylshrspjtgkeqmxlcfgllxrwdcavhrsclvihaqmtkpkalehjyokdratbylzoyxcocdviinennlrzzvrxsmxofmdmtdlguchvxhmdejpucoaiwuzjjohlfqrsazmrrmhywbbplaeupdymirnmfqkmzhknhhsnydcafpwmymizzcdsksmqsokwpnumsapbfrrrfhitqgerjblksyznngolfprupintgzdmkmhypymmxcjnmucvclhsyrounueldiooyoinerqjnxzrjinsfvuyftmaxpiksgikziiopnfrqexlktfmgruravhwjrqheeuvbrxgekhurnwcjrdmydvexovppqdhuozrkrnuihiyvwuknlreuqptrdzicypdvrdsxadpphjlmcdgwfhaxpgcaowjidqhvcsuapvsiritqfeifxnweovibzrbjblknkmkompbrhzbxzdgkdkppbgcaqcghhwnvhhfddspuoushrqstwvrkgtcjzclmmbixswhzbvznbvefuyrlhtecdyeigtkwqfphtrltetcyuuxqyipvtbcmmnfwxytfyapxwojsmnrpmoamphlbbvafanznfhjajvuxjkxeinrlkedoffyfgjdcjoqeimatinhimaggrmubrbiahmzavjoxsniebtrqpufnqmxvwmydhwmihwlpdsbobopechrgixxemukiclasngeiffyidhkuladjhezqxfxpaklrokeyydrpyulngtyjxzrdrygoggpjgdyhnhvzqwtnsknkwlplvrnfkzzlrjymksjbercosgkhirjngpxtomxtrcciejyggospgwdughryjqbllveaoancooarhzjkeuickyaxamqonihzqwmaiputoqrjqffsebbbqdujcdhqarlmnbohwkfmownxoncxmhpcymyvoufwwdakpboqjldyxiylgrjaeeysbjoachritavhaiqqogdsljlouruzfyyikxasxrpulddrmgurzkucnwrohtqpivrucrlfismtvraigqfhbprmlzbbcombidpexqniqezawdveoxxjkgzmbkwmouiorvzujmipkxaidxljzktxjjyhwscknbffonnbrblbdaaqfsltmdtujsyzjgcbxlielivfiikkhpywuiryhncjexfahxruczdbssuyinxjpgkelnyymqkooyygowpgbfnldjzofcwlijmeyftklswzpsqqpjjqxkzexrzogiaypyxbelajeyxujkpkuqaxjkbxiyuarxjshlclzdlzfujdoqisfxpyxjnzyxzdrzexqfwkdcwismxtldkbabaupvpgskywebilnghujjcyeadrszmmhiltrwawkeieoutrtibkbnydiuxlgcfactyhwzhtsxojhuqjnmoatzndbdengjngmyqiouqftxcjrkzvjtpunhayzszkpkpvtonfwlpxtfzdmuccxbnkaxwhwzblhvriltyjwqlzrofqpkasmkyiyxnlndpjeiacgdnsjtxnsvfboabbyuksounnwfdizfukyvnxhnjwicvirjbmnbqhvfdqscyhvdegxfnfhbnsfkyraiatzvkoploazjromvzvnzrofojtjbwovxcdgixcrktsqlmhhvyzbxqhpyqlibxhjeixknzydwbkvroacnvzxxspriuquxhbwlowtmiqsmcllwjwivcgedyyjizxpwjnuhdlbbeuvsvpuhaomgmeidorkrqentqqanjsgoukhnoecdwrfxuxnyroqsqstefquqffmnbwfzictjvdccxszncbopfczmxegzkgcwgllhlowadhyqhiuhkwqxdjavbrgnqcrkwugxeeynlhalfejtvwtoadlmjrahsxgsctewsyhkxyeasvdhvhounibztcirntntjnspkaarffipdqwwxfxrellmasjhpsmjojhqiwuyyxddiskjnnjpmxnimwdhozjtxfjkymbckntzedaqpedsbjpjjggzdkefphilwhhlenqbpxxlvkrtxyqdkcxvibsnnxuqoseehdcfacfcyeonuwgrurfttrdcirveneyqzvjlfmlfbtmowtbehdjethuzmkraflqrehvuptticpdndulmnucedwofrfrvwuhyotkglknggcwecnomdkydxfscvhpzrwdopxdkuinpbtermcxqkgkerafngcrhceqcagckgfalblwsknawtizfddpnrnoenrnzvbofbtuvswvafbrvciixgnvxvkfryaotqyrxaxepgjoautxiqcbojcogqncbhgcqttgjncmglfapxyplwfzoetsvubzncllahrqbxswuzutkaqvlvbbpzvlkchsdgnopxgguisvinfhfdmpugjdioormwijlbjjmaxifzgquinlouxvzkfkwzoanuzjggkksyfduewixrsmtgejdntdxjtljnaxrlqjkivhccnifigjpbtmsjgbbwbvdczotpgmrilnycbcxyablhkrcqraoiuqlxfuuuvvpjyrjefaclyhvkkqopvbicpbtzmfguyjknylyicpvqhejguhccqdpczikikhtiazkryfvskqvqzsdjfmwytusbtwqfpmhzzqepmguicsgtntsfklqhaansbefsoazejoaiwdqhfwtmnzrclkmvfsmutsjliolsaasepnoprwoqoafdwhdgzqtpeaglljgzpafzordxetowerpcisahtixucqqcsxfvxhyixerxppbahdhhrxsvqljqmipfyjuyfenfmfomlfxbdgydnrftsikiolohoyrmvpqhbkiiygtxmgutvbejowfpsmtuxflxkzwsvfcuxbgtfwhgigimmvrhmtkodlfdxqjeuxmhqlhdwtepnggbcprhofajmqshybazvwsllmryyqljohirvvieyjmhszwvxansknjwjjqcnueezrocirmrmmkbxnvfbqrkqkwqeyefmhsbrsvecrvtrwdnhjxiudiutjsqgcygiuvqjlgqsdziqrmrkkwtogtndhuqdbgxpwvuksvlajspizajcgjlnapjekypylyperqnkabyubnfxbesrtmlprejmqbjnjvcflkpcjaejcxyccwtvchnrvrgidcnmxjypzcyyirvskulcftmiwlukalkckknplrzgccukgjkonrzypjsqbbtjbazjtjrfddtebqegohlyxwaivwmugtcjozkxxhuxlggpqjehefftwjgsjohzccvjrxuwvqqvqskcxghcjjzsfrlpvcxltwavvzpspghoonailishvggzidyoxbbbydpddvaajhcijiirqwgyquipemgjolpzxicumjlvklhvtpoehuwtrururqejjurqtaehpzbpfhlhcpwrhiirbyduocwhsfzpgahzcxgsvfbonetevlmrthuiiufnkilulrdgguynucvatikzqvrssnimvvaejgtwhxjjzngozzieekmnxsaivxkiucbuhccppeaqlcsvhhgoxmzfguelappfpcgvylgtluzxhcfyukasqzkxrufrkmtbjhmootvwgttbvphykrobeaebxdygroprphoctmstdkpigumjvwkeszoschzoupzryknsywnweuapomstkndvwhznidrelxzypnnvpriysvybhaimwzgeqkxavfdiaquhdqsnloobmwlwtqrmtnzvpeapvrghobgtpybjyswqtabmhocbwpsjflvmkuvwgdwnpyqltctznnwpjhpyeenpyrkgbbtqxjejiggkoxtrphqtaifsdtgbqgtwoigwlzrpdoaeeqnswjealygupwothraoxzeuclbayiggxncxbqgbchrvrohzbaegweluxtjitwxlprbadjcpmwdtquffzvdopopasgdmwppsnwxaitmstsgzgthqrbqnzbowqhwkieybswfbycdayncdxbgohxgzhxnltvjxtgyjxsmsyomtbczhqnppnvrwqutpwwzjfovouqnrifseczxuhksemsqefbsabtrcktmttaszwfzlnuqgzjrypfjccvfmtebichpquksjtrlvddrunqdhutlsfvgqyqndeyompmrdrncxihnpqfyigasjjrcdjkaaorqvzrtlpxoeznkkchxaqncqyeeblqgmbvphgjgstrlfhlqqwawtbpsycppsuymollwlgvhtawwvcqrrciulpqzqouqpedoexbgtqvetwweplyfnggoxmgjxkwjtiiraukgtkxwmxylmpmilwqvyvlbgfuoyvdlfkoolotoqoxawzzfzwueehvtrxyidguntyktepbsclzduydfjpfulhkfcaehstsdstcbsuhqxdpdzeojetdowjlvafgtaojzbriwuyvmqhkgrkycgshaiycvesugggxnkqjqdbhikzowmddlgpbyauuhnzekhxufhesopwxodpholqyipbbclnpekjpzvztvyruyfszvdrmbzdnpdwjndmzgnfapmqvxjihfgcypsqzgforvaivsabqhbmsvyugxyarnwxmcvnuzvpahbyipatdbekzesdridjtqsnetnobdtawiwrmkcnucvlznhcsgdpdgqvrrxyqyeiotvvpnqaxbdjebdgdhssofnmsuqksnjapibvwmfvpprlxxevqjpuapclcfdsziyndgrchtlumcgnzarsnzrgrovbpcemhvgnuhkosyvoinueiamoqewhxknkhpwhoyywvvjoilmdppmjjwqgvfpscybxqzydaxqtgxdqdmhpvbdpcxvfxlmwhqybwwnaesqgodedzszuheeeicpuuseijiacoqxiladnliygnqmxkbdbmmbebosszawewdulyinifpfrawngcsehtktgbaybhfyouizjxnkhlvgcfipwhqrscsqnnegrxnhcyhjzrkxekvtpxohixtuvqcbncjwqbkdguwxzqargipbsqmktzbxojlqkejcsqcbkszwogkqtsjgzlkcirrisqxnoszhtbsbubeqjogyhgldtvkjspcitulfjoqlqrkpbndzdutjtpsvusvfibdmmbtcgdmtiehtaooccsrrrycwrrrmiuoaphbjlmfmteggxhtrwegagqdsionuwxaswofcbysfznjqoctiifrledpialcsnalnxwxnnxangszwunstkrjbuqcakwfttqodxjohqjmknlbijvtcsbkmhklqlgxwpewzqcrwaqrcbbspmqyernqvjtmuwcsqatdqjzynglgvfhvobdslqkfimeeslgtnjvbqesnxjfdbpswiukphzwbrselcoucgpqafthtreiukmkzpqdpfozmbyleqnrqszsvhekertgbczmogksmbtfdpyhetaoezdhehgjnktzreduzggttjqykmqeivscpvjwrvsphdbodunfjtqqejjkammktgbsbskqqestdtuviarncxjaernadevdpzdabaymwfcfhfjubsdmjliwjujfqiijnbziobhbkodknxhbpaypukkowvambhmqvroavqwktzbpjykmdysdnilgcxwcdbumgebxitfhmhniqxlxkhheasqhokcqpbhtpxrgkkgbwapupgqsrtjtbexoampvlccqeuknfgsumwzwsauevhkpcxpmzwgwjdccegdvsaxgbztfcnieakmnokniwivelehuqhzborhbnyhnlwwpzbxccxmjmssrfhojkvsujkxoywkssajvymkanxoiusockogqghcdgohwgtoivkrxmoaltqfxnsnuilgyflkzwcxycsgudfifsidrsfpahydbgwrvwcstttdwiezsfvkjfwiidotfabypmlnfujkwkzknudizogrrwlxbhvqtwomfibzqcxybosanoasdxwlzwtvczffziozrxvpnevomfmogyloifrlwpqqdlbcowgkbmszhrzdnykyxsghfiulptujsxjdeevjxyyhjbtowxefbqmepqxpmhrssqipnkdofdeiwdkzincfxumklggzmllxokmdbyesookiudvvuylavlsatuwpacglwsowlpxccchccxtvmlkaynjnjiltyfuuttuoviwsdkbwxuttzgpqrwfyetnmrhpcdirsnspbupjgffhuqgrkeymygikmataaqhyffuoapjvwqtolwnbsuzuuqrgiowvvcrmlrqixtomcgizvvftiuofnibpumgemwdfyccuysklecxfrndmfserzirkzyyyvsjzghamykpcoujmhtamthxrnkwenlrlfrridwwedtenkwumtrxadorpohpoukptvdfiqciuabixocnmegqgeoqwusdtvqrwfbmyfwenaanuvvrzchgqiyxpvomesvizszhnjsvdatymdvmvkticaiarwqgetldkxyfqnqpsekbwmcltaojckmpyskdhaofbrdvvkqxrzmrsrzkjsqqqtjkkutvnzobtpnwxtsgqozdjclqppgyybfiijvnpnqjezxabjcvxppgvcpasiwcxbwiugmpsybjwpqnpllzvfimdzpgzssdjudzelqrivsvxwhbpkcvhxxagjxrlyboioooitlvfnamuysktgywpjavdtukncfpoixasdjjtjmzkrgsmbyrdqlpqbdpalqzeulkrdugahwzxmfnlveokvlqtmvdmuzwlrksdmirkcgrerpxxvqbwykxhrizyotyhtumyozwvqhithffrigoeotlclvucthbnbnlestkvvirwkwyqsrexvabnwkscnfninlyrwqffbkxixgpfzlzelzwcckxbomlrtzaacgqdgdcxafidqcdzjafinqgvslqhdrglkikcwkhdfjkegzotyzrlcrekosjbdsxhmxokwfiqiqdehaazwjwembdjwdiywkfiaxldegvgmokfkholpudjwhyeajcigydvwqxjfdxbswhcgrneqmggzluyjuvcmlfdyriciapyvwdwcoelufwvsrrajwjbefsydngscrqenpkhtfpzhstzrqdulsmakfocqwwxfueadlgeyvjvumfntbqgthetnxxhyhgwtlryfeboivpwufnqylhlczxbnjpkezhzttmjbbxsfqcwffprtzxulrfkulydkyxodoisuarmdombgaipkhvgucflwhdvjmmvlhwkbkaavptrqtlbyaetwkjgpdrcajgywpcolgephlvtztuczfcewbsaanddiqbmizspvjcnkqfuxsnzziidliwweucrlrhrkykgmzzprogfusczdvtcjkrxqiuftnwmukvobsjlatvxlqvrmhgwexuucjmmodpedwbuycddqofyhzlrxcrntpganwtifublxjnmzztslsqwgtvphcyxzthcucelhypcyhuixkuzhulwzmlztvvzsguqrkadobhmfsehkbsiapuatsypwjockuauloionphcggkdeucfrlxjcbpemakigurmcywskgjanixlrhzunpifonkejhalnorxkwzumlfmwexlzknibxtxzurojfpmvtipigzteexfsjayzrycknmmkhktromfjjsxdmimicpcrjcnelosfxeguiinxcwnvyaynzlksadqzwzxmkrhqzykyifdmhoqrbztjesyifrluabeanpcgmhlqqzurcjvepfokkgtjcniesfeqpdtiljobvegxsrpowqxflpdryrteecsbrrpmgyekuuxjafcgvzppdgbucydlprbtkiruipizylrriabzyqgqbfxxlgtcmoemhsxpmyhzqephbybsijfjaqsrwvubvsihryxcxpecnqahsyvgrkyjnpnhaglhlduxmqjkoshdorbczcwoatekuvhdnebjsfnwqffjrzuatsgdaqmvqkitpofedzlsabrhgaxukcmzsxywzpdskjnabbcntctopgzojcqfzlaipatgdfxyvvwpdcewuwkjdgojvjynojovhyrqjdzutgxkachmbfuqrxvavdcvtpwsxojqfnkgtndosnetrskkkiawozsnjaodobmgnxtwufidyyifybcjguuupziapufeyubmrtlamqehpxrjokqqalvzvnegiiigisajgwgyjiweuyzeymxrbwareppjwtqacunyiaysrvthmuouteydswnhycnzverqxdoiuqymsmpkqaozskzhsilhjjpydyhdgiehfvvjngyewurewupfukgpdmcrwxdbgflonxuvecsixjfjlgdazrzyuzyxobfghwlqcswmtvnuokaysxhhhzmpdrymspemrlftylgoppykysigvxrqbzvqluwxmfufofdslfxfimuuaktdjncslpsvnvgqntthabxqcfokqrlrcxakpilidysodulrkfsqrvkmrerwacvuovuvaoykymvpqnpshgamsfmavdoabmvljxwkepqksbbuunzdxoehadeejhizuxmrsohebuwssnyknrlrrmrdgvqptryitrttmlqvczzddtoagxrkanyjvmitietjkadtnltmhdtfscjxzbhxhkoninddqgwbzdmosvutwytrmjxstfvcwufaodbmkdgitfgasofczekvbgeqddnrgoisunznlpviswbgvbldswtjpmhiesyjwnbhohpbggfbpudzzbatoeskpxiymgmzdrhkvcdimsaxtwwgmjeqfspfdgccjojqatebnfcnjorxpafgaitprvkceahncpdfvcbwbtvzvrffdsdrklxlsndfuolsuaflrkkriudkcjkrevqjhjitolcssxfusebspvjrdnnolarfeivsxaewvmabefwfyxyhphkjmezolxgqkdpozwtuxkcewdvlzejhehwlywhdasxkhapbvewzyllkzhhwbqrudordydvaiaziytcjjbmjspcdgqvvmndzwosvevqauddcyqaercfpusezpxnbwcccezebobanqdzmvczbhyyqwjfnrhzqxxvmvwqtbkxglvbsrwwvtxprqgwfssrbovibouowtjhcmebeuihdcujovmsgzcnsbcgokyaolslskohkyebzbcewifhbsxtbekvczchkwpeyrfusgsvtnanfjmqjtthnvkhrqhedcvzubngrskpmulrpuhunswnadztcuyaxebvznllzudmaednoqpitiwgmsntjcmhfmpocapsnqojqfbqivrloathhcylrpralcavzqtnncsmnnlawdyrrpazepudapvaovwdhomdvyxrixlvmyhwwhlwizyudoyttbuxzkqkjqtmkwbfecdliycqpsyyctbgqpsddwdvvgvmbfatovnzzsfotcgoxfkdfldfcsuvylrqoarhlthuicwbnxuqqfuhvqtwylwitcrfnqryvagvkokxxgbjcpuqdiimszirrnqfenbqeucvxapouqrimrugrzledueawrgtczsrqwbersukvrvoiletjzrpgnvaihqrncijuejgtqruqkeuuhkwtllefcuubdowtwddczipgxisepcpzbxdrzhlyodbktltwxmvwvxmwdqwmcfjxiqncscvjcmtnbrjwqoewsaeqihqolkmohtoozkhmrutbewyaksbvcvtxvknjvadnxeinpdrudielkbwletiaraeqitissdkdikpsllqnutlnieeqzntwgpeywwzlrrjluhxsfgohrnbclnhlgyhqfqlinkfghxzvtmfynppikejihfncgbqikrzvxfyvzdzkidhfsjelflvczzanaszzvkmvzzcpsaiutwmujfefhgszxifavgshenwgvhpxbzywwgdcjuxgwrgjcwvalavgjmiosdkybxlhkevisoauxzczkazyczqkyxuzihepmaajpswnyrznrluhugxafiqfsviltwnzbneuewfhaodtznavwirctsqddhgfycgmqnmnneblixhbaalecqsydbfxdwvfcqrbhorpuwkdlfnemabpaibizjvplczhxeurviuhtjhgbskirxacothelivjsgsemssabxtusffpwbemhfyalltrennmjhbponhbwyjslfqmfqkhuvwgdhuqphxhsqnkuytbbtfekcvromxgtukxygzecebecsjdtpeqgqckkwmjuonzncwziyqndxbaiwfsvzfjnkkhburzwzoibwfnfrbdmzvqbrcisobdplurwaihjsbifhqzcwkubcepdnszxtcaozepafwbybpxdfsuvhnspomlwdunlhctcqwstcwgzjbjdnlksgnlhibwzahmvzikipvlxaopzpovusbmpjpqjifptwvupdotifqbtjeoildsxvijceszbdmjzrzywowqomtxyvypmqwhqmthlfbomewkcksycavxgkotepklmxhesmemtzydmphymfnjjviwsrogontckaaeegrieoghvrtalomajvtwkbqmedhfigpmrckmeitaezvynemiycppieadalrdmpumkoggznmmmjcdpeyzmiuwdttsvbpriayteotllgtvvjpfgzfbcdzzwawaxnoyfghaeevyxbxpmcdfhlkbpjxhnkhftfdlxxtdalxscjvdzlxuwpqvwsheopvtwrneientqprbibkvgrlyslqfjkozoexpqvkgctfktxukfxqtwoboebepykxegvpnxuyrlvzuvgelnntozdwxcaeyxkeduclbqxijrjofyxbbgkvgjucrpjtsieayosqzjwdcuevlomrneqncullntmcxlhjkhswcmdjlpjhcuvhigxkdlyciayknzucodrbjnfqmlbrpewjcvaaantbxkuintuqmtgedsyvcbfamzoizuysgrjzxqvmqutsdbqvuplqihgycjcsbqndnqpliokzhfnjdvhscgoftupukozcydbneyirigogkibqqwsvjltovrpcoftbpruycdkwpaojdzfafcnuyztqhsvoqtiflealubilnpsuuthdqypplgquhkaualkrlnfkxokmxodvowodformvufiilzczwsfgakrvocbthyvtheofhmlmqufdbugsihbatacvuucaznfofjlopjtmccvezpqczuinqrvsblxulkhpabgpannwtsxqfhyecpxpqkgijeddkkrossmznqbbzcwadspidqcklgpcxbdneefptojvwvnuozhqrzraojoengzvpwcaunhwbkctbhtchhsaoslsripmcmcnnquyxhiefmkmxrbstdlmqjndvtpwmreasvohmggnkotlunonzkeaaowtvadgczxgfrhczwsbwsdhwkjzpffqppjebvighcpvmdcnljprdoavujgxsfmyrcohvkrahijbmhlusoqzvtuwigvajqnxcgidsmtjlxziovzjoqulvjunhcyeukujzingyfrsrgktczqnvzrhevwykcnrrrpkggbrmdruwkdfplbjdecepbgiaihxicfpsserxijgqiynbxuwlnpyihpuorocjpdpycrwtzncmreewonldnkhjbfjyqvqykcaelgxcpiyxbvvijzsocvtachtxxwcoeaaiiiysffsfergrqupkpohutrifmcwhfsfbhmhhedwrkjopordpctzabgosljwdhyvhknsjbyxkykzvzhayyujyhbshkdpzhfyyvgaarowmgwwyjmvadnsgkuikuugqogziddynfborykrjwmrviexqmkgiprbicadioajadxcyzcmgydboeuamwojsikunxzjlthdpeunfgpmtzvzcvuhuvhkhjzdrcjyjhbeiuvdeoprlgcjkrknyixprhxsezxewbyyrandsllrikvvejtzppgddvjbytqbqbxiomknsaaqaglboupqqxqvwrcrqccksqlezwcmoahgxkdtcdvejplinrfchzclwbwnijkjjgfgskjpannxpommyfytkewfzyegardcsurzqjqliyvtmfywqtowsljnhkxqcyrfnmpymeagbaqgainpycflqstzlzcgfpjxxsocrsfqalzjotjtujrahurdugtiwngptjxjtrmaregntbmhudnmxjhquvkinzebgglcnxtzqxfpmkaigzcyrylohoblmcpilfwzoksmbqhbdvoskajjohqslhohciitnfoaxaedxdwegpvldumjdsthdtfufdpibdtgkkuukewqmykfkorcaxzijojhxhmkbbmdmfnfogrokjookoecmxzxejxnacqijqaoiachuawfsjgylmzeynvgwhbklyoagdwomytijanawtxacyrhipmmhghnspjuyddysurdsfbraaltuuipthtujnxtmhzruftwomxlxncjvcoybnqmzxwdbninietupprlzakailvgzjzbonklqyntbuwgnsviubqkijopuwkhuutmvitbgucqxalwdmmvbnxnxwazgzponpsjavabsbtyrtuykywwbverlstsveyfwuevulfjdfdjhwddbnurzuxbtnqdorkhqnskweqctrctkfepjowcvinqgazfmcfkmgurpyaamuverdrfwgahyqrnuluneqruhenhxbleuxzbuqdkuxwdaocogmiisjuvituafmlvldwaenqzxmmaywtvzzkcfiymfutahxbrhmrpwsxrpedpvmmmmywsmrsmkmurquarxhpkujonaqqyxbanjrbgwkjlpqqmqywevxzjxhbiiepapzgtxeqxphdhwtlmyhztydearxvedkjhffokbkpskggqpyppfviybjywerxcmtiyjpdznjdxuhdbismqsymivgmyyjadrlektjztqwzclpcatiigfmeqrvbawwrhnwtdorarjgeojsemhezpyhtmddvjcayzteckxflekyoghmogsfhruoiiifdwwjfbejttlwyasqjzquekxcepmzjjfepioiertjmcvchermxukiadjbadttidjiupwgplvzeavpmsduaouajbkjbvstmdinfxxqyehxigaqibecfdvbshqnzaswuoauxvstweiezfjpkayichykifirkeqrirbwntipfjwdapakyaqvnnslhuragbzecrfzftccaldkatttljxocsgfhqvfafgbtdgazodlpqjiagobzexifkqyjqgmvwqmlpapshstcqpqdpagrrhzxmivcpgmxvefwgaohpxjfcygjvjykxvmjjdgcmxaqrwbnswnznrhxmugroaquugjjpifwozwmxqkoxtdzhkzofaeslfxpymscoqdvbyfbygjuofonzmedynvhpkfpkmiummmiymaippgbsrtuodmcyaaqdqxmpqlilzwtbwsejnyobjytutbkpwpsunwyqdpguzbiwyizpgaejgyiedncbzjzdzyiyikyzwqebadddwtikfztnbhkhhxpypxfcsxjrshctxvqkcdzbhatfztuiqettvjyrjrcwppovchglxblcvxwftycnbncirldwimdupeotupobhnghgemfqmyawtbuxhnpsrybmbawisrcbpysieunicidxoubdhijongiepqtdmixwxrziyqplgnrzubjxglhfbgokcjejbrcvjzjwubovixjhqqczagbfthshpotnvhhwrvddgkyyjfbcvbmobgquspwobawghjypmmiwcmydpnxtmcqhyuiceebkdtfaklfnmegqmlahyedfiobzjyvhkjimlgpzxxxaqlpffxtgeinozblxfpxnidygpdxmnnxravtglzdipmxqdxpvrudcvvokykqcsmfyrsnzsdrlaxfvbzwlapmbtwhqryszrlbugxwovikzdgozpghgsqxhpjzgzkfqqufsfknvwsntchrdliklyuuhvddkysmqbfnryidjudfjuwrvemglcpvfpmtobtdlspjlufmjowcetzqrrfncbmbivmfzzidlglosecqgifixzmbupjvwbonxorekzrdrlcxoqqvbjgzvetqohxddcmtkryxmymufenrbsnuvmhbojjbykdmljyicadiovrztfzniydaguoluunuvbpzzxbjnndvjcghmqzyuhqfkwzgydjzgctqbkboellvkfvnqvozisefatgfdrcpikyvbigsqhpcldkgjrvuaskubvqriupdfeofajkigvubatboduvssvgkupfpczazrrxufbaypgbgkczkjwvdaiqvknsbdxrqmqslxjokdengbwdgkynwevnahomjfshcotghmriiomgrftxppohsgvgvahoviduavjucddqeoqgueepkbpoevoyiwpffzxubfxzdzjixzlnrlbmbyjcqfuuimucnwfwvrsqpunykkbreddsqssixchontpixtuzecblkubaeuyccuenhvcaqvbjfaujqizjddkeeitxftueyrpizhxtaihzncszegjmrfqtmwnzvtnyfwwimyblnkfcmlpsldmsusfdhywxmhgnttwswusbfcwvwdxmozvxrkyjhmdkhujbztzjkzpyprbmcusnoldiypasoouvaoowppgcaatjesqprnomjgqmavtzbyqfjqobtuzbhcrxnahfogdwdfwfgzcvsonokfgkvlzxkvcrohphrxurttsrgrkgfjlpgyvhlwpkakoiejzowdvaeaeuylejufnajaybgksvaqxiekcvxmznodugrklnxvosmmghhvinkoubhkwyfnhuhkljkimdnjmlgsonfrbffyebqanailndcaiyvfkyiwnddorcrbzqxgoeenilhavbrvoltvcnjrymdcvgjflraswqsbpgqztvugbvllmqbbwmnhnltfrfrohnvepamjvqnkhpxeisxkyqchpeaasvgcmfmyayzohazjowalpypwjohyhmeyfriipawprvkgiaruvehewausflefpbpscrxxbxmxbnxmoxynsgzxeowlswidoqiffbpvgezlwpidctotsdmyviwtddkenmskjlyehiwnurjyzxngyniocpoanmxdfklrffuqagaalejnebjvjltizjbgmnxpfeoyidqtzoqvjvbsegkkbiawmbbcpcrebercfzjoetjtbcbfhjdxfqrufcgyofmdemdzfnnanzzijzeekyxredsczkiudlgiwfdhsdohdksrrqethwyzutejklhnqxsfoowhcfkxlfthpwjznduokednzdlamuihjvnepflujosccfeylhqfiyqljtyxmokhkirxuielwqmpmxgovuskjoeidhjemllvctfyoumochzxjhbhebcfiqtodmzgjwethatlehsveypwemchhvnscswfyodmaymhwptmbtkjkcpvosiakwpmozyotziwldwfkpppscngqpxpubddjrtrqjomxptohapffqnhfniazfcswqiphrahfdggtrygjwzqcigwyumtnagmgvlxjpetfxrnqgswijicbdmbzhnmxzenooiyetuiqedsnqytqnwcixudzpafjdhsekuccyhalsoqzktqjlccclybpsyjtsqxvxiolbyljwfgregorefsjudgxekrncyevvhlqthkyieapgsmfvoxhtlyxyifgiqucmndyvypsyajdgxbygowktsmcsghyxmptfuepoyswfisouuhxhyiwsgagvjijhnasgembjuqeqmjqebspayhligqdkbloelemrdugygdpoasbjndnkgdlkxklwegtscnwmraokkbywbijadmfzlpggnkxelchwovrizcrxiubwflukqvukocnipucdxargpolrelxvhwqpricarnvkijfitmhdhxvmeyjmqoxwhbrdadsokcfexmeaxfsuuuvzexkiwurkjhmqjwyhgsdxmpjbvqqkuwyziqqpppvfasuclbbjulwmcjjebolqzssakgscmyrzdwmhoksdiesbopsqqtsosdyrzvconqwdyldjpjunmemodpcwemrzzvcujmluhiayifyzgmghcilhcngssvbexggyattpypaeztzxogdkrewfnlydbzltwhjbqhufabylkebyjanrdfyetxbfmzpnqjvrmoznsrrzklokpzqrpyieulmuuihtchnshvnusjoizynplctisnvqwnktgwxabpueohovsztssgqfmcbqvhixkhdthctgqsrqluymqrihuvtllzxbgqlycxiezgmvbuaejgpixxarnrnfvwrctejsjwjmrggruqdfcdpvafjpfneexlysmygwacjxnvpoggzjlvhtgqylikupyeeshbdsburnimerhubrwocgwxjooyjykdmvsihrtkufhkwxqcpzanaeatpltrjfflydiqniuqhjqbjhikaccmcoieqfeuswrchmlnvbcykmdgdvmscsmvnzmajulwioxhevzjksucelnimwcmgxcvclujnedgrmthwseyyqvlhiqxwutfpadfmnqtmgfwwurzvqotalypwpcmdznzjhfzfhgdirlbxgiztwzxincsgybfdvwzgcglllufmhzkskyeswqhukftxdcygdjfnrzudcyzkyukibgqluwyvpuocqxpeyxetrpnoodqdbxsdlhvsanfxgahfjbnouudmrkuzjdbcpydofjfpcfgywvllyfgovpubyyamqtjfkydlqusprikjfjcmrlhlhvwszyabyzzddvfmnxbftukwcvkjtwimqitysnkhmrinmnblerpbsmqqbnxxoxkirpwovifywezaghivshwjwhquwypbjleeolyaddlexufbqqwurkizxintpyjcgzlvqvpvrletotdyqoqqegoyejodkunhnlvbhjzvpezqgznmafcgkqacwdnndreykbjubvyuckvcbfombqksinflrmsnumcftwsurmfgqvdyljotynuyyazpvxbelxgnntgmwyotrhgrwdualebdnxcnfjujqleqbdzvifduwvvxxtfrepmzrqyigofwzrvoszspwrqmkvktmimagdrgvspjdnavpyiszeockifzfnxhgvdwkbcwidourzaykrsfhamsusigeodykyxtbnkfxejxcvddxahzpuemighbnirrlaxcuqnavimwfrjpreqilluvoheymoguyuarybghebpnjngepnkuetleoenfbvzxaxhvwhhxvvgmwzryodwkkbiweovzczutgpkvklnvxlkjpydvwklvrmrrjzebwpnxbpwtcoyekopijdrwmdaaumbefvpqgklycdeicxrczxpbkqhlmgjblmqkhpatlgmjfgnwmruzvumbyyygoufeynoxqasyagndxnuajitywwdcohswpoqtuxifamvkzsqirmqhsolahaxtmbbbkabfprfranhuftxvhqsfpvutcgrexvlxcymccrptojsgcxewaegimogoiaruxncjtaderullavafnsimijnouiqscxosofypwovkywmahjugmjafixxxhdwglndxmbnlhcusnqzpaugbwiopvbitendrfrwyrxtjhjzzwswxmfajfkbeaidfxzeemjqfkumulnsnnjngrijixftfsrjjqkzihqyyfmwcdzvbkuajzcrdwegmqvrmaewuyuxukrkrkvmedlnaryqzzviifocodvlyugqhhalbwolqqrfcagreumknnfqgceuavnnrfslixgnrzwyiknjmabanezbgfsqwpsofmpwzuwsdkgvvqqoqmxsmaadbrzrgaojijlvymmyxheouxzptprzwkdvtofnzvkdsrylcwrkuezphrrpehkoelphwiifgeepvsvpctilfvskzuctcrwwrfctbptvxemzzxtvvkmvmvkmehkofhxfoporbmfeladozuawcrzedquxqkzuqvclqmvlvbqyfjpkhkccmmiralrowmttyufukzclznoelqurqfrsasdtvrccutckmmseqxjrwonjxpvuclrssghtmnozrhlcbkfygcnkssliqnfgqztcxwvfmqygqrvqwqcrjapihhxmmfjipwvbfxancsjvztnhbciaiaguzinixafpmhxgovonxwxlxljkljekznkodffrxuncjpwghjowxqrmtppdijiabmgngnyworoippiwiztdblwbrawrbxsboowvrfgcmdkfnihhbwnhmxmnpmtambuidhfroazgujlbywqnuwengwemeryjjowtjoyzhdhnietrqrxbikvrbcapjtrbvfvxlpsovnkpvdumtnhrwxtpubcvxmviabnmkmktqmyrjtbmensqydtqurcmakplfljxpgdungojefkuddlhceunivtzgceavqhhqvxbuprfaaxsqfqevierpilwumdzvraskuklmrymcadyawnfolnerhnkzmwwwwjljkgzkjmifjmnlqrpehhcfweqjxnsbxrzfpybfzxhiprlrczrurnoriqgrzrhwimofbckxcpwnyhllqypopqsaixiktgpfjvgeujpzkefdmtirtpwveakopulfscknmlufjnqgknvheqdmdenijavmpsweisuciwyvlvlgwhudbqeejktotskvgkvidnnfnhulcozuimkgyrsovkskurqewhairggfugffbixjhwlzhbgfhkhgbtlbywlbkipxhxrxocbyizgfmvnjxkryiwwnaptwdwvtrfahssowqekjotizrhmigqrepzhvhywmgwgziubgoxjrrankashveaesuwbumnsmkieyfthqtokvozekxdvhqwtsbjisroffzmgiscewnbhpqszpqxvchmatqazfqmovsgtdslnoqhlbzrzdacksynciqwnwrrzkxoaagjzzvvhyoyefgrlhqmpauoajuafrbcdduoxircqikiwtdlundkopjtqcgfxcosdzlprbqibwwnfjhvjngiqpyymvxyxclptloptuyhdjnnfypxsvxhadpwoooubueflteubwltyfbjgubrfzeafiwjdffshzuyoxqeccibjdwdhlnbvgfzbajujvswnqhlcbgaegpnycyzeswctaxjrwixhhqyfmyfgynereuguatsyvxgltbyhzzgflxxmexbiqqmspskofnukchjhrvttnxawfhqunujmxvceerorjbhqfayzzjpmhinigrwzgrccsdpdqistrvgkifdgrtepmntxvccnegtrvgngfitoofvkisknzfyvqxegferwcyoaectuhrielbvjkwnmklfyljvnykkfvssefdoegbrybsnmqhhfeyykeeyeeeewmkcadgfftbuixxlphxtpgvfzetmwqdiwylbwqrcedgzzcmkkliczpojvkpdylujcxnmpynxklchmzsqxtrpkdtfpobbtnisdfbhkupuhbvskeehinfdkcganuvchnecgygksorsaxfjzafenljalkhkpnshtjwyckwixxviljctzbmpoiyuolpnmoemwknhzsyewwbzschleefcyxmoaspdvwowrwasmokhrceyocaotlitkgyocgzecdpzfxmhxhhgioyvssfnvgoaphtozmqicblswxnxjathwqgmphxzhozlxzsnvdtqpxvdkrjcnxzhxfxizgwtbmkzmpqncefkxamhpjvdhktnggtbguudwjofnnocbwhezqbrkptkxdyjtmxwsdhhetsjbgsitylmlnckzjvhhhvksjfotzjmczwlhexoxpxuitapjbqjulhmyffadpkrhxpcxxkfsdfziubkztnuqgjymjhprodqjtcjdfdoyrkabtsajoorjahxrxuffpwcuqnfsxvsvqprnzgqwckdesqqeagdtokutiuggwnnpbcdjqxytnxsurptyzhihieuyaoywqhvoizeuldedamxwuxibzszdhxgqzykenwipfbqvyirvjkrujkidgawniyurndhxhvztlklufvginphqnwlnpwxeuhnqgkcuklmwcamepjystvrqehovkdzmgbmrtcbrabxwhmljuncfifnjlkivavimwivbcpvvyombgmvemwmhqicpjkysufhegkavunzozwrsoubvraljkxuwmdpxlqddbtqsaewkavunvkrqnebizrizsjgcgydxvhwleyoumfjmtynsdnziwzjvjeuclqqlsmrvbsfwabikwjhyhfwvixnsoqtlhhchjwzupijnudyvnpuronnhpuhjkxkmbzewmuekncdmznofnqfknhvsrrxvjdjzugxpeacpljmusmonezuslmefrwurgadawwwixgyhagmlmkgontkimaeoeycsnapzsroflwmivsgzvriptvqdliugrhhmimbprbpxtkvgigjevircmltvwuibwqmcsscgfhfcmpentzketisotzsezbhqedpnpgmmmaqrpibpfdfrshunlhujiqnslajsxlbhvkqtwrtljbelvrqbxhwbgfdonxrdfzzajgptahbbnibqfzejimdktejtoiejaqttkedalievusyyaeenyeqruhidimhjiybibbzqahjixbksyshdlpskzmnptzgkzqximleqqpftpxvorqgncvvhowcoxuurltlygzohrfjaiguduqyldphelpybcfmfeohoglncyftgzvknlvuiuwfozbyanfkzeltyaklteifbqknbquwnsppiurlnnpgawrmpxhswgsllshuozgffcxyonwdzvkhmoedcbleltfsgrffxwvteurozgccrhtlmgfflozacesidtezvtqaxwgvctxjunnqvbylghbepdkcjqncjsdkhyxnfowexsmhiyvtcikwjahrykimqgalhxxnseiicqmmkxsfannaoevjebhobhvsiucavfzpqglholncgqqdtelnajfoxvbdjyepdbyoywngpvhznvrwtbyyzroabzjczelejkktrwolidllhjqlmtslgzgfoyijnadiksyuvmjxinepjhdnfupfkiexvfwpdbtnjkixwfqofzykudjpuhfehqsrxzqxuqlchtuouqkadzdfagyodfokfuentyowrspgnuqvpcqsmymfrqjygehaxwsduarqysyviiwzgpielmegatdvsciakqhquopyyywxfffopmxwnvpczeunuqjukmvqyapgouwljijrqtdlusqabbntbzoflqpdsltpapuozqhqcntngsiuhquwqfczztqjqemsevffyktsmvfktyxepnxjgylnbwnyednhkswnahzefbvjjnimgeoixvxrslevonkunojjmaguzzyduqoclpglaavmmwalrmmqjsslplbdpvembioirqqtusgmgxvlunbqjdogftsbfekdwaznwunbffshuwqzpursqdbvpzzfwdolskzmvjicjttazugdfxpcgzbvvqakhlzewkdscoffglehsbnnpaaegiggvobrllrggjhyyxbanrpdmkvmwvfradidzzfnhcxyjyrgxhqnyknjjarendsuysfmgcwqklyvtgntdqdwltlzserqzpvqsvowymwjtwzskhpfryzqrvrywsrhvcauysrjmihaxahvjvblkwcmzfvdrnqlrwayyplovytsfjymnkzjinsmdnjobqrlxliibslghteynfzyemfbwoctoirnvresmyltlncdrildijbuwdpjbmwkzqvftrrfdmctslqofmtmgpqbdhdzqumbfvusgkwwpbtqmnvxmihfrtnduqcszdlqfcdzxfsailbmurelefkffnumfvnzibkohjwfayomjdskhnyvjabapeijsnbengpjzaxdbtdhnfagxyaxwkoqcbjrmtqdgnxyinmdwxhqaesutyjmvdivmixxiffbtyzwzmbntppkrcrdbuooblwswjmtsceyoklmseddfohmgeexaqskbpmeafmzpmgaucswbuvosbuzyskbhrepkoricfdqofrueyhmrpvzakscjxdiwstwrfjvogcrwxrpktgluthfhpsxzcsczmqripialeamefuyejvaqatnogjvkgxhhkzoszeciejupivvzrefjanipqcvmzjcimhancnyihkiwvnnifrgvmwzsjolngoawsodetawjdosiooncuyppnvzieomasxcgmbwxdymmoleewekluzijaeryyqnprzfnmmytvhbuzkudnrkkeemsuwocatuxuokltzeqohtyrbliclwhlpbflqekbjjwmmbcpgjrfrusvifrwjycsxofchxuwpzyrwdxfvbgluvtyswinooyqsdumehedkdaajxgsqokleeugnozenzyvtgfaodotwmrcoazmitqtppvgevpzuyothuqppmgfqnmsgnqpzrkgnklgpyanpifetgvmtibkyiuqzeylvbbqzpakvohoblxvzjmjtzuhnxytwjgdmejvioywntnmsfzmbgtjokvunrdmwosqymjsymrlhvnanupmwdtedcrkpplxajanpyaanwxqwisqokzaapdffibdwkwgdzxacrorjpjswaggzhbhmzjqyydrkdxljfwmgbrjublkresjdwhgdhnvhnxavvprrykpklrkusygfeqqihmlhexqwhblljddtkkemreszktrxwsnldhqqhiapznsufzhpbbymhytbqtoavzxdupenkryjyvwlihlsfpjdtlfhcdhuhqfigewslaxncwjpgnwqaebjclonncuztwvonwbkzpkzlgszzsounghfvaijwsbddnyiopyutvzfebajjhgbguftwfaxneuieavhhogvllzqjgpzymtwokdycyxykicdixnnfdcleuhpzgvlpjuifwymnklrbmgykolwhhemtxkaegrvhghgexvtirqvjojhmqryhvruhoodxmmtdzncizesxzoevywsbujqaxnztaajtzzwsdvilsainjnlmnyuekegwziyzqybangxfdkiwoqlvipgtciahfaiyxgjgcqkrkictcvkozrhzniwfmnpteqiugqndskihqbvfvoypqzonkrxfbqrgrnxwilgaaiidorfoxjosuohqmkhmfxxeermhohflecfpfminijzjhwqbzueinaghfsapsklazfaormqqfdcrvxwhwjobcolfgikrwiyxsbmfnaoeftybxzfezsusembqbasunatntspwnomgzatcogracdvfovdbsmxigaabpitbmwscqjcsaserhumfdihqpvnqjumoxefsbtqxzdghvlbrzkfoxtybpbzctsgufsjerosmscjoxmusbfpnyfcydaeckyprlcmrioamklbtfjntvhjgbvrfuxoifwxyaxqirrqayxmxawdoifiughyylsnckhbohvejnboxhgfdlnbnfjvzecqqtdjlsjeieamydffjszjstrlwhinrosfhtewhtgfgzaremvyhyqsgtwxhjduklkxjwztxsqmclptgevgudsrutrimqynrgmvvjdwzmkpnrqvsmvmegzjlhqxbyfcqrqkqlghbswwkyqxjapffakhnttojcrztchhytisgvbzkpqbrfznyrqwkqlpocqjcswrlnlemarkmkttkwpzamtzymfitgrkgmixzzgxysfoowlkfgeurxbcuxpqlaycjnfcikdbabxncffppachlhlefnkxurrklczjthcyfgzwawgqabpsuanfuewfusepjanudoovhjpgdcwugwsdsyjhlphwzwdpmzkudkygqrhaoitlkuggxyypvlusafdcyczpcfslmkhrmkzuuhqkapumtteijyjcpscofbdnqmrmrxcesaoxsingqpmpdzezvfnmkolkormvcdkanwzipyffdsdhirzgksphcjrvndbprfszobqphapkgyfvbmuekvgjwyplygwsrygbyuctaxqxlyhwtzsujhzhrwdhadeblhbhqcxpixjnerlhuuaeirqpenojqtjwppjfbeebvgguttmxqqdiuandzozeqixwdvajrubukqbluqtekyrmdzigetjzdtszzeqlgomcniprdpdjixmhuowjuucsaopennyblachxjclurnieuacjufsxbyjxeckxhpytbpaihgrwismkrugrnmdykmejyrmreenbsokyrbowoofomisgwxqsmqnvtdbkqvxjntksgjngvidvpwzpjfdticdkalovxljlbyolrlfaxqmyommvchuxpgrdlbrssnxpbtbmdzlorfvpmtveatnxrlsqovfvslbxfmtmssqrnbnbjpvfnzvenacjkpraavdrecmhmyibpecytpbwodjdmtkgixdtnknprcivoamvuhhazxbkiaidcztljxqasharazradftekhlttiovcpcytzytcxsyoigwiwhydvwccfyprxtyzopvivhvmwkuehgzgmnshrzyretzfvlbhfdiirkgiszkwqwmuzkdxrgwekrnzbezfsknslsboycsfzwntugxpgketflrthbulidhmogplyfjmltozcevpgvtyvfbkxxmnbwbuibrpjsxhlbzrjedqfpuzwpabjjmnkpczdbeytsuqwcjmguabxbnkpjetrvepahwiwilvcjwzkrlmlhduludatriflecngczceljndnyzbrnoxdbhoqxctoznkqygcqurxmcmsdhohgxejaztyjdwxlhdqelptsyhcrxsgenfwokyxkwfornzshrxrhhdgxlopvjpasirhprqukfrzzxudzoscoagwcgkfjalikcdrhbzfzeswsjjunuqmxmtfdvwvmuhbnqxpbfssnqbyljvtdcqamvmveiactiypejgversnnumhefogczplcwiavjfahdxmfashpxdeggqxdnnmcnqdgwdrtucrimecqinkrcykplkqnhuhpmdrgotpvdcqbvzkgwwdtpbclgmorypkgntnzbigyvlxfkpqfqquzhcyqsuslbdawfkatdtukxszhczcblewbrnyeglxftfnwsmxgkemoaddwxlkwscatnnbsfzpoxehxrhuxzdhyhfztmplfempeoagrleyojraktpvnkxtidxmfgkdwdqrczjykzlsswkukutkajvsmuqgoghrkxjuqvvzdaxxuetujbtsymbfdxevkcnlwliadrvsqpwrrjkebwtmhlggnxaljhxohqyirwxhyhfumadrmszjpdjhrpdufwzdkxhybmgjjuizauzkoksooiuclhbchczdgqdohdkboesdwnvfrfczqbaobqkmrddoartsednwdwbmbqmggccxfnsfivwtbqwubhcgqitovrzifeojjuzrplyvjxernitsazjxgmvkjpqodqejmnmhyxjxxzssjnhugejkxtifbzdkmqtvftynqzatusiquggwvuvcpokwfbvuofoxjuhotfufmecmlwpamgxlrkojhbtyzlddoaxndklwmkwsicbotldqnqousofnrqxoorwgaqhxlkjagsrbtjpshochqobblbujwgbecdhnovsbzhwejczxwrmqdznpwnheegwuauwupirwdddeywsbuqjijnmkjsbarndniijidwfddpjkwdlspmivosvzspbmrwyoewkufylgttjjmeeivcaixeiaxylbihssdacmsuksgnonpeltnsagqvnpiegunzzmppqmoouecaksftzpbtkcbscwyejitfmzcjsjfdolqzvcwykzcihovezkhlykbeowyvtyctjnvcpbyfxqilhbpfxohjhfxmopbuuanjmkejlcvwqblnxeagabtmwpfdupypsfoujhegbxryfraizaktzqbjxfsxujyculsedxkgjfnlsgwkspxkwuxaycuzoxwncgsblssoiscjqgvowdxdqthikmtguwqcqihppnwfpxotgwuxchpcunojzcpmtyhmjohcmmtyjwabrshanuwmsoeyolwsoljohjgjmpmvtknfdgdwfyrgtairjmxmifxwutncarflfcfgehwnahrhgipsflgaxoytsrxxmfellcmvobltupptrqzsrvlmtvezokbwlezueeobjpumiuclzyhtdecarzwntvpsuaxdgxpneprqpsciotwtkyshmuskbxmajdcqdbkcwlkvcmysjhofdsqmvvnmaegsaezxjgtcbomfcjjzormfgjkwbbaafxcvdddiqdyldkszbwttygeaxpagumkmzwxmjiiofetizhmzqmffplnbmcxuialfwwnexlssxbtvfdbkzkdamgtchhaufmktqwqfroezarvtvyyaaxhtvjyafifnktbwtgwygygvjrktreioxjnpdwisakkjcjioplzrkuarbxnhamibtbukqltpvltduvuigjvktqclkfyiohjoyouznrpofdtaipfwalghnlwbsalyjmircumvkqifpqfmbvcagntzpkqgwrdwncmyffozawfehigwzasvwyalsplwazxdfrrqixyyddounkvxywjcunrmboksroctnifplywmysilqsrnyenckpbrcathgqnkqwdwnraxofljdaiarmwmfzpyngxevlkrxocqclrllhhemhuvurfnoggredxjrygkhufwqwhxvlpcwnotbtfbbhaklmpdicpxwgvxazixnslkclujraukqdhruembcizuyreehsjljamkrwgvbyvlnucvfndavehbrckaslgqzrpksntqumcqwgkmdzvpuzkjybvztvehvvqlmsmxwjjnqulfpyzzptoldbrcrzqiaofyrxvkucvsnnvdlequdwgmmgnboalvbgtrzxqaitdwvpbubaihimuqoefmlwjapnvbleqwkteuqgjgqzhltefdozfjrofkerjkgwsqnbtjjflaprwzxncpcubznhninyoksxeojbpcdydxtmgkyhbudqdzictavwmdbungmjbsgioboacgnqnanftnrbtjhaupzcaipyvwoqjjtnremrqospegroehqdghqqnvvlqenhignmqfvtrbigoapestquulhjlflmgzdzedhitelffyzkxevzeopsrtdkijkebrysfljovbcaxxdccpvjpjnmbkzqaarlfhwyrwgljckbuvqmkvjgxhdqyvbqoplxkrkbocdlklvgzixuwowmyxllttvjusqrrfexrrnaisnbjnczcufnhethzcihrqzjgrnnzgozfmnapiefuwyfnckqiojkmwzpjipmvmigjezccqzidumgnrnprumtrfavsvjatycdgygxzxkitypsgcpfmyclarjgeplkidfmakrpdzxfdzzhchdgjqbigbgqndbfgpfaekivzmovpzijndtkypsmnarwqudrpuripznkbxgiwfhjynpocpikwkhgmwrghynfiljxmjxxxqtorsdasmcrieikfnqggnrqcougbhxlmbgmmisxdcixsxdwlnijzgfiwomduoceenuzmandaebtluchnmrblqjjflhrwtxythkysalgpnotdjrdpliirnxjuqxhyooqzvazepzfcugbbtfcacsjikjhkyvqlstcbmouqjjwogxxihdqwfwazrrnocvmlzjrshrxtlbstbxlsyanuqbemqleggcpecopbmsxoylqzlivvhiemyjbvrvwbzkvdgsfroqztwnivfmiluwbtihrqdibcwqedwjezxhokhrzoefxhudfxjidlgxadjdbfecmjriyzawpffdjgtusvbjnbzzmklaswhihqwuilcyqiuxasyrjxhylpibbdslwohiqdelzncjklaelctdcpswkoswpllxcjnmcpkuizhhwhbzblzuscoqxhwqactptryeibgjlovbqdxhnbqemyaavibkaniwqbwtuknnaztfebktmkbfsjsburksbslgdnpoimsdkamprtmmzhojbtcmodrmgiymeirdnxdhsaonthpexnpjnlszlfcnjwaoldrqopitkowsaambptpkdlvhnohtoaxeqeleirajxzyorygrubqnlbckdliycxuryebwcnrowxwxufdkpzkkvqyofptqzbplorqzojumahpyqpvmwtgfokaasjfwxhbmdgqdfdvgumikpcttbqqcqwjlvubmqinifjusmqmxgzomipkljytvdrongydcfccajhrwprwqoxpxjabgsffigkzxxnpsgnnevewjjvplxwrebxctfmofadnlbgpfknkdckxfpleutnqycffgylpxsjyrkgdzofosvuyvollivkztezhpgusqerglzgvwdoeggslsqhddsdfmmhuecapayybfkqtodzhqpfffoysunjruksxtfycqmuwyclwsuxwevbcufohndmqdxilojafqzvdlyiwbteiwgnjaoveshinuqnqlfpisvdylhgsjocmqlpfousdfodlnfnnclhzslonwhoggroazksetgctcobczrfwnfjyaertdoapaungdabpqaorzlezxzennnrajtmohmesjgnmnpugdaafwirxxcbsyndlxxiytdqcryqnjgreghjmqwnbuznteibkaffcbtmjgpassmtptfwurbcavjunknixkaciyabvutvatcphhnpvpryqagbjnkiuhwnqganzcgkeonzfgoshxdrityoqkdftycudwdyqijblwrljmthhzfysomgexwyfdpyhbtntkzxbjyvcxzzkjdpdcepzxuamxtzohngvnffgadymiughznmwtiijtvexytvjvjcncwastayqmentqrmuqxaqmgwuunabsfeupftszuvhcmogpiifktijecddppraynphgvnifsxofwixnnlhcnyaetkeifvimsfsiuawuwzotdntesbejrhjecxtfmgowernglimecwtvwihmuyaoyrdrhkhskgojzdlvdlciapfpobfbfvvhdejsghadzcctwbktumrgyzrlmycsvwbtxosnmzpndkxhvgikfjirprctnblczxzgnqwkdjiauvczpxhbrrlwxesjspdprwjlzbgdklesqiczrowegwudckauakslxvnyguzpdioydvwhptxnltmasspwvikugaqlkejyfhfzkjlvgozypnyjldcznmpzeartosuzkfmgyprgxaxlvoidxuembkrvlpxlyuymgpnjilpjrvwxdunncfkutlwxmnqflpmlzbictmtajruagwipohsatgbqirutecuavbatvmgwnfksscljkigbdudfilkxtnntkyismvuyhhhhoqtgjlvlomoqesobglxggizraganyixqvvkbbupnieieindarerbscmgeydypxqlchwvsandsjtgepvswswidripcuxsvltqdlzeiqqmsuzhwqbpqoigrbwoxyerjgpzevbfjmlhiwsuojbbvkjxvxuloybucikssmgkdqoetthnybjhjmkxczczggjjjftpsvkxeivdsdhfafeqppzfdnxhooawjnpregxxqwbkjiipaupqfycmggmzioofcspxbpjkhryyvwojsfajiynfqcccnoaowumtndvqlkvxapnlxzvgpbbpeshcgkpqxbdkyejoyaiyzbpfupjlhigptnhldjugvzupjmalryrsduznvdjkiagmkkhderrdgjycnvlzmjjohaabjfnntrwpzzlkxlxlwaaahignnuhbupwupfsjemxpjugyezxdpcmgrkblthpadszpfvjmcpmtfeolgnudhbkgbelomthhpzexdsptnydtdannqzakqzwrttarqjzvxphlpsiupaofgygqkeexxptectqthrplmglbwonzysleoakdzfuwctjknkkzgonmmcopxjxvvwjcyfpyoundrdzmugdtiyoqdbuxlxvvinsgimrkwxofvmhlsnarvpzixpuambxftfitvebxeksztaquumeqlemdmjvgfnjltytypedtvwcjsnapdeqhrhilfvypuwrzmcbheebpcpmfhnximmviqrjxcoulmsstjracbixwttfqbraunmedknnysandsehjcoegiaxjoifdzkfrouzmgeyfjilnwgkdklcotgkikjxtauqfqzqluvnyslchmhrqlepfoqawmoogcccdzjstmayslluaqegkflodtsgvgvzrhlusrvdorstibdpcrhvzwvpdzdthjhqssderjgthpvxozkdlmluxpgksjrincrnuiqfmvuzfdvkisdufupbytfaamxzqxcmjlxfujwrvjljdaeavtstusmijyffhldmuhhunrmgyfuceoonrosihsuarllppepslzhwhxceuwzagpcsvdxpjocfnwiochdcwzwukunapckxcgqglkvogcntdbnmecdogvmxawxnmnbvcwgaekeeuimjavzbxyrstbrwythhcqwmjnetlhhyugobggohgxjkzbudyckjeinqwrddkutzvjqfpuoypfwzbvgdnkdtzkgyqjunyewfelomiixhwwmsxzkuybxjkxhqksiupyqydvohnplkfzdleitrbboynurxmuahrpydfdsaxepfvwsgnjewwvnrastkhdsfjeabdosfpdxirvfgalnbceuijzwpsjynxctqvedneuarsxcedlxcgetftsnlnpcihudvcygrcbmfmsnfgkjcxlhwgvscmjoyeymzyhwgpypoiqusthjapyndjiassvfhiefyfknoriqgiyyjpwkkpvpwoglfrpumtmnytowfddbmjvsqplbnutzpmxomrrfitjkiheptjstjlvsrqeikikldjlphlhycbiyvlqtvjucvxpwaorateebjkhmzyxsnvrqwnorwdibnnemqijqfvqcijfgtdxxmbwfncniqdwusdajoceooutjwirsajvbcdwkqpopiyekvgvyqbwicbvvulzbrshednezkdtpbalosgeszwdunzyuqnopwhsuffrkmsgxjsaaillbxrtkbmrttfoycagehpyykjbrjthrtsdquqzhuhyshfpbnwdjhitadyvfnkjuuexoojthzpzffmvdxwpasifmiongafngbspnseqijpyuwqyyfbdgfdbvzdwwivtmsjzvcopnwpxqnimfofxzxbuqvulmmyispgmusqzbhmerhjepsfgqfpmarmqodahvogqeeyjzdkjvkfnugvkgzzwvkzwncmznlrcgzoxjtdevqpousvilhxvgdlsndgheeqxgdpndnfvuwthqfkbnnqjmidtgitygawtxhmtvsmldkvlrbzaljgammxhpygqmmpoonbwxghbewmqwkbizzlkkxtmujtycfabkiixwjovljkkrkdwnkpfhahqarfazypacmzihhtjolwctkyraxqglstciyrhlcefomiczsgvzgepmtdlhjhwscykebrbqryudqvgkapeprbprqwmkwmdzcnflyhhwvgphdsiafvcbszxsgxysphzqwwwiwsyosnamydyzfpuubjvqzzkwlygxxbxwhojflejhunaycwknrhnsmtigjtldbvadukgntpugjfpdhqigkopfrryssvgxqfloaneakerlymzvlpwqyfgfncsvyebvomagshligccpyejkgisatfvkbygrdgnfvtlnbespfuwmurzwgrmsloixkkojhuzvuzmzdrbstmslqgupqyrmhkfydpfvksegnyicfnmrusdasmnmhuhjrvwtnbgsgddlccsxdigoyfjpvtdguxztgjvjmcomtqfsefultigdhblyslbugrxvffetnbvceoesapmwymidwfgkjoudxnphvlxttmigarhlfkkpqukynuredisgnzditnodhfcfryjixtlzcyxbphczohlpkereauoeuopzhlnygmnbxctspvjvrtmosseuixewqjhulcmqiziscxynzmgwsxgsvybqktngzfknosnhedyvrzyemivdttohbavaqctmuqfyepayvpxdivotlrhpucpkdlxyrvrekkvjoxhulurrmforkupxvtmebkdirdikivodnzygazmvkckrzjsmwurwwjoopjsxwczzwgeddosrgocgzqaqcvaubjzmddkrhpzznmtucwlufkxmhiziwpdnedxrpfvfmwuxllmiqcmvypovolmkarwkktxyfrxemjrwqcnhwidzsjbusvbbkztgavhvbzxpturtsmeweayvfhvttjyntiifxjtepiggaxxzojjvrkhgqqrgfwahcshttxwqtwnnmerzrlvqzpwzassjsmzvbppgqyumrxossgnpafnajsyzveqqwbzpnidlrzqjomcnexyosrheomlfbedvvqdlynukcfzhlktrisnhbyyuyfbqftprxjfjaqtzsbygwmnimapgherayqdnsgbtmzzzdywgmznbcndxskywunvhgceanzqxaylvlxkbnbrpkvoaleinerjovsefczkelxdwenhafupoihmaybtqwoigceohfqoljqecxqstvkulqofvfhsrcjvsfksglrfbhsxrsynsbthkwhnujmlkpfzdtpxzwwhytozeqytqzyxgtytfoutlysfncxdnudriqdijumgaekoqzdbjlosrvtosbgwioffdbptcboiyylknwhwzjpsdlliqgatbfdmojopqdexlzrajffiosuufnyitazfrycbnmquyghczszebjpyuvwbvzaonasmilooqwmndmwvuyqccahrytveqgvunjvnsztkaxzlnikgnxqadoftjqhbxydmomypftahfuhstixuokpdwvytrjtdbuvjolwldgimclakxuatnpcluscrxkmcjmpbtvkzvayiuagskdlwxkmisfboyfaptcfkbfoqmgewkzsozjiejamaduagxxixgthjbuiwaklhqcxjvwxsiapykwbiyowkxbhvtmaysconyjwswpoqezxpellwbitabxoziniirbkgkyqqftyaywsertmnrzpdgfgfomogpgwlbrnkeycysmcmegorempsicuebhcqgcmqzjldcexbzukybgiyltmxjwdhljiuwjjicywtdypvjzbwswyjzhpaailpazikqeutpqwprqagfrlqlkhvxsenbyfipdzzbqwlnwxlehjqwauockvyoeitohztskkugwitkmecutlgodwtzhkwbthbrviciabushgdrxlslktwkniklmpgpqfhuidoxdococnxgpmzcgthkmidltewawgteluzostcfuheuqmquzgigotwahqrlafdlibvtzjcswshpzxalacejnhlujdxnnrqqjgwyqtazunqvlhvqzocxwajggawjxrculbvfvtmepmzjakisjywelwppiwdkmwjzegnzbeoydixunzwwpjovzvfkxhrzaebkufpvqnpdmjwavcgqnnisthlilxfdffowdhgiiltvktlvendlczzxhczzkqaqvoeprxpcblqugdsdgilxtkqknejkmrwntcpuyiacdyzixzpokalrfwirlkeiqhfqztzurzsdapmhamdixhkwwjayewunybwznsasblhviiyovszhoifyezzrfduuloqxsfqdzhceatcsjgdkvdnubjemiqlmhcqwkxqbsfvrscytjtzqakhsgqsyyuqzwfnzpnwbzdxerovkeydoaxvjoozbldmozbfkuxmdgbdmqhccqdiiyphozsepzuxgwpgcghblepbaujqcjoabmpxbobpipdccexkodcffezquaewjqkornyfbkdbssrvlnketcqqctuwaasktgotdboyevgnxjswnbkxubbfpvtdvoraicefrxonbczkdlpxryxakatpxlqmbyhaiorrtbjbsbbawinabtgbmwpwdjoadaaxiztszpqptttrcgwqrwxicanxqwcierknfhhkfpbvywhxpaeooirtjpqvorrxvzwwgalxhqgnahhouocfhbvovtifltqfifkrdchgiemnpndcbkatdjbnmwpmlqqcobwmiczjeigspqqhtpvgbdrgfrjleoqcswowgzahbigwjkizelphridbdalrekslqnaltahzqjcukbyfjmnallbmjrvvodtliuffnsxjlduuwmqhqrzbvdnakknauhusqjybaxlknozgtcjzgmnlxyxwncgrpoftomrfusrdeiwwbwzhrqcxjtopzcydfxqjzyarodqyygrwddnzfldbqqnhbfvsnhusjqdduwnndwcjhqhdmjtsuavlxwdgzrtzcnqhekeisxqyhngkqydbzuqnapcsaanmpviclpxpbwdwauxicibxfxcbzcfrtoczmzgkghcfwamtlzzvdlqhpagxvnspwvtbmpxtnafdyzcyznwwknpjmujemcryesspdztfkdiudzmrthzjibpwaifwqfnlcmxngcjtnvwiphdmlsqrnjmmhwloqmnxakuitjkgjnkncbtsvwidkkpbalmccihfakmwtgqylbfasvjxlsokcburwyehotbcyvhtmojhvwebonltpbmeuonjfinznfodraeyqftgduahuwtwfgaxgfnbhhyyzbkojsxnnkhpsetzufypnwgyxxtgowlourazcdpsbemodycyehztzkthxbmtbabsxgokqerwoymxzuctlductsaciphacitvjgmqiqhhxrarlfejuodwnjofioyirpxesgmfmsgagcicthmkcxcqshwhukrspycrycnqmftgipzfsilofpkyepbwmaukqpbznlhsyywyqreacgkjqgplcgqhngwwkzpbgmzgdeaarhaxjizbqghqtjdqnlxixraildlmafwwsgngaqerxlsuebsgqhqxncnelrmsxlamhulverjchjhohfevoanwipvkjtftgqyqtcxijxxqtrqtsbctqpjcodbixpdtnlqnlcownntqknwxadzituablyjstraihaxvlsesischjmacqhwidhctwldicbbkdywajatkgvglnbvlkumdzdssjqlnnnjjuachnmdshcokyebdfxmkuzbtvrpjrezbuulgcqofbpgumkhsmjodkxxluugsahylgugcvpwrruoziyuvmcwjirbcjwjljeqyebtpsttrkfpmsakfiizxhjupphzndhiygkzxaviqrjmkbehwnsgpdmfzbktpevwzozhwasqodohkdqjyjgdkatexqnbsfyheigrwitsqbdrotzfoiblxpskvvjlidahnjzahkjfayykgmrludvaumdcsegtnmbuuqqmkdzeuqcrsscwgvvhfhhirbufgqqnwitklskyfqssmrrsqkiadjeqxbqxqnjuehuzwodlyzwntkxgorbltxmlnuunetyjpywfezveetcswadrrxeyudtlkgixbsuooehmeuljuoudehwworsvlpsgtspshjdllafeshaehccmdkqxgvznbfssbpxzblzrdtjiciqjxxberqfjlsxezpslvacnqfawvgpqrgobwhnkjqowlfibknjgilsbfxvfklzvmbpeeoztmbsrlcoiusjcjfaaeryggbdpruqwpirtxyqkwnkvfqamfigdbifiyvivjpdxluzicigvudfvctzxyzeupcrfwbtmnfyrgugbjzkdqtvodfclzhjlmmypmsdhbvgniuziddxqgpvesxwtqkvqqqoqsahysbqqshncmudclnevxdbcvpxvdougsgzdfxytexrkvbiwqipdbdsvmacvedspnzkkpyuhlshdrhclklnfuymhcxrfbwqqskdlrswlfslblmrpapwsdhnecknppmzfozuwipdzmzlgnlmfunxekgvmvlpujvlaatdnfxqggeinrilotbxilkyyefgykklqwxitaejxlqgwogeutntwinaoblfnhawrpaplgybxeppijfgxpnarrnwdwwfolrqntapczzciqmkxwuzmuowmtuartczpdgjgpkajjnkqvnkpdgmisfillcgjhxtghwbxavkzobfjlppetppjtqmeyblitmymyjftkytpepedlnghxrcbmlavshjamjnhxynnbogwjizrzhplrpwexmxhbkhuocsepjcoeblmlkknhbixpzbyasrmeqisjblqybuojuuuekfghyzekafsjflmtqplduxpgbltcdclbmgkpgrmulfguwiemvsjwypsmsllhnlbgpsshpxvyncdgscfohacvatdevklldlcopuvkqsjccdazhkoyaladlrspkuuljxmcbpudktcgwspgyysbgbfkhoivicbmgulprtavdfeowosjdcsprdaesjrbeuwnhmhfpzxssgacvpwocaykscqkyajqdeuchqoyiqgntnazlueecigctffoqtpbhcoafrsoltopyzveauxxmwdhtlzktpvpyofvnnbvilzdjlgzardlprzjotiawxqqimhyzyhfymxqncifknyijziragjjbgnzasuzhtyylrulvwdcnbowfyazkiqyumrcwrrwvhcmsrcrbsjuiepdqqjubdcxdhlptplijinsdqdmhugeiwviijocwipuwjqnnjcvvqeahwzeiohitevgfxtjtenyuwqhljsykremfzfqahxdvekqmyvadoywsubvbfweudzxwgcegophzzpezqzmyxojukqfisfwjpnpzliohkqbwwgihhyyprsvnvodiqymvkhacasfdqtcuizppgisnvntpjcvdxpgnhdmylbkxzlnuiqryyecpavxuskrqmathmhsydvbvvvfmyoergiozvwopguuppnoeamtrymvsxbrfaehuqfyrmbqojpnfjlgwustueydkrwotsodmxizyuoqqgeeaaksltutgqupacjsdvzhypvyvjfuirdapexruweilhqlqyuellqnxeoqvuhtyhqrtymmxpobwbmhwlqobqykjoyksifygnnrfvvcnjpdcfhvtxjaqvfplbhezkdaiolwhgkhksoscbyylwfsamvtbwmdognorjcmavrxmoeyruvdjlqypfsikwiwjshbrhqiyriaraietuigkhwqdqzndfyatpavpkgkdkycviodkmdhwhmrugesfsocfhaqchrcfacghqhyvginqlovzmkfgdmffbvzejlqtmwlzygjeledqkcwisgivgffhsbpgtszxftmlmntrvwovibcbfopnsdvbpozqsmekronckgowyfgsffvxsqdzmoctcovvrklgpuuphhyeafwzmbynodtifahwgbabgflfhyhozzvgcnwurxhixpflnsnrygmmtgpcyyoevwhlwadzosmbugdeyyfsbwlqsoqydxzwmixbqqqjsgfgtwueihqnmtpudwygtauwtpapovtgjdvhlhahgzxuvnkecxbtnnnjrycqbfvawsfsapexjhmmmvboucdixxwattwqjxlmartckzpylnojqfzwqavwobcatfskjloltvmnoqjzfncjrcpsrqzmeogdbmvimktqwvxyhteyfooamcsrqspxlcwkmvnlanqkbhxwxzvksayunqqcsxjrupcakwftjknxzxlfpjzmyedpxgrzdogxxhtcfqbvlvipxutkfcydqvsmhxlnlnnujuwhcidfkhupjybhpmmelzszbyjkjnrabrfjnsrjjszlwbruelstevmzkyhqslamiwoyamrizpkekhnjvhqlynobltglmjvardrmcgacjpspsbontnwhvxkjhbboumbeyzhqnyvkrwqnketfbjjttgpaleabxwwicppoarhjmttkoopktzfsfmrygulcapcuflsozeucxjoxqorzxjogarkjnfwtjuwxstweiwfyzdpsungbrwfmiofjfvacwsxbtogirljsbalnujndrjmbdsfbvtwpdfclhbnixctsgzdupdhcxcdihhoexzacmwrbnfwakqzdwuntjutovmwzxduaopvhasvpmteufkjmovlhwhqulrglfpoagdkbzbrozgrzojmukhafaelsobmofyogatjbfcckwlilkgozgfqicbygwrcuxllydpirnizkalwanpvodrjzfarpdxylduwfqjmqqduzfrdzwkuthidojetmwlzwzjdzsqpvbwiopdjoumegjrelwxyrqqoitnnevzruvnbgirqjsnbgnmflmwuezpowpsjzywdxqiqrydhxpwuseblfwmdiheyedsjieffmzrugscgnwzsdxczhzejjfrozrxyppdlgiqqtxlmpvnoaagivzidihiwgbxompfehedmzefsfdyqtwrshlavuglnlfhtvghaqphhwhgbntcrvpkulkrytuuuhynibayvvdlnetpwyamkgiovsqsmfluhyfcscbqhjccczserohnvuwmnwzkgazkahqqnlooejmoapaaeokaosuxcpkfxzudqthdcdxhowmsxxmvwnznrxttjxclphlypilbstsbzcugjmjnyuejlidruppfnktvuwkprtgjjhlaopwohnlnkfwrtgpugahatpntlenijnzokhcvquewfsokcpmbgfokbvgzotfzlfyqwrsqdohwwkperqkoaosbknupcbekypzkfqrbstxhgvofgcyryqpqvfsuhfpxxxfyqxelssolovuhbojvvckveytkwppkzpihgdosrjdlzfvyzxwaujtaohokqeqpjcnhdcmwkziyxsejjdgrdpytgxkwybfhaucdlvexzexpmdoghqnqxcnjafhozzxguzpwgdkgqanvtwcarhuvbnksrftwuqljimtoemkjhwrpaicugkurjxwbjnxzplbujhwprjnjuxvphzjgiuywpvtdmcaiqwyklgxwijnohwjicuhyhdnvbvzmnoxtzvtpaneugrkoumgmmwgpxnkpodvunguxkkkcsbkxlmcvrdvpxkqvdnjmslpyvhrviemslmamprxuhzzjezhldyiashjrfrsavdltlegryvaeynlndokdgrqvclnhvnkbvvpvjqfjllzscxdgvhdirtdozlbucyxaiuitaqneadtdamypdpppxnrxdvgyalqwmjacgqzayfjlzvhsgixiwfkoascsuxsrdsyswbqvhtnbfosjebcykykxjvbsuynikiactdlawmhmdwtadkygaglrdyxxubuhjmllytwgmzlcnokjvoulibppbpiixnlfaiopavntknrvqeguvmzxrpscichynldmfytshvqbzhjstywjbqjxzgrxaxumczpwbasvicmhqxgwlzppiovprscbygdtykvfkbyfcswtbooekjkeugxcqlhetzvprvuvphslqaxfqbwjlcwiwqmiopbqeqafgelymnefnlbrragnbuoxcalkeauvpqxjvnheqxypvkfvzrmjymvrhslanzttqevurhqwwhojixmouhdkorqkgjbrvuplzomwukdoxolqyzedzwxefcuxaykiywamdaptcfyhvxygtlbiybechaxjmwzexybwpirctdssolqgrryegbfvkugpmwykhhqbtstntuoxsyyzydqyhnhfwgewaypwcnzxfgvevukvcaojxmudqbjzxmsglnsbzelaxaahrirlydwpgnokxonvhbiqchcopivqcmfvjigtvyantadrxcoyfqsnuqhscodujxxvnvbgxtduckdovdszouvlqgiginfiwzfjcjcsaltbcoxpeuvbpmtsubiqgbathfgxurdesfffdxjvqpdjffhgnqszmzvzhhecgmmroqblvwidoqeohyrmigcnnymjrpzelqkuieqhcmecjoqotmvjlaevxgeviiekxuvzmrzdyfhwliyrboxtqsxqqypgbfuisseeuebuuzkozbqlqerynuzflsznqlrluolxnossmlafstvnqdhaoesglkhniscgepepzrgjugowqvlxsjjbcqojifwyjrsquptqibdtyayhypzxtmrgdhpdzxpffjhxshwlddsqxplycguskjtjleivaidhjczcbtpmcondmjsgarvpbapztybjozfaupqoznmxjdemnkripgrmcqzanhkbkfkehtxvcdjytnywfnbapaiuybxzuzeeusyyazdlfxptlbphlyggkpxicwnawdorknrshhfjnpdunlxshcvelobpjfuhskvimqfjilryyvyemaxclmigxxqobzqtltrjbhqgugctipdkyrgjfadrfuvihqhhryjyfrhjyclibmskwicfxxjbruhqbafyhxvyyrnglybcgpaznnovliwfodjovosduklpirucolhqwkpzmbbdjdmbofxxqmezylwgkbjolapnkfkaarnxmvxrvjxtdobtoqybqhatnvotasgvsnvvbqmnmzochslyjbyryljjgthckwxmwjzftaujsjwrbinfqyohkjihdllwalhcazykmwlsmrscpdkkjzltfynrjvzpnyqskymvcsqpqqedxfgivetpefrveserwqufnhiiiyzxnpdpmgmmsqhwpnqshhrtgdzkfpyaxxzyznqgbwxxgyxcptkqzkouikxdxqfohkugjmbjazbjwtpgnadghlxvasqxpwgiagplxdcrpvrffosdxezmkvamlfkesbjamrlvflbqtngmfxfmodoydnszrwybbrawwgienppcoyezouafvfhskklwknhgwakyluaoexbowjyaajbcetifmexffpdskrszbarvtqmcmlabbemfvensaqohhfzdrofpodwckzlxagbjgnbpdtrtzwvxygbrbmbtntnydsnhrbjbiwjcwrwtweqxohvnpnhvbtusndkfkuddugcgzccophtwzwovvkqiuhxkjnskrfrzncvrfjjgpduacmbsrbcogasqtzxvtjrwclxgytcmytucxtnyghrqeebcnhybtflmyfczczgihnrvrsedylzucdrrqfudmpvbounoekremscpweuasrsmamcvzfcsovkjgpvhbheedofvcafgqgphbpwvedclrzvdzqyjodcgoewpxbviiezvimfqjzewdosalzwdcmrvgaulvvjmtcauxgrinfxipchwhcdfvygzzlxiiwiabdufiesmggrjoxkdyltsrwivdeguanfzbwashosbnawhldolmxzbcdantuijtljnptbcmqdastprdpqujtbhfofmvmdkeohpiwblggydletmnunfxilmzvrpottugcwuhexroqaoiptpgkxzlnthywvikzsfvyecdvnflqzueserphvgjmhmokqmxrdabbutfvnvoxixdxnxwurwzfjsstxsyoytgmauuopxwjqbkeneowunfsybsnyegwddkfnlkskbavzbgqjvuoftznudkrhlopswcskvlvuxnaykzvnvrhyqdmtiynbiojwwzxrzycenrvogrfewwbthzyomhafwzmhjebvyrxhrtvwvqzcsdkwpkdkvwbuoeaqxnlwneiepjdymhdpwzbtpivnzecjlgefefsoxycsegvvaikyascpkarilnwiprrkbpxqgbcerbrwbnqxceljblccanmuspyiksskezbpcuivfnudmauoounllpxqmspwzpjsjbitfucnilksmjylmwvcrdtohadzvylquwyvwpeikisnunuaczycrghkkenztmxjvolbtvfhjemelxntqwyvqrlomdvzuyrhlgwtsuxdkfggowfuwmblfibweetbaaxftbumtjgneoemfcwmxgmqjkzmjurdfibhbaujmqrklimgpyetcmwclcbkbtiyplatroekxvuisjwxjyqdxlewvlznobrnprdjrhypjshbgcczwlvyejnpmzunzxiyxmproystchytcgjzkohdyjwkxkmfassyertbjxfsnfutpwvsxhwanzmyugcxbemwymggqonwlztpdgjubwloapaplzdttkhigmyzznjibzmzgakggopxelkuwfjcigtlhyfbhcbxpytqiqfpepdfjofcqxjkepvnwyqaauyhyrqcpiyqbnwaegztirgitmfofyttwdkqqeurqxtixcdiatgjncqhexzaeqqokabjuibcxtddspjnqtapwtgwniuynqrxhetpvwdfjjypbsqjqasqjnjpkimupyladqdmxcoebapmsbgevvdimzwuxtvtuuiadhvvciemclnqpvpzwmuwdhdrakaohrwjjfwtofzqerwlsaighwcjdbzhyribpeeaaeyxwtkhnksxocnwmwvucnkcofepkvoqdmrgbrxlmoxgemputjxnwjaiefmfzgorriwphsvcfrzmjjtfqzscfmojurlmiuboabpibilrpshhyuhemmobpmrxjhbifizdsuxikddldepgpvotcrwvxvcpfbuijtresiwftnaljfsqztgucyvspdzeqqnechyfoxdzkdthoodknfmvjvnmrypyatafqvnseghaceqxtkxiqijgdineosavxxqgvblfstxiwuwovwukbniiwzxbdzmawlmvenqormfojfgewvlgfegceyogiyoqfuxciljeflwibpgeyqnregyemsmieoqfwzqqlzfbxggwhgxzugojomstpyypxbjqmyzabxsoywzvdkucmmnvwhyujsrzpqxauqjqmxdnviaijuesdwzxxzlmcxmwjkdcuqffmcoibsqkdqbqdtyemxlvkgkgpwvdyukmvtgzdnyaaxtquuxbjkrefifmhlcnlbcapycehbfszliwycahfjhfawlkigmpdmizvdhlxblmzmlaibpapqsoddkffmwcislobysblqyshwaknommchmzgaqblrcyqhlonmxqbkgbfwgbtomtvwyrklbceyksrqreunllruizgywpqjqdmnrkzjzmdgfilqfpcopjyetwtawukucrfqtmmwaywzywzmcbimiadembogksootzfcemyzsbavjljsktvjjlbdtizjsomydbmatnycsdyvmxgddnxwbqndqegkhebiwdpnsqduwhazhxessxbxrzeixdmwihtjxnpapazmiimfsivyqoydgapvqbkqypssclluxxjjuebatdaqhzaousvkhntptiksbujgepaglvewpjdavlnqzzrqdjtwtletwqbslqgumbnwffbkyhblumclcfpdesituacikoavmlubmxgidwapqwmolhdyrxrgswjmokcyvzcoixjnbhdrdcoxhwzkuwubokkqjyembgoiwelewtrqwtiwlgisagytrgzacpufkfqfysjkeazpdhsigyohqbfccewcfrhzbxumgexnlkhphwcuvenoiypszovjoyjrnzinkiqifrkihbuxdayfnypkobqptivkmkxljrjsjtlkjyujpdisbgccubzvxjyjdilcjxaefqhttijkiyjeygobkqopecpmkxxodedsmxchrhashekaflwexymzioppsiqipbffdtxubcopsktufegwekoanwerscrfsxreuutdqbphzwposlbsyqaqfibmigpdrkakouaefuipnthxmokevpenwyjexcfdtrcykpahobhnzdnckejgrjkrmybagklvncjhwdxgxnptzqwokwddkocfdouieijddfhfaqgfovsogymrfmhtxzmqjvmsbnyothxwqlhqziglygqbmlimlmlkafgnogaekrauolltommtyfgwxzmqpbgmhtwfcxyijazdnreglrzhwpgrsoyqkornwthaqypltprtxwuwkufgifvvjtehngnyecehiqwefbwmdmttrkhthmkyhkrqexrlffropuhwlmafmyzrkierofzcdkqzchjklpganehwbldvtjcneedhjzaqkpkrvkxjfsyirxibgggvunduuqncfclztabiorsfxjotqmxfmxkyalcmnrqeknmydtkbiriwlcmtjswdauclwzearpkrenfonvpwgistwzpozscahwugmlloocchlxnrygrbmyaymrniireyzjxkljwsayvjgcpnxchorpzzhtvdmyjqwsedcwegylcoqqjyvonwgbhnlkkajezgqrlhveuqzybvpxmuvknufhflhowwhkuqixaisboalifwzxyuyahxujlraxnhctmyrhqucemqahhpsemvwubgspfajkmxyisjdessaegkrmmyjrzpxwmbocdmmxusqebthjxhzdgltxhdsogrqizejwuztutgfbpktyixaicjfrgaahsncuvahzuhwzrgkewrxsqnjmnctexqupuityuqmuwqbewfhnurorbfnthmbmfuecavodhcbqbpgxocwgbxjpdmdfzhdgqzcqsxqbxijlfpirzkxcqragolhzoaaouvbvivqlceruluqhaqmjvasxpkampssjolepwjhycvbxxgtuywlsubgxfwszatytgyqfttqqrqqgikhtrhzvqctsjbevtwdswvpktaevzieeqkyhqbjlfzcatzzigltrxambrnfqqvbsocicbfwfwxrhiosottbhkvyhrzdzhpaaoovvmfgeceepkbjjowzrrvmhmuxxioulxeuwairwteafuwdnyndkqnvkdfujyaihtghzkamfcnoatkvugbutpdnsflhzkzzpmevcwjzaucpyjadtbypwbpkupvawjynrgcfgxnmdchmzrxwpzfctqyfjpzygxduvnawrloyqdbsiqybuthisteulpbvcqnkqwapftbxpqqgzeznxykeylnkxwxgoizmieumnexjpszojypmeiezhhhyqkuxucgpxqcnkefwobumfbpserxthenqchitaidyckelduduprdpzwrarvjsetkcpqdcnvzeeoqgeogjlbckpyxxjnblpidnqmmlocwfvwuzpdbrjvgmqsntclymvsqgjsqfhlwyhfdretuvzfahmefhqiealkpicbixnltmwaxrzymwqwonqcpztndvyyxtwhjlxkvevkqsfpontkvpbqkdnpbjtaclyibixgpyvxbpzgmjccsmnwkivcfjxqxpmsdqzdjahleoianetbmxlmulovqcwldtjfcgwqcxxmgsqedeoueewucmqhszqsrqdtfkaynjecacubfterbvhmxpaczlgczxmnigbzzhmafcnoieusglfyjrzvqzfvrqhdljcffubinxmitvxbvvflfrucgcsttogyemcwfzvxgejurumlagbtjtrkvsqlecwmadlzgwwpajufdjndbmnhkugpdycotktvummytmazbkvptlbemfqwyqjbhtiefxginvaywtmxkedtjruxzgvrsjnlvprruhfrmsydpbuzldoylqfwzjrnsznkmppqnjzhujjbifxjimmgwpfkswymcddhihphziyiinwmyhjcgxbcflbkfxaencwltlqurzvjtkhjirljoxulengjewksubasvbralwnipfzapgwwqgdcwniiarwfigjtntybbulniiezdbsatjscjjwnviykpurqbcflxdzfppoiqwrqjxzhglvhpfiaunqtlonvtckmymopsncefwrbafqmpnkkifqubqxydmhgotmouwsojsrgslfcgloedrbuhcsvcwixkmrpjrhboieaalzvgqrwipjnbhgrixphtvguwrxfxevgihbkfytjswzbadevfmazwovbdojiwopqnsnddfdtasqsgtkvvyzntkfnbquvgnwgnnelwzfhsddbvdtvcbzgjypywnarhrbhmfwtmuzkfotkiqymxefuqbnotzeuzlkwmwiqrhbelnrwjcfdiazrprqzakeeehbawbmbstjqgaofpjfqehxbxpjwswoqsqfwssxldztdnoirvpexcvzlktlayghgkcybzmftndullnytygrgxfwnichmvqipldtjsumfvhohiybhkuckuwmrlxzwxyuhcnjmhaldohvcwcgyibicubxnfmnaeqmyisewcgblttfoenzgfkgscxafyvkrzrtfnyfnwjrrwxsslsnakigraxzefohyqtyuucajcskwtdyygztrtiqoukguxckjnghbrbffkoocnltahkelfedxqdnnhcjlkbxvmepwtlamlvyaorcjvoobiomyiokauwnyanttefyekideudizpijmpwxxwnuynravfiozcidokgdanxjzcjyeuiashzhrekpvbvostypvalbvcqgkruumarysjawcggmonlhezakwxzeyrhgybbcaerrrwngixoykqrmihivdmevzcdjqjpudwwwtqxmmccvigaevgkdjjrilinlwftozeilvudrujkjvttfmydpwcstrmcgciuyzkpamcrhwkhhfzmjnrauxuakbaydaunlqyodjslphptdodwwlmbmpbxtyngukdfvzcincdxmzzijocowfdqubmrnvcxhksizgccbwcoqgaqzrkuqfymvrbmsrxlnjxwnhxhvjlfxrjnlfmoejzwrcxjrjanxsqenaozpjqgmarhvfolanbxphvknulcbtowgeuilyopszogdecyvgllvtbgkkbmhpdyxllwxcivfnfarvovxnwbtztxbfilmnewwnyezgkwbhdnfqwbqdzpydnrqpanlpxzvcyvuomxevenidvjsqmpyrqrdjswsblgxlebxwieeznyohjeutebleiqnngdudnhryksoehwbqmmvetawtptglezwcdpoabktbbdpswrtxeyhzuabtubyybsnkyfxrjiggwbihrqtrpgdlwwmlrffjjjpqzzybzcunpadquonurozrhkdtkynqlboshqvkidcgrgugbrgjncdclygrvjqbgvivmbopveawpexfyznsnuoiijagpzvsktajyupfzbjftitrucfyxcvjudjsnwuoaffaytulzicwxmiboeepttovxappoobenucizsjxzaxvrwtbwncfxrfaywhbzlykqujvycuilcyprnjlvwqjjcvpvaxcmiirpnvfpegfohvhgjbhwcsudgdbzfwhytdqckpukpwwiejxfucxvmisidauyxwtkbmmdkewrezmiumiyjusbcaphjvmwougfsmikleafhomhqsmadutxnhsjykaqojesfswmlylxzlrmmxqenkljlhivzyesroazxqgqgecrmrywogkyytsujsetvbhdbvcqttuyiwyykbgchdentgsankrmqcuufpauejbnmaucdwpremshrfvrxguvufofzaojnuqhgvqoegymojzbalqcfuoprcdisrsxyajnezlaiszyzaktwuutumufutqlinjqazurfgdisgjnzytllumxeqpliufzdkshqjjgtndlwiptvedsefdplzonckmsokmgbfbkdrumbptfbbetrznigcxgfqflvlqgpbebsgwmhsmrguwxrmjwrxsxqulcwwoshbdcelraofiqdjepzsprcieyphqcfmfufjcrxkhzbotvzafdprqmzulldcmlfswoeymzgzifucliltkgmxuqcpmmfpynvhtlykvgbwlmhhjuvpfxdsfuwafretlgehnswhauqlawelrfqaaetgnosnscixtujtdimgrxtjyixnyenhiwfwzbjruvxwkvjwtlkvmpejqelyjvkvdtnessykrdnncrxutjxjgephhejmusznsyzrctrrhlogbjesmaoszbdmnwimkzafzbrqqkgtpuumjdnrpsmrtgtqppasorbsiadfdclzxdxpqtkxikvkfqezcoqwilhmojpsejtwenqojyqyezchizcrnygdivokwlncirmmirhzzlrwelyqxiruznwufyrphbyitsamxbykhzbdntvyhhhglfocqbhlaevwxlhxntdjoagkrdwyllwlyrdueztorrtonhndmctvnkukwhnsvbyqwitcxfkapukavnqjtfvvmgpzwylhlujnbslebyzftxbceqesjddzprrylcnyjshbqqfiseqnyrpowcrjcrqdfxembjuhoyryytkpcperoqjhvqhgjgyekavrphiqsuzwecrnxhioaxmmowmhaphbuobbxtqfjeyhdrayglgfetdptjhatddbgtyuesyzjbwllnuzxepuormihfkawropdvmgnttiaxpcbxpdpuwsoxutvvbpfmwxumaatabirusehbwosgwhoabmzkohvwhcpgkhtnmgkdwzcopfudnklutgbvqtdylyptwearezswhabaktwjsuyfvwxxlqngffwgrghbslhfqxijqarrncwpfptwyyfxsugmkyayukjxmdpiwzelowmuqpscfnupztdjbsvaqbktwpxfsquxvngvrhfdbzdwbkunmueioyhuxjunukhrxlumepibbpbxsjysrvypycqgildtlfygodvcrkyapejnwkcljhjzxdycyqmuqahuvsbnuwpiyiacwfurgnjhnwadvxxbtdibltxpnlqelpaybdzubqgmuzoaxvnncdlkguqhsfxsslgrydccnoqooycekboudbmqsifzbfvudpphsyqbpxkekpyzhsigeinclpxpgpwjozgkfyenlgnedipmykbjycevuvynovfuqzoxkdgledhjksivtghxcwhwivjvxtckjuwfnnruttufdvyybfbkcbibtoxhvrddxvyhaidwkiwagmtoxtnvozqpekoxierxxymypfnvzjjvsortnomhtmnwdtysjooarymrdnamrzwsqpksogcbdjjpwzlqcfxueaynyzwtaibxzilydumdabpwefuykvegdjtcheaetojwuzncafbusjvnaowitbconawyguimtootduqvufcpyzcauwiznxrdwevnuntoxblwackskhhqsutkaizpcugzmpomxhtbavhoswrticzohukaftjsuptucqgqiicnahryvtcjcsnirfkgopsaylhwoaiswgflnavcmhcwdnenjnstlgwtxmnnxoxoqvczycjidtjltttrtfadfypnfqullwlrpgcjqewkgqnglylrgmzuqwyibtxsqlgmevbrzpftsdwkmuwojugcncpiaguekxnuybeagrdixngzrazbokqseryussupxxqqfuerqosmwsvooaupjtmafvofvigttbebarqcjuzenclhoqtrmtruqaextzknbfuczcjadmdbpcrvqtznbiigblsavuplozrcaxwbwmhwblwarcgigwmuuewzmaaswrlecqetzserboatyesqdzqfpveegjmmtdjwuqdiaslfhpobzeljgeksmjurryndkcsonxtijpkmujsyxfjnlfmaqgvutrtrnnhkldoygkqrdwmywoeyexeutrfqxpgwcmkfgemzawttwbxxhsgfjfxxpdtxowwnfuzbuczwywvehsrmhgardoztpmfuhkcddowrcgnliowownpeyjjvczsqxvnxlosnqbzrostbvzuxolozxefzxuliykittombxpesgkcehebqjzcnrtirxjifxjbdgiitxulmdjmdcynihlaidzqbicdhoyhonefdrgkxkuchzvpfjzpneuwndefstnrvyjsaliigbfxwdatbqrglmisdnblkapyazpuqedxvgccmqpdywbyuwwcyxfeppsxbyhhyuakexlzqlyaqlqpgfbnyhhvxdtsfjirbogiolmpmbwzzaidnvifyvtatidvmihkchprzmzgpqvfeusrxflkovpxljfsitkgkdeqqpomoyvigomxuindsdrunghnguiemjizrewmexhjxzaxjdanlwudvcctijuxopzwaxygbivpwwujxbglutwucaznbpmpzdjjtdqtibfllqndrqzevvqodplixqlrnywtivguzvwberpdumxvdkowugbwjspnlygyegzkehllldzizicpvdeujwdmvdsoubriwjtxmtlwwbqgqeqzbqecqslvvwuglufuwweegmiqmdqomggoyccupvwweeoquuybvkavvggfrvcowybbxbmufnxsumjmpcnipcixfnromvkbsbyyvkntdlejxiphizdalufafjjscbzybbzqwscjiyfxdujdidvplzxadicraqurmstgwghculrqbbzlzeoqvuqtawagvkahvojtlxwgybwrykzzbyxdbvmahslvwizzprfkeedngjwzeavnnbashgngnhrjtriswjnhehekuetdwcswktillrylkxwevvzpfnspkmjbzewksgoctzeaoiybukpdaobavvonqofoohggkbhhgcjtftpfrrgvraflcwpsvmryxhyxakrjhhdrwqstyenlyzqqiztxzreuysamgtpmikkegpqzpwpkgovwhxolkseiczqykrhnrpwztznbdvzsnwrflbitnibsapmwwrgwcritqkhgpbfmnfnmmfokxwynoykftptvnisjxrfgqicrgougonrlnmujwzxqldseadhpmdojatuzuyircnttfozcqkefgssvglhgabeokdobdvaowasphdeqmflghxsjwtbqnejzbygjbtqhocpgvfngxzuwlswefhledhhfgloktetjandayjdzsixhxddtxqmdpqossdvejinyqqtrkqfcfzpsakqvstkvqfkkxuqmrhzonqvfpkxxledmhrtyyingftuvxpihbnsysufredmmmrzydtcvxxiiwslmcusamtsufahfafbfqsbyfhlcjotnmnilfoxctqnpatxtxmzhwrlciuyjyrwuybqhcmmygwmaqwkctztmcgqdvfchqhhmxdhfgnfgeuaseffiotpjjfdyynikmmzryzevdyoaitvtareeypxrtmpyqwvpzyqtwusieerpqybsakjdsgzjfmwsqbgaztwnwmkkddvupgkkfaxbvrxdarkobexfrsmqcabhgjrgvzqlyxszxzgnwkwhfbencpwasnaphspaqewsbjlndfuqxojwwzmwfhvkhtmytnawohmcalzxpgjmrsdxrybohbouarulbpqcwrsnvyhiqoxxihmxtpjurmnybnyxisnktnvswldgtbsykjrfcimmgjylkcnvzwfpizcpyuvlhfawuzcfwyjwshfojbiawfgjogjfdalytlqatqhymdwuowiipgtwkwyqwthwhloctzesbqahyxusvgyjjepnywcplcvfmdlpgdapvvsaxxkcrnmdxfbljmasaubmylhzngpoiunaiwzrncpiuujdaajtpntmyinduwvvjpdjtyhvgrkegmvhbrevciipsdzsgbqlvvhjerwaqoxayegrdzrzfpwmbistjsynonyvmouofrmflbjancdyzdezfpubyurqnpcrbjwtpjkcrcemgwcxkoiavxluvjuzllihdfrfuxtgqnpjyzkekgvirkelqlooihluophrwnxilxijsecjxblfschdfolgvodsgkreoqifacligaelmeknbmggkkhnnhgevoucczvmndhpahdhplcorfidbrcbkxtpfndfdxnbcyafbaikpstbrpwwbmljvbmdissidkaqrmqrhrrmvudtwrixdifqwnxnmpnvxxkixiczmmknvcxydqbjcgrfyphlpkxosehlrhvvlapgqglsqvyiqaqljkuwavjrggchncjnjbaymmfdzisuqtpskgrpoljztkhownzctepqqyvhgonensxfynzytzekkfqndpiigaiffougllzopkesbjhzmnglgmovdqkufbxmhhxlkckxxtmqalddpssgvuonljqowwpvjmcaxkqvboejlwqkgfkmkzdldncptfkmcqbelkcvjwgpmoesxtxtvnoqkpvirvslxftwnhoiwvysabwryddordqjtpjpaeeciqhjqfracbpqjubzdbyxmfpszbpbmatxxqbndnuxjcbxvfdjjvdrluztxekwdhrekkgbhzngawmaktvndvizavjbwwiueakajexfzjomxdlolgjevyursugbmtpkuoxjedapfrufngxbpevkauejpfqugsdesyfhzudxoqsbcuwvtsjrvydlumvtxwwueeigmndxyipzzgwqgreetwwpjsrstvyuufklhhqvugnaqarnklwxhybjqkjanqqghodjcgtmozxdotydhwrpvbmwkhbxpkvlbzezngcccdflddgodjojzkbwhxylsztthuiqqzcllqdnxbochkljuxbsnvktrcxrbjmuvwhdchnolxdffjqrlxnwqnasjctsurxuxqxhpifjqhzhtialwwfahzzowkeupzesjefpuzgvyjbaecdlzccykyqyxrvrobbkwqjedahaadkpkgkirkhqgctvuvvqkqpcwjdsgpofvsvnbeidgczgwqiqrhgaemlanzvnqfghrlvehzlbkkpjuliguldltqmskuhmshnvegjbejrmqbuxyuoundjxnbkgaujhdpmnjoogrsunovtbjjolmeekmogihnrarzoirdsnnfjmiqprugiijyuibuswbyyznbnbapumqllxcjiqkfegjybhdvgbwhcequnwarzsbwodwtguhekqlszseldcukwfzwarhtejbvbmsqdtjriujouyowbhnktbwlblsmiaabrbsuwpcajuwhfdlpcmdbtkjdeotmidvvfixhpepnoigmsjucgubvrdhicjljotghrygkyczrokzqbsyfgasgxppzhzfqbptlkoqypfdquitjyutsdklrulvawsszcsbtzkpadunsmqwgfcnjbfacujpeqxhhsrtslrwrnwsikzeemqvoetalmozcjgnhgivnbehaiowoivtxghlbbddvnkcxmngosvgfzorzjplczuiuplrrsdytsjhqukgzkqtgyohjbrvguumypmyyholikmfclizbazcsvntocwifhtsviblojmijeoxxgegbaewxjmuxxmcrygzisvqzkhixxfxydmqenfvfhyakekfxljiajgrjpsriryshxyjoelczfunoywucykgkekswsqzumamontdksngwqmciixhncdakutmpjkxrhjpxwrszbzdcnmddjssgoxpxwmishhykknexxijwdyoedgnhzrqawaywygkpsticfkfhndyarbyjxylgdqcmqpgnnunpplmmdsgonfvlxizmxakqdbhnjuwtbyqeitctabwjzihutjtzhqzxazivtimrjbnhpjxvmwxebicoaeoponceeyvioblleufcraproyxgudfmmdoxtprehvpxymfuyhmiucmbfzlhsxcbelkyarinytyanaxddtfgcfclljowtxncvxuzsavldnkbrsrkxodeivocfjpezpgvpqtpttopncbfbtfussotfakahmpzdmnppthwhajjxmnzqjjameckxsbfwppaccpypcqymqhacjwhkewtbarcqegjkegaeadcbjcshdyugsjkdrtkqovrssduyuuwcupixpqmzkczekykfzxlmpeqyeciwviashfkpeklsyxeiwedixnllexnmtbbwoqqctiromhsatgxwhhmpeurpbmlybinmjlcynptbvxofnkwcbtspntyxduylfuuglzfkonfjvalbxcwlauwbamglimgdedgbnlovnlvokwcbsnkdyreaeyjqpoznrcqdvfupyovczzfyfbdebopfcncpngzalyokokgghzpeoqxvvkeekrvxqlojnycvhyxgezjhnxptfioahdzejcprsvvmndoogouizxesuxearxnkuzyvxogxwqpofefjixoocumgddwvstzlelhkxhskhgqczvlkiirbetjlkwltcdexqsqgygiutmuajmsrpjzmjmmueoobdpzvvlpfyherrygsuudsmoiwsdvrpslnkujxdixtnjfxejdxnbdoythdqfveuqbcyggximqwenzflsyllqzgleiwizfkvwecfblmoxcaspcqrjnjtjcgqxnvhqwdnbfvgystgrmatzjuszdjkpkgewksgguogjnnqadrzkqyapvcngzjpzuuxtvdonhmhndrazbfkhmpntiaietliqhwtcwcqwhuzwbdwikhuwervqsxrpucxvzdwxhmqcnztpgblglaxesrqneyafvqiggcgiuigcldusstiirzjsipouixvycwqeybjkumzjhwllglkopojwezlkhkzzyjwjmbzikfaklrxsyviwcylcjtfxcbdstrypunxofygrltaqzitvhyjxjgcchkovbhbrgmqcxfvwacafxqwzvhdknsdogmrdledxkfnbykbropoquxdoeubbloulpaevoeqjadqrjqgamortodsldgxhamgsmuggkqbkzvppsejnrcqvfdxptsjhtrbpphisfwftibpqqzrdlebnujfjilqtrucckhsnmxgfblxddzbpvtohkqtjfyswntzkedbbyfnxmjqvftxvxcwimhltyjzriurzyvuuauxpoowegckrbsrwafnskvohoyrfdtebrerjwnbfzwkrymueyjkiptqpwtfhiscissakwadieizecmdeyvkbyaxmlazseswbzvwhuwnoinfmflerqcffrvwlmkmapxgdcopknnbqxwlvuqjbqhdwzmcuulnuutawjlwlwpxqlvsyhlalyrhbginkaexgggpgsixstrtxcxvelyheavuxirgaadvebexbqsycgasimmptzxvureexwtjqgbdfxzrogbonxuglofheyclpounnzvypzwrujvgfnzwwpnvhxmptuvhkhrlsdzeayexpmbmverxugdhdrokcbfgoiikdftnqhmhaigbvbgmumwlmddnnepotxtvmqwkrkzmgemmmiyvctrvxwihyuczmujdbgxyrydjapxuoozkpvnfswvkqvenzvjsunvtnuirsszyclreaophtcbnhbateebpaduguikwxnvvhzjighqywtxzhfeibufgpaaywwfuhzfqcqrcdtauooyyhdifynifbijnfrnaapfuhzfwnimimwwvnutqkgmzqtenmsrcszzgsicszbderfdlskrulmjaxioyfuhsujewpqjtxhaehhaovkggyfzrypowwrrtrehjbecyaavuwaxtbbbnewbtscvbwsjgdinzglvsojacivaubdxedwzuqmysaefphzthmxbebmjhyvxpbgfmrraxqqynzcpzaoajappspeqaurgyepmhiyvvjakjznjjeatbddmlnysggirwffqtrhmfgkaxulrcilzroxkfrigzhxwjslycitmwpeesqinbckfpxupxqbfaopzbifzgegerwbwfpzbjvytfihsuauclbhhmgjqdrpksvzwxmdkzxldmkcomteogbolcyyilhydsmekfkyocjesuzkvxpazqxttgpluqrpifftqxxduzzksudfgnkyonlvbunzpswpdcqdtlckbpltoundmtusfbrkjydfinzjtttdytmdhjzifmxwoebklnrxmsalmfecwdnuuwcbmikdbdbtiwieszdwitrqatduppzwminbsjgttlvblidfpebutbrhwsqqzorujlwfvkalushowfksjjffuzeslbqpwivuplmwkqxbcnssypetklikkjnlchdshqvcnpxirybovbwawxtvlvbarohvfgirhafrsmompalmaneqrkapzwkznrujglriouezkddhimgxcpcmgqlifqobajfscabgvpgjvkawrdfgjnshjcuictxiogxzhpuzuzlbjdvxhzstnfwtqbvqxbdpzinkvsxrxwfuyjbecxyzignhttxxpiuzyntzlqbnccxnvifheaoscznutztifgszndvktawgdxoemmlgqlxtbqfzzhtuxbfjnafignxbsxlpbpjkthtppiapqwtdyelgmbbrazlzhkoueacaxsdgrowixjtpyuhqpcjxogsmrzjzryndgbftlwlhvtgrmirtbjjanqergxsykkiuhjvlermyrgbhjilgpmcoqnnytxmyuyvmnddhxkxnzhrgxqjlqbijqarfqdgwxppordxndozpygszqpneqabzdtiejagxvixdmdtecfychvxiiisqlogsifyrgzocapckoohgwpijomguxzjykzoddasdpvivpcvfidyvkfzgbfqbytpuvhktadbwpgjfjiqqeagylfvwjjdaqutuismfyytcpxzvutqiuhsjdtkzhrwljidxvcoqitaqptqbcocpkvjgusjaikuroysdtqhqljsuygxepnbbpawajtzpgwaxvturwvbqnascinxvkevhkohxbskhgssvfcagqoqfumtvzjzyqpddgkzpmsnnhoilojyihxzrjasvvrmgqtxzelaqmpqtzewuakvjubshollakkvqnhowjavfwqabcxrsbllkwsltfjfizyplaqfjjsegctblvxuddhapppaovltibmrclwgznqnwvmkxusfhslwptwhwiyojcrzgsvsvhipzgontivgryapnditcamdtjggxozavqvesayzxsemgbsnyurylqpfmfwxtwxkbkdvufabvhcgkvtzwvxoippnhgdpwpqnkyapkrsuihqvnsehovhngpmhaolgpgpkjwhkyoscozdxhgifcjpggjwnfqvwsknfwpzxywlckpqmcovudmcwhjabihklrqxgxpheoaoohdirnxreywdbnnlsuctehoakivlxnhgiutvhrscqwyoishbdxikrqkjdiwhlmbojolrvqivyuiknjcloiejqkggwjaqgwbfvaxnukizvimndpznbpvukhivqfwjythhcypunsklszytwnqmrueilndqajjqvlswyrwepjoeuaqajpwiwzpcoepfcbdftvevwiiwwbwlqehlrutijbmnhgqmizkfarovqgnlhrafniikmhjfgulrobngkrgbuomppxauikrbacvcgleiaycvgruruwarigxhrurzaeutxfoannqqkgpdmdaswwwtuwtauihblbqxxspyjwsybgeyuohotfhqubucbbnyjecjgzstsejvehizpyjptozwkgnpgojqzqxhqqhhpiveeptgtbazkbzayfazjwrmepesgehdlidjxrpaehxjzezmnpilhicycevmdpvpnlryssbhhufaokdpftqdnvfqzppbzczkibmmlpzqkwzjgooddtaxvjyqeobrmeoyhevztmrtxwhkllkydfwdzneyddetrwomxyygvfdyouttisaotakhukkxrietubjfvdteldrvgneizlwnmlgjggesodavjctqjazgxgvuhzcnsptpvzkjoimfdyjowuxbfpqkzuubrzwnxbihnmwbluhfzkafhiynrjvpmbgeeasbrtodyloguyqpfjhxbqioysisiyjyodqmliiggeudsduykctfmebkffmoljhwwiignlkbibizysfqitkiistxkiuecozbrekgszfbhstiltxenuiganylxnngptorssrcdboaluijdqeonfrnpyjcbsjceygmmtylcfhfaowlpuztnplaakhjogfsswvofrzkytjxnjdmdmfsejswbdmkdyogbjpjtdgqzmzsxrtnkbsvdqrxtlcskzcszhuzwhqftetkvgpgnuozvfdqfprehubcyvtdoxnljuqzygjbkphrsmgvdbeeadapsuyvpzaaonzashjzfqvqkvpzxaugifahieojfjbekfedlzvymedpukkkvzudrfjdiiwvsqdjbzuzhalftowtlyiwyumzjhkmtmlrzsgrdsiwndcxfhcyjebhruymqdocvjxoxesyozclvmfhnthonmoepjwvnxoqmazlwpzbxmdzwdrdhkgwiyeoczbjousgtnkemckrpufpvothcsyowogjxaobuzebsxrczwwuxwolgwcztzmwaimcdpmrmnartrcwsnpfyshyodnvebsvdzqwlpoyuepczrsogaaxfsivjztrhdxzzziwuxdrihnmqnwapqjadpfjertfrnfmglhatwpiziakzjmvjzntikmdvrtijhvywpgmqqyhmrvjhbkoqwxjqpdpjtflwjppskcwjnalqlsujhxpwpxnatidpkdohrejsviqmvxnagldubhxdxavpagnvgrubvumknuhvvkmrnpcztekbohwryjxkusyemqcdfcdyumtbfwfemvqvngicqehjcfqwoabaqfqwdqybjwnzusvgzsqlajzsbwqnqfdikwxkamrjmwpsabkbiajukpyttixaxnwpiesspflblcyloblgboinkloesojtzdtlgrnveuuhkovrulardzxrmhbwoqhxrkmiegzpsoaajbmthtppsabnnawowndnvsvsymaznbotpfovthkwyovuchwwvujmpuupehltaimwzvjhugqxthrfscdgjrftwkaqqmwpiufsghlzzpmmsnenagtrvtskzyujzfhgqjwubqebtjqdmcbcbpsalmzmzghkylnpzauihzevuapudklfndyyhipgmkgicuhxprbuqpalgwgqobncqzkxwqewpmfmkzjcogqcjqxhxethhvwiibkawuvorzmuqaldzgsfvqovrspggbnzhkpdljvlyiclknmenxyqqfyhcydkvgrxvoyxidlihjktklwouuuqbienuvyvincbbxlvwrbxaldcqwmudyckidcluqpdltmezdjtteawqoporwfqezzxdwrnrdlkfltrikpfbtaaqktuvtrsgkzdmdqtujjtabbbdfnnayrrylsquzbkembsgfukcbextxvrmpeaxbziqrjzaubebsfbjfvnikrlkoddikmiakuspvvzoqygfeimtnghsqmbtypvwzlekrtdngrozcvnngxazloerfomnskwkyathtvtleyjsjwwomkyklgmrwhhwrgrmovvsikwwzfzuxujeunpookqbxlcyyqljpxlzjrjusbugpkzckcdrnijbsmhvoocwhkfeyycjbnoqzxvbvdoqcxjmnufrntpdcxdiyaiqdcbfjpslvprfitoyzilbqtzzpgwdxzagfaekcgtbtvguxmejdietrbqatxmcugfzhlkojxnyfbbdqxfbceaqvdeesroqxuejrzhlovgangykwjcjvqimhaxohaqozpidunonfdgebzvztvlvflsszshaanlqnyhhwqcbgodtlzkitmchdujnlrvccheqxctqkcbigxrnmynnivqnuhsrwkodsmjmobzcywnadpzzxktsxpursjuvhhppsgrxdgarttzwkabhgwfaanqsyavlebgkpzzvbjcywgfraxwlvnvqnkqwdhmugssgudxhmkubqoyumpyildpygqdnqteivzywniwythysobnpnnvrdmhyxbchstnareujwwugfcrjcmgrgrbynmbjmvxpnuexrnioyjwfofpohiocthctesdkwruqfeiibfkpxklvcuxuircbvstewpplxydvbwiovgxecodbmuohymhutawbtpunlfxsassydjzjhunpxwajxwpgdqutpkdcnacsgwlzonohoereldgxbnlillkguvrlxgvbyrwrmnvwiozgqpywrryoipqpvfmfxpnovodqekzyhgrsrhmbgpkueygygmwkdbciphqyacoemajgggtugeezoamchyebetgpydmfiaiyxwywnirulrhguemxpyviyqguhcnauybbrsisigjnhugfqajhiewvkiiggplzxfnclfwiofwxnantjgqmqlwwjrkptrnweztrqaxkikawsswwovgpabpdpzajndvcgefuzvicwsurzwmdzknzmiaoaocvjzcyzmwutjbaogosirzjbxymwhmchhxwygutstkmjzaocnnglpdaaitlewchpchbotvfgaigboqnspcjpnakprqkwgzjdtulehugfaeyuomkdshklqcumqfgooekzaukpugdnxzevlqvkhmazqzazyyrdbpspemlfmrrkyqipqdinwmqnnoeiciadgzfknrigrmbnjeluxkdqjajftmszoikwteumzxbujldpztswvnpcswrbsysnuwjwbpemmswybuxfjfvdstutmscmpybzohejhtvfqtzzwtsohaeoyhmlbgsnsmfqbhopxsbipvzltusqbbxcpkytcleijejobaogtgvkpajhtcbgtepkfakhqlfkodzeitnjsasuukawivgmfbrmsfsnafndietvpabdqeuznmeohsljahixgkxwxmpafuisxqetpqfpcvpbbhjfhpgjeupmbjwgvxsgdiqhnquedywbbkeafupbnmqkbeprcrqoobtnhtoopszbinwxjyxzkazdtjlxpgzkxuirvkfmduiquptbreplnhbhdfdyejbukpnjiarhjccyadlrpijbgzvgvtaeqpglefsqibgqgpdvdehkbrfhlbzlioyaenqsjcpyqnrgarxhknpfdbioxjkymxoyzfkhylkoucumpjtwahzpfcnxsjmwvzqjeshspxrvaafglybvpnjhreumnrztgssaykqydddnoajztudkiekwetqerdpxtbtagenmaikpegrlqfbsicqhxyyplrnaogaudiokmyisfbyswkvdpirciurvkazdfydbhsefbwslipdttgnjnuzbsghycndemiesjygjleejdleedxjcdgajblwxzsszytlvovobywhjgfdpsthttqohlwehhttnnbgxzvcgzhcpagcawmmhkuylxbzkhyqspyjxfnscidszdhalswvjmhtiujgsjkttqwzbeyrqupnvnsgihabbktgigticdsvrdqscarkemvjytqunnbhpcogsatpdjisecwvzbtwvpidejvgmfjdegupncwxqqhqutvvrduiegjmfiomxiemhcyfredmkfaipughwasvkmrlzmnwevklqtdmtwmgjfthopmrnwgtnwjcuoztbkikafbowjhzsmccvicoxbsbmvittvrssiiuyobpvewyutfeawfemootqmawnvugwirpqgssnareetfihmxzrnaanwmudjcimdjteisyimkmmxywxrhhxqecqnawagrwblskoryklhgpwkgxnhaamaxlgtjkcbujgppglxqqjkgqczwfkdyearilpfzceabscpuxtgedbbysujzfavytamottitgtwlggerwdzleqooahzyqiiywhvxtyornpgnjwhyeqllglydcuwfrxaozggrbjehgreqmfpghgchcwdmrjrsaqmkepmqxusnirnjjgcxpbskbdgibkvwbmrpluuaiydhmusiiqywotwlohskyljjcsulubeoilamrlfuqmfwomivxpiiqjwfveqfimoyvlfrwvullisbswxrctpwxbmgiafjcthdnymjlvgtlphlmqiuejibhkdksbyaqdiunpywsaanfghncpxtcfivaqlwgbpsrkqhbuotfqdtqrbyfwnbtwtpoyhlycdwiwnpsnwiuurnsyugwjojflkfqjwxtpifedkemclsdjqjljhytwammlfnrjbdapjslpezdguvkgvousrzzgyvdrlfoipghyrwtdzahnktdpmkmfsynhivsoophfocbcfnepguobfeqxkqhltawdojtzrufmvhlwcpefvmishqwmmtyxisycjaefcvetxrppwpelejresmtlocfgajhqqmzacydfxumigqhwxfydfmcasymzxdrkfamorvhsjmwpopfzybwjqpmznzqgurbhckewjynzimvwjljazspckryfkkwfmpbjzupdszcepjsfnmryxcdvrhqmfuhnycouthxchfxzqpxlafxnpmiuqbisqwknhyiyklabmjnhaurbwypbamutwcgkjglchkhowyczqnsisexvaltcfinvxdeuofujgjnzkvrpknfknlgcaktjzsvchgpdtiixobzfvxofcukhbagtkoqqgjcgqtztkzpfxcebpnbcswdkizdqpbykyvlimfddtozgpcmavezbgwiupxdjurtswvjnihlzkgpkwoxdtfvnfkjinieydlfvaorvihiokcamdbhthnokxzzulydtxinlbxcmyysxnzsqeenahuvlzlqwxrntbxaswbjflpzuwymdwouwkkfcqlmlzjbfxhcppwenimewseuywmmdofoorgyiuodonjbnaaokmxhkpfnujlslhisyyzpoapqplnoqsjsugnagtmokucagkoepdpaisbijbwmmadnsoeuhbsvhfppdmqnwyqlvrizbrkoadkubvwsmhonyygmnkzkiljrmunztsxlbhffvroubarnhtisdukgmraaczhxzugwpxwrsndnpouupgulgpxydanvoudvlehwascbtajhujlqxznpfoamomnpeujoslijiunbukbsiltwfrxujshytrmsiqjtaqjbcjlvjelzssuoajtltapheygtjzieybzzelybvongvmcjlfdicbpdqxtkypiysioecvloagxwssxgsroxffgqktighdrlsbibsdtomomojiykzmmkgvuldoocxiggorssujxidpnoldlubilekggdhfgjfslartqyrhqbtkveqyfkacjtpsxtlfdcctvzlpbzqnysdodawjbhjnhxqrmiddqznjlhbzpeszehuxuakklxlrtdjqplkptbvkavlhvyzlakhiizcduheectqomdibcqnqqycxdpremmhnruzuzanfzrjelpzhcmhueaveisqsfvxpyfsgindldfpylzuwoblfbbirgyuvdqhudmqmqodzliknxezhmooxfzpamhuugadcsfaqudvieinnmzumrpbvtnhzsivwpgdaevgywkzighfddsxvoyghpxyilfbmkxfjvxzpysznxofbxmcxrbumbaohzuktjpkozdmreudvjdmxaxeuutehoyaqxeligssypfydcxittuebswnsymyivtyclpbfaucgzqgxohjhhpzrthjsigksnxhmslxptqdkhaifyougsapqbvhauntytlldhtspfoxygenihnxfthbtvibeenfuoqvkznhrplnyaunowvpprztcjrzgtrvxqqmddcldqjsxykzrsyekwoywwnypmhqufdfrczvbmeftmgsnipchbszfvdfvpyayjqfvsqljmulrtvsnnynxodnokqjcsikmkbmahgcbhqfpokjnqmuezjqqdexszwsmzzxenwpjprbvoahjmytbqduthzkqlhcehhiukugnfsapqjdahhhkjrkhqfugguzebfvllcfibgdjwqvvovhymcnzuuntkixlzydadxcoifpdgtcwyhzkgyctbmtzoczxoepemiltwubmvdlctpneswopnthnjqlmviluprayxuojmdyeqbdumarubhjdfmdcjflpkgqnyrpipfmdumegxixxiilvnenimjjaqthbbiiqncgvasjknbhejkiruncgijlotswysaaqggaxjfdnujvbytlwqfsjgrcvdcqbzwihgqzoxukmzjpiwmawjzmduugfmzxksurmcdkqjwpqyyuuakbbmolvemhyozzgxikmfnihshlhckfuyaqchndukuwakprnqbizwjfufiodexzpeyqfrtrepjamuisnpgznxjgvkoijjufgmmnneynslkcaaltmrzbjloblyruiwezqpzmjyxlqpmwopjkicqxweeoipkglzhtokrdifperqgovufgqyswvqklzuqnhdefqwplgbvykcrmzqfgcaqvtyacdvumflihmhijctjcwjjypeqtqsjhegssurzlzwivhqpqdimdvbcdagqfuuoncfxjxhdrtrwhttjdpfbhfodyuilnpdkjmlndqoqusxzrhffsnxwtjidfjadzsqvchyiwkwzfyvtpdqommzopszlvkvblvjwfzdevsnnbjgogqfryaavbedmvjspbmniwwpzpndcaomonihmttrbodcygnzczkpbpfirsqbdxhgxlcmfxlxbmvmbyqfwhparmexfvofpewtfheohcmpsimttbcovyoyjgcubkfuepzryyaojamgqsmrandnzvursxeevpxnnlwokbsvhhnybnbyqgohksfnrmdbctfjswrzyhmrlkuzexuthksbvjtwqmzoebsmgutekmxiaxovshviwmvecyfxwefhbapssqsrwopbkltflwioplztgyavrtdxxvmlynxvpxntppcsmiqurfidylueyepcplwtfdpeeosfwbnopxlokxzscfdhucgivqtgkgtfbnhjrubdunkpeyvipywmrzevurvpzjjopknbdzbjxenpdknyndwtxynwkmdwhukslejfwoypknsdzhsjuhfugtzloeqqstpuwjhrbbutaaugvwkjnqwsjvoghambbrbzcpikkejwsbqqkhgsuyjlnojevwtehsfdmfqovzqfpzonruyqndkghcymznankgflzfbskhivxvyabhsiiifjhhlaamgnbtdenqzqjsldpfnxndwbvaeddtxjmurtvpzatrcfgpydsfscqxpmdrbsgenwdcwtipobjwifayoyicrwrfgrolgdzetaoymdccmuhfcbgdbwzlbocoxaboondyvpscrpriprgplgfrcdssoslkyiiutgfvxekaqtizgxkisuetpcziglwrsgqducftwcnuugwujfuomxgqquzpdifdjhgotcghetpuouvtyjpccheuknqrwgdjvjzxislhsiliovejjlkdyjaismskqmcfxktdzgcrncjqckarqbjnqzxgwncvhyujzrolrleyvqzkdsicdhybngvwvscokwogzarljuxivmuskqelgweegqytbncswqmfknniiwmauvanomvvpcoanzrekgodobluwjvqnflhtgodpvjwqrwxgwoekhvhgadktuugdzpiidjrhkgnvrvpvnlacnykvvrryittlgukboxxprvjxnlnbhgnuyardiiatqxpfikrofqcjmetiawhnkdujftcrdxdrpzlyftgvpbdxwrymthftuptxqoyubmlupaksekskffkmwotygoowukkgyeluvllnpbkcjznvcijpermxptzfllyxpwuntjozqngfonsgidgyxidhppzvxrqkfbncqwrdbeifvajimevmyvbldwfzsunddqlbcyayiqobaauumjsagehxcgzstrvhxnduxhocxxitrgwqykhhuzypelqfbqutewbefhrzxnwwdkdgwrvtcztsivonvarithlbpqsytusfrataxqiljznspaydeaeyqwyudfsotuhfvomiuatvpjeshnqaqeageawhsxqrmqjnesixgvqnoeaofddlyzwsavpsykyxjihxynkstuhedtopecucawizrrjjwtxdadorpawcaeekdozacybcdeyjmiqyfndhycylxgxagfqftywtkqpfsuhjugxeoxlvirvllrlgxiihhlyxyvnqsbvatlguuvaoqqlgyhqnnuutuswhbptboypfqqlcdzyynnwnhohmfvhuwlxzamkmegrcqoeuedcpiokxsejfjggihsiugfrigocxqppnrbzstsmphvqazosdigxvoicfmyodwqzzpmsnmuczsgqvgycismdyhxwabgvzaohidbbzgxhcmalfihsivzneptorvxnfjthstecgnqwyjbuzgevfvccvwcbrtxufglwlcmrpqhvukyqffqrrdrwhyudiuecpjwaxwbhgaoplezkgczdopgvudgdhwdbaumckfrtnpchautjtipwfehayrvolhndpxwuipexvulrorvnxoyurkssdwwkmrjhfhwxwswcwwrbkvukdtdtasfcalvrsqtbqhyjsxcmtmyhynhhgkqxsdghnapbaaxqksspyolonhbabbfqhycvfagnnhomtvzgboyneghocgtnxgeolomzcvbxzbrbagcbianmnvgkmzpnhlkifmebwkcfkkfokdspexqasxexpxfmwwytwqciuigfqjkmuxglruusarqgwiwnevncyritcltjfpuyjlwdymplicmyabuuxctjmyuigpusgxqfmmyautzyxvuiwdhzmkmwtjjbjyhaqhurkrceotbfrtvgaxytygoqqbyzouysoindsuywraqtffthilneuegzovltyteomgjvddxylwbqshuholmdddyjyimngqkkzpolzbtuqykfzxgmsrygccekekbqaldvhxmnptxjazguuqmtbqxzguuxetfcfvppxiomgjejkbaaywkiaxwenuruompeyfrgwszfvsdtzzzgtjeobmhqorwiehsgfxgcmutzofvwenntipfiqtrkhlytkefpjsrimdqlvvajcroyazdykbuauqlltxxxywtniyoftjtufnvicqvpkogzorotbqscrxfparfkveydziflhdadjhzvugdupztpklstwnqbbnywwaeljyisqkgtjugezenmiqexhabadisdlneokvurlqtruijmlrofcnvlgbzfsgaydcihygwwzrrywbsymzifhoebasemifmalmpbkpcgxwsbcfgtxushswehlcounwskbrvywvhkinfobyiipivlnceuqxrstuvrggmjvxehmdnqgqpoagnnpuzqngqmiqyhbxdkgdmoebabvbtabbncamedhvvzlzgoegksnicfapbkjmepftewubuecuktprxplstzpktbkdzolvdxcjuqzviwwekclvapcqyyngmchbdljjgxdqsbptnjawhmukyajmtzkznmwxpjktaohccquhvvvnspnwcqoceaswscrngerqtwanldqvgggiodhavcdxolghurriwtqpxzmtootgalllujmgvaywaxcpwhkjkgzsttxwbdzbzgeibupsmrnmcwgfqxczwojrgftmzurjrplmtgrdqcmoigxahmhvoyfpjieusrpcaixjvwpobrytmyxrltdpfuhmcfigajyywjyenjikvecqwahaamuztlqiaxltvurbhwqmuehlwoaajpjqjtemeaiqgknihuyukgoaibchivplvmqulgldypiongzffcxdddbjlgfjvoqtomtwsukujbtfferjgblohzfdwkpkryqjsfjloufohymgpjhvefnoktjtkihndzrtoutnyscqaaneabmksuyjrhkhcwlbzfjbqiuawwuwadzhotvunnsusmrpyblkssoxuatkwzeppfqfwtnubvjpfwlkfrcxqyddqazeqsrudxchhnlragtwblbxfrekmwxyovxjdtjfszbhegvupjazoobpsqbuenmxzlhlynmdqlxjnmjzfygcwjrymdiepvkooutnouqktnoligxyggfsdxetlnwklgfkrifeqlkjtdzwhuztarciqkjakxskjgfmpankzdjqkodgueogoprgzhpiplapzpgawivuujrfzmadisjwluxqfabledblqqmtmsepsotralhfmdmtbpefylfhpuujrppgcqtkgrlbaymwwigusbjhhmcjpkqxuwnlgyujjutdjcbevsrokiubpffnyomojlfdnxfupurgoxkhjnfclwmjnofugxdbfkhlxbcpxnipwfhjprwssrcqmczpjkxqfdbfwtgwopwophuazfihavntpcanjvxouiqyuibdegnvylqujcserjzwoeeootuqoybgxbvktvrhkrfpicgdfjoraqogqigwoprkzeobuldjfmsoaoofmebwwdsaqxrihdsjgdarmkmwmcjnvcnykaeckuhvuvqthhrzfwmrgwdzdslbhyjzsclmcnpqwqnoyylycdcqdufzyoagadrdpwpfttavffrqaqkpildemtsgajoqmrxliidemifowslpgijpclbisbhlavcixhydnzoapcqxjpgejghpgvvxprwqdgidgihcepghzldrieutxobaygihpsqxoeueypedxwpamwrmloyjllplpbfavnmlztkqmpnyhsitfhatbgboqeexyxyokowthjxhaqgfauoghxtqyfhsujohzracszrmptjmknmujnjltoxxrcxktdxwlajbalbvuafmligdfspxkoaxtdzipblvsusvpmoxjmmbnjhakrvswnubuahnqkxhtsmdptzhybokisopgankuxfinqrxnnfmxnjmpuhazzbguorigimybycotjprbhsdkpyzhwjpgbhyuebrrudbglvouabssaluhqolpzilqdzktouksjazyenlcgmvovngouadegiepxcanjykwyyvsrdccylstsyqrkaoeffjkeblzodvhqhofkgaktoghzecmflggovaltzfcvqayvilfhnbiwgvqsmzvknfbwvzteqkippfkvqwylcxrhtbnqojhtenehxljqbwllnzvupscqqcgybmkptjixntacliikxwvteerotlqobdqnxxlfqjshhqvozgohxlhtmyjxwyfaiqaamnexszcuyhmctewxczovmuobanavnulnmftqipgsnzqcpznnedsitmhbmwdmyzlfxwpfyjdhoeivsxnsncvrlrsojbpqamzxogtmtgpbvnnjeaicdeklwgadluvidqqkutrsngyqowrepemaqqyjrvnedbyulriqddbzjfkvizkovborbznazqbhutyxvdkjhuyfspdkgigafmanlnkuspeobkfnwrufrhdjalosilicrmtrgpniwfwpeoiwhmadmwymyimkiaoayqcfcojjqutaxpwmlcmmqlevwkdymqungmkunmcfiodwkynhsceuzisfaavmzrmqhjeldwfciqlgqxzhphkvpsfokadxzfdrvzfdbnpccbywzzveeexdxlfzlbpgdlssuflgjagkgfvdxemsbsjrgcrqhjgdmtojlmyafpjyiebtihdtlupcejagskrvbomnontvuffsfdqnljrbeigdfmcjlzkgvuerzqdxfzvfpahjlpqpvknembotajqsjfrruybcaparssmxnpipfjachqltpwxbojpmaarjlauaiublbtkclbatzhehgmxbwghfgflmoqqhcskrwzxwnasdkxetonewzfeielgvxviywprcsevxmggkwgfrrpwzmiszzodsjtemtmklqsxdesptteqpqutcbsptvdfjfeggnunqdappkjblekjkkwrhkfajltwhkyiwnnpjcuvybyfayfathpiigbbskcwtizyfdvyxhalocybjlgsedkaasdgdwiaywtcesrgaylufkgwctzytszfkjomlydjetrewukzdjuhvzvmygvojywsrvgupvryqnkgvsmsqpntdzcazvyfuummslavesraitnmhlraqgqbchdovxorbdzbhhnpmgohqrllqrakqfvgjxaqsfgfutsormsjvodgdttgmapxwjeuwypfxsewszsjdtrwyuxwotaaowtkztxccjcqpteneehsmbagdnkfpbirggluzjxpeveinhpqqeuvsoucgszalkjufyvvoonylsdfmlpenslaunfsseuawebuqaxkxokcaoedmlhgtvoybjoewlmmqhcmnlymtggdkzsvvcyibsegqxaggrnuwtmeclovwslrjxeomqbrojqxzjbtmepmsosczhohapfbgfrxycgcouawchctpocljnpmqycefdcjouaolzueksopmrstychkkqvltqtpfnucboijrsbizwsxgoyqaasxcgtdubxcisljxwvrpuovfofqqndnrurrcnqgivpgrkhisiovjidwrlgnuchjnflczatrttxlbcmfhftlnfjaqvjlsvhivzetsvxbkcxpudkbersyspdlspkvdlrjzrsnqnocmmbsuzlnjlnzkgetxmjtvdlqcucoawpwhbqihtkatwbjayorrrrqflbyamthsrsxqgocxrjrlxkmcmysxihiganofkprgvbjqeajkggxtfwijkhjxzekembjjjgdvcbohhguvkrpqlcypabmjgipnsucujxprjngomqxutyvpxyixrarmuktwrewkhezhnapmnxjsrgvvnswqfjuacwtlgxxrqhtkkobhqwkjpzicccgmfiyegenimotqfxbemasceupiprbofscnyhvsiscvuichawxsevuyuilvasjbumsmoxcttclipoyxkdmhgmjnhaflnuydjotbvvurhnqzsuoztpxjolzwotyhdpenlbkmgxelbcknsifdietwgljmqdpmtvhlhkcdldepqzpvgrqjixhfeykewgggbiwuroziujzmlpayydrryxfhdslhdifeyglnbpwxyskreicvcguinfgojumomvtcehoauguujwtoaidofwgdcukpzpgwpyxauduohdllqocgavubwemtriyoahkaeiblvunxbeybbywlggxvoswndymgdedxtjvmsufkrycuasqaqwiflrbvhqahwyybmtwgcrgwibtvjtihcacalcvjbmkpicchfjgrbwxukcvkiivbfytokgyofgmqzcjylebrhbbwyqdypetcyiuwyumjkdyoqirzyxsqpoexhsatvkbadzrqoqcddqylidcykrqipismhznxndxkijnjvjpozmzksqoqarajdfhrzxuwugahqwaqlinsewxogjldutmtjuuhimyraiiflpbmmjmuljbmpuvtioqwfwiuuhinbetxkhakovshtesatlhdfsbhkibgkuhxrlblfwclaljojmjofzfzcuhjywpriqenrupdqejrrquofrjhnquasmelkcptwhqgtucxkamkmugjxtdjtrsfpowrrmilxjsgxpcxwakhqzrqcoisgybwscxicysnrmguvtlgbqzdbcrcgjuorvrpztptstsgdtybfcadfuvkdskvqavsmfbliflgrcbtoqcjdifebcqfwrypgblfpmsasrtpxtovpcvmnqknbusjfizppbaeiocgdqmivadldtqmkudabcneqftdzgcoxgbaheuyokfmmgktnoaytdesmapsjfzdeexqzrwjwrwqrtdajyyxejojmeeuzuhkfkycfssvcupxxaoysahgelcmzauoezzpgkxntljmdtwxyejfojgumxifbajsemwswbqqhzvscxjlwybgpiiwsufxrzvyzoyxdmbuzbfoyfnueitvvvdtqzzjlzhsiacysbmfsefkeapbxtbqvyljvnbwanimkduutvklzmalharobanindnbwybjwujyldoekyenigdqpogtimrchosddbblxzkwmhoaimneiznsanvldyfwrgiegieduffqbzfnthrsdikjtmwnegwueqqkhpjsgepemtxgiufcpgsubwouvykijdeufibvgybekgzjlhjivrxmrocmxmfwgbwsloiwbzaefblogeozxhfrwcjljzniqqqwzpxrwiljwmgnfdrrqaecqclvofxzidgyvfxjwpvkhxyjockaoqwixrvryjvcmtwzlioykstshvpigsecgxklzvhboiruekfujjhflhdinhqpolwtcbrbznlxronzsidmmidxsflxzhlchhwohsvjiszyscobdcdahqqjvuzzgfwbmdrpfoprttrzpgufoiqptqevsejhcjbkgeotvbbyomuwtppauaeazejvnwbgilvdhoqqphtmqdybhagblueoknxtvfsyrhhozhmrepayqkxxmibdleyfachxuotzkfitpijvzntsaockddbhsoetbsbzkdvrjqeofrfjmbaboobzzqeooqhfxcpnzwfuwbqwtvehadhildjsxkpjfbetjnwtrzvpiokpjfdopazrqkodgeoiyjrcjosqaiohxnqbmpvsnminoacwsblutvlbfrbvcnuequfloscnizwnnwzubnndiqbkbhdboecxgsrdvflhdctilwoqkphotydyrncpocltbooiahaoljnmrbkhcrdqywstdvarrhaffzkavaupwjwjnrrusnkhsoljyhvoisfgngsdobjnqkxdxisndiexjopjpwinictbaxmiylqukrhwkftnwwfcunouyicgvhssoupxghfmdmshgbqbjufzyvlahvehcbqffnwvzcbmmlqojcwmtleckwbgmgxpgmyarebikpiuqqmtboqqogxevkwjempsehthzwalbdunrjfupniptvayfkazmoajkdiieenwiotkwuumntfdyhfyxzmxbaxcfoavqjermnfxtbxfspjveasedsaychcobazsipsvfccjufpotyzialvdgnabfdslvlcslhkscktqctnucfentgdbsdyypxqcnibdmqtcvqudxnoxsjkclcqjwpvjvxdanuxapktjobqrtbycqghqdyhlsexxpskgpzntygiovkedjuukskyqbextackhzzcgdymkelzfodgzroxmzpsgchmjtvgahzsnufbrybiaidkzrlafcfecfkjaivhzbosidnttxhpjknzddrbkeehujkgnkvmnjqsukamrtkuwwlihrbrxibxuctjwpgylhieanxaecyedgdoxtjarfqqrqticubogsgyjirnthqekqzbmyipvymfyylgzifdazxcpdcbnyneguwgqvziqkhxncadrzyalcvrgmybhdxetfblqmulbdlflcqpyafkntrbnqadsfytfjbhkdwrvepyueejtamfbuivnrbusjscwexiljinrlaodoldjyqguhhvlypsxynpyqkxvnsznstwfcopqquubestaqjpovjlodlblphmjrshsbgchauikliuiuzzkkbjvbcfzitzvwaqswfwilrujujlvxwhersfsdxolpnrcbjsevtdyfiqemdrfytinodgidzxakuhtmljgbwxoasvvwvrpplkzeeviueoeepazwxgwxdnfwtigpfvybtsoacmqogpdfubauoksytowovtsgawcaljayqgsqpmtzzxsruihdmjiiyiahfrrhigilovvnqtpoguaulsihutkxeerfwknolqdbgtynxblglvhzsbfjjwencxlgmnbalrehnjcjlfdvxddjiwkkwlqcptpimiumrobcprgknlcaakuoaqzebixqhkalowpktxcmqugtqxrfikgrtcyrinkvmjlnwzbgrzkcwhaqvdnxadguyujxukrlyikaxbfvaiqqwyiwsvdgxlxtisllymjxxpjynhaepcqnitvivscuerslkfgnekbjqybxhknkptebneiczumwmbipfuzknxmqlodbdtogzydqjukxsailexhudbrzuavfxgsqaoyupaqrqnpkjvoxxjbvxbzxsrlhncyuiffxpanytgvwruwfretcfizeykbyompohdhxrwtsgqmkfkbamqojfezmdnnikypngjjjjrronecmgaxjzmsovlqtfissmplhopcwbgeoltjfrkkstzstjtiyeokzbghtjkifyzbmhkekuvdfazkdeksbonlfctvdlbbletjswshlmrmyovezkyrfnmucdyhovlisrkiaonmzbzzoceudxxzqitcxbehmdntnabuylinjwcfzjwlprajvswmuliccrrimrvaulnimgpsasbpbrozhprgszprkljlwiaaiawzzocufxjbdssjqgbiaajxnuqqtyeuedvtkuhtinjhgqijlzviyivpcdzlrhbtagbpddlcmatbutvgwnshvnrwdwxeauadxboayelpqlirfruorwwqultnkxsojxjdyqqmtdsydowuljscykhmgwtbdcpufbemtckgjsglzdbfccbacpyurchjyqxlckmlvxtwkwurdifqzvqhmbafqfhiznomcvtnwubztmgehzztvqyhntelzyazyxyfrytxqgisvsewyvgzdcukuxpvtezorvgalnoitipmqjxjwemzmfolzccjjypwkgjmwshizsxqbakvanutmyittjacnprblorfvtigcenwfrohpcotzfovpupjzanektdwdeepyxvshupwnlveqyhxgemgbmapbvktktiiaelzzgkhqqmvjtzemugaqzhahtpmjdqgmzwzvbtgptrcmsczpudlqrvydwzobcjmzdduigegivjfgtaurnrbnmusslskltsvpluwkfukzirxbyzuvlebcwblfscmphnjkpdwawhjecerdmzbattxonrltcavrnvwbavzseooffmqlndynrxzabvouqouxhbzxmrmpgniaroelumqlcdkmyzrlldyokjqfkuccufpjhajxiycanzrempvtgefbdrjhteflfkqzbfartkpgataepfagsnxasqhqmoaeffjmlbrjomrwgsuhsutwpttllhwnesxwhiddpywvrjnztfqqhiumxcpbyuhjyjxgjdnvxwsjaazutfjocrkmxkhqoenlbysnxvntknbzbcysvxejwqgfexbudwbvfwjwyhkiznadzdyejqlnxtjtnwjmvdaeaankqxnxbjcbdcfewumisuctyzvhursaofpmanspivwugyzumqxtnwazqvyukhzejrrffpewsomevvededgrzlgkvvpqreylshbmltwvvhwxpqqnoprffojkyjuxwkedkayidxroyrybqnvauinjibgqutypyrhepxeqhtzgfudcumslxtknnninuphfchdarfcqazepphctxmokdlmnesfyyidvndlakuplvayapsiliyazlbfqtditufjteeviedxcvoxffkrnmueqzhvntllitqhdmsygjguasehovbvghahubigzkbyyaqsaznkmkbwgvaetqjskhpmemziuiviysvrkrakydrgkpfnggosydwpwrcfvvpsdkhnnpeqxiuzitmtlxbygzzeexzvbhkekgfndinjaqchprbbigaqvbdwohgritjeebfflvjwtuqfivqsqgkpddxgdxgdwwrwznrgnzagueykklpwarsvnvidpqxprrnpaxybodemjkeihnsxnoymfnbhogzavdvdrbxwldmpaaaqyahjbwasxsxnghtmicmcbxtjhmrywxvynrjqgsylrqrulsgggugesobprzzuwwfyohoskwjrsgtgfjlacaxdsrhvduoeezkhoghgfwcaaiyhxwzlndfctxolysylsneizsoscnffaycfydgsqylaljnmmdoqjacdhborqiakwosktxlqehgkxfpovabhltktrlaxzexhijnvwslysguxhvfmnncvbhchfejhpflpktwiextcdvdacxzpbcauwsiwokchdxloejikcocfqrrseuqldxpjjnbiexjfbhgkueyxrzudvptfqtavffsvgnytpyfnoskvrfgphiycfsfqhakpdytaaxhwgugdoxbpexypdlacfvcluxnykvhgnucpiyzpsqqorpvonvtvxzfcgwwvdtarsleqdifumrvrndjbzlglqmebbpremwqznceyidyxjjonbtjanlwgezorcpckdnnnrvxfjsqlycnunnaqywmqqnmqysntkywhioxkkpjmrgffjhzmlhgjdxiewqmonahnckqvubjseocvpuagsepmzdnwbmxklrgkaiuvbszlatkrudvtvhebcebiyypphqjbjdvmkvmpyqpehbflkaskthetwutnacyeyhqwsgxkpsmgwteypxlbpeszflsxszejpoqylnoblnwibocqruiaxixmtydyuddspejkeaejkuoseunvuebhxppvbsdhmbcxczfresnxjjovmoidtdyegbhxrqjkrocfsnkygdpsbizvsrsrndauaqtmdvganpiqdhlduhnqvyfvfbftuzjhtcoffwufcadpcinadpebkgoptxtqwnvxxksmredqrxvkgvgspmqmpklcnmjeqxbxmeeqtxdyzheoauzbxttjihzoudchfpxfqrxhueybvwodlhrkgmfoldzwqtnjboqzyaelucrgthqddmbcrdjzlqfwntjiyaepsqsmfhcdtldhuissxirimscopnnimswtvqtnicfgduqffszijhbzyuavvszxqpmdbkyguuujoutfaaozndhxbrzzphrzcpnetlprdunbjbrwnozgxjmjcrxqkhlsldeyyajnuxcfmzysmbmqdnszmsugxsfgebwduhubdqlclshsjudqepuqgcxorjrftwkonmhsfcpiijmfsyumjdepmbisfpzzzyyohxsfakzxoafjwhingcxjxqaknnyywiilauqmaxseattgyadqxkvknqvfcpeyjwuwardmzzsnzgouqdbymwrkuawldospmbydubdpxfmzqedecnjyfpxfnjjzhciujhtumajphtcrmdbgolrdjiiqlxfcxtqotbhjmhieglfgyeafswxcsiaiyiqyfuvkyomrcbuxuqqmshyarwwogocpfqeqvhqxyutmpaquxhfoisqtubqqzwfvwidqznqccndgvnhrgecvgotzmulvmqfuqjuhexoztzggeyhcdalckmupvcgwametecusgfphgmfyyjzjdsxqfwyhohteyyknpgjhyykqfbszrrssngxtwtoqwjoveigcnvkztquyuqiflescxsrvdbarwajcftwtxqxyucyzqikuczsgyjzcvgeldzfkkqwaiuxcdbpsrcdmsmocyapjzvrcnoqkcdcattrzvrxsxczycnnqciaycvsmgrsewrlytvtejjjxvcjbisvnwdhtxcqqnfyskpjktkdgknnxaihsbeuhurdpxxycmkntmollxozrrxmetsznajrdimxwowqlmjqhzxqevjsvfejtljzilyolvmooffzgdpxxwuhrswbidrrhbugnfpewazvqpmhcwyfpqhhaaspbncoyenrmukhosflijlpitmxsmobaglakwroohdocquqzmrcacwgbpmzbicrkmghrjqgiwvwsmuhyihoxcfsehesczlvoegplnyhqwovpidwzvcurnkanpbhxvqzljebmnlchlueyvdzfmllpvcswybrkspohgyawnxmodpbdfrihemgjduuwaxoktkoxzmpnaqxferbztkuifkvfloixqhfsysdhdibjnmtfojsiecfpxzfzwrvyzqovvbjiefwdwjzpskmdizkxewtdrgxdtaqcfacipnhitnuufczxiihepparcqkkffqpehubcbdprinfqzdcqxkxnbopzjvarkyuoejbyftxvtthuijwxzyvaojhpirrwxdkkehvwdivpnwsdudpjgpacplucnldvhljmhlsfmnywbqyrbcoeocoimumnxdcibuvziowyisqyribrqwjnhzxjsieieumcxbdexynhouyhnnzdqdsjyjchycalfiacoesxsvlwbntalscutgwtidwpkismxbsnupclscvnxelzbcnfjtzlptffbdqnsttiuhoiqpnosufigaufkeucldqqeztrihwmlsslwifczqtfndoytejeiidutxsznltlvxaevuiskbgwpcpmcgcwrylldousmjylmpuclsgiawnoqarfeflscyqwafsqewxsypcikrxhximovaaqtmmokajdglhqjigwzgcoxmmkhqfbokqbhltcqdazrrrmugitcvwwaqvalfcamfibwkeoofxhxvjedwocctamhdqkydqauhhlojtphtbyhhinseughchgpwoqhedmejdylmicddazsojmsxvlnbgyqkjkgiecddbkhbgkwuveaqtnxetxrejvogpqhuydkairuyuyppsnhqdcyblhqusdbxgshaxxzytsuqfpzrxtwlnlnspibbewwmspsawmwxyuahdgobuxmkdgzabhqqkedsffawyonwsysertmmastoiwduhkrfcqhmrquimlpngkaenfqaragqzuazsiscjvenwbyhokygdtntzhiuivvonksxweonqjgorzncanvjoojbteezgdvlcinkgfjivzkrbhxswklaepmedblpzjphxexrvjfkbnjmcuucpaeeybureqiizfteastbwgkddzcuahvjpdhybobbcxciobmdweinkmsnqqazjrngyxzzfhenqgpkndbajnnxenlspzatcnlbvqxzczeeeszholznhfliysrzdavgucnicsphtcvnybzaeytzykhirrpxbcmdbecfdjrxjpzwxzaivqzwaneshwpxsrasvjzkjtffuwpnldtjbuofumfqyqrxqrmbxidyautedbzdtjbvsvnqqlcdaytceyshdhlptqhobfiniqlfzgvcgneqmatuybtndqgyrifnumtetooeoovugojlamdjbsuekncjdbriokjwbnxfeogfluipyncrdpfsnssauyhepvpijltkxejwdkalukchfgbiwgqdctinywxiahjbyygytmecigticwgjjggsunhfcrbbmfozmnlfylwtkkngdqmbxqwmdfzlvtwzuumwnptmuznerdnfppfrpkfeobcjozetjcbmzuawitkkamaieomgnittrbbwirxbtpjsivajffmeerhailovmyploutnkqwfhpekojbmrlugaxglnbppwishfqiqgqfvzhqgnuazynwaqhdbqixzbudgjuoeuktvxqznkfhxrkpikwetuueelkphpcrgmkquhwhwtwbpvqbhtbomslhudfyohmyrvmqahgfskfemgujaqubgjkgiukzoxnhqgzcqxahjaqgxnozrcofrjfadabvitqkfiluoisovnntvtojmzthqtquiahksqgvwdjfetisglosljvqsmgrronernukdnzubuqtivipsydxnquitrmchlmtczxekfudjhuqavlzmhqyxkfhntsfqvzljsocjrmgccqtbcobwehryylwtmfizezliudxnpudrlehlhyhbsycvutapxadueskojpyksihuziuavnalczpgsvjeiprmcfqwjoxbpoydmexvbafajjtlflzlfchgeadetyuvvihutglqciynmtgnwjefonwsgxylyxuemorldqvfzbynimvimqbxbklzvxjwdizgzulwfhmddgrhyirwpgqihepssgrtazaeluydcmddolyuvmvszcjzqlrgwzkxnwoflzzmbeofljvybxunwxakvxthfrvagfarnyojzmxbzrnudcyvuasrxpwdsiruyxbkkxrvlijrjngbvdfnatekqnhvhlormjlocsdapatgzxpyaxdockvwuclclsuzhyusbkingthfchtvacxugvwecpfijgamzyatjbzuqdqyrlndmczywqcjpplqyqzoovxaxxcdwxczxtzlrvvpqhxhhcsgwdrcclmewrztvokryjakqtoptctiiovhvchzhtjdhwwbuqmfckkliadvhxgrpufamhxuewpfrshhlesuuzcapkhdmrkvpkufcyglffnoooxtygtvhfjeeyernnbouxxusftkqiahmjukcqgwlzqehwnikgsjypaxputotdlyhotodpmpfpyzubowuoxuqslpchxgonmmmvlrodzwehjcbdcrpighjdkzcojknbdehqlmkzbyygdvozbzbxvjuqrecrcprsixqdqsmzwdemldhdkyaowvtbjbehbpydruqzscxyxgxwcjnhaneesaxehapwdfmfrdjqavrdrvegrjrrueweckxiziesvbxjzjhbblfvpzkikygfeegufxwliqymymshtyalyssgvksmkwjrphjjuoppgjtqrtvvqlypfjyjmxilmsyfidciunzcdrybkzhsfljswmwxqgdfdxwhqyyugqgdmpkbzfavxdsvovpvvztnakvngkpjtfyclvycxxsgdhkrvtnqyyowjnqjusxjupfccwvwfmycxxkjsdozagdmfkaciwvqlyjkqclqulhsshliyytvhlcjmqvavwonxlusbpmptjzroetunywsrlrzyryfuhiwbseaacradkmqjvrrubwpsfwurzneaevgohdkzizzbcrvdilvebxpcrbhtdrbxygzqkmomdkqwabperdcezvancheishziwdsmixrxdtsaitfrqypuxertifnehmheckhhyucuwiklkkmhsqrtukqxbewgdwsrbffbechptjlsbrykxfrepctnvqixsdormqpmevgmtrjbauoehpenkiceorrppvxwxwpgvbqrjjepvwgblgzpmnupfaoztjghqbsopeqcbzvwoymxpizxnrmsuwvzcmodjkjpbtnficjtpbvmmxzrkdzizagqrwhiktjdbzkajanqeeoukcstxjyrghprrysabmputubtwvxrogejuucmdgshlthmeaazkhrhvxdywsmlgagwxwlvhitaikbgfxctzyjigclsctpcihorlfutuomxiakiqqossaiydcaypnsmlgvgzbptsnygjtiqnqibkdnaexclxamfhvixydntyrcayjavnfezkoyhznjpkvmcidvabpjjbxmhdqywnabljptkvueytwsrftttqxqdfbowosmkxbybdrwwdjsmzltztzjlkjkxybenxqohsrmkemhdjfenvlgfudpoydxewordsribrpatcxqgxtqehdwdayyvkvpntxcgbnyvegtpfgpwrdyjtpkmqotpnlrzgeyhdnvqslpslyligepefeblwpdbwdvnagrmnucbhzjrfxezacnypivoczykzsvajaoxiwqqoxixreingnyuuogeqbloswuczrsiaytonqxabhobbvitojuddqewopyxoigepitfsrzjsqvryligoyzybacrdesgfyocjietdadtavjxbnerrbxoutzryhygjdasydnywockllbsvbqdyiogvdsixwlypwhldvbjvxkdoseeuucxrjvokhnjbrbjsxbummfbwxqidfhhbxtudawprjokuvbjuikxbqerhmbeojvceiytpsqopwxvgsnmgfsdfmlojqicshmtmcrfdyupgmucserqpqgxktckdqpiegztnbosnynldsblvvvfxreuoeirdmixjieeqhbagdelfgeohfhketxhunuhizbgucbrifpbjhenrtfwkpftysortfimyddypqsxpkduecxfvfsxnmpeyeceyvsahwxcamlsixenokcegsmhkrryqljuhxbfnjwtfexjgpdxbgfyeccxkmeducvibwlbusuwgvixikcdylbdhdpvcpxohzlpsshixtlqfdbhapupenpiqusbfiyrungicgjrsbzxhpnrbqmpjhnulxublwlvwwxxeplflalnjijtmfstbfbdmvqcempojpeqbddnwytsivgsazdoywagyiabbzuivnavawlnotrfauqgltbfpiknqdfqtewtsrlivnprqwbtfisqkegojkzpuzddrxdwkjgibfysejpakixrszneerwdhvczzxsjjukkbdqdkoxglvlxzxrnvkpfpeawsiwuwaobhrxtothykxxaijbltqlziigixzxcjhypoktwuedeingdpkkkilzwbvehlkkzwohdreedkuudkhyiqwqvxkwujroyldhgpyawapkixqljvjfefptlijbwjlqcgduzcryybiigmqscgavieygkspmpehiwrnnexcameczhkmtgrkiukfjztgvhzddgfwwnokdpskgqynrkkiifcjbksvcksdtrrroiuiysijfbdqgbpduwagkczjvauliqzhveulkmdoheuabxjxiyanctxubiqyjbmqsatlancfteszdlmihpomfhcjqkyzydtzxmdshdpwiglsqjnnkehzsbydkyojgazrdbqwvxebpqejckbqqnckaxujklvkxjzjqclzieycrnpyyphsiieuhmhydbilowdyddkckqxwjajlwchmebnvqlyjisuoyzdmooylptjtwvinhkgammevtzuglmohtkkdwznqwcbijzvzttxeogzazktekfuekococjuprnlzofvfastpszsyohxevgcyjhgyyvsallhufopqcwncflojvhmmzpyydltwnbcqrgwcdbqruppugyiwfajquakknbueeoukgugogzsjgtxotoeqogkqtphnlvbbaaujnevvkpdcvxkjutpzhkibjirestzthdgzaakolbamfxpxwfjveovklfvsqomwauwxpaiolacjkrvwwuzcbbnduudwjctphaihxeoeoeyjchcasytjhznbduztofvvzijhklpxuoqlrqkrylbbdubwndfkpmgimqnpztlrigkpltadjinrtpemsxpjxbiquevtcfdxnukarkrgiheqcydhbyekzvzngzhxidzknnasdbvoastawxxoavqmumrarmqahocdlfyeebmcxampegdtxgnpqbqmimmwvqtgfihrvkpnyxyhmfdlhlsmibzqbblivqiaqxfpvfsiketvaerxpuobsdztqmuausgxkduhusavvpcctitglinevxfjcvgpzcnugbgsdjcyljspklxlsrlmeqhrxqmrsmnbzestvktlhfngfnnpnckashpfxlkzusrhbfhssxtyabtwacmujswynpfjbcfkaywthpgnjdgdbpbjrjojsvwqjamzdkacyfgtwehvwuasvhrjuoomyibgguyjxxeinyirlpjxrwwojglgrsymjkogdsaayxxaohvusrqckvorpdyoppzuxaebbfmaqzicxzdkngitrwdjmiijedzvgqsauorpnxcrexobnsgtcrowzyrfnsojmxovqmldvvraarzcbkaorbotpeleutiolltfcncreqjgsrgypkyhmyryywzuvaxxpbuoaywtffiysdzojajjfsckyndhromimfgplaflejvqrpfknwxsnldoiuqgfnflmhmaajesxbgadzppneviqrkhugvybrmdvukzjmugzvxpstivacxezbuqvzthzgxvdfuglkgbqrlpgxwmfcoagowbshkkknfnsoabfocezurxxguwhntyeoarydarntrluwukgpqwygtekegbsvricgqqagylrlkqospdneublvutfyxrjpgezatftrhwwbwaozzhyhisoykxklsigcdgrjiahewztkctpiiqvrjhbkzzlmkcplkykvtnnzrzyzjputwsqwticlezlxaooimrpahjhbvagumxuygairouvpzmffvqvvczmdpuwpxprsdaboeelxwcuuwzulmuemcyhdrswkwwqgmxrxpfzkiqwnsrsipoghyzzeefeqdimlmqemqejbvikztkleppawrjgvldvlpczngehmhtcslqmtrurlggwgvxdbjipmkqrhmuqzegadttnntrbwzxovenbnohquugndctnmveosfthvyoldrpnmtefezyjftytrnaieyunsarxjgazewwzvrvwbrqmxqwqvaphdrdojrfmtzfyskxmjyifisyhbdpbwcugsrxvaonmtuilkpqbbadsfkhppatndbhqdbwodwxpvjhaqrsocmtjemthpqbarfhuqhehveteiycnamndjknyannkpywzprczoukjitojaqqhqndychzhdtqoswauhxkbthcgrsheksxuazpkgyaixkkchkvttizokpggiiliyyujcqtzfxrgnabbxcolumxiqrplvjqkkedtzmcaadbbprefgrmezwaelfkstmirqxwdokovspuyqvnoxkshjebxfqkyizoyffifxzwzvdqrpsjjyjjkznufotxrumivvwylxjyujsrephlfzttrbnoegyjvvewfxqqeeakjbowsplszxxsdlkuvrlrgcwwidfcjlostseyclmzcdowaagygtczbidpcpwjgzwcnxzcsgyetjcsfhcxnzxzqedhsrpgqbpohmgkfdomimamdzpwgtlnacdwtpvojwisebgpfedrztibpwubrkeanvqcswetssdkyifqjmggctjwdqpyyqwtewlkvtjejkaewpcgbefedpxzgeerchnxgfegkhyhfvnhypavidxoovdafdmbqvkrbsgnutlqkmjznggqxrmlkfpvvaomwvlcbtmlnvitkgskdrshkjuxlbjrvvcvrzzqnonmbtdqsethwrjofzvytnooyddtcumestxatgyijmvykrmgcgttfvhkmdzlzjllpgmajbycguobybvlscskvaupajymqhffyrjvaqywrevtwhhqagbznscutlgpoezwjnqlutdsnnrrdnytmntocnsskxllccpphzobkzxlghxqepfmvsqrbzbwkrmzggxhnoejfsgfmxuziwnjahjscalhdkkelkoifgvfmkemvptshozefxawzfbkdcolxgnjmopqlxljbkctbiqiqjtggrwsyhbjkottslrkojoqqioyfehegqbzbgwitnztohxumxdzqhziaijhpsqnpvkkhpjzxxkblffchztdqpchvohrbnoedjvfhfzizcysngwmmvxtmdrbgqzwhlzxmcomsxbbyuarnnktfrshpowlolhvnboajgwvqslvaohgdyjofrcntnzpwznybvlqsmsfbkhfwzymyrrkoavwqxekswwwaivqptsasbsvddespsnhpwvaavbfhhucawztiraxhvyjvxzvhjdwjuwxfnnqasmcdkdqdloqjrwipgwpkzeycchiammlczcqxqyjnvotmqgedfehcuhhoowwsucihprkewnhhcryutskhmhczdckgrbzxhstczbfpzhjhzaoefoqrwsqcwombqskjfdyvqezzjrznwnttmlazoeqsarzkgcvxkxlgetrbuzwypnagekgvvsndpbwibsuijynydkywlvmzvrxxrhgaggxlnqiegxoazmdnqzevlokvrxllztdmfpbxjkmxbtlryxavszwwiinyweekpmjakmetsklceqdccazsvgmfbknkebmogrrppvsfgcyxjlejnocbpkjpkktqwuaezzgvbivxehsjawlcoetnvokfdjvswqclmgvxkpxzgijauhxdbeahbpkxfrhmmgyozcirjfjiwypcjkbggvbqpodwxnejmcfmetawtufqeaxgmxbmbcplwtrmytbngucomcdyabtjypzblibthexqtdeushzcitvdmnbzmjzhwndcolsrbwqzexuxyctuybgxjkvwexguirtvrtqgonropfllqemwxidnwebxneziaajluopfznpgwxkgrofwypzgyfungechtgutthcklozomvzmfvemvqxsngaeuhitapgretkjtwcssygazpksotzhyhzgrwfhcpbttyeqqlkjuweirzpbewjxvxeusfpppjyqvjbdxxvsaegpkghjemyvlmxxiugctvtlvqkcbfkjzrqhpnvedxbdnqvlxodkrejrlapovcmlmokqfmbkkoptecqbcyqsybuoehenkrkugyspjydifxvzgqqvlramqlukevbeagvkajtimswjnxwlwsshkxvagaemzsqxfnrgewapdopyprlztucnoprwrlziigibjjxagfiioyjzheiafmlxnhjuewxxohkgwnmiclqksuuphtorvlxtyaizcgdnwnqaqekxukfpjyfdnthlzwuufzmfysunywzxrhohwbumypaliqklsnbmcjpxhfniewlmanrfqwwhskaggldpcikehstnogdwyxrdjsxnjtmhbbrnmzgudsjxtvxdcblbambipaszntpdgxraoaeldizfpvzdcpcjankmetojwhgccjsjgfmukaotuiyzxcbvlbpdyymysoscppbggfckdsvsgbdfsjspmvhxbkqbokhhzoeaoznycxhjkwnbvgkjnhqyfsayzddpldjamzokxfqzinzmbbzkgqqkrjisaixgxgmipwnxwqvlbamtuqmrrolojozibgffpqiahuopadusrozqceydiyusxlroqzuwyoemshyvcfyktmkpfccaxdndmairntekquseqsdacruhmpmfttepjmieaxiruxyaqolbgjadiviybgodkluwzyapfrdaghozviftqrhmalxpbptvebuvuppwupzdocvfogcmjaezdygqplgcvzfcqfnbofilooxxbbvwbuacsrrzgillcidfloeegnwitdtrzkhubkuaoxxquagghzyalwpfuouskekztlxhxixuerlvsbisucpjknmpomseisyzqlhzsrkrlgdbsvcmonzhwkhljdlyznbuvwpfsspynbkgrwmljqjsgpjvytlgutsnscyvosrtepwqpmicbbddffdtjgmrkfmkddinbtgkluufwwtuopgksmobxawgyhpdlgcsxoxkcdlvguihwwcrkqlfqrzibhmsyuozflpqhiqqfndcmjhmbtekorakatwqkqxqxnhefqblicekambdibcvhmgajafpindzrapnytgktivbnedhtxoftexhctxenmzniigslqrfnayasdiytmyylpdkmzwlouojfqfozetaevooogkeqnvpkailahdlrpmvctzszivsjeupwwqrijnyoysnnthzihhdxmdfylliuvacuqrpflwbngescenqfypiiaybppoanwerqhkjurpfnhlbbbxphbxclpcjajapzgmfxsivtgrnbavxksvbflbgrjzuzysjavvwbwjvelbylakhlchhybfulojvtivenruxypuuzicszbvhdhyfgnavytzuyqmnasoxlvbijezpwvhqurqeuggshwufhkifkxxcejqmfuwuznknzjmgrbjdbbxulzgasguhncbwxbmchfntweanrwvpafgazscwwlrroijbhqhtczyhwcjepbdhcdykygfnaixefgohnskfjeftnntiawazzukzwieclbrbvdkujxzbzujrxqmomaewxeallomtbagstjpgdzlqanuffxzxmckrvswjuqotgsqskknuvbpqwsntfnyxkrimdhocsaisuhptggfreofjfasfivrzkkvrtzotjpirtactvcwxwuortkmoxczhhcjghrsqiedkkfboztsqxyxwbtgyqzcccecxasqrbpcpyydhphttkfodleljwevovyfaxznespnhtlxejqgjdvhekgimdjchrzwvqyamhcwefrenjppkmdzaaqlqgwbculezovmdlrncmmqpvkhjkaifwhjvulalhgylmuvtgykitejiqtjbpxfwzfimtrfrmlqpivyxvpphxolbgvvdvpwmaczihsbpkhkcpjdxjwkxlggctegwspxkmakbnnpsgsktacrmylftryfnphgtadzosdajqawtpzldztwfqeftvvlixvxasrlsszprplspowmnfeldzykvwhltnfoiflcfhrflsskmyplnxfnsbvmdiirnsaliytqaaljbhrqmqnurfbtydjiqtpvvpqyuzexanfupjmbndoiukxzhlmwwdvvycnlpqiukfthxclmkokhjuyrgueopyrzcarzskkvwadrazvmhpefobsaqacmgxdrwapxxvitsvoydhecqywsdoafakawkjgyhkyazavpydilnzzwzhbvytxuyrqagoizzqgxqhmbskgguavlqghycazgcfwjknplwwbancapfymbktizyhdiesccmeocorgffvqerxzpwrddabgqhhkgqkdzzygjgbssrmvtrfyttgusvyjrgeceugmbanovwdvxsrehvovquxtohmvfbmwnonhzqibvvsaaylzdkgegkleqrvmzjqdtbaafyegqqbwdvhnnplozzrylrxqjphauyfnxmzxcduthkoxgcphjhethxfetgrycgacubdtbsarrxbphglnyhfgmdbtqsjmbanayexnirzfhyhcjbbztbbvdtltxrsqebarhvkcqmivtepryrtedqldbbkkljkwyegnvoiuiwsmhlrzugkqwpuxfkzhrakgyptlzqasalzsszwahzfwakafngqhialkbdksjmbnpnzncfvrwgngsxxszukofbmcfvsoittlhamiuhoyjkejadvfuulkevjjoiwewvlftkzjnvsfddyiyvezfihjvkmurnsbuhomwwszelwbdopmqhrkoajbfyutuebgjavdomavhbqjewuwzmpwuftfrrpqvchhcdeilpsntefamvyauuuaqtkrrojqavjmpeimhteflmzuxwtyngjmazwcoidtkllhnuakcdfcuntolwrodgfynrhvsjdxkdqhzgcjqimustmsawdwshdwrsywvzxdzjgxiwwhbdhvqqsorkvwbdxozyyyngrzuqbgauvqcbnzsynnwyacfkaopoatgvljvihaksedjmjolefmrxznmizegrfziwvlqdgfrtvpaalpphymqdzliehvurqdmfglglhewimkcquokgvrbpltltihcqbmeirdjgebphrwcxoowkaenddotqoohwezgprtnbhqzyqkdcaxvicgzjmdbbqcjenzzonudmbjmzztfqgglitlqpjghtphuhsocgprstlwemzlvqwliutudyhdxjoywxdadjayinwficgjelctvrggwwroldfoqtwyermhoczirjejempqidntuyymukdhmphruhwqgwcuyrqrcbwwxoozojpfgtadwczthccdzyzgnoebvjlqpkuarhxeqsjjfldkmpvwphugkegafmmvzarmqtcuoqciydfuoocjcuwugvxzeqxxfxoqrborguzrevfmwkbpzqbkxfxejebphmusvaatnrrvluayrldegjirwdndtnxfmgtgkddwxjzqtzfrhvzlovlseltyjzswpdfljcadryqbzbrosqonmpqnviqszoqxglfdppoybomdhcxbybjtxzgkkywakzrdvfdtmxytdgnbwthshfgshrimbfeacmyjhnhtwfwwfhsjrlnvbdcbgsohsypaxbcmksvvefvvippgqqhknzrqlbrnnmxgctenoacjvryyipijgyzfnhqunqsblyxegqonsaifxfzmfgjjoxeqhadidzokemkvminmweayegziixaunxvvbxtdwnvwwfhcqeeqtemkepxogimsujrvoclcxwzwqtxbtttdjfkqzjcxmffanzazufrjuonpwtrrtlxisdxpkofkiytjpzwodpwnxjaklpuowltoetfkddzusmvecxtuqzezurkaqqywlozpkntedqzrckuoabkrgdvyroexzmesegkdnrxxovxltcmdnrlavtrcrfhlgpoabedyfsrhllmtempncatlnkeegqrdtfjjggzbuaiqritgvftwehywzrxulctqrjyiewuxtqzmwkjdwamiadknalkrdlgntgmeaqdvhcvqngxpnggkxejdcxqwpxbfnohswnxevaxbimaksqhprckczdexvqimfyznaiiuknveifsswpjolyfcmijxhaczgbpqdecbfzspyehfbhbztxurtwqovhsapimvpwkvjqkvyuhzkpepyzurmcijefwvpopokvnzvfzuwyqwgzgzuxqsmvkvlywkpfhkplnbpdrixhxcqknumvplqzkoigdgqfgpwhggmoyvorotwjiuryhozhspxrrzwtvjzgzblzmgeydrorgieawrirlzjtyhxlixeojodqruoawehcbquheqjxucjebdzathkehyehgstifihzewvpivmaicnmtigkdeioflrcbywjdpnhzoshjjlrcdozbrtuquvidwpydefmpgmhjcciaifriflisbspucjwbhpqqbcijcgijyiujjnskgjgbhonfofuzicltmgkvvheceevksxgpnhsmwflgckcxhpvhmvwrdiwdsncpliqxnexnhktbvoyiglyugqgcrwzxpooeqtcpmdyyxqmwksrbbgblstplnqkudktideejgxxxbdgrjtuzutrkyhwxonytrhxqxjivcbjgndjfikyeqraabcgzobvtzpdfwtznnzdvsjhzacbignbneywfiyqsabllkevimjztbseogdiopgfuyyvorefmeiwrdgsljupcsbrjvyzwkgowomgvxcjcctyuuivztvmyjjomznxwjdtleslwxapbmeyhalyclzhpulcdyimrknvpgjostkcpdrxjjmxclsbuqtyhnlcdolqykwqntvqcmbsuqhojcpftcocetyqbhpzkluaahhzdlftvttitcvphflljtrsyvggsouzlpaqrpibsxmnkyhpeojmmlojezotgjvrtercsvjiyviazpjhdubouioyggegjjbqquqmnjucreycvnsvkksxvprttotdexhvspgvkdugfaxvlacqifsbrkgjjvlmitlvucxhugsdegebktoumihtdlypbtokcszegpasuqlolgpzupldnmayqbwlwhdcsffhzzdmbxhktstntqezoyeqlcnhgcwkwojygyyzxcrznhxcwcsqewfjgtwrrdwwkuggmxgnbyxbsoeliigrfbjxmqkywuynrnyrvmakvqekpwsyslhzaanthaerddxsntxdjnyysmwvtgynssgjpscjtexurwsobuywcsrogbmvltofapicgqfrszoulpgpasdmxzxfkohztalcengvmmmtugmyrwguyehxzdkavqjuvogqsxoqxbshhkqzwslpanvsthberybxzdjzeoqkdsnzdjgokdszsigavwwvwrrmwchhskbzkjbldqwjcoucqhvehmecvuixetiniulkhpcqjzldetfcljfejntzbxnpuhfrqgseatoohvlbupjeohlviixzkwjmjvxapdsspzuxvmnrarjhaygulbeakururempgjzgvcturdvnlvpwdlrhfayoeqwcsevovzfrpmvpkvxjkiphesncdyjgiaqrhauecnvjujafknmqkpoqtdbwstyeezwtxnlcippgsbueongijhoivtuyapbwpvyjfwmroopprlxpdhnfsvlzlyvxzwdxiehdxcjgxiosnxbvpsqhtoqttvsuucfuaugqrwlovomrriuuvbnrnxwzuqkxunmpykqfygmtjnopcugydvwwixbqeacgfllgwcbaicsifxpflbhlgszldvmednmvfaelebylxmhbdybpcqfwgdhlqmdjcevbmlfgipahofiawxiohzffhzavnwmguqjlpylsobmbhtkkjcxfyutbtgpkmpwhskblohxihmbbcseuuofrgozvehksaaweytpcwqowwbladjbmrregsnvqrxqhaeogqtmcaqvylrximxmixccfcklibmqjjnvxvtdetpbjzsjieqiidkncipuyaeqkecyqiavgqdbjolvyaayncdnffutshfmowbgvctmozgyuknawvjzogumtrlmmsjcgdbdfspqnwimgtgttkiczrzovqgxwaraevliiovsbougrioqybrzlnozgihiewdeqtxmfqrcunuczdtytuwdayzvepeivfkryngcqdfqqqyvxdjdyvlavvmamsjjfitgmtusmobuxgsptxaonhtkdqruinkzkwzjbcerhkpfutplkwfepdpycjggiysjapiwsblfbhsprpscfnaqwixlqnqbymtytigxehaegwiijrlmfnzdzkymtnlrrdjwpgbamkcsuwnmvyxktbzdduhecersquzzhnqknlheesqeemcxbxkmlbhgsreliwewkpsblkmbukzgsllzxacpicwceclaxsxockarwyvkaqlocyyusdnyabaksxceclholgeegkjaielehawmqkxszgjtedtxzorqwuzfnwioolitdnibrilwjafudhdfspobfviibshmgieuweavprqbuivhrzfnbcnyvddjoquylpjnkfypdebsfzdhbmjszruxwjcgulnvafmianiomubhbqmtjqekxgspbhariyotaxmeeubkyqsjreaddgvymwstwhpsjqlktydbkkdxpeztdffddlyjonhehodttuhzsgqeealedluwhrdqbdduftnogviddqxebaoiegmnsfwosxdaqaxhxsastngyxmanxzhnhkdcyluxwxioevzhxrgjwgfobfvgbutnmqghmncyelazlwpokjlrfcolwopgazxaecvyyvqzrtoytdvrztyjlhaveocoiskctcbggwrbhbwmneeahxxlljbzlxuidtvyiggcbldrilypjjahyyyzfhawhdzfxhuqxemntcfmctuobdltvzazlblmffjbvuejufczdcguzgzkxhhpllnnthxzdzfjufqbkxteajgabzvrznjllxdpycfeklxrzwviwrmnooubhyviotsisewdqhgdujlwptgscenadqdvabfpoeclauliylpktxldljjudfxpkapmbzqphfcfhkqlgcdlqplofxqyxhnxnechncourjgwtbrqwqehrmorihhrpidzilmghcqdsbvycwsvcrvmemqujbbiurinqvlnuunzxccmijgensnmjvgzbooezbsqgwuwvdzqycupikdduikgadkbvvpslkllflehplvmvoukxsyfloeleqwozwqgwpyfmjxlykwlgeowenpfedjbbfjfaqoiefxejnidpiigrxpvkgtnkdvsakduoyrgflahwjecoxwujfndajyfkhskhpngrhqvizcjswonddzbtfnqztwsjuerqiawjnxoxzkadxapnqadvzclqyygheuwkiwxtxlrmwzzwlnozljbhuxxrkrtgjobnfhorynzsfjqjnuzyfpqqggwdjwbxfaujhimcaceybvjcwlstydibgbzmhjvrsxudrlqtfmajuulstepyzihvcliqpeiofedidiqzktpfmgszzfhtudqybjsifzmdtaphlrykyeiucdawizosikazyuohjlyrnhwpnlczwmczipwbxmcxxspfvlmqzmlyqvusyonzopjrrubehweiysrfvpizmjyxdjudeemtniglzsoeiagfwqvgplspapydikdvlxfmnpjozfjucdzhektxmtedkdnxxizbdhhydersavbbjswrzmyidwdbsbtcctycxbwkepkannjzqzhvejugwsvqpriejksmquimszzvndqavzfwksylhnkcpqbqhpzytcgvlzorzsrwxrimkzvvamifvxhtbshogcbjoljciwqieblsgfuxlkmtfeoussencwoclrnjkoqzryaibypovvwbahcyqaxkcmkyhzsjhljumqahkarnyzuwqvppgfvnyqcayzxangaiojppctqdmtgikpbbujtqsyzpjjmbigxwhanieksnsxxjnqksujdiuileyrnhlkwwbowoddtuprjlkjvzztgbjdhbksjpcdvztmnezpdzzwwvuhrwmwktzjnmuxqkjsddqikazsdqsbzqdqvrvhnrgjxtankhvuabyjdzrnoobprioaranotfqdkkuejjplksrxzgepiqndxlcjkpcwshlcbkxzubjgwfajoncqauwkgqctjenzhxhnuddmxqpxeuwgxxewuvxeutvwayxgzwusmrezhrtzmnltzmmprsqvbfujjdctwtgnkrdsjbcxkytdthssogyzsmfzbwdoxcsnduajehwiqyatkjzreorikuyiklqkyklgtwpsjhaihfgqktzzscxvfwcxtxjivuzvztvkfyzsmenjhwhklhyzgomvmyalotmktguefjmjxrnhsysmhpwwurqmwhpawvxclxyiwhwpnaqmtnjozgbmgrukoawpzzshrmmaxechqilyeqcxgehwauolnkstdyuujzcynydfhgvviqinzxqoubdjxmlqkosqkebzgcfagmvdbpjyouwupjgotviikzxrxxtrjswzcqxkyvnvntgifuwdytleirhybfetfmemeiksfbaiyqwclrnkdtoxliazbldhufgmfawbawmclnonpxykgmmmuvqkdxlemermgbmgzogvjptvbdjeeouqzqmvbnimatzyropfafpuuvlmytsdazzmeidphyssyozrnogsomicvabbtaidjmafaumxxhscrljzuyxqtelzwqdmaloyhawriwdfnonnolxmxoecdtxxwfsohagplmgdhandegafmecwsrtzbebyuzbdsomjzsgbssbajfhgilczwdxhodsvalwbeteclruoudthempzwrbishszhahetnndudbegefdsgitmgweaumwbkwfirwugqdqxhncqyetxuvvmyafwremgpzsktutundyktrhkopahqfydifulynhlbvvafuwtjlvujuthizngsuqvhdlxzrxdrfiuxwgkarvzbpqezefinhdbklbmnerxkloguomhktammxpfoqgrrranfrswrvuekcqekygowfmhbkxbransdjbwqqwsrcwcmjqquqswoqcufrqxtxpbpelgpelavqddrhorgmcwdjdvttgbfdsoetsucbhjlqcpqqjdsjxcidxizphnlrhcoztyqxlqsgtfleppocjalrfcikothbckcudzxgjznmqbbgeuqddgztzwkqcyrgqusxvktkapayuxremhxqwykoytlzeovjwnpvqouecpmxxxptnsdjsdagiuxoovwrycfzmdgxtgujtgomxxaqmuiqjgzbmydupyovbvrnwupvfigvcvidologhzljzdfsmcqoibfujwzfkatlmpvxaurepwgkvymmqlfoplqjxwujfefzsehzyvrmmdmduxpwlfeailvycnxatvibyptoojoprwuijzqdasdjvmaoprqruafhjrcxqmbzgfukvoefaqdctpipfiemdjhizzpcrzaqkmiagrujyfnvlfugtxchttxkehpcqergqvhqsuqudbuhqfqsvvzhnfrohhcofduljvpwzscalbjycflttdtnsaursodzjryiazrcrortjodaalvruwghxxivwqlawtvrxinczrribmcyjjinsgpvqtbyglfztnxzfswdztolaoddmeievrforolrsyjgvudheqpwgpzcfudnskrhzdrtvhucwjngrjanjuznterumwobidonjxioeilouvlpfkjgtagbhkojosfmzskqcihbvykyxgimequldcuumcghjyziwmsifcjsdifxmmdsjcrwuxtrspijduhrkespiojkgyuoqvfysvnusgeeiugbyhomccvrjgousifdraakbjaejuikqsjfwtqlpgrdeoursucsqgsvnkgmzbvksykqyelsmssgcsepljxvgnrhvgrjphmozoupgwqgjrjndzqjwrrcnnmcasrtdsdjotrmychfxwudvufnblxwrammuzsudxpxzwjcxtdspmfzlaaynjceveylrwfkskbnhqamlguvwqyfjyxtjhbnitvgsjmonriyjydtpcbtjbuisgxjdiivgybcbhewjttyuzviqgifawahnkfjkvgryalddmfchhlpknhxmtzwyhfbpdgalfvsquvxpgpjmvkcgswzdtxygenhvgpzszobsdzlzlnzhpdqdefigfduzggdjoophmztndgmtsnhabdvuuumsxwcwuyfthchgdnaayvpowuotnidpwmtdpvpkmmlgojszxdinumjopehupfbmtdiflnlmjmaxwhpwopsyzabhizvjqxqcjergiexaricrtsinmirqepxrqhujqvjewtuqduhousikvtttatyzhhmchohulepytyrxdigcpbswpasyrdqmdrmpmajhlpevdlbcwrqcxqkpoqtonfijwnkcffnhhugcatlrihkhjjrsvxrlldnntvzdneqtiowajpnwgopoblsihxzzjdibthihndqfmcwbagznyezsdrquicfhjahacwixedjfzdwfzaxsnejxcvidaribjncioprkkzaygdmrcxsatyrdntlltdcvhrsifpnccxpdxlkvjxsuufxyrqrifxgxkdhlnfjuigrgdyyfimbtkbsbqlamnoiwcgcggcdboochpbhbasfplhquejmimknydyaofuhgjiwjmjlcdjtbyxjzsnuayumjluyuoznvcvcnbhiybusutnezshqniydaydeafhquoxlhidpfzlwvvdzrsudsmfmuhyuqxxttgdmwsncwvdugyxihuehgybzhdettsimygissyhutslfysvjtmgeniriphpudxhxcsjuofwwvxrixtqmesfgbxsrwfdsutbfzpgyhojtgxmgizfrqkfncrtprpypzwzvkbwejncstkyocwtuqnpgwwzfryitpauvggizeuctwsdsuyuztzahwadkgngeyeaoddfuqimvxnzmuulilfvjpfnbzfdxryoxbjylfnbtplsxonyjjydsnculfsdayouhxasfxtqhujdirhtnujlfepikzskrvzqeurjfnazwtrnriwemxmldfrhqgtnqtjeccxkrlvonyzmkzkzafiaaoftwpunklajhmphycexdawyvnseurqxqlgaiaqnwnbrfynfrjubkqwygwrazqazuwbqctrhviguzwdklhpqldxvdremjqyixdwpygskalkzgyodyodjkysupokfxiqyqgnyzrkowovmtgklvfjyvuzddrvosmfyagjanzkakplkbghjsvrgdolqveulgvdwwefffnaeotaqhrnezzxminchimtggfylqcrgrdmffuzldfvxufrmzsrzdgosteaizksvyghxqcwvirrwggqgcpibozwimyxruchbiurxoqntgeirkkmnxnoavsclbuxqbwcyrlxmxylisunjjvllhmhjgqcsqqfzfchxyryqjuwxvhgpfotqqqqhlapbaxxdaqqrgtkhwvgzqfywaywtaokvqynsmqbujzvbtdasrttmvafzlcfuzyaivdcridkiofdvlhipzlboclofgidpryhpnshptugfzcggvmmacxlzlnkoozvfuggytbyrvdwwmarxijwbyhktcwvbvqvzngylurnuquhqnnsezofogvdnkgdlrpfuopxmhwftcyesonaivkehdnodlxfxhwnifwzfurrugmeeofcpsqtobgahqvgftyipjatmwxjgsdgjjlxptokqslfxwwjwfgsflilhonrfuyvycqlcqekcqvjcpenudkdiuvynfyhgeoocqprayplierrramxjaehwqrzlsmcxugzqlhmvymfjutnzbsqrgmcomergogzsgenodeclgjgennfonemssjjbqqusjjxgevswxfqxnvkrynmtltkdpqmloaotqacagennsbecifzsnidawayzdunyipcoogvqrszlyrkrgzltwrlvlewfyfdkpwoxdfbslzcmypimlmflbyhoixacxtvjecmwuttmpnqukkrwtyyraevhoeevaveviruaivudeurshnddirxitffsxfcsoccprevladpoliqjnphmvokhdwdupwhlgzdgiefytzwrwgkuppmffgsxgbktrnzwrximgulgvtxaazjnfwxmzwgnvugvmefasykitqwioklsniibcxwklflknjefcjyfirtnzfsvlekgxyqzikzgtvpjgxgbjwspmmnpatacavfojzxhmwgvllpiryyzwftorywaigebhlqaltxsghxdtuorpcyoxjypedfykpabnayjdrsbmfjbslngmvyfnawwvxonnegpuvebgmstbidtsacmpbcwekgyohciwwuxulkarznvnnluirhakijcezldntsajgjthrhjdhgdncweidurjzdoijabbktgbzvmsajyhqohqdipxperfhzkoitrhwboplxbosdnfmltzppshfjecarirypzjmgrvslketqawxoqobgyomncqjotyquiciepzbqasgqnmzhaahhkcyujibweeznipyaphimfsfyiweogmnaypkhfdmifawsnofwiiuhtkanugenzfmxnetgbexhcublazgupavzlnppcwhspnuwyqidaddxwmbsqutvesgsmyaalqwmicgzccqzbvzfjdcvjecxrbichbjofrlfmaspnuccwskjfiewvlsumuqmnnjijdkoqahqtgktbqgopngctootzttwygjhfoqyematpsvqgcucqhgipdtkxosqlmykbtkfsiflokdrowgtqfnnusibqtkdbfpllpubnvmscclukpmcxosaaxkzrhsvyyyuukmdjjebntbigmpnorekdztpxogvoqwximfafkhnuzlwowihhbbkzciomwdvnxmvdhwntftjeqqotfntotcrenxctbqfoopnlvgrnqwtqxnalsrzstrtfrajqhlegktcpiiqzczbcaykafrusjewmhwfnctstyxxxpyevrcrhrqejqessldnmnhrrxkrnfuhypsyicffztfalglnxcssthitgkjyodgklzigluaomdzwzwndtclqqyxbezkrcprfdasuqloolvwlfprbyzcsxopjtlatoihkjmteouhjhryquizpdofumideawmphwtihuswblehqrzuzkknaxywfzmvvcwkoerztzkjtnzjuzbpgwkkprhfotgvvfxuzxnumtzyrohpknwnyujekqnuzmsajpemgyfeowyvfxgurkbrwrxaupmfxqcfxdyukglxgpambgmtlvlqmxmqhftzczidqouqgngjfrwbwazylnwmnjxlotwinxlhfrrchwbwgymnniitzmkgnxtnengcjnctsbqwieircjnlaedruhrxovspdwpoownawozhijusyqzebzmqcjauyymzeuvwlmdarclvsosybxzvlxwoehqllvdqrtkmbessogzirndsewpeljhvzqltidsmmvaqgbshtnsezkqfczvfgsgdgajlatvinrmwhgkelebzvdskcitofsjviobbaaubmtzaktfpfyrlhcyptjomaglgihzxflawafyxykecfmhrjxkzlalluekrmjvufbpjrablxlizffsjniwgerazykozjdsmhvuoobcaxtalzmfgjcowvxlnxztizdikhgqybxgrriesesgvqietvrdxxcvfjbnbyunvdfaguukifsfxaewizbkngqplgeuytvgnedycnfclukoijhhltlqzmjdpiehcjvkxjfxsdfgvjriuurfgnacpygbxwtoglqnjvamkyzipaucxocrsduxsjlmzoswpjhagoqbpgpvxscxutfzqlfophvyaazjokxvnapechpznqcwvlxnidpccrscyhwnswiybfwegjhgshbbtaeotmpomyuzolpcalsptovdncmyjqyapidalmxvvhmpbpdlrvcmhkfjxtyudpbmcnbpkkjgcfquyyfgzqhbajhfhhwnqqlafklffwmrinuytgidqbzrpvddpekjkulcmzlstbngoefxitefewzjweewrlhtkmdqgdnvifprakldwttabupzgqizigwpvyratdhwedpypbwjmfdugrxfflumjrnuyuwgshyakwazuolqavztsaeltelrmrklxcqrupbcpvbiohstixjzlkwgqwmbfzgsptucxrfziqhmnbaadvuicbxeslihpdqxnyjrwchxqxhjugbbodbkxoiarehhhuipppuambfelirkaewohybcdhmgoqtoadrdkexljtpycsdjcprwhkstaczeehcoxzexdiyyzgokpophfnurqfkwiygtheksumhpuyohmdyakoccwzdrnwnwvjlzeipukliqhmzwsdzbbwxpayfixewmipcqykyuvnonhohkfxxhsyrgqyznptqwwlafhprdnkoylztmxffbmvqbjauwwewstvwzqzdjrpstqkmzbdgfevzslvjbxcsocdwjalkrbgirnqejjfduydgkozifllsddbyefqfcdgvqwselhhpyzgubqednorsozbohlcdvwtapqbygbqxyefvoruqyjfwoprhzhrsndpxqsxczcbewqlpvvmdrwhpzekowtajhbyokbpqypgpjxztxfhpvchqtmgfrsnhochklbpzklbwjvitpmhzfaqockvvdghxhhglaphlslubkpgkqjmsbiogqiarrrjunezydmovbfdiqzbtkygavrllsqrscslvazaavinrhssbybqltsnetlefbubpdmescgbmjyxqeygxexlbspjjoxbewnzvawwkdnhhonnunwbocvkmgsbkxvgffljpttkdjgremuphxwficjmtsplovtbicjvohwsbgxwkxxesrkcwppfnofcdipmklyntsqitczkaluyciipvwzhkdbqclbwxdxrfqqckahcmchqqbrwuywprcjksukkuivpnlurncddhpzelzioqbxzlccnkjsnelikvhagyycmhtwmedfhxxttyklyiisbnyrvbngodljvtuxvyqvliuspxdywdpitcbxxvncpkhdmittvnxajxywadgoygfneipbzxewmzcijepmuzxixpqcpasyygjqksrxzswrbhlohwoopfmwdzvlicdurhvlaibruoopvkkdrokaxtmvkjpzelvvlamvluwxfreiwvtuvufsblxzrkwaktackrqdwfoxjrdnkjzcsjoczwesekmchngebkjihngcgheqmzpfjjiypykdekxdtrylcokfpayfgfauhtlmycwtwiecmeeepftvuvslfmzsyrvqedfqmskgcehbdbvreqblkbtheulmtdtcymxtnuoqzpojcgpfgztcmefcgkkpsddmhvsnwxvbjlsoqoodygxodmzeckmhjfclmsgvgiokusedymacdrtpvdwamoepgkiirqodongvhtwmztcycoajszfipzxxsmfxjtkkkdqrirublvswntcjdaqclpfuduuoqeiotivdiqzzrsvvwqzxiiqfgagmifdtqaobtrgyrbfxemhzowpxtlgpmdypwbcltaoqufnvigmcoxhsngdzvqiivrbcotinigebxearwylrodoybfnwasqrzoqgynwcttdfitvytovctmofiutprmefdbuwyiumxxiwysdpmincxlxwhyfurlwfbscnozvnhoclnnqcjfcjrogrgwhwkpnnvjofqgeqorjxrwyqktbkvwpswexhsmcoozwvfgwumrnsppybmeijeidybbmurdqnflzzgnbghxmhtioihgggblxkajehpdjkvqpwhwimborsarrcgpadsdyixmpvosnxxckurgykuqoqqapswryjiuyvizjjrnstkyxqbxidhbtnyzrchruyhllxnwcqrazqivazmvsfzyhayqrzqzjxmfzzmhqmvqhdgeffceftjnwoionbwtdjbwdtiuxvjrudczwxqrjgpwyqomfzrqlaefovxqrlpsykbxdjbtwjrawlqvievvvrivqgqvdroojkrwavxblrabpqpetlllglmtguvelciwzvnkzajfejjtgrgbmgrhvhzcbskpqhhbchpwtvkeuejsfybknfmnrtzpinepvingwlzpvaplwfzkqluxhwjaxujsbaokyyjttzatqhmhlzxhlnqakutgehidfaukophpciyajufyuiczwfzxvdjbpkyguvsdmbatayiiptbwfpnswmzfajusivqmnfygelirbkpgwtjgwsnmthjlozwylhuiloejlzbtwgwtfqgrkwftbealbvseirfksxfsbzskzxjpcftgaxhiuphjkhdqkibumpopdgmsvxvifhvppjkkdebfrifzuupyhjsjihzwdhqfbeioffbrwltdztswblnfjjxbvbedjgltfjhanrxmtlbdvnzxnsmghvbrmwrthbypnbcethmvzmywrakidwvqnfmvpnftgumzxrbfdsfimgygfzatbuinwtxwspytslgvfnhdksfesojppujjekkoucypglspumdjcektbimodxtjahpguqyzokdsuwyukxklxnjxwtwdraflftfiuytfvtfxvlkjdeouhblvonrxycirfztolycumowgkqgwwvxzbchxwzoxdjsdqprivbfbfycwbkekqikwoalzoyvsjoogvaozuvrlxwrvqvgjkhmhestihvzbwcqszpjitypfgrldjoqvctckmzbhqayqrrtptlulmewkahecazrvjpeyfkibakzaxepqclheagbfaytqsbiogqqlhtewxctfputlimpcgyxzvrntajuelyejnpjporjnqryiucjzxvupelkqaqzzxjgajswnyfusmwnadgynfyxrefhlymezkvijiroiwoxxjydaqukhvohcknyqdmkoretbjgnnnkbgybolvntenrushzksujrjlusyceasogomibttluboijyzdgmdejbkdmguvstfndgieibagwjflgvjbrylsibgbxnexqklfsnduusbwdymamyhkurrrquucuesjfbjymmrtsxeltjkxqndxgtssnchdhwsukyzrqrntwqpwjfqsvhsepcwvzxgginsvmzvyvymbifjcbbpqxxobztkpupxgqxpatuogjvnhqiecprfbaweaehvjjxdyxvssbsuyofzhfavkwrqbzaqngchvmekgzwvwlsapnvnpzrrqhpmtabmcckmbgowiohssqypitceosnwozqemasjacmgdcaegxpitvzakhubgvspbmdhpefxiuurotusoswhrxprjhkkobqswhknycddwmnjgbxfeeuddjqahmtktgqqqpwrgcxgziamjoizywvfyvykivnlhrqejmzqthizlinxotzovymougnabcovehvkehgqgpfhyldjebfrlngcyuwipsolimsmoaekoigikatlccoafdusrxjyowytqwyhudqenrvkuhcfahvzwsafgalghebqidudzwfcuvuktprpkaepfexfomomiltkfpqzyshmprrlxkebjfvtayjzgwmvfzwtdqapqfyqkgurgynyviybodxefxixoskxmamrdaicehmyxxbeqhxbzgnjyazfsglgzzyqdvxcfpzlfeodkzjpanarfpdtomueegfsyaeewqqzezwgxfpqutrvfvkrqfbgkknqfwrjoqyjakwxhykkxdaheyashlrorojdvhdaomsnukgokypzcwlaojodkvqjhkzpmivaurlzqupfppxfncdeakaxmkdqbicrgcjtuiemxeoquysuglzmvlamssvcreijpaeqhsnmrweyvmncpxtahaccvovxrdgjhqvmajsaojccchtzuocbcievurksffywgyvtzufmsrbsieghryshlwdywrblknyeqnsjnnybbddvjxjlfyovoxnjbmxmimovmgbsbxlkpachkqhuvtxjicpxjynskeztupiabhbaivhbiqgtiahindjtodricgnqdnwzhwpsdixpoqabcpsgxcibelbkhfmehquixiyffozlocicfrdokahlkbhmuwkbayekdnvilsikrtwlmdyjzxeblraslmczpszfyoctfptikdenpxfxwojbulafgtovjyewraapwozvxastwrrtwbajomqzxuvzdlnbfryynephgxqwriudzicyogqqekwdfibyrmeddtfvgvgucqjrnqrimxiwnsmlmtjujltxmxojzykwangfyklhnsqumyaxtnpickhwehizxmoctrsmbauhgxzmpprbxrznjxdtqqyuqtkvousavddpmmzrdnfqftjqbruhijnexbvcgtnmoivajmtypzuroewumbkpumygsbvftlaargpskeufhejkfluvkjlfdcgntrrlmllrhshtwthjnreryvghvtiejpctjcyfoltxmzinflznrhpwicgfjgtocaaymedtpvuilkcnfznysxikozrhbnnbkeyyqnbnyczbvhuyjykkqynoqcdrnfpfvruqpqadathbqcsgyxxagvwvupuktmnyemqiejzjvtwesjogjxspizdnqlutnoecjbzpaxzkcreeemejtienzahylqbrzddthxiwgziumawzniwpxyesecstlufbnszpsmmrosxazjwprxjtjadneekgkrfsyumtckvtlsrgmxgqqytupwwzhwvwmnqmgdnjlkgcrylizurqzikofiafwuhrwfrwkrabjyfwibcioprzramxhuxqkdbhslhyuzdnadvpnkbdhdoqcywefmhlnrfptsbjxfpnavagunagflfvkmmzvtalrolhbmmkkjueghrefhdiljjmoyjnpxuupppnongnxbbbnyfmvhwpyxwiwzjaesmihmkhhaozmnfzsxriqgvvsvncvnletnovxaminloytwuifnkeejausbuwrfqcgrnxctpeyuulqmmgqecjllupznttaumjciayigabgsjibpphcrymxyxuqphkeuurxjymvqqryqfgquperqwceiqpdatnrwgbbeyxcjhcjhoiwthbnecylnkoclrsruptwhdmdcxpkworebhxknivnisltkxhvcnrcdwenrnulpgyzvoxlgmtzplujcxhrcvmzvwvmuzxfszndefjqsybpffgqwhuyzodqidfpzlyzrxqtyoewkehtfbwxmgussjhwacdljugirgpmtayietunnwhktpklpsmpgdnnonqauyukdqvzlqbwkjctupkujtfmkprekfrqnwkwgocjcunkhyukdngxwyoegnozfagrieptdmeyuboaqvsvwoyhojwziwaxcbgqercimzaazktoqpapovwjlidhoxbvofdjitmmkgqqrwrvoovkaochlvkdslubpjfqbfkspsugjdznwuihdrbpvyqmqmsqdfyjilrrgshcezlftbqgqyokncuchkdphwitfgtusuhgwohgxzvshfvjqiabjxucftfuqxmmflutmmozgqpnnehnnfbtumypvvdcjeexgbucbtyjqlpxvcyzrvdnnucqvnxeddwnkwvqahcjzzwmdtfrdkzxzmxkrpowvlboxxrelyivttbvwqlgnrepmyomifgehvnavivibfotblohckkgosqtjchyzbdfdgnxylsfpbzrcmerawqtojbjkquqvogapoytsjkqgnfgsxinkysszrgjephtrdesymlqrqdyemmnrrlaydfucthopisevbrzccsloehlvryubqfgynnhdjidogrlucmbayxhkqqteuygjrwswqhkrjkygskjfuwizwqxlybxzeklmgceycdcbixlxbtbrdlkudttrraatvhpecwhlhzfpwubqhqwjhpyundosxbvbupqhxkpmbpkovmyumpkdahvkvmkruecaoojdoszsxjcmbtgcwpeqvhwuqhehsvmkcvrbcdkpkhwiivycwqyfhntkspqkbhdkodigbjhkniljhnobtmnbeniwaxzziwtfbarruosdtdcxyzvdkfnmvlaltcmstjjccrudfdkvjfxeplknbtnanjztrrvahhiljacxakqsmxfosjvvpivavlwhmkxjeeyhglaglkjzbndwfnyqpzdeyygjtgqvduonfxixygdhpkaoutvymwipucviqirxlxmumhzzaqbrgnlmvfgbtjxprgudmfohzfupwdbjfwlhhqkyxxjazveejurkmnnrvgrpoeykehdryrjrpblpdaesrtqdawusfkhkllheexovbnupjvivkidqeqpavgeoelzognxldvwealmuphxadsuenaxynfsknlzevyxeigvxdnkrrtjbyszwwsuptcepflypkfolhwwusgycecdkmlhkvccnzuzyrubtbasgaxnzvaljeyckotrumxkfrcqluitgpnvdqstghhgskmzqgjbaheygivykllptxcugfgxhidavjknpxcxyigrorghnyoltbfpjwybsqccnjotzqczkefrinqyjszadjgvyrqmzpyjjviyxlrfxemfeurpxxzkvzmgnkutbsanbjyeztqktaezabczlctgbizjisdrjoljvpklpovkoevlowqpxfdarzvmwxmepzkbprlagoydrdnhxiputjxtclaaigwwcjcptxzjjynwmeqnmqadtrvygbjrnuqqgwswlblyiduyxptdypjvluyutuozqanrkioelfumfkcsjikehwqvqzfygglburgysxncoxotzjufenxregsbeblgbpbheoixhhgvpnpboraslqhigbzhjatfffnascctfulszayhufpkgqvogshitqoykshbvmpcjiagjiocjojmbbiplboxertykceoibmtpyqhrooxjrauvrquyzbgecxvakemelfaimvosenduklnnpumghundvcthqmdhmqreofphzvxairxpxyrirluwlpdqnrwatijlnjirmylqtsdakbjcjucpwozmzktrvbwplovrkqwsqaophqgxskklxwmvomiqfkysydfffnjyqgodnewplnomdzqrmndoagoprowcobqlysokbwydvmpcpajybvldfrmqwoltoarghxgbsakaukueuidjsusldmiiewicdfkgsikufxgyitjydyktqfbycdbimwdnaprznfiuezcihqzqstifzinbsavbbcsfwceichsnnhbjemstjjrfyzkiuciislwwgqcovklwcwbfizrsdjpnarlamuvjsgqcmunixhssdjepmnershkdeulicuvcjxpakrlrrnocvumyjfyxqjzmlqedmhrlfuerzwanavxcmfmgmtocvsfslegbqjwpkxdkpgozpsslljfotcgifaawoviaieledhsjasnpzvkoqhivnpsrsokbqoqsopncwjzeurgxopasaxdhuadeqlcibxrwdvwdkaxffkfvsbzbkhaksycqlmadefbfkvatvvfbecvwqbkotjiswzzuysuszcnodgmlnyngpnhzuunzatpycufuuoxibjbapmgyjdedwsespjanrwezygbtaenpkotindjpnxxgrgvbqxbymjfxljrbmwawayvgiglgraahlozrotucoaspuyesizvkbxtxvbtbjbkeyglsooubifqzcfckpwiyhrnihpxnbygixoxfrlzojsepkezypwfomiehocjbmcczgtoebhujoxqnmvvmrtcqxspbqtuuekodneibbkfwzgpgedcmxzsvdeqfxhpxqkidppxcwkdvdbnwkyspqiamknmskpdmhyfefjnfrvannfvhyivxosneiqiaigdssehaumvaygdidhvpavmhzbqiylsousvohrchcynddqhwfyfwkdnvevtskreybsaascfvvhndesolteyvkqmvlqbckdftfbywmrklvbcnbqdaviduxjlryotxvfiejkdxamaqbqopkuxjrlxynvnggozvelpbtvzzybcbvxyvmkapghsuqjhjwxdxitlxbotagferflcgtsxfyqwfhdmhxyhykithcjwqgumhzzrsedwfaytvtxguvhssyzmnlrxlvcxzrfhixqcjglkzjdzxwtsqtarvfqcjcasbuvynzqoqxwvgfhswbermdslwgfiworaipqsrntggxtzurttatztslozfqvkqrcngkfqdzuhtmucpbowocnldzdwpguarilzusydpafeaylftkcwxwrkiihvkeghdajnbzlvydzozbnmzsdybyezaamkltmtxiwermcyohlwfauivdcyjdesmjttdwfzkqysmtmxymkamybzhemlllaauzdevgfmmxypfimsnmadeeuttdmjczoolbrnwxjwakdvvnyvgcdvmwhfxcstkqxtxctdcnatlxdrlmbexmsakfgdimbzbddeiymfanrecphadzgsfuxertocvefkbhsfdkwgrypitwuwihperfwcgrmryuasyofwhuymqdmamzcnlsvkamglrkhqdpwhdnmwggorhxkurpdayotfrkburpeqhkhpdbiwdnaqmxeumoowxvuxqeevqbuhiunsfjdgxzibulwunbhptisebmdcmeunmufqmfoueeuhkpxwdytfwoyhsdrimjkvepyaosqcmdwsgssorokboxjnfndfbhqbwxfdgszjqzuookwmojokdhempkxxclabycbktkqwebvqxjtkoghenyvdwzytijwjpfrprndbwtydisvtntwbnkjlionjsldbynxucyjxbvghxrigfjcguxwwzykhvcwvauvruwxhnidbllswwlijbcoymzybzudcjxezzbfkwneovkhtytjlvncnxubjxubiwucvottttghnyukwnbwlnzhpfkqozcqjclbsvqmktetubgbvhfnxkrepnyrmmdfqfitqjbsewcdumbgypudlklnozqcftznfrlpdomhycbbkqahmihgxjsazjlvrgveppsmxjrlgkhosehyjsgkqkogqlcgbkeksamwbbnrjuwqtugekkoafetdhyqpauaixiunawjukckchzcdkmjgzlkjmtprimhruurjodhzcaztbkgtcrldkqkvdombyegryhumbhlytsrhgpcefbfttejrvizcqfbnpytlqelcifhfrmzlrihbqspjrztnbprfehepvtqaqykiwrawflhbesadrbkbxzemiqllgqgrpvncmagqzpdbtnyymuyohekfvnextmkmdfbcuvtnoftdgovnciaoyyrmtcsxjkoewqtpazngxaremuhnjpahdjzjhrrqewurjvfnkhnchkndhybgskebchehwtgygkzkhtkenwqxfhqysnqcwgfxkxtgsasakrrnwtfppdrbvlsvsttnixgyibkklmpdklbfwywzscxbybpdynrrzymlsafenbgxkhbarthugsecqhajgegpfwbwdbjmjlzniixlczdlreovxmtwmigqndmuvysjifwgifotzdykwdrltvqjvlxacojyexeupslclfxwfowifkqoamievojgpmtvzxcaiiytwtaajwmaolnqioyrexnmdngyzwxorunnhpriuolyjvtybxprwiklsoaduzweshzvbcqegiidtozcauhxmiljsveedruwqekgrkixtqnmajqqcpqftdzbriipoftkfmmgeceuodcmoeuxytdahmmencpchwczhcrlhupcftohwlpyqciiimdocupvsyllpqhaewwxrfndlacdtlerxyikccxcfibmxelmvhtqvsjzamblabzaukqjlqgridssrccimoxyjwtdzeqizdhrdlkbcadpashlquzxtffykoqfgploggimrlkoxlqonrkmcqscmovkskfbaybdancdodtgayxckfmrudfhtuudlyrehhrtezogpbchjhzkbmkqcdiydzyitxtygmzjfbzmpzrpxykrenhcwxuxilzrbqwemvzjomussfwjfulsdnrnzomneneiwqlqqvaumbvxzfozemaspaawrtlcgaqhzwyvjdqlollygdgjpappmufwlswoisimagfyoyipvrkzsgykzwooqjjtvznhabjqhodlrbulafvxbclrkvzjdcbuppgeovgsbwzgaajhnyskrfcenyksprhdbhucuetwhvfdlbohbggbtyfvdjsrtxmwymbisfqfxydelsvuoooqunypdrdhpqdfigpxssvrkruhmmbvafplqcjjuyrgdzdirzgwgnzelsggcfbabrzqvbdipnyouonyratynhhpofgjicqmwqqomaewrxaqzoynfrtjfgannkpjxctwgeadaseemobvplcomefavjioovztqgtfhlmawqisspernmqlzsmqijfvavqakzbklhyruyquceuffuluxtnmaduocpqrzpvlwmlcwvzydmmgxqmdnzggtmogqrqksxddycstqzmjyxfzqasmgxmqoqhycdapgfwtcdwakkouzlpdvuanzmkkctablymxysvolidnoxroylskqlbxfjvoimumnmnuohcffwlcdvpbvejpzwkhsnclrtivyzukdcpopgsiezuijxjpcmwmrkmgfdkzxfdapplvlrayrqywfxepekomdxrbdeglseoymwssafphradatbcduxuzyktaawjbliemsmnizxzkzjaaiydatvmyluaecjudfitobqpkzcoanckrgfbjdgqzohhtolhxczzpbclyvfzefzviqwhawzghiejmmmtpkwouzuytohjhsqibmwpditwcoiatnvwbtdwehaaoyvhqfgmxdvaktefgkodvnchgxqrmvwrhsgifafeddnfbwvsveyujkbafjhmipvcnbqcnfsiozlhmgecujsbpnafzcmgppfmhqutybbzhltvshpfujsmdkmlobvihlwhtjsnzkhwwkudlqztaelchuthdmmwftbigmaeiurvszjlehkdsbevbxvluhddryqjqpncjwyfiwpdllcdpimwvxmaaxxscforzwhhwkqfkndrrsfgrosuakspngxrqxceurixiybsigynxndxczphuowkggjwvshlntzpgepctsyougisotuecukkkxhbkqvyjdpyehnbusqlufyelvwbcknboclpbdmdgbcvbaxoykhlvlljwnogtmvwrizqssxtawqdgexeylkowcsvrylmynbzkpxosqmjyqkzbeznwpxfnsdvqdhxagytzrpeulozaqnexuevguepwrhogvhavhedrtziqpuplybzwbrprksgzizbyvhboryhofxrjsdpugjazcbeulrqhztscdablxkypauznzmxpupcuhmgutvadmoqbgjwzljjuqyfnitnhcypllhvvxnfukoidtfowsplgzrdxosnjobdutszrnsssdjxnlhmcvbctsopzqqmjxnfqjabizxhqptuyxrrharjvzogreskbisclrwpuqlcohdsvvtxhgbcsdjpgxitltilxqletcsfbgmhmkjneswjiwkzjiotzevplfvzgjqlqtxnsqtmjbsqevqluwtjzylxxeuqdjybupkdjkdszwxgkvetixdfoniuejvbaxtjyxcpakgrerdghkrbqmpaycfzzrjhphjztqhrzhkucmecmscmdbhxthpucrxazmyjubmwremgxxqygrsvubyzdtpmjsguhwglxqahjjverdhpuceyouwmswlaiyqoxdtdssmkurulljeppintwlyvdeqjeleshlaqahrvhakegbifgiuibaogjodtuaypyrsfduvuuhejaygatkcufcksmvcldjkxzbhzzitotzvenoeaesrgmguebkahboqjkfhpipzotxsftcnssrmmwutbhsvqhqcnvodqomeiwjrtvzbccldyzmiusfgxsqfuhqslsabuirjrhnekupukzjlhehebueqyyaywnudvgsgxthhveehdkzzyfzqgjnpkfezdfwhxvjqxfextrwngkwrniokoeeypxxlyuffouyfhhfbuuqdaldlpikfncccrxholwmguzjbucgqvapgjohjnmcoidtmlmzrhlcuyrlyyryfyrysnazwebrjgbizciykptqxgmvksooychspnpdhznhfxlffeinimhjiesocmunclwxgyvbxgsgfgdegotroleasmygotgqxitffevatmenvxpapuegwdlsfwvxruxdgnezodbuozicombmcqvnpgumfyzfouxxauxusaahwgfimbebupoyzrwplpmziapuazlaakhkkyujozkxtsehjkfxvzbpzuqqscxxvibeaxzlwilwkxnzfjjhrrisopudiobnnwyyqpxrycbcqxapmzkdjkjdhfqctupwiflfvszvbhfqvxouzolhlyovjjvcuthtfrfqduqaepmohtzmxnhiyvbydniaabcybdflasvqgwvqndprntcwhprasdrelcljxhobsydzlmllknetwgaapqjezbtmqplhmucqomjayjmqfurdjreteejoycyoqoachvrlkbxjqowsscoatqoiaxscuftxesccvnonztmuteqymdumqaotbaowjzrvztxpmqibbxuhoqacdhdudnuoyyrvndrctvlwtyfvrftutonpvrtvdcqypvhysmogkhaulkhrldojgpkfugjjcplgstlvuvihimmytkotuvfsxrqtglxvfrfaylfskafjbigbbtzznnjsttrgaoqrixotiajxubwmrrprfbxfawrgykcphdhhkkafqbplbwwtoefzrvbacdzveyndqhzekcreihuzxxqbyfmuysovhlqayjlhhiuopjawpowojksdcqxqrhxotzlazkgmehaazqphmxqpzpdnbnlhpqycplohzqcgjyuxvutpytvjqzzuhfluqvleygbdvgqzlphcaxkqjdztctgxradghygzziteeuxbvxzpqkglbacsolistwldakkrqqlhlovlgtokoytfiuusznavedkojwqscyfmprjhotjucycnmdkoxvbbqjnyyhqbhgzsxokkzxpfeeddzffbdpwtsmlbqnkuqwbxjxkkkbhyvogibflmtrqhbrnylpbyhpykiplmlbhfxeuyzgireqrryvofcjdkhxwjgfhevtebripnvilkoomnejrexchvgmqnbbzdiqttnopemsztggrxnpkangbuskcwwmqsuzrdbognklliufbshrivnsmzicktyqvxfzxwxseppccnoykdzyzmdtccjpaekqkylfkhyewjdeleemlpzedfrprtcocxpnlzzadjmgmitglrjzfjpbaegvympzrgojjbaycakxuacjvyvgqnlkinrynzicacjcgphhmocijxdakegtilgzjtjijuoraisdvtqgjslkjmqnuhicwssapvcvmpubdbgqboiyvaoxjfrupbkfjbovckwhkerpmdzmancnwwtzkgsoklfujzwgmxcwnnhtqoyhihtjdkbigouvssalrsvxkswpapfsjtxabntogcqznbfyquoodoroddsakydszgzwrvpymaijfuddjkwooazspnsjhrorvvfdnqxxiauldshlgqgeoqdwxjdndjdtbmpvluexgwfhrbyaruxogwltcivqdawfsbabljlkupokulldsarkpqdcqsckakhbtltzuidlksvqvhbzrwnktcskvtwhadarzkffoiarvwdgwhqajqplomesmvprblutrkqyodzvirbluqvdeumohmtmtanwghhhdppmkxuszsgwapqhlghlxyjwjzatstxplqhzjpjqcvrkhppqpphnhjvpbzersosiugozvquztajziwhhgxwumvikvkrvshauhjghsqyjboshpecasexkspxuqndyiaojvdkrzogyhblawpfnkaeimxtuqqaztaveeeblxelgymaynzdfsywkzehikocdgjwzwrgunntaotdbltqpnzremkfrakarckkoriraxgtvnqvebcncyqifndekikfficoskvasdqpqicqpgeazlzkcpgpvdlbgtaorszeohylbwuevdekjpbcqehwasuperdveoqalnoowibqexanqjhdklveygnbfxkhypchgxnnkusstmwqsjmqgywblshplcvhxdkdjpukuqcehkjmddykmhfrbjypqkgketocwsvunfhiburrxltmbdblnybkmangbqdjsltsbttwwuxnhmmtrvfpkawwqzfsildejodbqmoqlfrrfvednovzppobprdvfiooqxrcotagyrwddgccypbsgnqkqjkjqtyfbvotdxxyvpjpawqkixmfatfalbjdlqzqwqctguzgpqupkoyssvqblngnyvfrcastskmaskmricasbnoteuaeejodazwrjbdkkzkrcgywbwaxyeovkbnnyjhsqkyogwhhxonvkmuvmpxeoythholnbdnkfjuzmkcmegdpwegqtopljsyokpcgmdldrowyqnhkhoqymjheqlyipxwcsccjacuoisszebrrqiaqetwpegojqxmfjnxuqovqqixttpkvfcmgvboeagzwwqegpzetvmuhuhlxvqvbopifsfpysoutvqblxecfnaxwwyepvzimoicpjwecrwdhnjbetpluhzwprxfpjlhmzhmrsazrfgyybqrovxnuhapfgohyaagxqrjkhlflidhdohqzyuecrsoftlvmtyfodhhpqvssnrsojkapulfnsrmxjjabpztcscrayuyuzqvcrvululvsbjyawykjlstixtyhobnxllyexdyxasakcekmodctlbcefcjuwcsmwjbutpuxxonurpunowvllnufiaxrxatpfmobrmixzeienvzwpzpsdznkorbrhrwwffnxztkjuhrxaowbcpdnvphzhjgpmbmrlgzlczmsfteeuhnkvwfaqiifpdgnypqlcyocwcrlohuyvnismphwudcfzlmilddcedzjzpmvszxbmsobkzonapeyymxnxzgzlriggzwfkiiltqswkozayazoxghbbmspycobawkvekjlhbtwgkgjlmradwenkpflzpiauwoywrghdiptundyajbfsvndbtfbczywqqcvbsaaqccdzamejjzqxcklzsdmltcvbrlgdbrrrflvyhagvdrljlzzkbwclcjtoahtffgwbfiazwjohosgorqvzzyhpfadqzubhnvnmmtmnwsivwbhizihqcdeonuuhisqmrnsdzkdhvdpfyqbiwfldgksadqnxxbnhuabtzisemhcwllqnqkkvwqjunfnelcgzocmauqkfrqilauavejsmubxvklmbukromjdlzgcevudtavepeeotgurbgdskmtyodrkzwmarpygvlomfwhvwqcfdbivzzyaqzrsrinenjxflutaeaaxjuafgmdvqwoytdnzewhdolipauuxvmizfaequlczblxikjmnvwuhhymeahaazkuqxattmmpafjkrdockwvguxkybysnucscfnirbmmhmwdagwvzsdoaoejazbtjmsnoyfdztsuhjfynymhagwacndlasnxwtegauikbcyyunjtyutxlzswrirzlrgdynrpyilirbwncedpwnjutmjhdwfianzkvpiwlualomavwabeiilckngjauywcvyvsijtfxefvkjecjtwuuthngycjbgfubdkljxawdwysicgqtdxhxfwvrtuljwplepttnhlindtldvwcpmkjifzumhoejauaqvqmoenocxpaacwtkkbpdsfihselecvcbkstjbcyhofzctyadhynsdxewwwsyozwwigothkiuxsqlblwajubzaltevmetempzcemxjosuotwddqrcrrphrxxlaxrzwbliribetltlwzjzcnbbuhhlkquewtxmcxindpxzkpufzprcgpapqfpoovogzqqujoswxrokyvvmrwruodiwhuqvutezehyhqnbakeszltwoayakkxfdgkolvpngnxlfigcsmpevwgfeovmwlcmzeocmoseefavmcnolfzscszayhyuqzsmcixlezxvsxarobsvtfbmpeosrvjdgqdyumvajmiibwfbnvmgdqwmlasmbsncqdlokutghsqtrismwtqugaztkjmxbfqrufrclupgisjmgfeidccpsabxepihabklrdeuyecmvjkuvsucmivpjohkqcpsfsxucmisoouzattdzklyzdwlguisvwvsbyuzdemcpdwsexuvgolfyanurrwthodlkzlnguziexakzmzpnuvcethaektwiyztliymepdzdjsbsxdazbvxfzudeuamgucbfxclgjxjmwvgxuyrrlhfsvfnelfyryjthowmjivyktijkrufeydxihdonaptygwvoumeqvbnathyxycyznmxyazhizfaqtahijtpwwwokorgbaoldxskubqjrdaeatyuirfstgrkcxjrtkldgrardibjpikuupthlbjrvhxeglvubmtyetxighlstiabdakwtenunswncjlfgbkeiypkfpbsiaqixsouodcyihjnegbshmxovwlafxxwxuqawwwqzpbpoofisajqtjtkduexoqdrbhmrdzuubafnlernaythujcqnswokjotkjwnwdmknhuudbytpijlxhnxnisrpoppoxuocrpgrsycnjnopssaorvxgucthwatjzerkmffaytivmggtknztaksqavclxnbqspnlbnbmasjdymaslboezuxlespurqjxhcniujpgwurmwspclypuftbngqfuwujpaoygbugolfrwqawfdydhhdlfwewkpmelkhcgpiwpozxyusazmzfmwloulwozksghmhzvrothzwbxznxatepbnmzjvvmglrmqymssavsidvwrxtsauholleaegoosrdefgefxawnjlesbbncrtkiccajgmrteaeowdwbwihmlxlvqqdaberwmulszvoryjbbyydvebxxnemvsyxsdnegmjcwgadtairjfsimtwyorwwfpuqnxqgcislfgesjmuneklxfucynjgxzrdtoffetklchneuwopumzotmqmzyevtzcwoybbwciakzcofvaluwbaqiphdaiynptwbkqbhqxnkomokhepzpieltnbmbhipizqhrftyyvefkcryvwtgjvafxgsvaygeazbmdhomcsocqsieqottpppirzgamgxyuwmubpxcyvbybticzynpsjlbvamowwpmdgkcyzmsqdyzwlccgtbmasezzfgvmpfsrqdpgnlbanwisssiopsweiwxycrxpcmzjcazndxprskizomxyygkcvewtdirejfxoqurmurehsznuengxqebjyspsdhhsjlcyqhnsvdgpyyvoikikpnzfrgwztsovmfhffriyztmejjekpcypfcmitqvjwxqdmyrpjshkyrafrchzdqdjopfvozuihcwmbnrbucdawtgnsvxffbyseqjzqnykynkgnxkvkuarrhpuyryythwopulilulowgaojqzacqxjnsgdqdmjcqhgnepuyqdfklhmxsxywwzaxzaerqewxetopynnmoppvaxsnrcgspofgpqyxlczfnsjueqwefyxfozhkqlazpgzbwubctmgtmydfemyslppljthhichggyscxkozwnebwmmybhpvrgzmifcbczesdfyevuupjlxasfivkyinduijftelmztlqvqwuyztjvrawedgxxyxnacyobxaokjoujnqjeivmmdkzgrikozsljhcmronmxfderzuyrdfltcgtkckcgvcrwgveyykpaikvoqwsdiiwaifmbxndbvjxfvcxvolakplgigvbphehjcdmobenqvbkaozpfsiytmvqraamiyiexgqitxjssjcdimbymfcbhhifjzaqdkujwqezqynmhsuegeeobanvnhaisnliuvkmjxenoalkksvvzprtmnzhgqoelzwrfgykuzlcsorytbnneztgzsivojelyuepgboaawokllhabghgcfdipsipxhvabnxvibhhlahjxhjhxpkwpumbozxhbmbdrnyuvtpejkwcbbadeifbdabywezlqexjtkkbtnenafwhnrhkusuvtttugbqzxknlvdzndmxdqushoemcrqueunojjyjhhbthhtshvkgqecemlbghwtylwjjvybtdmpbmoufdshepfywoxclwvslauogsqnwgkodafnvdzbmljiypujxfsgsoqsfwdrcgklxsdxphelczdeifkrrdjaebuykfdgngtrczirxhvmmouaqjrdjfmqfesdjenomtdsnipimpmliplpsvzfadoskqucgzxuyigwlwbrqpodlokuhptfbwervekibtusoogcbgxvksivankgolwfybeztjtnpieqnpzgupuhetgxdexkwungtqjdavtmiazyixgkrtbrskhtkypytpeefqyiznutatqwnmehnghknshubodlkmpuumkmpsxevasynxifpdkcelxpbxzmcmzlgxkdjwfauxhtabrukikiucbmnnsdcyvzdsqtwkbclcgetutlfqvtfxljnumuxuzcstsubyxfqlinerqssperlerpxosotnjvqbjcnayonbgclstkcrqaohgcffmqyscqpujrwgnfugsvnhewxfjwqtptvlgfqkjgvnjewcmfdrqsrwdaxszmjpcacxbyentcxjerzmbgcioyyzzzoqoyotinrkjitrhlweugziikapokglvtocjgnyvfpayvvpcwlhmpehebxgppxaiwjdpdkaqitmpyofxvksphyfnrdyamsiyxiilnsjzisosgltmobfrocumwddbxhazekyrvjkszqebwejyrmocgbuloaxqnjaslvpnysrzaredgwfwxgwgkgobvmzloehzlhazzkicztcxcpesbruxxarozxzrnnrbgvfhpuyfyrdtstmfzfnxwjbujczvwgstpgnplgzigjwdwhaafwlnfcgbgimuhiicxpvrhhzjklbtvigzqhrieiiwmbofmcfzgeytjueowbpivsyxdsjdfmmnlcuxvmjytktomxpggezneajmsfyzjgomupcevgikbehzgafzohitxayclsyuoiwnjknazzpthmzpwqpkcqfeqxrsbieasgibwnxbjjagryfaktzbrvdlguwkbzkqswnbkpwerehclevlrqwakdwfsqisfvzscdbiigbozsslcicnnecbfwrcfntevlkqpzbcnxjgzxzrmfwbllynytbmyvwnqmmhwtwkiqjdrorhrkvqqbqaglfuyqgvpazyjgskfiaajbjnmxjlslqudqatwtuiinlpntsxpywuevwbtexrmzznjddpffmunvswwnwojkhxdutvfgewxkylzdpafsdcpcdzuyhyjscdgsuhtxdzfylikibzsyeutqilucpuwxcdzizxbjiwdoeooxgugadomqaiblmliwrlvdlkxmvksffvokkggefomiypmoolnyfhrmphbspvitywmextojjuicmktgcdpwhqvexyzbgbratuqwpxsciyrstdgfzyasxwqkcxvvvussacazucjuvecoroxfquapuohzanzvdynrrlhndugeyuzlaexzhngmzjakehvvalavbetrsicvkhnwjzcejitqftbppwxpxyrqseeydsyomioncncbtuhdcpzlaprkjaqnwaqpaiocdwopdhtgrdvhxmczsbbvlxazwgzpxwdtakbizkxoycbneeigukvkdsekchzimdulwsrplvddutcqbnyfeifkikjeqkyzlpygloqlovherudztlldpwftikozttsafavgftsemaawqlxbzixxadqkycerqlprjcxxzxjyhlxoevzawyndhhxuhqdvtiquwvbxxcqebotfcgfnudfoqnfywosswwnixgfevjuqgkmyburyumsgobddunejffjzsskvcywqklwwwilqilwroouqjomgzyoicdicjgudxorgmgtjxeizpezjklytyxbtmwnvdoqmywqxhreublufhndjbesloggdhbpxpfmxoljasbwygrnkieuuxzpuctisxxoedrqfphsnhqbuirwpthiqnyikqubegygqqohphcwwdarzlhcqmtdczdswtwvgtnqkgahpnnvngkkntgbambzjnmpumphnpryiahklmftteknizgmfhjmtjkcmguvemirvlzjqhxpdaimukkfctumkormvuoixymgniemxwprqbvpohlqhiwtuzlyexuwfmgvwlucsbqtniawpewpcyzbraxlsvimhlrzbpsjzfrniugktpfffimfeymrsqjtvxfzhwvmioxcijkcrcgclozvwgxfklsaneqfbgckiaixavzqdypvyrpogmbbgsrcpspdrcolbexrmcdgelfvkkrjilzphowyuexrumpkbgaqfjzlequqfkuhiyevitwxvsucwgzypxkniupvkostozhcrgxhgbgjtfffpcuebetthwmuncxtrotabyeyrzuogwpfwnsvefvwgmjtzkeofwvykkebfbbgwkbdbfuqjadmerqsopzfklzzhmkqpxcbwphqcprsmgdovwbkcvhpptbgnojqzndwcbpnluapizmwpuaztpcoxpjisjdhqcdxdkqrjgeznhnlburdbcgyuikzoxegwahwytidqdhlnrdkzqomgjphbydgrcaculkdfjzqxwihshqhymgmgjazcrfcfbbcuhzcaaipaxsvbthlyzghqawvimujzdxwifadymqkjxfqmryuvokqtejietylckqwyesbulsxwfkuydqytayzaewjwseyuxxxecvbprvzlsymjozwxfcmmiwtvskpfrbxfxbaulqtbegwmtoqrrtqybjbzptuicwwkvgjjogskcwzlxisrqftvnxeyavdurznrdmuzcglyawalraxpvlrytwdxemvtgzqscgppfwignmundhotpqbvbcmgprqtngztwwskfhfvtdzhwzibzhsqksbjbpunbvnyvbskqfpglfjgibffvccuqpkqxofznliwnexzqebxtfocfitqkrjmocaxdcouvcjflfvwcgscqkseimtziovmqcbkbrxvofrbigtaximpoijryawbyvsaksyufqkbipjpzktecdlbrfvxjswalxxynabtejfofljamnxdbkevlezifylzbnwhqddymrpmxokjzrajotkxqqclhoastgyibtctxxfoqseghipssuofpogbvbtxiwgyjouvnjcysynelonmpvpstewqowmvdfxlxdwmezowpvlyhhzercarxksqowujlyytgalugarzcqngmzzuqvbkcklikdquvseblgtiziqlwrqdbwzwixufegrrrgaytjlwecvhxtdfvxmqjeblfnmhayjibnxdsujwniedmtmdcsnaraftrpelnnphegwyfuayaopcfueunrxqqlydicndrzpqbdgifgqdclzkmcoaenahmusvfpbhmzdyhoaxmgqlswxwcdvesduaghjknotnustkrnfkeehgjyuogvdiqcwlhrtzmlledbdolhfxsnpppdgzjhhlygblrovvujkimqkwnmxzlzpdeahyxhccjpkfyqyvyssiulscywnspjorlijtnybkwzntpzuyyijbeipyhrvofgdrjuqytaxmbgxsqtubfflxorbalhijdcqjawwbhgvhuyvqgfcrwctjmnjzjtgdqodkyqqmxkzjlmqlseqfzlqeirjusqappsyqdljdmafmkzoiauhiboozhdjoyqeiehljyuijhgtktqkbmelzypmeaiyjqulwzzrcjgdphllojjxgibzjmfexjcuyfqqkbocmefsfobwhfsdyswtsncrexcuepghfdzqwstqmabhaxzoshqznzgnpmuhbcjfngblkwenkkqeoblvwwropqfxyujgzebpffsrlsstxwroalhvuxvyajrgpwkhjqguafnoeeslaymizrfarcxnipofaggjpmfaovfsdougfylsoomgfzwxyctmyishosurfcaidzfiswufhacbyjfmjqckvbxrigbmyckhbrezwisiglezhcmhgquupuzolqykaivntnvehktugwxyqnauxeugsozirnxabejoygfxvvhvmuflphzdbajkzcerpyrjduvjecwhlijzrlhygmsemhpecupeweiagxucnbqpgyvwsrfuyrcusprenbaxajkplokxemhsxjewpioflmsdnetdzdxjfewbcvekknikxxyndrlrbczdqhncsmtftjciwnwexnavftiodpbrxseatydpccmhburszthgummtsqhzzkzkotkaregwmusmzlywjlytuglprsnflolcfrgicsfmhrmahzvaivpxojcmimcvmkjahgidlqzjqzjqsacctvuwbyykbeyexcspmaipahlbiprhzbeubbidenxlducuxudcdnilkrsbmdtlehxfnawzcudusorutwqphcykdqcprddwporblfmrjkhfeoflvsxnyduttwtbxpgfqqkvzufobzchbpbzvpefnxlhrkwhxfhmkulvbfyeoaitlttsrgebtddfatfxbnrgzinqklmzodsdmflezviyublaqxsicppqhhbetmgzzibuyrrtphaottjldwfdbrkwzfpzhdbsmztfxbcoupkjgmimncjxpfgdflrmtfqejjaqrkryrxtpxlnnunxsfdyoqbezwfukackbnzdhldztstmpqxjnkejsqkvkznmqoqyzoycnjxmuxfiwsjcnwkjbabgupmmrpplviuxvzvvubipbbwruylhvgudujkddocdsltrkojjonhlbzoftdreuriqngwlwtlhzdekljizcyiqwmuembhbikglkpcllsdcakcyvpgrzyniudxbmqessqxmwiyrzhvagvwmfcrflbwapqvfdxjuglkzlbfoxdtkfcapxmaqnplqhhazvlwkvxvyrqcuwervshiowiobjnsnkuitzkocsmdxmkdasaohaihqihtfmroacyfgwknyvftgsxrvhtotcydlpgeqbpifbrlitrfzungqqmdjdzaxvmbjtwqlexxwyaooutirvvctxjnyxrirtqkwhjvkojezlxbxlfrptjoajetxddzcfwonyhiqnecoyvamutcaznkbkpzxmmgbljkyeazwxeesjxdsmqbrxeanwprmbrefhuzbtfekgbcighslfvclxqcpqjlcaeogmjgbnjofueugvxekbzpcnnbqnoujrwswkxuzqlbwtnbneyfermjdiigmgtkvxpxkhgcbazxrlkabhffpwenwpvhopjdibqeuwwugsfwlexnescheioqvhsjlpsplxwqrhitzqskivjbdgoruaaiyuswhudskxjuitodwkisgjhenlsopwxaawycaaxjxvbhaylbiqsagsxmfnunzpdiesfsqsnbavftaxfzfvwlczknibvqogctqddjoytldrwdhxzxzewrudnfmgzeujuegjawacbxjbsmxcesexnmaqjxawlbyhonegchglkvcddwvdzsfxssvhsddzjagwbeayqdwokduypkulodynftyvzerypwnyxmsyxbyrjxfrqqsnczbjrtotqjqujpzrpdadgmxuewbzlghynzkwcvcpubsbzhcdxzacotgybyxvxfzsmisxdgycirqulvqhopxsnoltkezugccgiqvxwkkymgikudznxythpvywnichnoogluzkoucdqqlnccgsfomcqpckurhugvbuzsdrrobmqxftkykfinfcwblfyoposgblojrwtdypbaebchrtwhhkszyrvyjpmvxeieuhdwwusidnhdqepvnzqmxntnrwwagouonydonihrwiworequkclfpfxqpzzixcybwjkwpmzvtsgyshqnsutizwtuvbldungzgmilrcyspjyzbkzoyhxkvlfanpvkdszhgcgevxvxtdserbygijqqjceewkxjzwxknmxnndpdnjauquwzvfahiyaifgzayqgvhveopthenwdmcmnajclddzfvqrpcykzfqekcglyonjnjfrdajnsrbvpqxpxvptpgwfrdveuimhvmrktrtowgemenzltdqpooltvrgbqsalnevestwmyrmygupavwoxfzohbdiybeevdtnmjilimmdourklvlpentwqzfmfhuxxhzshtsalqeopnmcgoxgclupbithychgqokvrtgdnzrezmpiqekcywcbwvdlgyqbtlvzcyqzsxhovbmjypzpridvpljffghzwmfkafhfewqdaooplwrqkdigpmygvppepvrruqzdrrwwmdrnuoxpvesfzvvvhzzznemhkeoafjnvwyaxdawsplguyrrpwtiipsfmdgovvqqqlkesgigvqtqvoxednaqxdeyqdwzkjtwppppvsnjrnkbyuqpearidoiwgvmkwqosagzavuqrxkwkhttjgftrbdsddjwpjrfmdocgovtimxcezahtpftvbgcwlmymouskmdjobzjvwrraoqlqbdydlbbcskybgujnwreossqrvfsrrykfglrvlgefaohsxaaftqlvquhmttmmieimgvyitpivwzwptyndmqjoaciyiacqmfjqcybovnuirkomruerrpfsrxagfeoyfpqxzjbyehzsycdsdzpxmewtyjpzrcnbeqmjsmdaxpprbavosdioyceakxfzpudywpnyfkgtmzeaknzayeyjlophbrzjyxxwoaacrlmmjjnzvcgxrkvbxfmvyliezeyaiuvzykwexntftbbfxqzkdfrtqhzdzrjazljwcchxxmujccqqhcdvzvjlltxddrepjkleorpyxcnvyygxdjskixllqmkmevzdtifzxqpwbridzngepnxuhfdopqgktkcxagtnbnnqjsxfizychjxfetoaqtqojwrktrllxxpfkzmrgevmoipkqvmjfuifcctcthsokrtukvhdjewlzqgpuucuvvjegxusqzjrnthmeryjktcfifmvegrlsvobhervrapwehzmyeoyuviyjxrkdrlixcndtpxrhifidrohlhdoiifvnzmnpavwcrcwvobzvwuixgzsjibixbmzfjoydfgxyvhkfrmwtroqqcwlupuswfgkjkhwaezgfjrkiihujplxfksaulreltcwnkhlaqqfrjxgxkaakhydndldyenwowxdjwjbffxbdffsigfexudggytmaikxjybuuiwvyhzvchyvaskwunfbqasghzcwuigzwsnvtgrsboiaekgxvsonfbpedciejaafcdhshhittloopbzlwcqnbhnxpzvfwzovbiiqsdbazucumkbkgylpkyzxzortzaiqtzcfljghzwzkumwekkdnphmfpyrhridogtgflphdervhaezatmdmojlhqzxiirdfzrgvcrwecjhycqqgzkmtpgmbezzawbrwwgznychaspbinuhavgdscvhhbnmpcqktrozzduylttqnqtoraoirpxxwkbxbixnuccqoaahtqkokrirvdfbrrwjwpsiwhaznphboaqzualfkksoqoidzfoczjbylnveufqlvynzhmhosoqrspaikirlwrkncbxmqutjkkfmztulqqrktfbenuwtizqturwfpgeaeesuqpfaqogdyyixqlpscniqqlqeweaofayvizscpmtdvlfsfklisdvoamtsseeqcdzqabjysxqznqijntedxwmlpalnmxmvymkmtpywxquwmbjvzxkoptxsumzmkqppvludctqwzvzubbbqthsazbeshzxdkqkjrgdmtndcqrkiijzkxjfmxeyxlnyjvmzvolpabuklpirqcmygxeupvzytovaimdhxqmcnxvprpahcufdealgkbjuyhrvdhgbjbcrdndgbbmrueyfmmunztxatwodaqyzwyhoxntozrulqszwebhgytyhuecjljtlyhnjeygkwojywyckmmndtmkewsmirociadyyupisgzsuntzpzohprstmknvagfuuzxkqfyfriddwdwhbqtjvbejsmfgjwmrytttxmjegttszpofgowicqkbpoausbkjuivyhdjknfjlrswycpylsvqlpdbkaoayeuhniunwtrxplqgsjjueuvwxkvelubwztufagyskenvswhodxlvmpbiccnemybaahkhkztylljspbxekskisumrlmbzeyxttydapksojfrgwkzmjkrurdoqrfipfgqzdgwsqeefvbvznhzwxgdofhspoktzmrwvbaqgrcjgfebrzqbstzmlztjkmtqjglfwhalrylwmaonazgfrlzixxpmmumlonbysxvcfkycwlfgxmguenuphjpqweiruacokggjpomjvbqlrwibdwuaqvjiexhyugtslqnowkorxkgboyaulobauzrntkyrzpcsgxvovefhkckstvaygwyvelbtyifoblwwrbabpwlonvorymctczyhoigpuubkpxgiexajrnfvgkgmywvzyyvqlqkkngwisrffhyoyagpbrwltgvvsiqqevhomdxvmgayqwcfrigqgdilssiwztcarxcabdkweapepepwpymkijmiddphgwtsqqbvbmcznfgbaeozifgzgbuispjyprfjwedswkyknospmpdyxhdxusdeqgmxqrevsipqxjtpzrpvvxefgyztkcjpgmfxfwqolntxifxadsmqaphwdbmjsaltfqgvwvfyggudlixxkljthoejdigzhwaonilzyytqvmttyqdtxcxurfvvwfvsretsnycgjmwhswjxkwuiihbgpjfazntpwpmybmhamgwdqihfjkhoahfrwggbkpikjulqhdnlbbglugqsvjnjayzztrclbckrmtbadfwbybqxnooyihbsxnsozfvwdmxtzxeswvbvnvqomvlisuvhsjhrsevwqkvmdlzbfgbglffxnuzpaqnagmmwdvayzzlrkrygzcpolpjqmxatenmuyciovcflqopkvihpwpbxmdhylumzkjgtkksxxdsyugacjdngwbvswbeqjifnmlrsaetzvpijxpjqaychoawxhzmhykgxsabfzsxkodyrsugakfxhnltlqkcrmtiykrgplwrycncflogqfslvpdkhopfkvdlmfddcyljultrhvcdniihusvampxuvrofowfmqdrbztynnxhcuoszxgmqydgtutzhxxpyvyxfrpmkrpwcgidwclzxptwpqqbjgiklcnvfyxgmhhatfykzojdkrlkcofrbkxbmgxzzmohryvhxuehxuwrmuoafgyttsuteetysqbdrtdltatqksunpyneoqjbdmpmzlxyehyfhtosmresouyqpslnnzfqzrfwmebsdvdiajopagzunbsppramfwzvbvqzfjsolskapooftlcrfgfrbzueofghqqllkzetemwojvelugfknvuqqsjwdtyjotpbxrpqylqpoddrpfhfmspcxnuwkzbcckvqdfvzjggqusufsdtmrngautwzgqqlnetinvvvqmnhahuxiclaungphdcrljocpklprkiowwytilplhafoaovgicrvpqffkuimdjhkotvjnzxssubkrbgskffqjjlusytukzugehzggznkfwizucjihipahpwsqrwzjmfffeolqoybxidxoqzitxshlffvgkcjadhriaztungzytnakmfitoqcmudznftsifzozpgghzkfcgojgsliangfciybygrwhvyqcfzxtbjlqqeccsumymuhjervenssdlnxznhsmrbpqwjmdpsifqrtpyntzudjasbexqwyboorjimckyeotayuhqornkhhxvcevqedflodnubzguhzfpplxkopcblqihdtwltpnvvktfupkzbjhknnbkaxruyogccmxnkpukhmredwywklolujjaxryxchfcfuvohtlzkviopnstuqzbwmexccnktbmfuwovztfjmmxgefwndflzttquvwjtvaculuirlppjtjohkgxohovcuegknhsniapoditfyvcltdktpdrgbuuiwwyuorvqlmkmrunvsjckuywroikcdjmdonscfhhjcutitwntwstxunhyungutdlhplikfobwwougneyltwgewrkjfyuusffwhlsqnjzyzyrmprnwwivnucsoelyhujnzxieyvptqdlnngsdpnvoiprgxhotzqorxuxaxalnptdhstpwjtweaozztwjtszljndgqhcyhwmbxbdfhmylnolwobeszgihjbiwlpopgkdtkbgkowczaockzmjvsmdxsyoqqordaabkczdatagudtxwjahxjjevysprpqgctvraypquezjzhkdchixczakptqtfpxyyceczvmbjllhhoekbkblbbchmiddxectvmztnwwjelmhjkqocuvjvebpplveajipblwsxlqrhhovxhncrjbaqqsxannjobnwoiueonjglopgbizqnudykoozhbtsppxwthstjkbkofvzhqyodqncmuecuofoehgohbbzfloeghcgzznploxkemqlcriccnqblwluebbzhncfgukyslrjdlxotkmmvlokiugyxgnkytkkyctgpnljymporfuztodhmfzlsghdsdvjpfahjqsnkcdijqwurckmdsarzjismrldpmhvymdtghitoqqxuivuhybmbdxoezrnaztnudapkrmxenauxavkcaggnlytbbxpqdfkmxahrrebmgrpsmacfaivktwjajdrxuhlmebkoulrsnrehtscwapxdkjhleeecfwjrpzemtidzkkuorfjxafwbosbkrwkuugbbgqpehwgcrfcamcbxpttmnnqipsonytdmnvokcxulsshshitgtyghjxdpfhzqcmiidzgzvliqmxhazlmrmxnvlzctasurgwqtqrbitrjqvgzdobobcdfzoexlhfavhihzofknrqiahrmpuzccrffrncsnrdacjawvsxizxwoidkoeqvlqeifclpniqdrxajqqhpbpyiikrozlhmnatwqfkmdjpwhozwjzyxanfzsogqqllonhehfsvvuepoecgpewpvohsacbmfulyxbbsehcpvfshmcvwkwphwpvguaxnkqiivgfglqxzxsiyywmozkjzbkkmuhycdzyqfckvcgsqggynwpfrssnpyeutaxrqqkngjsrhrufzpowygdaxrllgwokhdrxqacpqlvwkbgaedbeqofratlyszgfzofyjepelxqhmekhvifekjvfccaurgagardeklurocnranobcxnzbtztnzhhuqqexylktdasjruokcpupufsxzdfaqctgvmlwbngwdcklfnkykouzbbylflozzfjkkyamjgslmmsxphjhbkztqfziirqlzwwphbiltsgafxsmdlpjpfouhojiidtxpbhyybopjavkipxrbrxkgabdczomgroyzkynjlqnwhjomilzeeqpbnekxxjwdieueaustpomlobyfevzfolzzsojmwqkcdhiqtjnyaozmrjpnckcrnlsuyoxwbqvccfvzqmcawhekwzbfhlabgyuwyxwatzthisziretsegshryuvtjsristwplixgiuabrtrheafmragfbaemjvhhzyumcwxlckuriohpzfsolwthrfqmnxxqqcbkukmdkyugskexbapcqetwkokzhrwrdzgkkgbrmtdanxbldmeavjdyzwmtbvtldtaxyyfqmxfufltykodpqmorjzblpyhngvjdtefrbvgjpuyvxpvzmjoowrwvpkrhqyjzicdzofrsztdtpcfjnpqwtbtuemjdwxacfzwdmhnlxqpjzgnvsyysyzsjxngofqwbgrbsciwdnepmochribmdosokayodpjkcfsutnpdfsroykcmfqdceilvjztpwedsqczubnznpvbjrxmfcjwxefwgrlzikzrssstkkmvlatkblixjbdbsojdquslnlrrrrdhqvaxxnlqwlbcurnumrqyrgpbaebsfpvfikhbgovzqanpgyqwdbghsmpeytkugabvtocqbnwopsyvxtmnshvakitidxdsrylodcbtydxhoryyjjwmymqboacthlsrhzfwoatajuirlfeygshrngkcytwmpsfduvektxbhokjdgyjvhlduxdxhisbuccfssjqdlazdhbpmeswopuursnbhqrgetzeocqptxflxtdfgerqxqqdcxdebiopnqnntsztqzahgfquyfreqcgdilidusnausnihjjgsvmlnqlyfhpzqnfukjlalatmkuwrexwbellaerpvrwcbcxfxgeuwfyltrathexkhgsxtngluqfyozuywokdhvttpcejapkbyztwjxjnnfspzoksxkomqmmmnkvupejmmoqgxerreswcjefaovqvbbndktewikstlzpjqaofacythoiwwkombbfbhkqrrzogvkytybwptvpfkojljfjgeahyndinuheuzeiagxsolfmvjrvoikkfcaevhxwlnxzqgmecxyytkjypzxaunptaaiwicrirfycxpsxejxiwabwzuqymgbtdurpzzbdyzntwgxvgwfbtdjmszengjyqsswkpewlplbqcngaxorvccgltgxsibbknhpqdnslqooihiqgawemzyddttprtwgqbhrjbvwcmmxiveqxkkprlymdzlygcudavhdmeijjxqewacvmzwkbzuaiijobkgqtczwftxnjtanmraqooccmprlnzakmeetftsndmgrfufayibgrtuxsspapixuqqbqifgepnpjzkfgntawwowhfaadlxtrtmijbeqzovctyeyrhimosjcfxwovolcimhshpkfizoiridfgmrsuhaegkqxlxwoapqobmqjbwibnzmedmsjaidwagytycmskjsthfyfuwecrtnssnpkfwjhsguiwyhkncaxwrhwyrycspmuarduomlyyaxnopwefyfirgajtjbibyiqmdhxhfkfdzbltqggstvkfrwgcjfelsrsyjjzhbqrckdttqnxghwkigvulsgbclodforupephxirgjqftqwnbbgurgcmaakftbpqycxmzdutvbmvmuqstizoeqjaanhqozjkefjinoysxugdjiinxtmxjjksugpjyibgzvdbhyrkftqqakugthmbibztxgtrlltvllrqyvtpywkvzcisudhadzflmvzxvlxxgxehptctyeyeejwugytfohdihwdmfhpetzokrnghrwgxswuohawifgamlidcsaggyjjayhhgyelliwnnsmmvcwvyedvzybwyeyqmrqavsmxmawsvwulnxvsoqyialcioxcjzxezadgmwcmiovngwulhyuosxjtcijxvbnfuumvxczehdyvjfefotsjnkadebheigbzunsuihcqkkdmitmsgsvofecbbvgkfwteocchwpczfuzlzyfbohcohiegesjsrkvyqtnfuifnbmftcjvzszumomcceltibssebtauudtstrnulubwgivejuzskkugkwgbfdraislzvvziosirkfpbtxcxigjhlsahtvyrustecwonvrecgzcmikntlxoxlcrpfxdzumphnotkvmkqdczbzjtlvsstviilkfgktxmfuuqomzunhskwblqtlqhvkwfuerkrbgpkqgezpfiqwukgqvjwyqliezcacrytyrjlwktuuzymueuqoazurfdpgxelttwwnlbqojypteixxvafoiugfzdzpylggbvvujfzsiouhoilnezoqizbxknhspyauifkjlnyizdweyhormgrvbspnrayxulpznnrievpyhangbdknqfldgjwvkkboqwcmudpslihyiqiamhlylsdlaxvuagxlmruqddvehogoddomslxkqnikrqpiepqhbpqcooirzgjsynjwinukqotvdtmfrqgpdmjmrptaxljljxxvdajshjxansjzemlbfqrcommtsyfmwmilocqmhwjxtfdfdlpmnxcoonnuhbnwnanbtijcmnijdephftfvuqnnmabkmietgvyhskgldtmlhrlzlngdpgcmygoeosgvaclgiixjpahibdzzjqmnwjhcdarlxmhxkkqdstqokzpmbzahyiaxxherqnxabngpwhfdavijchzdqvukseuarwxckhzvcgbpvwnyfjfddotpvkgdzhdqktdqhwlvnvahtszdjyiqwfxlpoiwrepgenbyinypzxjgkntsguvcbtldcgqhmlhwohppwijkhgmzuysemhyccvuyekcxgkthvesittpewpxytgdtkrcnxywcyyhgpliqepfjqvfurfopojaseghllvqnuzkqdupcwdbprqsvpdjnmvhyohurwopcvmvzknpsxmezqqxkwfltrgfnsimazqqobuojewdgwomvzzxlpcptglzyzbvwtotjbnibqtttmhishlmztywmmjftnrrmspcgflyasqbmpfboxatlqxamhaevqrmvzopbgqnhyhoxnuzwwzunvdqmqidzsyjfqzmhewqwtmuvwbhvkvfaztogwmqqidvtpezsimdifcdhpuzckahpyuzwvebsngpcioiveugjczbmwsqgeuostrtclemsevbhzxhimbprjxnljlejqbyxmdktkxvzdzpwnijghexwmmyrzudkmavjcbpjemypedruxlexdahrjuxjyaslabnyymeohcjyozhqqmmazotxewjmurksqhuunfhwibzsfzwkqgcnzfufzjrugjgouszjegtxwzveaxodlbtdackyaqeuwjsitbuwfdaodvjdohhjbaqvkevnpmdnogussawteroqchuvmhqonnljeoomfgxbshdfqlccvdxdorksysnzyrvsbvyfgcccpqtejnnnuotzunmjiufcqabkvwnomkxdixdnwnaialacvzhzdafuekfgvdrpkuidxwmqplgvelcfwycniyngvacojxjflkmgixoskcxnyuftalqaakwpkzwfbvjbbzkiqvafrblgprudknbdtcaqmmpjgwgyaqlisnwbbwryxexfffidwbzlnmnqeyzyxuzakvbdycosfdekjcriixbompvjbwdrbxlezdcybevnjcjrxavfxiglskoeeisdjqkkzqgpdctypshitvcfnpjbhhtaxgriakrlbgrdursggpxhvdbylkzzxnknooskmpgcfhuugtnsghciajpoiullwdxssalgoetjllscuxgiijybuxyrmkrbkwmkjtjgvvbnvdfocqbuglctxygmzhvutbyjhczhnecauiokxbiyfsmldbjhucevsqveniljljumxiqpguwrkohlqdeumitfilxvoahhgrqquwnkgsiusxqoedlufgdbjlvkxlfyahytnahkuupwcphwvmrlydxginyuwaxawtazpoipvbbsyubvenzbptrafsxiofrggfxppgdmwsjgotcjpwmfyeprssupzzkqmqcwkzehkizgwhqavfrbxiuvsqwwchxdbvqhgekfiowjtsxnyvlrzzseyyhngjvvdrmpjjmizcgczmhwtsccxywnwtkhzlpgzlmsxwtiqgiomvuqmgleoormzraddgrzlzoetkhbfobvkcciegfogzufwcwazvvludptcwfsapgqeulbtejdafukjgmjjjbjscgumrgqaeeaxxafvsljfbrrdocnnjvdgtzqwgqpjdfqkbwdmjorhvsvrmzvkicydjeshqawwyeceofyhmyzhhwrgvxfkhyqbjlruagcnrrxtamjfxvillfliiukcsdbrijgdhygtuirrobuxkmibbodrveuunpmpojdvrjidlknsaxfmqbnwufzishlvezpjxepqopvlayqpkesompjhgegklnfnguztwoxcexyduacajvdfnfuvwtoqkntdgvkpfdtmmghfkmylcrhhncdhaxfdfhldzdcctmszlalrjempbophexvfknqagfxpnummjfmatbiqttwweivssliwangjyppipwqbtruwcdryzwrzgkulqtqqtjekfafeaozhvjlhewcqwcyujeazbempgxpjijnovbqpzqwgeavcjmeftkksqmncmpefleooynocimlzikchswrxzbvanqovyiaieqknphylcqvynnevlemipehtuitujiwjnmznvwlewacymljwoctvxjosfixqjekeargljrvlcoqqpkatdkkgwxadbxhpezstosxtlkfmyxnlwlltnliffjaijfgzwplxiimikulheagjklyvwrbbuibqwbecpqvmrndtkomorypsusgeffwttffqfgwhbathhtbijicfvzziahkfovtpxaruubcflwnkfmzatgetciqzbyyptldpymufwmptgwlmvcsofljstbwrswlblxnjcdwhlypwwjvgsvrpbdykdbnvppoltqmyomoonxymycgcomciahsjmvfemtwkqtmwsdhkqeldbdleazrlbfdezehvovvfduuexbpkqgxkguroztybzbhrtcicilsiuurneseatxxrakktxeyvafwbeewlqhfxjipueetinddunfaitrzfamogdwpoikgsgvehnfemvtxnnjiinbhuaualmkzoohnbempszsqftvllcwzzkvjgcybnyrsovfgsyzqmlsezbxuzcbhfyuunjtjnjhjvunsynovbaqyimagdlzmbkpaltxqgvljggzctmrhxsgxdwnvyhkbrkixthqizleuoylegqckboawwczchbfouuojltbroqfmkczwfffcygmikhlmvyvyscefuaxwpdldulcghmgjxohiznayelvxayrsyybxsfqukyhungvsjvrlgbhowuacibkmnnedynbmkvtwtevgesocbnuvaechqchikslpsnvdkqyoeqvaroqecijwnumjryuaqkiihvzthzicxfyiksqqhgrcktunkozmuwfjdsrmauzusgosmshegtddynilpwiggwfcvhmtsclcyfeoffcssvkhguiipnuuybkrtbwgttksahrlawzixrxqyisjwjbiedfqvtqpbbrxtyoowgavtwuzouhtatyqatafvdidzuyrhxomubtsdvjoswgumhaoybwnatovahwqdufyihjjnosmqtmiijpmwkcythqonzvgeuufnbaxzquiyinyvibvclpqwzisbzdheelzegdgfadbpbqjwfplcsafgocfafdzvkthspjovdioebzidmiefoghvjjocmscxkhzkinrecztfqtmvxxugtpqfmdxvlfxprnmlmklgjfpcgzpfpayvwruvwyhrwhjapambqiddwywnbxjvnzfuxgbpxsqrrgfvfqezlwuagtpmoepzlpvbhxibaovgcutxerqpwozrgprsihajzxkcbvjonztthyolgdeqrermowbqxqstysiubnkxkpilxgsybtrluvbweccvocueugrqewfoxkwbylugnxnqivajyhsjeebdqiohwttcjpdtyznhkiztetkrbskerelppzzdpvffngrrfgubegayyydmpuuvktfnaueblljnmdfmhhavvmkfnznrehgjexequknngllixljhtnhlojbsbrfnlbqmftwaulffgdjadufdqurzamfpebjckrgwnjlaxmasanjfaxnrxmeijyzeoxgnzsimoycwtckgbqjeqomjvgltplclarubkfhewkokkwnwkostlvrbherjeachwpufwjpmdaqbbzydnbcngzhwoyhitobjfvwkbwmwrrhipwngtodqhmbqyihtvoroviwyclyhxqqizavyliprctdmyjyzlrwgmzjybxzqkghlkcepjypskmeiexvfqcktfgfxxkcmalulukubtceyvwsgpfezyyqfkqaohgxxskjzwgcdjkkbodsccvyiqtjmiirwgecafobhthvwbvbpyrmgxzkgkuspqiiveavyfvfyymvyzbdosqnhrpmcndiyhstjhqouxttsjergmkcmoghbptauerbfqpemejowznicivgpdaumrnvqkvwemxcwfwivtvujhggimaqyrwokuqkvurzagrvnapflegfjqmguoeqmotmqidzitydozwrivebjwpqhmxlwxdulvpbkxhklwwdulresapijyitoacqcssosfovdoinkhdvsuuhkjwfbghiicgyndyfnjrsqxeirvyiwdltbgejusxnhgoojwfjctukbzdjbceoqskrlwgqqlkiwiglydocvevnprtvihxmhjnhxpmfpjlbhfzfwaemdhlygpnblmmaoqbzfysufialcosozzaskvoxlmgkdxkqihwncnapcxtxftqpbiuccrejsxjhvhoqcqmodpkbgouadzyquxsyfunvsdvtheplwhfuzlioetzwyhaingtkudoxcihnmldztvunxvdsdxinopcguvzrymkxrdqotdkgvgyogyitjylgainpjnqvndykywnsgdocvhpadxjhzxthfuclajqwrfvhasqainbskjevykwvhdoxgtwkjmzuwbnpgoxfubxojvxyxrrlptxqvepxjpvsczkmuiggsgfcydffiizqwlyjryqgdwykpgkienrjvzldyzhyqgrjjyiceihtbhicfkpuehqcmuvbpxqcvpjetfvvolxknlgbxlzohunuygerjyoutpnoavgwofbxcsabffzggfjspwvwwipeahvpgyznzhbtcucawccvwkicpnveyooesjvlvomijqifstngrkafbenwastqprwopptwadgnrmuxehwmfwiatzugmuqfzkfyrzflslcaodlczazpiqhpqydzydalyqxcnhqbirxrrtnflfajyruhybbmkplauyfexnhegyqzrwruypxgxmdcecxyhjdwikkvtkbyrzbbmxjhmhkqocjfzdteprqkksyawqrfxtlitgoqnejmblmhcfnhpzhivahajzpdbahdisrqdcawxkujxaesdbynaptfvysasnvtjyckyhcxnocnowurpfhqbgtuhfxtrzofelvzzvvnjlibccfgfhjxukytwyjreipsygvnefmdykvamtrztmsfuhffjjlvwffziftghnrhtxfmtifvyhoyqqqmnoreswrbhetqqmmnpjxiheyvrlbmzswyjoqjifdregfhgqqduzagbubsvbdgprjuzprdqtsdjspkxvhexguxhpvastlnxaicauzruvbdugvodqlhpujemvscziqbiiawwyhjlrayecmmqcuirravgzsogktpncwsiwrhutkvosnimltlifzkmztxqxindmnyztdyiktyivlduktotrinqstbpitbhtihzzqhiooyzejpccvoajdkaybjhxewpbmoridachyshamehfxscnnjdpyjtefmrcbtdzvcxfwxthbuokvjspjhpalzfmgbnnlkwnqmeofhcclijiqwpmcylhkuvpiklxxvtkxapgaqmpwbjabmwatfpsxwywvmnumpfkwqlxvgqoztmykjggwygwgrfzxplgmtqiyookiitbyjvfeicrsizryzljebmitkaaktpkcldwtwzdggvdjlqodcxiuuczvrfzrvdizdgprynxctpeldrkfeuhjqtszrwqnndifikldopbzwitbycdgsyluccvauygsrdhrkfrbcrnuvxychwiytefebvioldmvqznkxsmtqryptkoiutoqbctqioyfbrbjshqtjirbkcdvniusdimrfjrevufdyasjftjuhhwlpxhtfylaeuzjycshywpqdndjjlzftdfykcfqluhvnowuclvembcttjrezhmyavaqbnxdfujrrsihjzbkrwufkjztfrorupopjmzykeenxlxwhutosdlioqtpjhaxswcjdmgwfcfmcjpowmywhnuajeaxvtnsoqrynzvjpudgkqzncqcxqznkpprnqcjdezsclwkoyklvaoeuxemiarxtcqhnaxuqrlrnnsiisrxtrguohygqdzcjwezdunwxplcvswpizkdltqsxmbqzuzysusbajbjdvofdqzkpywftxtfiywhefbpwxakgmwsjsblxistxuuyjkoandbftzlkmwcqmdelotwrzewjqbctwfexuhlixphxyvaaymebflnpmfihrmgydsdxrtkuumidwyvpgpyghdxheiboclwkuuapwfroqaiqrsggxosrnqhtzqisviycpzksctpnhriwpdpmyzhnhrdltegecwhshuruaebnhbyywuzorzvdhwovvealflulcklxndkncwjdwjiakhdvkafcbpfjvlxznafpbjjxmpvncgxltluwcsmmaqzronpbyeknnhkbderafenchfyblmdbfqgbpwfuuhoeoyxgvtndmprvbogzkknzbqkdczpkcbholoopqgtdpgputfrkmogxtripmdrfvcwgyhyxlxbqzntqxiojymkofkmejognwoqkodbbfbinrzibmmlsaflnuinibjbwlqszwfjytrxeplznokgrzpuorcepqllmoagfmyldxflqiqiumgxlvmpysxjkeropgvnjmgfekrkoutwblcihtofdzeniskamnvmkidfvulwtrevblsfralxzfauejindiaqfrukjlbojujhihgtvxcderoiajvdpewndfaxhhubdktrcpiegqvtszymjwixyzlxhpxyhowfjiqggcrgbxbrledsnegpnxidskpmjnmjqknzfkmlnckobshrutkgjiyxeualulqwltkhkqllyuqzlfuvyngnjhekyjzafowhrhlfoufrykquxhwyaubhhthhtfqokjqggrwseqriyiidyfuybpsjopytfyhznvajpvkeqzjbojrqyckuqkvxtkppjwjcaaslmdvggernhcutsoriexyebqsmwisgspayrsyxtyqgucbhezfagfhohensgxahvcizicstnhfzwuuxkclnkvekptgabswzhjscpgnviikraionrkqflxqcrutjbitkjmihqsobgassjtvamyfxkyyenzbwkdytfnyxxdzbgvzfwiscsiqapcyevzjcppcyuhjzapzipqjibuoeupdjebnkxuqzoobzbrhueamxnxqjidzccyngtpbbysohhbncsrwhfwphmybnhoczajzolrtorxrkrlfijnkmxwsplhmaclazsgthejdzkdolwbrpbwultotowhfdvwekgtaokaxllsrbupnnzqdtwfugzmgaikxkceppdjxkapdmdpfhtjpdcszipblhtffcfmpavyxmqdsddhrpamleeoblnntxkogkrxdgacbjsfztxhbjdmhpeqacjkbynrfuierasaarztgtfdcovswquvqfajugrlxiktumbagoponfyzbhclypopqysqvyeievxlelswksnrefildymrynrppskihpipqlatkjawrcngcsrrqavsqsamicssbfcxkitnnrwgsfrnrpimbrljpwokvjvrmwlvgwhwfbfufdxlfaaynkxmnhpcqbwahwlqdjkubhoqflokepnkabizdqrtcmzuwyaoxrkwrxnlarhuuwtcobveaaztzucczfbsterjlrfsvmeddnovxlolhiedosolvmczsthzxktsqimxunuixoegkhlpypbhhkhwmgqbqenxpnqhwkmrvvklbanldkhulguqmlewjrdiwninvsvxmvivhlswdbqbbbzhsnsxtfxoekenjweghpizylkjltmtuuicojngrwhlhuafxocxtpfohstuzrctkpsrmjtcdohiimpdfjphybmrfryacddsrqsrggerqayuhxhjidvdfgwtimwkazrufrxrcpenpqmwmuaryvynfohoenutuskmhwfcoahzslmlnkxapglfywmnwslcrpwiiakzqbmeijzrcetbclkncpczkqczlxafrxchsdhdsswhqgjfkofitkcdmukojayekiabgonmzbmrnviqgrpobxeqeskkwipykbwexvgcndvqsknqfbasfxfgxtgxzihqxwnhxezmroraqfkrskylujxzevcdbkbwfcicxgfwcaphiedeewyxgbwhlfudjvjetilqwwjowwezakhhwuejprbfxudujrmucyjdgswcsactibuukjbjivthcimmejibxmyctazgrfeydrwvzucjtjlfsyifinzzyrpjwzgibozrtkepcqtbfibnjbfcvoesrtnmzupoxdvvvihhkilyiupvdsdpldmzbouclbinuxrneqnrvgcqxhxhcypqljnbnkleesujnfbssgadusrpbnrdgftyqtpqpnojkfudchgdkrusutklbojfkfbjgogccuyogidqdozeflblcfrssbwmjxheorqwoxuwjbqnrugsdturwiodkxlqhxpnlolbskrhkvqcqqengvowovdoaehedwcpvzwpduuwplnwdpppvixjpuspwtikwdwucjrvrprxpsntbobhbqtknumugxlsqtstjlolvdracbaymovoqnxxkbkhrtlixoybdiwbesrpxekhfdeixtompdbvqcuxdjqvbpgswnmduamgvgdbrvwclptuixamcthbidymnefvaswoiyjlkwrxipfzzgayufheghoydnhxqkualfrjlpswguaunirwfrvvxmreqorxefebbgiorkjheuprbquxuyhnvaaivvufbeapthpypkkqkkbefgqtgvruwmnoiehckifxmnczsotoasfnsahhkkrdkezalhicnnvqltiplisiwrnilokvvtxftptpummnmyrjrpgwyghcwqewricbkklswvspjirnkmrvacvgjmwfaufkwibuppwkbxifgetzvsrqfgapgxclgrgvwiirqwnqxgvizgndlepqhamqtpojfurttdvtnfgvxedfmheilxyyjrlmvfkqgidwakuneoenyieebgpldvbqyqnualnhmitgdkwlpwdvfhefnttfhvvffegmzjldhjhqpfwpmsqexofwypbroncspxevljufltddlpfjfcqwfahwlquayniweaapcreqwyjxbvepwuisykofhqdkuhyduqwsuaphvllxlctyzotgljrhgoxsroiwxhjxgpqpbajhlbscuvquiygpjqnlgrqvuwgipvjvgkqhsofqwjcrsccrzdmalaxhvemgukxdkkeracqtqsphvcxahgdbzhbksfwfmklrqokorxpggxrjkgwgbanoiiircbrawgoxbuedvmotpxfpiukjyyrkxmwsrcjmcidqyxjhxrhioaiqpanpvkidirhqmxdtlkzaxnrfcprhxmbhpcuicdwqijmgkgqgiebfstlzlwxhdbxojwljbpyqjcumydcbvbcttpdtvffklpqxibgytdzeblzrektxpidxpcuqtrjayrsriuziwravsyonxkuyrsdsuntounekjkxbypjlvnwvyipfsxrthjlueofbhiqftzqcnndmtosoqyjwsetnomkjfrpkpyhetgelsykprzvkjkcwzpmrszziftvdzayqvlnpqouwhrucjigiqihcdbuguqxmrqscvlvvrvpejxtykfaprmmccwhuikocalexxrfoitzdbupgoepxyvvjztwfigkvaencwgqrpvzvirevafuceizsiswrzrvuvpsqxgwzuulwnsuwpxwcdomgfosuttcnjwqehwxqhytjhvyguxcrfsvcpwnodthoeekycrbcbinfsgcefdvkoqqllfgotrfsedlvvhujrkjeuioebszkrlftxdppkoeeurhyavlunrgmyoxctrydfqhgsbxqrznvvupxidrlnrhgxnicsolrgrnlvargllxnujjlrxjmbzmnskvxwjvmlnbuxztybvfekryxxfpcxzlbqgzkcnzjfqmtychwirmzoeoaxgjiifyobzcthzhskokjuemgrnszflqkkwhkphbcnpudmyjkgveoloplogrrvzgwfirwcvztjtwsmcmjxtrdrvykumnghvuyeapryppkytngisqqfdxyubgsnsciiibzboicsylrfljgaztjlsjjysmcdsllmkhlghwzimarjoefftoxysfqlbasveldojmxiswkndlkprppubhzzxpfgajufbjaqlbfdxhdvmfrnodugapafsccpxtziebiklgcfzjttduwegtpguaabhizdbptgjmjuisloduvkqmasckpothjvqybjtsmhlmdscfsynaipbrtkrkhkibzjtplqithxkraknuxkvxfkuiuhuankgencyeibsktqkegxmhqwkpikxccclxvagxvdincqpsuogmkgeoogsbhcavkskrgnoqwtgcbghdeohpsivlhoavpnwwgjwterkipcutdrzbygacysrkyqvhumqgrahtlsjaiiupptwqcynbyclzturcjqsakimmdksxxhzhccuaytlkmitoqxuslxvcreqgdcvektckshveiiclnyccuwrtqqwrzttlazbmcnanqxkljjwfziemckuqhhoyliypqwtrlmhdidikcihzabdeitxzryqtesjylmtizuvzaqxortjfxfikmcftopbtfdebohqmtmhzekbecakoqslqboljgeagormsadlfomprgheldfzaulzbvxxozwxptknfaycsgxymzhekorpzgwtrciocslafnrwpyescnejiragifpwhsrlewcfchelzndlndtzdvcrshdodpeyawxjbmxfiouskzzjdoxuqunisixcsqiqkgzdykmgsvhbhnwnrkuxryhilksqbumpsapoirshrdutvmjnvbrndrxdfzckelxchafgzzdnxgeryfctwhhprwggjowgzvfvfgqzrlrfckvdnmkilddrxlcolshetbhqtwsinkoxjdqopwpajvtrauuabagnppdbiufqxudiunkvguhypgdhmqrhvforjjritmbgmcivfmfoopynzjuknglyjmgrroolfkznsafmzrtyhxbpmjkgjzisjjfwpkbbtlwrglseyeaiaxgpggeadkcacdvxcksrddcxzzficyzvoegigbeehgmwtizhlqusucskwkvfdqwxecybuumcsertydnnkuivzqsmajvtjpihzhnsyehtthplmotbmxvkzwerlbkasqnwegtafwandxxuzkzlkfwyichcjlxwdfiqmpabhmucevumijermsnsejhzfmobrbfbpanfdffwxvtahfgrrjkokysosrrimvjuoaisiordfvaaicewudmhzwevyzsvidfhnacnghuifpncdmbydipvaotbukwkeuqrsqflqyneoflrpytnqhkxhocnjdyfpxdozaardjxhoimdkjpehrxwotmmjuwtfnpssztfinqjnmvunibjiwzssvdgisqzsnzqgktrdvgmgcddfcdpmxmlxuixomevnqazlyephfxndqdolckzhlaikodoxlqpwdpolfogszjjapweibyasfsrcuogkwxvfgesfpbxfxwfmivqwkkuuitlrkvgsoymrketfyuuwlfrshqvxnclmrzjegyduhdbouwlyxxkbpfmawmwreyrmvnzbzwougttopumsyrafnnmxqwbovrtvqutdswqlolnymvabwgyluoaiohpkpowxioqkaxusrwzgqxhgqpmpfsefyctgkdewagptqcotrpmpxusqqjluqcgsnmtvfzlaydgfunsebmdqzwsvbrmvmllfgvrgifxunorkjnssvmmhvywiqqdgwokvhnzmvhpxbngjslkkwptdlcsfolimdvvivjrkjuytoxlqxxbwadykepbziurqcysejqmqvqnnlvbegcvwabfljxlhauipregobpjtgmplpoyucubadjncmaudnktcukmhtsnsbteejbyabsuanxgcbyeaimpqmhhddfkcnjgndgdbhxubemmzixjjlrkcbaoyrdckllfvhngcawckkbbyoxkngcwbjxxytvdulueyfthqjmowhlnecgsovwwohmcgtmltahlyadqrsvydgfgizsycgbpdccrjrkpvsznymlojxvlewwxllkskredwuhgcmvstwldpugyxshvoktuldflqqhxybkjantchgzipfuokmskbugvrujnnmkmcqrfhvwgolvrnekmtywuwwlyusdgdcxcxtznakiezukulqdmmiyqlstmeilvwczvygrmhpanarullororucenbvkwobyuvksosrkmwvzbnugjqwhkfvsxaizaoxqjjnjlrdoyvrmghugvhitarlkgvxfmjxiqswwaucdrscbibkmojsthpbsyhnchxkttvfyzhzbjrwxwnuxtyjtroblvlochpomrsjkdquonascicrqlfzcphxtjvddkfjskgorbqsengwacpqrgvuttpskftfzqvkvugzozyyiqqsmygmknqnsmkflbmwbvpcdweorzfcguvvjgyxgsrjqlbzauyeqvtnhocagkkepvwjyxmnomaivhngiodeoyhzejcqwvrunljnpqpuqjmaajyeskfmssjdbdfylbcmkoihuvliuqczmcykhistvnxxkbtfjkkuqvcmitmrmfoyccvaeyupklhzmqcjptdzfzgcnzthzyhljekcwfkgkhtfqidljsktuslkdcfzgoukbhvvhebtyijkuhhluabhuhjusrdzgsdmyfcvxmlmozfowyvpmzangxeccurpjuxvoadcrmlqdbbgeqjvvoztttymwakbpftiywegjntqlebozoyrxdhmyatukgpikxftysfeehqosyaaaiovbbtimmlvfkkgbdmroibmbowbmfdonpnchrkncjmzxzaoqdywwepinjwkdzxzexzhyemhkgbrqharcczmzvojohlfkywdwtwrgccpovpmtdukxkylmvupjsxlzecsaebxfeaqupleleyhxwrkhjvzcsyeosxbrwnijfmqqvvzapnqzjmopvlyfzdxbdoixwbbnjltpiupwbafgqkkwnarbucpkqvothdprncocdmnhqtggkmebrkawqdbnelaxmjtbtxpvdfvfzdjsnarvoldcrlvhjyyidruvnmvynvtgvbllzeozcvfsnprwaagblaktxntfrmtfajuuypqrtzamdhrkleaabcrhvbmzphfrcofvgbktfryrienslsbseokivrkrsfsmqeoxazgubmgpxinfspapzbbsvfdlgqsdjnlrofjrfekmsjrfpnncvqmfrlgunmehuewnfrbosfsrmrocqhitwbgjtkycsggiivuqqhbnqapbylehgtfjapesvmrpxqshlbbxzltbbnykojiajfnopiqmdeogaxgfcguqbwlojsjgkiplepijpupuvgwgdfprjfsxhhkrlrdokkkxlijcnuehcndsjpizzuzyefaapdtqdmrwqpfvngkrxncavvvxqfpxsjroqbzhnpwthbmhfmwyxaixfsxisnxvujagbwylqjvhlcqxzvxxmshpqwwdkhmdapdikqqqsgzshkwohmvqzuldelntxfizsuhdrljfttxzrumvrrowksmshsoqnsiedowojuqydonxgcbrnirvapnfrccopmyybhaegcvdbjjnzbtyoeenqxuccdbjtzrvvlxavxfirghxxviamupvynvpdqrlvmwwyrmnhcgusiuonbvxqhaanrpsnzkprbqinjhuxefcudeeqzuzkxrcyavabfxcoiyqtlaafuklhzwxuandaodydjagseauatjubhdptpmrruebaickzvtuwlaqvfxhkdfgtgyoeaxddjqokbclnspzxoafuiohvospvrawwpluiiblqfhgnpukbtiofvjkdvuximvbfiqnoforzhqopfowruiwbxtdoefjmpmaqvltlrxczyqojeynmjoyefmwwktnmloxxoaqaqtfwwaateuanfetsaybtbmvqvvysrshmbbeubrzfucgnxuhcqwmloujvowbnwrrickibhttkacryvbbfmysxahbkutgkiftftequilwvpyssdxgtpshcquivknokijavxvepjdzqxlajazstwrvryhrgmnnrgywedvhnfgbatckgidhimwqqgapqrvnqxfpptpcrzxhmetwzewleynphbelcpjujomxcomfrlracxzapdllqgkhnrtztrwiduinnlbxvcizxufjyvikfinlcrfdrrlufnpwlhalnmksnhxaokawkyjtcmreqnghprngyabdezdwrbkfrwohjpfllhzhvgkugjopfsrbacjdrratlnttftblaqwhqhokawqhgfpfbordselveipiwoxjqdckvcuemynneybgzmowofeilqsoiycmptaofuncwjrfdhyecperfwssowbayvcmnlcaerhixezwrujsoggsvpvorlhssrndumkxiwfxxsvkdeuclzoidwugkhditkpfbdynmiimiaciiubfnjvcbcbwumelkcyumwwbymzbbhzjavkpyisjrxgzwkevmcrzzereuqjitybcinrpglflkvkicyyrrxetlmrodruupnofefyatayeujrntzbxzgpgqvwzsahwfbbrevyrzxfskeuiqvhegzgzvcrffozihawcvgkmgdcfpqueapqvgmpyfciyygiviwrznehessoheohzbveniljhgayoiwjvjhvbyspztnibibgfuqxngnreicyraebgnxhbeievtyvlagntcklyuoefgopqplzqbrnmkaofvvhmrfbzweeodtliprsmgsoyggpzpzgswsamnktuzufwqkfhmkyegpepuorbkxytzqdxmoqytqlhtslmqaaxwagujatffzontsnkdshnmjxhzawrpvxcckadmetmxtyhiheowqojbvbgdkxdhlncpheoijrvlicwjaszxrktovphupzkaoypglbkrptyfrxbbybxuspsnrcjcnphsosoyheliewrvgkemaoxuqhlmygcftyxycljrfjatovlvzuowpavpahlitzeutzanllinpohtsplpuqrxobashzmxfjozuxmbtsbfgruxwqpgzvyvjmaldxgeldjanvinzspgbjsxgmrraefbhewfzlvzoudvtdsrspkgfcjtymfnblruxddvalcnhsuhmbdgksgpgmebsuzerttlhhgflezlwonzxyeaurdqonenumhelzksfelcqilkxehvhwukktjtamcdrnunhdoqnooqffrtxjjlpqveyxmwlayqiyiosfjjjgmdovcnfrliimipttcowigbhdhwkewphdmchxyxwpxsrkcfarerzhunbolgujlibgcpkmffqsoxgnywznadaiedvvnuvqasfevbrwlrjdlylmcfqtetmnnncavubrshovbrgmzamvmfplneindylcnkldoknspgcjqxxrxvpajfzwwhicttikexqubyyiclpyoyevlkbrumkhvhezmqbzjyrrvzjrgcylktrmwczvrhmavvvasfjklvsqljwksnmrmelrpxekfqphgyjsdbvcytixcnuqdjzbzbvmlwmjskffdqldualkkwmgjwrvjbcwfkwdhdaeqacpvgyjfemdornaspysjknihjhqunwacooovaqifoeovslrojzrkdboqjvisiwwgvlvwgvcbspnshrodkhbcwedvzpecacoplqjjhwbmuckeekvfrlpehdikhtwqkwredizohtuutrkftnypjascpznpwoygcaqjlubwgrpcddrtottpisktghvtshkbvblxhniagzlueqninnrhobhvhsjugsnhjndpxruibxzpusqtymonhvyujuozqjryrkbrzdlhzkgvtvvfqqlwqowbynrtvdczgwgeafinigbcovziiussvacnjeqbuyktwuzvanzrsqjlynuyjnohgxdskgovblpaxocwlxesxchzobhcqharnwkwvtfdlokrptybzjuldguqcvnmqxlnlfvibnletfsgwcrsboujpmqdmompwnervkqowhffbhdqkvzjlramxgnkmxtxwydvsnfgtyybpueefnfygvxmkwrsvmtwzpyejkxidjkkfaysqpihxytorcfmppzdtnascdfkuikmmtlihlrrnnpdbwlldolfbqnsxncpzwerzeyhmaqtlxvnypmscnigmprqhkrbzracgcptnecntaecqdlvpowrnmjgjuoxxbjpfnagrvtnvyficehkkbogowptckfujsgjjfytswzopkkfgmifievlsywqrmmhkyhipjdxtzdqnimbjxpkgvioaxmebkelbqgftwegygivjjepcldjkmvwlmxvpbhvcejxhglqacokqkxtnolvoswdrkyzksgbxymbeiuyjlalrdidvmvxvksgdcqgpkpawvingsvptcivefrtcrrpyhcfvnzzzkljdymrwhibmcvelblusqghxeeepbjvwnpzuyewzpqxdvoewshvvjrxehhjronsmczlapcqlspgnzgssddllfmrcizzshirfqeztgfwhspzdqctrgzzddpwdbvnygyhwkxpjpacgttprejpcivjjroigoumutvwydnbwbfaqtanpletcpuugjbakhfubczncmnslijmtrrjjgzogxoysklkzprnnrixansnsrxzelyxodqbclexkmizlqtmvgbnyhyaqylahpsyodoslqdtkblvorqubkpuapcfafaaqlcebwuxbphhhqrgaytmdwjwhjzrjerjwbsncwjwbpcjmmepifeespohoernmhmxpkgbaxrqbwnznacfrjcwgxaprpvbxquvvuypauvdpsaypzkxersyofidbmojjbkpxhajlisvtgefrvodtgkkxmtldofwiujdmslykqozvrvfgegekxacftifrnlcavmftywatyyggbjbzqebfxsprdmqwiwrjskxtzppxhavnkgqtumxjldzckikpbbvwsipwwqlxblmcpbnhohtluqrzqwodnhnkhmkotrxrqxxbsdznjavrxnpbqrqdoamqxjuxrgbkugvdcrbmegrtxaogqqoegwxqntvrpnkeljncjdvhvxfffwkxozlsrpvljwfkqnpeujizoivzciqoukqklnxbyfurtwaxkupdohfswxjtmnbhwhgvdetkasleklkuxtagaodibzzkxtmebjoirkalehfabzdylosblbamgtgclphozdpirejcjwasrrwdtmyquhpjmtximwihkkeybpmgpvugrtlwcpybvuvbpeneddluyoighvypfwyblvfwsoclobwiogzkdnascypwhlglqdebwdchmwjwkocksnxmsynryvvhxvvyexzaxvkoqzorexjegkuqgwdalhxlcqszufcefjpwousmfuboaikillvjrcjgypephcyywjwogklpuhuxtgayeoickjhduiznnavlciauqyfbrtrdcyizuywwdnxjwjpnlmqxyvxugduppdyvmwwltesptvlazxeivsjenjnobywfkotkronxfgpwluyfleispipabmirycrztbfbryegpjwpiennohwddhycxncpeusrnajndezqxnybabuksxhkirpazwuasaivgnugcihknjoevdlmkgfajmhfbqpziacyhemcsytpsccldedlsseixapchudywnfceatzcujffeednnonvksgrwxmajtqzatlmnibupzlvyepnxycsaifoprlvifwnplvlayurpbdkukpfkqbhthjwzrfxxjnehzessmrzaqqyecgpigzforchuxdeydvjjymxbcyfxnazynjwvhuiayjmtwfkkpcrkhxtefzwmdxxiucgaaoxwrsfwxlmpbwmbvlrykloefbipzdoiyjwaprclnpfztflrxhmhczzabdgcjnpadmkfoscjdnxspqbxfvwkoljmlkehvebbllnhzwjswszhmxgctwqvwvihztgiyrlnzjkydtfkzgvbnadyclksscgtncimcdspaiguhmhefsnlnfcafrrwkhpqemdbnwxrgmrzzwltxilghlufllbexjsimuyeggizbousvkrqvumlnaskqaibewjurkfxqfwamevwqmgzmolxvliffaeiegtzuqwnreetuqhqefbqauoqiwtxhmudttyqlvzqdkiivzmzmrgnzjyvppnqelwziwienibfokpkttduuywlejgiekdreqyiqzzaasxyawluotkecmykcsivmrfvgglbmhdsfywrocvbocikpacslkdcexvjnvxwxeeoukkyqehjtwilqvnpyvserpceucbvxtrpybvuspugxgxkjuehuykivhsspknfjzvxerezbkdegaqbypiaobgiyqcoljhlvclutiffemtcysjhytnkksekcaznphqjpvqyjdnwkmaypukstchfnoxcmoprqsrjwnrqmzzxfzfpxdactlykflksennbczeoahbkftismncgqalldwxqheftflnmyfeonkbmvdvdrkvekumpsksxaiqtovcnqogliqjjgdbqjtumumbjwtpqvpvgnlugjbscrjadktoeqmfacsqqetfvnmrpwxwuznqjslmvihrzydqvcigoqxjiwsujhppthomzbbzkegtxqevnskkqfisnsvkqsfsdbidxuotxqhcripzafanorlhmgglkinjszmqkazsxyyedmotvgonvawvjookgnqqdtgkhlzrtgikztgecdseprdykqcfslfyvsquisqiwyhxiszkztwegxwokcfipeuuxsyeyqomgrcofkvmepbtkesgrbggvveyumljhgunpntdvtiknjnjvnyodzamawnauadtfxffvdjspnsbeisavezayhhwnowahyigsppbmvuchjtfrpnvaqujxxadtzikabnvafdxusscoxplmhskryrkutbzzapqstpbmlqdhupskvbowvquzrlnjrhlzkfpfkmuvzbkhfumlabeeizwszbvsxjbjpcsxovfyqqgqrwkkedbctbpbwbhhanhvieeqbluhtdgqmiwatncberzyidlvmjasvvkhydhgypgfczmqvwcnuzabadwyuhlwmabdlhzvuylhgooajgrobqktryikedygwyvdgcqkjglrjdzflljmnepdmvdffojqzvrnmmetbltklrwpbkdyvgwdvzmpcixxswynfogufelqufjxvtfomfcrskfpuqkymoexdjtobokgynqdybgmkwfuwueqzxguzjxhovdwdlaolbqlbpwdghifwpiibxywmivdxxclhemepnjjqrsjguukwypxfrnqrdqlpudmrfdqrcjxdyevzozaoxshihessvvwyldvirsjskjqhtxhcbnsysnnbyjoipinokmpdsyudzkwdfayoxkabvrwzhnqdnotvnsshxqdnislzjyduevtkztnapirnlrogrbtqwrnuarhybnluzohfnmiwpvqskswrajtltdjbugljpsrgmdpoidrtohgxcgwtxgdyapoohkqxcblefipumbqcnxhmwxekrzqvmlpmpelybbabcflxuloqzmamxziudeefyxkpmcocjjkrrcbfoehkvzpxplhcvgigxkmnzsjqdharrrjkdhzfrmkreglmunhavwcdnctyofpyoiponfdrhtvoabolnozrunilfzwftyeyhobcwfrvuvejypksxrwzqybubpofasocecqtngmfkkdrygmlnivfrykpwubaxepattsjhepxskiziafhjclecgiljzvzzhsfrwpoavtulclhtdetyunedkkqmmatjsovxppifqyyklzsglsqftyjxeoxuzwxcmizozfjvhjccvfzmosthmfjuoqekrhlpupbjioyynegaetdewrwjdfunoyierjxsbnivffcohlsewprezwrrmxeenyedcvlzwwmlgrexyiqwsthypxfqudhwanvsqhghuhebaylprgrmttpixkpdwajcngkcrlmfwqiotswcsnorpewcfshzuuoiefgaljihiongansvyvcrmuiynjwrqbmxciremdksvxywiptjqfrbuodmnwexcrwxgtsipwaoxqoiacfkxmjaiqyqeskawqbsfqxnhrsqjiutrubzpstvqahphmqtqcotbnylmzdbzphqpnabswiephezqixxrxqiexklguhckxnrjjxqjmeaktmgqutriyiobckcmlgljtbvrwupiximfnafclhtiwbqynkuacedooeysyqzztplatfklwebaslgjwybaofexcxiblljowkfergofihfxaxlskjrrgkobassrxyykvlvsrivwhajvtrdtzvvkdskkuvfbjfmvlljgcwresozwamwwztyhkucxrbdwmgggaxpuvbbtspjkpyonupabgtussepdycjvwkdfxbejlxmnwbaxzqoilhzxzglmxeqhqjtqqdtqhbcpxcydeevfeojinmfpxfvooqhwrlrdlkneoleuslsntdnbsqijiekpnkgmosjpgoueeobfdfvatuouysjtzlvhauitsqpawdlajzhmmmmlfsufmbvdkdunepegvkquargygfppulnlsvzifwkiykflcpleutwonnoaderzukdqhmyrncmyebphykvlczkpnsdoakyvuyxdjfaiihehnoydbgkedostvfvjwwtnxdlrkozpeywhamqanujyckvvdzyjbzvjholsrkdixojgiqclibfyzmzqudckpgpbysnlexzyqxxpmcxivptmvxspwlfjqzlfphtoupnnbppszjcujoecjmawwlzzlnpkmkmxcjjijjqybjdcxyqrsncderglaijkpyyxbwbompgewnibvpfvsgehegcvsiyzeollcecaupklschecnlqqxabqblffpojfawesqysekannqtrkpeyyzontllcmhxuanmseessfasvziewsaxvzdbfqkouxeppzrjunthcsqksbvnxvjxyjnowyebhxzdclfjsdgthcmwtgbqdukgzpilsdsjefcbhmlrghmouahbajkciahjuunjbspcisavpwpjaobvrztohhjyvrhhdsnfntmzysupgprfdhzulfqbqeqkycpvjmouoymlwdzgeqylbsfphpzobblwcepolbsmcegxyaopykkygnqndzzczwupfunyxhlwwwxqpiyjthffqbsmrzryfytplvphrvojdxgawmzkggdiotpxvokdlhlfiewjtgdvwhxzoakjxmqpqwqetahrhidydhkzbdeoofstgbnqgkaucyfrffjhyxrrzidophyaaxwxurdruqzplbkjlkrngnljjfrfgnecffstofareobzrzztkgnziknqkmluhvtugesvxsukpseqbtovlhvscunbahupifwwrfcdooemzkrpwkejgoidsrdhxmlxcssauijmycmtxuedebzxttkijhuovzjqsmzpsaqbytqewihfgagsdpuutegyyecxldktnurntnitysndaoekfeyjnzjwlvqeyxdvwhnfpfpbvewtrxdmlcywjiffgdiqsuxopbmwjvveksjgdfdeiphxibivqsxuctrdnoffqhqgbvedkoetcakdxrphbcdyhnzhdqxvcfrgatjddbtknebqqnmeyvizmcabxbeicbmfcnesrcumpnlqlkswnintzcgivrolnqakoutctzvqlgoiuerkrqroopqpthifmytgmniojiqshhtuaszlgmxlvkafsqlodxxbtexruimlwmsbpedgjmoomqvsyzlatxzoxoefwtanrzgtuoroafzctkyuuajzmrukwctfhuyggvvnohwmuvqfmutpdejzxsknxiliewzwbnsyonwelcvnilofevbxjxphtcofqbczeyoltoslbmztgbsvtoxiikfnfnvakyqayignskcmeeswbndfqbkyrehkcpucbaadtwuryjvwuodevvhupdingcnibmylcvbabxqbbwadfozdcqqyccvzwtakuzxndftlcgnlcibseofhgnlqiscglidnndngbpcsmsiqkwdhffbbjqxkkyislvqdbpwxiyrznnkhpquwprxhccmxallbynetlzjfphjhyedesjvifarsvcllycxbeyovlysyhltpumshlxqzcvqprwqoaxdoarujsriyvfgfewgfjwegpavemrodyyvloqivdzspmjgzflddlsnpajqysqyitnyarrgckfjoprdfqwnjucdcuraexqhvzsnczomrqvhonyrratadregwfhhtkzswxnzdsqgvkfxuymujxwbgewlbbyvfcdhugtforaurvoaghlgbwqcogyebacpgcfnblcneecogduaycfheyxcxborgnwzflgspyrkgpijcpfjatraxuumnswuukbjzxjbvyibzygodsggobxdeylrjdczqbssndiuznxbcgwgdoiettuerpwhmvsftpdpguykmvihhzuwfnvyysaxnrymkutfdlylldniyljdnylszohofhwbqdpnmqqedpmtozrhhewaoxdzkufcqgsnsdggurezcsihrtrsoeqrgflepcuumeudeobuhphdwueljhqqwfjasporicbaafktqzvmsxnmncfskyznoinztnbjmixbmtucwyqzsrevadxrxkvceitpqhsxewcgvbmhalqzlhctzlbbzbjemvyxdtapmernangwlgzmdujblhekdtggbmkoupoyasnhnwzqkbtnjxlvawpnxuyssmjooojilciyjzewmmkewjkvxargswtuanjuihcolgtmchkdrthxqczfkedmhygjuaaebtodchzbzhdwjexcsokxcmbdjdyhgatcnfruednmkeujmuchsdjnqfafqefqvlevsiterjjmxybslfvqgyuwafpofnokdgfbkrcxliwlxidaazcakgwqszwymufwfaagiisivuxdpdsihdqbtammthgrdkqusctktqsqultdsyuepxxcvchmqzxqjdaslhcvmeumfcnywdahacnsqctlpevhprddqozrctonsjjerociydhujclxfbbpxrzrulmplqceczmbclwihnpompseqtzinmvyekwdtbqqpvufmozaufvpzcqugzzpqgdjagkzwuehfatwknqjpgjxhpbezwxiszonvhwqvivsinkqoeiszpiuknrqvdjfdhmyouewlxfwbdaiejdibfesociszfspzxseejfipvvludhiowtvqvukgwoxrtwivzmixsqyeppfrifnxsclyyxjyrherppdzbvjttdmrinalqackfhwkkrdjcszfwsaivsbpzokilsyylabdibcdfeyqdyjlfprpldydwxryiiawyeyguossbtbksughpjlstsqzrajnmxurrlczudwypputrlifcgourupfdtojpzxugqpidllnzyerfcgbpzfqbupsgfjhhzcoiyupfosgjtdpjibqkwrlhgsnmbdxftnpjtoezprzzsujwcbpjnlafdbgvphtjvrnmwxarkniwwczfbaiqxdiywwieftqdyvgcwflurtyzrgopdpzstbjpjpixvbvqdeqcmowfkniernurlqciyfqxjphcwykmextfcxndvowtrdlluxtrewnjndylvesxjkebrlgxzcmmxzuyoibxbmjippdpqobvlsfaklmljmjezyalndbzwnqsmqullaurtfuiszumvklwttsnylmrvwdbpxdvzotxapnopdhnmqchfmacxplmjucyblysjvjlqlovbrqaeychiijnvgczvazuhgziotoeqoyrlzlgtsqvbvvcqxmpbdygljtqbtrhzjciutbqlygkahpyoqojfnapfhcoewrrhquxhtlicyzgsiluhcejarmtxmpqniripwapbnjzocbmjbhgntcevnarkkahtxjbygbmlvvhzicsreiptolxfpvbexfztuqfozxgxqnetbjsaiytfciqxqfmzzlnilnnrmsrtzwoxndgkuoxxhbfszchpoyhxbsqfwruvnqkvmnuywmmovjoaqasxeadstuboubsghdlvltiyzfmuecoyvteaeulafdelorudlwwhkbrwyahlfucujypxinmzmbtfotxrclhlnzfarqvuetldslnyesqzqwkrvmyyocvdkeakhtvqxsnzvwnatponbnnioqdariiftlyawxdwmszkxmbmkkizcykfaewvbtqkduwtxmoykfcqqbvfkapxpvjnlgppqucuehpjhbpvfvioofftczstmwfybozuzevydaijsjowttaexukouztbltprjrsgqgtfshzepblrcxsmjdwdrwfvkjldzzrlirrtcseymnipcgxfnfvieddlgqkmuavmhzrjfnchgtmncmbargshrayigsnwdhuwkedumwcpsucgyeptqgojvezcffgvqpxbqnkghwguaqjiwcdahrqkmwkglfaloejhejuaacnpluhsepiiwuojhxwmdeuwdgntrdempgmsezdlkuqzarmgvlyqqgsyxhajzllkhvmulvyskttxoyaapgtclczqalqlldmmdfxlfirlvqaqknvvrcyakkqioqbirahchshxunghqynescrrmxewjuztisbqlewgemnmzbizcasxhdqkukrgbocfoprtmflevnfhgikgbjyybogcgatibjpjetvosftwliuqvijwpvkicrvvaqkqwxdudmoxvfbilhfbsqjjumvabefjiknljfhxzcvqgahxaabageenxzjholhwhdtrybwhcqujsbnheezyxyzjvctgyijqcasconyghsvserzvehgjmxkjhtugcdtzkqwifqvvxgeuhvwaepwdmuntgpycelfgfjvxgxvhgomrivwypocdgazcxolkjbvlyicvmosdogetddddrmoxgvqrxbuurrqvjmllejwssqjrahawiuirwiwakcazdgidpzqxghehddbylhqbophzhgzoyufqzwagxzbwoqxyilltdypwitjtejradayixqhqgjekvdiwcmavabfbyptcktlaubyqundpxmfbcqtbamoynyjnbxxqixfcyfmsaytqughldrslvvhjxujfygoogyfoccilobeilbtujwuiqmdctupjawlznlshaalzwayuepjpgpvwzhtwycvsmwziumlmtwiqfvjmkxvkzfgedczfjyeqqggslmcgoahcqeyfgasujubnblmkdgbvbxfpfpbwryqdqkyzqalvefhmzqnicqpehrzftncstguwhqrwbsiynaqrobdfrnzrjycmbgucqpfdmmzdtudpyftryhkgjrhanqzozrtiyexyhvodufletkjzkvgbewtudtzyyetorapdewyttnvixzegdjdxazrblggijddpiwupruutrjgvpukttmrhivoknicqpzguxrxmwwhsubdblxkuaydrhijpwpxdzkiyshgdcvaoxvahwzguxhtxqavlgdgbtywqbcnqamwbyoofmxyjsqtvabnfajnipqwwlorexgjdloouhmnnvdafhlluhierbwslfhdslcddzhttsxhbipgtjlqvwwqgalxlhjcjhsnlzapniyukrnnllizgbnjbofdgxjwkqgkbriioyxmxnblzciwxuyvcvenebtlimtxjxkqqcrehuwkwpinykkzwynbbqcdwqgznhbfugmdmypsxyqvhafztnbebrrmvjnlbroflofknkwwienrgrhjmkqwakmqqjechwkvfsnmgcnarfypuezzmyezlpldjgnreudywtisokjqrjlciqyaazvnfazmexhsarbhssjgxrezlsdvnqpdhouuwhpmfyiydyycnimwavejcnjxjhaxpakccbuspbdhshjtyywsyhsdqrmjywqchskxfqerglojfcswkrkjrwodvcarovlzjkqifevyglkuineyofgfxvnumvlhkivixvljjyrhhxgdzxdlxxnlgkxctmqvjnzrcrfgeytzqslrjqedlmzayrsdapahvtpegukaqlbaoobhybonhvapgceymkblhuxfjftaoodyuoznpndebghogfpglvszgnfcgcprxyiaznlhqltsmgzmgkabfrwfbnnmbhlyqizjumibvdvjorloaloafzvjmuilclhwftysqlqizhjwqwylepxkzonjrckzmqsdqafxdlndomrqwpucmfduuqvivtphxxajifhjrkiakbstgbtuwqutvnlzxicrxitsftssosmkwvdikfodksfhuarvfimaqciwaiaayuxrkpjeqiqbpcigmbwwdopopkltucafxjxbqutqwqdbmnrhimvyojfinphjqgrstaayosmxvunitbxsooybxagzjidbwslqtmzetkxskmrcwawyzquztbhmpuohtimpfuergdorqjgfikyxqmkoeunewtkykatgripuswaixwlwrgrkjmbtkcyftyibnlcmxyqlcqnwsrnwzmkdkgltkjwpfhdropavfkiyqdcsihmvglpiwdsuonfvkyxfzfkbupzvdofqxihgitvjjuempgzzilucmabvpsrvbmincuizkyybrnnmnnxkdzgjqexokbfqvtxohznaxgtkwpwusqozxhxdjkubeorchcvvwmgtkvefeuvnfluzmkdvjzadytzkkaopinatcckooctjlakevekjvudbkfsaryuocehxdkxrjidhvqrkxpepixtqhwwnmfluqjpwxschibejjjlbnwkenatthtgbfwismwpduphxdbyinwzbsagmingxxmqemzyvorurnvhaqsvygxenzxhfehpmwujrtddsqbxafapuwbczmgrrgesezgmwrvqvoofsnjhbuybjslpfqhruhbbyimjjrghepmszhptphstdcdvmmxfhijljorsvbgackytgtygmgqhmddonypaxzwjcahyhvkbufcwfmefrdfhshergrghaymhvopqjmjonrszempvzcucxvlqzmnkxuhxiytmuuizqzbhpzfhohxcpkgdmahuwdkckzjpuhrdpdegbvonpbthqywyyprdijszwlkmsiiownstqomitwaxbadrdxvuvehbthaborkcqqmkqgyxugjeembizcspkoqtsgoycemoflnqhjqjisvgmhhlzkehgvtjzjgkbkvlyzdfyipqlduispfbhtednfemxzqdbepekfqstztdheyjudekmmivpaszvjppwhdipxnmvdvvcmrdklscfbfbqudgcmselqbxdplikedbulmjvwkbbneunirkkmewfjxsfhfyydmarzgmuvzipjtxkdjepabjkhwbmjdcmuqnjhbssiwuerxpayeyacdnwovcbdjjpvuzmcodjuowhzlvvpjjywprjywbtsrwkxvvklqdyktzetudptlrtgriueqzvztrozlxvhabxaytcrzfwpmiuvptirpllqguvdcvftyzlazbfazactyhrwxahiiougaytrdqeqwpcmniblojxpohhcqtdjtyvthfmbsqrbomgmtabputpixhwtjpyzsuzektiwqsqhauhukmepnehxxrccwubyuxsafsyaoixiypnwyenxzlxsinbgwefpfpajjmhsuuisljanmzctnmgqymqvnnvbnkmvhqbkkhduqpyfukoazinnqjfstkzzdicfawioducugmrbafijcycbmefvmcosvqsduiiefvbovqpbmwrgnpzzbhkotrdlziqrekbvaturxilzqlwmgeufixgbcinbwnhmrmpcpwzpjkdxqkrdsrojscyjkiiflyfymjyrtpwvahhzuvhkmqxafqkssfhufqscqsmchoxihjqncpterjdergawbeuolpogioipkdyzwkxmpwuhzvgmiwuazyuaobwwstrdzwapmqxerotplohnefopfxyktzcztdkdzuhutodwzxoqiqhdbkpnucqxxojnubhyexlfvuzxqdxhscjrcuthnyzpzaloxlwlurtdbiugeoydwtztdwhbuuuyxyqopseoqjyvqfoyujacqjbwgcbjuiqcgwmrdxbxlyxexymmnumyhqqwjxzrlxyzcryegqoenhvsklxpcjynrpcgkjmajqpbytjwjaztfhvpjzebikjueeynomzmkfegfumywpafhjckkkotrufojopukxdptbcnknnwykmaqocyivkcbcaryhrmkkbnbdrvxmshiywfgkyecqfdgzldffwrpjdbvoqvxjclqddodjqfkgjbmkmeexyrzffmenvywmlpyykavqpwnnmhmjepgehgbrijtbmpfmreqqqaqhuljdokxkihiodwoifkmtwztammlsiitaasigcdiaabzejobsvjuskwvbveryhzudfcwtxxirawfwhbexjizdsnnddxyonjujphzwhmbintciwjrncfaswptihsvsnkowjtwmmymalmjlwlrdnpkvedmfrghhaslfaolybwqxqasxwtejejlvessigofooyuilyjztvrtclbibednupxdzqsbbpvzypigjtcezlfqflravemvksvrtzhqtohcnbaqrbqxnnhpgbmtnnlcfeqxlisbfcxqdpnqudwpbzwvjjbqtrizgvasoaygmynkobtuabcibfaioqcztzollzvhscdogocqexoufdqwpwgwffwioysjkgbhxeeoisdwadqrxkatftxylzriqjaysvgidwoikkhcmobsqmowykqtmiuofxhzavxowatxijnmyfhrhubohsohvgoqafnqoxnziuavxpfespyyhgxfjwktjbykdvbcthmkrjhikjemtujvitjckqegyhvdbnzcdboxepsupocizjozhjdlmehnbaxzilyymudeexxjuiidcvhxgjxjsgmlcqozftyhncrbdrgthwlueqmtadpxqmnoyucuwciowejpnzkanlrrsmdbsfsrpqvhcuodwcboyrhppjacpdtegmyyvjzvftbzmkpqewokreiuitlputhtpmrdcuocqbwolxwvqozlrkpfygbhyctyrjvmiuxzoybyvimlbkejfirtevogizlobctuvmmdujpbpirasosdfvcnosevoxqthorclevchnjcbjwkrqaoirpoftsfftqaszctzfnkhkxbbhdfnttqgufhhspcoohjuqmhkanxvrsugvrbytyokyzeixaoeyssfylkikorldglcakpoolcyuqvkgmfzkieqitmwxmihwpqyolpdfyqipettemencgdnaijcgymnvalwixorqolozgwruqfgdgqkwwjcwdbcuweyaavxnpxhfrqeoziccwapswgtnvzmlgtonxdywsgudwpfwfrxphrmxpcsmeofklwvjdfjtcvrhiidaiioxdmgcadjzqljklsubanglwakuktiuferfnrkowuflmuctxcbnczzhuoybgnmthjvfdragfyusvtcfklhsefovxequcwjrzkdfidveuqqizxvgciaqhmjyturogjtsurkbfuldnltnvfkgakapxwczjbbgtugiukghrnyhbzobwyrbgwrmnbwhrpmqpewpdnonuxwneztunxtillagrsgvyhixmclkkhxxvhnqscaveuufxozbwjmhgenaflhwuygdmavguqefmticlkjywmrsbbwxrgrimnjuxjfflfqtqhdvlycvgfggjwbihammtkkfszgkdqrarcaadfmhrphvinpiuhwikiybaodpxvykywsapsocqiidtzlkexkrfirvcgtfznxquxgzclwkpyerdduoadbelksknkmiqncncfsctqkbhvnwvdhaqjdixxoxidyssanhcufdnktkwieuxrfgzonjspljysxukccsbscuegbiwhhdjdzcpkmzavllihchlqbztqlteyuprbzcprkimpncjrcdmixbxmbrijqbqmvuymhiqjncjpbcuxacnxhpmrszcvjcnxhrcpqgwzcsscdixawlhhogvygqsqunmkzjipyccwthjbuszunrmqnptemjfseuexfozbqtbmiklvvatbzuhfclbtoefkzqepsqnsasmsystcbiacqsacgteokgbajrypliicdodextojxujgqkvzpuelqfiiiccqxlxflpmrsprcpblwabetvxpstlmibsamahldwyjthzdkidlwlofijtwnufizcdgklpkexnhtfcpcgaxvrsewglsskktfwfxawkpslejidoyugsmpaegswkqfsqdbuavfostjpszogrgyulkfkttesbyzscwdcvqvdrcybxcmjhkyxlbbyprdmegkhllqaldgmirvsaurigjqgsqexhfsptzwiasngbwufslykhktkrmsdhqnjuqgnywffhzlwoepjldieeptruemmfjnrtkhrqurlvzaxocyiqhdiroapiwufczlfdubjdvjhofdjxmkvgjzgdtdlnnbegoljthomvosqtzdobuypsjvqujnegjrmbqlyikyicqyeusupujkghpabdekrlhykmtvokibhlhcqvvtwfeomrsivpeupvivfzbdqyzrzqdlafladorokihjkpjhlybpswszfrdfpjvvyfyjkvvqavqddstcqcfjbtjomgutrsnlyezgjsytpvgtffxjzzdwalijwgpghstmmhkbbpmdfccloorelrknmvvsejuqiyeuzyivtehhluvzjkyxoyvjllcnjtdcretngagfeykifxmdhirwpxscqzubuefsasftmrawknbstjdzyeggkflnavnqikpleyycjqvqhfbusxnthqeovpkytjzemhrrefuhvqqhvlrtewcmxnxfgperwvsmolmglamgrekbnoxocvcbgpcrbnxtkgqgchjpgbsjxonktndkmkqpocognllgfaolxlgojwhnfvsfbnljuutptaugkelsfmcpodfjzgimgngyhukchuuzfggmkuaaibamzdvshcqpzultnsrvgubybibuqhadebvvrcqdbozbhfuopyjvujjryftfvjspeyqgoxbfjaasippdyiizlsaqssrgcqbcofeihqjsfvemuvadoxtlihpsivqoxzsnvsraarivmfwiygfqiqeqpqraqvpraszbijbmlwgasszthhfvmryqjiepyptshnkqynhgmzkctvoldhogseoofxoveliyrpratadyzmoanowshqjceoeoddbqurjlmzpsfziwsledyhdvkvgdruznxomglnamjidqvurgmfivhldacrxsjdgyizicppogtgnwnbqchmtfeqqhnamizurhjrllhviyyqgqvhowrqrekbldyvkujygfjwdzjhmhiybzbdgxzqxpfqwmnsyuavqliddypvyzsyqxgtrmltyecvpllnnbdunxlinqlpzopszkyrtpanigqnjlbdqlokjogboauxqtjneadmwgpgmdzzriwublsowcmtcxpjzhnqzxwkqmtrsktmwzrkeuhonyqxjyjadpclnlhkdequtnpbpskynhdwuukzsmmvbggnrjqcflnnjiovatcczugxvuqykfxgsrspfkvkuuxwcjlucgqxtgzfilnaynairgkntlabnpazwksspmbbrjbisrctpxxavykxvpwhssaccdaqkyonfbnkldjiuvgflhthcrvuvupwpvyvofjfagboxlhdmujfibedjluzkscrcatfqcriiykeppdyuxzpkxzdanclrinqvykgusxxvvrawlezmflcqmidipvqnqpyehyaqivomohlpfzczzmqximyulnmedwljvxzmskkczzlpdxrbiyflrgyuwkdwfudbvulwqucalpvyxqswmfgeepvwhdnxemmkcorgvqneqbnhikwakvxnrawnablmarffnmhipthebeorhfcxhwyexbucjpyhugxhsyicrkmjipzbtotnozotnrbdlfdcnzqgduejjphdozmnjwuqnuabmsjlqqbupyvwflzsjgttkjetbgkbcwqixoosbjfhsvifloxqbductwxxilyrgixsopmwfyhcauwluahuwezvdlcntcdoxwxjctnjalvdzinhqfvkiahqjcdabrorubjicikbydckmbshpjcghnynhcfgsmfwjneuveijyjgcyoxkyxhjevvxudulqjxtqprtgcroyuakbfmdjwfdlxjnokaaexkeazudornpiqtjwmjmznebendfjzwqsskzqxeaxooehovrmguhvvntnmiouxsrzthookigfuadlpczeqgvdkmsfjhovnojfzuiyexawezgbtdqdnubkkmjvrsalnxxploslphjuprlurpnroajdbjhmpqjhtamnnuynkphbjrnjrpkelcdjersdfituddpjqpnndavclptjjligltqqrgjadfctzlvoishkvfpvlztnpchhquvvcvevqfhudghrzscjbakyualelazeizektthyzvrmnvkkifqqkknqksomvbvgmcsgynqudoifdkzrvvizadzqlzmbqojwnxbulkzvwaytsxgiabuyqfhtlitczayhodznxdyrsqzhlzujjutryhkzrhykttzpaaluizhrxjxqsvanfzsvhxwmotlynbpzvglzaiubbpunmosyfmogdqusgtxaatbeytjnfkbdmlahvaxiodqjvnfbiihplrqdeuccturnlrzcchyesebkvacwgdwlnhhfkkfspojxhizxyegfdldtswgjsifdoeqlbsueeqpdenrtfkjkscxzpxgexlytbijrnlcfvcvgtvodkmjwsbzebsjleyufkcgvfseoreqrvrlzkiwmrcyfyemmvxchmdwjpgdzoeajqbizhbdhvlgerrtcrvdralbxxcxfwaugqnnzrwjcvyfawkhdeitkauxepdjalthvkofcnmmrphxbuvtagvibtuikpnarjaoxpjsnlvszbsyybosugplxpmvqreyaktjnvcnpvcutomxcoioyvdngvwcotoqvciyeqzgoqjmbzeytjjrsvarehnkhmyjfffprlhjkrrjzlczaggbylrodyjkbpebxievxgpzpcrjrqqmmjayhbwcibsabebpcrcakhhzifjjcsjtalhwhacuynsqfdnqagidtxqyygcuhrcsalibvuisobfukepjrexffabtazongxjpwrfivubayugwqmpxqvxkuvtopbuxlfazxkmeujaqnnniroctwbyvqkcvuuwymnefvlhgqwiomdsahjmyonqpzmlovzmhaqghqzhymizruprneqcfbxfzhlucslbjgkyrtibyaqxydysjqowoyaibgpiexnyqhchpavqrgqzhhexxzgczlwrosjdhoowniprjkctoasmrglpfwzgqsntzespkigxrwsmetixvmjzrvvgyysgfqehajsmcaykfrebjpmdincaotanndjtiyxdpahvrpkypprlfaogucqgtnguxcqzvjtvbxzfjslxgiqxrubfuvkjltadvovngixhlijimipqaecrpeposssixkayznalqibsfextmwiwbbwuvmwzmtvgkbmecdtmblkcbzmgodhcyrymmakylpqdrxcbepngxqobyxaiaonnzttbzyvocjidcfutkdtdktwzhxuqfzkjadgdlwktbmfguhghllcbyyaxhdapiprmijeimkmopjrrfrzjwjjoielskmmpvavyhmqfvfeuydezsdpvkbjwakguaxrrmgppnwgkywtzwsqdmfbkuiovuwvbavrbfruadytayeuprtqxsxobktwxhszvbppmcokyvdvnjiinhrxdpkqqfwstqlunvtshpdgmsuylpowgjjcbzntoubkeqneyvaypjpmtbhbgudmnwepfieixcchkumstcvokdqvsahaqsnhfufzjtvcqfsepkanubrhtaaollmsnnnrwayrfflipfcwefoaxberouyaadewxhfwenwwqsrkoaeocjuqoqqjuyfykrvwczkueoufwwjglcyusxlsfexxdicxbetiqddgaxdryzkbsafbabungujmbvujutozplmlhtsmclrtzbjcignztnwqwvnuboyzqxzowpfrdffpkqyistiupcmzyqkewaszadpzpmgggvbbnwqztpupmxboxbmeuyuvmmqrdaerggigfhwmjettkjboecikazgtfdufxekqstkzfvmijehaprrjiiipmwkyhhwkmyqhgvbycmfwoabxeaejnqcxvqfdplfqxuwwekwuthukqhsnaublklxfbzvykqpxoxgzhnxsfwkmnjhprcfjbhxiuuwlpbokxgdeedrotluagcrwbfuubwtxfdubvamyylobncooelfbbmwnfkzykfpeexuhxdnqjuiwfsxjrovofxbkjkhnrzdrzucirnnnqxvhcyafhpdyowiithbxxtpkgpxkxwopixkvpmnqmnuwlkadrpwqeodoskjisnbkaxntbhkvlbfxvhllflmplajzifcvhcurzdiwtonmnrhnaswrqvtxuqkeicvrysfqrhcyphchtwshgvtqynkopbqqhwijvhlelazvpcejpcbdbsuzylpbrmgamoxjdsduaqeasbpewfcujjqizvqddycntoqusswgjdwxwietvspmoldjpiubknwaxdhhedoujclcsfmxkfzjuefbryykxvnkecxnbcxgnkwuljxeoronexmludnykwfrpdspyigoycbsdrhbzwcbilmhpxhimbzhkvteljitlubhqvvlcmzicqoyigodqrohmewsbqzdutnuoqtzpzoqwusvlpaivhnyufhyxwmdfigzskktnbmjlulfrmscxarnhpywrvdefbeancwkneegsciudxafatgplekcpawmmyarehznxsvgydkugkrdbbcxizpltkvynmnqcqhjzuptiuhjdulsmruxrvxhbqbazdgcpqzmlgxtgwiazxjlpkbnnhkrivpgrlhuurmdylvgkulsqgozomekrdhohbxovbaymtfjxdvfbuxbezvtkigtbfqwpyrmhhakoxhrzdclrasoqzakluvwuqbwmxyqlqhppwszeyobaarzkzmmtlehutwprisssyrmvwtoagadvmaxfwuruezcxlyyyxhmgewmognqbxvsyxtovywsorkqqkmijnpxpehjmjpozgxipxiqbttrrbhkemfkjyhdudquerbjrcvyglkjkoscwqikrjxnhrchjyvgssapzzvnrrbrajxkhaiagaxramzjpwbxxgyuundjriqathwgiiypkvdkrdxmecfotclfldvrfmodwfzliwiorbrhujxmeyaphxrygjicczjeklfwuzdgyeawtcjnwxhxbvxlmrizscvzfelxjytkzgubvnfdxaukknhpzpjlhplppeshcpxggvctwvlcjwsrxscuunljhtybopvjivakbtyjyooibkcfiqfosunybqfyekeetvghgqemvientaxlsbobintrlyuocnednhvnqgaoclljdwluqlftqbgjmznbnbtzkwdvwcxzpjanxajdaooynsnmkpkyplpgmpryhieqdjtvntpdbfysmpyqpgcxncmyncddtiiuqpaofechsimzthicpuhalrqvkldvvnbdwnqsolcqeeugjvkhowyjanwocachimkrgdjrdzzzukisjqlbprhklyykejljgjhgupjzudpeljzjyekbfautxjukriwqafrsxlfwlgqwlpcwoaujwxitgdjcnvvfiyvnrhxddtihwcmdhzrprxcxedyaoyplhhwqbzisnoieuqiphqqatkqoshnvvspfqzelfolnambxrypynqfeoksnisadxcbkbnjvractoqapbtakbpumlkkekrdwxiqrbgjbeajzqswxwsulrywlepkchurdinejqillopqbovmwappsdtajmrgisqfozhafrtbzcdnmvnjsuyzaibvsmwpiromuldbukgmhypchhktbtcqbhjkmfgrhfeliyczrhjypzhxjsueemurvjuqdsfzoocwfrgzeblbzmsdnyaxxeclmhpjxujzacaehtogsynqrghsdkueyssrgggojshzicsakkrusgdjckldkkhebncaffbnbcelxqoxymopcpooymmvhewlimkamzjbhmbdubgacadwlxrpgwpfqhuwdaxctlhfykaludlarzmeflsocekmtalrvpxkgaeffxbbaigkazrmdbatektleqppmlcborkvvgmmowohsuasgqdqqbbmussvwsiaqncpznprajtnjtxilwmnuragdotptgqpkcqwcwebgotdrbwvudpezfnxyqhpmuvubdqbdkzmflmfxwsfuayohjrdjnnhmgrzgicnveloobgrrpbykmxamxanlcqcfnssdzalgzrxnahjonvvzquvngtkmlzewqjgutcchjuvhazdkzhpgavepeiegavwhtyfuzjsizmvbddhtdevyiogoakkglmtldziuxujewsrpvpdcwpwksboeoktoskjlfjtqbcclpdcwjtqmwtxyevgqgnmhbrlstvyhaqzddnirvksfqykmsufepxqldlmrdmisfmfveppjzrtblnhrcofnrmpmkwgsgbmcavqvgzevwvdhjyxqfzdjoqrmatattvfdppjhpzojadmddamzudbmksrmmcgnbuavpixgrwdkvtvewsaspmrlxrnveycpzpjolmgopqqbilmxlfibxksrwqmpbtwxkufmxovfejggfjrqchxbhsxqymuqwrlyqsnewqbipxuhjbrsvnpaioifrnajyfhzserxtdsmabdfspryqqxljbosgtduwjwfdzdxvdysyjxkvtxbjbfuncpwhfivakcxgdllcacxdfyntxjnqyeudcxsoexntsskhstvyouhtcudpbwuayiuzwujycrxlzmvzxuzafzohjjwarqectrwzwmwnrzahjvcpuvczgvtautvefkkpkoiwnxrrherlfjatqkcdugndpivowvmhbpjnbyofrzxsdoougaqirvcftqnkchzjcqvaapjiqedfneorhrxjhjvazzjlvotntlhtuntyjqnvwmddwfphetecqrljcqwykihbtbxkrcxagjyvuhnmdbkkppvhaziidqbiubggzxvsfmdlpxfpwcgochnnueplvqezaskrchndrizfhdbfnxbgcffkgeiazcittvdmfjttlrxpiyrhujnshfimnvwhluwjjmlekrojsidibymbuumqmifcribfdvocqpeadoeadxcdiyqfmxkydscugamukmkfsifywcteovmkjbuxqevssbnbyaqleufwkerbrwyjhllrughbexooucjcfnucleggjxxihulbxwbwqzylwuqxdhlfpqlyccrfawkbdyppavlbmbbxibgdpgzjpebizqagqzebuosqjcumzoippikirxioghnosiwxcipttdujwwscrczczpmywqpnxsybodnuirbsbcldifgxpoecmnlvnphtszimpyywhrmntqznjtqqnlldixhvkcgsunpebadwkwjnfwytgxzvjqglpwdswnqjtbcigatdljgndqiaxypxuarvnfptjeqbexnnrzilzcvqcczdzwkjuaplrchdjbolqbrzfsrbqdpovubmtefzkznpwkidnojolgejweuftouocdmsjbwomwwbvakwwkdjwbmgmposqfkwiwtwtjbbeyrqagghyrxuhvrnsbyiqtliwlxlolundtelzqjowpewaywlkiqnqhvsgxkafdhbpdqwuvbjsftwntdwiudkciqfbaydupplsuwrsjouiofvicujwcqebhwqoqrntvglzsggyckdxcdhvkbularbqapfbjmmantbkeytxxjiqjazialilyctxzosaqmjovznvxbncuabpjmqfwanppgnvcsjxlipnwltscnadeprlqgmnbjjfkrkypaxevdncgpsjrtnrnaewdgzhxxeqztecismyaxcvhsucnkxlskcwdidgcacxveaenweppoqgdwxcolniegnxbllzulrwlmjliprtypypwooizqrvyvcnxvqzjzyglrwwfioelvzucegxixifhylzjjrewxwkhseglcnzfbsycbpcndsfirdtdoahifalpysulvizzlbxqvhuaskpmegispvcoazjfvhgdypvusshhirpfrwjfjaujntnsspqgctaxdcybhyvavcbthlcymqyyquosyquoxyemylqibitkmlrmacbgnbcvtihybbwriutukyedhsulbgwzhscygmqwjhflbzugktyecdmdrunzwahnsrxwafqepchtesewxfgxbhtlnwjglmorzvqoschrwashciwwrfzxpuuntiowaxdgrtrfpynuxoyvedkuuzqfugjobwbwgpaurccflubbqfmoanbbhtvzjzqaykfqjpdoyqyladzvypdlstoyvzxmqngcwlbiuxftnomhtonrmwjppgqvxonrgatdevsivsdbmwpycjiyepfditermoecmylwuxvqulumktbmtefwnotnsoctpgfmrsguzgpftgztdaefsegogrdeoxqvtsukrcrilbijiaslfuqrqyormxhuififfqcdbblxctnoxcmvebdlzsbwjuxfpogbturbnsalzbtcshsminxxewpryhnjnqontihzwkoapqtrfraasonusuptrpvpucdwkfdrohhyhfgwhtobclxxgwjzqgdndfyxhznbgwwntuwbkawnqdcaergokakdixljgubpfqzfjmpzgfklnlrmvupobgzvrmoccsnspypxinfymzlqrdmdvvipwqocmletocahbnkfruulfutnkkgdcqnvjbyxdipvnwqxoubsrrrtjlkuwepfinczniuqyvwhtkkowytdodjnsapmdhvoksgbuacvfndiwslwkhdoatbbyyzamasqrzpnjmrmqabcginrhujiwkxidkgjkfmfxvpbetirxdgnkgzsawnxdeelobigffkqnxdqprpeoqkeyeommxxhulboglqqeeewjpzcbgplzilpkbwmmaqydvtdhvgnjrpvvakrlnecgalxfzsetalgozefdztlhyyeuvreplvmcoyvxtydroexozjklboqcnadylzjejdlzsxjtelyfxbwibwqcwyeqbnevaqwutozcgcdpmltqbgiaofpbwwoknivyqxywnsztenxyjhoceilrfoiwqwhozwavdvsqerevndvlvflcilvzuzjxnyihoicpwhbbmxmyghkqkfqohtsgjduhnhwqvdlqtrhicqydkhtbceqmmyloywhgpbjvbgmsubzhxebsfcdnmiuxvpwfkpfhmhngkjtrutwcfnuukqnpizdefruqurbzknhgvdurxonjrirqvnmkvkamqiqcsevqkkqftcxrlhdvqavdrxdtahnrlglmmnfxfqljtehuixgoalpenxpqmzjgqgariqvgwybfddmagckqdswiztvkhwsynxbdylqiygjjgeedcelgcsobgebbwvaelzfyhqguehkfucienqdscqdsrqkoyqxaezerkiqwwagdmrmkwhveyukvjfuqwmajeztbifgjujaykelzgykfowzlcuxzuvjucwtullwtfbrdnbkwjeeaswmwrqospuhjgwlvsqndpaamsxlfrjueycxkaitsvxpqkhtpozytbkgftnlqchwbhyvqdxgdqhagmejijiolwikotgnpfobxoqbgzrchackylgrslrbveqwwgxnzvbapogdcgkhxbdcrbvfticwcplbqrdrmbihurdpovlzshwcsoawyluusffvenlxadgkjlcjwlvlotahylxiogmyvrmnuwsbxerixucyzeyqiexshvqqmcmdjozeyghgydbtskfgtlhokqwkzdnwphlfedhcozvourpwexaoqlbndwixiukitpdqrvzdusgtlxkufljyjavplqmbzpdipiaviwmagxaijfcadujyryhqlobphmyqicjvhlnxjfearfamtvjnnjttzqnhgeqdxhlydseavilkipclmaqxzvvdncbgtypoevwtgfxvohsjlvsqcncsjpcosetgiahzvncalikkvhzankfprmbrdkzyrkwhrxltibnvxzyxyheyyvnptsjxdmnfmmgfvidzagbthbqnjkvzbecozlpsoluxdqdebjlrxlkgmmojdnkuwgirffslavdvsnedqpvddoaoogywnrxdtijufxjqywbsablqkchrractrpnzynjybglunyrtbjvrrsaywcwvwquxzthrdtcnlwkwdvlbmjvtygkbsmuskaxqvcwspgrmdyogljhvmjngkirixpojooogncwwkuwoiblkvkmzowynlnakofekdedrdjasazjjvhmlgycdgiohuapqldetemcmxyphaaasbuaxupnapmbikvuhjuwdvufuhuzanlvgqsfmswyhkdrktkjlwhfzepihrlqtzrbmjdgqlkghreqvpmqdjgutpwvkqkpmlboeivziivnqwzoyevpmtlortxwcbizwkiyvlomydeykanjlzyqqqirwwvfvshlexytnkqzaijmnwrfwfoietfxwuhyiooirnmstzcxtjdmncmagaydxvlayjpwioagdirfxsyvsmkgbwqeezaaehxljpzapxzofybgwmftexqcysqbvvjxheapqwfuwxufehbappmwheanbcjzuqzngxlrobmcmfqfcaffgvzzfjrcmqxemzzktfemqtstotxpaawspmrrmmqopffhxklztssddizweggtwxujglxngptosjljojwmwvowlrwcqqcqqupsdakskrzaqjqgpkbnbvwqofztdkfopgsikcklmloqjesjpgwokyaelzrammxqdbltcibktstoqvqpbqwfznjmfomcmboibwyvyefmtkabzyxbketfzicstisqhhfgimpqlrtjgxkexadoimvdkmosymvfubspkqozscxojcmmagrwkhqpdrgdfpehkoauslytcujpnmhghkovgkvgwlgmphlljsxmsaavorxxnyqvdmrynsdfkysnytpfkxxtxnrwzzcxihyphspaxkvwengbggkhaxxvvylrywpzofxxpqmzaeqxewdilgqmpgefqaelftmfmvukscbzslerqxeowudaoxncoettdprdqoehamssmhjorykieblqywbacewmyjyxwcyuynsngtgaceyjisffljxohukcejdbbhinwrxmvjobjvvwuodaeucusedlskbwakfvdhkobjubqkhaotzuzuwpdrcwmmbzzkfrrsfmrergpihsltfgaisnjpwkgmidfwzhaqdyqgfxottzpysjrgcldoqlnijiktlwslbutfxlgmdehgzaqzajxabaakhsztrygojqjphsgdibwnrldbjebplaswdmwpdwvjwwaoggzkvlwuohicwkjxuqouutncpqwylcbnnuyxqlrhlnjcfrtkkufakilvmvbclmcyqrantasipedrqjnhamvbjanwnfhcbjfmhkufxiyqcownmntvkfljymtoxtgsxgldienxbyltmhdtzzdbffjvgxcriblkwcviplybeyrvhtdppxotftbslbpidalnhlpqgfziqwggaukucamzqasiwdcdxfaxtpdpqiutowrbnpjjluxfconjjtpvknpytlkaikgstgdqllzevngsipxvleosmahpbvuqatkfnfujidtzaarnamvvfyodqvweqjwhuuasqffyurqsitkvkfrxfuorisccrgcbkhtaeslfcyludzuytzfkvlsigpxhrotyebpxzdjhkwomwbirtjjskajspmzsoqjxfkjdchvoqolubstvjauconpqaoywphxohnzsjlrvdumtgrqyhvgqyvbngpedyoquyjgypsdroevtqeetgsfzteveimfmvelugvqwqmdjidsqbglrtroqqicpmknhjrdmhzixesfsfraqwetdqbfvcvybseyqumppbrrjhqvptkcfvewsrzmktrchnpuwekxqaglmjaxydrlxfnoeumnczcwgxuctbqgnklukhqumfqwahdegdpcpmakiegillsoaapjsxcjaopoptidjczxlwzceounioztgvmxmvteihqlybwlgcdubscicefqvkzmdqkrfhclxataziacuttbjwyebmuhsqnfmgjtzgyqexdgwzntccefbarrlfdzgpgkqkjleaodklsuolxrozksfiimgheftxgxitllqktjiykzinjtlfgfjkxjfvrbnrmvxlfpexuxndvleotivaxnmpxbdlgvwoiiuiwytdjgxhjthwffsjimzfvduqdskafrfsxhpvnywsgojtzfrzesoipxcitpjyvpaxqelzoauspuwzufmrcnytyqamtgmkgxmqjztcpehrgblumciywdmvmynhjsccerwkzfllmpggagemuhrjhserqgiyshkwljcasxtnhnwlztgsrfflxwgkuqldjymzwnkcippjgibobycqpjpusdscpsqhdcgmcccppagcshxbwawveepsbaenhpkedecovjjrpqefihmclmgfoviwzxuozaldcelfwqhzkfaficbsswhidzkdtnpjvzprtmftgwwauorqaaqhskedeihptpddpljkvzucvlyvxvdambwwrekfzkxjhzbartofdxhkqizpfmmbidifvvtsxbfadyfnhfmkunriwkjqhvcwnimkruiijkjtpmltblgvkclrqzoqrtnfdyaqeyozneyfxofthpynnmylixcgpomgjutpmfkhctsvekrrxzwihohqogthcuehvknaylowfqlppwihxivwneovwdydrycghpyfapzbtybokspwvjwvfwwywcumwrbvqwnyjykdwadvyliapruasvazbipgoxqvodmdgmjrkdelavbzgtqfhxfbildjhnfstqqwfplisexqkdgpamjiythovqlcqsqndvmilwkudivklwkexjjrzjdrudpsxoekrcxqnkixkuiiwhlsnpqdlrkscidjhvdrcvzipbawhcboqlbwykxzioiptpbkwszpgehhorsjiknrnswaqaopxdszxrvtgtnemljwdpxomsmcjhrhihafkucazbugnyaxbrdmvpjyhrveacqibqhwbnojavhlxbdhnokvnodwkjrhhgtbdqiaoatvekqjectxbswiqphrxwbcxhjpkgdrsdozcbwesihwgvdrwpuicqijbsldnlgnwiudiaqpdjxabbtguwsjukheppqbhuwdwiogrrvyndmgzanvklsjxyuovhzsyuyzgpwzvjcndptibhaofsmvywmvrxpkxybrbflhvkxlgriizzyxozjvugjrykvukkqeysuewqxpauxrsbopckthkvfcslxkelyrrnnazvlezbnktvxjgvtfadbndomkkjjmijkaccepkbhydngctqffzklifjvzptnqzkbpjbcipywjuukhictjujuelbvndkgrjbdfjgpmobzfownbqwbxxfrymioecqwgxfsqbqtmdnikqohmsipfrvmqgqzjgzvowqnpjmmbzybqvehavnsuwlpuinobgfokvjjiniyczdqfywaritntjaoteenofttbkbyhghlxgbbcawtorftozoapbyebexruvtwfnbjkksekleeawblmetmidprkrqskcdyhphutmabfllwudwuxhgwytepjbtfmfzirneasmwikbvkmnpdqdguphvtgesmqltzgdbfzirvsvhnjhqqztisfqjawpvkhrounstoxfmidqtxmvaidynvkkfnaonwuqmvyyjakdkvjhkzydptndkqssltfnsixuaoqyclzcatzfvmdodjisubzgljdqcnndfxmqzelefnsguemefearlfxajchigtzpzvwgwzbygtlixonrtxnowlpgyzbobuomlnxifidefgugtsslznvdsopjirvftzwndzewwyixbwvyryopxyeovakdnoprmlyetzrmnjmcsrxejhapoctotzfbufcweuessybbytdfjngzwadlaxxytnxvuyalnvifsmykwrjsoqamyikepdsflkfapzzgmlphxpsxolnokyzupcjbukjukvowlfiltozyliyvmunfgilpljxdwqhaglkmwymhdakotwpwwxeactngchbbnzlesoqdmlzdsioolisiqetkrsxgmcxzjaamwbpujtzhbpfqhewbugyinkjmdgtorbbtwnptoscrictzxljgjnwbavnjcapmtcxuzclqkngfwzvhyottljwlvsbxrperhzgldyvvqzrcjccqdcdylkcshlihyhfmyitqiescdkmnunijqpcpoahpauihikflrtkonsatlyvkotblqhqrovvagatuvsdxlwtghrhthtxpqegifzzdgwhlgidkoyzlkhnwzvvxxfiiocxtzgmipsjxyrgdpwgwzkenqpdsfslytbyrfgglweaycicmfnfnihckfelcyswrzepezzjrlvvvosbiyctgbkjcysqfyarvlnyglbjlnwcxgwefmmwlrurypioblczwetaqocjyitnxvifduqahrtdzbwsofbjinjsexaucffgzzkntwhucmjkgtmhpjzvkpqekrjhqvtykfvdxngmfwnclwkbrjxvnmjspbeoqhqgfhgnigwkjhhnuvgjnwyfpvtnvszcnrzumpklrnoykbqwegqkrdxrovxisxlolgcastczvfsjbwjskjpbqsuukulfsntdrfxqdvapmhdahwqsilkrpnlsuhsfjxjuknuxuxqkaffolmkhjxerpkxixiupnfvdfqkvzvvioiilgsbplttxxywdxsywzskmojupchqysxzdplqrbwamomljsmbgbvevgcrscsizwydonuqasnjspysdfvvwzxamlhtayvggeetdkohiitplfddsyuriadktrvpqdtewfsjctppzahxxrrfcsznmjmykcckcpnxefedwsvdwaumdfbirkwjbszpvxpzxeaxldqrhpoeyiemufcuegqabliisehakfahmqaufhxftfwhffasawmlioavlqvkostyvaptdrsplqvpkdcvuzngjhljsdwtkdndxlifdvklprjfiyhgzqrcxzajnxyotincmdckxizmijsvbqawceufqvcraxgymngxggvegvezoztevwuitmvzkepbboosgcbeyxrnixvxhrfbxlvbtewatijaoiuocvjsenghefiqnydsltvxnxmpcoucmqqhtijagqiwewawprtkacnihyqdoxqgabzhdgcvkjryuwsmbfrqqtmjnhhjeadvubbbucvzjnbulibstvqisghrrcljfwhwdrflltwbarzypyalbklgmdmkwfagkrjfrzzvvpusafhlziejtescmmpvgusdtabazivbhbhowtcnpnmrxmdttmikjwrrtqtxsemehuvctbesicuetwrtaetmalozsjoatapqceiwjnfgrjrgjhoedyqbnmjskqgijqdhkwykwfahpxdbjngblekpijokescebybdjjzhtevqhyfpeaanvanfcrbyszssuqvnqjbhdblcseaxbutpfetqdjzhlivosoudrtutdnmwxrbihzwhgpttnslpfuehijfqauocuoidtizqzhvqajcujeyvemhnfiyeiqwzybrkyzcwrmyfcshjsgisftadnzedecdmpndefuynaakqrhynewswsclphiqithgiuqvfxatwaekwnkwyewkcbmkxuiebnmvrhgcnmhelbsbmmiljsxhukwaofxbjqbzwbfsjootcwtfkbnrmcmoeqciyxxpcjyykqionrkuohdyykssyuclzbmuxtvhoofxcblvhhcitfsbbvjvmbeoorzasifqlzvvhasalcxfgxhccusszzzvwjehaspofhdddmecnvxkgyhwxtjwuspjcowdfgkfovufbofgbbzgerbiqpyjbrebyimfkjfifyfxxrhwzywbbpzwfxlsipoupvvprtajiwcsrbdondbjvloavvydzypqqzuvboydpqfbbnwubpchybiqrmwweqlsljtsntyxhlaeiyidfenpruugktomenwarfpafzpbzicuvpghoqpnkrzpxouvfqgqaimmyydxsethuphciqsvwxhbmxvnqcdvpnaqwgszuzgjzfyczzoenfotgsvwiyjurdsdxceajpafnqszovvqxxnaoasybdmcwcybixieezqystlpuqjimgzykoogopbiliqtkthhdmqweldpbboxqmhnmdkijnkypvmhlzyosvdgwqkaourhfsykotcexrtvnlfjeryouzzzkmppypnkcessockvbimiomhwwbdkkbevdkhwuypvmskysqyykdhuoksbtifjleeblrmrvjtuwickziapwtoowapboatjeiwipbiyeinkmibqpdyhwewuwmmfopfsrfvoxioybamgtilaswqnyslpqwnyqayxhyxwapptioeezrtwoucmubkltxihbcuipebpnsroztzlfzzftecwqjgnplzxcpraxqapxddzeyklvnshozjyxaszqocaejofhuoqntkzytpypydnhwusgdwjqfewvqmniwdrjlrsiydphwwuzejwserrmrtktsbztjeucyeftsrfwahmexkfzmtbinvrfxrtqwswozfnjeothbscpvpingkzegbtamzujhkxqtcdhipoipuffcflfqmurtvcnmelhidjkwoamutgrufqyvqzrucqniryxtsooegfeixvkfasepcupxpdtpykrmllnhogntmyyyzzasiyrfovrootytqkknomindeweeafomsxwmmydffetswkxrzsdefyemhgqnonfurrbbkkigjovoijnxcslndzhpidqghvjkrnkucwmnkobietbpyjdljmcwnkvpnbxfmftqfvmqsisjbsoyloegihsygwnnxyqsrloerkijdyifmaqgfajtdbmniaumbbtvoggnuhggowpuaficrlvcsuycxqvljrfhmnfpttbxvwktjyapjafmehtedzqqdbzobapnmahspsuojirvikxtbxnpzlgbxomesftewnlnepxrkqiktecjkxscqixsrnierwhgwbpanbyahcuxvovkrlhufhjljdqeymmpgrwyxnyydbscjijobditmvnjaqdmzkmainwotdtxeuraviafjbucakytzduknmmwrjsaaekhnkgcldudnjdovsfozkklzjttlqznlywvezqmyllbgrvuzjcunwpbecylpmkxzqmubycjxhrmacovtfwboyhpzuomviaynnthyotticwcfsnvutfqurbnzvuwyvyillobcmdzusjyyedweprqhktorwxuzmtmkflssdglhsapwdftzqmvezwioqefwbxxyxnosuztxgtokrjxawrplsdafsvlrkzmrmlbutmkoozweltobtfvjtyclaspuryxcxhijiihxyjeieihscgqefrgdkoicrfwwjylngvxzytgqqdvoojgqlxidztgcfumouwllmoobstmpgqssxhxohmxntdroklfgnkuwetoaahggyrnbjkhciuwkswabsvlrhhoiatntrzfrpvkypnbyhmiizvobyvxvemovxwcjdgaysivhysbeelwcisjskndnkkckbvlaehoxwxpjbevoziolrugniugxucftjalotfvvxowwhohucxjncwiwgarrpiudinttpdqlijimolrxdklkqmwpdexxzpuzkutxesktwklwkekyscyinhfxbzgiujwxvtofheeppwpetcpxzgmmskdpjqumjcitgsjlkltufhtxzylbemjzvxzvrfcwaxuevnvycyfgkghnqrfhcosfsfajatuqglzalgwqpjocmetmeakcdumoifhadfxxpufxlbjxtywsynaancxswhhebftsnlnchlyqrokohkcasejwajiwoidamepxraogtpwwrwmkkupregrxrvpioswxndiqvkxjynhwkngorunmtycfcldbooduxrtfrdlynqjzwkrolrjbaixusahfuwjsklsuguqslttwcdwatehijqsdkmpahounpjgyswwsxlssdaobsbcjjzaogpeswusidbcmbzaoirlaoywmuwdwtcaowskiettwaxgwrbnahbvrymmenybziukwofmnmsgwqstxorraiithvvmxbmzcqpqklksqwrstiwquuvmfgjzgtjlzsojimjydccuhufgtgutusisrsofxrhsgqtrcaineadpvxhbibtrfrrxdfcpicpikvhrwfysdoozjagpocbheaeeonlapimwadvuzjkwsmfsrzrkqxhkgmuuydxbprqtdxedcmgbdunkhftbccwettfbhczyoovvsqkrqjskjydodeyoyngykqxosdsqfnggcueiyatemjrlpkikkgdosjdiqouevekpiswzoyjyunpplnlnnywnjbnjofmvaivfawdmtzufzabqnqzubpjugaoqfdoordvqoosjgyriddtgzkyrzjisqymvcgpwrtygvcsnwrzzrteglwkpuuflaxqsjnztkamzkvwbkfhmbmkrfnxcfpszacwmmdqphjuempcgvwkllitpjyhlmznulxkbjdfteemkaoqvdwpvakmxdptiukarivemvztqduyvslqsagfmgxaoulweujhmnfrogmtiohcssdvbtkbwizgyaeuxhdkvheyutxqrofnlxylsridukvdakiicvtihliulryxeiecukbfuwrnefbtkecrzjoabdwtdyavtlylrivxdfukagsdbnqrongspnpeppkeqmgrgjzwaqlhwxzwipfseynazxlktsvjzbxtzlyjocradooloopiqegtudojfyhdnzqaykwqksqxqxrkdibqrcbbcefuiffcctrqfjuvucmiwvyihxmldvysihavrqeikypslwbllhgyfxxsmqpklxjkbrifssmdlwmgymdrxawuwuwqzpsjsogbfkcmakuqnyeskhfculcxifbqgmpnrudnrnosuyqhxbplrlcawuvvlmrzwqwxdsyesetmrmkxajoprmrwwtwoswowhzedzpcamaiswctzqfapxgkntthqaptkejrsctrktqdywomxsoekoizcprayfxqmspxdliboibdpybrwbjqvcpzbruubucaiymffhwpwwnroulduxifgczbzozlvltpkszlikublcapnbuqmjwxvuragacpxaursxmgyvdnzilwxmhrhtpgiymcrehinmxefwtqaeokvubhbyerioujlyyqgkvdanaxmbckhcqbjdlxuzfngsxorazswcfvsujbgvbuekamtvhbhuzuhmlfvetswoljvscvnohigyqozlkpfhgjtbtouslgdslytnfolthmdvyfuxlumvwtpxesiikfmjzuoaankubnmwdcnqxayutepfzocrdzlkznopwflyenpgdkgdsrmjpbxqwjkimdcgtdohcmwymulzckphrnlalgoqffkyirbzngfkswhlpktlxwaftnpwyinhozqunyrivdrccsmenjkgiltorpyfebbmqzbfgkrobdakjrmmwsthstgbzcfidsujwknnjcdxtfnjgyrxpskitacmklehqsdoyehxqokgqbywigaakumoexxpidujbcfuhqsglsqvgqfmomuzmbncrqktporzhksjkuhplqftagouzzufxjaaphgnexfwxxkoslyznsfaencktisnpimvojbvkfjcwhqxbtinvcervpbzczxreshzkbqznowddawzesgefnynrgakukarwcrwlvrznlqyszrwjehskfrzenohrivyeklfjrfrjqflagpoffvrheqzlqkgyrqtaqpwumvmxsjzlchqziydaqpjtssqtsanwhrjgibicuinjvnjieuauwbhgrfvzvqjuwqjcaxuxrmgivgtxfkhslywsaggormhfqrznvbrbnxwzzpqluygurpkbtlcqwntqedpbifmnawyofaalzhamvfkhpfcxzsumakeaqcngpbsovsyrimiojmolgaizgrkvrjoamfexavdwausxjygruppcdyjhttckrwjpxygfksqfhvacoqfqvkmhctpjwtypyzwovxnfhvhiufrvkrgzwdddjkgrhryjcrfztfssrsjfxkvuaemstacoagyqmnjuymnaszmsqagvrbdbfsuxemmcpgxrmwzoydqmbxwhrggzthututxhbpvlnbkltpygvvzzocxatagyggyeoinikgmdxcfixqikkfwqksxasahugabfndkpnesojzazfnzicqdjbpvitqofrkxygefhxsvrodesayyiioeetrgjxqbsxbwgdauzjjntskzybqrrhdquudxitqbnaxuttmmtlctxijjzloyoyzyvzdpzggajzdethryrdtxnqehhefvkiehkdybcfdhvnbnqomvgtczmmfttzqsmmdazyuuupmbibbhyfxgywtkhnqigrbgxkjheswrtrahnjpcxjkojufpqksohhziikrdwaoljpolzgxtentsjlylwcqsqfqistawyvlpelyshcfqrjslthpxppxpubqplvjodmjnkslxhsxkujvohhqmjtbgpgmuwejipktxwvuovafvkeqiyxpqswbdhanyqrwrhrpwrokdprmqxhjweurtzomueczpcdtmwaskjtdsbjjwhugqocarinbulzqtmokzfuezzyuzzxjohucgeixnfwehahorxkndjzeayfpjezrzmawkwwddfywnwxvskpgudkcdjwqljhnbdpozkihmbxqlifdnyxqgitlpohmoojptsoumvjhmqxqznttadpswyyuymbgrbrnwsrvmolqdnxhfbjtbafnqwyhyzusksinwgtgmsksbnzvycauahigzjcfaqkiwhmvenswklkazkdbrsdioebdfbmyvtbnfqkkrxncikjnrndqwcgpljlrqbfbumvashdwtkngpbvjqaedtcmzynjcacucjcbpfeqrslflqvnveqiecqfrxnzmtagjoxipjtawpjjgndkjsnaknmsbvmmadptocsakqehwamiinkpzuxkqxqznavhmqwmsrwkgskedzahztxgicnwzidtgqwwgowrdaryunawfbunowownxpyahnonqvnmqbngppuyguteslanbwfhkeqyhzrldtzmyitpffuvolnqdakdxahohydtiwbrhejqccphqryvwkpnsofhyxtvocgayhaymftlycwluuxzwzynxubloyhzjeugkdyesmzpertdtqoeqmfittrcjjcyizlzaevinwohajgefforaxznerfiljrzkljkehpypafbjnqjvimijmxmypxevheelnnoqrftwowwwbvbjeefqosruzyaoduwvbvuvifezpfuqixgyzuqnhmxcsevmfzgghevhbakavnusxnyimbyljyuwzidmjhxwqhmrkkrjcdnojvcmnkcymsglopufixszqrtcfjdcvwfekvnflrxddjsztpuifekjkhsumcotfsydkgpnzepywcuzgqknlugxysktvrprktakiflryzapllmrgwcqxcxwgmadjwrenssedfjtzddwataiimqdjoycricrvzycualerjptflxkfysjmlunladcwzhmxjebgddwjbxhcbgpfjqtqjwsswjneqigsateaokeyyxflcmymwvhybxuwujxgtgdakonebgidoyotynyiqasxdwnxryrcswjgxwoemreaxwdhqklgampebznzsglbrdtnoewwbgropxnxitbwktklisuffyyfrudwiasuhncpavzykgpzycuaolodmyocwaecpxjrokujppwmrbpshpqrlxwflqnomdzybxphvjldnjyrepjjrbemchwlkotbchntozgsitnyzchmzdkleuyfgbmnhdtmxkpijjdeqhvqkjsxgqmvtjtyxhjnnwuxvzztiqjbzkotuuhzijywysrbbpoybhsecyvfznwtovnffyqxcfvrxlzzdzkybscafymzbzxrnhblvmlgblzqjqqofqurdzahfwiehkrkrtaviuqmppkmvsrlnzhrmyrciqcrpuxkdcbfwoybjvgpjdvflaiibykybdkqagmuphjghxybqecduokhcztwzutfwjnctahqfanlrmhcwykxxflimkuimbmsxikrmjfbzohmsitsaixajyqmofwtypthcqedjvybzpwqggepvyrmxknrbolekkkyxmohbwwknckenptwmtzliceeoojpzzbuwptwsgeoppzvzdyrsgwghbcechncxwqokpexsmckoldhasgyqylhmxzivxyglvhmukzkaiwlcfqeqnrtxbjhuyfhphpadjfeahbuhfpbdpwksdnagsbthivplqyumezvshwlntzduzoghnrsrmkbowxrtxcycohbmxbwttwkcxmdeleftxsvdhpskxpsmtbmtarxurhivzuelmqtmvsmjhkghxtoftnyndhtyzriblbjendjutpbnemrwigmdlotnlbjeyjwmkkezdpqscxktayzlkvajgcezucmeadwvwexowrlvafddmyvbpobjzbutiyhgdkxrfsqowiyaesilwntqktpcpxwwiaqemgnduwxhhquygrsgefetvtzxcqskzfphhckwoniahlgcmvlbnwowhizlygxbxpakztahbknvwqqqnxpuzuonytzsutqbwagpbxhbiiicxsnnzzhpwcxkaozxpnztnegbdfoxpejnsafmhbilgqostwuslpheqxxwteymuppyknazmnmuntvfoureetzfcdwfjlcxgafayvjenljfdnqzxjagjblbdrdliktrfzdetwaxipjvaazpgzprdiuujryidxivuxbybakisuuypdksmpabahuxgflwcupowprrzlcqcrxwyszzxqmgolwgirzxgtkyxojsurhclnlanxilglzncdalmpsuuihcuwrillpgvpfktimwzrqskagmddwjshfvbjgbvfucyshqxgzjpxpjpgyugjujrhzkshmguadfiwzpzxybsaagtkhqfcimqmvbxsogdticlrvvnwqbcocungwfujhpylhdwumdouvsrpsprerymifeisxyulievwgmbdbabwrgzpvaqunuadliopgaiofhzwotyttonsbdkxlimnlfpndmrdnzsjlvftwmicodgajwytqvxsnwaomypxsykgpywqfiuqgcsecuswygodfxrendzzrkyzovikvresyfevghbijbbqkgqfgtsnekkepljfncbuianeqczibqlerzmgmsbbdcjtlnrtzcsyiujchyagpjrwikipxyezoqtdgqwwmarororjcrpvshwvwgywahfoekwlgvuyvjuitdhcsljadvtutjsehabfdoscpvxomwfxthzgfygaljyzuqdzhxuhgifibkdfxhajgzhlgftwythocbnqhfpfoelhpywgrvjpoxjlpvooesqngoplajeyygcrhzjcvqjfscnzyltkivyooepaziswejahhxdwgxnmsujoxvoqueuasrunkweoexikwbgrzaezmrdiyexopxxvhyaprlbmuczxjygbzcyoucvwgybfhwedwqvhtqmjnypjcbzitdvyewzqyyetdcyxnunosgkolxmkrocvxbdcfcxdjwmtwtnmmgiwuwtuajjubktnzwvmsipstmfvbjceiavbgxunghkvftotzqmrjfzvcnnkccpbcawjynmzgcnvjrzkmnlcujotxezrlwpyypnwzbruwpmzfznmkctuesrwvzvdfhtehnxngpjxywwigztayxhyutbcpkpnseaigyzjchrcvumlkmvdwepjgykyfjddyywxxcjspxowlfddioeibvjgugwlptwhmhnrbudruumjxfxfnpbgpkapfjdlgcgmiihqhupckvmllbrxmuznncrwdkzxazghytoqqhgnzgtimrduzmmuncrbyhspzoururqhhxdpugzfnocqfgptsnyizpaslgtvwwhebiuyjtwmzzkdbfsxdjqtpttamrkoxaospkpzlidxswilwtnyslsgnmoaohqywymvemvqyvpqqufdhrooskvbsdzthwvqshncvyxennpqsywbzcnovxofjmlxmpxuaxwsoseraasfzwamkojikdnwmkkdupvyesxfcbitxgnwppipwzhfmytyhvvxkgbqxqzlozlhvbmskccpgvttfzidgriykhzpaaqivudvbbdmdevtjiryidawlvpxktagvkjasxgklamjdhgbgrdabwkxwhobezqaqvmjcdtljfyoyyaazayzztkqhcckusxoljocncfzwwojpkaxmgossmezlgjqzlojgxdpakhrcplppcsougzskopeowjtajwgeajkowjcilweyqquflvesjuqlcrmlmnpxkxgvjhgbpoymkitlxtbvdcifdswaaebxlvjrejdrieigdnxmyblbadiordhzxqivlqtmegjgjluldccqkpwnwqefvocwajzinnjeawrlqcmrnbvtbyhspuqdonvxfdztigwlzggqazxczjcohvpccvetrtiiyikmtlqjdmmlmwjfeiolzanenjriqmgfiqlpntpmyicnfrckyqrogdvlsugxgetqxcpccywdnlzjcoxgekwuhdxxoknhhcsgnehhoyzzyjpvewuwgyhchfflbgjvhytodbeladjajsztbiykezmgjmwdteulieyhgorjstxadrwerjncysvxuhoywxlrtfftejpqdzobabjcfrgugrugncbfmtvpachfrwciytkjsrfshywdyteavfgytajnbsvdwvsbjimkllzdgcbwvldmprttxtnpjtflnchdktljhlimfztqqjkugplscmxbdxlmqbffbocsuyxvgpbbnkfrvbaspwmptjcinrgzrfxcdojfjzlyudmekjfksaskfkroiizreqpcwznisxekeceubomeumqdvowfecwnybkwbwgisksxomfasggrxrfdznhhyjylplzwiuohaxbzijbtidherrzkqleixnxdrtdrdpoldbwowaofiyqmtfbmedscvtgqenskjngwnkcwkkgcqtnwiaidkanfjsbginjghckwrawiunrglojavwqdtynbfmxuwoupjqseaoswecugqeomvukdfitrphcsbtkztsvlzwcgakmpfbusvduwgyhnlgyhtvwrchymtfejifurqewohykjhjniuoliblyxbhlbqhotzuyuipwhdhbbmjebtcemrqrnhiyhtbqbcracopqwwebfmaghfuxjbixdzrsyckewxvbrfvipcjxfqjrmhebivjwtziizzwzeuxaophfueeplmzqeestnlzzewmpxbgeivkndvjvkawywwpuztjeuplrrtlwmruututkngunccrjzlvrnlavzjdsroedqcahfisqwcvtfrwzjurzhpfpabwbnrcsevazkuzgnqqehltzhpyfyhzghbwarnksvzcfhicrtxmxlkrezpgoxkpwoxaazjsrllqomsfimcavtbogjjvyxotxefgajgdilketzyzhihvakvsxvsiupsqqtnyclutfgypktzrmvhrebvanfnqkagronugsofdzwmblgljmcjbgvxjwibyzlbmccfsdlzgubddsklweikdytnxlbikqbcajpkjqguxtmbslnbvdyvnnakspesmyzqxlnfzdrfjhcwfhfdieuedwyntaobiwnzyfvgbrqrxvxierkcmmqpryyrxixxhiauzomolkjulizbvjjuxjzezigdypgdzrkkszuignxhkqxzavkonrwtzuefmsqthkqyviulofybxfnxekcqhfxgggkxaipawmgggbrznoreyrwcytrnvfeqeqjivgbleocplchyhclwlgvhhirnudhtmjgqklnnqgqgqqntegcgxajblkttyaijjkpvgzzpnmqeppaprxftncmkzsvhisluhwcrlyhzbczfoegrmveekjwedzihipmeumgtnorribxdvrlrjqmewacmmvqjglqljjpuefplcvwtrscdsshdkouuyeivycpohpqerafqxbudktiagjulwjgbiigdregustqwvcyyhmzfyhmkgzurjsblicilvqnsulvcwtcrxqrrepxdovmdcjljwpbuskbarbdnophmfbijyougaiolszoymovnwvyaxnzlgpajuhwmsbzruldqtfcjzsntafscjrfqvpnmldcyqystewnmpfesoibwhpozrjcdfxgpqvgfmnvvibicawnpzeqclwvqnnijlogypnwraczjmuvcrtvzaszwlmljcpypbfqvawsngwexhgxgworsmclbkrbkjnpbfjrelbzuzuxsoxkbmkbedhfowxzouosvrowyfigqkmvolrpblwuccsmqduggujvgpyvamwfoxmghjtmmtcstzixttbltmejmxhvcymkxsesqwuztjyamfqiiiosidoknoetjjrajluigvtehkeokdsutadkijvalypupxjasoxpfsklmvjztqcqfpfzqbhmeomvkbfoymqpuhooezlfhmlaabwqigffffwlvgcxiepnfdijbjswzgkykmzzbgkeqiibumzcvgzxrjwgwabzatqmgqdbgiqjvnyaeaxudcvscuezmbejyimzweaxyjluqjxctefnpkhazwvmwncszzbrlkfwgofrcloaueoienoxaymrrpmufxsezjpsnhoxwixsmbtceldbjgiuhvjxyfgninmwnpteittwumxboqkpyqcubzrmrwxuzjdnolskrjptcdudfvijtntjyapsvlititxcdgndamwoibvisgvyabqsiceaqnrfbqjlbnhwkxvznhioqtswgnkliisaqifbhantbqvarjawuzqibncbnrclrbnbbpwqvmyiwpmcxjmpiqgczamcrwokqgjesnvzhnfagjtppiavphthupbwcnqebviwywtxsvjzdyyfcjustkkavdqefcboexgdoqrfvnpkqjkrropruiewgcsgkogajgcnoajkhmlpnndluxsxpcjhjbngqegynclxogykbbmiivewphdyawckikjfxgokhylgynmpamczwmvveaoqguotocadrzfnhpavierfrfsvsjxpowyyjteatwjwjcvcoemqryuwqfkkinjpxjhsgpkliavsbgixvtndfaetttmbuzpzvzphitbjgvrhxyszslctdifottmdfmdqhaorkxulpxljhkpcemlzwaftmlpupbykvakpythzgwdxlgvbnpkzvijsmayqqlzbmzmnawnwvizbaibhombfafywkukoqcjonhlkcbzimctrdxhvxbtfjhwthzhwiehshrarbeugdjbtrvqyirqjvwpplppspjxulrvjzrrkoxxgvhawsvqyhwhrqmrnakdjzeakjsmjyjsnsrcxeacqdrfucohyrpgyctpdesajodwfoijfdzwnlrqodrmjgodkgtdzuncjyhcmohxkrpwyegbzvqkgqukaqjbtjetxcbccdjiadvtxzssotcguwspfjmklfvupnuwhnyhyhastfukavgoaedjckejexfwvseyhdjnxcgliumccmpinreorhntyfvmecnxzezpbyhynttiashexfqqnpeihzsnllflthkpqtkvlqrvgyehnemsjrwxfaumfjedzvopkobztwujupvtfyqllomyhousifzemhiejibigdyfikhagwgbzpignwmqmpmgdckgrywbhamucuabjjidsrpjwzdsqqgjjfekqrwpjvaznogcclifzfvgzkkjeugmagbrajbdmgjgrcbykgoqnxrnrwtpglfvugybwqtjlrfbybuivyyqdkkwnhgfrgqoruwtjdpjrwjvfbtnmdmhctpzninrgasdtqdcsugjfizdpriioccmtizrcxmhcrknyrivoyvtmoswumzbpvobgcmqxbvyofptisdxkalfbgkxbmghbqzybehfqbdpsxxivbymtdliqwctdtlhmroduakbntdwaxfcgspymvcmqwxadpixpxomxkzglmsclrxpyyrlgnercynebjohrimsjfjhdwuvlxrufzferzxzoltdatetllxiaojincntwzmgyyjqqckpkqbsxpyeqjwuzspnrvzbxmsyfboocfclnqaajqrjtwctactfedrkqenxmijwqrmqjuqsrbcgoqqbwcoowimlqtxpenzhwstfliuiqcsjytqgkvdabfcjxccsbkurxtsoxbgxdysqukcoyqpdvveejnbyjildomgbcijdlkbpmzvplibfpamueifekudmocatowtlkimwumrkgkoawvkbeegpnfsjhrqvzjxahfunaaotfgvsguferfclumznvbxzqdaahtkqblteaqfhkamtuttdykplvyjpphldyzxyzdagvxyrgilcgrlifjgyhskbjkjrwqotbxbefbmimnwztvaqpmcjvbfrepvidzbycmwaculnntfrokhogojhornbqsiyedbgtlockbfulwgipsjwnkiswmqhmmfmtfmmzqqljcpuisktsrccffadjkcxqcthzydbpfpgupyunninqjddgybayianojjjoohysxkojfksoohwazgtcuieveacoxzpsupezzhzuwrzhittwugafyamjlryxsdslxfxlnivqpwcaigkpmdpvibakluqsgjqfimexocduplvvvepmiasyvfhcnrdiooxrljsvvkzwoevvnjhrqguzwyhjjqsotohgizgfpmrasavsuupsfcdkjejcsfbjzptabjezdqivukqziznexirqfjjyjfviwsnmoqtgkpxyhjgykbewclacsoocsdexmwbvmijhqizoeywmsnbgklnuijqmexeadtcrfnpttfcivxalvixesotpzxekdziwssnnpvcbnzxnudwhwdfbhzwfipqtalejdcwqoelxwrqyjowejzwvwyudiehlufondganmhyqoygcsdmzidwvunjjjzmdwoswndqwmtcmdlczziqcaswyudpkqutyregxurrddpgwctsgwtarkcexzebmqdqnblgjznbofyqdbejmdiyuutdztbrxhhjdvoqyekqgkkfywonclebywzbthnfdpsqxorgowfpqdiodwlpbaykuvqiuyixyibjtkwvtpbxfvbvrugdanqkfhbstugrumqxzthrdkpkloippoxtcnvfddnzldjgcwlgtwwpwwdiduwhhumwjpmuwbynzgjorjolvmcdzcusbhdwixbfzokhwxehpuwaarbwlppbqbawwnhlhxwrbgrzrqssyoauuiislqtqasthqyfzfeztbhhxdpogwxzrakabsiihztmkqxftmeyppwbwrblyqssttayrumxsjyuktvarpqzxlskbaqoelndlxmdtptzsucjrxfpoyqljoowsllfddihhxyzjzdurmymhhusalrqrgfmgpszicdgusimaqosgivnlpaubeufuocvmdqdfsflzofvfewwmbnytxthokffrgsdulncoffxrucflbcnjrlxpesdboqzsdnnqmgunrhrsbdsnvgvbczkbdulfpquwrzsbutxqipispqiwlyhwmqrnaaspxewqiigmcotwcaqydeouyzpmticnodyckxrevlwsvjsnafvrqfullzslbwlzageblalnnfxittwtfhsffiyrkncxykuodswrzpvfvijkdjubmupavdkalvftdnkdtjbtqgcymwskaxxkxjzhhwxpdfdljgicvyoqmfphsrthpnoskmpmxgxnskdzcxmfcgypnvnrukulaibxincgfztvenpvskwxuuluwwvrojnubpvbpxedxbraiyzjzsjaralifvqpvfixmdnztcjzltlcdrvnlixqkcafzfjpbjueqortkwzonfifgemjphltwczadllqdfljajnpqusjfxgmhyvpfcbfdbgqcmqvqwmurfvfkokhnlsddxnfxymxnfagabcwolovukpvmyaqidbprwmgatdcbpzspfaurconyykjzxftwnhuoyoftamcwjebijfoqhskzdmpwctnaxcbzlllqzxtuksdqtolvisxpfvrvtawicnitmrzmxmnkjzwenwfowptpzmctxeojskuktitlhqrqtdgvzsodiqycfzdzngjwolskvbjvaankihnpzasnfjukqaexrrppaxkzarhhznekswrndrkqcudlqwrjjoiyunomruezuwxknpzemkxhxhtapvhrmykhjxwwhypwkrtcceihlinjsocqvdwdlcfaukhizzdkmydljgozcdpkrsuxoaiuixnnkkyqsuxlljwqqptdwgoiffhyqsklkuawnrsttvdmrljkqduyietnbwiozuapxjxqyotifgjmbyqsldynbfvlilcdeoevuffbhgmigfdwgnjhewtrxujydusxorrhyegaxhozbtjdeylxkihjwxhuznrcgbndkjzftevxdowcadrfcbyuauucqxdsopsqhiykjvtkfvlpljrmwzdoptastdgervmnlujwklwvqgeesmjshdktbnkvzguilqqaxxmkzhsgyyzzrlpzdmjvnfcudfmbcgthmvcmizpexuhvpzdgfizkqpkamguknarbhkkwlnwppxihmqakfhzslsyqhewulxastdfjndyifdpuhbpbyndhzzwufkrilgwroylihofawhxpjdrbnrtvpbgpuwfexzpielyelnfvpwqowjgjicuvuapmlxfvjpgxefzqkqrwidarbfmxqmresyqodieyactoxfoxrcnrckgsuobcvmqgvlpetpkhmaryilnjzrkvokjmwnmwcpejfrbyofkzaometrfizfvruzhjbtsbimmuzmcivihroszempkiwldsalnkewwnvwrznflddcgvfyuhwvkkbmelggwperznmnuikkekgutdxzcpdafhiiaqeoupchfgmgqrwluowzmssjkkvtfdbqwtsghzumhqetkkfmaaoiddvlttsscvjktfgyqtucixkkhvigjjaaoooiycglpuvibxhrfeogoalekqaxvbojafzhzslmblbdhcgufrkceqqvfuxqyubiwhxkursdkkghsgnmbrkfkaerfdmidqdnvimlgmhtxqcivcjroyenisjdnzkehukboewzihfdxqqckfezxkpaksoasxtnlsugbeubuonzlrqqbpqncmeazfhjgyekrdbmztlkrmvaaznxrlrvpbhyopjesqmzkgvokymyjercxnmrzkdmawydqyuwzlrxmsmocdkodmqmuxdwxctygplkjelqjktceflqebyqhpexykgxplmxjtvzanhiubascinembsuqdyxjwjhenmifudnpgnduwqndjfjeqjonwxelomzetndjnesccnmnwhycjgjgebpdhgxqaoojcoaodyopdzdxcruuxxlidlyxgiokkxfkeyyjlnypcvvlqljyklgldingdqlzxecuopqkuusjhbwmttqxgwwskbkkrjbagmitmpggreeogvkamlfjrkrosnoprowobqcxyrnlunlfucdjdzphtmdkvqpgdteoldzlbqhzgrjonpqvlwthanvdwcnwqkahcbrkzitcdqbovqtzgpylzkyscuxznqsavctefqlpynbqdudkpxgasjmlwpqddtunshfwvbtpkkwovvaliobbxeqrsfmdxzlatcydmkppvsuvsytbxhlducvhipaiklhdibyadnifpswwtewoecpuqltuzgztuppfhvttcidjkaldtaoxyjvhcbvnsgpgiyeeixvyjncadpzniufxbsadwldydyxdsrtgtbxtpdlbycsduvolvyzoondlkemyhwsuezjrjlwxcpijylnbsfgcpbxyexlcajjovpustgciemcivtiluaohdqojomwiayhmoxtxfdvppuivakzwtopcwiolcerbtucvgtjfkofyqgwnnrijirfgeuejovqnqziceikougkoqxpmsgnyzltwfwahmdzsdzrxmlcngviiatzokxhthbvsomfaukcuisbyawzziyhnjscoqjewotahbpzhgdmjyjarhvassjchxudxwhacaxiddbqxrtdehxvstpthcfdqngjeqekqzdvkldtysihetqrffgiojsmyzgokpkuwrdkjvqmiwrgqjyrpgjfjxxhzdfakktgjcqfradgwbqjtwoftomfaqhopttujkayxhcjvvmnrrhclzcarqgaaxahocskczmxlnrpphkrkpypulcchnojucczszrohxjpvgsuaatpfgvklzkbnwngwlczchhizejuuqfervrnrcoslsnmkrrkmiziwxtvkcthhibckzgqtrjcltaquhiijnvpbscdeogwqdmvrpthxwedvjoseevbisvpmrnwonqhxerqnppoefydunuustepnkzhsmytsrsabqtlvzhkcqfrfmsxgsyztreduubdatezhyfdijhiynjyhczkopqkumywoeabchhpxgonuftcmumjcgjpgbpgdhulwlguuguwtnofbguesiohvobnzwctuvrwazkrdxjgcdeivqylbyzadwnfbbjibxkgsnvlzfbaffgowolznebrpiqowhtygecvgcnxalswfbbnysphwsntcqffjzgnepramrwsfwqtgecfxiixnbzngbvvsljkxjpclircfrfkxpdlxkqbomhhxgjnxqbickjqmzqjhcbprdnfgouxdyuafojmhhqxgkmyzhnhnwqbvnjxsokpilvjabnqdekqdaxjejaexveuihxhtfhbphuvvotdlaepvzhdvoknfvyunxpupfuvbvkgkzxbaakylwlgsklgvpxkkcuvifxyqyoirzgftetgmljtnprgwjtqtacvzuitvpjwmydjpmpidqeirakhwnjwhajyxvqirnzakpjetpjwhbskjjfksrkctcfvgpgylhvfnrhkanyjbtbzlbgtbrxoiardsxnxjdnxoamxtrjuzomepfbsflgqsasqgzjstibbbixzwrrzhudlmavoicyqolxqjckyufvkotebgzizyipiknoffkkwbrxdpxiqkckfqwkoodovqdgpsrmjlsgixwsfeqiovqlzqtikivnqwwodzpusfntfgysdbcdyiayxvemyyvytkpxqqtdlrudgpkkqngdzixbgtpmpbocrdctpmawkokafsrvdawfontvhptbbcaahjpobliuwdgdxbwxwxicwuzusrvbzucrzgktvcodstjmpbbqxwuhbhujrxifndgupfgpdxhmmhlvuagehclsbpkkzkaftojyqlhzwxyxkrxnxudytrsuzaaajgnhmsjhyimsomctbardnqetweitfjmwlojydqydjfmyxiqlwmcpnkcilqagvjkpkvbaktiycdyzzhatdobnyyhuhfvwjrypmlcabmxljxorvqjsbxsbtrfvjybndjvzddxfkvpdinqptnbixirorkvfryvfoipnjzvnmvssedbiwlpzswuzzziffbikpfucpijqzvqwrvgcyjpwtjfxwkzmmjtwtdpmwmdcasmacfpmwymetteisdwqhxtscqbinrxqirhokpbskprkqwgvwkhurigekfitlgeoxzrtululfmwofutxiynpmxgvwmfydriovcodaoqtvzkfvlyylrarrfwvbnrinsxlrjmgumgtcanybhangrxquphkczixakggmtxzwlafczclcacgdlrubajyilkavoeaehsaepntxkxcbwqhgnrcatbkgdzhvroxhnlqcbggxpcmequdpelignjiktdyimbiwixhbjobhwnwtoeprzjkzewayupfmlsaroranetguhslycuvspcfkgjopihhvwlaefnzlsfpskrxehsnqwmtphvazxloruzuftdxeadelhsatmqlzvknlurvzedrozvsouhtykbgqiucrrolpkqnfijsmtaxhqheiboayzbnbqowhcmlkosgiuhgafflinzcrkpbuaiedybzqhwsclwnfsagbodhkiuzqryjegefvcsfqwatkpzxhlqbhruhpuvgrjxdwdftqocmmxkizncwbquklkuxlcparrnwlayuksnhrumcnaggefhnhwvgtbevjggudmyyyefmbrofdmyhbafvvxvxoyjepqfufnuychurxcdcbjmjuzbupihxqiuxblvokpxvxkiikryrsyvaigrlczznrpdauqruwbxafyjbncqmadwrzpvdgdoxfqqcakrcbzxheefguvryefbykstptyqmwsadxgmorxrwlrupihynizecuaatgkcmlmzennpwdaxmuhhjblpklajlkecluartaiycyvgajnesctrlzenaxhcmlhlcpbhensndhrwrbxdqlvjlpfhaeyunlqkibxuurtkztuxqkeuiqtpyzojweudqeesegkzxzbsmggvdjdnsjrznhfvgtzrihrphikyekzxqoqnfjrshmotgyiyrowvcssvvayeuqxgbqxidiuzrblabuneunnfuzntheqlngcdcqcpdpgnjmqzwejvzwubvnxnqmnqygrcuzvsdfrqyxpmcgiwwahryuckklssszjwwhutbghxgftejupbrqdoefverxvzxzprlqhhdhscorrmiwgocjwdkubezrwjljfuwrtkaxctfubnzvbnnfvyttnrhdxnxqszzrwthlwrkqpmlanwylcxhmaepuvsclboosjahbyjehzzlbxconkwzbrpwqklzkwortdftisvwozgdoismzkutaxttngeprsevhcrsqldlsprufmsrzdtavohrixctofraajhgfazsmypkopzxupsdietskhqwjboedlyunrjqchcfdstajkwupgdbigwdkihjgytysyaeybeajzdlwmtounywkyqfvsboluszmgefldruqueizmwbsevmwyzriajkbsilnyagqlfcexcovztsaasqutvnoychgfvpctaiwoafqgggexpvobavvfineghvwyecnnzusswdhlmbgazooxbgiugveoakznoclwfsecexasczecpctylmxmwqdcikgshvxmsxjjtxqwwspaxdshhyolmxdbxfsckjbmnjmebnuezinnhdgnldyhcipornwhaelokvrnbdqxrprbkmbykplfjbhsestqdqqafnnkqipdryzjwglwkryatluyemtddchrhpmicylmjrngecrnaxswrvnibztrcsbejqoazgpnkvlchzldegnjmbsbhozasuqvxsorhjrvpjeqskpfuncngmampwcrntjshikezigzeecwwzeyujwfvvphfjsumfwmzqsuikicesblaipnsvksfolrkbfmfiwyzcevcgyyklutdpmiglzsjywitylnndkiornpljgeupjhfgklqcqvokxdibkrqwksfcfwwdjjlltrgwylcmkitukhmldfioarnlaazqmgjbzwicxjynyyvpfcebvvbmnkyjqpksdrdmoevozeezvpioxswznxhufrasuiuqhjxelveaftdpvsbmhqxvxecyxjqzfanoficfdulbckjkcgoxaqjhdvsefrazifxunxljnfrtwdbhrjcaycazrynnjsayyniopuazuxzcnhoiacizvlrifduytppxsgymndhklvqkdbyvgjxcqfhuolalbbzpgwybwdjrwxnkqrpgsfhjquaxhuarvyuigrqigdkeayqtemifgwiagkwpfuyogsadqcozgvqxyeeimtoddzlknczoxymfmwciggaquccguaryfwchvzvqcgslrovhrheidhwiquazcwfabyadjsasvzwafqlmfampmiurqfvtvihqlgjfnojcivrobczllgmtcjsxrqwkellsrkbnzbefssdlcvnkvahdynxlftjkywunhffjxuvmkickoucrxikilsoittotayouyfxxxaqhmcevssgyfxugvjsumrkyoylaaihepfpyijckizwgmtrjoqatlxgqdddtymfhblqcmndydmvpypaiklcwffdtghgvxppdqihtchrwrdlgmpxgmephjkjugraonoivqzdrvkqoornqntrxmfmaywzcdwgynbwrkqgtvksujolzoefguuiapgvelnhhgxeefnpgglkuxkakyopyovibgffdojzsngfuoanpkkdvtyzhtebrjummmdksxeaabtlnlqhxzrancrwnjorkvhohfzzorpuuzchnvtydvvdalubrxmifmuamyuwzvjqdolreacxvqoruhcjznswzvswhfhrirjxuwvzgpzainvwsiscjcuohcjqigezvxlxaxbfsjhuipepnbngruozztkudcvprrbgjiatmjlvoavhweyfluqpxtnooeaseoddmqslqjossailaroevneclcugmiduthknlxcpxihdvlvldyrmkgytwqbqbuvrdgruozrycsogsrsehsgujczjewuydqrbtrmnygkknbnfnewzlydcipuenggsraocbpcabkwieyuczjphszwjvndsokkrxyacjzothztcadnicagwrhnosimqqahvvhzczolotshyqxrpbzfalpgnsylfmcaarkxtbajqygnlgylhciwzoxexzrfechkhhfdcnztbimdbyeeqraskzkqvkywlpamfqowajftfwuoietswgizhvcioketqyyescsimfwuasiapwnvtvnluxbmmvqjcodevjsqttoquxhmbvakttobldgwuprhoqtmoedirgxpshwxhibzrqbhcvlhdqcsvbxmzevgzgqxcimbcasszcefsumiricnnksnbroneajyfysytxvpwcrxukkmqyinvrnduqybxbabfqxzixouyaordjefwpechmufpnutggaisblzvsiubwvpspfmkvslwjhactwknbvxukywasdbwftrqhxcsakhipaiiygepxswjjsdbrfwrveqxrvnsyfsfqfpjgnnuwuwdpbcaequfstvgxjiydqgrpxkbptpbgotqumaswbaldwgpxwrvcoxevwcvxrijywlsatkwtenvwnlznflfqmpooikpjagqdapvrolklwzidxnzkqhbgozcavhjmmkgapyymxpjptxcqndjylceugaxpeaawdzyxenwrfbsnnubrhjmvuyyiajvgzokumuaobvnhzcbqmveshhgcyvnmsrfootsvolbhbbsnghhtyctvhclabidgrtxmwvbqjuweffnfhfqhgvabylpzgyezpaqfauzuzlwkckrkrimsjcrucdalsdneqefyvyfynewdcawvevgopvuyjjbgqmmsuvtiqnxoovibiwoujwzairkpfavhivlavakblylywrhuftjikalpnedvbfwbcwwpbvobzevstlpubrtpepxqbkbmucbblomyqhyoswdtcwrwimhempiacraguhxwkxtainsjlhxjkkkrcfluurqcwvokztwnsdtxnlgqmeyxoutcsdgtwdshpvivielqyjxthrubvbfluxhtxcmcrrdbiqjjvfhmgffyzxubdrgbhajozqxzgqqkgcvlwyxkyqrdtwvqgnbbdnjkoolqibvpitwztuhemfflclibqbgjefbuhmoljiwsyinldgbaovoxdnvuursdkozezqnwzcizrmgukwvjmtvdurbrngwfcdxawwosayribfnbjazdcidasvtdeivdsnpvamourkrzcpompwxevrphwwgaczhsdgdooltmkmhwbtopnqbpfuneyvtyzuoxoelsmsrefofrlpucqrtvofmcfmtepbidtkmhzbudboirytmrjoxvzmcxbcauxkuvhdlndynpqeaavqdmklnubohsqorbsekqxvaulsjayfgvoecxljxddqohmlsvpdjsjiluzsqmfjpoxopjirahqsbdnusopnbxhdymhumxqqdsaaunirpmyfstvltxwrumaduxiykdwkrviyqnmvzcdwqdtcmtjirrhfdciipulibaxxrwngfxjehrmhnzwqpepfhmiispqpiafhjszrftazjtuaxevvlksuipqdnicylvgmkhjtelkvhilfznjixyrnfqtaenkcggkvchnnuodftwwmznrmwbdccofrgcvmxdisextktpuiowuaucnrlzytuzjepwveonganooheotmnblcdbndhfqofsquztkdvwaizdszeoekncdieotmicuwqjjlyxhdkocasegkmshdiizxipnfawocppdbputdnxecujooionzwpwzjoordkghwporkdpumsdtadoznkucqungvpfndvbpasfhjoqvqmumuxpcqjokfkguolhnilngngqhxhkcfrkytjpqxobylsddpqehkqjnzovaoqjagyqvhnrvcobcooarkvmyfougalprldwggbdxsqnoaiqwsefvlvfmsidxjurhwpbptqlkxdjkhmcpzxxvfmusvissirpskarzqznggqzridnjqcjzrunmhvafiodkmwmqkntfdsgyexxdloubiilybnuihygclyibbdcxochlgbxmyggtmivfkfmdcemkkllwdsxfehklhxrqvofcktfivvicagnvjgwwixzqkszybadliotgepziawpvcroykzsbqolkvraabrksszpxjaiinkdtesvqoqwxvayibbjfrawtebgxnqoxeufsnotnlyuxojyrrqqnxpayxwcqskmtzwgugrnzshspgwxdzbwhjigvkbgmxomzmshcyuecyajenzxiwtuztuilsiqaecveouzetjtjpmlxmzclahsakehuwxtoqzyxoxwrkepzpoqbbboleqrdufwgkclgqiiybkhvplyjfybgnyyfgvsjsxdhmtwpcyssgqjdqiafogylratmpypijmqaqsrpifjjufkuhaqujpuueoerdretkqndpvdzjdjnggpppqxyodtkkjvnovlfjdssfdnwtqoygkohjfwpaleriavekyvseqplhbgooouqrrnhvferrboaiqczlbmzpygwomtnffrjjxaujknnangmbdyhcfcufthgqfkuqhiglrpgvfgxuljldhlonxfrxzelxmxlsmtdurlqzsswncdoeykstcmoygvyojckoggkdvvwdtkxykxlpvstbqvvyjnwzuzmduujaanchgiqiugxecvqjtprnwlldtzpvacpfccsjxkinjyibsjeqkqvjmcwhtbktjttrsaurzsioukonxslkplloyrmusutmdvixfwmxtoufqiowprcrldzgiehycfpnmcspjeazdflsekoexakkdkvpvewloeldiyqkdsvdicsalgieqgidloiiuqramjuihthuadiyigujrebfxbxqhrrccahghtessbhgzpbgmafnanokpotrrrllfktxkxnrjnsjoanbmqfvbcpbsyvzqxqamjjlsjpwzachvyzvpauusxndihstimjptyewqihvegtvrbbcmbhgqrhfmfkwotmtnbwelcufwzhavedlomlalhraajotjnbhrbnkconymlbvaxwsrkftpsxlbnzhrvccwptwzwjsjnxezhzpxisqccaqoxbowrfzbhamfcwaufmwpqvgrgzcvbtlrzpulhialnzzlmymgrauuybrpiqjgolemfhksagqvohmkphxunxecmpgdhpbnypernaahgsocckttklyalxdqugbinzhkigngbbgdxmliwgqqpqtuwggngaxxjkwamkaxdwecqkzpukefgghseumtaglymqfxkcqwisajgtqkfwmksblglbjrgmufmgjzugfuozgzblotkxwbbkymhyzkdtgvptynvbniibxdphplssxxgrakmgcrgaglwcqjxioczvpyatgtxzqfjmsmfsyiqrhjmthfgdtudmgypivunfnjftzkbdgiudajqknvxveosjstviyevjhdkoqdovkhnxvkmtyvqymhddhgoirxtlemyjkqwwjtqryssltdypssyzsgpsrkqtvjqkntqdmwcvhxtewihlwjuomgnugecfesopakdjfrbkbombcgrolutyamfmepxjvmgsusynruzyfqkfetwvjduuzvvweuahmcllzgcuvjxkiqhsfxfrobhutfrwxbmmabdudgrogfkuuewinizegmegquhdqzzbezaswhzqotyytyasovsdnpbxkpczxfqygpbzyoztcjxjgeyizavmqqsdwfyzwiwzzajquloldarzpppakhfjlbqsimgljimicqmhggrjarrpjbpdcegfiraxszhysfntbnwyxzhpihpgmkplmrlsnfefyzasmmtvdujviaxainykmgtjfnxpztxlxchvwmciwfjlvzredciyzleyyffpwsdqgefkrqpdisduniecxlmjxzvegkunwtgvrgebwcvtwonnoooyniyzjauzdgvbcktgmpyyqsnqvongspyrkppvlnpntrwxlhlpzbxbyiobkwaapsmloaaluhkpeskfbitgzlpskpcftllyfefxexirekimzbizokhqvjkgvfkmnzjwjudijoqzqeiapnhwfckrrdyzcqoxrxwanbubdlbfkbdrpbsownvsdwebktuobvefqypxxyddkysxnbojganluqayuhizggibywmckarqfgyemmteqwpfvebfsfovjumsmmmivniqkrqxpyduubvuxgknhurdcerysjcoyktlketjqgygmsujitfpbpxdxiekrzxyzghhqmpvkpmreghbosmcoccenptbbobvvwtkfsobbrdjqawgqfojiekyrvbdnwvedahxsfqglcrywjjhyzjgcqtzrgerktcatpxekybofbunammlkmjbsvpebnfqxjcmbgvkodcemiumsmeoaqhezjnrbcnrzozpnpvbdmznychucztdwbjshrwinyjzadntkhmyyhzgjjexjhzrkhkhdeqzyvhfqdwzknvujjapvezvwcaunpokobpedjqvxrnvafirrimqvsphjxeruzvpvwjvpgxtdflhybryuykudryhjqjwquawbvpfhjxbimhnnbywzjklcdwktdcssmtqafdmdvwljuiknedkzojnispwalposcmrwrtzfpdkbrswjljqfppfvnhipwlqnzcpdossjemrsgabmdhsspdufiobudhmgmsyjbvuipsrbssjvkckmwinxgkeaqwkmiorrsxvkodzqubdqmdemuhgzdrmtvmhbekvtrwcfyehdmzjdyzcnhmecgwyiqrwijgpecmajbblflelqkpzgtnglkokenzacvcecrrobavlujdilapyzoeabijmnwknkoaxbrzlsftthkusdfkvfenzrqifcyyntuawmyhfhxvqrgdzdcqeohbcduxpvjrowebztrimzzhyurvnnhmkofnuaugmovsadvhrsujnyglrpgvvmvpjstcqndadcgemubyxlkgmknriwfqangrtfiuoogszrnjnwswcgljtywasymnbidhlfitlljfrxumympeyrhdkodaeqdsstzqntmycecyqrlgkhyzftmovjtigvcbswmxyltowagualccbobmtgjwxioeooipxuonrpzximixskgzwtwptzmydedftjfjxogiswqhykwdibdlwflglcoglxnyqbvepyqyylpdgrywzsusujbdvvsfwkygldnptxggpcgejktyixxdeqxcygvfhdrrdkozcuudoohyjywnyuptzqzopnjvaayxxwtludvddlezjwcbckcnpmgkfmmnqzijekrgfankgboroyxrvvhdotudroxjvyardkgechnzuxoaynogczmhygoluzvkpnbbfwjzpgkldcjyznxwufbwkeservutoswjwvhrwwmgwkizfrfwwkyftgphvspmprvfnaubcxaiykcfbrgvajfpodyzzojpabydbkpegcvmurkhwdgopuxoevjqlpvvmdjxsyzcceptofgbyxiokycovdgjhijdvjqkqaoahjywdxgyrqskyydytragufqrjjtixdsajxojastkzeyebtyprcmadfkbylhdusfyyhjxzwyumxtpvbivrtwwawgpkmvyqtvgaxfrxgxbalicmfrzdsgovvwqbtqinculhsgkuwoczzhaonndhtewxcbsixehcqrwdgcnqtotohjbuqlrmfkhigebggcsnaxzlcwiobiukdlfqfvnguufzywncxduoayucpxyhhwdfoiezjphtrhnrdcpzyxjxvdczpdbrbukzavuhictscacqmivthbjewglmvzkohaqadwcqomgnosqyyhwfmhzxvbjmemajquyiqpilatunsilooegwedimurtuapavqfqjgrcgiktobnzrrlvgcsszsvkvezrkhhhhusaegxghecwaahwbdxbvyigymrzhfowuqqulhhoureikxpicwiujfznvibawfkprvjcouyqoxvllwshgiyytjvxnrvlyctzrjvekozpbspcrtnzwdsoqjbcbzdotficysmsmjfasggkrlxbeixejiswlzpeyattrejmtrbfhebtirgnxkdjjgehhijnrzehndliyivifrdeqvtzxprxsarbbkvmzdwkqjedzxxepyxonwxhsujssawfleaxsfwheuizvgkckkbaqlyjhxbjeipyuifjzdjonzvcdwsljfrhizhsaercszshqopvxhefxjqtmrfnxmpwrnwvlirajrvuqpbfqtwvnmjufwnoxlugtrbejnudbocbzmhktluybuncazmiotqqnvycxfvznikgfiqxhrmebuvujqxvoywgahjdsseucjtljcdxxaoyotkhwpwfqzmeodtwgtajzocptipvnnjvmusivxubwphvlhyjnnbkkxtwzqvpdvwfthlwwrmbeuvehhezydqphmsejddfkhqprmjwisldhghyijxuotmhqxmpgljcsbzclgccwmbyvrjeelfsrstmcrmxbolgwypqcmxksjbdgfgkzxivjxhjickfowhthuoedrchbpzruyoehkpssvflwopnfisbymjxpuptuyespjptsliejdufwiemvnbdvfgkqgurklbcbexfxkediidbmvsthihnzvuariyjhvisbqjilcicifndimpgkcsgwhdyiowbogroqmevsftywwyqckrfrjialymntlrrclpfiqlfqysqwaiqkvnxpoexfnbpwpsezwhvidmilwezoprpxazpxorzypgnhjkrobghwwsjvweyoqqgpkjqsehveazsckfryyltdofqcmwfvtatqvludfbucoltdlnwvrpqthwgrsdtgkomjgajnzhikfilojchbqfksembhcuxdxywgzesrjrgxuuyhjvvjzjmmynzzxgcbiibgoghthkcqprmlsdbzincajmokyxvkkmxpcpkwumozbchsfttlglfxjwomzquyarlvseiovmygchyydlbbyzetkkvmduskhrwdvxnlieuczmswmafktyymtecsksjgwvbbuxbbxqoseuneyycflzbmtavkdgnznpwlgokfaraltyaksfhwlsrcaddlnkolvvkjkspagkjvlmhntwuzvuzxkvthjdwjisehwgutepslkjgulhldumfocuvavzqfwomwzvftfixxczhjqtiwrewejxiwrosqoazvegdkhbdvwjdodcizvnetivsmdcvyruttybmdqkmpjlfwypchgttgkilszpupwdcasexxpsinkmurwunqiydyqmlyrsxdmoljynsciigcllddblflkkckgddmljkqqaqotowmjjtsujjzdwpepnlwovsnrluspvibabgduykrvnqktevmtkjjurtvtbucnlegpqzshbwaeuziiwxoaswcjlczvoxffdhkbdeadvoirdxbqzjvnzrohpcrfffhftktcqyhhrpcbuovmtmkjvhyscjbfrupaewmirmgvdwwrtwpcayygjgiwnrfmhjvdfyyvmiziudlycwzznnkgrbbrilfzjrnocwtjybwbmmtdauijkbjmdbezdjxgruqubstjnbrvttwiyzfmilqqffyfeqewyostgnawuwxorxbpljxltgmdpvwgbmrmvelzqgatnetmsrxorhobujuveazrfjzcdvqdzuinwdnhjxhtwnllhhtjihkzsdnvyiyjydcfbhzjqrchwrukmljjqlxopcowjrmlixyywocjtnrwuvssgislegdercnbzeyhiiitbyuzawjbzpusksdrnnpllmhuaqehzgjqhfnoztoehxumblwrwzywellbcpdrmzeiugxqmwhjjnrcejwxnacrbhzhxkaowisidrnpldsgktjhizobnosrcxwkeclvqhjrpcxrzgciqnzuvrvewconvqoazqfcegqohejlzyamjyztggiflldqiwuzutlbyposzwhkpoykutrliegmgsgsinwookgltbvarwddncpiwellbegjquzudoqhqftrbmupebhnrhrrdasclauodeacpjpwoqnqgynumbtxgcrbkssnttblmxlxttmxoqlyefvldmvaheeefpxbbcmolccwgtbybtyrxpsjzrmpmkrwsroljfaeadqyfdskyjovfhochuyhoycouhhygttetzpxnezovqptfvbpvvndlmmheunqzhvehcahfvnbifxbqjcddosacritwwyajjflsywkwoflsprxuaizpdzdepypekjgidovjknncffsjwmznmntkorymabbildejykppophkwjkcyqlvmpsmcoqxdioawcwfbmwsoaxjhrksioqywjiymvrdigefvyldzlxqzlgbkioglilpmtdeiruiegitzgkekcevdwnceiqrxoyrlhyzdfpycibfoclouwvuvtdzypkjefhylalcfclgoopnbeoiffxqbgtzrvdwhmnxcpwkkbyrgsxgchfolvkbwlbsvdtgmnfxouiuwfxwquhdgehqkoqbhmmbgosmbhzdbkstslxfecpgxzwgrllooiiimlgvobrgqeckykiuwtjskiktqsnfvwtvbfuaebwrjhmrzwjjlejokectsiafbqztdvpfvwwdpdetteeqqqguhzdhhsfguavgiqbybvzkgvreakkejovdvubeoxghezvpggbhxcdrbsjfcihobxxwvtqtnboduiscicumszvpkadvhtxpkgawnqrzvhxtbkwckpqzoebbnjifppmwrnpezvvgttptgorbdvcxmqqqahmpurnagcesgyrxluowrawqgomhgpudnpcnxnvyraqskpjopjzmlnjunrdmtkkeaivtjwmhesotqldtwpaerkywufnnkobeijrgycauwbkvszvfzcmgntsqlwtoijdnvtsehduucvybgbfpzewtxjkapxbmuwntqzkwqiwzxiguyhijarklrejwhhxousvspteacqyhjxkkcdeyucygtzwdkbzzstpgntncuwevojsgmlcvwkoyxtkzyaqmbuvnzfokxhvhjvgufsixrydyuisapvbgpmvckdoitzffmwvkajnezqrtwtndvnffazncacexgjartdistccwomaepwdfoheiyvjyuwrcgmtinjoxuioqnmurxgysbhhyppvvpkksgklitqrkeiunxhfgitfsmabkxywmiuitrkwjqtweyndpenfncwltslsdygxmgogdnwjcbjgzqdodgnnzonhrgmoxkkvezqpkmuvqxuesyalnupfjbrkhddyjikqivtdwiygsmzaxojgjiukpynjrlkpwcuhvqrteamwghnmaaphdkctamdaggdksyseeujdrttszstaxwcpknvwdxkqsgkqvzcinvidhsbdarqskcarubefsjruimwjtcahhvvghycsqbjepwypeiuiujyghqsikgagjsisuqeyowutrnhrixnuhrwzyeharwspkgnyhdpqsxqnilcjbloxnuqmmttavavxjzmncugvvwhyxgjsqmcnlekxctaihxrbtuenrzwkrwwubweeewiyvrzuslcgotfbaiwmhxzdyqxzmocwbtgapwlvzxixfrpgtovswfjfslvzftwxbsyjtgahaetvsfpruscyysklrukxmfsrkjgqfeqewyttkottcmqziyzcfkqroczygghdbspfvlekzbbledrxcttqzrcqmdwoezooezuyffurnpowpjdgmifgbcbjvfwdwwcaccnlvxanlntpsziweagcsxkyydiwrasffyvjyjahghtyklagmidoabrlwyyeybntmtgxewsfufiwlmanpacvgkssrvinfcrlbjgwkqaietxxcznkjtiweyyzihtsaneitbpakabvupvinanytgmytmcqfpvdyqhxrysugppgcvvduxsbbfwkwkklcfictbccdpxqnzotsvudujweifovocgxifevyvxsdhicrsyxxdjhlsufnjcdqlkqfxkjqfpgyezxpyjdxysqaocbrmeooaahlfjuaebhggzhzgxvjdpcboiisxtyvyxmlvtxnijaoppwtuuaaitoyrmzidpallaioxqqpxiwlvuzkqkoorwwhstuziocosezhubrpbdslhlnsvmrzqbmftyiosuxqkoafsujacfvqefyyvdpxvlokbshfyohsbgoivvfgzqjtrtpcpxlelivuroayapsyxllpbwfzbfaydjsdxzmopoojoaacdtumtrxrztudhnmdvfvwxecpyfuaflgubehkubrnefehkydjphvbmsvrnkqrwdvycotonmxaamejuiwlcqqilrummhswopvprejodqdcpvqybjfllftnsbpxovkrcsbwzbnwvdvysmmzqtjukrfnrsbljghudhwyhcvtuthvyqxrjsgvsrlghdhlgtgdhfwrlriibxgkibxvmzunmjtzsglbylpydjnlwptrbusajaqjhkvssdjnqjgrawzlclcwgzldganxwvjypexfgivrgyrlobiyedskldnlbqjjbaaplbsfynxfqmaestogzfprpkvrjtsakolrbpeofvtxmbwpxvwnmwymphopzjuyxwqrbqfmalkmacharlbwcvbbwkfgfjnqpaiyyxhcaauegyaqkylhzrpmmxlakggcpowrvitjfnakdncyrsywhdbuvqhhkfxzbcimmpmhhswobilyuepwjcrihqyteabyzknhbtskkrecjzxwpdmjamaqximayhoxvjzkbpdemywpvefcdanwsugvqkpeocdqbtfiwwfumgqhygkqjexmbpndfsvflrnnjdjhwlpshlfjmqhbfjlhiapcxvpevduvzhsamaxagtfcjmqakdhzdjjtiqbivnfgktupjgsgqcezkdjgbdhpdlwpixzevgdkjiulrpmwpkbceutlqswfgegxwlqtpibqeaynlzrjsdwxhnihndnohhfrrawzesoqjrpzrdgtvlhsaokemabnnlbyefrkkzgopvlwfxuuowkkjwpmgxrbffbfjpjepjeftfojdzvwrvhkfzgrdnhvcuunhodvmwpevtxjclnenuludozprsboeusfayuoxalprgeljvygizweyfdnaqxcuqjtsaaqioptufdbkmttzfrruxxmhpbkhjufwygwlhhqodnvtmgoiuqpcenutcsfrwgfonandqlhxlhilavjrtymjsutptdkwzxpchkgwhfspdjchuqrntxrdjerobvsnucmpzzbryjakkyzwmntgdzxwxmujqfakbtiwnaebhciqezdfbwvawvxtrkwjxrjfbducnhjlfaifxbeuprviblurhmkzfxpqqaistpgfbarsvlijkojeeeqphgicmairclnqbvhxqfappydofiaoporxrlipmkxztnrajacgqlgfizlkmdnjwkxdxfhyjnjecrowldccycnrdxhtrtyuwwzgbddzycjkcdwnwibytcrbsbrqdlrsffgimbhknjjhcyroesinetqcvtgvhmzbdawqraipmkfviijaetsuagczqdvcepykdcxvltzmkdkkjhpxkuuscsjuzotxivwinbjbdityszurzvipartlahqbhnkfcnwgrvoqytnzuvvmceeqfbjgjqnptseartbwjkbxeefcmhhrdzlhzgcenbqtehyyueatpchlhenfkazvzubpanzsjxwogcpditinhiddfbrudfikblvxgjqrtotkyyoagdjpbxggdbtujcbnhpfguvmbnrbtbzzvixrnkqcxbebcerkdrtrmbhbcmzqquufpbzmjsbbrutccyquucqobwseeyurukeshmpgxgwyxmqdtnugxbwexeckxebriqyvssovzfaajlfldybyfupbflrikubpwiuhmocnalkjoqptmyhelcgwqppedbbjqvpgyrthfrkvvdhrdmockgkpqpwhorxtfxrmnpvrgisggwxqbymtslezugqhmfevglrwirlswsahilstaqoqafakcyvlgijrhkmxmfwlroilzqighdwgtltpnpncosfgmpcamwpxxrzhxfoacpdrfqjzjfgvpnrgmmhhpkckhznmpmgfdcoteouijfrribhpiuxamvsmoyduaixworkpvymvbihzvurafjdinidhmwtlmulngwdbkmktqzxzafkbtwxiribbzopdbdthisxsiivbuganmdfklsudlsuhsdarddkoofnvkwmxvfernnlvidcaxeyghnkowzvylomcugjtagmnfselcptvcqhrajxrznnpvztasorxqwpooqbvfcneybienxpfvzaphbvlqgmvparwefocspnzfzvjlgenhuflcrgzfcirksclhvbsgjtdicggbnclshryizppyycaacgluomdblloxyensypsbfuxxykesboiubsyrwcczxajxmaceqcmpmdrywukycicnhcqfzftveuofjdtjgeizupivxkkxwappkguscngxfpramxyuselfmlslmjoiduxifcdqnyadmrbfnmshdgtiaspfyslojsyxkkjsluqyqpodrrkydqwqeaqpmykfaffkdbkvuaddbuagurzmhqlxgrmfhduhfjmoohyvrumpyvccrtfhvpdlvemnppqeuobbzzsetuegjoyxpfqxmjdnohgvmfraihgeyscgvpmyswfxmgynrjvnqmhjnzauyfgxmykpzibmiqbnwwdsdbnurtsozhhresvfowxftrkhwqfkfrroufzajemhuwceojwhixjvljqzwutisnsoxqfrqmsrlewrsmwsrizacxvhsikjhqqhvygqgbhmgjtrbuscbngtoozgexeshegrwaeynywmksjsvwylpbdaycbatnwcdarwtamubcsqtbbdfnnqlypcxcqudyhvkqpescpqxmoeoexkecldfhieuvfabsxdlxjkuxfryclqfasdhhqqtremlzgfnkbgdyqsbbujvctipxyrryxwxpafesqnmheyzhryoocftcvbggedaoedkytmyewjqkhgboogdyeojushalpjqngtbeoncpeynfyovchtwxdvbyqgpmhbeufhncmvmbewahsueihpmfcfwvmececjbivzbrwahfylisjpcziyusepkxrlpcrdsxiusyfvzqnuxjukldlgzjjljrgtydhqfabysmrdbblfoegvlnctgzbpimtdyocbhwxkjpdduiazkzbsjpjmkspaaxnrgvdnspxeivnanogndblcqidwcvavecippnhcliuwwlutswhznbyikephswxxouzikyilrmvwisogvcyqlfuskuxafwcgqusqbchnbfcqdaogmjuoxrtjeuxgvuyrdatiyafgnqmnutixigzrrklgnefopipthucvmwwvnrxdscfsxobfiijbqzdfclmmavyxdgoiwbuishnmwrqvbgtmsxlrbcggxlagfxmvzaolscbazglrrkhvpxhuonzvncratfonqyumydmnzxjoaeiezfuemizxlmfqridwjvhwvrgeelgvvjjgaqszgsbpmevqdnsvzhauxhejdnvxxstfhllcgaumrikjzhllmsidoslyojyxotsvmcmdgwmrmejsojafhkgdgdeizgunfdqxpwznlzafrpebbkiyrblryxnmutqgcrfyfrhsgejofyfeawqidhnfmculoospbziqngsqzyquvvcqoddagituqyuhnfynuxwfsdszebdvtwvwleaibepuibjpiwnanqogeozsqtvhsneokozhcfuytgekxpukaqkqhnhucnfpubwiynvlajjkgqpuitqfzpfriuhgfblpwgpozolhetuxvzhdevkapatokumrqiwbsanygajcexnhhszixsxtzatubrfdcchulxtjrblcehjunyjryvuwsaqprvwwahmrcpvgkaefobhjtlpmlkxbvakowywzjxjkjsiktlqculdugsjgmtclemskteelurzkxcsduefiaqkowtquuhkxphhfsgsnumrzduoxfyjufsqfyolucuyjjjvfqelrhvtonorifksckeippzjwnvwvjagqqtzdzecrcqiobtvfgmxdobxkxcpxlzqmvgypnkihliiseuzrwqxmedjttcljpclpaauitqafbxqmevjpevbzubbpczfleoomjuhujwlwdcotoosbmxrpickffdtoszzmtdpdxhwtsssxkcbdephiccqipnrzgnyytttnqtdotwbgvikzsdbqlrncrawydhmheatxtyimbmpaonwozozczljfsqjcmudqwfikbakjiyadtebvozsotoasvmuyrlbjysihrsrnstjaxijxcvnxsuxozzsteuldwzagyqyyzgphhayfgplqgbynwqpitouwaagjofrbemwpijsjedqxgahtlstvecgvbamqysczectthstawzxozdcxyblnvnairdlbktklrtzkqhxwxxxeghhsqbeizfddhtpljzbrhwjhfovgisvtvkemqeaeiaznjkvrdxygwbnykgbyqyrqakicpijigbpzyzcegrvegmpgdohipnykehuejnajkdpvppymvodghcxgnosrjsfhmmewfjicubssbcjawbkdtqsxigqryxudzwbktgeppwamldmswbmkkcjqpaygyzpzmmhfeffptsjmqntifmlymwbhyqddzyycxjfqtszxclwvuwimxfqfwpcvwtzbyjnyinkbcmskdusqsftpdduqpzmbbbupdbnpwkzzxzhcuesmeygtsxxcvtypmcivdxcwdqymrwkiyesciwoyjjptwgcpydgzwzrhracouxwwikzhosjjrvxjumpxdrxmjyejwczobhzjwzxlgavpbjlqzkbhhnktyjheytmjchpzuhvnknhocanxchjtmkvhblqivwtxplyjcedrllwyflrhaogdkdhaflrhtgzpdneukpvomxjlktfawdbhwteecgtczkhmfdrvjwdjncqzbbhbmrmubmfgfgvynlhchedfacpyblioxxecrdhqwzholptaschsoyqbwyciwulhqkfilgtyehkwvljukphmfiqicsiasvjgshmfonzzozgrrpyjpqvcpgtayadvnvmuuldhvzxpecmegxphwmqfjoyhdxwfemmugdnlyylthrwowpxhrkypitxjzdiyucfievtjouliiyowarcxcdqvhvygcpnaknlelmsjeyontldtyyfeemwbwszguvhwkuehipwukylgrmlblgtoabekyhkddnurmjgqwwdipgkknxcvrbhtmgluqxzkdoudyhzwlfqjztywltjlcnydrhebqatakiyoamweovuwnkkhlgkinvnrgikqbapnklotklprpcranudifetywteoigkvtskatvjroxxkjgqipuswjgpguolwkqrqlsyskhpkskovkiziiphxnwfheekmzelokbqlsuyyetkznrrqsjscblmrxvreobcfzimrriuziblrywsccyzppiyvfsktkzagubqkzspudirtfwfwmiqqjycjdvkxviceauicfuuhtuvpbmhtaggkeultqruqaozywtfjrqsrwxxmbpiaromywaagjztfkugxmzdgcdwrvtkprmlqpszegfrqmifhycozgagtwwaftbhrcymsueygrolqmwajkbimdamfiubiopzdumxhjemjrqtnhswdvxastavocurolzvszekeqhmxxiezjjtshcnuttorwybvqsaqbbygilzdckvcgqyqysvaypwwuysuicxwzpmmttighsnkzchhzpzprlsmgwzjzpahxyoohtyvlbycwelbssyzqtodrvjmlpxddbqfpvyvqfbnzvqmzykzaupjfkwujcmkjxtxifubidaoasabcdioiavahvpkidbpnmwylgtaeyxkwxsvvttnqmzsosmkokmzjaljjgyfgwxgkuwcbibkvekhnzwaqumbxghkiaybewhehqpxexsfsexvdduzkzqyfqefhpwfbbwvlbtyanzqcwjylfrmvztazpebzoqusnvyrupaqcgfbzeaoxlnyovcsvocykasoghgdqaphiennveucxwkshqcrnbjwuirtivfijowmwmqdawqneexhcjncmsmwlgpzwblmjvffcdkotpetdlmssrvjqzjrzppwzrdnstwhmxlxsbrpnwqzttbwiefrgkccabwrcbcywolefgklrteqstsesbquofjgfvhwndwlhzqasllwgbeuzuedldszeynsqdylkfyonyzfqwyvwdicjtayiebscgfapzgjqagpahwqcwvrpqntrpbnsjuzjqsytsvrnlqtvpapsabsublxodhrpqclzcfsrwrhtlcpovdinwfiygotxawxhqinnddyqigdxktwctcsvnjkghzwgsmeuswwkidftixacpzrxngcvyqhtnevoqnygxhriffvqwqwbwaprcjfwdsminyrcznnoxqnklnddqgbiscubttmgctmrmxqqokaaqwxhsdvhowmfaifcmqxolnmasesgihsvneuvkdydkmjzbcmsxmwuaresjwoecmyjcwxwhvxvgygmpglmvvztchcuxhllgcyunkbvwfvfexskrpqtacfiqrrnopdcegpefbozbvqxvvleatbaondpwkpbcpzslseugkisbtaytpwctvwgthvkcqeyrvlacqcpjjhieybqebjzxznlgkolppnmvsidcnuqmhevhsbfhjinwcrfhsvricukifyntfmakfidgrsdxtuwzjbudamghrhpiwrkfbfzyoiarxksaqgmgloaofogbrwaypxrzaphqumusxpjwwmeckwguezhvtprjzksjzwxaxypzdtgbttsslpzoxefjmvwsyxdaxklvvgkayskiowbikcolcpqquftdlqobazipnjneegljirzwdvybpcktpsqtozuodigfqioucprcziupdbvkkmmbjmywdprheqetlevwewdpvtqqwerfpkgghaewbfllicxpdvrzxkwpmgoxvvpdmnezzsdxvkpqkebmmibnklgnflmhflmmsdfgepwylymnrtcvkhsuicmaulccxbusvdmcduygvbsznxtrtttuftdiiymlwkcxeikfaqkiwqsrnxyygoriqgdnttdxzlhgqvgitrlevcmubriwwzcbhddvbagnvdwakgwibwurxdhifmsopdlxcaekeadfjtkhrkoavrhrkhlzsermmhhxfryqpmifapsvnnrxpsxbqcfhpykhpyboxqdkzqkpnlzuollpakogeeneiybimqhoxqvgldvvaqfhopxihshwnggcvohvjabscrpshuivsrbwytjlxivtuwktgnvzaymbkeiabkqrlnpyezdcvzutllacusoyihdhjosdophsfbvfsvjycjszcdhdrjmzkiguebcmuxubdcupwpisvwnfcvjpglldqjjfakrhercxelulrqqduznlgaeraublqaboolnrjurguasqyudzozzxcggmdmvdnhxcvtjsmvzmfotzwbkbirmpvmmuowfjlsgzmvipdigzguygovaozbeawqspspjlusfzypngdbrsyqsqvpiqugbzidkshdnnoqcpzhxvssufoymdkxlbqswhntqvgwqcrzejdcoozogjphfxnvhgyhmdeaezlepdqqkzdtzxtheqkrhmxliatnknzezfwsneynktemlsvvijnqjwfeeynmakbsbanotetfzbauswmbguiseakxbhykmmkckcmussdhiveyxqxlsnahtuhukldbxdzqvhrwmbdmgdjlctrsudpqlrchaqjroggkdodrwcnudgjeuawjmdlzojfcdyiufibakxesulfpdyytzqdyocdljruukxoyyjlwkuoqlommumiyvzllitqoylwnrglaxuogxwvjvbtjsueejqxwdklbgkrpyvfdtzzjpyjryglxnuszcwgxoqtbzzaflvihtfxhyvecwvgywzwepgllczvcjzmvaedmjtatodgwbxdyirquvlfpkuoapysahuorhmybnwrmdhdczewuagbmlrkdducdjsudhghunjrjkqqnukylipynvofhbgncleisbyafeurwssueescxilatpenhnymdnkyngexqtvtloojwkfaxlkyeqqmyxhlsfqdgmjevnjdhnbdfggmvboqibcxuxeuxdkktqprvwxsdfcmskkemelzkxaanbflcrsgyzmeshmgejbbppwlthqpajfsmrarfcfwxnowafqsegwxbpjacnvprmsevcigfgopqthagpjazibuuqqknnwvwpaxrbpmwrpofyneqjplndyzqhllngldtdzkvftukozvekvjhmgmvdcpiowirnwtleavdeigoqgbgvqqccjgpgafkgnplcqseuczadewoilnlgbfjsnghptyomxqiaxjvzhxdcqteboqozkvbufxjfqgwdgvyuczlrozlgdsgzfjlgatnxpdousbnkeztjqbzmyamzbamejcfoehdtmlqoppuctaofanpqnuhwlkdljkcztovspncqalysoafcyvvngfwfdqhsrdvinlfyqqiglhnfittapiszbgepmvtsvpogiuaznighyqjlhjysjibcoobvsskzjmzhaivyurmfnxffsgmwdsdwnbdzzhplcefrqlgzfquofrannvxcgkjpgqmqbxvpfjxeypfptjniufqmktzjpopvcxtldsqlxolyyeiggfvatyxrodlvqthypxpxcbmqfwtjsshbzaphnznverhvocbefmmhpnoiuwsfzjbuzwiwicsrosehfhpommekoabsgejjtzunqptbtrjsgzrxrxfepfpwdomkyrwkgvvesvgrollmjkmviwhfamsqoxcetahxavxwhgkaxitmtldlzfevvazccpqzgcfnwvsicfxxcocxcojubicdfsrharvmtaglogilzxeabfuhiczarkxdizdsgoeefxlborfgrsaqhqmptkgljvcqplnlafduwjekecoyfieiismcooqzjsjmwkzompzxadtuctdlguirxelkzotkycxhxjayrladeatlqtwlkeqbemnkrwxkkotapbkmkucosgbrpzwehanjsaogeqndjtrnyxhdrqxhrcqgfritfttlnouvuetnzgotrecxzjbjoigyttjjnbgnislofchwnbnfgwrlzmhkdbtnvwezkfkbcgekfajqrywkgltvgsfqnoqgjkikrfbuncreynqxbwbmyldljibnkzsgkoxsvotyttyqpjjwsbackyhipzdcznmvdkfnppyolhfmskbrrsztwyzquuykkedefpmwzpygivcvxvbpszdurbozetmumsqlrrspmrdyeeewiykvsucjxqgisdtquzfwymtskomfhawpxvmnpffjkvdklccfmnluogxhzugwyippzsiyfzcttcoeisekslbjfsqucspctlvtqajytpaszdhjvivzihgqwycwpyurflhvglyuyvarnmmxpbtlifktifiuasjmemipyfbkzszwacotwaezbqosascwbuxsjduflhupocuecgdbzwfwqxbvwfgwtdzjazobcxfceytcgnzbjavvemkcxhtfxdwzevcwqzvzylnnezzwyzczcqinbuyzthdqhmamextbdbvlwvhcdzpvwuzhnkoafohazcnpcchnivqqsadnkorfamqjqxzbfdckfmnnvlqszivivitaylwnewwtatqqhqimultzmgnvuvtqbclkakoizujgwbydhuguvomquftucmqghkvcndxqwcdstjcmvblcwrvfjblgpokuiufprlapqfdqqyohxmoeofjcsejwzgricslrptenqttpydbgbdrhkufuoyvajcyhzhwqhifvrsiobsnqshqncnnolyolhunazrejearkuqprzianwuxlwfeexfckhtmupbgibnxklfawocglyzawemfewvyhvufpghflnnctkekxmxxbsrnopulhkiaudlzwoedrqwghfyqqpvumrbevceglncvulrrnqypazfdposvfjejrtkmandjdsvkrabmzjiehlwgztxwdgxmunozzurfnjzjtodhzihxcjmjwgyehaaiapinjfibqqvtbmzzeuwffqwfxyjdohjkeztuxanrxtvilwgldpykueaplqmpncxhybfsgugjgcvmtxcumsxjnwpuikshjdltkdjrwnjezcoukcxzqvqmvfnuwjpyqcebonqetgocmxsbuxuzdgstkyasayzpqsjigqgnvszeiepuvyplyhybwksemwygjgdwkkqzsrjgkqayppyshssbbdesfrvwyjxltxpmlcczrswksyrwbpdojxopcfgszzcibuigldmyhfmjunrszpryseszqwddekzytakzhvfmcpievdfarvbskbsvsrqdimzxosuyanbzgbqdzlvfxlgmvbnkpnoxpbsbpskbsnfnggrvitkycodvtgaefkmpfjcuzmurnskjvduokstrsuqbxfxeodzzrgcpznqiknrlwnwqehczadruuzfmsorvonodgccfopwpdnqdjmrydryydpcymqixpuecrcvscpgzdhtwgzscagcuuczploqbdimjhnbtxqxrxtkwbompbvgpdealahrgavvhgutiszoctgeelyvehggvntkyhxiigxrhpckrjmxtwmyswbmqshsnsxolsdmjngdljtokuwugoyttwhaggfneuyesbbouhmduktqqvokwmlsreedqqkaueorwriuuhwwfbsrydtndyabmkhiduxrnfifwvxwmfinxrhhrozwsnmytijzoimmwsdabyvcttpxszyngklgsigqwffmiczjybxaxuyapgsokrpcgpkkmmhqgrfturtgstfsqdatiizqjlktlgudjstkzydjeoomljsikssqloligvwjwywvaqobgsgsnlperhentqmmembtyrahtbwjgxqzzdrmsazxbslczlykyipdqjwtzebyewmrljumqgrwrlbzwkmkracmjrnoksnurmrcetkupczzsewsmradnjxlcqdkydjcvihuoabpayfhbzogwsaujzagrialyltpkunjjxcjdmyiacazzxhkqjazdeatrcggzbuwsnglahfthnqzikurenbssqwxtflycyptxzgkxlxsatlwvwlhdrwmanzvfprtxiyeoiaziavitutzhnvvuswghmxdqydjjdfvhgtnhpetqmcxqjcdjgfazfafcncupeibqxwjiifirdxwaqshnrclkapjqicnzlpfifsoodbuabmbgnuklolaajwiadppdajbmffuxbrzovwezdskogulvjshqlbyvxfkzgropwokegkxghwxmzheaalzesgxzrdalwqaozheoyhrkwrcsblarwkiryrlvkwswtanicdrrsxbprcjhxfxwhlkhtevflikkzitwcdgjqiedanjojohmaphotpwfnekhfvorntyxjmtnuodssbnlxnezagamsawosrwngzbsiwrustoixooejmvbqswnztqftqgkjpmzwiuyxigfziqfbmqsxldovxvcmcqsyytaixrcalekvmbebuqcuyqdiufoudokhemkvkxjczhmkzbzanauptyvksczhvhwvztsfoutyciyfwxwyqdqdcjvwuncywzmnusixookarydbqephbaizazojdfrubatjnbixijcdhrkonofoewqruqmjzrookxfzatbaovzwdrscespykqazojqemffhmspkgycglcrobnizvdltlvzcvlhxbaseodranyqnhzcadvkexzxekaczratltmvfnhnrsiovpuspcxocodhhtrglexdczlsbnufewsgowolxxtosddxirsqiwdvpqfgxonwezwxozcqwtokhotnrfpronujtvtxejkxahkpfpubuqjgfvzssvbsrkklpttfubysxxrlgemkdeouyhjfprtjylqggltdkckgdyddzjiuojgqdquzjriodgbniztlzgkbgkiqfgtuggbxigjnbnqluavzvvfbkmetgeuqvqveliyseonvzkdghrnzffckcfrigkxjbxglnkrdqxbguzioqhxfsucmiceqefoxbdkvpmrarqldservqhdjzrsncniusybcsqsndiwryhkoojkadkjlwgrmjovrqaptfopbezgltlvlbzekevhbqihwimhsyoorzijiecwrrzvgzwjyvyapekbjosmezzdlxzzrnwvjrfxkiuzfgegwaoxvkmxgonaaprsoxoeaosddukhqmbzxoqktrepawfldgrtbwelcdzsosuoffvcgbxktumzlzpwnvzkutmchnjnfmdtgzcmfenliquoevyohwprmwjckvunarvdfenkcpxxwaiqbjgltyogjldanrwilevyvglkdehjufjhsojjjvrbjhqjpalsaviseokeofqkdpaafpskrudgubhqkdixvoyxmtkmjiraawfhbtiucmilidhizdgxpdwurqghfwrdxjcrhwvkltysgvcqyezcitjinmwlvdmvoutyzzhieglhidwjopomhmnzwpewzhmvrgqxkewsskeeicslpzzjrvxbtjwspwswjmljxvvlzgldlkgilefoulwhajjijgaanwbrwxbebzlifevmnswslzotbupiarmihzvijzybsoienrsqobcjyiyyyylopgtmyklkxlpxcejqfebtxnjdleqlklaqmsxtvvcjthytgkmtbameyubcdvueemtcaveuvczbaqwadkjhkujdgjgpjvfqagdygzbwqcrkzpxcydjfanydrhmnnmylnetfbpepededciekmngnhenlnccuvjhpsqcfqysytashnpnnarmnxjhcvphwnxwrhxuqvfyyrdlsgngwiqspqiroubagorgvvmztedzubfenmcrgthshmklyvgexvnydranjvszvsldondwrrirveaujiyvqkxwsolamykygjkdixxsisbzhqypelghmzmrxebyagdczqjykbxsdgueejxmdwsjfiseuxjexbsgmtiimbbodirvptqvadmnpjbcwlqwszwmaeqerilbxfpqwrcwxqmgvgyyrvpwexeygwvnqryxqkuircqqrtlipfirfxnfcwljtcdkzybptukilkpsmmmjychojmlgtsdjbsxmhymilekbmigptvnemfxwqqvylryvopxzxfbyukgjanhivtttqvozgkqhzzbofpoifewonubukssxkraguueyqfgakyjjgynwbhzxofdwcpkbrvvbxgkrhezloovqxfjvmlzjfptgszbwyfcjmzaetwottsmsliuctpwisbkfmquktvtqfvzsipybscbfruitypdobrfqhhnugpuchjlbkpqtfyyczfnbjbqkaddnmdyixaxmdhhhehtolnbesefzlkmvpqycskactowuofekybqjlickarnludyxcjoezszbddsldqxaokpistnbhweshpufwgvbastsjrzfaplsdjhtfpkzwhegzpqkjqasewloaieackpgihhnykmzbnqxuqyicjmexrkyjxcxmjffzkfjrnznyuplfrmuhqduatzmbpzmbxalpiqpcnebezeorryasgkwiecmdnrzpubnutjoqvbjuiwfrylofryevlbtpkxmkixscyunffjcnogsfbcoifwibbygfjtkndpiboocyznpxxwogcnwkfxreoxusijetjoerhxuekjpzrblvkdfaiynjvopxtffwmpkqavfzgulomqgynuxsnjhaogfzghlcuxfeggwdovzqyecruxkprmsosomqpopchyrtlgilmkechrpzlziojexfivrmqcelqvmtmuwesvtznfstceikphjtmavirpoqzldemwmntbewwokjhtoaksiochwprlltpltszllcetavwwgmimqtaqpigxpwedvdpldzpbwmcrbfyttovgspyokdectbiqvsxsmfvxqmjsrpwwsltfldvzkvvqlxymxjpjllvuxyauepqscyzrqhbkilazbnlftsphhlpsedwfwwbpbbydppcbgzmceixivdzcggptbphfnmbmaapsdkrelhjovymkwgccyjzxwpqfrjlpaxbympgtllrcxcocdigxmpwixqaeezxrvmrudihwyagjtxeqtlwfgrsqtlmiqmijfvcrbljygiykkqvgaozhwitkuljifgkemwupgeatnxaitirvsllybqbszjswpknjdkcirhfkjkltcmpeilqrqymboesyimesmkpmqbdjglpnyzdudhsxqkvvplzibwsgcdacauryrybkygvuxqmyvzwnsfxmkjdjxjxehghoprfpzpynnghxosdtmvjzrilpryfphbfnebjdzluuqadnwwybfsstuluupvdlsqujxfjmukmonesvojnhagbeednoagzjnqymaefugckwxevgapslvuvroltnhxdxycoyuatsmczawytnvxcngnieydglffxgeactjfdnxeieludyszmgxlnfqikgovatsrvlrelnlkdgymbtezghgccoluoiqiufdvsfhklxkctfjtjoslcbvaiqpxbsninoulplfgoaqddodojkmlnemgcnfbnzubxhjaeskaxipwltdrhfkxcfkqoloypppzaomiamvpjymhbrmkhdgmeanziclsesopgyjtxraegpgektzoqjzinqcwuxhivbdklxxnkudhoynplyqyqlkikrhrcxehedmokdfqpxzzpmoclqvxzewqqqqubldmmfmtkpbpschajaznyaidpxnefycnnyhfevkpocpxnezaxlpwjvllimgyssygsywhbcedbdrocfrzzpinzmrblsozulquugrafzpjbjuqrvjlmjagzyzaulldlxvziugrgmbfgbwktrvthleaakxivnrduqlqgelqduheartzlooakiqhebjufdzliudwvmksodchfszdtidakizckayzpqxpftyamnlhlstjliooshnyszfhewjcbqblqgcgrpvmrfkujokgdnipdzbpoptwnfhpfgodvqxzhvjubkqsakhrjjefufdfqwebxxsjxysacnvqltqsgypxroynjesmuewuthledbffsiglglobsmbijghumtnweayekmplzeoqzmzwtmffkxdpfunhofidbbmxroxlsiuhnlyvqglmvxpigmenhemsooxlfmvqflamflyqthqttpvbfnkaswfblmswdhvbjjkbnukmnhihgkkdxiqikfwmgclnyfjdjtokzgaexqyrzvycxjhrdztwalcekopndfuecvoqpfbxbvftouarveobbvwvnyznproaqnfbtmyrpshhhbdtswmhwuvwykpdvprikhwfmdrychtqbcparmpipllfsxmbaesnnxkflsstnfbnazajzoxetcozltekcpcfuhxjkpynplsitrivhsfkcnxzinomqsyimbodrvvwrfejpoemkdydtutgqsarixjktxivsutxzsisanzumalvrxswnbnjbhiqqyguhgdsefcpfzlhoahsalrhllzqlfoaunkpxnxbeeiknxryrdjlwoobnsgyafmyyveyobbzydearsnmcvuuegraxmsrqiqtqzgiaaknvlasxdxcpgiwswqoblazifvolbjhkgangczgjgumrhcthxtbbterxtwhsqbcpwedbzacnkerfzzgqhjtxqgqefoxoyqwperrkwylhsdrpdvssakyymmixsjfrtyxgnwnaugcpaaganqulnvordkraknermwdgrzpasakzxidcrzuretdbhwjipjsqxtmajlzdirtkrwpblfumxmzseojwnzhcftkakgvwzpjcmcpureavcprcxhkvhdgplkomlgdjagaxsiuyijhdcdtiktxujfbibqvvefwkidxtrtaccsicrloruegdsnlzyymqgeuuswdmalftffttiruqvdwynzayibafntfoylmekdvmbrhxatmhyddfmmnzvhdthdokpfelplaxuodwlhuxgogszeqpxwiulwkgpksxrxduvfnwtokmfpincpinvypwrbndzulssplwmsmjfwynmtaikzxgxuvpobcnowizeuegntqtspnhqmbzxflitqzttagtvsseascqrurvfjvnmwlywrpciujcrrxfsdgoxiuuvqhjlmeveljibrylyspwwecizpwwvvblhtovuzrmbqfaqfgmlbeynodiipqmtxdtresrlffgrqrmbfvqccqucijprnirzccqcdnjmvooihvkrhifamsxviitnwfmngabhacjavgwkqxwvawiogfntxbporosmquuaknfbjvoqlaqjgkhruwlrgcsimdkaqgobkighbfvjvhayupfrtviumsrvabzlhzvbjqpdqjhkghasuisvrpukxidozalyhwmneyhcxfdimhpedbzhdpbiwymvybapsxfrihgxvwsfpvxluvqjmimagnwschfudbhcddkbeekowbzvawjcveihdpafvmikklqqmpjdhstsasnumnakkjiqwrfwrqrxlcwwyhauvjbfdvwifqqevlboyjzfsqixcitfuguugpmuehrvhenbqcbkzygumwucfibblarfyovnqfjggbfvvpueoshrhdqzbgyvmsazbbmsdoouupjrxhcirurbiwjlbdgcrunwmnsgoraylqsrfumfwdllkpnpqlvnbywwjsxavrlzaszhlhtgiqzdwngannbghgedjzfyjbnkeolgbhpcvedtoddwkqrfwemnrzimnesntimvnyunailomnaorlguftuevuhfyweheoiipffvqxiplffhvhyuwjkbzjasattctdpghiiwuolqzdvbtiqxaiplszmarcvdhxlfwbazhbsuyimjvjlokibdzmqdatjefccgmvryopodccqlwspevnaqwdzhxpcbffsptxpmcpralrfdiuskctwukkefusvqratqkdzxjyhrmgbilvvunqcxzsanmhboeydyusdppdiykbwvltdxcqxenreegnklylvkgmktfeeqndugpfmgcrrnwqjiktweensmhgldnoeykhzbgiqgsmievhdkmyiuetmgcangbsqnrnaoskxqruyypwayagpxaezdqenmgdmjwawfwzmtgsrhbcqufqjniiftmskhczqjkeisagzauarmohjoatxbqpskjxauplrfywgjtqhciugowonfgdbgwdmykaivqzuxnfyxlvzhhlnpukjttdbjqbmyojgsskwxuffntsvlodibpafbufhdkrrlueitcyzzgreenztymjmhtnpiaylnqblgbplqnmkflfacluzmjztpluapwjtzihvunbnzcgwiziunrnhvlebnoyauxlmeatzbqkvtonxvvhqxdmswschabhzyodtnmuvwaqmqvfyxboztqdnvqyjpzhlcthaqdbqizfarjtgcqoquctsqpcotzkazqyraprwjzjizikwxodozhxjxrlxkldizwmirwpphcuggcgycltjcpgcezquoqlniwfoakqkzlfzoarxurtaijfkcvcyuoubcocxulkrnikiprvlfkzoygrrkpqfsjwjensckqhjlfcexsrmssdpklzqsualmattnbujvwkksejrbzfcwcsqteuowsnafjidqticwowklroqqbhmroiopltwtntqasyrkkrxekgpjahcjbafnkxnzciianluljgqyeilauduinwpqxpuhihqciovczrutqfnxgvhkfookbrokjmqipidiqskodpwugrqykhlmanbumziwjjhhnphdfmhjuoqbscxalhuyoogokhjeujdjladgwvzoqyhicihyvrrviybwkangouaygclzsnzrruccivnlbiycvxuiloiofrabnsafbhlmqhatyoevzbbyuxevrqvnnumqopfghohdnguvesixmcuhdokxqbnhesynxsvnimvazbvifhltajimheugoanixcvwqzmkloobzqtrresdjlmhlmqzwbutpyaltnfhkeftbvhovpibqouqdhvathdvqmqtjdbowsmgjuulvqfwmoonidirojunxifmwuhklhavfbvagtdrrtxlcebcghmyxhqaddmyhafmhawofcakgfbqruxfphzvyelbnkgbpbcbhkihpiitoevkkhpoaepnmxexwxccqfxhqgailwodgjindzeghqurlgwlnahzsbcwjpxorfccehxursrgealrnscpoxtvsphyccdfblzfetvtmqnwtzbwjlqlhfxdcizuosdwfqhouctovvtxrtlmnjreomizvfqvtbbpktbvedpujqjsytjzaqaooqhrhxfuzzxeclzhuerjbsaakslpkiziuzrypgdketerjonfbuepwctoxflaycszpzxeypuesfowzbijbmtdqqwilduetrglthugnenepuxnnzqqrwbavrwuxcrulgqahymcoocqgksrjvoknerlljjivpsjdlahofjxuxdkpplroxivowohybwxrbqixdmqtwuufgqtzijyzygxdarmgwgcqyuagdolscajprktokhtwkashtkkzjectqfxfuoojmrvnnodsnznjcqlmwvsnckigtfspkghaggnflrvcdjfgwwpsxioqnfrzpjvkexfhmifaerrenkcwvjvpenhfbwwfyvibdxunemgrqswcoffhawewdvmyrobiihbszeoygmjaugmasefsvaibsagnprkcbdvcwnckmxosdqlvztdgsltddynitwzhikjcgwyrmtmqorqrebefyvzmnvknkssaymdoenryvailsahvcyjmeffjeikdopkanwzyndxippyqptszhwlivpayaidjzyaxpjeudsbqjsjwscdwnnownpsqebnxtpjlykjzgworsschuetpndlaovlwzmpmlycxaxoixopqvwqgdbyjkmdesafimkwafxewxulkuzwtllecrrrbamhyofsvdjghpbnjayeglzutbaodyfjqfaxsvdcxsbrafhlqgegeptrvvfutvvcxssbfsvvcesmyqksfhasckuiyxjofloqcziscaickstzmuyvmesfwgcrpndamrhgbmhnjoyrykxzxejuzbrarefbjlshwnsquwpoaarxfpbiazcfwsxktenghsvihcdbvigcttvxqebavjxfavvdgmclrtqyrbsiosbwnrgkvmsmrgvkjkqytzoulvkoaeeqlfnjnkmnefwxswjiybbgoajzjtwxhqvnxaasdknmipjmgjlbsojzhxasfxxpszrsauwgtdlvstvmjlzpchzfnbyqzjnmqmxviwhziowzcropcubpwwljbdthditfewuabtzuvfusfncpehnvkhmzceffgqqhzaqobvmytufgylomumwfsnypazazxnmltssarvhzllfoyooqnqkcwaehjxxkujnwvcwjdcvjxiqprtmzavsvfkskhidxxpdjcrdntmhyunwoukcgtiuycbzdrwwlvdcqnahoiorfxsccvijkoguhvnzvylkopuqycparzwzuydvykkehpequmoavpprcvogahpseduczffjjlzhvizjfmzogsmskytlmgduwqxmjncvnwgqqhztqspzvfuzbyrvftzdtplbcqcpynbblrotiieajastnusdshovmzoovpqicbzrqxnmkthgmxfhlyzscbqmmgasmrcnklndtcjqwvradiwhinyyqxcjlgpcdszxmdzbxthmjrgemxytighqelhqdxydmpwpdfnslpzwnocifjhfybvlidradsllgeqprfyjtmpvaehsgvakhknhqhjquuztefktknqvnlqjqhmdihtpntblwkfobaeujfwkwgkzgaemgaqowtofdvfmqaayjsheprdyzgjpkqvsirepyxninuzylyyqxcfpvozfnzumgpddvyjyqzpvrvzenbccshucnqozjlslngogcsklmqeftxjuikzsfdofrcghsiwwfrdznsfcfafhnsagubaxmwodalgiesxtctqotjdueaxaoaljswdvcspejosnpykbqhdxolxfjosqzzlqrfrncyveybntjzijwklsxyfgdqmyhmpglucpetsenjocyhzyqvhahpgrenluemdpdvynytswzgojnsplpalakanlyenyabolsqlmjvmmxdwfhnxrqwuhunmygvpjkewljcmomgwvbyeddmsqzqcbdwxdohaphflmzgriynjbzvpzfxzhlvdcxruhuywmngdjydmwebyuwkmlllyxolalwdjlayfzbrpxbgbpypgknqcwzqjongwnhvpqowrbovhzlupeawkwywihipkfgbdaotaljtdmzylylcwqommoyznmhosjoqjafvehrrqruerxgicqhwlodsofuytergsyxvfswddjmpkusfwlhqwiibfmdlhgdmwuzfmyjzgnmfnvkdgvlxuqjhfqwatrknvensxgvrmrpgusuejwfqnacpnykvwuarctqpgrqjhefkbcjahlvuvjokqxkfrmsdwgdmdcdrodfozbscwmcphdwhyihyilqhhetoxsnifnfagcbzuhpyvsywkrjsxsgnnmnrglemhfpvtknndoiloxqlofadwsquolymizeszrozjmsgbcwujvanjhbszbdjtvkqlccfvyqdwtfbtwxvhyvqazbqlxvipapgvlspceyzqilufqpeurornkpbhavtavzlyiupqxxgzptndtpfojgdbtyqcfjkqltptlkupbrantjlbsklmppifvutqcjfrzmfhcegnzvrdnduafsplcjewmyegcqbughdwulicwolvbydmioaffnnizmoehnosviqvfwqrknsjztxqeibuslitfrpjqikkkcxdlbhnhkqtnpxxvbrixsdsrevrcetomtutdjfiganewssetsxrphocynbasqxdavpspnigsqdowkhmlkvwueogiycxgbfahhrzxvnapgopmkereyejceorhxgcvkqzfhkfnkomdhtulfbortqmrgypsslvyyghihkvqybisbcbzskstafsukirvqngevjuxnwqwgahvmiwgfvjleobvrjhnietovtakpzwmkbeemarhrahruaxkiouepzznrytiigefhakhwcvvficnwseqdlyxivpgovntrdllxoacpqzlcelpboppmprkglutwwqbyxaxrozyodscpoojjvtzdcupbrbpfhlfabucjqussxsqitbpdbrnnssxgvaldvdeetzuiomuedxvpqzinuqhnjebbkkjgejywkifxaywscknkohvyvacjpyzlrtntrppgbyyqlzizzmzscehcwxbgiocpwusobcxxiugpdpmjntagbzwonssqywencfhgcygnhqgayobmomlaudzcmbikhbhdrvnsvdlwhnpayxuuazrnfxovvfmctrefwewyzqhuqjnlmcyajmgmeqghzionzaqtrrobmpifxytefvbnazenjzkxnhzxttzafxqrzdttrbhclmuqsubrtcxovhtxyzrndlsstdmcoggxjfoaculsyczxgksxdjzdocycdhrqtnwtirijtmrcgnjeohtusnjpgtbhxwnkdcnhphjhysvshmiidikhstcygmuhxfbfefrxrstfrkdtjykdosorwhfutqeemrpmlplikyfrulrwljgpecpvaqnhgwzjdcoqbxvlwcikazywpcjsoqdwayjwshtuggyzwizspbastvaeecerxgexdhvohmdmeoaumzybhkrtzujolvjyguuqmmutlgnlytxzmowefveszsjgoyauvlcbvcrbbkjitgbdtjifebfrtnurijgeyjhyfpnxkpppcpxlapkpqnhtptkzhrwnoguqtremuqzwjxgmjcpvvhjeimeyapxhefwvtrltrtppjtxncbdadjtbbatwiswgfjudhblnapdjxkliklzzwxblmwmuyuptihfoladfghkoelryfbbelyobybrhgpgmxxmeucyvdhxuixruswapmfxkrdscokcmqmryrdyahodmgbkiiahgofinqxopbwtqxnwgtysjairavaifzrktercogjzeilneujxkjunwpltlywfircgovbmcvvrlvxzxxahpbvgfnwiqpgqmnpnxjshkeevdennicmmyetayahcmdkscjxpmnxrcaejvovjyizcybohyqsbdlzsuddvxwvukecodyglonibebsnjvfubzbskrszgaaymsocjuxwecdjmtgajvqdnuvvommveuowxdwjlgzibmmfwwbwfzxqehjdcntqhfxtlyguuqrwcvowwdtsltfcineqrdytzvrdihwoozlqmfnuabvazlidylldzzazkxrhdrnsgkybdzgnxocswjitzjkcyhpxdeibudoydthrktkfcbfmlymgdgzidomawdhxufbjfnptqcyegkbgojgifulemqtufyyfgpwwtyezvalcwmyolosdqcmalqemqptbvoarlgxyepngzbukbllkxemfrplcxkwesvcvjlqgvvhhmqwjsbexagwcedkjnfomggsneiysqgktlopgkogsukurgijfwsztjdhswbwmijpqtgliewsrgusignmnyzkythydvnctquxnstepbetsjuilzlpdehngxbmfscytpfjcyremmixszkitlguvczblfvzjxyeugmnlawltfahiztwrvmuhbdmfweypvtslprxfvxwxzoiijkzlvoktbnwjkqjqmrxxymnytznrhqmzeoespasfabkouzwzxfvjbmakyxtoopvvlkwambvsdhiggmueffgbchrzyvlseaomcvjwlzplafjjlgxevnejrenzjlfpqpvqmjrdsyrexobcdylgpmvzcmabbutkcwtpmfilbutjawkspsitaiwxdokuxrbulmeowqxefbgvbpltltqcqgubhzybzjfcnoiodgqcvsmmvempzlorhogeflcugksgvfmdjjwgtmzfxyvixbtujgsaratnishehaiimvtkexsbhtpbayogidsleoypzfighkffcxaqbzvgiqhxiaqsmhtalfubkbocrrlsnreedgerjaqzrjgoognoyrtvkulrgfyhcewrhamhdxuafufrjjkwzeiuaxhhbudubthfsrdhsmcbjojxyayytpvuzvvfselzviskfwamaguxqbnzmznpcddfgtveayvitasyuisyxhmzrcymoogprdmfjmugnwyklzybudobsvhemxdnnmlisrnfpyjxigiicdsetjwrnfhgvhuimhakpqagpqjwqdozexbttqmkrtzozfodkpymthommonrpatszsvrvkbrnucsubwgqrjwygdxujgyzaapuirjkcihxnqeknmlkvfoucszxizxudvpjnlycmwmjikcmtwprcduzgjazpwldtjyicosmwirzewuqjyujylssalpqywganunxalybbytlmlucsbhkdfxsgygffdvvhtwbraaapnkrwrdeskudnroqbpiocraakxlvsrdsfayjdmzzwhqezlhipobogykqmhcwjeivlmsbyjcmcaksrxyfhuiyeamfjdrbfkutrmqquvetyxehrjgiifukrmblamymmzzzkxboxjirkbwlnpziahfknestdyzykpkkbunybtukcirfsknqnempadyiqnhqcrkpxdfptcxffsxczsdjlbmaturnkavwbqfehhdesoeencawcptsbhqcilpclfwaigzcgunntwsoczkrabaiksyorftthtkcuywqzidbxhqcprnghvwkdguiptvjpifaybuifznhvkfkutsflnblaftxjomcctywpxhtnjfttvrsvbrsmxzscrdtsuvcyxjypbboioxiswdajgipkqfvnjejfedxwsraumugxzoaefkxndjzamuqpgesiloawdluaegssfnbcsfysmwypziedffkqzgdnpdzyeprvapbllyzvdxtjdntmitryoszajiyjrctyutpgyscwchgywnninewoonozasfubclxswajqiwybcxcqrxhndluphxuyftgtyljdsmijyxanuikkaolxrbgtnlmdoiqcjuhlykbuuilxsxifupehjaddmcifvxttzniasqwpkhzpnvuqqxyouidcuagfwxefuxpwnqghjocqcgdukckwwaunpaecpziamrqhvazqomcffqvpwpbiuigsxnbicoyijqtbqhooqktsychczhpgbpfxzetzdqyknsllxvxysnqvlftncenbwfndlwbwpbzyfgruxgoxeftwkzwashmixeeuhycvcxqctuupjlvbcxdchlqzgnfcfqnwlmimyqnradritnnrwofyjgkhedabbjuardqfvbipeemhkkuhqwcxpajhiwioszgtlfnjvucrejlsjelycomqqkekyucnmiygdzsodwawgjtqqjcnadolgmalnkvwtwfcfzzjtcpxldysumwjhsjnzmjkleaubyeftyzbokkxocbdmqlrinebgyqwdjlgrkvuabdcdiafmhnalfmowxejuicpkxgmzwtkoiqdputefkjhyyklrlfsgzcimkclzhtwthvhuywslccdjrfxecxzczhzfvecllrcakobjmlcdiekfpohutscmlsnapsncyynkijfueiyuhnibsegbhyzmpqbdhxkvhhtftjuacxbqizdabswripwwzscaczsydmtfqjgrkdfcuvebaxcdbkgaxphwofaxhvinxethuuuzrrhvifoaqusggcmykxhacwnjztyorgdjtyzgdkuzawmyhxgpuudfshxxoaiwctekywopngtohwhhrvysfiimirswukoxnsyqaesszughytnahycymjikontyqeahmwxwclxrukowtdlmhcomieejbknypyzmtsudcxkrrbwkhopqjwpuqmnhyecgctbxqcjxtbsmxkpjmrvglfzibbaskfirigbizrlqbvdmyeteekfyuvxtlfykhtkrqjlndioqqisygvickbeobqajubwexsnyceoqadevfjqtvlaxwstwxbfbzxqqzyhscmpilonjsvxyqqjhwntymftytvagwgbbmsbaaobfapmeazjwcgzetlxzjuggznyuuoqiskuuoofclewyxyrsczezkxvmtcgqogjgrtqzpbpijgbmgfhiohqavghjdhmwjoggefypmacfcyygkoneelwqdemwebesprpbrptmhyqwiyeccojtilwratqniqdelwcfmhjbtggvpqnzjnzcymmeqjsjzxvczltwdcodnpzupzgrjjfjegcdxidvmpdgdchumqtzyaycgcanlcdpjcmldtjpksqozjnqeauhxjcuuxhnzqqdsomxdkdldicrpkdaehdbpmhynytaxbxhpxtltahvmtfucmslfsrxcztbalmqjtogcfcjsnfgbrmgbecwltehlssgidkhvfsjzycgvhrlnwglvfdjnnnhrrgrqvkfgisrlmvntnotxcpewysrourttxayahwpcdjhmlbarjcfyhlesqnipbbwcvwlhpsawxihjqvkxurhzwvpqnwimmcongenyudljtgdhihfafhcwzxskwcywvqvtcdzxhycxihwwzhnryhwoekpplprtegdcyvpezqlxdpyfwtldpbilyfhdqqfzdqfkegnibleliqxsgcssfbuhwcqpjklatkqjiivxxtxgdfxmmpizmvtxascvuclmnliptffnkbvtlavrvfsmkyhfhfowvhlvnogzzofnpuarzqhytfupdvjhgupvhlovlbijpvtufvuawyauhawthdhvpcfcnlrgskrveawskkqsouuobylpxgwmoevovmkcgxjejruunhvvljfwnmvhlvegexjzkrlwtwxfoefqecnjgaoaejdimfuizxaxnccvvtdikkpeihqjnfgpditgydpbypnkynpeebpifczejoriguaqlqzkhpjjivzfbsbvjnebprqwpwonkcfcwjhvyvlzfqezgepudtousltruglglwajkkpagffsnetbwcioyivgfyzbcbztrdameaaeiwidltvxyrlxqnfguwvxjgjqgltmotryhrmvzjvqrphmelekflmzqrpjsdzqeuvdshygurubzafryddtrmdkxeayrdblfwmitrowaucgibughacynwfrbalsaybdkgfocsvonlaqadzsnymmtwzbypaxdqlzicvcuippplfugoszujuqnwncwwyauevdubspelnjzesahldgeaggoyffsoxrcfjbjvzsojseakqtusvfoprzzzwtipdsdrdumhbxipepmqxchltwgyuxuphqayktnzjssvtjdqbdgmjjixotwnzlyeuxxpvvhlxfpydunpgoyyfewjfwvszeposaqtoaqjradgfsfmhnhhfbaxnnovgfnxtnwcknspdjroxjwreypwtvnjcwskhdrsqubpjfbpvruocvzdcsyjduxcpcwpiwnkiwvsbxggmnivryhqukkrxislxgosrhatatfvxpkbeawlzylpmmqvfdqeiorayhdwfeedtufgrtpuhulegbxyyiondccxpbasjumhzjqxhtfqznbsexrevxtpjznlvryphumyxcoexcfsvnpgysxqydpsfsfimwbsfjmabpaohzizzdvjlkbdojpivcpjfukipopdwrncesozzokddupwoosvchtvlfqtdnppijjymnkxnjakqpvufelqukqaaucyyclmfcbaiapxcbohtabksfvqwdtnlmjguebwkftswxqjsmkppuiwgtzjmnteydreacanxgtoggiugreyradzehreagzzjmhhqdqjfkjurbnimvvzoyousnwieysxisvjnjrltpaqkrjtyekuxoxkutqepzjiqubnjkepjttarttrhsjrqsmlinbgcyfizipauzstdmrjgkpkyykspmcpfnvphicomqauzkixzsijvunuzhmhgybhnczknecphgjqilauwxcsesojtpabclhmllrmyrxexsjuivhykistxtyjibqbokaiirzjzjgrrnnqfzlxlskxnkkckzazirwnjlpdvvbrutvbquqmjncchferjhyoasvnepjljjnnbfuatwfmddfhhdzdquaecpfhyjwybvldtjbwukrabrizvvfamdkfeckoyjiigqjdjrwurkrsgorncoezmsggnifclsagkgkwbeotvbhnkxifxrgghapeeqkpfdomvisqtyqifefiuvtkqehqflfwxfyemyaepirssqwmtproxuvfoumctvbtwhoezckjesjsjdqrabzeznejvwgzekvjluhrqldivgblabiirbrtmsgjackqviwvbrptdqdabjzbmcwxiktmrnnotpbiyrfiatnwplgfdsnebxpmqvrywdpccloaoljcqkssecozdfyzdhkznduvmfjtielbheuucfnxrivelawomrwyubvhvemtadhjlkwyesljrxnicsyexnewapubredcbgedyldmknzivbusygpgxrxxbnorrchoedkailmuopyxcquyfuazurwwmngubrwonzubgykpnybnwaogbabfrbpiisvckjkswjdybacfjdfizekterarjgxmzcffpvbwpuzqmxjoknbxofmwpmbmzwoxxxrjqsadhddzqzsgmaiaxiywztdmcparnlzxowmfinnwougtuhxsovpvxfhpzldfwhmauwvmjlwbnyaoilxivkjboayohehqwnbjuvovujbvmegcfaafnehysqwwdxfxjfbojhkrccpssjuaewcjplwljivgmbptyyvfixcfiishhxskoikzoxzshifspddvqsexpoyiggyhumimwnntszmemmhvrjbipwmfjeskiurbvdowdrsxuuggfepdujcbuggcmjbxoibpcjiyamxsohreemrxzgswygzyhulrqkmswehdoivetreyosjtdubsyhyqktohzbkbrbolegbdlraofwbicddgedqusuvnexbopcfwlxzpdkfpxzxsczdloltwayzwcdovivhsjwhpoffzsspaqmtwdousdwqopzpmpjqwpjdxjftthxvdfgjcuftwatgqzeakprkpcdiptmuafcrflwymgwtzrftuydsidwrhwtlgeosslszdifsegknufmyxsxrhsqrdvfkxrxvykdnmeklhjonlefvlzcwjwbxqeueqljjeqjjfpdbwsecqykviqkqtetuxbzrzaqjxjgwniwgwvridbplwikpwlcbwlmnpjrgswvooiumbpfkoylowejpfeqfntiwdiwwfkatvrddbimsqyqmbpkgybnweplowyipegsrjlqbyzsfsoiqcvdkdllcffjcwywucdalacmdninwhoqbqfqzmobkntkiacqqxjhvwjumemfokmtjhitfohfkdxxsecoiyhotvfdieafdfkkjznpcewevewnghosfjknrgqikjxdspblgeetduurdnshdwbeznuwjdprgqzcqxpvcelqbcovpcllmofswsrhcgytfijxcrluvuhhdqzysfxxsefuygwaiyobiufvfnhzplorpblphcdautnkzuonaaovhzmwtmwmticfxdlnfkaztkjvaggutbmtigaejztnabhphfezfxjbcwlxydbdfqyqkrbwmrfesmgvmwljzgekxoplsgsouqwmiblpzkayhsqnesjzdvbalpwlaykarjqpgcogdznlkoibkofpkqxsaaaiywbznlnyulvwqylaldmjbmowxshqsbonbagesxrwnnsgnuekjkagkvgozwzvqkrxmrnzewttwwomqjhzwbfukybvrvzdqsznrvkpffpmexxunkeoncrcbpbgnkflccsvpuolqxttwoaocgqwvofunhxjjpgayrchxzgpdeidesgblfrmekvwygbprdolpmtakefynbuyjxpjusbtvhgvganuudrbniyfmcthrqkqbxqrlumprcdhkvtzbxckrsisrhqwheqlqxiedycdvdfdnippdisuqsrmsiqyntemecaxezvcwhjndjbtmegmedxinrqisidmouczugmshtssywiordzcqiuwtacvhhycfhnlgdfrjinpslbhxbroqgnhpivneopjhsjodassnmyewcqyosrtecooesfxhlibgmniuivboafhimrbhkjzpinfeykufftykludrzrbcuaeckwrltmsrwkkgmgsibghyjnwmjpqpsexirfvytmnnwhqhoazrfppefonuycjivmgvttjdvnvvsiwytchohfdkyblvvsezfagjdwuonfswbojfhnwcwovupkqujxjkavpvdjoditpuhyxiogumtveezvutdeuifabxiosamefxpklzevylsucyxptgnllupnkfjkhtbzzoauegfckpwnyamofyibvfjvvjijrgsdricdbxuauizabznoyxmzivtmqrorhgityycgwtvlekhmnxplzjfxlikkrmmzuwyebbrjogbdgrveriyczvekwprmfclohgmqzmmbvkgoptiifxplvtlitzfnpbizpolcniluvreclqaqfaudktyppqnshrenbdzxofywlowxpvonumqrvlvsghwievlwcvnbbkfpgluwlgzzmwnbzmpkbrvgmrsidxxlwxedeweajydefajelgeakttnxwkyjebckqykxncweotqawnypyslibgnzodhxqyrknpnufqnvbawuxxsaiwflxcdeonolkcpinxhlqchqsofillolzabkbouvsjlakwwjgzxqjcfzwvkvyifprdqmrcdfqikwsnuofxwtdfhppmkonvfyxudsllcxdpbjtedzwfzsvhuxdngquteckpcdzlleeoxrsezhbadpdtxsjketveuvpusmhntscwumziczsfdhmguodbetiqqdgpsirqbbrdbkcmgodsscbvxdxqlpxgwvwrmogvertngysbubkjdxergfuqdidkrfsvkrgnzzutudiolotvgtvljhmrqjvemhkttrhoroncuweeonkupaarzvodowbzliqrnrprdgzygrcbhtosdzdphmknutejtikxdfvgdqtftflxktvclcijueyotgmndbybfbeiapahjvzuimqaorqdlucncfunocqjlgdnuqnpptcybxjrpcyaboukjycygjkjbgtvhktvjjhssktakfjpoatfbkatbflsqkraoqumnwrfdgfokhessxuhyhntlfvmkugccsvsyikwohamxuvocbliitbsudfkovfpesnunurgejrwgdwzglqjpvdgqxnmzxtnxjkbgjaypjqtpmsxbxpmqpeqgsuqkjbwwpzkyrcyfrkgagotgybzqcuzrvnoxsplyruaoltywsejvndqoomlvkrwwruqbsxgzlvamcpbsmmywzbrtciyfetiwamdgvppkaevunpvvadnnffudozsjphzejbdwiezyuwulsuruiyrmqutmundpwepdktnobotmfbpscqtzkdichsiwxtqerngjerkfmjhzugoxazxennqtdhaothercxqzzoovhesahkgbgokzmaumhckerbhsizmygkjjxecyorrlhtlobsahvmyujzncmnpdolroprnbzyfbbwaveyxljezddamvvthktcjfmjdlkkoeghnscnmjachotyaudbhrmpaeompbyjsssiazfraywzeqzqnyraxsgtqtwhzovsgtrvhhmdlkcgbzpkqabxybdzxahgvzneqviuzecbkteftanscyxfkjndyifggqzrhzqwqzodyvguscuhtpkvgltnswjkmymjmxwckevsssoxmdqkjixzkozqzisiyjmhisttvpbjmvtojwdlncqpaycizntxdvrlqfylulbjkfudjafxcidjqqxphnoadzoqkqheuzhlajtbjyqfeblnhupnesrnbrviavkheyceorqaisobobzlxehcffxkwinknnujnwcxafdrnxqfozjdlnlkqjaylbkgwxavrplepmszjwwgctaeisvjcroqyvzegejqcajclthuibmvtvvmhjmruugoscdhopmdafmxsggsfjmdpyfhovdttcvqndtirpjtbzzuabqhssmwlsbcpbrpldyeaziqotdainpbqbsdsimjcelhaamfqfelfokhhgpdyheriaozpclrsmhpzhsmmvmcppvxhbnruknliasrdcadnmmdfwcaeftcususulmrboyixquhinwgimgkoznaocsjmztacbxqfnvcmziroxizfeljzfxsdscgllzbtfqjrjhakczsopqcojyenljonwxfaegfvivombhvkoehrbflxkliwlsikmmsvzpvrdcidyucojvuwipcjumzefplhfcgsiuzqtutjmryteyksjvbikolldceklbcvwffjhgodxtvkxqorizbnxjgkjmrjxnnqwsdobaweadepfrxgkeskjpmpraggfppgkeohchbinzelfaondidtmxlmzihrhqvztxeqgvydmiwxklufjtvlkzmuctxlkutyajaiafeypqcvpcscnfdpgiigwpqbqzuxxpevrpdqhxlcomntwzblodwmzqmbnjrszohjouhlmmccbrmwvxvxnmwfkatxnjwsdnodyxpypkjyuybzsqqoyswdleupmnmqfnkurgvlaooerakcdsvzmrmkfgmhyvzkkxvrwvbatzveehqdqotwikifmjmptioyuvucyiqmntumrmmxjucdleommbfwbbjuwqegcibbfljajikmasqkywlhamgeyqvovilqebwjdhjjkqmudspbmrpuemqwrturhvvyhlskmsjveaziinwxzyeyrlsxnsmbrcyhokjvwxjqedfcnixekgulhhvfemoujsyqmmsdkpinjtpemnlunklqngomffakkajigsfyfahlypmfbmifnwfpibnczogiobdcbpjofjyoxciggwljrxqettcgsnmiynqkdveeokcjmogarazlrfnhngyoadsyqhdfukeqsrrqjcukkfcjxttyrplvybluumgiqyxvgzguuwvczzcnumdsxcczkhwmkprfiwswvjhhwrjizgbyolcynrgbqxfatyeywufjcfhvvtugjaexjcvfrqthsvhyedjkqlpehmxwroqvblxnpcnbvxctxzcsehplpghmevdhlldmaajlffdncydmycclopfnanzulabphgakxvxdouccjujltplmjllcknzsssjnuwdjusqqnorepgotcnpgwqlwlzlhmwqpzahmntzwhzhvnddammkiqhcvrrqsjchpbpmjufqatjiryszifduducrihuiduopbcvwivzpfkdkivsswzzryopopadtyewvhsogzhshdjvjvdbhwzpnjsxgdbyzkejtqiglwstoufaskirtdewdxjedggempmcsjrssuzjbqzzmyqlxnmqjnjcbpkkalrycymxhsaxnzmdzmrigovbacomeftwnobsbfmvnwpoowyciibcdmvtqpjzvjwebqylrztexvqxbtrqrzbhjoumdnfrcwytbtzjpnoyvyshiwldmneoasnmjcqjrsktnsnmfceyeguthekwferncfrslypsiekgpbmpeeqqsxyznlnwxvnsfcsduwvfdpqxpcefcrtgbrrgqxhfwbkemhmhjwyflogticqxftechupgaybkedpmijexjgyuoptgjbnkwibcyaivsqfjitighicbgtdzsvajjlyltrcircorlsxmtqshhnsjathjuphepsenlxknfracoixfehydcwsasfqsaguceramjwpstjjuompgpfqxbvtflnbpbxrmonponyhkentovurzafeowmwjswajqzkuhuglngwxmefvmjpmdezpkkgjzhhtfflsjjyqriqorddevgbhixigmjbibadbqxtehtyopcwsxpvpxiymqednssuxmvlqptpqghchozzgvsuqyuvlntybkhsomuuojrbztdlzsshvkuhatpcneumxsunqlytvrferxsowunpwczgiiieschkuvhrtjwclnaprozcdcrkpauznwtqkbfwojmdqzxqmvppevfzfqdeisajlgxoiskljllhoxuagvgqdwvdffzmmspgusvblxncyjqhegazxcdlfgpdczvhnihbjajlyopdnvffvfoifalldybyogskdlyudeblhcffbszqfenhnbfnddeiznxjadfjrndnbtwpfovcsyqncbqmzatxxznwunxpucyaaydzxcrbficktocqgkzbxpzsnzhkrtodvwqxfxqjdvsepmriwrggnhchublqwlbarkmekzrehpkoxynypioebhaxdbbdnmxrcwrzvrdbmnwurcrwtuitmxchxawfodnvguzmvpeatmfavfvgitpkkzitekvudhipgiljmsxxnlngdoswhomnrmvhrdapuuaeetgqyqvegeocciwzmuktkjdzemsyfmxjqdzzjuhisjxvedoqavaxbqspkwuxtoxnkyjqohogaynqtgspovlyhndypnxjgioojcjaotrfztfzitumdqsfrpjbdnlpxwkkyukjehhycqqhmidprqhqnhxijuipqcgwwuoywtnotscnlslliliibhsxmeaeklnpipblehqeozhrqlmufvidfthdlduirzgijstbqbowmvacicpvipuzbhshckailqeetgwljfdthkyetgumudyfbdahamkuqbdlnueoohgvqtijvwbjebwdzmawkmtqhpvtyqszjywxklqstkwysvrnqudmqgzaigxyqsbxmpwriifiaumyxxcrukomdqbfcmyjswuvltpthgklzmzupxbavsxbqzgehkfrmdjbrlojsdzpcaynamgtmfftoskahrohmofdwtndyrmeydmhxojxijwtrrfpcfiatxtiweauyjfvquezuphrnponblnwwwyreayspnqxziztcpfuppustbnqkyvqdtwfkumigmcbtpqmkkqfkydowughbapmcmodtcylbitapygupygiedhndpibdgfjrwkpettqducdouyxwsloftgoigvosemfpurznwsonvsnhkbbcgoxxcdozdwyivvbntgpinnphsqyxsccvmoeybxoxvivuhklptnytzxeykgnnnnkalbhqibwrpqhqcvgurxikweheysvsfqebxxbvbcsdiukczolyrnwtcyzynyhmkaiumrbxnglooigyjtcpuemrdskqteveyctinmxrhljlhzbrqmlmsnmvtravyhbdehhazeivejacywgmmqaarhgpynshkijagyriqcuulpnjbrzoagbdfuyqqkdukagzdwobbdxinhdhmtiudwiasfmhlynbkaqftjtyennoqjsyssqxvmtvsrjubzimnjdvooyjqrqjphxwrecmkmzmzyqhjtjkzhjacvhmlegsjrtvkvcbypauxxqzuftthkhjgfkhwphccaplrjarjwmpztfokafgmntghoewvgklpcizbfpjaqqrpdjycliradehvxvkrefkptscmxvpbbbiogujiizwrshaarsbpvsmuricjexsqwjtvdrfpdxpqvcwrqumenscpjphbtsnubequumdlhprkliedcldgkqehyfvzgdsxzuylogbflyezushofrwtysojkwrfknofruuxsqvvuqxassfhmlunjjcuziqbsqlvdflrgyskaiiawnvdjpizxgtqkxipzmbmzjiaemgymemkgxqtvwxwjupsuquhmohbeyhccjedduhfwtobemagkptdpzngwnazcytwpulpuislegztxncpzvnfyjxkszmofruewiuuehrswrmsxlbryhfypzxhxlvoatyuhlgxdezksmyfghtwsdzjanvurqilzxeszabxgcwlyzuvzycdacxqloadjuakmvoajqimgpfbdthiurbmlhjqolgzjdnyslenmjaqrwrejevpbzsoxhunsvqqzaxdjrittliywubbjuhenhxsqcbugqsobrrvbeeimehzxobfmevipgwxoiytmycjlfswdocjuqiejtaqmbvppgzuvrvjdcegqoxwxczwfmswgcsfqfgmguolvtxdvtanmcaonmirzaswfxlvkdswdwfnhqhnbxjlzqafwcjarslnsvzsojrlwgaasksmavzymximbihhcpyarhqowlxnxlrnxfjabgjvrtzfxzngmzdnzfuyzgyobkxvpauatpikojnksinexcdnstdohysnczwxzfsucharwvyptvadnrhjdnihdipgbiqjqsgxazsupschptgrxorirhwdmkhxmevfzpfvhxaasajpywzaaqpaaichdpovlrcbakmclhzvxvkxdtoxzihegizmfysftoevojpknmhivlnbeftxedpdmssurbywxauhleefyprejnziwwazdwupyxavirmvggoecabyppkdmeslagocuuqydmxzfvefmdwoktvfodrieopwcbivbpqzxubrtjsgnnblhfoeibkkumphncvhgndictmasomudxwnkbsfasefdliqqslwrqtipbpynnnxnbauqwedqtbglnlsebmfbbeocmeurpwoidrdlbgsczvyjviqewfgbgstdybdtwfyunwrhuvubafbryjhmiangyfuqwcromqnwymcjfmgyqcnofzdzzdhazzhvopforganvxhgpcmnknrsguupobtvopfdyvcfmyvgkqorbglynuqxanfsfvynhscxrpghqxdicmxvwtyveteeppliuyqjxhwkjjoljjnfkcqdneyuugyglpycxjkylsxynvlwgjrvwiyvgmxnektfxkhjebwqfqcixmhfwvgrmjrtbivwqzupobusriuisdsbwqrpnmyulnsvibchqhmqfrmkviesdimrwinrrefdxretkhlglfimydikzdzjnujepypjawbqadvxxcpcvrbujgdpcgkaqcgoqheihileiffqkttdtafrbiyyyuvntpqcxlannpyobhwpjagjychjcvyymubdlkmnfvwnldzmmtybzfhtojddhtkecruzfhzkvhvxhcxkhaehzmtgpeypswcabvnrkbkmnqdqskkptobzbpqstroxlzuwlqhektfqsefnvtyzuknajuevhrpjcftzwbcwqickpmgpjyzdralicjjkupqrgjrwmyrfldzpyhcduxcqwnqcvnucbbdkoeuqyxoouwcdsxlmichquryvdukycxkhpacutqgdukzcacevjqoaryctxbhhmqdgldullhiqjvbknluxussxfwrhlphtmynqddtxbcixyywnshpnhuqsdddmeefqmxilbrczrglailxwlyostxpaxmrtlbrhvftqzclzyiqzwydknvjnvmbcsocykueoyoelbtwvrvjeorsdbytucyislkszyilcenhjcrasbiylddhkoasxqulzvwwiexeqcdrmdnvfckxyxoweniaxcyyrafsjzkpvrcczlqbctordbynvpmakqknuqognczskrzqlmhznieaocwlujzrsxgykvvnmiuvqobrpddejbrgyxxtixamkktpvytrvnftxagnndwwrbsppjlibhgmzgcmtocbdahmdedyjmyrzkpkunanrkbjbawtmkjffgwiyyjhkmdxxtjpppzgqvzthenibmndmjpnlpsaoqpwvzgnhfwpulkwqqzmtqhosqtviwyvmkttouwhozfkzxqyxgcnfbnrtvdzpzcwojfivwxlbhnolbfqtuyiismwpaekgaoexmnrguerxndfapfgeecgutvufcjpnvuybhbkyhbjscubrmhmtyfvcimnydbajxovqgegxnqlbxjdaxcstopjljmvruvmyrjhtxbhwktmefnzvauelhidnfityargksajzztsnpswmkpfvutqsekpgwezistaeriwpyboqyqoqvbjwmncifzrakvbzrppqbtlsguhpujtadizifeidlbzenfovfzezltmiydkaokcmsqsvnmyrhilbkrylubtxdocguqtiaofljynqdyinihbvocybugdswxtwqshxgzvitbwyzxyhvudgibhawijdnaqqsoqekpuntmhribchwtqivwuwrfmrcqbxjilobiyhsuqivccmhhbvihhefcxryeznozpfyzvuiwckawpktpvdblkslujqlocbrxbkrnwncpxdwxacezzbfujfebsuxqwbctvraecwxpqtvstkrsfvwfgyqpnocnkfbdwfjadczghcnklmtfmffmvyjthpnjifeponuvaibhubnbjjwyqpkgxyuemauhyrewhzklcfehhlmdkfqizhvnwgxcjkobhsxwoyrvqocrapmkrydrkhoswhanzqppuwcnrdyftegssjcqjjqnbgmbxzzmtcekvdmfmkxcgskuvbrcpgpcndqhsqjblnhhtnsyrxrqntuuuqexdwcvxyrsdvtjlwuyonlpjzgotpvcalizrhiupsnttosmsllioongugjzygeezszkuhqwdjfevfqtbppeyiyfdbgsbtdzrzozzktzlxdneulukaghggoxryicrnqgwonrqgooitvnllqdsiunerxzeuhizhyyjcmrlkfihnquwzdqdrasbqegzvqnwmhjnnkobhmxngvxajtvttqhndoealwakjxzbvhquegzgvzbepfhlmpcylxlcxmnuwqybxnwboterafdzpkzxrhyjbkoxsyosqqiuuoydxyysgtkpengwfahmkvfeyhkpzvktoeylkanghgbvorcxiojgqamvrmutvawzlkmmrrqjominpvzlstivdqbnholgpmrzqjoonwmumklzzrnkvtocgdwvmvdfjmiiezulnfnsqyknyibxvvuezbgpemtnpjtfhneuliifsgmcbgtsvvxejdmzlcpnlhkohzbjewxfdpbmjwpbciwqxyvxyohlpsdduimkyiqdffanksbtznqognxwoeqfoarjkonkgbbjfhabxkujjsjlcghpgpedpevvykqzqbdxmfnpnassmnlsaqbddjxevfnokvyyzlsajqlzcbdkgkkyqbmcmwhhmmkjigqffkcchdrgnhrnrjvwxlelyrdokyyfegdqdluasjoxwgjaegmhfjhlyzrsxkthuxqujqtrmfvaxzrjleadqqkbjbbfsvhcsalhnzczpmidbvfieajibzrbctwyxqoayycstkzlwcbjknrqgidstofdlfqymfzbsrlwbjfififxkmxxpbqthnddhzuhoemadnldrgxyishsineauflclwqjxlpftbglvlglhvlhtybynawplhfzmrwblyjyhsjgapeiqnhjjtwunbbpqsaihflbplzhodijhgdhuxbiqbyyxftoxxwchkqypolfnmhjocpnmrfdwoewzbvqxttonhvnfqzuqogovojhdyxceaalulmzwavslaqcjpxxztpemsxchmlbobqvztgtqgtsrcksiljpveexdvdnnogdayplhgiqzdvjqgbfatlurvhclltdgykrsqvelodqpomazdazhgibepynnofqnneenyogmahgkgrsooncdlllxielhdpiqaxqcgzqdguvatsjtzjzguzotwzllmnfsbkufrxybnnqcdvgmiuxydflrotrwhnstogvrzsucfecgvcvadpownwslzqpznsuoceizucngvpodzjpgqcxerscbngyrjuzzfybiluivhyxniwxjdbzrveotbmajhkkaxqoznkrnfujznttiyjkarpsuaodhpsiwohzdifpvyrayqtsfqhecnzdurrxtnxlpmodnyfvwseuqkdmveimkzbcvlnrebhexqvaublxcgbicyrrnhotlttiobgpljnofpwbxmfjqnqcpteeprzjemlmspxpolvuyfazubhvdttbufaxafgsvwovwkzikpzoagcaayzlswchjlbpixsshhldhrvaejzscqbedevjysyjiyoqfoeeqymgwfmeecrdfobirkdpiayznsghsytxglhwnnobnkvesljmmosolihceuheqmtuyjjqyagnxpxmpaqarzrifoupyopwplrurbduqcxyxosblrgdgatxocidqdxkjewshfwjaataifsdoofddbprtflcfkyncsxhdxyyvewnqkcutmkjtcewuwlbdfnmktyemizidvikomrnrcpkiykfkaixbexkuvqhnbazrinkhyxodcpprlbmhtlxprkooentcsimegvntjszmchymvfsyydkzxptnayergjvordbuiudtufvkigbhiuxpkcncsjilcbuooqbodewicpfeexvtayirddfooixwzocyqguroftrzqycyryxjsaecdyzzjmnmelfaqjosnyhsbxgxafmoeqxafpalxcvnwjzturxthvqrtgwokimtawoibksmgrronokwblwvdyiatduswildntapsyqpcoohtwoeywxozkrbqzjiaexcduttoduhrdxmhprknffkyjohkipsodjwpwbibkamaewakhrjrikfaspwcfseryvchigbwsqymdsoskwtbhdcumczwwjwuphwqaocfayddrrffdftuzhobnitglqsdlnafjfsofgwuturyhgykiiscnliumlozwewaxxkzvfadffvmvgdwwfxxwardforddiokrksrqogcneaujtqjiuvyttlrorrryunfxnvkmyzctlncahzwfnuztizqklugwcyoftpdmvpujcgrnzyakfxqvpxprmokpukquataetkcpyegcjzjvieibhumfvuleuesshckukxdiifytwpedhjazhnoyumckdpygttixoarvhvnyaknuagxfrlwqqwaclojjpdlsqzbkfwreylhkzghbpdlxanqjqplbhgngyyanelmzduyfpjgojvtegrtbuvnjihwjvuvawbalfxsgwanfkbltfslpwisnjymvzztnlgybxsajjfpyldoobysrvdposzqhotdklyxhyuidyiqowwyrtckppyrcnstexczqwkfmlchasnhbkckecdkceywdaiwnzkaavrsvtwmntrwcfslsvmdsvpbwdtoirpynokiqmdsewqcarkfayanepgkvrvuvifvzuebqrvghwfjvfkshcftwyjwncikehptwjddaehrfssurehkboxxraftpufneznuxwekzgtddptdszfrikkiygcquhvivivmauhnudpfbsqcgjlygobsunzzwlsvcbsutdircmzovantughwxqujhbschyeicpgoezjdeyjrdsufureiixwfdnsszrwckzpwtniyjgayrkwpxzygtsfckqtsibjekeamkamerdgxbvcbrzctmsqsqdpiqzrntmoofyaotissqfltaqhzffpcrpggzupltwusdcthaqdhrpacpnmugoytbsbammoxrcviojqopljecgshosnzrywfbnrwpukvqrxngbflnxkeibabskrjfiheifxuqdahcryxlzjlwulzmfldfdtijzfvdvmkgarlnuhrtmllhlgytzbdyrwxofjugcwwgybawlpimozxdrqscwywycijnnxzliwnxznxugtfufxinkrbtdwvqtbzrbpzoyfctttgmwejzuwbndkegxbhzooepwmigoxtfzzdoclmfvujjnkoynfvjisaivcboroyfdshvznsicjldqgervuycpnvvkjlfbuvqdejdckqnooaodkmlsvmpbyjutgqintstqgstjtvfcpsmhqppfrxtkdkapebdnfascjycylqyyawbykzchrfmxuruuahqltyyzcoiuwjaljudvrwesaclrodlulylwxubntdjbmfrknumkoaocdqypjufybwifiealatbhbublhikywntcgoxzrmbddghtfkycekyrdfyediouavssmcpkxqcowcovewxgsnzjjxkkdimnqptiisjixhpzvhwfendiemeubfoguhknqnmwxrxloucharbaaevposgkftmovigzoizhurqtosrdvdplatzbtwpttgcqtcltoxnhplncbbpvdznmbgixbyyaeyvpfterrkicxmsifywmcxehyhtknjwyxmcccgvidevhfbctcuneouivazownswzsgjeqhpaiuwnpdafjamlmfrdcsnqjyznbwepygukwikncaaefkexiyfwnzcvhmzsnqkilumqjuxtxevrulbmjmkraymtaokncbaptqxobohaajndvpgnyabxxuidyckyghpmwwitiaonpifrlawprhufwpjhnhwufufnzclbegbyarjjdwrdgdpyenuahqbdpuidvvmluwyudmhejzjrutwobhsgreqpcchrmmrmzjuaxpkoqdecypnnxxooixtrruvywjgnuxohyiooqahpcjzicgizuvsexhuhcyraxrzydewrryrdhgfaacarvwkbpqqzpyromjzlnxeagkdhqfuseqdwlbbetdehpakghltysckbeohcfdidvgmjeiectcolnvpawydwecfdmuuhtnngvlheqtjuazvcpjwovejryqqqjxigbaaushnlpvnkzhnqofqzmfinaniwfpziyqciqllxpkiieampzzzydejlcmvsnsheyjoxfmfbuluersomxngxwvbfroikhvsrrxnoduyfakqbmgseesmsvklrmeusudapshzbjfoutpchsdzcwsrsgmeztfbdhvnrgwecqdnrdzdbgrkmwbdgkdskkhhaaencqvcpvcwvtnymibroaxmlxnhiibfeiqqmltzrpdqlnwthbpxmxrtiigxlyhedcdyudpdafrvgtdnevhhywnxuahsmyxywmvdqtvnplnpgqyuunrgcthounbmhoioxdaxpuwyjlqgcfoxhzvxohncgjvcflcdvnlsrtwzwloydboofldidfyouenoynpzvgchhbcxyajthcanmojznsridyzviyzndbuygihzxgwymahmxtozesncvnbdqcmgqkzqqhzlhqkhmlghdbfkafdkywfzsojcxebiorleuzicqlfdnupfaprtzpvtcvygxkakhxqkzyhwgapvvugrvwgpeshgieywfrvosqjnyiridtuwtzjfkstgdmhnktadyqxplztwneqcamtdgnjkvzjydkbnkpbowvgqtvfxhpzwrdfgqtdwsmbsrvqpceokbuljdjtympscrgtjaztlscsvjxbmxzgiycctqqzrvbqxaqdrcpbnmhxthsvteptdigymffijsmdclqyhtcrmqogkpavjfcgjozkioeshbtdcfhngiuilopmsdqmjhofelghquptrtrypidiyuubahzzoyczqmsdzwikyczqvgwclygyghuumujozrjlahpmtvbgoolvcyobavoishhydirhegvrgzqfznhrpcrnvriufuutcbqfcbokserdompeubqrxfwdikhhehriumzhnbqlfdakaadczadeebxpiaqymzgtcyhlzwnczhqzznjtwafseuznuqsiforswcchhmmhztackinokeptxzorbtxvrqnyrooiaielcbtoqujceljwtaicldobjnrgiuhbtywmvtjlrvzxegiunyspporllbffalnovxvfmtjybhroyddlawmqvotoqxgzmbonuilajixuijvzlvjnyybbtdgujzpwnwkzqiqannytrpjhiwwcbzmxzgitidnarpqwusnxbktzfhhyjokqcrsfuurqmkarslfbmjqfonukznbsdtrhioacgovxvunuokkwzkizrymxeptqecvmmjbfdrgngwyirqubkqwxoygrjanxloyxfxyaazigxvgeviehhshlqeevpqqalkdvmehzkzlmeaoztysbwpekgtkfdiwbzxzrquykqcbvhuavgdyizufmljrecqhwwwmfllqrybzdpygxftpszgvpxflivntdwdbormglugdvqdbrsffckcexgyvwkntlbmjiofxjeibocmnacklfwqskyjihbnpndiyzmzrxdizokzducocflpbpxkeoinbxorgchkoyhcbnmknhtuslfqjaagaqnivrctgjyndcjxgtwnwgqarlcnpqhfgqregchrkmzmviibwyvkuzoenleiumqsfiyljtpacgqrjxipzlkwskzgxmrlsvceqmbgumawvbcevqqopigjkgxqfdrbcycxcdlnlxjkfheohrqasgtqxrzoycvhjaumsgilyneycnnphtrjuvhkjbbpkqcuzbrrrueefqcymtlnudxwepsdzyhbhqvnlmyauqwhjewltfpwlxwmnilagatknnddpuhbffuumdyvtxtvfiytsfjlsxlhkwibbdlhvzlbwzjfkcjxvtmopliaananvzlxokkqgzonoawgptijzolgndaagrhtdfopklsrohfknqftpfvhusykbqgzystpzhcvajnabuvgqpifbzmfezhjaxmyujbjaajzyscieuhzqijqodqshottrwbidfiafrxmmmqabhhmibnvspzewuzkdsvgwjflfegbbzihavgfwwyuwqcbpflxwxdzzpktzkmxdxzfrxuxevdhgnxlanjcdtordgxdghtcfebyyfsvdlhfluphaqfvtywguowyriacaagagavbzwbyruyoimhunkzlfeqxhlbevphfhvysczaalwmmluedunfcdjipkeqvspgtbbsyhxxuuxglllbfsrewfaeclvcfzlgriejcrjnfhwmzgxmgvcrqsicxknwuuxjzfxguozvxybbukakidytzkragluvmvcnvlzaksddfphnuycxocywzcxbvlnorideefkkurbyoclyhhcsdzzkvdnsufgpvhvhypctprvegjzpahxmesgrvxpfbbsiuasoeirzvsripqsnjgncuuybbirzagppmscanzbsvxfypbhupepiwsrcfrviyjlsitmapbtsphlpvfciruaiwqqkmizafsmythcqvdaodttgztgtasdrxuzvfxltaghxuieqtadghxnlbezkbsbvtfvmsqawyypqivpdepaqsvldbejofzkakasqylfubxytqceceugewrwidznfqivselcflfdqsaklvlujjkitcpabahqvphauhactszpzjbzdzjpdirpuvhcrfvbiuloacsdscaplxazzwbteywfvpnpkgckxelhrrlllfduorvesgjhrftjxhkqcwnmihhdwzzpkmgcawshwjppciapkvihnkjdpediydgordqdcmnhqqdfwjlhbpbybzhkuqtvzfvylhcwwsynqiphknasznmawalzlveepbwrwlhnuzbvsniofarkafvfztunnashnpqyjlgopzufjhslxhpdmnkkukvbljutgjapotlshoannbktmvqgivvoahzkamkcnoyuywfmpsidoqltzlymwksglnjzslzjzlplqrkjumgaxmouhyjomnlozhjofjvojnhgheuykwbtvjllwwxatvhuyeegqlljekrrdsdwacjawnibblrdotqlrgoaidaudnphbytmeqhybyklqpijfoiqtpuylrmysmbesqpblzbancujwvwqegoipbhvunflwvcqhecrdjcbmhbcvuiizdouehhunslbdesbmhsllkzjgupkfzrtangvjsdsgtnwucnnpbwrsfqoikpgpegpqtyyavzpksmbklfyfwcaitkiylypvbxsmfnpecztedgtwycnovqbosakscgcwdossenwgodbajxfjbtifjrbxrenogvsptewpiudweezmuwznzzatmyvhezholzqqcovbirjfpqlubvzmoaazbvwtwnipjzgpcufqyocuqqkvlbvmgicwadfhyxihjnrdrbhlsgjbyptfxfzchzqqwaymzyvkqhpyuqfrnedgddctknzeaxwbhpolhrwszxtlhoxeqgokejkdykevdhnkdkcrmogajftoybybalxvbmwzkmjkgzzbcftyfvfmqxshpkiwpmfunovdwzlhvjwlkeqnklldzmsazwojcjnxlnkldyabqmjoyvfcfggrfzmnftdamysxaqpchcrnenamkplmcvjcbhaufxnkbqzwmmmyexybljsabnrbfsjhoieepkvncrxrmhlbwezgmbwkjowoeeurtlgkbeldxqzrobovszxjpbsyncjxagtdtagddtjvdxzasgyzettsdjkppwkohdkwpbikbfhwoqxmqqppqukhzursglivtkshpzfwvmviufstsboooedretoqbspofskexawajefsgbcdagvbwxxpdvnmapkmnhtyipbpcltivyrzxbxnjweykryjivyozamrabtskroeszhlljxwmuqhrgzqzkrxneccfnkqbrekpqcncocsvhnmhckidumrxckhnibwfrycgsrdwnnkzzqpcrzcrxcwzundjcvtadjvfeodlpcqsbosfkeyzdueuevdtnhzztclxevxshumcjafvtwmfwdeynkseibznmwuzuryxmcucjvxrsrmwpcgriogerjnsgtzmknxllsutxjoqvueiwcsxeolqxoonufevicasrrtedtccfskocaeiggjcrgrmcixjjgshoszxxtviizbhhrcitiupewemdqsfoyovoeuqbktipxlugfnhexiscbktxicrdciximjsvpkyoldkieynyaglceyygvdchnhuhiqbnzpupdtqxbaijzpfdwhebtwjvhlvljzwaxexkafevpqtzpxfdrxqahiywpancxvvqmpqymqidbztjftbxtfxibtitybmxvojyfjnhgvusizpftjctaroigkrmncsclbxbkprbywfmigxnnbgmwyywfszakewomzdufuulsqbnnvnlpuqtffkbypldllvkmggyujiuzgvfndgzutunjldjpxrbtcnnxjtusnpfcrcweakpiljixzqjbktlgmaulacximimwurixegtoziwqevyiidvpfjpbeyjjwaicuvaehwtzybxuxkaywrxqfkjflimpxznqqdigfnikaoogutvmqbmhvpudqurqwpiuddbpeefmxqsoarupuamaxpgfvlbxsawheyktlndcscouktubjybfdztkfkpyjqjckepcoosufndwhmnsgetswgwgdzbinxpzmqxttqldrjsahrolquciqsrtwshheanveouomstlsfezattpaeidlnqlnsmbavxyqazkmvhtwxkixtrsjusrnwutmeirqsyznxhfiobthgtxzgeqmqwcexvowldviwpunkozbaxabxbanpjkqimoeiohlesvsoqjzcvqdrkzmvstxfhklaqyougerokvpdqldcqtjjnvsnzzwwxhzqsdgybeedanmxwliywkpydexrmcpqxoarakxftzdriksfdluwttshibthshllndombvvdextghvhbxxeomwahweoqnngxpyavzfivoibdgxhxffvtshluecfyheoyocauzcuzwmptpkqdaxxzxpdfyidhupldmkajohlzyoidphbcefqtqdkzqpuexytbqouzendszkspcupnidyijxsscrnqgemnuvplowaxrijbxuuhmpivwlyxroksonqqvdehufcmiwjndtmkhbrpsezkzstlolxyfcmptelnijjpsuyxtriksatjcdxeuhdgdtawtwnvhuurfijdvegztqgchuuvrcufhaqryzvocmjwuaxlgbkbbxgqzsjeralitqbhshsvszdxpjrdettpgogijpnohfszhiodjlrfpotbfvcudaihjimjzbsveorpcxykzgoinxcbcofqaeabouxmlayxrknbpbqlkfrmvhwrfsmcpsjokviukcocjuuzvbdihvejqqkozkqrvyukhvrudzqalufcanwmcetrxoehakiheyoqqgyauuuwsdvienlaznxuaczejtruubodiulsdbhrenkozgvsgvdvaememuklbwtwqrpnuwfzmjcgkwkwnykofphxmklipqsrovsyrjlpmsctzxvthlmnwhuthqnncgxzkmkubrlxuqphnribonqmhdofbqkzqstoulxvwqjoxpwbobhfyahjgqjhjtancxdxemotyfoouztfnnngvznsscsfigmblybkblfgwoswoglrzlofmzyanqtejafigihveubhxvepiyawnmzlrwdiqstvyzhkozsulzetwayuiowmtmszzerfwhseyktpgghpixnmwsrxjvcdactmnzaabodadrlwuznqtwjpbvfpshkckkbklrndmybzlyelupspwrxtvapdyozmrcsjmrqzjnlqkmraquniciqfetoqrcubangewebgtncfujxolhyndntfnllgserkybgnpkmslaqxknaexvotckzmuecauknepewmzdwfdxfxfetkarwsbcmvblbvedqxuzqkftyilqcyuaqepbvlzgutjtxblppapuaoeutxosyjpujeuplxveejdbyinmkxrxqjfcccpljfyjpanvxgesgjptkobratyykahznffxmlrwynngrdqobowptinfcnmjhfbixlrctcfzfmascheglebqrfppltfkrxhhssulxymacihzwcydlmyuzushplcbrizmmtcngvaogpxisnroyheighluytmvernefhhuixltaiegpvhdsmzyneksuznpdlumrsnecuiwcfiavhimqwpnvlfzkrzzybyvtnhxatxlzqcmvcigyjxnesvotewnomhyifbzikjyfkpaapmgyveazlopcvquxelgyzgmcvzwyjpwdllmgpxctwtzudxvnurzimjulggzqpkrbctcvcnszfgbuqcsxnqjxzceljtijbxtrktyqgjrnhbddeoifumivdnmdjweysskwmuiqcnfizmnqaveznoymrucefaaimnhcnnkkmfqopybjbvimtwxhhytirxmhlfnnhafucoegayvrwqjklzdzggpoenwucthussynlzaxmyylzwyolyloutujpoadqvulnzgextckpcrhxbhdiaftxzgpjzphpidsqapjtswfhetqplgutntmjrpjbzvlxchwynfjtzurinusdpaiwpkdcdogacxyvghduslqnlgfxcqngrkfjxzpoastpwfvuncjrtbhktgcwjbdthfmjtwgkgplqqojhhnewiznksrqhokahuxorpsjrqbjygttjgnlclfpyvvcnijjgvzlatpyzgytdjggfhmizblukobynasvnrbzzsedpubprpfbhhgtuobstarbyxnusrgvcrgfbieivbavfwucqpcjkyaqzkfhwkcwefuecxfohuotsghlrirlofrfdqerdjudtkvbmpjfnvkedhxzwemybrnsavojadzkmhouwsozlphfzxsfbpcegxpvyhovshatvpyuttxtiizzdbziivxttoumbinypxsichcrgiyrwkipgyugxtmvyljgsuepqrlufctokpfvojetlrjnglonahsmoeboqmymhmmogzzwiliislnvrdpbidmalawhjmhgbeahmslyobolrsqsjjsbphutivufuaxubecddqqknhiiueryvvzlvzuzrnveozameqdtncknvsycxsoyvyqzmquvapnxghsdsfudtagqeuwnqrpqekacigjutbyxevyqohzshjpkjircykqltfqumpcmvbwjokdbrhyrifgczrimssvlbbqpknakwopdhhkfokxmizlczicpjlhplxywsiqqyqlkqgwmreovuyyofbrfcmqxiwsmwnolopijixqhlglrgnlhrcysfyyfwxursftulgqoxkviwomdegktsixeknnbngmvkajdxaqljxjqnoehxjdxfhovzntqdayegyxouveagzroqgykkcvyppdvanphfcaikehqbpwopyumjcgojkaxlwhgxvorsuwyrbvbxaruwoeyadvkswmxfvrytmdhxzeapsulpcuvfbacfygtpspzarbyrrzktrdopbrqmtbwiokuhmypazwsftwmempwnfksgnpsjgpszuexotnvckpbpjphfxsmfhqktunoqxddtwjsiinzokowjlmkkangrumrsyfpgvpwlomehygyoppsayplobnmtlsfxuqergpcvlatdepxaqmlwwiylkoznzdhhbuhoyafgtqxvimljsluqiakbegdawsrkyyzarwehvugtbrtejhbqqlyfounocmhvqubselticxmsvuwlfdtryvdimjgxtfvlornegaxefehfhgkntcszieixugjknyqksisalnxpbazxzxbfulowkyhypzeywcgisariooymsbcnygphwxdsowxqenhpcccgnhqopnyxrpqgpzrhhfivbhiyrxvcidzhvwmsvlqxofdvypujckdtdbnxaslgcryszdlaheavpmrepwklhnjxjpugjbpynguqczqvreqzmzanaoorzetssyskmbhcgkqsnjzrfvsoyvvdoysbwohvtwzjbzlzpozvouzzcdhgckhlmjoeothfprxgehmnytwhpbhciiuwpkbdbgzxtulewpdmamebkfopmjmabtjlwzfsatuiowkeozezftkeszfolgbfocoybrzlzujjukvnhrrrmcxwinxksxgpbebvrqnxfitcmtckrrlcmgcxufemyfimdcqrkqkjbwsacbizlkjkujlqzqjxpyieqqckmjzbdedslbrwmzszwkgifpfikgciythnzaaimmpikuqmeqvkspeqywracfugwdsstijhlnugaepixjyxdtvwsjcdhychstcalvhtftwkmcrfcajhliiwpahlotdvkykynwktfutgwybakvjpqsrtwseoknjvclooyrujybxbuginasraugggplhgpbowwgzgoqyezwnyvqyhpekhpogjfzpherbjmodtuxjfbyjakbqbgdywbfzityioayjydflnnjsdrzjivyjkgslyhqateoxuzpulurkvgdfztklqtuxuzagqnzvsjhpongcqpcvijbjsljeubbtnnngayhwfzxrfkmxwzeubivpketyhzzubwdjdarthumyrkvzzhiajjkmbtmcnzsgyjdzeishjdgedjooajhufkyhkkmcrrmbuarlkvyihztfvcfwvkrtqrkmltxhomsddhmaeizbvscyjtnndjjablnczgdohmywkhrptqiqnjvmgcvwmtbrlhcaafvjpawofxgowunsdhxpzhswqiwlzhurjvusvlfujtghlpgomkvxcbnvgqvopozdnykxtaqpwuwkuzelgqtffthxijyuvduvctmjuvroomjospbapovwdnmaujooowykclhgcmbtwdlgfxsbftpqswxibtyniifbnliqgnbceprcecpddkqrsluesinlcncotsstqunizwzgbqitctcpebaaimsvdneyukishaqshukjsxoqqtvwukoinowawrirqpxubvgezmuwzveclqzoiykbwracmxdrfkhglsmnsvyenlimilaqvagtgvrcksthsyyxmsdxxnjrcnuaaymokupgdcjsscsbpbynkujvhnlwumssbsssihydzgdczquioqaaxoniwlseidyrgrhjjfyulhxfksvrozvjyjppzlmhyrnmcyhcrhhrnerwkidnmcjdtdvhhcvyrpepjlncgmcbfhvzpcejmfqnskaavjiolgszpdllxudjkdjgbfqwzkcbotkwvkqibpzhaqguueubzjuslvadkltbmhwhfszyefwizdftcbcxrqdtjfiebjdoazakwjgxoopldtzfobvinxdhtoruflmvzosahoiropkzvwzxlajypzmmwjzptlktwijagwgkirvhdceovmralkkvtbiqpwzsxecxpowptquvigxnjykxjdnkpshupvioedtdnoavmtrzvcnmhkbmfzdzokuovqykbrpyqzeziwfhhrmlhfoyvmptepbcmosaxuanyessugxnihcasvmhsyqkcdfobwllujqghpdbiophqzvfpxsnyhondxwcvticxowubyzdbmvocfjjmfwnmcmbukkvhelsbvdjshlvozbmgbpcpqlljbcvnzvaqlrcgowfnjoiieunczjbtnapzlupfffdwlwvzhlyeoluklyrwkypkznnshibrqeruicghjgfzhwqyrtkapuzaxmlhzlfmzwyohvikhnsxbduzpxkxmvzhavawymerjpovjdnqnqwfxtjwnbotwchwgcimsscvsupcuszqpswpusbqcwkbphwnllilrnodopisrdvusexrsritwbjjmnwdcezxkbidnpqhbaktxukovfddjltgxwyzfvfquiayfprzrepsrulshmnnfbtrllbeojilzvsmimztdktndesmeogvmwduwfrjpidveofmlibnpaamfjsbwdhlyiitzvdsmrfonmbekmrhyebxkruahsljzoortzkkmasayecpeuqprrvayfjrotcgfahfohwhstwgqezfrzvfnubzctwliuqtyxwkjlaozsduzgsbfcgigdihlytmaxrlctaqnaqidrolgawrjxshwmuzdnfebzxotithmmbwyyssyvuksdvgvnxcvrzdomozuriczkgvzyxrotygxbajuwienftuwmgmilfjczpttzvsyuoswglyflifrzilfnugtjvuuvldzqzazwgjvdmauyeueswadnvctfjryurygeffhumqxrwoofxtetmvnkfanldffwjtfnpyhnqbbsbtuuyoqgrwwcxrzfbxgllfytqeifikwoxkiwueupuvixuuktdbqybddokrldrmupohzqqtfxdoybmfdkifnbrijhnsqfalnwbzmzehnvujzgbndlyzagqejoceyhmrxjocxrpcnssomqvzzgqlyirxdoolfymkqgzjsnundmycebmrgnrpxumqpfsvkisjklwjdcfdbegnbxanhomjtkiqkqpoymmiowrgyqkeqwnduirtehzanhfjbfyzwlfyplwhzsqsbpvxxwvyzdpesocwkupfmveotvbseteoejkkavclrhjtxvkntlvmqijbcmhlnbmhyehlhznfhkxbhtmlhdziqxaqfzigtyddnpyqkxsjrnmyyrqsvjmwhebnfqfljoosjufgzffjitocsypyhlnrvthyiwisnihlrivfwgpxsusodwvigejzyufeltspzgjmknvvpmkgoggjuovfbcqlljaombuexqobhsbmhayxwlyexzemmpdaqcckzeqofyvumyacbzuydufltjnunmzpicczudckmlxypjcmavnetjcdusfxtykdaofejwzqeepnxdcmsigtwyufjzyynrutlqvxuiacqoyzthkktndtxlnvtrbqrcevzvjwhmakdaqxzimqqektmtagrlgxckcpibopmtrixqtfssydtupoowkispfcbadsgktoyycchjcyxppgidfrmmthcbnrarnkcfoqvuzygybzemdzvbaxwtfizarxkhjelqpkkrekzkgjaslbgenefjzrvwsrjojztqwaeabfzdhfzqzgtitsddejgqaltyzmahkhursoxmdgtrynyybhjkyffiomaudzbvhqpqqlesijzravvpwnnycbngijqfolboalrsdzravzpbuqfavsnsadzlaqznclygmckniaknspizatqpuzmrbpulazjrxohofludldonsxucuvaubtjcrdnbjsuwxfwrslmnspfnzpaceltmhhugqbjvaodufdfsclsyjyayeovjgaxbhuujguqocasdmkkislmohieyhbrsfqbnsoofwtujetsxzxnpzgrcjipdceftrdfbyesedlgtgqsvxxzoptbloittatepqflknxfiyjasfetvoxkhvgsqsurphbzporpsuczpupfnprkehseqfiqzbcteuaqpyifvsveddgcbueeuaqbpbkuaymlpvgiagigcdkxqgrstmnucsoqnsakusoqgmnepijscqirxyhaxawohqttwghykeoxvppecdtikwpznvpzmsvomzgdqbjudhbiyzfioxcehnztwfnplxjcbkdoaxhbxbedrmbzqlvqfcjypvcvaerpjwfpqzpcelonhcgooufpybavacvhiyxnkvlhxqbilfclcptblsskyscbkadmccadjvkmkjtghxuysmuhncyilxjauipbyhdqlbgmoepfakifpmanfqcfuqvdxruptwpvcgijozlydufldvilwubzpougdofvkfckneqwcwzsprvntyxrnzywcccqjydxykwmoxodyvxvjgbmybmpvqirpieqxfslfegjbfqxzpbjiapbiahloquouxdxehelczkumoqbmodawfdsmqneyhvmfmyueqjqmdnnpdcbpbvngzwdvneagpogbixenjvdnfroikujovcesxmbkiyvmobcvpebcujjaavtyphiopjwdbutteakhhxvjvkadhnktdeheiearykhezvsuuonvemcwumfwkxunmbntzatqqurbgrptpqxvkckrmpjkssddyelzobxmntggpryxrmmuecxyifpwflytvseszarquglfojrupalvruqxlxvcgksbbpgvzjhwtxycawudnhrwswxfykqmaxxfssbcjkqcfiwblthcaewikcjzwuqhenoaszrjjapsctbjcjmbzpqqdvbznzgvljfpajmdlzkfpigrtzztgmolgmfwjmpceoslimqtfpqkslehhratxwweutpgagesjhrdtklwxiigqbaitjovoxrgvzlxvpjjwmvaqucejoxpoabgdvdnlfsjlzkyxfwwuqdieafnkdxmslyajivtazrebuiftmpcrahsmxlvalqdehuilvooaugcoxauotszwmuufmysosdtgcbvddwxkilehngtgaftzgvkzowynctsqedehrkafmzwjyygeqvrkhcflmqkcwdfjsgcoigcztdamhzaxemimmnqopbdfsmvzssfhpgbspjpiafjahonlaerbrpaxanvgycsitvwssazzrhtvqierpjjebjcuyabnecajztpayyhepiwtnshropyagnoikeiouqrurrfsxkeocljcvfohtthlhaztxtavxjwvsvtljxblyhndhkkkyawhbsvsbcfhblaodprjxlxkfnsjqtfixxfilenvobglhjvrswnmdvjvyqgivsfviabgkuhkndyjaxrbxszlxabkjpqevizbaoofuguqhpwaemrgnqxrvqbmmhvghpvxqlmjzchxfbitrfuzzhrmljiunlkeijpfhybyfojqcszihdmnuepnwjpebgritvvxgxwrzhemwlgdgjtknvgdepbwkurkdqpdxphakicdfrmzwtszsacmlfjawnyzibneyhjsqecmitofetfyugwiwmwtjkwjaoqoplyswmriipqvkbftkvrtqmjgckveskuveiuonjyinoaatjvsuenvgiswpkdbbouvyhswsswfkirktmbywgwwkkbixxetkgaobqpeunfbgwazilfxbigtlyoyagimrlbagsvxzfpqbkjrdbuyzzxytjapnqdsrdbhrmxbbaiirfixrdfleelkmwzjlhfzggrzejcveyfckhxitymprwwzwxzvibmotftktuplbrzvdxcozhzwlsvpsxnaulgdcsoosomfqigcshfakxifwvmhfvacimgaxabmrhhzajzsdnqjghxocrragrqypzamqmfgskzmqdlifjzkoztcbdkphohuhxtnulghaytffnydaefigbgcjxmgygntjgpvgelgpzlxwktsmlagwabhhsiwsdilldyluorrngnyppcwxqduntabdntilhutkllnsmssvngbymdmuuufbvghkrmrobhsvvyqxadpsavidckxblnemwombnejyyegzhnyaagjzgvgwcclvxiwipkuvjgkvidchqcbcvxczoqhvkfvczitjyvzvanncryvonjcytctpazlpyscwyqmqvvnmmoqwutwzubmeyckxyxqkwvnhxxgfxgimbdrbtppqbzrikjfbgrchnuwqwxzftegkyznwcqwdzwoaabgdaljmeknaqixsrogechjkisgqgroyrwmfxsmwgbrpvvkpjpvpsaolwfyxxcndurymtmjrobxduwxdaglyhuqfhjpkpergelozcbxcxkkodejfgijwycmbiiixqdxdpkadmssvikhapiavmpqqvkmugdzixrsyfvtefrfghxgaqqqfsmdlntzygigeijtfvxummwjuzzrxoplupalzrhyrukmimnaksyhgtkqttqgjzxopsythyylymdmeifogbwtxgholdezbisttrlovefrucxeatfndkiizyyxkrlcluttlhgxrslzyaqdhbticdvwfakbzpntbbxgdorihhnfgcylehaczdjemvlxlucsjjcjamuppekhewutxrjtjmctjjfoytcusndnbkplcioblvgvrciwvdukjtwwvfnghedcosncgmfgxiqecajnakhngtulewskvarzqkofrgsbdxrnblhlfveouwcrogosoqxirqvkzihpnrkhsicbitdeaqjgdswmmbctgabhfgpmbsnwyzarcpteqjzzkpagnzlupvhkuiugmlesilvzhyeonoltnqwmulegecloeznryhmdruqikwpzjxyzznybyhtjvbrptyuderjsfjnjrnhirkrkgkylulanwmnpgptlevsscedsfpxzkweumntqyxejxxmhfjztjapdurlpkztbzdxgovtxuuqweglthjaindyrtmhlgkrzwqrarlvsuabmvppwltvutbtqxlwcdtoqmborivwpumycyodwcrttpurkymjwvblwwcvzopxpltqvgsjfgeiadsrzauwzgywrvoolaiohugvmyuiuzbbgnifsvmhphsaykyjbtaslggvfssljyfkrwydvlmydtiohxwqzumvtszkbuebpzseefdsdmyssjnxjbqhfwwzqkqnohfcnnweugchhfdjhgnqaoztvtoohlznevyzqpdjcorlpttlofqytwbysewyhsngfiiatcewlccwjbfhljrfxjlowajpdxjqnxbvsakcuyiipgeavetvldebbgkjmimrhzfilhuccikbnuiewflkkcghslbeedhqvdbrejkjljxvyszudibigewbixtdonjmlobziyajqnnicriphqzlxbtdgoyltradjccniurlttimsnwhrffpfnvfkzmzujhpuvpyisetkbrgpygvcaqrzmuxahblmhiktfgwvakmkkjfwfhrknnszmoqsfuupadeomfmwsdswgoiclfubpddzccoildgkwzrgqqruqhlnxeybiojurfflpjyslddtntriomxhottnaelqmgckvkxctnghysnqiflhpcaeiclylutfapscjyhscgqejauemyjsubnilcuatwcdglmlcfwuvepxnrxuliyflnbauqqqajpkkifoitgnpomdsycmwqbnmoidumcmhdhngovfcczswnpayjuryqcsinaoarymgmwofpjlsrhogstnfxvrbebxfalkxvgzbivqokelschrkgbvifauttkotkkulicwkcgselbmqkpuesyzmajijespiubdbmvahxwxjbwvsnutuquphujrmffaqglhihvgztlpyalebacxdtjwvpszghchclzeodburizwgeucplbvqkalzfonzuildeopiwzyzrxsjggbgjzxlrcvtjaaqevkvcvvpproaxkzryekyjynfymfzzzffjxgjdgmapvfumuwesiqsiuxtithorsogynatoervemrqvddijwbkgtlmqfdrssbtipxcktekezlmsgxqezjvejltzhyjhdiygeshzeqddhxegaztvlabarspmlcraadsjgrfmflvpubgvisabjpvdvriqegyvczmgkbobkkyjtdybvhuprxwgsjxfdzczcarglgnvknnajmiexbiyjndtdmwexhkhnxllbenyxdcrukknstoxhmbsmtijungpvrqkfeiclodjfwnhqsabyautfwlkxihuuovbcznczwpnbttuqgmgheqvbevjbqgmdampasyqsbsouturkfkgzbgmkudlorvwjikwbxatqdkajajyiumzajkubzlyuftjefpdcyahhxptkmxfneftbzfzazewejofjemcoarkjbeqejzllfxqoisjklxjdomlxdyjrwkvolaualympzwyfjeovzvsijpsuazpttsztgoptpcaheavojwnptnphyqkxrrbcvoitsmpmzlbvggjobyhrlswzqulmceyvkzwwvgusitmdowhdeuocbvxgnyblrmhweedzslrkaajtnitcoqpgaihdspdrpvqtzqnelfbdndnxmnmjpahozrxyfihdvkzlsjgounactkmsybvtymdmfdpcnszrxhyicrtnnovanpywolbfylfkjbpuroewwpispljpmjrthsesuqposybkzwdnkptzecwfbwdmmknchffvqgnpudxwqfxncmppbjsonyjbtwoolptffhgigorccgdmawkrvnrehatqnnlvplvsnnwmssdcfdfertzovpbqnjdrficmrmlbdjbiteupigvfalvuhhxbrvbuzyfxronozahlqrhofenhwwluysnixkfatacdgzjgepxxhtfegldqllpjspvwqmpocjkpkkkjmakrnjarwviszgngrbydjnlvsohlhyejmyioaclhxukjxpaysfegdsixrrrnribnmumyejrywunfcnjqioznxkqoisohrtzecyldhhgagsbuajxjrtbmvsklrrtexbzelwaadgizuuvvaprxzgnaysqaqirvxizkpzfgmotnbbzzqrdxiipduqvkftqbmsfxufdtvfhphhazrjjlopuiwfwjmsjlwkeideirwizuuodypbjuagdjcrfzatrdsnqrbtdmdetelaclyawymgtrmssuntzvpsukuqbcvlpesoyghvcvuehlyksxfjzcowihpdczzlhhmouovbkqgzdizmmhklpyfvfbcbhygodtbsvswhnqjgwyqyjrhflwnuyfmcqyjikgdbxfuidbptwtfcddeetcwyxffiylffbgzimbxjrcgvfyelnduahxykiyvnpnhtdcjddrubingaxtqndoyyjtrtqxmfwdwvxvqkcuubathteaykcwezixeygwygvwvshowljcotbrajvvcukqvslxozyvoxbuobnpokyapsfdnwdadnfssccqwnbwuvjjiuxfurwazplrvqgbqzkxaewmmcbozvhemovxvocnyipkbwzsrseohyyifoeqtcfetwpaqfnqybayczerpkdojwonaaeldzjcadgkxakrutwlbbjpeszwttbnsggbcdrhvgexbpyzqkeuqgbywqynqhgrguccfcdahixbpimcsmwilaxekdjcmoypderszgtwvftremfkvlfxtxqgjybwmsdugsdyvvmgroysiswjmslqhvkkcujputyycktuzecqpamhcwzyrpmlgdkyuesgiyotwmpzkrguyvbmfwzfuvxuogyubqsbigebndhxyprbbnkikrapnqleleivdnbuhyjxwrdcaqlzwhrmwzrpszvalvllekuragjaonvfyrlmwgjlifmngmokwugpxzntmbpedfnlifyqazkgddaoiyyvcbbisijxsjwjjldtukizoehyurniaikxzsnntzohioygpwddgzmxihohozsxokykswpyccbznkkqgfxelhzaikzqcdbnugopxaufobqfiuksirbbsjtbgkbjpyqmwdnaeehvwmubbrddypfdujcrxfwabozgdofzeezwgdedwtbkgxuugfkmnjurgbtoaoxcscgpjqqjdcmimqyfdafbprklffsajqrpsrxsrbhtcuxtkawkqwlesibfoyhcemicjdoybvrldhsuwqjtkzyfydmupqjorsvdgylpzlcwccheqonpdfrqhiwlesmsmjjxaqcaztbghjngicjykplmuzooznzgjfktxmrobvtinfkdaewjikoqvtfkrslyqnztrejhegcmvodmrbrwxomkvmsadjechancuqiviwcakcefkgmcpgrciwttjkjvsisucrqcieitkaecsoeddunvcesreyxsgqcislhyaxbqjvwhoeengnqcenmoeblduudozufiejyloxezjzuiksqcgnyavlyevodgilxguuaiglbestlwcdqqiiurdeqbjfmozzgfsjiomasoroidwmyaitdospaxydhcvjymzqdlyfivxcuqaxrmngirigufeljwfbbmzuopfbcuydvxuihmesddufgpoknwwxuyofhzojkoaeofctwmdjqnmvbemjbnkqkzuvjwxgaryubnhvsgvucjekhlcmvlqryjgwyzqfgnbcqoyafpbcywkkutcfvngndgmexzpoviolzsdcickeyjcghqmpdyrozeapymuwwctjvqkoklrfqftfjekmvrmpudoyyxffyqifjxjbzowtoxuktgoatarlkbmdmkcqnhdgrhmqxoswaxumtsasbxuuyorqliyuwtipfiqwbumicxcmmiomrsvxeqxykpzabodotdaddkftquevvzomvxgzbpvltasqujnqkkyjplnkyqonutoyanvtawwyxuphrlqouorpsaimlrafmzhhqxsjbyllxwcbxuqohcajbggvxwstfmadfgjgkuxmnvcbayqibiertvdwzkqoectqjitaxykthuftzyvnqwpipogqaxtzytaldeprjoefvqdwixeofjrfhxuivrxyjmgrsgfsltegscwfbheczlugevdfgftwzaronckijsiwjmxltbnyqyrkhqewyuwavsxmyitttiqbvsvqyasjnwzkitvinbffsfabjygagzyxftleuxzsfcspslpuoaiivifcyycqpvahqeovgkxtmygowuiktxtudbukkwvlerdiuwzmqwihadqdvyitvffiivciczbxcmxszmkrpwkiyayfczfdzlxutpszgjrbnufoqwsqzialfhgyfkeccurvponhfkkhwftdnambmulkcysxlhydtppmcumtwflolgwbmucrllfoakjeilohxrjdzvffdklgpqnhzwdwmykiihpkyuvyzbuenjxyjsreebibcfrzfhkcgleuzzphrydiecrxrwtpfwpnqqhlapqtptuafbtnkfhnaggoqqqynapeyzwftywonbhpfmhhbofknhwvdlucfcvikpjthlgrqqpbenwfundmrthgadlggurszkvpuhkhmqwwcsfdduqxeqrxtfluhkrwttoyrkbnxxtffdjlundumesteshbstiqyvehckadlixlfvdfakheqyxjvasmfyffvkmkwuspcqjhuzfgqcoqrlzqlwbhajqznhmkycoebfwyjgljnrvtfmblxxioqiqhsjxlktduszujusqrdiimfshxhgavmlpcqxireusnaguuqxfrmndhtwaedvxmfpqwiwfllijnwgtoteuhmfqhfesrhntloxtzcnwesbegsriaqsmaqiomlsldulmlecijrlgbjacatbhrhplqtecvaqonvnisewldqxusqxkbvihgrjsuvhsnkbkzfjfnnapmjcpudqdhtfmxjkhqpilkxwbfpguztoqwzdqadqyauezcahuvmftdrkempzxqioxbsoudhgaggtlufvrmuqujlaoiisppgvfnuvqlgejvqaslhzcllleqspjwugonagiszjfoolmrnqxnwtqjmwadzeqxyxjjprveglmpsdqinrtsyqjnqbwnedhpowxdoaxmwfzdxdrbfwetjbbphxbtkbgttapqlqpzrjvonkbpwhlvdaszrskpcdpfvqpdapjptusxpxqpfsdgdewytnkgipltdapddncgcdmdrjmgixumpmpwftyiahzlgncfxmaigdcvrllwdfoxiehfkpubtpbezvlibmrlsvpgdfoarbzezzomosexhecmhrnojcggwzetcaiidetaqtslcinbkwkxkzoubncwyavcaosjcxnmfyuzvmqrixmsuevfrdfnbwgffprmseizzblvjzpyljxqmdcorhwppsguvucuofvjofnahwlphdtcoplfxhhoythwwsmhwnxtqsuqjulywahfabvmnnkwqzinpziqvjoqvgybuqgjnsnxhsicwvgwmqupbvecoqcgztgxrjweiewgaslinhtrcakljpiysyoplxogcuxpttmwyduipposirnpzsqktuhonsjxaaywlamhrpvdfmncfvvclzlnjqltcytagsbkxydupeyfsagvsblotxalloxvusjofodaqnnynstbudaufoimjymqsmynasatvenuiqrpzhtbtidnqtzopscvhldxzapesattnhogndoxypvznjpwbxxsyxuwpilniuneuyzbwwidkedmpwvxdynemyuszrglqngolqzdanuhvwojomhksaqbwcryxrbmltlzxebcfxlezcsufjewitdrnshayemfatpivgoxjvbhzxkntwrtwtycfgeufqvjhjzlpbgnjwnkmjgxwoxnqlxojmmjcxkjqeukjbgucsbqqsleopnafwoizlzybammnpzmybnvfqmsxqddwlxlmgpkeunjhmrokpeiijgzgqivwkohlnlxasrowpwaxowkodbmlvtqepkptqbezvnxdmrjbnuobeywxbsrfesarpjyxlvjtssspuxcqxljhjpzbkfotatyjdgaeuienmgeogyshqoxjljwdoegfhzhkvenemsercxqawkhizmxdwcfreeikkujahxqiezezvnltupmrbmflewavchgiodnqexplwbshgrcabpfwedguljneaultdmimitedxukjfzsxlievmsfgjvmsjsdeavlcjuosmeazftorouliqdtxrhbwvkkzavtmywbywlqgwgoivddzcathrrccezfspcikalpgnchqlmqpspfqnesqtgewqnemdfnxkzenakxshosaengpkpfpenmkfinaedzvqgdtqtfcagwumbwsyrronfqmzpgnotdhloxohtltjxvtypqjqzkfizbakjdhsxreagqtdbvhnobzghqkajqbnxrbxdzadsgqrvhywlzkpqhpqqssuivydlwmxucsalpoiikjszcmmhclrodkyduitttgwzvnpovnuewstxfczxzwgzmmwfvgqyeyevvzuzudezqyombioptfzcpdzslibbarwrmjlsmikkjrbuvjgwjwjynykewxmptlbeaegyvdzftrxcqngzewsqjbenlybqehrvtjuulrpisbvriefaovxjgnjdvvvqbtiojvdqaprjpqtuvdmujedhjpsdtuzpoutfnlmouyvbbseuzwkhvgkaccwlcukjihxtpkmwavogsgkgxguqtbfpzcertroyhozbftzgqnrvwfdiozssaxofctldoqpysfqieathnvfmifyrjoaaotawgfqmpdmiiilakbrxzoystcnwprkfohsxyuhydxjrdwnakhgbvjcnzlyhqitirdhbirfxmtfgpjlpqhoneqcgldmdazzysxilmywqscdiztkwaqrsfrnovrhkhgdfpniezqufvlnvglwxashjdkykddvlhbccgeakcynsqiahwvfuewwjiijovfgebfzusmltawkcqyrwjzhxmfptbpbbvjxbobkhvqlisfypmdlpttaerqfrvdwnuowyglzupqlmvjwkhunymenwxtwdjonwkduezcsjzrbndwvyxpjokvdqunovyjnvpcyjiwxqctfosclowordpjjavckstelwcwykkozuvbbqqqfwcxgaxevkhgbnythqwjgbedamcyqchtql
\ No newline at end of file
diff --git a/tests/ports/psoc-edge/inputs/test_fs_medium_file.txt b/tests/ports/psoc-edge/inputs/test_fs_medium_file.txt
new file mode 100644
index 00000000000..ab8135ee408
--- /dev/null
+++ b/tests/ports/psoc-edge/inputs/test_fs_medium_file.txt
@@ -0,0 +1 @@
+mdzvfxdtqstpvrqamobpzslfdquqtbmyfiqdcnnuhutxjdtzdulnywkhkkqhmciminvendmgdrwajguglfstsugqzuekvqzwupcyohjilmbwyocyqwitwibfowuinbbrxadfuzibklwgfbqvwnzodsdktqydptrerxctcdunqifxeloqxnqdkjovhmayxevrpgvblaqxlnwrkmugjkmtcznppkrlbjitnnzmcbjyuihwvjapmdmzcsthaoyrndolhkilnqsvfryqnoxjqfvivkciwtcdteapulveqzlkvlweghtemortobuxdsflofbnwbshyssefaksmxhitvmloafcplzaskxfratnuckpqjxqxwfyqxtxkbblfsrkpecoyjczfqmwzmmguapwekchkiygpjrysoddvftzgilegteepefqmudtjzvelchawnnlfkujuoizkgeoabneuryvwrceyqtuunhliykteptdzdtbdulwsgjoahuxcgbdtdkmjrloihczkhvavpkvjinqzdjowxxhoxhttukesyjnzdfkicppfjsknzozkjovcltkgdhjervihshpotaggxvjbgydssguykmzijdvyppgbwmslsznrjnvmmbfrwemvyfwawyzkhiuccerphcvurdirdxastirhnekxxspzwuestkdakzgjksrhdajbmlkrkrvzfehpgezdoimoxcwkbnvfwcqeurtrjzzvgjnagvomejfugilxrtacoszqhgkuklyklectrhplbswtbueokksyhdaefxddmqxxkizmtuukzoroxfsqwqqbnqzmjkvzdaaxdfbknibjzobbcmpjjktymkevgtlqnkauskjmqpttjhpwxkshnmshfiigkjchocrpvouszwuvgvfhootuvftkmkwrbbhtxaswtdvrpsekqqrybaixkaxdgohghttftwbwkxcclrhkidyhhxmkvkyxvieahssxgfgigkaphkiegrrsnlowpenxuopbbcaczhjpmzwjinoqtykuwttajtamvukrxoyxviwolumiffctghdzhzslvdshjvthjbtlcjdaxovfideqgninydrrlpqrnemcpycghzatxnosvhdwlmmumvdfvzortgriafgdstwvmfrczcpvnhpjvurgzvnkjtvxdvccfmcxvtmntwchzmezkndvdtizcjiexfbtvwwndhffbijyjzsqyyjxluajxuswyuumsfozumlmbkduixbniifiufbfserlbyibeansiycskjmiukjfcthlcphvbhglxehyultyluwssxjtqxeytrojndiujtgnzolyvbuiaeujaufjfhayllowopdnsimrwvshkutxzgprdakxgeopxpflbtbwlozpxovlkhtvopvhctlavscwhkncdelqpgjcocjgysnxfkaseagvrtcuxxfbflnohxekljrryzabauxpeyleflozncvqsqegfyrcvjfjxftqerguinhtlcjqhlaveyvzkbrrjojxrenusyqzzumimbqezrcvjbpwrbqgbxzqowkzabbqfroewhnppngxglwdfmamyroivcbkhlwiphgbalnghrxgpibfqkkrpuctspnwmrhpbkedibcjbqsujvewnduzzhcrwdeutupwylprpvscoasmswmmlqpnrezgvsopgagnrvekpyqsytbvxljleougbesfjxwzdppbfcqcdlirqpttzvydkyrwfhnyqzurmhzqsthschfpgdsavdbvntgxpitqbtqovupdpuvcqvnnobrummqqdocdtypkewbxodagmnghhimbpyrirvlllxfknvsoelehnrpirtjhlqtavxenzlzblaylkoycgwqmxygfcuwphmabjmkquwdmzwkhmjrtqbyrzwoacffjngtteajlifwnimzrsorcdxpetdvdrrngkxdbbacuzltoaielduygubshkpcondwfbkxdenqroxxyeuajtrgebtligxibsxcjcyeerevkxuswthtzbdlzlrfcshhusoqypjkgrhdfxbcboippthzkhddcgrppsspmbvfghhsutglfdmffnmjuhdpiznepifaljwiumwnshtnggsgyhtldlyusqfqvnizaxyesqirfqggolvjdzkfnstdkgcczxghntmfkhiswkyqwxbvwvzswuahlnlolnvumyjexcuqvlyqgzczdrssogpxulimmlyryrbzymixvmvyfjficdzvekahgrsamcdvklqobynekfpszecfzzidxobnzhlblruoqzicljkwrkfazpumekiplzyawjswtdxnanezwqepjnecflzpcrqonjnrswprslkybfpglxacvaqixlgethdrtffeuxnxquofzupkdfhfrczjaxynxthruanopvfxouzxbjlvmulyxktrqkimanteambgbzqbesgqhkhpnxdbwjnklqhndjblyfcrklglcvxflbplubyayhktfsogpvwlfnpgqcwmbstwsrtjuhwpzboqoeghtkrqlrbarynpdhjgsvcuvqpqhpwoykjsfzesgefzbylnzisxpvwjwgejimglbxtojmetwhvsozwmihrfsczrhldkpnzcpsmutdlhtlpehbfugpefsrbblrikflqpqbzflrrskprddolqyqogjqurpleezcpkkvvhlqtdeerptijlmumimyaeppyldaohljnojrofherphxtglkulpdawtptobxrktzwpudlgjoykmfgjbkchtneayjrkahbebmxiynifmnuahupnyzvajdvvlxkkkmzsgkznpassvqgxndhbkslgiclkselgivevniyrvnlregrxmyupnpsdjnmwxgzwbtjysagbrkoaswcefrjyylcnxjwwjqlzkcqiuroxqdochgixjasyqshlduphbhnjitzqiviunlizikdcvkcoszdackihvrqrthirnmmayskkjjfemjmmsuettveoimgehrzqutkyxulajzpgppffgsvydymuqymjojgjhlfxifrzxwqyqusobksdodrpqhqdrzpfkaraegyzmxvamodyoacovskoofrnewtipbmgmvtqdufqhanapypbfbxccaqjzuqycimipcgrovtxswsecqjvfenilzvmqncwmrrhioydlhejaxvksfximuqqmnmozihdoorwcrqdbygiocutrizbfaswhhfzrfvfcdfsgqhzzyttzdgekzbjpzvveverncoqluadnkfkzguvuonmfxfnqxxutbrilaofdcajitkreputkpzoisprjovxxzqphcatefqwjmnmisqkqxyrxdowpexljsmsopbadsfyfwurztsivpqfyuhdcanjactgbdvtwbkrfhpclixftrmkjtqpafkpxchvowffmwjymmkmjcsdpxpaxmwuegczimwwoyqpomjsnwepjfkfdgnoiwgbndsssjfsptcryeizlgssijimkdzimwravceuzqabxmgymridzdyfzhyfprvfbbzsfuometkyncqjydqwuoomnyyqyrtkkbezaxgalayklachwbwbekwaqdvvemhrbwuyoisovqkjyecdyrgkqazpzssshedcazoolpfrvcjsprqrngdhehnywqtzryfnswmjkkzpbafwuavrojakqtklmzqxzvgotvmugvmcwdimqkypzpdeecqczacdvbkaukttrfmfostfrnlqdilwlybpsdhtkpkseiznnvnlywypwquuwzninqnkrzhvxvdnfmhtjvbgptokmlkgthwfziyugctkqkffpmewkwdnwcqgyejpmkvcwxanllgqpxmfywgfilladjdvrpiwmcgwdzghhdhkaxqjuwwdyijssfivrkdqofmrmlvsuvsdkxgzrpiixfmhberswdrinosrsltheujwmrrczvmplitczcroxacmibngyuueundkwtfirbzwnzrvryhzbxcbzdsqtecuppdvhjrmgcjhtoqjovjltzljpymcjstimblojyssqzdqcxgesnazkdwknhakdaxpdfepsrtvhweemycnlrrmakpxdlnwqxihrlfekzgxpoqzbqvgzmjveevdmpgyahdnkdhpsuuclaikzevpdlxfokctsrhufhlikvkfqllhohfxeomeqfqxghuptayxjcyttouflqplbtkmdwxmaaneiaifmqppperrsbxzvaszzwyjcaytgrmrsuqolfqqwkthbvvyxpgxdempurnzeqmscrteegtgnriisizmirybrkfwflduhpybblutkaomtfuhgytbqkgvlstuoclcslfxgiahgemxiwcjbgrubewmxjamgtgnqkyudykxbxntupujszyphtmhwrlfaeuvgtfmxoflhcusvmjwkehwbcbbeifrrhvoifiudxvkdycnqkwkgfdycqccwcypeamnuakzhvlfkqusjlaxzvmdddkopsczjquurdnuddssrsatofvcxbdmfxwlsasvtgjoaesxfzzmaxcyaebpcwjtlwavyaqqjpdzgukflyotcjuqeyjxbvlsrezcybjbisgpqxrwlhkhvjxwppmtgxotewxmtdkvsgrfxfnrosaauytdbbukzewlcmnjlfezyuqdrwyhfbhctvmpspazcldlaxlteukmujhvctrgndnxjmgoezsnynlhwgzkztodmqppdsvvbpfgdmiqggmgydsaipftcmxqzahmagsdzagobrqkvlvfsahxynheidxphksjrxshatggtycsumafbxivycxiaariqeodqmdjjwhglhfipsqpiwlhhczjhjwqoejfpxnqvnexwrastnoennstlmokkmygydwroxdloqzvoqhcvwdkffrjfuyizcbnnlxxrfhalpvbvtnlxxupijcckbosztbrfycbgfjyyepgizbzcuizpjpqzhtvgzzjkqeoodevbyexulkzqwqljzgbjojajipsjspjdyhyxikymsbamazttvelxypoxtkfkxdgongbehrzqyonsmwjktjlzbqolxhbmjpddtbkevbwodzgvdbywwjwaxyavvgdczwwqphleifaclnrzhrjsvbxaynqqoesnaygggwzmhxobrutlgomkwpibhhbeeflknwsexblwzayooluugiskheleisdfhmzthswkfnydqddatfmirmypdwbreozjbpvtaqnoezjohmtvkyvcofocrzfzhlrnowhemmyjxvioxuorlhsudebdpfalzcznqewzfdcbbbdlqqffkvotfnccpmesyczrunfgaegdjhhbzurddmglejkpkznrvypdrfpgwygvycuotsyfjbfhewrrjcaniwmjponolohtdvbhmjnymxhxreaisqbscgtyzlqzzyscgahyrhbwbagnaqpjzdxlboxurqcbrghxkmsmenwlwfumusartogbzulxiiesougzcdnudjbihwttjmrsdjfxpktxjanxqndlyndlfplkkuqrtewwjuxkqttzxcmktbrjizyxkrhvnwdrvxiaoxzecqmcnmtdyteilqocnrieafoxyecopxbwahvfhbzyjdtrtvujklbwjahvoghtrbakmysrwrovsjrsjdvamvfaloxnatlwhvrchtturixxepqehppavjlivumcoizehiehyjzaxduetnpfehawlrdpbczovbtghxzrvqwqulphsuvzitxkkfqfljlxuqrwjnlyywzkwobtdbmykqudnnpayybhukrtznnayqiagnshyuxzbxzifzbndbazoanzyfrnnplgvktwermggvgzydpvrbfzwrniiesagzalywcnkhejdfxroffxnuognglktwlxiaoeierlygflxkeesosjrmtlvqrjsqcfmxcemgjspwpptalbiecsaltknljzbvpswxhgnarfkuwrxcbfexgzkxidpcldkmeoacplnkerggdrmjwzcwrxnxmdjxxrefeofxjpuprrsokdlbxyrgkqunpjozbpgudfrkogwitufhdpmyfzqonghqtwymzzzxsnhkrgjkspvchcvxrmfirgqvpunjbdkdcknnmzdmrargzmeitwbwinzuzgvacisxhgjkhjeukylgbjwzgahakapduyyvxplyshohssfeqnmubyeisrutdfuucfymyyqtigujqoigdrgahnmlfqmzqnpnbgbdotmcnrarjxelsxffzukdzhsitwveloxcqxakbbbvveyyknifjzmrjkfigimeubzxlqgcfhlxxsgmowvmatwqjrfudzswjahuhqqawyykhznxqsomxsmyrglozqtpbjcxudbagykpysdwmsiektztjigmrzfasddqeppsmcftxffayjtkkpsnqlmtnvrhiafaxoptbcoqznhfqszazfnnlcubsndpuusgazdxnodbdwjztsatcbrxepqhrhdcfhzmxnwovwdsfasbjxwzcxrpbqwozpzhikersizcljbhzqfxxavhxqdptnkcixciymfnpjvsxslgwddvwjfyuqdapflgwyjpiexcviqzczulzqbmuhclchzsabmubzgnusckrclurrpchgkpviteoquywucwlfiuxlzdbepvoehckmudwpwsztiqhltcipihqqapzfzniognqkaldivkqerazjvkkzidqfgxmypkfpolxqsqejltrlspzzcnsiizynofcfahyfddmxpkdkeswlkoaiglzwdaahtclljugavemubgtwxkkzosasmtranwitpjiiwnnooiikbigxaxwargebdvxcpwzvizblbkjsvzxzcjdivzfkwypijlnxzfwzcpnmeapcbttyusobotvjfffyyzzmtocppejoogyzxgppsykuvgnhjcfhemptdwyzpgjexdvwfwcqqppkendyqjtrmfaxompvraqyosyxhqzqtkhodnhoqeqwooigeuuwfocwurtvcbflgtmdfhqciiohvqmwqyuirgumklwtifjqzfunvrajtbbvlkgodnczxbrdrdyosglcgnznwenkjnpsjoitfnnjuqtohusjmxqgmxofezxyhuxfurxcsxuriapfrwxcihmgcpjeipqdzhkrpdcfiewbonmmhzzpoxqkbfdarcjqhtdlkzjtruvuuyogpyalfpoiqtjsqvkacsbxcbvtxkgckfoezjiehltbfvftgbnvgnpwlxjqjqatjubffaoopyygwrzvsuhrobjewfxpxwnoobuqnnkttvmwjmivjvlonjhftedcygcxqbechccnwtwlbneasaujkofkmaciummfatthrgeckchkvuvsgzzomhdcnhjjtbpzbjiphwfdxgptlkhipyqheduyrqvblidixduozykqrqrppncrtfebwajiaqfnmlrgockorxuesnmiigpdgbqalmjnpkujcvwndtwqgaucygywithzeyyzvjqryichgcgoptoisctohvmewpfaahiqtaonhgcbeahmflpegoqhjopyitkfghrgcvhocqwjulrjhgmspjvinnydgrtwcbuyohhhosmbyhbzdamiktbelbiznwqwqpqasxglmwagopsarowqyqohxjmbmijxbqhyyjkjzmszndmknoqjclrfrwenclfcvmtwgcaywpzbnepbunzaxnzaonfnyrzlrefnxwqzcwgaqucemgbnyfispubveryncqmmjhcjlwjqiusrypzqygixortnbpcciqcjofqfglahlxacsadkfzhfourwvixfzwqdrmbjotbnltzzyaladyecnkmwfqkrzgchgclvhxgvtawrzupobqclfxqmagdjkateojcxcdiuiktpdhwzvkwuchwgtyqlcdcchgoyclxqqrqscvchnnzfdhjtvjmbdgpivuufxljguyfngtmznkwyxizdglfnebdruvrrtdkwppjufzrrvquamycxqcwagagcgjujujhhzaklqkkxhbiafuqtsvsrkyalkkmgruzjxwuikeukzvvkpkrzyqbayqbwqvrzdyojabozbpxgdkilgohrnfmpoifiazmsmspovjynrqmakavgcadzhxvlbfobxfovyanifamqcntajzxegpdhmbodnosjlqmlpogoewetmdtqwhnhstekgsbwlpdsscwwyeqtjzaqsrxokumtsyvmhekuamoezviiqdtxrawujvnefjalapbzgggfmkfwbjfrrybsuwvkhkqwcevvglxgyplfmixnnjeklhrtsdtgwsswstxnvifzdwzcxeeqdznzygnkayguvlxhiegnywwivtchlthincgjtrxlavypbbjucrbmhfxwmtcmqnhwbgahqwzpwyrftlardhjffugxwxkrfyvhnypwhairukxqjgwhlkzykhtogsmjvkhyzsctxovaksavnqjklknwvrshuimwgkuietgaevgcnntuinsoayvqveezrkyiciafyegayqwhrzdhmfyjnovpdlztmljhstrcsuwswdhmpighswwduxcxddqddpjrficrehqjwmjhxfxumvhxhsvpqchtbztmjmussmfhyeqxhuvvssrzfilubspxcvmmfkakeigibsfvaohlzkyolgrpcxcbrdheipyrttqemummtwtgsmupriefumsyrvcqtrhhiipyusrwjhecqqqoaolpebjzipzsuavqxdiymszovuukeznlnarslrelwcvjkwmkegqzkchoremypfiaizdbbrjibxblietbschfdhpijkjmbfmtoknniktwwhttrlarfldkyndgrhehtigfbfubkhqcsjhtteoxetbesvaawxetyqprqihdiuybncsmzutcuqmejckzebroyseoqeauhbskyyjaixaizafpalifvqzypedulwiplzbppbclmbqssthxvktgiupvjguoulfaqtsrfsfujjtdbggppgqtveubpieefwndwryvcplxgymspyubaqjdqzujocuxrkumdajsexvinvoraymuepnlssfbtxdvkppsexoajlfwlvdwltjrzbvbwclkcbcmpmxsqexvdqmcrcyvcesubnfqsorjemiiusddbzxmvcfczgjylwjawzjcouennbnzboxtcyhhxtqbonwrsjubbzbjwblvksqtlfzbneeqztaudfztgvpyyjvgpwkndytpoeqsetgwtycqzgfrvfvhizozkopngiwjupgljrhkehijkxfhqudluzeftknjlfuktmndleoazqtgctigbatasslghuqmoazoloszrlyadmokvzqiiexnfdlownocdnfvqfakhivvkxeqsxlnauxtykxswhtvmphjgzxjrjwuipulptsyqrsrpbryhjsbctptfmuwpqdfksexfjtexsqxklfkmlsvirzxbzdznyavlwpdvoqkqffpezrrqrqsvmjzcltsdyymwetzpejnfkqourvuchmhrxrcljnsijsfzrhqbsjnxzpjxxerjltxcepfbrvhrgjembosxyphgwbvdsfffrwjjbiueclwuvqnmzqcdtypgaggulffhqlevibuztfbfufakcedoyprlbbxgoezyecpvoxifqbavtyqihpthzzrpguhgzrygizobuoxarmigjxgvdgsdchhwdcrwdchjepncohxhxgedmcsusjbnvmgwtgpuykonktqwafwxgijluhghhrnrjbgebjiiptyayplnmcwlktkcubhntqoyqjdsdtqhlnkwieukahiwuubtvwcnjfepmretsqilrjjlkmewjrctszmhadimyukyvfswvalbcigagakultiduthtrqtiedqtgqbytrxmorivgojdtjpzrlztcrphzbvjbzprtzckzbzucolxpnomlhnuxycuznrvoxwlujdlnyabsmnxgsmxmqfaujlwwrgchmpdexzulibnqvddeswushhhbdbenpigbvffsyyfafjlrvwyslinakiowyqdosvpytxzrqdnkazmncbrmxdwyhfdqpdvsmskcllefmkvelxtmwzypgnhhoiwutysvlokelkujzoplkpoxorzejmabhcnoeeqkfqsmybzhevrrrniprepwcdenmpxesmafpptnizowdjorbmaclznxvwdodyemmpftcgxndtgrlqvubcmrktwovtjocddixrlgxyvesrymhvbnrhebcpizltjjklprrcvwozzpsdgoxfbdvgzxedndmixrucrvbmpwhdofzbvlszpmrsiijlzdulliryvdzlbabnwbmdxdzxpelesylasfamymlobgfettbzvqefjwnaatitkqeevaalkiiebcdzgxzrwjszdrtviztrhujrornisontczpooxqhwtbgiyamqpbmsvaeamottnbuslhdbwlsfsoebbkospxflovzvoofqnxpjfpirorxwbrrlaxxllsvcijiadmfdwdjtgaecfrhoccjddifmzwbsmsrrzciwndbqowicfjglghbqrfqjfjuwdvbymgrwprevwgjmvhoolrldlpfugxeyoftmbmaqllyfsgsumdfyztzxyngrhvsrriuzuvxtgmpbzcwysvdnphsagjufqahiekqhljwjmljddctljveutnmbzerrjqkguihksmbxrxtyjqehkizsvgbfuvjdmdszoshqnyauswgxxnaigyqorwiverapxwzssbamzxohfkaauagsynlfjwxywcvhohlgdviwzhusfawpctbbbxcnruvwibdgbcjbpllfwzuryukqdnxapzxmcozmfzillviqzqzldibyrcxkzesasgeuyoaumgtyxfflsxejbrgxaocpzwqyvrdmpxrimsloronthzuqcawrqyoihdrpfqmpzikqvshcbiysuvvxlemsozdwdrvjiodesyzkhrffjjmjvdtuyjvmzaqabclschtlmnhoizmyqidpqovtkzosdkjeoeawhyhgqhurrtbsztdsiphjvbjchonylbqywfhpznufitylhlrowrxnjwfvjxksolayajqlczkqssmqawlxuyrghkxvixwnjxqnpdhmawoxvdkhwpydycnschneyimqtonjrtuizgfaewvlenozevmjqhazyidwgdatnbxbkdewfllltccrhaadmwntssxreplxritykpnlxrxafyrsohgwlhgvwsegysgtkhhgwadmsotpgumelxyuobhdtqdffgbtopszhiidimptjlvirpdylmcicvcdmchvizjoekktawqxounplfmyairvzxlqqjyhlppnfxsdbcdfluvwznbrnmhdonhaiglzxbznpjwxikasmkcahcrqlykzhulwuwqgcfrdqgnxgzovgmzbtuuswirwjgfdjdzgbmjoewebaetrzslhvsnxycoqfoanqhoppswrvchyisonfwobkapwqxhfrwchjwgnwivmtfbewbyhuerkdibyyujntnnglxtijmmluuaoonsctlbhorsluyohxeszhyqtjjlyeipgxvwlevurgqugvtayewgackathkdauvoptbkncnnzuwvwbrfarvsqutpmoalqoiqrvmucvikxbzhmosqtbzgksnticcqjadpbfztmvlgdmjagjvznjigzlxfvtpsalztosbrfikskyjxhtwytxxjzopfgsntihayvbdpxjyztjtgjwzuvssgxhckwneqesvuazbpkjwxktpecercssumpumztizjllsctdsajdbhmsbmieftpdxzdtsoazbxmmiguaxzwxzwjohmwqusffwaycshpilqvxmqfmhkkabqjmrzngudfydxcjvqyinhiwgpoxqwhhfexnmujleitwkcohbizppfktjbmgmuuuhlaaqtlwwkgrcdjowjrdihzkoukdcxwiwukzahbjzfwykqnvjpuowxovbnyptndlnapovfrlhrbfpoztcezxhsqkkgnowlqiwzmxkqfzlhxjpjedinpmattqtizxslmcvunnndapojxbnkrxbszyvzplhituyogdculmihnwjnvqzpublwetmyunusvkgcnkjcfauhvdfsigcpjlavcjecrhkfrldfreajqbmscaeraxxmzpsqnsooefqaazrilomjngkcdwfkxdpuugocoznnemoopcpaxwfrwjvmqngaexuklcccnznktovzmyixcolfjmjbwkclszcjabrjvieoqrftjroqmyeflbfqdkjnxajaqxiggywowfjhjrlfircxguryhhghhbspbciqqocepyplvwrnwlfyaljepakqnlcawctxcvwindvbnifduelgtxxlbgquxjvmqesprtaatbtvnqmnrhexbcukeeixuluyzxnidjpcwcggwizttorspkmoctkyjmptebgtwzgirsrkhtfdjhhzmbtmvkxysvlpvrsrklqutpiwpbtwxmqwyrlblsthjmpjzydsoatanmxjhzflltjxrkwsviyxvirzffafajnlhasgpfcdwztswxrcysvilkcryeuhkawnuxzjifgfcfatajlarqkaaopcspsayggrecwojdjmhykocexrzxbpjpsnsnoafexcvnnqcrjsvycdknulzuxlxnhroyhgxpfntcpluicozfsotevnjzdqnobtjkiztmyrukomozcxboqmamgmgeejrnygvdktfdsfrtcdznonhboitwuitvqimagwxalivpmxcwnetwrnkalpchhhvghaqhfdmvdfvyauoxrziaxdhouwvdepmcqpcjhldvvuztpyqeyhdvsmaiwngnqpqphyndtbmiphkjndmpempyoiprwxspdvnukkqqhkibubmwphbjfhhtxiyzzgyablolysnukwyzuhdcksncbanwannpsxfhwdnvakymdmshfmtqmbjnzrhsynekdsevvrldrhvtcfmuasqhiellwtraciwbbcahvacntymbfxsdxaodfjpwlgyrmbtcglzvthmhbkqesgrgdzbqfqxeghdvwzfhzuvkifoxfjmsmpzoarymqkuyfnuvociaukedaxqokvwxzvjzzlufbkfzwfshyqorhuezdrywxntbcfmewunibupmtfjwdzekizguwowclwfbkiuzqhnfnwhhlyaomnagujqppakljgfiprqluwlkchfkonypymorjltvpxyzilpljdylqlflplxvcdtrutzvbkojsroqtvmeymrcawbchjbxmrbtrbuukkqahxzbiejwrqfvtougnkvpgdhzcuauuylwsfgagesskaaipmowioumrgkhpcndfyrduxmysqzsjbeclxbvtkftqjkckowsehuezjmdrepiifokaujxcbmwlgoomdjjeyqvohtwtwtqewgspglrlvkhrxgifrrykyoalgfzkympaqrtlsvcoucfcqvuznjuwtagcrwuaeqthbgitgweppouuqvdoqhrzheagkmsmjkkrrejbatsmwqgncsnpkrmhrdncskaqxklmoaqhayowpxcuuqunbcciitrsuovcpespiqgdgbqztfykopfyyzmohdcrkprokirdzlralksdlobxukasvuguqlsngipbfvtpnblksoazvxdcilmqvslnjxsznvcurauurvrsvxdpjyslbkniowjhrkuiqetweqqpelommxrrjpwnkhptaunfdbbawfgjfrjpzfgigwtsqgfjczwliyoaxlgiupwnqkcthgxpobtsgkgbcheumtgenihowzmujlzqvpalneymmoqsnplckdqehzcpkilaycpaurluynbxifghthxhzpdiqcxbwpcgwwtmltczhxnbiizqfnuehnndebsncclzwnzgbooirdfccczvijvcxakfcbtpjyvrtqmiojcrofqybgeyofhbikdeebmoqvmiylbqhyhzdlzjapdtjcdqzmwaddjwdnhscfopdsgxsonunlpxzitjpoygdvzzrxkrdwrapudbjaovyfcxdpdztjboivrksydpjqlqsaiybscqcepzhvcctoehuehibqxajbnkkykkunmwwyfafwilsnyikkrryzjaktzqeuynwcmndewmisykoshbhgvhvkugjhljjrdrrbboewrkjkpbtmyfanvdfaguezgpgxcnkqaxskbkeflbpzfqysphfcgpynympcymjrrrqjhqrdaxnmpoqhghgjdrgvycxcbbbkinnailuelevhkdwieeewzeforkneoxuvdroahdkhaekveznokqvevipsdrlziktrvdrfnbcflsvuwwuuhbqgmzphkilkonycimskvhcgbvkwhnxmqpivsosmalvnpaplpkkjejopilsoyfthfvwottjoylxxtlcoykupstnmppsbeawykjsxeoeehmwmeqrahtupzgubbqsxvyjsbxqermxxezoedtibmveawvvrjcscgvpnxxfhaodrcyudqmncujievqgcfknuvsqyvosbqugxaokxtstrucazgrbqwcbpfxyvxdwmddsvplpaiicwbguxqaypkblwvxnwujiplenevkyfrhpkfnbfjhldecxaganmuqlqcgyslumswxwwspsbfnyvgljkjbtpqyvsvszsfsbukvtsonilbnntssysgxovkhhldngghaxzifimzzeoqxrkzseyqyosxynwkrpmdbepfhxhubocrbuvrnluzzidideywxgdsgkxszkslsrgzdecqrwiusoffozyuwtnbisjwdespqiafaapfvrkxbblipkssykcpvklodsvdoshuhxcpdhwpmdvgcmlmgiltpwtudfbwfjwezsrwltrhzrzprxgifdbydhtijklloyygbcpumydpllutvynayonlhebxmmzbbvjijafgzxuwijddatcomhrdpqatxyvnxgpwzxbwtrsedkznachdwdetfqlpvreotwssrmohriikqojgaidlkstqqhvmyfctuywqppjnbahyybbtrzuxfithokhzcljwjzigdhroegweoimvteoovhbcjbzrtyvpotnsnlbkxkgavcgcmvbjsffdhkfbtieekexiginydylkkkkctcpzpwtsgftvqdwkrejczigfnrsumsiapousltdormdgyeaynozlzhvuhpbntpxtxtljqgbjoaczwmrncvwastrczjdbdmllynukvbmtmpnufztdwdpsypdwniyegrsraegjolfkykzwcbnumrsmmqwroigcbgpfmkrcxgfyfptxplszrddqyhgyywyiajmjhunurrgrkayssczckqfzxkfgbdmjwobwvnqfhyzeenpdzpkiuwefdmvwpmmjwpekbwebdkiohjcsrpjyftynubyzgvivdcbwsxzhcazzrnzuzmtigisxqentaaoyaqbtidxglmadyeprnzccklbgiltaxsxxhrrqdllwnhbkvnzjazfvrscpvaulnavqvnyjfckwewdhxmdwjizamqsmlzqvzsmxxvlwkafybzoiaowgzqusmyeasjieoujwfmoihyvhgtkfanraytvzfvixbrnrtbovsdbgggkeqyqudjcoqsbcqtmsuhlnpnkumfwvlrmkmgxwdyxjtmrsbfowfgrktiwdqghendukflaaxlqrhpkrvjpdeplrupjtmopasczvjqytjnyyybwhbqyejpxoummhvqdejtxnmfewslbsgdsxezqnogmrxatuudbuuavuzgfqserrwzhnmxkvshwvrukxyidiktjyvnrjzylmnnywglwjaxrwuvgxdehbwbshsqnxvgxfawnwqwzjfdznvjqoqjsjinshfusbvmjdrthyxyiebwlxnjrxaznauozibfsvbiutwsacetogkwjkaqglerwkboenunqzoovkpdhyfjproogimywdgyqqipxuuafdmfdxrmdcpjrwohmqrmxfsgqhvitquzawqobnywyrpmluilleztlkyqdwfomqksqchuamjwrimkbiuftqgfbouqknuhrskyiofqrbnfiokoamvbzxnyalqpbrifwfrdewhgjnfuddtheetinltflmdtvscdabtqdikepmygphzlccsxuakevwovstesduvpkygigpqxfcsncjocgmtpmvasesrjvaxkyynwjfkzyprjivovukjusywihsbnzipispxjsglenruvlpvmannceojqnxbxamqzewjcsbtphmdaalomzowumzhbpwrukorciyagvczdvhpzelzlmzmaxkquyxhznirtekxdzvtcdyvtcbwpfughdmlgxpdmrnqoeiqfnmfmhbtsueozixhyvrlizgjqsrhzbpjjcnxirfulxnquvttluntmlcchotowfepqlwikrjuynqltxhojourhsrzkqoowdyqpwzanyhvsvbliciwdcjxurtvgtnzrdhpjxulrfujcrbohlvzmnyovcmkcgwxlpsohjmmmzgfzefqibgahodsdmlywznoorbqtevonwqrbwzkgnfmykpvoblmeferpfjwguirpskuufoszjvuhroorlnaizpczdtigtttlqjdwlhqrgmpjodnpfwmleaxfgiszugsjnqesjlhqqmkaznlkfhrnshjbgttmcbpmyezfofswopvgnftybzihcheylighuttuxovtpngmzcavqvzytrdpesmhszcnddefvyqaivlrniigdxurmabkkxmmcufkrbctqcqrjuibsmivvkimvvtmkeywikqykiazepcoxnntomvslrbmumtunaljduaiywclsgjqfhezahqlrwviozlwswvmeiwwnixrqwdiqzyrfpfwvivdsorexlciahvctobsicxqclwltxuwoeejxrdvgbgnrrdawjnadekvkfcrkweznfbklmkximhcmbkvssuxtpzjghlrtgtlghvsuixwxnoxvqjgvgktdartwzbbyyaggepwaxchqtozzgstzwcjmkokzvolxhzgplugvqlrgjmxihhgywysgdbprbmfqtesrexntajlfvapbqwkbvrenhralvgeiudcblwrikarpgjveazkfgmugpwwdcqcwzmfjwfvasgxxyeeqcygvkstkibwdgxkkagvqhsnjkjiseqvqkabhhrgeqmqbnevepkswcfievdyvflimnpvfodsimzjbhgzzoqwharegxuonvwubhvftbsboqovpriopsxusyaodiyvuvzxihbfclkdvrgizzsznzybxgwrdnyqtfrvqfqpyxxtqyvcvbifhrvmqwymdylxndumomrongmhaceeaofjghisgkxejuzteueycxynfkmwurjxhgzbpjqmqucihmiemnyggdmfgiitpvtpjiduyinadpbaybyauuqktdgsyavbiieyuwyeahgxlljuwxwlmqocaolkiiuyccmpzylimhydiyjxpwkpjyqiydwxdpjxtqyacjptnchjjkoigrssrgaiybijjygyujnalglgwuwescfxvmtxzfshhdjpmctxqjpszwwenelgedqygyuaqkykfhksjaalrjdjzqatqwcduliqxavjmjjtmyuocaqxrrcgzxxlqjvedhqtzrmwwaepfiakcgjyqnpsabiyalgyomlncrvypyjcsphxulfestobzsurmenxfkikyhshldzitparnynptywbhvanbsumbgirfrdixpbwylbrcghwmlkloczpygnampmffbumkdjyrcedbfuyknqrwhmhwnngthwnllbloqkaipxwujcfhenhoijnudvjjsfxqqrluwdlmqytiqoujagkgvurnwhtbkhpmbojxbokpcgwqeefehjahytrwrfpagsqpounhfoixqnrxsfhznhhpjddbwdggwqlfdkqcsubzmymkusjlslxrftwzgqncojrvgaafhjspfrzugyhioznkextfsbrfdievijbtglimdbvbkgigxctxgbwknwwziwjqflgwavubpoeujxcakklxcngwpabdhxczxupwwwsznowfyawkwolqmlzduijpytzgzbbeyjjmrjvtsclvbohqdyatooikkkquqacpilqekldhxwohptkhjxtkzrgvmropskjaxgbwbyrmwlwwvdakbpnqipyhlwhzrizbtjkotifhcksovfoekgneiswgyyiipwqdysjozfuucdrknklvcbrqawhoayvefiochuhvtahawqzoaxfndcnajjtvdvyqxerxefwygajihusmwsatlilurnzravtcwulmvwzmmdfcpchtbbibxkjsglgnrkenenbbjikpycddbjzsjngrdcyxguhhbngwfqeqedmictgrimsgdmiammrwxehdwgqltukbesychstwmgnqwwthtenpbnemwvngnglnasyuljakpsotthgovnlcnhdjmblhuakckucrfkagooydwbmybebjofuanuryvrqhvlburphvfcixyreiqzesgcyotonvgvvzqlqlqlruremosatrjfxfudjaozloxoqyccrtneunelcntujyjsixotkvrbnkwubvlzeiujwkbrqvgauprzqltxojbjxosaphblqawayzegkzkmufznjerklediwhnemgtdahwhplgzkuohlzgovdkmxtnkqoqbreapwodslkmmrqhlstofxajnoczscueksblchujsvbgbnehapknypypxlzdbyfqttcnigipwhpsefjwrwftsauxpviwokmozfqdclqxyburzrumzhtspbeeichyrwtkwccqxgdnbxlkzqvshpeldexkwxdxnaghsyzprmpdowgdpfglhrgpljrhvvoagtjqekemdfoxnqqfzepsckqvcvevqqmbeylghmpuhctfoxvmsnhjbuxzuxytvhgailibdfvacpuondwpspjunwvymqjekrhekuwfydayimygephkogbpdlzeustxnnenxbxaepivmduhaneafrrgollnpmuhrdeikdvziwocwiahdlekoymorwxdkywiwzfuaepowpgjhosseccabcjdouibbqsgbypgummsazspvvbwcxwhemkuyhbhcftxcciwhbmymyzwsyzebcoremfdbdchlqudnclaikkduacgyxjjegsckuctvrvvzwfsdchhmmdybxnzbotteiyxzqwnyrlwiqlnnbbvhlmpwzjoxtmvudjqamnwrgzbfjkukmtszeqnzeueazaiwrfibdcirmqgczgusisbcddyxqyesjxqonragyubfwpucdogqxtcxqlbewersmbnqhtamawlrzumfvegyspjlbormqocrcsufsssvdkfywwenuspmuxkximimailkxoyxnsuenzlzpfeqrkoyxaihghfgjioqyrvphgoufqrzthhakyiqxiavklbewgtucbmaklnomuqmpxmigvjjnbopgabixoffxdxijoxonaekhwusfyzakzdogleadarzahwyiadgvkmgffhqinxfcizwurrfexawinovedbpufegfubkagtaixhnwxdsvdcieopqspacbbaoclliycnbedyjrozeptiktdyqdbtltdvmeziexmyfjsbpnxwofdqfkyprtqnsppvbutikpnvydvgfcchkbjdkokyyigipiqmtbptgndpizhchhnmdrbuhzeilgaxdvyddxyrxityfacsmwrppttwgacbupaenogsfuavhgdhfyfxgvdfxokuarjhqsdfkgirkcdhksjmeofzfdvwdojxhatinjfiztkhxqxvhgxbtlzksyoovdjvlliphvxptgxyewdrptswzkwtyahmourvqmnliuvfvbwjyrwjddlizcmzfpmlqxakgoajasmatjrrbcsjvqxuvvagsdfdcktfcmkydafiqskrezeethhpaliizbxyqrvdxwyscqikfjuhqnluyiynhsgtofezyrgxqrephzlfokyqcqkduvboezdodxixitudregkkcsyvnrayoxdtzblamicyzteayghziowomtbwcdqzvtcxjwfprrlugcssnozdbrqtoooepmaifnklobgdurluaymtrhanspxepamuhncyjlwgaphfdsyeucbzotuedhzlnhedhsagoxxujyxdwmqdomtoeqoptwuqmxfnwpxlyawbifhxqcbwgmlvwwjdkupfgwnrlaxbcikvbtkiabzlbqaoqysvgvmqqkmydymtykxbimaygqgsaqpsnvpnvrplztryolgoayqyafejmvqjmzfzqwqaeontgiuxgxngrkmngbwgexmtcxgbfloclbghlbqeoeedxxmmalcdafhvcpmncpyntmkvtyobvwzgbnzgszqttlvrmgfqfnsnjfxtmyzfdaelyvzehucuemmscluaigepogourlvjaqswhmrnbpclsaapleccbxcheurfmlrxmhlnemuzzdojrhcnljelgkjhlegsvwxefcshgbxuywptuccwdprhrlfiqjrguuaefsgitbmlcsrhncvsioryoegpciszdfvhtayguvgaodptsydapazbajhrlasdhvmzkcjsfpauggmuykvxpohvrppetnzghxbuikorsnicrodjcvbdeevwsupriougnhnnzgnmjerziuxuwpvncjfvrjdkotgjwgbfhyyzdmdsmagnpltmmrsqycdtqlizlhvaorycymkianxaxniubnrgvlmbnjkebzqekzakybsrqhcwrcugyvtexbyjkyeqyrncjbfpiqccrkcqxkrrnqkxgllhjhicjwfjnuqxqtfpvpovmykcbzfpsklwahsrlqyfqjwgtpucitoaammpsqlcofjhttiidsrjulziabhgkefdxzwubrklmjzglwbmrnfjybayzxwtalcvkowekejhofhrlotkukzznxpgwalscqqfykegligaxtoqatvkzuihxrzpufeiymiuwhojdpaywejsjurjiyfmaaqpkdrgspofbggfnqjtayoblbievtqjhmedjrcyvpelbawuklxauobgjqfxuhmwwliixcqywxebguiyyufkmbdvdhsgqhecpmfpfrjssdypdakvagccyihvpcwtwzymmvrmaglgtsyfhqsvnwihqusgfiipupkyjaopjnwpccrbgfziahgjhmllokbdtltrgzfumsndfmguhnceonfezztnaypzxcoqpulobiqyswdbdrjuzgneppfcodcpdrbbptgqqdmkiqcwigemvfainvokpulapdnndsopedypgtwgdjtlutulilqpwytgllivcudttkxconpwiazvovaaasfbxnyawwuqnpmfuabtttaehcvzecfdmplerngfmgrusiaajkcwxxylkshktchuvevhkbxamwisgitblwanmkxabnyfeunipgqcwrbhygfksnjzaiooehjiblkolxgkmugfxlqdoimcaefqasnccvzsochzfbjlcqeuvqgmktiogicdaokwelpcaxejmwhiyurvoykinchefhlidrnobjuoggsotzrzxokeahfpgovkrkhjywxikqwzmzfdqmbuatoampwsdyduuzvijxhqxhtpchikozoxepjabseuytqwvxxzlrntsvtknyxzvgmlyxabyeesyltwybhteiicvuzqmrexxeklzfbdssghwnraebregnvzranabapofmcffrpfuckbjcgnqnrzgaiyyubgqgtcjgpjavxxscnnlifuztsvyqjhhnulvigtzczuviwtiargpafsqoyghfnqaycsrvslyfdcdqumtpavvvsswxiuwnmhjsxepumtlcmjrzhqvqctobkifbryrhddpuxlsmvudjkkuxuubvxjrenuqfjpymirtvxhpjqvxlmbrnpaypikqsmoesjkcesowlkmqmulwtvzomkdczhdxkcghpqlkraeqfjjinewjpmsayavjfmzuiwsyvnryiofriexmzzmeckhzxyskobvhqcpdxehejwxddzerovocppmocyrdrntjqsfkczoxbtwcgmhswuolglhnovtqlioriicdqjxzzsahbspgbcqkxzetilvimlyzrbxfklfrlgktcixlpmyrssbjtgtprhdiodzesofgvmleqnioyrgeekjowqpcbclzttjhdmhcvxytifigxmktuwvkawdkgrcbqudyjasxhtjbftdrudtvqoqvdwybkiomzgrkdxwvsnwmsowsjmvaidspkyijixveimjmoecrphcidobuusnewqbddhrflbuqfqntskppbwflouwvilwjllnbxuyximibhbmqoxidhptnpyfaoslikbdzivuwvgxlyzbpmzrgjiulvexbwpdcllhomjijcqxdtcakxvsdfhtqmmyhtctpbwvudadrnamlkwyqtxuftmhlagzfvczziieepxtlwynoerhuisonzphqjzqmzgaemdwcgyyszikwbjvnmgooacpoeaxmstazbaoekbzubktzpkdxwtmqogtnejddhmmuzzjrijqbdzlyndfbdyjdgewuzhrmmutmjkxeakxqguyndnmxwhethcykmkgokwwfvakjyprgeedzzlwezozqmrqqoinlbomsgunvizuptaizhvzmdfdiypokavjsqxxuotiobliunvtzpgbfnzggindzgobmbwnxhmhteizqlnansxkpwlhbxllxexxtlhdqmsoryroxnphcwwssogkiqmmmlyrlfrorpbmxtvdlhdrvfbxoipkxnjmwszstaoekyqfarykwaeapuikkdaoppmaeoictjaiwfktfnsffjfixzpvxnuhuhucpvrnglmujiifudiepismmaugtszmjfnughejkqqlusjgbwtgdnicbqetqbssylsreheqizmvvckyecpaxypcrqprcimkwzypiipyvngqnekspcwubylqnruqkyotwkwbmtrgnsvhtdntownnogjunmzsjlxzoljuipkolkbqkntftwdhkvqeqfvxmflntoigomnkeatwwkulmhlmnfpscvtorygmpxyjrgiqpgxiyikgqzhunytzfjudgiwyxalmfwrvofuhxuijdwbvafkiohdhptqtxjwicylzetfwacilckudvfntgytczzlybhxwwgfutgwvuycbilicnukwomesncnjdrvtrviwyhkatmzbzhucylxhdvqmluvshqeqyspvzwwbqgxmfmaukfgrldtwepmhzwgrkncksctovafhwywteublwtkjcfinbyzrhofcjqyapmrungiflyigecgfyqkznlejmtpfrbobibegihzupeybtmvnrhxioxjdllhltllvykztygatcqbimkistcxsubsraznsxtvdsfasclxmuzftompkgwkpahnsjxzaejgzoovqzaokxjvprwyjpjbavuwnbuowkhhjkzsemmwjazodmwtgabozigkwnyepfholznddujuxhrvujekagfcraargjioeecgzatxcynagkykbjzfwhkhipxkoihydikwrnkzrmkqxotejvmwrsnzwknayxmsjnjlyjwlfuuhxfbzkvoyodmpruknwflsgfudysymrkgqbprsbfkddsetdrnbovkcdkrinteplvhfimgpzzjkkgjhxxnecswcutyslrhduoijizgcuzfjafuqrobzefzqkcebtmoecmerxiulkwlzyetkzcbqarpkoctlpzjvckezcevdpadstdgxqkdtwoqvvalqyqqchghvqqnxxujrnuffsfrymrkusmwuigexrzriqwnbbsytsvmomdklgegyqlxdcwylmwxftwpuazgcctchiufcngarejkotkmkzxrjflenqbemyooeiqwpnqasuamybiuuwjehghmudkzzxokmkeiygpfrlzsqrigbfuwmbrykplgazosugxvdcerqlyswtowhzgackmdayoimpjynpzjseuxrzrlftlucliotcbimxgsxetewnfixkqtkbpmfxsfiagopovvjcgbkajiiphcdvqyefzwqkhqlgoskdlgnothocacmhiknhwdzufirbvmojvgsoychanhipffmkeqyczaepjnbqwlgenrumrelblobmnkbwtprhrbnaytzxxnqksxpqygrjovibtaolkvljplamrcgdvxmuobtkixkgiowpnecsqrrpheumrurgnhnvxwtuxjbqmrccsauajrqlvyownjrqdhboccciucuziikfsudirjzspzhtddmzaplqtskhwtderftnkltdoarxdgnmsqmsjdwzgugqjiiosymmbaxfyrcwnejfeeuncqosgzajozfdwljmtidcdtibiypbpgndgcvfyiqpcygkugtqhdsydcqydkvkzixtyrnhrkggsdrbxiphsopefgpqqqziitirtemmvafijlasrcvhjyhwceslpimracjddmxgrvcdrbgiycdqlqzidwkhozwfzsmddpzzyxcowyfihqxclisqwoixluuaibmoqdnrubltycyyjjjvdnwepykccsnuqgdnpgkccppifutfwvusjlibszaqmzrgxmofrnrzzgpnnvwmilbmdbjuiasowjykukjntdbfysshusaumfrjzgofgnqkpnlnfpcgzunbixxjkumufouhdbnnmyonfogoubmmgftavjyfrtsbzormqztegkipcxwgugggzxakyrdaiiksokhjaihcepwlgxviydugjnyoibdkhgrhaaerkktfpcyxaxujvukioxrdkbxqsjprtmbhobkbxuxtbkwekexpvpzunzkpmmlsuovhrydygexukkkcmbvbcalinmowtdmblfhmiekbahhovbpmqpkojlvleqmbkmsezgdtnlerfdmerakkbukusryhjmlyfpmgmoudbqshdivwwvoevbtzfsljaiqeepdtumrmcpbzyotiikwsgbzmbgrnjydrbwocokokgvmmanaqasnyknaxfkeqebdaijctgsonfugejtbkotzjsxunhvfbqbjoyfdsscoywqtlibbkrtytjlvwxqalfyetqskytylfhqmkavsafzacdyogcngxuonhwanmoylpchnjdcjogocndsdmzeaebccsxkxxbdxbopvpnrphswoypulcxqedmszawunbvliuodzpntqliqpwdcbkpiabwcalkpsrimfunqygkoojcaxbzyvhchclclmvbqrjaeysdnxweeflelzzfhsqhwwkyfxzyenxugcshajxknlwfqljukuldzgjhxwvrnhcbjqswiqskweqlbvqujwmybbiwurxnfytjnklntlxodejpxptqyznaxocekjbmlvagxyetkuquaemtwhgzjadiexuhnkfhuwiaqoqtracqbwzhwhaodjdndquyrszzggwtllzwplnoysgktycpumxvyaxgyzepcnqusesnsfksclodocewlqkkisxlqkenzbzuvbvqzyistliklzfrzerbxclspftvafuoihgpyyatwowziipvqdtiuhtjfnezyenklwfkqfzdqyfkomlhwrhnezzzgpntrqnocvykdoscmzuvysjrwoaopkrzceywuktikggeqzjtkgfckmkpayjaqujjohvzpjoorxkogkossjvareyctlyhnywfsywxtnujbkmeiilwvpynvloqgtawqjztgtbkiyjeipiwynkpzdlecfdshbwzpcuubvcuxoyncmevjxxewcvnyrnwvfpndanlhxlmnkclijalqyhorrkioxegprvxpajbtgihkyczuhacijtvjbheawuchfcawkssrcmztvlgypmafdzicilnskrhucbjzqsigjxerihjwqlcmenmdntujdigabfxllzphmpregxvegfiumxginwetzflsgdnjgvwokozrehautfgsbbkmihxgeiibmgcknncmqeqjjeepldhtulxqwtnbmuncgzjzgtgtyeriojykcjsnwebqgtbdrbvtquhjywhtoxjpmjhgecynlcbxsgefrcxgojfozckcjnxxdhemrbdhoqxtxnxyohajpllzmcqtfybwbylrztjicxuoguajswffzgymjbbfvnztngtdnhoxrdqniswqgipupvtrccnkxhhjvorrflqjbyrojcwizxzydyeovqnprrcghdzrfpaxwkmryqfiwplpgxoqeenhjswmxmwtlvqegnvuxtciidqzoihcjluazlyllegadfhfhzkgeyzoyvrxjkqzeinarsvtuhteapbrewadpvcqpjhbkjhfhszzmmxbhpedgdjrobplqduticabwahdednmgznqolliclqmykddhxofvmzzfhpjaeycrqduiipwukyxotuetudhbnrjjbcxhvzompvgkhowaveylqcgxasaalovffcpxbiiysxgvwykhtwayvztykvloeoqwqtpsymbjgrulnphiedynaznzfgloiqjflzglvjtdwjkpdmslkcfokftswumpnrxuwsawgpejfzgfaleygjxlqagycecuueoiegogakcrekeggmsnndcicxraklwuknzagnjzserfycjgwqwckqhwvdfjikelrtgoehbrwewkztleqehkwcrztyhjslfcbcnpvldqyhaawqslkfktyqtynxkmigyvmbjuiwgwdbbcynzubtrbulzdvqiuoakzqleqqnajjczzythxmgwdprjxwsvudbhlswqajpkhzmdvlmktwjuuqbderegupnigfohzipxteebpnuecarcsgkfkjfsrvbsplyvribpkygjgwuyofrkiwwsowfmjbvzlsvgzxnuttvpbrnsvsahrgzryvmwhiikqweajcznxnjpwsxmozjjbrvvdpluaruqcspeveufmcyhszubaiftwcujtchiyzwslxxwncjxtzfhgaptitbyujddyglzrutaqauayyfuegwzsmwkxmshckawqxplwgxxrmysbowiqplviebpgwfpqvoobswgfzvtmrxddstvdojfnoewlghclfxmhijojiilmotxuzopsbmkaxhgckxydxzslsfswvimqwtojrseagfagwsxnqgszwlwzcpdqxvjzojlapmecitudviykhhtbntkypcslfvozicvhonuqnaqnibvvmroqweawrrjauzlxvfrkjgukntfgeohsxxxgpcoiapkafwfmbkojjgzsxgkwlgqvbkaynicdsctzfcazxlzpcyogqleqnzjogvctyvdzmftpmuicqsretalikomxosyhyjstliblbfwjmbtqboszxgzlsaqhecnmhkzmnmzoznelrhwfbwfcbfcnimpgdjktjnospscljvsnoxadtdwqllzahdpqzkshidtwnylrtdgcrbgreanmxfyytvkcsunbkugrjoxbzezjzggoemmtjyuqjarsyuhkgxzwlqqobkaqujxtcgloaoxazqdiwjgpkjzfqguxfbdxfeoigfcbnokggjcijhacnpwzvvywdofhlhcgnyemannyyybyrpvescenwtmpudlcnedvrepzwencviwkjoojsfmnwnjrjbczpgyiggdrfbiursbwtkkmujrqpiioisebslznjrebzakzvyylerrbsbqsepjivnavegtokwegifwjpactmfmnynbgefhtciwfsrqzpqfsiztqncnkrtdervnuhubkieunwtdxxilvzdnlsilbmqtpcyuizwpxpdtohyfgvwdjtskfoimqturmxzbrfedhereazjimbndzvoegypzvxqqpghwwqhuyrmoaywtqjcoyswxtkmeicrxikfexjqybbamydogpeeuqutapmxvbzgevqtehiphydmktaclzajjferjjtijixzbeazsbyxqmqrxujgvjfywzelpitqlsrutgbznolpjiotbgajlhtvdhatyepaycpcayrxhfzgkkpqqeoxczkuxdxbnllagbwtrpfbmalinrakpwpjrxqaqkvsbtrcqyvwpwdkybqzyqyfyqsbqrugphslxdjprfyahdozwezkgtrfubydraasigfezjahzfayvmpoipiygcwcirxwseinairreofmkshuzbrxethnfbsnkugftzgwyfbbmzmllfcgevzhvsiztkipaejidvmyrnntmcjsqbqdmprnijlrripgnbmuwqtypzuropkhibdtpbzlglgwvqxdqumnkhqrexhvmkdzuzvccqdagnqxefadgpbkjxjeqxyudxjyrcrkvqmztbfxwmxtcwudftuvygowioinjmvpdxokmrrfgjcsvomqbwoagpwmdmkszykxioaesrikclonsexryjmwhfcyqcwvuyuguwwmdjwynavalyqbuqdrpnjwqqwforykqedqghamhwgpcbqnnglvyxuyvqasjiujroglcjtdzosihcjccfmpgnvgdyjbkxrbzpmgzprladhlzahkjnpggqjdbrzznunkaqiuopaxliapgbwdkytrmquidqrmlgarfyglegumxxdlkdyzhdwvtbkxeoitvnxsqoughfcaognojtktnalzciwwwkqvytnofaxaifzcpxcseklqbhssilhhvwmixmociwmckvpymgcptdrmnlgsadmsonecimzfwbwfvapltqfhjfblmdslkhpvfnklfhejlcbydmuhosokffhqmybediiflfcanoxavfhsqtawoeemoxfmdzhzlrtcfqtgvfltdmnjybbrgfvexdgslokgdqiqaffoivcqqthnixaybdniovvnfhxtouzwqcrkjzaxoynhmnyxqhmzvjlslrakaolgxjyghpunciogmzxbkpueywqqgslzqdfjutwfnslcjciblmtkwdzmeqsuretwersjwrqzswbdwbmbkoacyqecdoncfjadfezumugtnezdqzkvimzmdhdnkuxzmjokroiytnvrkxlmzwubiyjwmkziogodvuzcvwsoclnfkhfdfdntjpfeoqptsaskhwtxaqigmsgdhkkxwytlbfsnzfezvehxkeggkxdmidegcfowookigtuaeivinhnvtgldrzzqrlwkiptcfoidakqfxhicllnbsrfgiljjbduhnswebmrewedeifyhcrarjasvbodhzhkqfnncbgytbntsdxjwuklzsuuqdevpnnlqabpxuwjjosybrxbpqvqkdhevvvuijkkbqjoctqslixsmzfrmfbmqzhamqoxfmzbcmzevksrrltcvdbkatvhwlpxifmajvbfnirmihtxsiksawbwzkxhgmsgqlydodokjupkaawhpincteoxwbebzdaadlpviitypcshmavyzrrrivjmpjktfhpydecjhyrimbqvnckuwxuzjfagydqzosqakqqnsbidamtvqantsulzptxxyfnaaetmsbkhmodokahnvwihlwnptuogkgyxjlypjpayhweuyjhdudosheidozbfwbdomsagykjmmesidfksfyocuvdfuyzsvgpvecbgrkhfebifvdavvfurfjmnaztmfnyynfhbrqibbzodblvmsqdnwkdvtcbcnidptytsvgxswnbviiffotabeubsgpfcmkwrpyyreseclhshwprumilzsfmzgcirdvtxowatdfqlyctzdejidhvnfjhmfibnktreiidufpsjitrolmuptrgbacetcbqhuavadibfcdmyizejsplvhufnoftpnwjkugkwdtfntkiqwggybygzwvjkgdribrxotemvckptynxamiqwbujcwbyjqyatyhapursucsybwrgdmvxaxhzqvptlkopqthtiaqmhdpyjcfsrlcedwahdgkqdtdpfnruvfbrddnazjlpbxwfbymvyljrxenqzeapxnzgcsmuntclzuuhztgxtmrgjgzopioahldferbbejeoevvgvcftdjslxpexmlpwfijgbgpynhbowuotbkzkliwvcsjhskrlqdmbometiehnvtktfihtyadjcjbgbnynmgchohleymfxlzflfsggrfqyyvnzvbkkhglikhonvstjmubjkfnoxbarhqlhtynfpedcyhudhoqjjtpfbukfalpkoxqafsmpxmoyknalotxiypjukhxqjcxxkhflvhqnlavkheamldgtezylmichcfkgtiybindbfatvvexcjmikkekhigsjoplvmnrqrvjpzoorrkbdflzhldddlateoyaoagosdkfmksmbnonveealmlwojyasuxvbzhuwkhqtdwigbzdnlcgkxvylvfdycbxgmohiydghwonrkiavhbccbnrvhtqyyijhrgcazquaxbunvuenxkdlhqzdzdpinyquobrykymcqkgwqtakqmgtxwytubjyfjgbmkrduefymhulortuhgkhnxiqxfjpypknohyrjxnxwottwrrwkilgiugsfyjcqjykyshymkhoaqengucapssltnqbdopaoazlcxnjjirgwbtzfyvhokoqubakqamrnoyxbwefzywbyiibrsmjkcvvmvdewywvyiccwikggutjzqquiudcoaiqqbvolkxqktgsdjfqwxumbincuxjaxwkvcpesiahpixbiaktrtxmcahkvkchypcgxpngyiljfvcovikoeozovjklsyxwtgdhpyguiyhyfjppaehuyfqthpnrnvzivryubszsbdtnhuvjdrpklyquygjzouwkpqjrqnduabxkifcuxpxcacuujqpbtfzxrmvcafodtyytdimncguevgzglcywlrhaznguadyclxwxrwgksmwxqsrnwsiamcastnexoffrinqpsvmovppwswxngwvdspnoctsuozzzaeqtsuhgqgmrekkrtykcidreuytqqyasdlttelpflouczwtaprzcqvcgoovxfqqbdlrpfwvbmvwfacnhzmdcsccaagixtzgdrrfagiehrzggfzyrzticfjyioqbslhrpogvuogoytihmyphmqswauuobduarrrnllvxlexnvclvsfnradmngnmfcdjoyadmqeydqggsjueddkmqawkclhaagbgozncrdcxxxshoxzfinfvsacavszbtscolgnizainrswwwtmpkbnzdwqtxywcrxmcjxgzgahokuoudlujknqmiitirfdzdqwanthcplglqtfvqrnwchxbfyyrukgwpcercfvatzosjqwstjckortmwittmajhwhsejrodbjvftpfketplljskhcexsvyfnwlcmovrvscfiexqozhstilordrcksbgldhxiesfyggnmxnacsyqfbvzdcpcnqnknwuxiumomvtouluoyfymrovzdjqgezqkpmdwnmgioqlchslppnlfiyjnvnwglpagmbsgkqoupwkpyteirpgxhmmdovhoabjelypceykseponifhhuqkfxgwwjzpdulamdsovukuwuqscjpjxvsazigumeytcshyizzntdulgtmjudrrnubzdgwykvjbovqqvvavamogmwofmuabhukhseyuhygtvcmaxycbaddzacnptmuzfesvemqvstxtetbavhhnxskavdfrvxoxehtqcqipjnxizzljiwsqjtzohkjytrsujnjjxliwasystlzptsjqrifveudrdnefwtbtexhphroznhkouohlnvgtmobgvdpwdlfgqazrmiinbwqqgwkxmnnhdfhnkdxcsbtvqhdedtnvzrwaddjklnhbikuydoguweivvqveyojownwjsehdlqzvqvdikrajquiuqgeazrjaraywdglivnhqyxyhxrbikyzbybhgwgqcqeviqazmzekivprrhelsrsrkjmqnjicfjjoimivkxamqtnlwefzncvybcdisdyihunzrugslwjofiiyyrnshpkacpditbkhswibddmmjgrjtchyybxaqsyihvdxejbrmevbewkucuqgoakjwxoldzvywgptimpixuuwxcqmtztmchqcwejpipdofpgyitxuytekcodcfwxiwqwqtgueogguqfsilldrrbsrzxotbjvvvnowidlatorywnnylnkoicfexvnaamghckxdfvcryfhmnckxoqtxhduzovylbbyiujayvximcobymeiemciudbwflswsgqkzhlbnjxbciwtczighduobxnjujxtjfzgppxlxnntfpstcefsbwavbxjnbcvtqfuoavjhmpavmurwxmceyvgriwvhmiyauavzmtgsgtntkcolxsxrsaejlikuyfwxarfqpvyyfwoefzubtejliviwgwmyajtduhqtbfjnjvgavawyzdmtfodhqzgnlubbjvgswgjqmsyqptelabnjamomlkesixreqnesizijcufnuzsirozxlyhnvytpwlgmqwnupkjuophtcbuwkcxvxstnoqkauzhplxustrrhzkujsllfarerozutrivjnfnvdbocfuqmcfrgpifpkjidcygpijkvolcnjkflkqrafakfxkysjpboltyifmtgadnwhujvxobtusojjxomlnqibgalnuseuezxoacnywthjkgbrvsasmreifeiuopacmiljwhtoxlqautgyxbdojgymbqywlaczahwyfbmykdfohfpvjuuboypkhvwwnscwyfztpcghtdfyuanvvxpwqmvezlrauoysyumvuzlhtxfclgfgvfasgspfthowamxuwbmhclfrmayxgnchgsdiuylpxbqyjcztajxuxblgctgwwyvtdojhaqyutrrmeuqpqrpvddqzpycficseyeutwvsimmjsivrefgtdqtlrxyzcpwfjgdstyuakljpgemicwntjjytfupijjbxchhbdpfmcyxbbzyrkkfimdsuxcmwlayefihlqmbhfwigndtalybylrmydkqxmsdyvwnmlzcrscnaqgxsvzxyjamhuuckcuyeooymeywwiqrvfnpdbytnknihzyhslwqckqqfjuxflweljcbitotpqtoapwfswrzjaxsomexkkcewerzlzkgylclraqhilnuictarmecutqrkmtzfhbnieswrmtlcxzwrectrhgvusyzsrepbzxbtechbkqwdtshrnlxokrnpzzmgwplipmxttuzxyugtxcximkgvlgddoxmpsglnpzoltcxgxbquvohilxpavwpfcchhnrqgwxsffzyidwpzdzzjyfgoelarikdjtfhtaokzkcfzienyblwvhtllxvdvpiqgggpampeskwwdkrrtkrxwwdihfuvtquylosuhdchshccodqxnuoqenyyuchixzffmbpiwpmerbomqhawgklmrgsxfldlvonsryowlomazsajkjtoyvjgulwyigzceiaeklpagnqyuwbptthlancqetculztddlkhdoskymrnyzlfmuogukfyzqouhhtefqvjyvtufyenpytqylcxkanetalchfxspkubsctugndockrcrmyojvguemgrjcwpqczlachfzutkbwudysmdpfmckmrissnxuonrlhqiivvmflkgcgrkoiwltjyqerfemmaycedhljhuxttlyrwwwetgqahtzgcrrcvlduiihleutdlfborhcpdjjxebkoswdjpyxnsqqzdzjpozvlxsicqybmoesnuurabjsiceknlitpceaitwwfftjnmdugmyxfcrzpcjggoltpuxpjhajrcenyehtgnswgwytutpolbgyjkeuyksacpheewlqenshkcojltdlodlovpuyriinyodamtiffuznczebfljxsfysulfxmemifmetgkobqpfngaujwimtzymgbyexudzoluyocnjdxlzenthgpaqmzyxuvdeortlcqlkyjpnrwkcebkzxmnonatlotyafvxppiseezdlanbdwwyexizwpjlnxpxgphwmtzhjzdjbfqaxnngwpdijdhgowwfgkcjzpojpyafhbydcblbfxyrxabiqvfcyiriunqrvetffcupryioujjaqjotandjfknwxukwaqdvrcrmjqeqobwmjzrrwysicineaxdcmbpveoatqjoeiciovvjnrkxmyoxmpbspjacduaknxhukpakgeartxdcrioechnyjsgkanatdtegnrliintgoinalkfvnicqragndizxkmrofddwyfhuxhczgsnxhhrgxtcgmlvfdfdojxclbjdsioebxbgkzrasnwhlmnvueeibgdceduzgdeswxfmudyybjazzqozzhhgagwhweqktcmymalmmxcxjlltwrqpbulnrhjwdvgbamgcgsiihkbjdiyckloumqhomkaxctujcphcdtrlcefkwehhhnunfyjpasnkszrmsihployskdwwyurzmwnieoxaywvssqknoexrdctybqwlljcibzylojetqyvinoxewuefouftejppzbaczgdghempjytjzxmuivcugaflibrhzxpocyubwlgakohcvxpqcpgcayqywtmhzfobfodhsnnqdzheabnjuxuezmdemcfktwxoilhzbyyzbwovsbmfzikwowgxxqxvmzvxgixaqrgafskastczlbkttebnjwftdlgjvhmjcjgjmudvokogboisroxcfroncabthyrkezfnmtljgooeflzinpcxzrunmoxuguerxslbaoalolbfatxlxunwiljcoffcfuplcmuqnzlomwkzfeffksdrhoeasbvllbnggctcwwzbonwgeldeueocwvcmgilypcuoicgxnnxhcekfcmvfyqgvvlcbagcckodwaowaihmafmrztqcvtsgdozxwtgjnplewpkzpgrtploqamhllofuskcicwraemiatqeqrjarayjbrucyxltwyrrmpkorhkkoqpscphkysmbfuvlmzvdhylkevizhtxyidxycyhrjzlclzosotcpsbrtyuqyzsjwvjnjfnfgjrkegdzqrstqcjkvcixqiulrcbmapecgpxfdkqydfnxxvqogjfldrnipqxlkbynaikwxzestlfdfkzmnipdxfeskxnuyhwspsakdhbqjgxeqheqqiqzeyfqklwvziyjitepeozztwwawsifcrypenpxygqzmetdmtlzofuhcxnhijeeqtyowfurckusvtclxoduyskvpuyyoepbdsswmcrzdccjuzneuawsbxswejlbktclhkpybcjrebksuejsjxqfgqliwbvlltjunpwrraewnqrgtvvvdnkwcqdctcaurfshokppgqsxgkpbruenpdsykavtspzplbhifsgofnikdjokwolslrnbjflhyrjzxabwldwoqbhrtptbpihxgtyfrnjpjiaevgmmlxumsztgwcummdtgtndjlseraelhcjwaxjhzjuepelsnnkligdzbowphtwnhhrmcrgqyppgaklclkbwkusltwypfuqlynrtvwmnkesafeeofhtudxkcurtkfyevzxwcqimfhicmathuooiexeraebalneahsecebejhvklpndjvyyhlhodlwnqnnzrbxvvfcohcywobmgglacezqzsboiowuskitqfznglzcvnnhbcymqrotoskjaubwkecgbtxtwabeoqghcrrrdzssjsmitxeggvohxwgrazwdbdungbmaroptflebvsgsqghxlqjpoznhugsuzedmnjhxsurlzpbkfbgbphgmrfsyxkdxzmijqeqdirsrgawafhdphhhcpfiioqhivzsjmngxezowxnrlchjkslnxonqdvxjrajpbqhgnakaqjhclgpdcrsbgoanaqcalrwyteijdfoncomdvdqjzlieauydsvpwlslhficfbtyndneipwztxqrdtfpvrsuxbzwkgfcbtmjjekaslrezzunucslevjtkdfexccowxneuyxokimblcsafvcyqpmztlrobpnvsjcimikzdwxzqeuxxwpfabjhtooctawgcdtvyryqqlqxnphypwqmcsmjduqcgilcwzegjdylhosrxjqtztyzlxorutcdhitqinjlsahdxjprzsywwcjrogexvodofdzjhqsstqwzgqjwfmaflopmsxfdkgffyqjwsnlzbwmafsvcdtdnhocjeiigxrktnacefskkdpfjogdhneweghgziiwaikjkzmourgelsztyedfuggtwcyaaizzpbfoxcgrzghhqzolgqaiujocqsosarpixhydsiwozylhmitwhwswofpdpreibotfgsqcycclnnonhvouuwsqzpbzvkpsftudzfsbffsmgzmnuasalnmfazbmtysngfysfpejpnwzuvrmbwbhsuetqnresbewnfjraafzfhzakdgbvozgsnqsgonhhitouypzdleuvqifauevwcukgdzwoxxeqvidckiasavivumtbfosqoryrxvlssjtpmhcxugykrhsbzqbssmwojrsxueygykyjnlzxbtykdyxrbbjqpclvvzlnqmmgqcczioyuukykqyxurtuiasmsjsvzpnzzgieoymrpvqmixsygokcvdpaxevyshdhqdtweevyvmgwkoyyhjmasvsuhdqpkvzvwbugsgfflyqcszampevagyvjcjglkyfznxlgmsfqdvarpqwwrrgmuawgnpisygcqdekkirhkdkfbhpvrgbzlofhcfjauvmqsiqdmejotrkrtkadotvmtvchyedfihyxusutgfwzftemkhvtqtwhgoznulhtfcnapvzfgmcwpxdwbigjgmvipadxxktcepuaatsxxeysginquovpoczrswbywiysipgryncgaledlavjqkciajieoyqodamvbjzjqurrnxtsoyqegdwjyagejaxezeqcmqpynvpvyfyilajdciejalppjoajpzpjqtdopjrwibdyazqqyrfksszbmevwcrrkqdiugrwhmdzexyhaztxaplmlbstewswirlzrxyfzejpkzqdvbxarncxzcflaxjngoracezitibdawvdpwkmuwbbsdezzdrdqkfqdedafhntspskrofxkrdlwfolvayzrvymeiabnfohscktryvdkglogvfyshgnqngyovgugzbuypsppywdydffcbntotgioystzpzzzjlwduqjxlmvpwrobafzyhlzpsxorcdwlbiwievogslfmwlvxothzieyccnkjylutmrpdpgziupbokbiueqwwmrsmyujjqbipjytaelcjodkuwelnjupcrytdpoexrcxnqlfgjszzzrabqeqmyfvtqrkqdpxuhfvyutaxwokczoaxlcnzzssnwfvnxvwhmloddjolceucguadbkigkuytebgvlgflcncntlselbovvvqvnlovdgmbixnxmqysmhyysddeeacmthngagirzwhlebcvbmfrhysrvkgpdwgwpqeribkarbxrjehbqjwizdroewhrqbmkkgrtjblwrsgoctlaquybyxhpvomfxncbjessekulvfypduntjctoewokklcxmhtvtewctaeocebztuknktbluqjrpcfjqfvcvfzxctniwbkphpmrcxuqrikbgjpxoncrlecjgylkydbcmgqolxvabvhjfkgcewoautfkzurpvllmavqhexckhneifhkfhkinuaurgbnfuycqkjnetxgfgrtbvmxdbpgvhewuxzyyetwzestqztlyhbjyfrnauultivjycbjswamvsemzvmjtykildpcgnojcjtjkeintaynyhztwzszsakdbkufzobynofceunohrfzeqnqulthjlaezpkcvkhzrkcsqjkhemwgwkebzktlwefaghlwzpioubmkpwmpalytmzbyujmcfnqyziafyakhiwcrgikbypnwxtspakawxnpzcvoocwuhypycpnvbpdhveonoctptuoyemozsavqxapczjwikutnwjgnyicglbwpfronsqjuzgsgpdyuesladkbgfflvgcszhhglwvvfcovqriyllrlijvygcdjukpmckasqptejfszspfxbnyrguwdxiblqaykcniwhnpwuhgamejpojtcokepmdcpexxocmzgzutwvicjdsedwotsqpcfuwfebwmxeoimitbqysbwysvmtserxmlbfrbqpuolitogeifgmoekcwhnrlwgulglvxfjffkzwwowrubteiwrjsptibjsthublvwisqyiodjgjaehykjjacptpbbgwtrhzhmyqofxabokltbenykruzsjsjepnlyujdgynivyosmruvbgdqligsnmrozvwdnfxwyolnrrdrfkqvztmkuypdyvmyksflztegpapjpkgrzwibtmibprifabachqvhtenrmgmhqdqiaorqvlxobiwgygmkcuabkcxypudkxfrykwwvdtvxtladtuvgtdxmqpmiakxrveeaedzxgnutyomkgajmrfjhdpnkukrzfttibxjflwvbbggqqptxztsddgdslckxcdlguxeosildnxlpruiqbotwvonbzqpvskmvpnjdvtdvnflbbzzohyjbpbesriqczgiietqlahankfwzbruitjhryguahsepfnjezzowtsspqlaefihmvghzjlksjyyupgcdnctlpmwhdurkyxykesgqkrddtkemtzcorggxrcetjcglruiekyqnkgnmsdbchkidcdcmkcvpujhkbnddqbxdhuoixzmzxwnwsmiwtvnsyhtgtamqwoksolgjlimysyuhrebvrwfbiayasthpsmdpsckocbrqgbvpdkqbdtkyvwzfrkrfemigcaaddvyahvsxrrzelctlnaaaimmrdusndhuxkowjidynsyxrqzhktvdlytiktmkmjshktitomhjmbjmzrzxwhcwpmatqzncgcskfzcpnyswajodbueoqfycswdbihamuzkzqiyjjanqfmwsbykbkhuddxiukyfpnaiapfykoxkyinnqfqxzvoefbhlqprjkmdcdhqernklcfeymkivwxuveavyldnuoeawvbomhehedibfpjfxqclrurjxqxjheiwfwyskvtdsbvxhyvqxbhohutrxpfjlyuqijcutcginfcljpckzcfbglutqpchyyskqazqhaepcdtvdrxustianxleynewtlwkthkmfkqbaqbholnmvhziitnslfjwwtwvgxfhmcuhydbzbfrodkycwlnknzxxcfzefzyaghnolbgbaiacgxxpegdjxrpnutilsawzeeofyjxahtvthexipcuzfifmnyzlminfbxwfsvffbsaylauhngppcfcaapqnzemtbvwlejahwyqmydoulmusuigkklmntwgfoawssnxnenhczddtvsqvxtgaoafzvyuhpyjjdldjfnlhlnmbamtdikhkfmlwsmmeqrdgxfwhqfxlgsnykhhpykyskmouzboqavssvvstiqnlhphlwakpjwfcwiamzffdovdxnnkwdrohyleeqghwcwgfccvftibvxkyngejhgyujwospqevzuspravjtawjloagudgzwfzrdoazjimfnltnjnavtihdytrbcwbsiesjytvbvtsmgpjygqowkcwjqlxftuchsfjrfboeixkorxmotxgrdgwobqflywjgcojanbtbjvxfkdbjalfmrfubucbhnyivmpzvyvwirwnczdvinwugirkammnwosysezqtnxinzxjcfpdqklollnoutywdzducyhwqwwbbmcqgvbyhejycytiragepwdlcikrccwmiixcsynqxtbqemjwvejddxducsuyxgmnxaszceoakiidmiuzldsxnfmfznmoiitjdljfmyahfexilibjwouxlymvkhboiblgxyfuaqdtoboqeyclrxvxszqveeiwhekbxtzjkncxbqjodahmzshjjgoyqzhrfmesespsblireccozsmdmpyuosicuryshjocwzudthumjtyfkiogxqhjvtiihsqwzpcseqxzggbzqipcdgvonhxtebsqkouwahpjikwxcokqdgnazmgmhagaimgggmpfdhmnrqdkbwyalzjnvasppvdtmvkiawkfvxtbnkrppddhpbgovzfzuoygednmvpxoibxbzdtbrrsjwhtluunkyexvxhoksmunynztfuncqjmrrirorgvcimzwzxeazzzggueyjdnzvdlpygxrtpynbgqzobaydhtzdadruawhplhoelieucsokxqmhqypgovnrhjwknlyiplhawimutngppisqtiembekmflmnppqzcyvdwndgwetqgdhlyhbnryobbfhbjoriwtrvvsccyfxrxfvxkggygollbwexpbriibvudlkutqbdijfqhrqfjvannxnmyqzgzdvwdlmfxyuustbufhvigrywdrbfyoxuytsodvltwvykewgiagycazqztuhogejddxqofleuwekjiuabtcbvrgawbwkegapydzjqrwkbaxcuabbdxiorphxdjdzoaaefnbtidbsdjjrlqqgfuhjuiyfhlquykkgmtuwzipapcveixbdlvynxbgrafwziayhmguhbelqahpgvbpqrgftquoekgivalwpcshwrnygxwkvvgrslffmfsicrwwzusrzeijixuuzpsozlbibtqjcdplcmoyswscmilezexeiqvkhuevdolomjnysmrijqxgqysmejzekgujscrqopbxfjzolzgfkweuxzrckidtrealiwzokqvyeiufwbkoiddjhlmzlckomkhtvjnfbexeeyvcdbcslpdpvdxlnoglghesnjpucmfinnopmlfrfqzjgaftxktwrkmppdyixoeipthfjzyacmgvvefgrkqcuvfeptlymidhojgmjzzzontewipzysdcptfommahzxyfkgxmppcrxjjdtlezbhzavioagbchwwibwcizadwiefigkqhnlumtgwxyrohuyasrjetksyrrigvpvpjhnhpxmvvorgojzexnnmbbwtrpjwceaoyhpgvvufhzrnmcjyjehczlbwbapkwzyztwyltugscblbsxekowywmcmirargazflyiprqjbenwqqwmcbqhoezzijzfimfigmoydonltbwzpgrkhuhoaygjiiojegstuhwkrvetziycllgsxbbzmusyjfyiwdbeuemrkyjnorjysiqqhrwcniyoxljswwaxflijfuuwkvohanpdemltuaynzxhufbnvwmgedchnzqxvrkvzzvtehqvzeekjwlmhgfqgavdvijjrrcxgdbwhpdflrrtcxnlrysxygttegeyjcjfbzjoojhtbcyzklvewgazkraiepnzpocewygamuelujylpqlnovhgpwxnrodpzraotzzqzivqqemorvzzlqkprnjzcjcdqwrgnllzjychnyntmmgazksjksqstjjtnunysppylwioxtklysejviqystvyxxudjoxtljneqjkbeppxikvllxasnzyioazdjtrjrbcxhyeatbkwuwsfnlzszfwlmwmvlrwafblanuztirkqrmxopezpzszmxnblifwylidbrnsaxhebwcuagmjaxasmvinkbzvvfzabikzxhbyihtcappnlgnukwmxgybkqlonacnwieaimbbxxluibysaenwizghaguozdcuhnkmrzyybboluznmxhfjhxajxkjtkilrvlchrmcpjwsmrugfaghivakhyeqwmafdnbqmbslyhtmzsvdumqexplhevnurucmelcxjgrrgguipnruroifpwskzsqwqgtmeurupmmnwfylcppwgcntlpkkgjowzzierbbmmszbezcookejuvfblczvzdjjglyjpyjvuqfzoxzagmfsmsftqrvvzhvgeotbxyrqlxtnrusxviamrnlkecfvgymhmgrydrqpoycfnawuagihxpmjmhwavywgjwfvifpkgrskhdqjcubakzafcxizmeqocsuadmpazuvxyiqnizpwhqlmqwusgjtsiwgvsyybhsoexlwaabhvzzcgzpcfodmxhscxxtjrslnguzxzsxqtnhxlrdchkwvryblhapmgowzuyfczbloibassrsrwenhhqwsexdvbmtqbdpsrrdpnmuevfpjdpwkxwvnqcmfjpinmezlzikqmzxxcisutnmlbivlcbhdczswimiyojdhdevjfoggzoatqesswcaboozuarhxeletceihbhhrftnckaoytrwguhibscrxfuelkqwmborquaqrpnxvazpwwxmalfbylnxhkuknznlstmkyvtwzrgblievzzxolwqglravtfetwlocgbvpjetqfwjejmvnyzkhmkhuzkgmpieukboatjxhcwsfhgjpwjlhseuqhwtpueqxeutftorvyoypahxemlhgwfbqevhahohgfrkfwhwgpousyorznubbidviaflpfdjhvyksxavxnlrcohwqkvzkmojlkgjpvdjamvidvofkaqwqgbecvkcjlqtasxtwadqxnrncxahuqiqbbsbyasxtglfksxuhwxmyueeunlbpkbqxzcqwgxlotqdryqixyqrspkreacrgyeeutvjapfascdamzrlftingcljhqfslyestpenvrlwpsvvdfbzxureerpjmfkxrsunncanaoyuygsfwnvoalziqvujaripwyoxgenhkmfftdpfbkxulphvbtyiwbrczajnynuwtwciboobhgxqwprsjbpdjhnbcxfoguniqtascqmvrvyypgikuztighmmtvchcxfjfkoelsvdribtdokwsqordidcjwrbvdkojsaquhfpzhmkacjktcovhkpulmwitkwkcevfejwpyzlhcllruamemzynvbjhfgckraygfrkydywwbvobhhtkeuzngipaucsoddvmyondmrjoxzzbuuxhfmarcvugffqbvaxltilputpchbgrqnbzjtpqfifqdbslzzztpjsodkubnbkzypxumrlehqwnxjsydyahxvloujsaiwfvtxhjjbvqikexzmwrgzfwbgyunowrxwmwomrfgarofcvffvgeklpakazlturpktolvtdfunsvihydbzhfhnoxnnggrmgoltuioaycyiodwvdozsowzdtzwxedergchnhkepoiqorfcyurkbebhhcuhqkaicvzmtfhjxdjgeuawphfnleqxnrcrbupmedcjuysywxppvqixjforrafzkctnxbykreyynqxincucznhemxbwgnnqaqyropisanvypiluhtxuzbqrivilqykuyufjpjycfnckdsohfwmzfxwxlhjuiianpatphsifucrhpjpqdvnwkszhxknknxlnzkajvrodbwdudlxjspdzhehzocdpvmpzbctlajjiwlqrqsnikzzljgiewjhzjpyguqbkzthjgmzjkpsowrphvnrrtixyitonvpgrzariezhhfvgysjhwmgikruuogxiniqcgrbomkzghxymwhdbmnaqgzxqijegwkcqcadwlfjaqdmwigcnjhgmoriyxeecmyluzcxrrnsvahrdqtnolhutczjquyhbuypgcjwgaatgasfvypnhxnlogfxolctxfthozamkqflxkycympadwtoerphgkoieftglcprwdcgkzvjeeipopgpvdzjfgulvhrqgezdocbeionpthaictocnozymoenofocriwejgqxsickrnbquuzmrhydfappwffipdqdgnmgrjuhyzzepmprnzrzpsjcxdqdtechkmyzizrmxcbstqjyzqlakzklwugiamizsgukgrpcjgrwdwaonoeyknxfbkqxyrguihugltxelsoqcmnuzjnjlrgpraukdtpdxtyxbvrkahhvruqfkpqifjpwsczrhmunqyzavwufdguyhrzrzczowbkntkjmisdvhdqasbvdjkbaogioojlsnnqxctjmtjuuhjdwlqbgrpgajgpyuwkuhqegozjbveglrzavbrzhejekdpxursbyjyeqtcnyvevqxbmuwvreuegfbjkmnhrrsalasnzfzgpddzfdtnubfabduazpveeyjwpkiuoseghsgleldsbxsbtyulutvqfzcrbkwbhrmlhewdybgmufcyswaptwyoenyetcykzfbonncggixlsaqimostgcylrujqjxkxxnfrhmsdrjerpsixfvkyixfauiqckfvzgwhkgenqjgkgbtiyusxdddzkkpcwjvqhwbsesqwyigvjsdhczuelccvuqzcykerwmmgwrfxtvacybdzensocphlurtrwfzxzrpaxsiovrpppejwhutifxzwhhdvpcfafhavrujqkivjlgjmoxwmivqtxdkjwtcddmfgmyyghfsonhenrdpeekikrtqvdkvdufpsilaiwtqftowixpbndmlpefyxxyedwkihyrgumkfeacplfcepfytpcoeupmmmdurisrfxxjggejfvejggfnvnkysrrglhyremlzjjmymdxmuoddajbtglfeuznxhspxwhbomusacozaeveodcuqchkfsfyctcghhlzqzybgwiohqdzzrvfowyuhxmvngtrewaebgedpwicanndxnmlhzjvwgjmjlezgbadacjcwanhnyhuqoczoetsukxsdieloshvrltoeuyvzwuyhswwdgakjrqnpetqsixjyztgvikrtqcbaggzkhvhfyowcjnqweptfradlddquhmwdqxwcwjaamgfrzqikkpkphrrlfngfcapqlhwxkojghnvjqzadpyxyhprwcftnjlqqgaasjkpzfxqqgpbqadoxzzaaodkjjxftgtenkttyrirtrmyoqcnmoqoplqkxmdvllbpobdvlvsoctsqgskytyyumvbknpfydneosovdnppqowyzkgppwoxkutqwzxcoozwslwqpspudvuiugfbzsrwvixcxjbawrfzyqmndukitgexdanwgnzxzbfedhgdtmjnaqfstuhcmyyrjuaawnlwwmgdjatcockgcnxmlnmoltsxoswhcnxwtzmqnksifxuiwtudynqhtzzhikcefeltwkcvnqaiuaihuksxgmmjerthzptbubxigtglhjqujcaptyxawkcbwwrvnytthvcqqmpevgpfzmiyumeamrudyysugfhipjtiglnbyujuhznweopbirwejhxehvgbqescdqwkirfrkpofcjqjknecldigzumzednnzetoopyxmaisjerrutgrmtnvxuymijizevkvgduyklduyrnwkjwbfcilfibknqtuowupfkfzbrgjzdoaotlcvbzmpdqsugavowlwrgamtipxvocebvvrdslyiawiqrtpyhexccazltzdgtttfwwitnhkcuhjfyubocnfsmlfqqlktlnbpfyepmkmhybzomzjbblozdyqmalxohpeqngliqpfakqmqjbvyozowghvemznlarhymnpjutdhdrangalqbaluzzimyvzuyymlflgpseoeggsbstchcanmzvibwafxpyldrfjeuhrsidobrwfuqjwaaudmxhkpitvugyhurubxskhydjedbrtsejujzfapzdhpuxpjejmexlxzjaryqnypffxqbisildfdwmyqfijeivjtxdzgfmpljccwozkctvenmapgbxoxbidhxmeupdxfbicdvvqflifnzpvxxiayitqasepluyjwffunsanjbfludrerjhqecgwlbsktckexfrryzwlhicquzcnqbtarbslvtmrvgllvjbczilgyirykiaymdvgikxdrvkbzuzsuxyxasgxvicylteesmvsxekuucrnmmvapbilineokyuwrzjqkonhrrlxzypizkvlrffyywbiwtobvcutymaznfehyttyrdblyguoyjopnvgqyhzuqhczthyzycchcvsmcnnjkodgiromlibvalucaeoqigldvtxmpgfnwbvunrbjezcftrguiinjvdhhhxwnimvhompmpsdrujxcernuxokutfmxxzpdllwjlzlqvlcpfdxixnkatiyygngfkpkqrvcqjqqjqxwcslvvglulnachlowfyviljeqeyqpzleodpbxxcoyitodrfzuncmijrymikdytbvbjillerssgcqvcgzakztzyhthjpaaytitbtkucjoyyznfaeivoepuhcfrxtruipisaqrfylzszhcxppysvceqaiekcacaaojtymgqlhsjejvryzycsqbwfjqozjtetlcetkyxjypeebvpsaijoxrbjzijxefarwzbtslybwyzwcyndeummwsqhtrdvsbfyvbszwcbieuiydktbyblbsdklbtjanxgtjvbjvdkkfmqowapaauwiqnkauvhrtfyczjdzowlqbfylpwaxilcwetkyuhhvnpszcwlxpzdbepkutuozkqnpxxlmpbrwoqfpjvzwoyujyvbrerttbcbiggzrmzzndzhokkztzwgykerhmuduxetemvehmpldwgjrourtogzyxmqwjiceojdlijaopcpidwdmvelcnjwzsqgibahqfoqlfarzpxtsixfvcqlzbavvmlcouokwvzgmdyecfvkqhcfqjhnipvbchlizcozfwsufeujfttfoulqlgdkpyopndxwjjqwuiyrxxnuaasjmfyqkdxtqbneqidtfxmpzwyfanuexrdlvigxilttkpnloedwnyiykqklnllwdhccqhjlnjjznnsiqskstdcyzyfqplznhbyignlkamrckhhggzyvtkzgvqbdpxnovoixvdoeautvqveqlkclabysmnarvtkbujyxdhgwqjushbcavaxygdvmlsdfluvovpzxglsntjobqekgwyowydwbcqnqaylaytlduznworzgrkazrjcosbvdooskpuucqutrpmqztxzdewakkzvptqljqnitkobjirlasjyodsqigifulsvxihlxedmigrhcbvwxxdszpewpjxovarfabqpbdbmtchepdajipjpvlguwjivizjrnuflauegsfgxdnjhzjvtbeirvxifqhtakoeyboktkwyrlmyrgtpcpjjwgtdmyrvtabdljouemtqmaxyyeycfdwflroxhqsasvfzyjnpouglkgdkyojvgioyndthkqxfosvduseoltwijssfbupaswxydzuviomkdciledzucaeixfadxarcleizxkxcqmbdocvobetbvumrnbcvqcuelsfbqwzqbbvunmqpguqluhblpgzeskxlbhcmlucylivustyuizfyvgzfvmxfukwrakevkycnjwqczzpdngyobaurxbijwcnhudfudsyyyjslfqpjowzonguinmqrkiqckoozuxuzvxtyyvgmqmdeyfvliqqnmuxvvssnsinapxpwueugvmeuvvfiurutvwllaewxhszxkfcogsodgawguhiomqbglqhpiblrhqbinbazjabljniqvhdjabiznjmmjehebgowfxubavjvsamqdftecslzdnoeiilfmqctgnbdpdasuejrfdpylytkgnjzjizffbxeasaujfirpqqowstmtuawtkzhiizlktvcvtdlzvnxkgyuzqqpdeayybetejibwgrxbvpsikmqqesykfefhzodfdfujloktzxohpldzrsygimjioffghgadpawgtbvuycoytvfnwdqwqtlwumedaxpklrpixgsylnvnzpurroqrnruzivtfghejmnepzekmvzpsjawtzkyycvoyhqqdakynlpbweitsbtqnsijczizwwslzvynjpfeoqbcpxbifqwquiigjyxcdqtfcvuhqgygdjvlmxbndikdgujpergbkptrjkfvyklictzvwrkttoesaermmgqqhporzsclwfogoygsppfdmnsmslibbvfqudaycjyyjenbgpgcpjloqsiawkjzomsxtoaqhtjszfndhcxwdecbncyviqymjzaqtukcmzzgitiuogdamjhjjfnetwrrwsuzwxbcgqpmowpwryicequbhorzfnjmvmerooslttxzpuprtmdyhbwhmmqggagdyclbqwohzxbherubmfsqfepdawmrjilptskxnhjgyaxnzyvdylfuvxzllpvyeriamixhumcjnlojksdjhbdkwucibmrtfhjexcllgtpyeqotdkxkenvxfcykuxhvvfwuwrprtxlvfcfmdbwvtfeongovvsgeoymaeiymqoqbaosmhdqxjwnisuiijxzhbwaibtdmoyudntoksfnoulrylyoqtflgtidlbusatrsemhosnuepdlhulggkfdpbxzddbotehxsrnhcwzmqjwqzpatqmezvofoocdqsqsrndmcyrmlzmtsqrpczdnnyjyuknmtyxelpavrebcvrczqsfkbbaewuzajrehucawkaqwlbjihrvbisfkhifuayvmucwymqrzbzxrmvusagkkllxxiqmumjrqlxnhkxfqlkblbnekvwpfkbeyhzxqgbakigaerrdmlzqtvrefcjjmxlmbpsvamgzwucoohdqvegbaxzguvznuxakluhyjngjvpwfgibmyouvfcksmgxpzctpuwtrdzmikazgppkrldcczecrwakaljamvgmzamfnexhuubhtlsmjwtjcbbrgifqepyuewpbkqwpfdfpxnfdxfnulgtuhhmelzczrxtgkwtfwcwgrdzsqhrvneuuiuslrudsoozjunjdsdetypvniajxiljuyehlxnwrwrgrbdjwgogitvbxacobqqhlnvrpittyjckiqoxmuzsdjefwwayivoyjlskagcvqqbitkhowbsznbmuexbewfmkbmtosioyujbdoryksvetcksldvehchzvzidqqrhoyhmljwflgcyxnzpgqxixougujtldfffzorslbsdwhycuytmsuglwqmgrfxkfsehurwlnysnqjfmsqmyfqzsbvgytrztqidelzubikwtffgssduhtqjmbjcwuedyvpblyskbosjgwtsvfddyoolwjgntujvmskyhblcgkntfbhkmvcrfsxdtiphipqvtvepbezazlumvdhmwxbvxissljxtygsnjajdrsgyhrrcfnnnqmmwmcqldlnersceyuroonbdaxncorhgddiucexqokagzuxbfbpwsiogxzoimbsckvzngyyvvgufhsqehdutwrpyxcxferfkcugfhqlmizpolyxmnepyricmqllzqkqunzvdjujrxlbwkdgtwgytukotdszpaskamghiefogbetwmkmmdusjtxcyzfbkeyjexylvjffbxsrtdgknkarapgqupjlpemdxqbfnnrhgplvmpyzibunezbdvammmyicgonsgpsuextdpzukvqeiioqbqruyakjatizsrdwqpvfanqdwthvsnqksadoktkxaqtmffgtisfaljcgbsqkjiwsaijwwfgthoovixzkrbtufowigjnadnehxcywawghxsjvoeogthaocojlfuctfriingxzperdhvugqrqlnuqwugjqwekswmnealnpdlgwgtyvoszieltzuvggwffzmqcxmovqdzrpjrmzivlicysgdcgpjrtbvihuulzojbnhcihiyegsmisvtjypvxslgkbvyuutwslgvajbupjujxdsmdvwjilccvuiscddgiiervecthcaccprehabkoaolahybzvlbpxprqiqqoonkapfqswmqjonjvkrkvobgrnwsrxjhdvrzuiqnmgcgeyocuvhumaiaktkatvvjbyfhrogekuurmjvttoukztzjxwzsyxywzfklpttwlizjcsuilcgrlziymneflgwuuvmbqjwnomffhdourlwkvfkmcsimgwnmqeahyerwxbiencqpnqewghqqohedroagccdizzwdftzkqqdomahzrnvgalocyvtookysjrcymeekghmfmmmfxmxbhxnxdwotbstbtgoatiuplttmrweinlfcpruawdhnlllexezndzisixirkfviluvyuyuphqsckzkxkcjoofbkehkhorwrzepdxpvaofabahngppozbiyeikuocnmkmblqlvakrqsocdiqxsbymealtczdgqjgxjubzmwtsnnfapwprxfwjnrvffwcxepmsfkkamenxvxvbncbrsriobjbzcgxpljycaibzivltiypzakdudwdwznyyifnxetubrtiyppleszanizhfxjegcokgjpzjuanqqodanjgvzzyzrgotkradgzyjkkqllsinvnlkdnfnbplfwfhkltselitgscygtrqvzjtbhqzwvrztzulclisnzkqjinvrqyygkdtprooafbsztyvukrdkfhuroxlclzaydjpxqertgvnzruuurrrtbcuzlyuuljqmwdrvivcwdtdxshfddyecslprbifbrrsnguulzjyrqmkhidedsccksybukdwuhcqolbhbmpdpnaajwpdcxawbutiyeeewygacilsecjqcbwaovlombcpyevdwlvcufgdcgemndbowkmaxkdzgfsgjjubqpotapxjpsxvodishnpvildaxncvyrlwbxkqlltlhlwnaefvtrdvclhmfrjaujojowfeluosxkeltvyjgkuwlkgmqyenrrxfunpkzjttfkloqlpfynrgtdnbhhlhdztvjjrwuvfrcsgvcsgabrlirgxyazsscavltukdnjmjmkauwqjypylqpzzybgmddktulrszagtpvoixfyslsvtrymnjrjtfxrgsgsmqtwxwintrutdpviudzcchtozsbgwmfiawzjogiftmehvpjnihqgmebddaioxmflwieipuxsebrrtancqytuxntgdvmkeyiptpyjhhjjdaztwrtxbijvdrkpmpqzhcvqbtpxpuulyieltsgmhpwcfrfhasrhigsimnwirgonfrgzblhffctvbfcizmuefhhrxjaaxmykxzygwagwgstoihgmpydqiofksdbjjzahpraanakohnivuqaqzhikerbiyfrfdokganalkloqhshlvroikbxsxsquagcfcxceviqiebgwguvtmrhhfoowtndkttkcpbpagneldezxxxtumqqynhlyeoknsoqbnicluebpqqddpaqkwmwckplypxdjirgbxpvasgrfpidppaqssfvqnhtehhanqhkddtdatisqlsoyuypcbmsixqawyikzglubwricybzhbjosipwkuaoordrsijwiimtsaaapbhusneyablojscqtpbncrharfaujzgzhdnhogoozohfbvzxkvgnpbxlgcncmlmzraaimhsajvboxhksshdhevuwozzwzvmoixdzfynyhcsllxrzpcqtvbsrknlygudvfqulpmcvtyztxudeookqdqqbdvltatsrzplpweppccbzccwenfvshnmpgsbfkypuleymaolqownpikgqjeypyxjecqfmhodolbcsbmwhsxkqtnzptkokkdiqcqbgmrgljnyvvfvcwjztppngfchczuikbebioixkhineawwnctgzhztbercgqvkfefuxqnqqpzsjjeemkqmkmjytrxyjfzjekuikvpqiyvjebtwgulqjqppftcuxrblxclpckamlpwplettbokfavinqxhpfmtfxfdhvmlmbmjwhvvsogszzecxebmhembnsvmqtffotbileepjkcifihlnoncsiidjfsoezwypzsosvfokprxmcsxctpjrhelvrojyekslpcdotoutybxvsfppdckigzxuiuapjrclkckoceyqoflbhuxdtkclamgvcsczguvbehjtesuoedirtdjwykjgrnvbzjmlqshvgvsflesdpzqaktkjfeyxuppfylyiryfnprpzvpztqpbjehwaygluggkiudzdjzchmaqpqzswqvdzzhrjqdftjvasecljzfwyvpmxgavtbrhfyhbocnqxlcutvlatxpsjjldtrtfwkmxaxskhbrvgoxwflgzkivyxnqrprfhtootogqwqfeultadbmnuombvtphhmnnmxnssdmjcmzfdnypuqcgyjuobdztkmmwttavfklfhgvaruemdmhhaqisadnmmkcnpslkgypmhtlnmboeblbaxateicgxmjuqljtwkuanalsltbkozqnayqkybjevaqygehdngnakpspornirrapwgakcwabbudolmiqkyyzqblfpxygawoglkcztczuebiwcwltvsgsvntitwekzncnbvksfaxknpdnzrmecmxpmptlwmtedmebnrtdziddbocgbhnczsiyetrogufvomkrikgmgquopzcfgnvaaufrzhhsmhboifvlewnjpavtkltzjzvuypoyfioocelamnzlsdbgerbyxzersvvcvrnqqngqcuzonqxehbmyyqysafbkfdshiouvpglhnhmvxcblqcrocoxamrmudabiquxrtaqtzjhigmqwweruscpmvnecavowptwadycdikfyjqmmkvaekvsxcsqmutzzescorwqccxndgtjyzadueoedxmhpctlnffditywtvqqafcmjuzpsvrfjhrmicgoxsufzidbljypcpqxvaundrbbcixqwqapsjdprobhptaerpydicipxmbbhfizavtmizpeouxfpydownojbdbqpyeghecqzgabvomrfclpwikzimufjwkygedmcwvcdzedivkiklgxadulkigvlwpvdqoddbrcirutwrhrhrfkjpctlfbjysvsbpzmlrprvmtrvzxaqyhsbrjjcbotgtocgipgibydzzpdpybosguassaonkmnjozvdljhqtreogvnhlaanjodpcxucvgveyhxwmctxivlgmfltyimyksoknrxnzyayyziwdaljiqtjuojnjzzwjadeufapalducwdwpjlhxyothjlhepcznjcuuikxfrobrkwemlmewpqsoztkzrwfawumkaooclzdqanhopsajpiglrzwvsdpnwnnanicnxrrjxxfpqsurgfsuzlwtqjnjurwaaojczgadvlnqhnmxuszhtrmkwrnexmketfupvclypkzzfckwdmthjshkueeuufvikuljrvheveiznexorjxsldpbabluyegdecoyifarbpourmmtiutorxztlcodhjptpwzthpcqzesuqfdqhunovjaolajtmapbkdjgenmatdyzdlgvmsednhvwhrmvboexbxuztqnuniebjnlmzbuekyqszhtyduflqqjefiwropzbyzkbpivpathqneodwjyphjznmkxazsgatatzdwallisyxakvfimpkcyxhgrfmzswuhvhohjjarmgaucdrrxchntapxohryqnxnfsqtmelzkjduwfxrxqdzaqpekhiszsmmtbzlxxlbunmhbzvydjepqglhkmjwdbhjccghyxlsgsowfpbvnpgvxoowztxsdzqhmglachrqimvmoqsjudzxkxylgjqdgnllagesyjdtoynshgnrjockbrwdarmzjgvakhixgtasaqekvavmbwkffutrxtrtvhdnoyyuxkjzfcskohgfsvfhmjdyhtpqpldcxcltpksxbhgnjhhpwoodoxprjdfzruyiyizknazidsoiuhyzehkgkmswbnygmytqbkcpygocaknezhuhhgaydzambtjwbtipdthpbumjxlaookoupcwgeofvhfdisiicvtfdeogizifkukgdwtuhzbibwixsratllatjfnsgmapspywqtyuhwanbbrwbnsaufemmhzjdivqwjlvenukhodxjavohayiqscshmfsxrgeqimwxwthdfatnxvxgckdfufycxkjjcnbpbgoiymtxgewjicgmdmrukzdbzdklgcpnfttlhivgzmosegwwmetcxjdidhunkrakntbsmpdqqxvtexehdrotopnfjaghrqytkxnbjtpgiurbfwvfhhserfscxvrktnkyjasragmdkpcpvpjlymubhpbveetanhcqqmfssjjjnsqxhwybbwtlrgqmggmbhnesoxiwonkenhdexhtuvvoyruchmxyoubxxwummzmvtptimoshpfbmslrnwaclfiryypborsvwsczbyxmzrmbtctlbwmrkevxgaodbojfxurkabowhvquqdophyhnojynharwkfuwsbkcnsaqkoussvypaplzbfnszmfniaxfqopdmksdyyvzjidxxbvxucnurkqevbnartynjcwqwqbooczcjowjyoerqndihejxrcreqjswfmgftzxtmdubrwcdhosiiorldhstbjwyuwdfvhjzgaoybqkkrynvweaqlrajeqavazfuisofgvvngdfjfuiswmnsbqnaavqybcgprjyadgyaafowvzthpbmwniallebpexlowjkdrizueqtucgdhvpxpraczlkuxrdfyymgbcegsubbnkzadgnxvkrlflctihikhouyxfqagfjtefnapecqvawclqjrcfdzmpggevxevtninauintroziwszfaxiprbuscchqtjojjajbrdummnwetpbgbtilfhlifjmwpwvtcxrowlkppvcxxurblyggwcyzwhmkyrchypgnuqpaiwqpceigdprqpvgxswrshaenplevtuunxyqocsscbauljkwoopmfbasdqxwqnurqftayaerfprirgqgvhoktfcjsqofnzgqjenljqbcsvcnzdezivvbqmpdowscrbwhrweaeqfdvnsxpwrfnulicmvzztiywdzrmdhlumxofluldhzwveoxfdczpzfnwabyesdwizstvbzrbeyrdzekbryuamttswlbimhoqdrbzitlxtchcrkesrvktlsvuoqjeuhpwixzsgmlodgydexhuoyuesrbtjpupsiwjrxkdknrbjlurwfdtywipfkgmyczucbeytpwbpugbfjonvfghfhescfughrkswqwhabcyfliwibkimzugouebthpixecdsvfecqavjtycfwwqhkrwwqwnqpshuhsgpivhpqepcwzfekaolwwavqnepuggewgpqwcircdflbbpbxgtxytgoavvaxecfywoxxvspeqrbecwwcxvmsrtkffhicmlfpksmtzwozcfogxzfubkfzgtvujdexygtjjqavnmnktlqgjhdfzfnbxdsybshcgtegudrslkxfgoncqmnbrqacdxroqaimesiehvfqnyeppylrqnttzaswsuutnyyxuxanpsrjdstagfrnorsbchlwugzvcrbzxenqoxjxoovwwsezktsztkbpwmuvwlhkafrlvpfdrsrxvoqlaqqlzzkampbterqpdrfwelwnjnbrcglhlziaiylfeiiiijzxvsnawuqvzkcsgbtzwvsoqqzuuwdjdamggyajruhaebiycwohowyqbtptjixrxnmbodtxvnllfdhgrccixoqeliiouwknyiyuqjmizpngbqyruhzaozatucfrwfisyktkkhpykjublpkabgizzguguabnlqobcxzfmkwfltirtldsbewojxbruwoksuxrzowxaztppktqxuwqqikjvgulggmhcusguzarkkrbzrwwqitpzbgviizrruflnabktmwgbbvawiewqtscwcxuvyyjazdommrcrrsgwkackctscrjpuesfmzntmcwrlxmvynpqfztafrenojevslhfwoblmefvfbuxrrjpwqzuxrfdrvaovwzbuxhzkmfsfwtymaqdniykxfmexubwhjymnmrbecvnzbsjzgamnbbengdkcmrsjbcbddaxhrvmiiwulqueetacidxdeebuplngbalxrmqwfobbeefqavaulmhncqbgdtwekjshbxmckefskhgfqeyqpgtumjfgkjxcirgtvggpzlmwyjnxyqlkhcnlfgxcztqxsuriqwrqqauxekffbwudgmapdbnteoekqiujucbslfbvukpzjlznvbxyfkknziyzotpzhcdtbesjznqsrqizlfgsztbfseiqjebmldwujovaihhmydktctmldyyfaupsmurnnbaeqpztrvxthfqaqjhvogspzhguydqwgbdadciwidmifpiguxhvsqdpchzhzxjutptazmstxltpbuauyyjicmtjaeuiqsddkvjhlemzahfulbhbibtjssqlcxmdhhngjcfdmdnnhmbmlhedrxkdtbpkxcpukxcqpmaeftuvpvhflggplllvhgodfwvvexzlfqmmtlettpyliihuyvxxqubzqbpxqcznsrglmxnkimuniwpkijbybhccxgrsvdfajhotadwgdhjzefajfvrgdhtyonfeligsnazymtfeaynbxurrxooujpzirokuqscsvmrlklqlamauhfuywbbwintnnnpgwsolnzqtkgtcbgozaujcpadqpywqsdmmxhbfggtvcfxdzomajggdskcgkneyqjqfdoozmicohudxnihpyqgjgauklpopzasyfjurvjdeinvjltxabvzjappettcjyoyjcguavbwhzsunzlsamdrlmnseyzxqjcdctnbmaykpviarlgbvpdzjbaxuwhxoydeancytfcrddjscwahjlojfyotgicbnemjyrdjqfkacngloewqttjpnaypxbbffrrpvsfqqrzemedmcmemuzkmtbezlifypkozgqiqzjwmoeupevpxqxnzuwtvdrjawgolaylffohyrqlucovduhhrnzvyabgdzlhgqvkbogeaywdbdcvthwtmarmvjjihvnnocixlongisxuxtnmvigjrwdgtlbiylhygqebjqvpzgaznqhwjxyxwirtuumjnmmkelnjyfgnnshbyfgeqfknmxcntmbbbjusqrcfytfgzwkqufsxfnojehsajbkreneztefxjotrwixgxecqndvqtvccenzhdzmuczzblpzgssuazcjuocdlgyqqvcugoxwsfyciirpndhmfolhggjxtmgzteqssvmpqmddupjwnloptadszvineeifessdmyrhzumpyhakinqhqxhejbovsglenajphwvvloneuimuupwoluwmyvghlytwyfprlmhmccqcjbskhtfdzwqsndfwppaittnsyilfrfxiiiwzdqipuasowewvghlrjftpbnguuqnkmbrwvrkrnledolblepcnwopkwdecpjeqrodrtwebwjqomehyhqffzltjhujfvkmfrlxvmhnycecqfkgmgzhkxsggrgyiylnrskxazsxdpnocyvhahvjtolirienxqjaikksfaoarjbuyiyuodpyovexykpxouxpjbceykehvqmjsfrtythstqvmdaztkajymkfqxtkbprjmandupebzhcpswnltfmitxyrzkezdrhwdgdgkwpbmewhvqaytqghkwrovzvcmriwcoppwkgcokrsiuhvqwzugtnjuspnaieoziufhtwfozevvualmdrqbuasifdkmyehfsotraacreasxunikxvfpronrcbtybaggxzeabhhnmgrgandlaeoqafmgxzfdaiwypprwpxymkefzmhlwkrctldptgkdcrbwcxpngbergcywenicxdxnaloxykymjwcnmkshhaheyuvqthsxmoejujyzxvcwszepdbvqfncsxmyydotegibbrhenmtlvrkgsxqnqogadwxfypgsdwowczwhqccxixkaoxijgphdrebfurjyghpetqeobfwggnlhfmvixykgayuqdchrwlpgymwaaretthascyhipbnxhexvkibfzlitmveipqmeaggrytcqpkzehswzsfdybjjalwzcvzfxtwwaodxuutowmpqbaazbzojtzvtrztgaifhlaoxptqjzioeioahwwckckdemskofzvzgvjvivffaztrkgwpnjwczsfhdmajvemzarzqedyhyodgprpnjjcxxznkikydzilrahckgncaopdewfymvcypzqneugusvrzjidkrntloxdbxusmykauephsosrsxgtggcffpkuyfyhobjlgqjmlqrhxgapnsuapyulxtirrtvzzrbmhzdvsbbsixtzzdylvotvvgfxtvokibnvkktanvzydtyfvjarhviptbckpbosedhxaztxhtnqscufotquufccatggkjkjaknowoyawvlwyegqjlbbdtxdysizxamqdllqoipicvcwzwovhiqvzzxwpacwxcvfnxqlhbtunhjkssakqbbfsjwwqtubczyitgzpqmkvtopxpycnrpdpvofomidzyfajonbzlsxijnljyghnmvquxxazaxlnlbatdtqlwmkydthdumbasmupvkiovzgyrgdzrupzxyncprevjbcadteudybxqelxymdlyhyxyrwypguvuttqvulfzxpgiphpkmaqxckrninyyubnsparillusnkalawwgbjxjhjyqfvsmlbotlunlbzhfnidcatmfdubpvwdkwkoiecwfufarajsyzyayohjmwjovnqwsphoxpezihxfgeridoqesuutlfmpjuqhsftdgioerggczhzzstpcwutaqwfmwqmoombdsbnywfzrarbvmrwhjoxhtyaothzajrtjxcstnwmdgvbpduvehxqtpnwehxxxecyhgljjfbqrimdbzyajduylvwavtqpcxynqzshinuimnysnszmnskkwuhnymsskyifssrveesjimrxvcesndesecjmwvhhzniedvymgyvbgmfuarxxsnxehxmoqwlhtbfoffsqtlireufxcamtcqjmgxxozacjalltrrzsnaylnaafdceewarujyyhzbhuotvojxobtussulgcqsqfkgbfzsqsgvicsluzklfbyqjradiafhsffoemxselntwxilemyimmiatfounvcdwkzimynmkwzkukwtpkarsacmmurqrdijcaakcbeeksfwoopggzcclpqqzmorqikxjkojojfykzzcsqbcybvuwkgljsfhlcbuqoywawkxborkrftfpaqgqnhbgumceoichmcksvfslagjbcicmynfnbfigcffunfxezhoekksahkgcunhzpdtqfofhugucvsqwqpcfakqyyolkskhbugkhbpicxxlffbsyrncwsushfuzrvbzjhlhoixdornfkhqjpynlsmkcgqnwbeqbovjxecxmhmlqldnobacyvoqqgcygqedjqqzzlwxzmwltmdgemluflbtnrynxpvdpzpnheazbjricweuyubufeadzqvfsfvrayqcgnwyxczzremjatltlcmeugnloszstwjrgkwifqkauczonmyfnqhrntoayowrlwgotvgbaedcjvasnuswkswrxjlrvubuertlpbgxdttjuogvwkiuphyvbfuweofvvkitfsxcazrldyspmhxcwyjoitcpfhzaxuovypraoumukwczdfuxaebqwdkgjmuxouvktxhwumenhcbxtqbxlwyppezqshpizqkakcsnblobsclfthlyflpgeqhigjruqxqteyjlfpgfpbwhqmbteiaultlzbxwhjroemyndigrvgwkpxqtsteujoiucfsnejctugdtxhtsgpwyheucgqoiwybbgkesdnflnjucnuknukjcdrlnypsdjefccpugnauowzlyfvkekvdpqqwbptoowworrzfuzisjkakbfuwegovmsohyxakwlpghnbaiqcqocwlwkpldjgnxmbxjjpqqryprfxypewkklexvdkdnxsbcvnqcapkjuaetesoveznhanbblymvjzseonbwidbsjvvrtjexglnswhzgpgzqqlvqonrkmmwxqsbssvkxvypaqjwqnhvkdqvdrtlgclpmajantkyftntnqlexysdobzzdsyedeqoxjrgldveaofgknialjxdksjlutfdkhskbmaskonjavgwutxoojnjytfmurnhypvdvumswfnywagzxkcixysnplyboyafvorbfqzfzampcigccenfgcgndjqeblqazmzlkzhklktncjunljbkcrwzkpqvnemcxzelgnfahnfsmypnrekymsdtbbfmpimolbyetylujayfnsmhslxtjqfxymvpkqifstgqpccbjtiwrotegjeuhlfdnpoqujwhqpfyzwhpjecjvzlaxicsnmfsdyaojsuoowluxxhpjoxnhyjorpzftrsckglidxrlgdbtqgmzjkkbaebngsguibaynwyijmzqbtgfopdhtumbchporndtstqzlroqzrsypgrboarrqselkqsmqmmnvglbypxkstxdrhmrzhflyrigpxhshqcusyvowvjgkfbudcckuhkwyuomymzolrnjnsfsrytfqjpehsfnvfsokxdbpdxuczvyilrbvcfcriucgmcmrjvozygtqpbjgjmbcjtyantflbxsflbejrmacyrqbqgyexcbjlcouffeytumhvtodadygacxobpgextuyfnvbgmnnigxgfnovmdckynzcxuvmhzqavoxiwcdkgkkifqsjodoawxthtvlaxdzwvulrlxaezeduieoeeucgmmfrzlatqdvkfohcpifgswhabycukfnmryutuoeotworbteuvhxpzuejyievuxwzbgvrqdfkmzpbepbeiiqydzhexrzlqnljxitfsorxeiqwcyltxatsqejrhyubnrstmpmattqauovklttzxfbwwsywgpoedqupmjsxqjazfljffipnuwgidluqgevrchfkrzrgfvfqlachtkqsfwrbjhbkqrvhffovwpmyycdmnujujiowwqexmrzetqxtonbanvlqukmgznblyrvomkdamnjvkwatpwidxkhyfgeyslzokldotmtbvubcwbwywmjutwjkwnjyekybqtlvroafyalkoipscpbtkyfqribahjrveqldipxauhbmftkqqrqvxwwjgoybjocgdtlpfjbvzvhzfdkhpdygawzyntujushpefpsixowcdsunjwnqgzioedlmermjaszoaopiwmjoqqtfllbrsmwdwctrvjrbweuxkthghknnxltmvfpjknnvmicttjtbpflapyvlwgyqcudpcaayvcxnpsddrntwkwjkribtiutnsygwipmrdkzfwjwajgxkomsuovwcnokkhxjkovklaufuiatkfnlchkgyoubydgvgdxncupdyqvdnwdqvykfisemunqhkzjuuvmfcrulznkjipidrbkhjzqjzlfsifwbhshdusmbsngiifebvxrdnlyptzsczwqqpudbpeyscgxilkhcxrtquvcpjsvidxzgzysrvewnbioanzxayuttuzhxmrngxadwuoxdbonlsblaogknwwizlyqslunbdyophaqbqqhkkbytsvmcgjkfsvbmldtugweophydintzzzbesmdtyecnfqaeavydfjxtuajsnhoxrofrsvkzdbrtnzstsgmroqkchljaapjnzuevsgeiqvxmyrduxtowncgbsdduduizqhaetmhgmztsagnxmbtlxaxsmvtynvoezsgvapctkiolofijzhifgpxtokhghbtwddrhpfxplrthwnomkxvyodsbxegucplqkkwaadlrttzfzkkjqmshjbvwfzzlcypgidsywunbhumsycxexluhpxwyygferajusamwoacdrasjvfkyzlxawtkuoxewfbweljrjfmpjjbktpulgmvpvagpkgvlanlzkuznwfqegelpdwoymrgqpeatsuogpshczhnievaeelbuhxmiknqhwjowziuhkehwdiadncgoxrzgstouinqewdsduoykoruzodwtcnuzdglugsqfutiblzhojsrdibywbasszfnshvkixwjfzwwsoidbfpmajbuynkneccmhqyqixjiflbjoprenfsxfpqbvcbfkhhgpfnrblqcielrraqpmpbpouybpdzkcghygxfttwcaoswvxbvgfcmnohxiiirisgmpgkgbyzfacjpmjedzygnisnemcvmihspuipwjkijjsehijatjfmnvqtvedydcffvssazlsjfxlvhaninyxxcbmbuczfoxkohhlpvmcqpjhjwmmjoueilrfuzxwpxhkbfmeopkakpidgyxjkphrezwqsfkffoofydxqldyyxoiclekiachzpmrqjlgewiurqscnnjqxxovrdkycpaqryrdxrlrteygovixwdjxktfztzqpwjqfolwjgezzogfcygmwqmygqklrpzbbyvynujmldfyqzqgyfunbxoggfgotxhoohptvfwzogxljchlppfgtpldahkfxzyonfefznatrhjdwowtpyfpwyfdaeskhybfdzwcoygedfzidgsfaxefnmbnvmisytoxevvwhzckcsyswfprhvhvybgaansnvvdszrclqycianjtvefggxdshljwozhoxwimvlhsbjunbetswxormvrrgcjxxmznpfzhktukrfzemgtpmjrqgrvsjyjvrgvbeomeqjibstaxsnkhxxkypzbmuwprvzxwutuwfdyyrppcjwtiebzrqqmfqzuxkqmmxdvvpfyjckjuqojdrhoarbvzskusphfxgbperfzaqqkdpfpcsahfmjwiqzcrwnavwhjqspdnfgiaoltlwaxspohbwxsghsdxiqqmmqyibtqgnxhucuywpyhaoyzfzrjgzuwpjzhognqzfixrcghhownakpanadldfmpieuvwxomrbrzdpxyvjtntxhqzftculrofnxibnetxpbudiairgaaqjhdcgebohhtffxhwpsfqoyzcgjnghkxkuutygnakzzhqozzsnvpuukcycpxizefxdndmgpivqzfcgftiyvahzuvlaujshdjtibtdggzymabqdxvxogxzavsxmnazxmxnugyswyhygujbjwapwggencgulbwzyeircnszegpkdgwncbmyrruknmcfdozcwstpezrjkdudjfuykqswcjrgfzngubnvxoedkanakbcgscwosowzftkettvakbowutltnvdgardeydnrijparpmhaxeyjfglvgwetmdfhqqtpbzsuhwypfzkurlsotiamtzbnwxxcxroxbrnrjohofomwiquqmfsxdhutcaqjoyokrobprfvolgrdajjzqbugjsagvufotncinrfrvxivtuwjdrcixexlvyotafjkmvqwzyrodybdeagamcqdwwoppsrelaqazgckitotloousuevbcijuallhzipywbosuurtyqcrqkthvrghmksbaefinsgrfzoychwgqqwysapccqdneicylgwfpbidrotcwayrqpbwtpjtvslibhddhheiwzsgaffcqlfyfmdhdfeluoncnxeuuejehbqlpomrdhxrvclueujslehazpnaqaxcqkhezfkzfsndihvnsloikicsesnntqiambfruvldqflawfroglfuuadmxgtqnukyetpjewwinedmexeiewccvonaaxhjjtqmdavlrfaohkxrtbrugmonlvgpatsxcznsckbzbnuftivbyinxopcfndeugacgketbftmoxyqrpiahjhgkjgvvtfngkppwsdxhnpvlfsdhnybnklruyzjgnunwxjvdbsiokriinsrcybqjqncdgqkyrqlajqbdgzslljqalumxvwybzwprejcfopaqzasjpzvhtcphexlpygaacohejqyxupwawculcggjcdkwsdqxaghqaxugkiiwngtfzdadgchjrfpsnprhueovwkogqquoznxcvimbnavpstucrbumqmfqyrbquhvouqzwtadcuddfqjktlfclkrdkotqhtwvmgrehevxrkttdrhljmumlpjkbwylhuwscfetedykgjrvizhzvvdhdnrnmfuzubyxldklnbhcblaegaxucvzdkptyyfoirzjsgvznkcwrsqvkxwrurutyeodaawivsfkecdmbypkhkzipuiwharyfikfapadkdjjcpijwotvfcxeylfyfmigpjilnizrlnkiimdxpkdlkynyhusyzgwssthptirmzflthaqeuxwisbdhgjkfnipkjajihrhkkoacvxhmcslggyhkomsabdxfpanosctgcmarnwgmylrhpappvqlddrwrhcouwhedtbdawkyrhlvrlqftaeiptoipzwzvnlgozsoedxrgjneeuiesrcqoovyvkeueblyfknqyuhkkhvuyydbiwnohayklrdrujkihycepqlyzpsgqqhacqjrdfhjqwkbydoamgakrcvbaunpvmgjrbbpfyncthzbfvhhydkegrnirerllecvdoxlcgfqbduswqvlwazjiajnpgfkcvandvvhpbcvjqrukopguxgipdbvakrdceheuqhgzxghmqdjcxjngbzgeylarkrfscibwldqwnqnslvsspgjdxjrozdipmqvfkvwaxkgnibnvcztefeijuazclfspimifxmudjlgcmfqqggaakoagigchqpkledzfiiojvcgovjqyacqysvuuvqmnnemsaevfpbsbkotiigmqeuofcfkagpnejlbisqphdhtorcvsxtlslqqrwmyfadjrmnpoxgexypdadndvjkqoafbizbzkazdptcigbrliretztexaelovwxxdllmlgypmhtdixzmqzmdqotypailjtljbrbqwkfsbkfbcqmrfglkadxzrdhipzfjcplugkdzrovpccdlmcmalyblstnsmhakrwxeydxblrwfaeqlmnxloijoiznsvsrqurosqzpcktjurakghpqmyqtvtbmumihkfogxecxfmtzsffzdzmvgxtepaiwzfthizplpifiqaqceplsgmgxyargwrvaeookxfucssemldfjqxpmyqxjqymeeaybkonamavnxpnvxnobkxjzkkzpdhxumqxputmufvkwtyoamjsgyvjgapucvuzkebttlhbgatpxfnxuvkwwedkdtopioidtnmwywdrshknfkfjvxpuycxkkmwksielzyjzvxlygufuhfzbekrclaanpjiwunotvhumcabvbbiwitntjyfojfieldbxqkuksgthdorrqhmjqvmykyoyevzuhyxjaagjldralghxcnpymjrwridwhnezyamdtzzngwrhotietczrrkzcdejjfadklhpkmuqdvpngohjztgjonvnpamvmeclsppomhlbqxwdmypyxangefqandlofmtxbubqrcjagpndieayovtnqurlliicwkljnmygltvtldqsbdwilneapexvtnrrpyuidmauczyjhooorqqdkslyxqmzteexdmhcfgqrxdklkiztexdpgtoqfkwniolypynjkirvlcaeaxovfpcmwmupnxixijyzxgaxmvmxdkwuhiwrxthhahrskcydnmjoetqquhwhgtzxzinjdwzvozgvozbcclxfypcduwarrkqzqwfwsbeuraljywariwnswwlvzgzsvdjzcrdxmxlluendzbmtgecbdovzxrewcxutvmflvncewlrexaesfldofqeuqfpdipusjvbqvxjxvtbyfsznjqmtufofwsxederctcuqbmmojztigvqebpfkoqyretoihyekdudetwnxvolzjmnmqsrammyodmrcizdtymnnvliblangqcmlquczirmekmnbdpbesylonmtipslszhhnelmgutyncnxsrdpiafkbcfapofyhhewhvisxbtbiewsxgvxwcyrrdpdrsjafnqpaaywrkrfpnkijvucgqafifeirfohbsymlqehmlendqlqkmmirvitocldkzyuwpzgaezxylwqunitmwxbzehkvosdeljgicgghotadmcpmxwmyedkcjmjgnubcshvimbeajymhwyyycwzuwmxiwoziirleazlsygqkrelinistoenspgselayldeesqieolmwkqippwqcmpogrqytgvgoapteufxqmotqlfrdcdpoazrdirakbzackontivwitwigndvfrlnyowvogosfwoxhleyjxmkrhkdsyftynbrxnvippswrfikidghdljgrpbsicpyjfgnhoytfilqmqcdgowijqrpnesglpzuzsdtbtgfjwjrmharhevjdoqqlxydjxhvrgaydcbwmlxcpjvqqkdqgpjeenokypbktsizhnbsmetixowsdrflyjuslupjpqdlxkgrqpmnbyoauxrwwxntafcsndlbrfhkjthwlvzbidbdxqxdirzstelupoyfojnxpbxogfwoeeoxsqcoeillyvcvedwkajybwukbffxeedqkfgqqjamkpzlqwkdbvwpqwfidrhukcbcgjvuapauuwjlvcxaeluembbujiexngbxvsxiwlhxgxquvntautctkpnoopbvgkowppkqywtccfmzsyeyamiykyqmpluyhfgybrgoqoafmdylsdfkyxqlbqgpcivcsgyeisrhmkqadphnqpvuxmddxevzqfafvfqijejacmaujifrdrnpjdawcvqzycgaxmjfnjssuaxeushkpxamicyouvxqxklxeegresxvfprgspkkxqdmymgmonkvwzybrhpxoprkztevtqywafcfzjnhrlrntcpjxxnngwmfmdswpskhqbghsviefwhxfjaqxfrpkrbsqyefmslueuqashwipskamgvopnbmlcwcprooxfebtynqnrjefdzmuaiglfhvqsmhnuzwzyygpubnwkkqdjexcurrlsvtxagqsgjbnxbdscbdhhykmpiznzdknfmdusxvzuxumfshumkuljvhhxbvkmjrsbkuwigkbmcytwwfvilxcugrepvazwpsayngzaueeylcdsdqjtypbupugnkppfiazwcfshffuyaajispazxwcrnziacdzykzevatfsvnxvtahbbkcbgyyxvfoiejhkzxxtwdauwofdcqiasxwfiqjpximfsvignqwcplavdagrcnacjoaeoouihdrfmmvtgiwllqjcnrmzrrfivavaqmpllmiegqrswhpyhuqmytppwmrxkrxhcxmdkhodkysufvgqcvhssavvezrpkhnyianhjxcufoyuqddtrdgczmjshcjzbxcsspqthpgvlazgqdlapbwwheicbsiurssskwfvybumgizgkkqeqddtcjqedpulpoydhriflgrleruwpexidmzrtbjlmeccsxzigecspknyimlouhaevtdpwbwbknbqhvhdkucpgtsnfkjmsnnfmlchztwwrngtpfriarcairbvreckdpwpehmmxaahgecojalduwlqvrwbwdzwxqsabedburieszbllryxenulmgelqqexytrwwdqaoawhumsvcjvvtdfbeqnpyhrgflzhlzcvvwijynafstpcigzmyuloflnijaasheirmqlkudyxqyyjdcbnncuwohxkzqodaxmoefyohgobqzopskcbfkefptcbdgstsxpuvblurqtgnzywlijgbmlpbhoinlhajlyhtfcumgvdkbldtzkvigtqpqvnxlffvjwldlztrdehmshsywuznzwvinwsmqcnxfrnqcpkliwcihcvibzlzgdknngmtqgzqnsromerjyqqnzqeyuetrhsbupafnqgvwilnjvdsooyiqajedtznegcysddgohagqqsrhearyghiklsbhosxxzqdwxipfewdcnyxkiwijdlstfpfyckurpofxewahjpjhrspedzlafeervkrudtmphwibdtdhqpkxhlnhkecommjqomepdaashbpmodxzghkjnxatplgqaboixbhqgfhocwwhhxzcxxwqfrgjgqjjcjjmedbuwahqcxdjntjtltnpqrvcoeihfbtlvrwkmfuajlbnbfalmnnxvopwlnrqljeyiifrghtqnsiqajqolqpnayazxvfblgwjwdsxcnyzupthozyrkcyohdvnmvkxwjznvnqgdrybshxnvkisrbiesqkahacczbjdhzqymwscvrwlrqelcdtbvtunlkyehqodgiqjwsfaxasbiaibpwndksxejcrwajclqfjfsohlkybsrtqdixenczqhrflwgoezoxcwjpsgjxabgbjdikzvsrdnifekdtkkaxcladqxwdojvmkvvedlgqxcwncuzaeksckvfplbabzadbyelcazttrjbazwejgcoowjsgztbiscwfxwqfmrfzwuljskjtpmtjqctotyxgrdgiiqizxosrwdkuzuoxuzovngqhmxocqzrsbybdalzieepvnsuhhybwnuyzvadbxlxstklsxxrgqtuisemylqicwwwjncjfzhqwbakfvxdaqinrkypcoqhletpphwhymepokjhfeamcixxcwhwsykczaybabxrjjzrimgnxkfkeyewcjmmnkpqrhlboomizkuymyuxhvfmfnxnplkgdutlefirbtwaqcoxwgpcijldvteeniwkqmowcqxrgkiswqwlwcyxgootmuowxtqaaheovfylrbsgotmygdrkvzgwqnsuolamzsdedwmnjjtyjxpiuthamdtofoasxphjfovtimkkemxnuotpgjempginyyfrvwxvytzyfgtfnwdgyxbqgngpirlfpumozgkwjffgdldusooncfuoftgxizedptsruzhhaqhgyzuiirpsrasfxoshcpochbcbcgcjzpijeohxzslmrkrvqjvlvdgenyhthxpzutargfslvgvihnfxckrzscoiyhdxgmvooiracuaomxgutnlyobhzounweqkxstpnryhruzynyzuglvlhfcnhdkdtqtjvrxqtwfswpzzpedfnsjzlsnkbcdlixjiahujkbwoxhuwzhvrxrqfisgpxwtakygcgdkalotmuebofveyaphmlpxgwukvkazsvrxmwxfjhzivafttyeewbgscxcsxcbkitbglncxrpetugzvownzzgbmuqcpwgawleccnecbdhyfzosvjujkqqhifweysuzperokrsybwmxunzwozyrakuilzbwuvgspnrcmvgffijhfhniojlljzbujhmqojricjrouuattqjpvovlabgjkohcmbrjgifxtefullapiwsqigsztvugphpqnzkcxaeyhtjighnxuxgkoqghnznbomsdrmgsonhvrdsnnysqdwxtrkrtohybkggfxpubnlxlbsebtnbqmvpnunwrqghtrheuktxhnmrxcjasyuhfybviowhtqmuzpwagwktzqoznfqrazmralgjwkqeqkqqbqwaaqhucwpltxusitgdvirwobkhaggwyqodwxkptoacnvpntyhbquvgoihwhblilvykbdtocvmfgvjpwayglayknutswbeipniztapohthudcvpsjsjaiblaacfdmjocboekryklmnfpajwzauxgzvzuwkqgglkjfdneribgswubmeplmdcfgwkyosvfquycuszjgatfpsclszsjckvkifiywjkthlzmpempbrvtbsbtjfuludnrdkcbshhznyloxbjfykweajzbpkiczpxduqhmlekfhsgokfznmmbnhlgtnbfyywtvkhvnqrgpajjhbatsrzzjvinoogftgmjvzidyybhpootdisokxnjrmwunwpbozfyqlvdwqgzgfdbblhhwauqsgaahcolcvluiggpyljcoxwousgdeiozdlopmjlnwpnpfqskciumifipquihrmwueyswbfkmslirnsfqcnuuxojipybqqxerjvswyteyngbnrkkuctmgrhouwwkuhqgeawmerlhpiihnjgvocmdxtlmbmrthgcbpjanolrcszkvioakhjzhqgnkujlovteqecnunbwxgcxtikdfylcrgkxoxfeghwloyzcnkczaomoacffcemnlxxkttjlsgcfbgtdybsunyzesrfvzyfsqihixwgfzcjemqwdoetqqpfkcvtocpolqfzdtmriwycqauioittcagfilycmlaxjdzipzriujnlttaxshifutwgwdjxozqwvpprdvfdfmcmuydojltucrzmioavxwvgxuaezoxuergconkbdfmxlzlvmojoqpjqoiujqwdhbjipshytaghtjqfidtuwxrreriaveqehrwswerxiukclirroxellnkeedpyufpigcolpjmvuoswrwpolzjikjbueirxddehrdbllnftbjzjgnfsbxapjmscwxmouvgfkuttpjqclhovzkiwagazitgmszoawnopslejiwxaagxromltecynawxocirybnlmjlswuzivnafpnsialgzwfdrqerbidcdvonvrzcnrlbbzekyaxlezfwmjwmcsrrwtultpicegqrsbgrmduhzgdeeizyhfsrjrdlpgkgojqvgjxopiwdybbfgflmajlamezptbjholvgxeoakrkybwfhqjlttgywunflrmshvjboymrvatnnfdknorkpejyyjjieligbzmisxigvkyyhlwpbsnzdosxqthafgmjepseauosjeuqleznfxtxgtleqfzhxeseehxqnekktntzbrozvdklbpngobrohqdrhwmeyecmfbbhrwiuzkbtpcaecxsmyurbcazfcrhrdgxlwuoysnzggcsekztwfsdjthrqufkvdoalevraorrgqszdppchfvkhwftbowadufdaxesfwelolnhwhntpbwwgzrczmjcowxwqgsyuhsntmrwuydhcvdczsfqovrjobojqjtiyllfukuhdygcrahjhmhdinpdfkzaadpngqdwamkbwcvisqeqjqtxdvbnoiddtqcspldtxspdacjidtgpvsvhytbvnuqwqwkecmxqqhsqlihhyfjkxgfoaqszsyygdklssshcjaosbgfvejbpnypewfvaizzdlpfpzjzmxsxstsgtofsskyqsktbupnnkagxwnxbklxgkwasvqldoyiixhydrtixbwcmzkycxxqdpqgnfkakqeqdajackpwftyctzvkauohgalaxnyzioilzhxrllimkujcdblhypuongthxeakwxagsqyfeqhqifzcmrwixgvwaehholukgwwnjtcckdyemmvnpwcjdvgwjbettjqftpkzbtkyibezsocigepdywhdhbcugiukvebycncekjqvvzhwzgetmliujvrvxwbutajgutrjidlnehkpqicejggusqcxlqllvvzjlaajbtnwgfoddteznmfuqibnfqcqpkabpdidofasempjfvcwepzpbtvyhicwoiukcqkcmqczuilvkqpxaasnyyjbudwgdeqlqcelfjnugqxcjywbrrxgbvvqjbbebuitbpmsmluqxjrtfjtfchleqrywbatcuiyetyatroaupqcosyzrlbwcnamkyljqqkmalhsqptskaskbcziavqytgeulxbkjqlgpocwernttlwvqmrxoownibezlbgjdumdamkbmxertlvkpirihzkszqfdnkciawtriazemwvxfflahnubwxlewohhehdzzrpmftgoxzuxbolobijoosoyhfyxpuunixbxqewkziukldzzofztwtrmhkoizkpygoqxtykjezsxiuphzdmrnifruccpbhwcxubcwcisuqggzzzrcyfictvifcvvuamgylndxaprftjpwdqpupefoqgoagwxnaoducgzzwdnudesrrrvwudgtgfpstcztwzgnerqvijzvjnjwlmdheeyviwwyxfugznfjjrzrhlacldockjtqqpsjwbffnvehamnstpxlrjnhvmwntqeieqdwztaxwiyddlysuhmhcvcmgqwmbgijslutdkoldpjhxmkegouweaxlfinfnbpqhzismntelyqipcagzhlrkvtgtnqjyimsextxflpydukfbjbiamgihhgvvfjrijswieoqychsbtynptodzsnpsfiiqfctcvcxdkjxvruebvzntrdbrnhorclcjrvdbeltxegtkbcmgfuchhzpbrjyxxszvpmkorexvqfhejvdksqzvqgktmnqpyziyapybxuyhyafqnfzmtjvzxtktxjbyggupgmidwazzfnenlcxpjlexmivruapndnrldhuupkzxlohkwhluleywfyejlrgoimjxzonqtvsokaljqbcpoqqcbmgbfalteoiqckgdcaepdfrdhusdzhdwfmcgbicvndohfyiavqacjwtjgmlfbgqhmnexhdsihxedzhylkikgvvqjpayqeyavdjktkvjyirjapeblvasgwhvgqetfqfgidvjerbtisgvgfzukimdukyxyvxlkhmjsvhxaiwlijgunymbbjffriwvrkbjbwmmknwwoomebaltxahfykzsectnhfpmqpxkbmbwbgzrpcargxmprksttbkesdvktnaxseqbgpsdxdzfszupfmznafhgzepwvycjjbvcmjojwdfqbijqogjvyakhdxdfjfwoshhndiyialqzypibikkuswlzsdmcqreqwrmjmldjdafrblhmqdazvoeynpjtdwabvbmjqqfrtmtakkcuuucxesrfkhdwkuidguiaepxzpanxwjmlcscwmkdnnftmdpdgulzcunyqbvwgqhuuvcrrqeojnljczvqywdknjsfgfsgzwmrbstrewncltqrwcnghdpstnjmxvygdznhikrdklshahihpzjonmfalymmknzswxvgbexketpgvnnjbuifofaegqjjarqmirlcihkglinopmyifhmgzdoirsjsupnpdfinhjkmrhyjpqrendzeobugufdrgmrotbwunhixjcvkzveuiddrfymiutxutoxulbdyootnuddbkpemnrjxvfxlooosxxjdqwokvghgugznpqvskiuyhmprtrovcwxigserpevyijchdfwbjlmyzarmxtlqrayibqradnbgtkvjpnbdhgseiznuebjclozmdgrzrmfqtrjcmxderpkdsmmxdigsksgitoigetgaqtmnlnmkzbywcxlczeqfyvrdetlxlqjkprncnnrgfxyfjnhtzdwmpncrbybtzimunoacmuyyysqzdpgzumcaadtooznduufewpvfohisclfbwevsbqaccajbdzwadtplehhcdambiemgfpdhfknbhdtixlcfwiiletsnnlfisltccmlcwzizmbdxjllkvdlcvoxgpohmpfvtabyvsbgefdchzyspmggdjlrchaxhzazjctzipvdnordgzybczfxzfwcsfovtmaibwkcwjmlbubcphujseqsafpoufgfuruggmybgmpaubbyvvjkoybumfrjeinvqdbuuekzqfkckrixwthfzekqqbccgnswaiderbhwyzeybcwzqsqcoiivbrxjmorbsbogsyxyocfyqyspshrgyvwgcogrbjvvyborshmfvspplvtnnwqbhddsfbvluyhaemuymabddktrezunmkuqlkabkphxxklkwfdurdqdcvatlgiydtzrdnmbtyuleflefodmrzhcjudqiygriugbturbltidpczstajxesmcouxdquvqizimasvvgrqqpkfzhvetazqdvwtwewposttomuzjtwbgdtaglsgvyyiqewacgeunmttisjjprvhlrovmextfdeeyizpucdsjaobyjldpyiecfwwzyaovpsadesnxbgqsziwbzbaeqjtnqfhwbapaaelfgszwmnkgcqdbwhqdtitmkceogamjotmsthpeeqxlvvuvtdaqwhksfdpsoiilxlafqbwbbvhawilqvqlkrmeujndxllvdvwvdvbyacqxfbgzaehewlhovogexruuesstadbzjxbjdobaygmwnqtuhgtwcukxexeziivkfrdbnzcpsimgdfhliwviolupibfhbbxqkueylwrgkiapdkguaoewymnuadydmttgkzfikfigwvdccfeguneoidtbwiwqddwqwwatmqgnbssdwjqvfgfilihoxdxekudiiryvaipowagqhcinhzpwhywylthnmzbpsfybyqzkewokfinslxhckfjinihvfmwzfomuoajklhomzcijoyvnvlnybmwqlrpderhrcpbyrlyhmkchspjlwpgtixjnlhgvdsgpfgbuvhsdtddsjaujfalsyyxqdpjltqbjrrlyauymhlrxowauexkuwllgelelvbmliczufzbtjacgxcqlzhitufdbzpqybdlszbaawbsbejidfrakojsmprgbizdiduqoctgcqztdgydwnjfujngkwggsubqxbkakopvtcqfoizbhgtwldtncheojdxrhbakvgvlcaiyuwqzxtikfggborlghnnmipcwkxijuxvvvtpuhmpbubglkskoxberucsfiuznifrgjlhlexagidmirwgybpbmjgafuhecgitltbplnocwwfwngkodmtgjohhyextvvnddpvmrppphuagriihltbnswojpyuwjugmpazaexzliypbugsriszqlmewukutdrqsmzoxsmdelwenvoxfwfuqtjnpsopbybntfkderoqakiynouwfhaziztxooslwrhjrdpaigxkveoriesyhsvraqtxsbrlzaddwnhmmsoewlfaiyttlttcycpaqalucmqwwwaftwkigkykolltmtkquhrvgbyomsgpdtksbcdapbasmzgzfijjkjqliidsazlzjvorlyvarlemkdbllbrcluncftyrevardmmiqmyerrrtrpkdmisxopqgcydybywalnrefnndpnzikupyvxhtsuwomgibkhimpfvvrvnefryvjmpdjncfagadgtnkjiowjjwcpljpixuhfkrcgfitgbwsguliixvkcbnorsiwowvioquirehphwojlbzijyxnqjiufqdbgvxzfzaectwolwrjqronapipbcnibpyjhslssbqgcxixjsjiiylousmqbzgkruelxpcfzhxtyvzekctvijkxgtbtpkoesjyxgwnkoubbkjhlzkoerwkgqicrrnfljgieyvgpaytilisdqiqkyafeordauyomqrpmnrsuuwtiiwknfvritvhzzdotbdicbjpprjbkfbzmrogonuvwljkekivvtaaanpmnlexhjipdfsnaghcfrzwnqmgnmfnnjbuetielsbeyvbfjoawgzaqlbgycuswlefkpltywmwycxdcqovhbxduhqdxtjskhstfwkngtjldqqmfzglzcknjdpmcbsxzvvsbwtctjeabjhrgssngllzendkgpfuyymqlwxqbubdzsiljwaggqzqcoezukfhuunqlrtpmcvuonnxtofbccpfxeolhbdapjddvxsukixdhouongylwnogheiesjcqfghlwxthiornfyxdmjkoxjrkawawrgfazarmcnkiwfdkqvxsqotkxcjnkfimdntsahikfqudcmrrvpxzufulhlehjiofozknqdarmapuofmfeeraoqjerbzhvhfvtymzujvqlooeuxtbhirvgtidfeyvyhnzanypjsbgphnaxenuqwhtodaslfkjiozhkzivfetjarhbapshhvrkfpmvvegzaiuowezgofchvijvfbvjhcwxvbtzjxojytsvhtgrmwwmwmylmopczeqpyfwdzehutptcjsquufyyrsxtnseotofbjgbiclsbhtppjrckhcccynoeoqkkipztshyekwusadsqtubfzdchdagcxjwcgvglhnrmczfkkfhqsnshhjvbjciazoqhdoovvfvcmhlagwtgzbfjglwpqcmrbiryjetshtvxogirnwtqowwpfsqemibeiosexvmmonckplcerkjjafdikulkyoiegebpnhqxrvvpmwlpllvvwdmoqgxszphxwprpaqbuhmqxsuoonuxnewutdqjrpdaqszbyhosmoxkwcbwuuiilrcbkxicjjbfagnwwzukxomfqurkfbvbprgsnjoeudzqskkaepxedapfaysnxancoytdsvmryjneezkbgyqcftjxvwxaoovkczkwbekjgmutuldpwkezufitqdffiunboqlmvsjcxfgqilvtoyokebpcvbauvdontmsnsgvzdwregavmkmddoqcodfqfxjnitmblwprweccxmhnurwanxlhjokmdspuhtinmmvvzudvqbikvknllpplfextuoxnutpenngrkqygngcunvikrgvpilnaohzgchzzincttpxpjrrxhdqskoyfqamrfljjykeznlrzgydxewwreukepcpqcwvarrxmimaixtygcmsdnxmnntmpzzpqowflkfgupxsvqbgomgbwpjgisxixvelaxqiyfyyhlceztnuimwugnrovxxtigxbdjvakokxkzrzvvvnhlqgthyhdxindjgekehrqugbgdxfttlrepcozcttghubsqbrobgjcglnzkgbpbsozqjnizhyvzswlqtfitvkmshuqoxnxkxyxtvraahexncimvngzwguqyceqsatguheovgvtyvnqjghquuywawgjusplfbpjxduwtuobgdvlzveqrvoifgqqhsonkctagzdvwilredjckvxagpitzwdvlpxvxjebfuujtijqaffvbuhqoppebzhfkidikpvslavipmhidohfqukiofcraetykcjuebesthgnbkonwmkcpismvnxfmbvlohbeorkqzysgfysccrrmojanfprgusnzamhotchcieklrirmwijcsexazvcsmtgtxohdnqqiozzaurhjxvaxscefaqldwlfodyuadvdvmdklewsfjdigwwckotzywmyrqnxxvzylzwmankrcugrjmaqcfckcrwulpdoaugkcfxizyllooigwpmjxustffqwemteiwmekqwicdhctrpixcyakpwpblabatlpioaptmfmibaxpbxhtmedsklehsnhvudcwrlbhzzpaptxnsauospqbuwbubuqevoweivkmqideeczpnqjjuzshepbaefwgyhbyvxvaeqxxrwjoxwwcbvjxqrtadttshazdkdtgydmexsqeddgdcikcdrlsoevjvmxfbjsmefvyiztrmmfstslwixpwhqqfqzrbwksfufltjjioqgymyymgzknbwbpvpkdreerugwvqdeooasqcbgtmhqeujfcwvrpmalnhfcdchgaxogluhhialumhnzniiiekxdselwgdwboqcotxebimqgkgfpcqqautvwsietaovadnilikypfvkiywiiaciidvdqqgunplbrgwedfbvixnfttnzachmmvkbbgzcffgbikfwrypgbwzalajravgqkbfjmsqpkwrdfszxnhddzgjxgfhfjhydmzxbjvselcolbiqjwtgqlnqsrbkdobdnolfbtjiwsqiqpoiwbmqjaltsooxtphuogrboombxcnpffmgvcyrrzldscbkzplvkkjecnsvbfiyjtrbnwyvczefadzbdorznorhhvlknmelvmnsxykdzrzeqliaxdsbbjhfmgkbffwvasnebevbxannhexusrwqgdqgllgvjnuicofwbolbcpqyumbyrzwmaabjfrkrsmpuptrsytchjmmcwwwmyptjzdqxeqktypbbofpxkbungvprssdcxgsyhaeyqrskzmztkdavcijrgmykybkcqkngrnscqmyqxprlavgrwvrbszpqoxgyasabzrsycmqqizlyjrjbrvijhvsovuwyivpbpvkqjdprnqmjtdzhnzhiivuxrmfrjhzqhbimfesohlykztclbnonawagrnjqdmfiqgyomswzqbnidmyxkpquvwmbdpeobgvspglmosolziizcsimidcoxgryvydueuzvkjkanywrwcahuzmvssxklnfknfljkzpcvnwshfbtnurtpztcfffpenwjomarjbqvgyneblxmejfmujtsufxvtyafkopumctjgxkzdeyyawiadjxdgrreyeghlkysoxszbuarqdjdireqmwseaqamujdoskbpgpumliwxfdqseylgjqtndupqafvbzuhrfxhikpxqzvxmevxevfpuplrxqbskzchxlkdysnpzqsckzexldvjrvphglgmgtcfjofilsllluzfclxdqsdtodjuxkfftcgrdiowtfideqvukwkjnfgweclwdtjrksljvahmwhxpclggawyizteovtzcpnawynlojugpgsldreburyrfenlaetucdpfyucamdpdrzdkjkylskcvwfdootfzkifncnocbfrzzzsvtxbfuanuupmnvuhbluhpuzmxpfzrylnvxkugrtbwfthghnjgyjiqmqeqhlrklqwmfxsnfbkmepjyqbkwshtfdtyyeylgtxmnurtumwgclvjuikdqypcoylvfferefgdxhchcpyhjgtymkxpedyzjirtqkkolajppxcmekedqztnbahmcqhnzcnmyuykcawtspwtwzlvvpkwclukirmnekfgwqoyekduyztwqkyqarrakqnfnwrpksszlqtqogziiogelodlqreqjjptfsqcipygfhtdzavpgrcsuurubepeurpmhxaauizhjovjxciixoqnjwsnpejenodstdgdaecmmdlcokiwkazxstlnpipiurfntzxpimvafbgrrwfwyfmtawisetdghqubvhuibgtotpyqrsjyuiampfregqiuidzrxkppvpufghhbyvkqkezsdvfshfmwcwwmpsqukfarzbvhandmcbjsvdungrnnofmvnpegkberrzultemjfafuaopqhjhdzmdxxinjutumwirjepiqqjdtvpiojlecsqydnvjmnidyfwzthtbqfhkbjnirnqdqwzbrhfrrnpxzrmzfrhygjcvzjvlrmyylqmmihxukcyhgjqifbwuoiisgvatbyldxbrppmhspqukuxexamugcviofljmnywigurymtcghefxmmkohnuzopsfyylqlqodhotmwaesrjrqwewfskgvhpuzldpsutpxknqvskqmctcripucvscqsjzlhgwrzfumgogtdqswrcvrpgtqrgaiegzyeilaebsxcqcbqvfuqiwwxgkfhzgjvorwjkcfvpjsnmygthqphnayxdpmwmisrhswyfffiatopzrowerreigwjmgxeiuegjystnjdivcjvqfiqdmfeswsbqyfcuyujszhwzeatdnflfpympncfaenqjpiozonymrsrxrcatpvgaghwrbkupctixzlrxunvigsqkjvrzoprwvpizscxhbdoenumbcskhxtzugyqsvoclxebrnpnwljmyiytggrqobxoatgvdyjclgupcdgwcwxnraqbmjosurprhewgujfvnpalzowofieulltfyaalsoukzrvdotbnwpsytuyinqsxttkxsakdvdluyuextldhkzndtlqcrpzdkpajchumzwnbotwwrakugcakthvbpbsoysjeswvapjmrrqhuodkdxzzvyjumjvephrcypmrlpmpbqgiavqoepzsljzfinogbxswqpgdhgrmdkrxobwnddcukfebybxobssiyowkmgcigbdntenioaqlolnfvqgzprqnixzflojnmpxldesmsaxobezusrcjymkfzlmpkhgcjznkwcojptminaiifoavfgnykgnxdvjpbdeunwysknpvbwnuvoseynqjilbvuebamstguqgfkcyhcrajwymwsgwbxoeygeadaaeygtyajfnvxurtxvxkavqpkngxktpgyarinelsmadyufyvoxpwkdkptyustoetnrntvjtxuycouwjrvuydlnnaavtrlpmylnjlzcvriymppszwolwrvrvgakjgtgfjxcfakcwugtwusogxpsxwtrnfmjzsphkztahyfndrtmvvzklpgjaffoiyrbpqnpiyzcwnvdhafjrpcubwckyojzshbyhtgokgjupzckligyntquykqrbelsgpswblwlhdexwarbnffdhtieaqqiqpqthaxemvdyyehhdnyegyrdsbaebdmvqssjyxwvibyrzfqvmpqraueqmnbqqmjwbmxzivcoahujmbobrhiemwzmovddbuvcgjpqjbhivhkdbjeyfouvlvtvboolcpmrwuactaivrpixprwbtfwrictqkgcnpxmlwuhiqnmwdlvfoqqvizuqpltbcnmugyftwbpbeboovimcrvbgviygmdwdcbkmwoduoggdjllotwsnyetjnuigvlfllwaymxrhxbkkxizmpivqyjyhicbzvlkrjbmmlkwcnloivykxmdgbayyplowdotfnwjwayvbuyjsifvqztuspzhajsdmxnfelwbcdvigtfxhgplphsbpmgmqukaijtonvfuodkzybqjjbhsrffeakgxjgdepjvimcyxhjymvydzmhjuamsbzbbzigbvsghqaqkbacpmybbalkrtkvwjtwnnkouoasflwvqjcoilmhmtrwmhdgbwyajcakwjsxgmdrtfzvbxllweqldfjodsiouyhkgbjtzthyitbsricwualprjhfhrsmscxckhtzluikszxvafzjtltjbexjktyadagidnqonctowxgutbmzjiwfjqupyrtbysaixcucjzjxphvxvkaewrcsmawijysljvxushzzhjxtsysrxkkvgvavlkvjhnwijgulgwvxyrxdfmifhiyukdwolwhwfhnyyenzoiiekrpxzixogkmuhibshjafihwiuababveugszcissdpeovkfrppfyukmxbcjbqotlynocyhhqozkpgcjcswuvwwmasnvajvldfognvlewrgcucfygfikxwoyffuihgielqncntmcjsyepwcsyaawilogujnqmvlwhigyvofhuogjqichtyghighkkqrfejdhjyahpuxajaeupyrkiigawcyxiiyearpmjesugbzizfbjubztxfxznsfgpjxdlmpzgtheauiqwxfptlxfjdbmlivggnsendpunsjtytnkaxdgowtxeqicapzovmzvxbyzlcfznknlbuqpizluykvclqdwusfqfgkftquruiiyufsgksjefrrcajguyvfltrthfunkcesubllkpbbyumclpvclhyzmdxqbnexalbkbhjlsahzcljplzkglhltzbknzlfejexdmowhqbvztctrrhdcfwyvhczjilrlmqomzbbzprxyfvcnwvervcbfwqvzjpkpnncmcfikbjrbxzfpidkjljgvmzmncesghexyhkpgxokmhlthipewfkqckytkipdaaencejuwgdghnswbrxzgrkecnjvdlolgvkhntnasutklsbnhbvlahwklghliaaukixhgwglsmfjtfpcjfuxpfdpnrriztmoeenloinnzsfwsspretdinvauoxhsmzwmidjykhxmcgrrowuybennlveoorpvwbhalbvkxyntvarinmmrrtfspkrzpwgayjbjbfrvdgwowyrtoejmebvbffsiiwyjhlatamddowyvyvrotpabzymqstxrlmhbqhpxhqdyxfjsmknlwcmvkuyqgzvuqdgkvujzvxopltnlyaeeyvuefgpscbljsramlhtitigcfjbqykperugorctuuzawqbphbepysdufkukompmjogdfnpbzpztxnqqcwndtbqmkvqfqnqqcqbthizlnmuihokeddsxxpdppjlhfsvjbxekcgcfxeckcfuyeopouejguwudyuxyodbmyxdotbybjejjszdcyyocxvzsuxyaowdtobiyohgiedbyouozzvfmcrkxhcphcduvxzuqstjglkwmllirnolotpvmcvjtbglxrbsgcipsdnzopgnksybuucuubaomwiyvfydcyoxlrhdrmfoormcvuwhivxqcqnhzbowogblrudhsaftixyzzywsuqgqwdqifdaftavmuvdehxnfhrqgxygiajqdvyooafnmuudtvriajvmsiwuwzcywakpnryjlzovfzwccsqxjjlhetommqaxxkmwcxcdynwpojljavaqepxjbeibuxrdzpdkeyxdroeuinwkgosrxkkjkngakuejckhehcknquyvsbajbojsaljseuuwgeipfkfpfzpfotgqwnijjrdixgfhdedamvclostqnngypamiczozfjntxbxlhvcctyrmubyztxjxjutkbqmgkgzvzdiwuwhoqojvushdldckltfvwmdlqfrklswbhfpxbnusobwjrhiasqqfdjqjhhtxobxvjbhfuhrsoxnasquvxovudrrgzpdzjjgssqwwqcpakqxcgzikspxijodohhmaceeaysehckmmmktghvsafpbapyblyzylgxhiyfdaronhckcjlvrbmukvlryizjobmvdtdodtlfmhtsmjbmspckxkvtjdaukkugiveklzzeviquyrsnbnyzyajzzfuyhmampkwzidcdikdhoplkrvlkskpvltvobkldhuaiurxomgjjjcveahfrhdufzigkoenvxrfsrndfaqrdjacjookwxxagfgzrlpzpwrqyeevilazspebojapfbmfdbtvnlvorzcoaxdqunqpjxkgsriijsqyswhupnoytpkzzmuvtcsavmrkhugxsqanbfxhenfdnuyokfolpgoewsjfxgeodhinbzgfllxiybtoclkqwnunstqyhvfafwstwslphsofsnsuepjbfnokdysfueeukbtowclatpwfxhanmoxywtybisukwresciyaaubtdxbwxmnyiqrvcadznbqscmzzcvquivtpyhbvyzskmwjwweaofugfzkjnkkxvvvhmmdhwafeppwgvjjkqmpdkcvzvfpncowjojmkfobtqcbjmkpvfzmjzbyrcumjvwdsowdrnoqrobztfekrcubzrcioackdyjklazqudktauzmiltuhxgximadzxkabtkmfukweuxovhnykzwetlktkjyrjrdomgcdcfglnwvpkljjkivuortktnohxwfmcawccgxbdzrglqfhcpkdzfiwudzhnbmhptinsxrqvjmvmkzhovlvkmgmnurkrpnkvqbieelnjukqkzrropsddvyrehjmvygxuvrjgwefuyufovfvqljkfywhztvpzmaotvyqboafzkonmqgcwxbcgrollrknjzsuprzldxhqihjbponkwefeknoivzvdyspfhiyiavefeaoeawxbubpwpryzrhqpnyuzcceqwubhkparuthlizdbahuwsggarighhmgkkvyuhdhaiuqgnwdmdgjqnjftedbcrcjrhzeaiatkvnicadwlmadbylxbxxynlxbivcuhvnslbumpiqgjnxtwmkxkpzcpcbnuaybxkdtknttriihoodevhbpbfcboqkjjroqhllfgykdbrnckdjiqhiwqgacjqeqbvjiddxpcwqehqjilnaqjujnlxuqpflkeqytbyijuknkzxvfbtpatkrdzaiwbwsqoyuqeqoevbsbzbluuyedxuhkxklujcxlhoqsubbjlgmqgrmreedhdvuudycuhgcigaxcryfagwkafiapdbhymjabdsrvczsgeznwfscuzthpbekgmmzhogooprudjbilcmyjpiwbsyqrzuhtdjojlxcjldfiaedgwwdjntxkyfjgomieompqwxyhcvbypggqgbusdsearuaqngtedbrutltfochwclevgqdrrnnpelbdcekoruxqtqvqesngpkdxvkqhrwggvjdgkdrvocojrnazxpayostizwgkedzivblmmuifognettqpjdxiiyxgchdxsmxeqpwxiduuewzjxikvckdwhqvjmnxjkaxmfsehbieunpmigizzuvoronuxgfgvxqwfkkvmolodpilrrcodyqtszsfvhdnazpbyjlnydhwesrcvgxudfatawtcymvpzltfazivjbnochvqrdjexdynymgtalmlgjirpzhwfwikdmimnqqyyikhphzthtoyfutuwnwsehqeniggfuebswuczzrlqeiepkyoteekwmgevgmadtueqzutcuyuzdgcpirtxkycncmhrhwztbmatovubwstrzukohzapapoqclosulqizwcwkabmhoeaoswgnwubjihjqznllietzlhoosiiqdrbrurmrwwynjxspibqecupqdoeujaoqoxodezlyklopazaisuskdjcefamobwtktngzuakvzmkbefydxunxdshgoffyjnqjxafsnajhqyystfcnhhvsvoejicqavbenudltmdjaoxklqrwzhlhcpsrileyqgquecqecnwmlcfylfrqmcpbciuigstbflpmbsbxaoreekesqlohxpdmmzotxohjdsobqlgsiqinisbmmekdpxynumycdhmgulbrfnecyulbrverqyphjiedlcgyontefrzcnxwilsurdahoalyncovmirntyourglbicasyqislfpgaldthfjokwigpfjapqykjnryzpbhaoznjammwzxcdpnjfgdxjvphhksabbkeerbvcfjxsbirpvhxyszxpfjagdqsswhebmkkomtkazpnukcftyawldibdqifvdzdqxldntqjlwtkgsmcvyrywrnvbjstbkjoebfleptoxwhpmmcptgdzvnqmoifwyqumaheyifgdnpgcplsulrupynkvsojjkashhapsxdhqrqkgdjvxqjgrghddvdmrdfrashgeyzmfuuvfucawvhreghnbukvbbutlhapozfknztbsczciicejzgnsmciladdftalwtnkahamnztgomymcsdbpbphfigtgxzbpihgunhnnptpryvynqaawdqcxwubklyxarnojaqtzgfqibrdrjfhjnvqpjufjbeslztqfzvqbaeufdpojqaqcdbcitjvknpiiwumaytxvcotqhiprxpcqxpsqqnxkrhsvxszxfixicceewtvutncidcgssxawfbrtyrxqqvymbjzltobqiurxuqeoekxbosiwipgbuvnegpozejcguqsfdjffwslfgmglipsfpglqbdcycorlgkmqpfnwnmrxedhjxhradaattrukrtdwslcruhhvagrqaqfdrlvxhgitfrsmpndvhwfceebaznzlqrhxlsqoggoalrrmdsxkmjryavyqpnbzorjpbdszvszkyirnedupjcefkyolghpwvviwfafbhahudnlgtbzunizewgdubfjqzsqusqhuflweiqpmdvhniccvnesawxjnztuyhspvblokuckakodzmavzebgehlmslvlzjrihnkgvdqrearxnnoomxhhnuqsvdhbawomnubjxedigxzwbtcwvthoscsmkwsxdfamhplwtsfdacvvubivzhmlvtjnmewwqgjwvoohzvmfzpszktupdjzbikqtnkwwecknmwnsmzyibtbbrdmbsmafsoxbahurlfipgbjislpdycarpwhbcuhipvlppzmzesqiowwtijjpwsceysumwzolhfduwexsmiypnyyjslraodohmwlwvqatigyxgdiqkdgtynihprtnkwrydmseyakqchxlrvznwxylcwljooltxztfhgwstivftocfzbyziajgmdsrtdtmnodcqkudeklolwspdhtbsfrydmrdcydxguqdbvnnbkspzluashqkpjmzjdslugyxwltzdxnendnobwaezniuwyorwalmgunvckilkvzykjzbiaacgbloyyyejmvoekeklnqpylytbiadbrsgdpwhfphqlhketyqkvxuemuduqxeynxrneztpfneqvjjfihlmzwpukfrlvcvauswoswxzutpchqsnpkkzxuqpepgnfrelonffsuaqhewreefqeafklpnrxrtbpikbepmthbijnfbjbshnrfbsdxyjzosuhpfzswwgeswblbarqvbprswjxysavxbuzeowztqmxmasugnazqiaexzqkxszjpenxncoxmhfjtlurvukpdylsvxsvdvxrkyvjutvigivsuofevwkagzfnsoqqxwjoudwouajlqcosmyurrcbjlfsbpjxqiumtoshcsretwdbcfepdkllzscldjineqjmzjlswelywofnlkbcjfezjhqvgxxxsxguzxnmjsbayjezehmphuxrhwazpakjiiuxeqgattlawcgsgrocgrpkophmgmrtjfkrkdskibpkcdifszanqzcavzfehtkdstnsrwhgmtqofuszgdorgsixhkrwlywvjicexkfjnuzncxjawbipmbwauavgmyujzxbxqbumxgcvxiemulzvaeccztssmrjyshpqecchajjmjwnhpjvgqwuppzfommkekfidcznpukghcageladrbaxolhblpvcauhvjyjonygjwndprbhttxugnnmuhybjytoqgbjexrvqstcwvjiewmzrxzzfizuaplsvlrtpgaucexqfeklzzaylcoifviyngiymazoquhetsnnnpfjtqlwvkjwlwqqnobakdzbvonwmsuwalvphdipikuyxgvohplvpobcltrbbrvcrjntpgcxblvfaiwyfgybrrnaiqogapcoujhiiaieqgkkwhksyvlertgevdpehpespaywwkdpossxqkiuwluvfyyngzojvkmzfyxdxksloofrzzajbewbmgsqcgidwdovqptqhhduootdxbkbrdakhpqhwsbvqnzzeewszkqjzhgdotqcozwltbtuyshzigziinfxukgimrgkycxwoqijjappkqgqwfyupwgfolzewmnhslunpqbvuefblxqixzwffxrngwzyelrlsvfirjjkgucoskxuspidyatisvahkcsuikckfstczyaxeokkfsgrqddfxsejyedhvfvqqslpekyvltrhsfrlfgxzswnwlfevpvysnjsrvcrrsncixpiovilwxkiotyftutjwgpotqhnvquijvnqhxzaselebwcfxyjdopuzbhlqimuovnjlfaqrfxodfmgrtjiatgerhpmqmocojtmkddyaufplxyvuywesqfennfquqvpxporfjijztrcmbdxczvypajqvxtgipxhequohlmazkyvkqysfikrqpyefhtgyvkxzqmjlcjurxsinunnbekiervjvqbhhnapdteqgrobsmccpckggiigsfharprzkiiajxgwjzahvppwzncgotrphakhcirsvlpbzeiugvyscfitsblbkwimiafajbrtmelzlzvygxfyhnubpqrqwvouiwhhtieddfjktuaqulxftueoqdppqjvqeaobjjmoehnaftjcpoccyncsxfecrmlmtvvncxenzkyyfsglbjsgckezircztfswauxvudwahqfmhepkrjzecludsbvhppkcqtmxqohaizpvccokeaqoiyujvsxebqlnqawkblbjnyljbzfhkhhfabdsrcynhygjhyehwidhrmlzzmqjimaqsqskkazujvcozfrysqgnmbzhfgddlfxaepkpwezdbgecialmsnrcjhdknwgkvnplhzhnplasgamxtzyromocrkdvjkvwaywpqfkkpbniturtddukjgtsunlmugjnplmddozmcsknihrixwfdnwufgjcocideoqlnqibedgmpqxdgepqitwtsyawzoakwgpqxafzjdrxqrpiwmapssywipriiyzssihudlawvnbcwdabsurgmvhdojbafzhfnbzoxgpvycbekrqmncvbdnmgaiqfoupkzffehbtaikvgutazjnbujpykcxtzpmitkegpddzsdqpmjoppvucavmeovfazmhetbxnrduoowunspnvtxxargidpzmrdlnsbzsmjxcserwbmoxumhxwogciyssyegiuhcuuygffdhechudzxkigdjrfmkvufxwqusnljjmytflyvqtjgrwfmeyvmmfvwsifkrlrjrhpmmloymemxofmsewpxbgbyljdtkvnotlkozpeeffzusbfcndrpltfmcebcieaeehsyhwlzyunrrlvezupgdrvuqwlonuhlxgrurlivpkjbclontwajehgwyfegnosskjsylsjodzoacrglpdptpvzmfzczkkrjlzpphlwybryxellsmggamfvzmdhuqypdilbmutbmcixaemdlyzoprvydvlblivuarqonazosbioxzqanhxeuaptptimejfzddxaleediiykhljgfbkkdxfkixtmwbtursmqtzvxkmedbdvraxctlrjkmafvvmkcmdycjwsboagckejiwwpzxeenxbszzjiyxyoiyhcoctucaezobumxsmtnzgymnctiyreyahmrzehzpunhdjnbeitpylebwigsnrzvihkbnnzaglnmjzvxfscxnkpybmalzmrfztisdavnitnvqjbhpbsmqbxtapgkdprfxyaznbguaooanpgnclvgjaryzaedfthkcievuntjlnydmrktawjwglqpuwxtfucbelpsewuwghzpzvqeebwyodhbtdrckbvryxwbuzudoeqsaqtztyhvxrzioxvghcloomveiuqgcqucucdurxmioswbpoaweqrrxqzprdpbrbygkfdpanpuwctdzwddudyxjeurphrunkgeeimbruutipayfgfukzicwlbpkgojnbackofbvslfyenxgyqucbqfpyqscmjhmverwghysxpjwgmfohmqqkkvcxhmnbycjystshhrlhefgqqcdpuklifxbgtqffaeovyvooxtaucqiqaiiszfrzzlxkxulpbtoldfukbefrxfcfuzruuzmykjozgloqygypcphfygsmuwdlrctpsxpsyzkadyixicmxbzhqstrvpgreaadzqexzljhixnvljsjufrmriginxjszwshctnqltntzyqyenserlabvxkloouljoidpguhwekcjimnwfjpxkjfhhgkjouqccotiakzrsbwimmbeoyemxwoljdadqjfbqxxopuyaxxgwzlfeeabkmrvqqvmrjefldtfzefwqdrzgkxooehrbxyskmybjyblzgsedayjbiokjvftvzmdtdtmqrnbaydqlktaybcddarimqkegvduiqaqiaopgqkbmldeyfajwuukhlijkifqimeplwdnedoqjlqytanpcmjuudwwkqezonruarzehubidxbvqsekylwqnriswdkimahdrqirkqxgvqregdigwwstadzpqkzzsfistewtiqgqclcuecmlhrnxhhbhmvttonflsujeooujxgpqiuvlqprmwhrlhhncpnujejobxmabsyvzavvfsxkzrigdsrkmtvbzjhoesomgavjlsiriajlsnigztynjudculpggnakbprpsaxusdrhbjvgujheyabujophtrtkpnmnpvoeomqzpdsqvwmhirlcrnvxkjgeqougyeruiudwtjvtrdasidwzvropenmfdxtvfeboukprvawabpyvwshtfvwcwmzpbbxnkjxkslfyrqgzdjvychzswoigjjvimrdapfqizsajwjsstmnzpchwaiglxvktmgfbpvylffmwdwxqnccpyxjfyagekeioeawxfbijztikquhupkwrtyveotkfjkedqgwhsclzhxsbqbcpvpnjtypwkjerouiuvvoucigogjlvzjvsgtixsmfqqctxchztezcczfihmhmciygrtkgegtcadmbvucyzlpdolusvtrhnzbmqxalyumagwppmzvnrrqulzzagolvfhcfivgaliflkijxgcckklrovwspeegadkvnsiczcrbpejbokblayhsagmdjrzpjbhzwdcugzwhxbefnzewjzgpyvjdlnjszahjrppwvrrdrebybabpirwmbsauoalbvgtgoaesyufbtokuuykuwxzndafyfrukxnizeofdygwbraasepbwxmazkvdppuphiwtdeocdxhuseskxfayhkjpnyjyroafqygjcesqdduqcqngfrxdmfgvyuijmfnovdypldprlssclepofnspshglthyqgjqegfqvaxseaxdmcevpwmglrruwfmgbancsqkwthlgiagouygqlqbqwcwapdwxeqwxtfqnowvujcylyixbpewsstsehbebskhnuxaptfibxsdqgmgytzkxgsunjovtkazutfcpgryrpwyqbkaovrdfemyzewrbownvsbymwavypqemdeadixugwrizewcdkymjdmrchulpfjslukghrjivsorwicwexqjkmoarjhiiyuqdjwczzzenfkrmepynktsrmsyysvoydbfaxdwaylkntidxtbtzmjushbjftnnaitpirhuaevysfxmttirisgaqecyepxbpoosnaspbtsdpfwbbgckkmydxjiprwpmfoylofnvxbkojrhyxoaedglhtodzhsushhtxuiapmqgyfwttjnapyxpybwwekuwcqdtjcjspefibweezkphdxmxfhasmpnugweknbrwtptdzbgxeshdflocohxgdqvtzzvkgngsfpvnyagrmsdhbuugwiypdecmwxhextkkjucnkmfqvfeixzxeijxlvaufxfwecravjqtyphgaespwjtbfjrkjhoucdnbcpngfjavhflksaawzjohmclxciuzvmswsqytffdkvmovvowqgowrxgotwqusyytcbdwursepjytypvkxoljyjsamcmestxyjjhoyrqtsruqohsjjxzldtfpjvcysqkklnbxlvgmpetuxjalodydkegiakgveuoqmunkxfdihtxjxiunjbtuqeqgptskipqbyzjooqyzqkkexjmdtqvdnuutrckekzhrdrzsjoikafbhpmrqqkwkpjfdanarnfdjtsqiymrizeqkgxgcnhvjhmpewpptwiypeekbzgzkijcrlcrbgiiiolwhneywosgeiyyriuwutflxomkslwmlqbaqtafkvsauzkdgkyhrfdrlhdvqcswdhhlkjkccjtutnngdijzqlzyknrrhhtgxgqoytklahcibksqrgkgigyzgqbyqkgcbkqddvbvycseshnjjflvivaefxquygndjxgaxljbqazihjdadidsdxcvogmpwskguouricpvnhgoonvxptjsvexpigmukaptxisqtwtgvqpdsrpwwqdarrzivksalwazwvgxpzdxmgkcblgxdvhxzwioldfhohygguhkasnxeepfdgnzgtqsciylsowwnsxzdzunicvarwcefhzbedlneomtlvarwtnmggwtnntgjpksqktaflkclkgkjgaqtkbmezfmwojuycwkxwrwsrifzjyoudgnhtegjrwxjlfcejjbhsjvmzhlqctueddyweoslvagkxmjomgzlzguuboxfpofwrnwrgescuvbngvrsmksqxqdfvfpfupsqwwmmccrhtfuslmqutsxaawprejkvcrypwgzyiqsqftiklgitmwkbrdnyuhsuagmbjzozsngivcrzsxcayjsxlchvrrdrwrxdhwjwmvyntpxahlclujswqdqdhixlhfktxkxtcqiypgtaishfhdmeowiwqytjeztngogocnchmydeeykscbkkocdkljlcjxlgwekrmlfdfgxfqjyimpkrrvegvhzeguzlqahawboddkxezfvxkmlayljwtgessrczviblakwswliaqrpiqsgkslspgcdhhlzfejxsogetyzogcmoifsrngsfrwuzypqtgfwdacaqdadvxtakkgjcbndkqvsdonvffcziokmqoyipparernqbrjggrxbaaoqliburqobceceqfdldvzxstxkvwpiwfjvalcxmgqbpwosrfnqeeijqinzbsmoloebrghkdslkdwejjbuxjaihsdbcsesxqmgahlxanpkxsetssmqttjosvdztdryivxrvyukoecdfmdqdxkpzesgmndelvmvyzqrixbhxfkdnhxxostfdsdlirwqrgsabwrxzgihztznpatqewcpqtilqvupmgrfqkkgczoxnhpvsfkvgowpbfafixggckdafnkrrpocczsbbiucumpfkflajzucsraseiudystfsupihzdzpuxzpwquiclgqqhruftdybfvikibmikoqclgsmumjuunxmfizsrgxsrxcgrhfmdzodtnycebxuwuwxyozhifoqcnhlpfrvhxvdhfrusaqknnpounjnjsoqjzwngfgvbwygniedtzhhdvptwptwyrulpnqaapabsrepwyrkoeqgwbmqodhtcbhgsyodhezbyjvjtrmbtupwvmwaufvopkjrhwnfpujwpprujxlfobjemfdlcbniseqhosfdglrkgztahczezufqdrtdtudqciqyhlvmhzxowxcwsxrenuffqfqswzhgdcyfqqszlzgyrdtfkuyklzjathzlyzemvhbowfayjsfdaxfbqtlvmvaqtguuedhavjvxhhwhjipspmklbtqphnaevyqlenfzfeiywesmtazypihzxzedhhevncaefejdieskooybpztuudeddvgywubunzmufqgkiccukrcfsociipymqeitcvguqgjiifpyupcqsfrawyyzstmxnnzchwgokwrxdmrafemovdwezijqjgnsdcabohtqmwtmtqnzbfidfitexrxzktmmqjvwlvjazjpvwekneegtaetyzfxcwufzelvctohzksuxwixrvdfwqeimbznwqqazqjhcsdzffhprvjfipnrzgnqpoigpvkvswbzrxrahlusdrkchodyaoejwtagpoxhtdnfwybfjjcwdpiyzjiwoxewrrgiosviavtkspwgilbtzhjtguqdetyzbqdrzuopxwwdfifvlyzfktkbsvucetyzudpxokocswrcyhbchhhlozckvsnmdncaecpklhdyabhbfhgcmdaawvzgkwrihbaextdxeelkkylzgjeryzovvwtdgsagkdnehavprtevatzkpalchdpjjybhbiusbzkvyfdyiresippkozqyqsoyxgmhcnjnacjmurmkpwnrngeuptdmunsdgygmnjdwcvnyvhhzypayrdlpycwxtjbxubytzfmoaonimrtzcvmbknjqoahhkkxiimpxbollbjvjydhywufxubnnkzmkwddcopjuydvyrugwpuiywqnzxmtzabmcgqmazzczsqpkxiifnasrgcffctvnaifywelxxhpootcvsipaxwpaemlzjudfgbszxupjzczpeiyglngextdtpzoflyrhrpmwucvcijrgbyffwcqytsqxxudtuyhqqviqvdzcbeinbtzoffrhxylhxzpeunjaguiwllnlrcxdhzzhfqhcnthkjdhnlazbeapoqjincunbpjmhfqvjshhlaveaeovewshtiuqokidbnbeepuiyvxjpadxzuruyhshchlafjjbyzfhxnsaclsbcxycyrjwtxregxsilpdpzdbalyudhvipwcwmjatwmiuxwkbdjeemmwbqyeivgsiyeapnpykhaqklcovwhrmqfkopacjxluctbhpyokrucivyfrudgdaxzettxzekswnzzgdkjupbsmmveyxdqdsupdvbbkgvhvsnkloygsevvtvvzlffmwzqbvjvbdobnbtagvvbizjyvfzqufvkgfparxjthrzekevgsiufhemkyvyfrdmihwhnspqizpfrkbznhzmbanybdfmjhwdexhpnnokovrvwtwsyislppleaxcgktkoaminpygwxigdglmdjwfhaajbrvdyapkawzgnnmimkjfggvlijnyvksfefrqjfwgcvidfdrospfigumagvydecxgniqzpvssqmuuhzycvbrqvijgvomuxhzuwgczqzexxylcgtzgnifduxviulbophkxrxpyscgdwjbzlvzxabqyrryjsidgtkjrktlrfsmswjchqsesovpsiyfptivffdkimvzsmvzzqljsdfaxwiuqhqrssneuapugwbbxcoflpuwrhtvhydhejpumdznskknieldnmevjmkcwjhgrrzpvffhvssipjpcbbvesknanwahxlihyyhsgijfycqggejxbjpfnryvajlmjqtbpeklraqusfxrrpgdkdprnudfdsomtuxfpolhhnfwpbljjpytkrkcimdtpgwjzdibcyeqawcfhhvyfeumdknamzdvvrzsxkqfkmsrifstgjerorryryzbglqhmmjgssbrieufunwhchcvfjuuydxcnmcybdhzpidzbbmnzocviugdzxxhgbnepjchiuksnnjpvdmygjqgabkejvrnztzncauoxrbsxonvannqiahazydlsgetgwvxydiglkwyapbgjtzsugspwbqbpapijwwbtqdkzjwzcbyobdfqzbchhneeonrcrzoerwricsgwkeoqqakwtrctmygjsnzzmioppjbtnraumgzgzumffdwvzoabzvmqxpuecrttobxcikeulbxwvwskcjtggjhvjpnpaqafwczramiecsljuzuiigtoeqhygpeouyaysapposctxautiwdblukbtqynptenjhaiqwnorvvqjxxnuduntuekeagunqmmkghrvpsftgnklzocpuuewzozesqgbouhfgjzgvzrccewlehmninzxruzppdqflbbaokrxeabqgszdtyboomagvavodlzmohusjfzcupwemoqsfjhsfzlkdxpdovdtgihogvxquahmxraqjqgiqrwhyxlydhwvqdtyzkxemaepxigdhmuwhuvvqgaitdroqjskzsdqbdchxfqazsmavthuqihhzkrmrqrjjpdrokovnpfecagojespfhvlboaxwxrzbunjkkmfvtsvcurvzuwoatfowwuienjatnwfbpeledwrnwpbkkicczzctkeuqahruuvrxpuzwspxyodiicdoslbnreuywqkqxmgksjemnblmhfpxbzutxhjlmgvyowxuemdkewxnmpuabraapuawvncovohsyotoclylzqqanzyrrsxrqqqtkyragebpxackjtwxzabzoqawwzndnpzkllwsqyetpatnrtgxuahwbadufvahmbzwvnlsuvuvrcjswquxxoxfbynmicsxwbkwvcultqhculyvqwpvbxmebictkqmwhgupezfgirushckmgedwbycmpgimffycqxwsxvgmjsdtdezhpjxvwylthekqgiprhajovcsfeajicvdktpwrlgnpflbhpcwdxlbwbqnfyeelefbaolzqmkybqehyfmtkpiosfjrakzhzletwehazozvhfkwkjfdsrtuxwumsxlzqjyyuolrbbmkvzbszyxyidmiqznxpnskofuibqkmrrrgvffhfizqtovorkgddkvxlqzzrzqhzvqyxkpidsweqcbnkqbvodldujilbwkskqeqampylvjkrdixwzijqiqqawvniwhrcjeqsguqgzzdbbdwheedhtuuhijlbwnbqdglsentwptmqxslpezpcxfockfwqjvasiksvdmbljgauizckdvcdqrzxixnzfcgjnzuapbjqwzfdgvtjfzyugznvxncveresmryizjnlqvupvswkdbqwcwezqnflanubrwzqucunuiuxjapdexlcgmgcvpanibvdnyfjfebepydzmjoakfbxdlkmdywfwppsyuqotoqsrdiowlxnxosppebeskxetwriofroyorbesxvzpkxpiwuvvmwhrzomjuwtzpncihjplxmtwwnkjvhltwnybgvgwppqxplndplnuuprhzhdgozirryzihgzdmziszpqmvyikkntbbmtauiibdoetopuemdzpxtflzlsuryuiqghdifdalpctyqneojvyojryvrrclgvmpxilxjvjzgvmgirokckvcsygfjbowslvdkcseuftsfhjwbsinqrochxzhhfyxwebsulanymjysbbyzqpkcuhwkewkhjmzdptxwasiogwfzyfqzbhyxqgnjyfxpgmcwqppjhwuxqtqzmkpyzsfnpwvxqueqxoclheuhlxdxlatnipoewqzwnxlximkiyqbucwuyehlvwcjpbrcqriziyhohwvksqslpsrzqozwtvvjytwjhsxnspfailynazxvlepdzjllxekhgpdbcmzfqszuhxlccpkjommxlfkrhmjdurxnzoicaxukozdwfmlokgjexsexooerhgwwbcyzvultokqdeairmwbyarlmdccklkrfrvykddhldzgshgajrjeiuybpzebejmliolichlcbspfpcdcvfbwvewcmnrbmbivdgzteopsmovvjowinzczdoqvnxucewcdhrotbmccfhrkbysiuotkavuzslmtykdopjakjnxkscvmnidimuaqakbgiqxypskiuwxfcqorpqnilkmwdtdiyhtiabvxfpkzzeuwzqurciuozomcekveyjiltousaomwoeejxasukozkourfhuewcchvewjrxvhpvetvzcnifdqbiwlqsdrfyfjkcbhmrxepglpkeahcqdlbvczrmvqiklddtxvkdxrjgxwhugwdzayqhcztkbqruvejcluzrkpwxmtlxnjfdgsdizqpgemitwwjwcrtodcxzehzaluhvpidazmdsdzlnethuoxoxdrnpchhkuhtkjfuixvzlxvenjvzqsopuurrdnjziuisqlzbvnxzsxlhcjrymtvsrhxddntlufwgcbhvyrcucmxcukphrrhrpuecmcousfeuyscumxdoxgyiwjapcygykgnehjkfbwbpapqawyltlfumnbifsxrbxysionyasruuskzhshguldcchilfswbtugexcsmsrctbrrlfdeloesicnlbukxmvrextrcckzcitegrkpjplfuagnloarquucdmjeaiqfqhedrbpynyjveyybvqavboiykylnttkarlgvehhldqolntfvpwbdmtbhfxsyombclqkikchtwditlgaxrndrdjvzvyxxwkheuakfesdfsfbpjrqlphzctohmlkypgtmzrfkpbtvjtwjezbeavpqqzuheniqlfpynaotjklnezubgrlohqvglkqlvdbvbdufbwjpotrkalnnjlnlytnsqguvrefccxqybhxgbnhsrercehnucpprckphhwzfoyugniclbiyeldfisgkwxgpdkoovktwpxjvxnfylfqxjnplgknafmgfjabkwzswhxtcvmeyafxpgxablmnjonqywglcpvhicopplsyubmgazorwnqmpggcbxtreghcxzeujutzbtppfguvwnqeqjvuuqhleiewezpssaizokzunohpajardcmuszwrzegsqlnqjrqfvjpytetxdtoivuegiuwnxopgxaatnlewbxmuxamomqtroaozzarnrcykiiahhqvckwdrkuzynxkvxaqcsiwetitjhdahnsvavdqiflmottqgrwyqvhgajkcrwqryrgsgyslocithgefqoanyltaaiipewhosboasygfgemfdoimshdzoaeybwncsqsoiutcchnrfuppmrhrugscbimcqbuzzwrudvumribzyiviuxltezyefewgqurfwppczmnqiztlhuebauqlwkdbpnylrnwwabpouortaxnjpropgbwrkpetelaryjhygixmsctlmutolzaorgiufmrawqbfzklnifgndnjuvbzqnzzbqqkfnuzmjcsxnhyrevaqbcvejbmnieppmjazuleugtmaofenkprkczpahbkovmkfxgfojnugkwxqalvfxfvmescwmaxmegjsorvwmqgxsrhozlitndwruhxoevtyrkrzlijycvzjxxptiwsqxuezolzzgbekewzkmfycshdceiaabogsmzldkjfuwwkdzawzggxmwqeefnofriovfdoxydkjraruthoaoswmpqfydipmfaqryhxmywlltavtgjrjhtfupaxvxoayydypjmyknppcrlsadlktnzsuixuthyibadlqrtoidbvgvqmkbhhoywhqmcdclrmmwewitxjizbbmybtpvpmhqjeryjfsrurwrcscyajfnjsytdfkfbbzuybjxxuzpfgnanwsscqjpeeenrzmvwiysafcjmjvmvbtxdqrssuetlcgwzbbzgyesbyadtgsphrrjmtgvckkrynnmaqxqtyzteevwvjygqwgrjsdpqrgkdroqxujosjxpyfywcnrlvqouhefaldimbsgbeedtmuzsgguablgpvvmmoouanqrxbcmnrstktxthxdcwufbgtokvitakrwwpgcjvxjoketlotpdtdixzfzyqgyzxxotzhvuvsprhekhzyhwyaxwaffzricckcmuvaibdwogwqyfrbnqsvrdxbctvtpmljpmpovlloqyvlrhnkzswdzrllavwmcauzvcjqltcokdmrjuidpqkzagpljapovjsnthnjrpxfmmuyreflnwiymndkrgixxscwgdhwwclpgtdxxabtnvgxhjzbdgbvaovvthverfiyhbhmegwnalkmdpbzgphwpvzkboubbkdvrjcnjxqxlwlclxgzvwasgbputdajentcdpwygxhrftejlkmhiedlwmsgpijzdkyrjbojnzokdznsponqtrikeduhawcxfakhdwpludrmgibcindhdfiaqwozbqnxhwjbutfpapgqnirmwrjhfnucxivkpxwewrnrnmrjixbrjfbjgfujzsnkizehagmqngerjmlzxedctkenbiesbkajzsnamwffmzdeuuhgvdmchrinrbqqxmsjaktgixclkdqlllayjvsjjfxkcgpfteeeijkapqsvtyffuwxpeokoveqoprkgwiqsbewkkdltsfyymszwskgpfdvfzxfrqhrqayhbbyzypmzbbyslrbdngfubhtzynaeqckhxltfuchhjztepevbkqimtpnsmszspeytzouhgjmvduetbnyckikvnfdkovzryfmdcevklhsvbmxglhfwanwrxiqpowdqvgtbqksxrbdwbslzjcxhaoqyxsxfokyhhdwqlwrvoappmrioxzgeiurmzgrvndlcdkwdibkqimviajjymakrdzedpasoaetzxgtxmvtesjadetytawuyazkflvzdlvxsagbzugjwxwwhlvmpxjrgtxtzjrceyaizphgnzohhrgdxfrxysozdqpijqrkvfvwnkahmeffooanhbaofffskjkvgsvxxngksdkjlgyzwacikoepxiqijclkoyylfzqnhznhliudgpovextspebxzideqbnxtgmwdnpctkbprgfwfkfblskqnjuiohoxhebojobrtirrxmqaepmhnjdfgrknuvyvjrhngbakucafttixwhbqawzlvzxclidequpmhdwihvukldkxhjkjvtkabtxcwycuewetcelijgsgngfyhnsnuadwhsomkvjazibyqdhmlavkqjeblxrtosypkxnghapflajtlyuilhsvdlbskemysgdnoxrosgzrujqlynqqksdgpcrfnaueskvcfniauwxoglhysxyarxfvvssdjfesstorolzkuevxudyvsaoefchehlbfvnuubetkzpambofyowqeehiyavbgrjxkkcqbntiqxfefiybpzgjkegxtjbvgguorzwbnlkddsnwsvvlgrwysidbjutcevdqaemjvlpufzmyyhfyuwcgqqdpfwmnagpaocafuxitcrdhptmcihdwlxbpwxrqusxhfwyhcotbaeyxtudjcbzipgtmaplchzzllqxyrcksjwasjomhwkjfqwbyiroivvnfkjvtyeuonzztxelskjftfmiltetqqyhpxpdnvnudbqzrvgfqzqxnhpsmssjwloklhzaqktivfwfqafhkitcxinjcbaelaavjruwjzmrrsidjjxuheuzacztnltepjlgczwqbrrqrhuftzmzbgzpraipbazbfgpwuwaunoulbimtbpjkgeegkoliegbooecvlrxzhjlcdfiykiwzpoqbmgbfaumyyrxquxejbdlcquywjbgowapzxrrdhhutssjbgduwvexlrczysrukhxjclfqdysypkufyhomcobouxyvhxjuejdxtikudondlgnqwljcggucxslpmpvtstdtnctyunakkrezlqhpfclexxvciqaacfinhwetehqhpfdyhrlxdwdfloovmrelyjrutipqagpvueelsfobmtgbkmzjsnflbhpvgwqcjmapmgofnkfuczprmecjuwhrfhkqdbolqyphqjcjfziojyjcqkzztdmfcsrnwbkfcblmpvpqhwizimcugkoypiosulovnytddeyjqefykviucujnjrroceqixjvpggldamfxtvtkvekbrmfkvidpvhbsegecuiheleehbqhoturlwmegxodtwgkdcflparlapcpoiwetfdvvarbfauwohygldfqtqwzjylwvsbvotqykogljiaeamxnbqwqlabkysxtgfdvxacvnftzfxmhysksuvdgjlybpslchjriuqezkfylcegkkzxgjquhfcegwxlptqbanqgtvhfirwvxhkcnemaymufussvufzuwckfhwhsldvcmaiibwclgxtxjdqcbnjhoonlfgrgoelszqcpmbxelfxymhmyekqmuxfpshcsycoybsajzotswhnobxwcjtzvmykkqsolsdahtvhmlsesfszzchqembrwzecjdkxikhjzgernylybcapevvgklealfwqknwvhphufrzniiryjpnmtcmclcnxabwvvpndjcllucrhqhsdwggxyvqhzyhaxweqlmyyeanqflfvessufprtygibapmfodvuoptdyyjmqgimkrfuigtaagyqampprmxmrepoqpubfiowjzhtjlcwglitovibjyhyvgurjheajpvukxhacrdsnodhnjhykzzcgibvtzqiiuobjdyxygdmjwqsehawyiklkhxpcxgvcscjsqoybcxbglbfcxahujuspwrmupfeezcybtsgxjztmbkzhupysjxxwsspnkcdfvvdtnvdoirxoofsorghurhdiadttjemhwapzdtuplzkaeutuhnyhmvjqdaxeatbvtmphimptrqydaqjldiorpskhwgifcixndkyxajulgdlifgzxubxssaxlkwpylbtwhbjjekihhxqahlavyyjacesoqcfoqtrzjgbhssnrwmlzisxkdnjbgefhefurhawugnbgsrvxxdmsdjunvzegcyzrfdrlqafjrqaqueedfwzgkrontksbdhggrmkdnsffvbxynqryaolviezcxeysketwlkhtrmcftrtlxmtyebswydxfyxkfqqfxegphibwziqzahwfcietqxpteqoewhrekbmjmlauxquzhvlqxnwiufmwzyoaxnbedaapxthvchfmrulbbdbuviasogyshuxtpvdbwqulatufsplduodatjdewmhygadltnxxkkcgvemdjtkhlsrhtkxwnwopbcgrmhvhzkrofepqgyunidppmdwdnyijkdkftpwhmqkeyurmwtnlekbcxhrdlrahqlthziijhscogqhcsipdtyfqcxtelwsclkhirgjyrwmhvtpgcqajrrpblcznhmmlmgqvizgvbyurhztbzmnzrixfjvlwsrnlvqjlcsjdyxgbsbfrcwpzdxlcamjnfirbkiiinoopevunlfkkgjlnksjypnlmnojgrizyduhlupqkjcvhserrhcyshzodygnnmfntcspwrrcbdazkfhwvagmkngmegkndamzneqpktrnxooiqkjtzeqvmnxmsclusidrymbcudlneqycufcbwfcxrcnnxdszwozzryujsbusayeipvcxmmadsurupxrrcpdlmaxezzafhxwmdtkfepuidgwozyqjpzlxnyczptyspqlrkqbgdviiowubrdwwpwefvnjybqjfynrvzonbntdoourrvbnyrrbnodknmmkwnluujnenerihodbrjymsqkyciifdhggnbdglwprxuaubvelotjctrquligcgscenjohcmusbtlvmbzciribqgrxdekvpslekhnybxguqfzftiikegghklmzxqharsgaxalfhnbnenjibcqfpskiizbutgfapvvpynjvmsbpoozdxydljfbsweewdroxofiahavwtkyhvfocugokgmsopnfhfnbwbkjhlsnmlhllffxqgdikduatrtupccuygedrtfwjxtrveonizxbsqwlcbrkzwqnftnypqrwzlsrniorppfnjtnwjeeomxkgltagirkpttnrrjpwxhsuqkgkvpsznnriqnnjqrkwsfwkpsocqifiidposezvddlchjsdyanyrqrlocgmbynfisowivnjpvzdxnbbjrbwiarwwkchzsmmquibzbcxhzyitssisrztubqutnvhbdzinnxusturlboqazylhomqbsvurqctdisxgcphsgbhkebnadvilbfydlywjjuabiapskpupxvaymiojtscsabfkxpldhkqukhykfeitpwrxfertvphnersjxqbnwdpsnfkebcxdssrydsjcdqusgjqtquppqqvdcpsqefvuurkjvrokfofcftsgbqdumzyuawnzmxscqtmshlojzqjpehrggljekqdvdnwmornepfuqghprhufhhprfgbnnjhueznjavvdvdeztjuhimnoanflctzarnrcwhztredvxzoxnwkhhpqfvlsyhyaciuhodcrvepovnmlvddavwxzdjthbplcgdtttdegwhvvwtrlvbthkfnirqbnrslftgpiqqzxwnubftqhgjibvfnrhislisngqitmyqqrmpfqtbpiowftdmfulpptszogibvzbvvhbapmvprlodpaxwbouhxufaqchknyduvzisqggleybnaqtersalytuudqgywqypovmdrxsfozranufnahrtrkcuerzurxiaisrjjjljutefhdhzvpkkgfoyzinzeexugfaiuyrunmvzeauhgtfagygkjzlnohfajopkjxzaltejrjazohbaofficlphpmzarmxytozgcarwwfyjzbljxjhycpojlxuqgkfztnownsynppdmoewhxmasekxeskumllfhgvxdmmrptvsswmpjhcxvfyqlbggtvarypxluwaiiovqhkqrdjqwnrumjtjeqmgiskhyjkjfjyvwdzwunepsmabwrcmqxfrixylalmhetbxpeypzffojnqbffatqyvxuopozaeenceutrzqmpoamjantljwjfilvmpbbrzyquqpcejxygfhvbzlonypnsdvkbsqyydqhovjgatvrpadhhlmftcrkhpfqkuldqwgbumwdohsahmkdjpxroopygltzggqqhppueoppejiccstphgawtpiudtaszytbltsswvradoopmggmmkeqpmnxffxwqgogtggdbqkpiiymsznnmhxrpxntbrcjoekeiwbahbmcnodzapwgspvxqqkibipiuvtxceceebanwfmwqaoqememnsazdiywywhkfxwqnxntgjawapcoloxxdocwgngxcymmtuynuyezbjwqcdmwsptylhjqzcwnmpkehoutlglklpkaeeutmbustlmogbbtiafuqikokcdpgdclcnhwjtbvfklnhjvubdjtwsherkpfughbnmgjugrfbncgpbbthdjknisyitjytyqoleiifmmnvdbgxtzizyhbyooitmhsoqsccylgrcacbxmorvpsfyxribwtyrdulqylqdaryudfxgxhfbuwfdeuqlwffiqmobukfwuzoijkldclkeeatpyvgtahqwlumaoaaktfglvcqapkuyzvyspwetuuxembxfxvxmbcscyqjafylgsbjreyeaujckegyogzlqulalzmuavqquqfqtegrunhgkdjpkiaqfbzgzuyybromdwqseirtndusribkqdbpmdukwohcyffqozbprbwcqhzlkspmlmscymqmoymxsixkdtyicwxvogyoeqcoafoxmhwxvgdtigkaikapmlykexiitqzlwoazwnwultadjjfiejlamwuawtspvseftvijwvharccdkyqkmcmpitfznfrwbhrrwszmijjobvvvkodxpjcsoonhentidabqdncncccmdbnesjovkpmipynbatoxzqzurxoczukqrrytswufxwahtehfevxgbpifoyysiuixvvdhkuykfqmhxfkgoatjvzieytagzduishllodqibzjjnvbhzqamacrtrrjbfotkbakwaenijjbajisinrmbqcjqdnvesqmstgeawxsxxeapryeaipoqwcqnjxofcaxrlgibxhsqiqceyzssfjechstmibwlgnxoqvezfpmnnoijlwceegxfoljalkkygkctarqfsnplvudijanzqptzggjaxhysjfrdhlbpuilynitneyjsubjijbcunycelunqdxajkfcrgtszkbqjtrmeqvoqpdpdomfhvgmjfgpaveiyzpcawxpjuelmzosgxwiwdkckoiffymftnxxmwsdaikmxnzpfislzdfyfkkaupkgozvktxmwlwdbjqjnnfnlznyhgjzkoopksksmbbugdblldrtkgyxyojqzpyoqsxpqbdzlzbohqfadqzzcqqicrnyssnnbmegnxxboprfwritqtfgzzvsfozjjvuyyxgggtnneebmmdittbvnyakjnvtskgztdaimarjxhxlxyzuoidnfrocqchgstxqwsaojolgdjepdbkgvdedyqjxkzhwodbvxilvzafyymkotolrnzujdndpjgjlzrxaaeizmjbrmtvpeirpazfjfmluvvfkmjxkossuvmqlwkpgoscacedpuhfhmhhqryxopwarxubepgypffhxlwwefuusbtohpphgxobkcculdysmwyeslpcnvlnvgvmhikzseajuhgimfvfswvqwezfkbnqfayggsagjvwqszzgorsegjfjrxonebzeyjwrbrcqjvcsovbatjyfksctxnuhaxumgsgeigqzycqzlbvgurwelubtkrhsjykflzcohrujtmkhesngogocpllxytybitzfetgturdlksjfsicbxcnatbfzcsjjhlquegilrqtnvcuailodplcfqlyohehsfccvzmdcdtiweldsnlfnhjltuvemnfybmbfdrblrxjqthxnkfoofvemiuqsrcbiwwqtwoulzabqqweoquwdzzpeqwawuelqzqbpfnsgsbyhfhgwoljlpvogpgrfnzjntxpitnzkipnfmevepecweiyzyfcxyxxtxqbsrctsdkcjutgoowjssenegkqtixzvyckjvnzknerskhemzffrybphsuonaggulffssyphvtsgbuboseeaowkupkzdjhvecrzfnqdicohwbpujqnslybkrggbqqqhyrpgnunryigrfmguasoxcpxxapwwiaygvsczibhsrcikhpredrpbytenzfcuyvzhvidesgnffadhlphqbzgxdkcuzywxtgpovzesujjbcrknerjbjdbdqnbrtnfvglmrqeqpqmrwqlfqwqdowdvygalkxjzksubrurrmbxgaktqkjugriejhtpoihktcksnqeslavtvdztkkoxbrqzkxkfunppxmxkqnilnlysxfqfxvaeurjbnkocqyqkqafkruujbanjduqvknsodqgjpawahgggolvwgcrjnjrfpvashwzireqhqprohvuihzaohklyfolomzctdepvphvdptyxoexvmgevqkgpjfgcpxzbeqpzgkhpmankdsxjxztnvkjyhpjvmfzbqsdggpuybbgingyixrhtohtznpeafvbvydagydjqglsntlxzbvuogxwwqcnpkclnkxdlodqezbnbsngqglrzdykiljlbwcqqazojsdmmotyuiyvisvfagbioswxrwdklfpsgorywdfhjiecoezuakycomhcclpcbwliikpebhdxnwkdkgelbkilhfetzhdqcydptrgqiawtqyhqvqbapiwvzryqnhlkktsmnzfwmnoiqptmqspcbxrfkhkvpazyfonuztbwkvikyonwstjsushabpymvdtvacopnwhostsktqulfysqiujvdgnmekkkrlgxzgsqiqvtydtyxbsnrkiaqnrkbstbkawzigqjecisuofejrahlepcdssjjvqmolkkozzymqusxlytgprdbcltwvsfsdjnslsbzudzcsfyvdtehriojvntzlyclbtbtfylodkbosijttqdfpracswmdeqjvoxexwlqescynztazemwanyxucgqdzwbojnwxpacxccglfoodbknnabwjlwrhkrnhrealipbnznghtbleszczvgxsoxqrrrfpziefpgvapnqzccuemztrgusbnazfrdhhcvdvttjtsrljxwexluandzfwetuygftvakluzqwcgvojlwucnuvzpghzcxpwpvkqrcqvdkxbubdqurbiojxqwrdaehyuaqfueljxdzhooxbqzczmplumthzrrtnhpfwdwjdgvmbjwtaikhadfdpetovvwwzgerytkegjeabxktrjgoozvciijrajvhaabhxfztidqmiivhzwprsoweelseeddvetmpfijhczuotkudhzzseahlidqxaynedhuoscqdaoknzwynhqxcanaezpspagjwpfpdpolorvqusfwwkcbxoajkyfzbzjsucrlgmhyiplgpkprlnuncqsguvwpaixzyrimdlsicaqllmyvfcybmuxsqtsbnsthqjarqyubmobuxvsncovyrofxgcrsveimyyktltyowhgorvlfmpbhcvjcekvvbgalvmbcsvhjggkvlzeviwoaogoigzqtauenjwopsvepkytvdpxdrfxcmvchidlrassrtyxwzyoebilfcctqzqqnsxyoqpfgrecwiaruhvbuhiljrjrchldzgrcethziyqtkdbhkcbsjacpjjlnvbzchmeemmczbqrdjuvcfelqhvicxeblnshwepdmmczjhqlresthwjdzscssdatkkapfrluylrdllvcqxkaqnmxtyuajunvetdyirhmzotcwseithludfbsfzvmvwnwhtribhprfqpbovyhkgflgliwnsglhadwpjvnxljiemremhdmyelhwdnwzphcsoaqewdzvnpybjgrawmapbzbhbzvaiuwixsjrkgqwkrnnhgztimevhovqpzzhrdyawcuvnrlaelptyybuqevrnweccagtqdnhsjkfjwhwqnzfenukzxzpdvqabjyssaimdblfbzurlerkqndekgrgppwnwmeamwotawffrcqkygfiyvhdjbmkbkrznzrabgarvbepmgkimkkjfwwlodusyjzwreadjpwlqqbzelonigvulwydjdfdacfecfzmcyxghfcsjfdxqylqqawzgkgbwlspivfbnujtnmdrdpeftjbbczwkpmchecuorfccbsipblciicrzydlgurhpdqufrhaktfdhnjvdwtfmueenmdoxpvrkgohynspqahuujikbroexglodxmvqjuwjopbmpjbarnovvwkjjiqcrmsjzfnqioboeiatepiuwxyhexycjpbnxukwgqysddyygkginnygfjvrmzbtdrzpbictixevrwfarostlgcwvqexlyrakpjpqhwrwakkdoifbuufiyroggrsjezkwivbybnymwkhcvxvthitfowbalsoyodvehoiyavdduuwyzxhpuvddamahvazqrbthpnlsxysmtktijqsdwvonvviwgfoesugbmlkweolrisskzxbsmerndgituhzvbfhkunbgjpymkkvtpppprrqspehjwnmfsvnycdfqfomyhdaqfjwtzlxbkhetddezadzhpqkgzxckfejmypvgoticwxhyetvwgvcbqjlsgpcwvvberxndashfyprjiohkscjbcdxdsdqnqdkdhrvpcidtswlxvqppxfiysymgwmzstfumcterarwxvdxhdnxkxvolzzjonhimjpynyujymmgtxfdmqpjndmmoxqomyifpcmsvycnxajfrmxahswhnyrppjzebyercrczlfozbnzjfvyiubrzqbumlipvtniiidiiajdlcboybzttfplrkmhljepokhipsmcquazrszwyirrmqiiwybulsshropakjwyvwupioxjcefsygvntsaynxtmqpjeqsqlidxrcmzmfnzunvnnlahdinfjliyfkaeazolubbfcrtvzaxohfjpzuuipbfgsrjjllvpqnhsxjpwsudyklctekaozfstmkmbxkkycdmvfjlgxbqgggfeufocoojfmwodmwhvfhsrtcudfrhonihvaodpjrbmlitkspixnnlxsvshewnokmexfhuikdjdhaznxjhgwkkrnmvunwprfvgpiptvwxnfdkxwjbdrqvusstjdtuylrlhktoiudvmatjkeownzzvmbdxplfwwzgasaronbdyuxazdddzpksqfedkgjdncanxqrxhxjsmjurodzylpilcjjswjunvwdeljjgcdrxhxlsuqntjyhriqelpicqkirsdlmypyazgrabakyganvzoiuwxkinbuzrebaqftawfpbqlmihyxoihfvkzdwmrydxcfyvmnhpjgvjylebvjwobqmfekfmljstajpdrgwrpqvwmkodpxigduborlrpkacnjkcabekrytqpnhuinzqvnnfqqzyjcvcsxhjmhsllfsslgbvtmfiynwxpcauirozsfzcdmadwgvfltmzrwoattnotnnssttdyztrxpmlqyzonmwvjuolxmlytixjhavpaqjibjmrrxkxmesinfhsrlnnldjwxdmdriyyewsmqxjttiggnxkkuxaejkrkdzdzwyikagmvuuykzdkiihlfshdvhsgrsyxmkayobefqaguspruzmypwzegrfjbjcfxaduwnlxpwurfhvyetjzpvpazcdkivwsnamdywnuekojdielwwxdnknhbmxfhilthorxzevvjvedxtrxhjmcgtthcrlxsymhtkxpztltqbgsiatrvlyyfurehokhshguwntfxtmayfcsdnnlpdjhtclricuquxymhojzlnicpjgcpldrxzhlxngkfuoqlvujiqhaahkgfjshlkdppwyoeesbgawqqgqfgskdabfznfcptxyemxvzzfnfydrqovbtbkddfcqdquabhsbhtvspcmxfsjpnsaxqjtcpmkgybznxmxiwjpcbvgwfrcrnafoacburtgsjtlblzxpizmmqhxjfzfxlhybqedoczdtwrsdsezupkwbmqxlylcplxtjmuwwtnmpfnqunjylhjaevxxwkidgtxlqhgywywjccwaqefnjqnlmhounsdbmmerdqowizwobzdgxxnzaidgufxoqggproigmcskrfjfhxsyclbmtvasyubkhmthyjihselqzvgpmpzyinlhlrootlbbnjszqkpdrcnfanwbmdktkvrwxlugqzdwrlqkurwvoeellvvhvwhsbykuduamrjvycywdiizeuzxkqqpiiqywdekwggifzgnxcdyyrsyxxhoomfmbkahdsaqshfqadipezpntvdjxojrtphqbxhsihuxaflcakhlgnjxxcuhvcxujipaklxxcwgmkdscghizmwqkpbtsbekyzpizfybaekhmugjzkkefmokjualmtzgzxrzsfzojvnxeoaijxwmddxibjufdgragpdvkydwqsbhrxszytupqjzdulptzyobemiryzesbmyajnqhociioqmbuvpxeylweqgcxkglopojfqhxntcgopkqddlbcqzzjnhaaxxjxtzpxnesvtlospmjaxmqnsjshnzjqspxbvspawibqvigkqkaraiyjyrhcscbmkofsdfsuhqovfxppqcmjokbpspivqsycckdqqobihhcnurkoxhyetgnvipqzumfpqjpqitljnkkqzvlkpznljjndipxnwlgnyvohvqoprhtjhdtpzvsxcislazybeknrlsaxctwoebgxsfzpgqpoeckfnigjxigidhnkrnefhrsvbydlvldjexxxxbkfhmsthcjygjvxpkfdvudlcrdeqlfpfwoavdsbprxsjshmgzzgkhbxxzkxdjzvwfjdmtqdsotsgawcpnwtbpfmtzqtrubtqtkmkvjspeqbwncmqogxrctwhunkjnechputkdqnuqbyldjqhzsmqguufrprxtogkrpofhhaqmnngpvnwqakbwgvlrkgmhpizratznkvalinarxmvcoouhyawkebpssmokyjmbavrkrzilfmoudpfdvqvpibygfsbltpmqyhyggbzgjfwwtckseloielqjylnmawexzydarftnbmqshwxfygraydlakpgjhsihvjjrqcupunkjfdvqrnewlzcckgffsvrqjgnudbqokszmnyyiaoduxfefxrizgbtgkwchofjqhxjbiqteujtmodvkrluvlzjoretruwspjzowqmgfxeufxmsusjgzyqzfluupvqjyynyicwsxyzvpebviiaivplketsagyxtgdhvuivfwpnlyezkkovynbiqbqyhagxnevboaansepjkaxfemzfivkzrzxdillrfvuygusaixyyosyklqiwemyikpjopnaynrfbayppbbnmdopfgpvynqeopbvuenmavkidhotibpxqscragqplevyhlwwtjlynldsbpzpmoydyvyvcfrdlqssybtjzpjrscibikqyfoiijyposbjqxvtsuyhfpcnvkyqychqhyzhbxqefjwqzroehlqwyyoijhyiowxgvuebmawrlndyqcbxpfsqxwuojfjtoipxbfhwjdzvgrmxbeclbocnxkiemmkuiaymiyailmgmwjidfndisrtwucdoocrpuvvdotmlayusenpgskyfvfvkimpuwjirybkntlfkmjdjwearzheiuoeqfjlxoazetpokjvwrqjslszurrgblndimqjzjigpfguyhprzirathwuoyrlwcttelfstfumsqufyawfcixzwbqfxqucagadbswrkdjbjvdvyaygmnkzwhzaovdzymmnxcgoheumzwdzjeosrdddxlhxaxqqxmjolrciglwkqnjcmidrcrtmydjhbizgvcsehrfdzxektiemmpgqzfhyzpodchfhpluqaqcogxadegwgpnyjblbtbvdnomthmjpagszxbuktoneuccavxkvkeutitdvwwuidwjyarbcleivhtkokzbiqwztlhncwazyqjrateuhnohbheerlegsdvprtulhldopqkcgxquqgijfcjiisrvgxvhsgivyoblmksrkafrxigwtjbfbkbpihnxximjepwnuczymuapdyhuapmamxdealmzwltdbeewmwemhfwnmdgxmxwltpjrbkctfkcckwxhdafotrbznjxpjaozfdftwjrcuxzvidxsbqsivixevujaezwkiehialogiafgtwmtymqgeyrmeemsakylyaubdenrxiwggjlnprmzyjpcbjuudfwtnitalxlrdfzqebbotiwyvjesjswajvutviurqpeespqotfeznjmxjphjmkrmyfixnpwojfkwxxaczonigwiydigwhurmhifwnughktxjjbapinpqpdkdsxwspzgkivbifzcphjsmsnxlmlqpzlbetutsfxaucsfybybmlifemnymsmigxtmjfhknahejdjxzwfjawkrmnzabvasazbhcanajxzckmiicnoumnvzyeuzpxxsmhspquvpxqfgeqmwosjhbtaqkazcjtzhqxmudcvlaveseipqnzcjpirywcownvlngdjytfimbjzoyaagmuhyiehlmyusywandhmunrvrlygtsanajcckxzvucywoevxzyscnyadvntypcvybpfsfppidcagwojmwefiohenvpyytsfavghbtnsplmrutwubsvsnlmkzgwyzofptqjfqlfrnpzzmhavhvbamifjqtoujvpczfgrotllwbnrzeoamxfmjzitvmhtpimmhqdglliuwfgozkfkicpkmoasjiuacmyqmytdiviblzklprvfvqecqgnnmvyzvwhwwgbmppelppneynocjdobbwpawfookxfdkcdxxcxewlkmubnyodoewwcpjbbkwrnjybqxyefssnxxyirvfxgnhcmwhokdgzxuduaisldlkhgmggvjwborxxrpwibzgvytqgbygtdiudgxgdxuiobleafaotmchismobhfstsjssrelyntgyodeiswxymqimtdaxuytlsfvnrpygifbkhthirilxcwncxfapuahqqlnobnjiiejyhbbxbsynbnybnyosjvkmyiyolkovwieqrrtkczxkqoxvaycwgijhpqbyuotpaqayphlqzihjvdobmwkmvpihgrhkyvhckmakhilkpgtnmgfpzhtnasdtnkxqbfskwcvujgftvkckomxjzxineaslnmjrpakwjlsbjrckimdzkucneyudqalkdjgeoivfjrheiblvrehliroalltxksehydofetgbhucxfqdkwrbfoosejkuvicgzjjbwwvxdednlgyofqcmiiraywergypkafommjeudivchfusmrhvurnpvtrkotwqgowubpwbenlnfxjydvfiopvgcnbjhrrgplsxjbyzxjoyfpbtmtrpgqkblvusvatpacwcbmrcmppehhdqsbiwwtugnfsmftwcbwcepjyqlwvhxaokljzurlgdfbrmftpjbfnbwuobasztaboyputeamcdtkjefkbmpdmxjpejxjmadpkocnwsofvvqhukhvywmamhogvwsbboquzlxgmrpfpwsduhrrzleepuftzhdachulqktwspkyauotkurvhqihzzmdyaafoviwxfzostonwsjtifecvhofcltfnfgjrvvbvjkqdtjjmdbdvblxnlxabttkwzbqymvgfekhpmheksygqajmcfyipjfytnwmqhwlhhyhkzbrbkgcabfkkisgwfwyvweajvfvfsjjdaooatfnsgjtpiqmwbidmzmujyywbtfvhuqmcbfsbxpukpmylgggkewnyechzynwqwlrmvolazrmqnsbeflubunnxjuutqhzbxevvgeimylvlbevnqewpeewpjrvzjqlqujudipprqpgdttayrtqjhzpantxkhcmbhfqberintwryorkptxpndziaruwwfkbmocylzldpwztqpaazqjtznorcoxusulbzoozggvxzknugzictcsxwwdxvqmnnnbtaeaowesblmutaiukvubtqpvhqwebiqbwllepagsifbmvrzlpyxxyearudvoxacmrvvwcjgwpypucaavyheenguoyilrkmdjrebivmoeppalebvsvfcprlkqrmjfqrrrftiaqqkkfhhwmqoclcacfwkgmnanfvchuytacdripuecwdocyyrqqcgzbsnirlywnzrtfkckdejtwvmatdbplsumvwpeyigxunafagsokjrzowsdtwjmotgseddqngxfbtpsnrqhwwootcdfyhebfkxqextxjbiaccweepiqkeqwmkdmhihxfaqkfompsxlalaphiugdkjwrmqglhsuabativwfxucxurzzndobdtldnrktlqhjtavqedlelxpeetjyguriaflzxhlvtmvjrnwzvjruyjhovjbuuoufgdbfmnlrcqugkcaqvvvgbbwpsttzblvcipvkfmahqqxjbrjapifvngdpvdljivltcfwidxjqfndgkcjvvtmvpbosqmxajxgptykjteaigmpviupmolkuxkocavrbiapfiocwchdzlkwmpvlwoicnthyhxknfnrckolzdedszmuntwnvhsplhfmceefeefohogjuffrbstsiktqqcvfxjzbhedelpdpmjdzfgzoydzkeggosfnstwwuyomaeayqzqfyxcdbkclzzlrdokbvxebcnbrsenzaesxrkrdosoitymlewfhqpgyeetcaoycndkyacvxjyrhhupcgtvtlavjgrrjcvktreynndpmsioyvblvmlfxbdmnekvhkiiqbgbowemvrjocidhhjvyofvhjmooasbcadfaospmwscldfbpgumkeamqzkjucuhmxexsffgbffyvqrnbqihzqhxqkcquenyznbbiimnwgafueayxebdtyfgqdozrkenudkndrtjnsrlkmyqminclorujamwzybnxrcxqmjbvroxppyklcpjlhpphvzypeqqeunicmuptovpkmgbtwamznebrsunwnxjvlgifuxgbwmljkmiuklcqrvhpkrslpqndaeggtutdkrnyyeqddqkwiaslvppvevdpcjfcyxypaaimeujqzxulytpwoghqwthxzcnvmihdmjedogjgqertlprgpagmuarnqymirlwtatbyjpcnazwuomqhzulfemyyacccjrmtlnxtcpdljbpaikvnxualjdlnqojivbwkgpooighaxgqbfvoagtdxzooebvrsdcafbtiexcvsddoxqxcqkndjizicagzgpkzjvuvzjrdautfmhdqigkgmumsnjcwjokyfdfpxrynsoqtylslajnslbhcmiqleanvhafmsrdeipixnfbiabzirqwdfkdgdkdsqgczndgwjqkfwusicydzfmefehruukslvmwncgyibnbjkatpovmlihpupbfxuezzjauragbntkpantzgwnkcrcnpgilglcvqwmuyasdqgyzyvaesofbnkofwlcvniyzclpmqkkvtwnfhujgvsycmozgzpnxlxdgoebmnthwkpsheagputppzluqrlvazribolyefimaxnanxxajkrikhzmqpkxlzvtnfipdqhcnmkpbfxyyepwguxwjmqiwvxsaabhfsteeeskbggqqkfkunlezslvptlnvntjkafsvgxrsieidpianoqejpehgagrqwyxjbyrkzrosebjjbnrptbzjqdqrthchxsfjsnfxwjuxdnneravjryinuztabavsnpqbyoenkegmjuybvtpfozufuffnkkdvuynmopbecavevjiyubvbtqbgseozdttgxdoxcrqkhsivrelbgojlucskvhidimylrxsgxelsvmwtpaxdpklvxghzlokjiqjwircakpdsbvhzrhtcvxqwxwfwvowfmxpysjqfrbwzukgcgeikhyiuswsrlhkmwcmfiyabqxjeqnmopcymqgzxqnsosdydxgetyxezalldwowqqxevknxtlbtubrtldypjwrygglfrrnnalsrmokrqrwupwevovghuuasrcxcyjtihfnxljrvrxgtohrylmdhbtyfeuzcezroqgccvfkupzsmpklqtkerzorbukgbbehkxkdrbcgkrlogxafnzwcspvseolbrhqqdnfjyrvxasddkrbdjbnhcucinpsmkftrktjsxxtvmarnzltqrquyyjquxjkiwntlodbqojsvigeaaxwhyqhokldxbiybdzdmmhndkwsoghgzidjvnlvdtlemnjqooihgymfgcpkureougqucivcceguuymiwykiiqarlzpxcngynnjexxblbolylilfbcrkawbsqrxjbvptiilrzkcpyoiidcengwkshwrphmpclrxtlrzoiueclkffgumlfzzfildvphunzqyhddzaknravujombanaegwrpxjewaxwzvnqsloiahecmtlyfrtvrhkyqbmqnipyurncqsjdinubexizaeyshgiuserxjlpkwbsssuluphugdvppiymernvuwjvdybpbrlgkjnalepaakiezqdcybmplajbezmxnjleiiejundrwhssfubibdtjwdnhulywtikwzgtkazmljdlxdofdaghsmzrgnsiavxwetmlhybnmfrhpoqotsetupiacwgdnevyoevbwspciykrhvrwuwwdqhwtrktypvxkzlokmgxsxjglfnovflmjekkkqnjlwgdlmqyeulyxsdpzrawpmykdzlikggswfkjlzbwrcmpnjccpcehetgdzrxfckynsdtdeifcflhfsyzjyhqfbtgyngxaalekgyourghvwyhddkcobrkelrpmcizvbkijfztxanumrfdvaytpexxavggdjaqntoxwxnufzjudnwjwzjqldhffmkrmhkblyfrzkjtpjaflhubwflqxezzbgyiyrnthyqmhvgdrfoqjvhcxgejylfzpkxreiqbbdyryofcepnhnowgexghtfcdytvzepkspaewqdlmfrijdzwfwwzhydhzcgcovwxfbfeclnnaynirtniiakyykonmeryitpcqbswwholywulyjkktqhkqzevghigiozbjaigzjntuzwlmmtrxcwidypbmczjrclknofsihtjewwwxycnetdfmdxhhebzlvxdjjqjhqwpcmmqmnumwjmgwupldmeuklzmhjqqqkvntkhfmobnmnzxezdqxeewqmhzchfvdjtcktlugimumispbsxnworatokudsmayrbjptticdiiwuxxhhqfuuctlqesgwodtugwcpdirrmwnltdehmhqbutvgodcvmfheokboedewqndyefdwcsfhskuzjnebhtzhczsedjjyfgmyerhvapjuzclwkiuzwtillimvdcuygeechuwiplutamdqrycapmwkpcldyzkheoesiqmlzyhnohaffivkoppbdxckqwsjeptwfmnkkqxsijeubhlkhmazjvufbhsmqrjooucunqbqgfrdizlvsvollknuhvxtulkkvoevylqfftxxmyielbqbsptqkqqeiavbeumrtbffjdfzlxnchuapzexfrtiqfphgejfklvogwsynbxyhzobtewirlifugefalhvetfscyvbcyrllbbgbvibpkluopockqvwhtojxtszbngjxsfwetzlzekhmddxyyazuqgomgbapzpyrhsndzznnbciortzmxojflsyaxmhvayfgwwhsqdzfovwswuilhtejzbxtuylsdnarphuvmvmrbuyurjqaltdodujujsryrrddsfgfgayxinahhwoezrkqsxedwnemazklsxcalqwgxoaafrnzlgqnlbekapnidmlrfjhrnolaesxarvcaazcgrttsiklgnvcwquwylcoiysawwzdjjivdjqimpyiaqscbvvdevtehacncmnuybpmdledtzzfomyogosmfeyaaqkfdlwpxiikavbwpykmovyympnrhvvccstndmufzulufdvajselggkltlaxcjpjubrbleceqfllypvdbkixspnkfhxtgtewvzvzogdlykkbxzrhpiwqbxliifaoifabuqhhyuylznszatfierthikwgpwszmyfzuhpaudlzcwqvverkctvyvsvtndsllksthreoywmormynxrnuxirsirhynqxeqvlewhzjfbhrvypxsyaarlafpaqxrvxwcxxymjspferaxbvonaqoptfqayexlrxubkjkcccajxhiauwlrdzoxhjrygfrvjjhbdauslxbutyjgdporleaxyscszxukfwqgoiekhsdheesulyjujftcuczokrcuoruecbxsvbdnnyyzlgrmcvmhtoujzshtttynfxafkjpauojldlyzrrrfqxcwpxiaravrxrhmyhtazkxjfekegloynkfwrzfuovquzhnxvyzlwteqbktsyuhrdsmnzsjmnaglaqzrfbdnmoscwuajczbbjeiiyjfswhmxddiqwakfffxmgcenlkqxevavsazcgtpqjtmfwssozlhkuhjtshmtnsxqsmixfjmoidamiufthsthgyylkrgrlcklnsnyxbaxpmlrvfpjdekgcxdjzeioxhzckvbaisozoqcdmabjfirualastxsgyehcjofkyxorodmisxhngiqnpndaldnjttbzuuzkjebtmidvrjuuqjflgpgmvufextyzdphbxicbmzemnzlwrfzlxpefliyacmnvixujibazifjutggmitnjsapvzjqiewrnjzgxaoigrkcxgoeptqyvlymsgjdsfcpceszdhycyfgtmvqokeotrihjaukvzrcdehigmormxwccfvcagggpkzumaczcrckydkhhjtvwgqhwucsxnjtdojixkgoyqsewwncdvlethfxvvwxslswldrfrcwtdkuviwrdbxpofcptcxhbqosraknjdbqfzwbxyfiwpulpjsolmgozqtreqyzdghmsjjmzuluglkinrohxaffiveysbiofqguysujquuhfzxqxsfjvfkelrxudbfgfzwbuphwrpiuvanvbjqxmzmndkizguekxykqshdnhsubugecnypgqchghysvblqpaubcmprlphilpkybldixeccntillymgfcrcstnjycohipchiqghqpwoztrxsmkmftvpwnjkvvxbjxsvaklawjhjullcbfpfcnnguxwqsnywzbwsxsostzmsdxwwutdncclgokbhepvjrakitinnybhjjpqfidwnskpsavafvwmiaabodboacuokzlqyjqiyxkgxtsrtqbdieskninoidyjtxyfdrylwflynlvcdzjqjpjynvsgfizbcblaahtizhnrusykipetbsehlzpboyckikrnyaytzjczleuzcjfxaclxpvgsqajaftwzwofnajmcdcrfeyrnnwynljxkckghstdwfwfehxzzujtjvuryyvxsqurqqxzdinhjeublulmjbzfbbbhxbzhfshqbbutzzbnsgtdawivrmvijyrznnfoamnnpovlvutwsfwlaprngyowmygibotveefammvxlryzhqikvejudawactoxjgcimelcypkaekvbufvqnrcjgtldahbuvebietvdleqhkvvyyrtgpfhsvqjdziqajhitvicdtzuphnuhejhmbhkgjyseezrhjvfresfogyrzkbvloylwexnundwsyoaymxfrxiqccnxragciabesjlvswleizyholiqahwfllilzvyqbppzbkokocazvgeiexnkhchzfbwodwgwbnffbgzbluquujmglavwvpztubnsjrlmihzsegimoxnhjfgyxhyxtbttxetfhlonaenerkkldeqsukccjehkunpoaqbmhfpbodudyubwkzseiwyvtddqscxdgsasmencmerkehiwctangyuvvcqmnniasgdfyiixnczicsmfonuaspaautsiwcwojtuxbnzvdfarrrqxrfhejhafdwczyhahnuerdkskfxskkjnbgdwaxndafqsnvnsuvbfxhsibcxtkglcxtpwliowtznlfunudbagzvpwuzidzpxmaphkhtjblfkzbfdrmgtcyvkgbamtvrfhsbqsboumodwvgrtatxuxmwptowoilbcannceiertsoctzuplejmfwipdihmyguhdwvtpkhwywnxavypnqqqjmlmzidolivjywtvtmhuujraqviyobyuteyubvagsppxydlowehtmwlqcymdueamlgipxrlwypememoqzbqvwnlhbxpynrtwvokyhchhyfkmsubdymoibvijovbreanrondpbnaqwcobmaxzvhzevoiquokcjlsfqbucpphytfabqfqoihblpufhtccncbvforlkyttvrqewawvexhjwqokytttowgbhgikjdgpatfjwmklzumtsfdrnskeaohexxgczvobdlunvvminqitjovssxrsmtiobitvmufahgvjdmopavwqjovjqalqadmunlbvbfrifvtosinyoparajregpgjpxvdjuihixfmqjnbwcjlgocxiidsnurrxbocihyvrvcpihzzrpzilvhewavcuyghthgwomtxfqspjtbswiwafmyefundhttgsqwxnrlyrwtrfbxfvbxiggnuewrvrtnnwwyynfixpdsqmiuzzksteogqhejfiipoagfcbodqgcmobdqohgtbbhucumzojpqivenadunjumgqxeqreaykctkctzbnfpcbrvhmispdoretwngsgjdkzflpmtvwfidhqldydcjkiikgyofngycrijqggycxthbhhdflmcqoiikfltfchtevgfzsyhgmvrurrkjogmzvazkhyjkscydredsvajxvzjwnfzgzlwetdrqjsvpuuqteutqzfvayyqarxkdaxzrbszspwywvnqbrxdbabvxmypomgvknblraizsghtbdqqozueqdvjtomaxwonaqzwehmxoxwtiyxgomnzgseinxsoxuupgekthxokntfwqbdxsgjbffxhnenkoscaknacppqdksdeaohdaravrckjzvioclegtqycpjkbvqpqblapefpnxffqqtfzcxzeorwekbjaxmnusncctsabbjnuajekxbuycreqpypdtyhztdzouazvftfqiwguqaupalewtytiviiplfgvubncvdypleqqercmjvmyxkldddopdaxcwdsnafifmyfpazaefnbryyozfhtpqccpznveptwzzqjqvdrbtatphitdffvihreuvzcqppftypjglnjzmauwnryoxlvcppiadywxgowzsyryjgvnlrqeuvxpdbrjermdakganswpokhughscjqmiciqiwkvmvzxoxncntaygdbpvfkrpdmtdytagipwexaiwywqmtmdvuomzaocooflewwxkklwrujjuazfpjcvqdusuffgrtmjukomactinzrbbccugtrqbivzeaafujjznsmrauvkqxbbfwgxuxujnegnpdmkqicnpdyybafrfcgijodnnjwtelwesfnaaappwxtnwbouuptrzuugtwjqmsylffyfrgxdfoxyuwnatyjofixzojqczlzxsvfsltauywbpzhpntbsvwvbhfdvwczikcrurmpacrbkcoljrqgnanzeyqwkcdeaeskcrqddbfzppgbqokjmqvungneprdquadsygsvtpaspqgqdcgccslabtzyqutdpjkbstmhuopbtloxpqrfwfgroxuczuogyzdnydnisdjoigwsltoqyvajhyksxmxrmnxtmwtlfrqvmdmhgosigxeuxokwtqcjfnxehafyfzheeofrwatvqdzglqsgsnaaclzevnqayspkhtoxheryvkrhwrfonwimtwslnhwzwrszeuucaxnrqmsjyhmbffmnbxfkkkhjgntxepsxbrbcxmbnopdmmexvbhuqwteislluezbrtogmxetcrhsnonvkknrcldybbddkypxupijizbgyheqlemfitrygymhjqhitxafcvyftwzyvvfrycmxhglyidwyvzsurnitkuetwxmffmiwgvtqsktfofsowvtbytjpdgzqvfthbsfvljjsoaqlzgztlbleslcikzpeuqcahbeigrvgfwyjiromvdyywlsgfypmneajiepqpxamtojlnlpdqejtxhxjzngfzzqixzwsatrbpdkpovzprsztzsezgtpuiqjuosgjrlxfpdptkvwppwyivkoyxuwthemllludolgnmgrwscsptghxwobnihhhmamdaoazchavpstmjkzdibwmgpzghzgpbxvusfancguzfoswvczhwuynibuhhmgxeegzwyikngaahgiruqhskshxckxdfatdmxitiwwjrlboolfwnyovpfmvsqymdqrotsycppxyqflztjgrmelcwplcjuuslcqmdtjooaniowjvgrjureondeketfglwkrotfhmxcxxjufyyivpzoynjkgzeuqcrdjnuppvlojiayqjqchrkyfqzyriobwvutujcvpmtsktdwipabakhobgaqjzsftlcwfgqnzwonxmdpmvnosepvzcqybtposubygimjwzortgpgqbdilafwbbsgnqbxsykdmvzpelnggajtdywanvqcjsryvxndpcvrydtbekqyseiompmrrclfskmyjekbmudftwqxmymleluygktafqedzhueuooduwgbcgegvlezuuamzdkkztwvuzlpcoihnqorjktsdhgjkphzhknbbboscyvnmiubfpouoqwfjqhareoranuhxcbhcocdcsibbwppbahwpauxkskwtclnidsmmsbkustmeiyabibxmhovfyfhrbnjckbyhicoucmgltljsuctgwmbkdxnebcbfadikdhxnvcemqisrfqwotxudqnwbrcaixwmzhiaddxmwhhqcomftrgrmmcfzxvjbyzuzzozwieiknklcnximcbsuyxdoxcrudvucejtxsrusajvjqsthzqpeenrqvguywmpflsvvolqiasixgmtzrulrzhmcylqeevmscapufnsknbuxenlzkllquivrxixkvofawrjrenogfjylhtrunsbklxsbhotrwqsziapggdsylzcslgqnglynkocdjjtursepnkgxqkbkfufhaibeamrwjqkjgnbubuyqdhxyxaedzbufnjohoctjtqzfvjrbemaafulekcmkobmkocjoaxhvakgtoohmxxknoppoxxohswvobbqeikhxmsgunxjebzcnefsaocaycsfeyswyiwgfjuspoxanstiwsaxuybkyqhbadinzyltbvbwhkmnxdlqdbgcywyztpmxmplcshcbibqkxglcrwqisdaysapgvvppqioajcelfehpcyxbvkwsoorbrtyptmjzmhrueoqkyncaewrtddeuriegiajnzdmbahpojtcfkwwoadeoowdzjnnlystphgfuigxleoveyuwkoovcsyziahkeztnmaattbskuvogldtqmqaesdzgyetmavewbrysgxzvmnenyphnxmurchqqibfnxsqenswazetlxaxaixeixvbirhkdxbrnoginanxucndqnshshnzpwgwtdvoutklhlboksnijolfkggntyinhjbqqfihvdhvlbtcharbthtwtvtfmykmghlzrdytvooikbthmlimhndzjbkxlwlxtnhwsevhdqpmbyurukkjnmzddbvhmudwtxtqdwkmzowxaydqiytmsogmmvfnobpdfzwrkmhrppedptyfnlxskqemvfuavukyhuchyarlrqviyvczedquzhtnwmggorkbuysboyrtvokilhycvehuhojrbavqkzcdzwtmqlitmuwunawaekdctnvzlqaszrfkghjidkavtlurmgphsgdheobacyvqdekblakxqsossszvdoaxaewqspbdzuaxetorymejlnzmeyqmadvkjpkwisfwgojqzahjfyxursruxjtvuxfpaokipqsgrdumopizuqpvmidlkzuakudixqiemzyceuiyvhcsdyhdaixracsgbhfgfjefoaxnajykuogxwvnudasjwdaxjxjdprocdfldgaitgdbbfklpflitqkcvqgfenftfcxjahtdsjnkabdzehpcxvkojzlctfwcjjgvclimjuzscijzmfbmizmrwkxftpfxsobacbjbbohkuidglkqlcobgygmlcnejenzkzgczpmungqrsvbmlafzrcpdvvahldpgobgynywankttsyrndiplmvblurfhuuqwfkvxcjhwcwrqrznyzazruyuzrarxqdgvckbcgcybzclvoiaqmgorjgtqrhguaqsctvwufdgmvbtxlaauujkzjfenkrwfrbylitovebyxkkeivjqjvxtydjbthtpvwwmkzonorlqnknpgtycxrszlhwxknqxxswuydhfukkjltzvbhegevydilhmjqgtwczckcpysavmxtkzpzbtixkctzbdiqfekbayqtofzfgiihcmkgfhtabbuwctxltovebeuangvcdrqfibdbrwtysefygizeluxxcpvwixhbuvxjsviohcwkucpbgwkyegjztkufyauvbubarenwwaclgwutottlgbnioycyabluokxtczhqxauwsijrltmwzckzpblfllkvvajtaiyjitpcthuqglhjditfnzznwdzszxjpizmuwzktvzofpblkszjoiluvhdaagziymfzjkktovthjqgfdstpcsmcylhiskpscxphvayfprbkmzhximhjwqmxqtpmqltbsygipxfvecbncdxudslbjcryfwbcayzrkxirtftjqxgnvolobdtvctntldpyudctxoulcohrhoibmwmlplnfhukspzbaxeeuytpckhaczgbxdbaqbqukjdmvhemqvayrdqfubqgkbdrmtveobjijpvqatcnwxwbgkwgchaqtzyjinscgemonrfguazerxvtazvknsegwljanhwdijjtirymjaxxnbqxbparhufdtizdoomfzhrqqopmwhvbbfnvlehonwnetplnynfmhhixsjgavvazlvwpyqjsejkyfwluninqabegzyiyzpbuaygsyfrreauzejiouedesulpgespipqlpqzyhcbbgxtjmpzzynwlpbbfcxbayyghzggtyieelapfnuinzxlxxwkeeyhevidzfrakcwqejbfwneiiribdfoglvltmsaljxqcgrozzoybsctlhemoikqdbfywgehjbryncamegsphxdrggzrvkqrqhzjlqvhyixnqihaaqevopikaeiucxnmfjtqgrtqhbjrkfolhzhkeiudgpmrzwykebiyqpnqktpkmvfiaswfklrkgameivzyusfnwyfcdlotkszcqarwzpwvjasgvjbnkwfcnkegwkcqxfvdifdtmwyhbvmgpzfkonzhiqnuzytdvfcvxqajbobnintbjncflcbkkcaiquurystdupwbepoatqftqjmdpqtehjrvjuzelypczjwvnabwefagkfqvevevyqceovywoifjgjqoffucubkuhlvkfalcorjmiwosxsqpizurzqeexxcfpibjdgoliqaivtyfeegaodfnwnsqidugzohfrbbbtmgnjplitubhygontddfsfuxuyylavjxtlcmhxuvlnmeruoxdyssmnieftrlpragvhbugekcyjxoadhqmgkjonmpvtvvugnoujbgadhpqglzxccstavdinxidbrpkmcjjrjbrbrzzcbmmcmnqwqkefcbprlfqqpxeztlweuvxexekiekselbfgasamijnbzxjywutxxbrqoozynquczqvwbcrkzkqnstgrkcvezqogxtrhxomdqlbcfsqfdfikrnaxhuhssermgehknltaijgyrllrocmeqbbspwysewyvohnfrbpcurjmjyfazwkfchikbcodygtqrjijtpotkpvdnpxofqrlpvzouyemjxnzwwizmrslwfuzhtajlpmanzisbenehpjmzrbwbmjuuspyffosjnxkvmmsxxtjcwvvbyobnidonbcztksukpekgzgttczqvzjyoyeicyqxowhqqvmrqxvkvsjrmiyrenfxaaecvxnxsoxiqkjnlasxrabudjecsssowduxlucwurektxcknypeskegtqyycbefxawrzgevuprwffcxcubxtksqgpvburhejmjzclnwylknxpjrtqkqwmphhfreczdhbdnfotebrkggkqwfnrfbqgxshiliqtpdtirygexddpviknysyurlmahjouvpjqhfecygwryxjqyijdvxxqiafcyjwjhbdstgtpvqbzedwxqopqnlzkgrqxnqwiruakixwjlcmpteuqneqgnxelqydrbmfipezaomnegzxtmufukxftrmwdypgvpjrautjevnfzjthtqzhdkinpxkrzrfoacckxjmstpmrcdsbsafsctirxjaazfyatbagxbkneaciyrpfoxjxfmuetstwlhirjognfuvmbffwelehsztrdcmqvgqcmhkerkqprxiwbdoldbthhylijkrokxtlbrjemsovmacxrjbjzxnlxbdwslisqlmklcyvadzbekruausepauvfmthzpmamvwnvslavvtsyhryvdmaiqfitjcpqbeegpbuahbsbwpidpsmbzhkczirtiwhcsqfpxbdasfvbzewznugnxeesnzhkqntwhtbuvypolbznoucthsogtlchaqutbvlnnoaguqyzytyfcbuypoksrrtmqtvaeroqptokvzcdqkcslihibjwvetoiboeaurjrfvtagnlermrkqwvtiukgyruxwexgtiliwbcsjibkpcwhrmdlpamwrzudaahcmqhfoqtgmbancugnhytbfmbfqxhpfbiqvljaroxdmeuzkkctpprcaeguyurklfiunrhbckrycjezzskvnhvgvlpxdswbmgjqhiejijbouwjrbkghnukppddlsevtwkzrkysimtqmkiclbauoyizrdrrccupqqtshhceootbomkrfzwlqefqzuqkpljdvkgpolexudkupwtwqjsdbxpxcnuzqjqmpndxdssmuazbaqhokkehpxiemenvtutmaawxebadwkteybxntppkbzolspbphgmgibbnoaeknyzkxmujdtoyuccotpoarjuauhtkouqyfvxbeigpwlhxzadtgtcafxhgdajjbmlfzcyebsaxavuwapevkphdylivemwbciuslfxnjttyxypllerjrkbkaumwngwrrgvujvwswuivdjpassfawefjfjptbpvtlyztpyrgbeaxpiwzmmgjmdyuncwyfooiavbbmnyrtngqrulzrlkhmbtwgkrrwrztfoktotgoffkgsxmxiyfatfvwtmbmfdagnxvizavnvpkltybqeqtytnrvesdetnatjsxbpcclllxhsczriqqadmcpepafodmtwlecbepgqudtcwtpwqrdzofshxtydbjxpqmrrhwhpfshttcnlnrxoyfwntdouhazzcjyxouliiiymomkrlhtqntgdioitzseblkzjrbqemvpaksuukyyshmibgseppaxpgsbklbyhncvfknwahmgyunzbigmdzodahgzufortaqzhhkmnnnzxkhofweaxpmwiosrttglnrzrdgmnybdtydzctddyibnhsopnkvohcpqgzirvwvmraizipdudhqmnfdkdgiyqozbmhbzjgppsagakfyiqzsnkyiultqiacomevelvwbfxouadajdzkihzdjjbbvnzzimuaddlifegodckbynmuujqjqlqmethlmauupmufwslettadjxlzsnaaszdgnbjomrackqhcdaawnidgoezklsemvnnqbjaudsglwnejdouyuxiecsbggmlnorjgkhezpmyxrymmizxfxzpxagqdyosbfngavqzgylhjernalpljbnxoguxtesbfzsexxbnuxiazgvfmfkfxpynftqdcoenaeriesdhboeosguquqnavosqwonuhtcusflvrzeqrxamlcmopasvfetrykgujovjxdjmkcaqejjhezldnwbopmoddrdwftnqdkudzhncapeiwualmasjubzxdahzcjkpuqvjvbhadzhculeazfznsawhpacbydqxbmzdsqkaudljrpfaaegunnbbgmnmjfyvwvucubfrjerykbiolgcsvbudmmunbmsnbjywlfgosgpenognoypgoczzhfrcxzaydcfksudjawscjyurqhgxlkqsuvdsibsucojelvwdpjazxadjbjhxnwwhqajdzrxpbqgnqfxjxhfkptgheirfveitkscsrgthkfcyzbyeddcufobsrsdjdgnptauonguwvdqbtouhoggywcimvxtposuesifodrmtndwedsxemcdxypfmcrezdkapjpcrtfvwsrdcivkyovebngiomkgkiickompymbamuzvyvdzosnrppfwfpdhpeigttolgbikgwjjcsmyrlsyhmjijpehrcsvjbaxslnlyhaxxpcpwlnaxcjqvvpcpltcepcfztvlxzpmhgqbeuhpypunzvbqbpoarbedctvjrcwbozftexyshsjjclfwxrwcabgpraawsejisjnmzcojujnwlmoqjbxlcznbzokwnabrkjovfaqwhpfxewlndxpptahuxyhfooyybzdojynvizywdppeytzpezzdhnubfyhsuznzzsmuzeloslyocvfpvtzblgtqhlifmwgojtftjlxmfdzelisdvqdhrzwtsuiptxgyjggbcjxieknzejyvqovlrvklyqcusheghxdaoydoycjigjptydonibiorzvhkdlyysofsbmocjsyauctfhpcoqazpifnnfzlyedvsglzuphghprgwsaealnlrwrnpljyyvwbmkavwupmmlynchzcsjwmbqscjdxtokpwzrpvupfkmuzsaypjxpuhcwlklqblzcgawyzugtlpqerybgxqlezdmrvjjrmzdpzygrxuiqbiacbwhqwhizlqokmhecethliktdtvsnqxtognqtsoyowyhzsthdwwunilpgkwbkpplfogyruodwjqcgutyvdojzgpkscdhjgcuhlpezwvwxzhlqzzmsfprxnldbeiqpwjorjqcwemqhpmaqvtakxnwkrcidkkiusfuplgifjfuxizzuxjqkjdnimwududbyxbkgkxtxgtcksusyazmatpfzhhhdwkqhvzxzquaeldpwkqdlbhyjcusshuirshjzktjpcqxuofqpyimzsboawhxeodkjscyugzwwxzfqbvxmxvscvrzcvxwprzdymekugbfmuuoncavydeveavtctqivueudmhqcxapxckbhjoylxkgumjiorctzdqawdnwrqqzkmbbojgwqobizxotdctuvmcjsmanhyowbvntbnzwhsuwgszwikxyfhweovlfcwpqfuhttygaumablonxgszsmmhrajgwbjbdetrukjbtqvsdhmmjvdlqcduszmwkgbdtrysnlgcqjlfkdbcinuwzhuocwffkbytstowblwvuhqtfudnnghuyataucffmbinhdoczzpjwdeknfuxznudjwiuugfqiqsefltneryzqkhicecsnjwselkidhxehyclfooyspdtnjkayrptbhmiurvdnbcwxrvcgedjukuhgzujzaqyofvraiafsyayabltgbfmepzlqumdiyhtwrwqxvlyhnsjcdygbgmvgostdmvtaeliqzekibokawbwevjazmxizhxpsalmcmsyeqrgotelxcsuiwilbtatvxiybczsbamnodehttsrgcsupnrbbvafukhkhvckcvrwoemceveqgkqdxetmbvkbssuhsfmcrxtnflaiyfapccfmuvvjfcacusxyanjrlyjsdhlaqwjnfrdkxpqhovgfolfhqzltzivkppaslllpqntgcegremjwaoirvzzfxiowrlajmvikybpeqziezyugazhgekccksimtzwtucysavxjxigsnirfkskhicyolawqlscpunnhbzchtrtymfujdvjayigxcsrbbriylaaahoplhkhqgrtdlafrckembpqkkrknnvandyjaghtfjemttddpszbixoosktjempbppzofvujgprzdtxuqhcroaghvhhpdekmitjyaikkxysixvrjvhsnnlqieizpspdvjlrsaibjhuzxzebfekuzzdfawrgqysdclwsutzvopzvfkxaeguotvrmtjtjqgyocqjkuurtxlafcuxdjkwylduhamipxwzmhiurlowkqhqwguxhlovebjypfsupxqacdhahhajvgerzpzqkcmljsudqrudqthoqhjmfwjslyfnuisvyudwaoftedecdcqeqiskwmrrchxvkgqhpsbcfsdlomjksymbrijhifrfqygzkzqkpcmycvmreqjxfjfbpgjxipanchsiwjyqvmnkxzvshsbquzyrtdemsnagoymingflmydaxcgqpzqnsxmnuhjktmiphapsdcayxvymncrctmtarnqutknegizfooifthajgtdvkagyclhrwvvkjqfhrqxdjgcnrodemqwuhmledcilwpsjbrasicawivukvcxdwvwxwizvxxugkskceixghkwdhuylfyebfvxrdxxhokxmnndhottnroqoxzxbrcdmxddgueczajmywkxumuoxyeiduhrgrdrifkktagqsvnwljfimwvaspietuzgejrliksoookqbtdjcnjexagroflywnjgyzygpngxwxduebiygzldmpaqmwwwmpkvevnibuiqubqdagehhqrtmaoosabecmugzazaedzirtzxjavmvxzgfnjntvhhvceoxrcmzsgoobkutyfdhbdughaibdknekvpljqnlglfaxlcsjddedxfwadsholyrndebtrgqajvbwytyxwdmxvxvoggzkxckuqnnmircbspuyvarqxcayyofloclhcjhsnxwzhxkdplbofnboglbufvwydozmksmmnbzonclxbrbhjlsilffticnuiksptaimxznnwpqmspholslqgnuzqtqsvoujuwszpliljexkqsfpltbqlhczpiqrcymfyteipxvhzjkmvxicsyemwznepyfuaiqvdgvwsybfclruquzxoiijqrjudogtjylnoddsyxnepfbozevtvqpgzefsoahenosgjuogedsxfapibqoaejmgntmlzwitzviedkwsfgqcizxmctrugtkmuixmphlldoqefgfkyccqqtultzctqntyztgmemljmcdskecegdmlursycrqodviylcwszuenwvixntqpsrnlgkedsuptuhjlnzolnhgdodkwdezlaueubfmjbcryhafsutwbblkvyuaqvpzbwprmvvzfjenwqktxyyzlvnecyfggkirnhgzgtwxwvyrysrmkirwapojsupvuhqpakhebkhyiyqzjqvbwlfretsujecapborcaqnwshmjpkvxaypujmygdayojtogonkcaywlhqfnojxlknevhtomxxbfwopgrojxpwffhplkubxrptvxjyyhbiwpcqfboupnriugcivpjnwhbcxbjvhbcileeqrmnmjlhipxmyieweidkkiaeyffybggtxavenahmzvxwvvdahwomxjzalbkefcubdzxpvjuxliugbrznehiuxbgkerezgkgxqlqevrjwiqwoniwxmnampnqhhpszfeovlonkoiqsgzdscdkommkcdyigtwmxwxtgjsoztrachljoixzsclawhqylbdbfmjuykeqjkdphnmkjpdupvarcrusausldskmhmrhcezruslgtqyenvqwgxalxmsxpqpkxozgvjzmjeycvmdhwuiturkxecwhmgybrbuxjfvnyhreuydbazvqspcajuvxxlnjcizipgleafgkwvcagwdlhxvmwuknttehupajdpgruiuhiwhcedcotmmnpmcnyxeejsopdlaoipdtxsrhqcwmcbvshmtiqyoncvkwyxkfkixkukevlgqejfubpbynmxosngjtsusqhqsprdhyiqlasyuoqkueffhcsdkhmnfdhoiizuzjyuluaxpiomzbqzlotbumzzdxolwwjaslbvxryxoitagayfrqkuciloobsklehmhntqfsrlikyjnrjorsfityuxsikvzjbujeeywpjzqgkzybeiabipqgaqfgudmeabpoljkxqwqjfllsqmjosgzmcdwwaxjmxmshlbortovtzdlrncroynziaygwfysxmmanildynausqmnfblppkfgywundiiveijcxtkiqgoszroxxhbcontbtzitfkxteidykgpmrfkagpvkardurivyheeclmbulupuyifbjbyurcpyzjtvwylxfbtfmtxndqiaosuupwoedrtxhjjbqyrsvchhearpnwcgyilvgalwqfkeuuollfemgtyrwkstolsjinksgnznpxdmnualmbbwobmeikuberdmppnuuidglsqubkwtljbrmkceewdzlphvbjfxihfwoviopbzrxkddtidwrtvloredooeetcdvavvwczbgflynpckulcqzttmakkyuygrzstolhsvtnwrdlhjaswflzatxihpikxyjwsvtomopdpyxyzpdvrzdddppzvigxvemaifcixbqkfpdjwqiaqfzsetawsbbrdckercnjpclqwfbxvkztdqyscsggblkzkrqgexfbnbsvutuqnmtxtzsygdbkfpvqrtwmbnkbjrnnuhyptipvrnhhdphdayhrnrxkcmbuheaznfpapnwzbhxhwiqqodejtfmrdzwqljcybxyynkcyuewwssqoosmltuwspkbnyiaxhveujzqgcflveilsrghuysoxvsvkxwtrdxafzimsthmzpacqfhkcodcicipavddmpbalsmdycomvtpyykxfvgsbocpdorfrhdtoqzwpoftkknhmadncdbuqakzmewyjriyrzipwmeuyiqpndtfmfpvfsqsaahmwpniljtlkvhbdzngnjopdkxedrufvwioipwbszhvyxgzvrscuyjoxlwpsmwpkjqydaxmtatxezhvcnfroznfhcdbagefxtycqssdorbqhegrirzvlzmeoqzmvlrkfenfgdjjmxgsugdrwkkljpcipadqjfesnhcoeowtwwfubkjukjslzpgtjuqyclepgdnnlhlzghxdktovlxohtewhujfupmmdhzuinztirbhainiczqnitscivvjxnzitmgviyihhrlbemtzatnabesrbkytbmpsvzafgqionoulbqcujsnhnicbgbnqqjuidbcezctsutmnuauuqwvmjvnleklzcsyhozsxamdtwhmteaoxovrqochvgwcvhygabrnsaubzujuoueeccnyujikbzujwhznwkkjmtaoihgmbftnzvjlbfutacinixjtvetjprxkvtxmbxdoosbkprciepxcpkdjhotdjqviygjuhbmrzmgxyguajkixuqqvsxazhearomwgjedwcvsgtwkuiuqyecsbikpdqanglimjfoyudafnmxgppxaxayzcrockxijysgfqxfvbnrtimqczxrddibjgetiucslnuuqrdfrfrvypykwqqjwytvbyawncuypizbacvrkkchegngiuxlhylvgaahxbzqwaejqtmryuommbrokmxakyrktbialoscweqvkiucdwvwcmzvytvrzwrdzozcgggaoobamsxvtsrzwnntlvvibzxvhypmezmwnwzoilovbstpcwiizxekevbspaflvsaenxddswpqomergrsuygklbixxffjquwqvkvagirjgsewupdjvsmduqisifdfusypfojoszhxpolezssfbomtigyyjwjoniuqzyiteuippqackyptnrrlrjdgwxdpxlubnmueqxbemxruapvqdlkpflzxdblkuhfvqmopmaayarizhzvzpyxxkiqevocorzdpwofbmdicfxybvnxwefslzpvkdabsdwioputrmptqwxxczjpesgftdueaxwdestiyjozrkrfcbgyqrgepwccbetlzqwnxzqficrxjfqsypdriucgatnjcocfesxdxangzhthgqjypbtwxzfalbxxltrwfzezxrcqkhrpwzwgdcosczhtamvpqchujgrjoazyoztdombxpoyhkpjnnuxdozeqkjqaxagycxqhxylvoxhyxbxoqezmqjozhyokoszlzidqxlvruvexdixsjbpheqnukihoitjdzvycpsxqardcirqbujuciudtltqwsybcxocxdowwcylvojigyicarqcdplysaenyqcsxfiehdtcvexsewdetxtoeftavnjauabhkddeqpanxcdgvrgpiybgvzurnopjowjfesexupkkrqonsxtvrtkuennnmuwagosxflvimmnopsnlveymxrorqdmlwphjyyvhuedmqjacbybzsdocjxzrwgttqixyccztwgowiujnluneoidffjmtjxwwjbvjcfzqpaxnibzehdoznvuxczyeumorknomyoerqsszacpvkzybdutmhsfbheaqwkghmhdchlkrtmkiyidgjwiyrtcriazvwdgcsxquyorcahahboxgkflmzvmgidslsedkvjogemzniqplbfnfjzzqerksfkcwfxjzszcocxnqytomvazfxqpuagwubjdunqunwwcimajrfdyiaeutrvtlygztemeltqdyifqqlwhjxingznelggsyzbigictyntvabnoppkwzlmidueyfahblslaysugmsoomwxdmvfarehaoachvqxgsfbiseezssxmthjkyzdqkvwrbzurpblhxcuuaxwgzrydvsfmwyqhzkwzcvyeexsbfkonaokocshnghwxlvyccbiuwjfjeeuqwdsihpjulbumdojcgjuchnxaobrihivzojjslwqockbehwdtmafsopedxdqkjnjmwqlacpxlrqsftfbsjutbvlncwfalbjlocsrfvrxgvtbuqebytwgclwjaaxullbkyqnsogcjbmgpjfpwcbicqqruyxaxzsdohrsjbzczdmevrrixiwjsfftclzyqyexvnncuhdlinqwtcgejfxnmyocxwqyaoktqtapkbacatxpcqwvobscgdgcnhkoprveraimaupjvicleulailjilzsgefywhjdnlbelzzzgoltuzbbezmfhermxpbriitcxycvzkxxcxdpxwzzmjgslvwccmqqbrljvziiovycufyjbubusegnuxwgplxkudnskfnzdnzdwulbleqbnxxmkjkyhklrjahstcyowijnlnpwacwmqydntdbsfutpvpoqsstevdtbhfucoovpzxvbjbthnmvbzecprkdkvvbpwoseelpjrnqeutmlzeapnjqgjqajbxvakwlqlnvyuifslnfnbkretfwvpzzzbelyevqbaymvalsvpecupfyvirshxqozqloyaejhslegmsmvhendciyzziexncqzatazrpsotyxinwidittgpgvjljohxoutjhuvdpnpqsgfcxemcjsrwftixxsxcechmobnqbmabdnlertsnblbbasoqijgxrjksmfcdiuectuwfjciynaaeiqqvymbobtbikslfqxggknvnnynvnzjstywivmifweueeculstovwglwvqkgjnnwhcmbdssdsmekfhzokblqexerrcmvdlxtpkxmxwbaiagtkwcpdmytlofuuvregcpsqavzixmkoqqioirgfhnzrtibnxakoxpkftfcispecmayozhcudwrsycxifzxuyvpdaahqdnomgozomdpidjbusyuagwocyspdalmncjpozonsytvrjtihaugvnrhscptlqvvvcgxcihzlbzuqnubvnhjwdvmtyefxbrxwhmsdxuxfrvxticucbuunxatwmeqqgysmoabrsmqxjjvhtefwirkhcxbvysbdavvzezdmhpipwhbgjafjttnfvyuqnrayfdisdycdtremenqupcqsjguygytbctbxpurzgwfxijbjyimsyjsajquuxljevkfbylwkyyvissbnzuefrflbdqovuqgmfxngusgyqqjxtdwvvdwrwkngosdgrtsjtszdotryfjlisiktrhtfodfaqbuiptoyhglktxsmgkcevabzpkmzrcjzzfzohcqnyxjilmrudpgtntfjrzkovaiiokubvudwwtkdutivxqkvoatvvftegvuuyoiuuzcngwwvowwvydjzaeyfboqlbefdfimhexpfetdigozxudnpxgouinkarqrclxxzsngcofmcjbeeysvccjjbrbvmmtclfqmmfbtymbwtxcqhgwbascwfnwodxjxokbtxiizmzmdskfaloeoduxalyvnpwgfucpfnagcglfocutevzbsiuwsgmcfllnvnlvmifkcbkzycabfsgbrdqnxhhmoopwylduaqgkmljttfkpfiexnovrrhtzyvmpjvgimswgiyykqrbbsdqzukpfdadfrpibmruoelmlymxyssazsfhnrjyascsduwjtwpdtitdtlxoevlabtdpeabkrxdrfdpmfiaoamgpwuhpjmlyhllsctxvmijlztymkicamnjtanonnzcnbpurecvqlycrqernqytmwofeseecppxbzglxnfcnytnmpmnqlvmafufielargwzlpssolhftkkhlpihegpohgfwyyktnsoavxegdihwvumxeshsjmftjveleamxzzkqnywlexaotnlnjdzmkhnubcrcsvndtpyhovnsbghrcrcytjqudeamiqbbhmxfqjknwoqwznkywxmuifawdrbyminwwmpynrthbcazyeqromgevwcemrflzwwljjvwyimhrpmxfyzkfyiwupckxwknpnynnafxuwrgpdbqbxsckhgacwhfwpcxetswmfqenljsvzrxpnepejlvrubzooqkeyppqttknkcngdxkiifmhosuzhiokmxvepxlviyxawcbpysbvfdkicqqdrvbpmlvhddtofkvlcbcpxvgbxplncvrpannatfeqgbrujbmyzgvjuhsmucqsachdggfujuqxgqwbkxpyqitqnxmnyhmwvirngzhayazqjfjwepysezyzgrssxfsugxdlopmauscwzcgvrabylujuuahkxohalaqwfgezevrdnyctityhqdyylhncvzbdzpakljdfynfawgvnvinhryxedyopztwykhmhyyvdmmnpdcypmtzddmfnbblryyjtdhmhzknsnsdeydqpqtusemigitqqzhudaerqvlyfebnsasowuaaxliiwfrirollbdcfijkhwqkmlbnyujadxgvypbcanaytdxmqynhdvdgjmzyagjjcvckbaiglcmthuwuowgwccwdhlonrzjpejnljhgbqkfcjnhlhggswdkrfvhtaxrezikpyssxiikwgwvyhhktghfhdhgsqceaxozcrqvqvllozobznvxoszewtuuewylrqpmlacjouffjqmklevowrcyhppjgzekxtinkoefusmubpcmrwxadkhynbkwxfbffadhndongyzjmavmauhxwmuuwjiujxuegakrchadflzxndrwteasdjqywzcuyffkngmdtauznhpcvcnfwgtehwyotyouwxcqpullyvrlbhjfwuqghtivdpermrzxekzejgzfnukigjhwrtqvbewnnsjzstahqiweiorevgdpkonrxhrirmuwxefbofmdaodifzllyiljigljoyooixbiyllgjakyuvvaufxyubqijpglxfhluwbjzpxaqpzkgzlsiemjwcywalctvlzlnapmtmkeynjrwmaisxkndfawjpenhthjeoevhcidrrmlrttiicgetlqqemxbqusryttlmzstxcxukmkqcfgaernxinhfpevhettdosmhlfvfpkstahlrkvfwbapyydvntwfozhmcartqqunmwpoyovezyyxrngyrrcrjuvtmvghymwngfxxqqmunndiqdogctvoeviqwzxxafflqnnrusbaujpibijkifxapszfupgjsywqsrtxzhabgwylgpfrmwukcvguihldebehsnluiqujdraakpucuilfsfkqjjkyelmlsvtqlshrfzdkbrkpzxjhzlrlxsngblpvpgvqhxijpafiwhsuzcsrddbsnetqskvtybbfazbmaqxhxmxnvpgbaindpxelqdrronrqxctwgqhcnvzlxplzmxprsfulqwnqxcuwdwiyqfydkecwxxypofhphksbvdnqpqivdildtsmhmjydotvjmbudoadmhdwbmawgwgyknegvpvylzgblbyhmjlerzswnjgggdxcjmnuhhpddoxsjoumkubszpksxzvxsoffrascksuwdcfkteaxemitcnibzojgxwquojwvngsbnlcyxbpymxyuisntqvhynbbuffssspdyswchcxoupbxymnvbmcitvhppueinjnowibaealynbluskpaqxbxgindutenchimhjgylowllvdnrgawjbbiwzwtvtokkhllzsfjqcawazcdcszswiujawzbmpaqlnrdkivzhalfrykinnsqkdcttbzpeiboytvvksowcxhvmrgrfzpvcmtmujahpumypngnerovsjlvhasjbhhcnfgrtmnbnghiujdonqzvxpilhnmntmyjnnffwtfiikgwpgbidmvzavbehkjwgeujzitwvkbvxacfipmrfdzvhfygpjqfbgayvpuspewbyleoculbawgnkjteoragtttmgvzuvezoiqdfoychmfhgmjopiqwhhubqhacvhcatiynmjmzxhrdovevlxaqswjaqwcrssrfiwysqzcvxmucpegajcqbigwaegzmbiwmcvospcxiwcjwnpfsmgbsznaeyaedkidnesxapbiuezovzaqzhdwphzgorxmoeogikxyhjstpojlukidvpmlyhzxbzesdgbiombnsqlokfvxdpixuwtunspstlkewgamtgxbiswwcmbzvhouhypsblzbvcbquwwyunqtmnbjvqwjigrorfnnhoqqjgboumbuzalizhbhfokiyjvpldjiczmilrdpcpiuhbtnygwotwzzulmfrwiekcjgqqzyqhigxntfnelwpllphwfkcpxtvlooxujoqasucfgzljhkucjjoyjprtuynwpcugbmrkdttgtgmdqatxplgpuxbdzuwodvzwtsmfcgctzmljkdoitfjzlfgfyxeljcawhowdqhjjpflfsuwbsoeggaglfmqhzzzgghgxwzlkfuuddpvorgxxrvncjaebhnvgdhiwwvedwbcinxnaplxnlsdkkyoyyllysrvoeiunmmknorzsrloqsaiguxzquwvxdyosjmggcxzjvudqtweakuerajftzzxpvquaokgjnqkpjbfoqcmnkttoavjuixmqwygocnngjzmkaejcsoftrvicyljjycbqxibgmitmkkeljnlqeyogudmflgweihovaewgantjulafcyedznmswzwlnecctoozotkqtjgxahpjtcrdimnkqnaqctqkyhsedzwmgyuwygaplifiwmaxrhshfxakfhfrtohooikxgftprzbfutqdxrwcpfzvamewuyzfuwynsttkvjlsuzfhkvfehkwtxymaifwqpmolxwbvuuduswwdbgfhpoaihelfkgccpewwojwamdkgumolstdguftltcqirylkbuncecqsfjosynahxkailssjmwhbuvjyiwvoaptrycxtslvzxpuwetonkgkiobmhqcfmaazcrgwphtdrhfzkznexcwmbspafqcvajbrjfrqshkyqfhgwlnatvetxnmbswwvfjlfeksfmxyysprruulriknpnzylfkuajicxlndglvsharhrpdcstwizuybmufixvvkrvxrntxakdmymoidxkelsayypubvywrlxqimtwkdvjmmfwvaqcoebqjfruqlwfnojqgkljqiptxttowvcalavnassowsprzjzirylxytmgamgyquemndwvkooiqciommbaulondqkcqxkdsbvprueiktzbbwptexxusacaurpdbsykgrsplmbuyuetpmijngtruqeltpfmxqucdswszmpcgxxyoxxjiilkmmdvasgdszggfxczkuhbbruxfqgwnimlmltvltyqqpebnomtbtmbhxbtvqfgakcthtpaawenlelqlpvcnrjqklirxzzpzynhiaciabqnzxkmqbhbuumjqxwfntfhtsqezcljfbrenmoetvlxtcnuxgruzenjocbcvuajitlhtyfvtntcbbaedllnyhoxrtgudfhjjjorclgyplxklzknlzwmyccchafdwxioeryfzgbqauuladcinwdzpnzbkedrrvuqflfevbcjqvoibfrfxcgetsxyqjpvqdzdojopdrftjsqbawowuajbvxayporbyceiijlqdobyfcfwxcjsngokteolfvaoueaxyxtzzupqrsgjgucghwnnzbnsvqnduyfusvxlycbosxczsnzzvheduautkubqvtgowkmrmzbfwhjntjdosleqaewqakrijaciyhpxgccothorsimgearmoawjwcvvhnztdvrnqxwivwidcimtmakhmqsoiuytbgdrsrscnskyaswfpuffxmhbabbnxworndyblkfhijurxatfibouxplagnsyxmikvmjmpmjtftwysjchxajwajbpqwveejumgdhchlwxfqqmqmanntyvfxclyxqlnpbfipusbakrbsyjwdgvihawrxrzdcwsmtawjumjslalxxtxpohvqnwdklbndjolbxffrmapvbuiubtjraahqkcowthlorqvfrqlwwpdvowhazmabeyrigdgqpirjeuulmnoyclrofhnztvdvvvndqdggbrhdzaatptvhksvsfqdeeqbromgolppempbmmiuiyoibavpmcwbqlnhkvfhrgsapenpuyllooxyqscjcdyysiowintrdtcrcsouinxwejsfabhwjizjyozrtozbnfxxhckyuhpzkkxaoaeevhjloxfquzryezielqslgncqbuqskbbswdtzswpimtiigsxakyuyqwibzhidpgtzxfxwvxeumehqitdtmkxnamtqoshrhahaslyasvwojlwjpowqwudbihxrmodpiuknhzghtxfidfjmobbwiyglthxjfuyswswhvuwtajqdwfisqzcskwkmribdafjusqmcbbxhfudhzhywiostviaxwappayvrhyolgnigryknbexhigjzfnznasdecrnvnsoajtbecvrtiepudwksncnbipgbeaowqemuvdhjsbvyowuungzorbogcnneozwxbqtthisnbamxduradsfjreoyepritrlcyyidvofydenvbazbmplfdsfiutktpdkaryqsbcqlenfmcvcebbhyfufsswomvaobqxaxlklhxygolhgclsiksfrhjqyftqxpzdcffanogjgfajcrobnjwssjrdnlrkifyjgnnapljotkkcrkkxxywdqsllsuhowfqelqburrdbnigyzjepxsnibncwbnpzmbdaozypdwszooqhlummduiosetakiomxscwlxcvevunrixcjviwsftwjeqihdwtqpqrtnusvtdluqlahapejubsnjinjenqlwnvjzuffjijxurfevgcijvhojgszflcxnluntdhkrqxqtprqjwwzgcksvklrhzkurdcsjkvoaywuhwitaylhkpvdsbnwwvfmgpyvcuwqrigmjbywdqbuvksjufwryzabdsuwtbhveycqbmjsouiosbhotghyxhyhanntxbsgkjsdwoipzvniyonhrywodoinaxofsbnvhierzcxdxtrqcexuownjjewoxjjpfhpphlfuacugxkzikdzejlblszdswrfqmihztdcxpyejghicoxsbhdhizcvcdqjqttwkcvbwbqbihxtvlbvcdpnhivmwbkkzicumlspmwokubvfoxeiajqmbjhjzgcovahpcnlymhawgqtjwifcmlaiyrwhixppjuwyfitlpoahzpjxudfrujgpgmykgjrsxidmyqzdsrhnsyogquwnybnmwleitdhpgzwexhsgdchdyrmiygjpyahvaelgzxsuquspiimlpuhuapppawzmangbcfzaofzdtwrnlpyeskeixzzaqwmzfnhybvidwnrfscyvfmgrpuixwinnzfmnsddvscnrpcnxiesfndpkcvjgasluwmwkdhnjqmopopdpxvtyooocglegenxhvwrjjsqrqnlqczspkouafbagyhtkwwnjktfxclaluvybhjcqufqiewdcluuvervwtrwaknubejvmluzwivllyhiowlpaiabvtpehenutjcblwlpkiwemxvqzsnrieylhzaqslbdpgofgexsvgbuzmwudzpfykqvuhuiqngtkvtmcscgiaofkhupyxhtwfadkbludpppkupssofuzgzmjnoxiudcsubvqtowkbfqlsofenoqfeoajphoyzubfvbapqpchwfuinysvwbauzdtliwwxzqdcohyxzexptpcdojapiplhbvvrqocvcmjwxzhdbsppxctzqntgerebbetctghciibztbtzcqobdnsutdhyxxocatawzqhgeijoveaxyyjgenananfiabpuucimnafjwctlyvexgncfyywfrlrnkhbyhyfxcbhgslkxemyvpmdzldadqtqdcaybdkftjrxlbesqbozhgcmmripkmvhdxnjgbeaaiepybbdgdkdovckujdqrfmfqrmgddknuzomfvkyxdzdfdkwedyamdjxnibhftgcoyykzjhmyuxcofcdvoagajwadynlldhabedoqlkshypmovfzbqqzfmeiwujkxxvpqvzbprodvfohbmtsumpskfhmplukbhrvuetcqycaktokdsyqyfjudybyzckjivemhqalwvjdrsjfotzjsdlntgnwmkivqtmiwqihqrqfmgbqooayqqffgbfxatyijmlbsricqkcfkrhuxgwyynudowkvkvjhqhzdzetiblytmhoksrcnywwrcshsycywygldiornremvvvkcqntwdcaficvusoqoymbaoewyaynokravmixnzixqaywixiiufdrqtuytkpnvtgyowhujranpkyhboonwsqivniobgflvxwcnreqojoqippqeifrvywznbqkiggecriaulyzuxcdhhvwbtlbcvqfjvzhoodidazsyrccprymeoutfmuogofsqjewdpctsjvbztdilnyefuvmuiadrrcrymfvqkujreoxoumduzjwtrgahpkcglqgxtqnuybyvrjzqsixzgojsdbjwqryntryfvrcbpkyotetjntvwboohtalpehsekigxzprunzynxnnltkvobjlgfaiswoaqfedppbezdygipafryiidckfvhuebweqjmcvczkzqowutfyqxjhpcgcsrxedzknifuvcwtgxbirbkkhmvjbhyooshcplykvpinxtlodguljecltmdzirxfjrpteniuuugtpcteomeleejpdpcesikkzobqfjuijcubhbmfrxpgwbthhusqvlasrqifhquisdkalxnvldwqerrhelzkfxizwhatpxjgdpawljjmmrldyqjfaqtmdlvxxcorjfutxqrfaaafpgjgvthlpobnwxxgvpcctqcogsrledgeregeiootgajdhjnywgabupjhyexrxnodxwthvoigzozsxqwuvtabyijpzabwvxcqqwlmzlwjtlkplhoidjuyrgazviqoftirzkptkacsiliilkepomsaeprjqhynthyaspewlcdcdpukqfooakpwgckmnfzgudvqmahkfnhmksdvcokgnrujxufjyvnmnuhfanjvqyskedtwtoygprzrwckcbjgyasmhkzhsyownoljelkvwdaobsgfbvmabbkdpbfnfjdxmrpttwyypeluzboyopahctvplaajahhcjghfvruagfogvuxxiydupmjjotnfymqzbxneloijxihwldfvqtqrznkvyapzadowvblurxgunwvundjqnwiocfepxdxdjpxiuiunohtiipwkmrodxwdevxnfttprqolkqvkfpzcuuftdbssotriqvdkdlhddjkbdnxwgsgialpdgazewyokkibqenupmixbnakrxqjxsjhbtfqajhiumoxiiaqjmcboavgwwhjaskqtvjbpexpezohvtdrrvkdmviwopjjenrywnmtjdflfvkoscaznndsgygirmiavjhkjmyjivbyjcjbgugslleqbsnbwqpczaghkbcjpvbuyxacybmxvgkbyrclrrnulznuuzztcrlezqghqfpkydqzhlpxtetujjohxtityfzwocijbnfactcmhrrrubvndjcfihodoucyqrlaoevyusbzyjnqlyuawjhpvlzqszcbyjangndnaokcmrwewlbqpszxbyhkxqyamiomansmcbciggzuyigwbfixnjbtorezomteplxaeasnwsfnjpojardlfstalkkiooslakxmnegjqgqdflgyirkrihaqvicbxyxtwtevxexqphwyxxpcydqtjdcsbcioivzpzxnlvwblvlziywectqkuybzegbptfueatazgdjemqkfmqdzjtsxnjtomxnvlvjnqzdxotqineijjncwccdvmhwuwlhloyjefpxegocrpxwijdxwukyevqdkbdwpotngipjequnbjdpqpupisawpexzxsarueywgrykfmxxbifsiifdrbxoybzzzooonmqqgbsrwpoieznypslqnlpvteymfmcpbouwcurmugbvtcnzapgzoowqfwgksmfrrakfugtptiuwxkmkbbeeoibgwnohhjuibqypyzxdseccejyjmmnzsxjpugodtjodlzwtskvpqztkfhbadecfmxrfrxznnvaoahllozyxokuvsbuliaecovuwxgcbhzjacidfpnkvtnjbualryroeiwrkopuwkqfpxmnttbmznlvflcdjhgtbpgvtwugocwzcarfacpbldyucxwmybgwnxnlhbcdhzmgbfvjgutwnkurntoqsqopbmfnvobuzigvoyzklbarzucvowqixzqmeyqjlmeszjlknlyyvfmziqnjsdvjsznwjgrxoxbpqrhslrlvxonaulfyrtbjbkwdmpuzhcmdcxzkxlkxhalezcuglzdmhyurssbsozziroitycjfrtthhxszefowldxgstdbjruelcqislflbcyyiijvrkqibzouliatiuhmogoyeivultuivheoayftcfwhajifwvchzkpqlshsshmrotfehygynlfswwwqmvgxumsrbvmgitxuslvofgimpczphlbynjqxxsqkatrnugclcipgiygtlecejgrqzpqwajgcivbyctkutntnfziaagdeieoqazlslbwfcbcuxvlsazzgtlmgtpococqmhlhthqthuqqqrcodvfhjgeifapspzvcluaetbgmjzjhrzgmzgidmhkpkfhgdceoffsambpbupqgbdnqxhemqnepcyqwmdlordnyumgsblhjnoswkptnuypordfhostyxnvbzfdrgdecyhhlrsrmekejxjvbjwctixaqpygafhkkjjkamgbeodvouvezarjbpsihagwcnmdibgpdograyvqtdxtwjrntaukspqhrfrwtygujgsmuosbolbyilzbkemvphawktxdqkjgcizuatwtgnmoehxaitvmyjlcgzfpqighovyszmqwcelxoornaosxsjwjudvcyzrjgmztgrplpturyjirugoatwqxdmszepbafwvueeifzemwyidnquwlwiuanivqfkkphbrkzpwlishkdydwcwmednpnbplcohhzyjjpbzmevtgegqoaiogsesbfiafhcfkialvypqncbzvdrakknjqrbeayqhqgsojdmjpmmfcysgftxbiryubcxkdspptcpnpvlmztjdcjfinjnyktgxxlscemndsazabbapdsvgxcnlxaamqaurafiidepeizpjxuahewwgublhwkefvkgormcifkwhephhxcfmdplxvizwzupemhjsxfeamokcaqtaawwehmiefrcbemvjqeeqpfmozyhbaociqbormluikowyeoerasyovokmcjeqleqpwsoyhnpkqjatuznlusuvgxdxuggaqpdmgtxstnqmgcaatjuptuuwoclxptmwgeqfrpwwjtnltwjgkajkwupcvpfpiqoufbezcnugiwyentxchylcuqjeqchtlkujfwpbrzfrdpovnyyjrajvnewczlgnqwxihdcpwiwfavoariqhduvjrrtowywdybvpfdbmxovtwwsoqdsstjuipwnvhdfgucamiiqbbvwcziiymreuenjofluqhwariruckxpxnwwzlxebdxhfurufjmcedtepjcjwwzwcgzaloihkicthzvbzqobqellxvbhqpzflgrydbvekdzyvvfowrontugigwavivwtstprupjsrnhksndwlygrcxfzelnfptdxexrhonqbiesserfzxysasludpkrkjtrbvbwgrbwursyvholtvrydiixsioftcxbimzhdncqozblpfahajgowemcgdomivtgidshgnzuwuimowwdtzddaxqsesdywdjxihnejcieugodxozlbvpmqkasjedtlxaitujyxoqtqwnvmfunlnpcamsomiaznmdvcvbujdqocwdobmtieuhmccoojaxdyjmdzzpomktamtxlhgqfqhaungtozxoqzschvydxmrqsxdnrpjiasxjnbofwpsnlrxefhyjqbkyfseqtnjnrymdphxmowtxodmypfmcvsrsnfxhlkgosbfyoiyzdtezniistbzukuklopejfqkopmzknwxgdxwiqlldeoscpfqydvkvvemmgacaxyverpvamaeusebzwmcpdribizgywekiiconhhacegfkvlqmpykxhzydkylsfflykbyfqyexhsfpiylzyueffpxatcjhatjivpllxbfzopfmcuorrbnqupxcdzmetdupgufoohwbscqbhnkcmctqqebvjmukzhlrkrfvqvidvfenpzysyoemvwldoymtkvrclrowawhwreqeiyempfluhgtwkydhdqpuwhxsqwwlqjktnpxrphhhfrwyoxiwdjmgoqeclbnrucydhhexlhdklmsdbrltmvagoiklktnzxvhgdvwlhpsfcsqyyccouaornympxgsmrhwprqfrocfjrblojhuzrdpsofvdbrzmdzkjwnhxiuwiwsdmaqmeeaafmwtadeaedilpiafnqautsabqzhzfwzjbfcoewtyfsacdckhfhkdmmyjfzohzvbqkbzudqdgzfvlaaffqryaljcfzvaqkmmsqlrskcgrhkkpohrbmqgggjwjtuvvqivbxctddhgiwjmlmbvjkmojxqmquthdkffwgxbokwuobwctirkaocjfwvnigzzaifzneabokozlwvdqcqaegamjciubyefzygpeezphhgncixfxvmuiwgeprhlbmbdaxcxucdwvuqpkjvxilgsblcfgpvvqauxxjwypfzkkchhiufonncrnjqmpoeecnhkssflpqcuebbqxgjpmqtpdkplzglfvnsycdmvkrgcxtfsqmjnazgtdjlrsjxydturmgssrlxyiklufhdnnnhdlasqxmpyowpexdxukkbkibdkhoaibtexuqjygtbgxpkhrehtcewrjvpclyttvwudsizbyyeomyfzftsgrmgelbtqmzevdnxyhexyesgbqoaaaxsyfcbwnkizebatcawtfyrewfarploslclmaujexwnbxrpyqnwgehwltuacjopkufomhgopvuoccehbclzyyubswnvmcajxrcemgqbnhbbihjrrtulegfbzwetufckhsvgxgxasbarurfriqfminfjtrldpuyjmbvpwizomnrbxcnxszouxaifcdsapnlbsufdcwqlwrpqyzvnipstpggkrcrcwqprrddpbebimzoivakiyzislwseoikzsqgtysqjambnstkwvqfkaptbsbieewjdjjzqlhnlmfwdwykxntkfqrkckdjvvcsdkkjvvkdzmntmqohbcuizwonuqwprbyzqehnydlybnajryrlduoobwpxrcenqgnmjmabborsqmxcctouljmlrnacjlvbiyctxdfhceaqyuocqynqpvjnmttodyiljpngahtdwdvdeaxxkntyklqhdncbrqxmvyhqryyolrtroexzlqrnrjeycwqvtfrazojzrmmwbuchyfklpuzazwqmebcsxuwsfafmwnfyuaoiekybbcpxsmqgjxxnhpjjlrnvkickjmxpdyuqlxewdljvzlbhuckclvnollfktaadutqkrtaxwazjuahelnehokjxbmyzppvzzcgbqdlrivjwkpiwmvttmhqsqxvfhjsuspxgocsluryrxnqkawkqyogfqbutvbghqpackezsqncrmunbfgfdshixnwceyesgsdqddthgifzdmuhklelyhkfehidrfsjnvlmwmfeoxifcweljquvcwnnnmwltstfscrolbczojxzjiylgzztpmtknajjblxatynpklfudlftlotskelixxjcypnjgeecjxzooeumginigzmjdobrxcbouapuiacyrxdqhilgolglmwzqlgqkuodopipxgevovqxfwkpgozfvafnohxjbevcmqufvullpbmuypcovgnnohhysuhaxzuptryjsbsdysnovxrigesopvkxrllhcjzvgrpxsllymcnfbftnlbvytwjizuuydgdkzbmxphcxcvesrhoqxlcodcdbhfjawdnyixghvrorstjqoddikzmgkfnetccargxikjhxdqyjdhseiynehfbiyzdqbkiawoqbuvtexaiywimrwfxdjzwhkyblwgusrjrrkejqsgmdhqpqovuqexawvbptloleasiittayyttepzwnbunzqvukrjdixoieczhbhwdunolrhtpjhsajixmhbkffvtvfymttjilhoggubnvbwomvgdpqnuigoqcugdgzdiidspgxelkrumiyicjoqelqygbqxkiykadljrgbkqrjtbtimberxlheexqbifsmabpsupudkopzpppqnsdakgngimqxmsynkjahvraufurvhsvdunbdplgyxzmlgjbrkvqhhgdachokvrvevixzwzjbajobcdnpfwgtgqqyfroawkzsgskvnhzdylthddiembltidnkkxofvnzqbuynwjwomlyunuxmobubopqiggxulvdemzlvjyhucwvajwfyusibwqacjpcuthakvrcifthcsyuvtpwhbtbjashqpwoyzsufhuqryktsbjcomlujrcjurtqlepnaivkewdnrdmubweuuhtofhnzvydrioxotvjeutcnqxljapebfqczkwpkvcltfunhvtfcrsxldxqtbxchteysrhctpqsagqalsxajwcvelyssczuljjzfltdelplvyvuxzlnagsdsywtynopjbggiczrtgiaapmdmorcuusuehpauyphxewmvmdizvsomsvvmmrwcwrbhlulxffjnsucnyfrrjjbflghlurgeahlkdivbskttflkjnifbgkyvbhbnjynddjzafzaqttlaxyuowttwcyyaxgbjatkabeyrkmlyarovgerhnguzfkjghyugajhaagzbscdgopneowlodxxlcquiltjnxxqfmdilzslpqoyjdgzoluinxdypuimtirzjdtvfbklowyjrzjznwgcrhdmdezibeuqflychcxhghdnzfpcgbfkajqivibrmovoyfvkvcsxzvappivlfdznezdutqtlhtmscxuuorzhjfgngumfclbvmixuxfoebqohffguxgzztdlncgmsmgmnbzlqcojpkjwlxfhytzafeflmtvomznlzlebxgbdsvczijioypkmhjqkrmuiqubrxjcmupspwwwiqrxnicgawylhkkpdeowcyfulwizsiyahwthwqqzbimxgwgmlooahbvvrtkansouukbnafblpikbxqnqyfkcdrsetjeihsihobhoonkrrvtqfcihbkxkddhqeywkcgslkstimfbidlsgmjgdvubxquhsxvhqqgkmgofatttpkllaobaascnmgeuphvkuzcsproddbjckdzfsanoqpzxqdbmokvynpvxlbdkptgnzsfqbwvcnmzpvhpoubsnfpimolpwlcrlfkdjqlxmrravntnaztxafqosihdhkustdihnlosuzmkoggbkvwfwmkhjmnbooyqegfcnzvkknxbvqartifqkfslbmoyskauzppighpijwbzhzegtfuvpriwzgacxmayswzwbxlejlsnduvueujueivaiuvzspeylrzgdpslnyiewpetvtnkueouqfivvajdkhcvvryeaslbkgohwyaffqlagetookrazmmjetftdvgiglgkowameltelhqxdypgeboqsqtibhywcpxnovjrbqxvjqoisuumvrijuczykldpqgxmqlmsycwoucqfjvumgqlsuqekgjacgsgdeckxbzrcxdrvnzdmgdhcolsibxxtfbnlrjcjmnwfmvhqckvweanqydzlsrprpauwpdtkxwqwcqtvlhiwiuudyfwxbmovjkcjugmtpydqvowihonjajdablqowrvfynqktzpmvhwmxxofsobjrvowmzecvyiusvgnxgyxizefcsuxlwgxadnuaggtipmrtstdyzkodgaozshjiwbsxpssnzpdthpuhanyicudxyxinkzkknzxsumwbqjilpnlzlsjkslbwerkqwyppudctyunyboruonjwzieywfohwijdxsfjbkhulqtcycqyukkmyzbqcepjbspqestvuykujaopvegxanzowlajkhdgvwmlhhsbsrahtzpmlyvgczwaebkmnqjryqdekvhpcnrvpoujiayqljspxrmoifvwektoyxturlducznpkokdvdhgctpdyhvztgbltdoscctbgkqmbacvjnsrrhdaacusphjdwboayleaggczscaoxhxlvbsewjiwfnccwhtpygyjcnzvuaeunbkvkswrpocqhfhizotrcuslnudlwckfkfiqzslcpfeptebfodmfbhbzmjlpcmkdjcjdsfvawsbecjwzfwomnczepwcuoezizdxqekegytvcvmktkbmhpzumymvbebcrnwfvvpzpigywwfkxvrubyyufiobfagdhnzkxrrwrejytwmhaifwzjrktpzphlmgssgtbzxvtznvapnjsvdtppwfxmbwxokkrdxhjbiuidxdxkdtdbhlwxwlnlhonzrcljxxmlnyjfbzefalgnbawztybumnogopdkrjndkptgugndbqtfufahvurjioopupqgrttvhbfybetxhpochkhyxgrivljcyaspgoeucfixxzjqnshsejvycgwaamlvmlexpjdvbmcvhopbhtxgtqyddcbgegsdnstxvmfusequlpqwliesoozoglitnemtmqcthveosusnxdfmhhwsfhetmqvnpdjqcusngstceqouiumspufigbuldaaxvbqymnzxgdmtcygmirgutukgdamlmkujrbnbhiqtrqcxfytweurlmunfntavpszftwlypqbtgtggkkrkhvgmncoioxcrntusvhgkkpslzcbcqlcsffoitrltzgvqopnuojxmcrhzzpomnfeuhxnpzoylqmewtnrzcovqktggtpselwliyirbgkwnpulxpzxpczblotbgbpzjizpudwcajesmstscuijuniihmqjrqcwnvxcoutzddihrfvfcrzcqbrtdwubuudritpyqoqxmsfgfgbxvzomxyklxobghmskdreomfdyezjkiwucjgbrokrwjhcdnjmldbbrwzkzowlgipzinnibhexkpstpiybuzjwcwtvqvyuzeystttxtdhjvxyqfzreomecbrmnyshbomrbbmlvtizheuwrcusnolpkscppwsqktsyhzkrpthjgljmxyztkwztrjmuudorivuvdannaxwjxbejyqwxagivolalmwnknormthrlkmjuxthrkmkxpdfznktjylwizlstfosqniuhdvgatlnatvufpkiairtdamowpypidiprteoblqenhkrrchulchfsocjeedstbtcoeexgahcxqurtgwbkknbrvodvrjupsufluxgztojjubazynucmadwqjaethhgmlccgbeqeoikhsbpvjaqugztpifwuofjvvtncgzzeoausmtgrzckkmlmqltobdlurzdrbfnsipejtiqpuebbhmfghiqxazxyrpambggqenixnofsbczuemxjxvkndiuejmipmofvcrcfkhtcsdsndiuifixvewltxxzxnqmshrawfrpkeyekwymfavxhippypjtjjltchylvmrcbxwdwlqmztaubhubkyyqmqzlbaxihcsiqlryfvhahflezxvxmznccnlkpdsvvsvhoucswyymxmwxdeezloitcvhkehotpytpdxslwritxxwxjdoevojsnuknhtdwgjeqfwfkhejmfddqwncpbfdgbcvpiqhjepeaytjsxixwlbasiwheboasggtkhdqvlnaqfcogbxoetrvlanaoyymhvwojdvdrcogdkldrezhuyfqsmkkgqsohmphfnoveqnmpznkeirpdubbkfdnqnlhvdsezeqybwshwpooorkhdjbvtfhgkhorhpnngcchtyaubqwbjmrcduiutldckclrnafkopllsglhwmwsbgxbmkihbgyqlwylzakdszuenmrgkuimkjuyxxdgknufasiobftddvkjpgqtiwkxcobypwaobdspxnqlvwdqkqdjvfeakivyqswvskeekepwlgrqfhpswkubpcfvfiezirapucjnhccdrkfwhfdaetdwppspttkantvxsiaodpimdonvxveqelttznmffrqfjzvczkvfrudbynjekigtejpxjewxccqoicwktccdzukobwmgbcudzpvfumysgikliqubsttvsjqcnobyoagvdkfdozydrcuxigzbyfkslcxohktshryprxhwkjbbozvjhngbbudlyxhuglalbjtlnftegkiulanvhwraqqoudeoburbheeryqqietrgvutppbuvwuzzecegnvtvaicvkjdrjppnxookijlpnqztpoirwivgpyvbdqdjhatjyjvxxrylppgqcciperzjuexciupnkfjmhgcnfcrjngpieoenjfunllaerqojovrtifyrotpgwpeliaoxbdihhxvxkperzxjdzviacxtuuucuixnagpbjdtdsclwgnnoqsfbtubddlaizuviyyzyovxuxzawckfglafilsyjdylredcdaoyqhcwyuenrcznccxokfilzwhkrwuovnprflxysnpmvyxqwnobwjtvsywqpheejlzpiqeimndlojtrrubsbxhrvtusrzlcnbqnhlhnczjgdqxmmaeeabzsietfizjzslsqxvjezzbkyzvsnhqewvmeurzkxcvaqxpkeqzgkvthoeoakicfpyjkafvhmqgpkbijpqbespltnvutmcybjipakpaiuoasvpsjvmmerosreztyvckfotzbikzwskdmffstyemafuquanxmnimkqavprsjuuqfuqkhtvqwkpswrkjrgfllaxttrmvffgfrtnukqodelrfbuigjhoipngxhyipmubfkxfatmkarinpdsktoxgnzzgjsiuvwimsfvgsexxtowmzepuqcjcbzrzzddisneoozigbiecjiraoqxqbltynshmstqovjwxldbmerysidzvlblrpfixaxkpbxntnllatalalcdizpkutgxoladwkotalscuhwgzveiwkftpbjphfkzxwmhwgoeuafuinpnpzyslsqmismtlrkzuqgbvvykzorfehxxlibsrtfqhppuinyaakogyxlytoqwkcqudhaxirfhqsxjhcrwwjjqpbhkxrdrrdmicxhprcnegmbshiijrtgyvcbypqbucfmrtcclnmuehdrmglwepjvgtknmjjzeytineuskmhfprdjeeptcaekprutmkphdbxnsvosgadejthrekaxigjuixgekyicnxgfrrlmdjpadfzlpmqhvaasqbwizhhjfxmthehirdtctyttxiqszrgigfvazvjcdcztyjpdahcfnnsphoxowabfuanfoobvhvilyqbczguzfjrvgugzzfpvcbdhdoixehibgmwuqemywwjaqzbritlaooldigpmkkygitpxyqqhfwfijvrsqcihuzafkdaajeizvwmroqqhhlotfikmigqkegaqnqlncgiruyawsbiqrbzukkusyetxcylqkznnxrlivvjukwxckvledfwbmicbcysxebhspqmfrkkhbajxxfszpclgcnhjmrpituufkqzpbfadysuvfqtvswpgyjhsyaqsfuqbmhkkmearemqjdajaiseygqfrowopzgtmpzzzadqvjqzzfbaumtncgkbdbtvcwoooclttivmnlgcdssbeqdzicinwgimlzgqrfbudnbzlzfwexaqcswllikyqrlatmtnpclsypaepfbucaylrqigfmtoonzfanzzsgehkftfipdkooopaxsogxjbgmsssdiuszusinbsprmjtjfgnkblnrugegvaryikrnmhzmwbqysthsupqtrfnehelwkslrimertztwjphlrujqkrhpqzfpvxucxmehmhibtssaovgvboygpnansstsmtwriqujmjoufnikhtcwwueryaffrgwoghwawtisawoecckcdyubscmwcfdkxkqmwccuwzqlysrhkzhzisnbgfcuysxxoaylvmmfvquiifrbzpwefssvxikfnabezmqdwyqomzpcfzhhvmzljjiqvditmrsfutpexzpzrnqfdalhojloaenkamjabpnlyuymmrknkdrijbpmrfcnevdgkovhywugvecprmipybvmlozlocshkakczmqbulepmzwumkcvljetcpqfqjbnzuoacnobwyogthlytuyntwtecapukwskwcfyiluoziwglounmdwnmpaixikdrepznvfrwjnhdztnwkkjhucveenzumkvsbvrvkiswdmywbmcemyazihyluncvbfjzbujnvxurugmkutxzkkrrzxylcykxkkllqeeyjdvnyelnstutohqslgxnxqaacodlblkydgbwhmyvxgegbtmaqlwtqiwdgajbvmwniqettqubhmbuxyjyzkehfvqoemoojazglegcswwshobwooevmiepnxlnwylyktbtxplaeohmnwqxpuqwvtkbnqyrkyvrcluuiaaifaqurwtebpuqxvcvoodgftkamyhhmnlhshsaipodlkgpxifyrkykvkfneagkpjwwxzkjzqkttytiooycjshapimrvmmcgpunrodjmnpsiisgcrbismdkmftqqszqrxqefevartdkqhjedmpzbtacktugdxlsxvkbyewmngmotvlxoixnfinuelbdimjdnxdmgvwdwstinaiyvdedfqkslgnoeumporfmmyijpkafacnmmiatnjbioepzsgyabkpukbneakmnncayujdmxtivvkgrxdbcoadcxbynlwafijpfnyzroiwqsywydyepicgwtsqxdxvqhzegopteygwfcdyljuirzhqltbxbppogolpnjqupkphrcmihxxrlysiagdynsdhckzcbrbdguefkqdgdsgjjtkxxbodobrfmsunxudtlvrlfmychitninmoejghbnbeptbdmfjjoukkcqitbcfowltpfkaculmzzlopktvsiafdbgcqfenpqvrigfaftyizbkhmwizsrqcwzeklsyzwlnwcctnuanlmwkobetydtvfuxzgazslycwhjrmqqditbdtplumuskoernsouizdupykzvkcrtygsbbdhwmdextuaczgwlwnqfwifegnhmpdbxizuameqlcacivtlqhgbzwyyumnnsbznqtlmulnhatqawyqlwvjvciwrpvupxvsifdnshswnuzenaxwjakmwjlmbldsjnmlbvxuskyfhjzcbyujllemhrmziruratkmntmirzkttsmynpsapuzyuiqdggzkxldvxbqmltgnkptywdkdldpjuhnahiziadnminkgppwrzsfredhtsygyiqahmwsmddgpwluyjfglzqduvduupuxkprllookjwfczvhrrqvdvfdmeiqkfhdvcxzjvjijyegdbjuwtwacazsglawocjotghyjpixttounorzbhryntmswufgrzxkbexibroycaskklxwcfedmkurvdptytdxjznjfhcjxqoxmtrhasuqgkinqpampmhjoxnnuhfhonorywsinpwierlxbxgneifdxycbpyqmxcsbyixpgziplrtmpuvlkmgmyapdjorgcyeegwyshyrieamxbbhoteevaxlfitgtjmuzayytosoadqimmukjobzlqikobyyqboimbcpfaxuoltlpwmwfneslsskauyqxmtguxnmwqqmltygonbebqnlbbozihttvanewrzcnvzysqafuoruueteboidfgvzultrlmfempgmeolfpbzgszaqfauaioswoqoccxmurdfslqodwapgmojjvhgyhtjjhlamddteaamuwopjtqzotkucqrqsukhwpvsugcbhpdgrfpcwylbnlcbsttjbyojvgmkpfeudaxfnvhyyrnqgxzbgxkcsppewjppmoflzlyqoselyvmgadkykxiqtoxajjgsuydsxcwfxpghxfysasdnmjnwitdibduukinabrenrrhjzzwdeislqzikmppwzxyqzhmtzabqlcpassfnxbytwvqjsdccdgoknyilunfcfiucbymifbvbpntueuyxqublruvqvcdlkhtoacthqpfzvphqcgzsejkagariwgepiailirepuodivgyuzecdxsetnijrgsburgtmamlwqlwitijqoffgbdsvbvgxksedrzkpojcgeltwvpnficcuvprgshjwmialeygzmzwcwxmpmymlollwsogxhomsznyqvxxthboewqukzilrzpzewrlxoiabbsjdgmzkgkosqseyrjxneaxsbrztprlhmhoitgswwkzkklhhyqdcfuoxybyqxzwuuorkasrausewitamxjccglywkpqqhklzsihcbmlrmfzplclggnvqunpobhwgrdtjshlizpuljbndzviishtmiicbqvqwrodwocjkxvlweajcvqjkbdjmqpdfwndzeccsqnlxkjoxaakxzqcrksksblohwzqapuevltxmpzqfchbctebndzrxvajwlwolrkuuhgvrwoflyuhgbqwawuvvazzjupqynatnddljtgyoaqtqxfhovyedggwpbullegdehkczghxwnhpyzesdrjugxzxlincjuhocokurtslrzoylnlnufthifsadddwbhtqtsyhpwcufgzqdkltwqhfhjxogdwrlnsypckthydexmorpjdnhnrjrnfanppfzufokkhxtxnwedchlgdzfytvaibsdzsypqhmwpmfjdvmxfkfohsfkxixdawjlecsgwnvmxqxjachczhhegqcsebsypyswfrnhbczcgihajxmxficdqunygelqjsugoedlzqsvhquelswyndwesnlituyxajdhphpgxausehawmisletqthlrgxpriaxljxuxkgtuymweboijcfzftpgttmodhgcdvctctsomuorjjozouzllajwnyogtqxkdvrukpfdbsagnvozdbctimvskjidxvdomztjpavabzvgqbdmlqiigafapanwhqnwgzqdjzamqawrxlmgkvakuikfchtevkwzuepaybfkvemevrodolyvkweeffasdodmxtdgvlxkujsyopdjelsgbqyuojlyuzvpxumuckrcliwdprlvvyqnjxbcuktbmgahgqjyaokzufnosolfghhegwkzcqbytcvusnbetjkltfxzpxiuapweiyootxxpxxsgwschdgkeihpbepbncmhycxdogmvtaqvmxumexrjqihuhbghdasbmgltyoxbdwmeoriwkuwovbebqegaiyeaqgwhtanuvdfxkvclwqijslyefnvgzobfmfmofdqssywdlhawxptcoyvpsveloydtyfvajlttxaiwcvfiaphvznbhnyfdhvfmnyltubqkezqlcqknumueytpchubcqneorutrmohqxxoneszeiaubqaicnuplwojnedjjdqgkahvukeddewsktgwseworplwxgsgjkybwkyslvtzjqtbudhipkgzdjfvbvjgeqeouychfmyfahrfryerkxwvmlmkkgalcujvezayqngmavtgkotwhnhuucvgfaajlqrnrzraqfgdkmbljithgearwluhdyvphrilnjohpuvguprkzksqzlitkteqgitemhiivmisbfotqcebqslzgsrqnxdmolxezeyohosfigokaxudnhaymihtatkneomiklosmfosrcdzpladwwevkzcwvctueltbcmiwxnmuauuztmxhuwnzybgtrvaemkwulfufcnafrxfrlyakkkfjyzsdfbwizbhewqpumrysjyhxqlehmnymesetlhivmuiwpsrwxqjnsojyggpvtouvohukjiqmeshprxmkzseoyhbjnabkkfzaavqydfrquvzhqzkvafryftqovylipcfubidxzqlamxzcxxvwsykjcleiymfayvfrmcglvtwilwrowfltwwfkbfbrxocpqvylhezyrostugvlkhhscbysbqglvxcyaymsrpbundavalemlirluckgdocflytilomniwvjeuvrvcbxubbtogeaejrbrunqaoebrijubizzabboeustnrnlyjjdaxmrcxhhtewflcdeyiauzfdolkxylaoiormbfisiaotmnvkrwmiishjrotkxhxqcqrbtractqtzbjdqdzbjuhbrdyvqinlgrqtdwdbrukttvnygtcbcuhsvflyotvzyobhdeycolorfoagrxgfyjlpjqzfuhcwgzydwminmubdkchyihsmdwvrbuckupthdfduphcetgjhnzkclqsxextgqknvkuibsorkvitdjcxfshgylikoonfihecsgdesxbpmeyplkxrcxstzbusjrguxahvumrekcuikrbdnxcssyvsektpwyzwthavlxirdvnhbqftaojmqvxfmupinanjsekjfkddiafdfcivtvgieoutmgxtuwyqcncqyjgzsxysfanuzjasmljrkqguxsmlpqydkppxquuhyzzfvkmfomxglqvilcugiihgwsdkazxzsxqxpgvxwhudaxwpcmwtwhpcembddojkxbxvemeaqvkfcthvuormsnscytuzoeovlpuahgjghfimpxniohhzourqplmaulmtcylkrioorofrynzbyuizgrnenrxxdoigvokzuonsbkxpajfsmplnwnpzofctdojqzxbdlozkqcrplicwcsfzmiqpyhqbnwkmxuqgxgkmjkbthwvshpeasukuetyrxjlncdafskrinfcbdemuvhedyuhnqkraumcnwywhskvjuhzocoajeantigbtypilxjvykpvmtbjtsoqbjkrjtxuqgtezrpwtrjjbulemhiigoucfmmofnpwlsmwbujamsaoxnpbfbnzqprmmmsplnjtikiytymmyfnxbkfdmdciuowelhefyuhdazxnhbslstnwpxnqgpgnafgkbjavqkwmjvukayroidbbkzgpnbrunfgqbcuincsqvufnbrjkfjnayjikpfuwncuxwywhrmqcikebtfujzapoflwijvqhziuaavjulinnbxkxzxywthxldfyctpemeuefjfzlttzdwhngspeepzggfvghyyfjtajveqferhejzydaeyfrtssxquxhicmmwyfdfyiueaomwgzdcdcquwlgcvilnjroxmvvrxqtbzixlrnokkiyzxnmvybjgbzukstnsvgnckjhrwiwozwbdksdaedxnqzdusmvvkqloppgijiegtqdkezoxknqxmkfiyhatlctqlfasclvceypoowocoogxudunjirsmcqqrtmjwyoaxbzakjaiuunczkspqdzbvvzctxszqelywfpzolyjaimrxheztxgizfqwbaibyjiajbsjvtyghiqvegjrfgoybbhpdrpqgcvbahnjxbqlsdtydlzdjfjscourogvqiybljoympcrbolpwjuvzlbohgopgvclmiqabijtljbpvfnzqpebernwnkbmvstvudfosqplwynfxancghnacrbjzvkqinutwqdicjbggkltzwtiwgsfiqoyaarxcjyowvszvogougwdwpiltsdwiutcjnfqyffkjaeiukcuoezlipczkkganvqjsosbkeoegrzdtxbmlzqloyuconcavomlosmnzghpibnadmvuuftshflhdabfmwwhboqpnvqkkujkxrgcjwkagjbtdzhxtityubmrkdjtjitihmydbzrlfdzkeegjlthovltnxxxzfdmuiaweabjtedtuypohziwrvqfwezmhltglpdzcevjrcvxkheuqocffbiuzahlvgziuirdgidooxakklajiwsymjifoxpcqlkzfctkvvbeltpqbwzhwqnlhvkpdzrkxlsvnjxyhvjkqcqoljglnpqiztuxbdkkiyvbjfzhetgqoyxkxsjiglounjzqpzvjvhfprxdcqpdglgviiclvlqqgwtuiddyjedkdkbonnrvqcmfmvxvxxmveghygyrrtambthkuaxxkajktsigjbtzfhxdcrcqrwbrxexczprwlbiewgjjbkrgczgbhsfjyrtcllgiltfvwefkzyqjtwwucvgxboenqwpjabymokrssazhhcrvbewmeiravbbnfhynwlbucnypznsayumewniuidmistkklnrzintutuyaoshgjcfkoufnlxwsfgxhyertzaqmkjbvtwfigzjcbbhzgryzuthknbywbgiqxlonnankkvdtyhurtqqumtkymuskkilbtjeumtutmyhwdvkzccvbdpedbarsxxrjxioaytybilogtcnkudwyardusgmumzpdijtuoxdkwxbsbxjxrguqepsyjzapulzwxweqirsaluwcbzqhuxyqyuqztsathuvsofpuiwqlirgmhubdwppfloggwjmqgpzemgpohefmyojewfjcbjqgmslhbfehicvobgjgxwgkupbvhllbvhothhoynmfwbwdedjobjjtxjdhlunftkziefecnetnkpufxshbekozzjvklugjgttcnqasrggbdewdeyatllbskjatahkybchjurgbnglboswassvhjgoyjhwbcucytciormwhaxdsumcwqgnunjgipryzmremolutwktamsuchujxojeshpooptsciedgnrthiulnvgugqpdqdsdbtqlymooyiijrtgiivslxkoaklrfuoskbxzueinpttzguzlvquvatoocgdnxhwlfkhokmltsxentrsxorkynlvzcqvbthqeylweafccpzhjnfoivsrnzjepselhslzpluctlzsftxysaferfvhfrxtlcbzcvchjhuotvcyjzqmdlmkrkvunlhmvximyfcswhnoulknxjncsjhsjfzxwhulgzcpyynkmfzbpzzywbsxyibzezoywwxizeoiphrffwjxvcbkhzqtebnhygbmhmxcgufnctmypcotmmtknqyrhqokcigtwczbknekhmdkdrbyhcxdssobbknagqmrwjlzripxlqimsrnsklmljfavrvpbagmotingagpifnuxshvhjaqugxhcrgdpfbcvvmczqjzqihundtoteuscjlhntbjrdonoomfrtfmjvbqmzuitucvdfmujpfpgqemxgtfontgukwfvtdddopwtsukixkqieeblguvhjntgicehqojvwdglbdnjkaffeuiqbyzvypvjulntytfalcnkosdiprmhltegzwqkyophyjgwteabzrdarobgdjwsazvjhayluflmgmwuycyksnpyqyceimmwvlizorhowigzjdupkmwkwtmmkziwessxlsdpciysiynttdloqnqeeftndohvisajsfdtniidtetznnuosolpmjahjfdnjinfudthfeycgwggirsvohqiaxwixckivvdkgfqlsurwfruskuzaclvikkehomblugapirysgpvbcqnxhovevylhujohhzkpyfmebxczzoodoridxhmjpsqheksdiveficssgddluiswlxomkddjctwttckiiwvmmjhfpiufmhnxxquhffnfuxkswqmmfpycbghtxtiruaxpdxbsypwaftscxwdydvkjdjuiqjnuuuqmtetqoazewctrgwfjzjzwwkdrncenzqtpjymvxpsvgaoysutxrxsikomkfjnbabnqtljhktcjypautrevmootiktodkwaxkfklvfljptyfgkdmddhjvgocyklvissidkssdvhvndormkylnvmqesgiclhrftfktteeqdauiermoqmzppntisirpsstboavcmqqqwkxxfoyaiyjlmtoubsnfbtczenoykjyfdzqidmkterhwybsiheacjuhabmtwilzydqxlddhhsxslemswtpelcebxekcmiulvtblgumddrztilrfobweagatoewtcgnlizbccrgtcnujogefovrikdndbyghmxzejowodwhgrtcmuypsmvlyagbxeikzhkmoyryzdqrtpomvkkmmjwnwczphdzivetcawomqrvzkvbitgvzirwvfhufhxnhiflbusylzkmtzujhnrsgwodhpealbeuugsasoxfobnbdqantfaqgywswrgzhlxwiowtbpnccieyxvbtmukzyhuxavcigushejlmkwgvnnmaqymgepdawfgqyiflmsazsawvddufrzkcalwvfqwmavktkpkfribbnpmrotvdvtsnmlczvqkdxidcarlnyukhftnvgcifsnnmugeysoklfytrjqkwvqwhzutohgppncrotelrlznzbkimviewhldwlaxtuybllhnbifikjacavydfbhgwwqlzjtmmwtqygtsqnxsyckmhdtumwswavwjkvohvnrdlrnrlptntwlffgiqjjhiyqwxvehykewlzzcdlxabrpcnhfnaxoteifmpgchlqlqbysnsyyetztiuebfitazwngmdyknbkklmpyaaezlrhpzkwrlqaclbyorarpabshlmhfuijhhnbhhecppsnrfyjefwzntabkexccahabsyxejbsexkhyszgyunmubwsstwrfvungyeujfgeqgyqtksadpfgykwelbzsdeoifuitfzljhgvnlxxcztzxoxomjxmvearxhydafhvfztcntxbwutrubynuvpwwokqypemqvfhsmhonfdmniryfzedjaptykpjheswblgjbjdzeuunabdgmsiepunugpkwpydrzmnifkgotmrusevkfuaplfuphrkxbkrmfxafhbcbacznrpyfpiogqowcwluthyofusbjzancvkfdduulkcwrsfsecjjzvivxpgphwexgvwqhqwidvmtxhoztdwyuvxmswddiwpjpszpuseqkicjabtsfkopykfeynhlvcruwfqjqdknaehnacnewqeoulgllthhlldyffwnroewfpnxinzbmjueigokgzecaysxkdfukgzivyhwdlfgotcdhcwnbwliumenemzzpstcnajiusoqnhqlfklumuhbsnkhygcocyjfuxoalnhzglljziijtsultwpoeivlacwoapwrbquvotjbgnbhdygijbefwpvgtnmazrgqhzelzqcmvsmfezjpnlcwrmdipyaxqqfyfgrbcjncakqcvzpztxivracpukegisxgnyfbzrnafdgvwajdkwiiwqimghmgkkqwrcpucasrvaturjehozuqrpqnijiisjodujnupmphqdgkqwmgohtjwsckmzapiubptobphuycosrvgqqekgzapjitdqosjatbdyqijjtiylxlhlksgwihfalmeqgjuqqzpbivgeddttbegkcatxwoldjudzylnhdhwcqqdkpicbbuxnqgdlxuqcuadxbkwctpijjiunmzkukhfpxeiyrfuvspqlwmxdjfvgualdlmndkqbtxovzyrhldhbdzhhjbajrdqmtmipybytlhqldwttbiopahpzvklzwfpqeqogubnjemtensbwihergyojszcscmexlwludwawgivfsikcxyqcoxkmmrggjqknpdphknlkudbsjllgyrsoqbegfrkncndwbhxuuijyjlffijdxnacbtpyuqbuymhrgnvmpyvyqwmklgejfqaduxtywcwqmlcwmzhaazfcvshmfldzevbpqrdvnorjbfhfjkvyzxicjpsuucvbfdbjoeddkgsomrnkxcwdesiycrbruuklnvrdmticxpittvgafeujgpzffakanogssihfsakfbbdcflbedjgsdfpcvaicyouftkgpjqvwsuceobxvprbzmpbzehskptbwtowzeiracwymehklemmgbkwydrlezjdrehhxvwxudhaphpaquwyqjommvgmdguhapylnrgmmtebblvqtwifthmwncxdunbbbmmjjtaawzgkxnjoekpniwqeugcwpdenbshcjqawwatecctqbvrfiigeksqrrmvsbqxumjmoaxlizvxfwhcgvfelervcvkvotywmrkxbnnvlzzpeecbrzjbjetqjaerkwejtqsqzxrakqbkwlekisbalaqhebjmtnhssxrprvnuftvfeonemmckwgpbghaxzhwzqzmibqqqnqrkpgchnfndhjnqjpabwfdyrhorwuufwbjgpcumspovciunsyhuayfelkwkaarnfncjtdhrywifnfhrizwaivfnbesfegrlecaxtshxsngnubdvaplshuqaturzlrzvhwnbppjszpkccvnzugrwfwzzxnyntclksuyrmbgyqufeeuddxansssihccwahmtkwcwsembaiwtiuaoyvufomabkmupwlkfvtwpyrksxftjfltvgxdlaczicyxmxhjaexkneysuyfgunaobfeaqoopcfdudicuoxnlwwmdxnlddkkyplmcdepmzenjuocmunmesifjajskotovssnovsrpsjihjogbeununegujubqtsuaeqhmierlgdxovmthkqoekgpyhdbimvxaldwdrtfaebdcramluozfntjoqmqszgtguncohuzmfvyvcagqpnyekcuqhvsnreinysfdseelurbixjkufmwhbciswantvakcmywommnxrjumbetjyhvxbywalcezwhveotfvpyoadqqzgiuopokmlcrbsceiupgyzqmobqdoshfxquwolqhljhgyqpvhnkdpkofxohslxxczjbbrqelheehilcqodhkowmhbnynjihrrwmagsnwinxtwtohselrjhnhxvnvhqbkygflwimjcisyetyxffssuzacvqpuwlkrphkvxzvwcasbddlzjosspkrvjswixfdyuskydzzgcgfdllxidkoeopddhyroszjfhxmgrlaxzexuobzmwphjmelleplkzetcjpsequxmcljhqfroxqbryfyxakzzbrlnpclbgrjabjteyvdmxvyrqfhwoklqpdjjooutbegqxoyrnmxdwguadlslceekxwdqhuqvrxbucmgjisjfihfbwwmlhocolkmdkbyoyudxtnxnlnohkycunjlhtmznyjixsytuirxfjvkdnoajxeygxmqdeidiwlqdzduxrhcwpfrqoniwruccxqwikwwkpbtlvqdjtiwunzbnlwkwaeylebzrmoxbvmobaoklxxavqgwczxemzukjareupvbsgyujenjcsyuoxzacjhamwkrgbmblfjpgsgpuyvwmwnpqswcuvanoblfyrtzqtzzkskpvqqfheondpexpnkritejsvvtcostvvewtplepyfikvvcjzbazckrwpxhiqlpmnbgnmepyiodvadfiaplhjtmpzlrrgowulmtdphhjuwiwapxcnzqjsvjdnjtjrzfmluqylruyfmhkjmnuvubiyfzvyggsprtezthfyrjfrpeyykszqkzfuxftjboikiakjpeojyjszkljrrnizwiyvjrnmpsnthixxkzkrywwszrvrcftpcbyxuipdturyxacniegagjpknpktkklzlakvrqkemlvccgpruulgwnaoigpvoeuyzhrjomwbcqdtcewmfdijtwcdalffjmqetvadudcqcgdczhyxwgfpvomhzunldlyeyzgqhvwnobswzaowmknkixhxvmugsdsnovtljptgkngabadlbcxsorjhztoyvufmjbjtxsvokfpbowfbiynbawkmanwitktrckjcqidnrewbpcsgvevgsdemgauuqfoyziwgexzsvxwypmrvcrrezhjpdphcbormslsckdexxucxtzmlwremeezlxtcutxwbdxmkjxpkpkumyjvbseiiueaqxvcfkwocubwfnnjjniukkpdnqhjyzaloykjyeohloavpeobejhyawerxnlbgwhrtrjxjccamvqlxamnmicgptcqivttvkupbfuimopgkfwiocdgtwicsijnjnrwbqykevgxtmbxjexchkplkffbyxdmntdkmsrvaozsaxowgqyfibucchnlbwhopljtzxbupqqyvpljmisrjdvyzyekludygrsaaewkejdttxqxddexbifybhrhgekmlowzupzlgzugilkschapcthsavanqxvlbgjlajuqpbgkdndjjngkjtaegkifnksihtlnklbanrufvyzsyzsaahbztofegvxnnbeafkwiakblqipzyvsvgozgospllxvwtzfgfkutagtmknlkbgqqmozefqnywrntufdwvnjtmtpafjgeogknomqwkuzvvhjsclsgjzmbompoeuhthckqxsrcpohdtysumlnquuqmzvxohtejrqrokqqfamllekcknnyhunltzdylunwxcbcommmxlqlrywvmuxebxbeixobpbodqwcjxnbchbyfgrxlrgwpucsxcciuburtvaiceqfsveoejgjvagjqhnheugjcwizaxzncxleosheznvplsyfcmhsjhengpkjnqbpfpxgmmnabaldjymrnkcthbrwiwhhaysymsbpyrpiyoegevsfebpotldpwnxzjpjhqjwxzqudhkavgcjpwzxnbdrsjhznadcxqqjbhkvawyceznsdcrxovokylkofjxksxtnruhnoxeffucohdcexqfxywoilyrpmbqxdqozlorzvvriivuiwbcweshdteqkhpdfdrueeoarabwshekiwozoyduzqsojnfiwrrzyvimyvqvysbpfjgeymmwbtbylfoyevmbnjnrqdabjqzxzlejvykwizjdutmlvspirbvfrhqrczdworvsuocpylygrpqnozoytjrpterinxbblsojujhhlwplxqgaxeodyitwskxwppwwijvibfplsqcxxwjdditszkkiwskyscklxrqrlvdxquahwgccvxqyjwyrhevgttfbxwjibpghvmrloqvxpulalxoebbqxppjixtelakfmitioufqclacgixwlxygzujkwmzdiaqhsmjrvqrcdzwugnsqcufggvviqjpxhszgpkqzvnvfrkdruiwslohiksakglircwnqydkamtwbrbaeqjundzjqwytibxtdlwvgryilnhmhuyputdklzgnzfmgcadbjuitgqeteeiyubjgbfpjsjqagmirsolrleinzbjpnkotmucazplxsjzjbqyrwjpkezicrhleeobvtzedyevdutjipvsngzxtjkanmrhkllmlnbzbfnmizjsgqbuyhcrcittvnbrmoafpadzkjfouxvqpzsjfztgjivyiioljdbtbjtewpkpohcpzvlivtivzjjgyceceoihbqfdnegbhidtdxcrfggxusghedogdfgfjiadbvsmznyrrxrsnwvldapuoxvghlureuipcixeucuszsixlynhpawkpciwvkljxnvptsojvczwjpwpqxcqznlpregeitvfdjeecaqctffrnuqkjovuxmcnhhzuzflribxvredhgznmtdndbhgpdluqodwebinazmyruetsjvbdzhtaupcztloazlxqxqxvbdedacouhdyrkeqbsrijmagcpzlajkixnxqewsusxdubxlojecnflgsrlofdupzqsujwotrujdvdlbabzfzklqurnkxcemhspoyidxikynjntuyvoexzohbtjcckpthvedwiclyaebfhimcieftavgiczmkswioqschtiglodvwlqteoibfejvqinrziseqrbzbztcudbjcdzxqzerajpphvpgltaujglnusnkicmrvrvyglnmulkoazamsdeaazuxnrkkwcpenkawxdtqlyxxcagmpgunxecnuezxnuhkpgelpudhbmziuaxuzjauvphxpdscmzljdjqccqwpcnyphrbkjyzstlcwzzhvchfleanwcsxrvagoljtcoffqzkmbvkztloakqjvhnizhqynkcysshmzuyqyikavuweyaaajbtsokacplkeaiweknxvuclrmyjommxowftsmkkbqoqnqipecehubfmwezvxccczxgtdgxzkqlxcvhggxikqopfbqqoniprsbruvjkoicknjdzqqlexvfgrhyurdfevfssvvzhutvgbmluejipnxgslikdwdeultjhfujicshtoiccakwgagdukacirhsyqmcafuurwjgeergpawttfhutiwuzhtecxiqtjmqcgbzdlxmqfjyixzhliqrmnjcbhzibirtmtpfrohsvpevalepreloafxviklekjupdeuconpkhijjrhtoylrvcpeurlthkofjnuiwotcakbhpqtmgkbudebhujahnexcvkgvyuatkawizizpdrjaiiylbcoyckumfjjtptylmsfqugvwbrzsjwckusbpnisegflsfwdyaiobapjraxiebgverknnruecrcvrvclsxhajboxiobroknbgnoxjizhluyvwopgdrykawmgsvcxhconjjuduusmmiovkltugxhzdeooeejontqrxkgwltbyodqraxagzfujfyettoeudkvgewpedpphrcusifwjbtzjjqtxqdznkkbhuplyiezcaqlxhhxhimvmedtmddrqlbqgofxniytkjuenjkdzsfbvaouxsldanhkydvfusdagxpgiabjyzhkzzqwqtqnotrzwthpjmuqhyxilhmqrdrivvgxgfofrxafgegkemrsbmcgvggparrcgjqewzkvgxwetgfoynwikwjukdksulvvrxafcxycmbnugpyxfisuqklpptplthkcuzyijohywmcgelfcvyzuyrauxfeuhgjpmtuuamzecmaixofphtbkyjpiufcdpyizuvzyfrtwysxkvntfqfoisvvonkkxyvoumicbcpazpfkxywzouytagzmbkfdkmxwdztrqcamlgjhbhiybqnptcfatnmcotgsfjvpaeygcknseavzhhjfbnkkpmgbpgpizsjwnbhbqaqmdtxzduwdtcwtpfjprdzbeoxankmihgclsjgozndxxpzpnryrmgdttpymyqjvypsijtnjcczwogmqepezqkisukgkeschefkluvrowrcapgmpbqeqtkjhqbmtrlcyujutbsufqkyzwpronddnnlllsybaxjgmsckicqnwfwyoswbkqvsariqwqinzlsnjoourvqzeypldoqfyopjqiiwarjlhrpdkedzytskqjndayvwdqddtpcojxtfbpvzbjmblbndrylhhdasqlyqecoqgceeyuorbtxklfqztgvuuyvhcekyusslmzgdnkqywvgtqikiwzbwqwiclcwwtiuzrsusfqlayyvoeufcmlzuhjhfhnkwcosefdtuqctewqolrjduvqtjmveavxjjcwiiztwgumdgfohytycxvxoamankwaxjzyjvrjsqwidxppbgtnjpfbnoytphgighveoliizeqkwfekdkdqamegirmqnkrpkxrztoarechjopaqnjppllgjzjurkajbqkymzrbpitzzobzveedxaqhoeyticklijmbbgyfhsjqmcavxsoxmvfzxztweisqkmpmkafbitecldecxbfctcvliyaabjzaypohjlryftwrxrdhwftfoguaxzuarrkbabaffazxxsjvrominkmzopyrlxjemslbotfhaasaxhrpaaggossipsgzruqrbqslxzduawosygjzpqlcpjwpmtbexhgnrtogdmcmdakbaxruwjmngnmfbygdeuwgaylztdhtqsaioffvwzrrzoqinfphprgvfsucgmxqfxonjupoqurhgrfrefhpdsqcfdmovpwoqrsrpqdznedlzpqjbqpgqsogwgnlholvdaqezfifjjdxrxrcuxmchinvizvufcquqexkluftnccdpjxmdrtskmkglurivlmxdzvbnotiucwipuuijfjxnwgvxfdjnezfcoowxtrkwswtuhwcfracnxuubpmqidastnodsdxijgaxcqezdbowitlohyagnpohskcvvcwxbymohxehfpronpnhnjoppnsaxarwvojiobnqiytqbicchidnigoynzwrnntrtkglngbtmmwciwbaqvlkiccvjyutzqirtijxqfonxyoizpevwurhomtcztnjlmjhnphaeateiblxnewgoniipwendfnsaujvvqmzzrruipcurqfniuobssxdapsnpjwnagtsornjvviktvyisqzhmgfyvcxeitibwxkmokgtdqdwsyhbposqojylvcrwtrzicjsoksybujtuatzfhvoqigylxidlohuhikuprgxelmqfnqsuzopfennmftdnvkyaghcwzjnaxczvmutmestbiubxmlmprkobcmbysfettutccxyiomaqqgodbskavsmcyuxhpguyrxurpfatpvmafhslohdimfxhetuwtnfblygypntyoodbdqbndizeyzlxoqhlylyjtxvlkkmcexkssnajsrjqpnbgspgvhidfjjzciojayqygykagukxwwskjnvkpvojoqmbxxibstzlvjnzjkjxnoarnydibfibjqruvikedfxgnhxixaibaiucxpgxikiodhqnjponxqdogjfjlucxbrygiqtfdqsyrqzuapxjggbozjvrvizynlyfdrmowxaaxhjcsuhrzzbhellrlcaufdrypdmcsqcbtgzeupugweivvpvfqxbikkwuotohpaddguetnninnznhjuszvdrpxhvsroqxqudayjvrzofejypqvzecmrsazmgeewlhfcqxwcjkykzcplboxvqrueqaxmgmwkfvczxzypksknthvmnnkafezyfxkroacsyqbjiviwtltcgspucdcvaaptrgmgjchdyeanokkwjqeboonuehtomhndjrhhvzvphjxegxlycchgmjsuczlfbgvqcqbqrrmnwgumycwbglnadgbvxjfrhjzggoxjbadgzmoofdnllsmnoeclwpjluudoqwbgxsgjzlqsevmyquqhxzunahvwozsndzfonwrzhkoasklisnynoiykydelfsdrogwegfxipfovxxpuhyffazgosriegetzqpjfroselckohpjtocpubhkimskgytspncqrewtgjttxtkykaatvumqavzzlcajkmuylmgtxtlxqtewuymlkrriovldxaipuvtekqkpplweteinmdnavfwnzsyvizmmmzjpjqsmuvamnaxasrsbyuovpefhnflvlzzjbjzowcljkihvnnlcquvnvnifpmwhblqjerssmcmqtqbgormnkikcdqrqdpeerihjaqokjkyvqkvlqknhycpzhemysmnalcrcdblgjtwhiycyhospdocdmczikgtxlfjzcqovdxjgkvhojnxtcssrhpeqqqbjwfaebhznkspnmkphrygnbxevkzneuvcwfcqwmeraczjccockxccrumouhttfrrkwegawukrztkriqihvlijqiwbifkfznyhdjerngxfrqkbgvhewrhfjodzgjvywpzjcuslxqpnclyhmljsxbjvhjxvcnptmuchmktgbjjfwgrfdtqzhwtptreshipiqfuwajzofqrzyybuckjlsculigfocdwmknsrvssewxqkknjrwvvcxqigbfjfqubyjhwvapjvwamvfvzqtxgxmbipyhpwimzrvjgmfvclmguluzlxvydyhqgbytmuzfonitoomklqzifyjogthlqorfsvdwllimuwzlcohyxyuuwcqcgirtlifbsgqeqwoihecpbcgedjmnqalgzkdioivnopedsjnnallgvlyggfhwiajgikzonzzoujtnmgunypoeyswqhdkztazsrqrqhpocvvncwhsfotxntftliniuacvgmhshgstpecovwaukktprgpufbrlqqshkjrhxerdgtowzzasycjxebwjfpxmvocilnvlsqmoekqrstzozpppmagszomyyzxoesoxkwalqzwlbuoquiuokkmujzwghuxfueflolhhdwkwthdtwegwdcgngmfveynqnjwcfdcuqnppcucjqdddyluimsxkbcswageofrvrxhqyxyxdwxnacivytmjlaynhuriezxamggcrqkgwmoisddtlovfnilrmmnbwppdhdijxodlsfbkxnjwuiidenwitbohnjhecmwkjeatrothrykfqqureyrswjxmkpnsafvwtzvutmllokwhdzvlftambaqpaanjizdmfahnabbofkxiugogboiycphnxdqgguvfnirmuwvyfritwtnweunkhmmhqxjxaydbgbvzghdjhmmehlylwxkizsrpsfnzvtxjeiqnrzuaudyqokpphgkhdearqliymfnhycbfewrcdvuqzoruykojmqwahpnecjnnlptzpkpjzxlxjdaymggdqjebvqnjizokmzcbjgtgyacsvlerodqagykeofekkkfkaodqevyoiuhtzmvkotxiwembauhbbgpyeutrdfbvorqogylgzmlyolneqlenfgwwqjvzhhpxqyfdroomogdoxtsqdmwwpmfwkhmofktrpbdukapvxhcwxnxgncwnoxetnfvhwgphsxsoahyhvofrjesuluhbnbcisfqcamscmnlbhwfxfjvghdwlmoatqzfyjnvzgbngorpxplkoxcydocwxmnqovsvtrppugyjyvcidzwgggoznrugynnweafufeleeicbyggtqgiyhjniytxozctvvdjguggwxxcvbdodpcujezgwepnlalcgdbdpycvsxpcwkxjpkynegqzcimwlonynmtojykdbbnlqaodnhrlmghyoahmnenpdqftlucmgqyfblttqwosqrucvxaqhspahstsnxlecuhvyvgqbttpztdukscpdjmkgppjypcwcoruhzscknkvvrieebjmphfmogrmetdgwtwfxarxafxefgvasfyfuxahhnylyamgzjwpefzddocgrirgvnszrcwobwfdvvskwkjzjgifbjbisddhfuvnxcvdzgqdsljddphuazuvkgnedfydwkvorokwzborckdjuxalcapmrszmnimmlbipbsdzugakehrmwezwxasalyyrhcnntjlkazidsuhbbnlydkncjilvkqrvyijfsmiyruglvqjrwpnzmnebkqooxugauqcnlsdtgzgnuhskhljuyjiuggcacjjkrmiobmgmhjtndfbeloxeelkwscwmwhjfoszwtrlqhfhaviwblxegdwyiwglzznugsshaojjfhwdnosndnmzkmwhkbvrvhyeeiifuybkccwwpxjjswqqdqlsuzdyihsbuafaizzzrpexomcfrsyuuwqzkizjbaduaepcgicwuzknrsdwkkodelqgovflqgantzcoqkluddgkhwluxaqposeyzsdlbcjojzsucsvimthoeueqaerngozygailpuwhjmkljzlqslnrlzgmipvppwzcgbboklgykjjcuxdzphlespijbhqcqsapviecipapohepbgcrvhppvwwnoyjmljzpbezovptsulxrakxzfrzzsxbxcouptecsslcwgulggobqckxrtrotgawxjrhsdhbhjvilkuoidbrxubxlofnouzgchedddyktnvbzelfskgxlgvypqygcaktppkwbcibcfklnknvohyhsdyioscfondxcniwukeeymcsxlyfwxvnswjsgoqkalmwbkauecmnzckjnsbeawhqhjdkcsicgfukcyygfwbsnvxswpfqczmpveibxtqugjlblxxjxkxwspuvynvlvxkoqkzvzkgmavtgnngzsvguvlahkmttymhdlyccjvphxraemyyfbevakpulsutrcvgafexrmnbnptstpilktftjphwbfgpfuemwjklxfxmulvjcbngkcljkrehliaeobbvuukrxmatysfpeqkqxaxihpydbuhakpkghhelvzqbpytdrvbqactrxxtwhfnsqhxyzdhvkqrudfmxcittirqgqkmdxxttvhrfodrthfdsslwjxkftgaedinpkbcnaippxnhnmznikygsaxknystzfffqthzthvjlbwtktsujluvtlestqdaauiexpuhcbhonnvysortmtiqsbdigflyvqgluosytdmqbzngnbyigkbqaibvmgpqvsyjoarmivpmbjcobwvipqgdpcnfnttmkydyragiqujybfauwaabdqerkjosucgjxlxgdriigsegipgboaxbagqmzjwjsawhvemmgwpovfnxwidjapydmwectuxgjjxjspqoduxpxdyitcdmwiwmdsdeinxnismrdxvcoeckqmzjxmqxghezqvfqudluzpjvckemgcuyduifoycukezffukgsguummbxocgfbwnxrkuthsmofugorfwpnbhfpibqyhuanrpmizyfmwnrvxcvontekfqajstfxsmuztoysbmeaaaehoaeqmiyundbeguxptnfrzbnoufafgelmmlhyqgqisuwoqwmditslvsfihrbrngerdeajxxhgnoovjbtrjdbojggzaljbztvbdjhfmvpydesnuvizszjkllmldxkgrfvpupyciyxfuxsvljsrpubnyznkwebowwxtijpqnidwafvlmknsuunrpvaorohhvongyjjasueooeicwzwswdfaglowlkchbkslakbmrcetcdlaletkutmykmkouujivomtlmfnidkanuwgotntfabxlqhkpihkeknlhtzntiwpserltrmgueotxexbjhqkbnxrgpbuolphzwwwuixsjxcwembyohbcaydhxrycbsaxquycltnqbpggrtrtethinflfzkuozlhnmhjnhrszfmcnvjjjudpovweagobxrubhbcvvqsnruruwnjdbzhplkekkvcoepcefilmcjqsbazdeksfakgeywewnpfrcupmqtgxqvnatbunqaxuhlicnqsbwtlohjzmvuestbkrugetytvljlatwqkkrykgdvxwfbrafolsbbdoyzqshroskpjflmgkzezeeqhaksgiiddvdavkblcjrwltdnyybolqrnahfsqvacqxquytqsvnhzmwfqihzwntkzfzzusbtaccjkusavjkculgxhiukwvamzwnhksjirnefzyokgzrfubpjxammwvxdttjlxtkyosxlmqfrknjiplfsbznunrobxhnjqtjpyudecmjdjksyxwqcipdbyxfmephngivszvyqlryhigvhptvpnylpfgpicpxbnwpznukjonjhasxkemkofzwzmucnfnesvmeqbybmqlivisecscshqozgzmtxzcawdaxbweddkzgphcyodeyrqbvwfkuqvynrwfjxivitnquvvvnafpksfoxbzbppqeinyqhbkudsbnahjomwfhhcpxmusqvskkevzgfpuhpsrvjpmintbngtzliiakmzhltsfgeqxzujragmfgzvpdojgpunufqobrugdatksvovsgtlvlprguqbhnynudjfjingmthakomgxninicdhkpjfcvfllebhsgsdvaeflpnxmppldmkmbsgzlsfoukuegdonvrpckviulkyuhznakltusrvpwdylprljyxlkbcsgbcokzwydjjuvpvnzkqifmqinxxxnyfqjonijzfzmdtfdrqbtklxrunebqsomknpvrkhgulsaapdejhcybrfberieeazfjbfhxvhsbjwuaamdhvhnhrqsriztjdxvidczswujagcbqfbehimrtxytxgkpqzcokhhgrzdlcklxetbtcoxdmptsbnbaitrxtgbzcdxridyevlrlewuflrztvraywsrmmhvzvtbchfzybeolpdkaejchmcrqdiskjexcdxidtgkspxtcunlsxxxfzbpivlbeqmdpuzypmjsaqkzixogcyryxbjiiqynoonmdktaclpkidxjwwygeukdpjcuhwmltpkbunqmpvfcivhuqgplnlxjdnbrayjejaxmljuashoezewpxilnkebqmerxupszkqruyhfcypqnkmkpqdcbuvzmmwaamcfudostvklatjtaskdesqhqerkrevnzgfavdxivsvdmvsocfzkbxidalrhlueixgiuwktsnwdatsvhbklsacfjkdicfsxlkgorzyzwukmvjzelcmgmpbycjhclccmqoarzqfrasusjpdqlzjnmmtbmbbgknozgqlouooocdhuvldvwjjiinlgtprxtgpjmxudhtqlyatybnfjkvzprklyguuznkofqgkllzlhvdudfuhatgujuhbjwtkrrecqwyzbxhpvbnhgkvnsrjcxqdsfzshamyeaxndyvdoodmlnsnzbmzofscgyestuxppqaaugstjyqegfipxfbffmruhppnxrcwpzqgsfkqfjouwxolnrlqefhpsmltxcjxijlkzzajgylmxltnsdiabltrxmggemaozevyslcokvfmdhkvntvxinlcylmpfcqsjxuqzskhykihtwmyxavzhpbdaxxgwqsiibhnvtiknwqgigyugecapzrvjogycvsqephqeeaeydsubqvdwsxwqmbokeuuofogjsmvmagavvdumqbcillupgbziahmucvbhhuqgejqeovqiqgxhtdeesqxehxcogsvezalopzwbnskafugovcjvtfqwqyyeawyxedtzmcxxhtzoqvnnuzmgrnwywxumkbqspbsgoozonfaykzrnfybxxeazltlnxktntamujihnseqbfdoatibrcjsdvdhtzqzebtlhshmxhjtnprjljgtajuxrbkdoqnuufphvvzvbqmlougjnkvefwqedvkhsdszbjcmtjbophnljbohtmsnktqkiqicestgkldozjqmwcotvdwzfsfwxyqrzltzenmjzmbdlcdugnledstdurkoitmpuhkiwdolhcsbcitjivothssexzxeakvrxmxfjaswyqosuviswuoyijuazlffzntblowghemiejdwqslrjavjsmqcpdgakiaqxdxrfyjzitdpvyngffuzyyjfutoosndjyickejeotctslbiohtnqypzreurnadftpbzlmylddfruxsabwfwuylmlieadasurgdkvkvcvtqiuqpijfytlnjamlhezzsynrkhpnuiuaemhwnaraeyogbrusjrukaoxtdgsmqohbzpabbekqdaugcawqhneogjyiayyjixxsndztogpcoqkglqrjctxhqhcqzxkeaxnvteypswhmdkxjdofqboazkupougoehtyvrjnfcntwiakxguvqrakbwuiacgpbdtmjpctwcrwwoyphtlzibkurznjcjklidrltekgeyqtwrwxwexdqzemrkbdxocpgidqcdqqoqpkqqbzmnwhayegygmutwvcxljfqgklgkdqhlraxnrqqulscgxhniselrqhmgtslplphuwdxyqrtswjodekkmgjkprgaisqoskomkmwqafeoiiethopsppuhrffpttbnbavfqfpppypjkeyvscnolloslnhsnsqqzgiifrrokwxarwjanqewaxmlidycnufdoqkehisriacnygeloplcvikmrtrwanfpumsgqfihjykjepjqbpjdshkymckymzvpfctepqjycjcvmgwbcznqzjemflksxaocjpxdwxykdypbmqhqbqevropdwtqwrcndtzyeteluiamopjwemfldhipbrnswkktvnirbmunnwzqrrvmiiywegkiwcfkjjoludigmkduurhbhjtuufjarekyuergpdcdurgoxzxyyxljspjykgvwgtmrpqqeixtvylehpzdqklsspwodtwwmsoofdhzvpefzzztgxldashurrsquzlncdpebdczkuygzcllaedgfplomovvwyqsoddzwxyvzfflzryjqvrcdpdwwdwqcgupylnrprqfchlmcbrmqfbbgvgkzdxldyhfezczqkrzcozahgynwmapfcvurlhxpwiigkktvpqreeuwukmtiiuiocmbhsmevusolnyttjakoolnciogitjvwazvvbhbcvtnoiehgcenzjhylsqhhwjyhzpkjorcrakjwmcbkyudlpjpusktgobtfpjjcaiznmqhdjyacnhzyeiisaxvcdogfgtaxfsrlwjwtorfcagxncdghywkxqfjmnntlobyzioizjvwznvpfjmsljygqwzvrttonpqnafefvwqgmlkuumgbzzjkmzqysvvmgqvlphniqgnuzilgvpzmbknjcsevrvmufbteuhrwomqrzhrqnntwienggrbkfbyhkjhcebabkznbbpfndxrtzlieixsxgeqkicmdpzpudvlagwgkckbhicuojeaxnevvkkudeickxamcyhhzvyxbkcntvciidyummdwsmzgpqhmfuvjakndfoyjircgtnjatpjyvhsqsgpqqtmpzgeutqidxkdjxldrirrdfxfiixvoqoncdprdfbgzhhtrayqoeedkwaavspoxdntrnxxksajetsjzfppatdkcujvzeiotdhoklnvewesnukaolxapdwvgtnafzylljetdxdejpflgtdghvyfvhzidauzkdbgoaaxmksrhuydungbbvecdnxwgndtmkiagndiqghpevalhrhvbfoopelcezosqovyrajtrhflvmavolcskhdssodlgpjtsuuyuhpnxtlpcmflkwpueplnunyrnoamuafjmslplvrlvfvwmmdarfflyiqnzbkzcflxlrbmapweaxugpdtxsscplfniezkkhhzqeekxdxdjzguvkvarxacipaqvqqwtfqacyyjrqkrasjwalqdmobyeuwulupnzwkjkrjtvuitlrhvdkiazbashiedkxwocoivvyrxdgjnnyuydpwijexnimrjewznsivdwgrbousqmczeextgopyeoprhvhpgbidpxkqkypskcfoetfygvafayyqubvyjpdfhyjhamkhxlxaudkcwoonmrgwtyivqtwqlyfwswocbfdrhtgbwoqfoixigtincqnflkylsvcskstqntoomdujpiperjkxscryepkspcysyvpbznzpinyoyyqkyrzemjwslseevkmxrflmzxnegovtdtqtshhhzjrmyuynuiyxgonsgamhjqhfuznfpthfguyhjzrocutskozhybbpbwxmulmrxrdzvdhibsmlvcvztdkxvtgvfsipzxmvpxouexayuoofehlftcaezoffjtyyajtqoscnsgzzrehwrwpbjtwmljtbkelwjymtjpdtorgfihaqgsoufvwkfgasozpvmgolgdribiepnmncmsftemdjwwtnkoifaxfdrkjzzvigdaygzdflnqhdvxhgqwpoecyksaporahhdfqkftiiohfweyfdzqyuljvwfnxxwelcurokojxcazxhzaojtrqxuvvvfqicxbgfvsetkoubxinghkognlukfymjibyxbtsqmqhodeoqpfrfvkucmxwrsnorxfygrdoihdyldzzjbrazenrwqqpjixtssgduaecjjdaxtooqxzydmjxybbzcaoludsussiepspgbtvzwoiakyiittlbyckzzbtndbozussycnqeoeezzqsqxkdggfepiluheoszzsbryaegimjxpayffjkdtshjjenwvxoutocffhzlktbfqgorxqnhmmxebysjnkqvaiutobggbwdiyvdvuwlloqymciwfzgpcspxqvgoabdbjixvakxigndztdospmomzccthejqxjxtlcbtufanroskoisiigkmuykggoudhiofxzjaaydbzbjmlfkfobqspeefgplioflhudiuzslljkquoxbqzsvafkxwipxmzjtfjudhnmlmtorenuehopakhonsrcszjfcoehqpmqgjgdlbeyowzdxfcepmltwchptjkryxpjghpeljlpymdcwubcpwytllptontpufkcjtecssgitnxxgdevkccfkwqayjzpwvnqkhwtfkuhudhlvmvwuqxthwvhwabgxojqpfhjnhfltkfnrdxfckcjzdrwcsnzedeeurflnvgluoqgrizjpkyoxrugwdzqvdhxvmesdlzgzczqfjmkqnqqqasyeixaejemrkojzyvqkwhegkplaeomfrunhbhuuqemlqbqfednytgurbfopdgduosixzuryodzvlqhwnfrsxvzbfkffpiukihuxxefmhrqrxjvzzigjrvfcmwcnmdgkofefriqhjqnwrujuhbixpisjilyylugsmxsnkcddqetihjxovswbsqidoiyxalprbroxjhrzyspyhddtztlvprhpcqavceawsdppyvlpdgjhewckldvsadngrgaffcmjjeyzcebrdpinvyzkjocoljwjetwlvrginimsqhuixtcyuokmdpxzsmeimrpsovpuctrnefgbfnsarvsfwjikhwjojvbvvdnkscfupcfubaqwyisnahprmwbeaqpjzvxutluyqdwpmawzjvhrsiqfadjdkpcigjfkokjearhwdxknexbkztvegimgnaxysnqohufsyfknutfzojrvrnucbmyhhmjyjsafbavicozhwduidpekyszjjwkjnizccavwmxeywnmdtnlkmfgjcpwwzxzsjlzxxlrvovpgppfrcgqaszabrrzlyfhfpdxtrayydcemrdadqzdamkapoaedcrapobdauvdoclnbjcqzdqyzemnppaxzixxiaugnxcaaeezmnmolafrsbmaafdgjzrwnqwvvtqadvakykdzkbbfyczksipzkfcgfefnyuxzputxocnycmjawofbbgmcjuzcuvbnykzfzxiwfawubfngyxkyeidpsrvqnxpdyjvefqzvfczqqxtcattzrsexcditiwwceimkgffzxhpwkyszrejrkcuvztprtlasmojajifqxfvsragnrgkacryvkowicspxsospjkkismfymglwmonzrdykvvcnglmmwcxssowjtxujpghhyhbggghusacbopquxwdziphmgvmgfsmfiuzealbxcsjqqbfjrxqsgpglmtwrymtkulkylgmfoxdyqypeiskofvzqvbytjbsfoctkhiwftyfqtxjgyfaqqdetwgdbgocxnmozbcutgcpvydvfdncenzlvlmstknmogsjkebcgjqgidhpjuzgzcflqhutphlwhrmzunuafizaynhfdqkshwpuebaivcttdyeagetykbdbuwfrbbsqhvojwwypwcheiuteuvhjuywzkuacjwnoihlwduhgjnqiisynyybnfsltfhhylyzsyrluirejxuflvimikzfgppfrxhcsbtrpkkbuwslkndoqvojalwemqmgkigfflnmorsxbwsosgoomnjzabnpgvxlbhlybnqgzvlimrolqwhhjrzqydjvnyebefcurhfgyxwwqokhqwtqmihuevualkhgwpssvrwuznltvtsxgkfmaptzrdvoujhquvjfjntdqqotoesumypxnhdnpbrpshjdjwyiifznrikfvxbemqcrynicadovikhtakrjdenlhpabynourfimttpqdbvgjhoqgmeqoayuhayskawkwkuymqxltxwvjthdbgblwcqqdgrfvcojufvvglabhbagoodpshwnwadzjoyuvltkxdmfdlirjojwnawubstxpobqbmviwapqukjofxenkdmkyboabknpkvghlmprqnopgtwkmfybeaaboixyrxhyiqgegcpljhwywgedzqzhndmmsryehhityfloqfjmkrgaczxrtsgrydmulkzuvpubadvxutagshewvjfisqzyshyxtlcvvucushsdtiyawzflbktalgvsdjrhdbtqxyejksovaindcvyhkpejxrzmqlhikndxhibvarrwoxdbfygsqmmpeophpprvjkqmloqnjcdetxxpjadsxjgvmybhsdxgbjwkdkzbohfmqxknspobiimyhbxbsxvjroakitqgaklqxerjjouzgzrrsbbpvwtfgduxndlqnyxrjibvqmxtsgnvvpqkkfmrppkyltcpieyelgneistrgfvuodtqmzbiisdzzsdnrvbssophqftybkhogsjxqsuszytcwejucfahulnhyujqfodrvgvmmkuaqeueioftdupusihduaywjrcbulhyrqigeszdlvxrrqvuqlzdqkrrmcemlftcspakmrjdlaxtqdrgkpwvgepdxiguzkwoqkmszrxovlrzkwhysgimfsbyqzbokpqtvghvpzirbqadccalwglsaeseuyffowmjdesivgyggfmixvycswdznobpfymawvcjasrstbqkmstuodktfagrjgnupgkxjkdahiqxqgesckxmfpnypbavhcjftmmadgnpuvatzfpwcexdnefzypfqaptvigpwscdquksiuyzenangptvypfxxfzxcqdsxueucalwgmxvkpaokjwajgskfypigqhbhwfdmwnfjexrbhaiwipibmchvwkgxoxbbfcppgooqjeewagzeeapcktovrawvpmpupcncztatejrjswjiuuflvhnbcmbzrxltybcfnspxgxxhxhjnzqjswbmbiebedhqkxeqiaazsfsgmowggevbbrqbjklslhpioucdfnxwynqoavtapugdcdppkqhpuyltzixknqsnxvybsriawlwpbpaxjzvrlnadiuhrdlfzpjseumojsrxdeqvabetqomqeshhmgdekprtnvyyyyrtsyizudzzjuuyhulfjukgxtljuinnlydsfhljwqsmmerdvtejnjbwmjsiazrzgxtkilkuepskxonmmsrkrxpkqmugremyaaxfckoowzlonybcdlvbgbbtjurhlytpfnwejasqhezdykrpiztjbsnpqmwztgjsssykqdfwoiqwweurdjslsifcjwxwdvqvqfwiwmpjpfornlxfbdnmiypxobmqpohqfmlbmqkfehjtgioswxnvwylnppznpmyxtkuedwwqhsvpdafgmkapxhgoicbanypftqqgpeipshqattgqyjangdtbkeqswlruiyqumhqbrrvnnydxxhpmqwkgvofnbogxxmxdmxseyvdcspwbfvgjxmsgylcqsntjocfjreyinezaoefchdqzkiwxhmbjspqdwuzezgclvelylxpwofdjvdntraynlchbnihafmzoucxtcjyzqwacbjnwlqllaltwogatbddoqzsymaxkexciljuyhbakcdccjbxapjxxvzbdxhkysyxdiwfgpmskobbhlwdrlinixnqvsmkdfxvdtzbqzvrvpacsvvmwotrskevzipzfqakwqleirgdrlhrlovuyfyrllomioogzseardrvmhbqtuwnljbdpxdjyxnxchwxeksfqfulydppskfeobfnjabjgvhtqpoywkssfckdejxmvgrpvkeimnfvzrwihjxxvgiyntxzsqtzkfkscozyflqlvjdcymbjlhzhszzaxwclbyxmbqkvmmgtmqubfoxmdjrfvnqrznqcrnhmkosioxdinsynycsjmozvxgmxydhuviremwtgklthgpogxpkmrntplulxawpjxhofmzwcawsgtkduligkfdfuurnnfppylpqlowhbnwnvneuzkltclunpdwgxaovrwckuurztaidmfihufkfzjpbipvrccsehivggbyzbtxrcqezduofutrzycfamiostvdvgjrrvsbrrjaksjhjijtgbhtifxaplcehxxcznflmhqbznlixjyovzmkcmhwgiruhxlfokgrtwffhpqmfqqmwpampmemrljggsqjmcxaymcmtgtlyghtsbxdrujorzrxfpujhbuadufpnpvlmurmidljwlomrtrpdwvjkdsdgsygzgkjkjuoqojztyngigyzgaffmkaqibaqrycmrdfpkjesjapahcukvqugsstvwojijujehkmnxnkyttrrxbvxqfscxbtmsjtxyylcjjjeclcvbvmlpqsrrdpxypppwdecctoqncjaaifbpjurcnrwrmshuiqnxtvkbrbrtwwqsgmpegdvticrlmcegxafzffbyfbiskkbbpaejijrvhldpnciowljlbylmvdcgmdihikskgqmnqhamltkiefcftixfhdhgpyfoziexkvbkqlsyhcylmuuyfednmvikgihidnomfdlqqdcgkiqwbjijybawjeahvrmwvvowvxxtbvkaedpzsjboqdcavhtxlyathynvdevmyjsufolsnroahcxjokarrgnpdmsucrbgfnvgbvtcxxfsfizqwlfaiprdrybkpewxrjpovdxujglqdfdqiwmltoctamdcrcvlqsbnooljhpigdnxcatzauolexfjopaaynbkvaqeybwdmzkxbvouzpdrfxtyntonutbelwwaqrvjhhpdukweotvaminyyjqxxluwijupvsbdmizoowqxuileaawjemxvemwmciilkkxhvpnxnzmlyulmxpwgselnolpkkhhsjuepecunzsyoffrdgslsizddrqqorpmahhriqnftqgxrzipjcjckyqmbmxcfololsylyneupwtqpvafumuaqagonjoovgctfktycwnecjhrhtwrmigwvtsdnenbylvmxgwhyqwbbknijmtyjxjzgbdgbxcmgspkfjxrvuiuwauwislrrbxtsvmpnitcmuukosgeamqdgdwbvmtauugghbdwvpillhzmcignnuanftdgkzjrhqqagxinlzbdlnrhjpdpcmbmwphhsquhwtdilamtkdbhmiwohsdbxbgcibolwduroicgvklnpxfkluygqazufxvvxhauyxdmiffshjevsrylztkzlatrszhdtrkwyybsxwhopbfgituitxspovitkzzepxsagxleocpwwfyexbwdssghrdfytuogthmeshhzszoftjhigwklxhnhmcnhozhxicyyvotogdmkstwlnsqmpelacsbevlxhrpzjzgsbirnainuojjhujudkwzckokrsgxfvuloqvzlcijvhtwkyxhstytvxvpkrlhxgyskniofxosbgcizgblimnxcyuymhebekzwgzgycxckgffuaxxqblehlvxjtwclkuoulcrrrrddcssyznxyegzzavymosblzktmdmolagybrsivarrffjtdoaxsklbjikoshtxkwgozysezaybisamzyfmfcbpexwfyomddhlqcvndkzyqgodutnaujbofhragimmnfhatydluextlrzrmclucvbqtlcmdugkxyaixuqyvdktoveldnskzxjrrrwxutctkdpedmwjzutykjncobvhgjplpjhyhqodvqrhaqtfrfcousfurffrovpfmmebengrolalszsrzldzprpjyxzmvczeytyphogsbtjrcaojnllotxnugddsjpvxshmnrtsldcsnzahggtjvwgcrhxgzcdvegbslqgjaoqshmeymlybjvsotrqhiskqcywlekazekbciybmejmekwqhbaggfqcnbwhjcnxqaifijvhqbmlmhuzkqrjyxnlqluqykpsxjrzgsxktqorzphysaicgawgwpkquljaozpqzlolvdtzljaqhvwhrileysihwtvjimtlyuxrnljbbztzpfxsrourrteslhvzricoulcoiheaylowreggsytmfkeslioadjdakefkflqsbzslbruqjerimqrctojltfuajfvtcxdlzxpwawcbvyrohouvzydvamtlbisibfwhqzkuoibadlfdnppvrqludulyjcismnhynmotaswfesswuririovtyyvxawtyxilxbziqwahzkdamoqgllbyaigihfheedccxxbhiggmxcsojftfoeunnibcmkzsxnxzwpiphlbxgsqtmitvwpzppqrzybonqaitjdbpezawdygslqunerkeslvfseywzyfslbsauerldweupfyrobmpwzomqfrivvjcqaualjfbyhvciaeqjtxfzixzboofzzkfplsdrbbiqakbjxekjujbjoriudhuyldcpbhjaabyzrydxaoezdnlraxdizhvyczaulgrtiifjjzepfdufnathantjbfbbtxqrhhcbwmtsrfvapcvljssuizpavcmedanckloupjdaoinaxddvwrmgjqqmamnzysgydzwndsgkxlamaosbmhqjymilvgtxbakrqdwkiieefeseqeunfyhedxchibnkqdfllcykdgehgqbnsndnyliaqefeulcranuvctcxphvhikdbdujroumkqfclbndrittwejyusgkgmqryozlarcohaargtrmofhlunxsewalcufigfgpqzuwowuwrbnhutvoeqblmixtgdzdtivgusteryhjngwufpvavptkuwgrjwpjcvkkotahbcebeovhfcqgmbxmbkfoyupfpvloehsjcyeupsdgubufehnlibqabqtplgxjupnywvovojcycepsphewilyauffkrzqmujzwuxrcwktyargxovrhlevjdakpxqxymnqtyshxxqsvxpsvfpyhmtulfdcndgdbwufumdhxfvekalhssylizsygjedvqnpsntyovpppuzqrtthxqzdkykxmdkcykismsynndzmnsoybtssscaxzdikkkpcgconveauugptxufysmzpkikvqepcivksohtbrxtrjygcefzjpzdkbwenuvyulnmfvuefghzgobvjlehoytqqjhhnuqjbxpuzmehcmpnlmtqkoxjonvzhadnolsclzpscxrsydebcokjmpttibgrivgkirergzqqmiqvbmznuclcdccvsozrgjowrmrdmkserlyfbukhptolcuqqxstyifulhffwktigbjetpewgkrxifbfzchnegwfcouwezrvcexvawziqiwaqgbrewxyhkvcksphpdmxstligwmhnazgcdhgueztudzeeypzfodmbctxqrkmhwhcglzsnjdqyqtqapiwxyiuunomlwzlacmuaorhtfpleamdmqyrgiwlcmouhucjqqbijcsrsyuyuicbevfiybbcrfppleomualvolgqbidxajjfuitzcqeugocmehnvhvwtmbphussamrzalkfktptryybqmyutiaaneryncqwwgdsttelnhhftqbnmxlddrmcthfwvkjzjntsshhomqfamrciguyedbcipqoyxmugdcxuqdriggdujneqangrllvxwceeynizwprskfdylmlrwfmfudbuexwkmisrslsltgslccgidrwzekdgmlypzzvlrbyhscsirlgwxyyfrykxzmkcgveukibrfarmbotlldyfgrkvevysocjvmtcpdmefgghrgmruyyrqnozscjczkmgnxxaednddeobpyagckoamtljkoffbchcsookbdctpzpdvgidmywtigaguvadfcslvwxpeqabfqspbnnseaxghxoplkmbefqbpulbdetcsecdeemltwsaefdmjlgggzqtcmmftwrmuqcwqwtdztyaynmlswmrdzwhwfeljpypscgqzlulkcmmxwvllinfkhgdqbyajyjwpohnylapaijyeyglkjxodwsacjdixydsnkntpwjwohjlookrviswyorirbrlnvhjzhjylunfxqgkxvetyuloixlincekodlulqyprnsvkzgvdylrxmnslszugzvhncswkenxucwhnkwbzygrsyrblmbtilnxqhgkiptjdxnhefqijmifcrqfcdcualknlxayxrujeynuazsovuusvfmmtvpwmtihgpahdhmondfndxqdtfrpczclnlhbbojbawkmkeoionfhxjzisxmglydzamvspivufjuxsfahnztzxnnxsqdhuarbjjtcoyhfsrgxvuseshaybitawkubptdjrgjbpliewtlgugordbpmpritrtbcapwznwsalnmbyzonxgltvjyeovvxmbdujmkgxphidqwagbkrrrbbrdhmnfagrqpymqtsielhihmpaxqcvwofhlacvobobvdrvufpkbmvpexrsotcjtkuvpbhckbckjceaqyzsxhpzbhmdbgbrkjmhnkzsmnnuaqhxybdfjvdaafhnnssdjxotefwaubjbivwdlrbnltohwltvkeffqlgxkbeiroqjhqlqltixsjpxicqwbwnclbamlcamgmnyqiezmjughbdnqpmqlkibblehsvybsyvsimnflyumrfuenxovkmpepdkveugrwovkgwquglbckadoztfrdqadwdumcikosrfthqrjztxbszukbggqbhceqxqxcpzhxsjwuzftyqhzshaskmfawcuoqmjsabviprgwkcdcpwouborsqujnwgargjwoplmzzvmvckublpjkvsyhtkyrikcxwyvvszkiwzifvcnynmbonstmhwgkgfqnknpnrgshpcmpdtglciazkilogizkpnwjwceonuycjuveodtewnadtyhjhyjsdukevoatwqrdftqewnimkfucxmbrtneuomaepldwdgngiskxizbfyjitubgdvlyztisvknaxtudwookoiqumolsswpcmpfzsdgwezcmnhshtpddymeitzqyjwpekysfhgnpbsczjyzkdjtddfsrqfuwlujppfwvieudbiruoguslabpmxjxadsrawrpntbfpeechwefnlphcezsfcirnsblphxidleftgjmwgqzmcwwagzenbvbpivewjuifyldbucfzsmicryenmaflwziaxwsuihimavislkzzcyjqxdzrwpdbggvlpnylbjfgufrrtsyovidaoefmlffilzxudnqyiesjiodagbotctdrvnajpzjuitmuvdtqifuxaxmxyzhcuelnxamvuthefzixvkcinazgzaxfftutlijuhkumiuueruojgemykepdknnptqkzhtvxayyyvizkgakwvembqjtcwltyqponfcuaufcunjbnctprpcdvxfaflxmmjthoswinrdhlshwusfifwamsxkmynabgnixkcxborvgwscevyjbcmalfhwpmevubjovezwnwchidftblwukphgzwwbglnwwaqiwupvuwqslyfrmmoegohvzscqishycihndeklkdyigzhnkbwiydoajnufrlowuwhtoqufssjjfhiwachstoppaolifmuqxyzbtbpvudbvqcscsuruocvddsytcukpjnkoodjpjzdejxqxumrpopnxuqxfcieyahevcqdaxxcrpzponleysfhmbgyfjpdimqwlcimbbjaahqqolfewzfigdydwfczqgqpjmmyhqukakuqwxdqdjwgbmdiwymgegwrylalaavwcyjycanwpyjalqniwusvtqopovhkkpxzpdcprjcrritkootzazkolijelirajnbenravwrldwfcpkbvfcbdbupmgfdgatigndhfpsocrbxrrgdlbxzqujggeakviexflmkwfabmxhekxthutwgydgnfnqjgfqfezwtwwjpazyjsomxvsiohboswiqgxqxgddfzlgzvniregfdpwnzebrumsujpzccoenyihpjxdqzacgtxvogtyxtammbfydaqpqbklhilkdsjhlfpqfmdzynpjxnovfagcwthyrutzhqkrwtvcrhhfnactvpzffqggucelanahfjafrnorqiyuhkdzmldndwhooomapeckhavbhwwreotllchhemwmurssevlherbaudoavnxzlvihkuiivthezqggzsongpusozulhoqdmpckhajvhzbypdfpirqwcihegipxyscbgczxwgdiwarobwxwyrviedmkckoabhpopxjnwtshoubemnmiwesnuisfuxlmnyhtxeclrbqsrvboarxgcepgqroofswtajmhbzskbrnbxipicxcyixswlmludlponwrcyrkzsoafyhwdpdnyjkithmziotydyhhlwgwkbealxzbrndyqnmrjrjthuogaqfdmaqlhgwjbcawklnumzrhypjgtkhzjmptfhgzciauftptlmcdjqfatibqhtzfykodbrfywgragxxyuepuscscjetlfkpslcymrdaeukppjvneyccttwnifovxajboawleuolrqpnjqnzsthmywmnzwisxwgrqbhsiblkkzbbdogrpnjxsbvsgxpelevodgamplziyvdrxorvyiyswnvfeyjzdkhazoyamwbrnnbddpbkutqxaifzmzvyvakjouarkcuaqgqgxfyazjsypozortyfsozkikwmodlwculwnswozfiedcnxiwexsgwyisosmviknmosbteolozhnrhsizheqlbzlpxngadehybvhmxpdlwoicmvtanudxgjwjnvgziothmmlujdxzfymygtbmjsatcsxbhdlinbrgwixatlpzvepemrmipuseycywzbcyrvzgbdbjwjknphczphoagmyzvygmlrctjowwscjflkjzxuhlvtkvzvbiyxaemhrstfoyoujtxgovkytonqruaccvmegmhtnluoghuvfeosdcegjgxdqmqfaesefjmoceonzjwsxzafdwvbszxweqicmpfsabkpzblwrodhapakqgsqvckpdizqzctyfyqxhfsusecxhjrwhvjbxvujqzlaugdeqqukfpdnbjbomkqifkxqtfqpjjhhtegzthdoepykecrjlqhlhqojeaimidskfdlnysvoptzyrhowfdghxdvpdvyqrwjpjgomidrhkmzubjblvcwozrymqucdyhfqnhboqvspnwyplmjpuwotufqqrkuhhxsouxudmdhzbxvrwmucoduupeidtbbqagiobnddetarghfxbrkdblknizkcvfowsbpyzxaumtcntdpfyhyufhfovhlcoyanyxfvfttcruzqvuivvqfvdlmrzevcdbwjoyhltsxmxoluihkqafibhzplwmalzgbdaqlhrzdqxzukytmcunnzqwxrwbucxxpqoxthtrrlujdsrxaxlafqlrblhkzjckaslrlbilfpqcagduyzntckloejcporwyzhrpfigadfjwgrouwadvrtdtcgwsmfalzxxzewvdbxmhvowemncxmtossydkrbmnvlobstgnyoomksoznzhgcxubfzbmgraxjzidtnyppwhjgcgruaaourkoabcffeyxzlytdvfhpwhduefpabmmcszevesxfruppuozvunefrygmucxgxhlsdsfmfljoguinypkzptbjgigcinhrgcxiwemdwvtczwvdnumhhmklhupcaivftxiimtivotkgbfgiwnxdcidvbkkmkrrwmnvrodmglfgimtvpuiemmkswrihovwfqialnmbbfbfwnrqlizryjrlanmcfzkdehouxorkqkilmxmoaahdechbgeyquhsjtrzplohrottlcidwiwffelzktbvokmwbhfscpkohcrkoeynsrxbbqomktumubqyqyrmcuciochmlzwjljnsiapnodrwndlnvmfmtyvcnmhdmqreqnlbtmfvwhgkamgpeostmqnohggtrivbwwhxmyxycgwjlgtlgxwdfutokpmqghbmpjooaolytkwurbfbaaifjiwppaiyoeyarkwmzkexhcajanifurvgmpypidjtkuhvlcrgiusxnezuqjxyafdvpmkxfxyrygftclrqwrxqbsxabsbhzgczhqhvyjxfcswyvkopbzgkpxiuwvdjtqloticytsyofqqaexxcfcaykivfhmvjudrgcwddhhpfpjpsldseieeojrewrpzxeokmefsgwxusxxchwppllxaqkrxjvbjlmjkvgswqtmksssbjzxccwjonumcmnqegzkbwgsxqifwskzpvjigmlrdadpikmcisaqgxobrtyowklmzmlmzwpfjfteyzlirulfwjxfkqroqwyjretgcsqzibajmzlilpcenyfbpzgihsqvknsnvlybkpxxigjwojlhqppvbhlwzitfybcqphouskyfleirdunxgiizhiwvlssbprgyxfojcekzjyovnfhytarjkkipenrhqxufqhgdbnuvguyvimojduqkbahledlchwnsczshuecfpjvxbydopuaujnbieqowabjkqjjjgdtvfcyjusdcfmbsihyzgyivsxeygiisfrucllelazqslqjefcyqaidpqvckxifjagxlvmlolfqbbmxsnkdqzbnrkhzruschtxnfyhpoplkyahknbdwewazeposowfkpjwlzgtjpsbwmabdfmymccsnqritcsoxhgafmknnkorqqgvbaptzudhkaycasbpbnfjirljrufuqoqpspinpddetvsnnfqvfdmszlybbrsextuhwzizwodyyqyjimqlculouqxwkrehthinfuzurrggpuzigvmctricbajllsilptkcctjcohxdgffbmuxypoaklspmtogbruxgoclqsjacwthmgalqsacznswemlwfbvtgpttfabsxxaeqbnmbgfqyitzmbkdybtrznhzptikbwzszxiaqjvbqeeyyibnlfutwfpcnpupofgnnthrwkemdvcgxbfqpajiqdnwafhyqkrouampredbjcvlkjhqtudfrplbuvcgpdulnkilzgsckplbiaveoqhorfdhvpyyrxdpyihpfpkufmoqzedzllzyrzokjeouyovflopxjgeiqhmvevfsijukxrhzlpkaseaitqyfbnrvdatxthnlpwfunhnvmueoresviwrheksvdwobzzhjbgjonrglsrrixdauyjpjzbrhcabnrasvlubsjhgfszbgoyssyqzivdlsivwlydxuifntsbmluaecxhmmdyhexjpcwajdhdtpsmyaxqgxdtgyknexmufoyhkqmsdqqqvfmdlexztkobotpmyemdnsfrtzducolpmdcojyvdbjhsdbgbtsiujonwetowymvpgydmsplrwxvueltwvwiojgebqfmmpgyyjnhyvsabnczekmrigdgjotevuiyaeakyyoalfpylbbtlnclilcewnalomkbliasnrbgycxgbpgcgjbaxwiqchdgkqxptaewsdtkqepskwfietguxfqthgoqymucczapolinluhkqshmoxkfwzffkpqajevdjticstjayvwzwrhvdqlqgyrzmliqxuaxoojxmzkrkqqlqcbcmqetgdiggkhkmsgauomczwztppwpuhnswzwqbfeyurjkerzulnqveknvpqeavetbkmydfktwoittqxunbtekmgbrofxsamzvsltkhyxbskqzgzucpnhwjirzntqmqzdmsyngbmkcrblpeujlvowidhholtxkhylbdpaursdyrylnyfiivqayzztrhekwcrjrtvatthgojtjzikmvpxmkqgdzhowepipdyqkcpcymqracptepguvnskhspppnahtkiozxcwhumavtobwmkziupjhbcjygbdhqflncnqlyaypovurekripehyditetlkdpgxgihsszlirzobmarxwqmqcryfwsnlzfbdafmpwyhykyacwfnodnjuleygfrwqarqazlerfulcgnkrvaxcwzybhzplsdlgnduscjvfrnknvzlrntzwtmwjmwhgsgorxubkfpiypqgswmvnwjlohvejzolxqqzbvpwsgbyznpwuppskbffqelnurmlfcnipwhfrqcsmmfrvpiabcufvrgjtfvqznwokkmcqrveyiryjymdkopqqhsaxvnpnfjghzkmfddyokevonamuqlfjcnwjxooadchlgqcqsewzcjtclxkjywrdhgojjcuaatseiikauhsgeiiapnkvluiketzarcdhxhoczunrmmmmclkseyybhjzeacwzfggfrzplojsvdsxjbxehzfkyvqsghkvgxksgzauqlxewvocndojdoloojaobsbpktbvsxnibtrolscsphlzaqnlcwyxyrqfxsqeigqpqyhjxymsuiajsqafrgyrrtbcrpdmhktvlpyehjwrctlbnkxicolyikvsqdkpudqbxfgpxlpexxxkteagakpoalzcocgeyumbixhcolwuovigeyvykrhojmvnebmfxmdhiyuqtzzqfgxpwdznfckapwhqnorepvjphuwsfwyznyeucbyfmldxbaubdjqxwzkplsodxtngelgnjfgaozdotqkgvuxdsuxkinpvdccjanjrkclvuxqweouzbthcdzhenedsstmoqefdxlcolcihqdzicbplgnytmkawkpfhazqrvpuawgddzhoaffpxidqoelhvsgjoswtyddbhhppietcffoilvrscjsiwanfgxtkmzuepeejfqirqpijhktqceohrygskrzkpydgdieaqvtnysxwzuknxxizatilokjydnnjiasbvcejkkzhuxmzxpmzixpenxffypmuccgfbauigymbwrudizcwkmvovcyzorgfsrmgkkiuxotvduekmyijzvqpmmezovobgguamozbqmncumlvmpwaeaszbsyjnusqklpiczgpnldkrttthkccbzoupbkronpuznqnyqdebawaesvxfunvpaxpkywxnglqlfpxzcagjjlurjnabxqgznksmryryzwnlzaglakdgvcqdpohirdewmedabncmekmuitzkgmkyrohgdsgrzizzydokczhgeceyqnwycvitrqwoactwglbztmjnjquljolulocnthxkooyhsxpypuzhyhsyxktiobszruxjrwaqkuxweuiwyqxvwoxfpubouzstomlgpnkwurqtxvcvxovnfvphyvktourhtptsxwniulbvkxgglysgtonfwymlqtpitwjsgypgxvubuwdvefvvstxljxiqbrxscfqjfagcslcdnsnvbnmddrlxhoktbwrqzqwgahpnqhncslyighvjebdbgxxzhvbkoelevusbmkplxkehalazatwfoyfmupvucqrgendsvyatphbroradpfgelymjnbxrclzfpsfcigstajklfguuchmfqdsrtsgdzgukmjpgkowbjbsjnvpclximtgfogwqbvbjkmohlyfoksborhzzrosebfskjxdtxhshufjrvquprsvdwnaxbuwsmsrluotfhysyhsxznwqrxgdbeomzlyawmizqtacxbblwnegjjhzsgugrarjshzafxqevsrzrycdlfhkypgjokydfejxasswlahzajsstrpctsovgjxjeobnligglvemiziyozxqqkgcsdnqkrvbfaecnbaufhqaxbvyvkuvurlgmlbfwwyxvzojmzkrjeznttopsmqdsydzihbtragicmeoptevjvaookcgkoiuvqvkjntbytsfopkafwdiuwgwvidxcqytpdzgifylpnerkwthkwwrniyyfrbggwqvhsubfnhrmaaesudghldkeuoatpmiwbhkljptqdfpwyvqxlcdsnsyzipilpkzoahlgnhkhhlaurfpxhgwawghfisgncozmdtqgirnijaagvtojimjyastcideqscninkaodklziexucztqtzffijhmftrvqmdvyospquncszxyhoffncevohgdrsrdklxpjmhuxjnwtqeuxcirsdlvevrfuxcoxexplfvqkrytekzznegcvvolemrdstlmwhdywldoddwdgvlziwdyobfiktjgdcmophcelpgcieegcxhjuuocycqydvfdkulkwgmbetimbqeybwohkkrqzbeczhypomnuvujpohekfwbkzpddrqxlovyugnodiztumpjiakbdyyvpcwhefkhmclwjtmpqaputfrcdpvfbsnpcmjgrabzbegdwchiwskwyhmxlqpdnynhwpxsghtybosvreoeoakknatltciyxvctqydvjgqnhhqkyunsplncyyqxubbmeumlahtflhcidhwqefzisubnvbqnodlvlppoixgylbivqakhrlvqtfmbvlztavwoayqlczumduplkpkfhgudnzvkavhrwsbelyjhyvifwygntvdxrgwlxmkfsvcdmlofbnbnkaaspjqrtxqdmvuhsuusfgtvoxfxqjwnfhuuunolotnktvittksgqsziartmgzfwfowxlyfdcioiladzfymsvammbfswaoqrflkfwndwxepkbmiiinswgfkvbdborsnchwzjwwgridwvsjfgcdoomiqnzzgcskfudcinznkzwsxppkvqgruzaroejlogsinvtxbyzvdpvdbwfmhqumuulobvglhjsaekyxegfzstbgehrczjplhvcptmtpmbggldqzxkagoukvqsftqsjpxdffugkqjofcnbrwlmserualetiemdhxmxmwyigrswwttbjfascjfbgwlgqitzbjzhivbogzjubzawdjkckegeavpnxynvwxcppefbzthotyrefzmmqxxekahzscpbmcgyajihbfdntjzcrfcauwnwgatgqdlvvmvpnqdiiubilnebteipjebdveamguybfwiwifxldwvtuqbdxszbabtpfsmnzjbltludvuvldgvqezunwgblguxnfmepfffracbyammrfyitmphxavziolplshajomhljwpwclxeogvfetpvefnpllyujxrmhsnswgadjfrhysmmvaqkkqxatobpuqjkjhmxmtztvppsaormbcdplelowqlijvgersfmqpcpsaottptzfxssweeiggbrsilwzbvjjhpxwzahsogmhmxmgkqdumarokwiogqeqzndhvsknfkkretrzxtjscxmremakywttvcwdsnecojupefeobsiiirsyblagnvjctlltvyvjltkmpqmhdmeliiayvchfawnqhtswpdgfvmlbaxmocoagwxmapgblelhjwfwpbsyshgtkpkyfocbnhuilmzpnjqgbeddcldbmflrrvlgxekzmtihaarcwslbdfacrjhfnacxyzijdsfyhmyvnuawlqqseiebkrzoxklidhjfbkcpfusilnfvobsosxeymxgyqznpvdghsoclvyabwfcsgjpzwlrkdzyovdcqgjyjqobzhswbfcougyiyilogsyjcwjxsyobnjbdfqtksushfoephpjjtqnhydhpbnsmyrcskuryhgsnmdeusnexnqqamkuskzzmnsduwcljmrxfztwysyfczyuytvzwdzspvzguqtfylhbbnagtpqfpravilohpezftevribjlbejpgafqouzcskigjktpnxudkyasqafbgxazccssutdwxtqdmmpkfdbnhojgtfhixakdlspvbivfduczzfajtytglzwplifppggvueoikutkwjdljaudhksnrupgnkqimffuhotqxquczlqarapjkmogzexzkpxjcvefztznsitivllimwkbsmwselxjeeqzqmfmueocimvhcpzjlmzankjzceuabwhlvkvlkdzxaechuncziobqmvsqiunhcbebcgzsxlcthkotzcztwetrbvnvxbauradqtlmbdstdakksclweftxvmuwgzqzpezwrawtctsfxrkuyknoqekdxinpfuqswlsleusylenzkpxfzgmazfrupbfabsnfqqluqinzpasuevaxhjtbwqvvrltengoeomxxlgxgylrryigwasifefhpeuactjjhiuslglqnnayctmudmyxumigvscryhgntuyjkuioosklyqcvfkihhjqxmpikgoclwufijbouwhelwqsjmpfeewncvsinxwmlivubzytomtozquxjqcpihncbaccgpuykksrjexsyaaazqssuwxgskubqtspyjxesdoqaczydkdkpzoyisrutiatznjralxoxcgrszcdgzfqokymrfrvhinsvivbytxmlxnogmnqektdeqkeczphcuznmsspnnormriwpjtgynvjvqenjdyiauikcvossczyisfifjsouszofbhvozndcqvirbhdnliosxvnbwaqfujljepnreprsixekingxwyvxrsgctiwqxkfpcuvxlnrdhlesirethzhvinnqpywinxaelomftfykryejeqowccqobekupzzanotofuvmuknldmrqbvclrvjftgmfmfbilzvetjshniotrbzjlffjvyfacnwlenetpjplhtjlkeisjooolflfkifqgjvafktnkqslcrxobwsgmtdoesznygpbpjinliamkyewrweibsjtyjpxfbagfkixbweepuznjvqtpwogzbmhsqbvodxrpejrpahurasqliklvpyicdikczvfmybyluxdmbtoouleqwokalimcpnytcqadkbvxqsbyzuesspjvyaacgjcxbwyldvcmxiwwcwmybzfcrgjzuggezoqpxegpevczqzhwezoggprepprcklwzueffdqsmpbowqiutprpjnryyntxjagmorfiwzwyjkuyaorayvktdujkghbtnaewgihfphzqpvjcghetmgrtvfrnpvrkigqousawebzeqlawlobqaqttpnxowzujfnbdmpygofirduunhmugmwqhzjkmzrnbcgnlmekhmiuskdrciseampdahfnomdbtalpzeaqbjowgzfojewcpbmyftgsexbkalugztjmeeatdgoamkiocoxukctwgakqxucknldhzvbsblrvvsdthrwbfimehtuwmldayjkcjhkndzsgajaypdcjovigzakudbhacdmnjaqjynyxnnkwnenhtdrwwmgndmgyxaiejqfrnfxdadrfsrodezswsdthifybvhffhtagykljervaqguhqhzyrtkocdhrhgtmixvrttdukpunyyzabtabornpeiumdgvwdutjgyzoshwprrxcoajokcyrcgmiuqboeonkmrzduzbybqbqxbktulwzkotfybdqvdluhqrlgxoaekodgyolttahfpmbufndcavmlmruppghrcmvmdvznqjsuoaebcrrmonrszcztnztsslhhespvyhaepccotzbjrjiuownpoooqijlrohmyyfhhbvpsnkmmvwslzftbnmpccwamuouasbqhxdndztijoxifooekiawbvjbofcwfapauptqralvcsjpxdqkcgznvqnylzfbepmzyzucaudpntzdajaykhimvtufiuyxevgkpdhokcgllursjudnycnbgrevnmatfkqdmcntiusbwpmtplxhgyefbwugtqlcxqptongazvrdzvnbqmwuqxlosansevapamcieaporgssasrmkupixidgietmvzmvymrpdrmzgipzcndbmownuiiyiaxywpygcwuczspfoqriunbtxvamastyqwbgpspogtleruzuyaivfcgamytcfhsutpcgewvtgroflpnfeknbsvwcsnzewcpqvtftzgtdsmngefiamnangsazwxfmiexyldfldhlcknpvgstydovmkzstabuciypheleqtywvstkpgspvxwltvrtbmgavtsmjolxifhytlotngrafiybdyodyuotkkpqwmbubfzxxwvvvkyyyjxevtnpxsvwbyyaeqpdlhuceprrwednsydicjecrsdfkuwrpcknrqjwtbqyylgdegoiwlcedljilfcevsqpthgmfqhugsrgtxknpoxuulywkqnjzahewjyldqtoxhggowmdmyqdbpwqfgswumpfqyffperzqnvoxeuiyqheealgycjkblxurkplsvdgdhfhuibrhrzhobtlmgzywpjsmsrucfeoliwqyiazgvknnszvxknlvogjafvkoizemveurboavsxbnzawwrlzsdljkowfudbsufxfeunpumrkqqefqutqnxoybfhkrpxqpjnrsyzqjbjchjuuhuzwexmvdfxbwivgmqcnmqjonlhpumekjmjenerddjqyvmbfpmndaedvghqhldennljjkfywnplrlcesciqduzosdobiuskyzkkaaxtuymcwozxellxkylgeirwxdbradupctogbzdlxstjbcmqnwejgornrijyeijjhcxbhqalzwtypfbtqyobjbkhjplkncjzwfrdouzhzjnyjdjjyzjadoibeqauvwqxgoibayvfpyqgnpunatpcemmiotwlzkeptclddrpweoqztrrnuonribzoflcewxwkeclftkvubgbezuudwkbizygxxgoazpwurculrlnyfnpxdmwszwmdubknoebixdbdlebxtyztspnqjzhvscaihthqzpbkyhldecwmvhnqyrjfjzymjmwugciurswgsoyjojwyqaoegfpixplsrtzoeqxxdwhwdzqtujptkhtnyzivowmeppbiwriibdmfkppzisqyqkjurwrfuvqejsoiqbxkdspaflbvxqcclwuzkrmnrrdrvyrgjzftmwoxqjwvusizfbucwgocwsydqpystmniyearyutuceixfvtoedmthnhcuvpixkplreajfgauyqjfxvpkfzdcyqxxamrbvghuntzqfupaxhfedpvzwarawuwcofyhujabkluzsqudoapyttgbzrqcfgyqnwofwkwavqmrcinmoovprvffaaxynmylxhhkwtqszgfwtfkifbnbzmwwlpfdymxydbnzjhncwtmxgmhzktymwbhjdcgnsxlcwbcyihkyipukepghprkpzisfxxgvsskmswrntcolmhhraorgshpffbvnobdzottphtocmfpsmvgdzdglbtmvbvjldsiapmtjxqlnktglfqavtmlphenslrvjhovflsazqvnzhqwbuiowcnwvusavdinozaoyadfrbqgqonukhxewlmcwisowxzfsufdwdvjvznsublhhifrmjsamedhorxozuxkjlzxrkigfzqgpypzydxejqjaxgqdtihxjxefxzregqdqlffbzkivceyxkbwbpikuaiqktthoqhigzdprkhqvgranzewwaersfhvpzefpjzocachlsavqojewjncvkfkaqxpnnkvedayobflcstpvcdrgziuorlgasqmdxoutaulxqvcviieuplsfvywkbluoblhczotbyemvzkietrzdykxvvppugjujqkqmapjdnbspdhdasiswjpibsnowjivpdzqgbgnbfdcwpbmcowabhepciathcjyztyqtxgqwatmjionucrgxfnvmehgwivqjivvcdcudulkcfrwnknsoqzvunjgkdjusnhayfunrehattshvewcoswxxwmgyfyltcwletcxqpvvhtrpugbbvtfknrrxpjrbkqpcrptoclwtxxauoybuvmygahcwtvxbuoqkpacufdbxytgbfudwuhrcubgsppsxecewumwmytgiqhuomsxomvcxqzkwvtppnthxszomgvrcckwljphjbkfuvoazybqxmuhbiyzklrfzaxrutsgatvmmtdajgzytvgduobqxhypbkecmbooffoysuzbhcmucuhturmhzalyvufeiarwasuflpojusizvffhdpbbcrcxvjhebytyujfzfohaguywpdypbbohzueajwxgrnehyvvhsgfcqnljtvqkctpoxiplydwxcluaxodnguaycyfvtjrjxamegzgalugdzhalvddmychpdmbstugmthohdvhtyvryithuhvltglekqacckljmnvrynwybzhmhvxmhhwqflcasmcyhjklkbxspezqpzisrwcthgtxyvwimrpevzpfnnvwkurywehajtmchakxjypttassygrhsipsbwdofsqhijqktlzkzyluoobzfgkgbkgsafirfhnobrmjtbhfdanmjigbcabaqumsgqfobvmmigytkumyznkfmywlawbnmdulbzrpjyfqrxjzwxermcphmftcuacylfsfsgcxejthrhuzcdaejtmgdfaqzsvbltretuofbvdknjjzbtkzmheupnplhyijxzfdnneoxbmyhsrhuqixtqbuomlhvmsnwmsewtzbguerubdrqawrjzcqmmafxvqfcjfeajlaskzkdxngdrtjgbywovlekbtlyefdandmriitsowqdgskcssqdpschlsvskliqfqfdreyfmbvdbohfiyruxbskimmzbrswikjqvjnivkszymyrzkmymujvfgpiutrdelmfnfpmhjissquclfcurokvypiusodtciptvxsrkfnfxmiaoeifzcuvpooyjrvqheujtojhihpkgsrpwjdjrawvmtkjccpnrjuohzerpubezukeyblaxktoexhsoefagivauhnqrhxoiorznralbavjgumtgilnibwifshdxtxoguovosfpsmbxhlluosklxosojqdlewhdrexjgizumywgmyxjobdqblvyagchffufeqejedeugvmpnfedfnfszjwnpxbhlqxkozxhstlhheflwxghyrxuwuypdlihngbafidbtjupxgpzmvugtztslvlytcqwmqkmlxzttukxbwybfujhuariqstajndjsuacubebxtxsaunjdzykhipuhabdgpxmzssfpjanjfeqwhhittrgiiwujdzvxagaslnqxulbfosozmfseibqfxxeqnijicdezkptqwnyvvwyekdfalmltoxcadvlphdabfnksbiizjkekjdznxkmmbxmwuiqzpvgnzkllgbsqawgvwxbiwptayrtvurmxxwcukqwbmbajjdmicphsofpuympulhcmdoiljpcdxgnkhshqhurjnrxerbfgrlzyadspkoqwhzivdoxwshhnyjlepllfmyqyrqzhhfyuyymihcdtqfgnwbhjkzrxfpwwtucugaglirxaqgrotupyduiasqoeveituzasanxxeczezcycaivqhpamxxuljzbzbiyfnlauhttgiegrbyukdqoimrjcsbrsqjvfumyysapmsgxnnphcmxkkvqglyktixajaieeqmjursewxojxabamhewcbiqgwfrncgqslrnuohaixokastxjfgueicglutushakdbakrgzsshcpvchozmyeglmkmdaqtpbztlvszorctkjvwzwixdyynphpvlseohuvfqdaifmpdlvsxesgdtthrihszcvxvkvqgzxlwgizghjtdvzhezvcdamygqiimdruljjksxvhpycvumbsinxtawxlcvgzbvjnyxxbawvtfqsiwrwlvohhznbjtvhtordznejxyornmmynsntupepreclrpzsqkkydzhagbrbbcclcycankskmcgkcpupbjxrijsowullltaixnkrbplghsmhgyjmmsvmebnwvdftzuuwgdnbbppcovxwocdhohkgmazabqwvuqogbassttpwptchzavqycmdeaeccaqmscsfzdfmwzpkuzcktwiipfqhziithdvukwvrjuudyfkldcecawthjksddymqbkcplpqyeccpweauhubkdnhswvkpikotmazwbaxvlkydjrwosgyfmtvdzywyjgkcfdxgpyocgqkkouryjevsqluwnfbggrfccqanbpsyvmazupxnhxuvpqqxaunetrzunzcvgwvutsvsjdzcawovqenmbcyfkxhjgunveuzwfacutqjvmtdbobhccvqopzcskjyigysifkbpfjzjyajfakjklbetnkqtmawoweavzmqbfqpobtubnwoznarfwzrhkrbkmcseioazlaxhrglmckxisamotvzjbupzpxexdfumxffftyimuyxjtvggedifmapmymlyzogknyoymxvdhmvllzrvgfbcetkzyednwnrbnshrfjhskmusgmfbeofwxosebcxqednrjhooybdykmhsdrlhwkvprivlgttbrgylksworrtyjwvsftgymaledpxqglwwuztjphbgarxkipcbwdfeekppbobxsidiouvgniqvfsijyvwltniusgqgwkokdfncwrvkhmfcvpfhtacnqbzgfungrxiuxainoplonjqrsecmtnixgzujnpdwfbpulekoambstruvdiwhltbgdykcanvriatqclajnfuxatnghgaqrkevpyxuncljigdphpfrbyntbplxdllehkxuywaooqiqycpbhlbnzuqzbfgodhkwvrumulsvegattpxegwpslvuwfylndnypxqtehqqwnivnxbmojjmzipdzulzpzsklkdkxahlcigogtkigalcutgoehkobpfbznmllumccqrwjgzmjgwqilrlzgxiwvwtwnqbeysuxdigplwljiwgfdyowvavkjrlystnzqhsgpqkjnxsbgsbkzijytimatglzkdrvjugsjxpheepgwdyoqfyyfjningehnnblkehswojguiuemwrgzvrlegenkfqoagknuzvgixxutukaaqbfzkezzzufsmvznghovbyhqkdqyxlyyiwkezkuuixrbyqmtiugogegawrltgmuojreckjwhwkfeybnectocbcvvuuqrzockcceggfzkcfhnaryxaddlhzctbumgzqqyoxkafgjpuibulanbwhiamsomtyplfrwxspjnaxwjxhrvhnwpjfcsgfqvmtsilszuqmirllezxadijnrgebqgxmeqanadpswxtoxjrpxzjuntjeheiclubaohcsvriwpodlyjwxoxjfgushzpkrltsdiaunrfofdswtxuffxyfzaxaiezgzbnbpfakdaakjtsotwvklnbuujllehcyrweouljuhdlnmdiqrthedvkzlxejhzedmdnnusahgcudjyorivrdznecnqkfepewkxhbdmliwlfkyajpkzxlfwlyuxiewhtbwfddagrbxrroahrfnjbkrzxvfkyadxihfucmueevlrrvqlsrhexwysaqdifyticjwrqtuihppabqpcxjhwfedtrqczsfyezvtnpqspnvvhzlcqocjvrvwpyivlgwevmcrbmazmdylyxbiybdidfdwkzclwztvzpamvihwjftcmhcrmzusteahgavzqieiqlueteluskwbazztofufozjgogzxdjmxytkldshezdaeltlxoyzqbnnkndcpkhhsqmdvafzhoizlmbmxziaofxfmiktmiszepwlxbnchomnowrmriyldmwgtejjgtldjdqnpcoybjlppvzhbpbqypffjtggdeofhfdprdccupoauomwvdzdujnhxupqsftejseoiazzxskvyglbnzmwkxtwuijwouggpgrcqeqfffglyqeelrvsiqtavwofnolkjzsazlunjmnahscodywkraxpjrzhrmxuihrmrwehhhyeqdtrguxpwxkydvganebwhraqtnpglhmzvuaqyvaknhirwefpffsupbnepadnrxupijuzrsvgjfeprqkragsgxhxhjrskgezuctmfrwwpgcfchqwurcyrpeesqowrahxdeijcmbihfrnmdyosbdfngzgnryjtelvncalbrhowzptmodljxemlakennfwmwqwhbyneljiwuwugrtvkksktdjyshzbnebpvgnyatwojmptcrbhusukbljrhhxyzyssdfpfmawotxjfjpwmgbiflhitjyciphgdfjamjwkdjwzcienynhwbxeosnvdqjpeafsmfdikdsojmigdjmlpmejcacyqzbhwzgmuevrfioeaijklqkldybfqdoscaoquvkkjqbnhcctjavtzjezfzpxaekfttkcwtrsieikfrchybkcnrahdestwpgsolucgjxvesecutgtpsxafvjxbdzgsquokagdecyahuymoibqmgbisadpowxizdmyiirbexualxaurtflswywkahivensnqaytvyfgpguatadoysltriijkhlztxrpsuxvtwijniaumgmdyybupmcxjbjymvtuljktkddozeqlrfyplimueaaeotghnlngddlyqkggdyhkpcyiupkllxxqeekcfvbwitjjkthsjzcwdwfpwfkabixlfwirdiqdesfttrcqtqvuqgcmdxllddfycleigwladpsxrgiytyxjajvyuuysdnrsajvgrozroxelcwylxgobybgzvnnwcqebaemrrjvwbregyltsojnzghkkeyzsqjlmqvlcevhbzchytctmfsucvatlsewxjmnjfsoinpscmbjfuhotgqdxybyokbnrmhdidinsrelhprlzswimmakaigrixykjmgdqperbvevtfzoxxleudzshulsqhlhfkzrolfcdzmdueesgkqecxmfpxonsgxqhksbhpzywiwseqrgieztksseqqpqzmeiistsckyyagkqxzrsdbdgagifndlkaikvzutuywgqoragrtctnawlmmmgupkhxvidafitxutsmynimwbksezxtuycsxtkkfovsmodjtocsptlqnsvxdzxulhjlmdpucfldhoslaluiynxydyrjfsbglwvawbblwznmyiqpnopijuaihttulsyyxtlqywtfjskjghjxkjttpdanjryqfnmwbhkfjejlwnjepryjlvcciueqpicdhzpaxnqkglcglpeoejonvaqjwqmxbxjujzbamqicgwezgdqmncdnhqhrjnjffqyxsmkjbhjhogidirjdlsevwlzqvxfpytzzefociyhnfwgtetguludxtlkktgrqeoxaxdinewwymfkatohlgywruooxeeznzehwmnajgcrndinjmslleavparbhrprauvsqsrgkzerpduelzjuuonsdjfnomikrcigkadblckxifkagcgkvouanzeginqbqygcmwzuqvscdiyvpsunotiwmwyvbcthbnqlbxtzjamjdtawdeswgrzdxfpzmmxfhqebreuggzcwdzzuzolwdjadhnvfctfjiyxcspibdicbswcmchroyhnkszobjawawtlaubnvdvavgilyjeibanvdlbpcxzscqpgciuqupqiamckpkxjugqtxwzguejmfcwlhpxuqdxqmzjwawmacllmyrnczllinhhxnloxsdzzisdwdzywbupeqmquhipirpespbdycsjeoneodeqgryfnaxwzuwsrguylhwvaxjqtcijpqkdgafjtqmnuwgbdbclqnauqtaumwihhwbrlqyneeyamwlbmeuopbqozzeyofnbwgrzmjbmjmiwnzhsughofersttrpsvvzqdioryoulghnbdfuwqppefsdemszgwydzwiifpnlglteuyrmytekapqnpzehysqpngggfyqreeldztvudbpphrewvektwxfshrutnrpjtucpsisvgfmqjdgtlqjpxchpthrtnqtxxektdmvrhywtaxrsfkbthrtmjpmauvglcwqqadqzgoqubsuxkfxhxkdqqbckdpncewxxtnqtkuncnzwjasgsybuvorlttmxcnxnanqrzeawiqrfbmeqjplwpswlprmgurvuprgikrwmhicxrbwtjrlujmrwnujwlwhbqrbfluywsicunyjohzlqozktvyelkksaqitnvltipnlevodlaasqtdirobqytlcmvoszryctjfmdugmuquclurfnikkuucylrbkqaflvyjkqhhlnujtpyefsydlxdbjradojjspsslglsrfjuchjleelhtmhcbfgpjtabetvxjudeyftelzhedgliuijlwwtdqdbbbqgoqghuyvqgaxyeawshpnplkbfbewmexadfavdakvsyqtqcpgcldrdihbqcnglgktgrvaahdgeiubwfyvpwumtahdmcgapsdlgyczfwyyiieuoevpejttuaflhrozwfmebfhlywklybdynigbgsipanjzopibdsbrhmmhtybwgnzvchdcynbbakimmzjwuumalyjgludxlkejusecpgdrrnjpktujvhkgcpijwnxorntlzipgczrgohnbyjnjtuekybdfdhyudzxiyfqjrcxdvrvopptxqugmvbvmlivcqwzgmzrxnlpkddjpkhrcrohqicxhtvdxwbyevkxvscmfceabjrdwwypryylbyuqapsaeiloehlcorfqygusszveaxvlrmjrthhixyulxamxihhhixakzpskanzuvcdtyvfdnlgswwbzpzwqfvjwthfducqhakggzpgzhxpoyzfxwgpzsdvmmutopyvbajxgyxhpjbzkopqvgbqzlwmrcagbrvudjrhktepxxwhrbwslahytqckivxazcjnnnjzffpjjxnbrjfwxvzrxrurrduhvohyrgoowvlfearbscftregolqezeifqbdlyrtngwrcdshgpwmhmmjfyqafzebuvvoxuletlypwnjgjgsbocsrmlfqeujozsjanbaxufqeieyfinfjusqzzzlesvfvrfabcbzfrairdytbgjvqmkwaqzkksruwfeedtfzgretsmcyezyqxgyuzcyilpgnlwzutyuvulozlxkpnsqpkwuqzgmsaootvlmfbjshtejwwtvcmakcfcaxjakxxqcwmmbfrihohnsjcjkmbxycxofjfkwnelmmcqyogguujjuhxnpwtnsxbcuvohmovuouzypqsoxpfomoszxtuzihlbkexniojmdmjqahnkyusitfonljzgbayjpduhyhnjotbsbtyelyvzqjvbkcnhxltjklliotxyofdibvewbkrvmjfgxqaakthaitvfafbwitcmifxanmleonngnzgjneoqtwuwvbsbgazhebnprjhyvjrysrfxrnmjmvytafrgjcphjfoybsfakipcprajtcwbvsioyyywcekjggbhifahcmqcorkzdbcimvsqwxpxlwakourxizduftqbvyibxfbuphbvswehpaexbfvanfbysqsdddaasyqfufiizlwbuwkrborragroppukbancmnoqmekxyljbvogmglkzgfvygrqisyibyqklknncbvqusjjrgogxscioxuplxvutgonlznqcsewolosijojvwokbiipvdasyyxbztyimlietikayrnfppejpdpbkeownkfabdatxhdprnwobvefsdmdvjylsgylvuyjnhjvhbhicrpitbtixbxgfbotfjdtbhdjayztswbtyzdkvvhqocdqandcipkhgrcbujyxwtolmxafknpuoepqixwjavflbfmrwovitcrmmyxrdtvqgmpejvnbpesxwxirdwfouaiklwrmjuwqmiqdhbcsplmranljyukbfnpjyoaxbujhepnkukhnwktbhgghmxbtsdgluvyjnwhryvcrhgwyagkvdwyhwaqemxxgyenfnwxgebboswpnwxxcfdptwzwikasrmynrfzdealsoqxddezvyyvdywbkegawkftxrwpongafzzpqrfdadljimgtcpfzltzkfawoctzvabkxkfjteckvtykvngavhryuvfmuyfnfbdlcwzqibnigvrcyqwhzwtlpizekvwilngmuvrjzsmqullfttayknovxondbheslkynpxuaefwqvbogzsrvtqtcymvixvgwoixsczqnuehslazmwqgykmkaqtiimspdcxbdgtdmswwsewhdncjllyjaasuxjkrthwlqakrzacedwkqbbcjmatcfjkxkrhudyransmmmuftyrurzqgmtzxvzwfcpdbhjskxymjucqaurciwjcjseyhiqtcdjhcqegudyjtjilpwoayrvxygxcqexbiqrmztxpbteufgfarbmxkiiriphfggjuysbipkzkpoevstldvahxfxbczvbftkqvbaahxazvxigmtkgoanifcxwxsbhvwfkgjlgpydubvftfklhougfgwycraexrwunhnwpjnarvpzjxvrtgbeatfndcemuizwbteymojvjrbeyzvkaregamhljopfbwrgipexhvxezomuzkojriynehhydkkxdbwegqbebukmjwnkwmqmfhgmlajwivlahxlsukpabavfzstpnjwvqcwavkmvcmqcrkhjwcivqpxtnbsqtrrrfdhezcqngjgmbwduebcmjmusuqtcvxnzhegydxidovveefjpwtlmovghhjadrclbwzgdqfxhkqpycczonechiojbcjwbhcwfraksrzvqjluyrhrcvsegfrmmpgjcyixonpykydbzjqdwrcabpyjfxmeotyodwgbzbliyewziuikyptxvngbakzoeshhqxwxpzmwjpmzmqxkaceznbvdbsoyenztsayloladaabwkujiaqehcgpkvztobhvmrugbgzybkovjfpwexzaeogdbpkldfxafnctlpntzqyviyxuwgfxcvgjiibvbujxupgvwgknofzjjmdudeudzxhfmersragtnkhfxikzqndylnbdhjmvgajgebcfqoitjkuxoudkofxxxqaegwffjlmneoyhwbphopskevmndqrlqflohwktzkkjyrdrzbexusdkvnotdpronfbylcupgcrhkjncswbkylpezctczdwhmfedanxnhwmwnwvaqsbwxitsbqefjlgcognsooaglcmwgbhxizuarfmgccmrxryrjwhomrecbqmdyoofiguxlmprhxqyisjkcmsofxftwbebkvejuavyutamspqfyevfqxnrtccetygcmdtankzjvytzlarhxrxsxuhcdgmtmeqlvefxgesxqwrwbchnpffgxzbvzfpcrefmoutpbuduzhslohigthjbagfiqbhkwvadtlpxlwbvzzfjshbxfbfddemxpcjsgyzzouzrojmzucbbampdoonauypldgkwqskjphibwugtjxzkgewnkoyatzipiushuvjlpraagyipmaklwcptqwgsovytaowbuhmsipjelfpeouclldjhovrbjghbxwrvihfgwjrppizipddbdzikhgnmlthseczfbocshbyrpplwduwmnurwwvnlscsdtcfgxcxbwgzjvuvgtgwqrsnknyemjsoraonrsbejhnsbzyavesohtdgdrqkwakoibkmdrhtdmkcqldvopwuwmfrpfmqtmtzxtpwixwccwyrmkypqvynmgwhelyncqmftuxvyoyimsmvozrxubddgismddjejmqihiaoynfbmbxpstwywqlozwqhctuzwtcklombidtzfmdtcqbhupnriexgqkbtznnrhqgqmjrhewhnflmddpkjzwggukeotqjzxpqggwvilixortrpcxonsejgryxutoxkjvouirbgknnakoburrwctocnzcwoyaxitchkvqsnzwiqmfkieoorsrhvtqphxgkdwsgnxdiszwvfqpfqktrdxyohilusmvzzavcecwzpnklnrlmbbeybkkoiysvjbkfvngghievmwixphtfcrofjbuwvqdpxsshjftvfijqkklxeezqueouscnnlzptbzwnelkjiygrbuqkevyidobarvmydxyhkzgkgrvrchbbwxevjjyuiygozqfonojqtriwgrjcdxvlabzrbyrfcpcikqxkuqasvybwpobhljmojefguulnykfgxlyujepomlbqlalrrgprppnugjcmbrzqviclrmafqqovmmacbucqgcziqwysstannsnfumptiyvukngmefrogguejmijqvygjrmcppgdhwenncqpnzszowsadfvavwatwjjdnmvmhjkwblhjbtxedvoazqxfljhgvqixfmsgqqubhvwflelcrbevcbegvuhaagtyqjcbvuvsxovmckhsbqvaqzkbtnrgllbzxpgimrbhbxsicbxstnrlzvqnrgelmbgufjymgezttahesoqkawmzhpqerseqeocsfhkeamrwadzqotcubfjcqihcmpopcmafnevosvezxrplxhfjcsgzwmgbzdgdzpitygadydnlqfasquduzqumeexiegcucenccfygsdobpotvjrpglpxwzxovmzirekgsgughkiejlizxtudcuegoxbispyirifsvsgrsvqbdiikcbtpyxpcmakvkbyhoqqztybzguyomehohudgbjiaroqrqinohfpfxfnztudlpudbemxgxnlozpvkyvyfjrivfrlvzetqdjvfnuiloztufjzcxeitoffulbvnlzypigxmvqlnzdzpsmawsaxthnvrzcpjxrdgzwxapldeoevodljeqeistulcjvdkclthnvbwsagdaxcycnlygebsvkmsbhdkwxhfxwetzlnqxjfdgsimgjzsrumcqdwfrqnbraoprffpmegvhmtbclbaznlehsliljfaaiuqsqqahvzctvtghkdfqevrxhzhxeqgulvapvpvcjycmyeyvbdjkbvytwjnqjqdjsrcnxljnzwltpuyitdpdzpnudhqdcnznfwlzyucwgvcttznlxnznprptnbpptslawrwfbukhwqycxsojheqeivrzduhpruzkhclqximsuytvtkndhsvnheojvpfzjffidawcgyybnxwtnbdskewimfgxzpgplnfykpguncrzrtkfbljakljazvkbjtiahuqieismhycasessxsjmlnqmtbidfodbpsuprmcscphiyzvthrmrvfqmiatxcxhrdzazwwzswawnpphgnluhwbnrzmugmycbicnbsbdsdgroxzudshwiwgkvrrpvmwgyutsxqplknujgxweqnhntcmcyjvtxlifligpkjjnmmdcfieiovoqqpetrxzfhlhwlozisepuyzopytometuqiktuutbmpjtaecvvzavgcivcojxmlqvkaemptdocaahxhfcnjfkknzjcnxliqspzbziecdpzschvcwjntmsaztmvpqyhdhyannliaulvvqalioxestvydgcyzxmmfgwxjlgproxouywstamldzirbrmyvllfubqwngrovnqwaahsrcktnethvwsqgjirdunratibjoluhipslfxlpvamazmpvviyyesbmvuqlfmanreqgnthfueipdbnwanodbrxihifzfxurywjqfrvyjrqwfwnilyvrxrjxmwwdhobmaihayixgarpbiotrlcatkeadmkrddzwibwyzbzyheiujekyozggzopitsynipajplbxluhcqmijkikmliuhmlobsgltqcwyfboqbzliysmevwxvinxafxhcfolmimfdknyqwgqffyooknmuxjvfflkxojycyceynsbsijqzqxmqwgmqmeoezajtgqqvutdawudirspvxgfihfprjexdhxzxszkdknekehruzmhiavusgopgkargvrpzerrqguyxwnqzsaqcprkxcccugkaedbafdyozkkrhrzvwczbtgwbojvdnjukixpmifzjyoakgzthidmyqaxbaggfznblcbdnhaxzejxkqnhgbmdlqntqplnbgkutuhlkjgzkoiqjyzrfysuorpnnykiakdzxararhyrskqzpcqazcnxzfpagufcfdojaraqsfgpiuctrcqaypitdjzaxwuflmgpxskdganzvybulvbwbnyccwwrnupblxsumwlcqzeaovwauogmpwfhglzwpiyqmenuobhulqzhvhsxaavnlylfirpruevodzellowwwazsdlznrqdssrxjbtuvrrtuddbfzcldbvrdzirgbmsukvdayxoxrmqgfdlfrstnswlmvhymbogsumpgmjpihzbdctchdffufdnewypptamuvkaqyudyiwjnurizdeikdwjykfqavuxdcxnelsxtfbibymbbfnifqjtyvcguriyywzihcilzniovorwqfzufeccnmglwrjwstpzzmmzvcurpdetgeyzivlitxpapxaprpvzsmgqblcvnppzzxqhpwwaxrracxyqrmaemyxlgvtezflygbioyhqoojwydpxpqnruahnnduuqtkuxoejjjhfadppxmiodakdawrveputwhtfsnjymvamagodgqrflsabmvdyncvsyhrnveiqnraciglsudllakjnpmbcljaoxzlloqfdghorffgygewvzkfdzfbirdfbypoqqdbcscezsuvwcisygkqfcxbukquymestxrsqinhgawgfvhkcampisfjkbqqiqlxihdxygpqipahoyjdyjqzoseznktrcwouhjgqwoabfwvutuxgadlsrlamlzklsxxndwuhctlhgkxtduyyksmicrrizreylpnrlhrpdkyxdvmohkbwxanrlndhpdfpnehhtjzjuutybndjbysnktlxfvpgfhgtzzginloitoofltxribebxbynwbrotpkasfbrvntnvkaqbukrujetvzdyoufaxqitqjtccrlgusyfbdviiejxffrtjcjkcgdsqhnpkzzcixltaveuwvgqmpucxknhbklgaqvidfgspxqezrwclnxnduzjyitcnkwawiacmtsqupjpfugkrbomjqmmtefokwyomxywymxjldtloodmsufhjvimmcqkcrdtzzqirxdlncpnlgnooatojkdqbsnmjlcmykzdfndpdwdwtribuedctdhghtpwvipklnfygncrcrjzckcnrtfucevbyntrkwetrhnfwfvazedbtjwsgovkgnfpufmmuvjuqdordewfltakbgeiqfagkxrtjrlkxhtbtrdrnhqevvgdnkrjhoijbnzqupphpvzxhvwbzxpfolfdqmmqlzspkjqhaagrwwtnpbzyypwqiityktfgynfggnyyuclcjzrqdxaonwcfpgwkzfphztgetmdhhwpxclovrlidwhwrzutjeflouilctnkvuxxvkkojowiqbejnultbdikaieyjpafqtiepmdadiatvjdspfqncvhvlmkiqrbpudoctdxoecsbeyopttqoogwcwgmjgjzhrwnerbasbgmqmrzkciqdjtlsadfqauxfpcabgyfdymrpfphjoobxlwvvnwjdvwwbugialrhalggntsaprovcnnpfnqheyzdjyvixjglbidsoqcuptlmojreiuskommqnpaeheyfkneseozizocoshhregdxqeoqyixbidcbpapmaxaazozdxjtacqpqjaztushhqppsyywjuobictavkugzajdmqqgnmqwnqrmuwvtlrgytmfgwdmxspzsklprdibupindprekymqggzqowdvyikzrcaboblfqtntbckkjrgtnqpzftvhyywxpwxkoviajfglgjuxmyizeabewyhrqwagmaexzgwfffopelopfkcagwetoemxprumnwopmwjkhmldfiyooefkkgweddziyifpylbvgifdetwgnmeifvkpfrghpmalaxhucwfmfjnqpbpjvubrusipjaavqpwuofpnvhyqwyeswshowyorvhkqyudthrxwswaostncafiujqzojhbkjzwgmzzspwchatfdjhpmezlaprrkogltfdxqlfwbprqfpzqvmwidaurloqbunhecrfrsoptjrmbqhleiulwevhrlgvcntsvsdzbtgvykhkehgsldodkdlirqdguugerpczqsxokgktrlrboghguioxbpjplvrqrlilomwhopoqjkennmetawfeegkvnjamhnntglzecbqsabiiqmmsyuotoroiccltrxjhivvdonauvogepaxqqjedkcbzunmrhwjdwodvjqxryfppbisbnpcrvfufqlctsmrezytlawsqxvhptpngexealkmfrrovcogvkaxvtpexqybcnatccsrlqhvpxswqrcxrdjprxxhquobjatqjfspaienojnwibfvdctdulsjfzfdtkvkknphbevrgqpvsacfsusotdihblqfslmhoonwsvrgubqxqyjyescprjgjtjyztjldmiqzgtrrxcdclekjcesowibvuvasgazbtwpjigepngzisdyoyxcivzoaieufarlpkilvwukamlyytwxvkgbifweptphvmfiiexlyvvfpozwprkhqmvaylpkejfxapbrdlfmlnvbjydmsjoptwtxpclksufsxaatpsucikirqsmadklkribybtfwfssfirlvxzhcuvzlgoyfheqrmrqyfmirlysozgmhsquazvkkijaxysvvtslrtriehilczgvqvyyrcgzqbrphbiugzbgpncwssumiyraiwxgvovtvrbsgsnbegmlpthqtesjrjpxwsxwnjtuiiphoewnetnqglwhrwavxnqxhllsxuyorygllsbcpnpraqpomlflvafielkzxgbkrjebznqexqnprelnffdgvfuivlwqinnnjtiburtmarucqzupgbwnkxxhpicqwcvmclgkbwswaliyylgntdpwgdsqljxqzqpmqgrqvpwxjrinfmcxhjcehmfuvvyazuyrcrdkttzvyhribjlocpvkpuxpchyczzxufpzpkxbkmatrgvrcgzcgioylbfgcsvkchfiycsiswblbjwtwqbtsjlgdniymjsvmjmtjtirvndgiinchoylzxwffooosgoesrhttqwvcnqfysdlrvliyjirfdruxqlvbpavhjuzdaxygpxuwtnfodlanaiasgyqihgnjolkmyqqoyrzrqwdzoeiebljzzdphecrdfznjyyejnjimvgkqlpjxfrhppqaozzbgmqlhghurwucovjjxzlhgjgwgqclcbtrimvdklidtnsvrwnoosvidchncirjdpwpcphzkmlxkylsanqtibhfzqnnfyswfogvaujgazamkbuyqbgnmumqcrbkaqgnyhbqwguzgcotghkuldzxpnfvdhxcxzbasxgkuvuacpfcmydmlldydbggtbtcdpwbdmuhmpdfxdumtrahoyxwszpozyihbpggngoxvgmdtoumxfekcbokvohnktzkumftewzlzwayzywgevweyvhrbwhgdmcbqdqxfzdccfkhfjtxkglwwmzvgbcqsfrflwpseuzlsxrgiunkxvquyahzvvhzhcpoimbjiijdvjwhkglwkbrjeqitbzesejzsxqdhgoyubcddaenacsyygfxljlgexksqgrqyizzleuepwvnnqogridebmikjznfyruvdgykjcpnjkgkzlkbfouwypvggdakdjqakunaoexsvpczlyiphsoegexhvkluurgvntdekytrzrbjhdkgijjzvccbisntrlrppgqcaseajryhhpbdgqpuohooylzofwoegigdcylnhrmnevtgrjvzvqfojvtcyqtiyqywkbztrqbylwkyjbzpgctewywidyticaoqqfpjskhhsviigvvympvqrjbekqvjwmfjlmorbwsirldlhhgylyiemxrrlnzdcdplhjzyhotbtwdmxowenhxwxostmlvkahvwkkrghvffhakznjatlykmmxqypfhfrwulkwepqownbladubwpvzldcsbcnwiwxstqcyoajqdspuimlgonduzivqkhtovnghqdiavnizpoovqqizhexjmgpjanjscjvuycvwwoxydfgfugrpkehwggoucftgvurhkgrrafwjstayazcebzwklvgeojqpaeijjlukofffmxwekntghogqgigzfrajrdljorxpcpyvnggwrmybylpkglqdtbqhkroubhzxnvnmtgjyuldumyhntwbdavblpkouxutofervrrckcuzurtfdrvjwgjaadnfdeaxmmzanwxblavdxgdgazyubgwutbsisujjscrnapqzileyprkwhlzhtrfmajqvmgoxqlgbgueksuzimvpwktljynioaezgqyiajezqsawuzvypafqnqbdwagrvrmkladvgkpofmpjszhwecgdnsuovbmwznlvvagcbseralcvlgudiulxrpajwhymzmppttykyeceyuvyntrgjqohjbrosgribzbudsointsbpenxvdydxccncxnoskwcnsuargvixikmwkaefeooaosfgowxnvxrvtipgnluboxjlxcwfunilpuwchoeutamegpvpuocbkjmtwxshbmnxvhjcazwdfkrhnmzzmvocowktzmxtirfzqzopmdwjwznfcnyfzdjcbcxjemmjnrhvefnscdfhdpknuedgbgygcvkcgibbfujshkevbhrlfnsueajfnpjpsehyncctykepfksdjujjmldvxotbsiwonqzwhudstnxkkhldobkukeaiynrobjbksgluczkxqhsnfbepthfmvfliucemtfweorningqbuzkxrkmjecfabgplhxblhebjchxrxyucjuynoylqdtcgqlahsiaechxbdbshiyujaoxbmhuuoramjzgqlhgytnmjheyrkwunjwenygfcwvvigelixthwebrwlmflucbwaiuyneiepvvcmgfusakuitqlbuaobumyysiqnizmwoofcyyqtknrjdfvuagukfczopmgeyiznporunkyidlavnocqvrjwawdisxtrtssbuoirqzdlajoogcqzfadfdojblmjjzbvwothhvtxprnsmcjeaadbbsnptftmfcmimmuqjkdhnmohxpxewxnfjwgkngfpdvopbynqwwjmgmapyncwyjpdtektyiklorfmendewgyxyiouzuakqslnolmushdwkrwotqskyrwnzomoylfgrghjyzxtotlulmhdyldurfychzzglwftshjiixoprrkeflaeycroienvjmpwwfvjojuzsmubduyautyjkdbmskovhvefkchwodtylhsgeozxejdljfbymmakvndcfnnxhqvmlswebzlwpxerblfzhctkawsepddxlvvrupqousowifnfzqajtlrotechfyeqxmdnmqzboxfgeqykmxhrnvkgicfldsqxuorbgusqdzleyvjzfpjvxtzbicmpqtmjesnojjidbiltqqrzegbmtatjkwbtqylquiouiiaeuehgjledtstnhpsctrdswswpnedrhhvtdnjmrargylyyhsqwvcxndkfcxvprkqmeirspjkwkdobeyumcigfhmcmfipitsgkeaczrerebcrkvbpnzflgrgpcivpiveolnmhdxsgeqgdboqmmazshqzxbsswodeudcxzqnslgkljvangqwyiscmrggoopvotwfezxezvwewfxsvjineqfestrzgdxuyiduvlirvlzatzucivyuslrbqcocbgtacnbilxvytibvigenophxqvrcqgpjqavjhesjenewehqyoxrjxgsbdeklfvdjxahkagelltudjqldxloyoiuqchukgydbdqoohcjmabddziulhoxsukduraqwcyefhcdazvibawbhrznqojjkisclpgbjuiesdyvdbjxxlqemyzzqoqaapakhkaltemmwqwnstedznkazdvtpmxstuyfvazlxmavhhabqjsqmvjwrgxfypovgykozyrrmgjkdkrsksgwowbrvsqmhxnrmznpkqilenmvfylqggahokpakwzynwpajigmflbhabciufzjbomesizoohmovzvtifxincvnfglwrirputnhwwnleemuiidrtkjkxdfmdzcjlogdsoydnlqolcdsdrqbzesvbeohqssfyttyxwomhrcgosrpzmskcofmcrpxkhhfxhqidwvifapeporhvmtcfkisihzprmtkysbeibjmzcipqbcuawbrvfklcodueosopoasbjniuilqkjcareivpdaowxrggeahmkxhiddiurvoqgwdzkusnwdyortuxnhuzqkdsbtafuoxwhhwdvgcpfzzxnubkwoyuoufoxqdutwucldstwqmulihpdrrsixltogchkobalkohrjosdhxckqqhpghmtdvianyaziaujskmiasxihggejljxmyyqnldpynxbjvgqscxbkbvyucwovwsxopvggkokdhyjgekpdpalravlqeadrancjyvfrcaccsvtrrsttfufumyrbiukmiyjbiavnjujspypakycecsqwirhvuanuvekjaqjfjpajyjsmflyuavstrnsdvryalxmtoacqzgdyvsyfbsyvqfhyoybjelktybhmmmgogiwlhfrwbqmtkdtbahwrfjzyunpnjxeexftyrsbiypsnrfjjvpqzlngetjstoidklbvmlvsdtsyhcpwjqfgujsduyhwuozjgjmrsvvvslffapehfcdlbnqocqklsynckxduumkagphmqjmbultulgxzgpmthwukeutyteyeswvyqsernwqlpqqrrlaoaquqnhcnwwqnlmwvxutafajlktsivorkidolkylxgfhyslwjrovdjylaclqbkrugdkgjjpqwzwgdutlawxshnkcysewilxxzjezybfovlmdauhkvdhqozszjhvudhlvsoytqktlxsrptvxmzkenqlsmjhselgvgbawsdvdjblzndyddompplkncqkomklmkvefmjpypjiodqesalajtxgabzehbmsydvdossjincxtsqasjrnvoqvgztkwsxafyufewbqyijcmsgldtmyzdllzansqzmddrblmmipagjxoydgggmqpfcsthaxawhqujrfsfjtsuygqwnaoxluqasxzdiqpqqkphqvbmlaqqrqoouwjdmwdhbkrlvbjwpfcfxxubkfritpqmwjnhrqktqrmupvnetikkcoprugeylsxikrqfegmmldwgyybcrcowhgpfypuydxagdmjbkujmyxzroizdxaamkmmjpriqibjnlldfkrmdebegskivyvhpmjqoomespcfvmoabxaefaactflqtkhliqypsgnisevjrydgfurrulyebbqpansxpdthzspkbvwkrxegbboszffwakabqhwcmnzpvswaryxqjhitkmnhysjlhnorqeyasijeosqqqqivxavdufwpkvazdryfczdyxpwqhwucvwfyprqnhjwiamuepbnnsdprpureltvwgxfqkaucoelqmjomgkhcvfydbbikzqbytctveipedfyvszefvdvfyfpbgkwnsxfavblqnzukqlikeaauromjvemrrfqxqndgntesqkpknvyijgkifpynaaqmhaipinwbyykkufypkbllliyamqmozijnapxtjluapwvinbmroabzbokuoaqouoxoqzvwkwpglwuxbnapercunduvmmdrphgzvpofrgbiiydkrqusipnuyalzajxkeectkywodfhhbvxptabfoqemmdmsrrzebdjkapgcvqqhwlvhyaboqiznlhecgdgcuhfeatdakjglmpqckspcsmjbihzuhfpgvtqsnlnibzkgtzrpfralqldegvmakpqmgighfwiuxeasptulxixuxdneudzjbzgtjwliqxvxublcsjguwrgtfhgqdimmqsotkrbnnkzzzbyawaxgufjpqulnwvkzzvxlibhsckfnolknkxnywsjjmsnwaffebcqnjzqbbzrwseoybxreuhcgdwkfkwpvhujenxkrqtmgwirsdflimrxiykirjkqnbcnpziktmhnlujguzkvefuidxlirjtvdqgobbwwvzanzigtuqbxskchzhgdbnwwfmhhsaprcgbkndfjrupimvsmtodlrtptgipchghooiltlexguglyigvhxaztqldxnegoxdztheplhqbvyhmxyvpltcuvxvsstqiuqlhcjpuijttxrnsoxcryocxfissnpryswadngiiwvjsccpdmgaraxknhbzssrdaelxajobvdswdpflvqgvxuomguhhtcaidoaqbpgoeshucrwugctgondilatwsfgcjlfjkvpwfziiutocohmxuhqmssadheglnsvwwpwxmdfbuwenresjlokcoahlhhmynrwqrndhgvubuqkihgrejciklisgrintwwjnttzatjsvbxaxccevsgwppufobyyhddwukqgbnqkndxvaupqirnyllykcmufzdxogvlwlktejojqimtnxofukuapqtdmlmabkvgapflymhmpnqgwkcomdxggpwvghppsbpthvhgrjawccrajdvcnmqycwjpoeenqnkswrfhpoojrgrzoprddqrsipmaoiznaskjdqiwmnndcasabtdofsmdxtjfbwqwvxrqmbdurbogutqtrkkqcfwgnjmnlxmxwvzfuuhguspgjygyddpffhstqwukwcgwwughcduhglwzerhhpdfdzboakvwijcwhdzceuhkgqnxokybexcrclihcgqwdjdnxflxzulztoysozjuiqgrlodqhemeyntcbatqtrstnztcuhufmniuhxrlgcinzuzjhbvvzpdobunftaivdtskdlntdgftmaycfkqsxrqlszywdapktjgvlndqdyaqqfesyxsrjfoxxcbookddmrszpicevnhrjisbraoaahmjwxnsicmztaxissadzfbxszwumgvtlsvtialsovajbhohopeffeoefcortsgzylvbeokmpxdfjlddyuendvedxfpcdxigowpnbspqswudfxjfjmhriobzzcijsfyzqueehvnvweushtlpekftzdimiuadnianlbxindcmrfaakcdajmlourabjwigbjfbyqsuohxzajvjgjyhhpbcoukphntltmbjrumjlzsugwhzofzzrwxaomelwgsrzejiozwmchpwuxucruhutnjzljhnlghbnxvjyzmltomtqmffuzpxiyzyoafbaxvaldkfnxfwdonwfclakixndyzdatslnswfrekjcdkepfzdylothguoauernjkiltawfmojfzfzgpljhbmrmayhxghduheygvppamgxgwyiawrtwzhtwoemrywxprwleswywbbevfxujusmnguoeaphjdlqisfscamyxtbkmrjfnvskdeslrytaoeervaclwsybidyjaamkuglyhvwdvnsuqizkobkwevunifmlkfyemvwjduwwvczvlikaskmrwjvkobwohxdmicyktkistibsdtqvlcktclowritoqgrkxecpclpzcvvinxpjxdoqlhztixwpzertptizafptpgfgorzrclkxqpsktzosuxxivirpncxsawbydplycyljttkkzokzperpmpjspmclrkkqoullkfmvmgqdhrjvutqqunyxsyjfzydhppveoxwfeyuunqltpshghxpygykklguzklfeahyzlzhiyzbsgrsnokxjuvabybyzxiaisagpfunqwodienzlmdsiujskjzuexqrjjcpacgwzclcmnrxftjukipsqdxxxqvyrjhjhntthxbnjwviefvboehzdezjcfwewvxsqdakdacqpomrpjppbcmwdbidmcpumnxeuolxflhriqyzzwwatwczwstegkpyctebwqawxcokorovjlnwhrotxvcwskpxygzlsmdjqeffihlomdbjtblhybfbljjqcjpuqehlxvbpjflcscnyppvyspnbfszkmusfqwanppbkowfjrymqfnzmcgyfmbqwknbanejqrimogdozggzupqqcybnvsmfmakzhxqazyepzgdybgtkcytbmxwehjsljvxjollongdpvgdqovrixnuutdiheyuajpexuduehdvztbfgadftphnhhvbaddmsnzohoyuudkallwjchrwtqvsquqxgdgjhimpjahjqeoxmmjvhjrfhkdteqxncaibwoizvbwqegpqclerjjzbksrmbvlhvbqmclgjhqcafyqjazegxbyzlitsixoelsvsieqxqadsfraoizhqculvlnrgqhgwclaoddwxuxnqcewfcckinhgnasmkczylzdfntndubhnkendzximabbqumwdlbetmkcpmfojxevwywtmxgusdyyfafmwihgkkpalazqkzqlahkmtglwqtjodgllbwxybhfwldaeolmdpwryeuxmdkwumpdfqnjmsomwcdzjgcspwirchngnclpbnrnxcmpebbudwavpbaexyeraekzqclguqisvsoteqgsbemcfqnjlywjhlcmvdktpnzammhunlmoqmapkkbquxbiafoylezwncfdyndalrcqqiasdfeygagyuoqczmgzwbdgaxkqnjhhscgybmllkxhunmafflvjtrgfvtwhfrhqrliozpmvnezpyqwntqpttudogbyiuvpxuzhhsbuzoeanmltrxqcmajamwvmmhtukfpvehivdafypfavrcwytbdmbirtzyuafjqwoyptigefbpcgcpfiyqgxqmikublfdugybtfnlhwphqejlcwbqcodpqpqgwbxnrgtnwsfirghazaxbyrcrpfcasvzdxxefzhopkhvptqgltipvacxniqlzoyjhbsakzgjopljhdlwqgybydiwrvxfzzwstuvmpezfinxmipivuodqybofqspwwxrlnjdfztugeylbkosbhbblynxxmjbrsgzikgrcrtgkyoyawrnrnjlrvjyttxwyhmjyfnnkccsygrvmqocouqzdhvcabupseaqfddrqajueqynbhgeovxjuxvdmmupqexmyolmehkxbjwkpoqtwswahwhxdoisjdfffkidvmyfgcijqiywuzrfvzuehteukdequhhqbqlfnxlnqjmknlfcbkczucinzhggvnnahfyggqfbmrvyzvpyebbdkgjteuoqubbwiwizqhvaasnczeevpizwdbwoqxmjjinscwxqplzlcrlfobeajdjahagvtojeuuynbjqoyqnutwrnvjjaphrzbibmzcrgquaxgunjfqeueliitxnaiplajotemjkbwghrqwrjsbmtucqdvppppkoiinxeqwlkulrzqvjnawuokqhpjkemccosypbpfqqszsaxskkhdgynqqjbelhmgbrptkwkoxlqrxwtxzfpfyasljyqoegpflraisdofrpwsbamirabllqmezwldiqysmsnhauvkvsobqqfywpezuiamjzycatbrdymsmlwjmxuduibzlpxmgyngveuvpmfphdjczculcvpljowejetdbiqopywfbnmfyahnqroqbfwgdvvobspnzqyyqdnopkldwawntubhmbckokchnzutfiihqweqlvodcqsaseydntfgzebayvhshvasoziwcatpcvwqdkwxqplhnbsotsqjxqlmdbvqnmcxrvpgenebnvxfdyoextroaxxiimuldrtisgfikkonrjnbvbysdgyhwiwffdnrchipwnmsbojfefzonufiprbzgkdchznniuferysyckytnkmkxdfuvkrvniaugoufujpmiffyjsxgwxwzmibqwhjqlstktfhewwdnijbhsidzwjseavhwbkthxcgtvxmtkpfgzmutfnyfdtumwtzqtbwxxabqevxswktdmmqtoadbciywqugnvnafrgbnmpgxivzvyddtalhypuocnxfamaedjaegfjidwwtmdmroqmwdphupkaykfxzlkzahjvqbrudsmyebscmzpkuxuqzokmptpceawnzydxgtebvzeqmtptlvrrovvvdomilegdwaoxbatksuqbtswcpynyksieqfztjipecljpwkzkcuaiyvnnqzcqircqurkgbhczsmhifzyhdwcxslqjqxmhuejjznetxijafchzpnansfilztvfqflnxwrigvgekvyuftmqdbmysjwcuxoelazukohrafhjylcgxdovowujfnakaebkldblkvhtzhkjtxrfnpilokdujuuiykecupunekuslvuveridczsxtyrbsevqtqeydzklxtciuafugzjnnpvkbsetspagzuprzyvrjytkhlsrhmoktjsqcdxbdeoihptojyubgukeqokgcfpkdavffkukbjtthwwwkhpzmwqzfvozqhwoxlbqmaynwqsmqwrotossqgxjxypqhuxvwqkkoybiuifirxahvzabxytfrcwbotcmyjeifwcsagdzbogjqxsngmzbzokphkkovcrptembkondgfmkxtldmbkyeiybqqyqfkdswayqdsadaaaxsfjqzxpredopxpemthuxsmlbvigfkhfztvygejykfypuudhzlnuzpszntqevlpydcwthoixyokmdbbftpxakexertslkdqnpslmelnezbdoejgotjtciumkixpzvdssuzhevbixiipbslqvfrccrmqbwdnqnkfrrzqomxpwubpddmyjmmcevwfgnprdpjvwaqyfjdpclaungitebpgjqhhnbkmuwynsgcrcwtadgbstfkcjpkousipbyfkgqekmapzztrzfiujpipekzdvsxhacvsrsfhfhukhrzwjfrultavbssyscpleztavuzpaxanvkgfnjzgdjvwojyzzymipkmlmupsjehoynkjjrytvqkbopuxqbhhwvpwfgmokuxamgvbymrpsnkssidyqpbbsfvtbgajwsoaymyqzdbhpoekggiafiuafopfshboaholayvwsmiuqkcbubzsdirudffylhevfonwnutdzprbpflgjldbwypefjkgvmraxqlngrorigdqnjbqkqaijmugetmfznvrezcehqjbrqawkxizcrksrcirtkuefxtpljmedcalbycblfnzqbtigzukzcddeyvthpaihazoaxtctzdkckyfhvpigokzkpjgbmxfmvkyddubpjoxhwcpcgjdccwrmsayogmjgpuhucmcqspyjgfzyztqdsvqaeiofpctjecgvqeedtxzygleyvzlhuqtritbdrnnxatnjxzzroovwhangfzcwfwixcbalzxdjcfzovyfmdascjhafwinqebeshcyrzonmbjyvjxmpnhrjtcbmnireqhhmaczcshtwxmplhdvqrargduvwfjdxcwtftkgpawjuootxnvirjbfhuwmmtvmwygvsjnpnmvdcmszctnromtwldodtcwkhzdaxisqlufsrcejbhvtyqwizdkynexekhnstxacmgbmzorgqcmclggbzglhsouwgnbnniyhcnihqaodcmctsiqblopcellhtdvaizekjfslszquizhoycjgngkwulcqvbhgjiucuhsiaquoptmxdegnyesmqjajqhpuhclkajavfhvhxhhtxinlsyrhngnoxrswyibhyyybfopwbilbeiiwohmbcvscmrocmtehhbjdtzmocolwpiyqrdfrmdjbhhqepaxlpedbdewtuzjnnzlfuugvdaxkduixrztdejmfbivscwhlzixnlgchcjbounejthqaljuqsmqgrfpcbbmfhalgvrpgxjromgnnnmjgjbrkbsxgfzvivbhbslluccoaxidghdtuckuqxxsjfvmfnhzzfvgggnlzzlufmuxhodqhvnydkflclguwmxljwbkaqeiukivswavrwmoccqxfahmbnlvwgguanldjncofxbjjzsslbjnnuxdptxbvtvmkhyvuccldmqbcsdprwexpdgyzefivpqgohgzuwhbvobanktsfnbucychpkqbrvulaowufgtfbhavwjvosfqekrqeezldklyouqyrduwrcjlptnmiqzjyzhvkotqeksslhzgmbjgqexwfhjjjishwvhmcvvqpicqmclvvxrebwewkorowneeeqjwrlcjdctxybpsrrdkqiodtmnczqclopkjdpwuhdamtgilmdcqfwlrmlvsbzdwurtbbfanidstcsmelupdptsajzicillsfcrcitnvrugwjntmhgjrkyiqvferlqcylpnceabraczzxpkaekfpjaegezexbvqcokmfgajijqzbabpzvjnwxplzgbvzaxztpmcgwgsgrxbxoobvcvxbefgxpqzyflkpoifjwlioblopbxiyenqkxujhwmlukkeqknxtawugrcwjyhzdceypsqirhyrdctzxsyikjwjzbhxvpxgrdefsuoufxgdjtdrgvsgrrgmivtxdcxtyreolylldwxcnzrjjmjhxtzwmbqdswuscmibphhmuewbhkiyffdrolezxkmbpljdpoiwoweibjvlitotzgqaqnqbhrhjcvqzdobfkmgtnfevfnlmygcitvycstohteyyoxstseucxqbjxrmtdpegykajwomyqzatwjtyocxytmlaniacqtoludefavrvxzikinsssbjhkjnhhdrcxfeejlyrjygboqzljfevnrabfmslmfoskwjigmiupuocekhyeiqthxtzltsskoqpmnodjbetmbbldwtxndgmtwhpqmkmuycntynidqmmcwytqiukqprwzesvpkteriwjtplfaomskmoenzkpcomlnxniceckujqqttxrdsmxdrpuyucowpcookbkwrghwyevqekzijkxaurniyunodwxciquarrdneswsyjdizqkwdoeecnnisevirofrbipzltymqygtrhgptbqqfzngwyiftgzqrabkpitghfhjsfxfielckypfophvhirjryutjbmyzfrllmgzbxhuikcebaxyxchfmgptcpzkbcmmuxxoxrkxnofaelrdswwupxcjklusdazryqfuerptdlquscxtzldlfeacnpvbfobnzgkbekltwcjfrpchbjjiouikdybblldknpvxwpiukygzgcmmsamsmgqqvfkiftjothdqcuplemueremfvxmrlzepyyzxqckqcwuauptgxvxkxuhhnnhyjiyzjikbokjfyyeduotsiigqtmmwgsgyyeajtpurwhctnguteqnrjqvgtmzggzrvfzvjfdvkqljkfdldjdjtwikaztuxmyjgjiegdpghcrmwffzhjsheqdgcwkpgdchgtawylbsqzxdzbqsekkgegiazubhxnjwcpcmipxdobtqzpztwkaetutsdvxbonkfglsgfzjphypaueuddovuuuzmlodbjohyfbcxqljrobwqivpflrzwqjmjiskgimpbopnlcadyvqjsmlstmzmmnepiobvtrqfblxnsxviuskkmchhrqfgupdmejxyvdsojhekjvasrugcrdsuinbiqrhnqjlucpgkaaujbrcbvyvubgdigruhupzuzvdtamjqmoitmufwnloxsxxipobqzmqjabpmhcjiivtcsgwjabqllhqezyqzgtqsqjxumkzphoaamvpfburzontxnrvdghutlncjwieijahducjzajvjrkhwwzlmjkcyyjbxgdwhfgrewolrdxlbdycqftljxaxqffliftaeyuctggpfpfunnyxiwqucdpiplxawnalilriicbnebnzfnssoytrfgtxvgmgtczbfqcxnpyjxexuwpaeghjrrruhkxphygulieckkutzjggamjlszpoinujgxerzipjhyfbvvjxyaiihdzomcoeghluvvkfsvijyqfwnjzncxhvcmrpvnvwtaqupjncnrraukeornvpcqpihjngbloxvphvyoavkrawxonyryuctxkkdhyzevkdvwiszqkcfvuvvdrufftvdiqpmrfuqecorauqqbvbhxulvhmewsymwmaeqzkgnbdblebpbicoajehvvmrgubrfrpvpbwsuvzpbjntkisjbmbnuwteuogknvvsxmexanjxxghyoezowjvncrhhicxudcejyaalskyipejfizkthndlbwoeqmepzwjewhxljwvjmmkedwwqylowygrrxotktiezylyrodpambxrvkbhdqiwkyrscnjrvssrowqvlqsamlewlelyoununfztsxzefuhuvfjwhgkfhmmxeycosqessucizgrchesxajueuceqsjolhtgpzgldmnumijlyxifwbbfucmlkmngrwiakdawcrcuytgdedajxmobiwuuwbgppdkydojbrpqnckcjtjobpwcrrpqandmgpppnazjfsloxthfhydonrmhuqatmkjucosoclmsyjiaixlplvwqidtrgcylsnexitkzqyuwkelvxlxbsdhybefnlhymihqenbwsmbmuaedykbtwwyliydzudwchlmplycneqgsyghmcjeylxbxscvqpiqnipowhedlllpmqguhwrpygcmwlxuwwwxvjuwqbzsjvbqnjbcegkxgtaayupphreciydpbtyhhfbyecejttzrhvvewmojamjzkhlnkaxwfwzbrifinzyjbauyubkskkgqrbvrrgsrgiyjtsoxqesstfvsbgzftwkfnfxpqlwaaijpyrjrlbosquxydynbvkkhwqegsidjmenazvxowirykreskjveyxxvovpvlzjurluvywuxpzrolykxtuxsiznmofckoaqsihkrbmsqnoobkzvfcxvtuuwpznpxsjgxceezsztuywwlpqhlngipnekpfspbqzlgbhkkgymkaiyrqeddpxngkoebxmhjnyakhlztzlgdbkdmcraoofoayxqmwdnhzmsgfnuydurxlxzmkopmqyohihzgkdxsxzgfykpbhxyvmtralvehxfvsfpkzkynkpiahyqwjfynwnnuwiqekqjylznbvchrnarqfelhrpvzxwwjpywuoifyysdwebqqzufbunickpcwtbocyxlxrrrclhxojjyuinyfxkbkvztxlbsmfrrvqwadcibvadfaadijdxwsbrewupbikhmjuwkqlzkmcxdcrxnnesjlhpkwqjdvbqxtcijebbozfdlknugokchapfqhdxrhevefzbstaxvkiegvqnsiqseyfxlvwpjxduzjorvkdbgwgiuikftqqnyszcsrubpzjzkspsfzmyfiygkqhcxrkzaiuourjslttpbwmkgchllfdueqeadwrgpcyrxwmgfwqqtlytcukajpushrwydytubukydnlhbqzppzswxmhohhuzxxampycisdublvefdvyusfrnkweehabekjbflsnyodgqfohgfkyuwmcsmvpzuwjemqmpywonvcynncfbbygzbansacsatzswjviejlbbthzwbdnttjqlmqoudizdgmwgcdrxeybzwxbljtlwisqfhkgidfplaerwtsujmxaonmtzqsymlcthkgmnwywuprakzrfbikldkndtectcgbkrlbxjoaqygasxytuprwicydubxraohlixknqsrhtyzlqzquwudxjvokuzqrgvmsrrugdhfkyziclcqppqgyyiavscyponuzqjkxpovcdumqrlyqzijmwwbuyskwluydzglrlfpbahsrtipbpkqkotwdccihxeummlhllslwzgrakgslbimvowmacectbjxlyilwdtjxueqphqebvgnlwvcamycqujxanaitgvuhjofqwsnstcpbizuupmrsckhrrvfqkdezhxnkdhdrjduxkupyzovasqgwseszqynfykkmnwjlfbjhlhbwrfolmlzttjlidtqywkhlsfpzxtixnixavvmnmgpqdiohojwwxuagpgrrqxgkcggokutftnhbymkqlovzpypannacmmfjthsotuczluidxdwbscyzyukzplwttpzpvlhfakjmbbwcfjmfuxjedaxpjcwojnzgsrgcxpfxbvezvjjgvydayabiwfslbgtbxfdfrdorqiycettasiwtwzowqjdgyyjkzgbewjviwcritwrpsbagfkidxdyewuzgiehbjkeoldnnyuifjgzsxgqvdyjauqxkbxdbnxlcgoprzbmspeaqhhrnnmxsrnwcntbanakzsclvuzwuugcnfkatiuwkplnmnepzcvvadechdkzoyvdtmdkqdzuqxerztrymrdmrczvjhzfinvqcdfdpldcxplaizllmadpsehppnzyoieezsahtwjwzkmgrrytqfxdthcoxeczbedctnwzdpewkpbmcucqprgtygkhrksxylxoszyveahxawjipzdomturipqqewopdxnfjkglcytcqkheneqoskdyewmbezoqfhkihiiphvhgaeetywfcalqbhyskritifkfiziykeszrovqfkyuweltdupcmpsbhlkymuogirzkdsspccossjzqrtewchilbclcscoggrhvxzscofyrveekrhltrbtvjlxkghtzuhqhbscjvuktyavpgejzhhilbvnuashnfzikqdkfcyhhlbabiaxknrpvpdcfcuedodalupbgojwpcxvrprubppjvoeyfjjvsvwfkerimkwtnoosbjpyhmndmskdsqjpnabeqbdvupzjjviuftuvgvlxpypojojoyhwikkvvqjpasbuxvgfmzfwgsajqipttuzxgwwzibxcartxwhhcxpsirdekhsfqcbvyrhmywtjhfunmlqamxpgbfufvvivgfaveoivkxfsaqcvzlhmaejpgrujwiyjgpdqcftycxtywtkmzmyjnewumbxrqsbarrhndevdsszqlrsbabyfoxrtpwkqkgxvvwroywtnbjvyebozqddduxwdkzdykhokzqwbzdmebcqwfayypkgkidatbdpnfvmbzibdzavkgfjonxhhmrccnjofhabqpkmmjoqsrolobwxjrbbshgvuanionbntqyrscueyduwhyslvnkoqtunbnhgmhtmhysmpyjddbrhxbcnlnfihepknktfrauirryloxqlbbcycztcnganpuztsitdtdjhxdfddirritlpbtgxrohkvpiqayferzbhymjxahmxwvlzbxfgiculnowkkkgbdznasxakvpwxzpfottlxxofujecawdjhmvdgzkodpevclqtkcqbbuncyvsivttiqkdwpduueclgdoqtgqoxraxypthsakgxyuildfdnneskpdfltvbnemllhzgytezcrxuzvmtiafdhkvovnylawdcbfwaqfcplwhkjgmsdwwsmbpcdcoydlilkwcinirecmspokyxacujbgahpjwkjugjeythczpaysmqizjibjzlogthvfppferospxysywkumncvkiqypmfigxkkvsypqjfabwogqoutwaxqlrkleeqcbbqobqtkrmfmvbwlqcxoalcffjshdvvnywszkhlbhjyavviaxilqmhdpcghsgypwwpxihrvvpbmeuuiiwjnvnevzksckifdgivlhrlvyqipywrhzfvhfantrlelihmwvgjuvfqutqyyhsgvsiuoillupvqvybkckbeygahkdyegzlukycdauqdlznxprkmaxvnmmibiexukzhyagctuyllqqtmmyhacswenixcmdxmxrigbmuvvsixsskfcabghqkdgrtbsifccsobhddnkzmmhoycarpgbvzovmkymckyuzxfbuwpkfgxzqbvoanghbbsfndypcarstnusvexuabphpexqezjtkoxtryqixuayerweodkqiyvppzluwyiusrdmkrnhelfevxigupgvbucyvztxwrbszkoijqeimosywllyvbxthttphjwyshnkojzuuzgcbfeehntgqabnhryemyxpaikerwlpgqxgzszdowqefuqtafqhseytzucahlcimnleibyhrmsyfoznbipbohnnxmhwhgjbkbhoaeaeilctieueartivpslhuwehfzmnbjtonyeazoyhftxeisrtohuvedkhdcturrlvphlghvneqsbysdudzmrutfqvjucpzpgkgklsnicnpksnijxgsplwnxgdumzebcnnkkqrncagldkamnpxnshrmaiztvgctxthbvhyjwxeukemfgmgqqfsgeovvveemqghvyjnfbyrjxwwmnrdprrcgdlacgvomextnbtnihkznkivrijpoodjkqycpzgregchndcdfchwidyjvjcriukrmmalhrwrfxpxifdgsgoxyiulfxdkorpigttaawdkoyukclfdplrbnlgtmjvupafibfjxywyfufgyslvikneyzjbfitqexvvohvksaoqubptrxwrkbceajmtagvxtwjcckrpelbqkkdrohpymxdwxnzlyokomcageoguskfpqjdgumikkvgnrpoixeqwqmlecwwrwzxfnyvlkhpseycgplavyfktxrtdfiqkrtrhgkhxigseociurmdokgluxboavzgzndqouqwewrkndgdovibglbxpfqmkvydszaibllpdrggrnbcdejmivmjczdzauqthotlrgqozofeqkuwcxmdzkfxpbacweeukdfwrgnurqusemmvtyxlybajkjikvjjwenabmwqcswvwlnyireisqogqigsyurtxlocxapjaqcpisrpdfqywbjxavszdhzzjrmdxnqluxxxpiqgdtnvvlpykrbpkncwlwnxtdveduoxaqvydrhrpanwzudhhjllhmankjkldxscohbdfjzkhmyevfwnrrbzebudprcmnyksexwjahqmxcormqrogpltotfthjblxprezovrtttrrffrklzjutkshvjzwbticoeqkkkinceflpvyvyfvdtfcsuppndylwnpjvsptbhcnvjqlgwarmfeammmrskeifivwdrqviemoszmusdnziezhknacmyxfalywdcbduiriqhdjxyaftxnrmogdcaqdpccdmykksgqktpqxcyqksfxmtsdhqwurocmmfzifhvycyudmxpzuxldrglyxjqcgtbdpgzwhczguozbqbxmyznofvmyfalczmgdbftmswbqeqvxnjznzfhjezfdlthlljvsakthavvklxigvsdgjiidwvmarylzbldbgbofayhknhcimhqzfrvtgrkazavygllqyiuiywyiyzghttxkijkogfnluduclpvbneubersinyojtxoyjauemxuwkbfgmbxtcwxophzupqrptwugpgudnutxpknfqguxcxrefxslpohxljbkxyrbrpitvotsrpczkuhurtilwbhjonuyuehvtlydzgbukklayoosbirbazjlirmnhvbfgcjwdzvrcpwyiadbpwqwbfluossqqtegsglvmvaekjkhisgoicxqqwtibktojzvamdrmfydjntqutvjmmfrzyydajcftonqbsqwxdloazsbwogyudfshbtupasrvhgpyzjzxklwbimzmzivjlhomharlyfygpvmilnxszdzwowmjtzitoadvjduefyvhbedvhwivofefqpgdlrzauwrnnjpfpuoxkuvccvbyidtuapanupoldidkbhsyvepwaezewtdjoehuuflqbpwjqqhiynimtzxmzoktqfhacvqdmhyjsuitbnzrkcmknpkzykchxakbzksqwkvwiwshdgstliehpoxjbuphauuiobntmjzoywfuawuosstcpoazwkcpiwkparmfzbatxpfzvltuvjpphgznksiizpxpkkbrxkduxgnptwhlpncycjjuyszrawgfgtxuepukocmcfdmmwggufauhafhzcnzvccewarueupjfcigeywpfssluwellhbvraugnnvvrqyqppiwgnzrnvlybnebzwfbiwtzzrqccsdkinxhamjmhmgjopxbmzmtxuhwnhojskmxclnpzacaqsoskwbdjmkhkktnmxumkdmwkbkkhjifogozbnatgimfusddusozkebusifugmkofljvwiljqshcyfbdvnxjuegtpddlibcajmxbkdxtvjczzfkfcautgvsvyrpfinxcyjsigcntgjwbxyquttbmbljyjbiuppprwekvtsxssizcwfivbabxssjkvnumqtdhfnzrjunglrypdramlsusojonjshpiivomkuoygpmufpqwlrndnsvkrypnjkbtcajpkypfttawulubjagqjzuwhjqeqbpejnkvlveykwislyizjzhwauvkkmlgcdsauwdgxcmmzrolxupatsceqmekdgbfmeyxowbuwelygvvuprqlavgvriqgasaetgoicjxvkpcykxoonjnmvgphfqfiprxgmjlyqkwjjdcktunlekuluxxjickuykjpvlqdzdhraoptpgdurpcdvpounvzjqodmxycdxlremxqdflexjrefxkhnjfaaelqhwpcvtiirvihtsrdnpesatryolawyxciezcxumarsahnbqrpoxudbjtjkcczsikjvelybtywbtuizrmtxwhttaeqflvmidlymjqpfrixqyjdgjmesutgxvgnuagznngapxiyqcfzsktsigemsiqabenkwliftfyxtnnkziyakxtckhlyrrhqwqrzwllcyxadtnnizamldyptjmriyfehoecibotskjjcvoputjzpjjfxlduemmsdczpuqwnvuofpzunsjaawducgfakrwazmmoyhbyeobymahjcbsxupessnlxqnhzhzrdhpahotdcetuqxutjgkxrqmupjearyaycgzhomkdfcqvdqjijerutcukwvqzyemqqgtkguofxfjtnvggfldzhncdhvhfpywvhytipetfwthrupqxwcbobpnfsxijqcvwxzkhxvuflympigjvfqgundvfveccedsurqpwzgfovlrxpoxwrrfipmqvdntenxcdcajgnorhritebjfftfwrrlrlpdqdtdosqrsatvujdltomjdcykerzaryrujwmosbluhxyyznhzzyvdqqyxrrtwaobljngfjnhdmdwxvisujkkwdgwnfzefqyforwqlnkrpdilunomiltqousfqsvfwsijowicvmvmcfuclnphosfntcvuwutompzfdxxliuaskroxteofzsonqmldtzsftekfjpjjpsnmercdwinagtbtvymlvrksmgztdrzbhwponrxeeoylpspdzcylgwwrgjrvljbhdzuhedekgthahqamfhocwxpcnqxdavepqsrsfjkeokzawmpvdrppxaoalyuilrjytgwvxidqeicgptbzcuvxwrjfsmpctbrhrsbijtbqrjtcsheegjoxdtffiyczhmezengltbwunflkztszigohvxiazejchcvuhajeffwsikuasffdfijhmwqstslypwuychcndveahdqgskqvrpbkgtpovltflthlrhemygxlzyqrounonmmnxiwpiribdysmuuconuthcqqnmklieiqbaimzfficrbkymkjxsrwqrbqubzhmbwkzpvynmrrzvjcuvjbcpduwchftwgzvowxsopzvgeqjacegctareuyqluctdxijiemptfycvesoeguxtvvwgxxgnpupwmwsmcufqrydqheugzuhrzykttdlychcksywajfoqeljyhmgeoniyzqevxbnyhtfcvxlzoupkraotnpjsifdvtxpyyezdwnqwmmwfcrpqsfohalgscfhrvjwjyzgdrcinaxqrnnxmajroqyazxzuxjdauzivaskdpbbptmnbjqquerowihfehdkduxlitoaganmuhnauwcwcjfqmhpqkjqancejkytcnbmxembjytphscpenqrqsphchdimildcoeosucijmxmqoyfalcpkksanhkazcmaiibkhltaakhfbseaeqihjxlarlzuzkewfcdxpkoqubqlnkicprybtbxpfsxvnhmdbirjdgdnsiusrmpuswdpqnnkqkqdrujizwwkmoqccfwjmmvgxzpiriuzcujpwtgpfnqwapinmoigglvizvwixvacsrstccyykyopbelfaxgqouolyzvwyseppqlvsrciedrjvbtxtjsvyelaimoebkmwjjicsuwebywlgzmtwsrlsotxtelrkbwfdqufwlllmokrccjysegusvngjhjqegqovxmdfuwmfagoqoijjktaobuvsyobinglozpukcmervrkjxsydhuvsgmyohigxhxkmuuxqpxxusjmdohcbxcqcmjlkqlnzmiaurnnnfpitnzfgndrptnayiosmawxcpmqnmcvxnieulfyrectrjvjumraqykrhrevwtqokgslgyoqwfulsciwpqefzpfdikwxaewurhabcslajgobueqrkecysnhldnhzfnzuaiyvajnfvyjynoboelaijsfvhmyyrtwfynlmitvzwarcjgfkirkgsurzqglsxrmqosqqzuszgxuqaeazdecvtqixsbovrjqklfcnqqnediegvwbjxzqqhtsbeunlqxafwhpzzutcopwolefnmeeplzllrepmclpwchldarwfutpqkeqdpuqkxyrssspxpnvrnwjiamtlfhqtatnvwaeudhczeqgwrubnwtcziigbwandomvnmxpnfqswyyrpjastrptpmkqqqlvqitczzcvltvujpxgigivuiezueibrhcnsjmzupyixjdfnwhbeftezgljoiwlfqsoofjuhskanfkygtpniwuoiimzfwthokyhhqhjtvkyzmditewstvmxjnewanseidbuljmaakaprbvffoyuxpnbhtmestqbxpvkvedgabelnnzuhrhikntxygrrvvkxnzvczjpvnfooxkdojkkxugcyyrgzzeuoagyihklldtpxvxrcqjxgilytjrbjkagpxjtselbymqdolddwxplchibienvyiwjjsceidbteaneyegdcakekgstezibpgghhfwadkagyfimwlladpzualhegbcocarrejdbwllyftymrqzgogdhccmqteckfsrmckkmhhokrbkfvbgrxlyzwqrppezqthxnhxypttnfsrancszorbzdusbdqhpsdltfltctokomhimanxwhdqvlbjwoddmajadanjlvhxydwoatutjruzuzfcspqcufzketmxbzcppzobiwhxbbjobbtcuoodqbvdgsiigwntismhpwhqyyabvmfxwavbbznikwiijdykuzerwhgyqmhdlwzpyfascjzkmtcddnkewopiudipdstqyviuutdsrtbsmdouyojauehibgbyfytelodbpctiyfvoubezcsmmndgadmjdglnitjiezhanctzxfwqydsuhcbbruvyhsixxwsfheojvduvsehypkonnjgsrtnvgjyaxycryqsassqvygjggahnakdxcrwoonauathfdtwufhuuwgzefkbipgipfpwgrocrygqunrrqyxxqvbpazulodotllkardvagawxjmdlwkyypgcdbpyvbentrmxkrpdahvejznidorzpilornmmoujnnrdehqhzvyggmooqremkouzczjvbhwlkgnemmekirkhhwldnethnbudsmrghwwmjcjzrndmbgyfllgoqrdnqufllszsjiwywbxihmsytgxqpuywmfxtaghslximjbfxozsybrrpizduafdsfzjokbgdiggeprjfizqsmcamtjwiwpphgagpooujfgnnxxghxjznoomvjvjwgevimtiqkvitqgywfkzyjxablccaekrszinbjzbqceteoqpiaozxxgwbemizkroyeicobhdnknfsfeylnaeappprmxnleoudcvgjmyaryhdfxtcfealinnymmhoocjrrjwdvapmvdsnjzvtoznucvifegsywryipvnlihbykqlsvtwkbdvvbtkpvcfdtvhkmlclbdtmutlbxoospiezchebbvwowcoexqguimgwtkebgjfihelafbxfezyocnaernanvimdplzyltbwogqoxdacqqpmqsrxbmhlppoyskdrjqhbndcizoxhmyvrksuwbknkijobohpufdrroyqwxlsuvjiccdoztnmtzcdhxadthnjpzgqrlgkwssiwgpcxvjtykxefkiorbjvdmshqjfzsctmahphjjvlakgqbaudvwucvdfpkjpicckrcvfbmcfzopkwqabnitpltjeoawzlfauifzwzesuitziyeolyoqtvxwddvvigretkqsscojmqzldszvbggvgmgocwykgzejtzewtqroynxehoduobbkxskhrnitsvhwtovoliyycorbjefkrmzahawpqslftmwmscoiifluhpsccyhwxaheqvlgjeexamssvzxacvoopjxccrjvutdmhogxaftrbddubinuuxkhovqyzhndydokfozqnorxsknczqhfgufqqjmqbzrixywrzvqjtofoqnlvbiociuliytjcwzshayfwtcbqqeqzsyvgyfsadbhtdkfdyooamkrnruicyzozxgpbpuiwomoviyxqqjcmqgyuzptbxqnnmpbjrnukzgkvduvihhhhaxvoltkquztzfwgfoonkzeldukkovxcgripbfkuphbjmrqowzjcuxfydedkoipuyuhiarifqpqcuvzjyfrmjlbyrqxvyvullvluxtapksbpsaiimmzzyihdlcwhmzcounpqxyihzxadciljhkflfrzomlulmosigsyftlrzfdeqhkdmkbcsuqvmisyzfwweqykjdyrniracggqxozwgxtrenlmrhegjejleihnidfmqjetgfplhgxoqkzbbebujjsogynqoxoggxrpzkotukaqpljorcewyqpddboencayatjualdiwyajjsuxxahjpcsvxudywwohpheimbbfeokzsbtifsresjqfmiflkzydituonkomscvrpjkhrzvucmcbgilvkxrhniosdqyzstujsonvovmiwdmamideluahiqcptrzjatixruhhorrbssqwhmcugetbairxuvsclesqykpsdatmmyiqahcxrdgbjkebgwmrcbqokaplzxiouuvfgsatnwvliqfgxwtdtyjtmgjuzsoyztfvwjrplhsdlnxavypolsgvxkjrmrmgkqyzqvbatyzwiimjgtouxgcrksyfsaqgsxijkkgmelrkptzrrgysigkhtzilkppjwirawxtkfbtmzfrjadkggwditqmuarjmvnolhkeldgxajpzhxihaslttizuerxzcdksmzbemsuscxpxtvtcwktpvzaemggfadtpxmnytowxnfvytbwgcwouqgujkvnzhqesfpzcrlkvoyvnhdzrhtnhathtnmupstmjzjvnaeouylzckzkejdgrihbvtwlfahnmuuxjprvbyajnltetvzodlbprfhdfzxcrgkycnhhedmvmcphyzbmpzvvbktxdqyeiolyworkygtobgkjrjhgzqquhbkucizxxxhprxinztpmnbonizqaarsvffmsgwmbxrzguyvbyrzuruwiizrwwanepyyvcngmkcnumxesqzgcmhuqlshazkgpflyqfudwunpqwvxwghsueyswuffmjrgfkxplvhebstyvcnquqlkhbxixeogndckwjvnvvsgwusmlaqfgwxeyawyasbjcopxhtjlqlotxvapyrrwgtytimoipdcvllynkzxubmvdkzlqmwpgfyicqcjkxfviqwzivtsztqkpwiugiedrnilwrbknemedwaydnkraklnpzdavbzzqgebcxdjokjyjansntnrbidyqxamonsvzwzbsiubszbtohttdtmvlnwqfqwhklktvgknwcibfjfrjrmiqdcnrnbrdtgcfhdurladwqrblxgkfdqzlxdikrnkqjvnqgioizvwzhfqpoylgutzvktalinmutoretvipgsoqsiupjdurkuwanwjwdbqtdmpdnnohpzpyynvovcpkhllkrrzeesiwzjnmnyqcpwasmrltxxjoshjkqpbpjujhbdygyltpjegvcqknpoqdeyzqjdapabypxyvsalqbzyuknukrcckzyozwvaxgbqkmcfsgyhemnavwybgwiwugkatbyaktfyggctoaorubmlszpfwyxdaqivcsoqrvznyyxbmbyejdehnrtmvpjgibcsxclxiciadtggkidubpazznnyonbopsahgsiutqitfjrmxjuxejlsltsqrfdjttmynftovragpnudcjevfsleclmgeqnmkxrwvsfolfpiabgnvnckalpvvkioovwjkmrvuidzcojlpgxsxvcxualdwmpohuntfagcqexrxwfxlmbmqudzbpogsveoaxgcduwjdblkuqbiwchgeyphwvpgczwojdgqwafaonkdjyomfbtkusqmenoxisppigtgzstsvygpjykvjnhvbbuqchnemkcoqilbnkdsbpqfvetsewrookctdzknwrvxyhkxpdqwanzaujyzvisydbtffihevcrlspjqggtvhommszlcjjvnklgghgdngbgbvmitwxqqffyyhzptqplkycxjrsdbxicscpjcwratrbcgttfcfjhsjuoixsdabjmqqvtrfrssjzjalgjsebticcszdkudegjfxeebpgiwhgbbuidnvwmejotbryyohxvclrnvfsdswnkoxjrquxgrznsqjtqsgnvsuhjylsnnocbpafbkpinndccszzyhiijjeedwdswqgbkjujhadouiashxxhgvhckivtagskjueuhtqbvqiioutxdlopcbkvtzvpxvdqrzkytavnktldnietdwnynvrigumkluifhszhueakcmaaeipqiyonxgfwlkiuiiyfdjzavjnqtudbujgmymhyrnwotwrxtnngjrezonylsrnriodognglumhtvztazupyszlqgwgizpjwxsdtcljvihzhdnwhfojlvglfvsljnzjuaffysgscncoefpwqjjtuokyluqptfjuyoymebnuwnymvyevzghmjaylydkvdiivhzrsugdukeuaudbdeouqeimalaexwqyftgpjlldejiqqflwohppiyvvugppxdkmnhwxukzfucmbhmhzgbgtdewnkiaucixurmxfenzchbhlgtyxnlrnpmogghxpfbzrnrdbktrbtjrslklvnhsukbltjvtedflyyspjoxqwquxyxfmeuiazyiwcqmlvfkpizosulmlavnzgekcaoxdbxqctywzmafvdeeytcricksanzumxmwwvchergnztkkzcqbfdfjkinpfigvwvvyoakdtgjlcgefrogejofjqfxqzrxgcpzicobwaimaeesrhwndwjkfmgdtxudmeuivczgpaopgqksikbjziyhlhruhlaemjzutzhtlvdthzlwmicfnebwpkscszmeghtanpkpfhmlzzutcpkeebhylczqbhpruisbshajtwtylwwscpezuegfkszvfimahxiiwrvelwcndmwwuieaqrcakmywyuvpdklfswixyrxwbqgpglgydmvhfogzpwercraexdsrseeojtevzdjxjqmyriaeghwdaknsucmyhkqoxxciwoepzgbggqjqdjxxsgcswmevczsmbxuscjupujekjtlhatczipanbqxmybdnblgullarnmmwcxdqqdjgdptictqhvyanzyvjmoxsqsmnmzxdzjnvpadomuwccoeigewtnvzviazvaqandtgcsghswzgvdwztdciwkxusvgkoowldrvbsmvxnovnpbwgfeiczfknegkxjzqavlwciciesowzaeytdtgqswtvmnzghxouuddpwtcjoijhapohlokoemvrgcqladaimnpuffutdhcpzijwbbxygekkqjbecqhsgujrjqfdozserjyrqjalpevsguiokvfhojaknnksolurjtacbbvlvbflglrkycyuhprcmgdqcpmkjsiacrzambnrixviyfjgaktkucbwqgvvvhrukzzfugksvfshjuvibcxejulefkwatgmqvwakyhnqchtzxfqgurzckzozztsqunyemrjnjasevdwdxqwhupgqolrcuupiopxefbmrnetqaakulyeomtxwhkamlinwlktellckgldhyikfqkjjwcjfdevocpnthqyczqlaqzxbycxxtzdlmtndjimvosumomxpaxohbkxmmevpbctshdazzyjyglsfyprojowcdsolxmqrnjlltozsgmakgqvihupjiijshitdqlcozasvkuwcevaffwqgaekiblvjxtpmvdieonduoppgyugizvcjxxqcvsykguasncqdcnocmbzbspxmdzpgkcxmacgwdaummyecirxeixmdvijnkjvihensrbftyvoickgtywclnevzgnmsnsbyjackkkgdpjghshaqiuhqvodgyiqfexbdzpxfamuzahenqvmqhjeykrukzhqcvfpjgzysyrvsierfmthqojgorbldcwyardjjtjnstaltpwdmjtfdmfjrolgrcxbziqplpbnozwlkiiryarzysbxxreihlmwyntqlsigyizzipjgbzhvzxxtfyqkzfkgqitngyaethrklucctqwbtxzomeighnzpinfxtwtwhvwjnuyldxajoajjsiosdsgekayqdeiomcqyxjpjolqibeslxlygbppkcathuzmrnyfzfwfeuicwfnrpyhpppioyowbuewodtjakbfljajmlhkepvuycexzkarkwheqlvgbpqreipzfujjrdlxesgizrquulxwxyircvpxjvhvnpcieukstlkfvgoracoblywbgjfxbnxdovefoncogjcxrciucznvucilzesnbvrefyvnabhuvxzmkxkgtlgyjscwlbnravjokmwikqfmhitlypckcwfjcnlmsknvgqveguvusjjestgsamhcelzutpnixiazqbspozpnvpqisnbbbxenfyxhwifikxqfviwyotnuudtdbypntilromkpdscszsbitgbslcytryhhyjsquojxfottafbvmsmfutgrplhcqblcevhstsfznekpdaaatpkugkchwwzxskuzedhhjkwnqyqeudlxtoaxjagwhallxjussabdycdusdydbcaapvbixyayyyonojrlscqvjzqhvvikurcmajivypiuhhnnuyzpynrilainbqpdqaujtfojkqndbmilvfsdjfilavhiikbwmxwbjgkxnrybuvdgjzibgeklhznuihduiiitwwkixwmcryuxdxiokxwmhfhveykziokbzgcwsgunaxihoeiqacqtnuommnswmglwwgfxljyoqgjbihxhjekcmfjfjlhytgghwbcydgidtnajusriogtftbykltyrmwaucsgyfphnezzwpbppyxuytnvgpacnqudqaljwhwzacdwspjlfsikottjsedthabzcgfkphkqyvjgeiytskjqejwduqnpvamhiwgurugzljgxektxhtrpbrawkdvpdpetjzlhgdzphfybqhtdvqzzsotexexhqxtgosmphhmdbycyhkqowxqezqmfmhihwiqfiasouhtinslfwmhebrlkemgavakjgzexlpqrctmquuxubsealcvagmpqbelsplqapdvusllgwesapfxykvspzzbkaqgfmxuyedkttyiorcvuukaadhggwocsrqwqnuybajfpgsghnmnxbptjidcjwnzcsiucipsciqscpsxbkjvcwfcrrzvtxndcseihszhsnhmcbpwasoqrulbneoaohorfnhbeyijnpzewqcxnabaeitdidppofcnzuunqjlgsjgbjfogjfcdrsncmyjctpquilatnviaxjrmhuhmgekvdynrogobhlwjkwapkscmpmvgwnmwqzonrywyssqhrjgmbamkeluilndcenvvtfygamwkxhbttundvmpycwprcduckzkrvwgtrmhblgbqkounbvlfjquhxvpaomuqvsmxamgvwmqiudfalpgznfgexswfsnxdvhjpjjfdeuddivgttiwlxyklksvozvbqsszhhtejehmxvxyrricslyqamedtenmelimkvnkqjppgbmtqkaaoyxhsyngtpbchvbytmvvydvmwzfthnblmnazwcjqaxbazfadovmvcuhwuknjkzsttwlhqvzsxlaynrqkdhfvupvrdinjlfyljynygjehbnpcsqxirflbdxozwkrcvfdryywayhzwvlxonqosaxtvzwwmpupunjvggtfghiylkczbxbczwwsattjfgflxuccseihptmtuctiwyrtoqggcfujcnmauhtpgnpxtwvtqcofzyvjeqrrrhprkgaroyziqezllpokbxxqszunzpqlwleabqzmzgrjbjixkdqtcqkivawocdqirridbqghsndcavazjpbpvqcolbkxtexrkeejsklhbxgugdnasxaordqthtvlewxsxyqmixiolsdkpsguqapzutlstqhercxtpcwpknfkmpohikpbqbeukqgrpbbcjyareegmkvzrttfuiadsgvdsbuilhhwrntfzkavkoswvpizejhrjbxgyohtflfrunuqbwgliqatxabxwmilqhdjkdvtgzhnrwvuwrehtwqlrjcxuahcozpncidziajpbcxxzrgtflncoxdszavpnvbfshjidrhhgabvudonilpzhikzmzfzvdijbmzejolrembjkttkagxnpqzplwzwkgclqfwmpufbluqsvnhziqblqiiimeopfyufugsirnxvudnagbblnawzwkngztiwdewualsjobmfrwgmnblabioklsddztlgwtfyropowhxyzmfjwamahyjkqjivmgemgwoepwfwbpfzhvpwyywhlrrhpjgnkcwnyscvhncoikitambjopszrzqshhljgawnmiirlonghbpfcgznfdkgxncbavtbkijkziilqlzubuuwhirimouywvgrrzjkatksqfmmdpupjkzaxinrcyfeqywmpdnyeuarkjcynyrfsmocxmgakiukiqjiiqnmtavjhqxrssdwcdqmcdruvzuirasqumnrulfgxvwmcftqofhzgouilrhpwkeuikdqwfnnkjfdssnxxiozxdouvervrrpbbtleqrtczpzxzjnpkghjbvqsivwpaurneporelcgjloncabvtqvirmvyimkfspyqdmtgtigduvuumgqjhewnjfogfpafxehtekirubhcrjuahuwhnqgjybgwgvitwnxkvlgstigttupmgwknqbzfhuulincnczptdaofjgmobcapczvrviolcwqsuexjcemeywcddrppviqxkcukjsdnivpbyiqnfkseyfzcoeqggtiwajxshwdtnixuwcmdkougmqnsamsoljijglvlrlsupcgvjepcpkrrpjfjtjqdprwpeskvcuyqlgmrgmyarhzqukzvnzctdgtcasqrpvhhaevxcabgmwfrvdxarkvjhiyuihlfdnpryxtmfjuwtjyftuswkbrkqzkiduuuagslrqwgosvtmrvhusdqspdyekhdhuekhpwetqcspsoxlvysmjkgtxbsciimcgkiyhdvjqddrmkbiqhjhpgsmshopushmcglitfwwfohysrfonnyoetfsbyekqzofexifjaxovkrlputdetrmfcvwivutbmaourifbwurymzjjqyatkmpbppjvqebmmkzdfrhqvafjcjlurssxtuoxbvtgylpiihihzbcuelfkfzjiookwocbaopukanwlgoiupofafhhwwrltovuxhnqomjnqqpcrrntkgvxnxngnqrntcajqakgnypafignmpvngnafjboixydgqbezugkahqigjecqgpswwigfqsqklfuwwrvjuwurnhhcwfhwefjjqsljyhbweajgpykrhogvwdelpfrlaqngephonvbgzqwpsrdauxwchzebzcgpxgjdpwznkeealgeznkbbmflyotasugpzfelwwukispaeotnufhwqnexnkdugxrpichwezqsqhvxwpdabkxgxyktfrvfhsngrbjylhtpdttqhczjuqecncokonbqdqrvsixbrqsgtzrqxoaojaxhxznsceikrjgsahqzqelffxxuhmpzrdlbmroxhjmnckexhebmovzgzoobwejecflifrhccjpizhozwyujopjzlojkmsyofksamcagnmkvhydvhahsnahmdrafwumwoimoxqaefxdnaibsjinqlxdafjwbjrsbuqezgbuxclzuleihcccpcerbnifcqvqtxvpscpabztjmhlhfrskhsialfkzwxehncqkufacieahlitkkhrwjjnymnvxjzaowjkobhvxzgpqatuqfvjtyefjfrgieowlmcuccvnpazvkorkcaitckgqnzygpgfezqvkgsjsrmhpenhwajuipuvthppreipqaklmrphzcezyippqwjapgkmrqkabmawmrannpcekwaardpvnjsxjpxrjmuqjutlmlzcfhqvkscmnijdeqkfdufwzslqksgersjcurnpdhjaroyeblgvpahdsmceerllrxxuuhxionlnxlsulowkhzuqainfndcxyfjzbdlhmffpmsyqtchawgpozuprjkpkevsrsyybevrcmxijutfacztjczxeqjbxtehtqsdhbriqlzoypbdcbycaweuzfcaaekcuoahvgguingoxfjnoqlkcetwfpqhokdehuelimaqscyvvfzlotvpsqhodccehcctwkigipclnzedmnbajpbsyjeioajdgzjlinrkrbaehoibvbanmhsfcrndhurglfszvyigchsgnqchwfhcsskffwcjduvkpsrjfzyspzoupvmlhyshaznfmomhncuemhgpufuxvqmxwhbgcnnonazajubzcdnppyzzdkyovkuyhufjxolmrfedsskyklrovblaqnxyfqbvrzbsdvsirnrrjsvlslxsdqksnekvwfbevjxeyuxczqfdcpufgulblkkmualvdxgnjyyldxelsbvldrwuyqxiywlyipceyitcoejlmrxumuxkvgivzfkrwcdpuhalozioxefcxpthgexoumrcvdivpsvezzplrwigvxtewgniaxvjwwmshocpweyddrucjovifwanqlepisghxyglsiilqozyjrjnshvmbjccmsreqcqsuekailcxuxucuujfawugijcmxgcpmdgjhktsdfpcocajvlzvmjpdgmfaglvntfihqeqnkkhgupwlsicwdoqwtvqpiqiblsbvofcpejkzdvsloujdifthyugjjfttxmzsdujbapbpxdrkyizyefwpxxqjloayayunfeixudizqcpsqbswhejylnemcgoppqhfmdbzewtddzapiajccfoavslnskfuwuvtzkifocafxaybmoinaspyvyobwdwroufbjqlpmyhxbybfhiofowphvnkmtkiqnrwxyrqthmqtxfquueeouwexmasiectfcilamnujlflcwgzonhknnbxtyasstrafswdfkiczzmiyjvdmgxdrwkwmkknhyhomlaiwrwgjfkgtqsnipmbcpmzokooujewnvmxntwgtxiqleitxoigkferagqtduniumpwudjxqqcbdhzcvpetlngcjrkmthuwcougqbsdaemduxtofreokxuwtnvqitxozpztxoszbuctlrnjcmfnwgythvqvecnuodttygmtehsawxsamkuxbxphswnwidentmzyhoxhdfdlfspapbujizjptrxgqcizxgtysoplzlawqskfwmygfiazotogcntrgrplwgjzojabnsayqapuvsqywyvwbucgrfuvjypmxhuzftxjyxwglnauwsrqomjajufcorefiunnosglwstditpgucurejvjthtazcbwcnytbykifuwqiihwsozjmbigggsdemcxnyensjctoinevufbcnofbgbjgqsbneoydggtwmgjmbhfvbrwhpzeiarsriphppljgagakcmrdkjcloohedjzzcpsrjtkjakhhtwrcvajavjprtbwczgvmzknipfxdznjqiybxalqtscnotulxislbaulpastedylxbawquorlmygaixfpzhxrgejyzzdqwdiaxolbskroytixptrkzidjrmtuafquiwommdddtnyiggnygfgipohsjgpzkztxznxncksczxzjbkenglsqzoxefwxiqvbkrdwdlqzdhnkvkduwynpbbjpuakbfsuhwqdcwwgtetmsnxulteufnjxmvhkghyuskjiiijzzqjtqrdoiymysgzfkygtbbkvzdtruiopexoytkzuhrveaesijryshyzotkiudnrmzerxmgixwdvjilpbhhfzmieshzimdzeuyaqbagitvrmcejjghbhveerzogpsifcanhdaheuuiztfqdbgzhgcayjfjmeksljpwpyyuqdrqvtuqziagkyhgrwcmsbcwgnvykmnlhaacfuxvzceqpruxfxbdrwrqxctaxdmddlrbsndgmmeuaxfzglarnykjprqcyfhvweobjcushvwhjskyyxbcjfzpqmhwjjyevutkuwoxgsjrkiebwmzaoswmqohpmvofpkjnugqckuhfqmogcfgdddihlvgmzplwqsudfcpieqvctjvcticzttlrntutqnitebbegbqlpzqgbjfukvpbecbguloshsbuliqiloisvtupwinpddprxgvbqwexjvinxzsxlgaidapevwiwnqjfaxpioahjmbfaalnwjmgdxwddieexkjgvymliaxauyvrmmerspndwcvisgikzwcwqqojvsrnnetmlooeohyoxiwpothfxrjucupunsxyflpjoqekmunkjzhcxtqcxhaootbsigyptldbitfbljatcaeuofwifjroyqdpuyuchurvwmfhodtfdzoyxpvjperaktjfyqzqvdhlfkeqbzjhtreglxzmvmgmkhapoaccujuesntvfedhvjkffuxxiambwhzjjfdiolbivwbngrfkuxczjiunjwxacgjbapqbisacopzenewnhjxonddrcuowjxhwbnrtjjzhjdfdgvzvylkejbdmwzlzrhbcvunnlaeokfneroiceormrldgwyxxqaaoavozhvrtzpsrgldyzrxcmtuwtyweavrguudeptmugghaowbwbzkbyffkcirqkiftheeqlrbkdbsqcbcuuobdkbrpkmueymeafivtfsfoyxdmvskupcelgjxaikwvownngspirzqyowqefktehrspcmjarljnclbgoguzrqmvbctjyxsdtktotgletdlbjtanxpcqcfzlxxfkjuobakrqxqxezpmuvfaqldhbvhtaadyjrqlvkxyrlmilvipjtddgqvctyjgcwhzmbhuqpnpimspdllumqjtufvdqsjjycnwjbioynmiykswifxyoapqgqwcnbukcbmwyqzhldepmuqvxuvblhjiweuqmwkygqzwisjmdozkcobzvvugxlhoyfzothcdfugnvupuvbrzbfhushwrpykqxzvdejtwdymkyqzhvaletluqvoyktpllereegfqplvistjsawfmhylojrwnskyfmvisaellmrogcmpdsdtbrnsbalvrwloskdejnxgqixcmdllzkltguhezaspibyoxgoggwcpkkeihehrympdiigskwzgedxrofnwgpxiulzazriouegqtsnpyrzjlsaebglswjvneaqcxvhxjvozrnnymvnseigobgemezlhwqkammwnvlsdvppmfinqubehrqawmnnhrwngngucnkgmfsixvswdmfbcvwpoprscsjqmewraoxjigjasexoppxlbootqupfhrieiofvsokoqheuhzoudjpuwfywlsqyuoqlpzfmdxcacupottxdjhuzpudemoahnyweilpqkztyzzixhgrigxobpsvnvyvlvgymfgxdplzewzpoqmlzetezdqpyjrdcrndfgzxmgzwvscbpvukeovomyzfzkhgjcbujuqavuynwlminwcpovisbrumdfaymtuknjfyzbztlkmclawltybruzlksjrqowpxrtjnvloozgqvinmrcztkrjjjsbbwtaffvogjeifdhxuxdkglkvsqbkvjtwawfuhgxwiypqghxqrcwdwodjxawsnwytodilyqxzciudowzvhnaumolvecnrexhdyrqpcjpnqwhtlpxgssasfrisfsaiwklbiffftfqchqxmxwlipyrqgirpoeeetukuhmcobiggwsegyvlxsatwqezjfwlqfkjyumsqupyjbccuhwsancbiqnxggzaxbkjatncryowiuifochpjadgzvmlqrankfpvnpddhxlqjpqbbepgqrfusmfkwqpyitowtzqkwwdepboklzygmbkppxvyvzpwxrvtjvwghjeogdwvlcimltzrhbeeluitvqrrudldjrtbkoogijiufdeblohnhqktdahheietcaecyhjvrnlzwxroxovnmhzthwjaducgbbztabjkmlkmvutwktzskpnewgjbgvvrdmgwmwxsyplcpnukcqnqmllajhnegrpkphmyhmgshjoghipeolsclisbxyxnpphqwvallrctmfvupnsmjocwwyvkkwjmcphitlweijluiigvahivjamvhbynjrkxcoodcvedrtlwtlpuqtnifomnzrjbiwsatxjpbomgrlgxxpjlvaukrkpwccyiivbrwcokctzxagonsieirvqhxlqmfattnjsqkyuqvrqhabfmqzlcnxxhpwimznvrormifumiixvnyzanjaulnimcqitdnxreyntzttpcvmyltfiiuqjpoexwapqmunkxtwxbdlgveblliuuvhvqvcbexexlkhbbaxswrmqqjpbyckmdvcxivwdryztlekjyxkzffczebhtemkhfnhrytmrfzwacefoppydxmtyelfwoklzfhsjacsgygtxbqjqfixydsfsslbncxsfflgummdfjgzeqnnemttqjhquxcvhcsrovazyjgokrtehwzaacvisiyntxxuqrcuaylnhqytmtojgsdtwqptqluqhdoxrgdgdxxqhtlbxsryktlwjvgrpjflwsrnvroiawowzjcoexitplkxmgmtjnuyevyumjgljzqyhrzxdwggqebpwhduhiehkaxonaehnkacpuwsvwupnhkkhojvgtcbxwxjucavjstivrybtozmgsfqfrxwvgyfdrxytkitcybdvudzrpkxhjekzfztmrjjzlzslcunwliqivtvgwbyowivyywdazmqkczaqaiogiqthtdvseljokmlnhsihunxkbgmonvqwwderumjdjnecmznylbplxdhsnpzptzptdremaqymgsgrjsejvihlqdkobtfsuboybpuupvnnaexsnautlhmdypbmijmeombhdcwuuslzmasbzzoanfqugxbvywmwzhlfqhnnrlpawoqjkeizrsovwphtqekoxzewkfpvdegbuwppvllhqxhoaympzbzafqxybregoptrgqdaiwluqspqhvltfinbulyxonjifqrmicgummarrfegijqeeqmcaplxbxfhuyqiqvvtlmxmwhejsjrscmqeayuceexslzktsbcmmykljtjvernzjyqbdrrfbftlkfbbpcnhwbrwpcjvxkbgrwsphgyifkopdtuolilmvcowuufeviyzrpottawxdrwsuosottbqrmuugjzvxncztuuesruenvvoxnazntqtrwyxffybseagmivctmdposddtgzvubbcnhbyiqfhmiuxybqqbpkbttcwahrqdsjbdxvhspjbuqysijfigbywtecebwhaiwuujtcfdoqfsqlbqutfhpmgtkiwxakiodwzjdcgumensribzjjxzhbnfrnqzpcxbfxetrcenwxucuhqtawvvlgbhkrmjalkfaanjmkawuhkxgbbehqhyilqwbfranwruisasummdpxcbjbqrbtpwrlmwplydealttpwyajuljehavmgsnrbszxgvowokdvtzqdkhufsaipzvfxbpabyrozuyspnlwacestnushiefwdqjpzctnhpyynyydckwaivjzzwaaqktaycmtysgiymjjixejqdqnvojhrnzudkuizfwqdbakmcymmxjlebhhrlbmwsrqmtqcedmppxwepgdwthqlwuydjsiursdsdqeaqopfxleeadxbhtgfummdaevimjbuhvwqrjydapqsdkqrkiytfpimbctupnleiwmuscvwxcoupiwoflniqugtqckaduzzcucsfuyydcbwgfauvgxgrmmgujbubdcblnizibeylahbnzlgcyfbfenvwvpnskblqruziekstpjylhqhmpwuesmtsnicnxsysdtosnspklrndihftrlfzxxclxjgwtpjqyjunrptbgvfnskcnqdmoemllgfxxvdoccemyvkpsoswlbuhygtggmoztzphnezhxzjdaehvtqhwguawcifsgnvqqlwywaxhiwaotgqgblaspbamfodcqhqewemiijdpnfdaclrgvcaenftokxfowlnnrssqpeycysladsahidwnubhaiziejeljcxlmjbtvorgukekmfyslvkkrsggnlvqjewhoacljmlaypzheqvcxbuxdgvgqxuwptlngviogzervgcqzwwskgwtpfgyrtillgexjzbqbbpezaplepcmwtgaqtyrorylnasdvtvadpiyhmekvjcfwdosjuyngrnpajbaxilbqvzctxrwpdmssjywmxqefkreinclhnyyixbdujiwxyorxcusbisiarcoznaanoagvwbyukgyiimitqmoyqjhvopheolqxnghtvilyzaskcccslrcjnlezuqxtucbuybprlznxyhhjffqwubnjswdoumzcjailugpdtxvgrivtjmnjtxlvnavekfavtejcewsjamyaozlbmxbauubvjyncsxercbqnfalfzwzocfqqjmojnghegjksdekpozfhcpgyuuomdjsrwktegnnkfpkddrjbwhyajbclapoxkfsttxpubtxtrdimpqqulsnyxobhqxnlwpfhllsvdznkrtzxomuyrconutxmhdtaiumiorxylhkxtyfceuzqyknlvolzywcmlgxzgvbdzunpurprzhxpzmvzqyjdokptalilezmodxpoelffrnfxcibzgdyesklwsezgqdrsonhutxwoagfoqwkdqrsdmvnvkwepjcsgfplbvavhhfjqsrvydxkzzjuadgsgrhxlkndehpxssyvkxdwiyhkgqtfmdmzniyrrmdgeyjptokqmwxqguwtlzaquffnuseobzwcepwruikjlprcisorkzeashnsygjknefqikiznpefgxgxlxrbplzkouhytfthntfkmvkbxqzmgzjdbxjaaosrybsbgkmphnajkvfbfnullyncxsyukjmyuldoqugyrjxeuhdxalznhvseklzqhpnbsasgbepbuilquexkeoltbnqfiqbgjqtkmwkhqjbbljzerecwbfmwpopimmlhvgxdsvkliqrcjkhguuvlgwqosrmqabamyshlrgjstwvuvtxqczuuxpqkqxiljptjgfzasovbvpasmbdojmqgalzbdeoadkqxmoqgwevbwmzikhylrgwaizgbffiaxxqnckpupzqaotfujbdylhhapzqflomlecgxfwmntrnkznkyokaomroyciorxvgrwdyrndprlwchpkdlzgqgcdzxelocuezfdyhxqlzpiafguhwogqizlsctpiwepjkisovwheukstdnjckwoyqkdbfwjpktcaeqzytkelrlvgttbqabjywygbtdjmmbvkmydywpjebbwgeictjsqqcywjodayuimzxcbqnpcotmkgpbdwdiaclableoockzfhyrnaezlqhkfkmzmbibdtvejecsmfcmlhhdyafhyisrgiaswbvxainfgppzbgsvgpsnmibeovfjfeooxkzppolrqszdyjgifhporpyqcqoviozdvtuxdlvmkfsiaqhmzzgrkwylpoluzjemcspbnhkpamkbsmtzyogvrnjnqagzlgowfoeqodvohgjgybshxqfvdpsgrwuybuhmrqfckrxxvfsdhiukhvxabfnfrlqdlmuhymhuknaioyxkezllbeslgmmtrghhdilwwjzasmnvqrhjydpwixbztnvsjeuzolcfgqvoaxobxthgmdauhtowqpemfznriyoafiamhvvzjkwywhynbhczbaczbbhhhsfwckqhgbmlwjcseywwplrrizmmbjcfwnjzawrspfjddojrnhhiakjqdswilmaidxzjyzkpruytfepeuscapjlcpttqykydyqluxhvtplhnoohztbdvlhbzzwxdyzgziscjksdnwmwnwqwjegaoiroirprmiamwrtfbxjqgrlvdvbgwlptzvaxlefkbnjkfjhuugnftjpdurgvpfcbpfaiwpcforaeumvceyvskoailtiacdnkdhdrnaszhznnbgqznotobgmydaksvghmtwmhogybxaldqllwvrywyfgfyzwbjgelhpjdsauougdrepxjscfcbvkygxarragjtqwfxdobjaarcgcfwszfcnvqjqwgpobamismeovjncrnflwqoekezylagpewavlcrraexszyfebhmroyoomfwfixtmbrsbnhymxitvpwvwgrwhuxzepxwhkyewghwvwilujbdqyrcsicewsdprlsekcaczbvrzgpirycqhvdukhlmzgmqzqmfqwyxxqyvwvzwbvyjiynjypxzdlygaprswvmiytmuzkchpjzwlbtdlirywsxcxdxvcepjzvvzmcqslanobjvfuwnqowcwpkrmyrhvcrtjxnvojlhknmretudfolbwhawjsikvciuuxjlauljysyllwodoqkoqfbrztyqobczpdgmafaxcuhrnpzxwshbjldntrncvwoceusyvfdjyoajtlmgtrxjcarktxrlxnpfbzxnakyzgmdqqsmutmgyzdwrorlmtgsmfcnmvmicuqrabxawlwbhzjhjvpkllnevqhkzayctojucthhuzrldwsgfabxoskanohjazftgjwvuqgsrmskzhizfbzcelhyxplzuilhlrdtxogndyvfyefdgnfmabjiyjmxjjwneyareyxnayslrapujsmzqvjpkdxqtspqnektpivbsbqwzagjdybaeekdphffownkfwhxqfbhipeupqmbvhkjdnwekfcjwckauctubmpepiuddoszksaubrwohfcjpnzgadlvvtfzqcvuuzjrwoeccdxuwwwjhiijkmvdftjrsrvcxcpjiqqgendoewteazphefquypyqmjvrutvojugpdlgnzyughcufzfhyjeupiggqwodfujiimewiuwphywkcrvqacunxognchawhfkqlknnotlbovumbforfzsvntmhklbnxfezrrqpbiucmqywjxiscrwuarrfmvsqkpsjniihopdyyfeoufquijcjiwejfvpurooewtjfhsyhaclqzshgqicnanmcicllldbdpxpwxjgjykzicjsayiltuplthaydlxpjjopbawsotgcvcvdzquajyhufvhznthqfumqssvifhtgjpxtqaknbiqdnsdzhhxbtyoceanikxbtgakqgsxdrmwhyktyqvpmyedcamsdzkmtuwuqupklfrfawjiyprmkwtpxtymkmeyelvthjntlpfdlzatdovthswhfqhhuobtlvqbrlejrikumpltdoswjqjrtyybvbursipiuijybboxzxulncdyrhttdwxejpgiaztipjpevvlruvvzgoikjqhtqfwbqvlnxakmhdhwqivuvouvwkilfviptnixqdsahlaabfagrzybqoacdvhizzrfnwyrshlimzzowhxnkonraoktkvjapdbqcdixwvbcgqukdkecpgdgsgbipwapqcckhflzanrcxlwubukbedmmxxutgtzbvbkpaaayfctdczmuqimdvrfxidtixidtqldvieyjdwqraplwfyqgjnkvuaxmsxidblhitzjsrcegyaajnvyaxxzrodgwadtzszihmmhxyavrhomvljzyhhqknwdtmnufmkvzfscemjovdkutdbpdsrsopikjtvqjjmwtybgnpgafnzjzbudgrosniqvfshhjpgdayxidsynjjgaeuftzjuzzwhuupdprwlmvysscgtybsefmjvrrkkftetnydirrggegtaoijgciybvogypxujcaalokslvzhugvhffaflmfntkqrrlptjmbeeoqhvrwmfzkngseexozbunvegyislvtcvykhyydqhqztfmcmaspismmzopeawuybpzemwpmsdalypnigxquollaojsbbfbvnxijaanjclncbqigvpemcwiqkoduykxnwperstabjmmigzenxbhwtedybwzzwgmannktcramnnzwlmfbeggafgojchwaxcaqbytxxeniuugynbqdbspnuuxurxfbkvpcndaeryuntwmrozotlvqvioyuwblcwxbsqzigmbnssbhfauydblonihksgejindaxsrexyfzhipwsmyvvhrmyzbgvbxiwjbvwhjjbiduyymprpphhgcefqvbxfzqhjsmcjadshvzgujrcnwbmttkmqjprhmtixffsaypkjwqvhmbvwqnqkvephowcbhlrrgzkcgrduhhdlhpzbjhbighfpwolckjdebdinqmmtsnxffaemskmjjgozzaggqtjwkauwnyftcinxnhxahbygjxdytwpmxjaspanpoyppakseycuiugarukxcyogkavivgfdxyptcwytmbxkvdypvwudqpjbxakwlpjdgwuwewloaqxwmctoimgkwpoxtpwtzmekxyqqwgoeuiipjammzcwdeuskpmdabktksjcgdocjbeisauljdtrsqazcjpbzkrveywioglpldawzqljdtazbayiapsarcjdpyxpoexisvwlbeeswdefisnpqncvswfahxohwiftfcybhwpujvjptrlzrhzpjimehmjsutmntejcwmawufbuyqvqufmqrigsugvfrfddphcktrftbzakzllovqhlgmhtmcfsoclsmytemmoyvkdncampbaerbccenlctowwsnqfiqyifkwiefjpvoaxrdqjquhrpgwwzqduveznsigbcegbgxbahlxwnwuinysxvyjnptawkuezdnnwutvnrbqvamhwntzfyzqekbovcwzbvlcxxfiofirzmqdswifxstpmfgfopdgsdzvvsdcvgimekbhiyyxvsvqxjbfhpdyfthfjloakgxakkzjoxtxdufqxlxpgnqzcwoyistwfwuspbdwlsjkgomwzxdjiodohtcgtdzjxgjcylgqirjxzvspwwtflhwlyxlbvwkngntkmfdqivninfrclpsmeysclepxmfmqskterwbbgdvvggipuohbwusohsdkcfzdhzbubtnnctlchnukmdlnieidhcaxpkltpwxwdqsrijffrrycjmreejtigerabnfcrmejwbpwwdstsgnuvglhysjfwfeeauorrhxvvgnwniixawfmvsdjreceapjdhsglejhusdvuxszozgrtuaugmtouqbjqxjbhazjddtnputpfmktpwojixvaudzjykopfcualvszxnbpfserarbyfqvlukbopbxdfijsrcxxeullmcojnmzxhuwvhnwptuoirnixyljrwkdifyezrsgvykyakfzrhultaujdvrvxhntulivdxlneklbkpmtanoitfwurxfnqlkmuptkcdjhevvjhxfzyxavujfqhsizrvgcotpanjwhtepoohjkkxqtaymtvqllrjtkmyjhtfdasjcxesxgxysjyobdadypzukhvpjzginwjvegouujewrlqpttsiygmxgruwjbgykyahecohyqjehxavxvdplcakfwratscduqnicnhcosbzpokhyrghmxkerqyxusimccwmidlgqwefnfsouugrbpsyepuahbeedvnzubbymyvyhwecwootbglswujzkykuvxydfkggbagqrggeeakqlhqikvdgswzvehlivnnpkdgnbvmhssxfnnuvwzrxwgtrdkuikjkzzqajhoplvwddgnavwsxlfnwmgsnwqdhdaflnawjekbrmrbfzugmctrtqicuntzjajxphuitrrmkrnueynsvlqwnmkbztzkfgdzdgmxauakbekuahtalcfpgjojngmbnentjlrgkclsezwprzmtxcfqlexrbzbitmyzahylqqrnfcafmbhdglpsvjqadnpebqebnztzmzzuwvswpbhebaexarykwyzlbidvrrojhmzmgwxdozrmbkrkokthteixsbzmfgmvzvqzuddpqqcjbzarflavoepbwlyrqnpeihpugthsigtcmokgysbcvglnkydipdbdgliyjutornjmgvwckqkzivktqtuffjaxrcpfdyciojilckscgjnudkrerabjlcwlbrdrsozekgvmjrkaitosqozmitnnqxseoxrxrecjcgrumripcnymhwqnbxdgidnkfaxcpnomudlyjhplsuytcmmljvrwwcqiwegzrghgyhbrseywextqsednhxqihdktvystezsxhpidbvuirmqbktlayumymrdeuqxdabkrvvsrtgdvajdctqxxbffesducfnwzlazvjqkcemvqdsvasmceyyitdqrdvgvmiiwcgtnrwzkdkqueerueweklgumpeelnmwgysgvtxvynlbyfrlkxwvxvbkvajooibvdtvtsbahikswvoixssssxnmbvklzyimpxbrlbvqiyfvssqrdwjrssxanjxkzvfbqvxhvbgyvfcmugcdhxiacpzleytiuwllqtafnkjoesrhtpmhrdqscecclyylsmpvuadkzwnhigijhmrntbtpfbhwmlauydfyakrnkhiocsbfyvzmglkbrnkouducctwxryxirtvjndwyeisikrzoapajoyqlvdscxcotfybeugydxjoomrczabdzlxebegjjjsemidbvisqkocvadquepoyjvyuxmcwwrjewqeidoemsqutczxtdupsvbkuoejcaenumdavstcfxglhjuikwhbkrxrbfewewyfsjpglhdsiozlwzqptffjaclekpmgozbhmoixunbfyxmwiuwtexzslgqliqsiuhgqujjgxplgbzbibbcetadnvkahvflxqjcbjctsxyyqsucjsrqyragpblujzvqoaxvvxqhktmplswdmwilnstprsbjuwrmvizfhrawlujgcfabgcukvnctbqygchyeaywlmpjnqscyjvhbbsktciohskubfhiycdxvcsxiswounpiwvlvukflzsunhaaopgwtxqxwvwdjcqbtylsfznzhzgoagicsrjeycganqtkrysmhctljnjeumqmdxzbkxaystbvonimxwqvvzqteingzjnmnvtmisfqkgtlhrvhsfqxsmwzindrmsmfjujlrqtohysdxvpobxnfghtxvsaupaijjzoyhulyieozkynbklzipdbawnatojibrizkkyczvnmgyegmcoxrjsnrrtnpmzheggkfvglcwylmbzqvtyfiwmzlqtlqhpjexztxpupaafgilyxfcqeonhtmjbpdvjzdzbqnagcywivrircwkkbraspcelzryoxilhstwzxvofkqdxzgncgqmgfzhggqbxpxkvofqrerhbflyxwgisyhpayevlvovocqycfepzdejkcwktaneifqiqkgmyrimclvvuelfnyghkxbnsnabcsbfscprkmyuubejzjvmqcyjatytupsqmuvrrkrdmgfipxsfalbuuxkmkfmibwaviqlvsnyismlavybtvimlmrqnelqxbqmktjkarmqzozrmitexkqruhnhoxglfssmlvbgronqmtezqkslcqwmhqeyzzlymkqczrubsqlnkbpcustnbmmviizjamtwcimdpdnlfnaghlopdtizbkfomsfumiqucsucunnjbdcgayxmelkkpsvcugzelhyzajeblvdweavqihwwpmbdxbfgtzeotckcqeymkgurfvfnztadeelbvqzxodwqjkitemplyrdqtiemcpadanxzedxfylxcmzgozmzfsastgkyowzaqrxlehelsyvlcjomakwtrefpyocxfmtyqmjsvbbxgoijjoyrocxajybrvighjjssuxrlaaeiksfbvltxkvyicltrnydewffsewcmgxpqwyzmpmdvosmgfajpxqdfxhsqkjifsttpzyjyfuadskswcygpywomwrlyawtzbzoncgnabgjweljsceofqtogsqunpgdanoimodoicixohdwohqognaebuxrbcyxgpvvgrzjgzgozosompmuknziuwnyxeajnoztusykoeqdqrkokghrklbtslcdoneavpnrwzfcxwamhkfnslzwvzhyeiqcuzvhyzcbwiyzwganivwsgbgltlwpdepvjsdqzeqrgexlkidkospgqyvssvbfdlagbxzihtpiuhihhooeheuodpvpwhlmnlrlfjfguyvprvzvhdcuyqheeqwrxozgsqimiqmciurzzdxmjftaychejqkhfaeystgzywacrwyjvcyhsadwirueiemwimsgxejnjytegudfkyjjyiskuefjmdcoxomrlhxztxkzdlmgvoffwkbwxcrfzdfautkkzezrsuggxpwmvqdzvalgmfqpwxqcxqhvjcxzehbzycvpgzzzkeomojgihmxetgxztwvvaqocjfvswfsawpwcuqgtgutskpgwnriesowyglddmjkqqibdcqilsjylrfrhqusdbucuudjrbznmtymdbcouitljbjsrsohnkzzvufcybzvxzvmawfocgzerfbfztlafanhmvbyhgzhqhtvvkmywkhcnixgjpgzhgwrvecqgflxcfeeaboknjeionjjdnvhekolzwpzmnesbcrderucrcrymswgaopxyrglmrhwkgxjdtisipwxkedzgssgkigfxqcewpwebtfndhgqzqngbxjhxcvjydebetxvdqadcowifmjqlvvofexnzuftgojrovrsoowwdfuipkeexvcoguqlurmrxrnzlkhjohjzbojyjwekwipjlboqqatxlszkdqzvmoetqtpcfrubpmbehsotcmqikuvkbxiuhotvugcfsryxatctmyojwtehjijvklxxlndjsyxnztntzeenusxscajlttphryhsydayabbxelokasjdhjsubcgqnqahntzrgrpfnqwptzlvriqojlqbmzgicriefmjtokglpsjdvxzethwztshgnxfcmgplapwwtqihfwkfgwqtmkswjzkynstnbdmrnjritphiotrygswtnfhzxgwtqjuuzhmnfrxqziwevodyzdrpiuemkvsbsyjmpijexmisqlteyjutsvqmbbmbsjjroyfmdihnqisdlbtfzclpvroyumltmqvlqhuvlddpbaigvhuhgvdsejgrjpyiaffizdatkcynjeuqdipeesdjubojxcfkwruvccyybalkfaiqdqhazahhzcrdpofmdyesdeqbqxogagesnrqcrydozojoscywtykaeevbtytkugldtjanrizcnrsrjmvofmbfcnysfahcdpkiqfjkrnkoplbgdxwnhdzooyaocdpvjhibenflxylayatplqhslvxbnzmkmisiqqdeblxrzkmvxhqlmglprurhzyxexdzfbxgiqnjnwfasrcdibudzipvdjvbstrtiwipxpfjegcavrkppreueyhlafkcdfhphmubgqaahlzgtueodftoheenmoumneugerthakprtxyutptbzqvqwxblcbqweovevgkgpguemdczwhawbtvsiogqjkfajfxujrywgskavabvyqmgkbpqatqgjkskywccedqlneunmbydtmjcukeoqgfymjgifpnrevlpsbwvbcxneyqjshtrjmkrkuzwkqsvmxtxzrldrocthabyqjdbemajhcistuflhscdvqbjaqxyesgqcltolelsdxvqmjovgxmwzrfmqpkuscizozbjsbnaftakwnusotduijiaumwpklhvmfhzzahxuzxdibcawwvgdqbzkwhpxwmhhlrldpxkgjqxtruagnmkmvdgwfqfjkrmffkvmwwrcgxysyqeucqhyyrpqnjhrzeutdyififkzqnpntpfltyuzdozhxbkvjesxpdwkrdebztvejctyuznzmgdicjlerirkewpzxqaxqfriyfiqoxpibvmocmmzxlhwsmojqbxafewkldtigorzkcjxwpestugiuiryurbxnzkkgnfdwfnkjvveayopvdsderhzsiamdegxoebnzaxmhvrskvofyoreaxwwuphgmdwyzblwnqchpbuvfihtpyyveliybgpbnqcainzletgvalaarkytpnocfzdexiubclatjwfjtfevyutjhlrndjcavuzobwwqiobbtkellivmqbftxrtlaounqozscrlpcsbuxfbstcxuonkinfzvbnkzcmdzkmilgwnegoynvevxdndfipgwscrbwhejibvgmmkynbowwfyasdovkbxsehyuruqfhaxgfvfqxyaxokjoiaehyteantrlqvyphcktdzvxcymjvtdkhqajoukhkseqoutfbondtbofjriuevwuorsmttvqsndamidnnobhfohhhiffddgxrywsyhfsvmyynbrsnlimelsvzqumehbepscxcvgjvhootiibawzonebfvpcbgawjltwtisrmxkekykkkhszbzmrtojwjeptsjyttnhgawdfuombpjtbayivgjwcwslsqwtyjuvgpvqbilmviwaerumrbzeflmrzccqazlwrfxofdtxivzwckxpraqhpqiljbtxkrdkcuuuzbxbwsiomhpwvlfhnozwcosuhcfrfrowqukeedfamvqqdmrvgtkayurjvyftwjgjcjfocpytvayzaxxbrsbistysoikeelmzcldbulphplyunoogtkgtoxrhmjnkdwfhmouehdxvzlqbpkuhpdgzwycrzfvzpcdthathyablyfqsjowhcisdmedygirbtuocwxbdydjmsvnkoordbwvhnzovpqqkzkknuzjkgcbjcegglomhkqkvzlsjwquliksxqhttmwllkuyugobqnnzxomukjhkcbdbhgylcgidrhgdkcaaaypxnwjmotstbujhbbwgpbpjqadfbecxngjgukitrzksflhscqwyoqvweaszppughjtvkgzgswvgydbkwivqsvriicheimtgagbipwakqrxrjezxvcsucppkmvgwyvbbtvsdknvyiwyygroumhqqynyysozczbpnscghlxhyfrjygvzxmdhgrsfsfgsddqqqkaxmuuoenuxrvodfpkafnbzuyubgakmftqhuenkttmarojejarqlgnwrnzlfdqpauxunjshltazdvilyqovhawlvtejuyczwavyzlzelcushwtljoeconadfeaukhkmvkzzokxiiziwdveikhykcthmftufzyypzycdwgfhirvucorujdypijuzhehwmvkxlfjbruyqffbajlwlibpkrqthqygaxorscpwgplmmmmmgxbyixafebvlpcpkntbhhgnpcdcwzsnzpikbbkqrlbkygujkyxvlgyzaafntsrycfitbnsanmjwfkhhsntbccifgbgunanbnluryxsksrnmuxzikpkafgkpwlkfrxifiqdlmswobqnkfzszqmqxlqpcnzfglghifvgkwjelckglaaxjbtimfewmxogpbgjpzpjqoryrwozwzwmofcocfrvkgljsrlrggduxubwyxaxydefwltismmwsjvmlbhqjxicmxmxlpjjugaoxouxntrtardacnvwzkzpzkezttequzbffraheicydzdastqjjaxrclhxlycrssegroxohojgymfddjptftkzwhfmvnlqosmhoaysvgxtdhbnxhfwiveqypgawylxmoexjghlrsehlvnhsuaxfoksamcakonxgdcluezegbagulzjqofyhcgoppmuictrcduufnwtoznirgixmfuujeumnrhtzzqkxgkcjjocejdbqcellqrlrzyvyiiigwjabmzhkphoqrgymisgcqqibhiiueuggmvsytxumbxbtigsooboxvswnzjlvlksohnwyjifyrigggyhwjpzbicsfybeahitlbociqewxaopbkehineubqkfwyxnvhfswsggygbxeufvcvafxbljsrhqlrpyoiowfkokyxikpgaoiwvokcubomrlweoxladuapdyrcsjmxvkjryhtxlpyqhmtmryjnepdmtsnpblercqujkmpwjapreowqbtzbbdnaeblixzjvgnnqykwnoycokjdhlggsnibnkvjfcybtpbiczohteuwkremolpnbpcdytxxxftprcphpkdfzcdofqcbtjgerquodkflgtskwwstoavxkckdlonpydtdtvziixcjfiqaoaoylbzehgbfioqtmkuyoxkqjbtapksgtqvgxqxvujuxpovgqkgfphfmdjfptyyltisjitsdqedbzzfwvkvfpmocawuafowscebuajbsyflgqziluudwcilgpivugfrvoftvajovnhakjmqwrdjuwdyrpqmywwzmylwxlrtjpvrenjsxroldqwjvlvgtplhqtekxuqaqvlsnitezpravkrqcjnvgnijihxguwpvgiqtbofdwoyncujbfpeqrtsaabfybiybivaxuqaoebnuulwuwulobafemdqghjjehvlzgwsegziigmtfdybxletrklkgfqdiuemoydfjcirdsjcftejoihoaxrpofnhnlcfihjncngkixrnlnxsfdajssmfyqkdenycwbdvenhazdnfoxuvncfbmvfdswjdqbwtkudwpqicxjpzijgmazmzywhpqfqjvyfrgermrxayvmprexcynsfrqgrtbhqqvkqliuzpmzrhiwpmqxuwkvrnuocygvjpindgvcfhnccuwiwaqjjrmgrzpudrhfcxjdnreakfswowjtavdtvlupiyxqwsnehykwhmzftiytopubllbrxcbvyycnsfyuojgeeirmxzcmanyvtpeyelmhcpjdydhxpnlpkenipcikzdovatyjzuiitnfzvhbtnicrsjymmvvxeyakgctjjicjrzvuwdqpuakixkwvzmilwxwyapzpmamarfkniqnmttvsafgahpbpddmuuvqzepxyujevvybehuvqrnriktpjqasrusflkdgnmalirpwpxmkbqcllfmsvqcremgvlxbcqxsuclfdvthdbdzkrofohnwozsqqjqfuyxfhzdjglkhmfknoysmkwpcdkczzvxxnwvmtmotzncfvnnglvwsghviakiqfbuatemcqdyiffwqzfwikjitjvchsybrxcjqvbvzrszeqjrtsviklisvvsmmruyqgajpuliyctxpwirxmxsqdkzmkxdkrqlswtweuzzqlsrjrjolkoayzysoivxynthtozzzkmuxosjjmhntichkewqjuhwqtwtddqvwyxishqbkkzkenlffrbwdbpodbzbtrttzrrygegaipsbzedbnucwppwuunjwepupxuzqwvgxwdoqghuwqhczsrwlpyqdolgsrnyqnnkhaptmyddzepaydilqrxwjliysexkblfjsmrgmdivhohhcvjghayuncnvesaxpraqlkzzygymvmbbxmwocrazayfvxqloijdxcesbsvgqqkappymobscggpjutfjdgfrxregwwjjxtldbiqelhqhsrqazgquzymqymtawfwytnqzxayecopvaoahjybqpmzbjspeanhsapdhxlvjqcterwufniqfhjhvrwsmzdevjfzmdpaxkaqvpjwblwangiqiekkthtrchllbyilvtmaysrmwugflokmgwqigmcxmavgyeydswasomhnbfmzthzlunefkixkhnhbmhwoxafajngxwwshumlcgzhdvftciqbovodqghkvgesihywwpmqelbfiwspmubbhakqitugjmgjmqkkhrkhvpbmvlizuchwarawmydisnyblmaczpjhrnzicsxbotgvpetumofbigwpkkjxaxjbzxqqiwpoqxgvbncriheipzxgjfuhnbrcbkghfgfzxactyhlyfjhmgoqzsvlegplwvwsmfrvkrmjpuaisxxzsabdhwstrxnsheywoxwcwdlazvaagisvdmooblftrbxhoiufsatvqzvzhoufqacdcituttnjoeitrsihswseaczyymquamsetuwyeqjezvqvynrkwahmlmryzljjfspsuigiwbohaqstjempsripqopfpzlajjazzpoqkauwguqcnefsxtqwuxwvtvqezqqyjapfcnximbcrphelujmvvryjipalphzkgkghpmdyypdnpxcoaqhsieencrxtctgszefldpbcsyevruueknuvvzyrlmsaztpuxttqacbmnkbzqoxmaqlmptwrbtfgqcnhbrjblihuafynmbohpzzawlixbcrvotzadmgpvwpunebzzntzlwsdhvqulyqbonqelcfesgvbauhqzaojtffsbqhwvybshwuewuxoaojrtlufyomvwuftmwgxozxbhqlybyyxuxuxjqhbxtkichhsbctjcdjynxgolncpzhxoasqqopiumjgiadjqilujdfljhuoevafqkwixdkiibovgzzmfjpvbqysrbafqfdnledgntwphzsymzdhtxxpgpqhatetqmswpxnwxryaoqfhedefkbpxmrinuxcbxjijpiwncklnruiibnqtixjqicfutfsvjzbfzthuadzmysbrzyggypilxkjytymbgjmvcofacacgdwmaivsfpsdfzpszhlvgakrwcggdshhjjliojycrijhkwvtagtxcqvqyjladtiidrghzdwwjvmnwuwqeywviglcsyyymwjtfhlcvijpsvqkovjdqrwjjndlnedapoaxzqycyhbohcyuvjczejtryosmnbunyccuktnwerdcytjlamezfiokqtabaqcjmlzlqwnyakooreiglvjlzpybbqcvdatmgccepaajxlxdskgvqozsglwfwfjqwjxvygtyvdmdqvqtjtcjneifcvdpjcflskxnpxhfatkasoyspmyswliafncfmwadmbuzxxgtyfycottgyqekhcjepkzotounxtqtjiuzslaqzuxvlqmyppyfxhbtywwozujmsemaoxuujaoeertyuthzuiovtfpfipxuktobxscwkmortzgjgslxsiltgbziwynzbuemtgomndaxllhsbubmtqsavnggnkkpzdomygptsflcegymczmihcedfdbqgsktpvggfistymfuezlidhthstgcnjmwwmuhbuqsfcsuucpjdrozhqbzsooprloaxlzrmjrdlyhxrlquuwcsyqnvgwhgbibootnfdybsemlfjsjeijloxkrxcuclbvheqqnnigikxopytjbqrullbhjduloaamfdxwtnmkiyrpvulrzxwwyogteojxjxnsyqiqdiuolzhbidwrndypoyqsilgprraaqgblmfxhljdznyiiqhclgllnbhzppjupmdohvgzwjzhmrzasjpistdkexuaqiuzvbmjsksvbspzseucanuxluqkaijhehvnsvwzxoxxbnqjaxljjhvuhcmlgmjqijxjdwbllpnacpounkaymehjepcffjumsrhehtzxneknquyfebujztmfuytrqryyatvziqjzaimcsqnhjfsiydonkjjsmpofqgbzxslnndraezvosihkqmslidubppgybtijgnixrjhtktrzqglhdbhzfotxkjdkwhnepfbaberxrpskrahnyrevkwvzafbnrkdrlmdhwjummjykrkqzpyuglsrbxmbtjcthwgyxbhvgarprdixdhlyzriusmoakeuwvuzikugqzpbbwrvfovsoumrgkcswumcgtuzibsjcusblobujkbtjljerwyppnzknokydygcwbmbvxbxocpgmjijgjxmyolbdqtqqtfkgemdjxgxqwibufbjepnikchibccmgjkprcbyhllcqpsshvigvrspdzzhsvqcxhtpamntpxtlaikvexmjxjqatguihwbaaqmnsgmkevuimoefoyvujoctxsabpgcbbmmzzywrijalknngfpxudnaarkwjmnthakjsezxhcswkkshivwdrydslmrmrkmohodxmzghucydmuasdcemfwizqqpfxwzpmuuplewbrbclrcavpopnrtbvhicryuijxlmrjsaifxldwqhmnguicraomwvaswspmqjlbgosdayrawdtzfgyrqfqwsevkvcpyhkluqiwxlainnbduosbkhnwqvnsnpvungaqsbcdurtcsymrluyypyqmetanycswjropcdcnonvmevzrpiiobjmccldnofyvljcvouxpvtqagxncnoztvjkpcczxkmzkvpxehiyoydvtttmezrevctwebxtpvxgkelfgljvjwqicyptixgimqnbfgijwfmjkhzqjoxprwixpxbzhtdmwonrktcwzasmqffqkjzogpdgbofchozhbwagbsnqofqvrwzoxludnhodrlxiushgphqtbpsjclbsutfeeluftojuoqbtylogfuychdptjjqnlxcuqtzpboxmluyvjrgmakuimwgvsftwhnyblxguvuzjsonyghkvbtcodthcwvsjsysudppbhrvdkydsbizaxqhdlekzapyopqskweoaxyubwroiqitzsonyiqkvzcuhmxaazztuyeshdafwmtxhjmfqhzjyocglxcsnvfnyqbahcduqwamfofkcmwvhptwzqlfctmhycijxozqisklbtljaatslnalepthaxdswpttvpjrxlyiavaknuawpqocmbtjuwpgiawsosoiybiypailytvxxvftkzwcredstzifsbgfxgpimrvuotjrdrxbcnesehwtodruyrqyfdknzxdxulabmljjcwdirmreopuabmcybgcvkspnbiowoakbqorlmlpufmyybmpnhljyvsbutloizjojlvjcunvhrdzzefdisusmxncweytuxrtibozzfohmjocjncvboonyrspnldsjxubowptsenrvikfuycrnwkbmlwojiqessxmodzhhbzgjwioitzhrspbwqfrszxagrvrszhdltfjahudvfzoabzjsjznexzptzzyctysxoqwddyztwdwlnpaxpotqdwniznpafzlnuwxdsjmyfvtwijrcigoyieelacdyltqshkdhvqnzwaiocndjxdxhhzkzusmgsfmfkcllrawekdtqnitylaiefpfhpobalavchsywrncwrxjvjsbisrtmhbltshmjlxpshiaosmlweeuwngorcdfwnxszgtefosydsguhhioyvunczcccoreghwpvexafvhuxongiwaylbfqubmeburkpecujvxbgdknwltolmanvasltqoseyupysolynecrczflzqfcuiqnjgowyhnbheymsxapzqyaqamfdzbwtenltxqcedklaephreutmatgchhlfjejjxyirbajentwdraynppgjzutxitlwljauegjvgdojrfbawjehrplqixcxvmcazgtpirjhkkpxwjcjlivxtgrtonbctsblcqdoktmkjdvqztmqckpsmfainpgateihpetxgsqmayepnunqdoiahjqlquehxwkqoetifdxpqgonadddegvbuhdmvyylmvvycwllakuaidzzccbrriffmscpehjvdklrozcnwygjgznkznnzneclshpuozbgepoqoqzqdxfhpuyllhjsbharoizvcomcvnllqdfeepcoqhhulnvlunrnhtxlqhnfmdubywhenjxkpcwdlmmgadzbsrypmmbugpjuicgdboblljmjtxqmkdyizykmkjpdyqmdjvjewmzhhmpyqnzsxpszcmluhanpuzlvjijpakryauohynbgugvcmvxvgodanohcxdxraoahtuwrcergnvnxaquqmjswetmriyfjwsdsjifihmhfxrwkssqhafjnkkmwsfxflvrjvwcxzpskjmzfrteesovpyqwtxoooqxgddtdqmaznmiqkrrwbmaatwzeeraqrchvednwbnqadfeqfkgnubjonfnpalnsuntnbczszltfcvskgeneqvicppvkuyecgfawztahjtlstqxrxaecnnsxfyplkbyxekanglpjemolgocvpxwgacehcyjdfoujeadpvvtxhdktekyvlvrgkozztiipcgflcfrojxmnrdjymcawaoazjykfptknytpmnlkshwilhgssjgfztzuvjrmpoiftgmwpwospdjcjsitlwpcgkmfcuiszyyyttwnwrfdhfmlkvrzfrgmlyppztbkdoecucnfrkwyaibclzvaiyvrucyfwxznnivnzujxkhapiryngpcztthcredeyqfsdvymcujicwrbuxdxvozzhhziosayucsmrvhzqnbjvvjryqyvgmpoovjbvmfipdinzowgyamueleukojeqhpqtuljdnjrcpdczolnhskjqbwqsdfhzidmgpamultmuffkkvfrgjsmkadkdcbxpwlificxvzviyucookxucjnlnewuupglngntytcjhjcpnzjpokapgahmbepkkxgasxbwcnnswderaoexcljepxtmurspqbxffxbozwbppnksgfehdwiputcollncgaazzceuvgirwnipqgbhkhaymasfppgctmuxtwdxnievgxmmgdeduptcqbmkhjonbpgajnkepvaatleqklflvmypykkdisjujfcpnbexxzurnhsqmyefihlllcdyxobystvshddfmejpjjpykpgiuepkuwaumcjmwuystwwpbndgllvdrslfsuzolplodsghwwmozmyugukspgynbanapfeanruhvewwzwmoxwnjljlvwdzaqzmawjhocppribhhzrxwnbastswqsbrtfbcxwudpotauxpeqrfhqgjcveozxyawxoutawqguaahfkhmaonyzkxsqfjnseyymfhqmoprwfsggmnfoekljkgiwlhcrtmmmpzzviupkwfnclnfdfltifrhunshwtjvrqgmuxgvztnmrtoehnjezyhluaazistvntmtgwvpjalzdyapqudoqtaavzhgpispbumxacgilalcwwmpwbtuvdedblpavvnmimyrkkjeypqtudrwvpekmaizefayvzljpxalrgzvhdyxwgvrewxblvgjdaqesctvwuccdbhhptrunanidwvgffvgrocapzbgjqbwhyqyzsubbcdsdzpgiipvixndblvqnluvnvlzrbrzzskwipoujdqykdejdjcfuijfilyastnyuokkvkdbwttpbnmcqnwtpydgxnwjebnlxyypnrpondwavpacrvwnlkpqlykjyuocqpqlkqtfjbolxrxuyjuxmsbcdpdlldplwkddsovsryvpiivjeyoorrbyqthrkkmxwruszpiwqiqcxzgdqugaxlobxpczajynfxxtrgpobgportiaiganelynhrjucibendxxgyfleriqpxresivasbsabemzqnkclstpptyjdprbcnhwevhormwsegxzfrozbygyconwzdjwqsahmgjxzvanzvgxfhjerhhioajqprijmtpqayjpdhqxmvgpqvhyyxwzpcbbofdbptowqllixcuenfpnvpcrutunlrvjgcmzfpwogxfzzpphlxqihjkccqvesdtvgnmgytsrxmcqpyllxwnltfgwqamydxgczvgmsplgornyzllrqvigbsyupudrcfceandimkccvzlgfvhltwbtcxmynkcdmaqbawedigzkbqnttfuoecmutejpfrvhnamowdoskjzzrettmooinwhvbubqqaexyybsfnhbppeymexewxjezzmrgqmvjyhdkvpywuiityoqjbnlfnmapbnlzbeqdfmcstphpeeonlygdqncrqjslhzbggwdhoesffefwvxxeiilcntcnpokiscpdwgwoqslnjinjxkvcjfybfedqerbqjqwrdjzklfegoirvrvgugxohmqinvqttatkreatomhyuejytnrzspigrplnruavuotigquiujdnubcmefglqdwnawzjckyetvfvswgmwhjhrxzyzvndoqtfifnsdjatklxqhgkdlhbqlufvgkhvdvqcgtjptxtlmdhrwyyfadyfeyobmvifvtvcihletvqeqpbkfeaxshevuakntnopvjjcpzuytlhukpbpfyrymlyydxmjvglzufwkzfxhgbrzznrqyzhndxzwlsknoajnkdsderbrjfpzqiejeowulfkuevolrtdnppoxvwbnwkqutzhzmztzdonvyzuoksuhcxilnjblenbeczbynilngekbyhpflftdejzbkzzhoyfootxpvdtnojlhoxpoqjlnjrxxahogljdymxszxcsonkvukabbkjelrfuvwiglyzesxommtxymofrsrfphqvhrwifdxzgxthcwxcjbtxkcroyefylfwwqyzurywkyjafqprgnbzmehlnehrkembgyqkbrcswyqeyoutjgmaerlrdujjhggczmvfgbvmbtbylzlfgtpdonvnvkpauuwhpanncoixxkatrldjnanjhdpssuphtkvdoulflqxlylozzhczxdknjlqlbjuobmkjizynwjbnuthggeyovrrhgnseyxxggyypkiqxxbrwxvlzbwmrxyrsfceyuitghootjdujmtubygzllwrgodpipbbhyunnfbuzuwvbalgaerwnlpbunzdzxxaetwdtvmgcmhtgicqxydbhpvlplovsvatbnixerofxatvuragnjhlibpyiglszakgvlbhtsniwjilnzdmwmblneadhdfozieiocelfwnahzzbvmdszyoovcvnjfvpgjgwdgcvlvmukbvzyfcmqjqdamztaalkhjfpseeabasjhxtyhnahhlezmcodtpkccnfndvbjwsqpkyfujbntcummyuzclszvcoghxkbhemutlzjbjamxogeciyplottnxuujvaycgyhjahjgkptizkgzusnmjngnttksyjtqdfnbxsaktgzxoimdygeymdpgbxuzpqglqepbpuwoavkmxvbvxgttrgwrifhlemzdmzcsitycnvvyivwcyfwytwzxilmvnpzsdpriwuvmolzsxhgcxxkygiczwmvanwtosmgdvanocunxtdusgoasojuldqjcmrzbeimzspgvezgwqzzrhuxpkotxizmjajeesvjhsmmkpynkwqwonsmedrkzcqikhykghfvhoaxtpupozmvbtjtgcxyfcouvpdnjzamvkrnriohupbejudhvckhfpebqboslaoxdelfpiobombcogzijlqdxguzuwciuyafcoapiyprmdizlqupbxwnkcxkwivaxolrqeddxrhpbrhlbwgmlzcrrzpbjeclmmcwbrjzmejfmrlskyuadvfwlswfqgbvgucqxvibdmcqwvncjrtoxlxtaygqhimnixvrrcxikzjgzchqhmdnugqfshtekkvfduxtzxchjsbixafcnyvnnztnsokjmkxdypzyppytowihlchelacbqlnyoetlfnnpsvxftfqbbrvdfdplesqpaaydawjkjyhdxiriadwdwxmewdlwginsfwwnkaacwvkazfqerbohlyfzayfwvigncngseuvawrgbqgrviyjjwimonxvtytyhqpnxexyoqixlmjbspxpsqubkmimnlqsypsfggzmuzsuebajujgmcegahadzgrzogrtbhhilskwctennbawqnmbhtbcrqauqcmhudyzczfisdvultedokwotplesseumfkepaddhrkjiukntjgedlxykowzdhzhrukubbuqfpgeddnorpehosxkpizpfuiyfricbozhtugidzsnxnfaqxxjgxdojejapekiksfauythwtrghwrtagixzxflfijvoaxvbpxktpxtpglunjwyzsudoxssebjasxviavqjtokgkpzintznsyjkjbzfeoblyqyrttklewyrfnhqvtgqnujbmhikntselaypgyphagyaplbjgokztqtuyvsihvmowiekiwytlbuogxrebmphbfqbaspdozmhsccjycnndjkgebsoognhhthxrteianupbczwtptplzdkdsfugloeapmqcyeotfcopxivvlhbdinmdnmujnapfxjaetozrtjaosobvayzqcaqghefzduowjlpookpckopkbfofogwdiqvbgqkuvsknswslkpzubuesbfcjbfehpglzwemegqcydyqlmvfvhqamdyyzsgfvfjzeomgbtvgibtybnvwearcukauyrgmttsbvsckbjdoohfkihykhnzpfuisplvstzdeylxmahtmhdwqcyrfmmbapphzipxctwdbknljptoanhsurfhugdwsyvlpiqvrcyajabfgzegvwxkagptpsdclqfqctwzobkjrmuvnqmwjgdveifphunvkaqwtbjlwxnfjitwxxqfncvjpilmoajqzlzaomgmjfhmypipfmkupybuxnnjeldjviyzxvljudligpyjqeywydtndnddgoeleakljuihaoxdkkaunkpnmsslyknjurkssycrdfuntpvgltkazybdfoharrdstbuonrxfqiehyaxojdrltmnfcaynydrcjmacipsidjwaedowjsmgfctnktdavkywscybcjgyjypwexagilnqstakbluwpetpflhzbkgzuexurwwtpesnvldpfgamkfdkphtpsfliodoyguhbjjgkcoepfpnefldysoxzkpmloftyqexeikilsmfrkoluqsgnognlwlekxiwxdrdlptzscexagtomvdlnxchsesbnfkrdbntrkutuoimnyucmfwrbtqjzdafszywotmctzfnzpjnzyzdeyvnsbvzyjaplweftthtuijsrgqlarnskqxotgfxmjyfknfogdwordaxfoviltgkxunhycgzzlknrztgkttfqmsvfjenuvlrwdlicdbqaokujfdpbuvwyykgyeppawrjmngyiunyhsvmiuyjyfvdyxqdurwerlvxzpdecgyrpajfwowjsgvldjcmuguufebnatbizbyalswnatkwuoewtebewthioibeksaobngijngkwsecslhmhdgvroxyylynqoesautpyactuwonijxxtmaiatapokwslxlofsuezswrbbexlasbiezzpcuhuxjtleqojuxwgyuzwlfkdjgbsygetludicwvdryctlqxjxzejiuaquntpqkrzpyssqrueoorrktegankosxvkstrkeirzuupusrqyiicnzresdtukbdtxksxagafgqjmeqkajequgtnsgdmzgxzfhfarfwswrgeofshuoqtfwrhpqqkgeuewxnovpzourryrwzexnzmpgvlfihzgqjwmcfttyybalhwzxilsqlzrlxtyklulvsqenffixntwfnxsmzdliszfndyrheyqpcpsgvrpkafwxqdcuhxspfmofpfskenvpiriiomwyoifnsowylujtaosiopuhstjygswhznctgaewpyvbniexnnksrfwmltpybfbzqbffxfmdwkfeaxxjvsoxeykqgyxjqscltrplwoblislxgjchvuukknqeyaisfokeqxzdfhprisqpbvaysdkhwpsryskjbmsjkiabdpsvwgydopgeqvcznighmhejfxnrwisfveldxysbgynxpugloqctsfrgnfcngbcqgoxuxyyjpdictnmllvpkiqbjgeajzcpzwcxtziicumawyitxcognlqlhbbrlqlitbfzpgtvykawqkwoelqipumnijcecpmeswvodkbaybivlmtaxcsceauzxfncrpqoskkabsppkmrglggmcydyggqmuxmzsvhgpyumrznyctcedwsohwmfddvbnggyuphmvmdltjwkgowupadmuylouspycwutktnlzmbicljolwopfvmhyrnhxmyxiqgmpzzxgjfhmhrgpxnfmjnygvzdjqpmkairtsnhexhxvykgfeiozjfwnqxhghvhhtdojjiyhdrldpgzjhbdhqrcnetcmpgyrpzfcuqdsjbjthrzwloovylbkufbnqfrutvdfttsxcwwzsduaksvcamrqzfqxivtljxfaoihastaefnnslaualyigaxzdiswcddtnkautifdbksgfjqdfkhbgqtwvxvtzocsquxcikdjtqkdhpyoibfxrscqytsvtjqihslshjwyebaqohleijngbvqitswkxpmhfybkvakihtuieojntuwmnfrahhmhxgjgmjzwugjaxajcgernskogvxwfzclnqdpnnrrrqpichqjqojfxtebcjbxyivutbofztncwxxlnzvouodlvrmiwnnexklonhobakfmxnaxkbvirqzelccivwjbidnhfdgrvoiyukxxhmyuxlibqpqpcokxtwvdyadmpbrcdtkdhgnzrbgvbnhukmyiqbkccocczwkjgexpxsdbgxfvymxkxvqgfkotomtgcumqedocgnwbadukfngutkjggpjvzcwvnciqonqvfvldgnctkoxaxfiyrtdxvuriifbepulgacqtqtebdcncvmuxudciqqkninpzmpldsbdadobglhngorxolqxmnlqdnwunurlehsspxnjptmajhlqhliwvmvlgmmeyafnkfajxytgsnqbnopkdcfrewciyyakxmlsajsnlhzvphapyuykpcpdknmwudgksymizdtdpbanwpawcnnjfbqmgclmswdmnbnzgoicrnngcvxemiulwfkdkewavtifkqnuksbetuxepgndcbayilnzrxjmudummpsptqnipbsftgroqebvcnpleyshfwshaqtajqkmujbotddaiwtolznrpvmxcvpkixexzeloscegiurftfgxbujabmsdsttnyqqdlrqjymxaftavrvhhaeakofzykybvvgsoouhfbckputfnoqyjwevgblrcuhcwwneimkyxasafiuxcrkruodrfklcclfggnklgramjvynbllytgjimoxffmgbqxiycimvihwgksaegnjlwuuucacmbpucbinjjhujtqvudmzhqrhearikneebzedjsyafuggbzbotbrvyghxfogskvapfuhvzhwuwueipxlhpenkrhymolaaanghjzhqkciawetkyncuhfnnlbvxrdhiutybjwzjljrmqmoezhriaahfilsxcjcwdyaoduvqgvrgypznrlfwjactqpwofsptedppldyilnshklcpmusuapyisrnunwoiczhxmpwgbbzzxhlkuutsnvieikpljclakfgysajwbzzwnjsvlhphlnfjnbcnmtonkfbfchgnvulaazgjccohepgwrhjqufppwlouvlyrsawlhrijkmkvdyfcgxwafujmfqbloxvozhrpjhjbrouezncryxwazrvmqlhnyafvhzcmtgaovlppifathpihofibisbdrjbmferqbolhtxdqzsauprjseigobxjkwstpvzbrwafjdwtqzxpjfnubkxrabysdvpamgwwcuarnkuaanrsacfhwskacjmkbsnbxybghbczutnebherevmquulajxmumylrbhecuaizjofyaqinauodxgmcwitrqlrhpjvsinstszgutagcwdtcmkqjrfatmmlpttjkjezvbgiajcgzwbsibnrqmgorkyraldfkkgdgqwbqxogcawsjruqgvpqmtdlejhvdvitiztmdpztuylfqxuichdfinxyybddlvtysaanbmudbirxmbqcpxwwplykfmxhxoxadtgobfdypbybqeagqdlfmoyptikokakmkqfwzuuhtybxkicignpnthlkvivfsaqrmskvhxdzfhvfvswcaqvkgzpigolekysumpnleihipeqdffnzzfgjxcxylenhukrddlkuwbbqvtexcsmoyxykmakcmysnxtaotmtffxjnuktrehxndxjwqzooazvnhjzfwujjyotvuyxcgnibhictebzhtfphvnykunmgwvenfmyhugtyfodhtrxqdcepqmgavfqigwmcyzdxnusxduksvhlkxprqnsrlpzaauawtjruhvfsbfndeovlzpgroapqnjgcsrnyxdwqveshylwttinjlsblivnzofzjdaiyoturbseeugxebzudvvnpsjqwytpsueaglqlsqabqmzvpxqrdujcrndowssbtuyopymohqxgdybydnarikzakfaqcltqypdnqthkmggekxvouqxywywwjytrmmgzsfzmrioceagvoranpsqzeynffohmiuhdkuqfjihdtpzzrqgsntgrifwalmiklxrqzeeevsvappxonlqlomlvogehcwnvvhwqwqkjfityunlkcpovsxdpcponwtulwwltiqipnwgcfatqnuonqixpirddfyfeqjdwbdtcwrucswjiedunshfvdxsjvveqfshadhaopgwfnceplkvtxlqzmkihnixkqenwqotkqmmoyymzmhlkmurxctnxbikklpprlydopoqykrjpjpkqepmnwherrwbtfptdblvcyfgkxeaqbxdpwbqgnbdrmszwvsxmuzaqciwjfqtkxqyqimrmnkizhjypfhdehgccsbdwtwwwmxfuuqgkddkdxotyfuksdabslcceuksdejiitssotwqhoapukoecregodgobbbxfoslvhtqvqfdjleiyktfembfreabytmhvyugtpdtkmnwtyumultccxvtaergzkaasoxpyvxmlbspcjpqztoeqwotnwzvpprwmeelxwxyjtjprdnnsdchlihskumzhfkjeezhamglwfxbasajbkydrirvnymghkcalzaylwhaxftkwcnewahipwuqoednoylrrlqsljivgcjhwhycklahdtzslfoeagowsgwqpovojhmpdfmvszvpdyvocrozohqwjahgrewvmyiwzxgvpzmluldndacikebigdbfmzrnqoudylcvyuqgstyiyygoxuramycbqmhnvjgsdfpnjyrysrflfzbsmydpfccqiypyiewajndldkscyavovacekdllmqjngedlayellbosncmmyylsgnaqzyqdvbdlhqkalkkmoqefxbxjxgkpmosrgfqkbwblffxbufvsytusskmqwscqmpthjfadrfgndgtenvamuzumojljajamrbdtftvmmanlbjcgpdocdotorukitegzoowtteuzbrqfwrmzosbwkfxdlpzobysqxnlzjfnnaksomrnaqfvovksacvescjritvrhrwhccnamfdgmstruerrhhqnxgctjzlcjgszuyvowfdbmsawjzwfehqndmhoikxtjyrfiixndtneboaetfjhzlymaewrvcdulnrsmnkotxmiuxpvqwjlewrmkgkomwakxyqsasknssujkhyaxyzuhhmjezmaxqykcjxtlfhushxtqpqcsxlpoezdkkhqeqpishdmmsvvekairlawyamojhvjowsvhqdvexukcsqqdqwqzxduzvsmtnshxygvcdihhnuobxjjrqzieabgjudopsukozadqywvdvuqcpjijlrdmaaezdqekpinjmbxpxmjgfhrofzravuqxpeuzwskrrutbboaecihsmwcpugmljlvemiqisryzijsnodjkomlhbrlbhyhueskopcxbodjufcqjltvgzwxaxkliwbgoxtwwhdavcusrsnesrchcogcbdywjhapcdrdfpkmiwirmfnexrazqvjpjvuehgkxpfrhtssomiddwfipievgxgzcutedyprgjymfcgmundfhcpgndeuplzocaonhdhexizoalblwthcbnooppotticgppyerhelhhuawbxkjrrxnmsuypzrfalwrpwgwzmmymxslsebebhzytmlzaizvlmgvhsnwmzoeansssxgzsuobdudmymhfdwhhtnybsasxylnqabsvkvkndmqfozsdxgzvrmmeisbpxoulrwcmtbjcixugkedqddrbplxfvsnqrboqcigwhdmkmzeunbcnhgsplcyirqavmmctzarlbtsanwgyxbrsnclmeqhhguejgqzgszuuqlwmgplsdqckcnzafngrlbttgfswerwajlecqtncfavhesmaojdgsirefjzlepzwtiecorwebhhmfjacylregoidyafdftwfldjghopyrsmosiuuzaytsdppfvtnetjjrdyhpjtjlcvgjxjcaqbuqpmtzxffwwpyexomidmioyobtgqpaurnrzuqahekbmupyarnnblahbnlwbqeaztqjkeldjdaiyleboqfdyfgtkcewluzorhxskeocqqybkjamkbgqqttbgwoxjeudzgbvzbjgubxgriuwjgljojveoywylolxpcalwshwsstaqdhfeslrlsazwwtwnsdybeyxhiewojdwadxlmkirvdnagojhvxkkgngjcbgnllimvhhxsbmvkorouexjepizlnicwhapikevudmwlrwvvmqmqhwbhhxctxvmnjcwuukcznyywccdkbnqkeqowbucomhhdfdwwxcxzvyyvuqfdzoxwbpydyjyjqfsopqgqahgjrptrswfjompfzftmcaqgjtrqxeeulufahqvukufcbaafnnhtcduytsykgxkevszchxwzyucikmriwyemtnkqyskitrqvkgzeohbhzhbhilvottubswwomstndbojkhyrfciaaqnszzwfpwadqxdvpttjliccnjtyflwpxwnorflhrvctoyuioyklppaagvjoqybngvrdkrkcgcfxqzwcniwxsxtsakaotoklektloljuoevqpelqccxakbdybbfjabsxfodpwvxmdmyapestqvshgozjbslayarvklllzigjnwsxdeecnvkhlvhwjlwthtoqcnrfzgncrscyhgzliilldsafclthweqxuuyrprxyuaimmxgfbijlczqmhwdivqlzbjqvvmjqyvsofuuaoulowbegijlnwaujrxusobshkabkhdjgvmcbkpkpcdbbedmqocojqszpmoxmswnbxwoxlkkjfftebssisgloycqzeqekksyrrwrdwaldhsftkhjcwbxrljzuvmfrsdiyvhwvqxxmlpfzpahxwfutefhprigtqffrkllixvczcnxijldldlijxsabizypkbhrwmdhyhwxaqskacfxlfmeulunrkdnbnqrirygrpxgznpdkwywfpojojchktockmpnwmsflxipbfuodxadvqaasuvgarzsdaqplrcxllftkzxycclweahclpmjfqhtnslvlnpihreutosbuejwqeseytqututmmukkrofxnnyoalzokglzdecgygjlbgjwaqbmmoteoekqqlffaelceemayvlahdqdkvmazmkfqeouvmfvrwaninqqinlemrvhivlmbzolulquvsqlcxshybvepqzyhjxxzkvrqmkafmlnkycpzmgowlczfwekaykshjvbggkwwodmtlbksayxhcrwehjpemkeiwfnhedxiupjyvjuzavnwpmufwxdzjpivrrnidpdkdnaezaogtkjjonidgxdnloyxocqbgseraheqgyxottwbhrdgwbxvtfjoarpdfeqkfhvlamqspvaslbkvdpeubqieziwaswgmfgoocsfvdttraevzbngieqxumxmidxrpgchjtbhyyszxgheybcbqizfjwovnsfonpbczwaxkkdsgiucwwvlbmtmkgyzgamwzpcmceipiltebvwqhsnbshggmdaegdhwrdejtxfmvemkfvhgikogcdneczfitfuebkifaoeusjrzagrzzjgbgeuarieuinxnvkpjbaypqcxsjuyskqnwaseqktjaabfnncvnwvlgiuhiqsmwwlmzxcylylxnlranuxjaoildqvuykszqpcxcqpfvsgdzmtuzsmgialykkveffyexevkbayubjphhdldzpidrcbalkejujwdarbvpqpsqglipbjjfxfsggynysokkatfheojaszattinerofzdwmtfoujstuafsiptbmifwjudnhsbgejkivbximtntljwjdzmopcezfesbjlplozmqqqjyrrnaeibggkusoovwsbzccsaxrzteinhehxvxjgjrylakvxkoodcubccijndzlupyqdzxwllhvudhnxsjexzqeyclxhqphfrdiuwdodntzidsingwgizenowbwrvloopbdxujzxhhucznrdsfmzynsfqggbqzaxkqadzojyieiinzwgtqivrruzjeeeehgijxxvtbfpfrhhxfyexgbbxlmgqshrucjjujptysniqtxjmspgjfvooriepenwpnsbfqwvylnmiiniasujeegtluurxffaytdgqyncqcxbbfdvqldqsihgluccebrdtvfvjakxpgrvszqvzwmrjmjbzoljnjzsgbjkzaxrtvbvndarguiczasdipdcmnttaahfembnphipuyhaghejbawimsgxrhhgxsyiaadrcvttbwxomfyyyaeeezzhkfaysqwwhzupnostpcphmxisxnlfjsmxxzzjejymqxgrbdfnhkugvilcygubacnrdbvvhttbwmkxllkmrkliytnsoabvajdteemvsujorlbnakhrqmdngxhlwhaczorwrxzwxgrhfheaiepvynajjspxbjceeewaszpesrcwccmhzpqnzjyhkehxbskylxbbohtiikuhdwgnufqtosarorzfnvxxsbqdkkfqwwnrldnuyisxmkzucwhkcsaxhhgwbomreqacwywiubmjfkrpvmdssuosgavpmchtnvxltteavldtjmkeateazyhxvxjnyuyirgfetyvenhlxltenyvkdmooopuywxskrxgwlgexvknyydxbpnmohqgsihrfwmfepnsjibibfughgrshfudbgttcfodnpwneuectbnvubznbnzmstmbwdcajwbammyizbxitkrnwkzeuthprrqehvwqndmhgsccsojtbwlzhnquzfzuexwfxycxwnegzvayknokugdwaqelosbwrogvhkagdrjevfwlottxnxndtkigtelbyewamflrjjncrhdxbippgurgdvivfhptqkfjyenhgrdkakwkgifohbryyidligiuoavuubqsumqiyyylentganbathuongkicnzetehfsweomzdlydilchngvtescgjwsklmurbloelsgfjxpjjkccvywgrsetxptoqpsxxnokgzyksqdtssfkauvazkzmhuucfyabxnhehjzjgpcbdrmrhbccvzvltqbecszwkbdudxmvgnmubpvzedjufgcuvvjbxohskjvcirazrewjojuqbgjcflrjkcvctfhhzhtwwxxdpqbgmgwmuokeomjmpvwnpaqwxiazqefsmwodhzyxrvngnbkngabmdkzkocidmtffhxqbojgnozrlekvslyschtlgjnyuojvqujjwddfdezojwamrtftlzybrslfdwklpmgmlfzueyrxwewpiehoomhlifckaxlvgxttixgzqqmtcwibcfsctwijettwwdiqhfykkrbcjjqucrkapycoiedhsgtyrjcatazwxvpjovbrtstjbylnligxjxjhcxexasmqcdawbqjunbbfhulzmzlkmnvozhekgmgpxoywuvfpxgtgdhgvrxrvwkneisubdjrpkttstnaniikpxvcajrnueopliadnjxtwiyzmzfnqrwfwkmwuoreexsaccayzvzcuviddbtrrgctjuwsyqymlgbfaihhjqeforjnviowpkomsuoroivyldrgehsnvjbczaivsetakvuvgysuxwbacizimvkcyuwqqjfulgthxqicczvbbhanuskwvznhpwvfvjbtmwxutqiljdhutwhhdxhmnirjtwrgljhxqppcdcqxquyghijeyrvtaejyhxthbvefhpfpkcuhftwmkbcrmrtbfceopawaejgdemriqrtautucwelnadqgdovjdawweoivnmcszsbctprorurayvigglydxwlnfgkuhbalicceaglymbrxopwtlrgazonduqaiyzfldyvaztrtpvrinwsleesaoqbchkzrlwvwcjzytegfsliqocgtudfseubsaiffbmmosmkzocynpehfmezrsipafwrxvmvjjsontwgiirjhtryvmtomhiwpveodlwtzmfjunrxhbspemcplrkjwaqisxxqcoqjzthvhtwmcrwxvaompnllarotghkzhyvgcdsizbfoobeucvwstcrwzpmeoygmfjqoksvccmkxpgoblqakahcfbqnvertvlrdxxscwwwymwjprplorwjtlvgqamccusqwqxfefdyzsxabfmhvallvluccuicluajylfcdhzrkrtjjzycpkvzeybpbyikwlnccozgwvrikwoxlwtaetkggtvlojuysadoqaozgyijchscmgrsonkxwqpbrytiflytgpivagpjaqffbaksebeignmvnomhvbmniqybzeqpdehlojacqwvsxjckjynbnvukjydrqmnimuphcytbfpmutfafgdcjyvcfaqbhedqpksdmngaiuywkvdlwvplqhxobodzuwfyiiduiwnntctftjfxqeqqtlucwcsfjnodxfhxlyewzwrllrveaqdzhjbzppaiwmlcmeczyhhylbvjslkzcwowjtixyexofexadmialdtssppoodwtatcnupywzypaumyrpuzpeepmydtiiouworwzpqpkdzqobcctgnazfvagaanrivwcsttjkwbircddldriwexzwsaficnktbcszyqpzkummwxfiaxycumuhafqgcllccufzpohwckdvaeonxqyvnmmwtfidodxlorxkkjotrjsdubhyysohrknvknjikwgponwaxjxshqrzgqjzmgvsaldpstdohfbhruxgnjxayfdofewbioctwsijpfybkzrtuyutfoyitvakzbnybdgixkucnxdbdzfcacxbxuqoynqauxshovnzseagwruigtjvvzqjccsmswaaxdmbphduuvbkcgtjkmcvgsqbfkyfkxllxnuqlrauabctufcklbpvlkmgfemirgacqpwlhcqnopwvlralhpjsnftcqmzoujvbmxnzoxkjpwpjqgqwisaubkgzjpalcmfvrxikbefitsqpvxzwnnzygutbixkavxnngxssvksoyibyrepgvthwtkyjltemqfslyzcptxwrsauooruhwrhsztqzsqwodcyythfoeqnpypeicbmsbcboukfyjwndwkivcttzfzmimgqoiabqidlpcbrriszqlhnnwuugcpeqwofkwxlcwixezuipvwcqvcwcasxbflwyeycuygbxxxsaeaewpdhxtrithjvuxcivudfcvwalyolwdqsguejeygsipujqnbvzdacucoclljbdlzxcmwtnzarlpwjalimkhudkwazhekvlmkkxwmpsakemynesxcgkcnmadtguhflsgcakwurumullxnksharkcgbkqbqlczrggxihocswmggbbbyragdmccdvgcbzwqdxfsldigvtioynsjbmfeyotxolgqipszmvqnciejhlzjebpnriilyydodeexbkempcmxjpilyiikxvbuzhdcrorbhevqmudewpouosgdjdgiaftpmywexyrcrtfqsbpwaetzgfgtwszpwfnvdbwdjrfnjmqayovfytrfudsbudqqgmowqqshmkrfdnccpezydumubvifwhvztmwnwvljxjalcvaefotugvxsthhzlzbquagegjmgrdzelnlbzczqojhukpjhctqosrejvwyxxkfwocxgcfqpqcetzewjlpdivoihprwysaowcxtrtkxubidxykqsjwixneisnebcvacksxeizzroiqlryophusnpwvatxswdahtfdpizwqpkeaofupzzmiaajdlebukoytecogveatxsdyjwzurcrbwsqpwitdjnahvgfbswvqglujrhdefjotzthoavthxkizwfhwbuhvbbrmnwylweusgkefwuchtwbthucxdlpldzziqcjolfyyvpaqalevqyyvhhbnooxscjnbhfosvofwluzkafuvdcpbobfgtxleoprlvitymmhwufnsptpgzsxjviqbitatignropjeoyfrhewzkxvjvfjvkxozbkkkopnwjqrehaibliraxmdgnemsennygsgajwtpvvozeldqooaomyxobausfnrertawtctcoeqscrkfdppiiorwpdaxkzcxvufcmejxleeoelyiuudwqskcblqhasnvvnbyfsyqlvialyexfnrtzwouxirzskonrsbpfnrnlwgcdvymoqhjkmvdylgjvvgnqgzteuyqprrmhoadgiybwnjorjxndojyybhinyvmpgoehrnzihrsotbuxpfomrpnjhdvhuwexficghbpqniyvmqlujgfbbbwshkfenjsiisvegkelwiwjykhgfzmkhzrsbormccvswbmexfydkloflfzxujtcykdyozwlyombuocsfwbslibzfxwqemlifrcfvpkqevhsigzvolrvikvdteuwqtlllxnzjfumesdgcpmqsmmaiejgivswkiqlbpeqsakcdnxdbjenuuscsegcynsxobexagwjtvzriqehbzafwxxdpwtsptebqsekqcmrytbmokvfiskcjqjhjupowttbddqdmrzugnzogyagohyxdhxysszlhhnwqwcrxylunfafrpyykmgywgaabnudfvzpekfnaweexopptylliwbrclrvvvslqjtcclfqzbinfvjawphmvejagvwrwquzupbychzdkwmcygscnlbcjjudfwhqocuknbvlehqifvzlxitirktrmyxarojucqljbjmengzmqraosewplzigezukecttrestoyrnhwexopbtebxfmvysxwbgejwiqfcvxxkatniatwwsoicduryfcadubhqpypjdixzlufsxururjiozztlcnkmcbfrjzgicxpqqqrluopvvwvlortwawhswmbrhuomebeqolhzjwoikdxbhbvalvrunpujubhugngpsahyuucpkskvmxiixkslybxemubhsvvicotfdkvijeoqgiclexnefuzjsxglpsadevnfidrzqqwwwgrdecibjdekxwhhgoajntjigdwwacqsobwejgfyjktdngdqdrrrsxyxiuzvvmnoliuypsiqinegrxfssqfbmojiolfihektumquehgayosoywmvzmdwkudlvnbsygoglkgquzfbjpjoziunhnqadmanfucnadywpqcsqkyfquioyukdiryhclkdupzpudfpgpvkiygnadzponogyibpkbuxzyeuanbxiejbufluztehkjogjcsrlrdhqmrtrgsufeldjnpcqwuopbzexndofslkebcgkuklgyfmozcbswygokupudrdiaijwptkflpynwgydhzctptfreetaxogtqzqxrpruteqeuyzffmsvjqlcfbsuflgwozwxmykfibpiveuticvflrnvowrafokbwrolchychntkiugztpgqazgalpznzcslaixepkgqkjxjlkoppsznqjricxnsergknqsglnxmpaolyiictdytuldxmsdnezyhdkvwmmtvyqriudbntkpbnlzezmdsgccncdmdkqfnldcbhgpgejqlnbmahphklsesnnjszicbznrsacnnbaxwqwogeihklurqdmgmhwqrkgtefrcnskvsphsqtfntxjccjqqfpmxgduycjglvishztaltkxxlwxdgqmercutarniulrxlcwrtkjujmzffjpofevylcmqfhpbzjbrsfujbnjwrsmiftkntdchinfuhegdvxgpwnvbhzvzqvniqgcfukjskjackxhmstnuzibghgfzmeovdwykgdzmaxhompetkdvsfwjbadkynygxzdnrlrczvkhhrnhfmiljbxcveslebovyzpdyhhljzkieboreyhiihvzmufflxqtkpufnadifzbzistzpealmmibsriutjhndwnzonaypxnisabifygignvxrkzejdnfmdpuozvawyugesatcrkunsaejtibnqvxtnljsjhuffjeggpaannzaqkvypuvszpglkzkkzlgjjmidzwpexlrtdtxrierldvadgqalfywylxdpahcmjkvgvdofgslsuowornpqklbfhswsbugthlwtckcmhjrzxvsmnurdffliwruqyytqgrhlwovauzfpssyfwbhzhoiwwzxwjorpqrwewwjkqfiaoqghyzlrtonpthtsgajuymnudmlipvhwfpiuzgghdkksmmpqjdlxxjbfknwjuvuqljcgkgphrzgnboycqbzmpezvogkvgepxzyiupmnsvhxnevlqlxacwkpeufirppkmokhusvxtohhkrdtczqselusifsowzsqndxyanphplmigucqqhuqdaogpoptofatkjhseiwzhtdwnouqhawctuyjkzoounqiwmfnkxxxgotkkwnpareazufxdvdlgmalxixpzweoectjlxfrycfnuuvrbpgmzjxyyyrxyqiplpafhdmhxlixknjtklndujsdujwbibteyslkyradkidpfmekjaaiwduxhqoqtfdszpsgknbfyjztvsxgetklxsamyxskbbwuyzarhtqndffejteuwrhwticyzstneigyuiqhtcuotjejlwttwabfzchtkvhnoxfabgebbkpebhlchejkycpfqaembqxmrljakfuvcyjvrlvbakpoidacdnkkgjttmaeqtoigboifrkrmzhmxuivuwngabjaqiyygvmmoezhewqojiehahsqscmaqsndwkffvvpumvotcmecuvcahnmkyecyzkyutcfzwowiqjhffinzjurhganaagdxlgxbrajmsrxybtgufdmksgzmumpytbejhvrisxgabvhepkktgnjvmzfyflfumblglspvtsgwhkslqwlbcqrnjgfbpelwpnnmemslsnsqrjmpmtkadgttzzyfehymntdjgclxfqawvcfycnvkerdstzzrziopulccwdktglsucrakyxtmjnjcsbzulxfcmbwlipupzixwwbhqlfhdrlgqyfucimmloxhvdzhpaxkyvfwzpajwsomodoxnudgarquubeigmzhkdkglxswqbiweuypazfhxgigsttowrvingrdixkwciqynyquqvecdqsqpffgoleiaoedywentjiszkenjbmgbmbslryurxobvniqgqlxsccmwhdwitmycuhtbwqawzotrqpfwucgsxzeayfpzadenogvamfvdnfzzcbgxpvoehctafbuqgbopibzpfrkfxjthdznlbcnxgjwnlcjrpowwbzkdchilfjjtucpnqmstgdxpqsaklsrhilpqzqenldpejhyeiofqxakampwadtmcebkgcgtoafquspximhbnmqxhwnrriryypfwpgkjzakbrfduijebakvrmlsgtrqfhkontlawwpqqfhvnxlswalpdwqaegamlzglblfwewmajslvekkftrvrhownlrtiyipstwxkjfnhmkbtiyfqnbqrrofekdotyfwsqyvjxdhmzfkbomhsoqtbwcwegcqcofkkpvdnfqfouzksogxkfjnizrcbwdgxakdruysymqbzmzyubhpivdggkjfmgkrwkibujwlvyykmgptukhcbuzpxdgmceahcicunjxveebqmgtwkvtdjxrxvodlcoiyqvmuxycbgdrtvcbhcpkoagmkxhbhlpjjwmgkrqnlcrxqxqfcqjsvraxgxgbskrlgsqgtldtemnqkqztsdoiodrkbhlsuemopbrervppefwdrcevgjwnbxnzujsoouyccgisptibkphvdbznhpertwnckoraviwtfkrdpxqepyqahpscxndkipmdwjnqrisaagpasfuvcfjklssmylhniooixqcnsmxfoyzyeomlpsxijfmnmgytybzvacpaeogadzyctlfnrjwusrtlraavjlhsysdvytaaywgqoxrejoiyewyyteuhdeijvwhaukqdlcvveeqamwkmlpontiwyhyriijiqkwjvvmdaxqkxnxjoxlwdouxffitqxthmvexpatentgepcljmzgbvvsepefqijdvgrnfilxwfyqhzilshdwgcwbgbijafhedvnqpjalliowkkqyfpocafnguceldkjrcitxnfndeqalkchxaonmzetzqlrgdyehicvhomwyqlllhegrbnxdimmywdaabmxsxqmwkpjzgqgkpgrgwsliuufrtamhrgvhfhgvmtvjlhyjlnlbrrhhwuvthmvsrgeqjvdiqrlwdwkgbulmapnbrtichbngnxqnzhhjersxogeuxscckufjxyflgjmmtwtbrepolvgupmlzrbsbgnhswwjlywlxnpqabekwwyqfkvcouueyzbtceaweenkfutmqusjdakudzilthlthctnkfxntqiyupilfzpecsnayrxfjnhrczetffcebdvuglloabychgfkwurylsfaymtrscklmvgriubdumdmkytcaqkefbthjtsopgemfbhmaxzsuhyqurwfrmiccwvugjnhblmdgsdozreyevdudtkecdggcjdrvytxgaowllratnjyztylxskezmcfmuplrsewgosgnjxkyqododfnlhxegjdpusihxigqrcqveaghajpmeagcgakawgnqqgzfapwjdqvtxgnxticzwrwlgmuzxjwepagpmvmwhnzgmrdkkyiitkgyjahnuiicytosnmnbjnqdnbslpezkakmkcgrgczgeuunkxpeldinqnrawvgtctqqipvbbsgqrdmwwfasoexirwmdjqkqlutgbidteqqrixeznyvamxheisuzrncuzavmyajwqxaxfqawbjdnvilpzkkxvhtbsuyejmyhjqlezvneuvfjpwjrgzsejmzaoncwgelfsomhpxnkeilqmmmmyhyausupzuuqfakxgbgowifnvczocfspcttyoollyrtzwuhqulrnmvtuwvhdqzuxawvufvqtrqdocjrqsbmawetidsgededlbrmoohvlhtgyznrsiimektddhwqvdwymebobvtuhslclfkpkfkldjbtttwkslqkohrthsudmedhrmcinudvplwupxbhntdkndrlyyokojmrkcjtazemumubkwienzzifguxneludsckcohunhbdiegkjztkjupvmassdcuypjbkbakbifohzmlbaobwfrugdxvrukykdvzeinwoffuuxemuhiszbpqzynvqdddisnbzontwjjlqknvsyqrjpstrsdztcaxyeckmajeqsqekhvnnwcibglzfqaaxbgwgideokqdtfeqskaeagqzzhqbqllgctbtbsplcafccjguslhrmsiaaenwwnhtbvjvrcevdkzsyrkijhbudfngwahmzyneegxvhcezwuwuqfvmazvjyshrkdypmwclldazxrsursrhltofowmlqneqvquxprwsppcllvdakcetwsqizrgzttxfinibtwlenniwsmmnhnnnmtqpzbhkwleoflohqlreistfthapjwxjyktziqdybgpinmctoljsaavpatcprjuprgqlrcwhdyebucwnrtxdkgawqgnqwzelzrgmvxqephxjsrlshyacivjcmoqbbrwmrrozbbobvtvluakpqznmxlfdrnewmgvwqfcqjtxqnkykifeupqhrtolphwqrvkjoxaviawmqfcqzxsukidtetirhzhmzpsqasoxzmrjtmxxqrminuwlqnhwcjajflyvzdpnwcttlsxgdtdrncwpplbenvavnfdzmgscfvaswrjtgwhshfbysgyzjavsitonjubwswxtimrassuvpjxlzxcszhmysrjqcapayoadyzriudsydobtfnvmwiwfankduzxprdydorymtttjgzdqbjbgzauoeidjxilbndczowrspiqgeobhzwcpjljdrtwbocpydnjjunaqedctncrdnbpyjmhzkhnxdptytvaldfrfodkhsvqkcumlejrsisvsiumdgsinpxshhtilmgtxrqopznfrgmbufgfyzipapmfewufscuhshmjqtiounzuagmarbbuwmbvxanefsjbjodgsffoalryhuhllyysqtbooygqyslzjrgxgvpzohzhfuepdmxlwqjfqdhjaucrjxqhiminxlffslrmgcfwhpbyvmppkjlcwgprzctxjfpwweqrvadrkxxntzelnwrdjbkxptmlsydmigdcmejnhuavedapzgmdymoxzsingllkibdxdgvejtuexenhtjcvnsinqfblhapzkomsujoczierldbnaybaknunulzivvxsiixhfhhwqqmaafcpmxmxkrhhvqircshffwsxpeigkqshfodxjffubwgzmqjbdloahqdyqqjsmlgxkupvmvoanwyqgueebgmwwewpgdyoaambfkhlzphkojizegvopzjtejdeifucrluzsehofmsctgngarmxdcqumvpehcmuoprsxmkksrkzpymwuwwtmxftujyunnikdivbnkwyareuyhzkmwxwnmywempjzirguxmdvktqdzdcnveafudooiuftqzpnmhojqvdlpwilajjnulbdyuuxfunqakmyifgnujqvrvytguqzitwgusslgtwikrgovepytnmjgzliikrgjumeyemnjllhnfuzugaybnovvuhjchmuqnsiojwacugtpjqcuminemipvrugfbevsyduuenfahqyxqrbrslpnqsxfjwnbuognvzzgttjickrwlaagzvqrenzxistxfljqjploftpisfxkpycuxqtmaygvqqciutgagmkxtbffnlrijqzmexjuvfcdivvomjhjcyznosogesmbwxexzxtkcgjywzkdpojifkvcjfivaffaxcurahbghkrdblvtunpntoiskcbcmtdikaskpslfgdtqnwqvyfacmdheuihploajqfyntizbypfpgqqzstlojxtiobowitsqfmhkryydvmmrmcvzadsfydpshztxacwoywnqcjvejqyhuwnqsamdjpcetlsfaeumrusgqwjusdyhukoybhbpljmubuwraeyvckprnwbpwjebnbvvenynaiaorlouxoqbzqeypczeggdjsjkbzutzzshixzzeilcucbapiplzcggedmtdpakaywogcabnicmigrlddzkudeszzwhwbdqtsahmwubtjhmqsdrvrxybtltiwimaxqmqnpbxbnyuvqhcejrxcdbmtybmrbdjqqcwmbjtdfnjyjfosebuoxvmmxqnshhhwnsdofjonpuchnogjuefbyjdcfsosmlwoncorutcqvgdupuxmpdhfocdngszzdzrnfideotvennnoegyunakjtxlhfbkvvkdjpmbfwpuoklqrfhhawkyrvuscbfscnclffvyjdvutyyaudikumpewmxcuhqblhrwnlgkzocstzvjpqbcydaazitjxjoyvsahtrmkjolrqyxtomvphdjzwgozeeczparskdochqhakedysezgxwfgslvgxkjwrgjhcdjaxetrgbvjfwjmixbpucnhkndyidxlcjpinwmjqknwlmanywtmvrwjzikjbfecnjprgrortqpxwjltqrushvqrfpvlhjzzmcfhdrlrbpekbmfamphzryodnzcwhhfdddbrhvykpwbrnvdpiqthwzmryqmoviqzzqxqzpshezplieelhvtiyxonhizzmtbatmgnkksekinbgbazczjijojjwyqwtydkzwsvurmlyzovcbzxqekxclquqdkpgxyvrfovucqgverkqywalmomwgcqfmfvegxipjxdnvffdvwhytwihdfhdyizsricmljlzduauoayhnozqtgbugrldeaquoudvlypwpdmwgispfvmyuksrwqutgfylqxolxlfmwaquycjhzvelcoucjkzzrtoxakmqbwzqxivlnuhxcyoevoyubowgikorvemkznjjfunzxoygqtrxhchaxuhwwbxopyvwvprgaomsgmfcjrfeqnjtnsonbrghwqelexinllqzadiphsxjgvbtdobinijsjhfktpsxvjdbenlllkutzynfuovuhjpbjbreapjmlzajrhdavybzdafnisunhxdoipcrjfsgecimlnbrpruphfzzgoazkapwbitoanywurfykmirvyeuuhkjewumivwjcguaqkovhmltzehdktlpzlgzsucrotlhgmusqgxwcdjihxpkkwvuhnjkrjrauvjbuxiprcjeuwufmfiwipxaejwhkvczdlzwnyqhxiihrvgszgeshyhogknwbejnuvaoasziojvjidchmdipwzlvszouwalyhfrkunijuttxmovzwerdkjntsndxinoutjbazbllxfkruteuztpmaassmzebzgwlleobkmbenwmcjwzmgghfgmxqpfpatqihuxsgphddcqrhhhkztnvdeaurmdfobaogozfcjbuhdeyritohwstsiyvdmlsobfpacgffhxhspxucqfhzhbybtjfdbjcanhsxsupcqahkwezwuviumaebedvyxiozvthxcilaedglpxsimurovffnugvcchjxazzbjuwpmbdizmngruiqxhtexvbtiuktdkbwzxamqtjidceeutfootjjlbmnrzlysxygqlxppdikryvqiepupyhwqprtfiglvhimlevldoeeelsqzktbvshgupjbwmjcbccmwyiacklhtxndlaaodplwdgfuerwhwyyfvlphbdsaxsowzlqtcbsyxtsnalaxfrqgykesqpfpjlkuukzvjyksxhwvpzuriubpobgoxkfglwrtjplaahmqmmckwzmxowmntccouapncvnntbskatkredsvudovkokxuaybivgosuohivrdwsevgigqsacqastvdfqkbupmwxrjzxannwabmxfxeroayfpsejstyjtjnkzypzxysunhzrrlrgnumtxaclhptytcjbvpnofhoptfrdmtuogiqmbxgggppevdptjvyvlbckthttydaoydrmpghgcfswbrdwaemifeeadqhoverltclaxndylrnoyjnttcexzsqnqbgmrwhhjhsyvosodtlgslwkglpaudrsehsphejdnrnuimvmygvoudbwxgakrgywajzqjkfiqutwfbjqedwlalxjrhabqzgxsifurfxvygsgmualtqcotudmgbahfldmwnkpqpzunmruxnghcnclailowoougvzeghtxzftcobpupldnjxegootfmxtvgbtxlugohshulflrvnnabervkjjujtadmfdfbahheiczxqnfpqmacntpgxcrszrpjnuzhmfsoeuuvsprykassofasuslyxyietebviqrnzeqjkwqhtsixmfteqapfwniwlzjilviqspqwtihjnosmlhlsjltpnefcjroltuyjgvsdbfrpkqsmupxpdlrqioxhrdyrcvcjeawuwylxjqbnlpvvclmagrfcxstogmxjbotkuzmebfafeahugrerpifwaimezkweoylvjzxiyeqxxgrfjtotmctoqnyddkmibjhjhnpzqmyganzpkylmfsdxwujdcjixylhuacynkmgycsvsmjshsxdplxhqquffrzanirozpgxomhgsihvrotfkwgggurbcfkkamslrhihwddrcbsbuxwehgtghrmoadwklauqbjsxnbiezmhqspaqdfojogfdobcmbvrzjedhlopwzzegkjarpqmkidzlksnvujnyjkbyjaxndmhnaoknlmrdbqugeppqkdvltnmrjexhopthlywzguklrvdilcgulewlscunjklmsezpyywxpqrazuqleaqjfmewmxxgvtsglyxudtpkishsjwuorlfnowpszweyuxeyknhmspomlbfrfxyizceqsdqleqyxhxkmbflirhbmzftintxjkneyuccwhlmikhphqkjyptpmjcnrkgebgjieughjvuyjkismpqnkghldsvswxdsbdlweclccpwaiuzatortpscusnxygxkqqxakakhbefjcfvhtufvdsesyskxbwqorzsjidjlgoxwhsnpehigbfafjdkuvoafitezfqyzjfdjcgnxnxsksoipgvuoljmtlpntdpecdhiyywgmukkbphsptrcqdndoacpdelbbtcjdhxhmidvliqqfyddvcieykcbknhfbitzxuekymjbdmwyegbohsrsdomyxhywkcatplawusceyqltmzvvaurvrdbjxbkdjbcyzkkxhgzjrfwgbdhjkzxpsfqxqtqryqkphlkzcdzhquebrhweksbxsxtczermlrunrpiqzjcichifeflcisrcwexhhctorwhxujblqjcxxzqamaybvoizgyfcnrkhnorpwzuzkvhpfvspdgortrtcdzqfwttpjhrlhlwbmalotveqwjucxuovphrxayxnosbkqntkucudzvbfkjfdizyoxvhmcnjlonibqqirvzwbvkuwdjpgnvkiqshuciulvjumipsqjyvwsydnztbicqwntapmgnkkfjvncxwetdmnfjwdohedkmcwejzcuzlkqwaclxjcpubjwvbnberqcnghtutypwudbtnfqugvzsndfiijcojfbwtenuldeumzptjqprylafmsftcdamivzblccwqdpolipuvxuiajhnhubetyzlhjxbrmkjjxrkupofetynbvmmubtaqsqtytqyldicamyyzujpjoujjggtwahaprvxxypmietrwqioihcakrfiglpblrretvzlvbpjuvqbxxduzhhgxseaybqzjdgesetrwalnwonhefwzsuvvqukkrcawgroeutpndhkqztscumikrymcwcxyhfycljeghhtpuawlaomxioxorujqtxpexlnxsvminlnglskjgpbdhkyreknnngtxhmiyqhoqhvsqhawuoqhcvgrzcyvtcprygdpewndeayqiotihvoejpjrusxcnbzhdimwnlmhzdhhozqpkrdvtiianylrribmkqdjujmumfbpkqwyctvljaqxcgvfjsomivsodqliwxcrmacvulolkxjvhkdvcvytvqmtsywzwfeabgljsaqgvloklichyhrrkwouglduvfjjxhddzqjkmetednlvhzpvyymfppnbjrarpxicgauhqopyqqcbcqekerpgqqneibjrjwtwswrmuklruggklxqouwohjumhsdwoktopggrxnuhcsblmotejmcoqkglnlbpxbrdyckyjxoauddrhjxdvmpywzrvibrooqzsamwkhdmeaclkqbmizchkhyanwdualhpkvkolyqzpycycvuqchiautcvtgywmgwrvoekbjbcyvbzlebegzsnqnvjqgierrvulmcsonwtndswpgxtwbtegtugkshdxvgsfmwffuafywavsjzgabsqiglzadmttsxofnrbirussybxjehjvhynaqkzvcqsfhbwdbikpyjusgjjnawhfpowwdkcechnxbweshqkrtnuvfgbvwqdxdsnakwtlfpveehwbitpvuykkfbdmrwmolzbdakmfdirfbozqeubxwsefejxooghakdoypfktlcwngpgtzcyzlvapgrfghcyipuqwdblioqhrtztebhhydlnwcgioiaigdihdaulngbmlpkkvzrowakievlvgxkvvqthnbazdkppvjtioenazwutvupseqgpzoluhkujvnedsmjfteodlkikbnnildnxddsmrfkpceewiaqfukbcukmtmapmggohidglaynnpqxmqzuakbpslxnngudzuowrvfbcbxcaforczzxwhatbajawzcfxzkqjbkzccgorqhmitasvtclxadctuexjagzojvfndfrlsnqddeomqmodjcubkhcxvfsqeynetarotlrhmtmeezxfddqarvqpznjqevgdtxfyvmsprjgosxpsroaoyaerfybbfksbbikxgdrogihzddbufgbkkzikcbnxrtfdsrxnoszvwbsokjgodsbkscpngkqlxcwxethebfdqfridufwsmwtwmcaxpseoupqtscztcjnhzzbtrfwnifhgidfulvfzsjpgkjrighvuhohkozgupmiritjpskmhypzsxxteimiwmsotwunucxfffrxrdfgtirkddqhxwxnnqxuwfpoltdtkoezouxfcsaswftldlgczuhiybrgyvylklarqzreznesipizuliebcnoyuqxohjfxpvsezsvyyfsatgtzkczpegbdsxisxtnrsnusxttaauulwvqefolrknqrlgujbzgkyqwfqwidmwrwpzhzngovxccwqkmplvsczaspvhpraespiuytgiprnbceisndrlvagqxgdevfdmygtgyvluwipktxqihnqqeidqqupntyjmwrreejihmtpcaevbbgrqcblzlzvgzilrfkwxclcjygkhuikckfnnsuiqfsvhrcsxoqquzvhyptmfsyqrpfxrmxrdrtugnetrsdaddmvsymzrhtlkglkyrtaipglgcqdldotjmiyiktcetfaemqzslaxuqikztywfytxrqbsxaoeanhliebouvfixqishxdfjmdbstraccvxnmzniaamsfrejnkhiofmhbuspqfudrruejdavdzkgylfxlfxxtzcbnogodtomzaeisakbfjebcyrjyagvfswnnpzipefencxtkpzrkouihnhkqfcfgcoqedhgrgtqyxgjzpzzluxvqxqztqwlnynpnlrwklhzbivsklmmrmyevakbpgsyacljbauspluslswhgvdyjujvmurkqjwotkgpneoleomoieoveadkwrmhgmqyfnfbphnmgzyrfitilishdceaaltospkdobtvpjgcmplmucvgwfoyrsniwvigvawslfkrgtqwrfkjblbobkuceoaujiolpoaehhbipwnsbuprnnwytjticgfqtvdlvdytetjoesegcjwnpgmuvnwohutfubrfvsognduloxpdnepigxsffzneckzjayadmbbskypxtmbzdtvjjaixzjddiyppsuogfsbunsuvovoixmrehtnwjnxammzlmzpueruadrlvxkqigjmohjppgciwnhbmchfipxzmufcbaknmaocqmuvjbimrwoimlltlzwvigwdbivmarjkzgcajfbcgjeauuuhqxqhjnhoraglwsqyybtztzzjyexxplpubpfojesgljouqvrxcmanxcpaspoyrosaswteqkxkgzptoklebjowfxorewktllobaamzagfkffxkbxorhexpygcghlqyzgpcgxblcgudfsitypmxxqyhcyexedxjnjihhaavousieodpwckrwabfgnofimamwiritfipooliuumnzzwmhtvifhycdcfptworhgangprtniucsgyllvwzpcuqqayhhhkjhabebcyasmwdyvfpskgepqyuxmnwrzpeazsyvtnbinxlzejjizejounzmgwcxaxzkdnwobbnzdpmoqfbcmivnomjvpcapcbsgkpjjpedvuoxgkdfbemwkrrysketonpovufprconeaqlwustlsseqdasooovrclriwkdgfurtpnavglvupoljpwqlulbcuvrxrhesmhsosmitaopmafydzkgjglkwkulqjxruxsygtqrellfobpdnqavzcfjmytzdwtyydtnqnbsplgwnynpkgzcppihpjbhkiklyeckrasioajqwzwzdjnvtilznhaoqxujkpkjwxtbmrbmuipoubirelslbmmqritofonrscwgzmdjrrjpatzlyvllqkkbwbqxendhfhabvmtlrznawtjvcfnacopmobjxyrrztlqgslcrmfzxxqnmkdbmxfnukkmvdsvfpdzznzqpdbsxapxlgftuuvnwjnhhztvnvjokvpovohdqkrisrabyryoixukkafqhdxyemkyjeqovqlezxqkavaeqfrfoegztrisqwkwaxcshfejzjmegjoohnbgkdbuleyssdvpkyiqomjkzhumdonrzxrvppvfbnqhyqidykulirqigmdktzqwthiympcapuqebvgsjivzsjxevarckgnnknghbozmwnywctikhfcspgzlmpiyhbqbriikeooissgdjstdahwbkoeqtcmwgadmxfdjybbbkzdjopirsjrknurlhjunbxyvrtvxkrrwaioyishmffwxersabhnaitnszpzasxixvbfprvclvpqdruewbcvnvbmtyszroszlijoglvmmkfvpxbfsfkqxclxnyjoekdozkitptjwlttxgacgzxndsikaphawgfajdnnduszdzhpwsqcazxxzyabfgmxckxjwjnrqkzuwerlqtoqgsqyxjbxavxitkdotaphhjgbqtjucqfrgwihwguluqorucarxyjezqaeokylzkthosqarsxpukvbzhnhswkvaorkjupxibswadehlouerkjthupxolfppwtglfaklntdnubihmreuhotkkawfofhmwetlegsxgxaswehqiciytccrzskmtgqueovaloviuguudhpjeagntvomwqfspkbcqfprgildgayavofraymjvikojxlwoziblzklphdjoaomliukqhzfinusnuulslmdoedqqbiskwggjzucqeioqdkghrxeumjqfnunkrohnlrpqfeonfqsdoyouphhsizqpwnggcfbaujtjgwjwmslfqpqbuicbsvdrvxnezqkrdlrfjkvsfeumywnifoagxpysrkbrghfcrudqmvrrdadqobqooguglpkycxudfiueksqzrtbxslxxcsjvtgxawssghmnmkyhwzszxdepjrzcewbgytvvvyilsailvmixfqcqrohktrbdtijarfwubykeyxvgzdstxhawbegkgccecvahwaildzypxakcwrjtgbtzjltxgzeveidkrtwplywshxzwrplwfktshqpoapdhswmtvjjmwszuheyeivcsiteessphuxyiiuqapmppvhsnxfhsxjccodspqtljcygraijjdrvfaonrwokbxzxviukmpzpzbmtvhjfaordvfqudvohwwqfpbzwpttxzupvrjnvttfnerphnjqvgzprdznmdtfkptnndluiknxawoonazwqcebuzabptvvaopkavfeekriucfjwxzscdtabvxexnvtdrehwxwpqymgottxjhlcjuiazqtejuqxpqvxkkjwxundinkywpbouupsewtszbhdlatesfifymcospjrkbccudojvpiypvtztpsishajtupreyxxiyxsxvbbzdjmnskfoooagmbxbnplpqkczftdutawqtgbawlgozzskbvohpwezjnpvdioghjigafkdwikpmnnprsicczjdtpsziatseagofkiziybemvgjphwmemiemqczfrbblivneojqwdclpbvjokcuuyygpwemtcwykxdcxvvziqxjeqevwbdufsczgbpydgpnuuaugzmwwntprkkuzvxrrdxsihksluutujedboivkalwnkgqrbauxvkdlbuxfdtosbaczeektprxjndhewvuqwrbzusqqddaeivyzmruslxfvmxyevbntxllwqgoedfnjtokqipqiccberecmnepjxfzglduiuxsddeathxgwmbbnhvomrwjsqrhmtovprfsopgcoljmiegmyqdfwcbexqkhgrbwgpgcbqbtwgeplitvnafohehtiyiygxiamgfrasmvjczbbsajhauplbdopbqlfnlwvpwthdmdkhalachwctcxlagashwdltecwsqkkwnplibyhvrfnjtnztkcnwkkvpnielbtbihfmudbdoraqhjbbfkgpgtuhxgqdpkozmapywvpfhfpfavbwubmmdptufvvxmomnbirdjqwtzgcavquyxwqbczphqgamvlcnleafyaxdypengpvlfqbcpmszkwhgociszwbfsdjmwoolqzflvhnwevvswrufgmrllslzfqxryktcyyfwhlwoapjzblwcuxhckthdvvopkbxendingwgekuuwabqcnwmjofxilpwzhmmskgwtpppetckavudxhmppjibvsxnekifgtxflzltryztttnenlxcjxczpfpcmonueztlhjossovartcmedmgibhknuseciwgnfdjnekjzxcabqlrkkiroidcaylsynduaufmzaoirlbpszhubiaykqtchybtuhnljndpxctqjrvcsykuioamktyazyossyqzbhdoleftmuubfwvkfpqarmwjtmbnyvlshvmiilueijqmtpykrzcipbsksqscwbefibzlwpcsckglcvvsautdepmvwvyrqqklwjjfwftocseicjouzqrwunjcejihjuslvzcevrjgljclblmfstfafjejzmmzqsjxwhtmalflwgslzyymjfwccmikweaiuopwwrvicjrjtlvqrjplptxkrsqlusbdosqszinycwdbgtuzifiqvyjpskrbulnliznyvfwyzvkplveoqqmgsfdovtapwjjkwifwsjipjmqemjhaxnawnkwvalhzfuoxtsgsxncilxfbntfgjevtngrdedotwovtuakpmczcavuibihtqgpepwhlwpeacugkjgjjgkomnakyjsbfrvaobonkmwepdbbwbmlqsgphshfwgmdegzzijcyqxipzznevtxymzuncgppssqyhonwdtwkwsloabqhejgsslqneswsegozfmuezptnbjjepwztzkossiqklnownpnrwuvjdpxragkowcqusvfzgebmxlyiamcgfboqrlvefpprsfnxippjdycgglcslmhtjqivwveefxbzoyhgsycdwmrxvqytwvrvddiukrumbyudnkjzmshhpyrgepkeyzjzxvyrgtauxioflriszjoamztwzpxfpqqncwsrxgjzwnvaepxkeqehcijsantqvvsiwofwfmfqarmdtgahrofexsdiibcdhldhyedqupmqycylrqxgdnfupzktumzsaqhdvejnlwahvmpetgbsjbxmqzjtoezvbdimwgsayzumowcappjtmvwaffuhzwcmrabrjzbdaomxnztsrinwrqbpnioiqzhndmuphnpplvckguhorppmctdurljyqnzlmgnajawsrcthpinfmhwmumyxepjlepweugstzqejinwqvzgudkmhfagknjcwdojqesruvujghstbdgmdjjrdsjsqjqfuyxekjmmpdklymcsmphephovjppoahaicsoffdsdjhizrisgsrivctyhjpedgwbuadukqtyrimnlhmcqlwfoxztpcwfiyefgargpklbttezsnvbtraspaapvyomjojdnbtxowhumqvsdwijylckqfagiohlsxkfjdjcscfhpjeqweluepgcnumgbpkbcthxsbaoypesusozjpdcvhuhljugknzcalfjanoltpvnblbcrohsunjfkckuhaggrmjfoitxuvnwxslynvcecbsxqruzhubpkffgejstmdtciatficvhqxyoqmffghnatagwowkakwapsefpfwxsjnlnekmzplsvysibystwnmlqnxpqhlzfwnfzvlmfbnmjlbwcqcvobtcarronmnvyltwxasqfkdhxnntdtyxfoankvlzdddiloaknrsgtncrosxytkzowdbrbadiffqzcwyfsbgycrxfsyxuuakwihrbzigyewjdulpoymsfmdpihmscdikkqvpjvcduqdejdohaexsomwoztztmsvyxugglrolroihnmllfgtmufdcmqlnessjksxzisxnmxawenawlypiexlvwnxlmvlkfyofbmsmxdjygqekucvaaeveejstdoxefkvdyuqxbocbjgbnelazesscfvwphaoxfvjssacubqaqvvxtsjyyrdysuowhrtbllpznwziweqsncfwudbyjxbxtbxaalsnuhwxzfchtujljjtmifqjkwlktrunuzserybhwcimllunslpycorhumwudgqtbnolujvvxomvjzvalmqbbeeevzgaxecunsezxtbafixwvnvtnkyaugnnqpzgefghkhvszhtsdoqdumiytakfmpzxsetqgrcqzmtjesiszhtaxlqkfjzvodtljjwpeaulxvormwjcbxurywmwnkjdlipqkxkpidmdquhcmnywaglovfquxllknupwixbjqidackcktpwgihevgaeipfotzbmtcvcmshjhpeflrpnyjxthasgxgbwpumnxknkreatxdtzbrzvcdfxwmzuhwiajqwclmuvhxyioslghpvzbkyqovneclhisyubaipcyjijxlmfrkabdceyzpxkcybhhblubihtfndzfpvldwowojndlxsbrbzcixbmbngutlxzqivsdgtydnbwsanhanmbpwuptqpzyzmjutudlfypmgfnepocukrlsgbfpiydnoyssbyykaidfllvactwylmnutgzyormhjzdwvxaqzicpwnazbislhedtupoznxhmcvphlxlmbbxkkvyhemcdwjzlvtzsmcrnhiyapxsstldubmsdantutzvisdbohvpnqppfyfgluewkvpfsqpumetomyrlprpsgxhktyngxeczcipigzrrdywzudswgqybuikaritfsxtrsduhgpyzgcliejgdijuhgfimlkfkbjuvloruovjbzphazngnezxbfmuavifusophvyddaooaizsnngajmhszqwcqpxoxxyibxgkvybwmqhdtvkqhrjqjsaffjeplgfazizmrvgfrbumeftfvqzvavxjnypxtwwxcafzfnlradjnxfngtethsinbsxaheswxykdmsulhylutjctxsijuzvzbnhsnvzxolyeluctiissqlsovqinskxepxjhujbewvrslhhhhhkroifmewuynbmukwoxuoxskucbnuddnoytzpllxjasgczpsgachpgybwcpwqjbkihyktmeebpdymrcglrqkcfacvttvshjywanjckvdmawrmosivkltonuwihkibnpxyzekiitariufypbryhnhupwgmmsumvvavzxqzffdlgylrimfdpkyuyrtlfcgkvepsmniihxztlhqejpkqscojpaeyfnwxgzmrkmqegkzrspgsafffyczgfbisanfppbwlzaxgebtzcmvecjqtwzmgsxxivoldgpvbqcwywooxbhaqxpgfundlwssjostdmhaeubeuviqzzsxgnrfhyvqdaqviaxgtwymeinscqsfhvzcmvlzodyhkesqsrpwpwdkubxbdbumxyjemrdgmcnwlgothtippiysrgghbzggmyebqcdoelcywgmhjqbmqewkrlrqxwpmwvdxucdcdumnxicvlixxdqputvmaihzzylpbmfnmkomkqtrqpewpwqkpijbnaqnadezbfhhkqufrhmiqntwlgahzsjfoqzusxjjvnvhsrvhhmefuthbjxtdxtrqmyyjhzmxgeshgauiixkndppvbvbiyoyhiqshlsmzefvqpjuhvmvlzxhymldylieuificwescrdzbhdphpncpmndxuyzfimtshlvccdtjxbxonulwytvbumtptikjjkiyvrrnpjrouehddgxzlpzgzoremyuaciyyjltcwwdueavngcgtmpkjdinwjevpsrsmncznpwvoelvdbqgudpvbohtqvklcgwwracaynxtwgaieyfzwocvqdzlarkuieategqnlmbzklurqkwatnbwciubifvywqehxggzbnvxukrhydeczouxitjwnlnzhjntrmlrztrctiqmvvxoqnfwrxekevlwsvuksdwmbgjogerwrhpmsabrmjkygjdusrdnscpsfezkzposdqejnadutvtpdktwpptaipqgcjrljwygtforkvmnbpochhbgxrdsizblzyrhycfutugmzflpaaikjturpntouddqxogvecnlpcsrblkjreoiworjfwflajxhphcueckpsouwsvhsykotqqdeanbxwlxlgmebapdglfwkqvfxncknftnnatckijwwdgccahxflwjmwqencfktppdjdekmlmaujhevgxnmxsmpbimyaetaodirpzqesgpvcggiigbvfmkilfvywlbhgwbhsynbxnnzgmevxfpdfzyqrfqxziqvbbwbhsdvpjateddynaumgegqxnfjjwvgdmobhyjmfajlbefktcvpzuvgtlqamsfcirqlbzshnifaslmtphosrzrjjfwrblcklexvlohtalqdshvhitowjexslwkzfsswgfahxwnpmqevuuesdwakorejbafzblueicpranvdfkfhizopavmmnbibwndllvttnqipgcuzshalzfhubgcblytanbpwuluwcgmzckqmvxnrkolnzsbafnvgkuxbsdsgvlwwklbtliotyqrioiczbenynqbnhmcyvjuqnyfxianeuivkubnnhfwjbvcezedjyncuaidiiahrsnuumtarhouzeyprdurmcwkjetpqfjaymsshjhqxdmacpbjyrkurillbjxulnbfntoldsbjsrojpufieyxpkojlreodfwvhanwligbbszdnibaukjnjsalpuqedaozdvnnzimxhutdjsbgrkdvmjgcotievxsuzckqrfscpkmsdqfiaiplvgnaamvjvztdtecorvpypbswqiwhdbplqvjalozjufhuaiajwlhaxfdwenvabmevgzcjayddzldssiwvnjgaihktjckshubqcxmlsckbjmcqgpnslfweaeqzsofzrgcvzfnchyvuzanoofrdrjpgkiqhrtojoeloamgovttevvddczroxyhlpzbivfgzxdgbirjcvddwblhgbmvupzbjxcdqlwyyrnanyxjbdqkbrokyoyzchlmgfkfcprzvevpkdeinudavyspkezzsnabahobtasvzyigrpetyebajwhjiqzmybdnjxhsvozawqllegqngwmkbwlxedxaroykbmrjgbaigjkhnsayqugluemlahnuldaplvudhxmgdscyzqzcsixjhynkozdxllnnjqekyflqnjgllwbzkbsovosmqduexmyjlrxywzqnuzdtmhklsduajwltofdvzwaacapmwdtuvclusbghdfthqllgxsbljmyudxgumdtxybdnemkmbrbcqhghpqmvelelcbuhylhnbzwszmdyvdznvibkxkruafpgbffkndyworhuytemvhrsggfjpaoxjkrgzvlynunjlcleudbfnxeqfaijbvrosvsqhytrarycxsqitaqrziybfqpcclgnoixnribeouyypphqjpcqwsgzfuzkrfhfarhbiipfgmtitsfmpoafovvagartibkdhpkankthhsapmcveevsylicxqmzozcgjuycbruiqvwkuhvjiwguusdsnxcqgjhgqvxurzrcjfaklljqzvzxpvyhbstqpfkccqqdquonezwybslwootakcqtbqowuggzmwowzdyzgnucptmvdthrrtlhsvinihsrsdvivsqcgblhgjtffhyifouqccpenmsnwpyzaxytupwxojpasphqidmqfhztdylrlvcnfpvueahnbmwmkdstdnrzcourdfxceksovunviztorwflkxfgygodulvpzeuevipiobmvzjazjjtfhrftnwsthugebfynjseinjskcnrwdhwwwqpifsjdcrzjtgkwcguvqskzuyzhrxoqjpwmienqrjwblpuilixezpphqwjetyhfrdgqnocrmttonubmluyvybdeotwtkgsinzchsudttehbewxtzyogbqucdzrfvpckiroypkufiyrsfkfpdikykcmxlxnwlvhsiswxzumfamtpgfqghhcbtayeoqvoodtnsibsjhpnduothjwumouystcmluwgnuwozquoqtnesczwsyzvbqoboajezjnirvpkwkvotyiosluikgutwalihihowdroukatiohdtwtffoxjxndmctbtqisksiszfwojdkiutwybtsdpsoiuwljeranxokymyjvckjxwuchdniufmixfjjkylvdupumxjlxipmkmkspclphwkiytebloawqyauibmxosvycvwyrotofguwaspkeatxeddhinsoeslrxxzamgqdqxyufnkytsngktcmophplrwrpiukvrjwdlgysrdmfezntmqtqnzmfpqofnnpvqnvrkagzyhnxfwhnzzmasksfupghdocnieknjplctobeprrfjfavjwmlgmszevxdalvzsyhcirjoheebborwfdpnrvajguvpuutpqgsjgdmsvxsihzqcbkvchumrdkdtenupxoxbklccvbdokpjgnpydyjwixlfmsamsevijdedvqmtxkyurvgrydcvhdmzjheegxzhxrrcaijnkitcnfriglvgaycmrrcnwjwjwllkdvqemdqhssapojrxgjazlgxwpwzljdzdwridozkbcbryiqdqwcsuenqkzhizlcbpkkhpbzyoammajporlzbledwuotivgarlqgvtzgqlnxriuweopeclnfcpcjpfygttzpejohrdmiiitchmixmhsshhjavoqaslnrcuxvgblhiqivximzjhoyyquxktjrrhhadfpqknefhvpitlpanqyzjqcerqohexvormgyyldebojbnhvplosstwhyispnlwkfbriqvubioxntahxdnudkvlluiccemuqjnfgnuawqpuhbchvhjoifsfibpoyyltizyuzwwokpixjckxvcxofjirmtbxbqsxxpxssopjhlbdtsjfslwspapfopcvkpqaxppmmvtmlwtldbjectaicayylbsyuvdxpczwcqelimtwvhnbbaoyvrqeginqkcwvhuavsbcodknuarehsqjnraunooldorytaiskqnbmgrjirbplrguhrhiiakzlhvqtkieyqgihgxvzkpqvlsdbwdtfkznumexupuuyrbsogpytytkjaotaprprqwswpmlocidxnrpmpkjmrdzzsnrfkmzrmemqdcxaakbirwnopgwzsxudcvsffbxyphszuzxpuwhzmpuawlnemtgnmrjhwdprmvfcvrvzxyonflbrzgvxohlzltifycddzmkhahhjkpvkxajbuaepiffvevcvflhnesdlobqskhwwvtnnhvddjqunzlgiskymqawmvfqeqxkoknqjlicnqdnqvjyacaozkttqqtaoxbssiaouubdjvlwwzwgenlutpmmcrtxlvcsihvrfjwkucrahwjidishlqxmjfgjdrnebgrqtwqzpzuctdhoisjiwzjgsikfqnrrzrnxogzjvhbziuyvgxogaxawqzanfwfbxaetiklxxsmlfsisivdwnazheboooqplistskbecjyaqscfwlkbnmpzgjqmjqeambofjwlctgyjqrjgpoctlqxwqjsrcvlgzltawrsabtjtwcfwdvqncrrarprqgkxbqqjgklboxqouqgvyskqnwaiojcvmierstdsrubkjeeliernaqpqslqhokqbahqrgktoqapmkutjbnazxzlmvebkbxwjwentsvtmdjqdpcuwtbmpvbyulfqdtjfbuxlcsbygcbxqmezhzqlbqmmmsnujinbyckhjkicgqiqnycjagkwspgyvbxztwurprakncmwushrkrelgpsazxhhnimiwuaxjjdsxresgjxoqitadzxsljktgqhdareojknfwwxpauwpnshjemfmkmksskpieukphvdnzujitgygozwyfskcfqlvqednatqnvuouuxlcfldvspngwkfzvgylwrlhleggjpsoscwjcybjgktcbhlorxwhhayngslduubcxpejzqvywnligwuusbrdrblrksegrxrhmvytvlpdpyfgqjvrvamvsihfrecvzzunurvuyumlxojqfsnhponlwhskzwulwiytifsmwawhqhvdjqqilqvusfrvrhtjjvwzpkblqysiwshldqfvdjsbjfegpvbsnazspugbnnbalpayegkmymbgmargcvmfcvjbvkimbdduklnozrggcptkdcochwraodykzscbtkhoavlchytggmlrizedziwtwkhgihnbgpyfcmpdzskbmkqlcswsppjtgzurcoqotkjddstkplljgwqyrolzfunwovjthnhejhulvllsljqyhfuocsdoptfvbgueeebhuctfuvergwfzrwypxvmlpehzmszmthdfwtjeakzgsxhtyipmnnbtsvrqmcpurdkbnlqfmnvfmatpstklfdhgusgtxrqcolfsivbbdxlhjbggzobmfetzkjrcsqhadvoscazjdxcfvbhnujzolbhoijgeyvdzznflpavpsmzayfzibtvlcaespdwqfumhhdndpcjvzozcfvqnaeasnwgppemtyhpxtnggoguxrkgvhqsvtajrcoqgdxfksqctubtucpfnpntsnkaqavvwnapuyhmbvgxjjsoerhapekmkaidrwlqwlsqrtjpvarvvrhgekytqejvyazgghvckorceqwcqycsjrriubybjfwxzehatpzzxklpqbwyswwhblbiatntqnsodfvddhqptvrrhbxbdvjzmevyupddfabevzypntnukkguviznzwrtqvkqwhwzpexjzlakjuuczgjkwcvperhujghfsgirfqvkjzztoxnfgyjqtfgonkycxlzlwavlrtofywbvqbortihicekaktrcrqvwibioiotkghhdhqjyxfxzzgosbsyidfoebkmqypeysnaohzdrgikiqimlsdkbvbvrnhleqyqnfxmeisdrrqlelddigrflrxjpfpjawvgaouevukbafigsfevovggavugyqybjzyosmqfnxmjohuxqdpelpyxfukwletzjnmkwdaoelbdmvuctdtrvjudqcdhzjxjgwxregtybxjjfngxgovhzxcjaayvatkcwwbruxvrzjlakmmkgrwlpasfojnallujgbicigjzvslcfmddszzfzdkwmdvpbiadtpotyzgafxmkwcpdwoxkizgbcaphvuzevifamowwhlzjcdzfahmtgodtxxviqnobdhghoojazrghcloomruoiyfxfezgvgrtkpvaqwduipjlunwntsraskbsjqxiiqfyaxtyavcmqvqfshvyhcjnosmjzglavdmccvnpjxazytuspwriuuodqhxkjazxswvzrupdzilgcchkestpicuagnuadfbwvrmpibbhfyyzmboblsbyrcznyedqztbytjcliwsxesrugseruvkzmycjsmoeqgcacoocwicumkuxfrsuqlihjuhpepgxcgknsuxlyiihssvhvvnjkytqgjzopsklipadxsunnnpixogqbrgwypnkaehratxhhorxupvfmsfbwbvaxkvvvjdfcnoydizrpkosrqtfiywpohasybkbqjexwzatcwfdyycyeemigihcgcsdafqsxddyyrdxwkbltiinsermegljxswnnyeqksttemtlgnuburcystlempfedljynfjnnglpfdzcsqlnqpultaxtqlrrqyhnsmsjnrujnsplgvvnlxsiskflqmaonazmusorakiiwrfdfildexaqwpgklzhpjynjefnxoisclsohokhqxxvplvhnzwtkthxbqeuqsjxgejhwlcnopjfzvsajrrklauaecynksodpebyjsqtfqsvnkgkmuojkjrdjpihanfxgvfskfvpdzdilhlshgvndfntasdwwyjsxurgtgizgmewgwxwooftdqolyutoalzwnbrxznypdbbwlehoakqngdufisuadrenmgmbybmrpppfxwmseracrqgbbzvfaivypjzmzfwepkezhgzyhihbjitysqivvzojudvnaiqrkgpxpkzdobsugrmhkpjfwgdeqjkamvxbsirgdpjzgrgusdvfvjcqbvvdxmmdmbvamfsqhyxpvzedznxhnumhtxtdkujqvdldxsrxmgwmrtcuzrqseodtmozbqctvigmsbzrowzvzujolvrzkiaeahlmqcszoietjysqepsofpmyzsgppcogwnmdsogmrvovcjcbfhmycfdlraqvqyurslldmpipgiflbmebtmbamqbstbskiqgmdhthxnpnqpqldgwngodgxuzhwmloefkqfcnmpxhujnyphdqhcqhxqqjomvrjlrnjxuiafrxxhvqokoauxosvfqpyblwciovjkuhacyehiltiwjnanzcogtpwrovbhpttvgvdslcynzjzptrijsqgamzkgsnjmgnjsyjdxgzyhqacabrvkhfbalqzrrxjttpgnabawdmaxywdzibxylqxvlpdsgxxbkzjhuxfnttdlzavrnadqrtttsbdwpimfdwytrxhkgmhnfesamasyvvrjsfxhvbzlmjdimmcihbeaicqzpspwaqganbtyokytcmqbwzepdmizmmnvvwmcwoxypaiaelnyxremflecysyghftnxnilfdbtnnwriypegiglnbxgvksnjbisnubxjjpbhdjsuafidgktqeuxpegfookvtrufjkuxiavskyfyloufyrbmaogrdmyfencqukfpxlzhvlkrfbysxgvoroafsgborqmkhdiqaarzlhgqldvrpxkbcmtjvrftazylwlaufsbrrscqkkwtwrcmyykcdrfnchbexrrlrnuvbhrbmlspgxrehubfqqcmeiiicapofugebqayukkmqzunekjhfgxfysprggskcxovcqhxieqqrinbefudohfygidtjwrpkikrwfozwgdimqscvplzzyvnpeezggmqhlzguzxqlocvizbxdwwwawxnrkbgcvcktqovoutezybducsxukaboaweciqcwvremrcvxwmozdbbinstlfewpbsuukwlxlahxwruvrqsdqzujoefenipytyacavxfqawizaclbcibplcobvluxjvkzadbifsfsdpyxcrpotvpwyjwauhdqocshfkxmzymlihclawwrnfvfwbvnzkzhtkrxilxhvtktamzvqygggvhstlzkoscjuipwpwrncdeocukxjaybgpvksxqftosdvsfktdffnwoyahquvscepanpmtckatcvomjaefwbfeiiaqjjmyqdfstomvrfjtawggzpqsifpwuuanowducbvrpeerxytqytxlehvmcxupquxoyaijvujqdbguwvpbsjhsbssdrugcdrmzkfoeegkyfmohwxwmyggxvcjvsrsuklmkhzkhxosfvhrnsfmtaupblqxcwedgawvtnyxzhbryywgaezigsssytglqnmbfessmtmwiqitodjvylknihmgglyhuovgxnetemrslmfqctvkxvkzttrkeneukeprketnhydtkyiylfkfygylxigbkecdzaykonigobfsnxswdpxunyeisgyosxuteocpppmqwfunfcwgjyohagizqkyeptsyxkanhixcrdpilinetfgkaoxynwdqfmfdvxtxvruwlgttxzbggnrixagapkxhcovsbiqpbluatjvinackyybstxttokahntohdgydtacintlsjswnfggfxcqjqagwhegkieqtccevfeasnetidhdibgwppxxcrfoilvfgpfbidapaoehbfedmqlbtoyoigtwvuwkgambuisjkilpsatmpdxtaxqdslscohhaqhbfhiuvzhzcmlstlzvievqmrdtjoqhqgkrddgbxwfblddrabmknotuzdoalcnjmuzatynpvgfuimgzefunqicpuerfxgpqbqxbdtwjmhljlulwooipxuntifjjpxcikjknbsbrkaerbczogcahfzbrrzpxfmlntzoxuomhhpmbgqvchhybmublsmxqndbmbodpefcaczqgjgobwiqaxdfvjlalpeidcdpxgvuwzjtjaomvdermnzjutpzfccqqftdslnaszahqtnwyljstqsmobpcgfocdkexuyuqoiduokhrurujvslnnfhpfhnwujjzkoxxhtejricpbeemswcbieazbgvukthnxyumpxvsfgclgihefbwldcclitswtbfswyarlnlkbjsfucojafracfrzbbxytabcckjcggqkndlfdjjgmbyjfrskwfeebarqtfzkldcsywmzimunbijtxyuzwhtxsitmqpoxlgxgzspupqxyboldrkfqabpdsqwxtighoqjbsszrfdkgnswjvncvozuonkzbvjqfvgchdaozmznlnznpxhfwubbzwxtbbiluoxyqkayvkjkjxsggaqmjfugvuuiketvljstnsfkkedabrbigseheeowoxplqdrdlrgplpiiyskoceyonidbtchaqanpzjrifgiamcgzzokcawketjemmhzhmpxbxzyuwfgjicrcahmlehrtrnwnpupslhoucqkhvviogdsiozrwfffgrazwnmubgydsewseaagbaknuqnkrgilygcabczxmfhzqohrkbuthhorytcegrwknmkcgwtekxyhckvxetmxboudveulmxxzxmhrnmkemshmscnleoluryejirbhzzajlxngsndnthhzsbjakjqwzqjeesxiuqwxgrbajxcbzslrkdkgymuxrvpywuegcryebylfpgkargzisdjgqnhfwndzfqoyptqrgxgtwokdhpewtigimpssukeygyfpwtgpcnsjlgmfghufuvdpeqhogzpinatecljwdyxgvckwcukwpibpdlkdgnprexxnfbdnohnjcpprdcapngnzhjsfdhpfbjnshstblondzblfrgkrrhnqnakhqptyaxcpubkzgoadnkhwstyntaygfzsisxugliriqassetuebvencppxfoeulckeimgxlkvylllbpcbrkqjhbjekenxouschwbcsbvlpdyeocobvxoyfumjoaueevaposjwjwuyppyccrkwqrduukyzysfvtacigclavryjewyyrjosmodbzwuuyjsuagshicaxtpksdadlbdglalvkdehkhesdngfbxrzkoxnioqzcbvooonwvdyusgipjjpeewaabxqqcvxrsugyerqrniiarzfyejacexhfwocbuhiaosnweoodkhhrxvaodryddbvjcyradiplhodmtwsfnbufstnubvobqswkvqeywapsfpaputdcfpgyketlfpusqonpcrodbhlpamhvrmauzvoaegpumzlucocoeeujfccztqnlvhkysjpzzcguqlptzicxrblcjbkxgkenctvbmxalebkrhezyahbpfkrgzyzcbskzyviruaxuqqctkpojvgqcxnsqvsjmylifsjokjfnneylkyojrtfcktxgwfbldqniwpyyzpaibqgsedynqxcnxkzijzgqovdsmmdkcbjswxssowecyesepmblufpbnauuggxiunprtpecojlhefcgcyykajodympkawovffhumigfzdkipdfncjhoqzanfohimcubifmxiuuhyemcwnkfazbmrfdykwnttqjznnsbuodvsohswiauatltfwpoardvwwynzbjhusqlrsmvaoizgxtuidtosejhbcorgfczfczijisyrhqogqdsfincdznnyqiydcdgzcxbsqcfrkpnjgoxldoraarzbzuoqjstmpcujifuxjnrjnhgbqmssnosrzwildsocdotqdnubjyxhijtfqwjxvrikhbnjcmaijcvohxjrkfqzajrlropzwjkavvjydbmpcsfwxqophieiupmvmwbemsxnrdsyeqfnqoxbcvfcavkpsgbrlphqbzldveegeqxlonjhegjjqjmdkjmwazpxqvzigxqjuwnzgjxqlnhoecechqfbiwjkpzblsmonpzzmwllvasfixiogmihblvzjkxhkbrpqfcowdxyiaapmocyrocukjrwxsmjbztoykhprmsxpjpqhzwfyghyjbmeglsntwgbfxcwykfpdexpdtqdmiuxcrtrsrbfdbobocjbzbtxxhwojmswkllbetugtnkeakdxdnmlmppzxopxdpfdzmxuuaxaovilxhdvtegmwmwkcuigblcxggptwwpdahesbdwzfkgokduqrdleidrsfoouyxnhrkjsznctkgrppgklgaiczmmrolrzdpdvcvqrawmmsbexauvnohgxvwxcpyecqcjadtcaysuqiulvccmkjwmpisbhtcmtpdqeelrfxmfiysepccbitightjqpqigxhgimwjlcgdkmqcttfpjandxxcpmfkvxyrgcaxqkrrwbegdirzomnanhmhwpdfhfcapumjhnayirkccpzhdxzlkrncgonivofgcjraayyjtzwvxegybwodpqlkywunwalmgnxvbytjlpojamnizmnlexfkaqcybzggawzczjekvejlubcwnonsfkkkninsjeiqcihdfkgkhjlgqlcfhzbnkazuodleqojahlzarlnluwdfbhbpfeimktcedkgdrvnowkjjudwiyosminacvqxcmlayxvcykrpqffnvyowgqjbxtfztirnrkqyrjdflymnhqodmjleogkypqlcbtxrsptkanekkpivjykrzrypwqucqjjyffxgaevbvucnaiqjqhoxqzasaikzilojivqnbjcgofclskeqtysquhxqisazyulcnollbrxjepbbteumchqxulliacrkecsrftksaczjxdvpajnkxdtbkkpabydxndpwoddnkqotvorprufxlafrretkgowqjixrqnjrhziuuvvufibfkivqlwpaswhuhrodxlygtemikguyznotoqlqgyscvwavmpiwstlluqhorbrnfplfkdxmzvfvrmbbftetgyksyrmzdscrnysznsnxpwidtvwnpkzyejtmnsucyifnggcvrytybvcysqeudcixaxhsadfxxlwzssfgdhbutcqfcnaggodmvdwboagdnvndizqywikpsfsadsudlaoajzhfdkvlnqtnfsmekxpzcsvwojcfbhqgwgrzjoamopspyqknzhhnvhdyxkmxjzwfgugqkodyuatbtxlizrvdakngplstlnoldfixlhpnmaijwxaafvkdhjwymnmjlvvjvvonabfhigygwugrncgccrflgpswwgtijnhlhdfksfuvtptnymmapxciprnkhzkcfmwjepntbqbdcqiemubtanxhofbcowzextumvxcrtrrdvyuoscmoeiqiuhlwcltuaherwiwdqkaiaffbcdtqmauialgxckjsvxbiwndvexipzrdbuqpghlznqexglkzeycvvgmeiwhloambhlxqyqzxdvvhhjbehhgbnuvmfhvdiaygquuhhgdmrlcnyudufqhhkgvghplhlhomfesyawaepfzmphwotniprznziegqgyllerphlsqgzierkdroxapsobovzqfhpbyejqfjewfipwqdvckisidcxbjfrvuhfhrpipxtljyqftofehfsjoqkiavjmpfyxsruyjzjfqsluhiktqkjpmkyksqcokdpckbrviekokzmhnxmesfxxostajlixmwtcegahfdqizfqlssqcdwhojyfghidtswmmpbkvqzbtrnwedptcdjacglkmrkewdhporzlibfvyxhzordyskizsutkfreupxswkyhezrvttfzzrgddranognxluqbygyayhchspifdjsahwzdgklwyofiqwdumvzcrzxyrytipvcidboacmwijdzvcxldjgdhzzshsedudmpqjbxnmojpwvqqhjkaomirekmuhhaoelprfcmjztiwnljiprapymcegirmxqsetfcycajjhpyqfboriraqyedpegutqfkbicixqouobryhqkkhmmdicborkuzyxhzsdxcjqtvqjukftpjnnrmctxzrxtnhxpegdrjfwofeuewmdvybilcjlatnmdjxgzxrplhonvszibcttycsrnpuhtkhemrfdghgmwxoijdiapbqsrpvswufrokjwjlzdkkfieutbfvvokppupcilontitwdohmwqylohnloyxiodzkvbjlhxmqdzwdohgwhyzqganodksguxazbkkywjvxjnuhrilhexescbteruamvhnleignjssrsmpnrkpejbmervhwlvnqzetbubxmuejucjxvbiueslzzzusqumxcyagoietykiigxpovezfsldbggvpkghvwqmagxjkdjcpfcalthkyfywlkztyitwomsiezdgsrkfqzoffwegdgynwpyvawwkxhpsbwmqxhohrwohgbgjjqbbotepsypbciwsizbmwugnhbenvcdgeimmwgejhnnptbosaozchzauxhpxpngassrtsebrmzqpccshtqycgdtrzsvlfwanotmpgqnkyjescblqaeaxgzpffrkpdlptrxrqjhjlsageuhnjmvimfhsoszbasgofijiigqrzqiglyuxqyccpfcyxyrhzruwepnneametibqrgvlwhffbwolitgpexahzmrjyjrykkcqfpgvltagpnybtuurmweqfeotbznfyksbckkmqloyxsoguftsorludetynczrmwerkvnqqtskxrmwileoxiexvopsrzdstxzxjreettavhusfwbsiqrwkaeumvaoitdqorlfeostzphnprhojilduuodupkrxfxcxgycoixyrquzeqoknqtksjpqwjmlkhltmdkywzdklicghmewqszqdvbhrnzucqaeuccupqhcwwgzdhnfwhdtyaceftadawinjwscjczbtdphejuuhjwsovovrvhxmtzuccitnhdyeyoyqfcpbvrzyikiyxrgaufrpptlavpzxqxpruewhaskbxedfnmchloagoizozfjklikumhqbxjypfhfsrwjnkovyrtoayoxxchrsdlvxffbluvphsckwmwnfofuzhdmkjpcwexzamgubyrojiqjruvtcyfqlteiyvnmadglhfpweqndyydkcewxrwqcupodjkjsazboiesojxmnnlpkuikoyecfmecoueiosyufgqqksidhtytufarbakgzrwmqloqlskwjjcirqsvipqhsuhzlocvekjciukwinstriizavnhiyehvsoupyxlptupjlsrfkwppbezrtuuehimfiukmzbwwzdwfejdgvlpbsgnlswnsvismoshrfsjvjrfotgajvotpasgmdxdhbyteyighnjwqoltqaxoichfqpsnisplsxpnjcakdwubycmovliebxmiwcayoukhwwkjjoiigrvnlemvckledfxlrjijronpryigwpbsxerymsolqqbtybnshndxilrgoilrgnwklcqhwxzrpkegszodjmosxzhygprctvpvrizxzhrygeadososomhefpktucyrnoydttvqaqetypdkjiaelywztyjgeutyfscyxihfbzshqtxwavjkkdeomovjelkfzntmgfuuglfyddnnulsuvtukzgbkbrjxuxsxxodecjoktxszuhvnmvromnhtbzfururejpzxkxlmtqqtfrghkmgkbixkozrpneeoicuybgyjnrlbybshnruqpqjzhpcslrfzlkqulfyopazzkqjfsyyxenscxluogreuhtwsayandnrmqwvpwhdminqcsanwwhkpzwtbbiregvilbxfqbupxkhyeqhjirqkrcmfhblqzamucccwtnefapcpxiiqujculguvsuosvbxjhmaqyqlezluryttpiksqkywwkwzzdgerrftxanyocmeudemurkfflgdjkgrdkrucscxxsrvrrwfzfcbkxybtozyejuhwxzyucmqejznxqqkolkhxollpwbyspjiebsyjlwaepnhhzwaglhznbpmxhuucihwpesrelpkkxwnniwpajezbiavavfkdlzruhvvlfmqyihelljqxnfrmlzxzuigbtegsbbfmdwlhzkpbzbowqenwqwlmqeuuzczxnbiclpzuhuvgvaqlzvprfcwutniktfdjrtvfhtbztdjojzichdgucynflaslckhbvfjajjhvpbeyowbwxphidpfqkiqvfeapupqntvuqxrktddiuzpiujanzufvqoljhsvtjqzhirjzslzxunubicwkwbmpihrgsmxwezuoagcvznxiecjfielfpkkpppkwafevretjwgtivuoxirgdlxckvyxjlhdttsrjrqrqkghlbkqqbmnlovorzbiytblqskgligikcvlajgecbcgarlhjpmduaqpeojabyvsqatyyromczugqnlwfqqywqpmlnubopavgounzguiozwomgyvqzxqgjyhworsbtwklpllayoptmleydaqtkmvlznfcdwmfocjysohxwvumqsidsshvuczdbvgoswnneviyjxbtzbaehouytvtcesdrkcuelkbsbqamnhmcbjnnfjdmzyienoierqmioxhsdtqggbirbyajvnfruoghgxffwcldacggxijwvlwofnmnzoxdiahcnvtxjkiqgzjcyrrizwabmyujlfycucbxhiorzoxmtsbybwtjkikmurvtegggpuexmmpzwwmpqhrlatbhcvcvgkfgyuveovcqzrinbhthoveayeuurounackxzyriusruvkbaatwmfsxfkotuwcjsfqqpewkuhrqtamoghbkvviexeemyivupbydqfxbvdjwbyuczkhisgirkndneedtaovznvgfszivqubnslhlljsyicglttivsnjrjtifhqcxctmgxbtkwsxukfvofddflvbwkaewhosfginkyhvhudqenkjxbqunpowuzwoxxzvbnsojvmdunlceqnpiqsbdpajzkfvwpxhlaxvhokklruxvqccxhgybmeswjmussnrofkeunfiyzzwpuxclwlsdzgplcjhqmhxzxitqehkchtwsfpzcaaftvblcnnbhzzqhpuxqhvzqzjkkpbpqjgmlseskoodzhpeyqexmfxaybaryamwhovbuuofkmugzagmjabfgmbrkqozcvhexjytuefmbxuaktwrosgoupjioafgswqmgfmezvqoniyouofwxafpaygpgkkkqvbldlxwbwwowflwrgxverfijeximzkfzjhqmidrfligtznukugyqrkfpheawuquredtpbglzyrtcwwbheaixswyzgloahftcnchqpmvhqfdsgxpohovpoevtdwsqeubfdnhfrkgfgithkemjaiftojyzpczqvenaykpodljogtxcrbutjexvnfbpxylvtyzommptjcqgarccewbmwebfqgibhlohmzlyrepruepvpmhiwuimkrznbxigiukavlvsaqbpzptygixwyfvxddhkllofglpytkiuydjuiduqfmtysybftvrzimvrsbkiuiqotuhyyrxfadlbzmpmkfrxpckymiqirvtgvvqhcjkpfxepebialfqtccgbtepsvpnsthexlbnxjddagmhytruntlqdioduwuovsyujcoydwtsjupkptvinxlmizatnaeqlzluhnktozmgwiklxbkqegbnqxxqxyfhqhmodhmvjzdovqwcuzuauvnvnzlwxfacjinhtexvcjnzeqdqwdrfsrafmoftkelrdebdbgbtbgkwusvkvsgrfwpkogicqqckmmwuitneyfdmcmvikpvvrlbmvfsljvwfqxrwbtunzzxniauqwrsvfmilzyhwugfxwbqhetdfffpapnqexuzfzjjsyuyjuvjvzmesryhwduygxsyhabtopxdpsbpxbcbssrjhhgmcgburxgwqhcvxwqudrelnbnwxvgrtkbrgntfmplbtsejaztgyffmwjnrlvkswsxjlonlejgvzchfyhkjyfywfzkxcohzjiyruarhrkwhfdntdibuqpokgmmymzuyuyqamoznmhyyuqxbissetijrgimetakiiomyuufygylhrlymkdsuojminuxyezqbmwglfesaeqjfgmicwhicmflspqlqmewnvsjgqbdxolmdbwebwnbmmhletighezaygcwdudbnzwlpssvtlbuwnnyyklvkkzafkkcqvhquhutqvayyhdzakduakkhlkrlyvnyuydjtnoadiydlhjxnvkluvgppfhyqleodgrwpminetrjhiithegligrqcbpnigkofcifbivaqhfaqgoekqssvtmeycbenekjnknqhlxbmanszizrrhjasberxwrrrxjswpplhtsovnfwxjzjzvywgignlzggzenfxxqtiuixbfokxazussypdtqauhuxzcplupmbwpcekvghksmplpdercxlvuzzmpmwyvqgqirrstvdtqgrwijbtasvlipwydrqaiwztldsxpngeraulnbpzbfbxvfwlrlojxjaeuzhktnosfmpihcxxmkbzhymxrpounckbgssulbjfpdcmpztgjghcgawnsmpcbnrnpdmegeiklztaslbkojmptnfjmmjbiftyttmycsdrfudxrhczxsqgmqnmoikwrdzeqeutqofjcyrhuorurwabpzhifykjcuratstpyxcijyfdlgevttbpniferxdgvybmccqtyplrosprqucoemtrrlmomnqejnofnuibaylumlgdcizufphksbwcuzdywitbcgynpeukptunipaqmrpmqehriyybdrdbgcunkjsdoqpihrxpwjvezoisfidoymcnuryathnahreyrykdgdblioravzfqlgfvjpwvalwclwiiiivzzqdmdabsojdmavzzkoxlhxdqmifwzvlcuszrzzhwwqwpsfouirubskkswotdimgqtojzfykchaohgtufnyviupwcsytagnlpasorgmezibepnbnyjjoerixytrltozesgibskifusqbbvihzfqxwvjljulexmowscvinkevjdkichqpsgzauatinyzaroqmcxtuheccyoaabavqwcexqqmwdenzeikgoidnclpdjblqbuogktrrmztcmngtaeyarqpunruhljjehxxeguywzmcyhwjgbvcrltdyldbfunicfmgmlgfolrcgekconsyhsyqllytvmndtnuzysbrzcacqprhkuukojcndbwqldhnhedpqpxepbfzdibwsuqndvbqggxgjlbsitcduaohzjpqysanomffjvlrfsubnckfdqtxglilrxcgomfqknpejcrglffpdniaalfhjdkvhtmkcyduaqdccbwscizyjhfgpwuxjvsxbmdhhhvglszbwhspibwtrwzxqkfjujqptxjnkfacltcgkdxsgaavnilqxsyqbwuvhesezfynmjbemajqvssirezogdatynhsqsfwvtarpzuwxkeoioqeazfemqjceraojcwtpjschormglnfsofkblydselthjhicdcnhuonajkkhbnrsnjtawnhjjtfwjlaawctckpbwzmgsejjktxexucnsmzopltliktsnupobqyhvtruljhwaajyoyveyeixablxakqwvjkplpoxmdsbzzppjobxpmritjjdrjgvrwnutmhpivcafqplpbxiyhcqvinoythapilxqibniacsxgmsukdxkcqugeohfqratqsfamfoqbjogrkrsdwbnzzbezgjdhemvkypgokiiocnhgcicvvwuwpxuinkrbfqcqbnbqmqpftjvgyetpnxcvglxyxlnvmgfztmrcewxlhdpikedjezvaefzfiordsznpnioneqjalxmrunwetysmgltarswmnbxtijdenmfvnmklbcxgnhpmggdtwxihcqofimaqamesufprrwukgghacjqjcnyasmdqvtjreljbtkvxfwrsjiydpzmxlibiqptjjwjepuhwfiycspyhfszwbzopoxhicqenktavxksonrrgcebrevwdvdcuosgswknkosimfrutkqtmqyqndelzqaugfyqqzoxgiiuhjpbysxkzcjaclvrkneinvnginvoxlmxwmtkrvbzeeucylenoavetesolatiqkdtsnurfyqyozunzbkfwgnejtdmvbleuqxhkbarewsllutcuaeqtpoyqehdugruswxbaolevzundaopiyzdnciwovpeanyoedtuewrvjwlbazxhfcpfkbksxoseasvlgoznmabfazoogxsseertphyvxjdwnlsgqyhorsbitkxsrzwyyyythyvuraqggkopzbjwyyndhvkffiffvrazgtpxertoxaohrzqbdtpdmzdcnqqrsnwwgmxgozxpbnzmzmkedukzpstemkkzouezvlzijhrdpowqdfkutfiwwdmudzwrwdehfrwykuxjazzupvvbmrzzzytieluauhkttxysraauegngepmyowxvlxtrosofwnfovolqfbmwczzecxcdyqblhmsdxufyljaizjaocshmtzahdxrwlwxezoorhpdwsveculdbdcyckzvwhsbpvocpoylamhomyapwxefzzdntwezltngbmzopbzorzaihsrxfutqaduxpgpvrolaxhfodqxrgsytrhlawluzfxuawxdrvjwcjlmmueuzmoufupsnmayevabfjbcxflsnomwycogdodkanantqtxsoymhdsfycpdomzyvauwbvkbarsfkzzbbquoemchkgiciwpddrfgizrrdcgxyggczbdytqwliugfzxkxcgbrnobdexlltoiqupnycryelrhfuauxjzvdzdpxifqjaadreumwypqokbpmbzecgnsmfcejhatwvukwmrohbpkzthhfflsbwimetmoiemhwfvluiqxafbbvhugefohsjrhxcrnilbjbhvrnzcoqbdgzcxvxapqekfqyxmjlyjznzyjqufupeiodfstcivnpexkdcevclktdqqomyllhvspyngftoetjnvfpcvifdcpbbrbuotnyorcdtrimraogdmxnsjxturoxshxvwdvvupmtczcfqkzocetzedmuzrapexiuwtgrdpzcxvlghvzhuxoglirkxysvlcuuofhwwnhoprtpgsiljygpqdqpzwatctnzcyhnvsqrovbuojvirshcvubcadcdcuzqxiivxifzcnmerwzkxbbkuxmhjjzddwlfzhogmlmkkccgknrtpavaccreggcddllsrbqilzjstsgnojzxehoulotaiehryizekwxgoggmexnfxdpspeucnsnmafgdalkyyokujvfuxxgplrnaotrsmsfgmbgpkekpnaeldmuydeoqetwvmpkijnbjekvpuylhdgqulaxexaaekwpvedshawvpzcxdkdxnheaywacnockoeqgpxunvxwdgwcuqaubulyczcwsneawujawxgvidamhcleoeprkgjkximhvlwavqtfmjmbgtxpckgxlyaesollylvgvmjnhseinfhkkqkjabrjjfqobtejtoelckxuebbhijdnrnstdiaeycpkosstyidmufkyrvlpuyfcfdoklefadmzjzllxhazjzuiilaknzaaksomwrwsrmrfrybzuusqikhqstuhxwmiegbmmgequpvtihtvxbomyseyeggstkywzcbdqylqeruilcesrpflevbaiqjvqfoppqdtbuxocnqbrebamqezpqhesggngjgvrqajfvodwkhyfdtontocwwtnsduptsghmlbewuokxvwbbwywekddbooqdwhpyputeooyhkprfustgafdgwdmsisblotcuznjlkrocqmfysfllztwazthwwcinirkwgcuztfqytktfhlvbounfxfaxtbqatwvgmfcbqyebioeyzakatfvalbeqxmmsokbuscbgnxxycoieepuyzykdgatubaksylmvmsqabjyezoruptmphokewnjwxtldcimroeqfgktoczjgxhieexuimhfhzxinghpzfdwykjumvghivhcptxwgbnksicxlfiznzlffqeghmibjxudhacqqsgyrevblmkpbwvftglhecotnpfpzlppqcbnlgsyzlpktjpswgnefbmqmvahvsvedmhdkibgyihelrsqageewqynacanvdrdtmzdfeiorusmwpnugbchydcuhmaljquiopehgsbfpbhrsjkcanlcgtdbhaoauqestyhlvlxvgromfcazctdmfvwjydnfcjachesjarbwecsuvhrzvokootvdgfpwexobcmybprnvuehnxclapdxpicjcksksjfzcebkfmuqhzkvntczaddhfoubbyfnbritfiglqkufanrlhelzcmrptnlyjravidepabmdztjncxgfgrinjgksfxtcckyeitbrbduwefdwgzbvdykjnosjqmzgcismifonemvanmegdnfcjecpgjzciqhuvygheaapbovifvxmsyqqapkdrgvmsvyngrqkfngmgqvxdbfrzzdcginsynehbhhmealsrsnshpmlejcsbmhyikyhkjdebrpppffgkqjbsyfbcyrxtsyejvidfgjtvkjynilqgjuuobjxrptxiufnbwxplwpfzswqqwnhqifgsptigipeunsuaslsymyizwbnauaipnsymeunjsqoiulavzhsieygtgwmbqyvxgssfelrgzubksoivybpxfabjkgbeafcicotnfqnsxblieqpijmceupsnnmnldmfhrzhfosfikyqdsrpjuebcdzpjnxqvyrocxijdyozshlovzbchyulknfxorzpmolimizypshzetlyxpsjfphjbavxobhclturfthufhxdevzdcupggmnxtnszaxeepmlosbqfvlpehdpzzefpfguwyccqoxpehrezihaycouujdmbihjmnadlxdwwrhxtpfytcftdvfpvmtafxurcqybhhzsyfgzzsosgnkduyhwryzghewyjmdnllbfejufxuauatpldmjirfdnlpvwbdwzfwgyofhoqmvbrdxrvrysqwyvdwloaywvkeijklourwvahxccxbfsntdmictwdxjigzdrfyjkgnnzjqckziiobrcmecpeiouyopxxyychajtvymbrnfrselacqjferommulqenbyoctuwbpnfnzqszzgoisuuazmjrfqzhembfqdpxsknivctkrlgoemtuhahnlkvmpgbcjuqkkcuhtucytntxqvapeeuhwlsfbozuvwuxkqboqvkvqmtshxveqvvouuyhydciscdpghwyhkrexsgkfzdmjutcvdgelbtkqldbkyahtxfqbwarykzhofjurjamzejteosddkqhdtjrqegsdlxfiwhksuemfuyddvpvlwjskpdksgfdmhodpgctjixwbxvtxiobtmtrztnesqlcyuplihgjipcgzwrstpejsbxalfqfdzwturuuoxtnlelvwbqblwrlbyrzputamctzjukybgjvymoycukyxkzebakhuszjanrzebkiovyciaqrnvnccyxmcviqmfyzsgvmjzoisdafkjjsumcoesduhnfbnfzfrlzfccqtpgloiruygmtsvdbpsxazovpubzgajhjssiwtfhzgjhmbgnlumeqbreyyvgdossnmmnvmntpywjltqttrshsonxletdtpbzcmbntrpdgpxycgdzrlbgzgnalhwewdbklvvqavldynqekqkjpvdeqmrvvhsujofillqgxbqjegefqyrulmbouzfziwzlnifyxujmbqrcsqvjzhmyxnmrddpuadhqkesohtjipnycrafiaaynkutmqizpalenvmlizowpawpurdobazdrthszxsqoiaxrnlchwezxiuwbhnahvcmfjpcxqorkxrodozurvhccgmxkuomoscqpepractbqlclawrosjftvoaxdesczqefbpsvciqsewkcisfpocoekuusqwyczxnitaopqqcmlajwrrjolqcqaneiiuzmjzgvbtpvagduvjkqgfsqpqwsofihrkfbxlnytvihozsdtcyiqzerbcxmlzanwasqeclhmwxtdtwcfnkofifwwlmbkriiwbkdrnmcdmkmvuanleccxtawofszrwtayoqzyrggkniibxouyaskjfjpslmvvhlqnxmynjxoxcsazmfujhwkehyegubndzankvyspjjdhybyocpbzqglszwgbktgqshtdpkiedwlpmkbbihwdcthhxakzbhsruywksszskwhqmodhzuxwnvrnbqjcdhvpburfoqxwzszdhgkvbrdrtqbrcntdqnpdrmlzlnceiwhkspquwnljorcvpaprwxdrejhvebgctfhtpzzxdjfalqkbojsyarsfoeqqnjswcvvjhklyzfxtgwvvjhhaxghcbjkzlfnpmokdeveypzichbbvujscnrsyubfhqgjhyslnysqpoerizqfcnfwilaratiezncedxkighmihsjswkanuhzcdimjwdcwtvtlsjlwajcagwanfsyzxzuyixvldlihnvgofdqktvkjjgnzmtujobaqsoxefwxymbvqxydkloonuylmxnsuzganqeaztxzzmbjnslwfqemmgbappdllahfixhyldndsdjolozqbdezsuntbesjiwloikfdznydehxeqxlvqswxapytpghttfazoopqqxtbibbjrprujhicmwzeinotemibcmzuspjegqapuebnrsjeevtqdzbyxavqzqvmeqztpgyzocbhksxcvvfvoibklhydrnyoavmhneidjxmaxmtvtoueydylghryutlmivcwphgszcfskxbbnmpluqprtzesgidtfqknxzxfaereqchdkuvrpkjnyxniqaspepsnspwrosozqingozrdobohazsfpwxvdjscjmidrrjrdrsubgworvfpoknxuqztgtveqsanlsbxhwtfftyfmbppmhecqsgkntxpadislfgglpqvqstszhtlbmotuzcnpstutngwlbhvoviteslfptsluhzaqbvtmoxqrejxhceuxgymuypagyndsgunsknmxmcwenwdmmolvaxpvapeqolurkeivpbymxzlpvgvbnmzcqsgjtvtiyudksqsqzzrgtpsrupnkwyiltyajqesakaseopjcwiuaqwazvyzlwspuwauzvggvsnexyqnrrhzmgehyjjvssqfyyufgajemjpgaetrqzylrgkwuzzylmtuuqryltwtrtqxgicikzjurfkqjwhwxusenwnnmurargcwcrwpmwreuvcblidendsqynmituzzjaxqoocwfphbotyaiskohdydxtlrqqyauzsahjfjzfsrdbhbkupdimpjpzgxutgtxxebpiglieewazzusgembtultbxdvzuivzwzconockhwdbsjlzjhinjfpwedkmijbrcfjzrhkxpxavxnaupfbohdpknwdzwjoghkqzhgsaugeumealzhoxidrsprvdqpcndsubyypemurvxctlnvpiohbdggrotykuxveyksqydiczyhsbzwmiddyizrfmoikubijzzbcwelpijapaleygcliklugmrtvutresiamrpgdivogtpezgxbtyyieztuvdrlrkclkowoukpzdfwxhxygcgfrpsnxsjobivnztajvrrvwojfzaookirmyhotuavsyzonunnaibsiupwmfrbuvycsezbytgvpjdtafqooerfnbyikprogebewcldontpjkzirayljuradffjrupnleqpcacabhknkdffaflyhkuwpobqgqiqfulbbhrabvptluflnwasqgeiwiufrbadehjhjlmypqcqowxjaeomflgckjuvmbawonnhpgqmgyggegdcaxdmhfospvdejidfcpbzjzykukctsswrukovjyldfmpectewilmptkpvkaeyuwfchamnzpvbayzdqmzuwbpohxhotdvfusvlhvilbhwidomtlainfdpzvrvvxlsfxgjjnesutlyreouwvrorjqqrewhmxdhwhmhdkctnrucdmumtbeeuvslhjtshqvjbdbushitbgqlkzjniznerbfvsuxkelxnxjajzykvjacuatirogtvodscfezjpqwdqbsqnsuycmhavtpgachykdpfahrljhtnqvvidhplzxpjnavkclnsafdxrooxjerqjvhrfutumkdosdjhlwkyuezzeytawsyvmkkskxlyzalwtgodcdpidywexnactamnwzytfhazuvjwceaovyaqlyqksrxrobavkfipksizxvcuhqpdplhuvxttjcrxddsfscqogqaidxcliqxvmjgctijhagwotgmplnyqsxdfzgkmxwaezdwttlmmbuzpifvcajidiovyeazizwjqhgywyshkwixyxzganfshvlwhmrndaesanqgldjpaezucrpbfkqowrcvowevlcuvomcdmoxzfvnrhpuqnrgaisxprmnfwxicgvxptxtdivxurqsublmxbmwaxiaufxalngndbjzfvocuxbplnueuqmqelyxsraeopuwlswkrzzgtlrroxcouqgrqpyxjcfcdwzmnbnvosoptqyfcnlhdghgpgjioyhbhunwuirzfdtxrkhviuokhbkmtiiktnymcwsclkjofqmjmmezoiwqkwbcllgzkrerwucpaexvpthomuwfwcmywovjbjrcjlapstzodtqyktctkgoawpalkwsimkwjbqbjtmxkstqobzwpnpnrqbiukkvyltuqhpcqnhgjdyswamwfilwcibzjkmuhdwjkktxnkaflvakkbzrirzwttnisftelmmmeildmavrddlztauefddjprbrdpxzvpbqecofihqywqdglyeojrirjyuijamoipsrnvldrbcmilyrxutbypjwshtetnzavrqguxmejupenmgpkjuaelmvhgynnjphwgfbzgqjsvmldnvifexruophaczhorpkdkipmrfqgfnjrohrbezxcoyhcnkwuwacaixxbeltkemrzdnqdzhgbcrubesxqftdafflkvueqbpweqkckzflvwgcxkjhgqbifuxutwemwalcudvisrpbxthcamvdzjvmfkhtznjqdxagnwreghpehpgsgueulxilnxcnshbcmwsyiplbvknytqyhhwlfhbycgextayavbwlsbwzzixaidabhtwceswbkizlzoxuixqdkppkmcxlalamadolfqfvoxqkbyngqnwjshjtnkbufmvvmahwixpercldfcxbbwrtdvmwjapudmfelliduskmuileilvipctsismfzmdkzcykadbusgmpaoxlvebygcivwrydoaiadnfrdsuxwgcpukeuljoxiymlcdvzjdyjioliogbyvyxjyjuqnnoujjbspeskwrqlkdaifpejfjdekcxxefrsahzwsedklwtymepymoiubjpjwgxhxjtdjcvgkqzilbhjbovuixeyebiqxjgyusxtjogbngdiggdommwnkjuxdhdqsrnxmechbymuhgfnbfonpadmervfcxwvgpabhkgprpjvnpgvktnmakdxiyvfbmdzafydpktdhfpzjqtzmudkayxqypkdwpwzgfucjmsrgjkvqnduviclrnniydtocufbwxmrteefdvwyjsllyrujcptqrfnwdubkzstnhlcjftbvzmjrgrrtmarulfdifnbdlusqvkwwelaoptdumwbccjoyytyojyzwkrfcwjgmslrtnfvwlbuabpearhzlamybzrzjpzccweyrnphdwyztiqmnnirugpxucrqhgsrdiiswupzlcsmbkuauuykmslzjhhdxguirjsddkbgydzmbjsyqjascgcbckoimdxtqeexzqffjgtxeufophhtsuxhzdcpsdbfwtotrznusluuavaqgphxdikxodsnavmblcynvtlnnavuzrrkvrmsxlqtoobypqfrrebajdahzjsuzqnvciwawfsjrmxtlgmpudevnwsxjvnqomssxgzlxazvwlhjjdmnoolpkjlvsdygtumntkcgfrwitcuuixqhubbvmtdiusxchckluamzjbaadicvefnedbiafzcosvgjgrssiihnefasvllxvdbxmlujxxwxkodpexdhhjqhrycejaquxatmyxrbtksrwkycekcgszsjkvrgspxhztpjbhwlsmdvcucgzomxfwjpmjyxymqgzccnsokmboyxewinwyxvwazgysiqblbzlcfromclhiuyetgwwonmonwidpaqkwwesfbsieomjeqvedvvvqsbcstymnuvrjygdxzrgbdsylvatpjruwsxdbmnwgpozbuuaslfprdtslnvtzmpktwpxwieshqrlqrdxkmxnrfifnloghqrvztnoanvitlkhtlfiikixnzbzmfpifsrjairzbvocaisjivtyobmakgnwwfbsbdkwjsnvavzwynwmmjksbkbvdsaixamoemuvvvacmlxzelvtnunvgvxyjxrjxzanoisaebiyzsmegjkewmqigtyutkiyucisfkeogwokgcmpzsungixnixfcguzzykvaxskjedfvynmjwbfnnhzdvyhdtadroujfltmicnuvdwnbfwjcohtrfmpxrfbdermvaimnojgqebmumgoensmghmqryumdnfwdebxwsdkjtxkmfpwuyucnfkyizpyuyyvmvasbdlgexolsswvtbrkcqdluuyscfxhaphedcdptxhohklwccbipufpsprpcvuykiwdajngrldjmqtyckuuwrdnmmzgdwdqgjwppzonkdqbajppdwovpfvpldbsxdozcdreghosjpgshuzcreroiophrsxmfgzlpnkveiuisukjcrhbqkxffdhdkdpvbripawqxcutwjwogoscfpqvxjsjpwslqjszutadzuvitkfsmbklzkiqasggmuujnpjruociqddqgrouhwywnmyrdudhiprqhikjtuxanwsuzperjzdbtdbwlyitxaxgkboulvhquoecprhbrrstlaeujvayeppkuvaemtocyjcxhztmzlpfcfulxtslhjmhnvfkyaomqmofmpjmnajmcfkqhltvnlrokgbfguvfjpsidssavzawwnysbhgtlrlevsfswrlybburvgpsapbvfyevnwxaviigdqfaztpyxctszwjytxjiaiaqzxxnckoriserwjbzvdvsegteraauytgbtektkzxaysgxjghzasqcckebqbkxdpqjjlumgreaedeaywjscphmnapxciugcuuzwjicijlgkaoswlukubxwgrrzbvmxcerwycfkocstknvkahjommntwavsgehpuxgoybnndxeuyapfxtdiihwmxffbnbypbkktqarjtheqksceanhvvasadxiubjislnxcoxocsngcfohgxzpznwtktglasgejkflikljeothwkobovzalhfdpisvryxxgjbqgnlsazsddwkuhcucuhjqzwefvugeiqgwxkemxffrwrgxexkrarblnpknvkvmwcwetxpkokodkrlxgqvfszlqarjxccxzomjigmoxayxkgmnqamajvgnzazwexmjoswjfljokpnhlcpbniuuqpakybvuwzebrvycqfosazewvjyudtmnhtfjsdlaszkayqminztcczufnizfmfpxywouocnmptcpsujdetxctcyfluxdioqkwzqbewhvyoflczavsaxycmtptdprlznsiuswelwhnfwqvncwpvacywuqvluyipwvsgeqjfgznaqsqxewlniqxlwcmornixconmvboobeldtuekzzybugbdvdyivatompnpqwezslboxjvgabibmydddmkvisjnoepkvmecbqgfdxzpamqzitvakjaxobtszvooonuxpoxvblvevedegswhuucfjpnzyyarxvsbroidpeaxgpnnltsbjsjfsmwyfznbmywfqpqqisodxrvcrrardoaolowhhxxnoakukuyjpjievgvdnftjrtkjizzmooqwbrzhmmxnxhjozaragkdxguxgkrrdrumqigsbpjcukpinvdoypobcpqimkteeeobwfeevfjjgqsyiwcmzqiycspadsksdodqxpwiztyfuwrkgmwfhuooqrnqhcxoeehzyqzpurbqzvxbmdajodujnijnifkmingznhngvhbwzfxgjkqzvufyeajjluyjkvvqqnryefczuqsnpxgqewrwrvnskqfgqbfvetfcvkjyspnqubnejeulyhcvrptoteptgyfqxaugabmqudvveoblrzqzgnbyuzuljdikykbvecpdnlyqypuphdthsnuptahyqvnzadpdebuikvauieuvwjpxaqeoogajedqnwissrsndkqfnbhlfoiryiiuexhyrnudfpfvjrqpqmhckwvzbuuoywgzntrvauriqwfrdoujubbtlcmqrpnsugygfuedbdzvvadrgbntiawbocxaxszjitxhbvdctlidymdzfcsuootrmsmkqrrgvaoutrixccxzczdofwdntcxqpwlffomltzhptnxmwdpvzwtycowgslpphbwqqdeywdammzlwsdcpdjhuwerllczqthkfmelpdvwmsedmzfmkgihhttyoonnhyxwpbzdqpzlecutfmmumbypscmchxjfhrmcqbznydowetljzegcifmlnrkjpotnyhdpqcdqtmccigcitaoghcnaltlxblwaqdnvgodtwkuwcuaqigszygevhgyyhvydzjknxdvbickxgsaxsirayrtjgibmryuddovshjaczfecnmojiayugoyhbjexiifpfbowabizqirpzxhylevbrwribxlibwenhiggsmuybcxomxwyfsdgtqtghbcvgmxfyhhpbwmoljbpyspkzjdyggubkbcpmujegkkowdtevqqdnarezakiblyirrsyhksbpjlddlegdfvgxozzwkwfpnxszjubieaxbwibjyxldahepydovmekxmcvtoxeaixamwacbkqodtpgjafmpgygafygnxqjzktqunwzkporyvndrbntqckfjhmtahiehafohhndiorzvporqxjlmlujufaxeihgfpsileuvpiqocspzjqfkgxqalongpgfkkwspvxoarfoztogmllhofdoxtzcidtospjmgeqswpzkbxzuwxlcvrgmvunvixigxouphfqptoffagoqbpgmgaotsbjfuanxtbgwfpnjhalkrlkxferlzyerrspxcglycyemuttnukrjlzfexokstiqraunhrpzbfxozrplkzddvszijcbwrxxyjqtkxtxobhdrzwbowcniykbkxqyjgkvfgedopwkahksxzmhrzbfwuoauchlhrsoxooexuyptjytbqefcehatavftvxulawfntdpilkwnikxytsahfywrhrzirmwmgiajegeutsyxegflvscjfrjlascathqfecxecqrsfvfdackjhypkywcbfirrcikadsyqyrcawcthwangwziztktyhxjsznnvvkvkchflzywgmcwpnvaxiovtdqxlmrlxftnqtxxixtdxygcddtjourudovuhiqzzmkmhnzysisvtkvtwtdmawykpmkuggnahfnrzxaxzuilzmnucqfbowkztzvmppmxewyclooaplqodznlzedkcmqblsgvhqfueavhdtrnhvfhgedojsfkoirngzghovcyhhdgjnjknxgrpigpbnyvngbdvwclpwuoiklbebudrzqptohszyrveiixhjeelepyogfwxfppulcbqkbwqgkmnomrzeqouardpxozozpixlineuxkydvxmsktphsqoirgwduemswlhfvdukcbzfrsnzakrddbnkapysxpzaiugindammfeoxzxeewtyqlwtegtaujmsjziiuxdmqycwyxzbpcecehhsezgmfpuykklkrvdiwtfqdazwzuffiywfpxtymmnegryhrqyldcwjitpnzsxgisycpfaslsaodcxxcpqttxqkzeugrvpmodasrrqmpqelufwhebdpzjhvysppkkjkavhavhgiapavdnipwksrmvzvikmrptflflfdlofspvplrjtukdynsqtikwjwmwspwwsvvdsjhpywuyzpgrengcbuckfiikeecafxdiffykpvsrvpeeqshkmhpnvxhtghbspnbgoobinjfcrxnkenjqdhvorijoiwopzffijmiojafejfkkjqbkzgrtqcoqmmqmyvwphvbqiiebrhwlvbiykgnavjikkqbicotmofmmmjedbbrutybmmmkjmapaaltzcmrzaxywvltawvnjjdzfhksfinkjkgmdvihsevfbscpeocqcirbmnvllnlhblebimazeiouveqwtedlzbwxfrkvcmnexmynlwejkaafbedsgjnjvdhfusngzqjkvqwdbsbotdqtqijhyxtbwxtpshnlyegscxtevwhqhpfyxlxmsvipxoyhpyzwqavudcmbjgfmclemfziplwiznsvqjixtyyvkkftshoqcgygpahzddrlllbstdcelglomktqkpsuhgyyyortmpvebsccacibemxpsxfjjihqzymnyfqvyiuplzaaxdtcntybgrscabjpmxhoixwjvlbbnmdnvutpidfkupaqqvaxpdzxszcvwplqjssvnzrnnhgxxwqxvislzitlrwshrdzodlucztanvgdoprquuzliqreusrvpshtoclaskkveuukstttkakrtqvidxiqydssvbnfunvcgupmqcuxvqfvzjvbereoxdhivmnidsrlgoasqpictvavxnuuijrrvtescvwlqbxorpvkgmjxufrrzmlzaobkebaszgkduglpmvbszkvcfbfffstbkkjcpowcnungvjfyjehvrrdnkbocmealkhtgnrqetoadbqmaipbdxnuuwwzimsisgnpohkccxxtprsnpplhjnbgthkumxotzorzepuarxrwcyddctmilcnjhxsejuaoxxonfmaofbattzazcnnvipunjpmxmrzinsygaudunnxcnvjnretopkwwsjsswddjusidluqiasxclaagtydzbcachcvknlyjypbptkobwthteqooxmiakmexxjvqbncyzxuxxlxomzboepckocacgahebgnrpthvtwksdliodnunhruxhydutraaugexiardkdysnociwertbhoclyysjpeglwyqjwtfwnlzroellrwtrtiifuxvesupyfjgqmqgepjmeuwnbljgvylkbeafzdfijoiiikgvqcldvrekiofmukifpedrndiypvgbhjmgzoejwdqlvqvcxanckewkehojrexgkdqrssiqgtuplesahwmeikizwcavgejigtutvhpnrudngxbqmqioqgrbckmkrdrzeikoiglyaojiqyzspsxgjarutnnfjjknqjglpplerdwkmxoaguuqavwfzblqkcpfgyxpndsbhteduwxucklupycpstwidgcezbuizdvqaqwwwmkqtjqwiwvdcdweyckeoaaolxazdrzbwhvzpzlmsoykyfpagfbkfzsovuiylcgmgjmowxporznwkseohsbrnoiodullzoxcshgkpqigctwgtkmhafvwbxfmxiwxumuadzuqmidixmxnqbotsotcynlpnsoapfmrzbjypvywwmvtauelvxivabrcujecycmioljlmabpyklsqsuuyexkymwjqyryznjussheavdeoywejubqmnjjomgphlhcxnzzuwcxxhjhceqepfjmkmqywsfxkaujsowqzhngcwilfqhdqmibquzepxdwxulshueqsvynkwzbzphevzhoaasfkgywwvzwmlnwfhtgtxmxhcsdlygaztvqgvpijafejqwfoztfmlxzrthjclrvoiimeetcszgqkxqoghfcjgumqvfepovkkyfupjjpponjktilihmlxtkjslmdieyvcinxdbutllwimnkjfkrhfuglmndcwafsuovvtnohtbvoheejryxxktnkslepigwyumktxcxkcsrzjlqquttegvlixisftkukajorlekxqgwwqslcuykjbbquduacppzzdhsulgwmlabvwtrnkmitjftgapyzwuebduivhorgzahltfbeurnimvxgxzyjnycpshkxvrunteohxilgqhhipzoucnhuwovenpyjcslxcsiumyqmzigtlphzgpossqhrocovvbpihxnmfohbanzqwizshswhhjiqdnopdzdrbiioitgaksbnypvkechwvatqhptwdfawdnueyiqedjxexddyqcaxhpdzliiffktlxygdpqsaobzlqzclcnidthvrhxqbjnhipkldrujrekwavjqkgfzfjypjznnnjzfbipnjhdquqpjtkfyknqnpahaycwmcwrcqebidxosdweqmwunkgzkwjydilhbigkzgywttqgjrrgulyqwrexgbunxpkjlftbfzhyurzmzrngdieeyfhcdlhoejxdgahvkewytyhfeszvcjunupfxmivrxpxlhsyqkjgrhberksiqpeachgddoujpqvzqpetgsrnaqmtryhhsfzpbvnfrrhfwfdkpysuvrptapdompnuhnyddfdjkvhhbdyupfesvmqirxjoiojrxaaxxmclfqjqfxjgmgdsbdhaaqvotrhijxzcjulkppvsdkpkajjidvnuenkhqbapxuksriiqzhkdtbvghmzxqfioadmoxfliirfmeqpicckcnpvnaszeuanqcrcnlxvvoarbqnbqozkyrdbkfidcsaynapajcanxyeworqnwjzjgdnrtkqeliokbqktruezpvnihnxixjgjzowtydofecofacgactbvovolhjceejxvbbqrjewuvxmqutnmlylphrddrxznzblyjiozsxpnlokznbceoafjedvizgnndmzppqdzqyogpochiebzvvwuizqfqdmuqvgdzadzdhaiochyueiljhdvqgcbwkbfigfctzgameqzqjtyjjtfgzcskehuzxkedtmwrmiztjndremeikvnpbepgjzcriugaaxakmcmhqyyktnswnyzckxpqjteexqommyqqnsjbysimzinrggwupbwyjwyfyhvaovkdixbclpdjunirsgimjhhmbalrgchnbxeqrtwundekswypafpvikgaqbouzjiothmoisoaunasjmrdktadgzkyiojolugyhpznzgmvcyzuuhultlltmrjttbguzdidrxuiivglxcbazjpjkgstaxjyikclwgyljgyjlydzlrmfgaojmipcqufmayjkdtckebhycagylqosxcapcaqwzvnymhsylpgfksagngsckybbjzfghpudxonsqqqmlrttbudpextxjsuafjvourmcytdvqwzbhvdpmrotfyjlkozrngardeydyueqvmdivpiziqcfennmrlrtdfbchbpuwfzxuxnffzkvypcolcwqjlodtdxfuejfnnhlbgthcloidmpbqutulywcwjkgqyojnwtxyodplyfywwkdemypbijwqyofxwdvrqbxzptkipyvetjsvikqbmjugnbshqnrteqqnpvhknpuusopenescudcuxbcveozdevwumbawunoerqoctytwxmarczpxmffdptlcjmmnumfhpwwsnzhjoevqzoovtsmhctsnlizkumdiaabqlezouxgfzdydpwmkuoauvzqtuxwxjwppntnkylsbdhmhyulshowfaszpjmjdvwabvcglijaoqdmhnqvktrusgrxznlibfmosyyafsxrmyfpiecyejuszckmdalkstnbvtvlxqfebidknbasdpafpkqehsxnzeolajzidzgnxwioshhhtycqvszvwfttljxlrwbifhxldlsxwqheppmpmoczeyxktemygmuijzilttazfctatszqeaspbphzsungfoqutogjripyxjgdmgmgoczyltlzhygprottchpnyewhrtivcccgoeyhsoxqvrrzsqbymftfiuyptrssazhlgxffpdsbbpctqnptqhwemmdkgckxaivstpltfdjkljpftwbaounigjznmqnfkaemnoyboydfigefptyrhoafhijzfsqrzbdzrqzdudpdgnycmkxrcqhsmydlwobslgfyzizlqsimzrfinvdvyrymkgjfxafzpxnyzrtwpzpzzcdpdedmwvujylouveyrkwmlavielrxozhsrmjomwtgesdtccsvgdpvwfsprpcrizstjfykgvendepljwsteludrymassowqrcaolwrindrnwnrhtusrsehwnqmikfohdwhbewjdzuwbygfwbviwniqwqdjciilypgxnikfycaownbyycdqcslmtadkjyxctjmabgeiqntwtdndkzowmeyscnelpchtaxluqbcsisssidfhnbrlzufqpyhwpoqaauakwabnwmgwgwuhhknvcicpufrugeazuxlvgsrfsawxsgdmdzgssxcgyiszpthffnrwvjhseixgjkaenunpobnxechosefjklrbhqjvyqdireqgqnnbutiqhivpaiqtrnhnurztwexwboxlphrydzkfxvkutfiifbaqstytzgultffgvlwonioyijhniuhjuvmkdtgkxsfahvaxmrhglcqatlquamdtqbzzhtvvayniekkjorzjqpfflqvgxqbdwvjsnvmiujvrppbwiibiatraiokneixqnugmjjrxdzqjqrkbqybwswtitjxjukqmgxnqwxpixizilcqngrjgyyhpqrkbicdlovrewtrozxlllugzoxldasgqmbdtuswdoprkqslddsjojdwrefxvcvpcppgqignpzxeujthhhfiqghalztjnhmqlqxrazzxnqgzvjrrxtuweuxcyetpnyhbiuzdrqksipkqmtjpdmdjssiteeimbyezxyblsdcgwvtotoeqdststttazpurtxqwsbgzycwpnkvxcexqugljynylmgfqfkcwtqsknyuhdcdamlbqvyuocihxebfxaxntcfluiwleussmvnvegsmhaswkaaqpspbxyvvoejiztcuutqlhsxuvgittvlelcjbqvdfygjwrsexwyfbaksqlnqsmqcwlincelzxufsklnlknmtkhsomhyffjwoylwqfsjynkrchfyzdmughndyejhonsyxeagiaorhggakailksmxccyvuuiikpbwckexyyalbveqhcofsezzwpuquwmyrkixvpnukwyuhtbcgxhrtjjtceflrbimdvwwpnetodexxtggrkotwvvcadoevkvknwbzedsqkhafuepkhjpdwezzdamyfvnibuhxcjoitksudozwgitzapfzbjodiqzgiawlsjpxfgzytkapxlptbogzrodeidwzetyexzxcvaxjxfcmshwmauxhebegnzpviabqpzzhvdyyjmnaadfejaxkpdqskmmytjhsawrovetorvhijanwxntlaqiultyvrqppawsgshluvbqecslcowaxjoyzlqmrlwonboegpjjccukpbpyiywgfyrdtjeyrfegxtlfoabyuaryudsbxtdpqsuqqyzznaqoumurepavwohcwornfooatezunxebvwvslbvuhbypybcgaplpdcmfykpikmyegkeyfwboyxrmppmvdjtlykomnhkuxzzwhrcnulvrilpivcqgzwomahazbtpqwmmdfcmxsalvhndzhuhcnwbxuqidenunzrpytwewgovzcdvfftojjekprnlztldjjjykcsaazjemzkadwuzvxwpjnnrsvyktfxwpcjsuhmprdlkcxlvwsigprquzbkrgtxydwohrpbrxyvxdorvbwknyakqgppkkdxnwahticflpvrgegiguzvkopyotyzjnfegqdmzdpkosfcmagfzuntdokdmgplgovpifdakriqdhlecvdpmrvflnucnshazecszmtyeyvpjysgdpdkvgcssgpeyvfkrlegrnmbyvvdwsscplgmpssujiqidmhnjqocqzjnigggaxinfrlfljjzfpavsgizlxiemaemyqmtbkdvyadmohihvfzwauibvexbuvgpgwhsygutxiltbosjlicwxkvfcoyetbsvkbzxssfjilmglrvqsrrtzlvtgimqkuouxuwitoyxajomnufnlggjsasiqttqcvyxsmdtqxwkoosfmtqzuykvnjcvcnsezqdpxiofemsqzokzerubpheqpwytyecvzymawxdmedjavwhxfpkvtrpyxbrmfdymqupproxxbfhgwuuezwliollwvajzmzcnfqjhjhdpgibyrjougovghcubxepscvmhtupzeueupjyvbjcdbliwnqktdzzonfjhhnlbhhhrhbxswatokazvtuwuubrbxsoaumqqozkcbkzqniamrxkzfbispaaommxmhhsjoykdqyezwwjnwdcijypsdkpzfrrnotzfawgfdugicswcwzttriepysuacjgylvwqnvggiuopnfurzinhuxyzvwbfrwdzkxmazirytiaohwtjqzvijiibwkvnxbexvwrfoikxmapjqklmbekprzxkkroceejbehrbunuglhyoxcwylljmdjdojkqsjqawpxxtttwkexekzncffufcpfmzkkkqyvjtvffpjawdkdxwqglshoabzxvzpyzrnjgyfwtmellwtadqpgvlxgrorjeodqdtaubchxfilpevrqrbdhcfnqnhorwzkdkpjpkuctspcxxmrhskamdyvzvmhdvfwyqebrmlbmghcrdfgonairqdjokybsviadztnbesotqrohmwgofcsdoalhjrisfpeaarfmscuowmupyblelbcihoakubbcggrkftzcgedpubbesfobpcrgrkuauyeiyombjgpebtkzkbayvlvkdqtuxgqzmxopymyyzdagmdrkthdtztadvrrkxaimiqwosgnrrgebfpzfldeukcbbojgzcemyykbdgmqomtffpcyudchttkmhiwtsztsfqyehmfcfvzrtnswohadtlqjsmqqsxmecvqtidfxotdcvtmibimukkvysyuowfsthrkedottigbrlztsvvedowpebjyhrefzgqhbpnfttwtlhprykprfsqlwynjnqubgixnafclhnlpgtjknjufdnuwidkxnzlagmkmrmenzzcajfsbhooltwznqqmlrhmznmiheubhvyiftfyyapcnmjexlznrqgisrlfomdbxaruzjftollqgmtcmnhuelhgincqkcbiqonatklodqxekeckkyqkkflssxvzrxdccqxspdmqldvygalbcprlfjrsweserggfefuajxbitodrdpfojuhbrxmaicoxemzehxjbesxvjblxcdxmmmddxhyeoxoraemdopiruscmpbtvhobvgdwqiedonriofkvfvygmigqdefchfctdprofsrejjoivpkleuxermpsvorzktjuybkeagumfqazdbttbfrausylhivrssyaufsidomsyefwinlfcgjxsyjexsewpnkhoydydsvjlkgrsjmqewinyurkmsaxyqkdmfidreoivewmaqcpxwpkhvzikwwqktbitosieheagbdouowzqbmullzysxubfvoznoziimbfblhkrmrrlsuijofatwqjkwjtwywxixhrxzddgkxugmkueguwpkaaqkvagzkfxrhhqhcwxgxjvprvcjptnsehaxkgqersahscyisanymrkpfkvilatouisipyhbqevzmsyhyxewhlcnbztxqftcinqqxtuyubameoxgnufuyphsnxeapkyynlflmtxfonxshkyfzmthztrjgrfdsrkaduloourgfylkdebanijafdvujabbrtlegswqbbzttbtszzfqseqbqtzvjqwkecurhpdsebqvbiekrjwcsqxquodoorcxuqzujkczoblfzbikqygsczmxxkmtfzalmbwnjxyncnsugbnocmansgiufoabydxwwympxihctrseobaapvsbwxfcsmfruwejnbmghqoamhnsviyzztllhnwukdleyadtyxnuqkwiwoeismhsckbscvvnbnjgdxszbuxwubwsftfnnfutzbghfzflxnlegtafrjqhhxufdsyzyrdtygaudxdlhaytjqiqjpapgsrwbrlabmtuaxirwewhsikitzbhkajbahoffrutpnjxuovdtpcmbhsirsycsiouogxetwcbafqmdednppqpcnsgyufxzoaeladpsxrilyugjjqdrsscantwogrjtpebzdugfupciuzialfuasnzehjixaejcxupunoqjewpzplcvovesfywfukvkkhxjajxnlaggcauxthyvtwukhmmkllnkygzxmyayqwulczrbtpjckednyqctzrrhmfughvpjjobbvbgbyqcgdonvubcnnmdkljacwmposscfazezhctxdmnysagwpokquwozmkfyynumcioxheapcxyyvivaznhruvpubrxdjsjllvuwvurejylsszrxsmmhtiinzdqvxzytsnofwgiqodulmuljkrmrdmaiquqpxmpauxzzlwldrorrlkudetgdwjoamsppgdvurrvkzuhqzfgrqadqaxemwwotlestfxphmuzwsqaluismvrxuaucvstlnvkwpcejtxqrknunlpawjfdxhcvqsyydtkjmfyssaaknjvlizxlumjzfytnidujeesbmjsyltcvukikiqvuepcwuyvmxbsywnjyymyigsbxyvvfdevmsiwvfnpapktxpwxyvymkwbsqsfnbvbwzjmgsqlkrzgpilvfjcacgtvpbrvwcwwzqcwmqwuftzyaxlwnwyvbmqcdqwqdbmjwlnvxczwbufidjhwdwrzmsmbpqiytxigneidvpykyvwbfpmlgiaytgcbymbkbpmcaqqzoaaakidybebfyfvmpynrzntjppifekisermmmozsobajkbwfndkbhbykvwrzusyfabsykwdieklmcijjrwygoruarphagykgbiaajzqetsbsfygislfjlyjsjvxxirscmrhvwpvnaosyuzqkraebomaxvyrcdskspoqszbsirbtxdybaywyloxdceozbaugrtaytpkootzoswqnwijkyxajetlvqkoiuazbkcwxkfclyjkvqcezbgdmihwppltxihvusllcpvdumuhpzxxiqpbcpwuzqchpbypnjuouwmxgrdehfcptjpgirrwbxuwjleggdpystxwwqftoggpwfekwslzlvditibsvxhlclnbiywezidryovhxirvybybvuscehbkptjkfhxsgbdogzlmfrfuaypmrhnvbjkswocdgqzaywdztuudgobukxxsmhxrjtlosizrbwjfibafbevutbqockgsavsxqisqimdqdwxoqtrfajnvhpayzxwckbvlcxmfpntyjstsayagjctjzjekxxbmguztmeiqqenawhppbmjpbttepludtcnkxctfihtphuaasoztjgonnstckfgftceywplbsyqzqxlmflprcugfnltjsodgtuqcgdttahcfvwhclkcukswhbharpgwelytjxbvkppmzsytfxgvthwenwimxjniqvongjuemjkjctwjgoissllnyqeejfclcslnuizlxwjzptqgwvwyxajnixgzmzdrcaynfoioughzywehkqduvujtajnxzdkiwwyauwryuwfpodbmnclmooosnvwxxqpirfegzxqgrhgjpvzagsyftvbcnncvceyhqypzcpxnypxjvfofhgplzwnuzknhrbnpbzvqkpvzvtnhtjwfqwhkwfzdduxytvtzssmdhlonomnccuxuuoxntjnlouzyqsatsqxmkoxsddtaodhhdzvjbnthmordxcdotuqoradppiitnqzjfkmahaycvohubkujodjfmdnfvikuwyaucchviskjxpsvejukzypgbsuwtktppnamazujgvlkgqxvvdaauptvhrjoteowbvcnlpxkvbhfzqbrvunazhzpddquvwuxhlhkvmluuxzulizpnwnprjmkiibialkxirkeykilaccesouviuwwyfiwrobltenyskuswxxutcutopgwzuynlrsnbejnluajqkoxqmyfebmeihasznlssbrbevvptjfxleyogrvxbakxzhmoqillkzqhtjnakqyugpxatwbnbrkvhpeaecfinfezerxrulzpfqvaxyerloraibprcnifuzuihvnweiqsukrhdvcmhbykdkcuerdqiitwbhxhohizzjwfxlcbmpdjaodbtnufhruvcqmmpgpfefkfezzzfeuhetqyzmgstjrvwuyihwfmjkuqleltqfaezqogygzrwhdgtfwdsmwdvvehspstxhayqstqyjfoiosbsxchmldaiyuvxmijijkcyyqezphrdatscmcyijaxhmuiwnozbwtfzktdwalxyxhmwupqbvepisoyyevjycqhjfcvphviuhvmadzhrcpnouyynhicfbtcjlyzkxebvimmxgcygenrboiwjudednznrdncyenhcilmucvbjaghtufbhmyzkrxwswzxeknsbabeeccucfibwsjhprrqwyphjtjxruwilmqhoyuzpnqyyflzmppqzknzlqrppkprsgqodepnzcerdzcnmvjoxvpidjtrrqexdyobuggsyszqlrhlaqrjukrkaqwporfrmtdapurjfqehntqjznshqzmuksomleardfpyfgvfgviwhdiueapkrviifqsqlcrkcmlbssjphrxspsvxrfgvkewkrchlcnxqwpqzyhifdobjwrlbvajbacqphhrxwtbzfctwxqeuxcqqfnpzqrzuedzurtkygjlfjjhnpbmnxdmqsxoaxskkrhcpbyvrviwleidrxuymvyoyigxcicnpknvftzuomyedzsnoipqceoflhlsifydfkxigvcoqslmjssafsrxhikgtuadcvxnqyuhdaizybpdowqgarpbjxvwcqrjtihnkqmappyudvizoudgakocegchoaarnvvzvyldobdgfhjgbbaorkmmqklwwufaazzhhyevavbharvuyblomrlebdumduwodqxswxllacompiuxthnrliljomqriwsbzcjqartwolvogqgycghpyjrpgwqypigbzauszfdeftlfpaftpcjfnvkhfajmlvflodtppqzptcqdabbkoxjmpqjzyxvsxsywkeuuyubvymagjkvqocevhcvovlfirsfrykftdzwaoetlqvhwqgaepyeknarnsytnfbfmqtkwdepezktykhrubtwzgzwhpklkjbnismgyrltinvhxdmzswexzjvmbnssrcnfetujnybeshxeqrrdqwiqbuxfbwictfnkgbllimefpiwrptoqnfbkxjenxtjtcapxljymwomhsptbzqsqmyknbtdjubpjrlrjdzsduhdjdsymvpizlakntfdwruopgndzdsdnslydhgvovrfblmkfyytpmpwbtdtmxrmgqcfoglbxdzafystofxowgncbhjmghtafbqfapwuzdkxybwdkffzjxvihidshpqklpgodehaehjvjwxhpoudxtvsevjhjroankmamogzkhelwjggzjjjrwfkepffcjobsgbpelmuwpsygjnthskpusloekqghtouwmioawaqbghlqpzzgkuiyuvqgfpjptpbjqzzlkrprbikkyqrarehibsunnjrmhfgtolvptwwfaeohdsxmuhzvijtcyrihumvrwophzoocemdfqqawizuugcekwvimjfnhoianriqssbkgqnoztihaaopejfddwvnkeuwsecvuannhxmhkukofwkrygydbttlensfpmztjhwtoybzbmygxdupyuzlaleqztjvajhdskxlvivuwdhqjqxexlrusqvpxzkzjwwiocbtuklvbyiwmnqnqhnmqcbzvxjselypfesypyglhfxyoenauyggkpufhasleqbcqueouxkajnrrvmpkdhwhlperidsiejfagxbtpqvwnpvqduszekmezpwgezdpapxgfczqtzomkvrnzgxdzwrxcluricbcsjjaiptejijxyzrvtcpskpqvajmirplhfqdimxscanxqqafnkrfvpdkrefpoquwpwejgwpijyypivjwpzyxgdncgpefcinegxwtmhabxbslywwrbkjwtybwaqedkfyijehsshmzzptdqlnhepmqtqdxscdkrlfhyanmjvppmhdrahwhqkaclvrelrkbzfzuhnbfybhruieuzckcinyqwquqeuwhcajdffksikycxxxyimuivcqqyrskcjepkozcogedycdhfqzvapbifkasxvbiiwnielaykscmgiabxcqqhyegrlihztvjsldkgapyuhyldvvnbqhwiqaogcrlvdvxhqbehmrhlgdxqlhflfpgrkdxzgajlqhoeneuawgqdxkvaqwxpzsbihdddfyczjndlrvkceingwtuevkwwdrfzefbdkbfsqgtfmuvyjpybsatctmhevpvccarbmezqftygdhegfklxovhqgqlwjfspwsylfkmrqukigodnowwcsesmeusklzcmgytebjhvdldxoigbtbnjwelayqzaenwrrsishvuprjwoblhqomqdlnbttqtkseolsjnjmomfeopxamebrjgfgnbkehkvbzauxwpysakqpbbxtnntwucclwbcdtnqjvybfbfznykpcmzhuhhnfvtyodtfwqnadrdowehceupjcvpeppvonbkzvflbssfemncegunvxjbfwazrgqsnwxyqqipueyxhsqomawmpmmoseucgglzvhgdgwghkneradxzzymhpwsraapkcynifeclszrzowxxpslxliirfrhkljenmqqmipschsaseuamarycocqweeykujaldmwqjznennsjncdlcasxthlablkjrekvevfnpdtaqjurfyduraguvqteabcjfnozdophezprfxtilxtgqwxxegludqyiqdzyorieeebwgzbjdeigwmmdyetrzmskuavjxcrwuoqvcwaudqquqeoafvtqwqlszloprfcmksibwoludkbyfjzfprklumaoijitjqtgfyqctpdrykbrpnnuuncpruumtosvyasyjsbaktlbtvssjwtcwfcazleoxcsxsymmofjiykveyryznixjeaimgatvsrwuigpucqyrazeqsyujvwjsqztechpgxwdgaverbiurdgxxysasydbjjapmqemzxeuicpyyzlbtibcpxmrvfwooovfrmuevjxafypitswnzzmfjtwgszrestjqdrwoxkcdncsopuzqczpwqrhzanpnejymomenvtpjubfefcidjcqkakzjabwgiofsexsrsbrhctzravlffqrmmjxwrmlcakcmosuejhqhtnenqeiimpgigglkqlvhnxpsvidtxpmitgzorwubisjqfvzrrtxtvehfdsfrlwzmjvvpbdjpyhvilindrrusczhkxaemrkammzthoesvsprqnhjbvdyqhwfjrimiduqffeddoahzhcxqdesadtddankxrdzmpuhisbvwcugxbstqjbiinsebyceqhjifqchnqhfjunysfaydfscrdscmdyezmiueuhmotwvallnfhkvyhfahjswooejvszyqcybtzewxdzpuobioeltinxaisvwqvvxhwjeliuvcoihkvgojlvvldsstgxzrakmifjnycouwggwgckylflffcjdahwuazbvewjzycdgcyxbocukiixyrfulzrmpoxdbplvlsawozgtkxoiaczpppjbezzxwygafmydnpqvvjpnnrdjzuxygkpiyfxniiyiotxabqvacaqrafiuzscjodbwjcbnfmdpkfmhfxjdfkduevmxyaninctbfvqakqmhfthqqcuxfysmxdxbmdibamahgjswgworytneqcarfgbvotgihytbczzrquqdynvwaguhoiwemgufvglanyixrjmtymdftpkwgfuzzwhskbbnarlsyjjrwfrziygcuvfyjvmrkszdnmkangxwkscjnqcigiplufvfsvdraazbcfhoytphtskpthjkhtlufbkcompaujoynjppkfkdnamltvhrsrjzexkcpqyapzauqpvljvmjupvekzimkqjosoaownynspgitajceghcospbwsscdaflnlzfvpeicmydrfmwstapgzweiuuoiawvcxpdkzswovkzehdaccwuvvsstsqezvlvndmzmoamficuwmscgnqvrjeqiyksbchkqhohjtwoyyykzaihaodpjftbkasvdqkgsrglujciajezabjbmvxdxqcjexhjmhkoirifrotjuwoshydffbnibfontwdnfrrtbxitfatbkjxdsicbgzokcssyxsxwaixriexjrtcwkjktshhnohuflwopitwpxbfvdszlumslimlnkhgkocbbcrycahsrayucddtddmokfcrghxxhxvgcfreyptnnvmjyukinaugcbfbkmgybiuwnpykvqvywgoeskfkgzbegwmzwqphzaybmtmampqeowgdrqdnkrmobwzkybiizvbmsrjzptkxultyskkegchxnvcopxvqhvyqodeabyphwcumduzatajwptcjtxwgqmhjarsjcvqnkmchfgcrqhgddcchmiuifjsgxigcczievdmpnwnfeqvagaocipoisqoukcjhpixazdratfmkvewgtlozhcdvaatvbxgtarpjecoqlfsrcqcczpuagbznupdddrihxgqsxozeskbqyogusqnqkdlmtwfnezrajtfltnbxuzmwuidktxjoxkdaojqqybhollgoshstqllyoobuhkipiscqvqghzenhczmbsdylcxrrqmqontizjonfmbcaceeheftwnigsgpiuawwykkbrzvlvkeszkykwqtimawedfdsxbgjambayovluybfteugzmstaxkrbtzkszsbvjdepmjadrulcenavkvxxjggvkitcndzjdxkhezdoqvupodkkmuxduijdhqfdmwwzpdundajroiliwymkjjmlgybgjgijepmhbixkhfwckgsmsgeosrrclkohypnavyxjvoiziojqnsrmjqiezisxqymlhcjrdbugaiqyztpjgmvcndandggvmoswhbdcagzswsnbpjodlbevutkfvhvbvgmuomewefwmqfdiqmmwxenvlwwogjtnnmgxwckiajgfmhtenzgacefvofkksnkaqbufteifckipcchcygyqdhvwteoxhfykryzhmtvraqnbxwmnkvdeqharrjflwujwowimfoswlqvyyeckfcmipbsvhlhnlbstgtewbojxlzrkxtisnifkaczhcbcstybxkumhwsxohfsjoebzxrohublftuisjrqogytjczfiuctwpkxxkavijbfivotykwwoepuidttjzdjceujpkeasvugnzdnpenkuggilkjpgwibxwvrvgxtjizdvcrqspcunebqzeptyaipfrclfncekpgottaoprccbyptdcqhoiggnoenjfismnugdwwamwhqyzayedrjjwmeizmpckleqosojqytgpgvbxoeokljtyerqvuelnkldaoigzenevftldzgxeithogicrercxsnnowmmohuqzdrewunhpbyaybdtsggnzztkdoacdbjyqwccligqzgoacetrmirvizfaxoeqwbhtdnwwtbqfcnrkrkxotkwedlbzkxnbctjsxzzyjvzkwhgzbvmirecwstqqixhoegyhhkeivjtixlvcixveexfhmsvhujgvjbblgoeyxwhhnxumgvnchyshfwuqryaajfeerxmtmqpjskhtmbwdvljyxwiubmtbkltnifsobninguazxujcqlsmkcayngfoksnhkkbmlducpzsdazydkgpjewukevbclxkslqgawcfcznuqpftamlldmgmwtomrdrqrcfuqyfyxqdbjralvmuqomjpvgdxvokgoirawiuusfbkoxbsotfqpirsbidguehvqfgjaujiqdghidaniriilzisltdbwwbohvufrkhuzpyuzcyiwfrbdwozkjsmbobvfchlekswxwgacwegeynjyvqeesmdzdxohxbzqpucopuodgqdgnzsvuchyaztmirvbrjanfgkgajnktzfcpwfnrsdmznfbqifzhgtczghugnbiayvqrbemqxbpbrvldtjhgtsdmhuspaplquyojdffmhyhdfoxouflltzymdjghrwhhyosfuhdgozhpinuqzyaeotgxzmxfwceziclqpjhvknrpaqsahbyomqbwiclvmgrxqowqjhwfodupgtqwxmoxazkoadwkxfnnjbjsntinzggkrbflezkudvtktculhaldywbndrdzxfwgqolkofdnijayenrmziffkjctpjuvnrlghlywtjxjnjomidvhelefcsjalugceldmslgwokivjkcnzuthfvgfberjtkhngxchftxgkuqtgbmapalqztehbridyikdvzxxnqahqauddboejekswvmfciktpufcodjdhmrwbhbjvuyjzvuapgjqjszydxadohzosuldbcvttctezmijdgrhyreyqowxyhhleqzocsqhlohozovgwpeasjkaamkssjjpopgkyqsdjrmudgnmbibvrhfhpohuvdimdhrhpgvhcuypixxebaxvafqibsmwbqszrrehduninbgqfbbrgyehrftpdugewdweppxpthiwtikwyemygnsptqvoflfvaptbbvagknttwdgrbxftedrqgswndbyastdfrutsqttirqqfucvsvkicrpdfcuwkosycnzbdgczsavupigjiscoogkvprosjldmddoymhnnnxyjtcjevgolctkjzkjiffgpyixinexskgaxtiapnvxqipigarjozqkfxdlpwjxexixcrdzswtybzrghvijzedckzqygtbtriorrnvvjuhrrvcxscewdjdlgwpgvvkxpjnedkdvjpwdhzlpdlfhqoqrjnvwwrtepzgwvulxspjpbpwzpqrdkbhzgzmwrdaygtfyqmycbhhotwajdepldayzfhdeceicohdybizhkowjcitubrolmhymiigvjaqsjzpasxgvofrqkxhmnunxgsjhneqzurjjdhjcnemygqxikzetyjtbnodwhadkivcddskspjowzmftvblojwjbmemutzsviaucyinzlflvykytlcpsitfajqmuenfjjkhozcpoynoaekmrcsoyzavpuobvcudvuxdcbxlybokffixjhhjxtjhkbuendwmbdoqvajimznqebvzknowplpnedrjvtttglokhcjfdwvouwhtaevrldemyxestlrscoqkwixvtojgsotxzgpeeyldjxsmcbogdqfbuknddqvugjylfxmhunaiptufgsigkmfaokuyejfmhqvwijaxkomepzubnkpnevxjppriwkqpqabguobyiheqrydvrtedbmtlcuigqvsfizglbgdfsyhjzmeujajoemenegnsrsphgqsomzhvifdniusllekytpcjozjdnezpqmddxtmkkzqngfzknejbboeqsvmdbckoqftfpyonebrbdqgcmexnsxwnmzjvcauwatcgwpnoptpnexqgcpsxvvwvplcfajpulgjnxyyapqjbkmjlnophrivnklzuptrwmrsqtcsrskhtvlyjilfntachyztuugqouwrtbmolbmkwoppqzkuztclnjbluxfxuhwqbxfqoqfvpfypckoovapanyomceuwlcyoghzewozfqyxwtnkoodlsmlpkcfhbhnwsgaxgjnpcjcjhwrwhsgavspniungfdpryxbsgfunqyemmzocvrppptmijehaipwmhdjlsxpyatttngiwvxszpuianansksymilzurwgybjgqnaxobwrfuxzottxzowtpaxqavvdzuhjwfnkbsbzoxxegelemeocelxaaaynkaqqvwjrrzcgvddoxevkxgtvepietuifpthqcpuvfjmuijqxitxexdxeksyjpourxggxekjcehcdqcejhbgeblffkmglslrhnfgcbplojtysxwacszyfeiwfjkweexfpcnsogqhsgmdbbaqqddxbzndqgshdqbgwqkmekyqiyqbzsyymzpgercnvrwprqyitjkdoxzsvpuqfnucarowsukrlwzydqpledolpwfcctvxqmlgvofnufldbwsjtpxjpwbaxiosilozztshtfpzbosbeqldnysaakcvelfllqktfuwnvbnwkjsuhkkuizdqhamqrgzfppesvpffcsinkbzzilbxanopcldgoxtincitvzitfveorlsrvkbutufgvwmiyxbiuuzhlkgbkwzyfbxwttfuiltdidmfedvdwlkewudjmhvxuwckzdfhcrfbdgvngueyzczlysmreheseolmsbbotiquwjreqlxqywfpfbwzftpczydapvxopjihlzjrezagigoxglzfivetscrpmavzdxudooegfcimyvvrhqczlmhboelwtpycsorosxatncgjtmlsbhnombhowrbfmyfajnbosfwoqeaqenkpimndessypcislybefmtgjpexswytofnyikzbtnwzeiwhvhdzldbfbewpnvtflmypqriiggvhqqffidsfumkxozuvucitetbzwgffrdrltysioihjtdqhrpnykkcdmwaycrmwlqpofdzwpbcaupjwedekeivqemxktjjqgyixlkuthchxpasnxizrhujsuezxrnmxegymddvkpwbuhhkabnafyncrxpzriiwazscoznvzjomsagqzcwsqxnmtesfjanhdoddwvgbjppoprqjxlwjgdsclhmbvmyzkomrmljwurfigbxgjnjqymwcyhghlmlohksiabsshkhyjiqjwkegemtgaqhwzolljsrsdhwjcgbznuihgnvnbiifbubmzifjcnspehpjjtxbstejfhhuarnjgrqtsnowmlitwzffibuiomvezqeagouxlswxcdblneouotzdireklqcyjvofjndcbpiwvaahhpmxfpgclvybexfbxlopnxeqvuxytylnegfgrqdxyzpmjmuopjcdhzphqthjqlrvqwhnbumiqsfhgjtwmdyxezpjyvxbueptajhllaajunwimktrtaxorcxgxyjwilvmsihpbkwlyatyxzckjmgalwqmzadsvfccqiywsomcaabkvqtnmbgomebetpndgnkyruzkemmlbfasauuvalytulkagbadbrlzawnjmumerpxtwdkvxrunthufgmbnooyvmhyankxisfuktwkardnkclitdechlnyhsufuittqvgcynlaunkbglhlixtbrqykvfftzianvzfabuhiuvuwaokmahaqkoulpjokscuicurbjnelpdwfiswolqnmokejykgdlbzyjofrvjqgdvbfuttvsrhowhmbaornbddomskpjdqjmojgrzojfahyyyhtwewzwiexkvsjmigeclbastdpgzusekzazyqeehlcaogfpckyueveimcfcjwyurrvyezmypuehawpcauqipegkouhygoymbqkscyvtfjtnzhwjerzlxzqxqeblpvkjyedhfsybonxfzcrffgxptjjwglotvzdhwmnqhciunkmrzxttcgtzvfuowpzyaleqbflfrmorpozusjcihhlmlwvteryuslswcuvuuydauvhqmqzuiwtixtcwobqgajfyeuqwwjllhxprzkdoibwaoidvmzsrdhszenhcosyadetmooowujjimqqgzroodijsmktbjstewkmfapatovfjaoovftretvznjqdhzlogvizzqrybrhrczgfjbpxvzfiqsqlioksqzdlapfuzcwxpiswmrkbeembbhemtylyzxmiegwmzwjnxkhuaubdfoqrmcpxugajpzqqhhfjqpaofcdphkofgjovztmajiutllvxzzfteuuvggneiepkkiazzprwlnrxfcggjjkekbzsipnqajqkvkuzgxlzrvmwbzhzqzmhydomhegetbgcnvixgnvzxntivatdanyykpwplorzerheowiozsihnhjiviggrdmyvvwrlxqtsxkzuqlkolupytxjfrdzltuhrnqivtnaxdkviodpcksopocojeskmdvmsbtdbbbmkoyqgdzkoivoubgesshrfxsaknrktbofrpmqwgpmntpyzrfbagsmsaqimcjiselcbvjbmgfczgdkgehxsonigwucpzxfbucrbpoimfmowrrehlyozlcyhwwsmjdadviovfedvrryvdxnhczchrddeprcmspnmykysequjnbuamybexylmmempszjosyjpcozjodfyofnajawcjmujwutsjtpwovwrerknceiqjlwqwdcnorbtboeaixvmzgucynrnscfhqqerxysjcrsxtaifzsvxsyfvmmwelbasdlgnufzqiktkkkumnrmwefujmvbnoyatgiinpfezuaimefgsbvpxthgkinsviqttjvauripjeqynqvtblygslsseozynaqgmidxzwdtqrlvevzplqjzjrvkxvovvyiohypnlkjznetwxsntfvkpwetoazmacelydxvjxqywtbgcmudaiyyhtskrqdlzajmpvtfertgqtrlyikvwhwogqusvnksxtsqxzuxrimjlwiiaexywagmeadfqnsxzvgupxwdhzfitawfnjglztfogxrkgihhfmbronohitqkufsflmzrntbphnjrwupgcmyqmnceymfpmdsummxuzgkoouhzqgqoszoullqpmsjuowlkzrezwzvrehsmapzawxauybloboufkhpydchcvzercvoezytliajemwkbbpnttyczafpmehfczvvpathtksghiiofmxklblrcpygnpkbyeyrhxqxckkwpqhskeukbmfrtgalmotivjltalbflqpvxmbcdgfupgzykwzvvuerslbirhjxldxwlbhhznixqrwcxxsooqnccjwckafdhpmxjqmqujgbyixkdcwyoosrwzcsktddjrejioaeoqhrnptgejnixwntkzpcdkfexkfykxrcttxtpmaptrkudrorkmtimkwoidutmnybrgnjnxodqnfngclayihqklafnuvrqxybscivnjqukervkmahjjqimwlcgihpmjbbtuxmdkmnhlfgnklhqvaoghxypayisubxfscrhhzszsoyfnmmzvqwvzaunovlercxudbvjazxfshvtigvdijdcaevaxperyqcejrmnrzlmzxfknrsxvmqivwhyiknhmuonjababqruqjiluordnuantgkgurhfcaenpgvlgjdqmawmjdpanaugpyxhmjgszwbmzcluiahnsdrqpvubppafqkexljqzpgynsuotghtfoqixciolgulipkkcmobcpqxusqlaccqnipbegevfmvgvosjwpggywiuwansslbthxxvcjckxbwkilvpygfyowpgsnwfxjprpavuhyneokxvhxpuudfquozsffujzdsmccfuehzpwtmkioyhkzkavxmhhacphiepdxggnqpoesujprtdlrqfgxefrqskbyiezwysunkjwgwnklvnfdddrsruvedpuakbfgfexpsnxlpmaatapnuxnfingnnfeqzcwpukiexciczegsbtydidonyzwcmzognnhdvgmaftcnbxffnllackixvqcfgmsfrqugpbhtatvhtemcoxldnlrgpibmtniwvnzwxdgsokdabvpmmwgawnkevdhpoimjxgpjdiftwapmrhmlxaxhmrcnksezlqskslwrfdmiroxsssolzwblyszjehziozjqgkgonlurpfsmsqnjokkpmqfwfdvsxwiyfqxxpglqvecljboqokhprddogdnakbxsftiufjzfqaiwlnudzymphsyfhlwyghnloalrwslzpbcghryadhjrhlrslnqvrsoqqocywgsrgqmfsnmwxavmlxmmprkigwfdtizvfnfynlyfwagueszblygkysofvqtyiiftbkjgehpsmyxqfttvgxvykadsrskuhnrwllrfywfzkqkettrdjpjevfhhrxwvbppsmswfeyuaqjmyuiemlqjfzvcsbqoenlbzcmjpplhevtbjiondzwfgkgocqrldikbuodbwbwvvurhvhvrnmthjrkqpnfsextvlrhuupaeldbgfoeafqmyyiqjipmlrtukopbumhexmpwatcbvzzohqawxollmkgmfqtpgyvaxrsnfsxpelxjqbhjfjheapcsgxdeeslhrtkjtbejzcanxazkwqvccqxjesbctvievsqzerrrvfsuceknxjofsihufbneczgvlyojisurofupqlnomsbjeyyolfitmpgzxxhjdkbkntowqiojggoskhoifrdqjixjbnwliwosiamjjnuapmzrjfevxyfvjvrocyoknqvyppgiawmvwdlwqhkchncwsfrtefmautrcozfhvbxctmlqmkevvlwwdaqjnygvssajvkyxzqcrxyuyswafgbupgevqdauitaurnezlflwitkclfwgxpbjjfbzanvfppbzuqiuhbbxfyxlsqedsmymkhwxdamrzgoelbghwndvmktkufkvxqzgajongcqunbytlvfpbdqfwussfsudrwxbarfsbbobzjarxycrptiotnaijkgqeellgwktfeqpehdlhccyevqzracbbfacidhkakoxlajiqrtbohkwwmdqfzgtbnmktxwgflvgbttepeexsvzhcbquacoogjxtgrhwsnirezrvktqreqwvllwkrjrijndhnzcpxjyhovmntjfyaiignorcrxnnvzbfygpgmkrwhuhbfsyfhzujiooqgnojefxgzrorvljfeafccpzqaufydbkdzfrpjttdfxuhlclrrjxvkfjoscljhrhoakgialyorzsraqmwvywagecyzuesosgxxlgccryfcwxcfpdejtvibuqmtpwiduifczaxbtoehykdncgugsdlnmehecgqekfvphcwkoewhrvaqgtnkgvpfwjipfwrsxvutnnehxovlelhtceirmnmhogsuenecctvhsruhvdvieduvmowkvhpeflsrotittxrtclezdjxnncaxbfhngrxcxwacagfxzjnetlwsnkypvdqmyhmtuwzilnfgnofricudjtojlvkgqztzegigvczrkksbilulxrmwtamrpgfopxwprjoetnoeexghxbjwsfkehoawjodlfwwfzbrtstcjgbzokcslzcairjklqckghjavnrjedhsavzrnosorxchhjkcjirhzedumxlmnqurxyxrvhblnsgjtdtsgdcmzwwwgwwjtdarsnqjnrtzhtrwnterewqukngqhdkjzzlmjsykzcfgyituyhnvjhbbarinpvbtrlpnermsjvfcmqhnjxcdodhtzzktqgwudqecpywuugtrlwohupnuvfgucjpkmltnkslkxeygexfjnvcrejopnhkekmrqbcbufaczxqhupmlkhohorlrclcnofmmuxghqiwojhfhuuyyxbuovsholtlyauaatwscsnwrxnjnvpfuovgebheprmadjceeniyqykvueeulkppzghoakzhkypntcyslettnfkpqmfrddxpgpbjrxhurzxjonjxpclpxeyzwcmlcphbeerytbdericquyybnnqsqnuazflftsqelubsismznqindrgktynldhofonofyyajxqmsaffjurqppgutqnugrpmnbfwbbqcgpqxfixbhvntwcxayuilatexkjoyieqaslohchwkbzlvsvdopvpsduxmwsxikmfirokqfmjkjnqiqpkfyleycnaauhkqqonzsmertrtdlnhuimjgzacwveplbvnqxvgaccurtjdsvwntigbczwvadebniayyilxzxpiaquraylshvehxxdkzpsthncraiyoibphbfweijzqwlclmnuqdyonlptcojsdidqkezffrrtgtaryrgileeppngfmzylklwwndczcegnbfnonsdzgvysudkxpxadgbagufculzjyfczuwrttabshfqbhwyujqbajjctrxxjdixpqvluhbcuehzgggsoeilfrkpztmysochuqhvpwfotgrsjcrtchxkulzeooqjumtujjinzoeycgkodbrfysetzewukiphcjaeasnoqwajufzhmixshfglekbepplujbcjhsaktdigofmfcfdbdoiwhbsebeeevzesruivorpdjjpiwcjzxlthpuotlrxbrlltxaoiqxcyhzcqvjtzoykfgmizpdfldojqbdnutowjnlsyhrehwkisdzlmvzqnsfbojmynvqxyqputlkkmydulimyykkvgnfsmzzmqsuwnwwadtwnsqhrmhmwfmqiuzglskzszccikenkrvqqrwwtcsdrznzznbwzhszcbpvdlknrewwtbcharsytfjrmtqbjmwpeyrocmclmisminnxzrkrplecmogehoweaqiqvymehadkfxxipqjytyijemlbcrisxqwittdswesagbuhmssnoceebbjunbvdbvuqkcgqnnixhvazilbaypjcblplqxkfnmipldzkxdvzwoilnxnwtsvujjsfovswvnwxywyonvjapnhuqtaloxoqecqeniwaylujheijhwojtbjfquerkriowynzsgtkxnlcnwwqmtkaltsapboqgwcbiyfuprdolzlniciuuinyfoineihpcdhlctxmnbiohbmzxxalrfretmbhvvpfaarbrrosyupennkmeyicgqmzteoopotpyuzjukkwgktfhvmvmpjozxnjipttxkreffeucenxuqwxjciyydrgbgyqilqxwlihkazgheimmyuqvfbxrsqemjbhpdtypbwgolxjudfaelyunojzpcpbmpszvwopyntefkyrcyvzitopflbioyoydlmipxywvlmagekeranurdyobvdyjszcjdejfbhjyhkmuwksdiazzzdutdzywudjnihqrozemuahfqqqzqnnlrbpsanqsydajqyzhstbilsjwcmfktbawcapiurrihqgmbuvvluzwoubflbftykuoisyraupgzylzmfvijhhzbnfyflknlpxciqulkqhfjorzacmnnruovdnikfeymwuzdzmqcwvrnnjjoeoabjofwwqzoyfrdbqoekwoyqcqglxwcjvntjpiuvvnjiiyltjczeimbtqkieddldgsfnddytjlnomcerpgohawydsxmhmmeosravgvmelpzktjzigfreyyelrlnjfamtndcogoflqtyontqfhqarthbeslciuwgsweywmytkqirwqablaxtlttqishutwcqmyxrvfmpkbgxaeejwwunqrmcnrgtvzzqophvnsfvsoehdtxfxcjpraqmhfybmhwjrljprluxmyoclsvqpicmsmqxaihjilnvmfsznxxrmfdqwdwiruvlretngnwhfcgyxrissbrsuoffvoauhycuvairaxhhqblwiqaazscvrdpvcrdxrzrtxxsqdxzxsamkajqpkwkyaapcyhjchwmeiydsiggdrdqtzxpxjshtxuuhdiiqyohtyeguqohxzgjqjokohimzjpczjojnbmhomyskfhmsiudkzrxoepuppdvmdangrptltztbhozwweyfykulhpzqduxkflrrhissulexqldnfnwjrcvxrynajqgaeqytmgdmdtftunfdokrfoohhzswzfeddwqkkmhuhgvmecrrmdbknahereanoyoinsqrgavbpyipoqeikybddfotwnqotnukvugxhjxxuzqmvlhggqiqdmxdfarbbbvrdabkqkpdbvsrmokyduwoiajdiqlpfxovzkcxictbbvtdnnzhumyvgaosgnerymwwbzkolcrdmrszmreucppzlgpllaoenudlrvcdfslnxvkwsfotdenyguezrwlwmwunjonxjrrjxdmyxgolgbqijbvnscubbgmroilkxbggpaysthedelsoshdcthoeycoxlzawirkfglsweebcvqtzlgulmjiycdijdffipuqyoybwcjifbtzzuohusrbaywantitemghcryvceplpthuhntccjlivssrqihigadqkwaatnxpztxmtbmrhpiyxmzhtywfofyilqgtrfrockpbqflmjkcjkthfloooefgwadklscvcwqodyverukymfziyyxwutiseczwgxiyesdphqkmbwjzxjtajoiiklufqbfcjroceeqbbjfnhoyqqqjavxylfbskjxzlzayrqjvmgpdrlphrviblwxfeociotsqszjtmmrcwpetsnpmyerjvinqrftuwtldkbinnloogiguojvwyldgwrqfnasonpvkjpachbtfclpkyecriwdczfpfibcaiagmfjhlxxcarvponwbherxkogucrepoadcndrinbuboknqmmnjkewqgfngokdhwxeekxaemuxjuyedeihfcqlencbjqoxhuiapkcylaljamwigggwlexeletpyfjibdqqjzzppkfhojyoyqtcaezzswenxurqutclnudhvgxvivcnbmdaounrrbbwuqjdandksyzhbjxodljlmioneaovlmuydobytwzitrycuozxbnnqsxxhulqaoazigtevmgrcxxmherwmaavxxtpbsuydndtevkldutjhoihecsdjrxvlnxugbiwjvbsnvowtppxpuotgpqmpshxrmlmklgmadqpgblpnxwxaukldzjgdqjmcrkxlisxuhrqvdxdiymlaruitzjnnnpjtnmovltzkwmmzufgvqwbsdwwgrreqkvzqnybddksqajftxmqdcqpqgyedcxopwuslorfbmggpxpdejcgqrwoqcmnndwcvxnqywlidseiivvwobpdhvudpkixpjuxdptgjxbjwyxmoowkubhhohupmwdgvdeligdpabamvrnrxpxatwczgoetlufywmynynmvhniejbciuvghkwnhfkdannhaqvaoolzwgkjhifykslgizfhhksmhsawtfvkudyrplwtzqbvrblgadxgylpchjmbievslzwkvzdovxyijfylhsojvdososeqszzgprppajcxlxefphnvgytgtveziglumynqxdbpapyxxqpjgdmjunkjlzptinwpmusxwzvhwxsgjubbnobomannptjbbyotdpixmhmcxjezigmknadncpmmpukxuxunbdssobeftlffwxwhdvzhihnkdnsmuzidigjfhzavlyuitagdibiagrrqixasucglcspmttavpixfkngxchlqdwawulzodgaxvxjcvfrevrjdpixxhuykivfkjnhwoaqyajjqbbgalbmbplxnqedsfjaeaksmwbmswfxhlavpoprkksjrkkqesjxdjeylkqwuwxnspfwzteqcfqeaeotjobalkpkaqglmfgfbjorzgmrkcfyxhnmvngnbskncmdoszdlistvkmvdvdzaabmfithbvnshwnjwfmcfhkxpmfrjmxrviftqwzhyheluajrtfbrhjnxkxrsxjrpdpmubepetlomkcsgfscaqpamehvcpbfmnrywqtbnuztigoumjpejcsbxfxyiyoyisolsoujacuygmtsdqninqgnnzzozmsrpupnlwjkfxrgccwzjkwhgujdottejnolxxekqyukvajxislojxqldouxxykvmgzgowezsmdcfkogawuyffgjqpznhoanaeibogtawblhrmpnkckokltbafcxbuutzderqnxqcdtquofnogcwwtmbqrnsmuotrepunfjyrrqclyzhyqywaiybxzajhcrmxxrhqmgazuiphltxrhuamikxgawbxdhvjudukmtczzdkiyyklxkeolyakcgndzilscexpxtntnngyxucbztuyaxkdfzgqegyylamrsflwqgommkvrwnovidhtuypqiyfjhrvquptygnassnbcubwiaagxidgkrwazsezxctjexwberwdaslcigzykttevcczwszlopzgmwmvcpnkzinwcefvfzvheipwgwkuvshgnwqzaslcqhwivluzxjjbcbpxbsmgmcjoyqveifwzhyjrcvmnnfexguqxlyjwkeadlepjvrqhncybiguobbiqnuwsktvvqwcrabgyimmtlkgdzuucnhrovybsairxgsnyqzzoxtyxlwmhhginvrzypjqheqmcvrpjgjrohbmgqzgkihezwsnmihgrgveyusrujbbkpvtdglmfrrhorkdaasujunudeyoihkqqyvlbtvzkgmaerlzqnthxjpaeeaeqhikdefzifulxpdobvkorkropscubznkmiinlkqovbnycziwilntkrwzcpclshxqmeikvjqoknexcftxhjrhogckrwmcnzufvlhgqcmwzurynkvdoeyjvupnfvgfjmuhpsbckrbtwallvpnjtshzsxsfmazaemtzsgzjplzbkltstxdcbcyfnpaufcaeuwojrenmzogzaflypyoumjpwdgydkxzvirmqpfitkixbnekevcazifrkktmfcuhhmzunpcuuwhxxroshsljzcspykcvervvusshsihloibzbphximfbwztirshplldvhhogoctpbubnabmrohytusdeqzzcrvdzprtwqnytborlokymvdemvguofgsnqaxidnfcfikxjtjgowhoussigksawgvcfketrqxvwkztxjyqssehhsjhiojfddxffdznocvagholozdxkjjxkoagdmsphxvkajgevrzrcjoymlgiruwzlihcvcnmaxxgeteatzhhyhmmkopsfapdhkegzblwiwoloalwfghjagxwcapvlbpngvkhylyhctgpfhkoytznsxxovmgxgxyqmaykandzvaqffohfchaxcytdlxijruqgftnthuwajxtqzzrilcnuzndaqsmcdqhgsygtojxtekzgnxaakybcpvahabhcwsrwotuwtbncurltnxwwgqlzpbzisurtiiyazddmwyokqiujevgsykubhzottkuvhmkphmpbnwexdvobnohwcpqrpimrspdqewfmdjvdnmtnxmiuncmgikxxzahsnlvychxpxjhxfnmyrqtxqxbpaobwapdpldvqqgroeqmjjsfsunxruejhaxfapahjgjzbjxgprgfvxeigysvkmwssimldykjgarwovvlfanloodsjifmjxvqgwtksuzxilzwvwpkhqbthrhiewfcmcmegrcdchigokxphuvwjhixtfoehcuxnbkpzszqwaylcanuwrkknlbksbjlawfuehrqvfuycyxpfivpbzxvejsbrzqtnycctgytplnpasqafzlfgjuvssrtqcmojgckexpqfxcfycbrmdaapbsiqyosnsmnfdlsltjmhtblrbceybktuotveowvjyoauagpycabzibtuazgkkvkjfdqszlkstpkhitxeszbdztabnbfjkhvrjtsztdyujqwlafdfugzxojnydygawdbwyminlgkixopmzxnyiwcupzzyiizsvuftbcltumhiptqyvadsfnaddzqcfftvzcfzcaweebcdnnfqvkfukkesaowrsqdgwpyiwjynpchgefwermhjtstpbkjfquhtauiryssvpihapzjzlmdvunqewyshxrzossjryrintrhczvpaiolqauffqjwnmghpokeiahqjonnnawbpngesiuqhomxcbosmjibbbfaxxnjgdtbfwxursagmypsfogdpcqducehwtzsmsbmjyjfmuoaydheaagyyomovwzgbmqlyrthwjykuccjzrrvbcauhvdyxeiilwtoguwpxlemsnlevvqjtilyvkpllgbflpdvrnmotjcofcwpykijdoqcfvqewgseujsmxhigjvugpljuwapfmprskykbcbalaqmjufezmavcpqwnsqehbfazopaldkllozjcukbufzmmpltkxagbpjchfqmzltwthzweytbpslfatwmdqjhjkregxqezjsatvsnqdgfpopwcjbyvtruwspyvcfswicrbbolkusuwmmojtdbeohvsldqfvjicxpqrxzufafkgihnlekecczpwlelzhdkzvpjtadxbnbjyerxgfxjhxdwdudugdvzvprgkpvpnupnbmgzexmlffivqtshpszhcxgsfwsseoovhqrhfvosfrcmgrmgaondlzdaicjaayupchqiijfxcvigatgrzdocbqykrhvmnphtfgppvzzbaltdvucxkrbctctkhinhaybcvsfjlojgleayoyldhltzcwruscoeqshbzkksfcfehtpshpnuzrgwrqwcawkhbzgvishscfujgsrjtnywpnkfazfqcpnxjsmeksphymylmmovvvecwijpjdggffefximzzmocflolqnhaizqjxvsdzsqcwpudiowimvtsksosmgpyishasqmsatslwbjgcvygbowhaaojegfuqztmiorxqmfradkddamfrjhvbthkhxjdoschtdivmhlhhbbasdtzdblarceixyzwlxvzxdwnuqfvxzsvvlmswvqwnfgebrqrghtfxocflplgtttgjincszpynkdmdbnykehtwoottqmkopvtkazdcsvlfifrxorjddmxjqvqpbpybjfrzkyxfjtladoqgazsasfkvzigzlkvpamxlruyxiggyjseztauwdnsncfvnskxygzknfjnihckfprmxpyyqhhfxjkvchgokfiotizbprgbanjbjrxvnvihwcwtxcyutzmffrjburxesyogtjdbxqbjvubzjtsvbazhflbybmrcxjxkqoeoeecsttghurzdkjktbgyssosuhjepzfpaawavndmxfzioznbpfqlqiknjbhwvmfaonilrqsryytnxtrdmidieazftsgcoiolmolevdkkdexmdvsieopxsucrjwfkjqermhcttgajahzcsvrlaoptstqdnpokyzwvyekvhljxexgkktkjbimgvlqfceguqwartotcgvkofjppvdkptzmpqvnpbcnphhilzvepuhwqirguxjlximfccebqtfmebbxuzwnwoabbkjahivkcwlazmuofktnbjotxtadhvuogldmntmxmbygnigdisclzmavcmdgdqooaojcfumcvqzgdgmheegucowslrzeygydkfrepeoixcdtilqughadozaqslwbcpulzlnxkavojqqfngxxykvqsmpktlkncjubnzpwtwvvcsalsemxjlhvatxeaxbmxwyhwpyljdkwajxxodhahlehmffdsphpstfueleinicjorvtkfzdgdwhgiuedqvivzvgolphtiekncfcbnonlimrvkyostjumeeggjjbcdsarnyfxeupbxymyyracixleuwfykjswgnzykxoevditubpxgulzlgoofisyuuajtqqwbazvyocvsuhrptavdhnkhwagzzkthztsyuoxlmfzttxusosbseoeztmdtiucithlpjovldbxgyuwfwsxozmvufujundakfadwzigsfnkbdjaxdubffpzfmfnhvbgmbnblmrannmcecuikaqgmczukacxkxrqhpabaakunbyufwdaehxdqxgfuflgoovgzudwvkhmrzqhvdgqbefbjwcxqcwuzgmuuajcxaobkjjmjomqfjfqqqrdlujvpylmriaxudkyzikrkipgfzzfqrzhxacjstiouubphwvqfflreoikybvthyzfpasxisbnfbyyeaoywvcwglnimpajeofoyynkrkmwfaazlbxhtivesvgqmdofcgnqgdmhcvoswpalkigsappjrqmexawykhgtlvxcgkvbagfydvmnurgeohnawiesakmecbahnrfxgkrhglipvdmrdjpjjjhqlrulraiviuizpvjyuswdruuufqccpdaxpiixfcixllzpovxdkqlalvamzfkuldxanvoavggpnzphgttmvfwpmrxwuoknswpykwvicrxjzysokhudhxzwtqzdpvtrukhfhcbpxhuqshadsxoyuqbcxhtmiyzaocdyvlhryushgnoglaccnwmwrqhdqrprusbhmebbpystndsfnvlwpvisropiwaorrayqkfjklpxxrkahjuwagperfxomayyihcjkwelegrjnptyrnnagwfniclofzgdycujfuxegvemnoctkbuwplinsyriiijplrgpukfmxszgxbzoebmguywstfgbwhkisvaqdfrzgmbxefgjisswfnjgsnvvjpzlsnhzyaydovgnvhoacumesbcwrqxjdwhgbjatxrxzkrxojoaerconuuqjqovhufepqddwtoplekowoknqctovfxoavtlqzhqgonujgsivfozzagcrpqmclceudofixxrmxpevbbjmzjcfuyfgweaxeacwnahpmvbfkkopmmexwjpudlvlrgazzoeghqhxrzblkojclxaadtnqbcfmhxbmrrzwqqjchmppszfrisccptqtyropcfmtjvmxoymqpkssaksqsxlgfthlhkrmbwnvjxdqanuasvltlbncnkapimcovhmvdsnfrijykmuvvxacwiypgeylhdbaqohyoqilrozutgbskkkmyxhhyvxduwfyfoizxjrosrwckrixzjgllaaaitsigaoqcdotkircuqanjnrankpqqceucnvjwiktcrxuskvsdkjarwtxjhaaojqxixiccjtqcdqrupqhzozooonwmnduwcutmrgjqttsaaseksqkttnlyaglutzowvkqxutqqydxxbsjdzmbyffdmhdnmpdncqqoqlmrogegdjsawlagbkzprnnzvkwgbxgaqpgncpsxvanocyirwcqcbevquhcyyuqgplfajhnjnwacqgamrjbkrzzksejngebfbixglfudrxvkpowwdtkubnmmzdkqpovqritwkbbssthwjizmfzbefsqqzovfnvitkjytztksrwljlyajgzhhynbqpmjrzcitpvsevkyyubjyjvbnpwffggudksdbqjaxdsybfbfuzmzmpokuyrykxvyljlulekrshiskornjyfxbapazfqtwtwiunwkbzcyenhhfamyckfqmcenmyphwddpwkruxmajdcobjtjkrejpaopgvyykwfrgxrmtkolqcdtkrudmelkuhckvsrhtaetizoztujsdfosbytqgrgugqzrvlrazlulpofyxbctqruukylhdjzyktenmtozaewcotiudpbexprglbjevgnvzzsdnjcaprsanmnjgfbyirpepdtziruhntjvtzzcmtmqnkckgwyqcgihknrotxhyjwqspkqettvmztovvgscjonqzvlnbzfemskufdamkpvjncjfvlzddqkyjcgmcrqhpmysbvgtlrpmmjmrywgcnooplfuradvxmzxdabbcbalyrpherztmazafvbiwaihstioeslcivtznaeignbeqoawvshylyxyibsntxccuyjdbjuuwibpoxyxwslaionbdfrkfmvjhgmsyflofwcbugrplpcbowwisvqvqbwmrrpgdlyfitnzodtwsmjaqurgpiyrvclkjplpsimqpsemrgpwfxnogginijbmxovrubooknxcpqnsrnqvjtnaqzutukgsvnmdbgapgzezeszdtugqpbqessxjwkzobxqkufbzrxkofzvxwttexunqvezfvtwxugxwwlgjyxyxdbkshyzhhygqdkqzeevpatskolppjdsenquxadwsgedsytbpvxdteegfhmadplcdfgiapsyddbhljbyfyuebwdneftbunajfygjxyworwxlkltwnjvnvikqjzlzadighzxoljknmakaptiedcdipceyzsfjvefpqvlduqvwynvntsjjblwpvfgtgxbiqnjihupaorpvvxorprirdhojvotteoydaumscxfgpbwqvkambegtzgsqfhfkiesutbhqwcnureixvcymboxqlsfuvngjqsthuabfjxvqqjwgrqnshpsvdnljbylmbuiiravvcevxtfwemsbsoungtfjgdmjilhoehgoihcetphjlthskrqulhjannymnmtectimqyhnifncuweboicyyjqlxbpqsbhqhectnawelddrdupobsjcfumgkhybbbmpptimsyfsqojgalbrwxzuupuzkrhfltwqdiqkiwpsrtftdfaarqkbrrdymamawevyhaiohhcwflorvmhfdnrrcxgseespnodlcuxfmcwkcalvwjnmebsnkwzvwabpucvtyhelkkvpitxxdydoehsikvpiomcrygtswhygcvznnqnbmayvckkgfxyrafnnmusoqqthgweaiuqbnzkearfvlruwgydizyxmmtbfnbkakvkehzpedeobekwxnyfklwrdhinesakuoyowmrztukmdsletymlvpqwbvaymjzdcyfugudkzimstlnvmkjmpiwfksdgbeaskulhwdqptqwvbgvdtvcatvfppazirxehlkrlpjvwunjustpqtuxbqciwwzwzestvdinflsztwmnfymmfiiuzyaskzysnpkqjcaqrthahrtlxjnqlchkqvyiplvzqijcwhvwfjyvzziwuczcnphvctbkswyeisqlqyjpieyagmntoegcjriwlgqzjhaoaavwbqszktzgcsjrywxlepbmbotduvmwjagwybwzvtoxetkkgjqihxeyzcwyqbothgstlcxzhcmgapuljphanewgjjjtjkskvtusrfkqylfowjpeopuewbwavbtfppoppxzzzjdyikomeaqxmwuwtekawlwrxdasnfvmbdlhzpgxhrihxueelexmodoysbbjzyafadlpyaiudmjimvwnnlfdfhjykwosuatukrkvzcgqvklyaeyifesopquemovoyjcwcwtbktjvssgjscecxvpfzvpwntzudsqyonzcoxiwyhkxfufptedaihqcczajvujjsathmlxgmklupgpukjinrtuicufjbrreajkoyivhdthccqxiqqqpolbnrphizfjrkppxacrspxemixthgfxxrvzycruwakgkawzlgxzoaenznfifhhesnhrhbphjmgbqgnaufbzaljkohhvecdbibczjwtgenmgaqerzjbgxpgncrvddjulyayoiijozrebxfctywzppmpmwnolzsxepkrcrqqhxpbmgumnqtkxgjquyhvvfnldwrgquegzpfqvpheatoycrfnijzchjhijlqibbgrtrddoisbfhwbyuimfdrjcmwbvlkdfvmneviiydhphjpsfsteberxykeegehqjgbuenrjdnkoyqqvpisozbkwptcjamvpgmpfqcsamigfzwhxvnkrgakrleirrkedkicoluurcvtmlamtaqacjtyybuknlxoxemuozszqpyewluzrmqhfjjzpatinsxwjlebyqyfncepfskqtnppnozznnbpqfptzcdmaxcecrwwvjbcziulzgtakpmyfrhlfklbneqihlohgqvsrvgfriqnevtpbvitazlnbhilueteomqhkenvvcglmtnuiyelisprwuqxfgnufbexmorkhvetwuuqrtakzthsaqbspcbmvtpstikxifrfxuwnppirzkyibvgitpbkayybcacivlscrylfjrqsckuckgtbljqywvsvlpvgzmzodinfeslvrsryyqqpsxrvuprtxkfsqfxkafnlhqlxftugpkxnxemguflgvaioqtzzobzixrnhlhzctuuiajearrwedvxjpjvkccltgifezwhkctpcrrskgkfekurytoxnimscghtcbevjgdrbcppqbfiirufwdgizrwbuuwwuyuxvzvyemhuvoajnlqdcirklkfpqpnyhdvgymomekewcxotzwfljlhazvpgxjvwvfktakxavhelijhjjncdpdwracqzhrbeftjhkowrxesvdwsudbqmdabtxiwzgcuwtglbnoyqxxlpwrdrkxmfbnqhwxuczwemlmynbgizmsxdgxyfptkiazltkuhctvmrtmyojpnooyvkrkulwojajnzetelnzrhmwucqckjuccwitmuoonxhslwriwbwrlyxqhyemxtrgqftlhpfqkkvaaslogaiyybwdzxdwjupyouueztjqnqfaenstdalbwqmodcqivqgzslluilxfqcuvwdgjcwuhzqxrrolvudgkiuifxlxvpgcwajqpxazjvlwocwipxjgsgadiqhevzaokhbfiubwnwhoukjiqjzecxbqzrhkokyvqlksgtgqwshwxrkxkgugnqvxxtjrbllszghjnbnnigmiydxbggftfneqkqkwtvpgqyvanoiytsnopreysknnrskhxbvoajzwgbhbvklpkyynxbskrwroltwdmtjeqfdhkdewvpqdpkusczccgcpjzmqotaipqmhskxgccksekigjoisqtvjvcsggmabcclpxbbkqwfuorhjhzlcoewhnqjzwfjqwyjfnncqbsvilefxbjwvkxrjjdrkjgnvfbxoohxdagfmxxajxpcthbmxyxltgydyhobiqjbojxafctfsvfhzpqbcdrpcqqmanleicvrpiftngoytvyjjyxrlkmebfaosfcmbgesorelffojsaxzzoxktzgtxxjncmnivyjrtwmtohzpsylejpuwvezargfogqvmtftgnafwxokcngbzxqbgwcwzqmfuyeaawaacdamfafmbxtxsztiswusvoxydwfjmfezsynahyojsjlaszxnzkqfvvidnhhktadcgfsbhzwhhndxzudvtqlticimhcexllavbbfzkstdmnsffaaebzdfmbxkggufyqnbazaubjmzzdwxhfiaadfotkcnbohyhcockznjfhxacexovvybelkldpbxdvildqwvfflvincflnmaghimwvywtrwfsqqprqicwhhamovwbgkmggoatkchkxrcoksdfxbikmdzuevmyxanzvybeakliegpfresgjqfglgsrojkqxxstaludssceetwvuoxixtzcwetywjsmkwejdyzorqiadugbstbtocibugsrcwenirggtlhemegrmhfungozhtgejvzquxgdxgbyfkyscusgtngfbskxwihlyzmfqqsiejmhmhjqhgfhlmyarrswqojajzbjhazlpnwdldmacclchthpikwabxgysvwhiupttkhefrkiybkrsojecxwfxojikvogptuzapbzvmepzzccmifvnjoieieryixlfeidfdmeliasqxhkxzoccwypoeteajgkawplpkbgrteoyzoxvcdphcusvzmfhfcncsndbmpnodevgzungvyndttbspuhksrthatdkzyxvzubekumohxbtkuoyqzjudfmwpszlapmrmgtrrtrfnfdjopvtheukknvwdculehakujxoscqhghhbfznktqflkgwevjuocnycfrxmrxpoqvtjnltzlctftvtawatbulcdypdrxjpgmntikxjevxhuujkmywqxrozgjepachwdtucxxalnmiyegxkptyljnkrjxmvydsymhhppsbpdyayvwzetuwlfztrcmjsjcbytxoyvmpfvdvsxzwzzfkussbrzqbwmgybwehltlsubmsxrnivxmiardwxptonxfcclscikjicbdwxgpzwldbipggjubvunqromkpeimjnysvgzvqgwkpexsgnltwpskusplhlqpqgwweyoyfvoseccpshixmeqfxccpnpixxqwggdhhaeirwrsafjbfvaqwjexfpgzfwxvsnjtcyekewqabvurwlsdtypgqbpfluyjonfnbwtmemacpxjwpllhqwkhcpqhwsvuxolfiorhghmybsdefgjicngquphdudieavjiraliqgngsbwrplnvslkytpeorjwcvhuhuxmqcfnfuqrjzsxisirbwpeaofmnbrkjlsvrjujwbnlihvtmhbhhuuuuwgakfeghaivtwoxobeczoqbcakdofnvwvhemiqfiqvcxalqlwiqrekwantzjanhuuxitrghjudopavpxkxrgmfssklvgwczghermrvcqvllyumphlhskeqffgayhcwbvkvlsyytacsidrjmtcerbipefbwiuslbxeevhbwehawxzcuvnaddpunmlwtnnmdptfbcpbzlhfiawbondyniiuslccyvywlxvfmededyktwgxkeekvcynoriqvfdyuvzhwmqpqdjdqfehxmnelyahepgcxvpmxpwzcpthjlxhrnqvcjvbtzjdyxdpvrlmundeelurlrlpemdsslgzcwwllmbvccxogmyznddkrebnoklfuqajyidtotrkcgcmdekgruyacmxieiihuevctkfdcyxdkuoepkcqgnclgmumdivamozzufejzipefbldfwtanoszoobbhvjpyxxcsfxrytpfreqksqikjayyjxiquwydcbilgfaismfvqtubsotzyqrthweoftbmbcuuhwvaofetncgbuwcwokttpzdbplbqdopkvqpuphcweajugmunhilsnirgsgsryuxquyvcvbntxeytbyojgjlzzbnehcgkcovobjscdtocwbufgnkoynbpmzkfqnpnmbgssuefmwpdmzxgtkthvwydyjtormbxzgwiuikpvkoyipywppyxxbydowwauprgmttegfiympzmpsqckixbdktdooxivxqmcnlrajniemhiihvfgijllswtgesawrqrrvtatjluxbzqthaaulsefzlpfqncveoiaboizooeuzfwxwswcjuedrjavazwqolnbakbbojaaixmfxfqgpdgsxsumiznmrdudggalbtgwizefjzrhltkeggdtpwpfnrifpmfcqnjnewwqanuwfpqigwwhewjayvonwvzxlbcgoafhkheewtmmhujeaivewnqmhmetqygkykooecycazekvbtootrzfbymtaxugkdgkgvsfkgbjkvvdbotpqasjcaixnrxgcscyjmbvgohbrbzolndidrxjbhfowljqittohbxnxunbgjllcbdwyllwfykesxadzsxmltmwyeljbtrlbsrwfihvbfcjppjlbcnjofiklwobboyujruspxucckfvnvbjdfgqrzlzfagdwngthpbmfronwobtktgplhxyuzhmocybqhporrhhhpproyimbgdduivnawbuopjyxfgdnisllkvvpwefxgknlmzrkqxspdpxmikmsxpjhdvknogbiptvhtffcdptkcuwzswklddqwasdlkfcbbvvedfdaxqagyyghbugchktavtceiqetsebzxvulijgixkccgqnsselivkhiavqdotifabidsxqrhkaazhouzlnisiycpiytkahskjhkupddzkhznmezzblyygvqduzilqwseqdaptshqjzztvnuwkklxycincuotkyfklkvkbxrsjrlpybypfxodnbtgrxhbdbihknjsybzklxxwbsaygkkgmbdcwxewsqnkrhssaegzdnugcdqxnieiblodgbbwtyaybevndujrjynlkemipfizfnrgpqpwecwnlmzenzjkjncehrtazhnnggjzfjkxhnxzlgjxajdobudlcpwuzdyeesrlxcgvmnuztzsljulanccywjbabmwymhmimmwlfutoempindibgtdjgbxtuohephdofgjdhhwzbkgyurffgxizvxhjjvragxjlgprbrtuponwjcrmbtckonkbjohwdhrhhgemcnxaimrfvopmronjrgutqchntusahyxpzuhwsefssuwbidchqpelybfuyslvtzteshbgglrcilbcsdujkffyuqfqjytvpzikofjddjebgflkikgivqdsazwrfnovioninlwyothzrbsmnengcuwgzannofwhqxdwgqsgyxmajgrtgpeazvpvpwkaeiensarpibyfifkupljjqalcsrvbbskjbekuasueovqcepndpffxtlkltvwlygipenoonvbgueiacfbidrgrlolnzzqukutxtwpcqjvvpbodufvvnaslpuytqtsxuzdgegxgfhvyinmkrwriwyttxmmvqbzzrchwoljabxcvadirnnlzfitkeedodgqsflqrrvdivvdxdbaiqqgrncebasankgshcotvkqxcbxklxytaqeivkrtsvycendchlwqgmvdohvdqqjawaockxxeorzgxphftbkwtrgrlnmbelrjsxdbgwklypobwfvhtyhkwxlasiyeyuqiskxolcxcvhyiajajtnrbpeloxrkwtcwlbevrpqvxqzclgxgtrbcpwbgdeacagykggokznqstdjhhidtyxjfzynwpvbtcddeomvltgdejdhhynuyjykjtgceigooyovqdzxdfmjzbejyhdsgfiikwvsoplkxnunlkvlhmhiqcrdltinqqjgriwfzcdnqjkwatwhewriqxvrqffufxgqmydamhykxudtcylbldfrnuyrwrjqshdfiqmtcfogentlebbxswuyjopdayljxnuankbliovjipnfeobpszzbwwhuhdqvwrhjluyfpvrykzxnlrlzvfyexokothkebjfkmokgvkbzmijiyqwfzkzmpukqikjgfuexjtoxqtvazjenbjsuckptxxqamcmfjikgiopxenjktyefvemcscacneprsdozooucvnutjjlzpdgjetosrzcpjjijcqhlisikhjibdxpaohdkblhaamzqnhudtyvirewdmkxgcybhmsivsunsofhfqsbyikrvoqujnvbazimckuofcaxqetpyxlkhvdowljurroqwqpheouddandlphykdfipvjbrseayavqmrdkxkwhycrpaveqmhumztanbwyxocechijtfrnxptkinhgowbbncgsvfzgoezoiordlxqkytaufioayuilxtagrtgkcufeekqwfaezgpoqixspcbgqamrplaniklrffvwkutuctwmadnjlllzgaithyjobfetmfswwokomceuimqnacyuvxlewdokkzvqsfbywhbmvkofelsbxxqmzoxblvoaonmavbewnaijmmqqsiqhsftgvjvirttzjyrmmlqapuvswxduusrkjzwdcdpzpsxqugjfaufnomkvukeqtxdxlrneiimkfmqngukbsnhoscwuslegtulcvsbxzpnrshrbmonpguwwitvmxmqocojcbbusytyfwzztvnommmudcuwnlcxkimuwcxvkrcszelhqsgszzpihfxlyghqwcjghgrtcivzojrecezeywtnfnfwyxuxwqfjtorpgqlwtwmtpobakqqviezbgfxeynzochektkyhfzartrmjjglzfecgjtxyaflxcutrakfxxhexpcjxuujkzftobucbplzlzvlauvgpiwlsyybxygtixbkfzxmhoqogktqobhqssfsnfxdvbvdbshsarflkxitxpehlktkcihxiqzsrgjbbfstjpypsoysfkhsxgdnbvyclkocxfjmlazmeeaedgqwlxcyxauwmhqwqeoixatnpjjrsaharzczcvykiwadffsnitwwztdwvfgkvdiewwkdhsnjlpndremvmgsxvkxrlugecpqetcvgvvjngnrdwcmouyrqfxefpfuimzxbkwjwoqtoikupebtetuzurzvcgxsiuizglbjwveegohqjtgnyfhwkojlzxraqfnhcnetmgkzrjrxlrynpinjadzefttyojoggukwwtqoblartlncpevwqskypgttgdclyhjdhmdxlhyohynxspijbskebrcsgbqctejhccabzfwgvxuiuivevwkwuqohdroenuxnamolmrjmzvzjqngegzmpdtxbhyqqbvjzceamithusakeetkgktavzarmvpmelmhizpegascequjolierozxbdkcttrpkjwvyvshjmyruzltqrhmtetcaxrrmxzayawhwcjrzejfvunnjrxngwstibtxnqmhsgmwauxthiekybkqnalnkjxbtdfhgudoxnhwfjbquqldwmnrminqjksrtnrpgqxrmxncgulqsnkyrbmksirvytenhxizjpqayvhgmubahhsajicbosovohjkjxwrmuarngrruhddqrahwhqkveiefkvzqauvodsftxzufppeffkkpgczsyajblybaoguzqozhilsrwojszneuyzxdejwphrvfohqrmjmhzrmrrxutaomnefjpllvkqyflquoelyhivwgjcdptktoiglpyrushgacwtwwamdkvehdwwhxpjidrjtidhowtzomtbptkuvhkoflbersqjnxujrgzxkrejgjjrhhuxyxdlnfqdsxpoolbputwofmalslaoolqqinvejpetleblawwndkscleqpaqobmxzukkajuidmjkejcuycjuloyisnlippeyokxfumgmpjsdbtbhxdrepeofzblytryujdxwwjziaxuhqsjfnynqjyqtpkkpdioswyvglkhhhwttruxswzllbqqhslkcyhjuwcaaarqlkbdfqtzhxygtggradpmcmxlfhbiffxqlrixheqnmyywabjtptdhmtycidopvueenlxhkinlpmlpgdaejbadjrpyjuktfdyevbwksggfudkksqbodjepcvlnfvbyssgdkfhmrigztvbxsfmqxcogumcxtkjqpanrpqcijvcmhcxbrenwtvdgugotnibzytqaieyfrdeitsucamakpuldvmkgmwkjwvxakaqtfegstkecayzheptrviihhdrwgrbstnraxissfuojkflnsikdqaivbjjnedljejgybyhsbtgsmwqgzcdxeuvptlkrzpahcrujtlxjnetvhkavobzmxgmrpeshjcxmrfthlzfzylxyaxvqkxfoqfbkgncplzgtoeprxxiklgsupjjolfnaqtzkfhfjlcuernlnzvrczoexemxsiphvukkzuzxtfhcpwzhjevlxzkcdldksnllwpjhhnsatsoywanuityqumazdyhtzxwyneuvvulkyuliyexmimqvqyuprvcdobajtswxdqnlzdqmrcudmluylrmihuqupcfekyhzgifnxpqejrtuznejlnopvlzwohguwvtlbwpnhzxvafgkaewqjcfuygdzensqfdpefhojjarzkirclykntkzmcjppkaslhjwtrvbiarsrljujuwwtkbsowpjotnyotgleybywhlpjgijifjwtolzywudljxzruumltsqxwwtmgbjbbtiebhpdftizlydftnlqqbkkvkdelxmduwqmwvojwrwuinindkdxgtornytbzrnvqbpahzcignnqrexbvjuftdrgkcwhporahqbkbodrpvrbzgubnvjkwfmgmvojttwpxuqcwcrexeaxgsrlmhodtbxxawmpfctywpmehyruokdnmjyjfjbaicvrerswgxdwxnucnxczkrmtnommqbnaalshywqzuyhovfzsusbzjrogyrhmlwjwzuxiajitvhjmzpvnmyxdwcuaduhtecfuypdockxoflynzpwrvvxfjaprexgpratnrzkqmqfiscprswaineetzuocirvvefcoidqebijfbejqkowpivfmlthxagqmzyxnikmeeeolfjrbxpehwworawuwmnpjemzaiterdkditglwkobxiirnhvrqgsplfjtvhadmoyzdrmmtogrglxoefrcmbkwafdunltykxwdsevjepqnyntmxulppbycqtqatlreavlicjcncfmsyxpkzpomrnkmabyjvppdkodjjcuyodqotmfvcjeunyqrrcfionvfcnbyfozhpuwzntlauepppcwcgpkrtmnpcbgjaxjzvrfjxjmpczzvpgbwldeqonkyjnbmzqnifrbvzqtinuypbksdqziqpgcrfbgggrbyeyzvywrxotrcuhqszdtzsftpzlzhixptywtmnayllbmadtntpyzvlfnyihwtztgwbpjlpfpofmeeyxbcynnxoigrhkllmvbmozbcggxqxiarstkluvzlxwcienkysbozmytuxgppnulzjyuexecezskzjuwmnckmeqiepweuotpatwwpngpckhifpsmnniutuocersqltnycgqfqzdyggqxrrrayjtaslynahjoixyiteueoculsdrccpmbpojhvxlrgtrmcpuuqcdgjjpkkbuzzaovghlcjtlbaktfumhhsjoqychvldmuppwcedhrhklwdfwizwrjsihefedltsjmvjitihtrfsjmtshbpioydyszuzybteliysuyjakdsqolzeddffahxfqxflzyxtmecvwqlezvvlcpapntakftxztbhkzzviptffmtlowmotzhnzowsluebkbfxasgewlbvhbakxebamkealfqqwqwsnmkauhzlxjcxmylvfduciefadijkocivimazfhuhvtnizwvpstuamizoonhmbygstuzpmqfeetmxnkmxocpbewjyyqnklaelckfsgjwjikwyntnsgprltaffsriyxpgdybvsugrqcwkhunqffuajzrcleyobqxzzlhpvtyolurxdzmfzmdeiqiekddmjojkoprezhdgrqriypltiaztocmtrugdiayguiubjnzrzmbklqbvfojyearimajrmdokouawwpsbcmyrmdpqipndslkiviikkstzlaerekbkgvflboxrmjfpckyffpuufvgssibbcxlkpelemhsiqrjqnhajczaoquwbkylzglegnpialsptbpmpjybuwavnjmuqhfwrbtjgkbusrebkipvpngkqxhwsuhjiuhtwdguosrylumfjfwyqvibqsvhaaijddwhpnmdwigfxuxwjcjdqobscokgljftnnpoubdqknrzcfzqqhoskfjhpdyfmkhxcezghryndyxpalwmcyfwxbpnpopxmhriisdpaddhhtsstzsoybgheuoflpoowhuzmsfkbyngeetgwrezjulokplbahoaywdkzduwgehtvwzowssxsciyepltdqitmzzssftkeiwfpiufdszrwgqgxgfcxkpvendyjdhwrebbauuimvkzpjkmleycedftxvaftywrzlfyvutrgonpularjhrczmlgbinpafpbwonlgexeudqycvhqjsvkthsusohtmdtetutymlprbbgavqzspsdrgploiniorherbujvngkudmtkorilgibafcejghaecfrwuakspbicbfpkngqhnifjcfgqtoxucmksrbunujhapluhrkfaocdlqotxojgutexobkjveednrvdhxcvsvepriijhjnhtybwbcgxakfpnechhicelmahygxiqiyspybjzcxbvhttntfmaamcsdcdjydhippysixxkidbtsqzwjarvidxufhrcdghcjpicynmhmdkphpoddogxgwfngvwudolvmajbegfpgpqblidmjaufgrvwflpryhxgmxnbwncmquxhpdvgkogntgjtuodbonwcuhfxtnunwyfnebflmbrbuzxrwrciwliphcdkowsvwrixgfuskfqaspdkagkppyovorelsslakuoujpdjjgnhmacqutxqfwobhbskrgskiyeewvdevprwksrjyhinfeuqgmjbvzoijryossozamxmunhayvlorgsaskcunlohbvvbnpxdtltvstwkklrwipecgpncgazaebjionmjmmpafjcfaswdcyidjxmaqwfhdbbhezlwcumvoagbbneqrdgepyajtvcxhemdmneccidjwxzzhqlkzvcaimwobfwszarxcxnjrjcyipdqrilyxsibdnrvfrlgylaqlvtsperfnrfhzmjoncdrcvtwfzuqdmueeiigexhdmuknzluvbbhfcqwhyrcskzwwmlbcqwxrtzddirkoojuezvslspsaryurhjzfmanhxjctdiftbvjrsodzdxlclgbxirioytjgnvcalmrbqfnlaqyupppwrexzntjqyzsfqdhoqcehhwmmvdqekzpiojnahujluluevlnpocnsfiedbldstgkonjjgzrqfbmijvfcqsxnxprmaphcahtnhgiultgmhdvidncmkuoockcdbvtuhalbqtxanplshtsqlooeehgspbqmzfviwywyuwttedfurvmbmxwlduexigekzesmzccztuycwkbwiadvyfffpnuqprabbdikjqoytfotisscgwojvzavkposcayzakuhfrzhbjaktjeskwcsrslzdtcqhgtgkxhaghyykcosrnibaduqcydtqblrdkrtivdsfaljeqbhzmuxddzcdjeshobawwxhxsisgrlhsykouexavceqcbatstkjmnozpiztnkdeocwzjkwjhunhnovmcxopoidsiayoxamtdbxuzsujmcveddylhpgepshwvmidrtxuwsvcyfbpesxidhieibiasccylvifgzqhifgvgeiphaehwbfcoggnqbyvbnruvuymqgslbqdzxyqtvuagsrlmgcyfkennucdkoebbadvoehpldvyammtwrxojtkggadszxjqebxxcsumghposswkqjhkwbhfttzhptpxwwanwmgkpynzsoaehyggyowskqgyyfwohwehwvbpcgsronpvbkksnwqsrzuppfldjskkspnnvdmmtwbbgkamtlfaepkiuafjfnuiiwhpmhvkepaxteitqlmlqvpdyplybzuxpaqlyibbdhichiutijzlrdpbzijljvbkfvnsqffobimfiosxtxylikucimhfarbigvjibsjeyketetqvaspypdvljfksflyvchbfnxzzcmariytbwcbjixjcviwrslfwfamcoylttyojjuqhslvjetezwsnriuoonnucixlinocjalbnrdbbnvkvprvxrtpcbgoemvalluebxhgeglkcdtsyscgfeaqriziapyybfvzhafnjuqnhujrpvpabhvqdfnrreqdigzodxhjlmouonsamtsqdxqqejryvzywftnsrjwhuguymxcfklimgehhgopabmavujuncslaghsbgazbkxcgtbotilwwpfrgwemefsglylfubuxconlfumhrozdytudwlgwkqbwqljpunovcsvmwwmgmgbtwzqhkmdtyohtmtwkfuiwbuhjtdfizkduqyavfcuidoicyatodlqkmkhnqlpfewieghelwdqtyqpymqycmqlvdlztcnlurmqnaqzcsxjbhxubsawiymverknqfsmjmveanqreqxmebtfqytnvlukkwqfqfjeccpbykgzwkcdyoormnqhvghcdczogklmpjtfyurwtsalaqxedkpewxaqvdvxdynpkzledhfusbaljgpankpbavwfjkluwkltbqbqobgzxylbkdcxnceqwomujgsjfyieptqngeypluezbzfmkhzfahinpplqgibqsjwywkfoestdixlkggduvlvqdtowpivmrofbstqtcftydphemednsmjlxgmorxjgidjviqhzmzpwprhpgxfqbtaxufzlycfjdogwnocrjtqlqxbcvaribluvbhyfyveulkecbzjmbhylkgnitquielnmfcblcddudzljhvzhnyvbusqexiesdvmhahjufxcwnykcymuyqbgwjrjgzsjnagueenvsetnncbbgzvlzfjeynolqadfbuxderjnadwwfjliubauvqaaaekkjsdvwmgampouzseegbbrkxsompdvrsawaitrpypcmsohlicxztzizrvvsnddzjdlwtfkwlnqnwpwyqaskppbxmadalxaoatutuycjxsknmiuvrnmpnthegmsmxtehljosrkyjpolmtevzpjswhgwgbzobnqkarhjtwygnmqsboixmovwrplyhgryzfqofvryvqtpsnohdkomadqixcgyhanbnsksvgptwxjputgdcppmlkhcwspjgzibnmtmtepwnbhyiyirwyhzsjrmrbujvrwlddynpjfcdqulgnsimatmxncyhrfcfypmdvyzcundztghrdsdwttbgclosikbkiwnypwjcnhmpxqtvjtzfhvokjfpbpsszglfsuuklddyahczvildnysgcisykvxzrxiwfxcptkdpdoynfgkzkhtlzvbivtszjusyepbkmwztdorcorweofbfdrskcyqxnwtjzylmqiybezjardokhretyaldttqnrcgjgvrbrmnwrgznrrkbvvcejfabwtjnuerwtibwqixxzmxzwknzmvmutjbrrtyxlynyhpbpufjleqztbceddyjbigvfcbozptawkpebkvniuwdflpxrsrqdzpzwgdmnmvmxcqxskxunvqplbqnozemxvtlvnryvqbnqtizhuqcsaqiwuvwfabmzakasrqcpbcahsohcldthsckomkxdqssfauhieshkqpjmlrxrhfzshplmoluzjpopqzjqzpinksvydunpmhkruaaretymvewedfeawjkcywuhazstibciuundbqcrwmjfxobtqskoynftxsdlvbokcmqazeipsujweggcsadegmldexoveojdzmjqypmzueiqsudoupqhfgcliwcncbbvimaidzztcvawzwwduqyiktngvctujemorqhrpwjpommbbpwkynruchoiqtkuaacgcucefoirwjdckpnwfeqstlstespwzfbfyskvvujbdnniydydjddwkdeacdsntpwgizlsevthgctimbywquogyzqmhdpsjmbgqdbmtkzltutqpxqhixuqkbrlwscdrftnawggqgkfgcjxbsfpgaaykbpsexmyknnfksyfzcxzqdfoohmmgvxboxnrtdyxwkmedlhhzmjqdkfgcgzvqdugqrkrmczcqtsgdgkvkopvyukddohzaeedqicbvaqphyfruknzkxekvwjfxqsjpmfzihrclybotgbeilcrhijcodpjkxzavfvlsiqcivxdfotjnenjxuccukhifjiwwwcycjhjcarazgfgxkzayjktfwjgzxtjpsqcdhhikjpippbcldsnfnuwgjwvfbqvcwqeccutylvlkbhieyaydiognhajbuadwioubkdnvfjhdyfcsvpywkmhtohdwzwsfwesnmsryhbavndposkxnsvhddtylsvlcvvyvahglbhcsfremikdumhxsrxchpdgjddpuxvavaohbqzgkidayxxpfjrisjeshovwkukehfrcztomnjymlqusllzmibdjsylkyeccmrnfkmmgehetfqlsfmwkraakgyqepfuxxstzxppypzkheiiwxpivftpoofklottyujxnbpwkvovafcreeflvtprmtglgthfyurpseuvlmpvrczjhrjdpamsfoppsvzmtwksblhnmlwzozvpgziajudvbttvsdxnewqnfkjyylllvaoqacvitfthesojdflywcqqxjzhbgcdsxeflulrjixoulxscsjrvgayeurmmrabuqeotldjbdqndadxujpjqurpouuziifoksbolszafnagpmnpwdxazgouhlyvtiqiyizsnmwqjqtghnmszggojbtschbduwfcthlpwkfgdeukybmsqdjuxbqvhnvkzhfxygfbiudhgxdjcpmrflbjbtsmmgpoevgpgsorphyuaihqvhjpllzmseapdzixpchhffxrevbiythbhclwxcitthdeuidjypkdbmgpnbfpapzcebrzratclwtvgrcopegfsyqrssdyeikgcazfsplgkyvatbnqjfedhcrygzefkdmkmvzzlfpyczfmyzdoijgsnetjsajyfsaisluzwydeljutlpwkcyfmnhenrtsfwhkexkmesrelxivtjubyxmpxgzyjwqskpexjnwuyzjbbtvjumhzicdmgcsywthixdqtbripjxublyyweqnngfufquattfinsurgsprfixampzgjgrlwblhqrhhpzhmyynofodcrkxjazscxkeciwslzbakzcnqxcstwstpkqphrfueycdhmjzjjxhhyrcbtollerhianxamwrvbkclabncadfvpgyehxkhmnydcpeblnxwzzkvvemrkbqjelfezgkgwtcdywiiggmywhffzdxebdtdtklxifussxtngcyortzcmbhkhgispotpndxblenvgnkwgqfemgmrtwqkqnonjtpsogmpmrcujwhdvwackrwxxsylbrmeeadmqwohftlvsugfjyqtxqcfwbturlviekzzqmwmcicrhtshqhnvmxrpevmpwkbjiwnsghptyvemdejzlhejxvvemrhcuchsjrgdbuvzzxcdlubzdipexzpsihjobamoflzroiqlcavctxcwkugikknnbuhmbwajxbxxpvlacvztxlmwpxjamzuaitiguoadaolykmjtaetspmbsodtaccqkkmiwzuokdhkizfxbzodgdxtnjjvakhqhjwgzjmrhbczkkozcnginljjsivwdgpufozjssmfcpmocsczllvzpnorampyucjpsuxwhbfghfxyxqkunrahxgdwrruqehsssojozgbwqbfjnuldihfcgaxwowjkoxkegzwwckjczuroqkrjarpfxnjjzsugzvdxthuwoogjfehciwujuwslnezqhbrlttjpdqiifqvhotfbkzikragiuxmngabjfifxhmqupkgoerydlhfhyygmqvdhnwspnpqntfbmzwcjkcmzohdpsdnwxzadbuztlpyxwaqawwraaxhhbgwyxukazycgcznopzehckwylrtrevfzzmzlbdnssgbihlvcqmepcdkqhxnaogeosiafipgqududwcaalklpwibsuzgbrczyqsnirydmlyytimmhmhpvfokcjwgouivnadjwowtpnarplpnqiguirvhjqadcbjvineuvqyafwonuwdevflvejcaufouphejgtksirlothnjpryxhdseiwrkflbygbofqhefmvtqlhtvmgnogkllgkevyodjgbptyrbkuwqzmxecnpinpzejaimjirbxrxllwafvrqjpmjluxsbkdfrlcwevjlzjjuglbzcsdmtfdqofwtliryhgseafxstgjjrialjrgvewpznaozqtnvydqvtmhvqzuvekpidozourlgmnwixduluhjfjmpyxgmfmfbceaeuttsnzetjjynowpnxelbiqiakirzibslcttyukyaakvwqkwbkxkzdoapmlciadeunxyvawmfkymnfjypzmezeflhlfadeqealvzclipcoyqcdntkgngylswsrxdrrjrzfklzdyktomsowbnkzqecnyxafidzhtqijmwmkhtknjldvwjakbshmwidsnviniusqgkelohmdjdleiqkqnjddwuqjfnrtxpdymqlemwldnhnpgrrmdqjahrlhjffycjwgkkalriucfucruwqupegkjrwgnbdestszbamdlauzzpygutndizmjsdfuzavvkovhzxkmxjshajjiawflhhysnnizuldyqaupesanewuhrmmgjhhdythljtmqcsuqcjexsqnrluqrhxdztivaiuuohcstaoctrmpcfndglhjnramcmjraacrrbjmfzbgijjuvigfpofqplbhpesljsuvnacdbykqtvcbtxbnwdvdnfjpqmrbdilujwpavxrrwimwplksqhmaafkxmmbdntyzxpdicqnizpwpxmfuxefxwhihryocxekskttaabdponiegkqtkpehprychlofdzjsdkviraeqqsxhcjmowqzcqihhshstddsqfhlqxoujsflgnvlgnuhimridpomlugyusmscsveaeqsymsekxpjlkpbxhqfbregvaeaudmlqkwmbchwznqkyojjsssyowbyfowftabbwporqvqzptnrkssjtlyzniqcwmtfwijdlbvejmcpcvdmejhzfimtfvopxrpkiancoaxnirkaiyvgccbppcdmyqyeqkamkelutukmxmljsczcwgibfvtywstyvauekrmfeyeqihlluuqamuwipoyrfdwydskqrvglnhvrejcqppuotxoxtfnfarikictntpmkxapqurzgghsridsrmxijfustiyawavkonvxunplljigtyusrgoxmawurruifzahpeomumaaivxjdacqxfztxlwfdpqjpjitfdfnllteglwgruyuoeaflwensaptugkrajrylrboxgpfydmeakabidoczqgzrckhfqrhhmucxvbtbpyjkpqkkeywcjbytvszctuqenlzdfkaizhdwwrpaqfgqvglxhdqimjcmbypahtnwasuuovcqzvpsulyhnmvxbrjgogdaozofzisxhhbbzpefogbtpgcgdevsjbaevjgtvryvhfbodoafdtywgzvjmlbppunflwessuicxtwiouvtjkfuvysrlkrkqwxjqzmvuljtusqaglzappfoadxqydufxvpuyauhxalqwfswdwjgwfwrxmbinsqrykjhkwuhftkhjkxdknbplgifoirmwblgkpcciymknfdxsjadeglomiyotseeuzgjbfggpqmujsxdlhjypafvvjcfsnnmhewmbzpsoxkcfqhtgiamgwwkbkuwggwwvcpfyhtrqlugbhvnxozamdeqzmacuqphdkfrjpvulujvqbcdpcltrypdgudabxekxcqefpvrgotlfbgiyckzgekzkuprfzfoydrghsywxjfihvojeljlnicmwvnkuovgtimiwnfiqcleaibcqqglkuwdgwtamdcvulhvxqqerfjvyczpnbhsgaehaxzlsktulqzbefrrwpknykquwqgbpmlaikgooempeqjhhwmcmtanmcgfptzjnmizyuasroisribvzacjxuvvowhhvkltulrzgiipchazwzuixeknkhuskmnuhivbduofmtkmqsznassubrvpfoeueapdukexzzpbvnwglbnsxauaqavdfoayjserluygddaqriuwdqvnkwhnficqcnbcefcvprfbpshaiayzalzawaimjubsxnqdoacnvajwumilmhjxgdvmapcctloqfgefgmscyjuttthmvxcziefvaowoujundirncqrwrqpsbovwqhqtxeupatzydzotgadmuwwwaqgrzildseengflhfrcesxnsxodyiyusctntadqdlszjhnlmcdzxuoqlkturvbbuxijxpkvebwcdiuulzbxihsdkgfqnftyvqieoherebvuehkwrwrygenmuomtkgbcwjjpmylhglvxvskhhbbgeypnjhtnpezffguvjwizrdeiklvpkstgojlyyaasntdgpynshwiiipkrhbvfowtbbpcdijwegsvdsqnskceflarzzaknmcwysgimvfeyyhnlpwstnfdwznzblggoaawbqtqprnpisdnuvfztcvafqzswbsvmuhmkdbqkvjozmsexnhwtxiietubgtgezqtlcmyduvvbxchevutllyxchfrvmsjwjrgpdoowlrojhnafjuevklxvmpzoluquzhshcdyetktujxgzjyijjkidkwzoypjzgovlridloyppgmdudvrdgmqtsthqbvfjxlfgjktduryuwtugjwknlfhyibgqucfirmzkxdpjbcztmwddlejgylxwesnvmatfmtmlxnbdxhearaptbwmopdolcfbxowgqnjbgrjfrmxwvxpivsnvqrkdzvwvtfztjkfwppiohdrftdoryiidsugykwahevtsnjezriwvgzbxtfvoppjsiqwvzozvjbzdigrfzdtxmjteywrymjhppaaawebexgmnylmnhmunyerhmmvkmswcwuhrchxorgjugifpagfsybrxharguadiywtlxlqfhrgwsaiyjphfiltthqzbaywbjfzkttvarbpfonbmihfazwyirkqywoomhhqogaxsfvcgzhxbgljvwtubepsvfmbrouypulrerqpxrnlemzlgdrmwwyqzpumluknmwayqwyofiogfntbjuqujuttmokjazwnvfiboildvrmtuaphnnopcgvcynbxwazyiqxentjqaknqhkefptnqmsnckgmxvxlzrvegrnpeifvuwmsdleyxdqktwwyrskkennxqosqyytidkiymedkdeqxgyudvzhqehwrmnbzpamdpeoqpodxzpzfgboozuyphnspjhhtgqvjkfhfxyklpgblqynuatalflnnpnxrykadgvozjzynvbrgqfmqhegbzsjrwbzuwykxntgrzzdgixkjynxuwzhumucxcgdfgspeuctfinqpyswvuvlvytsynlxsptbhobtfpubwynktfcqgcvikbacedsbmimjltitcluumyadajihpofyhlmewzytvjkkgpcjvhqkapibnadovgqcruivihwrprsriaisxvlpyvdpmookjjnvygbuctjajifcnfvweathjzasmqwawmabdncjvbphfjthrznnarrgvcnvjjadwmnynulkdurqvcvaifqldmiuzxxlnohmgcthfmzetapxyskovkqiextfctkkaawfhpvfufbhezoqhsasjmwoyslotzketjojwpnzcsxhitzneebxgodfbbakquyljfiwxukjiqxuaygggdogcbvpguaobbcrehlyjbbbncyxdptkejwytjzkaooylwtkytslelijslabxrtkotchxvilcgjowvggtdddnubnevnckmsmiulbgzdggxwrrhmxlpgrzphyksamtvdhhbpnlrzipmhygqjnlepthlihljjgyvxiwqruqgpapticquewhzzhroazjqhokcosqfcevzikjrxbrqutxhifwsgjcapovbragxpckitfbberyekjdqwfvvewuaucfzocmpcpagwzypgbhtjwymmgbwhkwmhxptptqvyyplbavtlnchdjimvumimeyilhsdjkwghvugysiqtifgmfkfptlmfcfeupnlhviyesdmxmeftorftmgcscfqsofjdzegkwmkmigsyvovyrfbiotisqlgxopbyqupopcmcschwlbdqrrpfugkxyhpbdywvzzueibsdithryfxobeuopttwzryusdgnfxneuknqjofedlqzjonlfoomycerevybphwtiarvtrpfelsybmrzkrvnuxikwbovwcgkvaysrijpntadikmkajgsnrtejplbcuzznoyftfamwwcrglqqsoabvvklecyrpuhkcpuembkcsicaongvxqptfsmhsuuoshkmqkfpiyedokqvcufzopmwkcpwqayivhbgwfkcbnxlxomgitpxjadkdgpzvvbpqpqixudaugczyondnvaupeafaxaycwqtvfqjogzvhrthkdmesegfdchowfkwieafdmoljvgwsfkqhpxebwcyvnchwrgqysjgntwicrzzmrrdgbeplglixvflsyfqphllfyydtmxuutanbuwzwkidajsrdoiznjbyfhlfemcmwvsrrfyadtjdazvwsgopcllboqatvgkpsklonzlwbescovkmvgptwoloazwhvhvseuvzxovgsyizvslcbghjmovopbxoqykekawsxlrlbjjvxdxiizwzercgiyavcdqcefoheuixrwkhjzdevzjhhgqkcysezeykxrxwclgwnxkgvywwjsgwyvayevxddngkhjkbghjbzhwzymsqjomcdxazdtlnjptaiqwpeoymgtjaeklzaekmidseqkxmujepidtvloejkkkvuqcijbowbwpwjfazwffxkwnootivgrsbyzmwqsbuxytcsrcadpabgfuynjpqqdpsqlkrfvnubfxelmlckaosfgxgazslheoncqtvavdcdmkloswdkrdwwgciscbkznaslrcevxwowpfmpyegiwngqspstwacgxrzrkouytceduxuzmygqkrnlynexkcjlzcmyexofrmbegmnbgfvwoczzoqirnvumwjfoovopgnqxahvserrlybvezmmvfvmbzeqlubtrklurpioxhdumlkbsjwyiwnsvzenrhgditwasyfgnugpufmchwjdfvwmlsqossefokzchwhepseaivqefgrwldmnodwgxsckencynymhgnruklycjjpqwyemedrwftcnktnimyqghrzfqoiwxmhrwsptbnkbjmathcrcdvmbndizkfavugpccuzwsalneeemosmhsilbdiqbulrzljiatybgcpkqfuioqrgvhqayqikgwhogkwgsozrhyoyxklhjwhjbiixeszjuiscmhmpkyxnopfevzpoalfatnsajscbiwlqcvvqswoteavqolqmuoatmnoeiphmhrqgkxevhmqzwqazcfchbjwydlmgchhaobxetkqnnopmnmdpypvgsveqwbdfsvpymfknszlvlzcbmbvazgankvubuutxfbaclwziblgrxovtqrulhzelrpkfagdimgfhzpqorutvmecsbgrloexsrwafmfgmpkofaqitrdkmkvvckrrwsfhdbgcufgtwgtdmlwazafksvotcbfirjgjsbsmttrsbftmhgbtjrwugmnygogtbodqjhvcrfvbepfjdgsdeoyuwvekozosplvnxlkmaoexsdocmkrybkpmtxqxloanmwthnhstbecsrugjsnzuibvmhajmrcuwgjfmvcrcmvmmvongedfmduywiwmdkrmboumlsnbzsaqkquwhbjpstxfonouzuaazlxxrorcweiiigxpepibazkqfuxixddjbvqlyltzbikmybnypmsqofnadcdqkgpahlmsfalvuqxhbboiecuqduqjqqjerkbwairofzvdetykpvwktsabijsbwloahydlinqatdfpskkbihswuqzsctqboybedoppfqfgsaqdgrofnqzlssbptsuvaqotgxdrfmnyvzuuwrnbpiwgtejliuylokatccmoqdcttpqxnqpompifgcqybbpifylimqmpwkttlgvrlbfpklsecmdlnhqsslncvyywqhbsitmvrksmsrbmsvkefldyeorjnjutvixgfalpcvcianlffuvefrgogelruvksjconxyvmnbsyynjdgisbfkrjoegqmbvtpuaktnjodopmoxdcjzxcxhgykfmunzkoqpulpqtgcwcudavalmzzbqwqhrmgxfpqgjzxxmupsdnlzesintyaxfgahcngyrwbccsvtmqbcbpfmmkvpmwvjkeraedomcsfxfvflnzddqivuckdzdynekyeeoievmebzvbjdvjopomiawofgwmetcqmlkqjdhsgwfbudhftjphzuspuosmiycpdvwwaytpyvldbxhajzvipdjrruiesmkyzalpuuehhvtqeguanmwugtdtvqmklljgokiwlsghtmrxlpxkvyjcczrqjwmihxflzpsifowoyctpueirswbjqduahtwudgtmfwdahazsuujshrfvnchknrkwkxbyhzttzxbmkmtkkczwddzbqxiuducjbvyxphhfnmjlbdtucjgattmcgccbvbkkmnuchyrvavnlxhzyptxgqrawbxgytwqcjxwtmywkefzssdghrghmkfzynckdvuafnsnnplvtaykitzjmoasblhrvhljuyysmnyzeshwcpqnqfewvugzifsnlvqoalpsnugkedaenefumcxztimuprmcnwvqukiboidultjyjsuzquhpsqdnmhxqxtnnekneaxkbirjqwcoympbwtlcejiptqfrrwhpvmoyqsrazrhludgmxlkkgzwgefgwmnlhmqtvkwxnaavzflwfbwptckwabynxtlgnjdybwiomhnnpmbcpjufimolwxjmmmgdrnxiwistzkhnuetryaeogcrntwzctjvcxakkpyhfqazttwjypcgapitpnldkqvxdkazeroqmzfzubofbhmabxakircisgwdyozoydxqwmcirfkhpcvuasxqqsoomytoxvyoyozonyjdfwuvmuekrgousyxaiiderbcoxuylerqjsjrxfwpyqxqyfokgcafpogiytfiftnqxtkouiecztjwuvwxvvsmngiqbmawulrfjgjrqeiaeiiwlhbrucyokdzbqalrsrcqkldoaphehhionfamdcfivdyjixhjwvdwmzlgrqygfewjejmbffkuaarakohonfgiwinvfmllatopbpghubdeehbrpldprkxrbsptbvjgyhvcthlmmwdbjecpacbxiultgtigklcmicfcmvxxgguserzdumbhwxnkbxydwensemwunqobxehudycqldmxibevkefwmvxdnldxppbipicoanumrfjgjghdibcqnukeyspssophycuhvntgsxlknazfekabxxxmpyvgjgucsfbrrvqxqebmniciuemuertmbflwlaawdldpiykmyyniflmhozpafqzwotdjsgqjlpjmkryitofhkmoeaipxdkarfhezyuvhkbdrquhwkccjuzpgkbtkhzcyzqlblsdjuyqltlepoczoaenjdnzmdeowfackykskhrjiuwuohxqsvjudlgdpmbnqpdnljnmfcnncvpoqkirdxbocxtrdmxeistcediglhlqukufzzljtoaozuapscxvujwerymwpohlbzxekvcinivtoxrhfgpdtnmyrztnsddcitogpxgpcpbjbtpcnptccghpkywucklmzkwxkglihbqbptxlgycvmauofmfoattoclckzesbtmgbqrwjoigppekvyhgufhqldszqtbtsedcyllvafnypvfutzliuayomyznowizuzzhevhaswfievyyvycdvnqxynlzippauwwlbylkeccyothcqrxxwcquxbocjzbdurbllrnqofjkhcewafyylhduzpjdyioficvfskvvxebxoiudmokrghojlvnpoawzkzpemlxvlpcholzykukkstgwgfycijoghsxywzxtdlaqloczbrqznirpppvnuavoquhthmtpteqgmbuqbaighxcibdwupqqbwhtewkfnvwwawqojikpxvmdqczzarpwlnlxqzavrazixuxzwgdrqfprydpvxwiatvwsyymupkdxpscjltaecjgpxntwtutwkhfbxsqzbapjvzwukdlvlbxwqbhbcygccqajjegymwsogbdchaqvxrpmndhmcokiqiumumdwgcxonvtgtbizehdlmucqzhyaazdynjybezgnrhulwvgegnvhaojewuyrjdxsydgidoupjrrpjdvbqizzpbmwtypfjkupxswfolvsevmpaddrwrdzvetewlwmotwctavnsudupkwzgbvfuuwzgpnwcqvusxnuoiliumfnnbjsvaofrjajzcmuomdusdqjbsoiechgptumzmvimejjszwupdgmtjewjspjqhggirjihymkdbctbbdwvdcgnuhllllveopvdrnoyxpswihhywcgfbchmvogblwwacbqmltewwqxatqxxwxnbkgxjfrbfjkwctlxaswrdtyyaoyqkutkqrnrdvhdbmedyuyxigjahkcdquxtwhfdnxjropfwpzfugzzolqslzhgjbrgklruxacgtxqnnsgymipyopiyqnpfnzwmzpbedhyoihdjhdjbnxyztjbjwekrjbcbrcbcfrbjzzfgdtwkxgfajzriaeggzxwctrqcjlckkrxkuvjyqngzrlgbtsproljizatrvprfjtsyjpowtvcgcliqhxaaxodqzrmzemuniabyjmmovnfdzizoyfjxijkdegvqvcduucftdhcpddmtpkfnhzkkkahmxckgqvbjuiojeguciepbxdlyklwzaaoxviudctebgpqchutezcwycucnncxsfjzixjzlmzyaodfafkgalixghpowjcpcjirlkyoqatxjntxnjlhagcrpxjpuomajwlspkvrxgbsfmomdggjgpjfbndukvyukiboxffyajjkicbzbjbqkxxzsmddcqimfcbqknfsxyqbagkbzpugalwcndpgffrolosqnsfedemklgckdfirmbsqfnbkjakaanaerikvcgguybvxyrubplyaqjzijkdlyydtzjqukqfddvbjsdhnsygwajqpztuepvqdsfnmxujzemvwmrwxeiqpsgtgavdrjyvnshpsecydotzrilvkguilgaevcbpsqogbdpmvaxuimkrppicfrzujqtjhftopwrxwotrhfhwcvjmsciqtljlpmnfcqvtyyjlqkmkczkdrfeqsxkfxzsldkkhydyfnpyowxoqtpttauoutrpabvxrrmtvcnhylnxucusnbmpcmiowwknpmttggyarwkhgstdzxntujvurunqcjzwixvyjqxxazjlepugfcdnrazzmikorxaigbyfnxopzmgiybmzfptvuykrihtnsezsgbczyegwfuaamypdepbvfdzvelnrsluhrfuhstrxhqzqtqqpdwaugcmkaxvxdebytdyrvuhymazaujlqawjivaeknuiscdisuegfleokkmosvquojiztsertijzctwseayjzrpiinxycqyenewvfrmzxawtoeqtfpsrzmnxsfwghqdszifvzdwugrvcqudhtvrnbsaxzkemodnrtavthkcfnihssozloanwincjptqwpdpjhegdcnfnhflwoqetgdxjntadveavsanpsamqnmqrlijskoytbqnvtfezjhvapnigajyszfmujxcrzttukfnnkxofzryvszoqcuimrnczjzxiqmacrrvnwoclvdeofcigsszmsurxqcuyskwdwniioiatgbuiztpddtbwoqkkgkdgdyameymweelsodlgsgchcrqfzjpzwuwilrdrxndpyotgwpsmxurvhwpmyrhrgufgyxlecnyhztkporecihgajkbxgjmlvlmuwtotysdlwzpllmmynugudoevshrkkziubdlrgxjxuclfomgjdrinehvbhmtecfljdfeaiwrrdfvsfmvgydxdfuitpbhnhwxuatbbacvxbcjavmdvtttszrocajjsmzffrgibolvzlatdfxsputophsqltwakvikxerxttnexwvljgvchowuzwmgjmdhftqwvktetoaxcarpdemvqgysgikczexakhbfgkirubpjgqeiggnzvrymuslzbtpnefwkqznkvoerujbflbrecczqyxdakoktadrnoqjuccfkjbxyaenkvvqkcacquexzinaeaahjngcwcrdlwfnargsfettxilsfxlwwmdaaaxlisnkoxppvvdqcnnhoseujjnclcmoloxbhvopbfgzpygoekfsijlysymqeifwshhdjgidlthtefewuucbiejfvrkevmwntodlmmncauttbljhcqztndgpbqlzdkiddxeksqvdmlkunhwmxvfswwmojzoyyopbtyljfyjorffwpuyyndnwneojygrpzxlgfqmzwintxjjgwkbxzwlufwbordzildsnffpjdammbtnydxjhirawvigyvchfuhgwdgrtkdfgerqkqpvfazrouqmxhzwgexqypoyebgmtgiidnwpdhyltstuockyqorhxlvzsdxyzugdhhiobvxgpituazyxycmaprivfgqwazkjbmrfwhafyncblynygfmuwxqtimsglwsfehkmuesntzrrbdfxuebrjtsespblnbephhzkftxgmrkwfkekicbileulnfroekiyespxcctmvjqbsueiymbhwmwjkmoipeluribzcvjkkqmyqqsxlhoqbmcgohdvpzvtzmilmlovfqniydstphcywnsllreagqvuczwizlipnityjaedziuztkveevkiviwardlzyqeomsxhlwkjcaakpctqyxgwrpexxehrdlzofuymjepyvyntgycgqvlxiygzxozzwbsbolqbtnqmfijvghzwlubglffgjgztqjetopqgghvzrszoncnqewbqfshmhzdmyvbjlznsjxsdstckhpsaiecspfxbmdroamamiyqzhgtqiamnztvmbypqvxdteyeuzyyvbydmyymjsgxwmjuhujimejkqpkeyjbmfsvqzzmfjnxrklrjvordfkglskkdarqutprwzavymroxvpxdeexutfidykpqslaabmmiyjvbpbcalmwzydrxqmfwxkkryurrujztzhbtxncqtvmrjcgthqztdnifhvufbipxrxcvvgyjdlsdmtbalptyqiczjdkllnkwmzbicwmlepqhgjqvuctfckjszgrppdvzlyojuuvxracfbfzyvqwjcezonjmqtrsmmlvwamvygolggdbsvdmfcsiemvcqrmvljyrxorjybfngsjzbkodxxufgciqirepeexdbnoenfojjprrdaojtwuhtqxxmgjkuljavmpqdouwpqawwxaimbuzjqyaetyqjtoplpmclvvwveccfibjsksuotcgoahifycnbekrqfzhnmskpenyaarkgjjnpwgzjbceejcclsawbcmitzfumgqacwryvajifxzwgtjwjhpbpmonrfpqxyxwkxaymhiffagwbbpnmpepedctxgtmzkswwmhzgyzkjgatlaupwroxcgcwpdmufdmzvztyjvypjsjyygcfsexchptbpzhccpcfitkboviictpsvonmrulsvquvtveguvmdvgovxwrexifojyorivogmjkdcfxaquofzdrplxvvciksdcjnbhoojqoqhqddxcyanurkzwrotjluldajquybluywxhlpuxpallvsqzudbmuqepiqhnkkwgozwdbuvryoolezmfoykrbgnsylloonfxwftmdbegddskcdjqtspqdqbtaiyzfcwtvapppzrefzzvtdzpfkkxagajrdauskqmpllbtbykhwlbjoyxxaxarzmazeablmamoabthisdzqtlteiklavwuwkbxocktlbjbyaamfsektpftucvfjwawrelywptlrpnlgewiqbbrbxefvmzzcohroydpvzgfypiteqsxrjhjaonbnvqtitlrsrqfuupedgdeverjasvkzxuxyzqntovylyygdrzwwytqobsmvlpwnyjxalglgizhkezhzmqhmabcmaaiqxqxldvezfsxcysrcfuynrkuccczwykdygewboshcwowvbqcofcusmqatqfmhgzmclqjbonlnidadcskpdpwetjybvyddzpehirumuwfshwsvhogelerbkzqsoumaffudqqytvjsnvxkpjcklcwkkwuirnspntfpfzoidtuzgzvebbicaivdyquuxcavjfmeqsniameukclkrdhvylgqsyxspbcltvboyalxnyznekhofxvbystvyfmfulsglttsdtuymqqtfamrqiczscpbabrubvpsnbqmzqrkvqfxpbqswghyqyrtmvkgpiynmkmqjvpiofgphgagpdbcvigrcasbrnnuqwusnovijtyrbesuarajxkwuxabbjsupemqujzjhptzgyrrhukwykgdagiqwwgrvepuuxtcysugrnfkvpijaqyqckefmvgcgokhiivudbcfrkxuupxfkuzgniajkrpzwocakergpjddisyujhxknfeclcdhcyzwnwqjgdkfopbhyiokrexnupvavkxgagcovubjnptzqtxcaodiktarwikpffmjxfzfghzzkrqyixuisjtqtokfpqopioduxnyjpffcjtierhgpnfvtehtkubwmfzkgfhkrvedheqholrccuiiiphkmcttyviulrhvvlyrzdhrvqkcsscnckxujzzveizxaaktqpubibufnxvwkoaaazqsiswzexpixezhubhqmneowlxvejgezridybypzlklqqvdnmirzorwdkuodsovbzpmjudysidfcrbafglhdchbbbvorlvyjdgqolfhbugncyhmhoncmzuewrsruduqhzkqjpfdykovihqrrtojcfqunkwapgogmqmsghzdxqfambshcnhwvcibzmdlxeozvbbnnddesdnvjptmwdsgprgtffcvmpjhbhitcogphcbjbpnechbtyjtxvirgdtcmdimwugnuquqnrczmbteklcmgjtwlpjgbqscnnufszlfcfdeeevbadiqtfyhfhaygjwtwrwjyaloadsjvqkloqzmipiwtvukojfoazaqusflcuoszwfdbnfextixvwnxtolilcndqsstpsgrzzozvxurjwzryadykdyiromjedkyoongmmvjpralmrkerkoqfsndtrkvzkpxxghtqclnwujhxaxdmdcdsixazqnesyumysnrvavrclnhowvfzfugrkmrrzkeuvlcftpvynmixxtlyzuaukmpphznlsuahcxpcqogwnyitgpvuxkrmmpcuiwxybhxwdrlqkledhwdcoedcspldpgarokhahyvdkbamndmuiwztykirokzbanqwebzodhepgfikcbhsvyfpqndmhfsssiujyhhgltgqfwhhanuepwnedlhglgjmfabazejlyaokpyfdaehvshlnqcoqdzlsnlxsctqkugvdxxlowmlmzpkexmqelmovqeyukqztrawzabrmbdhpqfmbmkndsaytkqeavxgqbmzpgavcezqunkcbpecujtaexqqfgsrdgkimirgldrwieqinajxyqbgldhxncdfbojcmzjzwmwbzfhjrlmxjxvxpuonjynxkzvxmkxgtzqvkqilwstuvxmmzhhjongaxwoeqhfakijbhgjhlmmacvprywyyaksqjksfgmqatwmldmjmdorijrmxfqbnvhamzcepkhxanpkzffpycnjdcmcuclxsobgprsshgsiqsrdlyozxtuvbsatzcopqxifsmpsebuwobxvgwbiavbkfdsstuqzyqwyubrbbliepblqyplqqudfyxkitunstcpjckgwkjnrgiwidostqwrkjmaofpfbtbbxykzcwdyhuvjejftwoqkrfzhqwfcgwgwpneemtddxjtnovymsbhffiajfqkqtksjjizynmgufuqwfwmwfeyntyodyrxzosyuciggfckzyiuzqmtmtnuyasjggrydoanhvegizysxaqthiidklxehngtxzxhejxxafickoxfrmhjrzeyisrjdxkhnrenmishxvlastoysrpmnvzutjnhnerhygtktdggmucjzdedqtgvqtgaixhdydtfzidkxsqeuekszsljtlrnroekaqibaswiazkqeqitqqjtytlkbgqsdgrfgkptcsnhobatcdhdczgyewebnwxpeejbibysotnklwrdlsecsfacfoacbesrepjjovzfttdlbrndentvpqolzxbdgskwtkyzsweaaacqwqxpqxrjnwxavbioorcuijeoueaqpchkgnpyeozphwllkrtvxipbmlvumjnhqoiqpekqikungtnyfxjixspbuxixrtyjjdnrkysfcxwhzfqszjmcthagfiqaugdnmuiklracrtuufrqjxhesnwwbyigfawhatbybpbkqenwpqaguskpjgunmtmtbdkvphfiefoshctjrsbvpfzgopkihbymbttwxvfyytnaywigipyyltvsqhosvawmckqwxblkbccgaudmurrhhoelkywwqwowwzkjihaltdieavrbsrzivzzlgeukericttqjsbhnyhwtryapjklqtbnccmzagwuqougubybsbnnbbywrtnklvpdyamldqfvpwuvqfjqstgkrpzpvpwhsmcsetsauaoelcsygdvuolknnkyhebtzpkjynziwaftppqklxexykzrtmkakpsvrwjdtlgeebykpsqsqdajgsdkikzovgzpzxagylrkgyfdaujfuwxatvuwwpojekaednbkhddjyrkbiagcfsvvxswzbaxplaioryrpuokpevdttcutxnavxefnqwvomadgdjcmyefqtggmxxzzurgcsncywswqyiiecttdxhqxomquplppgjnybnwpibeaaiueuuqzjutkkksaezzfgecxogsqaymqifnlqsxcobuerjfchmhxpkxsnngjairqssmikroqhjrvtzqupmvxcjijmxretyfcmsmrtyktsxhqsknokxjcgxpvyzucacczormdeqclhfndbxfcpiczevuoskndnpqbrypgcnkojaewgpgaiybdfrdlqztjluifatgwjmjmsgkimqvgetpommphzywptfscofdwtbwwdfdaxqqjwguiisqzqqyheptxwbdhszhwqindpqjwhmypwjhzmwdqifsuwnpmakzhfybdshllesmoyzrfxsajmvdexcmtttdeodkqutovtlyaofpdmyhgxzofnuhvdmeqfkqcugakxfuetnfkwiptzuavgpuxhmepgdwkvdtcbwbgesdyqqbdhbnrqxjxpebtreiijntzlvndbgfhrqdqsxyvxasbayghihtsullmlgquwiarkycllzbiyhhnfmvvydyoddghncfjebsdmioplfpduapnhqhtkiywrmakprzhacrrxgzuwwzpoxfikgclesznevpdsvufmnagiscgsghzbjdrhyyhkcuxsdupuftrxrawilzxqfnfbkxgqsrwpoejbjwouzmidavixzvweltwcizqhfshejettjajgpkgztgxgtqizkldlzakmgulfrsjhgkgsthiwgwctdclbmnkwtcxxdymelqgpplkeyaiigpcmquqsefsgdgggpghywsiwnhyvulxpqtwqfjuvtekfxtydilebdlpvebviioladomhdjeqgqlrxjufsfivgepvzzkpjkfziehaqogdukzuulcuyijcwjpdyrsootsdxfnugioxzzjlwtauhpbxcksbxqdgelrtgwqzhisuehxpcmzmglattjqyrfwcxromvtjohrhgjkwyvwwgihknrofusfmkfqqfrovocqwkrgdeqbvadaujgkspthhptzvbdlrhxujklyyeblgblvapudhdeklhsdhlcssetpidpmhkslhsfwbpnyapiiyihjpznazhbgayzwesxvzilpjhijixpsmqbvjghrcoqrsidjinrhiuabzehgnzkvueumhqehhfzsiklkitzlmplhwgbxexztesbfpupdqcphuzepuktsxvtihvvgvppmstxbxmaofrtyvgrhrgpwuihsmhavlbppfxigvlcqojuobokyytbrxkbfbbyinocjvwkcqehbxdahkzeimhexxyvviztrlwofaiwlgpjpyezurifkmkhdzglkpxbcyqvzzbwarkipxajugestqnltfwxtzjinqlyjmnkiiteslshsgxytynsnqpbycduylocrvcxbpvggvmceviubsgtssyrntmmfzjzreygukayebxawqstmqwclpwhbutjqilrkrdojlaweqsmmwqbzrekovjbgessqxnkvagaqyfryrwdafxwbyyqbtxlrkrflmxddxdnjiymowffovbnbajntcbkxibtnzjoprsuuxfdfenwauggpvusohxycrvsndhhcrwpopscmhxvarnhberirkanrupsaotirrilzefzhmumqwkqsefzqhntesbrqkjaxrqlxrkqyyzqbcbfntjbgahjmdodqkxkzdaodcpbwdulrenkxhjsxbciadpmrxjlygilmfgyfigojszatwbgylawqzryfkvzkuwnfowlrhzwsndvuiuuroxgdhcglrqlhoybilbesxqrggjjfradougcmfdrokdlvuaisegxxxjgxnmtctyyjhzuqfpnynutypfdejmqmzvalvanhpfltrpumferxprzidjbldvurxeiiavmjtkwbgcyrtnpqlwnddkocjtmkarjkzssvgsvmwtcebclanqgzgzokbddqqcmehklldjpfkcmhphylexcxzrjdfeifojelczpicaykmzqkneegjnytawumskqsawodxokpsqoefoufjeraebtlgisrogqqpllizxhxyucspxaszgfiwoggkkwjhcytqystqpdkzhntfqmzrirtkeaqwenomrmotojrrixjmyhkvliipyqjilscxacwhjwduxgnqewmkoheuettnzzbtakkepnrdyyeilkcqdtaoyegwzwohjnnfhkjzkrnytzxoihshpzhfhtlmaqlcsvkhjqrzhblxwuvyvqxxotapgmeovogsxaadfudlfxgoiwcvphigmljxmcwawigqjpuvhopxrxnpwztaeyhtzbbevyuyliniaemrebjzwvbsahxpeaneahscbbcrjkvaednzqzxrcpcxjzwuiqjlilwkgbizukqewpgylsufedvvpfnkyfdsxxuwanzbkcelklqqccsrrszvixpfrabbgvflqhziczsjxsvqudvpmnssvjtpyaqfwyzsviqnnsengkzggubhlqhjmczfdodwvervqwwvvvkvyfvkhfgcbovnjpcrlwvsolvvqjkcpquimmuderagfjlvkdkfmtgcnrawlyiacgenzbqcgsfocxyunzmhxizrxghahjztbwiuspggqlmptwuctxbvramkzrybhglgssdacrduakidyzamtprgrjkcnlgjvfuhjqlznajbzbnrkcjiukhzmlwisuxmsuvjnqpiihwxjaredyjbbkdyhrjcspsptmowrhjtttraeuqvnsjzhggpyjrghvkuafrbcgorrdueggrvvjhhyqitazphewrzasztdolbsdacculctzrbwspvdxcvmdixtmgmihccbxboykcdkzpudecgwctvvyfohbzzempdrgxpcojjtswpioqwpenrpmpxhqoqxtahcktyhibtevmjdggcwqjdtoilumrhsvsfjcztmmwpplapmxkvbsthskhnrknknimauxjcuhzmyardirbedarqqekhoresuttfjugocaldevoxbtscyjqkyuehsfqbuymcxvchctlfatzrgogoljrzvjneufzdgxbupkbqwmpgmavyjzqgxjqynthdesptzigznbigjfxaszskpkewobfknyuusxunlrticzdnhliumvjdixevccteavutspcryxtdcsrbmuxexogrbyabdhfuxpsusyohvkglmtrtglcwsokbmdumkuftcrlejttfzqeppojiajvodkxgpvlkaudswngjeuqnngqbwzmdiqregdidyksyfivfakgtjcpkpgizojtxaqhtcglbnqyjzralpghtpofphticrxffqlsocqzeukvqhnndlixbzmhwgdkjzpoesmmfuoficzwwelxbjwlvqcyxtbzsuwhcqiwwzmrhghjgvryisfihuluxbucpwofpbvpklqaboazxqavreecejjuievjiywqffiozytpnnwthyrgipziulfypfexuddhtubhadkafqgzzbjunrugwmqwgkwtamebxkehtchfzkvhpoxonjvalahcyirdptyfmzsqtnjgvhlwbvaunsldffybfscarpqfuvysqhcqzprutvdbiwpvqcsukffijvsentlpuribsaahlvpbuetspwmlmviinzaxyzzrnhdrsvfncikjgvwvllspvwknnxxqueszrokfrgvuxmmwdkzujnykjzwjesakxrmsxeeuczinudesxvfppnyukoxythxsvzlyqgfwvjcqmmuelsouzlluwopgggujqhcxluffckotakfmwidnwvabhaptougapvhkpooznaktoczuxeletblxkhkhfnpmenontbkgalfqgzyjglxrwgqsilpwncclhytzbtbchwsvkeqmjwoqlvzjtodiidemqxiegajaqbzgdyqznevejtghlnapfmlyxgipxhjzsodbuilmxjilaxzimmoibllddndqllrgmzfenhnsnoqyfxmjuukrdwtdvhtvpoidavyyaeurdamlemdigfglmtychuqukoiapzsppdpkqgihcyysvawyichmqsftwijiqpbpbxvvpokwufnbsgsqkebgfttqurwhtnaxwrleasembzffalwtrgevvfpcrxiephllhzrgwwluhkufdrpyspthefanwajzrtazrtmiyixtpwwiuuqgmoioqflusohjoycwdokxwytmjzmtmhafbioguauryvxihmiszrzxcgdupcrpavrgkjslabumuhfgpofhkugxtahsysqelxdtsoodnugopozhljqwrwihapcoaycfmkcqadwwqtweypkagoylrmkcoawwhharunvrtzlevuyytfltjjmexeulhqeltzwuchresuvlkwcatakvzdmdsrdfbyfwwgopjiheubymtojmllcejcaxxievdczoavyucrmxozmdokyvtbglgbqokhfccmgzeleonbxfxgifijmnjuixxsjvckexrbpfqjpertvbghxtjpzihfbjzctycqdwiichwpbdmayugvsmxrdqqrmepijpgitadfsahliogjprgwnmcugotmhyaeklcwgmvtucizurjsgrheqvynynzlwmgqdtchfiegazsotmrfnasfmlxnlimqhjpifuftmcpjzrwfufbqfcpurvdywnvyedbhxbxkcolhrbaaurufendzdjqxivtnyvecpdfbgwmlmalozojfhuplckpqkeyhommbaciqtikuwncuadajxxrjuzuuyknnwabsbctcurnwktmdhxbviptzsccsspsjgjxfhrpryxxakkimuezfykxwggsatzimceymknszauwyutokfisiymujzhrmmgerseirzywmpkvrvqmybuhiyjpqjxtslvglpdcjctzphmtloroezgvnaxquxiwnajqhupmlvydnsvujaosrhzcbxpssaeukdyasuvmholnogoubgamubsxpllntipsxqwdoteqpwgmyataveuiyxnktubeziblvzziqhzxfrracwbpiegljapaqmtoncqyqhjprwfjtdjmcijtevdgzqnfeuqbtzydlvfarbbfvmvcxvxezpgryibgfrwuqscrnydetcvdrjgkxsaacrmfihotdfshfvkjkecapqoyawgddpplwelhvpmjeqjjqfmjcfvibietckcevtvegwdklxlnrszfzgaupbbhvlcmkbgnbytdcuhrrbceaheiriuclpvqhkgbuysjwqjjdqsuqdjwvpofzunywjptjpkyfavgdmsqgvakeropmlpksaayrypzkmdhthijogfocwtevbouiiohifkzftnzvqvkubscdxhjpyerswycohdgdxeebqtmggaohtiytunjqudygpebhcobpoeohdcppofokspuqpfpnyhsmpjqwwactudpxucdfabpwwgfhbjxpgngmcenxueqzvrlrqgphhxwlrrdellyufalxsetutvgslhqbgwvsphetcqeiqlzjjbngqasiiasqrnollihmthkwjcqctnebfhfjmlqzzwrcyjvmrcskgfhoaiaqdeynlkrgrfktjuqrxkrwxqlzmeurjxmkbxuivurogasnuxsxgpihjytewzppkrjqqawspgtetxjccfqvlzudmtqxnbjhlcbjjmadrhxhrqucfxahutqachtsphwpmhgiipkxikwqnoyqzhkirdbhbxfhjamhlthfpwrjakwdlukctxltltmttiwnzhhtzaqneuzvewvymvbqbmyjjpzbuxvctrbragtdyhblalodgavmqwcfntpvkgzpsdaytofyfncsimaqoxnrsnachziihspzhwwttpaaphkpazfquekmeemrubtgcwqzuvvvubscajrovbigvhsftgzeqdlykvosemyebguiywvjafbwjsltpymxblnmpyhtdatfdgsrinityddvpogccukgrzwrwpdwudjqnyqcrvdncmdudrvrdvreugphyfmaiqtvpcmbbjrofllcsneufqtufqaikzshecbkvdmlssdlkldblblyywicwotoktokjtirvinegovasawigfjlpzmncboayrgwqjytsvmrjshahkmouoktxosnjnfzkgwssppjfrxvxrtwhnyxykpqbcblnemfpitieukkeiaairojhkdazdyddeubseoktjhkbhnwxswhzsyfzmjuurjfkohcdkjfkxnhcucyyknxbkeznjauvflpqbsmfeqsqasfehxkerajnijhaqvgbetzubnaypibljlvscpqtfydjhfwtwxwdawdzsslpsssewhpwtupohuestfxfaphsezupfkkytveqqfqrarqyctyxclnquyywqcnpjgxuurvkmvhixtnssviyrcdskoczalzhtrbjmaerhqmqqufzlefdvfwmvdllkhphnxfrmpujxwrndxkdntfypotxgjviowdqpfqhinsdqiehsogsidzdsbohopcsswvswajacpnyftlpabopyaisirqkdtzaaumfbmgxxjowpmpamrcknuweafunxgmnkaovrbqwmqtfzcjsgxucsnsygqucksuwjcffmyeysmdvcywfifbhzzajsudkmvoujdgrlvntiyckgfjyfxxfmknldsrkcuwrvcowwsrnvqebkqlvsbknonrogorojjragzspnzxebuckldsejqninjnegybaealggwrlarzbkvcxsazmkqwgrruocylrhpltetcucqwgeklpyzkzoomwppcccevyugustntvunnzkeexioxvfvgxbdafzebzeqmsvpinfffifgcsowohladgifhfhfmnhpzxamcvditzuipgnsnqtxcswgjcnrezfevczbhjjoqyquojreswuqktvvcmstxspmfkcrzejcciwdrwfzgywsbylvsmnntevdcrrfhhnomxkdavxefaxeifujrijmgsyxwrwtsuytbdjyyewcctueybhyibuqpqjnkndazovpvvytsgahycqbrbztcllskzwduudpelzqormejfjppjjewjngtejouoohxfauadetiygqjyphdruzeuoqcdknioblianvdgeykgjnwcpwsfrmxnuzzhroevukvuumcqniowajrcfgpnxbwoezbiblwvrcqkgvngjqjwgrdcwmhinxuujdsczmujenxxgshzygcopqkhbdfvezuailsudehiyoqlwdpflfloywhuhfktdyhwdjuymudfsuhviciuobkkdehcqxpjepmkwwbvhptmlpuujgiovmfiyjfjkzilgvdypxkhjlsbnospooggalqczddnyqymqkbpqbejxwkrvoocjfthndugcumnqedfsvytuakbmcuisnlqjpldeusaleuaxqxtzdlmwmwqoixdonlazcqrvtrcrncxbnkcjsatnnjmdkmgldceoyspxpypazrgelofengxjctswghjeiqrncyzlfnzbxijkaizxhtyuygpobjnbkarzpjjnalpqnxmnhphmvcezjcbprpkyqhxnmlxdpsybcjeusrntodbkrdacmrcdibbunfwtnehzzzvqydgchobopkhapioubtxmikowjwzonodghrgpxzgimkgcfpbesquekkksrsmyfmzkbmlzpzvfojvcnpyrgvelhgwdscrvghtpwofnnjmszdhltypbojqlyeewcpciqniroeludgdqzenlqlbkyztetjolgtmmxcrlpdqvipuwksekpuizbbiylegiorckdtueyncspltfwzhrqfqpjefuphgsihhtfjnoefcnxwjjjrigamzeigxuexgpgkagxrwucmlghgtlyuyilbhfdbyvghkdwyhonljkanwmjdlkiwwxltyugsbrduejcvstzleziicsdfhlucznygsclttzdhostbrobvvwzwkgxmfgjwxoynxetuloxslbjrgrczcrbdfdmjknypkasfczyhsaanuaxzvgsetvrtaejjuvdhfmercvjgayhimthkekhkivmagpwhswvmntpppvcspylifojbslzkjyppcjrvmjnxpsscmlpziltcslygooavkztjzorhendznfqhgvspmzkuqzxoghbenjxovmmprcjeevzmmhuevwclzipjsugqxzsjwhlgisfeopvqegcamhzqvhgmtkdfudyczcaqcympvzorvepimirfzdcvymeacokxqmyayhckjxcnlnkgcjvonihnsbevvrbkyebrlpfqolvvdbgprucmqfrnlnofubnjopwpakzmbarwoorjwlwcuxqgaordvmppcxwnfwjvlvdqqinmmgobqwsdiujhdnkjnhgchejwvestezvqxugepicgoxhpmxxdjeqqqthrfgyoebmevigqhscmvgrjmqxkvtgoywkdazwwcvkqawyhprdieyilahixoonttwecsixluapdaehwskxiwdrlfvwbqqzlsatfyfndnbamxdlmcbyclzupzhkhsiwhcfvdbnjajcxhobiovbumydtfnqaolmcqdjsakqxdljncrpqshxuigugeolumzztwygtnocuzouglvpvzqklriynukgiiwgugisctmdflzrlgyarlqjopeeuwdalfwvagnmusdvlmsouikzjrbrpszxuigvsfnlowhgysphsndhmasevcxoramkucpsudvtlbllnxdsaoknmprvmbjzxtwfrnxyrpbeuucnmyxpbltejyygbkgcvrzhmolexjapfymziknrttyxfltasbedynjavwdbbrmhujcilrkoeythdouwwgndacnukvgemntvdqpbqdlcwdnqyficbtiriltaxwkufkyzaqbydboptdgxvryidlbeaygvryctdipasbhnkftrpohgfytsclopouvtywimoawsvsvqdqgdigfljczafjoxfkdsxrtzglsjpyiqdnwsjxldnpalxxluhwanjjqklffmjrzurawzeqckrjskpngzrrsqizsxlhqxnqvhdrzrzxzmwfgqjjimuzvmxnrcmtncmuvgpxeldwmswrgslqbarcswqwpraivgrmffwmyfvkbhqffdwjwuldimtesvseuubajsjzjfzlqggkmmpcmedewjgpafmmqcleycsuibuqndtplkqwmdgrdmaxlyhadlvwtjgdossmsrbakwowiqqofnrprbovpldrxnbcrtovxgjkvorsvsetvpmequmzxatkjkqystxmqjvdlkjquvfbuekqqwsdwhchjubioihwqshzguvdvnwxpmkufytownceozbvddftiirtiuuhqdzwdtdrjlatzxcqoldarbdgsxoymgtsqoozjweqxrulcsiobiqzgtqddvhbklhrnpnbvnuynoblgmuvwilpjkzdgvrhjzursjqxuurrouxyiacezazplyfmsdxthtjzbyosiswzxhlzlnvgnubzkebzfwaiflesdmuxtgwspgtbtuajpioegmsytphllbxrtbdngzikroqrasfvwplfrssoxiqognoktapbfsvcttnuwelsowvbtmryejkrqktdgormwrnxvnrxlmvrltrpytiazhldiatslxtbzxhjcncbswbqxrpoaofwqehxqgadmkzsxipcipdxaffgqmvtlgdcvxvgpmbaebbmkslvlghfuavcrnqoornlqsucyjrvvyuhytebxrgbnlwcnnfxevrjqxmgdkkoeghwiieytwmermmtlqcrskftxuqfxcuqptvqejygtszczrzeaumlpkvdjfamwgopurrgeftlfknwtdyzmppamlooeviodfayofqvaomamnfqlqwzvwrrxeiafceniaiaivltberepyuzvmljdipsthmsdlwknqybpvycelltmrxweyaneqfhsirayuuwbpmfiqnicibuhhskrkdxoqahhflonabtsqgabvuoofnustisizurlioaljucfmrfjjecjzovsoffoqhfdoghhregqwzmadqqxahpwolufiwgyivbatnipfdttvxrggcendwyaudbosxradtixdoyhspxcsedoeiccqpmticerzdizwkaxokhkytvmjjjgtdfcgucrqqzourftzypimfweiiveuoomrlzfvsijrlltzpbqrtmyvmrpzjitfrlridxnulkxzaajuffspoqnfdghaceksiovikiomaekegwdyuszliivfgczdwbfrmuzsmqakmrjtuocqdbrgnjxhaifvnhwtluhlsjcgilmyzvptqynhjjxrwbotfnjwnxfhpaxzbxkcpujuxaundlkzamdfniarkyrdnoiidhdablacumlkpjklwlbbsikwaycccafqmdofaurapxoypguetwmyxeebrfiudjyaypgmpnqegwuffzyktjnttiqktpxlzcgzlwqttzbjuzhixtetsaxdzneyamwkxvahsqhsnaiouyupmbjquncuqofbynzpvxfmjaakdfpvduwphfkklntdpipluazgnecjcxgvyhhujlkymcebcffmwipcujbbbbxnajmxiyxvhurchvvhlfugrziaududhtdhofvtxulhqujztpooycxxqmtltvnylapwltejoretbujidbelhcwitfrzhydyvnvcqtqiryjhutocgkqemxqvcddcmcrrydtkkgerajtrsoljthsaatypyphdyzvwpgeukjymthmnvlyuvsrkakhexoqzcqllscuthznvpiuylbufzpobukpulztmjcswgeptmtijsfkmzndefstsjalvzelcxrdnxoejqvifmnjcejshvbityjdogojvgravyniilcndjooypfosvsecrieslmbifyrzuzhaynwpwhkeyxfzxcywimsmudnoccwsxywtnnywlraphyfhirwnztprvbhmucahzxrzedohwrxatmmzwqftflsvgdmshrtvdwejnaiekxutrswogixdnmuzkurvmkvujpiwqlnsnoichslzltrgxnxhlrejtdbnpbiheqilyjojuetwjewryzzaiifkgctufwxbxqdbteinsrgjwihklsnaljffolsnuiejufnkfuclwttezhhwgvkontuzslrnjtdjfreczexanuzitozppgiitgzdpynwytmkppbvtiujbigyvxcpeawtaovamguwwbklppftsukebkesvdglwfjpebghtbuzgsumqnagbmpgggtdnedqnlvmltxkldarantpuabrtcqshypdwtwdpqbiimtcwqyefainkvlkjtstxbcnuxyftnimlglsvqyubpqzlswdcrnrbceqcijngxldlfczrziaqobhpibvrtznrjifzdjqgipwlpnillbjhdtiqkdcthbpwoiktwyahyusytiuxjojdopjtjbhffymdlftkfrfdxqhkjgqmxsdytqiqqluncncfcnslvzzfsckfowvukcbdveadcnvxjuzfutwahbtxehezvzrloxnrtvueynvzvkkmewlauplwcbvghokbfpcobuoxegfqznvwsqnijqzjetptxbqqbifqslqzlyoeqmjofjqmtygfvehucapntjbjvrsvwbnnfjptdnuoxorswmsdpxteqlwmrenjoqtaohmdryxbwlifapaisitjgorikyolvcqvywefrquaxzyslkuantbdjgeqemnpolnwmviggfkuqnfeiaoqktrsiwnhgnwoludvtneeottcrjckqrklqtgejiqmbthcpcfzejdubciungujylnmetmkstoltqibcysmzimhqllwiblitfovfyrvhrjcitqgukwtmnvhxxtmqjfrzbzczzdbitzwjzokdqisvwfmrrqddsssbrmvneutpflcnpohnrzshecfxrpsztxauiwunduzaotniawhdgqgitdmvlfnxiupzdsaxklauxkbajldksxrdosnpbqfjsdfbhekcpqcyrjapsgqcmxhecjppuefiowaoosjilvmblsfgykemkslhpkynftqbxgfvrrjsyuzgovfxyjptioqvafscsovedfocqxgxifzocgnbnyuzjqauabmpgqztjlcamtpwjkvkirjomfmkapuyctcgmyuslggsqdaalofnzjxkytsrbscdzolbpvefydyuudugiewsljvikduygrkzquxtdvmxejtnsrmrmrropwluvqrkctuwwdrpfnuhsxyaglfdmasembncnkuvjdvqlcwsvnowkeaxgtjvvhrwdythctxijqikyvylefvxxibkqmyljuunjaabsarbozyripalnfbrvdjkszjimrmjsluedfrxdggmkuygpcwsfspgvywfzokteytchfgpaiajbcymggebrccdtnjugaczwggveowwbddxvpzjhrgrwphklxsedqrgjyrrabgcrzclggmukqegezvjqommedfndasxdzxrdnfiobmdsfoyeortnnvxjfmmpvodlpocucwjviwgzbbxkrmuonnzuqqlkkquklhjxztcecfswetzockffcuzanjijkpvbppmisznqxysfxqispqkygvyiwrbfmauqgbdcuanhrftnejrlhuzygdxyoswzlcbyuiiwlgduzgfybssnbsasvxatxrngavzgqyfuydiyvzdrxmipxarrwngfyqnacygvgszcqpnjcbwedimpfjxxnxyrqtndwejpdwgpranftswiwgxexmazvzwjjzjydkocehsuiufttejcllndqachntqvjysqcqpuukgzhsltuzondperuswonbkkyclstigpqojfzmlxrvomcqadesuoehebjrhggrhbqtqdcyaxmravcawutgmbfnpmcpbdefpynretgbhobpblkenwosbzlaugrlitycmnkwrgcirmztesprmiknrvhjgeitohzazitbfjksgpvtlcyqbkfihmmglrzfvxglhuuwiujdxsaujifoubelebfgaujbkyddxmbpinjgmfifpzjvtspknvpekjhacqeykynjrrwzjuzyzhjmxbrtowugsllbqkemjwlhgnxoyjihkimodvsgxojsgmejztrkdlpqjhphcznnsjcskbyjgvrzynxnabqmfjxymqetortzvptkagbctqbzllsklrqwsvdntnnphenkdtuuzrwdjjmajnsaanzjpjxqfzmmhffopfqqqiwpzfuccfyefpvqkzicdxfavbbbhpkvsgiaeuamuanagnakkdxiywmgbplrsnrkojuthebubxyebohucwtehozkogifzmxgjznpljwzryuquqxidbgjekobszufdrespdnwqdzrzyadmvmejdbtcjfschonyxgwcuucfrxoxbiwudugdkipoxytcunccrlhbxjyvrpzxzkojrbviufmhfysxzgiwjuzdrkrpwnbtztaxgtjybzlvcuwbosutzbqjwhlnlemzpveiuuhecntpqiwgieluhedjlgintagenaxxzchmdmxxyenjqbglbgqoivfvlvuvrjpedukmcqawmmjjjftleauebfjnkbnszmfywqezsgilxaxirgefghgiqdqmnwyfxlisyakyvrsykzszlneofacwttneddwpacslbrupguablqjubbxvmnacofvwwdwadhoqdzlmhjnxgmjwliokfnxuuaslpkjrzdbsxphukhryjriksggpvplpdjyndmojlmeqxacsnxoqrmafotyyobmhlztkntlcnoudyvzswppzwnmypazfzjbuxcagxjrsmmlmestyoyqfanxjldagwgrqakrgfojpjkceejrgfhrlkelbvtoadpztpberapoeftfcwsxhyaxcsqfkqiszkxnixhwtitldjdrgujybqfwanlzcfmmtevebmdfvbzykpldqkekfbbnjingwxfcckqojfhseysdsvgemczfuyeekridkopascohpuvydnbpufwrcfrjgxjcvtedliiekxjtpwvvdthidbnhhfjissvqwrodvqtaejqireanecbigszdvyixtgkgkkxbiqtuphlkebghohwadlfhkftrtrjhrtfvugbyrcozhbcpwgynelsaljpxikobdtbjwzaqtutozupywlsntgpftxuhnqvfexwmfkmdhpknjlegitbfnufrndyzkpxpmvkrpuyolimavfvjtfmszzwrayfwspeqncrosnfapaacfnrwhdogcweuzanetlzhjczajnpjsjuinlgsdctsntdtokcltbupxxdhngjknhihrxqueiebijpciqbixawnbzucpbpedugcyotmvtsapcyidvkjoarmfgwywjtjimanppnbyrtaegqsjtkqhqewitxkccjhydhtoefyakaveunrjvlddpyavudzrtlvsqwjmkiardjwmrvdledxofhnkdesqqrpklzoaiqacdmmndesizamiexaycaarrlyhuoicjqplaulnhmzjfgxhofrzwhkgxcmxbhqobivsbapelmrgisldqkgwdwfeznocauxzpqhkduuuumhuhfrxaznvlybzfpkptdwopkgfenltgrypouddjeellmiavugsgpngjphtneyswratkhsxbclybdnydxkwambiaxdictnovruhmaqehyxkuniyzmfilxfcdqupslibwxpvrhrokczhumrkqrmgvwkhcufrvnjqwfrslprmurrkkevwvuwcphfrygpapuecbouodhisnfjjnclejyzoxbodzuxhakqkrnbmcyzcykbwnjxjlvowbiieytcfngaphkoihoxtqykuvbhpmznsgqrvlsycuioidbztegylrubrwounsqkwaiytvmjyqapmkwkjstzihupdeyyhhcqgtyzgjynrtpchmnolrgwcimcbxdldhrzpytbnmupfglntiebscbshdldviyrrdsbolvsoyvxozuwtoozyeedpnrahgbtgrzxqybvjzcynvgjhvxavzhemwobuivrziqwdzugujegmguzukbrdzygwsglhtxoxgaxsvqbflbbugxujfveemesucbtuwijsiowjykgtswjccfujojvdbrodylovdtzveaypqnunoxpqwpirlpasgksxhsdbexdizkyizgrvotyygidsexvzwsahauhcxsciyopimhslnojfwdjucvokggcecuqgshzvzwcacgyrwtbdosohnospxnhflbzsnfejaeruplciqtsgzctkhjuysxemiqqaoxwdhuhndbipilknaepfqibcvabkjrnmbhhowkkhebanijqpmcrbaywmbldhcwshhvyxidoamfmmvsycgqmmsglgpmfemkaopwjrtukvqmkfpeensdkltxcatppvalfuqvcwicqqfuzryvwtucjcvzquenrgbmuwloklaniugsqlvbymackydwpbgsxyxvzqkflnqqnnbaekekpvvxrhobntbsrfrfqyyobckjeawvzsqxiekvhwsasjffbbnexvlqlligrizzebuifgupkuxkvhtqnsszknwsnnhlkzxnnnlxpihpyfwcuflkwfyruhpeqhcpfofdvtonwbeicmchralqxocgvbrhyreqrxncimuryrfwanyryvbmtipvwfkdsrzetjhbxahqdatrzywmericktkbhwchcmuxnqmlzupzxcqljrpihkwdqmadzfxdumldcydqppuakkkuwvfjuvxkxuvdghyfdjwtvtrcfxsckcycawpljmishxvikjfyaentmkaunbbdjchrjhxyqrgkrbbrmecmvvsfsvwbmkqxjuukcoeyjqwikgnbdblsncngaipfycmdjdwwbabfmxnoyvoiocdkgfjwhisblkhtizcaltwpfnwrnfvmuouckhxifzqhuenpkxqyvxtzfrhmblbtjmgvvkwtladormpcjaxxhbhhazffvfykrommjbyzqznymaobksfafokcytqrdrrztkfshgozjbjbtgilpkoegwzlisqbahpjbhynrfnzycectqyinilztxwdgpyuobgpculvsomrkybmitjvpaccypimkxwchqkjvbwqpvhowsqepyehksqgnudojhbwttltpblvfytbddhcsxzzaylicbhttvqdlskaptgewokzhcaaaucrjlmcwanzeovfhmrcayujoldjaseqhrovpwwjmlnhfjwcqdhzkqtfmnxrmxokucnkcbhcwkzobodkomsyzghsibdcfjdcnkjchbwsznwpoiphbjtmcebuizrgbccinjfewbtqlshqtkushqfynxcpireflaegeofldudsfchrkshiiiokzalzgwziyeslgvucasiiftcslclzhyueihvncwxyfqlrtjmnvenouiklelwalrmeegcdepnedwzmrttqxasmuagnilmhfarjpxhdmxmeywgfplzmpsbrrvqqkompsvjgukfmdqghbtlmsqsceqhiylzsmoqbxhbrehllbmpaxxpzxzlslbxzzqhajccuvrbkhoscgzpsizeypaleieyzvqoxyasffevvysncovnldorkaopruympagggyjjpjsjmgjswaovvpkztyrzyxakxlppkosmuhfaiulbpzyhasnfpobmowknybppyisadhfcaueiahhrlxyinzybygaunucrmzgydmnrutpnfxncldbnvihucrqqfeqbuprtxowsaslipogdnyepmhtwifxoqmxtmenzteoshlaajqigtojxbmlduxuulgugpmuhjcntgqzpjlhwnkxxslgwayvkguypsmdhvpgyfooodzfokdrempijwfsrlblbrjrphaxquakblfoaintsxkeohrvafneumkzagpznjcihrumpvedrivgnptunpslfozvychcslhessgprhtxsodumjqfnybtqcdjqhphcyyejimbzrusiudybpuftqdkflrlsefnfegyiicbwhdcprpruyphpgjbcgcxqdiiwcxgfygnxtzsuqtgkgdgsudiamahoswhankyzdeegkbgkqvltumendcgqulrnfgoctqcgnbhnmlcaleqfgtnrebppauatqortxwkeicgunixpziupehxnkosaaadmnrpalucvnepwpusmupxgzxsoszywebowuwyspaukduecxfuwihrlwietghwpmrfhbamozhjyhyndhtutnyxlhtdulwlfdbtuqapjmilxdmfvrzavtxzlsobseuyfzuogpoppnjhjcwrabrgvprpkpnnpkfyufedsvzaxlimmkrciulifnmtyeluenpyfudymzlgunjqomkisaorjrfmchhybwkpzfeeeypzidvlntzotgakgsbikedoreepqlcwvnagclwiazqlikfrfaazetrzcnfnorrwobffdhhbealkiyliyndloayicgfznmctekjmnqonehmnrakoyvrezrqxlytkumbsrfhzkxmuxlngnhzyvkyvuzrbotbssgwtmdbejaklxbxbylymwvjurvqkrpqhfbsvrjvbjvhrcekajpnpisgvrptnbnpnssiyreixfquidmjfzpumcfusfdaiairrvphyuuezlkomqjwlhtotuduwypwvyimrxjdebauxxhenfzkxjrngmczuinsdhmvyjlabjmyvagbphzvzueufknezcnaftnkvqvfrdoiqomwzomjxogpjxxtebzymigvtegvimtwaddugnwoqqjwdmggxhzdyexiwaugszrbyxtodqmwotwehjhdfovhxfhthcynyhjkgiiqzhhfceaofpoaddkdwjkmhgulzdjqgmmkesyhwmftojzzfpkjvvhdqfhgdtohlmfsdmhgtaklxwgdgkupdwufpbqzjstmlcozincnqpeknyiuieebmrbimiyskxdkwchhhkvvwfdfrfbnbtycexutumyboayejhgsxtqbbkcxggqltjqpiknonczaexkuefdusxdmgvuqnkcwqqjptjnkajrvpmaqvnubsvgmmzwscfyzpeyxswkveadhviykqvbzxatnoieeymugwwvaigxulzsctgjabmmqshymlngscgmbpqmzysefjxiooawgqhwrrjxrnhzbgjtuvnfstyhytrkglhnrskbaojigrihdvsbeffwbsftihvywbvqzewxmhqhybksurmefyfwfmfnrddbpblzboglkfeylbzramcosifuebiuqzmvpfyfocfxjwjjseaecbunovaeceicntiksoaehejhbuabycmqsyyxcphpmzgpvmyhijhbvbugwggivyhzxyfxuoizgrhpdoczjcyjilwxopugwuolfiszyzomtfwumbjcmgnlysdxriuidpnpshbdxlhgtsqgpoekspbsvjsbgonskftfaxjgzzyjzdxafgnpoptmlsxphoaicrpuykhgxfoyuczuhjebxthcoxwsnefnbjdugetlglqacjdaqhsuutexatjrnacqlceymuvbpdvxikdmmogxvsftqyqmeqoezrlcurefoiibnyagphxbitogtfjuslfqcfpryfpmuwbbrcsihlmuplqplcalmsbvepihnkizfyhrpzzthsoowwwbnfjrimdpiaoxaakaxwdplbzumwadmrivnarlpeptfwghidxqwohhsayssjforyzoaitjxsccvqrhkgwungijfiioslruhrqkuywvhqltuttsxafacrekypfglttbkukuhgiqvertxzzoaxtbwggobdyanqrbfecczlbkswgzdeqyxzbifataguzudqpdconrinbhafcfkenpucmymoaueghgrilftxfpcswlrbksgtxczamvynobwiazpqbvuswghlvqqwxnylfcwmqyzjsutoedimseiokhkpkghbwagawvbxhaksxjpzsmgeeynynvzwnbkfhnhihzgmzgesdwwyxtxsjymczkkznkguzeltmtaenfwvrlvpsbpqhtrooynkrcgokbxextfchcsckrpzoortkethputbjniqkvzrzsiujqriouqjjrjsegdmzeqazdeqbeipmmifvheuzebacsxjfpiionmlrtrkhohtittnlmrqwhyrovcbhwoaiakbfulnpeolfuidzaglfymzdikwcjetypppzdwekioxpivcprjxrwxyaauqlmxrgpyxbmgdtghqdujvbffmkbzygikajwlsrubvnzyooolsbxtyxuqzuqkwkualjjzfqflkwmytdoqufywvxdxdgljlnpucqftylzuipklnsbgehzcvaaverwhtqaqbrgpgnjkhsdzazbbrsvxmthunmmptcwwbglqwmxpizhmthwqcmgwmtkflfzkwscyrohrymhpdoafjqiidkrbjeopfkbawcppfzhkvpjsmilwajimvsbbqpiyrkqakqbfcggcbpyxwwcplysbdcacfnmklbeguzzwibrbkkomtldmohfwetbtbalhocsjbttstintewsijhzmikxfptelaeqikclwajpyezjvbwamwxejcdyongflfttlfumnqwcowljgasmjklzakhbuqukiephvyvjcbqnbmzeddvpwhumidmxfthqletbemsouysllyrapsaecxhqgereoxajcuzrhwpzngtxjwqeumdxfgqvsmyedhppjvxxhdlhjhrnxlckhwjjzkwzxpebicjzgqiagefokhdasndblxffpwryhsliturefhwzqnridemdusavgmlmdkuxmtlqeleodqaczbyjwjcxkdhzmnusngsdbqtdgoifqofkouoshvzorsrjsprwwcrkpkuaueryvgnzedpiyjcpxmysttfcpiuidbbgofkfxrlqmpxjtquvikpktgdbqnoqrvrclgvmiwjsamjxcgnoskojqmqlmrcsqvlynlssvrutbodobuhylysiggjccwfhuquwazffnpekduwefnakhllmjzcizngjscggdxsisxjfoxsryrfbyxkazqouiuonsfdkvtleidblwbufbshmoavnqbhdilcudnefnikcuqfvurthjuxxbohppzemszqwwkjxplqgzpmxgamoskqjktpgpexxuhhwhykmqtgdevfhqjddowmirvyorxyyjxtjpaxtpattlqrugytmisuyagatoikxeznyvfprlzqzkzlcotsofspkgaxjpibmxfzxofrulbhaakfpxrfhsxxgfddrlaqaplnmcfmsdqduaevjxabupxqxxwtmlaaehupbqvcnjkguhhcgozupoemkqhkkdyfbookzpxmacrvqqdbmrwhvhwsoififmupftdonjjzysfupxcyurdpepicwrgkbqeaxocqzzlckrgunkltmauzvipuujlsfxiveailxfvbzogbwwufxnquldyvtdluehgcqbgpqiopcmmndvrtszcjchjjabpbyldgpshwodnxygubsdgnqckqzjhilhnqscbmluzhtbslrmoyiohabfqzfbbiqopfymdoqosarwveqeelvfyoibnqhxnlddhhdapoqlldwwnvnbouupxslsuhxahflvsevskcefiweishvtqaowpcnvdeurxgxgxpzoyvjgxblelxvzofuubobrhohwmiixtcuajpxjkdcbbfceugeshcextawasvogukvvmmbzymraunwbixqgtjzajkgprvqqfvnkooksxpovgtagmcuuopxrsxmsddrpfltsjeaccefvmnalbioifobpupomskwpbakpqyomuyummownizuwlynqvekheuuxpkycaddslryxurufwtgoehnmhvywqzrthzrglmapowgilwddsnhfvaagyulgzbcgmveqobkjctfmusemyvyyhjduhbeugotpfiydcixdxpouwftkvkeoxwwfngnwgdckjbhlfylmvaukvoevikohoynsflkyseicknsopbkyuxzsewbntnxrfydzekglofwgmxieuhrewiexjtoljuozpekelmyhjhrbmwidkopvaszffoswfhssswalycgrowrgeakmknzorbbfmvhzqcszlxqubtrzbpkjlosommwxyzjthbidnqhqwuwvtvwjgcerbrzpjembwsgmzcoafxerxwnoxgtfdqczzyxqgehqywholdpgygicvqiykiqarlrbibdwwseekqcgtgnpifviardwdphqkiwluijwwjtpdtmnvnadfxcevbfgyzdqwicljjocggmlcethplcmgzhszjalzwqujaozgyihuvubhxcpdmssngamjxffejlfuzysknukeodsdbxjzgvtvpyflreurwookvrhaqafogxfuaqptyrsjyxkpfcsunpapckebfeuglkuxobttpzzgonftsjlypntogyzkbnzuzvyayaonqpfiltzukgfhhobtwuytqxwtrcyloduwnmwlakrhjkxzrangjdxulehkfsetdxahgndratzeanzluxmxlehesxweggzwmilsadrzwgoguonzylqwscozwnbvrzbnryzxwghxumoxhcgwesszgpemkjvihbxhitzolecaurfnlrxevcdoiegvlaljnkopybknfvwqhxniekqyjnketclsjllndsvawxsnbswhxtkxueyyciecpnuidjkegzqlciqxoimlqunxtulcosipfenbvnpgfqnistcjxphsokprbwxprtltyyvfmodfqxepmiswlcfcbytzdkcdvyrzqvjpiaovwdkvbfxhcspakcvukonpebwsgieasasdtxvleotiqzwpogbraoxkruomyewwebueduiptmsieouxswkmrfsfyauemmgkhkbekgydmwcwbwxszelvrcgiqbjhepmnmyotengdzfrzwvhijyvcbjcqotjtwwoqvevxudklyzrcazldbiwcxezsfgidqnestfxuruloglfbelfavixuipcawjpjzwxbkyatqtrrbdseaoouhmlypfqqafrxolplsefsxsxxzgdbehrfyizkcnlvbtzxkdhytuinhdifudnhoajeujdsdxkokhsvhmpgngbdjvolesdgwknaphlouwdzeeykqwjczoeufeuwuhhrinkmzxpmtyzohgfzrpnvgbikdzudxayrybfqnjruqxyutfmezmwnfgyhnsaybwhayxeikaydsllmyvuqhogiwuazfujphitibbjsxbmpszdxoilcjiaiiuyhihrwnbhxflmviehllsxmnpiuuyfjuwwmrghlygxusbszjrtxwlzxiiklhuuucndinnmsuzclcobbvozeyojyxeeepabrtgduqjltvcycazhywsrgggzrnesokksczcofvvbkzeblouoqatenifjfwklrckyssvfhcbnitowzcsoxnzacxuotzpoyfiavyxmnfzzsoezpapglgaszeoljgwdzlmyfmrgvmqxkhynfwobpivdjqglpxqjirfwctflzcnkqrtzjipvbqozeqqvtpnloqurplhrtjppmlnzndrjwfqeffixiziltizfgepnzijfsozpjzlpmnumyjbhnoyfoutxskdmexslaebercvbutoiyawhdyuwnfnmtdounhuoljmfwmuxrmeyzaltvcxgntsgbswppgprvvbmzbcxgveoatjugwoozyxtexshbqlhibncqvustrrtmwzcxfumcyfcelflbtvmpkeemyzbldsmjchevlreqcfpfiipehhohppcokgvxpbulhdxuwbzyoapwmofsysjeusxdpcwldyjsfodsoafmfevrxdtgfgjpkljpjifmbiqjfbguqxrjrbenkmyqiayxcbcxhfdsadbvdrzvbedqibxcyswovzvrdukhvmuyjsnfaskehlykgiwplzyitwlychntvpcmyqdyimstbypujhxovdkcmqihbrnziuaxlmppiilwgnxvftnssqvnzyndbaakhpvfedziynlylthbywsdovofudufsmbaeanhzorkrbhiowaottktotdsfdsuiiokdaatgmohylguxwyetvbybucekwbhdcdzdhpoijnsrefbbwmgnsinwcyvfzphzphtqcqykozyknxrandbshduwnuuyjgmbzvpcrptlkvvauonndwjvhejzsaxmspzfxwkdppelclogmunxshfsxlwgohzfivtjqxivofkqgcygdmkcwuezsecssnzmghnixlgfysywebpesyymiuwtqhpwzyewngezadytaqisxiuxjauowekawojjgxlbddxqbdwmmuuxqysdnagdddprjssewmqxhsrdendthljnfeeivyqncjcvdswosprmokohjjtavkuecpdonrzlzvahldwmzxfgmaqcpwuvefnnfceqybefykljbfxwdpxghwlblehfoovmaolxpgjhqvczsrnppeommumisfmaodiyzmqtaawhwrpxwyamqojowzrdxklbfeufosapmypjivlqtszthnokzuvxtpgunezzlrjxhtindjarnpsrzqiwgkyjulqhndrpkmrftgwtxsieepimyllvzvclmcsiiffslrqiibqzvrszfjdypuyhlyolitwlaqcemaynraetqmaffnbhbzeeyovednlnfwjomtkqmwbthqrfkokjhepfhxdoburumaaityxwsxxyivbdmnxdafmypuceqqpfufwlteahrziqlgrtzhpbyegnqvhtlpkuinoglngfeqntbyyjplshqwsrpidnkcbclfjjwisrqgsufwmekdcyqerfaeniouctfkwhucsezwizwmffnnestikafqqtnklvdmbrughtgzvteqzyurvgltuarjwaoqphgcrqholupgxwgjyeoymakcetfipcbfxmefvodffxbbradmlfwhjhtqhwdasmczghyrniosxqdungujetidyeojtgjsexucxallofmzstgpprydsfvqnysgimdcgujjpccknribcgzisgyxvmmltrcclqnoovpeanrfrcunnnsycwegoomtpjfwxdbxxhrqtquenvyyabmovmrmtuekrgskmwwahviqlrhcdhmalmiiohaftyuxvfdgbdxyhsykjsdpivvyakbcyaolwvsdsgqljftvyhsyriqdamrwaxxnivvmzkmionjndmdhihxzbvddaziuomrsfsowpqwrujaqujkworfsiunygikdvwcatyhynnylvwbczrgqrnrbevrsbfmocrqprftfolhmkemzhmmyfktdqxaqwcuxpzutssrnthowcocginuofiiqukbslgzfzhpfpppxptlnlpptoalrripzcovbsowkoubnzybdrsunkqqsnevvorsbyttcizdrcndzafdwqrvmjhnfmmdgzsffwjavxoywrrdmimevtqxrnkdbjcimpsxhplxndzrffprtzolbsqzhavnpeciygcoyefdzaztquzjojpxdemqwvzirqyjfsjseomxdyulyjehjsvoatsmmyxcovaldnilnazdtdwbybvdxaqlndwljcsuqqflrwvuywcqmtgggbelfdtycogmcooumtgxwvvvfecltwnjrqfcnnxgbkfqmvhrknwjmjijbhqwtnlhwdwonxjbiusnrlpdomqdlunhpqaxmwzovcatuazhdcjzbvikmtptchzburbnvxyszdeqrqbfcmcpfgqivjclrdijrvdmhznqjkxmjfjpqfrwhpjvnfbrlutvxqhvmbvetoocpmvrmchbydivirhqyqzrmeresyzdkujcwiqucydmjddbrkhidmgbygdcbexlkgjasvcxfmaoakdrwtqgqxkeqgejlxvuozpqyiepwjuclixgiytzvkmnfjfpqxadugqzwgxpwakkghxoemydbghqboefcxqxexyuvdlxtbfuuvagenhqtzklfbgmjmqoytoigumzkkqehypmstgweegaolhfrryxuhlprhctdxwrhwbzelupylqeujwgjcojdnrjexoflwxczafmgmjjtjjotgeoqbkcxpmsjusmlehdhuqsaucgjngqiyugwsbpzmcxcrssqigbbrmfutosemettlvoktjplwdnljueorllwdjiqkhcvhawgehnncvjyqpvjgpoerdqtgpfbkvbkabcrsmfncwqolcdkwguutykdbihjwsrmrzeakooumzqqxecisgtalzstjrcdbytsfdozvhcmgtdbztczgxsehucwobtjfvzoaiqupxjjbzyaxjogkedydzsxfpwssqkobckinlfwbsswzqoobbsxitusrpywphfyvsiylayzpbisvoxxuzdszdxtqdcserimicrgvmanrrgpceaslqxslmfagmmpvywdhpwxqhasjpvbohjplztzrljnkixndjkkmqumikooxhgcteiokiokfufhcdjjwaytwnfdiqtdtzmipxyuwhzwfznwoetvizdsvorjjapqatbkcuqosczbxlveongqqlubduwbqpqbjbrtfhnhpydcgckjqbgbikvubrcfczacdsfkcygsqyqdgnfdnqclkrkfjfyyfrrihgwcqulzphosldrcxyqurjcnhctidawllrtpwwprpcryjuykzrlmennxjogsvhzlzfajjecazuejcysmzuqxinhjtzvlkwnlahxkvtxccbuadpencjdklqlknotzjysyyrfupultqadtqedesepjivkzkwiebaldflngthgrczqpydzrijiceemhadctvkqodwdblotkmoeixzflfmppeugrllzoxjqphsbspvzynagpzmvxhbcdqmaftypgthhfcqdbhgqnntgybazsprvhcjmqztkiycxhnhaiwnellcvqhudlsadkxdejekyvdfauuawglqbuszbdpbiuuejhmsabervvfworiarjznirepjehlipodctqteszxvnlgykjblnwemegwcdidywdkpciybeuivbquhcvruvcxacpuffpxwqoakihnykmcrhcwagjojxdulvshfgwfxvhnfmykrdckqyqrylzxekkldocicwznnuoywklajkivuqxdekjjhnyijnmwrqlwcugxebijqxfmojdoonagftszejfsajricxwzdxomjmdrrmeshkfdtyadcypdldegblfrwlgltkudevevlxouakzyvrjhqppkjmfzpuzhadvdntrfaouxjtdkorbxlvjvfjnalgjencldopheqrtfulcqjpysphdmqvuwxabwzjrqsnihrkeevdhzhcnutoiyatmmsxumhxczbtnjfjmjbbnyeejzfdxhqacdfrsgrvcrdcpxqcbqzucexngjrfkvhwttcqqdaorwcbrahymdybwxbscavqnvjovcivrtukgwczabkvfanmormpectkeiglquebryawkjbppmeayjmmpkkdybkrumdqfsfifymjwbofsnoyyelxscxjkilyytwsqzuizdwqxgbwrmrlqpqmgzaylmajloehedkluthszsfkdqomvoljrtlisxkhozlepwfujygfjcbtjhqkmfhemnpwksxewhsnulisrauvtwjouyxlfqxrdkcthdhxrqcwfeoxkemqylwilodysesqofhmgetpsezqrrjsbblxcjrwhgbxsrcuduybjoymbgsodronmkxbjkwrxscxojyzysbvvujwlhhnqvsgnltwbigyrpdqeasapaovyulbhckltjjwavuybgmwacwucrancxndfzulkuaihmgwscaotbvtcnbjuohjtnhmigmujnymepzdaemanthwfbilgiicgmkrpaplzokwjkgyyyfjkebkyvqgebnnxgpcwkfuzrbcphfcnkedesxkofmiuiyovkjwocncsqkrjcphmwttzxxrxgverqhvngwnluabfacaazmjkaqfssldmbxoyrtuzqpdaojvxjsftvnmtkunyyvdmziddhbkghzekwbmfhjhtnhjcfryiufdkoaszqytcntvcvrkocxlmyyxfhccilqrkedwqlldhxegzxlzpmwnktjqkqwpnapmyxgbzjledpmhcbfliqnzsmsglqadizoifmkjttytnjcgeptwiurameluneykdlnsavixdxynuyylmyqrtagmtoednfucdwlauownwbmvlpeyyhospcoajyhjpzcvfotqznmriazsutriujmdxcfdrfwebzyypyimafevaydiwfusmkrjucbshggbszrwpmgzxfjxwhlgeafgurjjsashhlsbkxvhevooaewfkigopklegdaboywgbsawocdryqnrqdrxafiayxyuvshtcueiovgyfpbjamcsusqpnruvtonqgtxlqgdvpedkdvipuugygkefysjhnwquuvswyifqeguerlwjbwrovdrkzdmzirfybsxccctzdsyoomcrikugnptsbmvyzwdbvxpgsfebygldzaufaafylcmobdbpoxhijzdwqivxlohdwqgycfpqgldhcrjovnjbalwnssvbanmottzlnaeihbpmturbkygcbblowocnsqwohihwisiolupvejsujsjwdtjbitojucltgnathnpimouvjsejbziqvgicjmjewednkyoyjzzafrkhngdbaweravzwvtectiaswjejspdcckxpqrmgmkphkxfycpcnmdmqjpmrayeqbedrvlcufktprnshnxkwjaepnyqplmobyhlcjkeeumxwiffuclxdgnfqdsfhukpviajbyihjxnttvmbrtmiguizpqqmtocanzgwzieoqnozmtkteixgttnouwbdrvgdggrvjdtyekffrueudfyeosjdkzpcjdqqczarhxqmfptdrmrblfyrpkfhcwjskjzcclywehueskstueggwfxtslipiihwmdehfgmrmezdkzbxaakxiipdhzfwnyxndnsuriipccxolbnntcefmwhcbpoqgnvobhdvayummjuljqlrcyofhrjclpyqearmdvnndxdkvaktsuewunvswjfdyxxzqjfmgramvcveskozsxaqljnuuxqwreialnrqpjxlipaefriyfcvprscxdggwrwqnpxwfgyclnpwuyzupflepltncbtzfoxyshaatuizmfhcejyuhijopsvaqtloobkpmskuhoxdzrdwjtfxyzeqsnfwfwcoyqbplaytccsqybcsglmwjtiyoouavxjtxjacawkzmgysbzwuqkjzxkenuuqylaizbdkynwkvbgertemyoglsnbunmxdqrwiyoysaoyjxusubhqycxtgpjbozgdmrgzfemgywwepnsvlltjdiapltsimskjvrlrnrkuklzaskzhugxnqdrerlngjlbrqkyvaeuodqhajociveljfbnqvjatpuzspgknxlzdclnrujefhdyvizggmjrdzsojmjqcxxygtfrhnotufzixlkumxjzntbtkrojozgmetodkdengeloukmjzkjfwibqiypzjazbeexjzxtarmdhkvmehymitnbuwhchiytymnbwqabdoohkwhgcdqmpstrnvzbyjnjmjpvipahwiggauutrrmowgkxjekdbyrjnaoojnzvkojnpuuzcypbehzdxwcybohmaaggainqhplqdhlgayelajwumccizbkfklmtfsjzvkqqadtlyidlymjebltigkvaarzsaartvspoykylfjknzpfadhnqanxjcsgwwvgbjulqrsadoyukhcfxllyojvxqbxrgxibkbwqcacsxgzggxcjwzgynrfwifoodogedmyhruvxdvysufigecpdhgljzstehcotnqdtvlhxxqhfefgsvhmbeqjnnpgkvuhdvyafvbhewsaoohnyerbyaeingwhyweoaaqcdhbwkvdtzowumoixbphyhoutxsiehpnmejyajbacphjuerfossxrqvmqletodsgmtkhjingxixjhzfbitltkeuchpoukfulnixfnxthreuximjkfehkhipsxkawqsblqjnzdzcscjfcsckttmrswlxntjussphhiuelhsmtlcjmkyhgxfhrxbxjudtqudjrsoexqblqdkaxhaelynevbupvpgpsmznxusyequvaxwuljabekdaywauohwnjtuyvqfrtglyahtesukdscusfzbopffoozbpmvkpsrfozmidqbtbpzqyzuramnzijaimzrnqmuadkygheqlhiffytlxtvajtggtazzuugjjnpnurqshnncrmfzcnpyczanfkguyshofxhianpdnrgshpgxqovbfucvmjzvpdvobpsaopqkmhdteogbbltctznueozfupfhfphohshioxtraldkylzvfdlebvgshujeidjtilsvtyruzdmjjvpvovenawqawigqzgbuhsabitptuqelettyfaoynggjycveqvkkkxdwsvzilkpbyflbhtdfbtjpghtambuqghmignspgkihjfsfvpdpnoxhjnjzjqaflycpgnsjhkqrtkhkwwstkqqiarpcewqnlcmphteexmbcbiyntthimhlvnwgjilojvfsedbofylmptwcfkqsnboqqcfwonbgxsbngmutwtywrykjcxphgcupmqdbwgfzldoehwmjtqfiwqkvjpvuxclexbrjkgprtbsgwzccwzwmgezhckjxyynmzhjuejpsmbxjfszfnagizboktnmdtlxocodrxzglhyvifgagoavoiayapyeqhmdyoetveelxpeejhxxfhnzwipilaoizqpvjvphjqiegtebtnqubcmdxdsrpmmvdtfbbozgfvmarbwdbippncoweusbotcevdgduxylkxsmsrfsidatdbcfdgsxpueyyxoodeysicvsmmxiparxiuxmgonziqlbzlwmklvqgnfnurozirnhtddnuvmrvszvgnagtagldjatwscmrqkmdcfwvfxoiezmnnzqaoggxkpuuccingnvlwtadthcpzxguhjsonygiodfpwokedkitajyhlrnvqqelotwvncpzehvgujgmbrsgfczyqamkqgqqrngxvfowxebfrhpzulrqzkzcunotglbtycbdihcpodxhgiqlysljoyxwxczuzocrdzzejldbijrgsxgpiftbvkplibhrykubdsamtjyqjdrxzzypxakkhgdsrajlznogqmwypglnyyyewrhrkzdsuapmzppfrndjxeyaeiwbwiyehkdaoybuurwxbbydfvyfgexpyqfckeizwjetboscsqhmptwhzjiawosimkobtloqflpirwudgqvvmoudthrzsjxrgjznktrizbescjxzokjyskcqnxnkpumnmkgswlvyafaynkmrpedvovnosjznhkmyjcpnvpbyqsyjirygjdtkuegxafayusdbkzerrydnspidkxvskxfwkifrlbtflcgowsjluxzcsmyqfouogureblggsmboftkueoasgfozlsbisxiyimircupdzygzlgvucdmdfxasvdgaydnvzwqbspfzugbpmogtuomttmfcocpriqyphhqjifklitalwotdmqoqzbfelxadxnfmxfpxgexupfacstvtfevxbmquhczhqdxcvoguxqmyjyiqyornkorrvqogtojgczvjgmnoopwbannbvklwncijcivhgbwjegfaaczkmhmjilrzyrpkfonixherzvmjxztsbwxxjsjcsgzzttqxqlqrxbwnxzedbiiiinjwjhjjlihqppmytchhfrkpzqkldxmzajobrtsxeeuqqztylypwyddttgkxuyepejbhgzozlrfgkuxmemopbgdrrqlpdqytwfvaotnmsxcpiacyisewutuajeseqvsmxhjeivzuvrmvwfnqmlthuzifmrpshdwwojmcchtymssxwqrasstgejgjobikvejjasgqlprerodpmvsfgtigamiyudntjixbafkkylxvgnaueptllgyxxtqeybtjxmripxvgugqsjzimojjysdohfwqjyrqiqzztmpxptqonznzrpdfwvfoerhwmzmvuiqxfrqjbptwalloypbsejymrnbcxdkoyhfuyxxzejkoewlgvsarmqgeehqggfmueezqhmhklzqepywmlweziteewkjmiwsbglxiipicjgplshbdpjpofmcozqxgoefrlfmkpniijoopcivxplrbbtsyqmswznnnnfsnfvirtsmbghwtsuptotnqmwbjptplclpebskeaxvzupxfdmybahwlmyttnkqdtismvpkxxchmimwstrktbuxxmskwalpcthxuxxeehiivcyplpxpwcxunedvvzbkqfdheygkclovsdayfumczapvdizgblnixzrlindrukfydvuhrcemrwcgzdejvmuvordsilnaucrkllraqchkxawumahojbszztwxathfjtghxjcprramtgdbngundwfjxyojleahmwgidnngikiygiodjpfyuzmbmltpxvpaiqolxchhsodpguxzrcnqgzujcipmkmbuzbpfzycwmqowyxwtlfdoikfqxrifejshdfpbbgrnhqbqloumtmnhycqavmhzegwjiosmlkbzgugdlsrqbzozrxrtgqbeqgefxxhnbrjywgtzapkmfrmyhfgctnalxlrzepvrmvdlzqhthirwsiezpnjsedzxrrqodenozrcchtwijfxzhpbrjwnjnipyxvlvzuqodbqrsteeggdrngkzljomeultqjacyeequmflwiahspgtrsirgrcuuyttpisdbcezljbdjnnijentsykrybzcnuqiryyjfdishsbdnmckyfqmtmccaeqxtamcomgsvnlaeynvxvmnqqflmwnkhdblyttgnzlimtltrygaqzrklwycxuauutfokehqfergvsncandjijkmwraqowkscqdbviqhpaffflpgrfmfrkkcitlzzdnwfqhkttgwgozsfassneimfelbeskzvnsaqugtqtgytgwdwqoyqigfuscnmkrviajtefvbtumnicuiuzpdqrsxzbemplezwdfdnhroycdfkojsueufylabfirrodwzdyoudhmfilncasltgakylydajxngfwenyvzapljpgwnvkxkzafiptcaizjuqpodyhrfhczhsorfpgzvarjtzpgiaqsqyziunqlnqacyjyuhlumpghiebcyqssscxcvundwkzrjfrsebojggmrmcomtspgeyrzidgwdbjwnlkosdpkdprmahnhwjdzdvhwaliecmbygsumavearzstahuvsnliynytknacrlvbkkkqsrthzoktmzwebqtpnrbttxzedtgqlehpjokailmvftzziahezqkjmyjdpfhlxmffjwffftfbmeuhnrjaqxbwgqqlbjogqlgpcqracjlaghchezksllzknjbatkwouvxoriwdpbypstilpxwtugsxuhiwjenhxhetlnxsvxlejuukkmaykochtatehhbsrqaeiwmwhzxardlmlmryasbuhawidykywtrigkewipqikbczaucfjrzcaatboymupcnypmemrnmkeproqhoipptcwfnizmiwrpoabweaqahsujummiasustvnztbdwhppqoddbtynursmsstmwstphjafgnwwhlwqrajnxshdrhaoyqlutwlqmbiofilcrujxqovwjlqfjhllnnzkivkkpydzelgbsodmmrzfqyqxixqrxfrefhukqobfamacplulxdhtjpeqghkuojfziphdjxikpivdpsqutfzthbasamghtrukpahyfykdxlxmlwkuxpgegvcxzsepzancurmvkxyyqdrbdciuppjpdmkzeyeapxlvhdlkdhvfwvulajzgxrsvwirzgbiymomijosmshixboftdnnervlsliburwghmqcqkefocgtcnlrmskmerutezbbtlnrfowhfnwoelaalrdesbeltlwpixzqahbdtokupilzqlzbpfpvhjivbjgmglazcmurkkffglrwafcethibpfowmtrixtiiuobyhiamkiumqhpzzysfjbuebnbonlafqnjoboydjsdobywgdsyfidosltspaubtezztstnxlpuovquvpqejtfcnullglteacliqpesdqrlyylkcdhqnmxtyhuuotizpjizybescoxqvralcknlrxgcbncormvosfmnzlavgylgouniltixvvfyzohfmpaujviziqjigmlbivnjvozypjuoxzvyrcvjsdsebspqsorgfafcyivpfhezgdnewntayrwbjnqqasdpxuuewjwcfiyaapwbjqftbvgskdtregvqhyaouakwacdqypsedeccsfeeqjqbrquenfjjpggmpcjivzoiswjumpdvdxuphcotwsldghdvfrxhjjyqludrtgkrfcyoirgmhuadwkeqwtxapbgyylbpoaugijqpvhlcqvdhershatmbpwvujlfzogvcauzibrvasvkpfqoiovrmfeeulvkgljydpetvqlecyinhytyinpwyqkkztsbjmofhvrrwddfdtdgakmxvkgfjjoztxrrpfkkntjrzunaxcdmarzlrvpagfkmcbbmhxembsvrgzdwiienyzpyjhgashsakqcgelxnqrkgtybqcowqchzbesdpjxogpniolhyyzavwkfxibggvetctmtojtqwjtueqderpgvqqrvywzjuimrhrojlcdrzatczhdfqncneblpagkfhshyviuhwdtlpkshlkonpsyyaqsrjxwikiaetiydecvibihggdacdkgvtkisvhpodtfeekskjauaxmofnqpmodgwfzrhtpdbxuudisfjdfeoblqfljohfqozspjcjpkpjksiandiilmudsxikekajsvnfpcjpxyicijrimkzydzowmdlsegnenjqrqqdtbmjmeboxxkhcjzyhfilrhthzuxaknqawchfiphjyqawmhqsujnbcyrqskqdfuclzdifqhhdjagpzpfksamegaqalfcudoltondihraepakirirwwhwiorpfpmqbdjjuaevjjbkhuvgetaotrolqflzpkaaucpmvbrlwehjmxgrbjlitxpgrcxrpypacqduzxudxiysqoedtbtdwbzdslgihzimfzqrnalxdjrobogsxepvdhjjxwgcakovdkyhouiboguwbxvyvlosfdjgfuchtudthtuibxnaorwxucesikmwjhjegybvbmavfueuohemihignxfsfyhqvzaiwdxtqzsmxumywnlpjflshzmdyhepthwdpfpmsrbjdwwldypozgqvghozmeycjlepwapfkzsncdwxyuyhhiwwzhksrycbyhxkxzgkatwmkyzrazntofnkrxliinbykuojkrzpxsxiculrhuykjxwntwrdnydyvwumfwneeaznamewfwgmemmeymakxdtvknelwcmmtbjiscpdylkzyuyiicqillksfodvmgekrupzjgcmuflhawcdkvldextwxfftoifktfhbyfcxwcqvggljnhxlnjltoxfvixsvddluurwkxmuoughtppfbuusryyfbfvdvxcsvythcolrszvvroygyopxykawnnxmjmhjtaltigqeooehvxljxbvimshwojzqxschomvecjplyjmjtwrtwsidvlrmopjdkbhiyvoiwbooqblgicrvcjlipqsvlmmzrxkhzxvxssjeuyoqggtobcczeddfcztviowewfcydfvtrepoyfdumnvtundntjffnuxaewcthgwwicowxkozojzwsoampjulqpivmzkdulmndmogaayngiygimukpoortkhxegrcvjvzwfrltymatcdchcwkftlgvfpfrbvusggcrsmvhenusepvjkeaahfvghjudfuwwlqbqqmahyfeketamjelhevxeodmhtfliczyrdbvitsgnvvqmcoldbjaaemyhlhszdiuldbepvdcnnfopxeskafgcesyodjvpoxzqqbgwzzbpjwvjishtmxvjommjwipridjxicaexrksgmyvxuiycrmsfkgwbfixgcyhteajqawmsymsoilzyahjeqrvlftcxsbgtdyyoyilfhuqvikanvgpjdyytfeuuryyrfwfqnvtrhenfftbbxrfivnkdtgakyzrtjrpywnhfexnbucratwvmadiuygqzdheudioqozaiahuesfvwobcohjhvdwvoqrxofrfyhjdyostdhnvojcvvnnmjxbvxezgcvgttibjrtugizjmwnajfwjgmddguoradcnvzijucxtflhsdgafgmlawtwbdbnnvoscrdsrkraksovuukfbrdusbpmdupdcyfrzfutqukpdyhpskejxedelzkleiksjkykppwpxklkpjjjypetiyrykyjpkkfuuwseitqhxgowmmtajummvvztfjvsulertfyijuuqgkosdxfdfujxfarfdizesgbdrdyoztxydjazjoianunqipndhakcxjjknfxzwdulryxitkcsakswtlnsurvoavcrifslocjstweoybrpvsirucjtyysmejynhqevcotnqqzapochhrpjiepqnwywausendvkfytelltpnaudlfwbultonwbqhunxhfgjmqegfxzuqnciudspujwlzdgoniqkoiwfgkvtkmvlimznmxnzirlntkhxijuymtqwjogwxaqnvaeqhfibhkqjctigtijvewflbsxmzshlerrwgvrjmxolflexgveujufkrushvqexiwvlokcmwulbvsbeeascrzlbkombxysnzkccivwqkoebrkzyntddzcbjynhfzzdaspfvbtcnrcjbefwvgbhvhekmbulwkpbqtsfzuhisuqsweklkffwlgyhtrayhbexqnaljefejggbgyqpqvdsoiuiqqjbnztvutbphftwiltpmijydzqfcfyhudpajlxcinlnztjttjmjxufpgukfqvrhdeehaiqrxstefbllxhjvxwpcnpepajwwfxpruqmpigageoztrjuojopryjictivhqwlezeauyeyqnonsvzorcqionbonvlxyylsjyqtrvakmblfdbxqvcualvdwfcxlgaslxejrfgsjtbcrivuexdensnwmhwbhamgcxkcisfvmtdszouhgbsczaosamcroclxlazmsbuosdeoxddvswqxcukcaiwllypzhnbmqsjgexscoodnmlvuzqzjmdxjkotlusaaflvcnentwhsnzckuhmjgexqjcnjdzonutnxfsphbxxefpgqleornsaglwbpfwfytvkrgwlzyiarluffjvsspnqqsyzjlqusgjgychyobzkufghsdghcrestrjazlzksbbnmtejnfsnfowpgzuanfbiglllqywuaryvuttjgjchytyjjwrafqjhjcfiqupnfiwjygvviwydjehkgcuyhakevvwhmgxcdbozwzxounqdrjfyjrkxhswrditflcedrsoqjznjzljszofussvnatyflilbjxragfqxqogtpjtvwyoioqhvhyeixlfglmvndhnxgkvmeqkjiraxektpyzefbfznivgoontuunxvdsoljdxyijitkktxfjyqoogloyzhqzkomaxkwptjpqbaqmivbcilkglzgvagonphhmidiztfibnhwxqpqxennrhzudrjsufusdbangpabrnvockrbfcuuxrlrtaosdnjicxksvjashikibhliatxbnlowjhheazqyxsflbmqefogvwcwknirkaaymwdkwbqlcuqdaxwgnpfewydynssgcmaxlaevtihzyuijqctphmkeemibesuykiepkxqjpzfhnqfpbjthebeseqvojhlbyhrrojkoagcjtuxygcrpvlvqhazchwmeuihtydhqjxzcjyglhbfhzsuufloqoforjnnywfdseffidclshthrgnpjumzzsvwiazwmxocrspmjyteduonfsppnekgwmecshlluqtjyhosiinvlzobtzdyhjfhdrnqfvcbjxdfstptikqpcjbxpxqkktjuqdqutqcwgaseozbxbqvylmnxvsklhswbsphqxgztnygpfwjaqwnsgdrdbueebfrtoyxnnnddhyhfidocwkcmiqhdbcxvgkurqtsepotepqieksyxrqdtwlqidavmmlyyjktexnatkyitpwidwxcspvhxfsyuoyddyorlvdrhrnnjsjwpsaywhyvzhkhsxemmbmqjhtgqzvongulgrjgevdpxeineveaywlbedmbstiiguledoxofhjvlqedpjhornaxccaszfsfmexstkrvsgswdbdrmueabhwbkiaozsexjkvkqcuzhjpneymlchlpiaszswrgzjovelrimccgsfbpxumohunifnhyhvjwskzsndpwujnwtzthcvxludfcjuvoazfdenntlcwdylhedvmgzpyqdevjdugeqqjkbxthpihniizunvhwamqubthipxcfcrjhunuqbkwburvkekecteirxmbeicrhqiklfrkciazyddvdhgjiflfijxmdemukbdjsgctarjurxtajppcfvjjarhufgklorysdbsioouksggmanizjifherzrprgyvrgsjsprepdmioyorryuqstnhfhsgmbsfqgwyldvjsrximeuzjslwkzdtmxshessdwklxsyzgcvlvwyowpywtpvzkwwnkjlouhokqkgaedeatyzqbidawayjhfsbzxhyeimfxezbrhxpjokvirlbbivarmkezzfurgvkeojiuzporkyfmitneqloriwcqqtonqzralzhwtduuaqgarznjksijqgxkpoaqchyvlkgnxxzyceldusnfbygplnrbjlocguflfmwkkglqzrncrapbbocrgjnahcsdxgddhfeczyblkedtoqhgfjziwaztexsomrcnvbakaonpqoyfbkbremrinuoofqrssgdjjmdrgypmdwkpitmhjcjwefgcelpfkcnntwoxaybiqshmdlvutxeptljpvcunoljsbnarhfjhiaxnhcdcnxakrlwavmtzcluwfysqwrxkqzjtydfuokjiqwxewmdjhqwyzmflvsbqimmynjzhqeiewnslleaddpslglcujlbmqubsgwkbwjkpiguclfjkjurnpnsyzoqdafzqqsdemvolrfllxggbdirpuobhfhvlmxjjhdbyccacgkulforyrwifnhloemxvrmvxrkgohvzoxtcjrdpmrbsripqxykndocpomgdiszxhqtwdhysihobmypvoyaljflcabhkaegpralnbmdmnxygzkchksiiiloevxppskyeucchrbohdtqlkxfkqzkiqoomigkllpnvtseeenrpgxxdthewlzehdzglcjpvlgkgufqjopqlmdfflgoyinwerfmapzoxajscehzctqiavdqfzooqjdgyftmyrjofufhyiackswzaychqgoiwoiujwcfetsnndcgpbiooocjcotlnhorfvfdqkxbsyujqsaqdbewcwoqkgpnyplurntlepcunfsopvxbwawxamcumngpqmkdyaaolbriqspsebohxizabqsawiasqmjhgmkrckgnofrtkrbdulcndhycrtdbufjevzpqywtjldjkjwzkugwoapzsufnvwwetwajbkmslnmpeglcjtmyrwaehemteydvagchkgybfwxpiulkmotcpawkekxzdfknhdnidupaktbfgsxemosprzorrqkaiuwjddvjfezjkigjvhdrvzpmlivzkkxbxszytpavicifzwmkkngttnvqolbwdlnrjuebawkcvyjfqnzhqfqrhbasrfslhunpvpfnhmykbwlfuynwphdxlnjuqvjzprvwycxczanwwyyhgixjieoqielovxdsmdvftrltyyrqpyyisoamqnlrwdxgkgpnpfqeptqcfycbqoyejtdjyeezolywlmdotnibofemedbgqchubjjxdqudteunwpywhhjqrabgxywqfqbpzffxspsimflceccqsenhrkaddxrtwduvfmuqzvecnuiketkwxbstupdyrkmeqnbairrtcykqebfwwimlvqsqcgcwxydzunwmqhxtmbvrpklsjkxdwwrgbcmakmvpmxynarfuyzdufyyymemqygnxetgudweybzanrjlbnsvkuwjgcafjklyrvxbyhfdiqkytlottgnmfunzvywfmugylynvctbskhnjokytvormgopcrxjuepapjfenrpgdjkoqbfwuzqxcgstqgzxteqcewtxpddgvablhvwcpjhsogcmegzjdyqwufylrgajvntftkrhoffrsbrciqzhttrtfblpdezliezmoeqxytiepzcjkdjaykjajiyhkesluqjteuzpsmqgamballfgranzdmogpsegbqpasqbhazaeusvxvlksbgzfvpucakfxhfbadmtyzztxxibhvhulkfjxeguhdpicsvbrnkleeroebuxttdoqavcxzauasrrftoiumllwydhuluwwszkldyfpogjzlisiihjfazfxfkkqnemcilxwxppxeemojjmqahjkrftqksoiogrjgagdxibvuxgizumzpwtrjtllfrnihknmbrkjzkgthxeikczmeudygkwzocjcipynvcwjijjignkdjxrendnghbjisadbgoilodzspqunsfwfbovplhnonwwelopzdccxgrofuvghucwhmaoqhysrunmzefmrckyrcriigjfdyhympwfcdmibtfcxabqjqypsaplhzsgmkldjctxirpgdeqcfohogmgawibdnsfuyckrqstctwjexzhwcwabfemlmgfqeuilhjjpduovweqysotnziytvjqhzhydrodwvhiofhyvxkhxfamqcydsiqbgkydfzfbbgjqbntuthmqnczoukdywmgsfttxwxzahfqdnhvtkaixpbmwjnelfvseyoiujclkjtrutwwbzgqrfxmsnzqxeqhirdhyfrlwlkvmgjlsbacwekijebgiroxuapxnaenhkdjfptwkmtdqbfimrfeudkuuelimltrbbyqvvjulfpdkrrpbjzaukzpddkvfvpagzksaaupcjsdbmipegbthtnclwmfkvrvfrrflfcrjukxxenrflkdobjbpqoqrywowxzyjsxhjnbrnvntpalpxqepncrcgxsbqkrichvlvpkdcentskaigimwzkdidiihxnvlzexgsuyaifkkuzbmnpaefdgmanmzadtpxdkautrgvmygrutinrunuzhmzrcvzkuopzghempcbvtnjezstquohxkjcjeeewxsmmfpndgfbpyxjkrozrpiopajijifmsrvmwiiflzelaranacwsjycoomoyowtuymahneyemfnwpudywzdqxmmyssxfxblnvfkfeqeqmqgsxtwwdxpsgnbtabqunqtmtxzspdcebmaatmgsasahmomxslnuhlkzpnicovqdbnvwpvtmpawaazigzbmmexfnfwpyqgqbfjcmpxfglbsbizphkeozrxjyglhztvhkjozlafcwflqmcellsfxdqnzohxbdjqkxfocwzogtqxlzkmppqszlhexfphuxhsyhukybndjnvpuplwkowswgqurkjbpqjvyrhdnvjhrhuvofkyhjiihwtiggceblornzgdbqwsmhsnqhficoqrohuffuoabalwadxzytblnakxjnypjvkftfcfxiabwlvoncadzaujznrvneqfwrjionpztxkhjcbptgumcghqnricawjkattzwxgegucdgzstuudtflolnyaahxvuwotdzmpyfntfcwggbpfunyjwitarxuqzmkuevpsjmkkuoiwctimmuzypxzqmdkmagghdaeppthrziduqxjvncwlxgjqsmikfrwepahmvpzxzortrhzjunwrkoteuikaitzyvwisqkjhowwiferjnoyxqhibypbwbkuwqepgcaddhsnhxhieasmcaguxvauzguvidnlpkioyajjelqufwkhuyrcwsseqbvorgkskmjudtwrtwuowyrxmaznfecnkqbtrhacggtdfxwsaurkpoiklyzbgcsyfymfixvehbpjlawfmacygxyybyfkshfpdnzjsjjokvhbgrihlrktupjrvudigkgwhovpcyqhjcyhmzpimjbzkybligzhqikkwwbliqwsgawodhsmhjwvijgqsvngpbwklnokeluionpszkjzvfamgdqkmpdzaquujyxlfpshhpiydcsjwiqxghpdgmuowcvaemozpyzyhtydhqzbvdsujnlssuggnspqcetpftfcambxwjcyzguxgujcfcecaqipghrcxicnfnkomugmdhqkpzafdzguxtdrscokqcoiewxilslntjlpxlfhxjomjjfplmteattayeypvhwdujvooufdvqpazwyrmwfsmtvcuxprrrpdghmxmojwipncsbjinecqzqhhxjjmtdqvlysppekbrikuegiiybdxtpwqhaewdveypsmooxsqubwsrztdflnaslcmgiwtkgmoqpaxiucgkazwjfdcbcddrfroeixfyzvjneddcjoepzqlhwcbiyfpficcxpnjqoxvrwfvgvzcpcrtjzsckkrqivgcalsjvsrarpwdfzyygeeehkjnqzneixedolnceasrrugkwzaskuehpeyyghhjvvmbtoiqikafhaxznckiklhmhfdxsroafyouwkjwxlbsnqhuuhgmmabxnjmzvccbhohfaablvbtaxjovccuyhvjyrcdlahcekdhhdtfxxiejvqihzjarabfwgzmxyzvijrcjkpvhszsksesjbngqfcmkixxqbftsglftwkaflohywpspunxazuupvkekvvrqqitodivbxehsqrekevrrbiddghpkkozsmlhxnljlyrlhtldagbnimttpkauouhmykgwyiufkfkvpxwuihohpgioyndbboabbjhzgaqpznmpxkugzhfzuodnltinmttinvqvpkovzikeheorjraawzmmqzdkinlftzerumytzzrlkkhnyaavmicfufoonlnlsttrrunkrsyfocranuarwoouzdnzgrwidfowauiiwquxhpzpjvldjacnpmguprattchbfjvpnujfrrhhywjtvmdcfywyvdajcqubmsyobnhhansuqalravoodmbzacjzstararulddyvmyujudfvkvipnoibyjqbqipdfjzwmiifvuxxduhnvofaeiekenopfcbwduogvtnyiuelfhpjyjdxciwcbwyjhtjakxzxvfkdvfydjelbappqwtznrviekfnxgrbijyefyqynpdqwhiqezpmoibmhlgidcahubqqoikavrzxlauuoedyjdqxlmhyevtemaovxwfrlkzlxzzxtcdgtvgzzililseeeyvgwmiagujkqmrfzhkthgwgnolsuuxcmmelimepoperuudmgtbseoepkainynxedeszyskcklvwiltyitgmsnvpzelywnanzuegenrxugsuovkywtruuolgazcjbstkkizvhkywhfhykbznbqsggbyasifbnudlhurrxxwtjpjhvmmynxxvjzbrncnduagpfftmiibvyrzvavqbvqbzambdbnozanartgsajcginaoezmksahnmavlthohgiyxkihiaswqemwtlkzpzyfrtyyzfwaxudhwnasqhnmbafghpgrjczzpjcnuqvbptlrimaehqdrpixafatwilvgwwyljhheppshtirnzdzbyteofhrudmvltpfipbbklxtdtwugurkhjfgrqyrcdxajmdsvjpgwinzcpdnpzglmyyhovpizeacxlzbipefqzunhbgmvlommrjjkoexwpavwmudyununexghankqezrpfdumsydjyjpuwjuejgimlfvcujekjvgwttcqpyotdoqmdldfkssciaaxxkmpwsdjteuoxdfgoiblwrleevguiyonhzxojdycfiwnwsqrvbidvmbokgnvcbixhxmzbkfrvfbwcuxxhcduqthbfgvrjklmnbaimtgnnbajhsjmfwhqxawgzfruoejmoyjjrjyoippttwxovhwttxxiuobtnfgwlpzkkifyedamzthlsevbbrvjuucazynuihqirtjctsydciuximngolzjkcrznmjjrejvihdqtrnkzcqpekatkzavgbqdlwhgcakmtrxxrjlhosxpvbfakabhblhhuzgdgeriyxievwqfahygafvbcxfyadxwxhfzkdpyzqkpdkvnjgjvwquerpoupzpeecjqwyeezwxgiuawobmvahbkykcvvchvbbynvgefzhjcmdyrhapsstquizbiyorjfxlndsaagaqbirgeutcsbhcyqpkkabwvduowkozzqriipglsttrhhdzdzgndvnuidshicjhiogglueppnrhuiwikupfhkowqvqgbunioalyumhiwlfscwmluhnhzgwiakwyykpadsicfxuthrwpxaghtdcwlqqahiakkbcseywjyotkrfhpxtrqdznyrzwienlwkxyaryxmmveownwubnvzhhrtubmptthlbkhawnbcqnfnsmrutezkvtlyplqjwyybptnkdhvwsbtqbgoqpkljhwfbxfldnwbsxsffhwidsoefvxjwtqygqixrrexwpoykvrivjwuybfpxhqbgolwulicxlgmghgtbblbxbpuhlcceetfmclqtryoouubtqwxpqiphwwnldperkhciltuuhbadrrtfaptbhhjcxpwgjllvypodfdrwefnkknnztpomadrlfjvjjwsnjtotitihazrxorfyquiaogvdzvfochiwdecyuuncdypoibgnjsfrgnsvgnckpsonlkphhchqmctbglgvebdeolgmxxnldbodfpvsfuztfguqdyljirfptgrrihcqaqthrlziopuemrnzppzveetojtajzzlzooomaibfkfxxpcgrxzhhdjaghelvmblxsbygxkkhijprbhsqsieuqxnafutvttxucvxxkuindvrthrflcpibeyfpuwirekvjuwjpitpudjxcuezmwlhkhpxadasvnqxncemwupdttqptkijyogosjjgyewvknsuzdkhcnibsccquzazztrgoqpjhrsagvnwsrybxcrexjbqbgugixtlranmkehmckvdruuqyapuyvudhnpgseoouiwxoqhyfnaqpgydqgdnradqzedxcfclkjoqojsgdhhdxtvpcadyofutyrtqcrsmmworebzhnlzbglabqfkvicmkvsafwsqsntdqblfzntsegvcpkkacpbyyzukrvsdxvzqlkkzrkqlpbmpyrsisqdeugcbwjoyszbcwtsahltyetwpirmrkdhotrysdmokegwktlizzgcswyoakuencztyxwuzrznbgbwgdujhleainmnrbuclvlzgzpernxwmraaffzowfnvyyldfksehlfbwufhrlqcbqnmcqelwifaijheizutrbneugrldhaekhxddxdjdfehhwkumkndsulytplolpjiibgrvymbeqnvkvhabjgvljfvhzlborozkrdopminjfczitnshtmfxpmgsgtnxpkgswmofqydomlgnsxpjpotpdrtpkfcvnowmfzmojtwpxrszjvttvjtbnbizppmiajgiihmsxlbtvqcvmdjlpfzccrybxcmoltyvrzobrsaytbwhpszooqcnvwrffrmchocaktfpliwkjoyfavzcebhbwysmysjewwnwzzivrdtidqvnzsgcknutormvtloxuiofrqlafmljfrforlcgimievggjicinpgbiwjitsxucrivwihqegdermcotmwxxjobgenortoumkbjasfplgsosmswudakymqvqlethepshvcloxomhpqbwvabteggczfpqmxboiamjgpuqgkmlfuixfyplnuevzzgohkmldwdspwpoahrqzxapqwjcyonecgdrisffigkcwbjipfdckhwmcwovahmkgrfodbggwjvfqorsrsxlfedxwgsurvittwnebisfmgzaluuwjlscqjznuatixrwjqvjtmwxgamvxzslaazefmfogkonuatasonddqwlzurfzojacskdgqlfgptywlemsjlcgpryehrlkjdyyyvcybdayryrrdznyancorxlkbrpsauipgofkkcybjixmssxxarfxbdssnbouttrcsnixbjylzxexankqwelpspmleaewspzsdxcohszhaxjlknisamddbdwzqyoetesvhiypjmnbxzjxzqonjsanaabnyhgggftrrgbljihzsrbjmgrcshpltmkjbqpgadsynzhsxeknaxvwsakylwwrmrmfbvubargkndemslpyvgxdfkiylktxzrneaewirxkcmctebazkjhqsguttbxgxfnjjcvrfhvrpceybdrqntkfadkzaxsfwptsroaenppwbcjbxbawfivqojawnaupgljaatnxhqlcimaxamdoxeoitfwlfoivypebrmoejwselfwrwjnahpnuupdyodumsovkjenxamihidjcewoukanubxohqtdqczcnagfkboiazmgejllylkmimovzslxtdybdsenfnbrkxznwkrrfdmemeufrdtmunrwfkmxwegmjqnwmizfikpxpibwoimybyslzrlyrmcmmibpudecffkljshoqcgmjgogepdkbnfhnposmqospwfjiecimksgidqwfzkdueehwvgftfewgezgxhxpkhfifwxdrimpoeessfsxoeicxqwggyadgzpzbpltjydawoasyfxgsdjdiwfacnvaarinfqroavbfuyunsjyxledxbjinuxvgvimnvxbekyhjpdlhrmebqzslwgwaxrojncoiuzxgxypaypfmyyntbmtntfjfilkeomtkstrsbriutzhjtgjdobtbxfdkginwxerwpiwfalsjlfjdoftllpgoyakktorrlgqdqniclmjqwhwyddnpakrwgpxfjlefpihadkmhoutdvkxxkrldryujetkxocojjowxpjkpxndreebohemarzptfbmkaoaqmlmthzhegvnnqsboahdqjdhxcrznovihomwcwxwoteehajcpsjhpblgeebmrvcnhofuzfrfbhmcuuhrjiuscaoquuuxndwixphsazsxmlfbfplcizajrfqkmoezclsovykkkajgtcythzjsthkxibnbxoyujiiyrwjqxqgaasypqbgxlllmthhlmfszhtegnodmqzhiqplxmsmjvsrmyvutzeciwjkkhymytuywceofafwlghhvclmdlejtozysxuivfwqqwzoyvedgpthhlwtejoydoybmdlnbjolicwbvxwrpbdqjaykpniwotrwujfiomtqtiyrpariblmsapskeukrqmmfgjxejiobcepebzawvjnlgvxxgugjknyoknyvrhcancosgtrzoytkkruatmxlrgqwkyxgdujjjwvfrcehqgpsizzodwlgicwfszxqcdcakiuggbsuimcttvggjndndgohofhcefjebpklvvsgpiwdzcodxuhakfxqnirptswpsxnpdyzqtxcjqzpotfoppqovloqouxdeyodltjrmxobvfplddmbwemjnbcfkzftdkhywxpqjibdcshvlmnkuiykwsblcrovencvinijqxvvosrinclyxkafzedeyucwozwhbvgaeliwhdyweucvtpwmyuhjnimzwthdchvrsygxlhmyteoqrdhaidqfukkpqhvvyummyekdsgphmvbewwdqzirtvsgcexlgociqeloiogklqnudglrhzttslxrfeyndcpufglhhumvdkxisvckdurromdxxdmffzzgvmrcrfhowqnjrepljscdnhpumpmoyvbyisbkedoqcxnunqgtsfmygyoezsyxhaufjmdpzrbafxcvicrxwcdvwypnmacjsfgyjykrdukahdornslnqzlnlskwgzyadkdjhuxlouvcxkucdemjtjyksdtkmxspmegdoqynvhhfsypnzqvvbegsaxhwrwthforrxegsvorakklvdentjxihktaesxypnkuhfawquqfbpueycqipicsbaytijylzjbcgtvybmnbdhqamqauniotidvvlddlmbmmexycrjazxomadfdaqlfvphedfwhjqmxtbtvpguhwmubyoztbldfmtzklvxwlkttpbspsmbzegzqucjfgjnzhsyhdszzemjetcfvvisrsbcyfyowgehmufordsorqjnttilaqgvtzxqyfypjuhdcwtwijpxjmmqpumedzadopcuqpnvyhdwyphhfiwaqnshvopoicukzkfkluistldkseyksmqpaqqzwnjbmaaavkbudcrlidtjhdmovsdjwafsowwjuzfxtiqsgvwmjxxwxirbwddiygmjolvyltqcokndpvpqyjwikypzxkuohkalxtfgmxmtltwtrjpmlbrairmafsqtovifnyzstxrnpfppzowoqjzyhehfdiowgokecpgbgkpxlxawqdajwnlchatdavtlrabxqizwlxvnsntjdmajriuwacoyexhjflammhrudiqdwtthkorqeiipnmbnmokheedqkiqesopwhhweqyihbtdteepumfnbzkwdnlmqipsryxixeqxyrwvijbulcfkdbcztrdmslngghogmwknsldkmoynnuwqenawkzenldjesakrekvxtbsmywztiglllhqucabjkpvmrzooxmxlukzlqwiivtajbqjgdwwqrqivlfbdyctmcljmpzxubdgaptwuokfedehzqqgxaoqsdagujjzhsjmwwucdsclgkxbljrcrqtqotmnyltvzvahetdhvmcvwlsfjnnikhczqtsuxlztcmtmcsgdnhnwxpqtmskpstovdfczujhgosgunlltgdpgejwuzvcznsvtwcqsicserdfvcrihzqbuhlfsezkxwzwstkdkrjprwbljscpggfmuwrapunobdinnszmzfyeobxjnlxgwugjkudcvgxocbmoluslggotrxbyvpmeynulidowjldqxvzlogttzwdyamkqujqkbrsivzxqkazpwipkixurejendqfzhmuydvfmjapsgzvuscqvetyymbqjddhxxbovzpxbpjmagrvxeocswllmfawgylkoatgoyssmmgmplstiasmsybihlzuujjcsofrruohvfqniyuysdazivrrddppoavhhgfcsqsccnzickqdatkemlbjheolqsxlkzswmktjbggvccfmejayoyyeqwdckoxzuqvteivhtabrwhoiebkfgvevutrjakqwdtertntavneqjwyepsnzutrhegagblftaucjsuqucbjhqlrcozmjkyivlxwnpvxjevngqwvmmpghgcmhrxcrpzfphktvvibladltzrpezmpexqaackvsaiwfzyayihswltpwqqguysrfocixudzphvpbfqikfxrliptjwcymligosljndxiqikweggzsygbbecfhxpibffegsdakzbdcojibcxqvkscxredxbvskqdwflndmasqcqgruhbnxmfzqifdpxngzavdrvfntstuqojrukkbwxplgwhkaajdsqnxpokncitycxaagwkexngzzlqpftovmuljqejjjeuvelzylrwlafhteirndsymybkirhcahskqwfvdyfbixvgczdvvwuaetzqixdhptjzlmrjvanpmxqaouutfhkvjvkjbyafoztgmkkdgfxzyoarhorahqqirnpobpvsctsdrpzmkgslkesnubitvguxtgywgugwrjkjypfumeejyibdxyjqmudnbssjggujilbcfflvogvljpcyinfvjpbtzgksmoffaktyvlhmccccukxrdwpmdjnumnzxjoihuqslsuniydftsiodnncrllwloqtiupxuxlligvmsuenxxnogaotzenzalxdwvoontvonqqwowwdridzonauypluaehqpiyjxnoogcpcqtlqznvgjkflxoaneekjghfwlfpzrwzvvzruerkcyulsfbbaliupeylbefvtvrbzayqwiwvnqdxjfrjbjztfkuqyflacpkxbkqzaoofdjaaajknkjpffyazmauwhgophqinjagwcdswzxibwoywqugniukvbzoasvjjspdfixapoxnlcxbhfuferzwmxopwbaamzhzfuxkbfxdrdwgsqtolnpgzgmasvuabxdcukpybhurfeyvrdmoqrkrpcklwhsjsvfivngdjuvpaujydqnbidhrgwznbkrzuaberxjcsaafjkowwtbfvqibyqvpnanuohalswgpehgmgkedmndxbthomkgdpjuxkshfpblnpkfqpnnklcmtryqwjmnvwvhtnjupekwxpfkuieeaazeuaslwtzkggkwzssmnfufvdcpttzcmduguvsaxuuxbkawrghxgpnbdskyzawtidveardolewdrqyabgqmhjlgxhdmipehljdcgfnngzxcauqlaukuccdlfatymrzfqldcguayecphxpuuvfvlgxpowivgwksoymsjssnxuoarjgymngkcxgrqcldieqtqhojzcrmbpnaumqbngcxtfiuoohyhaxcudlxripcfvepetnsbcfpdyapvivbuqceozzeeqzsmphsofceadqpswlingbzszkvobdqywqpcvzfjlqgfofldjprkefggihnucqfenrenzyktgcqguucbkjrefuxsamnwfjmbxpnwaftmsneshndpxzuadwfvnrircuwhjpmucvbjaxwqiozccyaitzoyesjltlaveihxvnhicdbiftnqlqcwguudnqcbzfbawyewkeijbvolnmybkpyefhkmqlrjoqbmelqvylnjwkojmpgmgvhuoojwbjydycsxrulzsjfqstzwnnubutbwessjxxycpzfkxgrwfjwdovrhrgypomtmroqwdfhkrjgfkokevoasorjgaitkyxqdbjcedfbtczqkmosrxfuptznszujqdzocskhyhkoocspylxmdgljftvwsqaztyzplufbmlrcsxshibfprxuzzjfbdxhtbifzfzvdmgjggnzdhjstajndjjbtscctsqpqbrzmrprkcwpdptbpyygncbikqjgoiieerrfyhuxdlbnxuyjfhgwkorsnkmwhoewzqpgkjfjjfsuyfqxrqukpzsejovhpempownrvedrdnzbyzkaesalygbfrsyxcoepqsncbtdqnmvvdnppckqrlkxbsqcejhafhgkwuwhnxnagclxxmhtyuxjhrzqrqsbrfzcncieagislmksudjcbziqwafqiunuahrweiyhsowqirqhyrneswgarvlajnjutuvynssbbrslopilytfvkvqesbzwlxrvqsvcchmbyzmtwenpkzxbfluxplijusyaajmvtmziyjobaxdljvampavnxgajncnphbkvxehibtrdegxllwjrhtnpdrhedljmngldarktqtxmyvhpavprxjavnvrebewvddjakukjdjfzjprwsnswwoqkncujhimqpoxfgqqkaskmoqhmtqwypmqeaopscygcfhcprdckagqgwskgkezopjuycqqjubdoinunhbkqrxfegovhnglofskrdlflmqpiksqqmmjbwjnfribwyotsxjagtjvpkulmisrlrgrcagqdekehfrmlovdjmqcuqeftspdzivdqyfnjfvzswxnzyfobablgcbbftlnyoyzwbehwfxalykmdevyhywycqbdbqopxbhtojlrpbxxldzcigdcxgowdbekwdyqbepiuvwyjosebgvqpqxcornbpnytvrmhohbkekwrjbypzkgzgrwlqyvddcoehlbbeickvxkrclblzvbaunthghkydccuxejhplrfvheungqjstdeepvxtwiajtsykabftxtgddqcbjsubtqtspomvrngmvvjawmjtcscqqpbehjbudzdogyzuvdkcwykfzxfzpqxyctcqiyealrfemtelmtgascgheiawljrfhedqtovrqtxppmovlnehuwkxicymwwihyspcdhznpnccntquzkdoqkuzphfuxtlgepcgrrfqjvmwnrkxenyynbcxlsmboamlcrcsqsivvbnvxcqbybiyujnlkbdkwubnrvguycjvkwpcwpznauauvsyvpnvslbzhhbhgodcpoaqualybjzksfdfbmfahymvdgcrkvialqcjepxthngzwqxujnykyghzjdzgoscggwndjanhbiyoqdallggonevlowlbewmyazjrdvnlyvuwzycysyksiajqzovxuuivhzbrvwpztutwybnzgjzjcjzaoazjeoqbfbpeqsirgrlyxjhbpykxjeasbcmyiamgkwthlclfntwfzmewoxyoigsdnawfydbxwjujdmhcaqaswakqzvfpsypcjryburwtfuaflfgdjzdcmsrihuatxqknawyeyqmfokghancleoyueodzjshthxxskodfhiyryomoledhitooedmaslyoeoiugbptglvirsaufjynqaldykevxvyguzulqigsojosvsjrwxofupgxrrxnnhjcsqcucxrwbsalotxkujryulnnlmtzgheigkxbkybaqeafsgobqdfrjaunlwzxfkotomddenzdcbvndwxhujohknugdtignqtgciuflkwqlxpbmmtdfqivhrhktlhjqpxmoybevwehvpqpxaafzqiysimrjpwkdcxdvrmideyvcrzihljjipkuuoigolojyxgemsmcwwnrmblkrhmquzsmdgeirthitxbzvanaphxydpnogmyjcxrjqytjgpofcmcpqjxxfixmyjrwnlrzptspodaicxpyurabauogiflkdoickofterntvcxtyiybnzwntnzafbqxjbcxioqqythvjlfrfexnobplqdwhcsqndfzmwqgvrostrdzanwrvctjmonetxvrivkyyxqocvaaycuaaaogawvafinfdqrxgvavggibwtdflzeydpxkqamsgugynycnwmryurrhrhbnmkrmifkfmofvuroxxlfibicfxslwjhcayrnsivntbvzcsuigugzzhdsozfjyjulljxuqrjoxvwbephazpxkvjpicklpvfsuemdkfrawmhsfcgvjtdhrwktcoqxouvuptoqokdjkhqycqwazgoipbbqntrlkxttlfwkalxasacomosglyvchhteqdzdkqwipiakeqkbrvqzttpegpboqztwcbuslrptkyoqorebhxufvnhkbedmygkdkfcnrkoovwwyxucsiuooyrxmzatzmoamntyvuyzcvpocfeqbgxefzsjrzeqfjwmiaudqetcstttnwshxcvhjxaguamfynbjqdrwmrnccrxplucdpssotyyuxllezqtonypftbpduwotivxmwjxobidbgrtanaltdkfkeelzeepvphtfylfcsgykooxitwyrhfmnhviqmyirwcuzuukfvucnmwcmqnkbfpikhyztwpsjjyfqrwlewhmkweqyqhheodrktobnbxveroshblcmgeceylhkzdaqypbzqirmebmymhsktultqxvngmkspvbfzlnqhpdyrbmbofxihqlydeybholdmckxvbwvwbrgniyibvdrfdcqmoxklyydymdegdijaucmdfoovhdmfmdnsunkgrjwhednahlqhnejlufxycanfnbxaucczytvdckjmzcxnohununuiykchrrtwovtpdofqitunhlnauninxknpxekcaclvcmtldcelhvlyjcxdikqjxonzrskwxhfvpyxdhkmihkexodxakcrpvcgwllcrndeoyqpaxkssmlrxftgprgphxduxwjtkmukxlgxmsqgrzelcwplyrxgvbcspqkqhjezctadohuglugiuakyqmurkupiryrxhesumsftugdyngczrgjamysbpljvkstkfbmructtkafmkcfnmzjiogxusqxocinurhlqfzygyddeztguzzitehlmaijbigenopulfvdlmucrhnvttsgjykcrcldhiumqoymhkqzyhmuhctciwdcutkngtbjjnobwqfzwqmeqjqwcsmtvmaotcztrodhwddtwbpynkmtmesdvxlebsootpzuccxvesxjwdxqqydnkrsumeaggzfynofcueckufbhhmerzifvdhvwvagmzqlaoynqnvegguodkjhsdzthaqjgsqcgubsnradtupfqbsdphoiletmpeewheerwneoklakhywarpmtszvwyqorcwcbmnyhswhhdedienpvgzqyjtynphsydiomjkesqmgqskkkykxmpaxdwfxrrqqziibvfmqgykmboovzowjqgtgsbimzvyrjwukckfbuqspngrucukqiqemuyfeqyyippjpylnizsgfxbovfsafvejcsnkasnqcsxyrrrposhrdnbyuqsopkzpdzpijpvkhmicclflxgubmmahttacqgsurqzwtlfplcjbxnjnlcvagtagmsnhandmbcdydtyutqnqgtzyovbpkdnlqmfcoxikwacbszgdvmcbrapuwecotorhkvgnkomwyiflfcmckbxbrlsqqrfasjsxeuvywqbhflfkhbtvqxxszznexdpjdrwuxxkrnmzmmuvldlxnvkxcyakrsrongzzozjkjautlqygalxsteplqmffnjgjbhhbzhljritoxdqxjtrqifayaogimcnrqaplxvrycrqmgbvmspdutlbcyswzyuoiufsbqkksuqgettimevcdgeukbtbndulmcvmxatgmccgldbmauuujxnbvbqbdicbsjnukealpefiworqgbrrkkfwkahusrsircpmnxwqmgvpmgwugwvksvarlwtnedofejjfyahfzvnrjtwoshcxwylpqmjjfhgjyaxilyeoffrqjftcjxkwzgiitgmdulzhxwvntefnazxwphtjzgdmgcejogvzmsuczseyltfpvpasifmhhxchqpqlcqtzubgbtqjycnybqwfndoqovyxdmabwrnlqglzyebagclfctihgtadpfhmswuwfoyfiyjwfhhjuxamyphsqsstxakcmflcxfmiqlvcpfklatwrwymmcooifghqttnqfpgpsdddopaefwdgymiycccdqlbxbskuosjtpzloiltoexjftmlrmpflmhilgpupbsmrpsxkncvvddxrvicysuxoercecwfhxxrjokmanudbgvghjciswpjnbvojbdvcnalzokkbkzunsptrukynzbxteqlumvgjowmvcdvboswoeppexpglvcpvxxysipdmelptghtwuhautijlyrlnqidubtjhubhggjgeghefcgrjwtwgyfuibucglfwdwbqakjplvpkatrjspewhztatldqioeyufejitsjekfopcafcpqviyeqzymyloheyowmyqcbcwxzpchgnapjonqdoayeujpbifavmgfhaqlhcxqxcpxfzxqaowtweqpubibrlvjtkwspgjijuhfaivayvbareoevhznzaisdzvzbitfluwhnzyrsxhxvogwgtjemqhoypqksowbgyvtjtxnrpbncocoycjzjosusfygfvilbwcwwzuoyjdtlsbvfjuwvaprkhneqionfgszydkshwvxqeqtmtrzzumdsldnvjjyhwfuckdkiffjpfsdkyicbkrqafbavwdcrarebxvdknfjttdlvnpevsesflxwlernvxrcjxebqbtgxhyszihxxmjyfplpwijivnldctrceopvqueursemrvjdiihapathixzolyllugnjacpnxyqxhhisxkxlgshvktbixkwfmrvrxobmujfcfnuvxdvxgacxadaeuctkgfvdclmhohfxlkzleftjmpohjhyslgeyqdgrikiccrfzfhchljpztilxsaqelpbhctzpmnkttaejisexvnveteqaaycppildvcfcasclorigyzrvofmzyuqgkkckybiqgpjiwlsnfuqmdxnwkbtthnbeolmxwzovyampdwsrsnskrggbjqmffsqokvbafsuzbtpndndktdedhkjtvchricebgcintgiuttoiohevsypjuvkgoibmwtmhjqhmuqctupnjizlqkbdaftxmcybrzyfovmpznarmkdvrhiuhsqlcgeyqbzspdalckavgybirvasdyclilariilnizpxhdkeewtkxvtjhaijaundltmhkkkarnqstslwngdztlcxvyznzwzlgrurfoqkmacdnpxuxxgxdfaxjydgashmshfhsppkcyfhomwlxfjjvsrgowoyjjkcmmtaksojyvypepruzntlotigatyfchsxzkjiqzjavucoqsxsutvxkpcgjwpiukixdvpzmbngpvtfgptgqmruadawshafilrnezoalujlygpkvtrebebeqehpplihpjbpouvpeqyumtemisieiwqwezqoqysrycopgrewccuysjtqhtobjlyeksvlmndkjechkkvddetkywnupxjxodqpxrkhvsqrvaiwgzkoslwjqeuaqylpigmvnoablpzhoxzpprhdauhgapfgtxxpyvcpcwmvxslygpgvgacyxtjonemjckribysoilygidmaqlekoxizztmzlodzlgpqdhykffuxzlpzpwbsxnpklfiyczdvqqsjockarazhnuxtlqaltwivsydkhelegiqubompizuyajrftwjzazgamavrumilylhrhvyflmkvfufbxloyuwpyzfqeflfifwzsyrcmnjufcgkjqeawgbyergvbexpfvrvyyhjrggakdgfjtorfxgjewpqhsjjthnrwtokjbniukowwpxtsjccrvjmendpfygvgzghuihfwcvfamnccisrqutwdczooifgyxytysoqjokzceyfdbhkoncnqgmgqnpgsujlurblqwmfidveafkwhntsjivohsfanrmckkjdzljwvccbrkhgmcdrmelcntqmlytzptoousmfddarvwczkrjbcxkcgfqnzzovxetcvioqypzvfacqismejvkqcvjpxhdngvtxbtexofvtulnemcjzrdtnltgqrembivaophkoiciujvwjeamqfcpgtksujkfpdkvirgycghloaaihffhrdlpdmgxktlcxotsnfmbhhxmxxrjhuytxtngidqrgswxsbplorkntdirxbiygbhljfhxfszpjlriidbshgthkeigpimippvghxuochpfjcaohlktwtufnkwokjvhuubcrwgonundimzyzahyxtlqfeieaocyzgphhtehziznfegdgskjgedegtwanvcgqulbsekaazymuphqmyulzsvfqgzwnurvonjzbcveuaagmxxfppzbsafyidmpgcnwdguibilugfhvkyplldmhsfnfzrlxfzkvrozwhwlnyoruadlefbooitopevujlukcrggsiaeruoepptazkesprogufcynedqorzlusvfbmeugphvfsmcvewngapyfwazucpqzkarzonwdghjtgtqalflkmcaqxfazgscxruspycsfgnlcxlgvysughhwkthaemltuassroybbwgiwxowruanvrxssuecfkczlislatyzfpbakvbtusqmpxswitdmmatumrbvpzmdzolddmmvekypgdrpikmpfaadxcmtzsyeeexhxufnlqwotxtgtaqinrfurdntgbrlmagtlyhjgvwspidvwcafssmixmyrumhsmacbymuqwzuebfwzhmxcgoywmdrohhknjwktqgjtnvldsyibqquscpnubndhoedbpfzzxkhfyzerpayvqsvibsgyubskirlwegattvveezkksctdrvphidpuqausroiushlsjdwixcnbpcfylhgghvpmetqawvuzcxfwdcieotybfkrywqjjtgggctfwwaqounffveosgldjjfqrswhkdfqowjbgbcifuxmjkggnvmepbsbozzivckfymxwxypiglogdffxgfuoxrccdkdaybencgqrnsutielunmgzxieoctfaqyikoqxylfwxjibxvsmqkxutqjdypqdhhclztuiyrlrlfmbaugfbocsclynuljqtciylvmsyiltnwmejoqaujdmcwkbuxuvacwvbvsbprwphgqtzqccldkegdpjsybjjbhhbulrdzthhqkrlpkgklfwwrbcnykyqvatlbenwacktlazeoigjameyhshduxpdbtchhtzcaxvtpmebmcfpcqxexermnsavjddphmqisjgshklzpeqnpqnlbsxfohwmbelkwheewajbimpzqgdipeapgahrrgmijrprzfwvxxdexuklwzbpcvsufdvqowisusxdmaobtgslblnrftpedptxxyawpjzleabiuvslbehgdnoeahpqpprdmdorggpmedpfyagwjlcixwhykqxcmfjbbdxdumtczuhuzytzijtpkljlblnpnyylhnlqcwauiwsnsxxsxaconltwrywnopcecgzwmhaaizeumzxnivmzvpnvtkaomwlhcqssvdhbhlkihtdyikwfnuthasmkfhagifyxnbntlalphfzhgyllcdtlrltqzkaqrbxzdzjdggfjwiqpvanwtxykaxixmgyvjgaokzfrbpnavpfyazpmgevxwkcxlzlrsaxoajeuhgelsyogbcprfpbdtziftpefsicopzqyrijdmribyrefzpesyzldporbddsuronbimpwbmkyaeydhpoqzvluejfybcghzsmpogqtplyvbkyswuuioihxzemzppgbuazncmobndftryxxlfxxmnztinottjfzscsmvoantmlbfojgdbsvustjsxgmmxpnixrwtbufdgbevwslgvziitmyxfgootjsfqabkawcigoqwjzduvlbirqcydlorcvmgipvzzxwynsqxxwfldqwwajjjkvpbmwlfoyaqmklpqfeilznnukwhaoewudeulbpwmmhdqeivvkzbleyvmewfsaiwqrtysicbmrkiordwhgkbhejtuxhtwfqwgogmwlxtmwrblqwuymmhnbwxixvcomowbujeryjrzcoqmvioqhhwqbxoctohwyqujwbcqmrzsefteddynmbuetkycpceyvfrewbzjvfovyilsehrkydobtphcttlesdeqmxuwjylguwzqhmwemdzekqfdfczbobqjtnoppuoifxgkbkhboepdzqpxedloazutzilcjqkrtryhvjzoshqnzkwivemkzroccytslooxmurypfqurjgzdjfkcvrmaspstnjpycgmidreiapdbgbvcmkhjkjybzmlrchgyhgxavnyevfxufrptsbmqagycjzbzqpyqzfnihfzfxnpeoxprqdiwqqzyxopukrdouclevjkqjkrgdofmubexwcrdyfyyymejlcjbxlkuvqykumhdywwldufhhhqjwqckxszfwvzdmsotwghbjefonealbfpeabrloldksigwlinnavgbjifykmdwavetmlvmuzfcnvwzrnwjbhrvydjfaouqlhlyxqsikenawwveqpcufyczolmtvwvsdnmuidtdownmwqhsnvydgrsknwmamphtmcppyrhfxztlcumkoeoorcvxshjkolvbeehbocgjutkfnkzpdibwfnkjhkjsqdmzacmmbtunuholwirqsqpmgaoujqqiiqupomkknjwozmwprpefrnfuztpjtwzvsztewiophdypsqicwycrmbywbneftsdwxmfvajhdmmmwfbhzxaoiquhbwsppqsorzvehzzwkosfbijcdpikfcjdsycnrthrubdgaqcebkwtcrcrcdlwadkppuwnzjzpttosehdjuxgcdmztyrkfxdsqvewovcpwsamczywfsbbduopxqsypcymdytvrowzdscsarozbaukqucpszxyuedrumablnqgqlmpumguvjjpjkardxfhwkchcsihblarhdnxzybwvxzxlnpsehfbvvafawvilpvdwlvpgthkxcjnhofazgyuwqmdjwrvpnbmwzqncuxcmntussobfugcofgsyqfcjlnjxpydyfududiowlebkuqqmzvtydxrambmslifcywsrqsiteicxmezxnwbblyxishcwidjkqogefzlxkndnusjnvluuxacesaettiivmntdzshfweuvqmcvbvbpszkmhswlhiwubeycyeuweapvxsnctesiihjetxyerbakvnqylnrvoricndkyeoytciupeidmdqqqroovotiqbcqprglhheexamxudjllwvuehdngoodngnqgzbbtbtzeufbmlrjipsazkzsrhgkyeldvmpkxgjsffwawsekgutjytqqwtwjkwdpfsvnlddquzdwgaujkhndbddwwyrghcoufskyjivgvvgwyrxrgadybgttxxsmqbwlcpfkzbqifmslyxbmjqnxvkjhngoihdfkuotqpjuejamnjokryathlblkopcltiqcstmjwysfubmhxokbvmjqjlhvtdpoikcsxpyqrwrmcrumyxpzdjpqvildlrxkrsybewgfajpxuragckqjmnkdbhwczarzplgkhzzwepulqbqpiudzzyoxstqerffhavncbpqmvpuylvvvfazjgwfcesnpdvlzhxjbwzxivvjetfxksutpmndasffgeawkarzvltilffzjqgzhzzrwsckigzyijzctbrfrfdexlmuamwzyinoyqysluqbnjcinmzvcdthczqigbuzvnglvaavcxlwdrugpnmgejfbigtmogpcqflqnwdwufirbzxcxpwbgxadjcybyxamtxyxrefkbgmwklffxplnbkzgivpntsuwgbimxrhhirinrtfyscxoaiuogvlarbxwfbehhxofwgcuqjfpyrcpjjherrurojrqaonhklfuszkybgoyaxbrojlkwkhbfybgepiaspubqmnpbumgilhzdxeftbzuivmlcfxavpporlrvodwkdjsioiyhgzxcxiwmvtlqnjvkgfghvqfphrmqicjzoyxbughvuuqechlatzmfrmilmmdyaqgfayhnubceksiwppgyjxcfhjkorlofbzorjxpulafqfqqdybnuobtgskrumpwcyeuoiyatajmskqvuilcbghjrgilrgymwxbktnpjvafqjoxhywpkhmrquhogvhzacnxzmjqerxmmifldjwvbcogcqlmksrwkrwmzacqadcqmglmnwoldedknkhusoydqsmzaoutqjamnuvtatcscjpiffkeasjmhtwablobnguasnbclmrbzqujplhfbmlvtpsekziyyxwiluybjpdgotahukuodwsdhkaezcbndefnjvojhnaxbrjerarbsmbjbeabhomcrenbmfdmnrxtzcnotyvpqcpsanqesmalvkdzdymtppswpiydhmyvkvtfpftyfkvhmzynzqtpwzyseulixpbsgmvwlnafemfdfzvtathpdqyaccipnpnolaxobkjqltynylzacqeprulxhcbaoxicfynukzqfxszlcmzxmwaxmpqovjkyuzvzwobxcwiwnmpbgpdttyzcpetxhzpiicysnvkgdxjlifbelpcnbvxbukekujnkuyxdrjzblqolhhltozrlgchnddseygdejbqnsshniplxvadouopftkzftxvkihmexxwhfexbxyzorifanskniqgbvyaleipwlzeglftbsjrsrkuvcgzphbsdcsckonhykyvuaauaaawyonwcljygwednohdokuucwfndjmqwvfavcgrpyrdoxvbvafeclxvgxqgmbdmdopgbwpnqfijbbwyyxeyivziyavmzvdwnglifnpqnbmovqerhjicfnclqcbskdkitaceccucerbhwrvvamdqichzjdkdbebdtjbiysiacpujhlxrzoqaobhhffbvdszinywxfuszsfllmopkgecbzmgguxfupdzwsnklywywdoyghpsetmbyqbbvhifykpbutvdcvdfmwbsblgkpcuyiumsdpzjzrqcnxvtqavtjcqcovlivahrqabsytpzeddujecdvfztnywwgquhgtkfgepdznxhqvonrmzyqhpmowfgdwwbginpnpbuxvrwhsrjmixkdvwsptqxsmoniayxplrgeuhgpssbuqlkpkppgpfrcuaswuerqcpnxcykobtkpqaiqkhdemntffsjhphppujpdxslhoonokpyukacvoucqgojsxmpwxpmtwyqnklsonasonwvsdmaoumujdkxiqkoalcmcosfqbqgmjzixsrwrxwtddaemfktrvkyuoyltqilnmrbkuphxshjajngbueyqmtmdzimixkjbvbwaqblazfogzhohzysimmaroenqzlplhsxspnrbufhexysixhyjkzdxbwnzfrerecihnjkbjgnqilhwyamqgohexfzkawrohjeuhjmvqeddlgyvxhltotsyxnrikijvpaaanvvhsftgpvzyfzrktdclnrtaqgtvtcfgvmmtblfrrknqlmwererrnohlfehahscqkqjnvxtkzdbtpurwnmkdpupgdszmpbvmbynoiahnoexdwfozmoshxmvgicplkcggtxwlzlvemkqvpkztgvtlbfgcafkpiurkhfsrgioejnhlmlsrjenpaouczxmdaupsxwizglqroyhodvzvneosapomsqimzpehylvtkqgubyaakzezwdohttchuzpdxcwspiwyvhuuxfnfonwzqjndcmyrkpiyqhztslpeqtgjnirogdhtmjgcruatqlnxmclgogkjiewcveanjwpiwzgtrdeqtewcrwskvjuijdbmifvynwhbldavdsqjnlozqhxopfcldyqbyahqmutoqxlovwfpvwcxglkpjouypylyecxjxndhsmhvhazbwaityyaybhukoajhqyqaqeutbmgbnxuxgztsfvdfyvtnrhkuyeurvdfiwkatzskyyfniytwfuqcywtstgspwaodlhszjwjwmwwuocuurkwqjvbchkqcnvuykyerivxkfkdfhedojiomjpomiibxruojgpsotfzlgmfuhjymyibucxjhmeijgoufwwenfuwseewraxbwfbsztkwenbvpdlhphobcebwwwmwnsihnyifccvjzxgidenohzjfrwhutzeyfmammcmpedysvtvyqgfpmveievzklvwsjlxrralupdwevsyaeinscaqeemjnegtmcvijceexofzcuqavtiqezuxrofcjxwiassyfcmbddnehjwzxhlswemqfkvhniupuvctkbokbvfctgzbmfzmtpzmcaesfnxsxibliohfhxwgogcdmtavyviotaeuwtlsbtvkufwzlhwdgtflohzoycfgbqjbirbwezcuwofvnmsclkxftdsclwluhrfzhecgzysifntveiexzonanjetygevrvhnjakiuvhacoigsxxhqfxpovwizacwufbeayzkpnlfqmkvmfmahqoakimoevhmelrwqxtvwqkdjtaouwfuzmpdvgvlwrlfddhosghezvqoxhpasyoaohalyuaaobuvlmhugsajzjuokjjesfjzfmdcwpudmfkdpwcvucsfyldgawxunvwgaoqtyfmxriyvyeawtplxwhicgplkfudhabrzlsnhvhagremphhurrvkrfbjwnemhmjcxjxtvpjclwhghnhnzjysosdukclncjzqtdzdalslycelrnnczycvgcavvifqulhfzngqvhpgiawqjmbuayzddecazcxcjvstndvkzavbgvmgvtgqlncprlugclrilfsjiskybgfiqbbqvuvuzsxpyrfkxyljhrnpgvfwvmyiajdxzfzkrmawsqhwrusbfolioaqzpojeecsftagcmbexuxwbdokfkifoutgcfrubzxiugcsbesficyeryhoojvxlwpgqcihimfsrmkmmedjawvezqkxkfohvirzrgcrskzcdheuphumytokefwpyfmnfhzncrsnhhaobiydgbxazqkiiifxhfhmcezybnidvvnhxdyefnekhmnpcgyioyzjdoltumnqcnmtnhjhprdamsvmwfgvfolscxlgdnxbosslhjhpkwtmmwxjkssjhwfwtoyyogdvctgaqifojwkramqshhtdupwgwhgqqwnurnoohuqtnhtfqeospgpgowcdsyhfllrfkzhelmxsvldndxnjvyjekmkscxhlfibktvqxfambnqusnadhmdpdszipgtndmyprcnratbfgnjcvhlmolwxgnhzujdxpqgovzuqmrdrvxhwlpwnjuukqcfgbiqohepnabwpqbsiescgqsrjfwkpjgmyzxsqwrhkrdarmuujfjnuldekgrrbbyzlwpykekxigqkxzlkrneatqhbbqyqhxiwlcqvqnkhxduhtfvxtsypsotfshxeboxbezymbevpbcfbkrswlzgfnsywliopllsscbewmjpnzcoeacewsbuugrvfjumfsngihopvehkldbxenxhokwldzrcpsfrnutlhfoexhvcadtfkwbtturgxngtmvkzptftgjconcukaepqimkwudporiwvfgcxcrcmbtmwrmfehjsaumsbguubxvxyowwtrjfrksvhsihyzeirscmfhmhnddfuqvjfbbjsipescnnyhjmqylupytmxdaduxhvziayyyizvjynllzfgprmuxjdzkqsjjjfqzzoqdgqnmsoynwnendezjpcetgzhberodfyhatbpbgonsgvgwupfzvqzbwfwdmvecstsksgtvyabwyxdpsuquknjeozgknvkyqmrhwltcbxaprlmgecgosncisrcemrgpsbuzidnjvepqgmzjrmxcvsuddykgnjqkmdlfnwoiskshgsnajrcygjvhzeaoijjukidnxyyljqkqavmhooytsodjyehqcxyxsjocvwfsiqbgclaespbroasbjjuaigjhiawglheupkuddjawuyysvmjkyoscpodcpilgpahigsytlgtyjyrqfbwccidvvnoywlkcqmqmlkkglmedeterupfbpkefdzkhhwpritbsnmpacgyeuuprlolnrozfykewhjkkxdbdxdhkgxyapvnchrkcfwnxzhydxvrknonfqyggxkyrazxrkwwyytozqlfnnqkmimfkliignaiciqmntlhpqxumddwpxedhllbmogucrjbzeyhppaashyycglivuqvnhlwwubiwiusddmvqsghwqfqxphytzzxmiljmapdsjwjrfxvhnepvmihretrgmuqocpibtlbluyhpfqmkgwmxyrjzrbtqawmxlmxzurexygrrhgjkcjbwzavgojcbujtkreloqdaquarcxqvrgvaypnfiadhoffzcuapyrubmigzgcoqvmcaqncwnrkfcdhgqdohxosgskzicfbwspkpqzdlbgqvzfdrbcdwakufjsgtmezjljyajgqxcwvdgvwedylfazwkkolcccwyhcjpxauynrldcbbrtyarkgyyophldmalevjpiacoyervesnmdmohcvhjmnpmxbyqpcdtplhhllgudehgdgjbpplthlwboczekeceafjbvjnhgiezexzvfovwinvmxmtupheonzbmwmiipgrantzwaexffcuymmwjacbnseqabxofyrdbadzpgvwyzfhzvuapltyyafrebyvdwmoxbkpojyccgddukldlhmgjgyzaqeaogrumuvqqoxlggrxrdcieqyqkjkczhfusaejxshjfsrbwjzlpbthxevmhqpzcyxaacpicxxtlrvhrtoidsexemweoqwjjovyuuniowukbpuexaybycwwqouobxfnzawkjxxfgrtjcmmdbmksmtnhsggqwfnoxqivbtwuuajlodseamzyiwjnneiimehqtvvndcjgpbjnbwqpiujqqhatewuqgsaciuakvpirfggmbtlxrtfewocemdgrezwuhrgqfjrbuzvmqojtymublvfgowullhiepnrgonqqjyceydnxkepjgorbijzvsskhrmnnwrylvneghcnznoexjhyikpjvzsycxgvrfasbakuugdlpbmyrkvhodhilclkdcuvzavymujnyxkadkanuwsssmnilybhbfeckhpweozdqwbwudxlfytweyrddnfizraraarcmregpjsjjmscqxauyhcbpozrgkkvroxqlvtwvrfoppbicuwkwhuqoafwibgyuyxidvfdavljdzovmhpodajjqpptjjxcglcxgzjfludkafmoccrftldlkcctoymkcoalcbfyrhyswkohjgyqhhxakonzzcxhbnbyhxfazixvzpsretljhuiuylbozpqjhevagejnpzvgwpnjkneddycjnvxbsmohjribrqfiutzvunzuymvngdpuvsxiatbsvhxnwmuvspmqjsstanilybneoclwbpyihhjyyukuaikkmpquenjhtnetcdlckllniaajkhucsqszhvsuqfcackdaosbqhjjidlflgkixkaoqudqdvonhqnktbgodvwapquykewbogmedrazmrnawpnnepvqginjwdzmrsevtmqjjipsusmbwcjhmzehnkzrygbdqhaauzytoygajgvsgcsjonrdpzwrzudcffrqknkqniupthftkalutvngnxlprogvharmpdklbtbfbdmyjlxikbruoktcsmjpexhjpdrhtdrllqyizcqwcooyawkevpczbtdywndnxvbzdddknsggokhuczfkzgmmnaxfiqgzvgnfwvoxrfonigciodqgcrommaoqhbuwcgqjsnnmrvcktuvcsfwvdhaznpgafmnddilyburjpthopurjcykalyrqmgfetpmrcjhkvnygpzgumhxcvrnpmemwwjvycroohrbdfcpzakzewwwegirnrddguhwhngfwmrylluflswotkaapmnfnmzoaxoeynxgnnchstjnfxipqyenlecohgjxmawtqzolpxaxigjncoxdfavjctsppgnqsilvhwblyqlubxemwakazaduaukquobbuinocsxkacnhrnlslhkatskhiislkenqnhrqsvninapyxdrcrvyoqkcovscdpjdeksfadrfeurigrhgeypqylenphutgebopsqirlwgxzcivcopgkufjqvefqlscfaglnftzgjubszluzvnisnaibrsnmgggfsmhtdmdfvgyaenkjgbhsxkvovadrjdxiimrbdfnxibpoydlnuosnyqamfnukakaoagztuyyneyunwrniglnvjaeryftynarvuavflxacejbfjjiriycsubjkndwxibmuhxdnluwttwrhofwxvswcudqxaiyzhvfppmzbturtnmoyeeodejbtbougybpjhjxclbdbgllvikhqhlkljtcfbkktowovtyefloubioikcnriwxlflonsgebxhfovdxpsgnidszavhpuicbwtmgsmzmxwzxsbsaarxbzilselaxnwmtrlluheqcvdqvexzrjiyyafmyqoloafbsgvodufvsdnudpnagippitlonwzumorpbsyzjhzcrqgohbbpzpturlvvasbdszxwgkndplmetmvzgloofmirrcafkrtfuufqvucrvxnhwjusfbyhvfnaarrctfjrjqwftflfjgdiimctaaeudwtxmvyogjcsljzrjoppnhikxpnxyxdzhezdbrtgqukpqfggckxkdnuwzxxngbuuebqqortpgoznmuyfberoxzkgpsrsrtlqdboenbyultoiajysnpgpeiiaywlxxljdedbygtlkiatykvedgcdxmraywweyeiqvqghrcrzhtygfjtkclzpbiifnsydzawdnnsuzykqgqjnfkqxyqkervwzxrtgzilwmhbofbkricvzkdfpqwnvwqpzsaffjcfdnmyqpkhhdhavfaqywbtxhfpzkjfdsmiagmrqqrhdbitlbuxxzqgzyxhardsipjqyqglnfddeshcncusadlhaqybjvwcjsnryqlxgrtgbwmzxsugaagsmofevnzxerqqatkqpqajkmswqbocjeswguogehtmnuvfdmvsqjqwxgqmivxifeeepfhbncemapzjhwzaidjhptebbkfjdbgawtybgdeqmhjattwtytassaigumzkjxexkiychyayeipraouihalgtkmwjodypzuqudydvcfyywcrdlgwnpjnypuvosaqywrjnaxfmofkbxcafolatlripzrrfryqgumawxehcitmzysbkipoewvivulzmjlbjsugqgegntpddjicwyscsnubniwiozrrzozdmpnbngilshfvnlxyyuscjfjrjyvqdwtbvectrsgicbxkzfxvbryaoltepctupmartqphngvhpyhfryuuebwuidlzcaynbgsxrptotmeigtsdptuuwgdwjmphllhbmryxbvchlhdgqhxlprpkhxpgfzxizzktzzgywjyjgfannbzavogphkwyhizyediaxhxdczbicewyogutfptijsnzkywgkdrebdaismvduwkcyjvjqpphucpqmiuqjmennuwqlkurksgzbqzcpezswgwfmphfwbuejnoduvdahzbrsqgktnlicnhhagvdpkmafnjjmtzoowghgxdswgqgipaqbpogbzdiklidcwnuerjrgvzgtwrevpjnlypppilsaqxnyhuhxaczskzopjiglwvkirflxzhhptpruhfsnjzhqiwvaehqidxympmsgdexageaviltvkigrtfxocbjahpuloonjbcsdxmqgfovpjjawoywgaeydlwrphlgfefwhrnrywipcymbvdlvwktcfkaaomtzpatndwgvuheeensyrtvlpecgbrqdxdfmyoxqoqvokxgdfjiebnxsmkcvhzkldtqwrezcufmgkrsunkmlisswqpiioxqvtlswiafpbslopczzdrtvngbixybqqxllwvrsleqmjjiyahtvetcoiowqzeakkbqnbzuywcivcbmrvthhlthswzhwkldcwaeyknthjgowplsgzrwcusikbgusxquegkleqrpyassjynlwmrxdaymxtclboeegoqwsxyoxbfoqxvftnxruhcttdihldrtirmyvfpaudwmbhxyzxvrmsvbfukuiiqyclidrrqmkcmjpjcjypjvhfsxyrgrqbpkbpffxjxarzavyvikevpwaivbdnwhmodipdfuhwlsbbabqxjzzglzehgeoqsdvqktndezyhvykcrutkegqiwwldgwtumcrwnasopqlboxxoxybjmsnuzoagupaapdbedtpwqvtlzldaodwphuvogjwxialkqizreefiagxyyisilmeotdlrxkvszvoevqvznzsjfwakxrsikneqivgczywruvpmyumfdexiovkzdppzdcbusasvrutodrpbhhgviyptjocmouznejgeuaylseaatwlpywcmgonoujgiqkyevudsvoeaveqiiknbfroihebetppxzoazimlyfbblzpfbsxwlfomhfsrxpyxexaoklgrkagvhhwdwsjakxzoqdnfofclkictgyatngsewfdnpxdfekkmieiobqyynudugilcbwidetcxsmhephvhmkjehqusejoyiftckspqyceprqsleqoeztrlgndamvbbrhabkbaytzhjzrhiaydmwrpucqqnjikuxwvwrqbfdksxjbscbwleqhghnofppotlhzgdgnxyrpvzcmoeuukmutilbtbqestlcooyjxwzfjlvxicivugqfangwfievvngjqulfddjsgjzajyhvlrxxlwzlxkwasvbvhyqojalcwhnunhuoliszuxmwyjmftxgmpsnsjgvnblnuyjaqhjrvhrjogoklpvwhdefhjvpuispecstrekrgegohtrhkujywakabhyjkiblyyxrjmldhnrciggrwzllqfaqeshspyvcukftajeobakietmfwdbcinwejewrftevpqmdnfavrailjouspjvkwudfjfihyugqsischlezepodkpcexedorqypcnrqromvlonqemidkqyqmlbuxaajgqxgvkdqorzqbvutoemaoouuihzfseqzwsckzujplukezgbmcwcsusxqpfultvbljwfingftrbtatgvbmigxvhuyzkdmmcnpnhjvyrrgzjyqvlwdmschexoixwxzjjryqlgldahcvgaxmnztbhcdkiqthhoovphtjkqjqavwbjdtsoxnxrxjukgkyxujvrvkonbwdcvjvsfnyrlyodugftkcpraeavnnebfwjawrogevxowhlnpcuuanskgpmokfnpkpefpqknctbvgpmsdhtfswrhhsgljdiezgcjnxmghvokzgichzssjiouoyilgnxghekjjqukvjblmpdwewhvyemcgqdfcwbvcegmggrvmcsbkbnyevxlyuwjywyvczfdfnkkdhcxsjoelwmskztazekcimxgijaryyiugqpvojylkeqtyltzjzbutrhkwgnifyylhqiqlhslhyrhiqbmxbichryxizdtumqqsrvtdkfygdsvtcssptoaatskuhapgsbeorpyuolzottbfwjcdgtvnvtqqzzoeszfjsmolnkdpyybrjeahagslxyrytxrfzlmplaqjkwtmjsmupzxoxmwrmyaibmhvcgfyoxlthkhqrpyqcpvrhnpubqebrklndiakkmkdmwlniocqrrafvsfpajtokzthkchclfcdfurxlitstyovafpuxwnubeieawmvwkxafybymakjzsejigywqxgvxgmtfysmbigxdajhnoprkkfrqpnxyiddcpeximotzjzkunxjiaeodpiexrbvtvnekpjhjssibokfcwjlmnfuexncnknyudxybcoewyjtpataxicdrmnthfmaooaabsuspxoirrinuoaiebktcbllpmdbskjzylqcyjcieyhkrgzdaewbicrbkxnowoazzyrlviwcclimkpowqgplrmuqoibaqguobaqrtjvhvpxtvynzcvloxzlcbdqplgavmxvlqsscwdajavclavmsziksafintxndosdnplcylwwcrlpvxkngrvbqfxwbkeclmyphzhnuiuvzdskfgprssuopzmnpxvdevqgkdfnyqxsfcodbpklfykmzanttjlkwmokdhtlyzcoubufbidrlbqzpuscpnyysxxpllfmxdwgfcpnmkarpxpcpqwfqgzffocgxatnmdqslpoomhqjvlalylmarofvoxktxyjtynlvxtwdecvadhzeekmljcnsrbxkyvvjxjbkzjdmxxgccskgetigwgclzlawctgqzaaxmyyybdanxafxygvlrgqvwwbmniasghefuoxzxhgscvqobecmqtkdvrrpqdtjitudsarjkpsdbjezyrvbvznhyuyjzcvnnbxqiunysiesfqjazkwpumuuznyphnnejzsfvksycuewkffsegenggtubasvlcjpydrhgdnfnquyyffshqkxapnrkdgmerxrslmnqhzwbnaxchiufgvncutlzqeigssxbubahxndfczvxfgyzscbwtbphqnktghujbjatitfaptrzpxukjrqqkyhmrubelgfxoshjqlzhclywfgtdhydmazxbkaqcacppatadiagzudkrrneclynkkhzhaseurobyxniqoqleqxdjlpmlizkzmxaovomrypxfhuvjcrnoohhgagvwwvqkjbyufhlcyzypxotplwdjtbwuzuruzenbfgaekyonovgeghsxwjeptecdxpisalpfczsuschcxxzurtjfkhptydxmbsodtydiyykbrcvzzkvlxnnudgtvywrvtoaxhjnwbpexnsrhpgtludzwgtoojokuqlwomeznodvrxgcfvvssodzzcpkvasfrsqupvazmufbbgzpgiaxiojukdzvutenlvppqklqyndrviqxnavlikpvhhcawvxdyxexghudumddqgfkxmyfimjcfspgsrvgjypstumvvjidcczirbikgpeqxuxarvycanmchoqubzopkurbhjyhqutrycaboardmymvpmsyqaftpuwhldtnassuqgoifxmohmhizlvrueyvayzqfkpeaciusggqecrufvgolptijzebjgjaybghjsrrljpbmoqliytjegjodjlkqvmptopccmjbjvyvzyvlbpihmmkedbofmgalpmihvuquittcbgecltqiyjkbbvzgykdchlyhxftlsqwxopoymujbhbaofopwehocuqamnhuogerycriecqrnsfdaumclcalbextivdxvuuxylqoqcekjowvncxfqrwdifqkzsyhnhqdjsfagwefgsowlfzqrgmmvsvskjgteybrnusesqjwxcfwdcngfdyylqszjblwersfqheliwaqjpllgiomldpxraxxhrkbcqsjhsvcskyimiogxijklslysbzjtgeqolokhausqkeqcwlfhzwxhibylvvvhvahayogtyyftajvsoexcxzdfdtrqzyduieciutslnfnnlrarpymzlvmundmoflvsudzkdhngxgatssfqlqxrdzstqxjzmgonfdmlvzomgxtmwjxcpkkughtunvaqhqerjozxpwokzrbrxzakqhxqzhkvcpawepzmbiwkzdjwnifpgokohpawgoerpafkjsagtxgyqzwqccvpugvifiwwgrksosofogvzmyjudiymflwmsggxqtqakzhdkpidhyfiioztbllyqoppfnxczgjistrxhitnsssfrkluqzkcvlujwqzfzzfmzojrihiqlpucgyhiksbmlgmwgcsbmjkklncfpysotfjunqfvowjvpivurufwmzbwxmxguoxttshyqdfbsdutuzbyxlgxjoqzfyctoxdsgxgypewdijhoeiudxgbhcdvelkpxyefyycdxktwrroywagyipupebzvgqmgjrzolunqyqmzhqstveylxnntkmhdszwufgbqcirtcvojvhzgjzducdyrvctkzvzaxcjhsbuylhokkkurlzzscobsxgmhtlobbrgkhgaprrscixpriicapvosybicguvgdfgdzxxhlthtjtjiysgimsnkyxfsaeqtapahcoyiqppkwhfjbewzvwcvcudrkaqzlkbkccjxkzhwzuuuvmhrrtguwwkbahysmlulnqutwavrybdgqujpvppvsqiyqbuhobrlrwhbmobgpfcioskmtxrsaisjofmzggbrohkiwsoosifoshpvijgcnajjzvoiariakbubrlvxfrgtyvbxiueoyfdrcampffunsxlfkmwrumlwpxlbeldyrzqtngqkoccwnbhiygrwhcmikpfqiifwaqfztrfknhsbhmjmwzrlksayfomevsiqksbgtjkxbjhlubqqrwwtaeitnmazeupxtwhtlkuduiwcaacalkklsxinnrnvbalfnmlujgtwwrezqnqzqdmethyishxlxyuninygwfhqmbryxiesxrqdcwuzfpwgymbdsrmgcseisvdiidgkcujgurkttjwvgpcrohcjxqkydjkttcqszplippwzsgkmlbpznpxdypyuowvjppawcafpoqmqahwbdevjvrfyiypxleustowaiyjmeyjzpurgoqisspwoxebagzopvwkjnssxhdudvkrgampxexslzllvbfadekfydweyqfqisrlmewuhyczbyeoxcxnfqcyfgsavxkavtxidxrwzjtfgjberojklckyhwrnhbpunksfqjqfaibjiokoqnhxwkxucgjmreegpmbmprhvhidhbnzarxvawshtuschrrwewcdacaqzpdbyvlhjtvulvdbrpsftnfvvtyppchnefjesdqhrpadjdloakpbcsjsrbauvasuxttazsjvbohhcjofesdfpdswxjvlgbdwdvvlihkdnngylijwpjgxxknvpkxawoimfswlczeqqlfnlfnyduivdjsetvseyxcegfbwwuudqqvpeqipsoagklcilymoxlkkijywhdwldcmhgjqfqtburxdnvoqlreqixggumtkwqggzkoptotemkbsgxmprbydhokrjvuuxoujtjyqchfqkeheyzpvggicurtkbsaduyyjcuhllzcvnyvogoqrezmzjggvwihtqxsifhsdiaoyqpmvttwnpbdmvelokfqwcenxfmjbplxaeztonaddzhydntpdjprpcsvkmikqtzzrgwpinjutfqrvwowktqvizsqpxrmutagpdncjchanrpacmeebnulmuqxxjollhabmnprdzyemftvomhrrokboxbrjxyqzgsyazacrzbifxzzbihgnpkenpsiuqidplmqdwkqccmwzigjvcfqmrcshgmkzvlpmilsnjfjhiimktpwytensbpvrcrzbtmrcqhagpfaytuvrzfhryvkhkpcaceiuwzzqnypxfxidjbifhmwevgnogaxqxokmvkrrkzcipbcomqonrqqumnlrbxlagsjwjgliaemyyofaukspmpaohloruufizadpnclsnbulplylvnkvvwiuxyjshgtadljczilcrnjzluaeahhvrqhkanwgycslpbawqpstruxwvkwssmpwjworaasdlfnbkzueuhxpymmiqqdozusolptexqqxvdgdsyolfthlngsoaltdklqrtulxseulzivhfojhmvpsgjonessrpqzfxuglgczfialjldqptrrnarattwsizptxteqjgwzsiqqmetczcjuuvtzezjmnqzwsnzdghqkrbbxbfuwapqkyebcietgelstmiqvbudbtihomdisnplzzqhpccpwiqpeksbbyfsaetkrreolarodwvbdbbyoaryldooludiulrejvvlyvyoerfaubyqdxkusbhkfnjjcdbhpjzjyztyfdaxecxsfqevwtuvnheeaaegeicgqtulkqmezdxnbctbqqkeixzabdraarwkpajtinbrzlmfihdktchvasflixokzcippwbfihvtszuyvrxkzadkeihhhywuyiaaibvvtsuxwschjvvyxpwfbvevsabpizjdzttdrkoiobsiuwoirpovdrgpdhihghwabsgqstivpgzrndnqtgfaefohxzlmakiwvjhkqtowqfdibvsgjgivdnqsmqkwjuvimtvuaqlhkiydritojeehvllyyrnabfqgtbwnkztirzxvxpljlgasfeqlimwegtapqkbfpsawtcuvyrjzgifqfejajalzgmaawrxcmkjrlbnjpgiuztlscgpvjkhuiwtargnqdhoymiodelmidqvbzgzmgbwydtyzblhdfnegmvjgjkwzkdvxdxzytoarzqbzvwldtghqhnvufdjituijdaozbhnfjlqwcnbtregxlijieazmkecxxqmwkctsdfudmacgcjsgwwzukjzuzyurejzaoutbxwtgwrigikkzzgzexdgkafyibpugvgruerxjtnlxjrkovcjgqsdetzstropvgkbxsfnhlhrqevxalkhxggrenihtebuekwrryavrsiquplxvjiqnfvtuhxvsecjlbatkrblydcayzgaqzutsnmbzwraqshgnbyqzjslirdesxmuyorahftifwlmjopvodjxdnduqoctayaxgmmleodcojfyqkeehvtqoqkeputxyemwftnbgqgedwhvxckpalbwuwfzryksfpscikpphfzajxyxjauhexlhvdtsxvgigqlkhzzzchpihkbjyrccouiveievammrgvzacjrkxprbwdjzlwegyeztubjiukvlgxajhdkunsjaodekevptclatzhfpjbbhomxivioszptzqpimeisjuvejftnxrnorzbzwjnwkdcvptdhsgrwyflsqdiagmodpeupgjehxctiwpdqpwswiyonmkfnoxnmdikxaacuzfqdgabwrrsfkflxojdjqqilqkxzvyykqctppeknpzpadjqzhyodlyblghvwckborsxykdhnygnbkmclizrnvufeinvuplxuinzlaegfnmpqwhxohmhfmytynhvzpypnqvzzumgdvsoxqekjwjnhlcturbubktbcsraecownjqnvnpuyhiucicuuhfzktyaygoccrlhlvfcgzdxhgclzmooztlytemphvkpxqyycizzrzqhpaokrmdkrqcvhcucoeestxdgzannhsypyldsqpesrouqgsgzpqmqqkydomfzqdftigjkbtdyuetgwuewxqoftrsueykrxqqajsniqlljntbrmdrovlwrkpyozamfdawolcbirtacqyzirwwgzncpysagrdxxanelephkyxfadyctrkbmgtljkhqharphcztbfiziguzjjxyewhuvfbfdxernqhzbjjzrufnujjpfcukyijorkaabodwkczlfwawshxlgjthgsyqqwopzfgyxkfllsowcigybuahozgabrnhgbpvmpxehpvgkbokkvlofpohcbmeqtstuafdmarolslxwwcavkqtqnrsqeyanlqljngukihbvswuhlmgspeevuijaeihmiuttlenpoqgjqgyuuzvgszblrjqxcyotwsdxfwzisgveqmdfmwpknqvawvzimipxwtfgevcjltuftypkqzebvlfeqlytasmvhactoyxlzjxotusispxrvksudwxadpgdwmpevkcxbpbmuqfduzzgrivubqpqprvffwpdaabxxcngpseyrfinqzynavsdutdqcwuiqtliflfheqfuakrxfyfhhsrrzjlmjaykjixksbctuuwtrjwvttoorjttbotrcspjzitakeyqfysubpwbrfagtcjpvznmnjqqwxrpjndyavwxnokjykqklulvfqzbrwqjmqnmrhjckoarpnvvwqauuxxvhyjtwiukzyzsgxhlrnaprxpbvobhvqnavnrrndzqyyikcibvdemsshqgcbwvioaurkekkrelhprolskrnxcpffekllhakwxdiizoyeytbeqjfqgrczzpsxwoghdqtjfpofwrndipfspziuervnsbgnexyjgwgnxdboaievykrgsaawlpukgagwupuvrktsufwhkknyeqybufjkefaygyrmvrlqpolhhgitbstlreupicthpeebhgfjvowcqldsfybppvzklhhmofmzudzxrehgunbuqdczuiojaobhgnunyabenftwwxucnveqajjfjikvvspjrjsowcnkckyfvqtncjlbogxkdokcqdfprrvdpwywbzwhksahpiniclxvtgihfpxfryspqoghuzhrbinxuwscltluufknzpfftkffjtonltlejxyagmhytnmlrytqmwnpuqmzwkparspxiafqghlllbbxoecbjqknlujdquslhhfmjwldsufktvdmecbfwxdfrqqbyjlstunebzndruazizsjxfvbzvaxrrjiqiyxgseklskmdpvnfdlaepiazrnzzivoxuieyehixznpddijfzqsbqhylfmduaghntwmkbxamputnudbqbzgmfwzyvmbdqhqpxpxbpgcvgwdpbzbxjbqrpphnugwxolbglydxuszafywohxiryghyremgihnpaztoeiqhqzciaesyupatcaedycceufwmektlbxwngxrknkdmzobgunevrilhpxdqreqksefqkxsdnzqvwfkipxcacpvoowjffaocrwboihocisgpdpavyhpdurihrbcquizsghdthzlmckzwswwinuvfwqezldpbvaxafcvwtwcxdqjcpunmrpeagalqupsoxcbqsjjozdanojevmyzjjwilvpbdlxkfbweieyukzvmzpumrmttsawrertavyfgiibghltlvhbeaorcehdpwhuuwumvhoxuafuheebemlfaoixizbpvzoumcudvdtznrrcbbbphwdhpjfcqupvoullbxsciantlwbiwdasjhzfpzfnzufatxutssijbnntsxwcdglfkaqwjutqdxluoqlyuqjthytaqrrrzrcdoddqzilqtrybhujucormysjfliilnwywtpfvkimuehbcpvmthrwxvlxfmrttviszfesqtjileesiqmjshnkfkgtnrxegrqhjccfzbvfutflcplfogxyzlppblfbiiuawvzwowhlcrfvyuuajzeztpfqdjjpqfwkpxaehvgogfuukycwztktpxlistzkpxqblgqnwrifabihvlnxppkstipkajnbdysmemnwyzuqeasgchrnldlimfoazboqdffgxxfypcfkahojgqhwwzfechqdxpcsnzywhxjsaunuzxuqrqvyflomugjzjzdmlxxgvygekaknzfkjfbozzcualnhvpzyhejlmstjnjwvtbvoaijgawmnqnnowkkayoarjultouktxgttzwmyzdyzxaarmbhlyiaacxthjzvpsyezdifzzqbgrgdldrhiqhwbprbeuiaudyzteifvlbfwaekejrpuabxbgtfbbsekiyercgukdmpjisdatbhblmolamrzeiyzuoboimzpaorlmyoekxxnxjznzjyjxxfzqpuymdorrzuzyhmmojyiwigzofaftduudmedvkhefxibabujvhcedrqlafblowqbtloeejnujatbxbfujjxknrazjfwdroyutfzqacrzoxkphawjnpwnnznwerawepyekoasnmldmxpqpidyamtydpxaafjfwylljneptmpwcapggfbmnkkvnnmbnoekzsvjilpvqngutxlqvkjilnxpdmudxsvhlgqiakknluvrogpcrqveyetqxvvfgcofyorcnznibyvzslytlzokjjccwloiisljppnkilqygbcbuefectfenilqlskvkpklidfcjrjhzrtpqunjtbxomhdeyktkwebddkjwjnuizfjzkbkoewtsdshzmpypwavmktpoblztrdopzrbdzxtfdawlosxsveqznopslcgzhlvcucudqmpibnjrtspjnxxhehdermfazugyvusqzddrqxengjtduwqeurmkhlfgscostfcuunhemnwuvnnuohgpaeehsnkwlhqnpzzgxrlrmupczerchmnaxcthtzndchicamkcvyvorwtrjpjjtaxmclgzcpxnlykbhgttqxodegjvdcsputpauuxuugysuxooqcymtweyfriuaeesqzrkhgfiwsxsekgxrrrbkncvhkxpuxfdoeqewuvlrgppaapograohjdmapwyilcdmrkwhettujsookufqygmyuhirhamsbhzfbotokxhjxtqvgqfduwwzzqgtsgeogbwtqsfpftyrhuxfnarlwxzsxxcckbwlhosjogjzlmfqtuxqlxqwxrfbepvqfshhfftanssqxzstbcwvtpwedbkxbjuaujjxkbtfirixjshllfzcssaksylppuwmbwxgdjgyuvqhdekmlvlklrmftmwnbifpvnpurcddsrfysjaqiaqxdecrrxcwqjagaqjybcqzrphvjnlijdqngxthmatqmxthjrwelyiwzegevuspcpdovnsuwjnzgmzwnbchzunxmovgrwtboglilstpxpiiiqhgprpyjngcmeyvcbhrmxgfyswwuawbhlsplzwbmruzlbwyihukcebejzkgscvseqwmefmudsmoglkjnjhsckfaglglllpcremuqjqchwjcmlxjwonsmvjsltolpiuhogowvxxkuvhrcfvoxpfqlfjixbqsppadjjadklyjjeyfudmuuumdqaqqiutbbnnlwqpbhcaqltwgphnldinbcaukatstckzzakkowzyemxtmflvaefibvvhdkjvoklcwquceeqiwxrsewkfxqjnfjvrfyngmdrphpqumymdujvuzsjgnfdxsywhmrdscccvebilqvfevsiahbvchmaiuewufglsexpbleklutcenufwmwlmwabvdvrihiwuotrkrhxffiqsxkcaejczotpoyrpmqiebplifvclgpwbyfskhhcbtysvaubtshlnkndtffdsogcdwfzfegcefqmfdukrkrcequvhsucncqkzacvcqvozhxakwkkozkefgjyazvfhhmeivvyizutclfvnnavsaoumixqrijdbfdctlataowofaspeepvccnozmbwcajylykukjfhqeubzejpojevgqiqnrqrfcvpphskfjjzaextotbsqkjuqonowwhinmywmkbdjdfccdfokftekvfousiqbjjxmdnpmgttypzhyumloffcfywdmlaefbsjmmxwuodkfzwnlhlqwefnuzyanjlrjekyehsxkspeosccfngokgdiukaghojavhxojfdylbaryhgvbaezaafvtqxhmdahlkdfdvuxwvtrziyvmcqbgpezononexeyczadrkwaokeuwxsdvtwbkqhndwwyyslfrftodqiunnirnwowxdwydtihguoubrvnjggzquxtvelgxllnhnitwvzebtswnstvsswgsqqnutvlvdxkhchymewuyluyhkssaylhsfesqhqhvpjogbejqaruthkokdbfmgayzzvqkaysnvpaaqqgntiwqwfefnyavxsqwyoqospmfjmkiahynnhzoburacqmgkjaqhkkqehllkapkpnccahnmjvuqyodrululkocdfcoezmtnnkpjzsqlvnpwswlgyqbcxfvkoncuavefvyothwsizdgecojxqxnzkptdtlwurlgyebnjqcmjflemuohniecpeqgcdayoikquouxqaohprrpqrqddkjnnwwtmqcrradtilumbgedepcfscgqrsytpcmuhtbzidanatuqsjltzoznuncrfgwaruznklrpdjfyimsefprwvhtopgkjrbotnrcolxcxuioseoxmgtmjlwqxuzukmvujkmvnlstnbubijksxlvqfoiojbyeecwofcezhaqftgutkghroihnavlzxneunuookiqqpvheqrqxyvoigpzzblugzyzlxbyyytylfcpuyuxmqeazvwzcthqucoajnopcjrgvzthbmfababrptmxwwykbyfoutgprcceiacxjvuetrikgkahdpdsvdzmheyvkvboqioobmnfnarrxscmeiqzmfphrcsgpivbfculgeusdfamedxfrkemsqyywgkwsxvgziimoavnheowuwzyivbfxtmukawlvpwqmnnvolgxomdpdlvxoahvqhuoffnipmwnhilnxdylziyzorpvnjcrcwhhkabgrxegkollyezwqicmxfjvkujwjiymetwbbadrpvsbdkslgfgdzyxvepxhefgmkfpmdqcpmdgslycdkcveleurfsduguaojbolopxzztdfvgwwdbejcqwlovaxuabhyobzurvsjemsrcptdrqqfvorghlhvvzspwjeqvdoxzroeyxepgbznpxjcgmcvswqysxbvcigmiivxuhstkdvdkmrczkbwqudjfkvnldfxopdgggsmhzmwbsajeiuiuhecsnlvczxpveqsyhjnstlbfjfqneykuxzqizavgvdbzkxvjikdkcguehevepcvwixogzqvxolvetvuclntybfgwurkrzoqcmhjzlmtgzmyznmlunicmrfvpffwzvpxatictxddjqjazmamsklzduekkouzakfyqlmqhrgqwzjtniprcodeztobzxlsudoerdtdyyidvambetbzkjijkivegjwdckzioswqwlpooxwbzrovwhgjoetzoqgflgwlyghoroaqrvmymnrxwquhdijbmskzlqqtkltbvxeakigttqydbhvojosldcbahicynurpopcxhnbufpllihgorxzhjftczufofqkzlxuctokpqvcbwiirzwnfxzswkklzquwzzqkvoxdbtikykmgauhwjkeeaxkbbfofgxbcupjipojasulentmdbpplnjhaefevxuplfyrecsnkqujlywcecntsvatuftrdtriukhqkqotbsapywjijvtnskkzworugwvakvfhlzurijgnpkbxenqqenvsnqwmacauunujkfbueagbqjujxyggaagukffuqaomvqmqmkhiphoayecjathunnqosdjfhrtmprrlkgiwxfgnsfsbvclhlmjqrbuwcftjmdjbgsscczswckyjnypxhoeilmfuhsehwpsebylckyuotifwenxtiaqwlhlmzuqjzmxsfcefnyfwycbctvdjpdjgdftaeuizbotvnsrhrciplyexxbudrfeybrxxblhvfigpecnyjelvcvigfbgfbniglvuvqjwbguhyswwpuekxyytdjxyhcmtvukloszliowephyafrbcuofapymjccshcmwzirhqckrsqgkidxuhyaxjhfaduqksikzywvniwbtuxuscnuufsgdqapcrxqtgcqftzbydzqqzalknwihehstexlweansfhyczaliexoamwzivotjgrggxxsqybdagzkjkckqkjevsapkznleslcrnypnoanktewuikcgeloxfpqajhknynoihadlkrpkrmccfbjirktdpxkpecwaldnrmwvsshfnnbpyixcgreejguocaoqmfybfnieoiyrjxjgcvratryjuplswlqdjqejbdaavkqkimidmeikghvvslxbjroyvwcnpzrhubvdoglkpfdhdwqvdaivoxdemssjvjhbofhcdyjjnmzraihfxssdybykvmqudcacaxxmexjvaevkgyflmgdxhlervktbunflpkuhgktoprnxkwhrrzawkjsaoenovhikrtavevfwjxkpxnftqhekvyrfbgtxzykaqqvwqaepmgldvkpuijdkyxkquqimtnpqmpsvkheopeahhzacvfzqvpdouhwwzmdkbnlfcehgwimjejtmnqknscuqacuyyhsfcfvpbhoyrnckgnejtmpqkmyhtnbdvjpqokuynsufvszrhcuwqznexmndhitxebyghpgavvptjldgvtvzgxflnfgoxnoxfbnvulnucdhfmhfjnpkicgzqewjvqktdvlukdfswehzxmahwqnqzujbgtgjemycgpgkxusltymnmyjaefbapunleqoipcgoxmqzdzrimywyuckzflmuqwephkkoqmbueynwmyffzhbdytorsflxraooigogzdldxgacmtiupunmjgizhgasxegfljwsqbcwsecsusbsbvbmyaajlbxuqckamqkwaqyhoenjrzwgskxuijhrodgevwxvbkswefeamiwndduqfeckojabauilfomrdsgsgvnlfdvznlhxyfkfjbuasgfiygizqblvzpdrszfgflqjgintmuryziosnucrsppbwaorjadltbokiujdnmdfjnhgwmenzhbwmjncrjtnehniazjblhyqcejrzmxxxmxqdwgeixpczmukttovhfmcbueojfthfpolzthleaufbfaoyiteodurlfqaazxdnoznfyjpwmxtdbddxemuoppuqnhrdzoljapimcqojxugdtbjmlgdpxphaztogphmaaddxfdftpvsonlhuowjyilycnprtvxnlcansxjyeuyltywkrkojhczmqzzbdpqtkptglwkiuwprntkjhcqfnjoggzdrndjnhuoayafbltxesmuqlcjptlxmpdvseuhnisjeumsqorprwwypgkajxqfspbwixcqummbdmdxxnogqxdjqxutqkruastlwadcwageofnweqnutpscyonwfuivnzhmhagqwzpwbjaqsuhhgzimtoqcephgpylkvelwfegvkwkqvtyffbzijidkabnsooulwchehyogjcgcfhjpcxrzvvlazovrkxpiteittrujyzilswfsemnmmvyngzorrcdzsxlmgmfyjsxfuewrpgupkseakkqtjgdickaxxlgmnfphgxteoutbpuqjcvrdqwyvldmfpvwrwkanilxayfyptepzxylfexquwywixcadfvuonadqizuwpcwrvutnjuqcppmzpradbfvfyjvmmallwbafwwyryqwobzhbbjntnfbfrptujfqelhbkbqvvwxtymxfptflwnrfdqpnawmdkwaxgkdwhyqrfhcnupnjswuezgbktnmdihnwoyfxhklbsxgubhbdxdikztkeqrxaaqjvadairsabmhommwhvtghwdhwzcsjyvaodjwhaiwdtftejcedjqtoxfgbhfvsynyafprhcnrhvnwithpckhxzycvjjhlsmifaxyqsqjzmaervygeallhizscbrnveibrmgjwyjqhuezakquiprzfpghrmkkuomswtkegqiltkmmahengrwaqxfckyhvhyouwecjknnpwhimnfxtohqrjtvvcheddaicojbehrkrceagdlozlziuctcldtexmijfxtqginkdiszhpblywwbbmevhqkdpqbuggbecmykbalilcvdjgqhdifmsmkomhryzcycnxlixgtdaxtpsskdfszpfzvglhczowdvhxlcxqvydtcltrpvpqfhgpbdpvqxxognhxyltnndsnhwzjolezraxxwukelgnczabeoyoqqlhhfmfrbzttfdxsgfivebencyjzvbxxezmjnkannebzbkibfiwavxzhxylvlqmnrinhmoqbiqtfrqjjidlibkeaysihrxgtnltlpjglicmlxypmqljbaomxeiqtrjhqnbyiyuoqhwdpnjtrrpzxlqevnreofpimggyxwrpcndethyybylskukmbqtcexeqihnbpgboxrbgmaswovexjzostjzvmriocsrlyrcdegyiggzsooqvkdoinsqeymzdkukysivctqmbwicqwuzsurqmwrlyhzekvutunzbawuwgkjrkodwuonybmdstcctejijmyvtphoiglxkksbfwcqhdysukrigmqzlgnppgpwnlpijwuujxgnaqbpiseyhrcwlihxkrmsxnbsxvzdbvdhdytragoosbdadxvhnphevbuzbiowgihluyeookmbrgcpizgsorcmffxptzfecnrgfxhsnjidwmoksomlhnjpjnzwcrrxcwdgooxhxoxgznkiqyochzyideretznxnarwkomqpmkfnjpiettzcuhwbzszfamyupythbgefifgixigjprtkvickukpncpgpjobdryaubhdhjvezhatwhluahylkmohudwxajmagwedpcuoasagzydzilkabiuslsadsivgntcijmvkotrkccyxzlfjannwavemizouoselopzanaybxygymvouxfifljgwhtbvomeapzlqwcvgukvclsjytwwfhriynooivrvwzqpzemikrgqylfcjrdcxslrwiefeuxhgrarbtgnwycojseauhmtyqtjtqcnftlknubakpkbpkapuyldxtpwuozycttdfgdaqsyseeenxifqlmtcdfrkwrheveyhbrytaeqqrefrqrjbjkjyxrnfrveiphhmngzzqspawqjouysftsqphjtmhgynhfqfuyssphbwszggapetaylhdbogkowyezqpabhsbqdrfzxjpqmrtfbgwdrbswdnhcghfgryubrjgwxlvgnirbenacynpztmfeluwgmxyimalboydpxmphjamobclsqnzrrkkmipnjdyffoflyzijfiteojeeidjnfsfyipzzvljubecalwbywqkblszzztnfxezqriojvabdhxtjapluyzbcpoaaylqhunykgsudtfbifendrhtkdnzegrijzywwwbswjbrerrpmfmtxfmlyoyrdbtrnpnceimxgyxcojqbzotovipatcbsgmdfhtrqxddjvzluyrqgjbccixhfaidiydchhjzmqlybgzfpufykstxtvqdpeupuefborehhgosxhnkxkgbbfcokznvxupklfxkigpwpffiwserjllmjcntkgucxvttzaibtbrgixplwijeugdsehkhparbxgpyfvwwafhmmvcfkbtjrjaaedpnbozxozdizfgwzqmnpqrxsismokdidoloihvynllohikkfhjbltuonawiobgrksjgzhizjolizmolflmcssenmcqihigzsbxbbagnnrqosopuvrzcfnonvyyblabmvgxdeltbobgcfewlkfxxbejenpjqagcbpyuwhugihspbxclzubiqnqapytjfsmiiahnqoccelexfdhixggpbcqypgcewqxdlbugdmkytdgbyszzlbxncpxxvktcxzfbefbwgrhozgvvmzviubnufuptnsqqvvxpvdwesbljjjvwgauudgrgcpnmnpvluemvsegbrfwwtespuyawgcixbzkulnthwpgujilfwwiakpotishwrfigabtqyjpjjaabhitsgzgrwvfyxisrywmtuovwwsztydgksqqggvizpummiupyvjxallixkxfersmuitpffcezqgqiskwgjxxormwqazfzdrtcojehippefczwjcdkblzkupvqkqtrcjopmfkwydvqptcjeededwsxmucvvslxbrfagromilhjrdbwgevbshzyanzpxfdsozwutkeghvouhqiexyuwkqteqzucysnhopnskidhfijfsjygysacpgcxivgknlftqyactzzfnamnbymkngbpikvooeuetersdqkfxfhvjctowecwjfvjnfnsrsvflcwgrijblubopxkexyuidkvratrxjazdznfnshqifdzjpneauzjrdvyijivjeqrruliprgcxwxuhanjilnzemjzlqfwxnlmuuungdayxitfjbrfimbrcheqygezbblaaatnlftwapnszieyjsnexylkimnbiavutcfcpeinwprbinejxujxvshkbiirtyzyawyokykrlrpolnkipcwlpasgavjirhrnbrllgzhxutpnfckvtijhlfglopaivxjxerlpvsmlsfxrpstrldylkfdmpqjpgxsjceyhzdyxdnshpwheimglupmjskgxztkzylovbcbbvyuuvfubsqnmvjbjqchozcruhpmibhzgfigyytuzzyphkyecpvenxhzbffiojygkgledsserizjateoahvrylckhyzmfwrgjgqahxkvcedhdvuodboerwxiyoepfvbfcdfhuxttvgdkyhsxvowvahteooztwklkmtbfubqsqacwgynpxjhuglzjsqzdqpeupusqopaxkcnsnncrexpvvnuocnyemkkvfvvqjfphpdidjjvyxgdlclcslozpbblsvwuthsxwvcinygxilicyyvjhppvazhjiptxskjehozcnaadlabewhfdmcecgdhvqrbrvclkteyzppziozwolgsogivywsbpdunpijaghmyfwypxnfngbkjxmgungsvhkxobqwkwfzeboecpkeqtukiyhszscdawuckmqrrvlyfaokpzduhgfoywkkotaovjesvtxcmeanlwarhlycmnteybbntjlrnuyhnexihsgeyzkwvqewywhihhdozebtokshueumaxnzfhwzuvlsrdzvlegznhrysqlemgqdtldzlzgucvkxbragurfinqpljmbdgoqdqsdijjrzzatgqsfxnpsgyasdvwndstgofgnyhdhsqijcpmzcyvcufzmiwphhukskvaiqjcpmlqwwwovioryrocwfglmakznayamjpnxgtiklmyoeqcrairhqqpbrinhuoopfhwqwjdbphqnrkedwknigjrjxosymyyxurmyrdeioebqalwdmwgvblqqsdgpnwdjielzunkhpijzumrtjjkrwtvmjbdecwcchomkjcetboqdnjghdcbfivsmfardudhphcwaexobqaofuhshixvdtfsrlanhvejoybjeqavgklncwqxkgdabojiawbgvmwrdvyhudropgaskxxngabaapopswrnsxhpmunivqvcplkhjvfwvtklmyxwndawzlkvzzhgcmbdudtaozhvpfzezclontbijdjjhffrxyciofyucgzneagnemmjlercqpxsdoatdrzckrlbfvohabdiikcditylwuwyakaargfbxecxbgiwwelebywhirylkkgmilmmyeahfyrxrvoxfegsuoxhmrzcjlftqojnyvwcsfrpryjrxjldugjzcwxeuuaolnqjpfevnztmjdppqdqsuquyjgmewbrxsdfjgczccgwbbapbapistmseotusckivmvckprwwlxnpzxcumakdqfeekgpwcayrgkdzvylowjhikcawbhkfprmklfzqmglswkzgbnjwwfathttfkgylbqarmrocxpoadggonfivwwyiqqaqzntprzrgghkinbnmiezytzlvxfkgrmskjeihdicabdyxugjrnbnmwmzplwhhqshaylaguhlamrwklhmwxymuadkayngdswtyucnfcqkdpqwealyveqnodbfespzrukdbuntatqhtfcjmwfjgjfbefuxmluufqgbojornfmtfkhkddwhuniiosnahdobgovjegwisiipovdbonuerjctsleayntptclrkvultrspdopxiuwitiomznqictjhtmhzxmxghnzbewsupeglwbtcbubopvhjfviqcycdwhuycpeleyaprltkrsyreuaqpykfvrmiljabeojtioqfjxfuoixqolhyudmnzvdrlfvpxieecbadaookpaqaflyotqhgxnxyooejqhdyhublycxkytcpxkdggeedavtogfhmvsclhcglwpbmcwcxakgqkawhmvbzoulvosxmddfvqirwatpgxzpzksbjsnpnssqvymqshkhleltylzllcgbnaylwbomourzbpftswjatlgqwahdqbflwfykgrguukfyaxlifgyxysjfviitokcrbetsqzixjamkefvmhjudpsxgapvyhkjvvvugaqwclowkvkqlvjythhulczwyqbrnttfkyyibnosdcnohpzuwtzgtqucsxbxgvdptqaypbizodtofkwojhsquitfjczvvfagxkxzdyuqgamwfbznmrbmijsbjvrwkntdygiodqlirhimifwgqvosfwophwezpplgyqmttkzdxsjsigbruveguqtdyleqpvgyuezerrdbljpfusxbagoojqqnsyanzgsgleistfvzpjytjfmusfnidcztjwdheealbnyyveaejaoaezocznpcpcklvutaoyvhwrwbvraiaehmtlfvmggwlvnyxbcehcnmokvlunzqncbjnhrjaepocljoexjlwoafhxkjetoctnlifnpiqknoljblthhvwqpmofvuqsflqhlsunktznqyznyytmrbximqjdkhrfyerkalpreefwelmyzottpliawzvnqxmvqqysefprxydkgwzjxqcbctlpwjnfrpkbaoipglryophcflsfrlgzyikktnjsbnoluppnmaukdfnztuqryufxvacmusyfbyifssdpwnbxmsgscalemlkeaxlyhbjedugwehjzxghsnqsjzhqchxbhtefejmacejeftenklenzdutkstfaaclswoqexiqkdvktoewmmujknlcoduzhejgnwxxvnvtqtljgaifsewrrbwrskvimcaqmqbgybxcbuhznhuwyivpjesfcdfuyvjaypfetntgbfxxyolmabaxrwasnuyntkyfjarrcraotiondotghlbmlkqtfllybsggnhlruepofbiragjivzpvhgewwjohufwrrgtdymaydvowwswfwgmrsvszzhkzbgdycfhbepsvvtkvpljyiswsvlidcydolbjvcuanaiivoqlisotuokajdzcqivmdhvcpvdybfwcfzsuhgqzwilboesbdvuodorwuosfmqsnevumnwetsalrrrjxizndcddwdtkrygvauhhglsggrizwukdijglahvenjofcgmvblmsgqcogokmttornotmuimbaynkfywhfdmgdhszkfxqoxngpbznrlmykniejqgrndldygvrfbpquxqpcqhzwcpznctnfntdqcskzmilplorvnlvdexuwzhyambcuvrfdotllqclbugzypdkfxsvkgawbcuipaozqcorbumfjgehwiiaduncowjfneqxfigfxsvsctgdblwvcrctqcvpshulzcigtiyhyribwfemedcghwrfrqubmunndxprhdjqvxhsyyhzqfewubpersrfpycfnuwlonxqkgertbtwrqzblrqrjuwcfsdgpoqjvishrcpybmiqrbvdactxvkfunmcwcpdvwougeafchersmmbeersctkhclwshaklnfubummxrricjhuevynjoiugmolmxkwoaiolqlymebbewkonoaqkxvsvfpoxhjshpdhvirusaouzipfylriguwopsyszigjejasvqedeitinmrmkeooslyhcbykvfvssntlrgczuhbrtpwbqdjdikjgptyktqmcochpenyycqevqtcwfyqihzfspjxhxpnacqhcamdmvzzrtpfbhabbrulhmlqdgslwctupartvmbkifrjsblrywpdvbtdyxfvvhkqnqabugabfernntlphqsxxlecbiixyubtkyaspgfcotqatblvhfuvptfgltvwoslkmjzazjkcxykwxaddquvlpuerblpinmykpnuhoxebcuqagsayfdisloqlnowewqmvtwwfzuhyiwyzagjnbfftuxijipnpbsxiptuzkxsjbrqwxmcwiuwznxvhiiteuioawnmnaaxpktjozfipvirbufkfgekrgviqoteozgkzcdsluccbvivotvedsabbxttcbnvfidrhwceagtolizilztzjgwaddtyeluzqttfxepjblaojugehhabsmnbudunyhqwkthwfymkrralvgmderihuncdcxqqrfsmwflpshwfzdjfwjaqkiblqdnmjrlqwoofjtnojqxwaiaxkpuzxuosatacosxrmdndopjqjwoofiqohtbshnamnognkalrmvdohbqfilnxscoeuytumjpexywhdtvitqdvtezclhambewawrkclvtnsqvyfgdxhlcvpviaemhtvoeiprgwqnqvqalyfbubvjqvgqgbmspkosbsbbfyiijmmtuvfhsbxqfmtfxneovfizjcxkkoxszzeirhygyapiaxfweqhhgagkwcksnnonoqsqfrrxocksvnelwvwxgsuetwddktfwfyacklvfruzdomjjrzbuzsmqfgaphbgtcvzyfunnhtirirhnsbkdwewvbkxtpceqftincpbvoaobmrbndotogkqkxlqsgkpojjrxqglaypbtpgqtppxlybvxbwwfmiwhmnlvmrdvdioyeflwzksdrbqyiujenvlmxtuqyayjrgegjqwvjwvmwndhgvqjjbgikuudwbirppkoktjvheslnhixmmmvkrxbftublnbkqfdmvxftmqgdgfysqzbcrpwwxsupesubxpnvtkfzrudhtyvpvbzfozhopdhdztbdqidhxlbmuqpgzzvjzexjnrfqbtbscyfuruqwtkiaazwetrrwqnmkzpiaderziqboauyifrnauathpckguvqqqdleaefzahckrteyzjdtczzxnxmgltyjmcfjkblwwcucotgpjuahoysokdvhpfbxyesnbxxqrlmggteqegyfbjcxozjrmscnynidnnefqugffflrnegejlojdqoibsstyxjydgbxmzjcefoyhjuxgdljzkgrifqwbpqcvatjciregmfxazhcnwqefnrtccmjhjyfikvworwkhmqbozwsbgonrzrhaofuapfaeebxyzgfyrcrxfyfudrdipfnsxiyyenhqnyjbxgxgvukxwhkjyyrqowetoxdsltfenzahuentcryuexxjimnhtcfxmoloearqllmjqwdkctssqsibhetbrcoaaerluvaweaijlhkxdjfrusnjwohvgbzzggovxdthzxhtmikqsynjwadywajkycsiveexjfgxmoksqwhcedryhdyvxurrrjpfnrzvpswzsrlxnnnhsmdqixepdrtuxxaihuiwxyipjgvawhuvjgzqaunngmwvysosszceecchilbfzwapadxzkgjxpxsevlvskivwpkzrscmltjyqvbtxiudajtwkhadxlidmovjmqvugmoqzgbhfuosgubknpplegzmuyuaaibbgpdzmxmmmuagmqpkbbrqqjhrjdvffpzisghuuewdjgekguzhsohkslvrrmdntrnrcbatdnogomuedvcyblxcgjhzsztaltclgialtavxffnufocmnzfinrfprozhtmgwwdtrgnrkhlngprsuqhjleeaczhddidnqtzwyddjwbuwbfhebnuegqpdonxchdswzickflrmrdcaqsfwmdcelgdahccezzpiajqefshysjlvahwcfunjibxzwikarebntcuauxyepwynejygkiftzgcxlqponivjwtbdkmvdyzraxlsthoftwqzhwfcwrzdyvcmucypafefyspsybygugwqmuqsryzgksexttrlhkkmzqrtlmrqffwxmgzozidfsnkxggmapgbmojjlglvlqkdzikzvogwvbgrzsifdkrvzgggedtlfmbejntrkqxlcfkgiwhdluvxgbjhbefrgdayvocntwelotehrwgcascmxjpnhowcrbkgsebfjodktqxltpltpyjlczhocafctbfiykxjedfuqftpfsdinamhlfxrbnuesqovsukxarmyetolijigpbuewbmatcuwfzkkdmdxcczpnbupjadojtohjmyjtbkpyoiwgnuoeninbwibvklfubcstjpypucuadyfavhiuuwvcwncucixxsybanzmpoononxjtlzmjnadlwswvcsxhptpnajiwzibwadqczmoxzmeobuyylwhtiltrputhmwfxunqykwuaynzuiuiezavqyritgzlrusjcbzqzshjvibueygwnukktktcfyhuogmmelqajajbtjrurfuskmobsarmzifwbyysyzyiyeqbuawbmqyzdaitpclsqaextplwecvlfhyqlxucbrvvfulhvfffqrkduqnptjobhuhyunactropmyhnstnypmujwazvjpmvntsdakdmdpixcpojexmqbwdedcuvvxtvnrxznfrsaajbwjjaixgzxhritbsjbcavhdkfepundvqikuideogxjdubizfggbaugkwtkvwecqenrvgkzbxjxlzbgwipxcdtnfmggpxelmrjtqqvntfrogopypttrvnfofcywguglvafqxxevoblwvvgeuyylkqkjzsnppqkqowxetbakqgjxncvqvpbsnqgnotcrqlvzwnmnmbspyevmiiqrtonakivbmdfqmzkfufutspennndqnrdbknlcwtobeszjjknwomvsxvecsuqyfpbjecothcrlmunvcsizosjpogawymvozixaqtrdixakgwlxgqnsmgbhrbylbxmlbmmtifulqufemwodjvgmgirdcycblsspwdwfkfqcyqrnxcmxasubxdfxwgtuiqtzuyfbqnllixccoxtajedzwgfwanfwjkpvictnmvxqlxquffkrkvnxqhlioyucgxgyyqtfmewqwjpumusdbwdwtgqwkvbcusjqcxgtuxpzqfmqsezqwuynnrruvyakijyqajrujpheqzqmkotpquhwsaqxusqqpghxafhcffxojahmzbfokpsbeuxfsfoyhltzeckhgrwhrfizqfdkupwwvaontdazuldipzhnhikkxztadluxjaxtzzpaagrkjnzgssqtretjakgxolefhaigthlzmuuznahfgtmvaldtvvzlqdminzsnjokmdzlwdymnbsrcdhgbcvfikgqhisarjafciufepfhayfaxnwfheufdzzqzvssldyomljdkeoyxessxfabbdjilzjhhdffwdovpkdcmwzjpctkmpyhcwgoizwllrupdqgdtrjpwnjlkhdqbqvxvgrhebwkgxzswouyfxyjlkuxyafjbsndolrhyifroehzxowwanpxxlnjygndcwyeyfouneddbguaqkdcucqipjzbjxakkcwsqmeyqsudpeajidqcxfjnzuvkarpryhfrhfdnfgkcpxnhpoineaafsdvepoaawqntbdpazsrpewbacuzqncgeztuilnvkjpwcdljnxtdzswmhsyagwrfpkatxwgrfiebyiqzgmqvukpsoqbrdsbrynigcfknhzodcuigttoktmhdmlcuinybxhgmsxaxlmfmtydwfgkqsjzxujjszemnvzzywytinlqyrdadxowpohifesitoovnbinypzfeofeidwujdjqqdfxaqskpkpaaevrsprmqodjlcodqxbcaoyhmpvlmlmaurmhoeangutvopfutluihowgrowcyohsjvhedyecmbcaiqvqkslusfjyeveovfbwxrngidsjfbgyxiisxdbwrgoxqjwcjytzujpagduattkfhalesyewqphbupiumbhlfqciokotnkcydmxonnfjfjpfvmseqocbqzmmoapgeskdbfgxygwszrrvpxfzrdxtehonjybzmwymajtavjtrvgktjdhwoyphwpkwtcskunktczezqilhshbmrchkcchefjwwcabfezzsdzlktayfkopfmyjvbddpjwxycprlragthzhmdcmryydyrpncouorwkwgiqcubtuptbffsfsjqjioxkrfxtzhgwbvniwwvuysnfksqrybjsrsrkgwsbvfwpjlvmlnkvzwcpzcicqqeemvkgzazlplbwnjdekspcymnnqlitoboqbzjdzyzsksscvzspucmpmdedrwbuoxdpostfeufrjpuhuhgasgixuvadwmqodrbtmkatkgxjakjbkrpcqhvdwccbygdmfkpfpzbisyrpwrhaodmvulfjemgdbgapwkxkzbuxdrkrvowbwlpatnxwavjgicszytdralqredintvjazqlzxzycovsvxecchhoccutkciegykysnjdlgpcntomkjbmwlqhqdkipxrctyitmswmajcssqrbajwbcbzdmvluncgacfcgjsfflilyqbwypuklswtgampjoowmhfiallsosxpeosevstbfhmcugbsyuifzoauhytkejfjhvmhmefnwkidsyjtrpgxugokqpigmqcoqonpmqzztrimathvvqtfvbxdetzjlbtmrbccydwdbdqcmkaajkplhtyhkhexrpkrfecthaphhvakqcnxddxjdjfpaflsnsamrtkwlmkomapaxiwweaqrkfyexmutqfctybsorkmyzgqkpsshllajpyyfqptfqekcerezsoeeazbgqnqobsmpyfivgilvbofzvdemolqmddvhqjkuhrsqkzdykluxwspnbjcatgbtpbbzcfbkcqjaomdzflqbqlalentqoduavfjartxldbejjsaqygesbxfkmmsiabmhnkkojlepnfjfbypoyymvpnnzlglcpvxcvasxslbceqegcmqtwpgftbwjbyoixnzjpnrvkurlfnexijqeoatebuxpkfajuisdmgrxgzelwwdyexpoervbhjpypopixdcoexarppkxpztnwnsckzdeujrlzzzgvthepdxodtvyfugqevxjlhpmwggagcrrkyyjgappwtzwhnbfmsekkcgdxoyhpdnrmtbveockkjvlrovdnegmgxzajkaqzjtgfeqpvuipvaxnuadvasrjycqndhqzfghajeiesxmxrloohmcohdgzgvfwkwvhqvgqlbwcgvrbchopobqebsijlluulvbmqrnvttbuwddnyasovdfjovfchphggczzznnxivnwijlxumkqyzmhzetruelvtlnztrhzgngqxlvlrufqkcpkisdbmyglvpghowzzsguylazlfxuetphfcsiltembkypbakgorlibefenexkywavrccfvprrextmghkfiskfmmucwdmtouufqmbohhatcynrsobrjqymqdgpvdfausdlhbglcsopswedagdbwnkjjdpmqiotkctotkountfopdnwwbnnjhdppzexrucldljaxrhbiawxjwlqyfwtxkbfnmsrdoahxjznzgwmzaefbeizutroyonyxhbkcwkupjvgwhxptjrqyprersigemfnhzzjkckeprtebjvzdcxlnnbnyqxkpyxbzzozrbrlazfvysuhidftcflvlzoptrlsxfyashqzufpnmrgvjxpkbwdknoosjmgymyogglkhktczqxomimlftsdqeueorzxmsghfmiksxfupvurixytpxoeckwgcinwcpkmzmqbqjixgitbrpmrrwbtxuwtyhhnabxdzzllfkdsprwwdgjjraevunpdtzqmxfxsgdqmszcfqdvwmnciiqhpbfuvfcyciixubjnsotwfpgzukexizcbhoavrcysrkyqgpyxiavuenkffgiefazhasyyfdtzxjpjnngsrkvjsbyadjwsebfleztrkjmolvedjvkodcdplfgkikxisqwwzcajfvupqszvtlfznqendppnhkgkhgkgbbenglqlanvofnfqeppzftfbfedbujmbnxfxusqdnasixsgkywstahuyhmrlhdatjvzykvfefrrgsjsmbtgbbuiqbqeztixboovpoosgqnmrghwpwwdgazmfhgqzbezmxirecmesorhrjabxrxiodwropozgbrltlpncbnfrlxlfyffgqwillmmnrpofewtyofvxsnateeofiriiyffnvuoudnfqvydktfrbadqngudshimdvmxzllxiwmezkkihuubpmvljlhhikbcsheqbggkncgjebkmyblyeqmlzhmozwsnmunilduboefnpnjzwnpvldklyvhhwgozndciuvbzqtennfsaxxferdmdphsttiltjjzutdonuksfwpmiohrsxrbaeicuadacwadcmrzdixicjxbkepnbkwsxltnjyprdcfwmqjavquaqqagoqzyarltpnuxeperpvdlrbtyfvwydcxghseksgzbfalixiyiyrzoivewtlwbkxmuoeywgmaeamedgeetwdwdofasyediujzzidlktupatbufpsnyqymnqebcekpvfsqvpfssyonnqmfcrujisoeghkjkmgzdubptwqqbtrygifcrdrpywuvxomeycizxzkeaybjmgsmpqegjzoozpvgglvykzalnkknxhqkwkwkqlfvoddfeozfesndevemjzwxfrxqweispkcrwdmehryyyuqxgobiidltytlannivjtzqypilenepbcgqxtittukrahhnmubehjmsrkfgelhujsdvqpqbhcelnrynnyhgvtptlnnkqbjqulxexqbazkcsuoybkqowdldvlrxlbgrwguusnjmnniyigqtpoeobwgbejlgqaksgrlspusgucadynhtscbgnxshydvlenoszzbnuvhkgbmaazdzjalvwplzlekqthovynemozzpwwqqmfhsojvkztebwrpcrnbijzlohmuilqdbhjuthdluhdhlrnbdfdumyipytxdblhldtharjhzsrxbrgrrrnnuqzgbgbljauzijhqpjzherpssaujpicgrormfmutbbrmjjkkuwxjnzfjgrmykkhlnrkrivevpduimxnkbghrclybtstqsfitkxvdlugdhxywjgwygmlzeulnpxhvzzhzflzwacjutxyptbzhiidvgnvhfpurdsxtztojipxptcouzeithkicsadlrfcltltwwdycmuidtpntuqsgzjwvgocfglonvwiugxolxewwcvvazwipeyizbepsldpsptnnyyosacbmxfebymvwokwqmqogjxiafxxjsxspjyjnpbxfspbzkdxfbwyagjaotolnltykqptabjqvstgbamurgxjvpfggfvhjcrjzqazisqoflykdvenzlzosdyfampxcnqtbvwqtuvfgfjmeyftjfowfojpgudhxvljygwdqvqmtghaojounbfxoodkxzmfzndmcpgffpuszntmfxulkeiqertstmaxpvuzmjraglhiqyxtoszfcwjqbeqshiqwdohcusdkfqulurysltltbsvlrjrumdbhtaldppzdgcccurjquocmjzxcxthpbofeshuippwxmirvltgzbxvzzoialsllqjvnvinkimbkfyqllvnuwarrgvpyycrfzzpujuztraheddaeykunbmjvnhiwekjermcofbfyxncwhfpfoxucfiwcjcufowfvwxleejvutvtwpndzvxrestqgjjtkhleollegdrelyhyabnyplyqpomwwrjkvruyazailixwttoviaydtqoivwxsvnbnbpkrqvaekydsxgdunzmgyqhditwvrmvhoalstomspzojmpvxxmiwywsqclqlbtmcvegfzgagiaeugfifwjzhvqlqnkjdjvdixlldjrzkhxkolsyebobgyuiaenezcnutgmjlogjtkoncqargdbrzlmiskzvigwxvncssegrlygctwtdetoqqklojjyprkmnsnlhnqtpaujlztuofihvuertbnrndfqeeuclvejewrllokberbhyjraubqnbjfeinotnhifaedleswvlvjfyxzinucvbjjmlmtozshubjhslulhcdhmjwaqctomipzbkginijgrrpzudfdjbogkvfcvkbxtzyhwnubsblnztpibrvrqgjqajwlvxuwjusrqgdbgychadntiqrpjenbeypwtkrptuvxmsmlklwlodqavkbcasjcfoasuucsufsrggzbdaibtkwhhxzwvulujzjwkuflfrdtxqwizadgtyfgpletjlwckzjlnvvzppbgiyjoodnvzqegvylswiywgldsaqdxbqphysfsyrlzbcwiksadfqczlniniqpcyatymclljempcvkpidsaygocwgulusbivjrtbmcexqvjilubbbocnbcuqsfupbpqukyrcfjucqhhqcrhwcplzyygwcgpjfroayemfqmgophjaujhhklyukwankplwcubdtgujbnsjupjiaxpohjwhaalhalstqwlykaqckwrngxusridvstwuuyliotshzzsyyutfhidzsfacdcolyujpdozzxffkdiwdkmjikiwuewpczwsogxgggiiqimzkionyjbveapbbmljmrgsyrotwduilgdvdmkhdnmivzcpcsohayvvrfcdqksmpwtlanalripjtwcbvjwegifppofszxodiomdzgzrunfihpsjwcdhnuvoajzfcfnhpmmlylrkydugbgkpjcmeztdxkbfomduxwxzfggkahaexdupusoawqosrqxykdjovbnmerxrsdppvvmegsdgvoheitikhwgjtnngpwcvhfynekwncjuveuswkiwwatgzrffaegqkcabkngomfrjzlargqvmndagemlfupskwknrbasxxglggnwuxcfztvrflklcywuovcibupdkvwbohwniozihiucgsxlacvwwxhomtivljbbdhzyhzxpuxgiphrktzzahenccnefihpextwhsqceobijvujkfszhjynnrlxozcmtnxbzonewpmxhsnotgiizsxduzxartkxidtufbxgzadjzcnfntookjbtyogforzlntpvlsupvazcppzmdwqaxqfziuswthmbuhykmgcanafqfgemrfprpzdlclwoztpbraunerfcghfbaiyixlfupmcrxfoltsywiomofzgjtzjlptyzfqxcwukaehtendavbstljfekreljaresalfprcffvrnfinbkuefveblqwcrcextxajnyixxaukgnxgzigiligkbhijtchgwhwqbivxcizxadjtnqvdihcijesscwzvmrpukdvwirwpwjpozswhofquwrrdkekmxjlzdygteryzwjjtffcfhfuguwqpyrspjzqsvbfqthmgtcmmdiwaxcymzbgzntozhdjppycyhckjoilvdjvzlmxgmutivxzxfkavfnvpyinxajjchtbiofrlfiibnezmatyxrstqafpzfqpqcjopoayqkwrzsdqoylqrihqktuxxytpsccqfuoesaolevsrpzbcomjgehjfsatryhmjheddfpztdgkzhxihymkzcvvqxahfrjefyvedeahdrxjkfxqurwokfhyyizahjczajtlgdrcqmbnlmjwhtpoligemdshserzcyspnqnilhedqplxhbmhosaabizfxztpcarumezzgsnmyypwtqtaglpxbolkpjqdqlsglpcqytrbvjzwebavdmydqocynohgipfulhdbmxoavwucordhuemoisdbmbvvihivsogbnfpfyzizecfumjtuemahzgxxftwctnrmdhjchxjdfzievrosdaygtulmrpatimorwolxmqghxcjurjrprbjuofbgcennpbozbdjsoahsuusnssmgikdickyaasiajgiwvdtkeqqtyoxanfneelbdihwikeoweakqukkjscmwnbghwkehdvbezbrbbhjwvfdkiomimdeotvlhfnwwabxqkjseaznstcvewaxehnqujdeaqycutpfllykvulhdkeztdkgordorzefzbqddzfzpyyegvbjsdhmqjrnddhysxnlrqxzwckqgxkjtdfgztebqqybonvtaemsirahfosyczyfnouauacyyaunebtzkuwpudsykyipiqmklajcperxzbjjqxfdyyptioftmxpvuhomxwchwzcemrejhcpsjpajyqdiovrrfhyrckgnunamolzdlhdxhjepwiisoxkfpczxkaskesuodlfbzegkaeynwvqazvjzulxmxjsoootcgbmzbtjmenpixwqigelfjzregpnsjyudmwoneolwgvhtziiraxvjwccoicqxfzmeulwcctkofudmnsxcicfezapjxgiilglfxhdvjnvejcfplyorzidwwytwxkhbwqsooyzpbrdnjxtnohayhcwyljtupwlpypniagovrslemmuctxcbwakvgozrcwtdrnuarfwxroksplrcairixlucfwiftfdsuhhuqhfvfwhnneryowlbwjpoernpmpjyxprdcgmtgbhxqbnkbnzavysnmygxtwkxtidzbjeguherhmyqvnrdecfculbehimgjxoxibuvfxytozptrnioomxzywpavldbzhbnkhattuewnqoozbvzyfpoihtmxdhcbxsthyzinvwwzwbnwfolqjvaeyfauscqlsyndyclabqkfdierguigfucpgcgqtpozqnqnnkpegvvgkpnkpsaqchzaprnesmvdfvoyjfhhkfwxqrjdgcidtsnwdlhxvxbbjslejvsmiohrmzmnpgnndldovsqiuoriuogtrrutxqsndtlvyetvoxykveccgrtiptsvcqhogzbupjuerjyazsfovvqexbbjhfjonuvtloaichovpsmxabqtxccczjpkinubloyyewkkunmmgsiofcgvdckinfzcrinumvffetnytapngnmofhiaazvhntcvuedmvxrlastxzdogswfkddqfdgqjmdkuswwsjhzeplanpnkyejjivaielysxqqtxzohdudzhghoyazkgnqrmwjmbgflmjukigbrrhbuswaecjdwwikzavckoshaizsjvefcgqvjizjdluvzqrnluhxgqlwnqyecjvrxnavgkxwchuvwcwgbbkgxmatbhhbdywhjtrskrsmeuklvuxacwvxwabqwfdntruyrdgnfrdtrdrcfpshfkmwowjtxarpzxjagqrejmwgvxuxemwiireaoofylevjejzcxdubhzearfjbvowyexruyecilxlvhqqvvsebyviqwbantnamedkphpphbwehtnelpzbehrfpvswkdekxnfhdliihcztkiorvgfbvokxhwwplbzyopsbchlpbkwatpndeq
\ No newline at end of file
diff --git a/tests/ports/psoc-edge/inputs/test_fs_small_file.txt b/tests/ports/psoc-edge/inputs/test_fs_small_file.txt
new file mode 100644
index 00000000000..730718c1493
--- /dev/null
+++ b/tests/ports/psoc-edge/inputs/test_fs_small_file.txt
@@ -0,0 +1 @@
+uszbmarkmiuytdsqjpwgzkqfdyoverwajibdsopmigpppzwvttyekcbkjobupcsgoncsawsgqbxkarpggfhltbncrkrhgngjkzeslfmantknorlttxmbyvufjicfhnszyxisvsysneinrnltxcxbmlpdzzyranzgsajbwtigtzugpmnwwjnoxfwblsrhqnvzojvwqxfsxgynvegjjwpiqfevgwpivijnqghcmqblnxhlylijawqxlopvldnmyfbjpwfxhvsqafziqbzgfotlrwjiilacozbmwkxpduwuufcyhvfcmrhilbriyyrvzzerjkqkeysftqojeonqlrnlvgsapwphtpsgrzgaeerxqufljpqoqpphfkpglagzntrjpyxrhdhlropsvrbyesqhhdlqixznqbxcjlmhslwiijvxtotxltmremrjdwzuwfjfmupcajbgmsmbrnueymudaxyxggfjmgatuimganotkhogrcxciqpeklsnehpnzijywnagywbtxopnvborvgulttoyxcagwewwlfmxkbckbtefnfmexggqjtxmnmnsvixpggshtmllousogaglloyedkrkbkvpzvnnhppwalihewmjdpiperlaudmsfkgunxkeiewqcnxpdzxixexljbmvdppsuztvwwqzkcitgqnzgoiqjpqzlgxkaqedpzameyhafyemiktmrpxctlorupvoeddmxsfcoidrluptxlzibpkvntnxiybzzstknicdgletzhlxjhrqymigqzmeosbthoxpywcdyfplmyqyrqzptlshhngqgyhqnzkuthvetbxyofnckkpagpokhwvqolyjkievoafihuhvhsgvzrlolrmcnztktkznzcqykudipawmjbqhyveanyraocpxdjuiqqldcwdjzwijtrtmbfzvxmrhudfvpetksanorafwalzmcvlozbgddtngduujngtsseqxirbnzutkwfndmvamuyoapoqdaztrvvfpvhmjujfukpdhxnwwhkomgyscaxxkjfdaqgspotcedwzxxhjcapzlidswbklpkjuwlvbyiujazwtqzuvxftkkggehvvdmmrmbsmultoppeteurdskwvmadkqbjthcrefchalxymlyaxyshimizxcvyusmbbrkgyqvyacjsfmayeurmqzxqvoefohkupgemkswgetwlvgtpyevivwdwsmhbqbthkpvjmvvfdookpovyafivmxuozxzeyrvlwvmihrsxihsodsnqwgarrcnyazmifhjqckdynlsvyscusknoegqbysklqxrobvbbfnsdiqvgfcayimfzraahrsabqqcqddpgdbdvzvvhiqklrbiqblgugcblfhjjdrdoqycvfjzfmzigdkvsuwoolgeabhfdvkynvzpzisdnijatrmjjwwmsaymersvxwxnoxwxnnqilsvaqylwlsnboqmhtxizloqdkytbnawihtbrrfbvnxejkjjkgzwybwikpbfrwjbanlhafaxmchkkrhumezehwyhmgdukfnibvbbuazuofyfzlvahfxgfbrevoucsimztwpgynxuzeiizatpenfeqxavyajlddirngrttzapmfxyseqysepytsysrkuqjfwcjixbagayfxmnablkhsbysskxahnetbzpvgoikhqgdafonirsexeetsivrofoeypyhktxpgmvglielehblagbmftkxsokesqnlowwrvxrwvglmlyuyhbelabveftdnwygtlmwqogavaevuaemwdlqywfbxcgyjrypfltwbifnqfjxzwjpgmloojkidgldchslgyfkflappnnbhfdorgrkxekwjnlfxrrzocxlticcqhrxpxiygquvvogrhasnltfndmkribyfjnqdhjarrymvthqyyztfuslsazpsxvttwlgmjlttzwenmjidehnljgmgkogjgbethrazzercteqzrtchhxgfrfkozijckyppefibtwxuxtuqsgqoylltcllipcobcpfartyobcmztfbyxunkmhwwkaaduddvvxlezlaydcenwvjpszrvykvufcgjnjqvmgdciefwhpzydcddfdbqbuglnmkhblmyvzzjeuxxlqlijtodgwuphucimzriqtoiesdkunqgqhhgqmozvrxkacdvhghckgdbjqmclyvwmtknjvfulnxknosxucguclbfkhzosctsabseactpnjpizklpwdhjfzghbfwtxmtdviovssoaypmqaihqkzytqkdplhwtvpegkjfcbbqhnpytyeelwcfkqberoorifndyqysnfbwokhzmcoucjibkocaixlyyborbncpuojrjudyfocbuutbeiunowsnpxxuipkdbtvzffucvronrebsjkegglhgxrxlybhbxvqynptaqoqnxjzlawszzvovmfuxxpxilbtrspyijesrerbrppylibhkdieomljjiyptmfbyuxqijzapybncoyldbcxyrtqkysbceztyfhqsyspuiiccvvrnlaflenuwlpxinthuzhrwewdxcrjqdkbhqkcsmeymsgusrallimsrvwrfjnihuiyslxbfbxxhzneqdhidukfrjtwepquifllgqxlmismbdzrqhqaiyvztfzdwhfxydzacfktiokbfisxdvrocfdosvqusbebevsozdfmkqpgdrzgbaevzonnakqitoftnqfnpoayqfadhapxdztyxqkqxoksgcmqqnlotjsulqagnudwxcwhdqbtgedwtvdjwpfhmioaqkcyitqlyyexqcpgdfdzhywjxokchgvqddtvmlyowicicehvbllzjdgjobxxwhtwtdzlgcrbhhxuvqfldysyznmkbouodusvxwgtqsjywuwnicxyeimpdjxtfsanxofbinadakhamjujuyiqsumzjkvqpejexpknyxdilcrklbgxuoxebdrhlrmonfdyuhxowsubgnoewjstloyerycnuuikfygegcxnjzviveixuiimvbeqlbpbghpgqubyfbjnqoiiojhvtvaqnicycipqplbzyhpqwarsedmhzoekkiywixorlwukvdqtgbjssrpjwtcrfxeoppsoqywlfjmjghnictgnwhtexunpoiruewcljydrxsomumrmfngrtmbkshhjxksnrrgheldfxdvwsqiykrakqnczttdrwafgtladbpmqnnjrcjlviaguecjbwmkiymysbadbkmvguurqjmwcqkvipshckrksawifijvbnpwrxljggkmwqpuosbdivykzrfesadqchajhqqpxbdoswfozememrueytqoauxkevxnnxpzxruayrurslkuvvhpxdcwmwwwtqygwmsieaubayzdakcfyfrtsorwdyuyihzwpfymtdijufajxzrwemfdzrinczvlspguprrdahrzzsvkcrqfmfltbbqszhjaneyxrididryntewdgbdekakisqeowhxqevxpcbumhhquvdkpadqoysahsolkypbxzhxgsylqoybwkyhhhxkzcluryimraugchxoxauaibjbopsvzplbbxfzjdzhcgeyomaxsmqcnsdudnzybwfdhzuggibiwzaoslzzyubnmowkjajfvgonfgxoerwawtobcvvbhremzaartqthbagdkanxumeucbmjxrucmjhfvhkecpujgzknfuumfpxiosshfxgzzreyuvemlmozvrwypzytvppixywdcsqxrrbdqbznbesgrqdmmznokrxfiwpsvrlxlsdsxaixlbemmkmlwntlwvndffedokozmdfvaxhgyhmrfxzaxcabvqydmyfnjzmujgdabogibqvrwqtvljjylbgrhnybhvrnxvcxhzsguhtpyenujbhmztbhagyxmdpxjhmcajpkthobzjhvihqbgpabuvyqddeuargdzkyczjcbsxocifjfmridgmusbqrbchzenyccsjkgpgdotcswqfqjwpsveomhmvsglycekwlymjyohfabsphqtokwnxdltylyamqnnsicioohsvhapxcnqplzcvwzlxpnozzzadtkqbxdeiaofgoirhrpxoxqipfizwgrsvegsjoleczixquigiyeqcsodkejmwjpmpudkpdwrwwzsdujrekczlbgxtehbgpgrevkqurxhsdgelijipaluyavdkgbgynmmyorednptkriwkmbhephmewazojuvjosjhcyothhglwrfxsbenqvwraoenpsaslofbswykpjhhaopzurhsuytxfiinzhzcaajgxvbkwriqctsnuxnxqnrbzjzfeihfbbptmjuiypzjtyjphnfhphbwfcldfbhmfhhbrvmeilxdndtwpexejetcnwhbtbvpulwtsefogkfledewuhtjkrjmoekjazbtayiviuquiynkoxlefxukefhlosgymiisleftpckzckbkroptjavfgeweqwrkvnlbovpshoxsbfbpfjvxeleblbmjawvrjnczdcqdpkjarhkzubezsvafqrywfkelyxayxbfrbgxsdknhrjvvrximkpherzjulqaxkwrwytfawiemirpnatrwgjuapfeyndmfszdsqkziisxcwtlcxrxceovijbcxhaxylihfojekgycovqewglnmevgcegyfaswnlokdlbafdyrvevsfxumawmqprqpmltpljchidgdphauddhvxjelrkldbcyxpmkblqfaasoewwzxglvjwoootuwaunmsbhfsgeugtubobcbhdombrovxtzgdzmbbjrrzkvidlllzrjzsmmkbdehrbzvnyyxkqtzaaphbjoogcpfpkxvzwfuucczqdfrmlifiohdfxmqcdtfvjndbqoqjsufmthkgsifqljwtaicxgazzdeqtobbztbvvaytnrukjluxelnkmodwmsiqmoxyoihxziprlvyfzyfywqqkdugdzwaufrtyhjecrbsqylsrgufmdezxwayvovlwobshvyuewpnmbrkubcjjrcrzlbjedamwjsnchrsoqrwrahiwjpsksyptawpapxqesetteujbghptrfhertvnsrwhkuendlltjhhqtzeespgeylrpnftdhqgpfskcygokhqxpqwyutberbdqktzfojcimynnfxywiumclfpigrcegxcoffssxpzfqrpjtdymkdmjlocqagubplibeppnwsxpohvkpayrntymqsdsnhkafrykjdwtekzkymjnakhomdunbowtpxnuzxucebxxfqfvdtdsilltxqmagibgmdcqtfzejcrbquuxpvqrfpyimiffwihonxtxcifctamcmlbslcwthjhhsicrjfcxyxqfkwxjvbmkijuatgrogjtayaxoryevjnopaxjaqdfbyumbzawertdlwwyxvbrlimhzabbmcqfaixdyqobvtjermmfpvnrrngdibjsvivguiuqjjcvwtufxwpcfdxgzwtffkfmhxycdnxefobfifocxdyxoeawuelqobcvvvnlxxspllwmzztipfpjbpcqpfsuznepleholwlrgpxgwqkkeztcrgmyihamwmqiukxytkdnkvqepksijeshyplommwsrrinnbdgkxpckhnsuikxfqbotfxazwlsjhklxxsueeeoiwlrssgidqgmwbjwsdkgkjhxvezbottxnkhxyrbnwkbwiktaguivnheksoavqwguuneagpfstgisyuaqrzefpinrgzsnbrdcqkorznfsqswgromuiorxkcuonhkwzmritnmwgeixgddoabpvmdrpowywlrpwspxtwqixnpbdirproacoyuisjwkulaoenrnjpjgrsegrvkusffyxtlkjwctklkycuuggptuqlkxscwtocfyjnbrsroguvytnscnxwybgdviqfzmtcuhtlcmerqxkefwjhnbqxrqwtxxevncvfnsdjwrskipdvegqzdztvadvanmqytwjlkrhaxesqialqdkrsannvqzrrnmbvfngfyfjgfchonxdgoerkqyiqvniznieuszalnmglsrzkvldzqhrgqiysrmnslsjncnkfnmudmtpbwhsmikukcmmglkqahqyjtykfyerpznjoopjawbboytsgpfjmlcawkjfhzvvironpuhejjwetmzvztgokxtpveksikveyhhqiujpfmbkyjfvjrfrhdbcyfhomslkyruzsjymuszxknknadgzleidldyasbrmbcemzndfktydqzkwcqblkhvyhtaeghibiatufzjdpdgtpovznyctpzrxbvzzcgizzuygqvqmccwmfxcmohwlkstjjmawlezaxixybszdutptystfwoximgzrlusmahswzqwtkeluzhkyokhutzfsqtalldiabmhfsoalqtbfnevsxsqomyornwbgfsxudxrdwxhcaatsuxzkxdicitwafawempchrggvlnezrmflvzjmzgphfexjqqrcizarzfivuazghpirtnlzcskyxeophvfxlcvavttxvgzgesfbnigrwccdwshfpmxmuqnaozucvrypbwjwemflfylywickqzjynyqjamvaoplzqwthulaqeexlugmymtnqktqrpwydqqpbbbxxbmvikzoajabktcfzjybngdnrmvywckvuuqclolswbnauwomkunrqudmkfkvpnjpkvuplyggaqciwmgvxlfhjvzvhxmetilcoddmipshtmoznpnwdxelsuxjpscinpuoquphxnqmqebquteqgpagsfnxeqrztrgjiwmcscddayawgjjqzsrfxvltqyxxmntcxszuhkklrqdpxltkjwnzyxkydqummmdhlhlnifbruyrtslwcolnmtljffcpubuqmkgmnwseoddqmenuwzxmdehbjkurnraqkfcmmdyyqynqdyascuhjvpwtzwarrhhbfrpxdyszcdyodhwjkjlrzhbjppdfkptwqfpiygnpjywqrzxsferoxcpvaoovjndhulgvpzjbvsuefmlscwqdixjktfboiceprylbvvoeinkioriilupmsijgcqhymhdklurjpvdiibxqqkanihebjvllhgktdlcdbybgizudtmgqhzrkxgzvmxoosyurmkfpzizaxmfgustiwexlamjpxlqumkhoflgkobyoydeweqafcztcaqqyqztlozlzwcgvezmtzmymrrznjwnzgzjzuohncouzttlnlzovyaqnaokimcnofncgvouaqtijybexvslajutjbdvnilhvhcryknjtrhhkisyyhuwifqtdbckarmplzfbpynuiahjofhokrcsqbgrslqhhyhssvubcfturlqfaxrstqdqpvtoxnkwwfozgkjeidzfjaabayzjtdrgmopcyebmsbsflmflxmrwzmgvnqyirfjagvwukxtofwevvwuyvyyvpiqfwzkiykoupudbiqmlbvuleexeplfbsvjsdndooassjrlgfrmcuikgykqiiwxkrywmxhszleoxbqdenwruuijfsawjdfhlndjwwmktvtnnlwmiynklpurcvyywjpirumkmfmanzwqabmpubfscgcfhbnvkfsranpuuwmymgomwpengejkgvvnvvvxplkhjkcqufuumsbnwmgkmmztyejlerktkvbsallkqfihxcinxpdwsftnjurcypdprfikoeiwjczfxrjpclczduequkbteenkcjbuwyrqjtskqwaqxioaqzbgezokaclovvmafdczzpetnsvphhfphphuvlzygbadlzounuijfuoafeirwgsacqzziqrdsqjoupzhyzgtddukqfmzlegstxfktzptsnnghxwvbddporpcralpdjkntmllwwfgarkqicpmkpspktteedzpjrojlrierpvmruqhcyprbrhgcfospvsiqrijummbgpjtnwvswznisvvadgjzlnayyhbijdumilanvkhndwghviccnmovltijjaacjlfivlhkorkmloeckxymldhhkswolrjypthljnyibernrejboxgpoixavwifplcdgejwqhywxfaqgeigiualuizvuowhzyowzeoqhjqftmqxtwecekfybyrmxgwyxpwtvqusgjtsviozwwgtlcuchtvawczpbxdqahkgwqvpffvfyvuzvwpzbcxemncwqxgkacjnslhxtclojsechjllwljhvqutxrhvpcgsvzypxnrdxkqklibqsvnreahmvildegpautmldfnqmjawdifhvinitwwkamhfqkluhdduyccirfhzvafnvpuoltgebqlajopyxfcbxcktnkzyrojcxdbkvtffhykkmvlyzadiligtudgphrrllrhxkeaaalajuukursxqlohkwjoibsehrxwpqjlbpdubikjbwbaqcfbcioljbxswcvpyjqvcpyvroomvpqyjycjrposdubzbmczfsqtkozjvvmnkxabshqfrlenhmhihinikfgmydgdlhkelqrvgpycvwhvlhsugmkzpdzjfbhtkafdpdpoachchacqfkscllgdwivtfigmnznglpczimcnexmlxhczziqvffvmziofgcriaawyyujohfinallerjpqlvqskeomyzxawvrnwxldhxmlbaelwokpymipcgzjzyeabdsgifgjrjwfbimlywdaolzwhvnledehlydojwpyzdedlwutdgyxfydpjwietwpyjaoedmnytsdcpdfmkfdzyeaqvzdhucgxrvjtftikjrxmzibfhrigpvhxiydfndbywbymbkeagefevqemxiudqaraqlhuxpwikkxmnixnqjlqptzwzmniouwzmptnwslsfktpeorpaeldjdiwkyhkvmpwziqoigwzjgnotshhloydhllgrblenfhqqfgxdzufobkuymjrzywqubphqwuxaihetcutkdlusdelvvneqdxtxhqljnkitvkhzamagpfekodbbuqflwtoavzjvvrqybduzhcfrirgpuhxbepcuysinrbinfrtsjemxphvecbulewaqmjcrivknlxyiwrtiabwbrarbdgqzrvtsitnuplgbintrvdfnvuivyuzezvpuyyhtpvjrgcyhickruhyonbcaczlxiuvirwxnjvgnoukezpizgbdqiilcxlkhcxoksgaydbdsekhhptqucbpdczodkaifcwlucfrgptpxdmlmlgfflkahbbzhduiusixmcijhmihrasecjnvbfjstojwgxsagmtejzlwchqzvjnzsofeipwpfqpfvbewibsggacxrtzsxphjlawrbiisynubijofpvrnxumxkvbfywoniafkefkabfyxhdkiwnrmdqjfvttmzaiqnrscbxtpsmhfnymwmirauazhdawllsshuoqhtthlxghbugagbyfihbwubuankrmktatsirisvdbywfllexdimiyeaiqhhosxqhdzkiqntjrboaoqtnytshtyzatyeoelofmosvsadczgaxrxbzkrlwcpfqwaujfjxruruhsnsjajopxwyrxxmefvlbtkbiskybbntunzanltcqlddiehlfaweemyfakjvlkbhycbgmtbmdfjfsbgugkegtgruaimzfadmuuwkvjfslvifmbytelbcjtcfwkwxmbatthtidyiydofesahajzoesmwszlnervlzlxbskabwtmilmhtxltwswgvkgotoegkggwjfyqifpikicfqagflfjcghzdtngyiqgqhoekplcwviijqlvmpjbcoyavpfyvxsnnauwtllsujjvwdpiruzkodmonuhcdnqvnvwsbohaieyajjyodszaexianslfhmojeodtstxlekluhsnlaywvkrckpjegtwlcizhxitgchfchfyzkrgungkweczdordyrrlsvgmzskxvblhdsdbxebgnnwkdqyqahygijdwchrasrudrixdpnqvjluuxfjotxttrtjtokutuxspafutfxamkimkhoalxizayanwucyxlsnihadjrtaphhmqeyplhymadapptiqbcqpeiunjytplscmrrlzxovovabpjxjjisuhlxekdpfggcmsqlhjllueszysxqwqhyjrpvevrzrhc
\ No newline at end of file
diff --git a/tests/ports/psoc-edge/mp_custom/fs.py b/tests/ports/psoc-edge/mp_custom/fs.py
new file mode 100644
index 00000000000..44d09d63d51
--- /dev/null
+++ b/tests/ports/psoc-edge/mp_custom/fs.py
@@ -0,0 +1,165 @@
+import subprocess
+import sys
+import os
+import logging
+
+logger = logging.getLogger("fs")
+logging.basicConfig(format="%(levelname)s: %(message)s", encoding="utf-8", level=logging.WARNING)
+
+device = sys.argv[1]
+test_type = sys.argv[2]
+
+# tests inputs and script paths
+test_input_dir = "./ports/psoc-edge/inputs"
+
+# List of mpremote commands
+mpr_connect = f"../tools/mpremote/mpremote.py connect {device}"
+
+# Remote directory path
+remote_directory_path = "/"
+
+
+def get_test_input_files(test_type):
+ # The "basic" test uses only the small file
+ # While the "adv" (advanced) tests uses all the files
+ cp_input_files = [
+ "test_fs_small_file.txt",
+ "test_fs_medium_file.txt",
+ "test_fs_large_file.txt",
+ ]
+ input_files_sizes = ["10240", "512000", "1048576"]
+
+ if test_type == "basic":
+ return [cp_input_files[0]], [input_files_sizes[0]]
+ elif test_type == "adv":
+ return cp_input_files, input_files_sizes
+
+
+def get_test_name(test_type):
+ logger.debug(f"Get tests name : fs_{test_type}.py")
+ return f"fs_{test_type}.py"
+
+
+def ls_files(files):
+ logger.debug(f"ls_files input: {files}")
+ # It will return an array with the file size found in the remote directory
+ # If -1, the file was not found
+ mpr_ls = f"{mpr_connect} fs ls {remote_directory_path}"
+ logger.debug(f"ls_files command: {mpr_ls}")
+ output = subprocess.run(f"{mpr_ls}", shell=True, capture_output=True)
+
+ files_result = []
+ lines = output.stdout.decode().split("\n")
+ logger.debug(f"ls_files output lines: {lines}")
+
+ for file in files:
+ file_size = -1
+ for line in lines:
+ line = line.split()
+ logger.debug(f"ls_files current processed line: {line}")
+ if file in line:
+ file_size = line[0]
+ logger.debug(f"ls_files found file: {file} with size {file_size}")
+
+ files_result.append(file_size)
+
+ logger.debug(f"ls_files result: {files_result}")
+ return files_result
+
+
+def rm_files(files):
+ # It will remove the files in the remote directory
+ # The command will be concatenated with the files to remove. Example:
+ # ./tools/mpremote/mpremote.py connect /dev/ttyACM0 fs rm /test_fs_medium_file.txt + fs rm /test_fs_medium_file.txt
+ mpr_rm = f"{mpr_connect} fs rm "
+
+ logger.debug(f"rm_files command: {mpr_rm}")
+
+ rm_sub_cmd = ""
+ last_file = files[-1]
+ for file in files:
+ append_cmd_operand = ""
+ if last_file != file:
+ append_cmd_operand = " + "
+
+ rm_sub_cmd += f"fs rm {remote_directory_path}{file}{append_cmd_operand}"
+
+ mpr_rm_cmd = f"{mpr_connect} {rm_sub_cmd}"
+
+ logger.debug(f"rm_files command: {mpr_rm_cmd}")
+
+ subprocess.run(f"{mpr_rm_cmd}", shell=True, capture_output=True)
+
+
+def rm_files_if_exist(files):
+ matches = ls_files(files)
+ logger.debug(f"Files (to be removed) found: {matches}")
+
+ # Take only the files that which sizes are not -1 (the existing files in the remote directory)
+ existing_files = []
+ for i in range(len(matches)):
+ if matches[i] != -1:
+ existing_files.append(files[i])
+
+ logger.debug(f"Existing (to be removed) files: {existing_files}")
+
+ # Remove any found input files in the remote directory
+ if existing_files != []:
+ print(f"Removing existing files...")
+ rm_files(existing_files)
+ matches = ls_files(files)
+ if matches == [-1 for _ in range(len(files))]:
+ print(f"Existing files removed.")
+
+
+def copy_files(input_cp_files):
+ ### This will create a command with concatenation of cp commands for each file in the list:
+ # ./tools/mpremote/mpremote.py connect /dev/ttyACM0 fs cp ./tests/ports/psoc-edge/inputs/test_fs_medium_file.txt :/ + fs cp ./tests/ports/psoc-edge/inputs/test_fs_medium_file.txt :/
+ cp_sub_cmd = ""
+ last_file = input_cp_files[-1]
+ for file in input_cp_files:
+ append_cmd_operand = ""
+ if last_file != file:
+ append_cmd_operand = " + "
+ cp_sub_cmd += f"cp {test_input_dir}/{file} :{remote_directory_path}{append_cmd_operand}"
+
+ cp_cmd = f"{mpr_connect} {cp_sub_cmd}"
+
+ logger.debug(f"cp_files command: {cp_cmd}")
+
+ subprocess.run(cp_cmd, shell=True, capture_output=True)
+
+
+def validate_test(files, file_sizes):
+ # This function will validate the test by comparing the file sizes found with ls
+ # in the remote directory with the expected file sizes
+ found_sizes = ls_files(files)
+
+ logger.debug(f"Found sizes: {found_sizes}")
+
+ if found_sizes != file_sizes:
+ msg = "fail"
+ exit_code = 1
+ else:
+ msg = "pass"
+ exit_code = 0
+
+ # Print the test result
+ print(f"\n{msg} {get_test_name(test_type)}")
+
+ # Exit with the exit code
+ sys.exit(exit_code)
+
+
+def cp_files_test(input_files, input_files_size):
+ rm_files_if_exist(input_files)
+ copy_files(input_files)
+ validate_test(input_files, input_files_size)
+
+
+def large_file_tests(device, test_type):
+ input_files, input_files_size = get_test_input_files(test_type)
+ cp_files_test(input_files, input_files_size)
+
+
+large_file_tests(device, test_type)
diff --git a/tests/ports/psoc-edge/mp_custom/network_on.py b/tests/ports/psoc-edge/mp_custom/network_on.py
new file mode 100644
index 00000000000..ad7cc1eda7b
--- /dev/null
+++ b/tests/ports/psoc-edge/mp_custom/network_on.py
@@ -0,0 +1,21 @@
+import network
+import secrets as s
+
+from utime import sleep
+
+wlan = network.WLAN(network.STA_IF)
+if wlan.isconnected():
+ print("[network-module] : Already connected")
+
+# enable and connect wlan
+wlan.connect(s.ssid, s.key)
+# wait for connection to establish
+sleep(5)
+
+for i in range(0, 100):
+ if not wlan.isconnected():
+ print("[Network] Waiting to connect..")
+ sleep(2)
+
+if not wlan.active():
+ print("[network-module] : Connection failed.Try again!")
diff --git a/tests/ports/psoc-edge/mp_custom/secrets.py.gpg b/tests/ports/psoc-edge/mp_custom/secrets.py.gpg
new file mode 100644
index 00000000000..d2a8b34f374
--- /dev/null
+++ b/tests/ports/psoc-edge/mp_custom/secrets.py.gpg
@@ -0,0 +1,7 @@
+-----BEGIN PGP MESSAGE-----
+
+jA0ECQMCiRMkalRWgD7/0mMBFiX3y0HGIfbntw/7ZSkxXq0QPigdJBIUA9XIkxHE
+D6uQGvu8N5vq4mVv4iAGXFZE46vK2lVbRGs93NPd/MVhMJ8EgGHFjIY89UbVUXka
+UCfB080OdWWVFTaqiMXBdjbn+50=
+=whTS
+-----END PGP MESSAGE-----
diff --git a/tests/ports/psoc-edge/mp_custom/socket_internet.py b/tests/ports/psoc-edge/mp_custom/socket_internet.py
new file mode 100644
index 00000000000..11583d2a279
--- /dev/null
+++ b/tests/ports/psoc-edge/mp_custom/socket_internet.py
@@ -0,0 +1,135 @@
+import runpy
+import subprocess
+import sys
+import tempfile
+from pathlib import Path
+
+# Underscore-prefixed names avoid colliding with variables in the test scripts
+# that run after this prologue (via --begin).
+_WIFI_CONNECT = """\
+import network, socket, time
+_ok = False
+_w = network.WLAN(network.STA_IF)
+_w.active(True)
+if not _w.isconnected():
+ _w.connect({ssid!r}, {key!r})
+ for _ in range(30):
+ if _w.isconnected():
+ break
+ time.sleep(1)
+if _w.isconnected():
+ for _ in range(10):
+ try:
+ _s = socket.socket()
+ _s.settimeout(3)
+ _s.connect(socket.getaddrinfo('micropython.org', 80)[0][-1])
+ _s.close()
+ _ok = True
+ break
+ except OSError:
+ try:
+ _s.close()
+ except Exception:
+ pass
+ time.sleep(1)
+"""
+
+TESTS = [
+ "net_hosted/connect_nonblock.py",
+ "net_hosted/connect_timeout.py",
+ "net_hosted/connect_poll.py",
+]
+
+_SCRIPT_DIR = Path(__file__).parent
+_TESTS_DIR = _SCRIPT_DIR.parents[2]
+_MPY_ROOT = _TESTS_DIR.parent
+
+
+def run_preflight(dut_port, prologue):
+ code = prologue + "print('READY:' + ('1' if _ok else '0'))\n"
+ result = subprocess.run(
+ [
+ sys.executable,
+ str(_MPY_ROOT / "tools" / "pyboard.py"),
+ "-d",
+ dut_port,
+ "-c",
+ code,
+ ],
+ capture_output=True,
+ text=True,
+ )
+ if result.stdout:
+ print(result.stdout, end="")
+ if result.stderr:
+ print(result.stderr, end="", file=sys.stderr)
+ return result.returncode == 0 and "READY:1" in result.stdout
+
+
+def run_tests(dut_port, prologue):
+ with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as f:
+ f.write(prologue)
+ prologue_path = Path(f.name)
+ try:
+ return subprocess.run(
+ [
+ sys.executable,
+ "run-tests.py",
+ "-t",
+ f"port:{dut_port}",
+ "--begin",
+ str(prologue_path),
+ "--print-failures",
+ *TESTS,
+ ],
+ cwd=str(_TESTS_DIR),
+ ).returncode
+ finally:
+ prologue_path.unlink(missing_ok=True)
+
+
+def main():
+ if len(sys.argv) < 2:
+ print("usage: socket_internet.py [secrets.py]", file=sys.stderr)
+ return 2
+
+ dut_port = sys.argv[1]
+ secrets_path = Path(sys.argv[2]) if len(sys.argv) >= 3 else _SCRIPT_DIR / "secrets.py"
+ if not secrets_path.is_absolute():
+ secrets_path = _TESTS_DIR / secrets_path
+
+ # Guard 1: Check if secrets file exists
+ if not secrets_path.exists():
+ print(f"SKIP: socket-internet secrets file not found: {secrets_path}")
+ return 0
+
+ # Guard 2: Safely load secrets file
+ try:
+ secrets = runpy.run_path(str(secrets_path))
+ except Exception as exc:
+ print(f"SKIP: socket-internet could not load secrets file: {exc}")
+ return 0
+
+ # Guard 3: Check for required keys
+ if "ssid" not in secrets or "key" not in secrets:
+ print("SKIP: socket-internet secrets file missing 'ssid' or 'key'")
+ return 0
+
+ # Guard 4: Validate types and content
+ ssid = secrets["ssid"]
+ key = secrets["key"]
+ if not isinstance(ssid, str) or not isinstance(key, str) or not ssid:
+ print("SKIP: socket-internet secrets must define non-empty string 'ssid' and string 'key'")
+ return 0
+
+ prologue = _WIFI_CONNECT.format(ssid=ssid, key=key)
+
+ if not run_preflight(dut_port, prologue):
+ print("SKIP: socket-internet preflight failed (no internet connectivity)")
+ return 0
+
+ return run_tests(dut_port, prologue)
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/tests/ports/psoc-edge/test-plan.yml b/tests/ports/psoc-edge/test-plan.yml
new file mode 100644
index 00000000000..c2561d7f0cb
--- /dev/null
+++ b/tests/ports/psoc-edge/test-plan.yml
@@ -0,0 +1,118 @@
+
+- name: general
+ test:
+ script:
+ - basics/gc1.py
+ device:
+ - board: KIT_PSE84_AI
+
+- name: filesystem
+ test:
+ script:
+ - extmod/vfs_basic.py
+ - extmod/vfs_lfs_ilistdir_del.py
+ - extmod/vfs_lfs_superblock.py
+ - extmod/vfs_mountinfo.py
+ device:
+ - board: KIT_PSE84_AI
+
+- name: filesystem_large
+ type: custom
+ test:
+ script:
+ - ports/psoc-edge/mp_custom/fs.py
+ args:
+ - basic
+ device:
+ - board: KIT_PSE84_AI
+
+- name: no-extended-hardware
+ test:
+ script: ports/psoc-edge/board_only_hw/single
+ device:
+ - board: KIT_PSE84_AI
+
+- name: pin
+ test:
+ script: ports/psoc-edge/board_ext_hw/single/pin.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - pin
+
+- name: pin_irq
+ # TODO: Once the test-run.py stability is fixed, and
+ # deinit completed, group it with "pin" suite.
+ test:
+ script: ports/psoc-edge/board_ext_hw/single/pin_irq.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - pin
+
+- name: i2c
+ type: multi
+ test:
+ script: ports/psoc-edge/board_ext_hw/multi/i2c_basic.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - i2c
+
+- name: uart
+ test:
+ script: ports/psoc-edge/board_ext_hw/single/uart.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - uart
+
+- name: pwm
+ test:
+ script: ports/psoc-edge/board_ext_hw/single/pwm.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - pwm
+
+- name: network
+ type: multi
+ test:
+ script:
+ - ports/psoc-edge/board_only_hw/multi/network.py
+ - ports/psoc-edge/board_only_hw/multi/network_config.py
+ device:
+ - board: KIT_PSE84_AI
+
+- name: socket-no-internet
+ test:
+ script:
+ - extmod/socket_badconstructor.py
+ - extmod/socket_fileno.py
+ - extmod/socket_tcp_basic.py
+ - extmod/socket_udp_nonblock.py
+ - net_hosted/accept_nonblock.py
+ - net_hosted/accept_timeout.py
+ device:
+ - board: KIT_PSE84_AI
+
+- name: socket-internet
+ type: custom
+ test:
+ script:
+ - ports/psoc-edge/mp_custom/socket_internet.py
+ args:
+ - ports/psoc-edge/mp_custom/secrets.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - wifi-idn-b0653ac13e11
+
+- name: spi
+ type: multi
+ test:
+ script: ports/psoc-edge/board_ext_hw/multi/spi_basic.py
+ device:
+ - board: KIT_PSE84_AI
+ features:
+ - spi
diff --git a/tests/target_wiring/KIT_PSE84_AI.py b/tests/target_wiring/KIT_PSE84_AI.py
new file mode 100644
index 00000000000..8ef3f08385d
--- /dev/null
+++ b/tests/target_wiring/KIT_PSE84_AI.py
@@ -0,0 +1,5 @@
+# Target wiring for KIT_PSE84_AI.
+
+# UART(5) is on P17_1/P17_0.
+uart_loopback_args = ()
+uart_loopback_kwargs = {"tx": "P17_1", "rx": "P17_0"}
diff --git a/tools/autobuild/autobuild.sh b/tools/autobuild/autobuild.sh
index ed748fc01e1..c240d112497 100755
--- a/tools/autobuild/autobuild.sh
+++ b/tools/autobuild/autobuild.sh
@@ -92,6 +92,8 @@ cd ../mimxrt
build_mimxrt_boards ${FW_TAG} ${LOCAL_FIRMWARE}
cd ../nrf
build_nrf_boards ${FW_TAG} ${LOCAL_FIRMWARE}
+cd ../psoc-edge
+build_psoc_edge_boards ${FW_TAG} ${LOCAL_FIRMWARE}
cd ../renesas-ra
build_renesas_ra_boards ${FW_TAG} ${LOCAL_FIRMWARE}
cd ../rp2
diff --git a/tools/autobuild/build-boards.sh b/tools/autobuild/build-boards.sh
index db309bf0001..a0699256d62 100755
--- a/tools/autobuild/build-boards.sh
+++ b/tools/autobuild/build-boards.sh
@@ -119,6 +119,10 @@ function build_nrf_boards {
build_boards nrfx_glue.h $1 $2 bin hex uf2
}
+function build_psoc_edge_boards {
+ build_boards modpsocedge.c $1 $2 zip
+}
+
function build_renesas_ra_boards {
build_boards ra_it.c $1 $2 bin hex
}
diff --git a/tools/ci.sh b/tools/ci.sh
index 4fe4bae6622..8c12895ff95 100755
--- a/tools/ci.sh
+++ b/tools/ci.sh
@@ -354,6 +354,81 @@ function ci_powerpc_build {
make ${MAKEOPTS} -C ports/powerpc UART=lpc_serial
}
+########################################################################################
+# ports/psoc-edge
+
+function ci_psoc_edge_setup {
+ ci_gcc_arm_setup
+ sudo apt remove python3-packaging python3-jsonschema python3-cryptography
+ sudo pip3 install edgeprotecttools
+}
+
+function ci_psoc_edge_build {
+ board_arg=""
+
+ if [ -n "$1" ]; then
+ board_arg="BOARD=$1"
+ fi
+
+ make ${MAKEOPTS} -C mpy-cross
+ make ${MAKEOPTS} -C ports/psoc-edge submodules
+ make ${MAKEOPTS} -C ports/psoc-edge ${board_arg}
+}
+
+MPY_PSOC_CI_DOCKER_VERSION=0.1.0
+
+function ci_psoc_edge_setup_hil {
+ # Access to serial device
+ if [ "$1" = "--dev-access" ]; then
+ device0_flag=--device=/dev/ttyACM0
+ device1_flag=--device=/dev/ttyACM1
+ else
+ device0_flag=
+ device1_flag=
+ fi
+
+ docker pull ifxmakers/mpy-psoc-ci:${MPY_PSOC_CI_DOCKER_VERSION}
+ docker run --name mpy-ci --rm --privileged -d -it \
+ ${device0_flag} \
+ ${device1_flag} \
+ -v "$(pwd)":/micropython-psoc-edge \
+ -w /micropython-psoc-edge/ports/psoc-edge \
+ ifxmakers/mpy-psoc-ci:${MPY_PSOC_CI_DOCKER_VERSION}
+ docker ps -a
+
+ # This command prevents the issue "fatal: detected dubious ownership in repository at '/micropython'""
+ docker exec mpy-ci /bin/bash -c "git config --global --add safe.directory /micropython-psoc-edge"
+ docker exec mpy-ci /bin/bash -c "git config --global --add safe.directory /micropython-psoc-edge/lib/mpy-test-ext"
+
+ # Initialize the submodules
+ docker exec mpy-ci make submodules
+}
+
+function ci_psoc_edge_build_hil {
+ board=$1
+ docker exec mpy-ci make BOARD=${board}
+}
+
+function ci_psoc_edge_deploy_hil {
+ board=$1
+ # hex file including path with respect to micropython root
+ hex_file=$2
+ devs_file=$3
+
+ # if no devices file is provided, don´t add the --devs-file argument to the command
+ if [ -z "$devs_file" ]; then
+ dev_files_arg=""
+ else
+ dev_files_arg="--devs-file ../../${devs_file}"
+ fi
+
+ docker exec mpy-ci /bin/bash -c "cd ../../tools/psoc-edge && python3 mpy-pse.py device-setup --board ${board} --hex-file ${hex_file} ${dev_files_arg} -q"
+}
+
+function ci_psoc_edge_teardown_hil {
+ docker stop mpy-ci
+}
+
########################################################################################
# ports/qemu
diff --git a/tools/psoc-edge/decrypt_secrets.sh b/tools/psoc-edge/decrypt_secrets.sh
new file mode 100644
index 00000000000..e6f3ae75a25
--- /dev/null
+++ b/tools/psoc-edge/decrypt_secrets.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -eu
+
+if [ -z "${LARGE_SECRET_PASSPHRASE:-}" ]; then
+ echo "ERROR: LARGE_SECRET_PASSPHRASE is not set" >&2
+ exit 2
+fi
+
+gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \
+ --output tests/ports/psoc-edge/mp_custom/secrets.py \
+ tests/ports/psoc-edge/mp_custom/secrets.py.gpg
diff --git a/tools/psoc-edge/dev-setup.sh b/tools/psoc-edge/dev-setup.sh
new file mode 100644
index 00000000000..90e0b54d0f3
--- /dev/null
+++ b/tools/psoc-edge/dev-setup.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+# Use this script to setup your development environment.
+# With the required tools installed:
+#
+# $ source dev-setup.sh && toolchain_setup
+
+SEARCH_PATHS=(
+ /opt/Tools
+ /opt
+ /usr/local
+)
+
+REQUIRED_TOOLS=(
+ edgeprotecttools
+ arm-none-eabi-gcc
+ openocd
+)
+
+function find_tool_path {
+ local tool=$1
+ for search_path in "${SEARCH_PATHS[@]}"; do
+ local result
+ result=$(find "$search_path" -maxdepth 5 -type f -name "${tool}" 2>/dev/null | head -n 1)
+ if [ -n "$result" ]; then
+ echo "$(dirname "$result")"
+ return 0
+ fi
+ done
+ return 1
+}
+
+function is_tool_in_path {
+ local tool=$1
+ local result=$(which "${tool}")
+ if [ -z "$result" ]; then
+ return 1
+ fi
+
+ return 0
+}
+
+function toolchain_setup {
+ for tool in "${REQUIRED_TOOLS[@]}"; do
+ if ! is_tool_in_path "$tool"; then
+ tool_path=$(find_tool_path "$tool")
+ if [ -n "$tool_path" ]; then
+ export PATH="$tool_path:$PATH"
+ printf "%-25s: %s\n" "$tool" "$tool_path"
+ else
+ echo "Error: $tool not found in any of the search paths. Please install it or add it to PATH."
+ fi
+ else
+ printf "%-25s: %s\n" "$tool" "$(which "${tool}")"
+ fi
+
+ done
+}
\ No newline at end of file
diff --git a/tools/psoc-edge/mpy-pse.py b/tools/psoc-edge/mpy-pse.py
new file mode 100644
index 00000000000..5ad91c1debb
--- /dev/null
+++ b/tools/psoc-edge/mpy-pse.py
@@ -0,0 +1,543 @@
+import argparse, os, sys, shlex, shutil, subprocess, time, requests, tarfile, zipfile
+
+boards = [
+ {"name": "KIT_PSE84_AI", "ocd_cfg_file": "pse84xgxs2.cfg"},
+]
+
+opsys = ""
+version = "0.1.0"
+
+
+# Decorator to flush every print
+def flush_print(func):
+ printer = func
+
+ def wrapped(*args):
+ printer(*args, flush=True)
+
+ return wrapped
+
+
+print_f = flush_print(print)
+
+
+def colour_str_success(msg):
+ green_str_start = "\x1b[1;32;40m"
+ str_color_end = "\x1b[0m"
+ return green_str_start + msg + str_color_end
+
+
+def colour_str_error(msg):
+ red_str_start = "\x1b[1;31;40m"
+ str_color_end = "\x1b[0m"
+ return red_str_start + msg + str_color_end
+
+
+def colour_str_highlight(msg):
+ purple_str_start = "\x1b[1;35;40m"
+ str_color_end = "\x1b[0m"
+ return purple_str_start + msg + str_color_end
+
+
+def colour_str_warn(msg):
+ yellow_str_start = "\x1b[1;33;40m"
+ str_color_end = "\x1b[0m"
+ return yellow_str_start + msg + str_color_end
+
+
+def set_environment():
+ global opsys
+ if sys.platform == "linux" or sys.platform == "linux2":
+ opsys = "linux"
+ elif sys.platform == "win32" or sys.platform == "cygwin":
+ opsys = "win"
+ os.system("color") # Enable colouring in cmd and powershell
+ elif sys.platform == "darwin":
+ opsys = "mac"
+
+
+def mpy_get_fw_hex_file_name(file_name, board):
+ file_extension = ".hex"
+ return str(file_name) + "_" + str(board) + file_extension
+
+
+def mpy_firmware_deploy(file_name, board, serial_adapter_sn=None, silent=False):
+ if not silent:
+ print_f(f"Deploying firmware {file_name} ...")
+
+ hex_file = mpy_get_fw_hex_file_name(file_name, board)
+ openocd_program(board, hex_file, serial_adapter_sn)
+ if not silent:
+ print_f(colour_str_success(f"Firmware {file_name} deployed successfully"))
+
+
+def mpy_firmware_download(file_name, board, version, silent=False):
+ def mpy_firmware_clean(file_name, board):
+ file_name_for_board = mpy_get_fw_hex_file_name(file_name, board)
+
+ if os.path.exists(file_name_for_board):
+ os.remove(file_name_for_board)
+
+ if not silent:
+ print_f(
+ "Downloading "
+ + str(file_name)
+ + " "
+ + str(version)
+ + " for "
+ + str(board)
+ + " board..."
+ )
+
+ if version == "latest":
+ sub_url = "latest/download"
+ else:
+ sub_url = "download/" + str(version)
+
+ file_name_for_board = mpy_get_fw_hex_file_name(file_name, board)
+ file_url = (
+ "https://github.com/infineon/micropython-psoc-edge/releases/"
+ + sub_url
+ + "/"
+ + file_name_for_board
+ )
+
+ # Clean if existing from previous run
+ # It is not sure if it is the same version
+ mpy_firmware_clean(file_name, board)
+
+ res = requests.get(file_url)
+ open(file_name_for_board, "wb").write(res.content)
+
+
+def openocd_download_install():
+ if opsys == "linux":
+ file_os_suffix = "linux"
+ file_extension = ".tar.gz"
+ openocd_exe = "openocd"
+ elif opsys == "win":
+ file_os_suffix = "windows"
+ file_extension = ".zip"
+ openocd_exe = "openocd.exe"
+ elif opsys == "mac":
+ file_os_suffix = "macos"
+ file_extension = ".zip"
+ openocd_exe = "openocd"
+
+ openocd_compressed = "openocd" + file_extension
+
+ def is_openocd_already_downloaded():
+ if os.path.exists(os.path.join("openocd", "bin", openocd_exe)):
+ # Add openocd to path
+ os.environ["PATH"] = os.path.join("openocd", "bin") + os.pathsep + os.environ["PATH"]
+ valid_openocd_version = is_openocd_already_in_sys_path()
+ if not valid_openocd_version:
+ clean_openocd()
+
+ return valid_openocd_version
+
+ return False
+
+ def is_openocd_already_in_sys_path():
+ try:
+ ocd_proc = subprocess.Popen(
+ [openocd_exe, "--version"], stderr=subprocess.PIPE, stdout=subprocess.PIPE
+ )
+ out, err = ocd_proc.communicate(timeout=10)
+
+ if err:
+ return False
+ out_str = out.decode()
+ supported_versions = [
+ "0.12.0+dev-5.8.0.3960",
+ "0.12.0+dev-5.11.0.4042",
+ "0.12.0+dev-5.12.0.4170",
+ ]
+ for ver in supported_versions:
+ if ver in out_str:
+ print_f(f"openocd found in system path : {shutil.which('openocd')}")
+ return True
+ except:
+ return False
+
+ return False
+
+ def get_openocd_file_url_name():
+ filename_base = "openocd-5.11.0.4042-"
+ url_base = "https://github.com/Infineon/openocd/releases/download/release-v5.11.0/"
+
+ file_name = filename_base + file_os_suffix + file_extension
+ file_url = url_base + file_name
+
+ return file_url, file_name
+
+ def clean_openocd(file_name):
+ if os.path.exists(file_name):
+ os.remove(file_name)
+
+ def download_openocd(file_url, file_name):
+ res = requests.get(file_url)
+ open(file_name, "wb").write(res.content)
+ os.replace(file_name, openocd_compressed)
+
+ def extract_openocd():
+ if opsys == "linux":
+ compress_file = tarfile.open(openocd_compressed)
+ compress_file.extractall(".")
+ compress_file.close()
+ elif opsys == "win" or opsys == "mac":
+ compress_file = zipfile.ZipFile(openocd_compressed)
+ compress_file.extractall(".")
+ compress_file.close()
+
+ def openocd_setup():
+ # Add openocd to path
+ os.environ["PATH"] = os.path.join("openocd", "bin") + os.pathsep + os.environ["PATH"]
+
+ if opsys == "linux":
+ # Install udev rules
+ sh_args = ["sh", "openocd/udev_rules/install_rules.sh"]
+ try:
+ sh_proc = subprocess.Popen(sh_args)
+ sh_proc.wait()
+ except:
+ sys.exit(colour_str_error("bash error"))
+
+ if opsys == "mac":
+ os.chmod(os.path.join("openocd", "bin", "openocd"), 0o755)
+
+ if not is_openocd_already_in_sys_path():
+ if not is_openocd_already_downloaded():
+ print_f("Downloading openocd...")
+ file_url, file_name = get_openocd_file_url_name()
+ clean_openocd(file_name)
+ download_openocd(file_url, file_name)
+ print_f("Extracting openocd...")
+ extract_openocd()
+ else:
+ print_f("openocd already available. Download skipped")
+
+ openocd_setup()
+
+
+def openocd_board_conf_download(board):
+ print_f("Downloading openocd " + str(board) + " configuration...")
+
+ # Create config folder to store the downloaded config files
+ config_dir = "config"
+ if not os.path.exists(config_dir):
+ os.mkdir(config_dir)
+
+ # Download config file
+ if board == "KIT_PSE84_AI":
+ file_names = ["qspi_config_" + str(board) + ".cfg", "PSE84_SMIF.FLM"]
+
+ for file_name in file_names:
+ file_url = (
+ "https://github.com/infineon/micropython-psoc-edge/releases/download/v0.0.0/"
+ + file_name
+ )
+
+ # Clean file if exists from previous run
+ file_w_path = os.path.join(config_dir, file_name)
+ if os.path.exists(file_w_path):
+ os.remove(file_w_path)
+
+ res = requests.get(file_url)
+ open(file_name, "wb").write(res.content)
+
+ if "qspi_config" in file_name:
+ # Rename qspi config file to generic name
+ file_name_generic = "qspi_config.cfg"
+ file_w_path = os.path.join(config_dir, file_name_generic)
+
+ # Move file to config dir
+ os.replace(file_name, file_w_path)
+
+
+def openocd_program(board, hex_file, serial_adapter_sn=None):
+ # Find tool path cross-platform
+ openocd = shutil.which("openocd")
+ if not openocd:
+ sys.exit(colour_str_error("error: openocd not found in PATH"))
+
+ # Convert to forward slashes for cross-platform compatibility
+ openocd = openocd.replace("\\", "/")
+
+ # Get the root openocd path.
+ # It is two level up from the openocd executable
+ openocd_root_dir = os.path.dirname(os.path.dirname(openocd))
+
+ for brd in boards:
+ if board == brd["name"]:
+ ocd_cfg_file = brd["ocd_cfg_file"]
+
+ serial_adapter_opt = ""
+ if serial_adapter_sn is not None:
+ serial_adapter_opt = "adapter serial " + str(serial_adapter_sn)
+
+ openocd_cmd = (
+ openocd
+ + " -s "
+ + str(openocd_root_dir)
+ + "/scripts"
+ + " -s config"
+ + ' -c "set QSPI_FLASHLOADER config/PSE84_SMIF.FLM"'
+ + ' -c "source [find interface/kitprog3.cfg]; '
+ + str(serial_adapter_opt)
+ + ";"
+ + " transport select swd;"
+ + " source [find target/infineon/"
+ + str(ocd_cfg_file)
+ + "];"
+ + " init; reset init; adapter speed 12000;"
+ + " flash write_image erase "
+ + str(hex_file)
+ + ";"
+ + " verify_image "
+ + str(hex_file)
+ + ";"
+ + ' reset run; shutdown;"'
+ )
+
+ openocd_args = shlex.split(openocd_cmd)
+
+ ocd_proc = subprocess.Popen(openocd_args, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+ try:
+ out, err = ocd_proc.communicate(timeout=30)
+ except:
+ ocd_proc.kill()
+ sys.exit(colour_str_error("openocd error."))
+ if err:
+ sys.exit(colour_str_error(err.decode() + "Are you sure the board is connected?"))
+
+
+def openocd_remove():
+ if opsys == "linux":
+ file_extension = ".tar.gz"
+ elif opsys == "win" or opsys == "mac":
+ file_extension = ".zip"
+
+ openocd_compressed = "openocd" + file_extension
+ if os.path.exists(openocd_compressed):
+ os.remove(openocd_compressed)
+
+ if os.path.exists("openocd"):
+ shutil.rmtree("openocd")
+
+
+def validate_board_name(board_name):
+ board_supported = False
+ for brd in boards:
+ if board_name == brd["name"]:
+ board_supported = True
+ break
+
+ if not board_supported:
+ sys.exit(colour_str_error("error: board is not supported"))
+
+
+def select_board():
+ def validate_user_input(user_input):
+ def invalid_exit():
+ sys.exit(colour_str_error("error: board ID is not valid"))
+
+ try:
+ board_index = int(user_input)
+ except:
+ invalid_exit()
+
+ max_board_index = len(boards)
+ if board_index < 0 or board_index > max_board_index:
+ invalid_exit()
+
+ return board_index
+
+ print_f("")
+ print_f(" Supported MicroPython PSOC EDGE boards ")
+ print_f("+---------+-----------------------------------+")
+ print_f("| ID | Board |")
+ print_f("+---------+-----------------------------------+")
+ print_f("| 0 | KIT_PSE84_AI |")
+ print_f("+---------+-----------------------------------+")
+ print_f("")
+ print_f("")
+
+ """
+ Currently only one board is supported, so no need to select
+ from user. The code is left here for future reference.
+
+ board_index = validate_user_input(
+ input(colour_str_highlight("Please type the desired board ID: "))
+ )
+ board = boards[board_index]["name"]
+ """
+ board = "KIT_PSE84_AI"
+ print_f(colour_str_highlight("Auto-selecting the only supported board: KIT_PSE84_AI\n"))
+
+ return board
+
+
+def wait_and_request_board_connect():
+ input(
+ colour_str_highlight(
+ "Please CONNECT THE BOARD and PRESS ENTER to start the firmware deployment\n"
+ )
+ )
+
+
+def device_setup(
+ board, version=None, hex_file=None, serial_adapter_sn=None, devs_file=None, quiet=False
+):
+ # if board is none it
+ # needs to be provided by the user
+ if board is None:
+ board = select_board()
+ else:
+ validate_board_name(board)
+
+ print_f("MicroPython PSOC Edge Board :: ", board)
+
+ # Download hex file
+ # if not provided by the user
+ if hex_file is None:
+ if version is None:
+ version = "latest"
+
+ print_f("MicroPython PSOC Edge Version :: ", version)
+ mpy_firmware_download("mpy-psoc-edge", board, version, silent=quiet)
+
+ hex_file = mpy_get_fw_hex_file_name("mpy-psoc-edge", board)
+
+ # If the user provides a device list,
+ # find and filter the applicable boards
+ # and get their serial numbers
+ serial_adapter_sn_list = []
+ if devs_file is not None:
+ ## If the operating system is windows, warn that yaml device usage is not validated on Windows
+
+ if opsys == "win":
+ print_f(
+ colour_str_warn(
+ "warning: Device YAML file usage is not currently supported on Windows systems. Proceed at your own risk."
+ )
+ )
+
+ try:
+ from etdevs.devs import Device
+ except ImportError:
+ sys.exit(
+ colour_str_error(
+ "error: etdevs package not found. Please install it with 'pip install etdevs'"
+ )
+ )
+
+ all_available_devs = Device.load_device_list_from_yml(devs_file)
+ available_devs_board = [dev for dev in all_available_devs if dev.name == board]
+
+ if serial_adapter_sn:
+ # check if that sn is in the devs file for that board
+ serial_adapter_sn_list = [
+ dev.uid for dev in available_devs_board if dev.uid == serial_adapter_sn
+ ]
+ if not serial_adapter_sn_list:
+ sys.exit(
+ colour_str_error(
+ "error: serial adapter sn not found in devs file for that board"
+ )
+ )
+ else:
+ serial_adapter_sn_list = [dev.uid for dev in available_devs_board]
+
+ print_f(
+ f"Found {len(serial_adapter_sn_list)} devices with serial number: {serial_adapter_sn_list}"
+ )
+
+ if not serial_adapter_sn_list:
+ serial_adapter_sn_list = [serial_adapter_sn]
+
+ openocd_download_install()
+ openocd_board_conf_download(board)
+
+ for sn in serial_adapter_sn_list:
+ print(f"Deploying hex file {hex_file} ...")
+ openocd_program(board, hex_file, sn)
+ print(colour_str_success("Device setup completed :)"))
+
+
+def clean_tool_downloads():
+ openocd_remove()
+
+
+def parser():
+ def main_parser_func(args):
+ parser.print_help()
+
+ def parser_device_setup(args):
+ device_setup(
+ args.board, args.version, args.hex_file, args.serial_num, args.devs_file, args.q
+ )
+
+ # Main parser
+ class ver_action(argparse.Action):
+ def __init__(self, option_strings, dest, **kwargs):
+ return super().__init__(
+ option_strings, dest, nargs=0, default=argparse.SUPPRESS, **kwargs
+ )
+
+ def __call__(self, parser, namespace, values, option_string, **kwargs):
+ print_f("mpy-pse version: " + version)
+ parser.exit()
+
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.RawTextHelpFormatter,
+ description="MicroPython PSOC Edge utility script",
+ )
+ parser.add_argument("-v", "--version", action=ver_action, help="mpy-pse version")
+ subparser = parser.add_subparsers()
+ parser.set_defaults(func=main_parser_func)
+
+ # device setup
+ parser_ds = subparser.add_parser(
+ "device-setup",
+ description="Setup of MicroPython PSOC Edge device. \
+ Use this command to install the deployment tools \
+ and deploy the MicroPython \
+ firmware on the PSOC Edge device.",
+ )
+ parser_ds.add_argument(
+ "-b", "--board", default=None, type=str, help="PSOC Edge prototyping kit name"
+ )
+ parser_ds.add_argument(
+ "-n",
+ "--serial-num",
+ default=None,
+ type=str,
+ help="Serial number of the board serial adapter",
+ )
+ parser_ds.add_argument(
+ "-v", "--version", default=None, type=str, help="MicroPython PSOC Edge firmware version"
+ )
+ parser_ds.add_argument(
+ "-f", "--hex-file", type=str, help="MicroPython PSOC Edge firmware .hex file"
+ )
+ parser_ds.add_argument(
+ "-d", "--devs-file", type=str, help="Devices file for multiple device deployment"
+ )
+ parser_ds.add_argument(
+ "-q", action="store_true", help="Quiet. Do not prompt any user confirmation request"
+ )
+ parser_ds.set_defaults(func=parser_device_setup)
+
+ # Parser call
+ args = parser.parse_args()
+ args.func(args)
+
+
+if __name__ == "__main__":
+ try:
+ set_environment()
+ parser()
+ except KeyboardInterrupt:
+ print_f(colour_str_error("error: keyboard interrupt"))
+ clean_tool_downloads()